From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: Driver for MaxLinear/Exar USB (UART) Serial Adapters From: Patong Yang Message-Id: <20180724223636.GA17270@linux1804-desktop> Date: Tue, 24 Jul 2018 15:36:36 -0700 To: linux-usb@vger.kernel.org Cc: johan@kernel.org, pyang@maxlinear.com, gregkh@linuxfoundation.org List-ID: VGhlIG9yaWdpbmFsIGRyaXZlci9wYXRjaCB3YXMgc3VibWl0dGVkIG9uIEFwcmlsIDQsIDIwMTgu ICBUaGlzIGlzIHRoZQpzZWNvbmQgdmVyc2lvbiBiYXNlZCBvbiB0aGUgZmVlZGJhY2sgcmVjZWl2 ZWQgb24gdGhlIG9yaWdpbmFsIHBhdGNoLgoKdjI6IFJlbW92ZWQgY3VzdG9tIElPQ1RMcywgYXMg c3VnZ2VzdGVkIGJ5IEdyZWcgS0gKICAgIFVzaW5nIHN0YW5kYXJkIExpbnV4IEdQSU8gQVBJcywg YXMgc3VnZ2VzdGVkIGJ5IEdyZWcgS0gKICAgIFJlbW92ZWQgZmlsZSByZWFkcy93cml0ZXMgYXMg c3VnZ2VzdGVkIGJ5IEdyZWcgS0gKClNpZ25lZC1vZmYtYnk6IFBhdG9uZyBZYW5nIDxwYXRvbmcu bXhsQGdtYWlsLmNvbT4KLS0tCiBkcml2ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmMgfCAy MzgwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL3VzYi9zZXJpYWwveHJ1 c2Jfc2VyaWFsLmggfCAgMjM0ICsrKwogMiBmaWxlcyBjaGFuZ2VkLCAyNjE0IGluc2VydGlvbnMo KykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmgKCmRp ZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmMgYi9kcml2ZXJzL3Vz Yi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi43MDdjNDcwZDMyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJp YWwveHJ1c2Jfc2VyaWFsLmMKQEAgLTAsMCArMSwyMzgwIEBACisvLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMCsKKy8qCisgKiB4cnVzYl9zZXJpYWwuYworICoKKyAqIENvcHlyaWdo dCAoYykgMjAxOCBQYXRvbmcgWWFuZyA8cGF0b25nLm14bEBnbWFpbC5jb20+CisgKgorICogVVNC IFNlcmlhbCBEcml2ZXIgYmFzZWQgb24gdGhlIGNkYy1hY20uYyBkcml2ZXIgZm9yIHRoZQorICog TWF4TGluZWFyL0V4YXIgVVNCIFVBUlRzL1NlcmlhbCBhZGFwdGVycworICovCisKKyNpbmNsdWRl IDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxp bnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHR5 Lmg+CisjaW5jbHVkZSA8bGludXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgor I2luY2x1ZGUgPGxpbnV4L3R0eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5o PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Cisj aW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1 ZGUgPGxpbnV4L3VzYi9jZGMuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxh c20vYnl0ZW9yZGVyLmg+CisjaW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxp bnV4L2lkci5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxh eS5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2dwaW8uaD4KKworI2lu Y2x1ZGUgImxpbnV4L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ4cnVzYl9zZXJpYWwuaCIKKworI2Rl ZmluZSBEUklWRVJfQVVUSE9SICJQYXRvbmcgWWFuZyA8cGF0b25nLm14bEBnbWFpbC5jb20+Igor I2RlZmluZSBEUklWRVJfREVTQyAiTWF4TGluZWFyL0V4YXIgVVNCIFVBUlQgKHNlcmlhbCBwb3J0 KSBkcml2ZXIiCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB4cnVzYl9kcml2ZXI7CitzdGF0 aWMgc3RydWN0IHR0eV9kcml2ZXIgKnhydXNiX3R0eV9kcml2ZXI7CitzdGF0aWMgc3RydWN0IHhy dXNiICp4cnVzYl90YWJsZVtYUlVTQl9UVFlfTUlOT1JTXTsKK3N0YXRpYyBzdHJ1Y3QgcmVnX2Fk ZHJfbWFwIHhyMjI4MHhfcmVnX21hcDsKK3N0YXRpYyBzdHJ1Y3QgcmVnX2FkZHJfbWFwIHhyMjFi MTQxMV9yZWdfbWFwOworc3RhdGljIHN0cnVjdCByZWdfYWRkcl9tYXAgeHIyMXYxNDF4X3JlZ19t YXA7CitzdGF0aWMgc3RydWN0IHJlZ19hZGRyX21hcCB4cjIxYjE0MnhfcmVnX21hcDsKKworc3Rh dGljIERFRklORV9NVVRFWCh4cnVzYl90YWJsZV9sb2NrKTsKKworLyoKKyAqIExvb2sgdXAgYW4g WFJVU0Igc3RydWN0dXJlIGJ5IGluZGV4LiBJZiBmb3VuZCBhbmQgbm90IGRpc2Nvbm5lY3RlZCwK KyAqIGluY3JlbWVudCBpdHMgcmVmY291bnQgYW5kIHJldHVybiBpdCB3aXRoIGl0cyBtdXRleCBo ZWxkLgorICovCisKK3N0YXRpYyBzdHJ1Y3QgeHJ1c2IgKnhydXNiX2dldF9ieV9pbmRleCh1bnNp Z25lZCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHhydXNiICp4cnVzYjsKKworCW11dGV4X2xvY2so JnhydXNiX3RhYmxlX2xvY2spOworCXhydXNiID0geHJ1c2JfdGFibGVbaW5kZXhdOworCWlmICh4 cnVzYikgeworCQltdXRleF9sb2NrKCZ4cnVzYi0+bXV0ZXgpOworCQlpZiAoeHJ1c2ItPmRpc2Nv bm5lY3RlZCkgeworCQkJbXV0ZXhfdW5sb2NrKCZ4cnVzYi0+bXV0ZXgpOworCQkJeHJ1c2IgPSBO VUxMOworCQl9IGVsc2UgeworCQkJdHR5X3BvcnRfZ2V0KCZ4cnVzYi0+cG9ydCk7CisJCQltdXRl eF91bmxvY2soJnhydXNiLT5tdXRleCk7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZ4cnVzYl90 YWJsZV9sb2NrKTsKKwlyZXR1cm4geHJ1c2I7Cit9CisKKy8qCisgKiBUcnkgdG8gZmluZCBhbiBh dmFpbGFibGUgbWlub3IgbnVtYmVyIGFuZCBpZiBmb3VuZCwgYXNzb2NpYXRlIGl0IHdpdGgKKyAq ICd4cnVzYicuCisgKi8KK3N0YXRpYyBpbnQgeHJ1c2JfYWxsb2NfbWlub3Ioc3RydWN0IHhydXNi ICp4cnVzYikKK3sKKwlpbnQgbWlub3I7CisKKwltdXRleF9sb2NrKCZ4cnVzYl90YWJsZV9sb2Nr KTsKKwlmb3IgKG1pbm9yID0gMDsgbWlub3IgPCBYUlVTQl9UVFlfTUlOT1JTOyBtaW5vcisrKSB7 CisJCWlmICgheHJ1c2JfdGFibGVbbWlub3JdKSB7CisJCQl4cnVzYl90YWJsZVttaW5vcl0gPSB4 cnVzYjsKKwkJCWJyZWFrOworCQl9CisJfQorCW11dGV4X3VubG9jaygmeHJ1c2JfdGFibGVfbG9j ayk7CisKKwlyZXR1cm4gbWlub3I7Cit9CisKKy8qIFJlbGVhc2UgdGhlIG1pbm9yIG51bWJlciBh c3NvY2lhdGVkIHdpdGggJ3hydXNiJy4gICovCitzdGF0aWMgdm9pZCB4cnVzYl9yZWxlYXNlX21p bm9yKHN0cnVjdCB4cnVzYiAqeHJ1c2IpCit7CisJbXV0ZXhfbG9jaygmeHJ1c2JfdGFibGVfbG9j ayk7CisJeHJ1c2JfdGFibGVbeHJ1c2ItPm1pbm9yXSA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZ4 cnVzYl90YWJsZV9sb2NrKTsKK30KKworLyoKKyAqIEZ1bmN0aW9ucyBmb3IgWFJVU0IgY29udHJv bCBtZXNzYWdlcy4KKyAqLworCitzdGF0aWMgaW50IHhydXNiX2N0cmxfbXNnKHN0cnVjdCB4cnVz YiAqeHJ1c2IsCisJCWludCByZXF1ZXN0LCBpbnQgdmFsdWUsCXZvaWQgKmJ1ZiwgaW50IGxlbikK K3sKKwlpbnQgcnYgPSB1c2JfY29udHJvbF9tc2coeHJ1c2ItPmRldiwKKwkJdXNiX3NuZGN0cmxw aXBlKHhydXNiLT5kZXYsIDApLAorCQlyZXF1ZXN0LAorCQlVU0JfUlRfWFJVU0IsCisJCXZhbHVl LAorCQl4cnVzYi0+Y29udHJvbC0+YWx0c2V0dGluZ1swXS5kZXNjLmJJbnRlcmZhY2VOdW1iZXIs CisJCWJ1ZiwKKwkJbGVuLAorCQk1MDAwKTsKKwlyZXR1cm4gcnYgPCAwID8gcnYgOiAwOworfQor CitpbnQgeHJ1c2Jfc2V0X3JlZyhzdHJ1Y3QgeHJ1c2IgKnhydXNiLCBpbnQgcmVnbnVtLCBpbnQg dmFsdWUpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgY2hhbm5lbCA9IDA7CisJaW50IFhSMjI4MHhh ZGRyID0gWFIyMjgweF9GVU5DX01HUl9PRkZTRVQgKyByZWdudW07CisKKwlpZiAoKHhydXNiLT5E ZXZpY2VQcm9kdWN0ICYgMHhmZmYwKSA9PSAweDE0MDApIHsKKwkJcmVzdWx0ID0gdXNiX2NvbnRy b2xfbXNnKHhydXNiLT5kZXYsCQkvLyB1c2IgZGV2aWNlCisJCQl1c2Jfc25kY3RybHBpcGUoeHJ1 c2ItPmRldiwgMCksCQkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVTQl9TRVRfWFIyMjgwWCwJCQkv LyByZXF1ZXN0CisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwJCS8vIHJlcXVlc3Rf dHlwZQorCQkJdmFsdWUsCQkJCQkvLyByZXF1ZXN0IHZhbHVlCisJCQlYUjIyODB4YWRkciwJCQkJ Ly8gaW5kZXgKKwkJCU5VTEwsCQkJCQkvLyBkYXRhCisJCQkwLAkJCQkJLy8gc2l6ZQorCQkJNTAw MCk7CQkJCQkvLyB0aW1lb3V0CisJfSBlbHNlIGlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAw eGZmZjApID09IDB4MTQyMCkgeworCQljaGFubmVsID0gKHhydXNiLT5jaGFubmVsIC0gNCkqMjsK KwkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHhydXNiLT5kZXYsCQkvLyB1c2IgZGV2aWNlCisJ CQl1c2Jfc25kY3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCQkvLyBlbmRwb2ludCBwaXBlCisJCQlY UlVTQl9TRVRfWFIyMUIxNDJYLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZ UEVfVkVORE9SIHwgMSwJLy8gcmVxdWVzdF90eXBlCisJCQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3Qg dmFsdWUKKwkJCXJlZ251bSB8IChjaGFubmVsIDw8IDgpLAkJLy8gaW5kZXgKKwkJCU5VTEwsCQkJ CQkvLyBkYXRhCisJCQkwLAkJCQkJLy8gc2l6ZQorCQkJNTAwMCk7CQkJCQkvLyB0aW1lb3V0CisJ fSBlbHNlIGlmICh4cnVzYi0+RGV2aWNlUHJvZHVjdCA9PSAweDE0MTEpIHsKKwkJcmVzdWx0ID0g dXNiX2NvbnRyb2xfbXNnKHhydXNiLT5kZXYsCQkvLyB1c2IgZGV2aWNlCisJCQl1c2Jfc25kY3Ry bHBpcGUoeHJ1c2ItPmRldiwgMCksCQkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVTQl9TRVRfWFIy MUIxNDExLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SLAkJ Ly8gcmVxdWVzdF90eXBlCisJCQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJCXJlZ251 bSwJCQkJCS8vIGluZGV4CisJCQlOVUxMLAkJCQkJLy8gZGF0YQorCQkJMCwJCQkJCS8vIHNpemUK KwkJCTUwMDApOwkJCQkJLy8gdGltZW91dAorCX0gZWxzZSBpZiAoKHhydXNiLT5EZXZpY2VQcm9k dWN0ICYgMHhmZmYwKSA9PSAweDE0MTApIHsKKwkJaWYgKHhydXNiLT5jaGFubmVsKQorCQkJY2hh bm5lbCA9IHhydXNiLT5jaGFubmVsIC0gMTsKKwkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHhy dXNiLT5kZXYsCQkvLyB1c2IgZGV2aWNlCisJCQl1c2Jfc25kY3RybHBpcGUoeHJ1c2ItPmRldiwg MCksCQkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVTQl9TRVRfWFIyMVYxNDFYLAkJCS8vIHJlcXVl c3QKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SLAkJLy8gcmVxdWVzdF90eXBlCisJ CQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJCXJlZ251bSB8IChjaGFubmVsIDw8IDgp LAkJLy8gaW5kZXgKKwkJCU5VTEwsCQkJCQkvLyBkYXRhCisJCQkwLAkJCQkJLy8gc2l6ZQorCQkJ NTAwMCk7CQkJCQkvLyB0aW1lb3V0CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJ aWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwgIiVzIEVy cm9yOiVkXG4iLAorCQkJX19mdW5jX18sIHJlc3VsdCk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsK K30KKworaW50IHhydXNiX3NldF9yZWdfZXh0KHN0cnVjdCB4cnVzYiAqeHJ1c2IsIGludCBjaGFu bmVsLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpCit7CisJaW50IHJlc3VsdDsKKwlpbnQgWFIyMjgw eGFkZHIgPSBYUjIyODB4X0ZVTkNfTUdSX09GRlNFVCArIHJlZ251bTsKKworCWlmICgoeHJ1c2It PkRldmljZVByb2R1Y3QgJiAweGZmZjApID09IDB4MTQwMCkgeworCQlyZXN1bHQgPSB1c2JfY29u dHJvbF9tc2coeHJ1c2ItPmRldiwJCS8vIHVzYiBkZXZpY2UKKwkJCXVzYl9zbmRjdHJscGlwZSh4 cnVzYi0+ZGV2LCAwKSwJCS8vIGVuZHBvaW50IHBpcGUKKwkJCVhSVVNCX1NFVF9YUjIyODBYLAkJ CS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SLAkJLy8gcmVxdWVz dF90eXBlCisJCQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJCVhSMjI4MHhhZGRyLAkJ CQkvLyBpbmRleAorCQkJTlVMTCwJCQkJCS8vIGRhdGEKKwkJCTAsCQkJCQkvLyBzaXplCisJCQk1 MDAwKTsJCQkJCS8vIHRpbWVvdXQKKworCX0gZWxzZSBpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0 ICYgMHhmZmYwKSA9PSAweDE0MjApIHsKKwkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHhydXNi LT5kZXYsCQkvLyB1c2IgZGV2aWNlCisJCQl1c2Jfc25kY3RybHBpcGUoeHJ1c2ItPmRldiwgMCks CQkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVTQl9TRVRfWFIyMUIxNDJYLAkJCS8vIHJlcXVlc3QK KwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVORE9SIHwgMSwJLy8gcmVxdWVzdF90eXBlCisJ CQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJCXJlZ251bSB8IChjaGFubmVsIDw8IDgp LAkJLy8gaW5kZXgKKwkJCU5VTEwsCQkJCQkvLyBkYXRhCisJCQkwLAkJCQkJLy8gc2l6ZQorCQkJ NTAwMCk7CQkJCQkvLyB0aW1lb3V0CisJfSBlbHNlIGlmICh4cnVzYi0+RGV2aWNlUHJvZHVjdCA9 PSAweDE0MTEpIHsKKwkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHhydXNiLT5kZXYsCQkvLyB1 c2IgZGV2aWNlCisJCQl1c2Jfc25kY3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCQkvLyBlbmRwb2lu dCBwaXBlCisJCQlYUlVTQl9TRVRfWFIyMUIxNDExLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJf T1VUIHwgVVNCX1RZUEVfVkVORE9SLAkJLy8gcmVxdWVzdF90eXBlCisJCQl2YWx1ZSwJCQkJCS8v IHJlcXVlc3QgdmFsdWUKKwkJCXJlZ251bSwJCQkJCS8vIGluZGV4CisJCQlOVUxMLAkJCQkJLy8g ZGF0YQorCQkJMCwJCQkJCS8vIHNpemUKKwkJCTUwMDApOwkJCQkJLy8gdGltZW91dAorCX0gZWxz ZSBpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHhmZmYwKSA9PSAweDE0MTApIHsKKwkJcmVz dWx0ID0gdXNiX2NvbnRyb2xfbXNnKHhydXNiLT5kZXYsCQkvLyB1c2IgZGV2aWNlCisJCQl1c2Jf c25kY3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCQkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVTQl9T RVRfWFIyMVYxNDFYLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfT1VUIHwgVVNCX1RZUEVfVkVO RE9SLAkJLy8gcmVxdWVzdF90eXBlCisJCQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJ CXJlZ251bSB8IChjaGFubmVsIDw8IDgpLAkJLy8gaW5kZXgKKwkJCU5VTEwsCQkJCQkvLyBkYXRh CisJCQkwLAkJCQkJLy8gc2l6ZQorCQkJNTAwMCk7CQkJCQkvLyB0aW1lb3V0CisJfSBlbHNlIHsK KwkJcmVzdWx0ID0gLTE7CisJfQorCisJaWYgKHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycigmeHJ1 c2ItPmNvbnRyb2wtPmRldiwgIiVzIEVycm9yOiVkXG4iLAorCQkJX19mdW5jX18sIHJlc3VsdCk7 CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworCitpbnQgeHJ1c2JfZ2V0X3JlZyhzdHJ1Y3Qg eHJ1c2IgKnhydXNiLCBpbnQgcmVnbnVtLCBzaG9ydCAqdmFsdWUpCit7CisJaW50IHJlc3VsdDsK KwlpbnQgY2hhbm5lbCA9IDA7CisJaW50IFhSMjI4MHhhZGRyID0gWFIyMjgweF9GVU5DX01HUl9P RkZTRVQgKyByZWdudW07CisJdm9pZCAqZG1hZGF0YSA9IGttYWxsb2MoMiwgR0ZQX0tFUk5FTCk7 CisKKwlpZiAoIWRtYWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCh4cnVzYi0+RGV2 aWNlUHJvZHVjdCAmIDB4ZmZmMCkgPT0gMHgxNDAwKSB7CisJCXJlc3VsdCA9IHVzYl9jb250cm9s X21zZyh4cnVzYi0+ZGV2LAkJLy8gdXNiIGRldmljZQorCQkJdXNiX3JjdmN0cmxwaXBlKHhydXNi LT5kZXYsIDApLAkJLy8gZW5kcG9pbnQgcGlwZQorCQkJWFJVU0JfR0VUX1hSMjI4MFgsCQkJLy8g cmVxdWVzdAorCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRPUiwJCS8vIHJlcXVlc3RfdHlw ZQorCQkJMCwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJCVhSMjI4MHhhZGRyLAkJCQkvLyBpbmRl eAorCQkJZG1hZGF0YSwJCQkJLy8gZGF0YQorCQkJMiwJCQkJCS8vIHNpemUKKwkJCTUwMDApOwkJ CQkJLy8gdGltZW91dAorCQltZW1jcHkodmFsdWUsIGRtYWRhdGEsIDIpOworCX0gZWxzZSBpZiAo KHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHhmZmYwKSA9PSAweDE0MjApIHsKKwkJY2hhbm5lbCA9 ICh4cnVzYi0+Y2hhbm5lbCAtIDQpKjI7CisJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyh4cnVz Yi0+ZGV2LAkJLy8gdXNiIGRldmljZQorCQkJdXNiX3JjdmN0cmxwaXBlKHhydXNiLT5kZXYsIDAp LAkJLy8gZW5kcG9pbnQgcGlwZQorCQkJWFJVU0JfR0VUX1hSMjFCMTQyWCwJCQkvLyByZXF1ZXN0 CisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgMSwJLy8gcmVxdWVzdF90eXBlCisJ CQkwLAkJCQkJLy8gcmVxdWVzdCB2YWx1ZQorCQkJcmVnbnVtIHwgKGNoYW5uZWwgPDwgOCksCQkv LyBpbmRleAorCQkJZG1hZGF0YSwJCQkJLy8gZGF0YQorCQkJMiwJCQkJCS8vIHNpemUKKwkJCTUw MDApOwkJCQkJLy8gdGltZW91dAorCQkJbWVtY3B5KHZhbHVlLCBkbWFkYXRhLCAyKTsKKworCX0g ZWxzZSBpZiAoeHJ1c2ItPkRldmljZVByb2R1Y3QgPT0gMHgxNDExKSB7CisJCXJlc3VsdCA9IHVz Yl9jb250cm9sX21zZyh4cnVzYi0+ZGV2LAkJLy8gdXNiIGRldmljZQorCQkJdXNiX3JjdmN0cmxw aXBlKHhydXNiLT5kZXYsIDApLAkJLy8gZW5kcG9pbnQgcGlwZQorCQkJWFJVU0JfR0VUX1hSMjFC MTQxMSwJCQkvLyByZXF1ZXN0CisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLAkJLy8g cmVxdWVzdF90eXBlCisJCQkwLAkJCQkJLy8gcmVxdWVzdCB2YWx1ZQorCQkJcmVnbnVtLAkJCQkJ Ly8gaW5kZXgKKwkJCWRtYWRhdGEsCQkJCS8vIGRhdGEKKwkJCTIsCQkJCQkvLyBzaXplCisJCQk1 MDAwKTsJCQkJCS8vIHRpbWVvdXQKKwkJCW1lbWNweSh2YWx1ZSwgZG1hZGF0YSwgMik7CisJfSBl bHNlIGlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweGZmZjApID09IDB4MTQxMCkgeworCQlp ZiAoeHJ1c2ItPmNoYW5uZWwpCisJCQljaGFubmVsID0geHJ1c2ItPmNoYW5uZWwgLSAxOworCQly ZXN1bHQgPSB1c2JfY29udHJvbF9tc2coeHJ1c2ItPmRldiwJCS8vIHVzYiBkZXZpY2UKKwkJCXVz Yl9yY3ZjdHJscGlwZSh4cnVzYi0+ZGV2LCAwKSwJCS8vIGVuZHBvaW50IHBpcGUKKwkJCVhSVVNC X0dFVF9YUjIxVjE0MVgsCQkJLy8gcmVxdWVzdAorCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZF TkRPUiwJCS8vIHJlcXVlc3RfdHlwZQorCQkJMCwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJCXJl Z251bSB8IChjaGFubmVsIDw8IDgpLAkJLy8gaW5kZXgKKwkJCWRtYWRhdGEsCQkJCS8vIGRhdGEK KwkJCTEsCQkJCQkvLyBzaXplCisJCQk1MDAwKTsJCQkJCS8vIHRpbWVvdXQKKwkJCW1lbWNweSh2 YWx1ZSwgZG1hZGF0YSwgMSk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJaWYg KHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCSIlcyBj aGFubmVsOiVkIFJlZyAweCV4CUVycm9yOiVkXG4iLAorCQkJX19mdW5jX18sIGNoYW5uZWwsIHJl Z251bSwgcmVzdWx0KTsKKwl9CisJa2ZyZWUoZG1hZGF0YSk7CisJcmV0dXJuIHJlc3VsdDsKK30K KworCitpbnQgeHJ1c2JfZ2V0X3JlZ19leHQoc3RydWN0IHhydXNiICp4cnVzYiwgaW50IGNoYW5u ZWwsCisJaW50IHJlZ251bSwgc2hvcnQgKnZhbHVlKQoreworCWludCByZXN1bHQ7CisJaW50IFhS MjI4MHhhZGRyID0gWFIyMjgweF9GVU5DX01HUl9PRkZTRVQgKyByZWdudW07CisJdm9pZCAqZG1h ZGF0YSA9IGttYWxsb2MoMiwgR0ZQX0tFUk5FTCk7CisKKwlpZiAoIWRtYWRhdGEpCisJCXJldHVy biAtRU5PTUVNOworCisJaWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVjdCYweGZmZjApID09IDB4MTQw MCkgeworCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coeHJ1c2ItPmRldiwJCS8vIHVzYiBkZXZp Y2UKKwkJCXVzYl9yY3ZjdHJscGlwZSh4cnVzYi0+ZGV2LCAwKSwJCS8vIGVuZHBvaW50IHBpcGUK KwkJCVhSVVNCX0dFVF9YUjIyODBYLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfSU4gfCBVU0Jf VFlQRV9WRU5ET1IsCQkvLyByZXF1ZXN0X3R5cGUKKwkJCTAsCQkJCQkvLyByZXF1ZXN0IHZhbHVl CisJCQlYUjIyODB4YWRkciwJCQkJLy8gaW5kZXgKKwkJCWRtYWRhdGEsCQkJCS8vIGRhdGEKKwkJ CTIsCQkJCQkvLyBzaXplCisJCQk1MDAwKTsJCQkJCS8vIHRpbWVvdXQKKwkJbWVtY3B5KHZhbHVl LCBkbWFkYXRhLCAyKTsKKwl9IGVsc2UgaWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVjdCAmIDB4ZmZm MCkgPT0gMHgxNDIwKSB7CisJCXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyh4cnVzYi0+ZGV2LAkJ Ly8gdXNiIGRldmljZQorCQkJdXNiX3JjdmN0cmxwaXBlKHhydXNiLT5kZXYsIDApLAkJLy8gZW5k cG9pbnQgcGlwZQorCQkJWFJVU0JfR0VUX1hSMjFCMTQyWCwJCQkvLyByZXF1ZXN0CisJCQlVU0Jf RElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgMSwJLy8gcmVxdWVzdF90eXBlCisJCQkwLAkJCQkJ Ly8gcmVxdWVzdCB2YWx1ZQorCQkJcmVnbnVtIHwgKGNoYW5uZWwgPDwgOCksCQkvLyBpbmRleAor CQkJZG1hZGF0YSwJCQkJLy8gZGF0YQorCQkJMiwJCQkJCS8vIHNpemUKKwkJCTUwMDApOwkJCQkJ Ly8gdGltZW91dAorCQltZW1jcHkodmFsdWUsIGRtYWRhdGEsIDIpOworCX0gZWxzZSBpZiAoeHJ1 c2ItPkRldmljZVByb2R1Y3QgPT0gMHgxNDExKSB7CisJCXJlc3VsdCA9IHVzYl9jb250cm9sX21z Zyh4cnVzYi0+ZGV2LAkJLy8gdXNiIGRldmljZQorCQkJdXNiX3JjdmN0cmxwaXBlKHhydXNiLT5k ZXYsIDApLAkJLy8gZW5kcG9pbnQgcGlwZQorCQkJWFJVU0JfR0VUX1hSMjFCMTQxMSwJCQkvLyBy ZXF1ZXN0CisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLAkJLy8gcmVxdWVzdF90eXBl CisJCQkwLAkJCQkJLy8gcmVxdWVzdCB2YWx1ZQorCQkJcmVnbnVtIHwgKGNoYW5uZWwgPDwgOCks CQkvLyBpbmRleAorCQkJZG1hZGF0YSwJCQkJLy8gZGF0YQorCQkJMiwJCQkJCS8vIHNpemUKKwkJ CTUwMDApOwkJCQkJLy8gdGltZW91dAorCQltZW1jcHkodmFsdWUsIGRtYWRhdGEsIDIpOworCX0g ZWxzZSBpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHhmZmYwKSA9PSAweDE0MTApIHsKKwkJ cmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNnKHhydXNiLT5kZXYsCQkvLyB1c2IgZGV2aWNlCisJCQl1 c2JfcmN2Y3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCQkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVT Ql9HRVRfWFIyMVYxNDFYLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9W RU5ET1IsCQkvLyByZXF1ZXN0X3R5cGUKKwkJCTAsCQkJCQkvLyByZXF1ZXN0IHZhbHVlCisJCQly ZWdudW0gfCAoY2hhbm5lbCA8PCA4KSwJCS8vIGluZGV4CisJCQlkbWFkYXRhLAkJCQkvLyBkYXRh CisJCQkxLAkJCQkJLy8gc2l6ZQorCQkJNTAwMCk7CQkJCQkvLyB0aW1lb3V0CisJCW1lbWNweSh2 YWx1ZSwgZG1hZGF0YSwgMSk7CisJfSBlbHNlIHsKKwkJcmVzdWx0ID0gLTE7CisJfQorCisJaWYg KHJlc3VsdCA8IDApIHsKKwkJZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwgIiVzIEVycm9y OiVkXG4iLAorCQkJX19mdW5jX18sIHJlc3VsdCk7CisJfQorCWtmcmVlKGRtYWRhdGEpOworCXJl dHVybiByZXN1bHQ7Cit9CisKK3N0cnVjdCB4cjIxdjE0MXhfYmF1ZF9yYXRlIHsKKwl1bnNpZ25l ZCBpbnQgdHg7CisJdW5zaWduZWQgaW50IHJ4MDsKKwl1bnNpZ25lZCBpbnQgcngxOyB9OworCitz dGF0aWMgc3RydWN0IHhyMjF2MTQxeF9iYXVkX3JhdGUgeHIyMXYxNDF4X2JhdWRfcmF0ZXNbXSA9 IHsKKwl7IDB4MDAwLCAweDAwMCwgMHgwMDAgfSwKKwl7IDB4MDAwLCAweDAwMCwgMHgwMDAgfSwK Kwl7IDB4MTAwLCAweDAwMCwgMHgxMDAgfSwKKwl7IDB4MDIwLCAweDQwMCwgMHgwMjAgfSwKKwl7 IDB4MDEwLCAweDEwMCwgMHgwMTAgfSwKKwl7IDB4MjA4LCAweDA0MCwgMHgyMDggfSwKKwl7IDB4 MTA0LCAweDgyMCwgMHgxMDggfSwKKwl7IDB4ODQ0LCAweDIxMCwgMHg4ODQgfSwKKwl7IDB4NDQ0 LCAweDExMCwgMHg0NDQgfSwKKwl7IDB4MTIyLCAweDg4OCwgMHgyMjQgfSwKKwl7IDB4OTEyLCAw eDQ0OCwgMHg5MjQgfSwKKwl7IDB4NDkyLCAweDI0OCwgMHg0OTIgfSwKKwl7IDB4MjUyLCAweDky OCwgMHgyOTIgfSwKKwl7IDBYOTRBLCAwWDRBNCwgMFhBNTIgfSwKKwl7IDBYNTJBLCAwWEFBNCwg MFg1NEEgfSwKKwl7IDBYQUFBLCAweDk1NCwgMFg0QUEgfSwKKwl7IDBYQUFBLCAweDU1NCwgMFhB QUEgfSwKKwl7IDB4NTU1LCAwWEFENCwgMFg1QUEgfSwKKwl7IDBYQjU1LCAwWEFCNCwgMFg1NUEg fSwKKwl7IDBYNkI1LCAwWDVBQywgMFhCNTYgfSwKKwl7IDBYNUI1LCAwWEQ2QywgMFg2RDYgfSwK Kwl7IDBYQjZELCAwWEI2QSwgMFhEQjYgfSwKKwl7IDBYNzZELCAwWDZEQSwgMFhCQjYgfSwKKwl7 IDBYRURELCAwWEREQSwgMFg3NkUgfSwKKwl7IDBYRERELCAwWEJCQSwgMFhFRUUgfSwKKwl7IDBY N0JCLCAwWEY3QSwgMFhEREUgfSwKKwl7IDBYRjdCLCAwWEVGNiwgMFg3REUgfSwKKwl7IDBYREY3 LCAwWEJGNiwgMFhGN0UgfSwKKwl7IDBYN0Y3LCAwWEZFRSwgMFhFRkUgfSwKKwl7IDBYRkRGLCAw WEZCRSwgMFg3RkUgfSwKKwl7IDBYRjdGLCAwWEVGRSwgMFhGRkUgfSwKKwl7IDBYRkZGLCAwWEZG RSwgMFhGRkQgfSwKK307CisKKworc3RhdGljIGludCB4cjIxdjE0MXhfc2V0X2JhdWRfcmF0ZShz dHJ1Y3QgeHJ1c2IgKnhydXNiLAl1bnNpZ25lZCBpbnQgcmF0ZSkKK3sKKwl1bnNpZ25lZCBpbnQg ZGl2aXNvciA9IDQ4MDAwMDAwIC8gcmF0ZTsKKwl1bnNpZ25lZCBpbnQgaSA9ICgoMzIgKiA0ODAw MDAwMCkgLyByYXRlKSAmIDB4MWY7CisJdW5zaWduZWQgaW50IHR4X21hc2sgPSB4cjIxdjE0MXhf YmF1ZF9yYXRlc1tpXS50eDsKKwl1bnNpZ25lZCBpbnQgcnhfbWFzayA9IChkaXZpc29yICYgMSkg PworCQl4cjIxdjE0MXhfYmF1ZF9yYXRlc1tpXS5yeDEgOgorCQl4cjIxdjE0MXhfYmF1ZF9yYXRl c1tpXS5yeDA7CisKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCBYUjIxVjE0MVhfQ0xPQ0tfRElWSVNP Ul8wLCAoZGl2aXNvciA+PiAgMCkgJiAweGZmKTsKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCBYUjIx VjE0MVhfQ0xPQ0tfRElWSVNPUl8xLCAoZGl2aXNvciA+PiAgOCkgJiAweGZmKTsKKwl4cnVzYl9z ZXRfcmVnKHhydXNiLCBYUjIxVjE0MVhfQ0xPQ0tfRElWSVNPUl8yLCAoZGl2aXNvciA+PiAxNikg JiAweGZmKTsKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCBYUjIxVjE0MVhfVFhfQ0xPQ0tfTUFTS18w LAkodHhfbWFzayA+PiAgMCkgJiAweGZmKTsKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCBYUjIxVjE0 MVhfVFhfQ0xPQ0tfTUFTS18xLCAodHhfbWFzayA+PiAgOCkgJiAweGZmKTsKKwl4cnVzYl9zZXRf cmVnKHhydXNiLCBYUjIxVjE0MVhfUlhfQ0xPQ0tfTUFTS18wLCAocnhfbWFzayA+PiAgMCkgJiAw eGZmKTsKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCBYUjIxVjE0MVhfUlhfQ0xPQ0tfTUFTS18xLCAo cnhfbWFzayA+PiAgOCkgJiAweGZmKTsKKworCXJldHVybiAwOworfQorCisvKiBkZXZpY2VzIGFy ZW4ndCByZXF1aXJlZCB0byBzdXBwb3J0IHRoZXNlIHJlcXVlc3RzLgorICogdGhlIGNkYyB4cnVz YiBkZXNjcmlwdG9yIHRlbGxzIHdoZXRoZXIgdGhleSBkby4uLgorICovCitpbnQgeHJ1c2Jfc2V0 X2NvbnRyb2woc3RydWN0IHhydXNiICp4cnVzYiwgdW5zaWduZWQgaW50IGNvbnRyb2wpCit7CisJ aW50IHJ2ID0gMDsKKworCS8vIFVzZSBjdXN0b20gdmVuZG9yIHJlcXVlc3QgZm9yIFhSMjFWMTQx MC8xMi8xNAorCWlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweDE0MTEpID09IDB4MTQxMCkg eworCQlpZiAoY29udHJvbCAmIFhSVVNCX0NUUkxfRFRSKSB7CisJCQl4cnVzYl9zZXRfcmVnKHhy dXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fY2xyLAorCQkJCVVBUlRfR1BJT19DTFJfRFRS KTsKKwkJfSBlbHNlIHsKKwkJCXhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVh cnRfZ3Bpb19zZXQsCisJCQkJVUFSVF9HUElPX1NFVF9EVFIpOworCQl9CisKKwkJaWYgKGNvbnRy b2wgJiBYUlVTQl9DVFJMX1JUUykgeworCQkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJl Z19tYXAudWFydF9ncGlvX2NsciwKKwkJCQlVQVJUX0dQSU9fQ0xSX1JUUyk7CisJCX0gZWxzZSB7 CisJCQl4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fc2V0LAor CQkJCVVBUlRfR1BJT19TRVRfUlRTKTsKKwkJfQorCX0gZWxzZSB7CisJLy8gVXNlIENEQyBjb21t YW5kIGZvciBYUjIxQjE0eHggYW5kIFhSMjI4MHgKKwkJcnYgPSB4cnVzYl9jdHJsX21zZyh4cnVz YiwKKwkJCVVTQl9DRENfUkVRX1NFVF9DT05UUk9MX0xJTkVfU1RBVEUsCisJCQljb250cm9sLAor CQkJTlVMTCwKKwkJCTApOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK2ludCB4cnVzYl9zZXRfbGlu ZShzdHJ1Y3QgeHJ1c2IgKnhydXNiLAlzdHJ1Y3QgdXNiX2NkY19saW5lX2NvZGluZyAqbGluZSkK K3sKKwlpbnQgcnYgPSAwOworCXVuc2lnbmVkIGludCBkYXRhX3NpemUsIGRhdGFfcGFyaXR5LCBk YXRhX3N0b3AsIGZvcm1hdDsKKworCS8vIFVzZSBjdXN0b20gdmVuZG9yIHJlcXVlc3QgZm9yIFhS MjFWMTQxMC8xMi8xNAorCWlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweDE0MTEpID09IDB4 MTQxMCkgeworCQl4cjIxdjE0MXhfc2V0X2JhdWRfcmF0ZSh4cnVzYiwgbGluZS0+ZHdEVEVSYXRl KTsKKwkJZGF0YV9zaXplID0gbGluZS0+YkRhdGFCaXRzOworCQlkYXRhX3Bhcml0eSA9IGxpbmUt PmJQYXJpdHlUeXBlOworCQlkYXRhX3N0b3AgPSBsaW5lLT5iQ2hhckZvcm1hdDsKKwkJZm9ybWF0 ID0gZGF0YV9zaXplIHwgKGRhdGFfcGFyaXR5IDw8IDQpIHwgKGRhdGFfc3RvcCA8PCA3KTsKKwkJ eHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9mb3JtYXQsIGZvcm1hdCk7 CisJfQorCS8vIFVzZSBDREMgY29tbWFuZCBmb3IgWFIyMUIxNHh4IGFuZCBYUjIyODB4CisJZWxz ZQorCQlydiA9IHhydXNiX2N0cmxfbXNnKHhydXNiLAorCQkJVVNCX0NEQ19SRVFfU0VUX0xJTkVf Q09ESU5HLAorCQkJMCwKKwkJCWxpbmUsCisJCQlzaXplb2YgKihsaW5lKSk7CisKKwlyZXR1cm4g cnY7Cit9CisKK2ludCB4cnVzYl9zZXRfZmxvd19tb2RlKHN0cnVjdCB4cnVzYiAqeHJ1c2IsCisJ CXN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjZmxhZykKK3sKKwl1bnNpZ25l ZCBpbnQgZmxvdzsKKwl1bnNpZ25lZCBpbnQgZ3Bpb19tb2RlOworCXNob3J0IGdwaW9fbW9kZV9y ZWc7CisKKwl4cnVzYl9nZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9k ZSwgJmdwaW9fbW9kZV9yZWcpOworCWdwaW9fbW9kZSA9IGdwaW9fbW9kZV9yZWc7CisJaWYgKGNm bGFnICYgQ1JUU0NUUykgeworCQlmbG93ID0gVUFSVF9GTE9XX01PREVfSFc7CisJCWdwaW9fbW9k ZSB8PSBVQVJUX0dQSU9fTU9ERV9TRUxfUlRTX0NUUzsKKwl9IGVsc2UgaWYgKElfSVhPRkYodHR5 KSB8fCBJX0lYT04odHR5KSkgeworCQl1bnNpZ25lZCBjaGFyIHN0YXJ0X2NoYXIgPSBTVEFSVF9D SEFSKHR0eSk7CisJCXVuc2lnbmVkIGNoYXIgc3RvcF9jaGFyID0gU1RPUF9DSEFSKHR0eSk7CisK KwkJZmxvdyA9IFVBUlRfRkxPV19NT0RFX1NXOworCQlncGlvX21vZGUgfD0gVUFSVF9HUElPX01P REVfU0VMX0dQSU87CisKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFy dF94b25fY2hhciwgc3RhcnRfY2hhcik7CisJCXhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5y ZWdfbWFwLnVhcnRfeG9mZl9jaGFyLCBzdG9wX2NoYXIpOworCX0gZWxzZSB7CisJCWZsb3cgPSBV QVJUX0ZMT1dfTU9ERV9OT05FOworCX0KKworCS8vIE1vZGUgY29uZmlndXJlZCBpbiBCSU9TIGZv ciBDYXJhY2FsbGEKKwkvLyBEbyBub3RoaW5nIGZvciB4cnVzYl9zZXRfZmxvd19tb2RlCisJaWYg KHhydXNiLT5mb3VuZF9zbWJpb3NfY2FyYWNhbGxhX2NvbmZpZykKKwkJcmV0dXJuIDA7CisKKwl4 cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2Zsb3csIGZsb3cpOworCXhy dXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19tb2RlLCBncGlvX21v ZGUpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCB4cnVzYl9zZW5kX2JyZWFrKHN0cnVjdCB4cnVz YiAqeHJ1c2IsIGludCBzdGF0ZSkKK3sKKwlpbnQgcnYgPSAwOworCisJLy8gVXNlIGN1c3RvbSB2 ZW5kb3IgcmVxdWVzdCBmb3IgWFIyMVYxNDEwLzEyLzE0CisJaWYgKCh4cnVzYi0+RGV2aWNlUHJv ZHVjdCAmIDB4MTQxMSkgPT0gMHgxNDEwKSB7CisJCWlmIChzdGF0ZSkgeworCQkJcnYgPSB4cnVz Yl9zZXRfcmVnKHhydXNiLAorCQkJCXhydXNiLT5yZWdfbWFwLnVhcnRfdHhfYnJlYWssCisJCQkJ MHhmZmZmKTsKKwkJfSBlbHNlIHsKKwkJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCQl4 cnVzYi0+cmVnX21hcC51YXJ0X3R4X2JyZWFrLAorCQkJCTApOworCQl9CisJfSBlbHNlIHsvLyBV c2UgQ0RDIGNvbW1hbmQgZm9yIFhSMjFCMTR4eCBhbmQgWFIyMjgweAorCQlydiA9IHhydXNiX2N0 cmxfbXNnKHhydXNiLAorCQkJVVNCX0NEQ19SRVFfU0VORF9CUkVBSywKKwkJCXN0YXRlLAorCQkJ TlVMTCwKKwkJCTApOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK2ludCB4cnVzYl9lbmFibGUoc3Ry dWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgcnYgPSAwOworCWludCBjaGFubmVsID0geHJ1c2It PmNoYW5uZWw7CisKKwlpZiAoY2hhbm5lbCkKKwkJY2hhbm5lbC0tOworCisJaWYgKCh4cnVzYi0+ RGV2aWNlUHJvZHVjdCAmIDB4MTQxMSkgPT0gMHgxNDEwKSB7CisJCXJ2ID0geHJ1c2Jfc2V0X3Jl Z19leHQoeHJ1c2IsCisJCQlYUjIxVjE0MXhfVVJNX1JFR19CTE9DSywKKwkJCVhSMjFWMTQxeF9V Uk1fRklGT19FTkFCTEVfUkVHICsgY2hhbm5lbCwKKwkJCVhSMjFWMTQxeF9VUk1fRU5BQkxFX1RY X0ZJRk8pOworCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51 YXJ0X2VuYWJsZSwKKwkJCVVBUlRfRU5BQkxFX1RYIHwgVUFSVF9FTkFCTEVfUlgpOworCQlydiA9 IHhydXNiX3NldF9yZWdfZXh0KHhydXNiLAorCQkJWFIyMVYxNDF4X1VSTV9SRUdfQkxPQ0ssCisJ CQlYUjIxVjE0MXhfVVJNX0ZJRk9fRU5BQkxFX1JFRyArIGNoYW5uZWwsCisJCQlYUjIxVjE0MXhf VVJNX0VOQUJMRV9UWF9GSUZPIHwKKwkJCVhSMjFWMTQxeF9VUk1fRU5BQkxFX1JYX0ZJRk8pOwor CX0gZWxzZSB7CisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCXhydXNiLT5yZWdfbWFw LnVhcnRfZW5hYmxlLAorCQkJVUFSVF9FTkFCTEVfVFggfCBVQVJUX0VOQUJMRV9SWCk7CisJfQor CisJcmV0dXJuIHJ2OworfQorCitpbnQgeHJ1c2JfZGlzYWJsZShzdHJ1Y3QgeHJ1c2IgKnhydXNi KQoreworCWludCBydiA9IDA7CisJaW50IGNoYW5uZWwgPSB4cnVzYi0+Y2hhbm5lbDsKKworCWlm IChjaGFubmVsKQorCQljaGFubmVsLS07CisKKwlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhy dXNiLT5yZWdfbWFwLnVhcnRfZW5hYmxlLCAwKTsKKworCWlmICgoeHJ1c2ItPkRldmljZVByb2R1 Y3QgJiAweDE0MTEpID09IDB4MTQxMCkgeworCQlydiA9IHhydXNiX3NldF9yZWdfZXh0KHhydXNi LAorCQkJWFIyMVYxNDF4X1VSTV9SRUdfQkxPQ0ssCisJCQlYUjIxVjE0MXhfVVJNX0ZJRk9fRU5B QkxFX1JFRyArIGNoYW5uZWwsIDApOworCX0KKworCXJldHVybiBydjsKK30KKworaW50IHhydXNi X2ZpZm9fcmVzZXQoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgcnYgPSAwOworCWludCBj aGFubmVsID0geHJ1c2ItPmNoYW5uZWw7CisKKwlpZiAoY2hhbm5lbCkKKwkJY2hhbm5lbC0tOwor CWlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweDE0MTEpID09IDB4MTQxMCkgeworCQlydiA9 IHhydXNiX3NldF9yZWdfZXh0KHhydXNiLAorCQkJWFIyMVYxNDF4X1VSTV9SRUdfQkxPQ0ssCisJ CQlYUjIxVjE0MXhfVVJNX1JYX0ZJRk9fUkVTRVQgKyBjaGFubmVsLAorCQkJMHhmZik7CisJCXJ2 IHw9IHhydXNiX3NldF9yZWdfZXh0KHhydXNiLAorCQkJWFIyMVYxNDF4X1VSTV9SRUdfQkxPQ0ss CisJCQlYUjIxVjE0MXhfVVJNX1RYX0ZJRk9fUkVTRVQgKyBjaGFubmVsLAorCQkJMHhmZik7CisJ fSBlbHNlCisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCXhydXNiLT5yZWdfbWFwLnVh cnRfZW5hYmxlLAorCQkJVUFSVF9FTkFCTEVfVFggfCBVQVJUX0VOQUJMRV9SWCk7CisKKwlyZXR1 cm4gcnY7Cit9CisKK2ludCB4cnVzYl9zZXRfd2lkZV9tb2RlKHN0cnVjdCB4cnVzYiAqeHJ1c2Is IGludCB3aWRlX21vZGUpCit7CisJaW50IHJ2ID0gMDsKKwlpbnQgY2hhbm5lbCA9IHhydXNiLT5j aGFubmVsOworCisJeHJ1c2JfZGlzYWJsZSh4cnVzYik7CisKKwlpZiAoKHhydXNiLT5EZXZpY2VQ cm9kdWN0ICYgMHhGRkYwKSA9PSAweDE0MDApIHsKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIy MjgwWF9UWF9XSURFX01PREVfUkVHLCB3aWRlX21vZGUpOworCQl4cnVzYl9zZXRfcmVnKHhydXNi LCBYUjIyODBYX1JYX1dJREVfTU9ERV9SRUcsIHdpZGVfbW9kZSk7CisJfSBlbHNlIGlmICgoeHJ1 c2ItPkRldmljZVByb2R1Y3QgJiAweEZGRjApID09IDB4MTQyMCkgeworCQl4cnVzYl9zZXRfcmVn KHhydXNiLCBYUjIxQjE0MlhfVFhfV0lERV9NT0RFX1JFRywgd2lkZV9tb2RlKTsKKwkJeHJ1c2Jf c2V0X3JlZyh4cnVzYiwgWFIyMUIxNDJYX1JYX1dJREVfTU9ERV9SRUcsIHdpZGVfbW9kZSk7CisJ fSBlbHNlIGlmICh4cnVzYi0+RGV2aWNlUHJvZHVjdCA9PSAweDE0MTEpIHsKKwkJeHJ1c2Jfc2V0 X3JlZyh4cnVzYiwgWFIyMUIxNDExX1dJREVfTU9ERV9SRUcsIHdpZGVfbW9kZSk7CisJfSBlbHNl IGlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweEZGRjApID09IDB4MTQxMCkgeworCQlpZiAo Y2hhbm5lbCkKKwkJCWNoYW5uZWwtLTsKKwkJeHJ1c2Jfc2V0X3JlZ19leHQoeHJ1c2IsCisJCQlY UjIxVjE0MXhfVUFSVF9DVVNUT01fQkxPQ0ssCisJCQljaGFubmVsKjggKyBYUjIxVjE0MVhfV0lE RV9NT0RFX1JFRywKKwkJCXdpZGVfbW9kZSk7CisJfQorCisJeHJ1c2JfZW5hYmxlKHhydXNiKTsK KwlyZXR1cm4gcnY7Cit9CisKK2ludCB4cnVzYl9ncGlvX2Rpcl9vdXQoc3RydWN0IHhydXNiICp4 cnVzYiwgaW50IGdwaW9fbWFzaykKK3sKKwlpbnQgcnYgPSAwOworCXNob3J0IHJlZ192YWx1ZTsK KworCXJ2ID0geHJ1c2JfZ2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX2Rp ciwgJnJlZ192YWx1ZSk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZWdf dmFsdWUgfD0gZ3Bpb19tYXNrOworCisJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+ cmVnX21hcC51YXJ0X2dwaW9fZGlyLCByZWdfdmFsdWUpOworCWlmIChydiA8IDApCisJCXJldHVy biAtRUZBVUxUOworCisJcmV0dXJuIHJ2OworfQorCitpbnQgeHJ1c2JfZ3Bpb19kaXJfaW4oc3Ry dWN0IHhydXNiICp4cnVzYiwgaW50IGdwaW9fbWFzaykKK3sKKwlpbnQgcnYgPSAwOworCXNob3J0 IHJlZ192YWx1ZTsKKworCXJ2ID0geHJ1c2JfZ2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAu dWFydF9ncGlvX2RpciwgJnJlZ192YWx1ZSk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIC1FRkFV TFQ7CisKKwlncGlvX21hc2sgPSB+Z3Bpb19tYXNrOworCXJlZ192YWx1ZSAmPSBncGlvX21hc2s7 CisKKwlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19k aXIsIHJlZ192YWx1ZSk7CisJaWYgKHJ2IDwgMCkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlyZXR1 cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgeHJ1c2JfdGlvY21nZXQoc3RydWN0IHhydXNiICp4cnVz YikKKworeworCXNob3J0IGRhdGE7CisJaW50IHJlc3VsdDsKKworCXJlc3VsdCA9IHhydXNiX2dl dF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19zdGF0dXMsICZkYXRhKTsKKwor CWlmIChyZXN1bHQpIHsKKwkJcmV0dXJuICgoZGF0YSAmIDB4OCkgPyAwIDogVElPQ01fRFRSKSB8 CisJCQkoKGRhdGEgJiAweDIwKSA/IDAgOiBUSU9DTV9SVFMpIHwKKwkJCSgoZGF0YSAmIDB4NCkg PyAwIDogVElPQ01fRFNSKSB8CisJCQkoKGRhdGEgJiAweDEpID8gMCA6IFRJT0NNX1JJKSB8CisJ CQkoKGRhdGEgJiAweDIpID8gMCA6IFRJT0NNX0NEKSB8CisJCQkoKGRhdGEgJiAweDEwKSA/IDAg OiBUSU9DTV9DVFMpOworCX0gZWxzZSB7CisJCXJldHVybiAtRUZBVUxUOworCX0KK30KKworc3Rh dGljIGludCB4cnVzYl90aW9jbXNldChzdHJ1Y3QgeHJ1c2IgKnhydXNiLAorCQl1bnNpZ25lZCBp bnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisKKwl1bnNpZ25lZCBpbnQgbmV3Y3RybCA9 IDA7CisKKwluZXdjdHJsID0geHJ1c2ItPmN0cmxvdXQ7CisJc2V0ID0gKHNldCAmIFRJT0NNX0RU UiA/IFhSVVNCX0NUUkxfRFRSIDogMCkgfAorCQkoc2V0ICYgVElPQ01fUlRTID8gWFJVU0JfQ1RS TF9SVFMgOiAwKTsKKwljbGVhciA9IChjbGVhciAmIFRJT0NNX0RUUiA/IFhSVVNCX0NUUkxfRFRS IDogMCkgfAorCQkoY2xlYXIgJiBUSU9DTV9SVFMgPyBYUlVTQl9DVFJMX1JUUyA6IDApOworCW5l d2N0cmwgPSAobmV3Y3RybCAmIH5jbGVhcikgfCBzZXQ7CisKKwlpZiAoeHJ1c2ItPmN0cmxvdXQg PT0gbmV3Y3RybCkKKwkJcmV0dXJuIDA7CisKKwl4cnVzYi0+Y3RybG91dCA9IG5ld2N0cmw7CisK KwlpZiAobmV3Y3RybCAmIFhSVVNCX0NUUkxfRFRSKSB7CisJCXhydXNiX3NldF9yZWcoeHJ1c2Is CisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fY2xyLAorCQkJVUFSVF9HUElPX0NMUl9EVFIp OworCX0gZWxzZSB7CisJCXhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51 YXJ0X2dwaW9fc2V0LAorCQkJVUFSVF9HUElPX1NFVF9EVFIpOworCX0KKworCWlmIChuZXdjdHJs ICYgWFJVU0JfQ1RSTF9SVFMpIHsKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCXhydXNiLT5y ZWdfbWFwLnVhcnRfZ3Bpb19jbHIsCisJCQlVQVJUX0dQSU9fQ0xSX1JUUyk7CisJfSBlbHNlIHsK KwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19zZXQs CisJCQlVQVJUX0dQSU9fU0VUX1JUUyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2 b2lkIGluaXRfeHIyMjgweF9yZWdfbWFwKHZvaWQpCit7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRf ZW5hYmxlID0gMHg0MDsKKwl4cjIyODB4X3JlZ19tYXAudWFydF9mbG93ID0gMHg0NjsKKwl4cjIy ODB4X3JlZ19tYXAudWFydF94b25fY2hhciA9IDB4NDc7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRf eG9mZl9jaGFyID0gMHg0ODsKKwl4cjIyODB4X3JlZ19tYXAudWFydF90eF9icmVhayA9IDB4NGE7 CisJeHIyMjgweF9yZWdfbWFwLnVhcnRfcnM0ODVfZGVsYXkgPSAweDRiOworCXhyMjI4MHhfcmVn X21hcC51YXJ0X2dwaW9fbW9kZSA9IDB4NGM7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRfZ3Bpb19k aXIgPSAweDRkOworCXhyMjI4MHhfcmVnX21hcC51YXJ0X2dwaW9fc2V0ID0gMHg0ZTsKKwl4cjIy ODB4X3JlZ19tYXAudWFydF9ncGlvX2NsciA9IDB4NGY7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRf Z3Bpb19zdGF0dXMgPSAweDUwOworCXhyMjI4MHhfcmVnX21hcC51YXJ0X2dwaW9faW50X21hc2sg PSAweDUxOworCXhyMjI4MHhfcmVnX21hcC51YXJ0X2N1c3RvbWl6ZWRfaW50ID0gMHg1MjsKKwl4 cjIyODB4X3JlZ19tYXAudWFydF9ncGlvX3B1bGxfdXBfZW5hYmxlID0gMHg1NDsKKwl4cjIyODB4 X3JlZ19tYXAudWFydF9ncGlvX3B1bGxfZG93bl9lbmFibGUgPSAweDU1OworCXhyMjI4MHhfcmVn X21hcC51YXJ0X2xvb3BiYWNrID0gMHg1NjsKKwl4cjIyODB4X3JlZ19tYXAudWFydF9sb3dfbGF0 ZW5jeSA9IDB4NjY7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRfY3VzdG9tX2RyaXZlciA9IDB4ODE7 Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfeHIyMWIxNDExX3JlZ19tYXAodm9pZCkKK3sKKwl4cjIx YjE0MTFfcmVnX21hcC51YXJ0X2VuYWJsZSA9IDB4YzAwOworCXhyMjFiMTQxMV9yZWdfbWFwLnVh cnRfZmxvdyA9IDB4YzA2OworCXhyMjFiMTQxMV9yZWdfbWFwLnVhcnRfeG9uX2NoYXIgPSAweGMw NzsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0X3hvZmZfY2hhciA9IDB4YzA4OworCXhyMjFiMTQx MV9yZWdfbWFwLnVhcnRfdHhfYnJlYWsgPSAweGMwYTsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0 X3JzNDg1X2RlbGF5ID0gMHhjMGI7CisJeHIyMWIxNDExX3JlZ19tYXAudWFydF9ncGlvX21vZGUg PSAweGMwYzsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0X2dwaW9fZGlyID0gMHhjMGQ7CisJeHIy MWIxNDExX3JlZ19tYXAudWFydF9ncGlvX3NldCA9IDB4YzBlOworCXhyMjFiMTQxMV9yZWdfbWFw LnVhcnRfZ3Bpb19jbHIgPSAweGMwZjsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0X2dwaW9fc3Rh dHVzID0gMHhjMTA7CisJeHIyMWIxNDExX3JlZ19tYXAudWFydF9ncGlvX2ludF9tYXNrID0gMHhj MTE7CisJeHIyMWIxNDExX3JlZ19tYXAudWFydF9jdXN0b21pemVkX2ludCA9IDB4YzEyOworCXhy MjFiMTQxMV9yZWdfbWFwLnVhcnRfZ3Bpb19wdWxsX3VwX2VuYWJsZSA9IDB4YzE0OworCXhyMjFi MTQxMV9yZWdfbWFwLnVhcnRfZ3Bpb19wdWxsX2Rvd25fZW5hYmxlID0gMHhjMTU7CisJeHIyMWIx NDExX3JlZ19tYXAudWFydF9sb29wYmFjayA9IDB4YzE2OworCXhyMjFiMTQxMV9yZWdfbWFwLnVh cnRfbG93X2xhdGVuY3kgPSAweGNjMjsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0X2N1c3RvbV9k cml2ZXIgPSAweDIwZDsKK30KKworc3RhdGljIHZvaWQgaW5pdF94cjIxdjE0MXhfcmVnX21hcCh2 b2lkKQoreworCXhyMjF2MTQxeF9yZWdfbWFwLnVhcnRfZW5hYmxlID0gMHgwMzsKKwl4cjIxdjE0 MXhfcmVnX21hcC51YXJ0X2Zvcm1hdCA9IDB4MGI7CisJeHIyMXYxNDF4X3JlZ19tYXAudWFydF9m bG93ID0gMHgwYzsKKwl4cjIxdjE0MXhfcmVnX21hcC51YXJ0X3hvbl9jaGFyID0gMHgxMDsKKwl4 cjIxdjE0MXhfcmVnX21hcC51YXJ0X3hvZmZfY2hhciA9IDB4MTE7CisJeHIyMXYxNDF4X3JlZ19t YXAudWFydF9sb29wYmFjayA9IDB4MTI7CisJeHIyMXYxNDF4X3JlZ19tYXAudWFydF90eF9icmVh ayA9IDB4MTQ7CisJeHIyMXYxNDF4X3JlZ19tYXAudWFydF9yczQ4NV9kZWxheSA9IDB4MTU7CisJ eHIyMXYxNDF4X3JlZ19tYXAudWFydF9ncGlvX21vZGUgPSAweDFhOworCXhyMjF2MTQxeF9yZWdf bWFwLnVhcnRfZ3Bpb19kaXIgPSAweDFiOworCXhyMjF2MTQxeF9yZWdfbWFwLnVhcnRfZ3Bpb19p bnRfbWFzayA9IDB4MWM7CisJeHIyMXYxNDF4X3JlZ19tYXAudWFydF9ncGlvX3NldCA9IDB4MWQ7 CisJeHIyMXYxNDF4X3JlZ19tYXAudWFydF9ncGlvX2NsciA9IDB4MWU7CisJeHIyMXYxNDF4X3Jl Z19tYXAudWFydF9ncGlvX3N0YXR1cyA9IDB4MWY7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfeHIy MWIxNDJ4X3JlZ19tYXAodm9pZCkKK3sKKwl4cjIxYjE0MnhfcmVnX21hcC51YXJ0X2VuYWJsZSA9 IDB4MDA7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF9mbG93ID0gMHgwNjsKKwl4cjIxYjE0Mnhf cmVnX21hcC51YXJ0X3hvbl9jaGFyID0gMHgwNzsKKwl4cjIxYjE0MnhfcmVnX21hcC51YXJ0X3hv ZmZfY2hhciA9IDB4MDg7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF90eF9icmVhayA9IDB4MGE7 CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF9yczQ4NV9kZWxheSA9IDB4MGI7CisJeHIyMWIxNDJ4 X3JlZ19tYXAudWFydF9ncGlvX21vZGUgPSAweDBjOworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRf Z3Bpb19kaXIgPSAweDBkOworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRfZ3Bpb19zZXQgPSAweDBl OworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRfZ3Bpb19jbHIgPSAweDBmOworCXhyMjFiMTQyeF9y ZWdfbWFwLnVhcnRfZ3Bpb19zdGF0dXMgPSAweDEwOworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRf Z3Bpb19pbnRfbWFzayA9IDB4MTE7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF9jdXN0b21pemVk X2ludCA9IDB4MTI7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF9ncGlvX29wZW5fZHJhaW4gPSAw eDEzOworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRfZ3Bpb19wdWxsX3VwX2VuYWJsZSA9IDB4MTQ7 CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF9ncGlvX3B1bGxfZG93bl9lbmFibGUgPSAweDE1Owor CXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRfbG9vcGJhY2sgPSAweDE2OworCXhyMjFiMTQyeF9yZWdf bWFwLnVhcnRfY3VzdG9tX2RyaXZlciA9IDB4NjA7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF9s b3dfbGF0ZW5jeSA9IDB4NDY7Cit9CisKK2ludCB4cnVzYl9yZWdfaW5pdChzdHJ1Y3QgeHJ1c2Ig KnhydXNiKQoreworCWludCBydiA9IDAsIGdwaW9fbW9kZSA9IDA7CisKKwlpbml0X3hyMjI4MHhf cmVnX21hcCgpOworCWluaXRfeHIyMWIxNDJ4X3JlZ19tYXAoKTsKKwlpbml0X3hyMjFiMTQxMV9y ZWdfbWFwKCk7CisJaW5pdF94cjIxdjE0MXhfcmVnX21hcCgpOworCisJaWYgKCh4cnVzYi0+RGV2 aWNlUHJvZHVjdCAmIDB4ZmZmMCkgPT0gMHgxNDAwKSB7CisJCW1lbWNweSgmKHhydXNiLT5yZWdf bWFwKSwgJnhyMjI4MHhfcmVnX21hcCwKKwkJCXNpemVvZihzdHJ1Y3QgcmVnX2FkZHJfbWFwKSk7 CisJfSBlbHNlIGlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweEZGRjApID09IDB4MTQyMCkg eworCQltZW1jcHkoJih4cnVzYi0+cmVnX21hcCksICZ4cjIxYjE0MnhfcmVnX21hcCwKKwkJCXNp emVvZihzdHJ1Y3QgcmVnX2FkZHJfbWFwKSk7CisJfSBlbHNlIGlmICh4cnVzYi0+RGV2aWNlUHJv ZHVjdCA9PSAweDE0MTEpIHsKKwkJbWVtY3B5KCYoeHJ1c2ItPnJlZ19tYXApLCAmeHIyMWIxNDEx X3JlZ19tYXAsCisJCQlzaXplb2Yoc3RydWN0IHJlZ19hZGRyX21hcCkpOworCX0gZWxzZSBpZiAo KHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHhmZmYwKSA9PSAweDE0MTApIHsKKwkJbWVtY3B5KCYo eHJ1c2ItPnJlZ19tYXApLCAmeHIyMXYxNDF4X3JlZ19tYXAsCisJCQlzaXplb2Yoc3RydWN0IHJl Z19hZGRyX21hcCkpOworCX0gZWxzZSB7CisJCXJ2ID0gLTE7CisJfQorCisJaWYgKHhydXNiLT5y ZWdfbWFwLnVhcnRfY3VzdG9tX2RyaXZlcikKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2It PnJlZ19tYXAudWFydF9jdXN0b21fZHJpdmVyLCAxKTsKKworCS8vIEVuYWJsZSBUWFQgYW5kIFJY VCBmdW5jdGlvbiBmb3IgWFIyMUIxNDIwLzIyLzI0CisJaWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVj dCAmIDB4ZmZmMCkgPT0gMHgxNDIwKQorCQlncGlvX21vZGUgfD0gMHgzMDA7CisKKwl4cnVzYl9z ZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwgZ3Bpb19tb2RlKTsK KworCS8vIEVuYWJsZSBSVFMgYW5kIERUUiBhcyBvdXRwdXRzIGFuZCBoaWdoIChkZS1hc3NlcnRl ZCkKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fZGlyLCAw eDI4KTsKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fc2V0 LAorCQlVQVJUX0dQSU9fU0VUX0RUUiB8IFVBUlRfR1BJT19TRVRfUlRTKTsKKworCXJldHVybiBy djsKK30KKworLyoKKyAqIFdyaXRlIGJ1ZmZlciBtYW5hZ2VtZW50LgorICogQWxsIG9mIHRoZXNl IGFzc3VtZSBwcm9wZXIgbG9ja3MgdGFrZW4gYnkgdGhlIGNhbGxlci4KKyAqLworCitzdGF0aWMg aW50IHhydXNiX3diX2FsbG9jKHN0cnVjdCB4cnVzYiAqeHJ1c2IpCit7CisJaW50IGksIHdibjsK KwlzdHJ1Y3QgeHJ1c2Jfd2IgKndiOworCisJd2JuID0gMDsKKwlpID0gMDsKKwlmb3IgKDs7KSB7 CisJCXdiID0gJnhydXNiLT53Ylt3Ym5dOworCQlpZiAoIXdiLT51c2UpIHsKKwkJCXdiLT51c2Ug PSAxOworCQkJcmV0dXJuIHdibjsKKwkJfQorCQl3Ym4gPSAod2JuICsgMSkgJSBYUlVTQl9OVzsK KwkJaWYgKCsraSA+PSBYUlVTQl9OVykKKwkJCXJldHVybiAtMTsKKwl9Cit9CisKK3N0YXRpYyBp bnQgeHJ1c2Jfd2JfaXNfYXZhaWwoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgaSwgbjsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbiA9IFhSVVNCX05XOworCXNwaW5fbG9ja19pcnFz YXZlKCZ4cnVzYi0+d3JpdGVfbG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBYUlVTQl9O VzsgaSsrKQorCQluIC09IHhydXNiLT53YltpXS51c2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmeHJ1c2ItPndyaXRlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIEZp bmlzaCB3cml0ZS4gQ2FsbGVyIG11c3QgaG9sZCB4cnVzYi0+d3JpdGVfbG9jaworICovCitzdGF0 aWMgdm9pZCB4cnVzYl93cml0ZV9kb25lKHN0cnVjdCB4cnVzYiAqeHJ1c2IsCisJCXN0cnVjdCB4 cnVzYl93YiAqd2IpCit7CisJd2ItPnVzZSA9IDA7CisJeHJ1c2ItPnRyYW5zbWl0dGluZy0tOwor CXVzYl9hdXRvcG1fcHV0X2ludGVyZmFjZV9hc3luYyh4cnVzYi0+Y29udHJvbCk7Cit9CisKKy8q CisgKiBQb2tlIHdyaXRlLgorICoKKyAqIHRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGxv Y2tpbmcKKyAqLworCitzdGF0aWMgaW50IHhydXNiX3N0YXJ0X3diKHN0cnVjdCB4cnVzYiAqeHJ1 c2IsIHN0cnVjdCB4cnVzYl93YiAqd2IpCit7CisJaW50IHJjOworCisJeHJ1c2ItPnRyYW5zbWl0 dGluZysrOworCisJd2ItPnVyYi0+dHJhbnNmZXJfYnVmZmVyID0gd2ItPmJ1ZjsKKwl3Yi0+dXJi LT50cmFuc2Zlcl9kbWEgPSB3Yi0+ZG1haDsKKwl3Yi0+dXJiLT50cmFuc2Zlcl9idWZmZXJfbGVu Z3RoID0gd2ItPmxlbjsKKwl3Yi0+dXJiLT5kZXYgPSB4cnVzYi0+ZGV2OworCisJcmMgPSB1c2Jf c3VibWl0X3VyYih3Yi0+dXJiLCBHRlBfQVRPTUlDKTsKKwlpZiAocmMgPCAwKSB7CisJCWRldl9l cnIoJnhydXNiLT5kYXRhLT5kZXYsCisJCQkiJXMgLSB1c2Jfc3VibWl0X3VyYih3cml0ZSBidWxr KSBmYWlsZWQ6ICVkXG4iLAorCQkJX19mdW5jX18sIHJjKTsKKwkJeHJ1c2Jfd3JpdGVfZG9uZSh4 cnVzYiwgd2IpOworCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qCisgKiBhdHRyaWJ1dGVzIGV4cG9y dGVkIHRocm91Z2ggc3lzZnMKKyAqLworCitzdGF0aWMgc3NpemVfdCBibUNhcGFiaWxpdGllc19z aG93Cisoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwg Y2hhciAqYnVmKQoreworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmID0gdG9fdXNiX2ludGVy ZmFjZShkZXYpOworCXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYp OworCisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWQiLCB4cnVzYi0+Y3RybF9jYXBzKTsKK30KK3N0 YXRpYyBERVZJQ0VfQVRUUl9STyhibUNhcGFiaWxpdGllcyk7CisKKy8qCisgKiBJbnRlcnJ1cHQg aGFuZGxlcnMgZm9yIHZhcmlvdXMgWFJVU0IgZGV2aWNlIHJlc3BvbnNlcworICovCisKKy8qIGNv bnRyb2wgaW50ZXJmYWNlIHJlcG9ydHMgc3RhdHVzIGNoYW5nZXMgd2l0aCAiaW50ZXJydXB0IiB0 cmFuc2ZlcnMgKi8KK3N0YXRpYyB2b2lkIHhydXNiX2N0cmxfaXJxKHN0cnVjdCB1cmIgKnVyYikK K3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdXJiLT5jb250ZXh0OworCisJaW50IHJ2OworCWlu dCBzdGF0dXMgPSB1cmItPnN0YXR1czsKKwl1bnNpZ25lZCBjaGFyICpwOworCisJc3dpdGNoIChz dGF0dXMpIHsKKwljYXNlIDA6CisJCXAgPSAodW5zaWduZWQgY2hhciAqKSh1cmItPnRyYW5zZmVy X2J1ZmZlcik7CisJCS8qIHN1Y2Nlc3MgKi8KKwkJYnJlYWs7CisJY2FzZSAtRUNPTk5SRVNFVDoK KwljYXNlIC1FTk9FTlQ6CisJY2FzZSAtRVNIVVRET1dOOgorCQkvKiB0aGlzIHVyYiBpcyB0ZXJt aW5hdGVkLCBjbGVhbiB1cCAqLworCisJCXJldHVybjsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9 CisKKwlydiA9IHVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJaWYgKHJ2ICYmIHJ2 ICE9IC1FUEVSTSAmJiBydiAhPSAtRU5PREVWKSB7CisJCWRldl9lcnIoJnhydXNiLT5jb250cm9s LT5kZXYsCisJCQkiJXMgLSB1c2Jfc3VibWl0X3VyYiBmYWlsZWQ6ICVkXG4iLCBfX2Z1bmNfXywg cnYpOworCX0KK30KKworc3RhdGljIGludCB4cnVzYl9zdWJtaXRfcmVhZF91cmIoc3RydWN0IHhy dXNiICp4cnVzYiwgaW50IGluZGV4LAorCWdmcF90IG1lbV9mbGFncykKK3sKKwlpbnQgcmVzOwor CisJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoaW5kZXgsICZ4cnVzYi0+cmVhZF91cmJzX2ZyZWUp KQorCQlyZXR1cm4gMDsKKworCXJlcyA9IHVzYl9zdWJtaXRfdXJiKHhydXNiLT5yZWFkX3VyYnNb aW5kZXhdLCBtZW1fZmxhZ3MpOworCWlmIChyZXMpIHsKKwkJaWYgKHJlcyAhPSAtRVBFUk0gJiYg cmVzICE9IC1FTk9ERVYpIHsKKwkJCWRldl9lcnIoJnhydXNiLT5kYXRhLT5kZXYsICIlcyAtIHVz Yl9zdWJtaXRfdXJiIGZhaWxlZDogJWRcbiIsCisJCQkJX19mdW5jX18sIHJlcyk7CisJCX0KKwkJ c2V0X2JpdChpbmRleCwgJnhydXNiLT5yZWFkX3VyYnNfZnJlZSk7CisJCXJldHVybiByZXM7CisJ fQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeHJ1c2Jfc3VibWl0X3JlYWRfdXJicyhz dHJ1Y3QgeHJ1c2IgKnhydXNiLCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJaW50IHJlczsKKwlpbnQg aTsKKworCWZvciAoaSA9IDA7IGkgPCB4cnVzYi0+cnhfYnVmbGltaXQ7ICsraSkgeworCQlyZXMg PSB4cnVzYl9zdWJtaXRfcmVhZF91cmIoeHJ1c2IsIGksIG1lbV9mbGFncyk7CisJCWlmIChyZXMp CisJCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4cnVz Yl9wcm9jZXNzX3JlYWRfdXJiKHN0cnVjdCB4cnVzYiAqeHJ1c2IsCXN0cnVjdCB1cmIgKnVyYikK K3sKKwlpbnQgd2lkZV9tb2RlID0geHJ1c2ItPndpZGVfbW9kZTsKKwlpbnQgaGF2ZV9leHRyYV9i eXRlOworCWludCBsZW5ndGg7CisKKwlpZiAoeHJ1c2ItPnVhcnRfdHlwZSA9PSAwKQorCQlyZXR1 cm47CisJaWYgKCF1cmItPmFjdHVhbF9sZW5ndGgpCisJCXJldHVybjsKKworCWlmICh3aWRlX21v ZGUpIHsKKwkJY2hhciAqZHAgPSB1cmItPnRyYW5zZmVyX2J1ZmZlcjsKKwkJaW50IGksIGNoLCBj aF9mbGFnczsKKworCQlsZW5ndGggPSB1cmItPmFjdHVhbF9sZW5ndGg7CisJCWxlbmd0aCA9IGxl bmd0aCArICh4cnVzYi0+aGF2ZV9leHRyYV9ieXRlID8gMSA6IDApOworCQloYXZlX2V4dHJhX2J5 dGUgPSAod2lkZV9tb2RlICYmIChsZW5ndGggJiAxKSk7CisJCWxlbmd0aCA9ICh3aWRlX21vZGUp ID8gKGxlbmd0aCAvIDIpIDogbGVuZ3RoOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kp IHsKKwkJCWNoYXIgdHR5X2ZsYWc7CisKKwkJCWlmIChpID09IDApCisJCQkJaWYgKHhydXNiLT5o YXZlX2V4dHJhX2J5dGUpCisJCQkJCWNoID0geHJ1c2ItPmV4dHJhX2J5dGU7CisJCQkJZWxzZQor CQkJCQljaCA9ICpkcCsrOworCQkJZWxzZQorCQkJCWNoID0gKmRwKys7CisKKwkJCWNoX2ZsYWdz ID0gKmRwKys7CisJCQlpZiAoY2hfZmxhZ3MgJiBXSURFX01PREVfUEFSSVRZKQorCQkJCXR0eV9m bGFnID0gVFRZX1BBUklUWTsKKwkJCWVsc2UgaWYgKGNoX2ZsYWdzICYgV0lERV9NT0RFX0JSRUFL KQorCQkJCXR0eV9mbGFnID0gVFRZX0JSRUFLOworCQkJZWxzZSBpZiAoY2hfZmxhZ3MgJiBXSURF X01PREVfRlJBTUUpCisJCQkJdHR5X2ZsYWcgPSBUVFlfRlJBTUU7CisJCQllbHNlIGlmIChjaF9m bGFncyAmIFdJREVfTU9ERV9PVkVSUlVOKQorCQkJCXR0eV9mbGFnID0gVFRZX09WRVJSVU47CisJ CQllbHNlCisJCQkJdHR5X2ZsYWcgPSBUVFlfTk9STUFMOworCisJCQl0dHlfaW5zZXJ0X2ZsaXBf Y2hhcigmeHJ1c2ItPnBvcnQsIGNoLCB0dHlfZmxhZyk7CisJCQl0dHlfZmxpcF9idWZmZXJfcHVz aCgmeHJ1c2ItPnBvcnQpOworCQl9CisJfSBlbHNlIHsKKwkJdHR5X2luc2VydF9mbGlwX3N0cmlu ZygmeHJ1c2ItPnBvcnQsCisJCQl1cmItPnRyYW5zZmVyX2J1ZmZlciwgdXJiLT5hY3R1YWxfbGVu Z3RoKTsKKwkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goJnhydXNiLT5wb3J0KTsKKwl9Cit9CisKK3N0 YXRpYyB2b2lkIHhydXNiX3JlYWRfYnVsa19jYWxsYmFjayhzdHJ1Y3QgdXJiICp1cmIpCit7CisJ c3RydWN0IHhydXNiX3JiICpyYiA9IHVyYi0+Y29udGV4dDsKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNi ID0gcmItPmluc3RhbmNlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzZXRfYml0KHJiLT5p bmRleCwgJnhydXNiLT5yZWFkX3VyYnNfZnJlZSk7CisKKwlpZiAoIXhydXNiLT5kZXYpIHsKKwkJ ZGV2X2RiZygmeHJ1c2ItPmRhdGEtPmRldiwgIiVzIC0gZGlzY29ubmVjdGVkXG4iLCBfX2Z1bmNf Xyk7CisJCXJldHVybjsKKwl9CisJdXNiX21hcmtfbGFzdF9idXN5KHhydXNiLT5kZXYpOworCXhy dXNiX3Byb2Nlc3NfcmVhZF91cmIoeHJ1c2IsIHVyYik7CisKKwkvKiB0aHJvdHRsZSBkZXZpY2Ug aWYgcmVxdWVzdGVkIGJ5IHR0eSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ4cnVzYi0+cmVhZF9s b2NrLCBmbGFncyk7CisJeHJ1c2ItPnRocm90dGxlZCA9IHhydXNiLT50aHJvdHRsZV9yZXE7CisJ aWYgKCF4cnVzYi0+dGhyb3R0bGVkICYmICF4cnVzYi0+c3VzcF9jb3VudCkgeworCQlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ4cnVzYi0+cmVhZF9sb2NrLCBmbGFncyk7CisJCXhydXNiX3N1Ym1p dF9yZWFkX3VyYih4cnVzYiwKKwkJCXJiLT5pbmRleCwgR0ZQX0FUT01JQyk7CisJfSBlbHNlIHsK KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHJ1c2ItPnJlYWRfbG9jaywgZmxhZ3MpOworCX0K K30KKworLyogZGF0YSBpbnRlcmZhY2Ugd3JvdGUgdGhvc2Ugb3V0Z29pbmcgYnl0ZXMgKi8KK3N0 YXRpYyB2b2lkIHhydXNiX3dyaXRlX2J1bGsoc3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB4 cnVzYl93YiAqd2IgPSB1cmItPmNvbnRleHQ7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHdiLT5p bnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnhy dXNiLT53cml0ZV9sb2NrLCBmbGFncyk7CisJeHJ1c2Jfd3JpdGVfZG9uZSh4cnVzYiwgd2IpOwor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhydXNiLT53cml0ZV9sb2NrLCBmbGFncyk7CisJc2No ZWR1bGVfd29yaygmeHJ1c2ItPndvcmspOworfQorCitzdGF0aWMgdm9pZCB4cnVzYl9zb2Z0aW50 KHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gY29u dGFpbmVyX29mKHdvcmssIHN0cnVjdCB4cnVzYiwgd29yayk7CisKKwl0dHlfcG9ydF90dHlfd2Fr ZXVwKCZ4cnVzYi0+cG9ydCk7Cit9CisKKy8qCisgKiBUVFkgaGFuZGxlcnMKKyAqLworCitzdGF0 aWMgaW50IHhydXNiX3R0eV9pbnN0YWxsKHN0cnVjdCB0dHlfZHJpdmVyICpkcml2ZXIsCXN0cnVj dCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHhydXNiICp4cnVzYjsKKwlpbnQgcnY7CisK Kwl4cnVzYiA9IHhydXNiX2dldF9ieV9pbmRleCh0dHktPmluZGV4KTsKKwlpZiAoIXhydXNiKQor CQlyZXR1cm4gLUVOT0RFVjsKKworCXJ2ID0gdHR5X3N0YW5kYXJkX2luc3RhbGwoZHJpdmVyLCB0 dHkpOworCWlmIChydikKKwkJZ290byBlcnJvcl9pbml0X3Rlcm1pb3M7CisKKwl0dHktPmRyaXZl cl9kYXRhID0geHJ1c2I7CisKKwlyZXR1cm4gMDsKKworZXJyb3JfaW5pdF90ZXJtaW9zOgorCXR0 eV9wb3J0X3B1dCgmeHJ1c2ItPnBvcnQpOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCB4 cnVzYl90dHlfb3BlbihzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkK K3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmVzdWx0 OworCisJcmVzdWx0ID0geHJ1c2JfZmlmb19yZXNldCh4cnVzYik7CisKKwlyZXR1cm4gdHR5X3Bv cnRfb3BlbigmeHJ1c2ItPnBvcnQsIHR0eSwgZmlscCk7Cit9CisKK3N0YXRpYyBpbnQgeHJ1c2Jf cG9ydF9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVjdCB0dHlfc3RydWN0ICp0 dHkpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3Qg eHJ1c2IsIHBvcnQpOworCWludCBydiA9IC1FTk9ERVY7CisKKwltdXRleF9sb2NrKCZ4cnVzYi0+ bXV0ZXgpOworCWlmICh4cnVzYi0+ZGlzY29ubmVjdGVkKQorCQlnb3RvIGRpc2Nvbm5lY3RlZDsK KworCXJ2ID0gdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHhydXNiLT5jb250cm9sKTsKKwlpZiAo cnYpCisJCWdvdG8gZXJyb3JfZ2V0X2ludGVyZmFjZTsKKworCXNldF9iaXQoVFRZX05PX1dSSVRF X1NQTElULCAmdHR5LT5mbGFncyk7CisJeHJ1c2ItPmNvbnRyb2wtPm5lZWRzX3JlbW90ZV93YWtl dXAgPSAxOworCisJeHJ1c2ItPmN0cmx1cmItPmRldiA9IHhydXNiLT5kZXY7CisJaWYgKHVzYl9z dWJtaXRfdXJiKHhydXNiLT5jdHJsdXJiLCBHRlBfS0VSTkVMKSkgeworCQlkZXZfZXJyKCZ4cnVz Yi0+Y29udHJvbC0+ZGV2LAorCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIoY3RybCBpcnEpIGZhaWxl ZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycm9yX3N1Ym1pdF91cmI7CisJfQorCisJeHJ1c2It PmN0cmxvdXQgPSBYUlVTQl9DVFJMX0RUUiB8IFhSVVNCX0NUUkxfUlRTOworCWlmICh4cnVzYl9z ZXRfY29udHJvbCh4cnVzYiwgeHJ1c2ItPmN0cmxvdXQpIDwgMAorCQkmJiAoeHJ1c2ItPmN0cmxf Y2FwcyAmIFVTQl9DRENfQ0FQX0xJTkUpKSB7CisJCWdvdG8gZXJyb3Jfc2V0X2NvbnRyb2w7CisJ fQorCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHhydXNiLT5jb250cm9sKTsKKworCS8qCisJ ICogVW50aHJvdHRsZSBkZXZpY2UgaW4gY2FzZSB0aGUgVFRZIHdhcyBjbG9zZWQgd2hpbGUgdGhy b3R0bGVkLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnhydXNiLT5yZWFkX2xvY2spOworCXhydXNi LT50aHJvdHRsZWQgPSAwOworCXhydXNiLT50aHJvdHRsZV9yZXEgPSAwOworCXNwaW5fdW5sb2Nr X2lycSgmeHJ1c2ItPnJlYWRfbG9jayk7CisKKwlpZiAoeHJ1c2Jfc3VibWl0X3JlYWRfdXJicyh4 cnVzYiwgR0ZQX0tFUk5FTCkpCisJCWdvdG8gZXJyb3Jfc3VibWl0X3JlYWRfdXJiczsKKworCW11 dGV4X3VubG9jaygmeHJ1c2ItPm11dGV4KTsKKworCXJldHVybiAwOworCitlcnJvcl9zdWJtaXRf cmVhZF91cmJzOgorCXhydXNiLT5jdHJsb3V0ID0gMDsKKwl4cnVzYl9zZXRfY29udHJvbCh4cnVz YiwgeHJ1c2ItPmN0cmxvdXQpOworZXJyb3Jfc2V0X2NvbnRyb2w6CisJdXNiX2tpbGxfdXJiKHhy dXNiLT5jdHJsdXJiKTsKK2Vycm9yX3N1Ym1pdF91cmI6CisJdXNiX2F1dG9wbV9wdXRfaW50ZXJm YWNlKHhydXNiLT5jb250cm9sKTsKK2Vycm9yX2dldF9pbnRlcmZhY2U6CitkaXNjb25uZWN0ZWQ6 CisJbXV0ZXhfdW5sb2NrKCZ4cnVzYi0+bXV0ZXgpOworCXJldHVybiBydjsKK30KKworc3RhdGlj IHZvaWQgeHJ1c2JfcG9ydF9kZXN0cnVjdChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQpCit7CisJc3Ry dWN0IHhydXNiICp4cnVzYiA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgeHJ1c2IsIHBvcnQp OworCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKwlpZiAoeHJ1c2ItPnJ2X2dwaW9fY3JlYXRlZCA9 PSAwKQorCQlncGlvY2hpcF9yZW1vdmUoJnhydXNiLT54cl9ncGlvKTsKKyNlbmRpZgorCXhydXNi X3JlbGVhc2VfbWlub3IoeHJ1c2IpOworCXVzYl9wdXRfaW50Zih4cnVzYi0+Y29udHJvbCk7CisJ a2ZyZWUoeHJ1c2IpOworfQorCitzdGF0aWMgdm9pZCB4cnVzYl9wb3J0X3NodXRkb3duKHN0cnVj dCB0dHlfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gY29udGFpbmVyX29m KHBvcnQsIHN0cnVjdCB4cnVzYiwgcG9ydCk7CisJaW50IGk7CisKKwltdXRleF9sb2NrKCZ4cnVz Yi0+bXV0ZXgpOworCWlmICgheHJ1c2ItPmRpc2Nvbm5lY3RlZCkgeworCQl1c2JfYXV0b3BtX2dl dF9pbnRlcmZhY2UoeHJ1c2ItPmNvbnRyb2wpOworCQl4cnVzYl9zZXRfY29udHJvbCh4cnVzYiwK KwkJCXhydXNiLT5jdHJsb3V0ID0gMCk7CisJCXVzYl9raWxsX3VyYih4cnVzYi0+Y3RybHVyYik7 CisJCWZvciAoaSA9IDA7IGkgPCBYUlVTQl9OVzsgaSsrKQorCQkJdXNiX2tpbGxfdXJiKHhydXNi LT53YltpXS51cmIpOworCQlmb3IgKGkgPSAwOyBpIDwgeHJ1c2ItPnJ4X2J1ZmxpbWl0OyBpKysp CisJCQl1c2Jfa2lsbF91cmIoeHJ1c2ItPnJlYWRfdXJic1tpXSk7CisJCXhydXNiLT5jb250cm9s LT5uZWVkc19yZW1vdGVfd2FrZXVwID0gMDsKKwkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHhy dXNiLT5jb250cm9sKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ4cnVzYi0+bXV0ZXgpOworfQorCitz dGF0aWMgdm9pZCB4cnVzYl90dHlfY2xlYW51cChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQorewor CXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB0dHktPmRyaXZlcl9kYXRhOworCisJdHR5X3BvcnRfcHV0 KCZ4cnVzYi0+cG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIHhydXNiX3R0eV9oYW5ndXAoc3RydWN0 IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJf ZGF0YTsKKworCXR0eV9wb3J0X2hhbmd1cCgmeHJ1c2ItPnBvcnQpOworfQorCitzdGF0aWMgdm9p ZCB4cnVzYl90dHlfY2xvc2Uoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgc3RydWN0IGZpbGUgKmZp bHApCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwl0dHlf cG9ydF9jbG9zZSgmeHJ1c2ItPnBvcnQsIHR0eSwgZmlscCk7Cit9CisKK3N0YXRpYyBpbnQgeHJ1 c2JfdHR5X3dyaXRlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksCisJCWNvbnN0IHVuc2lnbmVkIGNo YXIgKmJ1ZiwgaW50IGNvdW50KQoreworCXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB0dHktPmRyaXZl cl9kYXRhOworCWludCBzdGF0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHdibjsKKwlz dHJ1Y3QgeHJ1c2Jfd2IgKndiOworCisJaWYgKHhydXNiLT51YXJ0X3R5cGUgPT0gMCkKKwkJcmV0 dXJuIC1FSU87CisKKwlpZiAoIWNvdW50KQorCQlyZXR1cm4gMDsKKworCXNwaW5fbG9ja19pcnFz YXZlKCZ4cnVzYi0+d3JpdGVfbG9jaywgZmxhZ3MpOworCXdibiA9IHhydXNiX3diX2FsbG9jKHhy dXNiKTsKKwlpZiAod2JuIDwgMCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4cnVzYi0+ d3JpdGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKKwl9CisJd2IgPSAmeHJ1c2ItPndiW3di bl07CisKKwlpZiAoIXhydXNiLT5kZXYpIHsKKwkJd2ItPnVzZSA9IDA7CisJCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnhydXNiLT53cml0ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRU5PREVW OworCX0KKworCWNvdW50ID0gKGNvdW50ID4geHJ1c2ItPndyaXRlc2l6ZSkgPyB4cnVzYi0+d3Jp dGVzaXplIDogY291bnQ7CisJbWVtY3B5KHdiLT5idWYsIGJ1ZiwgY291bnQpOworCXdiLT5sZW4g PSBjb3VudDsKKworCXVzYl9hdXRvcG1fZ2V0X2ludGVyZmFjZV9hc3luYyh4cnVzYi0+Y29udHJv bCk7CisJaWYgKHhydXNiLT5zdXNwX2NvdW50KSB7CisJCWlmICgheHJ1c2ItPmRlbGF5ZWRfd2Ip CisJCQl4cnVzYi0+ZGVsYXllZF93YiA9IHdiOworCQllbHNlCisJCQl1c2JfYXV0b3BtX3B1dF9p bnRlcmZhY2VfYXN5bmMoeHJ1c2ItPmNvbnRyb2wpOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnhydXNiLT53cml0ZV9sb2NrLCBmbGFncyk7CisJCXJldHVybiBjb3VudDsJLyogQSB3aGl0 ZSBsaWUgKi8KKwl9CisJdXNiX21hcmtfbGFzdF9idXN5KHhydXNiLT5kZXYpOworCisJc3RhdCA9 IHhydXNiX3N0YXJ0X3diKHhydXNiLCB3Yik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHJ1 c2ItPndyaXRlX2xvY2ssIGZsYWdzKTsKKworCWlmIChzdGF0IDwgMCkKKwkJcmV0dXJuIHN0YXQ7 CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgeHJ1c2JfdHR5X3dyaXRlX3Jvb20o c3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5k cml2ZXJfZGF0YTsKKwkvKgorCSAqIERvIG5vdCBsZXQgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBr bm93IHRoYXQgd2UgaGF2ZSBhIHJlc2VydmUsCisJICogb3IgaXQgbWlnaHQgZ2V0IHRvbyBlbnRo dXNpYXN0aWMuCisJICovCisJcmV0dXJuIHhydXNiX3diX2lzX2F2YWlsKHhydXNiKSA/IHhydXNi LT53cml0ZXNpemUgOiAwOworfQorCitzdGF0aWMgaW50IHhydXNiX3R0eV9jaGFyc19pbl9idWZm ZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5 LT5kcml2ZXJfZGF0YTsKKwkvKgorCSAqIGlmIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCB0aGVu IGFueSByZW1haW5pbmcgY2hhcmFjdGVycyBmZWxsIG91dAorCSAqIG9mIHRoZSBjb25uZWN0b3Ig OykKKwkgKi8KKwlpZiAoeHJ1c2ItPmRpc2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisJLyoKKwkg KiBUaGlzIGlzIGluYWNjdXJhdGUgKG92ZXJjb3VudHMpLCBidXQgaXQgd29ya3MuCisJICovCisJ cmV0dXJuIChYUlVTQl9OVyAtIHhydXNiX3diX2lzX2F2YWlsKHhydXNiKSkgKiB4cnVzYi0+d3Jp dGVzaXplOworfQorCitzdGF0aWMgdm9pZCB4cnVzYl90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9z dHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsK KworCXNwaW5fbG9ja19pcnEoJnhydXNiLT5yZWFkX2xvY2spOworCXhydXNiLT50aHJvdHRsZV9y ZXEgPSAxOworCXNwaW5fdW5sb2NrX2lycSgmeHJ1c2ItPnJlYWRfbG9jayk7Cit9CisKK3N0YXRp YyB2b2lkIHhydXNiX3R0eV91bnRocm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJ c3RydWN0IHhydXNiICp4cnVzYiA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgaW50IHdh c190aHJvdHRsZWQ7CisKKwlzcGluX2xvY2tfaXJxKCZ4cnVzYi0+cmVhZF9sb2NrKTsKKwl3YXNf dGhyb3R0bGVkID0geHJ1c2ItPnRocm90dGxlZDsKKwl4cnVzYi0+dGhyb3R0bGVkID0gMDsKKwl4 cnVzYi0+dGhyb3R0bGVfcmVxID0gMDsKKwlzcGluX3VubG9ja19pcnEoJnhydXNiLT5yZWFkX2xv Y2spOworCisJaWYgKHdhc190aHJvdHRsZWQpCisJCXhydXNiX3N1Ym1pdF9yZWFkX3VyYnMoeHJ1 c2IsIEdGUF9LRVJORUwpOworfQorCitzdGF0aWMgaW50IHhydXNiX3R0eV9icmVha19jdGwoc3Ry dWN0IHR0eV9zdHJ1Y3QgKnR0eSwgaW50IHN0YXRlKQoreworCXN0cnVjdCB4cnVzYiAqeHJ1c2Ig PSB0dHktPmRyaXZlcl9kYXRhOworCWludCBydjsKKworCXJ2ID0geHJ1c2Jfc2VuZF9icmVhayh4 cnVzYiwgc3RhdGUgPyAweGZmZmYgOiAwKTsKKwlpZiAocnYgPCAwKSB7CisJCWRldl9lcnIoJnhy dXNiLT5jb250cm9sLT5kZXYsICIlcyAtIHNlbmQgYnJlYWsgZmFpbGVkXG4iLAorCQkJX19mdW5j X18pOworCX0KKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyBpbnQgeHJ1c2JfdHR5X3Rpb2NtZ2V0 KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHR0eS0+ ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4geHJ1c2JfdGlvY21nZXQoeHJ1c2IpOworfQorCitzdGF0 aWMgaW50IHhydXNiX3R0eV90aW9jbXNldChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJICAg IHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVkIGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgeHJ1c2Ig KnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXJldHVybiB4cnVzYl90aW9jbXNldCh4cnVz Yiwgc2V0LCBjbGVhcik7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB4 cnVzYiAqeHJ1c2IsCisJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqaW5mbykKK3sKKwlz dHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisKKwlpZiAoIWluZm8pCisJCXJldHVybiAtRUlOVkFM OworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVvZih0bXApKTsKKwl0bXAudHlwZSA9IHhydXNiLT51 YXJ0X3R5cGU7CisJdG1wLmZsYWdzID0gQVNZTkNfTE9XX0xBVEVOQ1k7CisJdG1wLnhtaXRfZmlm b19zaXplID0geHJ1c2ItPndyaXRlc2l6ZTsKKwl0bXAuYmF1ZF9iYXNlID0gbGUzMl90b19jcHUo eHJ1c2ItPmxpbmUuZHdEVEVSYXRlKTsKKwl0bXAuY2xvc2VfZGVsYXkJPSB4cnVzYi0+cG9ydC5j bG9zZV9kZWxheSAvIDEwOworCXRtcC5jbG9zaW5nX3dhaXQgPSB4cnVzYi0+cG9ydC5jbG9zaW5n X3dhaXQgPT0KKwkJQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUgPyBBU1lOQ19DTE9TSU5HX1dBSVRf Tk9ORSA6CisJCXhydXNiLT5wb3J0LmNsb3Npbmdfd2FpdCAvIDEwOworCisJaWYgKGNvcHlfdG9f dXNlcihpbmZvLCAmdG1wLCBzaXplb2YodG1wKSkpCisJCXJldHVybiAtRUZBVUxUOworCWVsc2UK KwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB4cnVz YiAqeHJ1c2IsCisJCXN0cnVjdCBzZXJpYWxfc3RydWN0IF9fdXNlciAqbmV3aW5mbykKK3sKKwlz dHJ1Y3Qgc2VyaWFsX3N0cnVjdCBuZXdfc2VyaWFsOworCXVuc2lnbmVkIGludCBjbG9zaW5nX3dh aXQsIGNsb3NlX2RlbGF5OworCWludCBydiA9IDA7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJm5l d19zZXJpYWwsIG5ld2luZm8sIHNpemVvZihuZXdfc2VyaWFsKSkpCisJCXJldHVybiAtRUZBVUxU OworCisJY2xvc2VfZGVsYXkgPSBuZXdfc2VyaWFsLmNsb3NlX2RlbGF5ICogMTA7CisJY2xvc2lu Z193YWl0ID0gbmV3X3NlcmlhbC5jbG9zaW5nX3dhaXQgPT0gQVNZTkNfQ0xPU0lOR19XQUlUX05P TkUgPworCQkJQVNZTkNfQ0xPU0lOR19XQUlUX05PTkUgOiBuZXdfc2VyaWFsLmNsb3Npbmdfd2Fp dCAqIDEwOworCisJbXV0ZXhfbG9jaygmeHJ1c2ItPnBvcnQubXV0ZXgpOworCisJaWYgKCFjYXBh YmxlKENBUF9TWVNfQURNSU4pKSB7CisJCWlmICgoY2xvc2VfZGVsYXkgIT0geHJ1c2ItPnBvcnQu Y2xvc2VfZGVsYXkpIHx8CisJCSAgICAoY2xvc2luZ193YWl0ICE9IHhydXNiLT5wb3J0LmNsb3Np bmdfd2FpdCkpIHsKKwkJCXJ2ID0gLUVQRVJNOworCQl9IGVsc2UgeworCQkJcnYgPSAtRU9QTk9U U1VQUDsKKwkJfQorCX0gZWxzZSB7CisJCXhydXNiLT5wb3J0LmNsb3NlX2RlbGF5ICA9IGNsb3Nl X2RlbGF5OworCQl4cnVzYi0+cG9ydC5jbG9zaW5nX3dhaXQgPSBjbG9zaW5nX3dhaXQ7CisJfQor CXhydXNiLT51YXJ0X3R5cGUgPSBuZXdfc2VyaWFsLnR5cGU7CisJbXV0ZXhfdW5sb2NrKCZ4cnVz Yi0+cG9ydC5tdXRleCk7CisJcmV0dXJuIHJ2OworfQorCisvKiBFbmFibGUgb3IgZGlzYWJsZSB0 aGUgcnM0ODUgc3VwcG9ydCAqLwordm9pZCB4cl9jb25maWdfcnM0ODUoc3RydWN0IHhydXNiICp4 cnVzYiwgc3RydWN0IHNlcmlhbF9yczQ4NSAqcnM0ODVjb25mKQoreworCWludCBydjsKKwlzaG9y dCByZWdfdmFsdWU7CisKKwl4cnVzYi0+cnM0ODUgPSAqcnM0ODVjb25mOworCXJ2ID0geHJ1c2Jf Z2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX21vZGUsICZyZWdfdmFsdWUp OworCisJaWYgKHJzNDg1Y29uZi0+ZmxhZ3MgJiBTRVJfUlM0ODVfRU5BQkxFRCkgeworCQlpZiAo KHJzNDg1Y29uZi0+ZGVsYXlfcnRzX2FmdGVyX3NlbmQpIDwgMHhmKSB7CisJCQlydiA9IHhydXNi X3NldF9yZWcoeHJ1c2IsCisJCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9yczQ4NV9kZWxheSwKKwkJ CQlyczQ4NWNvbmYtPmRlbGF5X3J0c19hZnRlcl9zZW5kKTsKKwkJfSBlbHNlIHsKKwkJCXJ2ID0g eHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCQl4cnVzYi0+cmVnX21hcC51YXJ0X3JzNDg1X2RlbGF5 LAorCQkJCTB4Zik7IC8vIG1heCB2YWx1ZSBpcyAweGYKKwkJfQorCisJCWlmIChyczQ4NWNvbmYt PmZsYWdzICYgU0VSX1JTNDg1X1JUU19PTl9TRU5EKSB7CisJCS8qIFNldCBsb2dpY2FsIGxldmVs IGZvciBSVFMgcGluIGVxdWFsIHRvIDEgd2hlbiBzZW5kaW5nOiAqLworCQkJcmVnX3ZhbHVlICY9 IDB4ZmZmMDsKKwkJCXJlZ192YWx1ZSB8PSAweGI7CisJCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1 c2IsCisJCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX21vZGUsCisJCQkJcmVnX3ZhbHVlKTsK KwkJfSBlbHNlIHsKKwkJLypzZXQgbG9naWNhbCBsZXZlbCBmb3IgUlRTIHBpbiBlcXVhbCB0byAw IHdoZW4gc2VuZGluZzogKi8KKwkJCXJlZ192YWx1ZSAmPSAweGZmZjA7CisJCQlyZWdfdmFsdWUg fD0gMHgzOworCQkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJCXhydXNiLT5yZWdfbWFw LnVhcnRfZ3Bpb19tb2RlLAorCQkJCXJlZ192YWx1ZSk7CisJCX0KKworCX0gZWxzZSB7CisJCS8q IFJTLTQ4NS80MjIgUlRTIGRpcmVjdGlvbiBjb250cm9sIG91dHB1dCBkaXNhYmxlZCAqLworCQly diA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9k ZSwKKwkJCXJlZ192YWx1ZSAmIDB4ZmZmMCk7CisJfQorCit9CisKK3N0YXRpYyBpbnQgeHJ1c2Jf dHR5X2lvY3RsKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHVuc2lnbmVkIGludCBjbWQsCisJCXVu c2lnbmVkIGxvbmcgYXJnKQoreworCXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB0dHktPmRyaXZlcl9k YXRhOworCWludCBydiA9IC1FTk9JT0NUTENNRDsKKwlzdHJ1Y3Qgc2VyaWFsX3JzNDg1IHJzNDg1 Y29uZjsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBUSU9DR1NFUklBTDogLyogZ2V0cyBzZXJp YWwgcG9ydCBkYXRhICovCisJCXJ2ID0gZ2V0X3NlcmlhbF9pbmZvKHhydXNiLAorCQkJKHN0cnVj dCBzZXJpYWxfc3RydWN0IF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKwljYXNlIFRJT0NTU0VS SUFMOgorCQlydiA9IHNldF9zZXJpYWxfaW5mbyh4cnVzYiwKKwkJCShzdHJ1Y3Qgc2VyaWFsX3N0 cnVjdCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1JTNDg1OgorCQlpZiAo Y29weV9mcm9tX3VzZXIoJnJzNDg1Y29uZiwgKHN0cnVjdCBzZXJpYWxfcnM0ODUgKikgYXJnLAor CQkJCQlzaXplb2YocnM0ODVjb25mKSkpIHsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXhy X2NvbmZpZ19yczQ4NSh4cnVzYiwgJnJzNDg1Y29uZik7CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJ Y2FzZSBUSU9DR1JTNDg1OgorCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3Qgc2VyaWFsX3JzNDg1 ICopIGFyZywgJih4cnVzYi0+cnM0ODUpLAorCQkJCQlzaXplb2YocnM0ODVjb25mKSkpIHsKKwkJ CXJldHVybiAtRUZBVUxUOworCQl9CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJfQorCXJldHVybiBy djsKK30KKworc3RhdGljIHZvaWQgeHJ1c2JfdHR5X3NldF90ZXJtaW9zKHN0cnVjdCB0dHlfc3Ry dWN0ICp0dHksCisJCXN0cnVjdCBrdGVybWlvcyAqdGVybWlvc19vbGQpCit7CisJc3RydWN0IHhy dXNiICp4cnVzYiA9IHR0eS0+ZHJpdmVyX2RhdGE7CisJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9z ID0gJnR0eS0+dGVybWlvczsKKwl1bnNpZ25lZCBpbnQgICBjZmxhZyA9IHRlcm1pb3MtPmNfY2Zs YWc7CisJc3RydWN0IHVzYl9jZGNfbGluZV9jb2RpbmcgbmV3bGluZTsKKwlpbnQgbmV3Y3RybCA9 IHhydXNiLT5jdHJsb3V0OworCisJeHJ1c2JfZGlzYWJsZSh4cnVzYik7CisJbmV3bGluZS5kd0RU RVJhdGUgPSBjcHVfdG9fbGUzMih0dHlfZ2V0X2JhdWRfcmF0ZSh0dHkpKTsKKwluZXdsaW5lLmJD aGFyRm9ybWF0ID0gdGVybWlvcy0+Y19jZmxhZyAmIENTVE9QQiA/IDEgOiAwOworCW5ld2xpbmUu YlBhcml0eVR5cGUgPSB0ZXJtaW9zLT5jX2NmbGFnICYgUEFSRU5CID8KKwkJCQkodGVybWlvcy0+ Y19jZmxhZyAmIFBBUk9ERCA/IDEgOiAyKSArCisJCQkJKHRlcm1pb3MtPmNfY2ZsYWcgJiBDTVNQ QVIgPyAyIDogMCkgOiAwOworCXhydXNiLT53aWRlX21vZGUgPSAwOworCXN3aXRjaCAodGVybWlv cy0+Y19jZmxhZyAmIENTSVpFKSB7CisJY2FzZSBDUzU6Lyp1c2luZyBDUzUgcmVwbGFjZSBvZiB0 aGUgOSBiaXQgZGF0YSBtb2RlKi8KKwkJbmV3bGluZS5iRGF0YUJpdHMgPSA5OworCQl4cnVzYi0+ d2lkZV9tb2RlID0gMTsKKwkJYnJlYWs7CisJY2FzZSBDUzY6CisJCW5ld2xpbmUuYkRhdGFCaXRz ID0gNjsKKwkJYnJlYWs7CisJY2FzZSBDUzc6CisJCW5ld2xpbmUuYkRhdGFCaXRzID0gNzsKKwkJ YnJlYWs7CisJY2FzZSBDUzg6CisJZGVmYXVsdDoKKwkJbmV3bGluZS5iRGF0YUJpdHMgPSA4Owor CQlicmVhazsKKwl9CisJLyogRklYTUU6IE5lZWRzIHRvIGNsZWFyIHVuc3VwcG9ydGVkIGJpdHMg aW4gdGhlIHRlcm1pb3MgKi8KKwl4cnVzYi0+Y2xvY2FsID0gKCh0ZXJtaW9zLT5jX2NmbGFnICYg Q0xPQ0FMKSAhPSAwKTsKKworCWlmICghbmV3bGluZS5kd0RURVJhdGUpIHsKKwkJbmV3bGluZS5k d0RURVJhdGUgPSB4cnVzYi0+bGluZS5kd0RURVJhdGU7CisJCW5ld2N0cmwgJj0gflhSVVNCX0NU UkxfRFRSOworCX0gZWxzZSB7CisJCW5ld2N0cmwgfD0gIFhSVVNCX0NUUkxfRFRSOworCX0KKwor CWlmIChuZXdjdHJsICE9IHhydXNiLT5jdHJsb3V0KQorCQl4cnVzYl9zZXRfY29udHJvbCh4cnVz YiwgeHJ1c2ItPmN0cmxvdXQgPSBuZXdjdHJsKTsKKworCXhydXNiX3NldF9mbG93X21vZGUoeHJ1 c2IsIHR0eSwgY2ZsYWcpOworCisJaWYgKHhydXNiLT53aWRlX21vZGUpCisJCXhydXNiX3NldF93 aWRlX21vZGUoeHJ1c2IsIDEpOworCWVsc2UgaWYgKCF4cnVzYi0+d2lkZV9tb2RlKQorCQl4cnVz Yl9zZXRfd2lkZV9tb2RlKHhydXNiLCAwKTsKKworCWlmIChtZW1jbXAoJnhydXNiLT5saW5lLCAm bmV3bGluZSwgc2l6ZW9mKG5ld2xpbmUpKSkgeworCQltZW1jcHkoJnhydXNiLT5saW5lLCAmbmV3 bGluZSwgc2l6ZW9mKG5ld2xpbmUpKTsKKwkJeHJ1c2Jfc2V0X2xpbmUoeHJ1c2IsICZ4cnVzYi0+ bGluZSk7CisJfQorCXhydXNiX2VuYWJsZSh4cnVzYik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgdHR5X3BvcnRfb3BlcmF0aW9ucyB4cnVzYl9wb3J0X29wcyA9IHsKKwkuc2h1dGRvd24gPSB4 cnVzYl9wb3J0X3NodXRkb3duLAorCS5hY3RpdmF0ZSA9IHhydXNiX3BvcnRfYWN0aXZhdGUsCisJ LmRlc3RydWN0ID0geHJ1c2JfcG9ydF9kZXN0cnVjdCwKK307CisKKy8qCisgKiBVU0IgcHJvYmUg YW5kIGRpc2Nvbm5lY3Qgcm91dGluZXMuCisgKi8KKworLyogTGl0dGxlIGhlbHBlcnM6IHdyaXRl L3JlYWQgYnVmZmVycyBmcmVlICovCitzdGF0aWMgdm9pZCB4cnVzYl93cml0ZV9idWZmZXJzX2Zy ZWUoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgeHJ1c2Jfd2IgKndi OworCisJZm9yICh3YiA9ICZ4cnVzYi0+d2JbMF0sIGkgPSAwOyBpIDwgWFJVU0JfTlc7IGkrKywg d2IrKykKKwkJdXNiX2ZyZWVfY29oZXJlbnQoeHJ1c2ItPmRldiwKKwkJCXhydXNiLT53cml0ZXNp emUsIHdiLT5idWYsIHdiLT5kbWFoKTsKK30KKworc3RhdGljIHZvaWQgeHJ1c2JfcmVhZF9idWZm ZXJzX2ZyZWUoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7 IGkgPCB4cnVzYi0+cnhfYnVmbGltaXQ7IGkrKykKKwkJdXNiX2ZyZWVfY29oZXJlbnQoeHJ1c2It PmRldiwgeHJ1c2ItPnJlYWRzaXplLAorCQkJICB4cnVzYi0+cmVhZF9idWZmZXJzW2ldLmJhc2Us CisJCQkgIHhydXNiLT5yZWFkX2J1ZmZlcnNbaV0uZG1hKTsKK30KKworLyogTGl0dGxlIGhlbHBl cjogd3JpdGUgYnVmZmVycyBhbGxvY2F0ZSAqLworc3RhdGljIGludCB4cnVzYl93cml0ZV9idWZm ZXJzX2FsbG9jKHN0cnVjdCB4cnVzYiAqeHJ1c2IpCit7CisJaW50IGk7CisJc3RydWN0IHhydXNi X3diICp3YjsKKworCWZvciAod2IgPSAmeHJ1c2ItPndiWzBdLCBpID0gMDsgaSA8IFhSVVNCX05X OyBpKyssIHdiKyspIHsKKwkJd2ItPmJ1ZiA9IHVzYl9hbGxvY19jb2hlcmVudCh4cnVzYi0+ZGV2 LAorCQkJeHJ1c2ItPndyaXRlc2l6ZSwgR0ZQX0tFUk5FTCwKKwkJCSZ3Yi0+ZG1haCk7CisJCWlm ICghd2ItPmJ1ZikgeworCQkJd2hpbGUgKGkgIT0gMCkgeworCQkJCS0taTsKKwkJCQktLXdiOwor CQkJCXVzYl9mcmVlX2NvaGVyZW50KHhydXNiLT5kZXYsCisJCQkJCXhydXNiLT53cml0ZXNpemUs CisJCQkJCXdiLT5idWYsIHdiLT5kbWFoKTsKKwkJCX0KKwkJCXJldHVybiAtRU5PTUVNOworCQl9 CisJfQorCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0dQSU9MSUIKK3N0YXRpYyBpbnQg eHJ1c2JfZ3Bpb19nZXQoc3RydWN0IGdwaW9fY2hpcCAqY2hpcCwgdW5zaWduZWQgaW50IG9mZnNl dCkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gY29udGFpbmVyX29mKGNoaXAsIHN0cnVjdCB4 cnVzYiwgeHJfZ3Bpbyk7CisJaW50IHJ2OworCXNob3J0IGdwaW9fc3RhdHVzOworCisJcnYgPSB4 cnVzYl9nZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fc3RhdHVzLAorCQkJ CSZncGlvX3N0YXR1cyk7CisJaWYgKGdwaW9fc3RhdHVzJigxIDw8IG9mZnNldCkpCisJCXJldHVy biAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhydXNiX2dwaW9fc2V0 KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQsIGludCB2YWwpCit7 CisJc3RydWN0IHhydXNiICp4cnVzYiA9IGNvbnRhaW5lcl9vZihjaGlwLCBzdHJ1Y3QgeHJ1c2Is IHhyX2dwaW8pOworCWludCBydiwgdG1wOworCisJdG1wID0gMSA8PCBvZmZzZXQ7CisJaWYgKHZh bCkKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9f c2V0LCB0bXApOworCWVsc2UKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVn X21hcC51YXJ0X2dwaW9fY2xyLCB0bXApOworfQorCitzdGF0aWMgaW50IHhydXNiX2dwaW9fZGly X2lucHV0KHN0cnVjdCBncGlvX2NoaXAgKmNoaXAsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJ aW50IHJ2OworCXNob3J0ICBkaXJfdmFsdWU7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IGNvbnRh aW5lcl9vZihjaGlwLCBzdHJ1Y3QgeHJ1c2IsIHhyX2dwaW8pOworCisJcnYgPSB4cnVzYl9nZXRf cmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fZGlyLCAmZGlyX3ZhbHVlKTsKKwlk aXJfdmFsdWUgJj0gfigxIDw8IG9mZnNldCk7CisJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4 cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fZGlyLCAoaW50KWRpcl92YWx1ZSk7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgeHJ1c2JfZ3Bpb19kaXJfb3V0cHV0KHN0cnVjdCBncGlvX2NoaXAg KmNoaXAsCisJCQkJCQl1bnNpZ25lZCBpbnQgb2Zmc2V0LCBpbnQgdmFsKQoreworCWludCBydjsK KwlzaG9ydCB0bXA7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IGNvbnRhaW5lcl9vZihjaGlwLCBz dHJ1Y3QgeHJ1c2IsIHhyX2dwaW8pOworCisJcnYgPSB4cnVzYl9nZXRfcmVnKHhydXNiLCB4cnVz Yi0+cmVnX21hcC51YXJ0X2dwaW9fZGlyLCAmdG1wKTsKKwl0bXAgfD0gKDEgPDwgb2Zmc2V0KTsK KwlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19kaXIs IChpbnQpdG1wKTsKKworCWlmIChvZmZzZXQgPiA3KSB7CisJCXJ2ID0geHJ1c2JfZ2V0X3JlZyh4 cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX21vZGUsICZ0bXApOworCQl0bXAgJj0gfigx IDw8IG9mZnNldCk7CisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAu dWFydF9ncGlvX21vZGUsCisJCQkJCQkoaW50KXRtcCk7CisJfQorCXJldHVybiAwOworfQorI2Vu ZGlmCisKK3N0YXRpYyBpbnQgeHJ1c2JfcHJvYmUoc3RydWN0IHVzYl9pbnRlcmZhY2UgKmludGYs CisJCSAgICAgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkKQoreworCXN0cnVjdCB1c2Jf Y2RjX3VuaW9uX2Rlc2MgKnVuaW9uX2hlYWRlciA9IE5VTEw7CisJdW5zaWduZWQgY2hhciAqYnVm ZmVyID0gaW50Zi0+YWx0c2V0dGluZy0+ZXh0cmE7CisJaW50IGJ1ZmxlbiA9IGludGYtPmFsdHNl dHRpbmctPmV4dHJhbGVuOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpjb250cm9sX2ludGVyZmFj ZTsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqZGF0YV9pbnRlcmZhY2U7CisJc3RydWN0IHVzYl9l bmRwb2ludF9kZXNjcmlwdG9yICplcGN0cmwgPSBOVUxMOworCXN0cnVjdCB1c2JfZW5kcG9pbnRf ZGVzY3JpcHRvciAqZXByZWFkID0gTlVMTDsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0 b3IgKmVwd3JpdGUgPSBOVUxMOworCXN0cnVjdCB1c2JfZGV2aWNlICp1c2JfZGV2ID0gaW50ZXJm YWNlX3RvX3VzYmRldihpbnRmKTsKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiOworCWludCBtaW5vcjsK KwlpbnQgY3RybHNpemUsIHJlYWRzaXplOworCXU4ICpidWY7CisJdTggYWNfbWFuYWdlbWVudF9m dW5jdGlvbiA9IDA7CisJdTggY2FsbF9tYW5hZ2VtZW50X2Z1bmN0aW9uID0gMDsKKwlpbnQgY2Fs bF9pbnRlcmZhY2VfbnVtID0gLTE7CisJaW50IGRhdGFfaW50ZXJmYWNlX251bSA9IC0xOworCXVu c2lnbmVkIGxvbmcgcXVpcmtzOworCWludCBudW1fcnhfYnVmOworCWludCBpOworCWludCBjb21i aW5lZF9pbnRlcmZhY2VzID0gMDsKKwlzdHJ1Y3QgZGV2aWNlICp0dHlfZGV2OworCWludCBydiA9 IC1FTk9NRU07CisjaWZkZWYgQ09ORklHX0dQSU9MSUIKKwlpbnQgZ3Bpb2NoaXBfYmFzZTsKKyNl bmRpZgorCisJLyogbm9ybWFsIHF1aXJrcyAqLworCXF1aXJrcyA9ICh1bnNpZ25lZCBsb25nKWlk LT5kcml2ZXJfaW5mbzsKKworCWlmIChxdWlya3MgPT0gSUdOT1JFX0RFVklDRSkKKwkJcmV0dXJu IC1FTk9ERVY7CisKKwludW1fcnhfYnVmID0gKHF1aXJrcyA9PSBTSU5HTEVfUlhfVVJCKSA/IDEg OiBYUlVTQl9OUjsKKworCS8qIGhhbmRsZSBxdWlya3MgZGVhZGx5IHRvIG5vcm1hbCBwcm9iaW5n Ki8KKwlpZiAocXVpcmtzID09IE5PX1VOSU9OX05PUk1BTCkgeworCQlkYXRhX2ludGVyZmFjZSA9 IHVzYl9pZm51bV90b19pZih1c2JfZGV2LCAxKTsKKwkJY29udHJvbF9pbnRlcmZhY2UgPSB1c2Jf aWZudW1fdG9faWYodXNiX2RldiwgMCk7CisJfQorCisJLyogbm9ybWFsIHByb2JpbmcqLworCWlm ICghYnVmZmVyKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIldlaXJkIGRlc2NyaXB0b3IgcmVm ZXJlbmNlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmICghYnVmbGVuKSB7CisJ CWlmIChpbnRmLT5jdXJfYWx0c2V0dGluZy0+ZW5kcG9pbnQgJiYKKwkJCQlpbnRmLT5jdXJfYWx0 c2V0dGluZy0+ZW5kcG9pbnQtPmV4dHJhbGVuICYmCisJCQkJaW50Zi0+Y3VyX2FsdHNldHRpbmct PmVuZHBvaW50LT5leHRyYSkgeworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LAorCQkJCSJTZWVraW5n IGV4dHJhIGRlc2NyaXB0b3JzIG9uIGVuZHBvaW50XG4iKTsKKwkJCWJ1ZmxlbiA9IGludGYtPmN1 cl9hbHRzZXR0aW5nLT5lbmRwb2ludC0+ZXh0cmFsZW47CisJCQlidWZmZXIgPSBpbnRmLT5jdXJf YWx0c2V0dGluZy0+ZW5kcG9pbnQtPmV4dHJhOworCQl9IGVsc2UgeworCQkJZGV2X2VycigmaW50 Zi0+ZGV2LAorCQkJCSJaZXJvIGxlbmd0aCBkZXNjcmlwdG9yIHJlZmVyZW5jZXNcbiIpOworCQkJ cmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwl3aGlsZSAoYnVmbGVuID4gMCkgeworCQlpZiAo YnVmZmVyWzFdICE9IFVTQl9EVF9DU19JTlRFUkZBQ0UpIHsKKwkJCWRldl9lcnIoJmludGYtPmRl diwgInNraXBwaW5nIGdhcmJhZ2VcbiIpOworCQkJZ290byBuZXh0X2Rlc2M7CisJCX0KKworCQlz d2l0Y2ggKGJ1ZmZlclsyXSkgeworCQljYXNlIFVTQl9DRENfVU5JT05fVFlQRTogLyogd2UndmUg Zm91bmQgaXQgKi8KKwkJCWlmICh1bmlvbl9oZWFkZXIpIHsKKwkJCQlkZXZfZXJyKCZpbnRmLT5k ZXYsICI+IDEgIHVuaW9uIGRlc2NyaXB0b3IiKTsKKwkJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJz a2lwcGluZyAuLi5cbiIpOworCQkJCWdvdG8gbmV4dF9kZXNjOworCQkJfQorCQkJdW5pb25faGVh ZGVyID0gKHN0cnVjdCB1c2JfY2RjX3VuaW9uX2Rlc2MgKilidWZmZXI7CisJCQlicmVhazsKKwkJ Y2FzZSBVU0JfQ0RDX0hFQURFUl9UWVBFOiAvKiBtYXliZSBjaGVjayB2ZXJzaW9uICovCisJCQli cmVhazsgLyogZm9yIG5vdyB3ZSBpZ25vcmUgaXQgKi8KKwkJY2FzZSBVU0JfQ0RDX0FDTV9UWVBF OgorCQkJYWNfbWFuYWdlbWVudF9mdW5jdGlvbiA9IGJ1ZmZlclszXTsKKwkJCWJyZWFrOworCQlj YXNlIFVTQl9DRENfQ0FMTF9NQU5BR0VNRU5UX1RZUEU6CisJCQljYWxsX21hbmFnZW1lbnRfZnVu Y3Rpb24gPSBidWZmZXJbM107CisJCQljYWxsX2ludGVyZmFjZV9udW0gPSBidWZmZXJbNF07CisJ CQkvL2lmICgocXVpcmtzICYgTk9UX0FfTU9ERU0pID09IDAgJiYKKwkJCS8vCShjYWxsX21hbmFn ZW1lbnRfZnVuY3Rpb24gJiAzKSAhPSAzKQorCQkJLy8JZGV2X2VycigmaW50Zi0+ZGV2LCAiVGhp cyBkZXZpY2UgY2Fubm90CisJCQkvLwkJZG8gY2FsbHMgb24gaXRzIG93bi4gSXQgaXMKKwkJCS8v CQlub3QgYSBtb2RlbS5cbiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiB0aGVyZSBh cmUgTE9UUyBtb3JlIENEQyBkZXNjcmlwdG9ycyB0aGF0CisJCQkgKiBjb3VsZCBsZWdpdGltYXRl bHkgYmUgZm91bmQgaGVyZS4KKwkJCSAqLworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiSWdub3Jp bmcgZGVzY3JpcHRvcjogIik7CisJCQlkZXZfZGJnKCZpbnRmLT5kZXYsICJ0eXBlICUwMngsIGxl bmd0aCAlZFxuIiwKKwkJCQlidWZmZXJbMl0sIGJ1ZmZlclswXSk7CisJCQlicmVhazsKKwkJfQor bmV4dF9kZXNjOgorCQlidWZsZW4gLT0gYnVmZmVyWzBdOworCQlidWZmZXIgKz0gYnVmZmVyWzBd OworCX0KKworCWNvbnRyb2xfaW50ZXJmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHVzYl9kZXYsCisJ CXVuaW9uX2hlYWRlci0+Yk1hc3RlckludGVyZmFjZTApOworCWRhdGFfaW50ZXJmYWNlID0gdXNi X2lmbnVtX3RvX2lmKHVzYl9kZXYsCisJCShkYXRhX2ludGVyZmFjZV9udW0gPSB1bmlvbl9oZWFk ZXItPmJTbGF2ZUludGVyZmFjZTApKTsKKworCWlmIChkYXRhX2ludGVyZmFjZS0+Y3VyX2FsdHNl dHRpbmctPmRlc2MuYk51bUVuZHBvaW50cyA8IDIgfHwKKwkgICAgY29udHJvbF9pbnRlcmZhY2Ut PmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJOdW1FbmRwb2ludHMgPT0gMCkgeworCQlyZXR1cm4gLUVJ TlZBTDsKKwl9CisKKwllcGN0cmwgPSAmY29udHJvbF9pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5n LT5lbmRwb2ludFswXS5kZXNjOworCWVwcmVhZCA9ICZkYXRhX2ludGVyZmFjZS0+Y3VyX2FsdHNl dHRpbmctPmVuZHBvaW50WzBdLmRlc2M7CisJZXB3cml0ZSA9ICZkYXRhX2ludGVyZmFjZS0+Y3Vy X2FsdHNldHRpbmctPmVuZHBvaW50WzFdLmRlc2M7CisKKworCS8qIHdvcmthcm91bmQgZm9yIHN3 aXRjaGVkIGVuZHBvaW50cyAqLworCWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlcHJlYWQpKSB7 CisJCS8qIGRlc2NyaXB0b3JzIGFyZSBzd2FwcGVkICovCisJCXN0cnVjdCB1c2JfZW5kcG9pbnRf ZGVzY3JpcHRvciAqdDsKKworCQl0ID0gZXByZWFkOworCQllcHJlYWQgPSBlcHdyaXRlOworCQll cHdyaXRlID0gdDsKKwl9CisKKwl4cnVzYiA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCB4cnVzYiks IEdGUF9LRVJORUwpOworCWlmICh4cnVzYiA9PSBOVUxMKQorCQlnb3RvIGFsbG9jX2ZhaWw7CisK KwltaW5vciA9IHhydXNiX2FsbG9jX21pbm9yKHhydXNiKTsKKwlpZiAobWlub3IgPT0gWFJVU0Jf VFRZX01JTk9SUykgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJubyBtb3JlIGZyZWUgeHJ1c2Ig ZGV2aWNlc1xuIik7CisJCWtmcmVlKHhydXNiKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJ Y3RybHNpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChlcGN0cmwpOworCXJlYWRzaXplID0gdXNiX2Vu ZHBvaW50X21heHAoZXByZWFkKSAqCisJCQkJKHF1aXJrcyA9PSBTSU5HTEVfUlhfVVJCID8gMSA6 IDIpOworCXhydXNiLT5jb21iaW5lZF9pbnRlcmZhY2VzID0gY29tYmluZWRfaW50ZXJmYWNlczsK Kwl4cnVzYi0+d3JpdGVzaXplID0gdXNiX2VuZHBvaW50X21heHAoZXB3cml0ZSkgKiAyMDsKKwl4 cnVzYi0+Y29udHJvbCA9IGNvbnRyb2xfaW50ZXJmYWNlOworCXhydXNiLT5kYXRhID0gZGF0YV9p bnRlcmZhY2U7CisJeHJ1c2ItPm1pbm9yID0gbWlub3I7CisJeHJ1c2ItPmRldiA9IHVzYl9kZXY7 CisJeHJ1c2ItPmN0cmxfY2FwcyA9IGFjX21hbmFnZW1lbnRfZnVuY3Rpb247CisJaWYgKHF1aXJr cyAmIE5PX0NBUF9MSU5FKQorCQl4cnVzYi0+Y3RybF9jYXBzICY9IH5VU0JfQ0RDX0NBUF9MSU5F OworCXhydXNiLT5jdHJsc2l6ZSA9IGN0cmxzaXplOworCXhydXNiLT5yZWFkc2l6ZSA9IHJlYWRz aXplOworCXhydXNiLT5yeF9idWZsaW1pdCA9IG51bV9yeF9idWY7CisJSU5JVF9XT1JLKCZ4cnVz Yi0+d29yaywgeHJ1c2Jfc29mdGludCk7CisJc3Bpbl9sb2NrX2luaXQoJnhydXNiLT53cml0ZV9s b2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmeHJ1c2ItPnJlYWRfbG9jayk7CisJbXV0ZXhfaW5pdCgm eHJ1c2ItPm11dGV4KTsKKwl4cnVzYi0+cnhfZW5kcG9pbnQgPSB1c2JfcmN2YnVsa3BpcGUodXNi X2RldiwgZXByZWFkLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwl4cnVzYi0+aXNfaW50X2VwID0gdXNi X2VuZHBvaW50X3hmZXJfaW50KGVwcmVhZCk7CisJaWYgKHhydXNiLT5pc19pbnRfZXApCisJCXhy dXNiLT5iSW50ZXJ2YWwgPSBlcHJlYWQtPmJJbnRlcnZhbDsKKwl0dHlfcG9ydF9pbml0KCZ4cnVz Yi0+cG9ydCk7CisJeHJ1c2ItPnBvcnQub3BzID0gJnhydXNiX3BvcnRfb3BzOworCXhydXNiLT5E ZXZpY2VWZW5kb3IgPSBpZC0+aWRWZW5kb3I7CisJeHJ1c2ItPkRldmljZVByb2R1Y3QgPSBpZC0+ aWRQcm9kdWN0OworCXhydXNiLT51YXJ0X3R5cGUgPSA0OyAvKiNkZWZpbmUgUE9SVF8xNjU1MEEJ NCovCisJeHJ1c2ItPmNoYW5uZWwgPSBlcHdyaXRlLT5iRW5kcG9pbnRBZGRyZXNzOworCisJYnVm ID0gdXNiX2FsbG9jX2NvaGVyZW50KHVzYl9kZXYsIGN0cmxzaXplLCBHRlBfS0VSTkVMLAorCQkm eHJ1c2ItPmN0cmxfZG1hKTsKKwlpZiAoIWJ1ZikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJv dXQgb2YgbWVtb3J5IChjdHJsIGJ1ZmZlciBhbGxvYylcbiIpOworCQlnb3RvIGFsbG9jX2ZhaWwy OworCX0KKwl4cnVzYi0+Y3RybF9idWZmZXIgPSBidWY7CisKKwlpZiAoeHJ1c2Jfd3JpdGVfYnVm ZmVyc19hbGxvYyh4cnVzYikgPCAwKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIm91dCBvZiBt ZW1vcnkgKHdyaXRlIGJ1ZmZlciBhbGxvYylcbiIpOworCQlnb3RvIGFsbG9jX2ZhaWw0OworCX0K KworCXhydXNiLT5jdHJsdXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwlpZiAo IXhydXNiLT5jdHJsdXJiKSB7CisJCWRldl9lcnIoJmludGYtPmRldiwgIm91dCBvZiBtZW1vcnkg KGN0cmx1cmIga21hbGxvYylcbiIpOworCQlnb3RvIGFsbG9jX2ZhaWw1OworCX0KKwlmb3IgKGkg PSAwOyBpIDwgbnVtX3J4X2J1ZjsgaSsrKSB7CisJCXN0cnVjdCB4cnVzYl9yYiAqcmIgPSAmKHhy dXNiLT5yZWFkX2J1ZmZlcnNbaV0pOworCQlzdHJ1Y3QgdXJiICp1cmI7CisKKwkJcmItPmJhc2Ug PSB1c2JfYWxsb2NfY29oZXJlbnQoeHJ1c2ItPmRldiwgcmVhZHNpemUsIEdGUF9LRVJORUwsCisJ CQkJCQkJCSZyYi0+ZG1hKTsKKwkJaWYgKCFyYi0+YmFzZSkgeworCQkJZGV2X2VycigmaW50Zi0+ ZGV2LCAib3V0IG9mIG1lbW9yeSAiKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwgIihyZWFkIGJ1 ZnMgdXNiX2FsbG9jX2NvaGVyZW50KVxuIik7CisJCQlnb3RvIGFsbG9jX2ZhaWw2OworCQl9CisJ CXJiLT5pbmRleCA9IGk7CisJCXJiLT5pbnN0YW5jZSA9IHhydXNiOworCisJCXVyYiA9IHVzYl9h bGxvY191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXJiKSB7CisJCQlkZXZfZXJyKCZpbnRm LT5kZXYsICJvdXQgb2YgbWVtb3J5ICIpOworCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAiKHJlYWQg YnVmcyB1c2JfYWxsb2NfdXJiKVxuIik7CisJCQlnb3RvIGFsbG9jX2ZhaWw2OworCQl9CisJCXVy Yi0+dHJhbnNmZXJfZmxhZ3MgfD0gVVJCX05PX1RSQU5TRkVSX0RNQV9NQVA7CisJCXVyYi0+dHJh bnNmZXJfZG1hID0gcmItPmRtYTsKKwkJaWYgKHhydXNiLT5pc19pbnRfZXApIHsKKwkJCXVzYl9m aWxsX2ludF91cmIodXJiLCB4cnVzYi0+ZGV2LAorCQkJCQkgeHJ1c2ItPnJ4X2VuZHBvaW50LAor CQkJCQkgcmItPmJhc2UsCisJCQkJCSB4cnVzYi0+cmVhZHNpemUsCisJCQkJCSB4cnVzYl9yZWFk X2J1bGtfY2FsbGJhY2ssIHJiLAorCQkJCQkgeHJ1c2ItPmJJbnRlcnZhbCk7CisJCX0gZWxzZSB7 CisJCQl1c2JfZmlsbF9idWxrX3VyYih1cmIsIHhydXNiLT5kZXYsCisJCQkJCSAgeHJ1c2ItPnJ4 X2VuZHBvaW50LAorCQkJCQkgIHJiLT5iYXNlLAorCQkJCQkgIHhydXNiLT5yZWFkc2l6ZSwKKwkJ CQkJICB4cnVzYl9yZWFkX2J1bGtfY2FsbGJhY2ssIHJiKTsKKwkJfQorCisJCXhydXNiLT5yZWFk X3VyYnNbaV0gPSB1cmI7CisJCV9fc2V0X2JpdChpLCAmeHJ1c2ItPnJlYWRfdXJic19mcmVlKTsK Kwl9CisJZm9yIChpID0gMDsgaSA8IFhSVVNCX05XOyBpKyspIHsKKwkJc3RydWN0IHhydXNiX3di ICpzbmQgPSAmKHhydXNiLT53YltpXSk7CisKKwkJc25kLT51cmIgPSB1c2JfYWxsb2NfdXJiKDAs IEdGUF9LRVJORUwpOworCQlpZiAoc25kLT51cmIgPT0gTlVMTCkgeworCQkJZGV2X2VycigmaW50 Zi0+ZGV2LCAib3V0IG9mIG1lbW9yeSAiKTsKKwkJCWRldl9lcnIoJmludGYtPmRldiwgIih3cml0 ZSB1cmJzIHVzYl9hbGxvY191cmIpXG4iKTsKKwkJCWdvdG8gYWxsb2NfZmFpbDc7CisJCX0KKwor CQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaW50KGVwd3JpdGUpKSB7CisJCQl1c2JfZmlsbF9pbnRf dXJiKHNuZC0+dXJiLAorCQkJCXVzYl9kZXYsCisJCQkJdXNiX3NuZGludHBpcGUodXNiX2RldiwK KwkJCQkJZXB3cml0ZS0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkJTlVMTCwKKwkJCQl4cnVzYi0+ d3JpdGVzaXplLAorCQkJCXhydXNiX3dyaXRlX2J1bGssCisJCQkJc25kLAorCQkJCWVwd3JpdGUt PmJJbnRlcnZhbCk7CisJCX0gZWxzZSB7CisJCQl1c2JfZmlsbF9idWxrX3VyYihzbmQtPnVyYiwK KwkJCQl1c2JfZGV2LAorCQkJCXVzYl9zbmRidWxrcGlwZSh1c2JfZGV2LAorCQkJCQllcHdyaXRl LT5iRW5kcG9pbnRBZGRyZXNzKSwKKwkJCQlOVUxMLAorCQkJCXhydXNiLT53cml0ZXNpemUsCisJ CQkJeHJ1c2Jfd3JpdGVfYnVsaywKKwkJCQlzbmQpOworCQl9CisJCXNuZC0+dXJiLT50cmFuc2Zl cl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJc25kLT5pbnN0YW5jZSA9IHhy dXNiOworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgeHJ1c2IpOworCisJaSA9IGRldmlj ZV9jcmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfYm1DYXBhYmlsaXRpZXMpOworCWlm IChpIDwgMCkKKwkJZ290byBhbGxvY19mYWlsNzsKKworCXVzYl9maWxsX2ludF91cmIoeHJ1c2It PmN0cmx1cmIsIHVzYl9kZXYsCisJCQkgdXNiX3JjdmludHBpcGUodXNiX2RldiwgZXBjdHJsLT5i RW5kcG9pbnRBZGRyZXNzKSwKKwkJCSB4cnVzYi0+Y3RybF9idWZmZXIsIGN0cmxzaXplLCB4cnVz Yl9jdHJsX2lycSwgeHJ1c2IsCisJCQkgLyogd29ya3MgYXJvdW5kIGJ1Z2d5IGRldmljZXMgKi8K KwkJCSBlcGN0cmwtPmJJbnRlcnZhbCA/IGVwY3RybC0+YkludGVydmFsIDogMHhmZik7CisJeHJ1 c2ItPmN0cmx1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOwor CXhydXNiLT5jdHJsdXJiLT50cmFuc2Zlcl9kbWEgPSB4cnVzYi0+Y3RybF9kbWE7CisKKwl4cnVz Yl9yZWdfaW5pdCh4cnVzYik7CisJeHJ1c2Jfc2V0X2NvbnRyb2woeHJ1c2IsIHhydXNiLT5jdHJs b3V0KTsKKworCXhydXNiLT5saW5lLmR3RFRFUmF0ZSA9IGNwdV90b19sZTMyKDk2MDApOworCXhy dXNiLT5saW5lLmJEYXRhQml0cyA9IDg7CisJeHJ1c2Jfc2V0X2xpbmUoeHJ1c2IsICZ4cnVzYi0+ bGluZSk7CisKKwl1c2JfZHJpdmVyX2NsYWltX2ludGVyZmFjZSgmeHJ1c2JfZHJpdmVyLCBkYXRh X2ludGVyZmFjZSwgeHJ1c2IpOworCXVzYl9zZXRfaW50ZmRhdGEoZGF0YV9pbnRlcmZhY2UsIHhy dXNiKTsKKworCXVzYl9nZXRfaW50Zihjb250cm9sX2ludGVyZmFjZSk7CisKKwl0dHlfZGV2ID0g dHR5X3BvcnRfcmVnaXN0ZXJfZGV2aWNlKCZ4cnVzYi0+cG9ydCwKKwkJeHJ1c2JfdHR5X2RyaXZl ciwgbWlub3IsICZjb250cm9sX2ludGVyZmFjZS0+ZGV2KTsKKworCWlmIChJU19FUlIodHR5X2Rl dikpIHsKKwkJcnYgPSBQVFJfRVJSKHR0eV9kZXYpOworCQlnb3RvIGFsbG9jX2ZhaWw4OworCX0K KyNpZmRlZiBDT05GSUdfR1BJT0xJQgorCS8qIFNldHVwIEdQSU8gY290cm9sbGVyICovCisJZ3Bp b2NoaXBfYmFzZSA9IHhydXNiLT5kZXYtPnBvcnRudW0qMTAwICsgeHJ1c2ItPmNoYW5uZWwqMTA7 CisJaWYgKGdwaW9jaGlwX2Jhc2UgPiA1MDIpIHsKKwkJLy8gYmFzZSBtdXN0IGJlIDUwMiBvciBs ZXNzCisJCWdwaW9jaGlwX2Jhc2UgPSAwOworCX0KKworCXhydXNiLT54cl9ncGlvLm93bmVyCQk9 IFRISVNfTU9EVUxFOworCXhydXNiLT54cl9ncGlvLmxhYmVsCQk9IGRldl9uYW1lKCZjb250cm9s X2ludGVyZmFjZS0+ZGV2KTsKKwl4cnVzYi0+eHJfZ3Bpby5kaXJlY3Rpb25faW5wdXQJPSB4cnVz Yl9ncGlvX2Rpcl9pbnB1dDsKKwl4cnVzYi0+eHJfZ3Bpby5nZXQJCQk9IHhydXNiX2dwaW9fZ2V0 OworCXhydXNiLT54cl9ncGlvLmRpcmVjdGlvbl9vdXRwdXQJPSB4cnVzYl9ncGlvX2Rpcl9vdXRw dXQ7CisJeHJ1c2ItPnhyX2dwaW8uc2V0CQkJPSB4cnVzYl9ncGlvX3NldDsKKwl4cnVzYi0+eHJf Z3Bpby5iYXNlCQkJPSBncGlvY2hpcF9iYXNlOworCXhydXNiLT54cl9ncGlvLm5ncGlvCQk9IDEw OworCXhydXNiLT54cl9ncGlvLmNhbl9zbGVlcAk9IDE7CisKKwlydiA9IGdwaW9jaGlwX2FkZCgm eHJ1c2ItPnhyX2dwaW8pOworCisJaWYgKHJ2ICE9IDApIHsKKwkJLy8gZ3Bpb2NoaXAgbnVtYmVy cyBub3QgYXZhaWxhYmxlLCBzdGFydCBmcm9tIDAKKwkJeHJ1c2ItPnhyX2dwaW8uYmFzZSA9IDA7 CisJfQorCisJd2hpbGUgKHJ2ICE9IDApIHsKKwkJeHJ1c2ItPnhyX2dwaW8uYmFzZSArPSAxMDsK KworCQlpZiAoeHJ1c2ItPnhyX2dwaW8uYmFzZSA+IDUwMikgeworCQkvLyBtYXggZ3BpbyBudW1i ZXIgPSA1MTIKKwkJLy8gd2UgcmFuIG91dCBvZiBncGlvcz8/CisJCQlicmVhazsKKwkJfQorCQly diA9IGdwaW9jaGlwX2FkZCgmeHJ1c2ItPnhyX2dwaW8pOworCX0KKwl4cnVzYi0+cnZfZ3Bpb19j cmVhdGVkID0gcnY7CisJaWYgKHJ2ID09IDApIHsKKwkJZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wt PmRldiwgImdwaW9jaGlwJWQgYWRkZWQiLAorCQkJeHJ1c2ItPnhyX2dwaW8uYmFzZSk7CisJfSBl bHNlIHsKKwkJZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRldiwgImZhaWxlZCB0byBhZGQgZ3Bp b2NoaXBcbiIpOworCX0KKworI2VuZGlmCisKKwlyZXR1cm4gMDsKKworYWxsb2NfZmFpbDg6CisJ ZGV2aWNlX3JlbW92ZV9maWxlKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAmZGV2X2F0dHJfYm1DYXBh YmlsaXRpZXMpOworYWxsb2NfZmFpbDc6CisJdXNiX3NldF9pbnRmZGF0YShpbnRmLCBOVUxMKTsK Kwlmb3IgKGkgPSAwOyBpIDwgWFJVU0JfTlc7IGkrKykKKwkJdXNiX2ZyZWVfdXJiKHhydXNiLT53 YltpXS51cmIpOworYWxsb2NfZmFpbDY6CisJZm9yIChpID0gMDsgaSA8IG51bV9yeF9idWY7IGkr KykKKwkJdXNiX2ZyZWVfdXJiKHhydXNiLT5yZWFkX3VyYnNbaV0pOworCXhydXNiX3JlYWRfYnVm ZmVyc19mcmVlKHhydXNiKTsKKwl1c2JfZnJlZV91cmIoeHJ1c2ItPmN0cmx1cmIpOworYWxsb2Nf ZmFpbDU6CisJeHJ1c2Jfd3JpdGVfYnVmZmVyc19mcmVlKHhydXNiKTsKK2FsbG9jX2ZhaWw0Ogor CXVzYl9mcmVlX2NvaGVyZW50KHVzYl9kZXYsIGN0cmxzaXplLAorCQl4cnVzYi0+Y3RybF9idWZm ZXIsIHhydXNiLT5jdHJsX2RtYSk7CithbGxvY19mYWlsMjoKKwl4cnVzYl9yZWxlYXNlX21pbm9y KHhydXNiKTsKKwlrZnJlZSh4cnVzYik7CithbGxvY19mYWlsOgorCXJldHVybiBydjsKK30KKwor c3RhdGljIHZvaWQgc3RvcF9kYXRhX3RyYWZmaWMoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlp bnQgaTsKKworCS8vZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNf Xyk7CisKKwl1c2Jfa2lsbF91cmIoeHJ1c2ItPmN0cmx1cmIpOworCWZvciAoaSA9IDA7IGkgPCBY UlVTQl9OVzsgaSsrKQorCQl1c2Jfa2lsbF91cmIoeHJ1c2ItPndiW2ldLnVyYik7CisJZm9yIChp ID0gMDsgaSA8IHhydXNiLT5yeF9idWZsaW1pdDsgaSsrKQorCQl1c2Jfa2lsbF91cmIoeHJ1c2It PnJlYWRfdXJic1tpXSk7CisKKwljYW5jZWxfd29ya19zeW5jKCZ4cnVzYi0+d29yayk7Cit9Citz dGF0aWMgdm9pZCB4cnVzYl9kaXNjb25uZWN0KHN0cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmKQor eworCXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB1c2JfZ2V0X2ludGZkYXRhKGludGYpOworCXN0cnVj dCB0dHlfc3RydWN0ICp0dHk7CisJLyogc2libGluZyBpbnRlcmZhY2UgaXMgYWxyZWFkeSBjbGVh bmluZyB1cCAqLworCWlmICgheHJ1c2IpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnhydXNi LT5tdXRleCk7CisJeHJ1c2ItPmRpc2Nvbm5lY3RlZCA9IHRydWU7CisKKwlkZXZpY2VfcmVtb3Zl X2ZpbGUoJnhydXNiLT5jb250cm9sLT5kZXYsCisJCSZkZXZfYXR0cl9ibUNhcGFiaWxpdGllcyk7 CisJdXNiX3NldF9pbnRmZGF0YSh4cnVzYi0+Y29udHJvbCwgTlVMTCk7CisJdXNiX3NldF9pbnRm ZGF0YSh4cnVzYi0+ZGF0YSwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZ4cnVzYi0+bXV0ZXgpOwor CisJdHR5ID0gdHR5X3BvcnRfdHR5X2dldCgmeHJ1c2ItPnBvcnQpOworCWlmICh0dHkpIHsKKwkJ dHR5X3ZoYW5ndXAodHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CisJfQorCisJc3RvcF9kYXRh X3RyYWZmaWMoeHJ1c2IpOworCisJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKHhydXNiX3R0eV9kcml2 ZXIsIHhydXNiLT5taW5vcik7CisKKwl4cnVzYl93cml0ZV9idWZmZXJzX2ZyZWUoeHJ1c2IpOwor CXVzYl9mcmVlX2NvaGVyZW50KHhydXNiLT5kZXYsIHhydXNiLT5jdHJsc2l6ZSwKKwkJeHJ1c2It PmN0cmxfYnVmZmVyLCB4cnVzYi0+Y3RybF9kbWEpOworCXhydXNiX3JlYWRfYnVmZmVyc19mcmVl KHhydXNiKTsKKworCWlmICgheHJ1c2ItPmNvbWJpbmVkX2ludGVyZmFjZXMpIHsKKwkJdXNiX2Ry aXZlcl9yZWxlYXNlX2ludGVyZmFjZSgmeHJ1c2JfZHJpdmVyLAorCQkJaW50ZiA9PSB4cnVzYi0+ Y29udHJvbCA/CisJCQl4cnVzYi0+ZGF0YSA6IHhydXNiLT5jb250cm9sKTsKKwl9CisKKwl0dHlf cG9ydF9wdXQoJnhydXNiLT5wb3J0KTsKK30KKyNpZmRlZiBDT05GSUdfUE0KK3N0YXRpYyBpbnQg eHJ1c2Jfc3VzcGVuZChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZiwgcG1fbWVzc2FnZV90IG1l c3NhZ2UpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHVzYl9nZXRfaW50ZmRhdGEoaW50Zik7 CisJaW50IGNudDsKKwl1bnNpZ25lZCBzaG9ydCBkaXJfdG1wLCBtb2RlX3RtcCwgc3RhdGVfdG1w OworCWludCBydjsKKworCWlmIChQTVNHX0lTX0FVVE8obWVzc2FnZSkpIHsKKwkJaW50IGI7CisK KwkJc3Bpbl9sb2NrX2lycSgmeHJ1c2ItPndyaXRlX2xvY2spOworCQliID0geHJ1c2ItPnRyYW5z bWl0dGluZzsKKwkJc3Bpbl91bmxvY2tfaXJxKCZ4cnVzYi0+d3JpdGVfbG9jayk7CisJCWlmIChi KQorCQkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZ4cnVzYi0+cmVhZF9s b2NrKTsKKwlzcGluX2xvY2soJnhydXNiLT53cml0ZV9sb2NrKTsKKworCS8vU2F2ZSB0aGUgcmVn aXN0ZXIgdmFsdWVzIGJlZm9yZSBzdXNwZW5kCisJcnYgPSB4cnVzYl9nZXRfcmVnKHhydXNiLCB4 cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fZGlyLCAmZGlyX3RtcCk7CisJeHJ1c2ItPmdwaW9fZGly X3NhdmVkID0gZGlyX3RtcDsKKwlydiA9IHhydXNiX2dldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdf bWFwLnVhcnRfZ3Bpb19zdGF0dXMsICZzdGF0ZV90bXApOworCXhydXNiLT5ncGlvX3N0YXRlX3Nh dmVkID0gc3RhdGVfdG1wOworCXJ2ID0geHJ1c2JfZ2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19t YXAudWFydF9ncGlvX21vZGUsICZtb2RlX3RtcCk7CisJeHJ1c2ItPmdwaW9fbW9kZV9zYXZlZCA9 IG1vZGVfdG1wOworCWNudCA9IHhydXNiLT5zdXNwX2NvdW50Kys7CisJc3Bpbl91bmxvY2soJnhy dXNiLT53cml0ZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnhydXNiLT5yZWFkX2xvY2spOwor CisJaWYgKGNudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGVzdF9iaXQoQVNZTkNCX0lOSVRJQUxJ WkVELCAmeHJ1c2ItPnBvcnQuZmxhZ3MpKQorCQlzdG9wX2RhdGFfdHJhZmZpYyh4cnVzYik7CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4cnVzYl9yZXN1bWUoc3RydWN0IHVzYl9pbnRl cmZhY2UgKmludGYpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHVzYl9nZXRfaW50ZmRhdGEo aW50Zik7CisJc3RydWN0IHhydXNiX3diICp3YjsKKwlpbnQgcnYgPSAwOworCWludCBjbnQ7CisJ dW5zaWduZWQgc2hvcnQgZ3Bpb19zdGF0ZSwgZ3Bpb19kaXIsIGdwaW9fbW9kZTsKKworCXhydXNi X3JlZ19pbml0KHhydXNiKTsKKworCXNwaW5fbG9ja19pcnEoJnhydXNiLT5yZWFkX2xvY2spOwor CXhydXNiLT5zdXNwX2NvdW50IC09IDE7CisJY250ID0geHJ1c2ItPnN1c3BfY291bnQ7CisJc3Bp bl91bmxvY2tfaXJxKCZ4cnVzYi0+cmVhZF9sb2NrKTsKKworCWlmIChjbnQpCisJCXJldHVybiAw OworCisJaWYgKHRlc3RfYml0KEFTWU5DQl9JTklUSUFMSVpFRCwgJnhydXNiLT5wb3J0LmZsYWdz KSkgeworCQlydiA9IHVzYl9zdWJtaXRfdXJiKHhydXNiLT5jdHJsdXJiLCBHRlBfTk9JTyk7CisK KwkJc3Bpbl9sb2NrX2lycSgmeHJ1c2ItPndyaXRlX2xvY2spOworCQlpZiAoeHJ1c2ItPmRlbGF5 ZWRfd2IpIHsKKwkJCXdiID0geHJ1c2ItPmRlbGF5ZWRfd2I7CisJCQl4cnVzYi0+ZGVsYXllZF93 YiA9IE5VTEw7CisJCQlzcGluX3VubG9ja19pcnEoJnhydXNiLT53cml0ZV9sb2NrKTsKKwkJCXhy dXNiX3N0YXJ0X3diKHhydXNiLCB3Yik7CisJCX0gZWxzZSB7CisJCQlzcGluX3VubG9ja19pcnEo JnhydXNiLT53cml0ZV9sb2NrKTsKKwkJfQorCisJCS8qCisJCSAqIGRlbGF5ZWQgZXJyb3IgY2hl Y2tpbmcgYmVjYXVzZSB3ZSBtdXN0CisJCSAqIGRvIHRoZSB3cml0ZSBwYXRoIGF0IGFsbCBjb3N0 CisJCSAqLworCQlpZiAocnYgPCAwKQorCQkJZ290byBlcnJfb3V0OworCisKKwkJcnYgPSB4cnVz Yl9zdWJtaXRfcmVhZF91cmJzKHhydXNiLCBHRlBfTk9JTyk7CisJfQorCWdwaW9fZGlyID0geHJ1 c2ItPmdwaW9fZGlyX3NhdmVkOworCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJl Z19tYXAudWFydF9ncGlvX2RpciwgZ3Bpb19kaXIpOworCisJZ3Bpb19tb2RlID0geHJ1c2ItPmdw aW9fbW9kZV9zYXZlZDsKKwlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFw LnVhcnRfZ3Bpb19tb2RlLCBncGlvX21vZGUpOworCisJZ3Bpb19zdGF0ZSA9IHhydXNiLT5ncGlv X3N0YXRlX3NhdmVkOworCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAu dWFydF9ncGlvX3NldCwgZ3Bpb19zdGF0ZSk7CisJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4 cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fY2xyLCB+Z3Bpb19zdGF0ZSk7CitlcnJfb3V0OgorCXJl dHVybiBydjsKK30KKworc3RhdGljIGludCB4cnVzYl9yZXNldF9yZXN1bWUoc3RydWN0IHVzYl9p bnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHVzYl9nZXRfaW50ZmRh dGEoaW50Zik7CisKKwlpZiAodGVzdF9iaXQoQVNZTkNCX0lOSVRJQUxJWkVELCAmeHJ1c2ItPnBv cnQuZmxhZ3MpKQorCQl0dHlfcG9ydF90dHlfaGFuZ3VwKCZ4cnVzYi0+cG9ydCwgZmFsc2UpOwor CXJldHVybiB4cnVzYl9yZXN1bWUoaW50Zik7Cit9CisKKyNlbmRpZiAvKiBDT05GSUdfUE0gKi8K KworLyoKKyAqIFVTQiBkcml2ZXIgc3RydWN0dXJlLgorICovCitzdGF0aWMgY29uc3Qgc3RydWN0 IHVzYl9kZXZpY2VfaWQgeHJ1c2JfaWRzW10gPSB7CisJeyBVU0JfREVWSUNFKDB4MDRlMiwgMHgx NDEwKX0sCisJeyBVU0JfREVWSUNFKDB4MDRlMiwgMHgxNDExKX0sCisJeyBVU0JfREVWSUNFKDB4 MDRlMiwgMHgxNDEyKX0sCisJeyBVU0JfREVWSUNFKDB4MDRlMiwgMHgxNDE0KX0sCisJeyBVU0Jf REVWSUNFKDB4MDRlMiwgMHgxNDIwKX0sCisJeyBVU0JfREVWSUNFKDB4MDRlMiwgMHgxNDIyKX0s CisJeyBVU0JfREVWSUNFKDB4MDRlMiwgMHgxNDI0KX0sCisJeyBVU0JfREVWSUNFKDB4MDRlMiwg MHgxNDAwKX0sIC8vIFhSMjI4MHggY2ggQQorCXsgVVNCX0RFVklDRSgweDA0ZTIsIDB4MTQwMSl9 LCAvLyBYUjIyODB4IGNoIEIKKwl7IFVTQl9ERVZJQ0UoMHgwNGUyLCAweDE0MDIpfSwgLy8gWFIy MjgweCBjaCBDCisJeyBVU0JfREVWSUNFKDB4MDRlMiwgMHgxNDAzKX0sIC8vIFhSMjI4MHggY2gg RAorCXsgfQorfTsKKworTU9EVUxFX0RFVklDRV9UQUJMRSh1c2IsIHhydXNiX2lkcyk7CisKK3N0 YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB4cnVzYl9kcml2ZXIgPSB7CisJLm5hbWUgPQkJCQkieHJ1 c2Jfc2VyaWFsIiwKKwkucHJvYmUgPQkJCXhydXNiX3Byb2JlLAorCS5kaXNjb25uZWN0ID0JCXhy dXNiX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3BlbmQgPQkJCXhydXNiX3N1 c3BlbmQsCisJLnJlc3VtZSA9CQkJeHJ1c2JfcmVzdW1lLAorCS5yZXNldF9yZXN1bWUgPQkJeHJ1 c2JfcmVzZXRfcmVzdW1lLAorI2VuZGlmCisJLmlkX3RhYmxlID0JCQl4cnVzYl9pZHMsCisjaWZk ZWYgQ09ORklHX1BNCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKKyNlbmRpZgorCS5kaXNh YmxlX2h1Yl9pbml0aWF0ZWRfbHBtID0gMSwKK307CisKKy8qCisgKiBUVFkgZHJpdmVyIHN0cnVj dHVyZXMuCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0aW9ucyB4cnVzYl9v cHMgPSB7CisJLmluc3RhbGwgPQkJCXhydXNiX3R0eV9pbnN0YWxsLAorCS5vcGVuID0JCQkJeHJ1 c2JfdHR5X29wZW4sCisJLmNsb3NlID0JCQl4cnVzYl90dHlfY2xvc2UsCisJLmNsZWFudXAgPQkJ CXhydXNiX3R0eV9jbGVhbnVwLAorCS5oYW5ndXAgPQkJCXhydXNiX3R0eV9oYW5ndXAsCisJLndy aXRlID0JCQl4cnVzYl90dHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPQkJeHJ1c2JfdHR5X3dyaXRl X3Jvb20sCisJLmlvY3RsID0JCQl4cnVzYl90dHlfaW9jdGwsCisJLnRocm90dGxlID0JCQl4cnVz Yl90dHlfdGhyb3R0bGUsCisJLnVudGhyb3R0bGUgPQkJeHJ1c2JfdHR5X3VudGhyb3R0bGUsCisJ LmNoYXJzX2luX2J1ZmZlciA9CXhydXNiX3R0eV9jaGFyc19pbl9idWZmZXIsCisJLmJyZWFrX2N0 bCA9CQl4cnVzYl90dHlfYnJlYWtfY3RsLAorCS5zZXRfdGVybWlvcyA9CQl4cnVzYl90dHlfc2V0 X3Rlcm1pb3MsCisJLnRpb2NtZ2V0ID0JCQl4cnVzYl90dHlfdGlvY21nZXQsCisJLnRpb2Ntc2V0 ID0JCQl4cnVzYl90dHlfdGlvY21zZXQsCit9OworCisvKgorICogSW5pdCAvIGV4aXQuCisgKi8K Kworc3RhdGljIGludCBfX2luaXQgeHJ1c2JfaW5pdCh2b2lkKQoreworCWludCBydjsKKworCXhy dXNiX3R0eV9kcml2ZXIgPSBhbGxvY190dHlfZHJpdmVyKFhSVVNCX1RUWV9NSU5PUlMpOworCWlm ICgheHJ1c2JfdHR5X2RyaXZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl4cnVzYl90dHlfZHJp dmVyLT5kcml2ZXJfbmFtZSA9ICJ4cnVzYiIsCisJeHJ1c2JfdHR5X2RyaXZlci0+bmFtZSA9ICJ0 dHlYUlVTQiIsCisJeHJ1c2JfdHR5X2RyaXZlci0+bWFqb3IgPSBYUlVTQl9UVFlfTUFKT1IsCisJ eHJ1c2JfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwLAorCXhydXNiX3R0eV9kcml2ZXItPnR5 cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMLAorCXhydXNiX3R0eV9kcml2ZXItPnN1YnR5cGUg PSBTRVJJQUxfVFlQRV9OT1JNQUwsCisJeHJ1c2JfdHR5X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJ VkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVjsKKwl4cnVzYl90dHlfZHJpdmVy LT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJeHJ1c2JfdHR5X2RyaXZlci0+aW5p dF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8CisJCUNSRUFEIHwgSFVQQ0wgfCBDTE9D QUw7CisJdHR5X3NldF9vcGVyYXRpb25zKHhydXNiX3R0eV9kcml2ZXIsICZ4cnVzYl9vcHMpOwor CisJcnYgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHhydXNiX3R0eV9kcml2ZXIpOworCWlmIChydikg eworCQlwdXRfdHR5X2RyaXZlcih4cnVzYl90dHlfZHJpdmVyKTsKKwkJcmV0dXJuIHJ2OworCX0K KworCXJ2ID0gdXNiX3JlZ2lzdGVyKCZ4cnVzYl9kcml2ZXIpOworCWlmIChydikgeworCQl0dHlf dW5yZWdpc3Rlcl9kcml2ZXIoeHJ1c2JfdHR5X2RyaXZlcik7CisJCXB1dF90dHlfZHJpdmVyKHhy dXNiX3R0eV9kcml2ZXIpOworCQlyZXR1cm4gcnY7CisJfQorCisJLy9wcmludGsoS0VSTl9JTkZP IEtCVUlMRF9NT0ROQU1FICI6ICIgRFJJVkVSX0RFU0MgIlxuIik7CisJcHJfaW5mbyhLQlVJTERf TU9ETkFNRSAiOiAiIERSSVZFUl9ERVNDICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyB2b2lkIF9fZXhpdCB4cnVzYl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIoJnhydXNi X2RyaXZlcik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHhydXNiX3R0eV9kcml2ZXIpOworCXB1 dF90dHlfZHJpdmVyKHhydXNiX3R0eV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh4cnVzYl9p bml0KTsKK21vZHVsZV9leGl0KHhydXNiX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERSSVZFUl9B VVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9MSUNFTlNF KCJHUEwiKTsKK01PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKFhSVVNCX1RUWV9NQUpPUik7CmRp ZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmggYi9kcml2ZXJzL3Vz Yi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi43Yjc0M2QzZGE2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9zZXJp YWwveHJ1c2Jfc2VyaWFsLmgKQEAgLTAsMCArMSwyMzQgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVu dGlmaWVyOiBHUEwtMi4wICovCisvKgorICogSW5jbHVkZXMgZm9yIHhydXNiX3NlcmlhbC5jCisg Ki8KKworLyoKKyAqIENNU1BBUiwgc29tZSBhcmNoaXRlY3R1cmVzIGNhbid0IGhhdmUgc3BhY2Ug YW5kIG1hcmsgcGFyaXR5LgorICovCisKKyNpZm5kZWYgQ01TUEFSCisjZGVmaW5lIENNU1BBUgkJ MAorI2VuZGlmCisKKy8qCisgKiBNYWpvciBhbmQgbWlub3IgbnVtYmVycy4KKyAqLworCisjZGVm aW5lIFhSVVNCX1RUWV9NQUpPUgkJMjY2CisjZGVmaW5lIFhSVVNCX1RUWV9NSU5PUlMJMjU2CisK Ky8qCisgKiBSZXF1ZXN0cy4KKyAqLworCisjZGVmaW5lIFVTQl9SVF9YUlVTQgkJKFVTQl9UWVBF X0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSkKKworLyoKKyAqIE91dHB1dCBjb250cm9sIGxp bmVzLgorICovCisKKyNkZWZpbmUgWFJVU0JfQ1RSTF9EVFIJCTB4MDEKKyNkZWZpbmUgWFJVU0Jf Q1RSTF9SVFMJCTB4MDIKKworLyoKKyAqIElucHV0IGNvbnRyb2wgbGluZXMgYW5kIGxpbmUgZXJy b3JzLgorICovCisKKyNkZWZpbmUgWFJVU0JfQ1RSTF9EQ0QJCTB4MDEKKyNkZWZpbmUgWFJVU0Jf Q1RSTF9EU1IJCTB4MDIKKyNkZWZpbmUgWFJVU0JfQ1RSTF9CUksJCTB4MDQKKyNkZWZpbmUgWFJV U0JfQ1RSTF9SSQkJMHgwOAorCisjZGVmaW5lIFhSVVNCX0NUUkxfRlJBTUlORwkweDEwCisjZGVm aW5lIFhSVVNCX0NUUkxfUEFSSVRZCTB4MjAKKyNkZWZpbmUgWFJVU0JfQ1RSTF9PVkVSUlVOCTB4 NDAKKworLyoKKyAqIEludGVybmFsIGRyaXZlciBzdHJ1Y3R1cmVzLgorICovCisKKy8qCisgKiBU aGUgb25seSByZWFzb24gdG8gaGF2ZSBzZXZlcmFsIGJ1ZmZlcnMgaXMgdG8gYWNjb21tb2RhdGUg YXNzdW1wdGlvbnMKKyAqIGluIGxpbmUgZGlzY2lwbGluZXMuIFRoZXkgYXNrIGZvciBlbXB0eSBz cGFjZSBhbW91bnQsIHJlY2VpdmUgb3VyIFVSQiBzaXplLAorICogYW5kIHByb2NlZWQgdG8gaXNz dWUgc2V2ZXJhbCAxLWNoYXJhY3RlciB3cml0ZXMsIGFzc3VtaW5nIHRoZXkgd2lsbCBmaXQuCisg KiBUaGUgdmVyeSBmaXJzdCB3cml0ZSB0YWtlcyBhIGNvbXBsZXRlIFVSQi4gRm9ydHVuYXRlbHks IHRoaXMgb25seSBoYXBwZW5zCisgKiB3aGVuIHByb2Nlc3Npbmcgb25sY3IsIHNvIHdlIG9ubHkg bmVlZCAyIGJ1ZmZlcnMuIFRoZXNlIHZhbHVlcyBtdXN0IGJlCisgKiBwb3dlcnMgb2YgMi4KKyAq LworCisjZGVmaW5lIFhSVVNCX05XICAxNgorI2RlZmluZSBYUlVTQl9OUiAgMTYKKworI2RlZmlu ZSBXSURFX01PREVfUEFSSVRZCTB4MQorI2RlZmluZSBXSURFX01PREVfQlJFQUsJCTB4MgorI2Rl ZmluZSBXSURFX01PREVfRlJBTUUJCTB4NAorI2RlZmluZSBXSURFX01PREVfT1ZFUlJVTgkweDgK Kworc3RydWN0IHhydXNiX3diIHsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJZG1hX2FkZHJfdCBk bWFoOworCWludCBsZW47CisJaW50IHVzZTsKKwlzdHJ1Y3QgdXJiCSp1cmI7CisJc3RydWN0IHhy dXNiCSppbnN0YW5jZTsKK307CisKK3N0cnVjdCB4cnVzYl9yYiB7CisJaW50CXNpemU7CisJdW5z aWduZWQgY2hhcgkqYmFzZTsKKwlkbWFfYWRkcl90CWRtYTsKKwlpbnQJaW5kZXg7CisJc3RydWN0 IHhydXNiCSppbnN0YW5jZTsKK307CisKK3N0cnVjdCByZWdfYWRkcl9tYXAgeworCXVuc2lnbmVk IGludCB1YXJ0X2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgdWFydF9mb3JtYXQ7CisJdW5zaWduZWQg aW50IHVhcnRfZmxvdzsKKwl1bnNpZ25lZCBpbnQgdWFydF94b25fY2hhcjsKKwl1bnNpZ25lZCBp bnQgdWFydF94b2ZmX2NoYXI7CisJdW5zaWduZWQgaW50IHVhcnRfdHhfYnJlYWs7CisJdW5zaWdu ZWQgaW50IHVhcnRfcnM0ODVfZGVsYXk7CisJdW5zaWduZWQgaW50IHVhcnRfZ3Bpb19tb2RlOwor CXVuc2lnbmVkIGludCB1YXJ0X2dwaW9fZGlyOworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9fc2V0 OworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9fY2xyOworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9f c3RhdHVzOworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9faW50X21hc2s7CisJdW5zaWduZWQgaW50 IHVhcnRfY3VzdG9taXplZF9pbnQ7CisJdW5zaWduZWQgaW50IHVhcnRfZ3Bpb19vcGVuX2RyYWlu OworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9fcHVsbF91cF9lbmFibGU7CisJdW5zaWduZWQgaW50 IHVhcnRfZ3Bpb19wdWxsX2Rvd25fZW5hYmxlOworCXVuc2lnbmVkIGludCB1YXJ0X2xvb3BiYWNr OworCXVuc2lnbmVkIGludCB1YXJ0X2xvd19sYXRlbmN5OworCXVuc2lnbmVkIGludCB1YXJ0X2N1 c3RvbV9kcml2ZXI7Cit9OworCitzdHJ1Y3QgeHJ1c2IgeworCXN0cnVjdCB1c2JfZGV2aWNlICpk ZXY7CQkJCS8qIHRoZSBjb3JyZXNwb25kaW5nIHVzYiBkZXZpY2UgKi8KKwlzdHJ1Y3QgdXNiX2lu dGVyZmFjZSAqY29udHJvbDsJCS8qIGNvbnRyb2wgaW50ZXJmYWNlICovCisJc3RydWN0IHVzYl9p bnRlcmZhY2UgKmRhdGE7CQkJLyogZGF0YSBpbnRlcmZhY2UgKi8KKwlzdHJ1Y3QgdHR5X3BvcnQg cG9ydDsJCQkJLyogb3VyIHR0eSBwb3J0IGRhdGEgKi8KKwlzdHJ1Y3QgdXJiICpjdHJsdXJiOwkJ CQkvKiB1cmJzICovCisJdTggKmN0cmxfYnVmZmVyOwkJCQkJLyogYnVmZmVycyBvZiB1cmJzICov CisJZG1hX2FkZHJfdCBjdHJsX2RtYTsJCQkJLyogZG1hIGhhbmRsZXMgb2YgYnVmZmVycyAqLwor CXN0cnVjdCB4cnVzYl93YiB3YltYUlVTQl9OV107CisJdW5zaWduZWQgbG9uZyByZWFkX3VyYnNf ZnJlZTsKKwlzdHJ1Y3QgdXJiICpyZWFkX3VyYnNbWFJVU0JfTlJdOworCXN0cnVjdCB4cnVzYl9y YiByZWFkX2J1ZmZlcnNbWFJVU0JfTlJdOworCXN0cnVjdCB4cnVzYl93YiAqcHV0YnVmZmVyOwor CWludCByeF9idWZsaW1pdDsKKwlpbnQgcnhfZW5kcG9pbnQ7CisJc3BpbmxvY2tfdCByZWFkX2xv Y2s7CisJaW50IHRyYW5zbWl0dGluZzsKKwlzcGlubG9ja190IHdyaXRlX2xvY2s7CisJc3RydWN0 IG11dGV4IG11dGV4OworCWJvb2wgZGlzY29ubmVjdGVkOworCXN0cnVjdCB1c2JfY2RjX2xpbmVf Y29kaW5nIGxpbmU7CS8qIGJpdHMsIHN0b3AsIHBhcml0eSAqLworCXN0cnVjdCB3b3JrX3N0cnVj dCB3b3JrOwkJCS8qIHdvcmsgcXVldWUgZW50cnkgZm9yIGxpbmUgZGlzY2lwbGluZSB3YWtpbmcg dXAgKi8KKwl1bnNpZ25lZCBpbnQgY3RybGluOwkJCQkvKiBpbnB1dCBjb250cm9sIGxpbmVzIChE Q0QsIERTUiwgUkksIGJyZWFrLCBvdmVycnVucykgKi8KKwl1bnNpZ25lZCBpbnQgY3RybG91dDsJ CQkJLyogb3V0cHV0IGNvbnRyb2wgbGluZXMgKERUUiwgUlRTKSAqLworCXVuc2lnbmVkIGludCB3 cml0ZXNpemU7CQkJCS8qIG1heCBwYWNrZXQgc2l6ZSBmb3IgdGhlIG91dHB1dCBidWxrIGVuZHBv aW50ICovCisJdW5zaWduZWQgaW50IHJlYWRzaXplLCBjdHJsc2l6ZTsJLyogYnVmZmVyIHNpemVz IGZvciBmcmVlaW5nICovCisJdW5zaWduZWQgaW50IG1pbm9yOwkJCQkJLyogeHJ1c2IgbWlub3Ig bnVtYmVyICovCisJdW5zaWduZWQgY2hhciBjbG9jYWw7CQkJCS8qIHRlcm1pb3MgQ0xPQ0FMICov CisJdW5zaWduZWQgaW50IGN0cmxfY2FwczsJCQkJLyogY29udHJvbCBjYXBhYmlsaXRpZXMgZnJv bSB0aGUgY2xhc3Mgc3BlY2lmaWMgaGVhZGVyICovCisJdW5zaWduZWQgaW50IHN1c3BfY291bnQ7 CQkJLyogbnVtYmVyIG9mIHN1c3BlbmRlZCBpbnRlcmZhY2VzICovCisJdW5zaWduZWQgaW50IGNv bWJpbmVkX2ludGVyZmFjZXM6MTsJLyogY29udHJvbCBhbmQgZGF0YSBjb2xsYXBzZWQgKi8KKwl1 bnNpZ25lZCBpbnQgaXNfaW50X2VwOjE7CQkJLyogaW50ZXJydXB0IGVuZHBvaW50cyBjb250cmFy eSB0byBzcGVjIHVzZWQgKi8KKwl1bnNpZ25lZCBpbnQgdGhyb3R0bGVkOjE7CQkJLyogYWN0dWFs bHkgdGhyb3R0bGVkICovCisJdW5zaWduZWQgaW50IHRocm90dGxlX3JlcToxOwkJLyogdGhyb3R0 bGUgcmVxdWVzdGVkICovCisJdTggYkludGVydmFsOworCisJc3RydWN0IHhydXNiX3diICpkZWxh eWVkX3diOwkJLyogd3JpdGUgcXVldWVkIGZvciBhIGRldmljZSBhYm91dCB0byBiZSB3b2tlbiAq LworCXVuc2lnbmVkIGludCBjaGFubmVsOworCWludCB3aWRlX21vZGU7CQkJCQkJLyogVVNCOiB3 aWRlIG1vZGUsIFRUWTogZmxhZ3MgcGVyIGNoYXJhY3RlciAqLworCWludCBoYXZlX2V4dHJhX2J5 dGU7CisJaW50IGV4dHJhX2J5dGU7CisJaW50IHVhcnRfdHlwZTsKKwl1bnNpZ25lZCBzaG9ydCBE ZXZpY2VWZW5kb3I7CisJdW5zaWduZWQgc2hvcnQgRGV2aWNlUHJvZHVjdDsKKwlzdHJ1Y3Qgc2Vy aWFsX3JzNDg1IHJzNDg1OwkJCS8qIHJzNDg1IHNldHRpbmdzICovCisJaW50IGZvdW5kX3NtYmlv c19jYXJhY2FsbGFfY29uZmlnOwkvKiBNb2RlcyBwcmUtcHJvZ3JhbW1lZCBpbiBCSU9TIGZvciBD YXJhY2FsbGEgYm9hcmQgKi8KKworCXN0cnVjdCByZWdfYWRkcl9tYXAgcmVnX21hcDsKKwkjaWZk ZWYgQ09ORklHX0dQSU9MSUIKKwlzdHJ1Y3QgZ3Bpb19jaGlwIHhyX2dwaW87CisJaW50IHJ2X2dw aW9fY3JlYXRlZDsKKwkjZW5kaWYKKwl1bnNpZ25lZCBzaG9ydCBncGlvX2Rpcl9zYXZlZDsKKwl1 bnNpZ25lZCBzaG9ydCBncGlvX3N0YXRlX3NhdmVkOworCXVuc2lnbmVkIHNob3J0IGdwaW9fbW9k ZV9zYXZlZDsKK307CisKKyNkZWZpbmUgQ0RDX0RBVEFfSU5URVJGQUNFX1RZUEUJMHgwYQorCisv KiBjb25zdGFudHMgZGVzY3JpYmluZyB2YXJpb3VzIHF1aXJrcyBhbmQgZXJyb3JzICovCisjZGVm aW5lIE5PX1VOSU9OX05PUk1BTAkJCTEKKyNkZWZpbmUgU0lOR0xFX1JYX1VSQgkJCTIKKyNkZWZp bmUgTk9fQ0FQX0xJTkUJCQkJNAorI2RlZmluZSBOT1RfQV9NT0RFTQkJCQk4CisjZGVmaW5lIE5P X0RBVEFfSU5URVJGQUNFCQkxNgorI2RlZmluZSBJR05PUkVfREVWSUNFCQkJMzIKKworLyogVVNC IFJlcXVlc3RzICovCisjZGVmaW5lIFhSVVNCX0dFVF9DSElQX0lECQkweEZGCisjZGVmaW5lIFhS VVNCX1NFVF9YUjIyODBYCQk1CisjZGVmaW5lIFhSVVNCX0dFVF9YUjIyODBYCQk1CisjZGVmaW5l IFhSVVNCX1NFVF9YUjIxQjE0MlgJCTAKKyNkZWZpbmUgWFJVU0JfR0VUX1hSMjFCMTQyWAkJMAor I2RlZmluZSBYUlVTQl9TRVRfWFIyMVYxNDFYCQkwCisjZGVmaW5lIFhSVVNCX0dFVF9YUjIxVjE0 MVgJCTEKKyNkZWZpbmUgWFJVU0JfU0VUX1hSMjFCMTQxMQkJMAorI2RlZmluZSBYUlVTQl9HRVRf WFIyMUIxNDExCQkxCisKKyNkZWZpbmUgWFIyMVYxNDFYX0NMT0NLX0RJVklTT1JfMAkweDAwNAor I2RlZmluZSBYUjIxVjE0MVhfQ0xPQ0tfRElWSVNPUl8xCTB4MDA1CisjZGVmaW5lIFhSMjFWMTQx WF9DTE9DS19ESVZJU09SXzIJMHgwMDYKKyNkZWZpbmUgWFIyMVYxNDFYX1RYX0NMT0NLX01BU0tf MAkweDAwNworI2RlZmluZSBYUjIxVjE0MVhfVFhfQ0xPQ0tfTUFTS18xCTB4MDA4CisjZGVmaW5l IFhSMjFWMTQxWF9SWF9DTE9DS19NQVNLXzAJMHgwMDkKKyNkZWZpbmUgWFIyMVYxNDFYX1JYX0NM T0NLX01BU0tfMQkweDAwYQorCisvKiBYUjIxVjE0MXggVUFSVCBNYW5hZ2VyIFJlZ2lzdGVycyAq LworI2RlZmluZSBYUjIxVjE0MXhfVVJNX1JFR19CTE9DSwkJNAorI2RlZmluZSBYUjIxVjE0MXhf VVJNX0ZJRk9fRU5BQkxFX1JFRwkweDEwCisjZGVmaW5lIFhSMjFWMTQxeF9VUk1fRU5BQkxFX1RY X0ZJRk8JMHgxCisjZGVmaW5lIFhSMjFWMTQxeF9VUk1fRU5BQkxFX1JYX0ZJRk8JMHgyCisKKyNk ZWZpbmUgWFIyMVYxNDF4X1VSTV9SWF9GSUZPX1JFU0VUCTB4MTgKKyNkZWZpbmUgWFIyMVYxNDF4 X1VSTV9UWF9GSUZPX1JFU0VUCTB4MUMKKworI2RlZmluZSBYUjIxVjE0MXhfVUFSVF9DVVNUT01f QkxPQ0sJMHg2NgorCisjZGVmaW5lIFVBUlRfRU5BQkxFX1RYCQkJMQorI2RlZmluZSBVQVJUX0VO QUJMRV9SWAkJCTIKKworI2RlZmluZSBVQVJUX0dQSU9fQ0xSX0RUUgkJMHg4CisjZGVmaW5lIFVB UlRfR1BJT19TRVRfRFRSCQkweDgKKyNkZWZpbmUgVUFSVF9HUElPX0NMUl9SVFMJCTB4MjAKKyNk ZWZpbmUgVUFSVF9HUElPX1NFVF9SVFMJCTB4MjAKKworI2RlZmluZSBMT09QQkFDS19FTkFCTEVf VFhfUlgJCTEKKyNkZWZpbmUgTE9PUEJBQ0tfRU5BQkxFX1JUU19DVFMJCTIKKyNkZWZpbmUgTE9P UEJBQ0tfRU5BQkxFX0RUUl9EU1IJCTQKKworI2RlZmluZSBVQVJUX0ZMT1dfTU9ERV9OT05FCQkw eDAKKyNkZWZpbmUgVUFSVF9GTE9XX01PREVfSFcJCTB4MQorI2RlZmluZSBVQVJUX0ZMT1dfTU9E RV9TVwkJMHgyCisKKyNkZWZpbmUgVUFSVF9HUElPX01PREVfU0VMX0dQSU8JCTB4MAorI2RlZmlu ZSBVQVJUX0dQSU9fTU9ERV9TRUxfUlRTX0NUUwkweDEKKworI2RlZmluZSBYUjIxVjE0MVhfV0lE RV9NT0RFX1JFRyAgICAgICAgIDMKKworI2RlZmluZSBYUjIxQjE0MTFfVUFSVF9FTkFCTEUJCTB4 QzAwCisjZGVmaW5lIFhSMjFCMTQxMV9XSURFX01PREVfUkVHCQkweEQwMgorCisjZGVmaW5lIFhS MjFCMTQyeF9VQVJUX0VOQUJMRQkJMHgwMAorI2RlZmluZSBYUjIxQjE0MlhfVFhfV0lERV9NT0RF X1JFRwkweDQyCisjZGVmaW5lIFhSMjFCMTQyWF9SWF9XSURFX01PREVfUkVHCTB4NDUKKyNkZWZp bmUgWFIyMjgwWF9UWF9XSURFX01PREVfUkVHCTB4NjIKKyNkZWZpbmUgWFIyMjgwWF9SWF9XSURF X01PREVfUkVHCTB4NjUKKyNkZWZpbmUgWFIyMjgweF9GVU5DX01HUl9PRkZTRVQJCTB4NDAK