From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vitaly Kuznetsov Subject: [PATCH v3 06/21] x86/xen: split off enlighten_pv.c Date: Tue, 14 Mar 2017 18:35:41 +0100 Message-ID: <20170314173556.2249-7-vkuznets@redhat.com> References: <20170314173556.2249-1-vkuznets@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cnqMn-000168-Gy for xen-devel@lists.xenproject.org; Tue, 14 Mar 2017 17:36:13 +0000 In-Reply-To: <20170314173556.2249-1-vkuznets@redhat.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: xen-devel@lists.xenproject.org Cc: Juergen Gross , Boris Ostrovsky , x86@kernel.org, Andrew Jones , linux-kernel@vger.kernel.org List-Id: xen-devel@lists.xenproject.org QmFzaWNhbGx5LCBlbmxpZ2h0ZW4uYyBpcyByZW5hbWVkIHRvIGVubGlnaHRlbl9wdi5jIGFuZCBz b21lIGNvZGUgbW92ZWQKb3V0IHRvIGNvbW1vbiBlbmxpZ2h0ZW4uYy4KClNpZ25lZC1vZmYtYnk6 IFZpdGFseSBLdXpuZXRzb3YgPHZrdXpuZXRzQHJlZGhhdC5jb20+ClJldmlld2VkLWJ5OiBKdWVy Z2VuIEdyb3NzIDxqZ3Jvc3NAc3VzZS5jb20+Ci0tLQpDaGFuZ2VzIHNpbmNlIHYyOgogICB4ZW5f cGluX3ZjcHUoKSBsZWZ0IGluIGVubGlnaHRlbi5jCi0tLQogYXJjaC94ODYveGVuL01ha2VmaWxl ICAgICAgIHwgICAgNCArLQogYXJjaC94ODYveGVuL2VubGlnaHRlbi5jICAgIHwgMTY0NyArKy0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBhcmNoL3g4Ni94ZW4vZW5s aWdodGVuX3B2LmMgfCAxNTEzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogMyBmaWxlcyBjaGFuZ2VkLCAxNTg3IGluc2VydGlvbnMoKyksIDE1NzcgZGVsZXRpb25zKC0p CiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC94ODYveGVuL2VubGlnaHRlbl9wdi5jCgpkaWZmIC0t Z2l0IGEvYXJjaC94ODYveGVuL01ha2VmaWxlIGIvYXJjaC94ODYveGVuL01ha2VmaWxlCmluZGV4 IDFiY2E3NWIuLjVjYThkM2ViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKKysr IGIvYXJjaC94ODYveGVuL01ha2VmaWxlCkBAIC03LDEzICs3LDEzIEBAIGVuZGlmCiAKICMgTWFr ZSBzdXJlIGVhcmx5IGJvb3QgaGFzIG5vIHN0YWNrcHJvdGVjdG9yCiBub3N0YWNrcCA6PSAkKGNh bGwgY2Mtb3B0aW9uLCAtZm5vLXN0YWNrLXByb3RlY3RvcikKLUNGTEFHU19lbmxpZ2h0ZW4ubwkJ Oj0gJChub3N0YWNrcCkKK0NGTEFHU19lbmxpZ2h0ZW5fcHYubwkJOj0gJChub3N0YWNrcCkKIENG TEFHU19tbXUubwkJCTo9ICQobm9zdGFja3ApCiAKIG9iai15CQk6PSBlbmxpZ2h0ZW4ubyBzZXR1 cC5vIG11bHRpY2FsbHMubyBtbXUubyBpcnEubyBcCiAJCQl0aW1lLm8geGVuLWFzbS5vIHhlbi1h c21fJChCSVRTKS5vIFwKIAkJCWdyYW50LXRhYmxlLm8gc3VzcGVuZC5vIHBsYXRmb3JtLXBjaS11 bnBsdWcubyBcCi0JCQlwMm0ubyBhcGljLm8gcG11Lm8KKwkJCXAybS5vIGFwaWMubyBwbXUubyBl bmxpZ2h0ZW5fcHYubwogCiBvYmotJChDT05GSUdfWEVOX1BWSFZNKQkJKz0gZW5saWdodGVuX2h2 bS5vCiBvYmotJChDT05GSUdfWEVOX1BWSCkJCQkrPSBlbmxpZ2h0ZW5fcHZoLm8KZGlmZiAtLWdp dCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpp bmRleCA2MDU0MzY0Li5jYjJjNTA2NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRl bi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtMSw5MiArMSwxNSBAQAotLyoK LSAqIENvcmUgb2YgWGVuIHBhcmF2aXJ0X29wcyBpbXBsZW1lbnRhdGlvbi4KLSAqCi0gKiBUaGlz IGZpbGUgY29udGFpbnMgdGhlIHhlbl9wYXJhdmlydF9vcHMgc3RydWN0dXJlIGl0c2VsZiwgYW5k IHRoZQotICogaW1wbGVtZW50YXRpb25zIGZvcjoKLSAqIC0gcHJpdmlsZWdlZCBpbnN0cnVjdGlv bnMKLSAqIC0gaW50ZXJydXB0IGZsYWdzCi0gKiAtIHNlZ21lbnQgb3BlcmF0aW9ucwotICogLSBi b290aW5nIGFuZCBzZXR1cAotICoKLSAqIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUB4ZW5z b3VyY2UuY29tPiwgWGVuU291cmNlIEluYywgMjAwNwotICovCi0KICNpbmNsdWRlIDxsaW51eC9j cHUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+ Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgotI2lu Y2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KLSNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KLSNpbmNs dWRlIDxsaW51eC9kZWxheS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0YXJ0X2tlcm5lbC5oPgotI2lu Y2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgotI2luY2x1 ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KLSNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KLSNpbmNsdWRl IDxsaW51eC9tbS5oPgotI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KLSNpbmNsdWRlIDxs aW51eC9oaWdobWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgotI2luY2x1ZGUgPGxp bnV4L3BjaS5oPgotI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgotI2luY2x1ZGUgPGxpbnV4L21lbWJs b2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvZWRkLmg+Ci0jaW5jbHVkZSA8bGludXgvZnJhbWUuaD4K LQogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+CiAKLSNpbmNsdWRlIDx4ZW4veGVuLmg+Ci0jaW5j bHVkZSA8eGVuL2V2ZW50cy5oPgotI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+Ci0jaW5j bHVkZSA8eGVuL2ludGVyZmFjZS92ZXJzaW9uLmg+Ci0jaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9w aHlzZGV2Lmg+Ci0jaW5jbHVkZSA8eGVuL2ludGVyZmFjZS92Y3B1Lmg+Ci0jaW5jbHVkZSA8eGVu L2ludGVyZmFjZS9tZW1vcnkuaD4KLSNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL25taS5oPgotI2lu Y2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLW1jYS5oPgogI2luY2x1ZGUgPHhlbi9mZWF0dXJlcy5o PgogI2luY2x1ZGUgPHhlbi9wYWdlLmg+Ci0jaW5jbHVkZSA8eGVuL2h2Yy1jb25zb2xlLmg+Ci0j aW5jbHVkZSA8eGVuL2FjcGkuaD4KIAotI2luY2x1ZGUgPGFzbS9wYXJhdmlydC5oPgotI2luY2x1 ZGUgPGFzbS9hcGljLmg+Ci0jaW5jbHVkZSA8YXNtL3BhZ2UuaD4KLSNpbmNsdWRlIDxhc20veGVu L3BjaS5oPgogI2luY2x1ZGUgPGFzbS94ZW4vaHlwZXJjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3hl bi9oeXBlcnZpc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3hlbi9jcHVpZC5oPgotI2luY2x1ZGUgPGFz bS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL3By b3RvLmg+Ci0jaW5jbHVkZSA8YXNtL21zci1pbmRleC5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5o PgotI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgotI2luY2x1ZGUgPGFzbS9kZXNjLmg+Ci0jaW5jbHVk ZSA8YXNtL3BnYWxsb2MuaD4KLSNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFz bS90bGJmbHVzaC5oPgotI2luY2x1ZGUgPGFzbS9yZWJvb3QuaD4KLSNpbmNsdWRlIDxhc20vc3Rh Y2twcm90ZWN0b3IuaD4KLSNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgotI2luY2x1ZGUgPGFz bS9tYWNoX3RyYXBzLmg+Ci0jaW5jbHVkZSA8YXNtL213YWl0Lmg+Ci0jaW5jbHVkZSA8YXNtL3Bj aV94ODYuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CiAKLSNpZmRlZiBDT05GSUdfQUNQSQotI2lu Y2x1ZGUgPGxpbnV4L2FjcGkuaD4KLSNpbmNsdWRlIDxhc20vYWNwaS5oPgotI2luY2x1ZGUgPGFj cGkvcGRjX2ludGVsLmg+Ci0jaW5jbHVkZSA8YWNwaS9wcm9jZXNzb3IuaD4KLSNpbmNsdWRlIDx4 ZW4vaW50ZXJmYWNlL3BsYXRmb3JtLmg+Ci0jZW5kaWYKLQogI2luY2x1ZGUgInhlbi1vcHMuaCIK LSNpbmNsdWRlICJtbXUuaCIKICNpbmNsdWRlICJzbXAuaCIKLSNpbmNsdWRlICJtdWx0aWNhbGxz LmgiCiAjaW5jbHVkZSAicG11LmgiCiAKIEVYUE9SVF9TWU1CT0xfR1BMKGh5cGVyY2FsbF9wYWdl KTsKQEAgLTEzMywxNCArNTYsNiBAQCBFWFBPUlRfU1lNQk9MX0dQTCh4ZW5fc3RhcnRfaW5mbyk7 CiAKIHN0cnVjdCBzaGFyZWRfaW5mbyB4ZW5fZHVtbXlfc2hhcmVkX2luZm87CiAKLXZvaWQgKnhl bl9pbml0aWFsX2dkdDsKLQotUkVTRVJWRV9CUksoc2hhcmVkX2luZm9fcGFnZV9icmssIFBBR0Vf U0laRSk7Ci0KLXN0YXRpYyBpbnQgeGVuX2NwdV91cF9wcmVwYXJlX3B2KHVuc2lnbmVkIGludCBj cHUpOwotc3RhdGljIGludCB4ZW5fY3B1X3VwX29ubGluZSh1bnNpZ25lZCBpbnQgY3B1KTsKLXN0 YXRpYyBpbnQgeGVuX2NwdV9kZWFkX3B2KHVuc2lnbmVkIGludCBjcHUpOwotCiAvKgogICogUG9p bnQgYXQgc29tZSBlbXB0eSBtZW1vcnkgdG8gc3RhcnQgd2l0aC4gV2UgbWFwIHRoZSByZWFsIHNo YXJlZF9pbmZvCiAgKiBwYWdlIGFzIHNvb24gYXMgZml4bWFwIGlzIHVwIGFuZCBydW5uaW5nLgpA QCAtMTYyLDE4ICs3NywzMCBAQCBzdHJ1Y3Qgc2hhcmVkX2luZm8gKkhZUEVSVklTT1Jfc2hhcmVk X2luZm8gPSAmeGVuX2R1bW15X3NoYXJlZF9pbmZvOwogICovCiBpbnQgeGVuX2hhdmVfdmNwdV9p bmZvX3BsYWNlbWVudCA9IDE7CiAKLXN0cnVjdCB0bHNfZGVzY3MgewotCXN0cnVjdCBkZXNjX3N0 cnVjdCBkZXNjWzNdOwotfTsKK3N0YXRpYyBpbnQgeGVuX2NwdV91cF9vbmxpbmUodW5zaWduZWQg aW50IGNwdSkKK3sKKwl4ZW5faW5pdF9sb2NrX2NwdShjcHUpOworCXJldHVybiAwOworfQogCi0v KgotICogVXBkYXRpbmcgdGhlIDMgVExTIGRlc2NyaXB0b3JzIGluIHRoZSBHRFQgb24gZXZlcnkg dGFzayBzd2l0Y2ggaXMKLSAqIHN1cnByaXNpbmdseSBleHBlbnNpdmUgc28gd2UgYXZvaWQgdXBk YXRpbmcgdGhlbSBpZiB0aGV5IGhhdmVuJ3QKLSAqIGNoYW5nZWQuICBTaW5jZSBYZW4gd3JpdGVz IGRpZmZlcmVudCBkZXNjcmlwdG9ycyB0aGFuIHRoZSBvbmUKLSAqIHBhc3NlZCBpbiB0aGUgdXBk YXRlX2Rlc2NyaXB0b3IgaHlwZXJjYWxsIHdlIGtlZXAgc2hhZG93IGNvcGllcyB0bwotICogY29t cGFyZSBhZ2FpbnN0LgotICovCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRsc19kZXNj cywgc2hhZG93X3Rsc19kZXNjKTsKK2ludCB4ZW5fY3B1aHBfc2V0dXAoaW50ICgqY3B1X3VwX3By ZXBhcmVfY2IpKHVuc2lnbmVkIGludCksCisJCSAgICBpbnQgKCpjcHVfZGVhZF9jYikodW5zaWdu ZWQgaW50KSkKK3sKKwlpbnQgcmM7CisKKwlyYyA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMo Q1BVSFBfWEVOX1BSRVBBUkUsCisJCQkJICAgICAgICJ4ODYveGVuL2h2bV9ndWVzdDpwcmVwYXJl IiwKKwkJCQkgICAgICAgY3B1X3VwX3ByZXBhcmVfY2IsIGNwdV9kZWFkX2NiKTsKKwlpZiAocmMg Pj0gMCkgeworCQlyYyA9IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5F X0RZTiwKKwkJCQkJICAgICAgICJ4ODYveGVuL2h2bV9ndWVzdDpvbmxpbmUiLAorCQkJCQkgICAg ICAgeGVuX2NwdV91cF9vbmxpbmUsIE5VTEwpOworCQlpZiAocmMgPCAwKQorCQkJY3B1aHBfcmVt b3ZlX3N0YXRlX25vY2FsbHMoQ1BVSFBfWEVOX1BSRVBBUkUpOworCX0KKworCXJldHVybiByYyA+ PSAwID8gMCA6IHJjOworfQogCiBzdGF0aWMgdm9pZCBjbGFtcF9tYXhfY3B1cyh2b2lkKQogewpA QCAtMjQyLDE1MTEgKzE2OSw4MSBAQCB2b2lkIHhlbl92Y3B1X3NldHVwKGludCBjcHUpCiAJfQog fQogCi0vKgotICogT24gcmVzdG9yZSwgc2V0IHRoZSB2Y3B1IHBsYWNlbWVudCB1cCBhZ2Fpbi4K LSAqIElmIGl0IGZhaWxzLCB0aGVuIHdlJ3JlIGluIGEgYmFkIHN0YXRlLCBzaW5jZQotICogd2Ug Y2FuJ3QgYmFjayBvdXQgZnJvbSB1c2luZyBpdC4uLgotICovCi12b2lkIHhlbl92Y3B1X3Jlc3Rv cmUodm9pZCkKK3ZvaWQgeGVuX3JlYm9vdChpbnQgcmVhc29uKQogeworCXN0cnVjdCBzY2hlZF9z aHV0ZG93biByID0geyAucmVhc29uID0gcmVhc29uIH07CiAJaW50IGNwdTsKIAotCWZvcl9lYWNo X3Bvc3NpYmxlX2NwdShjcHUpIHsKLQkJYm9vbCBvdGhlcl9jcHUgPSAoY3B1ICE9IHNtcF9wcm9j ZXNzb3JfaWQoKSk7Ci0JCWJvb2wgaXNfdXAgPSBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX2lz X3VwLCB4ZW5fdmNwdV9ucihjcHUpLAotCQkJCQkJTlVMTCk7Ci0KLQkJaWYgKG90aGVyX2NwdSAm JiBpc191cCAmJgotCQkgICAgSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9kb3duLCB4ZW5fdmNw dV9ucihjcHUpLCBOVUxMKSkKLQkJCUJVRygpOwotCi0JCXhlbl9zZXR1cF9ydW5zdGF0ZV9pbmZv KGNwdSk7Ci0KLQkJaWYgKHhlbl9oYXZlX3ZjcHVfaW5mb19wbGFjZW1lbnQpCi0JCQl4ZW5fdmNw dV9zZXR1cChjcHUpOwotCi0JCWlmIChvdGhlcl9jcHUgJiYgaXNfdXAgJiYKLQkJICAgIEhZUEVS VklTT1JfdmNwdV9vcChWQ1BVT1BfdXAsIHhlbl92Y3B1X25yKGNwdSksIE5VTEwpKQotCQkJQlVH KCk7Ci0JfQotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX2Jhbm5lcih2b2lkKQotewotCXVu c2lnbmVkIHZlcnNpb24gPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl92ZXJzaW9uLCBO VUxMKTsKLQlzdHJ1Y3QgeGVuX2V4dHJhdmVyc2lvbiBleHRyYTsKLQlIWVBFUlZJU09SX3hlbl92 ZXJzaW9uKFhFTlZFUl9leHRyYXZlcnNpb24sICZleHRyYSk7Ci0KLQlwcl9pbmZvKCJCb290aW5n IHBhcmF2aXJ0dWFsaXplZCBrZXJuZWwgJXNvbiAlc1xuIiwKLQkJeGVuX2ZlYXR1cmUoWEVORkVB VF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkgPwotCQkJIndpdGggUFZIIGV4dGVuc2lvbnMgIiA6 ICIiLCBwdl9pbmZvLm5hbWUpOwotCXByaW50ayhLRVJOX0lORk8gIlhlbiB2ZXJzaW9uOiAlZC4l ZCVzJXNcbiIsCi0JICAgICAgIHZlcnNpb24gPj4gMTYsIHZlcnNpb24gJiAweGZmZmYsIGV4dHJh LmV4dHJhdmVyc2lvbiwKLQkgICAgICAgeGVuX2ZlYXR1cmUoWEVORkVBVF9tbXVfcHRfdXBkYXRl X3ByZXNlcnZlX2FkKSA/ICIgKHByZXNlcnZlLUFEKSIgOiAiIik7Ci19Ci0vKiBDaGVjayBpZiBy dW5uaW5nIG9uIFhlbiB2ZXJzaW9uIChtYWpvciwgbWlub3IpIG9yIGxhdGVyICovCi1ib29sCi14 ZW5fcnVubmluZ19vbl92ZXJzaW9uX29yX2xhdGVyKHVuc2lnbmVkIGludCBtYWpvciwgdW5zaWdu ZWQgaW50IG1pbm9yKQotewotCXVuc2lnbmVkIGludCB2ZXJzaW9uOwotCi0JaWYgKCF4ZW5fZG9t YWluKCkpCi0JCXJldHVybiBmYWxzZTsKLQotCXZlcnNpb24gPSBIWVBFUlZJU09SX3hlbl92ZXJz aW9uKFhFTlZFUl92ZXJzaW9uLCBOVUxMKTsKLQlpZiAoKCgodmVyc2lvbiA+PiAxNikgPT0gbWFq b3IpICYmICgodmVyc2lvbiAmIDB4ZmZmZikgPj0gbWlub3IpKSB8fAotCQkoKHZlcnNpb24gPj4g MTYpID4gbWFqb3IpKQotCQlyZXR1cm4gdHJ1ZTsKLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSNkZWZp bmUgQ1BVSURfVEhFUk1fUE9XRVJfTEVBRiA2Ci0jZGVmaW5lIEFQRVJGTVBFUkZfUFJFU0VOVCAw Ci0KLXN0YXRpYyBfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVpZF9sZWFmMV9lZHhfbWFz ayA9IH4wOwotc3RhdGljIF9fcmVhZF9tb3N0bHkgdW5zaWduZWQgaW50IGNwdWlkX2xlYWYxX2Vj eF9tYXNrID0gfjA7Ci0KLXN0YXRpYyBfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVpZF9s ZWFmMV9lY3hfc2V0X21hc2s7Ci1zdGF0aWMgX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgY3B1 aWRfbGVhZjVfZWN4X3ZhbDsKLXN0YXRpYyBfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVp ZF9sZWFmNV9lZHhfdmFsOwotCi1zdGF0aWMgdm9pZCB4ZW5fY3B1aWQodW5zaWduZWQgaW50ICph eCwgdW5zaWduZWQgaW50ICpieCwKLQkJICAgICAgdW5zaWduZWQgaW50ICpjeCwgdW5zaWduZWQg aW50ICpkeCkKLXsKLQl1bnNpZ25lZCBtYXNrZWJ4ID0gfjA7Ci0JdW5zaWduZWQgbWFza2VjeCA9 IH4wOwotCXVuc2lnbmVkIG1hc2tlZHggPSB+MDsKLQl1bnNpZ25lZCBzZXRlY3ggPSAwOwotCS8q Ci0JICogTWFzayBvdXQgaW5jb252ZW5pZW50IGZlYXR1cmVzLCB0byB0cnkgYW5kIGRpc2FibGUg YXMgbWFueQotCSAqIHVuc3VwcG9ydGVkIGtlcm5lbCBzdWJzeXN0ZW1zIGFzIHBvc3NpYmxlLgot CSAqLwotCXN3aXRjaCAoKmF4KSB7Ci0JY2FzZSAxOgotCQltYXNrZWN4ID0gY3B1aWRfbGVhZjFf ZWN4X21hc2s7Ci0JCXNldGVjeCA9IGNwdWlkX2xlYWYxX2VjeF9zZXRfbWFzazsKLQkJbWFza2Vk eCA9IGNwdWlkX2xlYWYxX2VkeF9tYXNrOwotCQlicmVhazsKLQotCWNhc2UgQ1BVSURfTVdBSVRf TEVBRjoKLQkJLyogU3ludGhlc2l6ZSB0aGUgdmFsdWVzLi4gKi8KLQkJKmF4ID0gMDsKLQkJKmJ4 ID0gMDsKLQkJKmN4ID0gY3B1aWRfbGVhZjVfZWN4X3ZhbDsKLQkJKmR4ID0gY3B1aWRfbGVhZjVf ZWR4X3ZhbDsKLQkJcmV0dXJuOwotCi0JY2FzZSBDUFVJRF9USEVSTV9QT1dFUl9MRUFGOgotCQkv KiBEaXNhYmxpbmcgQVBFUkZNUEVSRiBmb3Iga2VybmVsIHVzYWdlICovCi0JCW1hc2tlY3ggPSB+ KDEgPDwgQVBFUkZNUEVSRl9QUkVTRU5UKTsKLQkJYnJlYWs7Ci0KLQljYXNlIDB4YjoKLQkJLyog U3VwcHJlc3MgZXh0ZW5kZWQgdG9wb2xvZ3kgc3R1ZmYgKi8KLQkJbWFza2VieCA9IDA7Ci0JCWJy ZWFrOwotCX0KLQotCWFzbShYRU5fRU1VTEFURV9QUkVGSVggImNwdWlkIgotCQk6ICI9YSIgKCph eCksCi0JCSAgIj1iIiAoKmJ4KSwKLQkJICAiPWMiICgqY3gpLAotCQkgICI9ZCIgKCpkeCkKLQkJ OiAiMCIgKCpheCksICIyIiAoKmN4KSk7Ci0KLQkqYnggJj0gbWFza2VieDsKLQkqY3ggJj0gbWFz a2VjeDsKLQkqY3ggfD0gc2V0ZWN4OwotCSpkeCAmPSBtYXNrZWR4OwotfQotU1RBQ0tfRlJBTUVf Tk9OX1NUQU5EQVJEKHhlbl9jcHVpZCk7IC8qIFhFTl9FTVVMQVRFX1BSRUZJWCAqLwotCi1zdGF0 aWMgYm9vbCBfX2luaXQgeGVuX2NoZWNrX213YWl0KHZvaWQpCi17Ci0jaWZkZWYgQ09ORklHX0FD UEkKLQlzdHJ1Y3QgeGVuX3BsYXRmb3JtX29wIG9wID0gewotCQkuY21kCQkJPSBYRU5QRl9zZXRf cHJvY2Vzc29yX3BtaW5mbywKLQkJLnUuc2V0X3BtaW5mby5pZAk9IC0xLAotCQkudS5zZXRfcG1p bmZvLnR5cGUJPSBYRU5fUE1fUERDLAotCX07Ci0JdWludDMyX3QgYnVmWzNdOwotCXVuc2lnbmVk IGludCBheCwgYngsIGN4LCBkeDsKLQl1bnNpZ25lZCBpbnQgbXdhaXRfbWFzazsKLQotCS8qIFdl IG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgT0sgdG8gZXhwb3NlIHRoZSBNV0FJVAot CSAqIGNhcGFiaWxpdHkgdG8gdGhlIGtlcm5lbCB0byBoYXJ2ZXN0IGRlZXBlciB0aGFuIEMzIHN0 YXRlcyBmcm9tIEFDUEkKLQkgKiBfQ1NUIHVzaW5nIHRoZSBwcm9jZXNzb3JfaGFydmVzdF94ZW4u YyBtb2R1bGUuIEZvciB0aGlzIHRvIHdvcmssIHdlCi0JICogbmVlZCB0byBnYXRoZXIgdGhlIE1X QUlUX0xFQUYgdmFsdWVzICh3aGljaCB0aGUgY3N0YXRlLmMgY29kZQotCSAqIGNoZWNrcyBhZ2Fp bnN0KS4gVGhlIGh5cGVydmlzb3Igd29uJ3QgZXhwb3NlIHRoZSBNV0FJVCBmbGFnIGJlY2F1c2UK LQkgKiBpdCB3b3VsZCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTsgc28gd2Ugd2lsbCBm aW5kIG91dCBkaXJlY3RseQotCSAqIGZyb20gdGhlIGhhcmR3YXJlIGFuZCBoeXBlcmNhbGwuCi0J ICovCi0JaWYgKCF4ZW5faW5pdGlhbF9kb21haW4oKSkKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyoK LQkgKiBXaGVuIHJ1bm5pbmcgdW5kZXIgcGxhdGZvcm0gZWFybGllciB0aGFuIFhlbjQuMiwgZG8g bm90IGV4cG9zZQotCSAqIG13YWl0LCB0byBhdm9pZCB0aGUgcmlzayBvZiBsb2FkaW5nIG5hdGl2 ZSBhY3BpIHBhZCBkcml2ZXIKLQkgKi8KLQlpZiAoIXhlbl9ydW5uaW5nX29uX3ZlcnNpb25fb3Jf bGF0ZXIoNCwgMikpCi0JCXJldHVybiBmYWxzZTsKLQotCWF4ID0gMTsKLQljeCA9IDA7Ci0KLQlu YXRpdmVfY3B1aWQoJmF4LCAmYngsICZjeCwgJmR4KTsKLQotCW13YWl0X21hc2sgPSAoMSA8PCAo WDg2X0ZFQVRVUkVfRVNUICUgMzIpKSB8Ci0JCSAgICAgKDEgPDwgKFg4Nl9GRUFUVVJFX01XQUlU ICUgMzIpKTsKLQotCWlmICgoY3ggJiBtd2FpdF9tYXNrKSAhPSBtd2FpdF9tYXNrKQotCQlyZXR1 cm4gZmFsc2U7Ci0KLQkvKiBXZSBuZWVkIHRvIGVtdWxhdGUgdGhlIE1XQUlUX0xFQUYgYW5kIGZv ciB0aGF0IHdlIG5lZWQgYm90aAotCSAqIGVjeCBhbmQgZWR4LiBUaGUgaHlwZXJjYWxsIHByb3Zp ZGVzIG9ubHkgcGFydGlhbCBpbmZvcm1hdGlvbi4KLQkgKi8KLQotCWF4ID0gQ1BVSURfTVdBSVRf TEVBRjsKLQlieCA9IDA7Ci0JY3ggPSAwOwotCWR4ID0gMDsKLQotCW5hdGl2ZV9jcHVpZCgmYXgs ICZieCwgJmN4LCAmZHgpOwotCi0JLyogQXNrIHRoZSBIeXBlcnZpc29yIHdoZXRoZXIgdG8gY2xl YXIgQUNQSV9QRENfQ19DMkMzX0ZGSC4gSWYgc28sCi0JICogZG9uJ3QgZXhwb3NlIE1XQUlUX0xF QUYgYW5kIGxldCBBQ1BJIHBpY2sgdGhlIElPUE9SVCB2ZXJzaW9uIG9mIEMzLgotCSAqLwotCWJ1 ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOwotCWJ1ZlsxXSA9IDE7Ci0JYnVmWzJdID0gKEFD UElfUERDX0NfQ0FQQUJJTElUWV9TTVAgfCBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TV1NNUCk7 Ci0KLQlzZXRfeGVuX2d1ZXN0X2hhbmRsZShvcC51LnNldF9wbWluZm8ucGRjLCBidWYpOwotCi0J aWYgKChIWVBFUlZJU09SX3BsYXRmb3JtX29wKCZvcCkgPT0gMCkgJiYKLQkgICAgKGJ1ZlsyXSAm IChBQ1BJX1BEQ19DX0MxX0ZGSCB8IEFDUElfUERDX0NfQzJDM19GRkgpKSkgewotCQljcHVpZF9s ZWFmNV9lY3hfdmFsID0gY3g7Ci0JCWNwdWlkX2xlYWY1X2VkeF92YWwgPSBkeDsKLQl9Ci0JcmV0 dXJuIHRydWU7Ci0jZWxzZQotCXJldHVybiBmYWxzZTsKLSNlbmRpZgotfQotc3RhdGljIHZvaWQg X19pbml0IHhlbl9pbml0X2NwdWlkX21hc2sodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgYXgsIGJ4 LCBjeCwgZHg7Ci0JdW5zaWduZWQgaW50IHhzYXZlX21hc2s7Ci0KLQljcHVpZF9sZWFmMV9lZHhf bWFzayA9Ci0JCX4oKDEgPDwgWDg2X0ZFQVRVUkVfTVRSUikgfCAgLyogZGlzYWJsZSBNVFJSICov Ci0JCSAgKDEgPDwgWDg2X0ZFQVRVUkVfQUNDKSk7ICAgLyogdGhlcm1hbCBtb25pdG9yaW5nICov Ci0KLQlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKQotCQljcHVpZF9sZWFmMV9lZHhfbWFzayAm PQotCQkJfigoMSA8PCBYODZfRkVBVFVSRV9BQ1BJKSk7ICAvKiBkaXNhYmxlIEFDUEkgKi8KLQot CWNwdWlkX2xlYWYxX2VjeF9tYXNrICY9IH4oMSA8PCAoWDg2X0ZFQVRVUkVfWDJBUElDICUgMzIp KTsKLQotCWF4ID0gMTsKLQljeCA9IDA7Ci0JY3B1aWQoMSwgJmF4LCAmYngsICZjeCwgJmR4KTsK LQotCXhzYXZlX21hc2sgPQotCQkoMSA8PCAoWDg2X0ZFQVRVUkVfWFNBVkUgJSAzMikpIHwKLQkJ KDEgPDwgKFg4Nl9GRUFUVVJFX09TWFNBVkUgJSAzMikpOwotCi0JLyogWGVuIHdpbGwgc2V0IENS NC5PU1hTQVZFIGlmIHN1cHBvcnRlZCBhbmQgbm90IGRpc2FibGVkIGJ5IGZvcmNlICovCi0JaWYg KChjeCAmIHhzYXZlX21hc2spICE9IHhzYXZlX21hc2spCi0JCWNwdWlkX2xlYWYxX2VjeF9tYXNr ICY9IH54c2F2ZV9tYXNrOyAvKiBkaXNhYmxlIFhTQVZFICYgT1NYU0FWRSAqLwotCWlmICh4ZW5f Y2hlY2tfbXdhaXQoKSkKLQkJY3B1aWRfbGVhZjFfZWN4X3NldF9tYXNrID0gKDEgPDwgKFg4Nl9G RUFUVVJFX01XQUlUICUgMzIpKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3NldF9kZWJ1Z3JlZyhp bnQgcmVnLCB1bnNpZ25lZCBsb25nIHZhbCkKLXsKLQlIWVBFUlZJU09SX3NldF9kZWJ1Z3JlZyhy ZWcsIHZhbCk7Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIHhlbl9nZXRfZGVidWdyZWcoaW50 IHJlZykKLXsKLQlyZXR1cm4gSFlQRVJWSVNPUl9nZXRfZGVidWdyZWcocmVnKTsKLX0KLQotc3Rh dGljIHZvaWQgeGVuX2VuZF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQp Ci17Ci0JeGVuX21jX2ZsdXNoKCk7Ci0JcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKG5leHQp OwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fc3RvcmVfdHIodm9pZCkKLXsKLQlyZXR1 cm4gMDsKLX0KLQotLyoKLSAqIFNldCB0aGUgcGFnZSBwZXJtaXNzaW9ucyBmb3IgYSBwYXJ0aWN1 bGFyIHZpcnR1YWwgYWRkcmVzcy4gIElmIHRoZQotICogYWRkcmVzcyBpcyBhIHZtYWxsb2MgbWFw cGluZyAob3Igb3RoZXIgbm9uLWxpbmVhciBtYXBwaW5nKSwgdGhlbgotICogZmluZCB0aGUgbGlu ZWFyIG1hcHBpbmcgb2YgdGhlIHBhZ2UgYW5kIGFsc28gc2V0IGl0cyBwcm90ZWN0aW9ucyB0bwot ICogbWF0Y2guCi0gKi8KLXN0YXRpYyB2b2lkIHNldF9hbGlhc2VkX3Byb3Qodm9pZCAqdiwgcGdw cm90X3QgcHJvdCkKLXsKLQlpbnQgbGV2ZWw7Ci0JcHRlX3QgKnB0ZXA7Ci0JcHRlX3QgcHRlOwot CXVuc2lnbmVkIGxvbmcgcGZuOwotCXN0cnVjdCBwYWdlICpwYWdlOwotCXVuc2lnbmVkIGNoYXIg ZHVtbXk7Ci0KLQlwdGVwID0gbG9va3VwX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpdiwgJmxldmVs KTsKLQlCVUdfT04ocHRlcCA9PSBOVUxMKTsKLQotCXBmbiA9IHB0ZV9wZm4oKnB0ZXApOwotCXBh Z2UgPSBwZm5fdG9fcGFnZShwZm4pOwotCi0JcHRlID0gcGZuX3B0ZShwZm4sIHByb3QpOwotCi0J LyoKLQkgKiBDYXJlZnVsOiB1cGRhdGVfdmFfbWFwcGluZygpIHdpbGwgZmFpbCBpZiB0aGUgdmly dHVhbCBhZGRyZXNzCi0JICogd2UncmUgcG9raW5nIGlzbid0IHBvcHVsYXRlZCBpbiB0aGUgcGFn ZSB0YWJsZXMuICBXZSBkb24ndAotCSAqIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIGRpcmVjdCBt YXAgKHRoYXQncyBhbHdheXMgaW4gdGhlIHBhZ2UKLQkgKiB0YWJsZXMpLCBidXQgd2UgbmVlZCB0 byBiZSBjYXJlZnVsIGFib3V0IHZtYXAgc3BhY2UuICBJbgotCSAqIHBhcnRpY3VsYXIsIHRoZSB0 b3AgbGV2ZWwgcGFnZSB0YWJsZSBjYW4gbGF6aWx5IHByb3BhZ2F0ZQotCSAqIGVudHJpZXMgYmV0 d2VlbiBwcm9jZXNzZXMsIHNvIGlmIHdlJ3ZlIHN3aXRjaGVkIG1tcyBzaW5jZSB3ZQotCSAqIHZt YXBwZWQgdGhlIHRhcmdldCBpbiB0aGUgZmlyc3QgcGxhY2UsIHdlIG1pZ2h0IG5vdCBoYXZlIHRo ZQotCSAqIHRvcC1sZXZlbCBwYWdlIHRhYmxlIGVudHJ5IHBvcHVsYXRlZC4KLQkgKgotCSAqIFdl IGRpc2FibGUgcHJlZW1wdGlvbiBiZWNhdXNlIHdlIHdhbnQgdGhlIHNhbWUgbW0gYWN0aXZlIHdo ZW4KLQkgKiB3ZSBwcm9iZSB0aGUgdGFyZ2V0IGFuZCB3aGVuIHdlIGlzc3VlIHRoZSBoeXBlcmNh bGwuICBXZSdsbAotCSAqIGhhdmUgdGhlIHNhbWUgbm9taW5hbCBtbSwgYnV0IGlmIHdlJ3JlIGEg a2VybmVsIHRocmVhZCwgbGF6eQotCSAqIG1tIGRyb3BwaW5nIGNvdWxkIGNoYW5nZSBvdXIgcGdk LgotCSAqCi0JICogT3V0IG9mIGFuIGFidW5kYW5jZSBvZiBjYXV0aW9uLCB0aGlzIHVzZXMgX19n ZXRfdXNlcigpIHRvIGZhdWx0Ci0JICogaW4gdGhlIHRhcmdldCBhZGRyZXNzIGp1c3QgaW4gY2Fz ZSB0aGVyZSdzIHNvbWUgb2JzY3VyZSBjYXNlCi0JICogaW4gd2hpY2ggdGhlIHRhcmdldCBhZGRy ZXNzIGlzbid0IHJlYWRhYmxlLgotCSAqLwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0KLQlwcm9i ZV9rZXJuZWxfcmVhZCgmZHVtbXksIHYsIDEpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQor CQl4ZW5fcG11X2ZpbmlzaChjcHUpOwogCi0JaWYgKEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBp bmcoKHVuc2lnbmVkIGxvbmcpdiwgcHRlLCAwKSkKKwlpZiAoSFlQRVJWSVNPUl9zY2hlZF9vcChT Q0hFRE9QX3NodXRkb3duLCAmcikpCiAJCUJVRygpOwotCi0JaWYgKCFQYWdlSGlnaE1lbShwYWdl KSkgewotCQl2b2lkICphdiA9IF9fdmEoUEZOX1BIWVMocGZuKSk7Ci0KLQkJaWYgKGF2ICE9IHYp Ci0JCQlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFwcGluZygodW5zaWduZWQgbG9uZylhdiwg cHRlLCAwKSkKLQkJCQlCVUcoKTsKLQl9IGVsc2UKLQkJa21hcF9mbHVzaF91bnVzZWQoKTsKLQot CXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9hbGxvY19sZHQoc3RydWN0 IGRlc2Nfc3RydWN0ICpsZHQsIHVuc2lnbmVkIGVudHJpZXMpCi17Ci0JY29uc3QgdW5zaWduZWQg ZW50cmllc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIExEVF9FTlRSWV9TSVpFOwotCWludCBpOwot Ci0JLyoKLQkgKiBXZSBuZWVkIHRvIG1hcmsgdGhlIGFsbCBhbGlhc2VzIG9mIHRoZSBMRFQgcGFn ZXMgUk8uICBXZQotCSAqIGRvbid0IG5lZWQgdG8gY2FsbCB2bV9mbHVzaF9hbGlhc2VzKCksIHRo b3VnaCwgc2luY2UgdGhhdCdzCi0JICogb25seSByZXNwb25zaWJsZSBmb3IgZmx1c2hpbmcgYWxp YXNlcyBvdXQgdGhlIFRMQnMsIG5vdCB0aGUKLQkgKiBwYWdlIHRhYmxlcywgYW5kIFhlbiB3aWxs IGZsdXNoIHRoZSBUTEIgZm9yIHVzIGlmIG5lZWRlZC4KLQkgKgotCSAqIFRvIGF2b2lkIGNvbmZ1 c2luZyBmdXR1cmUgcmVhZGVyczogbm9uZSBvZiB0aGlzIGlzIG5lY2Vzc2FyeQotCSAqIHRvIGxv YWQgdGhlIExEVC4gIFRoZSBoeXBlcnZpc29yIG9ubHkgY2hlY2tzIHRoaXMgd2hlbiB0aGUKLQkg KiBMRFQgaXMgZmF1bHRlZCBpbiBkdWUgdG8gc3Vic2VxdWVudCBkZXNjcmlwdG9yIGFjY2Vzcy4K LQkgKi8KLQotCWZvcihpID0gMDsgaSA8IGVudHJpZXM7IGkgKz0gZW50cmllc19wZXJfcGFnZSkK LQkJc2V0X2FsaWFzZWRfcHJvdChsZHQgKyBpLCBQQUdFX0tFUk5FTF9STyk7CiB9CiAKLXN0YXRp YyB2b2lkIHhlbl9mcmVlX2xkdChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmxkdCwgdW5zaWduZWQgZW50 cmllcykKLXsKLQljb25zdCB1bnNpZ25lZCBlbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8g TERUX0VOVFJZX1NJWkU7Ci0JaW50IGk7Ci0KLQlmb3IoaSA9IDA7IGkgPCBlbnRyaWVzOyBpICs9 IGVudHJpZXNfcGVyX3BhZ2UpCi0JCXNldF9hbGlhc2VkX3Byb3QobGR0ICsgaSwgUEFHRV9LRVJO RUwpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fc2V0X2xkdChjb25zdCB2b2lkICphZGRyLCB1bnNp Z25lZCBlbnRyaWVzKQordm9pZCB4ZW5fZW1lcmdlbmN5X3Jlc3RhcnQodm9pZCkKIHsKLQlzdHJ1 Y3QgbW11ZXh0X29wICpvcDsKLQlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jcyA9IHhlbl9tY19l bnRyeShzaXplb2YoKm9wKSk7Ci0KLQl0cmFjZV94ZW5fY3B1X3NldF9sZHQoYWRkciwgZW50cmll cyk7Ci0KLQlvcCA9IG1jcy5hcmdzOwotCW9wLT5jbWQgPSBNTVVFWFRfU0VUX0xEVDsKLQlvcC0+ YXJnMS5saW5lYXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0Jb3AtPmFyZzIubnJfZW50 cyA9IGVudHJpZXM7Ci0KLQlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9N SURfU0VMRik7Ci0KLQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUpOworCXhlbl9yZWJv b3QoU0hVVERPV05fcmVib290KTsKIH0KIAotc3RhdGljIHZvaWQgeGVuX2xvYWRfZ2R0KGNvbnN0 IHN0cnVjdCBkZXNjX3B0ciAqZHRyKQorc3RhdGljIGludAoreGVuX3BhbmljX2V2ZW50KHN0cnVj dCBub3RpZmllcl9ibG9jayAqdGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQog ewotCXVuc2lnbmVkIGxvbmcgdmEgPSBkdHItPmFkZHJlc3M7Ci0JdW5zaWduZWQgaW50IHNpemUg PSBkdHItPnNpemUgKyAxOwotCXVuc2lnbmVkIHBhZ2VzID0gRElWX1JPVU5EX1VQKHNpemUsIFBB R0VfU0laRSk7Ci0JdW5zaWduZWQgbG9uZyBmcmFtZXNbcGFnZXNdOwotCWludCBmOwotCi0JLyoK LQkgKiBBIEdEVCBjYW4gYmUgdXAgdG8gNjRrIGluIHNpemUsIHdoaWNoIGNvcnJlc3BvbmRzIHRv IDgxOTIKLQkgKiA4LWJ5dGUgZW50cmllcywgb3IgMTYgNGsgcGFnZXMuLgotCSAqLwotCi0JQlVH X09OKHNpemUgPiA2NTUzNik7Ci0JQlVHX09OKHZhICYgflBBR0VfTUFTSyk7Ci0KLQlmb3IgKGYg PSAwOyB2YSA8IGR0ci0+YWRkcmVzcyArIHNpemU7IHZhICs9IFBBR0VfU0laRSwgZisrKSB7Ci0J CWludCBsZXZlbDsKLQkJcHRlX3QgKnB0ZXA7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuLCBtZm47Ci0J CXZvaWQgKnZpcnQ7Ci0KLQkJLyoKLQkJICogVGhlIEdEVCBpcyBwZXItY3B1IGFuZCBpcyBpbiB0 aGUgcGVyY3B1IGRhdGEgYXJlYS4KLQkJICogVGhhdCBjYW4gYmUgdmlydHVhbGx5IG1hcHBlZCwg c28gd2UgbmVlZCB0byBkbyBhCi0JCSAqIHBhZ2Utd2FsayB0byBnZXQgdGhlIHVuZGVybHlpbmcg TUZOIGZvciB0aGUKLQkJICogaHlwZXJjYWxsLiAgVGhlIHBhZ2UgY2FuIGFsc28gYmUgaW4gdGhl IGtlcm5lbCdzCi0JCSAqIGxpbmVhciByYW5nZSwgc28gd2UgbmVlZCB0byBSTyB0aGF0IG1hcHBp bmcgdG9vLgotCQkgKi8KLQkJcHRlcCA9IGxvb2t1cF9hZGRyZXNzKHZhLCAmbGV2ZWwpOwotCQlC VUdfT04ocHRlcCA9PSBOVUxMKTsKLQotCQlwZm4gPSBwdGVfcGZuKCpwdGVwKTsKLQkJbWZuID0g cGZuX3RvX21mbihwZm4pOwotCQl2aXJ0ID0gX192YShQRk5fUEhZUyhwZm4pKTsKLQotCQlmcmFt ZXNbZl0gPSBtZm47Ci0KLQkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seSgodm9pZCAqKXZhKTsK LQkJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seSh2aXJ0KTsKLQl9Ci0KLQlpZiAoSFlQRVJWSVNP Ul9zZXRfZ2R0KGZyYW1lcywgc2l6ZSAvIHNpemVvZihzdHJ1Y3QgZGVzY19zdHJ1Y3QpKSkKLQkJ QlVHKCk7CisJaWYgKCFrZXhlY19jcmFzaF9sb2FkZWQoKSkKKwkJeGVuX3JlYm9vdChTSFVURE9X Tl9jcmFzaCk7CisJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCi0vKgotICogbG9hZF9nZHQgZm9y IGVhcmx5IGJvb3QsIHdoZW4gdGhlIGdkdCBpcyBvbmx5IG1hcHBlZCBvbmNlCi0gKi8KLXN0YXRp YyB2b2lkIF9faW5pdCB4ZW5fbG9hZF9nZHRfYm9vdChjb25zdCBzdHJ1Y3QgZGVzY19wdHIgKmR0 cikKLXsKLQl1bnNpZ25lZCBsb25nIHZhID0gZHRyLT5hZGRyZXNzOwotCXVuc2lnbmVkIGludCBz aXplID0gZHRyLT5zaXplICsgMTsKLQl1bnNpZ25lZCBwYWdlcyA9IERJVl9ST1VORF9VUChzaXpl LCBQQUdFX1NJWkUpOwotCXVuc2lnbmVkIGxvbmcgZnJhbWVzW3BhZ2VzXTsKLQlpbnQgZjsKLQot CS8qCi0JICogQSBHRFQgY2FuIGJlIHVwIHRvIDY0ayBpbiBzaXplLCB3aGljaCBjb3JyZXNwb25k cyB0byA4MTkyCi0JICogOC1ieXRlIGVudHJpZXMsIG9yIDE2IDRrIHBhZ2VzLi4KLQkgKi8KLQot CUJVR19PTihzaXplID4gNjU1MzYpOwotCUJVR19PTih2YSAmIH5QQUdFX01BU0spOwotCi0JZm9y IChmID0gMDsgdmEgPCBkdHItPmFkZHJlc3MgKyBzaXplOyB2YSArPSBQQUdFX1NJWkUsIGYrKykg ewotCQlwdGVfdCBwdGU7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuLCBtZm47Ci0KLQkJcGZuID0gdmly dF90b19wZm4odmEpOwotCQltZm4gPSBwZm5fdG9fbWZuKHBmbik7Ci0KLQkJcHRlID0gcGZuX3B0 ZShwZm4sIFBBR0VfS0VSTkVMX1JPKTsKLQotCQlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFw cGluZygodW5zaWduZWQgbG9uZyl2YSwgcHRlLCAwKSkKLQkJCUJVRygpOwotCi0JCWZyYW1lc1tm XSA9IG1mbjsKLQl9Ci0KLQlpZiAoSFlQRVJWSVNPUl9zZXRfZ2R0KGZyYW1lcywgc2l6ZSAvIHNp emVvZihzdHJ1Y3QgZGVzY19zdHJ1Y3QpKSkKLQkJQlVHKCk7Ci19CitzdGF0aWMgc3RydWN0IG5v dGlmaWVyX2Jsb2NrIHhlbl9wYW5pY19ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHhlbl9w YW5pY19ldmVudCwKKwkucHJpb3JpdHkgPSBJTlRfTUlOCit9OwogCi1zdGF0aWMgaW5saW5lIGJv b2wgZGVzY19lcXVhbChjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmQxLAotCQkJICAgICAgY29u c3Qgc3RydWN0IGRlc2Nfc3RydWN0ICpkMikKK2ludCB4ZW5fcGFuaWNfaGFuZGxlcl9pbml0KHZv aWQpCiB7Ci0JcmV0dXJuIGQxLT5hID09IGQyLT5hICYmIGQxLT5iID09IGQyLT5iOworCWF0b21p Y19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnhlbl9wYW5p Y19ibG9jayk7CisJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGxvYWRfVExTX2Rlc2NyaXB0 b3Ioc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQsCi0JCQkJdW5zaWduZWQgaW50IGNwdSwgdW5zaWdu ZWQgaW50IGkpCit2b2lkIHhlbl9waW5fdmNwdShpbnQgY3B1KQogewotCXN0cnVjdCBkZXNjX3N0 cnVjdCAqc2hhZG93ID0gJnBlcl9jcHUoc2hhZG93X3Rsc19kZXNjLCBjcHUpLmRlc2NbaV07Ci0J c3RydWN0IGRlc2Nfc3RydWN0ICpnZHQ7Ci0JeG1hZGRyX3QgbWFkZHI7Ci0Jc3RydWN0IG11bHRp Y2FsbF9zcGFjZSBtYzsKKwlzdGF0aWMgYm9vbCBkaXNhYmxlX3Bpbm5pbmc7CisJc3RydWN0IHNj aGVkX3Bpbl9vdmVycmlkZSBwaW5fb3ZlcnJpZGU7CisJaW50IHJldDsKIAotCWlmIChkZXNjX2Vx dWFsKHNoYWRvdywgJnQtPnRsc19hcnJheVtpXSkpCisJaWYgKGRpc2FibGVfcGlubmluZykKIAkJ cmV0dXJuOwogCi0JKnNoYWRvdyA9IHQtPnRsc19hcnJheVtpXTsKLQotCWdkdCA9IGdldF9jcHVf Z2R0X3RhYmxlKGNwdSk7Ci0JbWFkZHIgPSBhcmJpdHJhcnlfdmlydF90b19tYWNoaW5lKCZnZHRb R0RUX0VOVFJZX1RMU19NSU4raV0pOwotCW1jID0gX194ZW5fbWNfZW50cnkoMCk7CisJcGluX292 ZXJyaWRlLnBjcHUgPSBjcHU7CisJcmV0ID0gSFlQRVJWSVNPUl9zY2hlZF9vcChTQ0hFRE9QX3Bp bl9vdmVycmlkZSwgJnBpbl9vdmVycmlkZSk7CiAKLQlNVUxUSV91cGRhdGVfZGVzY3JpcHRvciht Yy5tYywgbWFkZHIubWFkZHIsIHQtPnRsc19hcnJheVtpXSk7Ci19CisJLyogSWdub3JlIGVycm9y cyB3aGVuIHJlbW92aW5nIG92ZXJyaWRlLiAqLworCWlmIChjcHUgPCAwKQorCQlyZXR1cm47CiAK LXN0YXRpYyB2b2lkIHhlbl9sb2FkX3RscyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdW5zaWdu ZWQgaW50IGNwdSkKLXsKLQkvKgotCSAqIFhYWCBzbGVhenkgaGFjazogSWYgd2UncmUgYmVpbmcg Y2FsbGVkIGluIGEgbGF6eS1jcHUgem9uZQotCSAqIGFuZCBsYXp5IGdzIGhhbmRsaW5nIGlzIGVu YWJsZWQsIGl0IG1lYW5zIHdlJ3JlIGluIGEKLQkgKiBjb250ZXh0IHN3aXRjaCwgYW5kICVncyBo YXMganVzdCBiZWVuIHNhdmVkLiAgVGhpcyBtZWFucyB3ZQotCSAqIGNhbiB6ZXJvIGl0IG91dCB0 byBwcmV2ZW50IGZhdWx0cyBvbiBleGl0IGZyb20gdGhlCi0JICogaHlwZXJ2aXNvciBpZiB0aGUg bmV4dCBwcm9jZXNzIGhhcyBubyAlZ3MuICBFaXRoZXIgd2F5LCBpdAotCSAqIGhhcyBiZWVuIHNh dmVkLCBhbmQgdGhlIG5ldyB2YWx1ZSB3aWxsIGdldCBsb2FkZWQgcHJvcGVybHkuCi0JICogVGhp cyB3aWxsIGdvIGF3YXkgYXMgc29vbiBhcyBYZW4gaGFzIGJlZW4gbW9kaWZpZWQgdG8gbm90Ci0J ICogc2F2ZS9yZXN0b3JlICVncyBmb3Igbm9ybWFsIGh5cGVyY2FsbHMuCi0JICoKLQkgKiBPbiB4 ODZfNjQsIHRoaXMgaGFjayBpcyBub3QgdXNlZCBmb3IgJWdzLCBiZWNhdXNlIGdzIHBvaW50cwot CSAqIHRvIEtFUk5FTF9HU19CQVNFIChhbmQgdXNlcyBpdCBmb3IgUERBIHJlZmVyZW5jZXMpLCBz byB3ZQotCSAqIG11c3Qgbm90IHplcm8gJWdzIG9uIHg4Nl82NAotCSAqCi0JICogRm9yIHg4Nl82 NCwgd2UgbmVlZCB0byB6ZXJvICVmcywgb3RoZXJ3aXNlIHdlIG1heSBnZXQgYW4KLQkgKiBleGNl cHRpb24gYmV0d2VlbiB0aGUgbmV3ICVmcyBkZXNjcmlwdG9yIGJlaW5nIGxvYWRlZCBhbmQKLQkg KiAlZnMgYmVpbmcgZWZmZWN0aXZlbHkgY2xlYXJlZCBhdCBfX3N3aXRjaF90bygpLgotCSAqLwot CWlmIChwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgPT0gUEFSQVZJUlRfTEFaWV9DUFUpIHsKLSNp ZmRlZiBDT05GSUdfWDg2XzMyCi0JCWxhenlfbG9hZF9ncygwKTsKLSNlbHNlCi0JCWxvYWRzZWdt ZW50KGZzLCAwKTsKLSNlbmRpZgorCXN3aXRjaCAocmV0KSB7CisJY2FzZSAtRU5PU1lTOgorCQlw cl93YXJuKCJVbmFibGUgdG8gcGluIG9uIHBoeXNpY2FsIGNwdSAlZC4gSW4gY2FzZSBvZiBwcm9i bGVtcyBjb25zaWRlciB2Y3B1IHBpbm5pbmcuXG4iLAorCQkJY3B1KTsKKwkJZGlzYWJsZV9waW5u aW5nID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSAtRVBFUk06CisJCVdBUk4oMSwgIlRyeWluZyB0 byBwaW4gdmNwdSB3aXRob3V0IGhhdmluZyBwcml2aWxlZ2UgdG8gZG8gc29cbiIpOworCQlkaXNh YmxlX3Bpbm5pbmcgPSB0cnVlOworCQlicmVhazsKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRUJV U1k6CisJCXByX3dhcm4oIlBoeXNpY2FsIGNwdSAlZCBub3QgYXZhaWxhYmxlIGZvciBwaW5uaW5n LiBDaGVjayBYZW4gY3B1IGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJY3B1KTsKKwkJYnJlYWs7CisJ Y2FzZSAwOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJyYyAlZCB3aGlsZSB0cnlp bmcgdG8gcGluIHZjcHVcbiIsIHJldCk7CisJCWRpc2FibGVfcGlubmluZyA9IHRydWU7CiAJfQot Ci0JeGVuX21jX2JhdGNoKCk7Ci0KLQlsb2FkX1RMU19kZXNjcmlwdG9yKHQsIGNwdSwgMCk7Ci0J bG9hZF9UTFNfZGVzY3JpcHRvcih0LCBjcHUsIDEpOwotCWxvYWRfVExTX2Rlc2NyaXB0b3IodCwg Y3B1LCAyKTsKLQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7Ci19Ci0KLSNpZmRl ZiBDT05GSUdfWDg2XzY0Ci1zdGF0aWMgdm9pZCB4ZW5fbG9hZF9nc19pbmRleCh1bnNpZ25lZCBp bnQgaWR4KQotewotCWlmIChIWVBFUlZJU09SX3NldF9zZWdtZW50X2Jhc2UoU0VHQkFTRV9HU19V U0VSX1NFTCwgaWR4KSkKLQkJQlVHKCk7Ci19Ci0jZW5kaWYKLQotc3RhdGljIHZvaWQgeGVuX3dy aXRlX2xkdF9lbnRyeShzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LCBpbnQgZW50cnludW0sCi0JCQkJ Y29uc3Qgdm9pZCAqcHRyKQotewotCXhtYWRkcl90IG1hY2hfbHAgPSBhcmJpdHJhcnlfdmlydF90 b19tYWNoaW5lKCZkdFtlbnRyeW51bV0pOwotCXU2NCBlbnRyeSA9ICoodTY0ICopcHRyOwotCi0J dHJhY2VfeGVuX2NwdV93cml0ZV9sZHRfZW50cnkoZHQsIGVudHJ5bnVtLCBlbnRyeSk7Ci0KLQlw cmVlbXB0X2Rpc2FibGUoKTsKLQotCXhlbl9tY19mbHVzaCgpOwotCWlmIChIWVBFUlZJU09SX3Vw ZGF0ZV9kZXNjcmlwdG9yKG1hY2hfbHAubWFkZHIsIGVudHJ5KSkKLQkJQlVHKCk7Ci0KLQlwcmVl bXB0X2VuYWJsZSgpOwogfQogCi1zdGF0aWMgaW50IGN2dF9nYXRlX3RvX3RyYXAoaW50IHZlY3Rv ciwgY29uc3QgZ2F0ZV9kZXNjICp2YWwsCi0JCQkgICAgc3RydWN0IHRyYXBfaW5mbyAqaW5mbykK LXsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0KLQlpZiAodmFsLT50eXBlICE9IEdBVEVfVFJBUCAm JiB2YWwtPnR5cGUgIT0gR0FURV9JTlRFUlJVUFQpCi0JCXJldHVybiAwOwotCi0JaW5mby0+dmVj dG9yID0gdmVjdG9yOwotCi0JYWRkciA9IGdhdGVfb2Zmc2V0KCp2YWwpOwotI2lmZGVmIENPTkZJ R19YODZfNjQKLQkvKgotCSAqIExvb2sgZm9yIGtub3duIHRyYXBzIHVzaW5nIElTVCwgYW5kIHN1 YnN0aXR1dGUgdGhlbQotCSAqIGFwcHJvcHJpYXRlbHkuICBUaGUgZGVidWdnZXIgb25lcyBhcmUg dGhlIG9ubHkgb25lcyB3ZSBjYXJlCi0JICogYWJvdXQuICBYZW4gd2lsbCBoYW5kbGUgZmF1bHRz IGxpa2UgZG91YmxlX2ZhdWx0LAotCSAqIHNvIHdlIHNob3VsZCBuZXZlciBzZWUgdGhlbS4gIFdh cm4gaWYKLQkgKiB0aGVyZSdzIGFuIHVuZXhwZWN0ZWQgSVNULXVzaW5nIGZhdWx0IGhhbmRsZXIu Ci0JICovCi0JaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpZGVidWcpCi0JCWFkZHIgPSAodW5z aWduZWQgbG9uZyl4ZW5fZGVidWc7Ci0JZWxzZSBpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZylp bnQzKQotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpeGVuX2ludDM7Ci0JZWxzZSBpZiAoYWRkciA9 PSAodW5zaWduZWQgbG9uZylzdGFja19zZWdtZW50KQotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcp eGVuX3N0YWNrX3NlZ21lbnQ7Ci0JZWxzZSBpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZylkb3Vi bGVfZmF1bHQpIHsKLQkJLyogRG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhlc2UgKi8KLQkJcmV0dXJu IDA7Ci0jaWZkZWYgQ09ORklHX1g4Nl9NQ0UKLQl9IGVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVk IGxvbmcpbWFjaGluZV9jaGVjaykgewotCQkvKgotCQkgKiB3aGVuIHhlbiBoeXBlcnZpc29yIGlu amVjdCB2TUNFIHRvIGd1ZXN0LAotCQkgKiB1c2UgbmF0aXZlIG1jZSBoYW5kbGVyIHRvIGhhbmRs ZSBpdAotCQkgKi8KLQkJOwotI2VuZGlmCi0JfSBlbHNlIGlmIChhZGRyID09ICh1bnNpZ25lZCBs b25nKW5taSkKLQkJLyoKLQkJICogVXNlIHRoZSBuYXRpdmUgdmVyc2lvbiBhcyB3ZWxsLgotCQkg Ki8KLQkJOwotCWVsc2UgewotCQkvKiBTb21lIG90aGVyIHRyYXAgdXNpbmcgSVNUPyAqLwotCQlp ZiAoV0FSTl9PTih2YWwtPmlzdCAhPSAwKSkKLQkJCXJldHVybiAwOwotCX0KLSNlbmRpZgkvKiBD T05GSUdfWDg2XzY0ICovCi0JaW5mby0+YWRkcmVzcyA9IGFkZHI7Ci0KLQlpbmZvLT5jcyA9IGdh dGVfc2VnbWVudCgqdmFsKTsKLQlpbmZvLT5mbGFncyA9IHZhbC0+ZHBsOwotCS8qIGludGVycnVw dCBnYXRlcyBjbGVhciBJRiAqLwotCWlmICh2YWwtPnR5cGUgPT0gR0FURV9JTlRFUlJVUFQpCi0J CWluZm8tPmZsYWdzIHw9IDEgPDwgMjsKLQotCXJldHVybiAxOwotfQotCi0vKiBMb2NhdGlvbnMg b2YgZWFjaCBDUFUncyBJRFQgKi8KLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZGVzY19w dHIsIGlkdF9kZXNjKTsKLQotLyogU2V0IGFuIElEVCBlbnRyeS4gIElmIHRoZSBlbnRyeSBpcyBw YXJ0IG9mIHRoZSBjdXJyZW50IElEVCwgdGhlbgotICAgYWxzbyB1cGRhdGUgWGVuLiAqLwotc3Rh dGljIHZvaWQgeGVuX3dyaXRlX2lkdF9lbnRyeShnYXRlX2Rlc2MgKmR0LCBpbnQgZW50cnludW0s IGNvbnN0IGdhdGVfZGVzYyAqZykKLXsKLQl1bnNpZ25lZCBsb25nIHAgPSAodW5zaWduZWQgbG9u ZykmZHRbZW50cnludW1dOwotCXVuc2lnbmVkIGxvbmcgc3RhcnQsIGVuZDsKLQotCXRyYWNlX3hl bl9jcHVfd3JpdGVfaWR0X2VudHJ5KGR0LCBlbnRyeW51bSwgZyk7Ci0KLQlwcmVlbXB0X2Rpc2Fi bGUoKTsKLQotCXN0YXJ0ID0gX190aGlzX2NwdV9yZWFkKGlkdF9kZXNjLmFkZHJlc3MpOwotCWVu ZCA9IHN0YXJ0ICsgX190aGlzX2NwdV9yZWFkKGlkdF9kZXNjLnNpemUpICsgMTsKLQotCXhlbl9t Y19mbHVzaCgpOwotCi0JbmF0aXZlX3dyaXRlX2lkdF9lbnRyeShkdCwgZW50cnludW0sIGcpOwot Ci0JaWYgKHAgPj0gc3RhcnQgJiYgKHAgKyA4KSA8PSBlbmQpIHsKLQkJc3RydWN0IHRyYXBfaW5m byBpbmZvWzJdOwotCi0JCWluZm9bMV0uYWRkcmVzcyA9IDA7Ci0KLQkJaWYgKGN2dF9nYXRlX3Rv X3RyYXAoZW50cnludW0sIGcsICZpbmZvWzBdKSkKLQkJCWlmIChIWVBFUlZJU09SX3NldF90cmFw X3RhYmxlKGluZm8pKQotCQkJCUJVRygpOwotCX0KLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0K LXN0YXRpYyB2b2lkIHhlbl9jb252ZXJ0X3RyYXBfaW5mbyhjb25zdCBzdHJ1Y3QgZGVzY19wdHIg KmRlc2MsCi0JCQkJICBzdHJ1Y3QgdHJhcF9pbmZvICp0cmFwcykKLXsKLQl1bnNpZ25lZCBpbiwg b3V0LCBjb3VudDsKLQotCWNvdW50ID0gKGRlc2MtPnNpemUrMSkgLyBzaXplb2YoZ2F0ZV9kZXNj KTsKLQlCVUdfT04oY291bnQgPiAyNTYpOwotCi0JZm9yIChpbiA9IG91dCA9IDA7IGluIDwgY291 bnQ7IGluKyspIHsKLQkJZ2F0ZV9kZXNjICplbnRyeSA9IChnYXRlX2Rlc2MqKShkZXNjLT5hZGRy ZXNzKSArIGluOwotCi0JCWlmIChjdnRfZ2F0ZV90b190cmFwKGluLCBlbnRyeSwgJnRyYXBzW291 dF0pKQotCQkJb3V0Kys7Ci0JfQotCXRyYXBzW291dF0uYWRkcmVzcyA9IDA7Ci19Ci0KLXZvaWQg eGVuX2NvcHlfdHJhcF9pbmZvKHN0cnVjdCB0cmFwX2luZm8gKnRyYXBzKQotewotCWNvbnN0IHN0 cnVjdCBkZXNjX3B0ciAqZGVzYyA9IHRoaXNfY3B1X3B0cigmaWR0X2Rlc2MpOwotCi0JeGVuX2Nv bnZlcnRfdHJhcF9pbmZvKGRlc2MsIHRyYXBzKTsKLX0KLQotLyogTG9hZCBhIG5ldyBJRFQgaW50 byBYZW4uICBJbiBwcmluY2lwbGUgdGhpcyBjYW4gYmUgcGVyLUNQVSwgc28gd2UKLSAgIGhvbGQg YSBzcGlubG9jayB0byBwcm90ZWN0IHRoZSBzdGF0aWMgdHJhcHNbXSBhcnJheSAoc3RhdGljIGJl Y2F1c2UKLSAgIGl0IGF2b2lkcyBhbGxvY2F0aW9uLCBhbmQgc2F2ZXMgc3RhY2sgc3BhY2UpLiAq Lwotc3RhdGljIHZvaWQgeGVuX2xvYWRfaWR0KGNvbnN0IHN0cnVjdCBkZXNjX3B0ciAqZGVzYykK LXsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGxvY2spOwotCXN0YXRpYyBzdHJ1Y3QgdHJhcF9p bmZvIHRyYXBzWzI1N107Ci0KLQl0cmFjZV94ZW5fY3B1X2xvYWRfaWR0KGRlc2MpOwotCi0Jc3Bp bl9sb2NrKCZsb2NrKTsKLQotCW1lbWNweSh0aGlzX2NwdV9wdHIoJmlkdF9kZXNjKSwgZGVzYywg c2l6ZW9mKGlkdF9kZXNjKSk7Ci0KLQl4ZW5fY29udmVydF90cmFwX2luZm8oZGVzYywgdHJhcHMp OwotCi0JeGVuX21jX2ZsdXNoKCk7Ci0JaWYgKEhZUEVSVklTT1Jfc2V0X3RyYXBfdGFibGUodHJh cHMpKQotCQlCVUcoKTsKLQotCXNwaW5fdW5sb2NrKCZsb2NrKTsKLX0KLQotLyogV3JpdGUgYSBH RFQgZGVzY3JpcHRvciBlbnRyeS4gIElnbm9yZSBMRFQgZGVzY3JpcHRvcnMsIHNpbmNlCi0gICB0 aGV5J3JlIGhhbmRsZWQgZGlmZmVyZW50bHkuICovCi1zdGF0aWMgdm9pZCB4ZW5fd3JpdGVfZ2R0 X2VudHJ5KHN0cnVjdCBkZXNjX3N0cnVjdCAqZHQsIGludCBlbnRyeSwKLQkJCQljb25zdCB2b2lk ICpkZXNjLCBpbnQgdHlwZSkKLXsKLQl0cmFjZV94ZW5fY3B1X3dyaXRlX2dkdF9lbnRyeShkdCwg ZW50cnksIGRlc2MsIHR5cGUpOwotCi0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0KLQlzd2l0Y2ggKHR5 cGUpIHsKLQljYXNlIERFU0NfTERUOgotCWNhc2UgREVTQ19UU1M6Ci0JCS8qIGlnbm9yZSAqLwot CQlicmVhazsKLQotCWRlZmF1bHQ6IHsKLQkJeG1hZGRyX3QgbWFkZHIgPSBhcmJpdHJhcnlfdmly dF90b19tYWNoaW5lKCZkdFtlbnRyeV0pOwotCi0JCXhlbl9tY19mbHVzaCgpOwotCQlpZiAoSFlQ RVJWSVNPUl91cGRhdGVfZGVzY3JpcHRvcihtYWRkci5tYWRkciwgKih1NjQgKilkZXNjKSkKLQkJ CUJVRygpOwotCX0KLQotCX0KLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLS8qCi0gKiBWZXJz aW9uIG9mIHdyaXRlX2dkdF9lbnRyeSBmb3IgdXNlIGF0IGVhcmx5IGJvb3QtdGltZSBuZWVkZWQg dG8KLSAqIHVwZGF0ZSBhbiBlbnRyeSBhcyBzaW1wbHkgYXMgcG9zc2libGUuCi0gKi8KLXN0YXRp YyB2b2lkIF9faW5pdCB4ZW5fd3JpdGVfZ2R0X2VudHJ5X2Jvb3Qoc3RydWN0IGRlc2Nfc3RydWN0 ICpkdCwgaW50IGVudHJ5LAotCQkJCQkgICAgY29uc3Qgdm9pZCAqZGVzYywgaW50IHR5cGUpCi17 Ci0JdHJhY2VfeGVuX2NwdV93cml0ZV9nZHRfZW50cnkoZHQsIGVudHJ5LCBkZXNjLCB0eXBlKTsK LQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgREVTQ19MRFQ6Ci0JY2FzZSBERVNDX1RTUzoKLQkJ LyogaWdub3JlICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDogewotCQl4bWFkZHJfdCBtYWRkciA9 IHZpcnRfdG9fbWFjaGluZSgmZHRbZW50cnldKTsKLQotCQlpZiAoSFlQRVJWSVNPUl91cGRhdGVf ZGVzY3JpcHRvcihtYWRkci5tYWRkciwgKih1NjQgKilkZXNjKSkKLQkJCWR0W2VudHJ5XSA9ICoo c3RydWN0IGRlc2Nfc3RydWN0ICopZGVzYzsKLQl9Ci0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHhl bl9sb2FkX3NwMChzdHJ1Y3QgdHNzX3N0cnVjdCAqdHNzLAotCQkJIHN0cnVjdCB0aHJlYWRfc3Ry dWN0ICp0aHJlYWQpCi17Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7Ci0KLQltY3MgPSB4 ZW5fbWNfZW50cnkoMCk7Ci0JTVVMVElfc3RhY2tfc3dpdGNoKG1jcy5tYywgX19LRVJORUxfRFMs IHRocmVhZC0+c3AwKTsKLQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUpOwotCXRzcy0+ eDg2X3Rzcy5zcDAgPSB0aHJlYWQtPnNwMDsKLX0KLQotdm9pZCB4ZW5fc2V0X2lvcGxfbWFzayh1 bnNpZ25lZCBtYXNrKQotewotCXN0cnVjdCBwaHlzZGV2X3NldF9pb3BsIHNldF9pb3BsOwotCi0J LyogRm9yY2UgdGhlIGNoYW5nZSBhdCByaW5nIDAuICovCi0Jc2V0X2lvcGwuaW9wbCA9IChtYXNr ID09IDApID8gMSA6IChtYXNrID4+IDEyKSAmIDM7Ci0JSFlQRVJWSVNPUl9waHlzZGV2X29wKFBI WVNERVZPUF9zZXRfaW9wbCwgJnNldF9pb3BsKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX2lvX2Rl bGF5KHZvaWQpCi17Ci19Ci0KLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBsb25nLCB4 ZW5fY3IwX3ZhbHVlKTsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3IwKHZvaWQp Ci17Ci0JdW5zaWduZWQgbG9uZyBjcjAgPSB0aGlzX2NwdV9yZWFkKHhlbl9jcjBfdmFsdWUpOwot Ci0JaWYgKHVubGlrZWx5KGNyMCA9PSAwKSkgewotCQljcjAgPSBuYXRpdmVfcmVhZF9jcjAoKTsK LQkJdGhpc19jcHVfd3JpdGUoeGVuX2NyMF92YWx1ZSwgY3IwKTsKLQl9Ci0KLQlyZXR1cm4gY3Iw OwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fd3JpdGVfY3IwKHVuc2lnbmVkIGxvbmcgY3IwKQotewot CXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzOwotCi0JdGhpc19jcHVfd3JpdGUoeGVuX2NyMF92 YWx1ZSwgY3IwKTsKLQotCS8qIE9ubHkgcGF5IGF0dGVudGlvbiB0byBjcjAuVFM7IGV2ZXJ5dGhp bmcgZWxzZSBpcwotCSAgIGlnbm9yZWQuICovCi0JbWNzID0geGVuX21jX2VudHJ5KDApOwotCi0J TVVMVElfZnB1X3Rhc2tzd2l0Y2gobWNzLm1jLCAoY3IwICYgWDg2X0NSMF9UUykgIT0gMCk7Ci0K LQl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5f d3JpdGVfY3I0KHVuc2lnbmVkIGxvbmcgY3I0KQotewotCWNyNCAmPSB+KFg4Nl9DUjRfUEdFIHwg WDg2X0NSNF9QU0UgfCBYODZfQ1I0X1BDRSk7Ci0KLQluYXRpdmVfd3JpdGVfY3I0KGNyNCk7Ci19 Ci0jaWZkZWYgQ09ORklHX1g4Nl82NAotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHhlbl9y ZWFkX2NyOCh2b2lkKQotewotCXJldHVybiAwOwotfQotc3RhdGljIGlubGluZSB2b2lkIHhlbl93 cml0ZV9jcjgodW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JQlVHX09OKHZhbCk7Ci19Ci0jZW5kaWYK LQotc3RhdGljIHU2NCB4ZW5fcmVhZF9tc3Jfc2FmZSh1bnNpZ25lZCBpbnQgbXNyLCBpbnQgKmVy cikKLXsKLQl1NjQgdmFsOwotCi0JaWYgKHBtdV9tc3JfcmVhZChtc3IsICZ2YWwsIGVycikpCi0J CXJldHVybiB2YWw7Ci0KLQl2YWwgPSBuYXRpdmVfcmVhZF9tc3Jfc2FmZShtc3IsIGVycik7Ci0J c3dpdGNoIChtc3IpIHsKLQljYXNlIE1TUl9JQTMyX0FQSUNCQVNFOgotI2lmZGVmIENPTkZJR19Y ODZfWDJBUElDCi0JCWlmICghKGNwdWlkX2VjeCgxKSAmICgxIDw8IChYODZfRkVBVFVSRV9YMkFQ SUMgJiAzMSkpKSkKLSNlbmRpZgotCQkJdmFsICY9IH5YMkFQSUNfRU5BQkxFOwotCQlicmVhazsK LQl9Ci0JcmV0dXJuIHZhbDsKLX0KLQotc3RhdGljIGludCB4ZW5fd3JpdGVfbXNyX3NhZmUodW5z aWduZWQgaW50IG1zciwgdW5zaWduZWQgbG93LCB1bnNpZ25lZCBoaWdoKQotewotCWludCByZXQ7 Ci0KLQlyZXQgPSAwOwotCi0Jc3dpdGNoIChtc3IpIHsKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0J CXVuc2lnbmVkIHdoaWNoOwotCQl1NjQgYmFzZTsKLQotCWNhc2UgTVNSX0ZTX0JBU0U6CQl3aGlj aCA9IFNFR0JBU0VfRlM7IGdvdG8gc2V0OwotCWNhc2UgTVNSX0tFUk5FTF9HU19CQVNFOgl3aGlj aCA9IFNFR0JBU0VfR1NfVVNFUjsgZ290byBzZXQ7Ci0JY2FzZSBNU1JfR1NfQkFTRToJCXdoaWNo ID0gU0VHQkFTRV9HU19LRVJORUw7IGdvdG8gc2V0OwotCi0Jc2V0OgotCQliYXNlID0gKCh1NjQp aGlnaCA8PCAzMikgfCBsb3c7Ci0JCWlmIChIWVBFUlZJU09SX3NldF9zZWdtZW50X2Jhc2Uod2hp Y2gsIGJhc2UpICE9IDApCi0JCQlyZXQgPSAtRUlPOwotCQlicmVhazsKLSNlbmRpZgotCi0JY2Fz ZSBNU1JfU1RBUjoKLQljYXNlIE1TUl9DU1RBUjoKLQljYXNlIE1TUl9MU1RBUjoKLQljYXNlIE1T Ul9TWVNDQUxMX01BU0s6Ci0JY2FzZSBNU1JfSUEzMl9TWVNFTlRFUl9DUzoKLQljYXNlIE1TUl9J QTMyX1NZU0VOVEVSX0VTUDoKLQljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0VJUDoKLQkJLyogRmFz dCBzeXNjYWxsIHNldHVwIGlzIGFsbCBkb25lIGluIGh5cGVyY2FsbHMsIHNvCi0JCSAgIHRoZXNl IGFyZSBhbGwgaWdub3JlZC4gIFN0dWIgdGhlbSBvdXQgaGVyZSB0byBzdG9wCi0JCSAgIFhlbiBj b25zb2xlIG5vaXNlLiAqLwotCQlicmVhazsKLQotCWRlZmF1bHQ6Ci0JCWlmICghcG11X21zcl93 cml0ZShtc3IsIGxvdywgaGlnaCwgJnJldCkpCi0JCQlyZXQgPSBuYXRpdmVfd3JpdGVfbXNyX3Nh ZmUobXNyLCBsb3csIGhpZ2gpOwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1NjQg eGVuX3JlYWRfbXNyKHVuc2lnbmVkIGludCBtc3IpCi17Ci0JLyoKLQkgKiBUaGlzIHdpbGwgc2ls ZW50bHkgc3dhbGxvdyBhICNHUCBmcm9tIFJETVNSLiAgSXQgbWF5IGJlIHdvcnRoCi0JICogY2hh bmdpbmcgdGhhdC4KLQkgKi8KLQlpbnQgZXJyOwotCi0JcmV0dXJuIHhlbl9yZWFkX21zcl9zYWZl KG1zciwgJmVycik7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl93cml0ZV9tc3IodW5zaWduZWQgaW50 IG1zciwgdW5zaWduZWQgbG93LCB1bnNpZ25lZCBoaWdoKQotewotCS8qCi0JICogVGhpcyB3aWxs IHNpbGVudGx5IHN3YWxsb3cgYSAjR1AgZnJvbSBXUk1TUi4gIEl0IG1heSBiZSB3b3J0aAotCSAq IGNoYW5naW5nIHRoYXQuCi0JICovCi0JeGVuX3dyaXRlX21zcl9zYWZlKG1zciwgbG93LCBoaWdo KTsKLX0KLQotdm9pZCB4ZW5fc2V0dXBfc2hhcmVkX2luZm8odm9pZCkKLXsKLQlpZiAoIXhlbl9m ZWF0dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApKSB7Ci0JCXNldF9maXhtYXAo RklYX1BBUkFWSVJUX0JPT1RNQVAsCi0JCQkgICB4ZW5fc3RhcnRfaW5mby0+c2hhcmVkX2luZm8p OwotCi0JCUhZUEVSVklTT1Jfc2hhcmVkX2luZm8gPQotCQkJKHN0cnVjdCBzaGFyZWRfaW5mbyAq KWZpeF90b192aXJ0KEZJWF9QQVJBVklSVF9CT09UTUFQKTsKLQl9IGVsc2UKLQkJSFlQRVJWSVNP Ul9zaGFyZWRfaW5mbyA9Ci0JCQkoc3RydWN0IHNoYXJlZF9pbmZvICopX192YSh4ZW5fc3RhcnRf aW5mby0+c2hhcmVkX2luZm8pOwotCi0jaWZuZGVmIENPTkZJR19TTVAKLQkvKiBJbiBVUCB0aGlz IGlzIGFzIGdvb2QgYSBwbGFjZSBhcyBhbnkgdG8gc2V0IHVwIHNoYXJlZCBpbmZvICovCi0JeGVu X3NldHVwX3ZjcHVfaW5mb19wbGFjZW1lbnQoKTsKLSNlbmRpZgotCi0JeGVuX3NldHVwX21mbl9s aXN0X2xpc3QoKTsKLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgb25jZSB3ZSBoYXZlIHRoZSBjcHVf cG9zc2libGVfbWFzayAqLwotdm9pZCB4ZW5fc2V0dXBfdmNwdV9pbmZvX3BsYWNlbWVudCh2b2lk KQotewotCWludCBjcHU7Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCS8qIFNl dCB1cCBkaXJlY3QgdkNQVSBpZCBtYXBwaW5nIGZvciBQViBndWVzdHMuICovCi0JCXBlcl9jcHUo eGVuX3ZjcHVfaWQsIGNwdSkgPSBjcHU7Ci0JCXhlbl92Y3B1X3NldHVwKGNwdSk7Ci0JfQotCi0J LyoKLQkgKiB4ZW5fdmNwdV9zZXR1cCBtYW5hZ2VkIHRvIHBsYWNlIHRoZSB2Y3B1X2luZm8gd2l0 aGluIHRoZQotCSAqIHBlcmNwdSBhcmVhIGZvciBhbGwgY3B1cywgc28gbWFrZSB1c2Ugb2YgaXQu Ci0JICovCi0JaWYgKHhlbl9oYXZlX3ZjcHVfaW5mb19wbGFjZW1lbnQpIHsKLQkJcHZfaXJxX29w cy5zYXZlX2ZsID0gX19QVl9JU19DQUxMRUVfU0FWRSh4ZW5fc2F2ZV9mbF9kaXJlY3QpOwotCQlw dl9pcnFfb3BzLnJlc3RvcmVfZmwgPSBfX1BWX0lTX0NBTExFRV9TQVZFKHhlbl9yZXN0b3JlX2Zs X2RpcmVjdCk7Ci0JCXB2X2lycV9vcHMuaXJxX2Rpc2FibGUgPSBfX1BWX0lTX0NBTExFRV9TQVZF KHhlbl9pcnFfZGlzYWJsZV9kaXJlY3QpOwotCQlwdl9pcnFfb3BzLmlycV9lbmFibGUgPSBfX1BW X0lTX0NBTExFRV9TQVZFKHhlbl9pcnFfZW5hYmxlX2RpcmVjdCk7Ci0JCXB2X21tdV9vcHMucmVh ZF9jcjIgPSB4ZW5fcmVhZF9jcjJfZGlyZWN0OwotCX0KLX0KLQotc3RhdGljIHVuc2lnbmVkIHhl bl9wYXRjaCh1OCB0eXBlLCB1MTYgY2xvYmJlcnMsIHZvaWQgKmluc25idWYsCi0JCQkgIHVuc2ln bmVkIGxvbmcgYWRkciwgdW5zaWduZWQgbGVuKQotewotCWNoYXIgKnN0YXJ0LCAqZW5kLCAqcmVs b2M7Ci0JdW5zaWduZWQgcmV0OwotCi0Jc3RhcnQgPSBlbmQgPSByZWxvYyA9IE5VTEw7Ci0KLSNk ZWZpbmUgU0lURShvcCwgeCkJCQkJCQkJXAotCWNhc2UgUEFSQVZJUlRfUEFUQ0gob3AueCk6CQkJ CQlcCi0JaWYgKHhlbl9oYXZlX3ZjcHVfaW5mb19wbGFjZW1lbnQpIHsJCQkJXAotCQlzdGFydCA9 IChjaGFyICopeGVuXyMjeCMjX2RpcmVjdDsJCQlcCi0JCWVuZCA9IHhlbl8jI3gjI19kaXJlY3Rf ZW5kOwkJCQlcCi0JCXJlbG9jID0geGVuXyMjeCMjX2RpcmVjdF9yZWxvYzsJCQkJXAotCX0JCQkJ CQkJCVwKLQlnb3RvIHBhdGNoX3NpdGUKLQotCXN3aXRjaCAodHlwZSkgewotCQlTSVRFKHB2X2ly cV9vcHMsIGlycV9lbmFibGUpOwotCQlTSVRFKHB2X2lycV9vcHMsIGlycV9kaXNhYmxlKTsKLQkJ U0lURShwdl9pcnFfb3BzLCBzYXZlX2ZsKTsKLQkJU0lURShwdl9pcnFfb3BzLCByZXN0b3JlX2Zs KTsKLSN1bmRlZiBTSVRFCi0KLQlwYXRjaF9zaXRlOgotCQlpZiAoc3RhcnQgPT0gTlVMTCB8fCAo ZW5kLXN0YXJ0KSA+IGxlbikKLQkJCWdvdG8gZGVmYXVsdF9wYXRjaDsKLQotCQlyZXQgPSBwYXJh dmlydF9wYXRjaF9pbnNucyhpbnNuYnVmLCBsZW4sIHN0YXJ0LCBlbmQpOwotCi0JCS8qIE5vdGU6 IGJlY2F1c2UgcmVsb2MgaXMgYXNzaWduZWQgZnJvbSBzb21ldGhpbmcgdGhhdAotCQkgICBhcHBl YXJzIHRvIGJlIGFuIGFycmF5LCBnY2MgYXNzdW1lcyBpdCdzIG5vbi1udWxsLAotCQkgICBidXQg ZG9lc24ndCBrbm93IGl0cyByZWxhdGlvbnNoaXAgd2l0aCBzdGFydCBhbmQKLQkJICAgZW5kLiAq LwotCQlpZiAocmVsb2MgPiBzdGFydCAmJiByZWxvYyA8IGVuZCkgewotCQkJaW50IHJlbG9jX29m ZiA9IHJlbG9jIC0gc3RhcnQ7Ci0JCQlsb25nICpyZWxvY3AgPSAobG9uZyAqKShpbnNuYnVmICsg cmVsb2Nfb2ZmKTsKLQkJCWxvbmcgZGVsdGEgPSBzdGFydCAtIChjaGFyICopYWRkcjsKLQotCQkJ KnJlbG9jcCArPSBkZWx0YTsKLQkJfQotCQlicmVhazsKLQotCWRlZmF1bHRfcGF0Y2g6Ci0JZGVm YXVsdDoKLQkJcmV0ID0gcGFyYXZpcnRfcGF0Y2hfZGVmYXVsdCh0eXBlLCBjbG9iYmVycywgaW5z bmJ1ZiwKLQkJCQkJICAgICBhZGRyLCBsZW4pOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gcmV0 OwotfQotCi1zdGF0aWMgY29uc3Qgc3RydWN0IHB2X2luZm8geGVuX2luZm8gX19pbml0Y29uc3Qg PSB7Ci0JLnNoYXJlZF9rZXJuZWxfcG1kID0gMCwKLQotI2lmZGVmIENPTkZJR19YODZfNjQKLQku ZXh0cmFfdXNlcl82NGJpdF9jcyA9IEZMQVRfVVNFUl9DUzY0LAotI2VuZGlmCi0JLm5hbWUgPSAi WGVuIiwKLX07Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfaW5pdF9vcHMgeGVuX2luaXRfb3Bz IF9faW5pdGNvbnN0ID0gewotCS5wYXRjaCA9IHhlbl9wYXRjaCwKLX07Ci0KLXN0YXRpYyBjb25z dCBzdHJ1Y3QgcHZfY3B1X29wcyB4ZW5fY3B1X29wcyBfX2luaXRjb25zdCA9IHsKLQkuY3B1aWQg PSB4ZW5fY3B1aWQsCi0KLQkuc2V0X2RlYnVncmVnID0geGVuX3NldF9kZWJ1Z3JlZywKLQkuZ2V0 X2RlYnVncmVnID0geGVuX2dldF9kZWJ1Z3JlZywKLQotCS5yZWFkX2NyMCA9IHhlbl9yZWFkX2Ny MCwKLQkud3JpdGVfY3IwID0geGVuX3dyaXRlX2NyMCwKLQotCS5yZWFkX2NyNCA9IG5hdGl2ZV9y ZWFkX2NyNCwKLQkud3JpdGVfY3I0ID0geGVuX3dyaXRlX2NyNCwKLQotI2lmZGVmIENPTkZJR19Y ODZfNjQKLQkucmVhZF9jcjggPSB4ZW5fcmVhZF9jcjgsCi0JLndyaXRlX2NyOCA9IHhlbl93cml0 ZV9jcjgsCi0jZW5kaWYKLQotCS53YmludmQgPSBuYXRpdmVfd2JpbnZkLAotCi0JLnJlYWRfbXNy ID0geGVuX3JlYWRfbXNyLAotCS53cml0ZV9tc3IgPSB4ZW5fd3JpdGVfbXNyLAotCi0JLnJlYWRf bXNyX3NhZmUgPSB4ZW5fcmVhZF9tc3Jfc2FmZSwKLQkud3JpdGVfbXNyX3NhZmUgPSB4ZW5fd3Jp dGVfbXNyX3NhZmUsCi0KLQkucmVhZF9wbWMgPSB4ZW5fcmVhZF9wbWMsCi0KLQkuaXJldCA9IHhl bl9pcmV0LAotI2lmZGVmIENPTkZJR19YODZfNjQKLQkudXNlcmdzX3N5c3JldDY0ID0geGVuX3N5 c3JldDY0LAotI2VuZGlmCi0KLQkubG9hZF90cl9kZXNjID0gcGFyYXZpcnRfbm9wLAotCS5zZXRf bGR0ID0geGVuX3NldF9sZHQsCi0JLmxvYWRfZ2R0ID0geGVuX2xvYWRfZ2R0LAotCS5sb2FkX2lk dCA9IHhlbl9sb2FkX2lkdCwKLQkubG9hZF90bHMgPSB4ZW5fbG9hZF90bHMsCi0jaWZkZWYgQ09O RklHX1g4Nl82NAotCS5sb2FkX2dzX2luZGV4ID0geGVuX2xvYWRfZ3NfaW5kZXgsCi0jZW5kaWYK LQotCS5hbGxvY19sZHQgPSB4ZW5fYWxsb2NfbGR0LAotCS5mcmVlX2xkdCA9IHhlbl9mcmVlX2xk dCwKLQotCS5zdG9yZV9pZHQgPSBuYXRpdmVfc3RvcmVfaWR0LAotCS5zdG9yZV90ciA9IHhlbl9z dG9yZV90ciwKLQotCS53cml0ZV9sZHRfZW50cnkgPSB4ZW5fd3JpdGVfbGR0X2VudHJ5LAotCS53 cml0ZV9nZHRfZW50cnkgPSB4ZW5fd3JpdGVfZ2R0X2VudHJ5LAotCS53cml0ZV9pZHRfZW50cnkg PSB4ZW5fd3JpdGVfaWR0X2VudHJ5LAotCS5sb2FkX3NwMCA9IHhlbl9sb2FkX3NwMCwKLQotCS5z ZXRfaW9wbF9tYXNrID0geGVuX3NldF9pb3BsX21hc2ssCi0JLmlvX2RlbGF5ID0geGVuX2lvX2Rl bGF5LAotCi0JLyogWGVuIHRha2VzIGNhcmUgb2YgJWdzIHdoZW4gc3dpdGNoaW5nIHRvIHVzZXJt b2RlIGZvciB1cyAqLwotCS5zd2FwZ3MgPSBwYXJhdmlydF9ub3AsCi0KLQkuc3RhcnRfY29udGV4 dF9zd2l0Y2ggPSBwYXJhdmlydF9zdGFydF9jb250ZXh0X3N3aXRjaCwKLQkuZW5kX2NvbnRleHRf c3dpdGNoID0geGVuX2VuZF9jb250ZXh0X3N3aXRjaCwKLX07Ci0KLXZvaWQgeGVuX3JlYm9vdChp bnQgcmVhc29uKQotewotCXN0cnVjdCBzY2hlZF9zaHV0ZG93biByID0geyAucmVhc29uID0gcmVh c29uIH07Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQotCQl4ZW5fcG11 X2ZpbmlzaChjcHUpOwotCi0JaWYgKEhZUEVSVklTT1Jfc2NoZWRfb3AoU0NIRURPUF9zaHV0ZG93 biwgJnIpKQotCQlCVUcoKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3Jlc3RhcnQoY2hhciAqbXNn KQotewotCXhlbl9yZWJvb3QoU0hVVERPV05fcmVib290KTsKLX0KLQotdm9pZCB4ZW5fZW1lcmdl bmN5X3Jlc3RhcnQodm9pZCkKLXsKLQl4ZW5fcmVib290KFNIVVRET1dOX3JlYm9vdCk7Ci19Ci0K LXN0YXRpYyB2b2lkIHhlbl9tYWNoaW5lX2hhbHQodm9pZCkKLXsKLQl4ZW5fcmVib290KFNIVVRE T1dOX3Bvd2Vyb2ZmKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX21hY2hpbmVfcG93ZXJfb2ZmKHZv aWQpCi17Ci0JaWYgKHBtX3Bvd2VyX29mZikKLQkJcG1fcG93ZXJfb2ZmKCk7Ci0JeGVuX3JlYm9v dChTSFVURE9XTl9wb3dlcm9mZik7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9jcmFzaF9zaHV0ZG93 bihzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl4ZW5fcmVib290KFNIVVRET1dOX2NyYXNoKTsK LX0KLQotc3RhdGljIGludAoteGVuX3BhbmljX2V2ZW50KHN0cnVjdCBub3RpZmllcl9ibG9jayAq dGhpcywgdW5zaWduZWQgbG9uZyBldmVudCwgdm9pZCAqcHRyKQotewotCWlmICgha2V4ZWNfY3Jh c2hfbG9hZGVkKCkpCi0JCXhlbl9yZWJvb3QoU0hVVERPV05fY3Jhc2gpOwotCXJldHVybiBOT1RJ RllfRE9ORTsKLX0KLQotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5fcGFuaWNfYmxv Y2sgPSB7Ci0JLm5vdGlmaWVyX2NhbGw9IHhlbl9wYW5pY19ldmVudCwKLQkucHJpb3JpdHkgPSBJ TlRfTUlOCi19OwotCi1pbnQgeGVuX3BhbmljX2hhbmRsZXJfaW5pdCh2b2lkKQotewotCWF0b21p Y19ub3RpZmllcl9jaGFpbl9yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwgJnhlbl9wYW5p Y19ibG9jayk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgbWFjaGluZV9v cHMgeGVuX21hY2hpbmVfb3BzIF9faW5pdGNvbnN0ID0gewotCS5yZXN0YXJ0ID0geGVuX3Jlc3Rh cnQsCi0JLmhhbHQgPSB4ZW5fbWFjaGluZV9oYWx0LAotCS5wb3dlcl9vZmYgPSB4ZW5fbWFjaGlu ZV9wb3dlcl9vZmYsCi0JLnNodXRkb3duID0geGVuX21hY2hpbmVfaGFsdCwKLQkuY3Jhc2hfc2h1 dGRvd24gPSB4ZW5fY3Jhc2hfc2h1dGRvd24sCi0JLmVtZXJnZW5jeV9yZXN0YXJ0ID0geGVuX2Vt ZXJnZW5jeV9yZXN0YXJ0LAotfTsKLQotc3RhdGljIHVuc2lnbmVkIGNoYXIgeGVuX2dldF9ubWlf cmVhc29uKHZvaWQpCi17Ci0JdW5zaWduZWQgY2hhciByZWFzb24gPSAwOwotCi0JLyogQ29uc3Ry dWN0IGEgdmFsdWUgd2hpY2ggbG9va3MgbGlrZSBpdCBjYW1lIGZyb20gcG9ydCAweDYxLiAqLwot CWlmICh0ZXN0X2JpdChfWEVOX05NSVJFQVNPTl9pb19lcnJvciwKLQkJICAgICAmSFlQRVJWSVNP Ul9zaGFyZWRfaW5mby0+YXJjaC5ubWlfcmVhc29uKSkKLQkJcmVhc29uIHw9IE5NSV9SRUFTT05f SU9DSEs7Ci0JaWYgKHRlc3RfYml0KF9YRU5fTk1JUkVBU09OX3BjaV9zZXJyLAotCQkgICAgICZI WVBFUlZJU09SX3NoYXJlZF9pbmZvLT5hcmNoLm5taV9yZWFzb24pKQotCQlyZWFzb24gfD0gTk1J X1JFQVNPTl9TRVJSOwotCi0JcmV0dXJuIHJlYXNvbjsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0 IHhlbl9ib290X3BhcmFtc19pbml0X2VkZCh2b2lkKQotewotI2lmIElTX0VOQUJMRUQoQ09ORklH X0VERCkKLQlzdHJ1Y3QgeGVuX3BsYXRmb3JtX29wIG9wOwotCXN0cnVjdCBlZGRfaW5mbyAqZWRk X2luZm87Ci0JdTMyICptYnJfc2lnbmF0dXJlOwotCXVuc2lnbmVkIG5yOwotCWludCByZXQ7Ci0K LQllZGRfaW5mbyA9IGJvb3RfcGFyYW1zLmVkZGJ1ZjsKLQltYnJfc2lnbmF0dXJlID0gYm9vdF9w YXJhbXMuZWRkX21icl9zaWdfYnVmZmVyOwotCi0Jb3AuY21kID0gWEVOUEZfZmlybXdhcmVfaW5m bzsKLQotCW9wLnUuZmlybXdhcmVfaW5mby50eXBlID0gWEVOX0ZXX0RJU0tfSU5GTzsKLQlmb3Ig KG5yID0gMDsgbnIgPCBFRERNQVhOUjsgbnIrKykgewotCQlzdHJ1Y3QgZWRkX2luZm8gKmluZm8g PSBlZGRfaW5mbyArIG5yOwotCi0JCW9wLnUuZmlybXdhcmVfaW5mby5pbmRleCA9IG5yOwotCQlp bmZvLT5wYXJhbXMubGVuZ3RoID0gc2l6ZW9mKGluZm8tPnBhcmFtcyk7Ci0JCXNldF94ZW5fZ3Vl c3RfaGFuZGxlKG9wLnUuZmlybXdhcmVfaW5mby51LmRpc2tfaW5mby5lZGRfcGFyYW1zLAotCQkJ CSAgICAgJmluZm8tPnBhcmFtcyk7Ci0JCXJldCA9IEhZUEVSVklTT1JfcGxhdGZvcm1fb3AoJm9w KTsKLQkJaWYgKHJldCkKLQkJCWJyZWFrOwotCi0jZGVmaW5lIEMoeCkgaW5mby0+eCA9IG9wLnUu ZmlybXdhcmVfaW5mby51LmRpc2tfaW5mby54Ci0JCUMoZGV2aWNlKTsKLQkJQyh2ZXJzaW9uKTsK LQkJQyhpbnRlcmZhY2Vfc3VwcG9ydCk7Ci0JCUMobGVnYWN5X21heF9jeWxpbmRlcik7Ci0JCUMo bGVnYWN5X21heF9oZWFkKTsKLQkJQyhsZWdhY3lfc2VjdG9yc19wZXJfdHJhY2spOwotI3VuZGVm IEMKLQl9Ci0JYm9vdF9wYXJhbXMuZWRkYnVmX2VudHJpZXMgPSBucjsKLQotCW9wLnUuZmlybXdh cmVfaW5mby50eXBlID0gWEVOX0ZXX0RJU0tfTUJSX1NJR05BVFVSRTsKLQlmb3IgKG5yID0gMDsg bnIgPCBFRERfTUJSX1NJR19NQVg7IG5yKyspIHsKLQkJb3AudS5maXJtd2FyZV9pbmZvLmluZGV4 ID0gbnI7Ci0JCXJldCA9IEhZUEVSVklTT1JfcGxhdGZvcm1fb3AoJm9wKTsKLQkJaWYgKHJldCkK LQkJCWJyZWFrOwotCQltYnJfc2lnbmF0dXJlW25yXSA9IG9wLnUuZmlybXdhcmVfaW5mby51LmRp c2tfbWJyX3NpZ25hdHVyZS5tYnJfc2lnbmF0dXJlOwotCX0KLQlib290X3BhcmFtcy5lZGRfbWJy X3NpZ19idWZfZW50cmllcyA9IG5yOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBTZXQgdXAgdGhlIEdE VCBhbmQgc2VnbWVudCByZWdpc3RlcnMgZm9yIC1mc3RhY2stcHJvdGVjdG9yLiAgVW50aWwKLSAq IHdlIGRvIHRoaXMsIHdlIGhhdmUgdG8gYmUgY2FyZWZ1bCBub3QgdG8gY2FsbCBhbnkgc3RhY2st cHJvdGVjdGVkCi0gKiBmdW5jdGlvbiwgd2hpY2ggaXMgbW9zdCBvZiB0aGUga2VybmVsLgotICov Ci1zdGF0aWMgdm9pZCB4ZW5fc2V0dXBfZ2R0KGludCBjcHUpCi17Ci0JcHZfY3B1X29wcy53cml0 ZV9nZHRfZW50cnkgPSB4ZW5fd3JpdGVfZ2R0X2VudHJ5X2Jvb3Q7Ci0JcHZfY3B1X29wcy5sb2Fk X2dkdCA9IHhlbl9sb2FkX2dkdF9ib290OwotCi0Jc2V0dXBfc3RhY2tfY2FuYXJ5X3NlZ21lbnQo MCk7Ci0Jc3dpdGNoX3RvX25ld19nZHQoMCk7Ci0KLQlwdl9jcHVfb3BzLndyaXRlX2dkdF9lbnRy eSA9IHhlbl93cml0ZV9nZHRfZW50cnk7Ci0JcHZfY3B1X29wcy5sb2FkX2dkdCA9IHhlbl9sb2Fk X2dkdDsKLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHhlbl9kb20wX3NldF9sZWdhY3lfZmVhdHVy ZXModm9pZCkKLXsKLQl4ODZfcGxhdGZvcm0ubGVnYWN5LnJ0YyA9IDE7Ci19Ci0KLWludCB4ZW5f Y3B1aHBfc2V0dXAoaW50ICgqY3B1X3VwX3ByZXBhcmVfY2IpKHVuc2lnbmVkIGludCksCi0JCSAg ICBpbnQgKCpjcHVfZGVhZF9jYikodW5zaWduZWQgaW50KSkKLXsKLQlpbnQgcmM7Ci0KLQlyYyA9 IGNwdWhwX3NldHVwX3N0YXRlX25vY2FsbHMoQ1BVSFBfWEVOX1BSRVBBUkUsCi0JCQkJICAgICAg ICJ4ODYveGVuL2h2bV9ndWVzdDpwcmVwYXJlIiwKLQkJCQkgICAgICAgY3B1X3VwX3ByZXBhcmVf Y2IsIGNwdV9kZWFkX2NiKTsKLQlpZiAocmMgPj0gMCkgewotCQlyYyA9IGNwdWhwX3NldHVwX3N0 YXRlX25vY2FsbHMoQ1BVSFBfQVBfT05MSU5FX0RZTiwKLQkJCQkJICAgICAgICJ4ODYveGVuL2h2 bV9ndWVzdDpvbmxpbmUiLAotCQkJCQkgICAgICAgeGVuX2NwdV91cF9vbmxpbmUsIE5VTEwpOwot CQlpZiAocmMgPCAwKQotCQkJY3B1aHBfcmVtb3ZlX3N0YXRlX25vY2FsbHMoQ1BVSFBfWEVOX1BS RVBBUkUpOwotCX0KLQotCXJldHVybiByYyA+PSAwID8gMCA6IHJjOwotfQotCi0vKiBGaXJzdCBD IGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBYZW4gYm9vdCAqLwotYXNtbGlua2FnZSBfX3Zpc2li bGUgdm9pZCBfX2luaXQgeGVuX3N0YXJ0X2tlcm5lbCh2b2lkKQotewotCXN0cnVjdCBwaHlzZGV2 X3NldF9pb3BsIHNldF9pb3BsOwotCXVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0ID0gMDsKLQlp bnQgcmM7Ci0KLQlpZiAoIXhlbl9zdGFydF9pbmZvKQotCQlyZXR1cm47Ci0KLQl4ZW5fZG9tYWlu X3R5cGUgPSBYRU5fUFZfRE9NQUlOOwotCi0JeGVuX3NldHVwX2ZlYXR1cmVzKCk7Ci0KLQl4ZW5f c2V0dXBfbWFjaHBoeXNfbWFwcGluZygpOwotCi0JLyogSW5zdGFsbCBYZW4gcGFyYXZpcnQgb3Bz ICovCi0JcHZfaW5mbyA9IHhlbl9pbmZvOwotCXB2X2luaXRfb3BzID0geGVuX2luaXRfb3BzOwot CXB2X2NwdV9vcHMgPSB4ZW5fY3B1X29wczsKLQotCXg4Nl9wbGF0Zm9ybS5nZXRfbm1pX3JlYXNv biA9IHhlbl9nZXRfbm1pX3JlYXNvbjsKLQotCXg4Nl9pbml0LnJlc291cmNlcy5tZW1vcnlfc2V0 dXAgPSB4ZW5fbWVtb3J5X3NldHVwOwotCXg4Nl9pbml0Lm9lbS5hcmNoX3NldHVwID0geGVuX2Fy Y2hfc2V0dXA7Ci0JeDg2X2luaXQub2VtLmJhbm5lciA9IHhlbl9iYW5uZXI7Ci0KLQl4ZW5faW5p dF90aW1lX29wcygpOwotCi0JLyoKLQkgKiBTZXQgdXAgc29tZSBwYWdldGFibGUgc3RhdGUgYmVm b3JlIHN0YXJ0aW5nIHRvIHNldCBhbnkgcHRlcy4KLQkgKi8KLQotCXhlbl9pbml0X21tdV9vcHMo KTsKLQotCS8qIFByZXZlbnQgdW53YW50ZWQgYml0cyBmcm9tIGJlaW5nIHNldCBpbiBQVEVzLiAq LwotCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9HTE9CQUw7Ci0KLQkvKgotCSAqIFBy ZXZlbnQgcGFnZSB0YWJsZXMgZnJvbSBiZWluZyBhbGxvY2F0ZWQgaW4gaGlnaG1lbSwgZXZlbgot CSAqIGlmIENPTkZJR19ISUdIUFRFIGlzIGVuYWJsZWQuCi0JICovCi0JX191c2VycHRlX2FsbG9j X2dmcCAmPSB+X19HRlBfSElHSE1FTTsKLQotCS8qIFdvcmsgb3V0IGlmIHdlIHN1cHBvcnQgTlgg Ki8KLQl4ODZfY29uZmlndXJlX254KCk7Ci0KLQkvKiBHZXQgbWZuIGxpc3QgKi8KLQl4ZW5fYnVp bGRfZHluYW1pY19waHlzX3RvX21hY2hpbmUoKTsKLQotCS8qCi0JICogU2V0IHVwIGtlcm5lbCBH RFQgYW5kIHNlZ21lbnQgcmVnaXN0ZXJzLCBtYWlubHkgc28gdGhhdAotCSAqIC1mc3RhY2stcHJv dGVjdG9yIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLgotCSAqLwotCXhlbl9zZXR1cF9nZHQoMCk7Ci0K LQl4ZW5faW5pdF9pcnFfb3BzKCk7Ci0JeGVuX2luaXRfY3B1aWRfbWFzaygpOwotCi0jaWZkZWYg Q09ORklHX1g4Nl9MT0NBTF9BUElDCi0JLyoKLQkgKiBzZXQgdXAgdGhlIGJhc2ljIGFwaWMgb3Bz LgotCSAqLwotCXhlbl9pbml0X2FwaWMoKTsKLSNlbmRpZgotCi0JaWYgKHhlbl9mZWF0dXJlKFhF TkZFQVRfbW11X3B0X3VwZGF0ZV9wcmVzZXJ2ZV9hZCkpIHsKLQkJcHZfbW11X29wcy5wdGVwX21v ZGlmeV9wcm90X3N0YXJ0ID0geGVuX3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQ7Ci0JCXB2X21tdV9v cHMucHRlcF9tb2RpZnlfcHJvdF9jb21taXQgPSB4ZW5fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQ7 Ci0JfQotCi0JbWFjaGluZV9vcHMgPSB4ZW5fbWFjaGluZV9vcHM7Ci0KLQkvKgotCSAqIFRoZSBv bmx5IHJlbGlhYmxlIHdheSB0byByZXRhaW4gdGhlIGluaXRpYWwgYWRkcmVzcyBvZiB0aGUKLQkg KiBwZXJjcHUgZ2R0X3BhZ2UgaXMgdG8gcmVtZW1iZXIgaXQgaGVyZSwgc28gd2UgY2FuIGdvIGFu ZAotCSAqIG1hcmsgaXQgUlcgbGF0ZXIsIHdoZW4gdGhlIGluaXRpYWwgcGVyY3B1IGFyZWEgaXMg ZnJlZWQuCi0JICovCi0JeGVuX2luaXRpYWxfZ2R0ID0gJnBlcl9jcHUoZ2R0X3BhZ2UsIDApOwot Ci0JeGVuX3NtcF9pbml0KCk7Ci0KLSNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCi0JLyoKLQkgKiBU aGUgcGFnZXMgd2UgZnJvbSBYZW4gYXJlIG5vdCByZWxhdGVkIHRvIG1hY2hpbmUgcGFnZXMsIHNv Ci0JICogYW55IE5VTUEgaW5mb3JtYXRpb24gdGhlIGtlcm5lbCB0cmllcyB0byBnZXQgZnJvbSBB Q1BJIHdpbGwKLQkgKiBiZSBtZWFuaW5nbGVzcy4gIFByZXZlbnQgaXQgZnJvbSB0cnlpbmcuCi0J ICovCi0JYWNwaV9udW1hID0gLTE7Ci0jZW5kaWYKLQkvKiBEb24ndCBkbyB0aGUgZnVsbCB2Y3B1 X2luZm8gcGxhY2VtZW50IHN0dWZmIHVudGlsIHdlIGhhdmUgYQotCSAgIHBvc3NpYmxlIG1hcCBh bmQgYSBub24tZHVtbXkgc2hhcmVkX2luZm8uICovCi0JcGVyX2NwdSh4ZW5fdmNwdSwgMCkgPSAm SFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+dmNwdV9pbmZvWzBdOwotCi0JV0FSTl9PTih4ZW5fY3B1 aHBfc2V0dXAoeGVuX2NwdV91cF9wcmVwYXJlX3B2LCB4ZW5fY3B1X2RlYWRfcHYpKTsKLQotCWxv Y2FsX2lycV9kaXNhYmxlKCk7Ci0JZWFybHlfYm9vdF9pcnFzX2Rpc2FibGVkID0gdHJ1ZTsKLQot CXhlbl9yYXdfY29uc29sZV93cml0ZSgibWFwcGluZyBrZXJuZWwgaW50byBwaHlzaWNhbCBtZW1v cnlcbiIpOwotCXhlbl9zZXR1cF9rZXJuZWxfcGFnZXRhYmxlKChwZ2RfdCAqKXhlbl9zdGFydF9p bmZvLT5wdF9iYXNlLAotCQkJCSAgIHhlbl9zdGFydF9pbmZvLT5ucl9wYWdlcyk7Ci0JeGVuX3Jl c2VydmVfc3BlY2lhbF9wYWdlcygpOwotCi0JLyoga2VlcCB1c2luZyBYZW4gZ2R0IGZvciBub3c7 IG5vIHVyZ2VudCBuZWVkIHRvIGNoYW5nZSBpdCAqLwotCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgot CXB2X2luZm8ua2VybmVsX3JwbCA9IDE7Ci0JaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfc3VwZXJ2 aXNvcl9tb2RlX2tlcm5lbCkpCi0JCXB2X2luZm8ua2VybmVsX3JwbCA9IDA7Ci0jZWxzZQotCXB2 X2luZm8ua2VybmVsX3JwbCA9IDA7Ci0jZW5kaWYKLQkvKiBzZXQgdGhlIGxpbWl0IG9mIG91ciBh ZGRyZXNzIHNwYWNlICovCi0JeGVuX3Jlc2VydmVfdG9wKCk7Ci0KLQkvKgotCSAqIFdlIHVzZWQg dG8gZG8gdGhpcyBpbiB4ZW5fYXJjaF9zZXR1cCwgYnV0IHRoYXQgaXMgdG9vIGxhdGUKLQkgKiBv biBBTUQgd2VyZSBlYXJseV9jcHVfaW5pdCAocnVuIGJlZm9yZSAtPmFyY2hfc2V0dXAoKSkgY2Fs bHMKLQkgKiBlYXJseV9hbWRfaW5pdCB3aGljaCBwb2tlcyAweGNmOCBwb3J0LgotCSAqLwotCXNl dF9pb3BsLmlvcGwgPSAxOwotCXJjID0gSFlQRVJWSVNPUl9waHlzZGV2X29wKFBIWVNERVZPUF9z ZXRfaW9wbCwgJnNldF9pb3BsKTsKLQlpZiAocmMgIT0gMCkKLQkJeGVuX3Jhd19wcmludGsoInBo eXNkZXZfb3AgZmFpbGVkICVkXG4iLCByYyk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JLyog c2V0IHVwIGJhc2ljIENQVUlEIHN0dWZmICovCi0JY3B1X2RldGVjdCgmbmV3X2NwdV9kYXRhKTsK LQlzZXRfY3B1X2NhcCgmbmV3X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9GUFUpOwotCW5ld19jcHVf ZGF0YS53cF93b3Jrc19vayA9IDE7Ci0JbmV3X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5W0NQVUlE XzFfRURYXSA9IGNwdWlkX2VkeCgxKTsKLSNlbmRpZgotCi0JaWYgKHhlbl9zdGFydF9pbmZvLT5t b2Rfc3RhcnQpIHsKLQkgICAgaWYgKHhlbl9zdGFydF9pbmZvLT5mbGFncyAmIFNJRl9NT0RfU1RB UlRfUEZOKQotCQlpbml0cmRfc3RhcnQgPSBQRk5fUEhZUyh4ZW5fc3RhcnRfaW5mby0+bW9kX3N0 YXJ0KTsKLQkgICAgZWxzZQotCQlpbml0cmRfc3RhcnQgPSBfX3BhKHhlbl9zdGFydF9pbmZvLT5t b2Rfc3RhcnQpOwotCX0KLQotCS8qIFBva2UgdmFyaW91cyB1c2VmdWwgdGhpbmdzIGludG8gYm9v dF9wYXJhbXMgKi8KLQlib290X3BhcmFtcy5oZHIudHlwZV9vZl9sb2FkZXIgPSAoOSA8PCA0KSB8 IDA7Ci0JYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfaW1hZ2UgPSBpbml0cmRfc3RhcnQ7Ci0JYm9v dF9wYXJhbXMuaGRyLnJhbWRpc2tfc2l6ZSA9IHhlbl9zdGFydF9pbmZvLT5tb2RfbGVuOwotCWJv b3RfcGFyYW1zLmhkci5jbWRfbGluZV9wdHIgPSBfX3BhKHhlbl9zdGFydF9pbmZvLT5jbWRfbGlu ZSk7Ci0JYm9vdF9wYXJhbXMuaGRyLmhhcmR3YXJlX3N1YmFyY2ggPSBYODZfU1VCQVJDSF9YRU47 Ci0KLQlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKSB7Ci0JCWFkZF9wcmVmZXJyZWRfY29uc29s ZSgieGVuYm9vdCIsIDAsIE5VTEwpOwotCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eSIsIDAs IE5VTEwpOwotCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoImh2YyIsIDAsIE5VTEwpOwotCQlpZiAo cGNpX3hlbikKLQkJCXg4Nl9pbml0LnBjaS5hcmNoX2luaXQgPSBwY2lfeGVuX2luaXQ7Ci0JfSBl bHNlIHsKLQkJY29uc3Qgc3RydWN0IGRvbTBfdmdhX2NvbnNvbGVfaW5mbyAqaW5mbyA9Ci0JCQko dm9pZCAqKSgoY2hhciAqKXhlbl9zdGFydF9pbmZvICsKLQkJCQkgeGVuX3N0YXJ0X2luZm8tPmNv bnNvbGUuZG9tMC5pbmZvX29mZik7Ci0JCXN0cnVjdCB4ZW5fcGxhdGZvcm1fb3Agb3AgPSB7Ci0J CQkuY21kID0gWEVOUEZfZmlybXdhcmVfaW5mbywKLQkJCS5pbnRlcmZhY2VfdmVyc2lvbiA9IFhF TlBGX0lOVEVSRkFDRV9WRVJTSU9OLAotCQkJLnUuZmlybXdhcmVfaW5mby50eXBlID0gWEVOX0ZX X0tCRF9TSElGVF9GTEFHUywKLQkJfTsKLQotCQl4ODZfcGxhdGZvcm0uc2V0X2xlZ2FjeV9mZWF0 dXJlcyA9Ci0JCQkJeGVuX2RvbTBfc2V0X2xlZ2FjeV9mZWF0dXJlczsKLQkJeGVuX2luaXRfdmdh KGluZm8sIHhlbl9zdGFydF9pbmZvLT5jb25zb2xlLmRvbTAuaW5mb19zaXplKTsKLQkJeGVuX3N0 YXJ0X2luZm8tPmNvbnNvbGUuZG9tVS5tZm4gPSAwOwotCQl4ZW5fc3RhcnRfaW5mby0+Y29uc29s ZS5kb21VLmV2dGNobiA9IDA7Ci0KLQkJaWYgKEhZUEVSVklTT1JfcGxhdGZvcm1fb3AoJm9wKSA9 PSAwKQotCQkJYm9vdF9wYXJhbXMua2JkX3N0YXR1cyA9IG9wLnUuZmlybXdhcmVfaW5mby51Lmti ZF9zaGlmdF9mbGFnczsKLQotCQkvKiBNYWtlIHN1cmUgQUNTIHdpbGwgYmUgZW5hYmxlZCAqLwot CQlwY2lfcmVxdWVzdF9hY3MoKTsKLQotCQl4ZW5fYWNwaV9zbGVlcF9yZWdpc3RlcigpOwotCi0J CS8qIEF2b2lkIHNlYXJjaGluZyBmb3IgQklPUyBNUCB0YWJsZXMgKi8KLQkJeDg2X2luaXQubXBw YXJzZS5maW5kX3NtcF9jb25maWcgPSB4ODZfaW5pdF9ub29wOwotCQl4ODZfaW5pdC5tcHBhcnNl LmdldF9zbXBfY29uZmlnID0geDg2X2luaXRfdWludF9ub29wOwotCi0JCXhlbl9ib290X3BhcmFt c19pbml0X2VkZCgpOwotCX0KLSNpZmRlZiBDT05GSUdfUENJCi0JLyogUENJIEJJT1Mgc2Vydmlj ZSB3b24ndCB3b3JrIGZyb20gYSBQViBndWVzdC4gKi8KLQlwY2lfcHJvYmUgJj0gflBDSV9QUk9C RV9CSU9TOwotI2VuZGlmCi0JeGVuX3Jhd19jb25zb2xlX3dyaXRlKCJhYm91dCB0byBnZXQgc3Rh cnRlZC4uLlxuIik7Ci0KLQkvKiBMZXQncyBwcmVzdW1lIFBWIGd1ZXN0cyBhbHdheXMgYm9vdCBv biB2Q1BVIHdpdGggaWQgMC4gKi8KLQlwZXJfY3B1KHhlbl92Y3B1X2lkLCAwKSA9IDA7Ci0KLQl4 ZW5fc2V0dXBfcnVuc3RhdGVfaW5mbygwKTsKLQotCXhlbl9lZmlfaW5pdCgpOwotCi0JLyogU3Rh cnQgdGhlIHdvcmxkICovCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotCWkzODZfc3RhcnRfa2VybmVs KCk7Ci0jZWxzZQotCWNyNF9pbml0X3NoYWRvdygpOyAvKiAzMmIga2VybmVsIGRvZXMgdGhpcyBp biBpMzg2X3N0YXJ0X2tlcm5lbCgpICovCi0JeDg2XzY0X3N0YXJ0X3Jlc2VydmF0aW9ucygoY2hh ciAqKV9fcGFfc3ltYm9sKCZib290X3BhcmFtcykpOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbnQg eGVuX2NwdV91cF9wcmVwYXJlX3B2KHVuc2lnbmVkIGludCBjcHUpCi17Ci0JaW50IHJjOwotCi0J eGVuX3NldHVwX3RpbWVyKGNwdSk7Ci0KLQlyYyA9IHhlbl9zbXBfaW50cl9pbml0KGNwdSk7Ci0J aWYgKHJjKSB7Ci0JCVdBUk4oMSwgInhlbl9zbXBfaW50cl9pbml0KCkgZm9yIENQVSAlZCBmYWls ZWQ6ICVkXG4iLAotCQkgICAgIGNwdSwgcmMpOwotCQlyZXR1cm4gcmM7Ci0JfQotCXJldHVybiAw OwotfQotCi1zdGF0aWMgaW50IHhlbl9jcHVfZGVhZF9wdih1bnNpZ25lZCBpbnQgY3B1KQotewot CXhlbl9zbXBfaW50cl9mcmVlKGNwdSk7Ci0KLQl4ZW5fdGVhcmRvd25fdGltZXIoY3B1KTsKLQot CXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHhlbl9jcHVfdXBfb25saW5lKHVuc2lnbmVkIGlu dCBjcHUpCi17Ci0JeGVuX2luaXRfbG9ja19jcHUoY3B1KTsKLQlyZXR1cm4gMDsKLX0KLQotc3Rh dGljIHVpbnQzMl90IF9faW5pdCB4ZW5fcGxhdGZvcm1fcHYodm9pZCkKLXsKLQlpZiAoeGVuX3B2 X2RvbWFpbigpKQotCQlyZXR1cm4geGVuX2NwdWlkX2Jhc2UoKTsKLQotCXJldHVybiAwOwotfQot Ci1zdGF0aWMgdm9pZCB4ZW5fc2V0X2NwdV9mZWF0dXJlcyhzdHJ1Y3QgY3B1aW5mb194ODYgKmMp Ci17Ci0JY2xlYXJfY3B1X2J1ZyhjLCBYODZfQlVHX1NZU1JFVF9TU19BVFRSUyk7Ci0Jc2V0X2Nw dV9jYXAoYywgWDg2X0ZFQVRVUkVfWEVOUFYpOwotfQotCi12b2lkIHhlbl9waW5fdmNwdShpbnQg Y3B1KQotewotCXN0YXRpYyBib29sIGRpc2FibGVfcGlubmluZzsKLQlzdHJ1Y3Qgc2NoZWRfcGlu X292ZXJyaWRlIHBpbl9vdmVycmlkZTsKLQlpbnQgcmV0OwotCi0JaWYgKGRpc2FibGVfcGlubmlu ZykKLQkJcmV0dXJuOwotCi0JcGluX292ZXJyaWRlLnBjcHUgPSBjcHU7Ci0JcmV0ID0gSFlQRVJW SVNPUl9zY2hlZF9vcChTQ0hFRE9QX3Bpbl9vdmVycmlkZSwgJnBpbl9vdmVycmlkZSk7Ci0KLQkv KiBJZ25vcmUgZXJyb3JzIHdoZW4gcmVtb3Zpbmcgb3ZlcnJpZGUuICovCi0JaWYgKGNwdSA8IDAp Ci0JCXJldHVybjsKLQotCXN3aXRjaCAocmV0KSB7Ci0JY2FzZSAtRU5PU1lTOgotCQlwcl93YXJu KCJVbmFibGUgdG8gcGluIG9uIHBoeXNpY2FsIGNwdSAlZC4gSW4gY2FzZSBvZiBwcm9ibGVtcyBj b25zaWRlciB2Y3B1IHBpbm5pbmcuXG4iLAotCQkJY3B1KTsKLQkJZGlzYWJsZV9waW5uaW5nID0g dHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAtRVBFUk06Ci0JCVdBUk4oMSwgIlRyeWluZyB0byBwaW4g dmNwdSB3aXRob3V0IGhhdmluZyBwcml2aWxlZ2UgdG8gZG8gc29cbiIpOwotCQlkaXNhYmxlX3Bp bm5pbmcgPSB0cnVlOwotCQlicmVhazsKLQljYXNlIC1FSU5WQUw6Ci0JY2FzZSAtRUJVU1k6Ci0J CXByX3dhcm4oIlBoeXNpY2FsIGNwdSAlZCBub3QgYXZhaWxhYmxlIGZvciBwaW5uaW5nLiBDaGVj ayBYZW4gY3B1IGNvbmZpZ3VyYXRpb24uXG4iLAotCQkJY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSAw OgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlXQVJOKDEsICJyYyAlZCB3aGlsZSB0cnlpbmcgdG8g cGluIHZjcHVcbiIsIHJldCk7Ci0JCWRpc2FibGVfcGlubmluZyA9IHRydWU7Ci0JfQotfQotCi1j b25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX3hlbl9wdiA9IHsKLQkubmFtZSAg ICAgICAgICAgICAgICAgICA9ICJYZW4gUFYiLAotCS5kZXRlY3QgICAgICAgICAgICAgICAgID0g eGVuX3BsYXRmb3JtX3B2LAotCS5zZXRfY3B1X2ZlYXR1cmVzICAgICAgID0geGVuX3NldF9jcHVf ZmVhdHVyZXMsCi0JLnBpbl92Y3B1ICAgICAgICAgICAgICAgPSB4ZW5fcGluX3ZjcHUsCi19Owot RVhQT1JUX1NZTUJPTCh4ODZfaHlwZXJfeGVuX3B2KTsKLQogI2lmZGVmIENPTkZJR19IT1RQTFVH X0NQVQogdm9pZCB4ZW5fYXJjaF9yZWdpc3Rlcl9jcHUoaW50IG51bSkKIHsKZGlmZiAtLWdpdCBh L2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW5fcHYuYyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW5fcHYu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTQ0M2NjCi0tLSAvZGV2L251 bGwKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbl9wdi5jCkBAIC0wLDAgKzEsMTUxMyBAQAor LyoKKyAqIENvcmUgb2YgWGVuIHBhcmF2aXJ0X29wcyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBU aGlzIGZpbGUgY29udGFpbnMgdGhlIHhlbl9wYXJhdmlydF9vcHMgc3RydWN0dXJlIGl0c2VsZiwg YW5kIHRoZQorICogaW1wbGVtZW50YXRpb25zIGZvcjoKKyAqIC0gcHJpdmlsZWdlZCBpbnN0cnVj dGlvbnMKKyAqIC0gaW50ZXJydXB0IGZsYWdzCisgKiAtIHNlZ21lbnQgb3BlcmF0aW9ucworICog LSBib290aW5nIGFuZCBzZXR1cAorICoKKyAqIEplcmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUB4 ZW5zb3VyY2UuY29tPiwgWGVuU291cmNlIEluYywgMjAwNworICovCisKKyNpbmNsdWRlIDxsaW51 eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0 Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgor I2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNp bmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXJ0X2tlcm5lbC5oPgor I2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2lu Y2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNsdWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNs dWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhZ2UtZmxhZ3MuaD4KKyNpbmNsdWRl IDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUg PGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L21l bWJsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZWRkLmg+CisjaW5jbHVkZSA8bGludXgvZnJhbWUu aD4KKworI2luY2x1ZGUgPHhlbi94ZW4uaD4KKyNpbmNsdWRlIDx4ZW4vZXZlbnRzLmg+CisjaW5j bHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZlcnNp b24uaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3BoeXNkZXYuaD4KKyNpbmNsdWRlIDx4ZW4v aW50ZXJmYWNlL3ZjcHUuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgorI2lu Y2x1ZGUgPHhlbi9pbnRlcmZhY2Uvbm1pLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4t bWNhLmg+CisjaW5jbHVkZSA8eGVuL2ZlYXR1cmVzLmg+CisjaW5jbHVkZSA8eGVuL3BhZ2UuaD4K KyNpbmNsdWRlIDx4ZW4vaHZjLWNvbnNvbGUuaD4KKyNpbmNsdWRlIDx4ZW4vYWNwaS5oPgorCisj aW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRl IDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS94ZW4vcGNpLmg+CisjaW5jbHVkZSA8YXNtL3hl bi9oeXBlcmNhbGwuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRl IDxhc20veGVuL2NwdWlkLmg+CisjaW5jbHVkZSA8YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFz bS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20vcHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vbXNy LWluZGV4Lmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+ CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1 ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8 YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9zdGFja3Byb3RlY3Rvci5oPgorI2luY2x1ZGUg PGFzbS9oeXBlcnZpc29yLmg+CisjaW5jbHVkZSA8YXNtL21hY2hfdHJhcHMuaD4KKyNpbmNsdWRl IDxhc20vbXdhaXQuaD4KKyNpbmNsdWRlIDxhc20vcGNpX3g4Ni5oPgorI2luY2x1ZGUgPGFzbS9j cHUuaD4KKworI2lmZGVmIENPTkZJR19BQ1BJCisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2lu Y2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8YWNwaS9wZGNfaW50ZWwuaD4KKyNpbmNsdWRl IDxhY3BpL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvcGxhdGZvcm0uaD4K KyNlbmRpZgorCisjaW5jbHVkZSAieGVuLW9wcy5oIgorI2luY2x1ZGUgIm1tdS5oIgorI2luY2x1 ZGUgInNtcC5oIgorI2luY2x1ZGUgIm11bHRpY2FsbHMuaCIKKyNpbmNsdWRlICJwbXUuaCIKKwor dm9pZCAqeGVuX2luaXRpYWxfZ2R0OworCitSRVNFUlZFX0JSSyhzaGFyZWRfaW5mb19wYWdlX2Jy aywgUEFHRV9TSVpFKTsKKworc3RhdGljIGludCB4ZW5fY3B1X3VwX3ByZXBhcmVfcHYodW5zaWdu ZWQgaW50IGNwdSk7CitzdGF0aWMgaW50IHhlbl9jcHVfZGVhZF9wdih1bnNpZ25lZCBpbnQgY3B1 KTsKKworc3RydWN0IHRsc19kZXNjcyB7CisJc3RydWN0IGRlc2Nfc3RydWN0IGRlc2NbM107Cit9 OworCisvKgorICogVXBkYXRpbmcgdGhlIDMgVExTIGRlc2NyaXB0b3JzIGluIHRoZSBHRFQgb24g ZXZlcnkgdGFzayBzd2l0Y2ggaXMKKyAqIHN1cnByaXNpbmdseSBleHBlbnNpdmUgc28gd2UgYXZv aWQgdXBkYXRpbmcgdGhlbSBpZiB0aGV5IGhhdmVuJ3QKKyAqIGNoYW5nZWQuICBTaW5jZSBYZW4g d3JpdGVzIGRpZmZlcmVudCBkZXNjcmlwdG9ycyB0aGFuIHRoZSBvbmUKKyAqIHBhc3NlZCBpbiB0 aGUgdXBkYXRlX2Rlc2NyaXB0b3IgaHlwZXJjYWxsIHdlIGtlZXAgc2hhZG93IGNvcGllcyB0bwor ICogY29tcGFyZSBhZ2FpbnN0LgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRs c19kZXNjcywgc2hhZG93X3Rsc19kZXNjKTsKKworLyoKKyAqIE9uIHJlc3RvcmUsIHNldCB0aGUg dmNwdSBwbGFjZW1lbnQgdXAgYWdhaW4uCisgKiBJZiBpdCBmYWlscywgdGhlbiB3ZSdyZSBpbiBh IGJhZCBzdGF0ZSwgc2luY2UKKyAqIHdlIGNhbid0IGJhY2sgb3V0IGZyb20gdXNpbmcgaXQuLi4K KyAqLwordm9pZCB4ZW5fdmNwdV9yZXN0b3JlKHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9l YWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJYm9vbCBvdGhlcl9jcHUgPSAoY3B1ICE9IHNtcF9w cm9jZXNzb3JfaWQoKSk7CisJCWJvb2wgaXNfdXAgPSBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9Q X2lzX3VwLCB4ZW5fdmNwdV9ucihjcHUpLAorCQkJCQkJTlVMTCk7CisKKwkJaWYgKG90aGVyX2Nw dSAmJiBpc191cCAmJgorCQkgICAgSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9kb3duLCB4ZW5f dmNwdV9ucihjcHUpLCBOVUxMKSkKKwkJCUJVRygpOworCisJCXhlbl9zZXR1cF9ydW5zdGF0ZV9p bmZvKGNwdSk7CisKKwkJaWYgKHhlbl9oYXZlX3ZjcHVfaW5mb19wbGFjZW1lbnQpCisJCQl4ZW5f dmNwdV9zZXR1cChjcHUpOworCisJCWlmIChvdGhlcl9jcHUgJiYgaXNfdXAgJiYKKwkJICAgIEhZ UEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfdXAsIHhlbl92Y3B1X25yKGNwdSksIE5VTEwpKQorCQkJ QlVHKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2Jhbm5lcih2b2lkKQorewor CXVuc2lnbmVkIHZlcnNpb24gPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl92ZXJzaW9u LCBOVUxMKTsKKwlzdHJ1Y3QgeGVuX2V4dHJhdmVyc2lvbiBleHRyYTsKKwlIWVBFUlZJU09SX3hl bl92ZXJzaW9uKFhFTlZFUl9leHRyYXZlcnNpb24sICZleHRyYSk7CisKKwlwcl9pbmZvKCJCb290 aW5nIHBhcmF2aXJ0dWFsaXplZCBrZXJuZWwgJXNvbiAlc1xuIiwKKwkJeGVuX2ZlYXR1cmUoWEVO RkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkgPworCQkJIndpdGggUFZIIGV4dGVuc2lvbnMg IiA6ICIiLCBwdl9pbmZvLm5hbWUpOworCXByaW50ayhLRVJOX0lORk8gIlhlbiB2ZXJzaW9uOiAl ZC4lZCVzJXNcbiIsCisJICAgICAgIHZlcnNpb24gPj4gMTYsIHZlcnNpb24gJiAweGZmZmYsIGV4 dHJhLmV4dHJhdmVyc2lvbiwKKwkgICAgICAgeGVuX2ZlYXR1cmUoWEVORkVBVF9tbXVfcHRfdXBk YXRlX3ByZXNlcnZlX2FkKSA/ICIgKHByZXNlcnZlLUFEKSIgOiAiIik7Cit9CisvKiBDaGVjayBp ZiBydW5uaW5nIG9uIFhlbiB2ZXJzaW9uIChtYWpvciwgbWlub3IpIG9yIGxhdGVyICovCitib29s Cit4ZW5fcnVubmluZ19vbl92ZXJzaW9uX29yX2xhdGVyKHVuc2lnbmVkIGludCBtYWpvciwgdW5z aWduZWQgaW50IG1pbm9yKQoreworCXVuc2lnbmVkIGludCB2ZXJzaW9uOworCisJaWYgKCF4ZW5f ZG9tYWluKCkpCisJCXJldHVybiBmYWxzZTsKKworCXZlcnNpb24gPSBIWVBFUlZJU09SX3hlbl92 ZXJzaW9uKFhFTlZFUl92ZXJzaW9uLCBOVUxMKTsKKwlpZiAoKCgodmVyc2lvbiA+PiAxNikgPT0g bWFqb3IpICYmICgodmVyc2lvbiAmIDB4ZmZmZikgPj0gbWlub3IpKSB8fAorCQkoKHZlcnNpb24g Pj4gMTYpID4gbWFqb3IpKQorCQlyZXR1cm4gdHJ1ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNk ZWZpbmUgQ1BVSURfVEhFUk1fUE9XRVJfTEVBRiA2CisjZGVmaW5lIEFQRVJGTVBFUkZfUFJFU0VO VCAwCisKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVpZF9sZWFmMV9lZHhf bWFzayA9IH4wOworc3RhdGljIF9fcmVhZF9tb3N0bHkgdW5zaWduZWQgaW50IGNwdWlkX2xlYWYx X2VjeF9tYXNrID0gfjA7CisKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVp ZF9sZWFmMV9lY3hfc2V0X21hc2s7CitzdGF0aWMgX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQg Y3B1aWRfbGVhZjVfZWN4X3ZhbDsKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBj cHVpZF9sZWFmNV9lZHhfdmFsOworCitzdGF0aWMgdm9pZCB4ZW5fY3B1aWQodW5zaWduZWQgaW50 ICpheCwgdW5zaWduZWQgaW50ICpieCwKKwkJICAgICAgdW5zaWduZWQgaW50ICpjeCwgdW5zaWdu ZWQgaW50ICpkeCkKK3sKKwl1bnNpZ25lZCBtYXNrZWJ4ID0gfjA7CisJdW5zaWduZWQgbWFza2Vj eCA9IH4wOworCXVuc2lnbmVkIG1hc2tlZHggPSB+MDsKKwl1bnNpZ25lZCBzZXRlY3ggPSAwOwor CS8qCisJICogTWFzayBvdXQgaW5jb252ZW5pZW50IGZlYXR1cmVzLCB0byB0cnkgYW5kIGRpc2Fi bGUgYXMgbWFueQorCSAqIHVuc3VwcG9ydGVkIGtlcm5lbCBzdWJzeXN0ZW1zIGFzIHBvc3NpYmxl LgorCSAqLworCXN3aXRjaCAoKmF4KSB7CisJY2FzZSAxOgorCQltYXNrZWN4ID0gY3B1aWRfbGVh ZjFfZWN4X21hc2s7CisJCXNldGVjeCA9IGNwdWlkX2xlYWYxX2VjeF9zZXRfbWFzazsKKwkJbWFz a2VkeCA9IGNwdWlkX2xlYWYxX2VkeF9tYXNrOworCQlicmVhazsKKworCWNhc2UgQ1BVSURfTVdB SVRfTEVBRjoKKwkJLyogU3ludGhlc2l6ZSB0aGUgdmFsdWVzLi4gKi8KKwkJKmF4ID0gMDsKKwkJ KmJ4ID0gMDsKKwkJKmN4ID0gY3B1aWRfbGVhZjVfZWN4X3ZhbDsKKwkJKmR4ID0gY3B1aWRfbGVh ZjVfZWR4X3ZhbDsKKwkJcmV0dXJuOworCisJY2FzZSBDUFVJRF9USEVSTV9QT1dFUl9MRUFGOgor CQkvKiBEaXNhYmxpbmcgQVBFUkZNUEVSRiBmb3Iga2VybmVsIHVzYWdlICovCisJCW1hc2tlY3gg PSB+KDEgPDwgQVBFUkZNUEVSRl9QUkVTRU5UKTsKKwkJYnJlYWs7CisKKwljYXNlIDB4YjoKKwkJ LyogU3VwcHJlc3MgZXh0ZW5kZWQgdG9wb2xvZ3kgc3R1ZmYgKi8KKwkJbWFza2VieCA9IDA7CisJ CWJyZWFrOworCX0KKworCWFzbShYRU5fRU1VTEFURV9QUkVGSVggImNwdWlkIgorCQk6ICI9YSIg KCpheCksCisJCSAgIj1iIiAoKmJ4KSwKKwkJICAiPWMiICgqY3gpLAorCQkgICI9ZCIgKCpkeCkK KwkJOiAiMCIgKCpheCksICIyIiAoKmN4KSk7CisKKwkqYnggJj0gbWFza2VieDsKKwkqY3ggJj0g bWFza2VjeDsKKwkqY3ggfD0gc2V0ZWN4OworCSpkeCAmPSBtYXNrZWR4OworfQorU1RBQ0tfRlJB TUVfTk9OX1NUQU5EQVJEKHhlbl9jcHVpZCk7IC8qIFhFTl9FTVVMQVRFX1BSRUZJWCAqLworCitz dGF0aWMgYm9vbCBfX2luaXQgeGVuX2NoZWNrX213YWl0KHZvaWQpCit7CisjaWZkZWYgQ09ORklH X0FDUEkKKwlzdHJ1Y3QgeGVuX3BsYXRmb3JtX29wIG9wID0geworCQkuY21kCQkJPSBYRU5QRl9z ZXRfcHJvY2Vzc29yX3BtaW5mbywKKwkJLnUuc2V0X3BtaW5mby5pZAk9IC0xLAorCQkudS5zZXRf cG1pbmZvLnR5cGUJPSBYRU5fUE1fUERDLAorCX07CisJdWludDMyX3QgYnVmWzNdOworCXVuc2ln bmVkIGludCBheCwgYngsIGN4LCBkeDsKKwl1bnNpZ25lZCBpbnQgbXdhaXRfbWFzazsKKworCS8q IFdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgT0sgdG8gZXhwb3NlIHRoZSBNV0FJ VAorCSAqIGNhcGFiaWxpdHkgdG8gdGhlIGtlcm5lbCB0byBoYXJ2ZXN0IGRlZXBlciB0aGFuIEMz IHN0YXRlcyBmcm9tIEFDUEkKKwkgKiBfQ1NUIHVzaW5nIHRoZSBwcm9jZXNzb3JfaGFydmVzdF94 ZW4uYyBtb2R1bGUuIEZvciB0aGlzIHRvIHdvcmssIHdlCisJICogbmVlZCB0byBnYXRoZXIgdGhl IE1XQUlUX0xFQUYgdmFsdWVzICh3aGljaCB0aGUgY3N0YXRlLmMgY29kZQorCSAqIGNoZWNrcyBh Z2FpbnN0KS4gVGhlIGh5cGVydmlzb3Igd29uJ3QgZXhwb3NlIHRoZSBNV0FJVCBmbGFnIGJlY2F1 c2UKKwkgKiBpdCB3b3VsZCBicmVhayBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eTsgc28gd2Ugd2ls bCBmaW5kIG91dCBkaXJlY3RseQorCSAqIGZyb20gdGhlIGhhcmR3YXJlIGFuZCBoeXBlcmNhbGwu CisJICovCisJaWYgKCF4ZW5faW5pdGlhbF9kb21haW4oKSkKKwkJcmV0dXJuIGZhbHNlOworCisJ LyoKKwkgKiBXaGVuIHJ1bm5pbmcgdW5kZXIgcGxhdGZvcm0gZWFybGllciB0aGFuIFhlbjQuMiwg ZG8gbm90IGV4cG9zZQorCSAqIG13YWl0LCB0byBhdm9pZCB0aGUgcmlzayBvZiBsb2FkaW5nIG5h dGl2ZSBhY3BpIHBhZCBkcml2ZXIKKwkgKi8KKwlpZiAoIXhlbl9ydW5uaW5nX29uX3ZlcnNpb25f b3JfbGF0ZXIoNCwgMikpCisJCXJldHVybiBmYWxzZTsKKworCWF4ID0gMTsKKwljeCA9IDA7CisK KwluYXRpdmVfY3B1aWQoJmF4LCAmYngsICZjeCwgJmR4KTsKKworCW13YWl0X21hc2sgPSAoMSA8 PCAoWDg2X0ZFQVRVUkVfRVNUICUgMzIpKSB8CisJCSAgICAgKDEgPDwgKFg4Nl9GRUFUVVJFX01X QUlUICUgMzIpKTsKKworCWlmICgoY3ggJiBtd2FpdF9tYXNrKSAhPSBtd2FpdF9tYXNrKQorCQly ZXR1cm4gZmFsc2U7CisKKwkvKiBXZSBuZWVkIHRvIGVtdWxhdGUgdGhlIE1XQUlUX0xFQUYgYW5k IGZvciB0aGF0IHdlIG5lZWQgYm90aAorCSAqIGVjeCBhbmQgZWR4LiBUaGUgaHlwZXJjYWxsIHBy b3ZpZGVzIG9ubHkgcGFydGlhbCBpbmZvcm1hdGlvbi4KKwkgKi8KKworCWF4ID0gQ1BVSURfTVdB SVRfTEVBRjsKKwlieCA9IDA7CisJY3ggPSAwOworCWR4ID0gMDsKKworCW5hdGl2ZV9jcHVpZCgm YXgsICZieCwgJmN4LCAmZHgpOworCisJLyogQXNrIHRoZSBIeXBlcnZpc29yIHdoZXRoZXIgdG8g Y2xlYXIgQUNQSV9QRENfQ19DMkMzX0ZGSC4gSWYgc28sCisJICogZG9uJ3QgZXhwb3NlIE1XQUlU X0xFQUYgYW5kIGxldCBBQ1BJIHBpY2sgdGhlIElPUE9SVCB2ZXJzaW9uIG9mIEMzLgorCSAqLwor CWJ1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lEOworCWJ1ZlsxXSA9IDE7CisJYnVmWzJdID0g KEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVAgfCBBQ1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TV1NN UCk7CisKKwlzZXRfeGVuX2d1ZXN0X2hhbmRsZShvcC51LnNldF9wbWluZm8ucGRjLCBidWYpOwor CisJaWYgKChIWVBFUlZJU09SX3BsYXRmb3JtX29wKCZvcCkgPT0gMCkgJiYKKwkgICAgKGJ1Zlsy XSAmIChBQ1BJX1BEQ19DX0MxX0ZGSCB8IEFDUElfUERDX0NfQzJDM19GRkgpKSkgeworCQljcHVp ZF9sZWFmNV9lY3hfdmFsID0gY3g7CisJCWNwdWlkX2xlYWY1X2VkeF92YWwgPSBkeDsKKwl9CisJ cmV0dXJuIHRydWU7CisjZWxzZQorCXJldHVybiBmYWxzZTsKKyNlbmRpZgorfQorc3RhdGljIHZv aWQgX19pbml0IHhlbl9pbml0X2NwdWlkX21hc2sodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgYXgs IGJ4LCBjeCwgZHg7CisJdW5zaWduZWQgaW50IHhzYXZlX21hc2s7CisKKwljcHVpZF9sZWFmMV9l ZHhfbWFzayA9CisJCX4oKDEgPDwgWDg2X0ZFQVRVUkVfTVRSUikgfCAgLyogZGlzYWJsZSBNVFJS ICovCisJCSAgKDEgPDwgWDg2X0ZFQVRVUkVfQUNDKSk7ICAgLyogdGhlcm1hbCBtb25pdG9yaW5n ICovCisKKwlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKQorCQljcHVpZF9sZWFmMV9lZHhfbWFz ayAmPQorCQkJfigoMSA8PCBYODZfRkVBVFVSRV9BQ1BJKSk7ICAvKiBkaXNhYmxlIEFDUEkgKi8K KworCWNwdWlkX2xlYWYxX2VjeF9tYXNrICY9IH4oMSA8PCAoWDg2X0ZFQVRVUkVfWDJBUElDICUg MzIpKTsKKworCWF4ID0gMTsKKwljeCA9IDA7CisJY3B1aWQoMSwgJmF4LCAmYngsICZjeCwgJmR4 KTsKKworCXhzYXZlX21hc2sgPQorCQkoMSA8PCAoWDg2X0ZFQVRVUkVfWFNBVkUgJSAzMikpIHwK KwkJKDEgPDwgKFg4Nl9GRUFUVVJFX09TWFNBVkUgJSAzMikpOworCisJLyogWGVuIHdpbGwgc2V0 IENSNC5PU1hTQVZFIGlmIHN1cHBvcnRlZCBhbmQgbm90IGRpc2FibGVkIGJ5IGZvcmNlICovCisJ aWYgKChjeCAmIHhzYXZlX21hc2spICE9IHhzYXZlX21hc2spCisJCWNwdWlkX2xlYWYxX2VjeF9t YXNrICY9IH54c2F2ZV9tYXNrOyAvKiBkaXNhYmxlIFhTQVZFICYgT1NYU0FWRSAqLworCWlmICh4 ZW5fY2hlY2tfbXdhaXQoKSkKKwkJY3B1aWRfbGVhZjFfZWN4X3NldF9tYXNrID0gKDEgPDwgKFg4 Nl9GRUFUVVJFX01XQUlUICUgMzIpKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3NldF9kZWJ1Z3Jl ZyhpbnQgcmVnLCB1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlIWVBFUlZJU09SX3NldF9kZWJ1Z3Jl ZyhyZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhlbl9nZXRfZGVidWdyZWco aW50IHJlZykKK3sKKwlyZXR1cm4gSFlQRVJWSVNPUl9nZXRfZGVidWdyZWcocmVnKTsKK30KKwor c3RhdGljIHZvaWQgeGVuX2VuZF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5l eHQpCit7CisJeGVuX21jX2ZsdXNoKCk7CisJcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKG5l eHQpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fc3RvcmVfdHIodm9pZCkKK3sKKwly ZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUgcGFnZSBwZXJtaXNzaW9ucyBmb3IgYSBwYXJ0 aWN1bGFyIHZpcnR1YWwgYWRkcmVzcy4gIElmIHRoZQorICogYWRkcmVzcyBpcyBhIHZtYWxsb2Mg bWFwcGluZyAob3Igb3RoZXIgbm9uLWxpbmVhciBtYXBwaW5nKSwgdGhlbgorICogZmluZCB0aGUg bGluZWFyIG1hcHBpbmcgb2YgdGhlIHBhZ2UgYW5kIGFsc28gc2V0IGl0cyBwcm90ZWN0aW9ucyB0 bworICogbWF0Y2guCisgKi8KK3N0YXRpYyB2b2lkIHNldF9hbGlhc2VkX3Byb3Qodm9pZCAqdiwg cGdwcm90X3QgcHJvdCkKK3sKKwlpbnQgbGV2ZWw7CisJcHRlX3QgKnB0ZXA7CisJcHRlX3QgcHRl OworCXVuc2lnbmVkIGxvbmcgcGZuOworCXN0cnVjdCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGNo YXIgZHVtbXk7CisKKwlwdGVwID0gbG9va3VwX2FkZHJlc3MoKHVuc2lnbmVkIGxvbmcpdiwgJmxl dmVsKTsKKwlCVUdfT04ocHRlcCA9PSBOVUxMKTsKKworCXBmbiA9IHB0ZV9wZm4oKnB0ZXApOwor CXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCisJcHRlID0gcGZuX3B0ZShwZm4sIHByb3QpOwor CisJLyoKKwkgKiBDYXJlZnVsOiB1cGRhdGVfdmFfbWFwcGluZygpIHdpbGwgZmFpbCBpZiB0aGUg dmlydHVhbCBhZGRyZXNzCisJICogd2UncmUgcG9raW5nIGlzbid0IHBvcHVsYXRlZCBpbiB0aGUg cGFnZSB0YWJsZXMuICBXZSBkb24ndAorCSAqIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIGRpcmVj dCBtYXAgKHRoYXQncyBhbHdheXMgaW4gdGhlIHBhZ2UKKwkgKiB0YWJsZXMpLCBidXQgd2UgbmVl ZCB0byBiZSBjYXJlZnVsIGFib3V0IHZtYXAgc3BhY2UuICBJbgorCSAqIHBhcnRpY3VsYXIsIHRo ZSB0b3AgbGV2ZWwgcGFnZSB0YWJsZSBjYW4gbGF6aWx5IHByb3BhZ2F0ZQorCSAqIGVudHJpZXMg YmV0d2VlbiBwcm9jZXNzZXMsIHNvIGlmIHdlJ3ZlIHN3aXRjaGVkIG1tcyBzaW5jZSB3ZQorCSAq IHZtYXBwZWQgdGhlIHRhcmdldCBpbiB0aGUgZmlyc3QgcGxhY2UsIHdlIG1pZ2h0IG5vdCBoYXZl IHRoZQorCSAqIHRvcC1sZXZlbCBwYWdlIHRhYmxlIGVudHJ5IHBvcHVsYXRlZC4KKwkgKgorCSAq IFdlIGRpc2FibGUgcHJlZW1wdGlvbiBiZWNhdXNlIHdlIHdhbnQgdGhlIHNhbWUgbW0gYWN0aXZl IHdoZW4KKwkgKiB3ZSBwcm9iZSB0aGUgdGFyZ2V0IGFuZCB3aGVuIHdlIGlzc3VlIHRoZSBoeXBl cmNhbGwuICBXZSdsbAorCSAqIGhhdmUgdGhlIHNhbWUgbm9taW5hbCBtbSwgYnV0IGlmIHdlJ3Jl IGEga2VybmVsIHRocmVhZCwgbGF6eQorCSAqIG1tIGRyb3BwaW5nIGNvdWxkIGNoYW5nZSBvdXIg cGdkLgorCSAqCisJICogT3V0IG9mIGFuIGFidW5kYW5jZSBvZiBjYXV0aW9uLCB0aGlzIHVzZXMg X19nZXRfdXNlcigpIHRvIGZhdWx0CisJICogaW4gdGhlIHRhcmdldCBhZGRyZXNzIGp1c3QgaW4g Y2FzZSB0aGVyZSdzIHNvbWUgb2JzY3VyZSBjYXNlCisJICogaW4gd2hpY2ggdGhlIHRhcmdldCBh ZGRyZXNzIGlzbid0IHJlYWRhYmxlLgorCSAqLworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlw cm9iZV9rZXJuZWxfcmVhZCgmZHVtbXksIHYsIDEpOworCisJaWYgKEhZUEVSVklTT1JfdXBkYXRl X3ZhX21hcHBpbmcoKHVuc2lnbmVkIGxvbmcpdiwgcHRlLCAwKSkKKwkJQlVHKCk7CisKKwlpZiAo IVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCXZvaWQgKmF2ID0gX192YShQRk5fUEhZUyhwZm4pKTsK KworCQlpZiAoYXYgIT0gdikKKwkJCWlmIChIWVBFUlZJU09SX3VwZGF0ZV92YV9tYXBwaW5nKCh1 bnNpZ25lZCBsb25nKWF2LCBwdGUsIDApKQorCQkJCUJVRygpOworCX0gZWxzZQorCQlrbWFwX2Zs dXNoX3VudXNlZCgpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgeGVu X2FsbG9jX2xkdChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmxkdCwgdW5zaWduZWQgZW50cmllcykKK3sK Kwljb25zdCB1bnNpZ25lZCBlbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gTERUX0VOVFJZ X1NJWkU7CisJaW50IGk7CisKKwkvKgorCSAqIFdlIG5lZWQgdG8gbWFyayB0aGUgYWxsIGFsaWFz ZXMgb2YgdGhlIExEVCBwYWdlcyBSTy4gIFdlCisJICogZG9uJ3QgbmVlZCB0byBjYWxsIHZtX2Zs dXNoX2FsaWFzZXMoKSwgdGhvdWdoLCBzaW5jZSB0aGF0J3MKKwkgKiBvbmx5IHJlc3BvbnNpYmxl IGZvciBmbHVzaGluZyBhbGlhc2VzIG91dCB0aGUgVExCcywgbm90IHRoZQorCSAqIHBhZ2UgdGFi bGVzLCBhbmQgWGVuIHdpbGwgZmx1c2ggdGhlIFRMQiBmb3IgdXMgaWYgbmVlZGVkLgorCSAqCisJ ICogVG8gYXZvaWQgY29uZnVzaW5nIGZ1dHVyZSByZWFkZXJzOiBub25lIG9mIHRoaXMgaXMgbmVj ZXNzYXJ5CisJICogdG8gbG9hZCB0aGUgTERULiAgVGhlIGh5cGVydmlzb3Igb25seSBjaGVja3Mg dGhpcyB3aGVuIHRoZQorCSAqIExEVCBpcyBmYXVsdGVkIGluIGR1ZSB0byBzdWJzZXF1ZW50IGRl c2NyaXB0b3IgYWNjZXNzLgorCSAqLworCisJZm9yIChpID0gMDsgaSA8IGVudHJpZXM7IGkgKz0g ZW50cmllc19wZXJfcGFnZSkKKwkJc2V0X2FsaWFzZWRfcHJvdChsZHQgKyBpLCBQQUdFX0tFUk5F TF9STyk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9mcmVlX2xkdChzdHJ1Y3QgZGVzY19zdHJ1Y3Qg KmxkdCwgdW5zaWduZWQgZW50cmllcykKK3sKKwljb25zdCB1bnNpZ25lZCBlbnRyaWVzX3Blcl9w YWdlID0gUEFHRV9TSVpFIC8gTERUX0VOVFJZX1NJWkU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAw OyBpIDwgZW50cmllczsgaSArPSBlbnRyaWVzX3Blcl9wYWdlKQorCQlzZXRfYWxpYXNlZF9wcm90 KGxkdCArIGksIFBBR0VfS0VSTkVMKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3NldF9sZHQoY29u c3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgZW50cmllcykKK3sKKwlzdHJ1Y3QgbW11ZXh0X29wICpv cDsKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jcyA9IHhlbl9tY19lbnRyeShzaXplb2YoKm9w KSk7CisKKwl0cmFjZV94ZW5fY3B1X3NldF9sZHQoYWRkciwgZW50cmllcyk7CisKKwlvcCA9IG1j cy5hcmdzOworCW9wLT5jbWQgPSBNTVVFWFRfU0VUX0xEVDsKKwlvcC0+YXJnMS5saW5lYXJfYWRk ciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJb3AtPmFyZzIubnJfZW50cyA9IGVudHJpZXM7CisK KwlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwgMSwgTlVMTCwgRE9NSURfU0VMRik7CisKKwl4 ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fbG9h ZF9nZHQoY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkdHIpCit7CisJdW5zaWduZWQgbG9uZyB2YSA9 IGR0ci0+YWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGR0ci0+c2l6ZSArIDE7CisJdW5z aWduZWQgcGFnZXMgPSBESVZfUk9VTkRfVVAoc2l6ZSwgUEFHRV9TSVpFKTsKKwl1bnNpZ25lZCBs b25nIGZyYW1lc1twYWdlc107CisJaW50IGY7CisKKwkvKgorCSAqIEEgR0RUIGNhbiBiZSB1cCB0 byA2NGsgaW4gc2l6ZSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gODE5MgorCSAqIDgtYnl0ZSBlbnRy aWVzLCBvciAxNiA0ayBwYWdlcy4uCisJICovCisKKwlCVUdfT04oc2l6ZSA+IDY1NTM2KTsKKwlC VUdfT04odmEgJiB+UEFHRV9NQVNLKTsKKworCWZvciAoZiA9IDA7IHZhIDwgZHRyLT5hZGRyZXNz ICsgc2l6ZTsgdmEgKz0gUEFHRV9TSVpFLCBmKyspIHsKKwkJaW50IGxldmVsOworCQlwdGVfdCAq cHRlcDsKKwkJdW5zaWduZWQgbG9uZyBwZm4sIG1mbjsKKwkJdm9pZCAqdmlydDsKKworCQkvKgor CQkgKiBUaGUgR0RUIGlzIHBlci1jcHUgYW5kIGlzIGluIHRoZSBwZXJjcHUgZGF0YSBhcmVhLgor CQkgKiBUaGF0IGNhbiBiZSB2aXJ0dWFsbHkgbWFwcGVkLCBzbyB3ZSBuZWVkIHRvIGRvIGEKKwkJ ICogcGFnZS13YWxrIHRvIGdldCB0aGUgdW5kZXJseWluZyBNRk4gZm9yIHRoZQorCQkgKiBoeXBl cmNhbGwuICBUaGUgcGFnZSBjYW4gYWxzbyBiZSBpbiB0aGUga2VybmVsJ3MKKwkJICogbGluZWFy IHJhbmdlLCBzbyB3ZSBuZWVkIHRvIFJPIHRoYXQgbWFwcGluZyB0b28uCisJCSAqLworCQlwdGVw ID0gbG9va3VwX2FkZHJlc3ModmEsICZsZXZlbCk7CisJCUJVR19PTihwdGVwID09IE5VTEwpOwor CisJCXBmbiA9IHB0ZV9wZm4oKnB0ZXApOworCQltZm4gPSBwZm5fdG9fbWZuKHBmbik7CisJCXZp cnQgPSBfX3ZhKFBGTl9QSFlTKHBmbikpOworCisJCWZyYW1lc1tmXSA9IG1mbjsKKworCQltYWtl X2xvd21lbV9wYWdlX3JlYWRvbmx5KCh2b2lkICopdmEpOworCQltYWtlX2xvd21lbV9wYWdlX3Jl YWRvbmx5KHZpcnQpOworCX0KKworCWlmIChIWVBFUlZJU09SX3NldF9nZHQoZnJhbWVzLCBzaXpl IC8gc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCkpKQorCQlCVUcoKTsKK30KKworLyoKKyAqIGxv YWRfZ2R0IGZvciBlYXJseSBib290LCB3aGVuIHRoZSBnZHQgaXMgb25seSBtYXBwZWQgb25jZQor ICovCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2xvYWRfZ2R0X2Jvb3QoY29uc3Qgc3RydWN0IGRl c2NfcHRyICpkdHIpCit7CisJdW5zaWduZWQgbG9uZyB2YSA9IGR0ci0+YWRkcmVzczsKKwl1bnNp Z25lZCBpbnQgc2l6ZSA9IGR0ci0+c2l6ZSArIDE7CisJdW5zaWduZWQgcGFnZXMgPSBESVZfUk9V TkRfVVAoc2l6ZSwgUEFHRV9TSVpFKTsKKwl1bnNpZ25lZCBsb25nIGZyYW1lc1twYWdlc107CisJ aW50IGY7CisKKwkvKgorCSAqIEEgR0RUIGNhbiBiZSB1cCB0byA2NGsgaW4gc2l6ZSwgd2hpY2gg Y29ycmVzcG9uZHMgdG8gODE5MgorCSAqIDgtYnl0ZSBlbnRyaWVzLCBvciAxNiA0ayBwYWdlcy4u CisJICovCisKKwlCVUdfT04oc2l6ZSA+IDY1NTM2KTsKKwlCVUdfT04odmEgJiB+UEFHRV9NQVNL KTsKKworCWZvciAoZiA9IDA7IHZhIDwgZHRyLT5hZGRyZXNzICsgc2l6ZTsgdmEgKz0gUEFHRV9T SVpFLCBmKyspIHsKKwkJcHRlX3QgcHRlOworCQl1bnNpZ25lZCBsb25nIHBmbiwgbWZuOworCisJ CXBmbiA9IHZpcnRfdG9fcGZuKHZhKTsKKwkJbWZuID0gcGZuX3RvX21mbihwZm4pOworCisJCXB0 ZSA9IHBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTF9STyk7CisKKwkJaWYgKEhZUEVSVklTT1JfdXBk YXRlX3ZhX21hcHBpbmcoKHVuc2lnbmVkIGxvbmcpdmEsIHB0ZSwgMCkpCisJCQlCVUcoKTsKKwor CQlmcmFtZXNbZl0gPSBtZm47CisJfQorCisJaWYgKEhZUEVSVklTT1Jfc2V0X2dkdChmcmFtZXMs IHNpemUgLyBzaXplb2Yoc3RydWN0IGRlc2Nfc3RydWN0KSkpCisJCUJVRygpOworfQorCitzdGF0 aWMgaW5saW5lIGJvb2wgZGVzY19lcXVhbChjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmQxLAor CQkJICAgICAgY29uc3Qgc3RydWN0IGRlc2Nfc3RydWN0ICpkMikKK3sKKwlyZXR1cm4gZDEtPmEg PT0gZDItPmEgJiYgZDEtPmIgPT0gZDItPmI7Cit9CisKK3N0YXRpYyB2b2lkIGxvYWRfVExTX2Rl c2NyaXB0b3Ioc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnQsCisJCQkJdW5zaWduZWQgaW50IGNwdSwg dW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IGRlc2Nfc3RydWN0ICpzaGFkb3cgPSAmcGVyX2Nw dShzaGFkb3dfdGxzX2Rlc2MsIGNwdSkuZGVzY1tpXTsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdk dDsKKwl4bWFkZHJfdCBtYWRkcjsKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jOworCisJaWYg KGRlc2NfZXF1YWwoc2hhZG93LCAmdC0+dGxzX2FycmF5W2ldKSkKKwkJcmV0dXJuOworCisJKnNo YWRvdyA9IHQtPnRsc19hcnJheVtpXTsKKworCWdkdCA9IGdldF9jcHVfZ2R0X3RhYmxlKGNwdSk7 CisJbWFkZHIgPSBhcmJpdHJhcnlfdmlydF90b19tYWNoaW5lKCZnZHRbR0RUX0VOVFJZX1RMU19N SU4raV0pOworCW1jID0gX194ZW5fbWNfZW50cnkoMCk7CisKKwlNVUxUSV91cGRhdGVfZGVzY3Jp cHRvcihtYy5tYywgbWFkZHIubWFkZHIsIHQtPnRsc19hcnJheVtpXSk7Cit9CisKK3N0YXRpYyB2 b2lkIHhlbl9sb2FkX3RscyhzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwgdW5zaWduZWQgaW50IGNw dSkKK3sKKwkvKgorCSAqIFhYWCBzbGVhenkgaGFjazogSWYgd2UncmUgYmVpbmcgY2FsbGVkIGlu IGEgbGF6eS1jcHUgem9uZQorCSAqIGFuZCBsYXp5IGdzIGhhbmRsaW5nIGlzIGVuYWJsZWQsIGl0 IG1lYW5zIHdlJ3JlIGluIGEKKwkgKiBjb250ZXh0IHN3aXRjaCwgYW5kICVncyBoYXMganVzdCBi ZWVuIHNhdmVkLiAgVGhpcyBtZWFucyB3ZQorCSAqIGNhbiB6ZXJvIGl0IG91dCB0byBwcmV2ZW50 IGZhdWx0cyBvbiBleGl0IGZyb20gdGhlCisJICogaHlwZXJ2aXNvciBpZiB0aGUgbmV4dCBwcm9j ZXNzIGhhcyBubyAlZ3MuICBFaXRoZXIgd2F5LCBpdAorCSAqIGhhcyBiZWVuIHNhdmVkLCBhbmQg dGhlIG5ldyB2YWx1ZSB3aWxsIGdldCBsb2FkZWQgcHJvcGVybHkuCisJICogVGhpcyB3aWxsIGdv IGF3YXkgYXMgc29vbiBhcyBYZW4gaGFzIGJlZW4gbW9kaWZpZWQgdG8gbm90CisJICogc2F2ZS9y ZXN0b3JlICVncyBmb3Igbm9ybWFsIGh5cGVyY2FsbHMuCisJICoKKwkgKiBPbiB4ODZfNjQsIHRo aXMgaGFjayBpcyBub3QgdXNlZCBmb3IgJWdzLCBiZWNhdXNlIGdzIHBvaW50cworCSAqIHRvIEtF Uk5FTF9HU19CQVNFIChhbmQgdXNlcyBpdCBmb3IgUERBIHJlZmVyZW5jZXMpLCBzbyB3ZQorCSAq IG11c3Qgbm90IHplcm8gJWdzIG9uIHg4Nl82NAorCSAqCisJICogRm9yIHg4Nl82NCwgd2UgbmVl ZCB0byB6ZXJvICVmcywgb3RoZXJ3aXNlIHdlIG1heSBnZXQgYW4KKwkgKiBleGNlcHRpb24gYmV0 d2VlbiB0aGUgbmV3ICVmcyBkZXNjcmlwdG9yIGJlaW5nIGxvYWRlZCBhbmQKKwkgKiAlZnMgYmVp bmcgZWZmZWN0aXZlbHkgY2xlYXJlZCBhdCBfX3N3aXRjaF90bygpLgorCSAqLworCWlmIChwYXJh dmlydF9nZXRfbGF6eV9tb2RlKCkgPT0gUEFSQVZJUlRfTEFaWV9DUFUpIHsKKyNpZmRlZiBDT05G SUdfWDg2XzMyCisJCWxhenlfbG9hZF9ncygwKTsKKyNlbHNlCisJCWxvYWRzZWdtZW50KGZzLCAw KTsKKyNlbmRpZgorCX0KKworCXhlbl9tY19iYXRjaCgpOworCisJbG9hZF9UTFNfZGVzY3JpcHRv cih0LCBjcHUsIDApOworCWxvYWRfVExTX2Rlc2NyaXB0b3IodCwgY3B1LCAxKTsKKwlsb2FkX1RM U19kZXNjcmlwdG9yKHQsIGNwdSwgMik7CisKKwl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9D UFUpOworfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorc3RhdGljIHZvaWQgeGVuX2xvYWRfZ3Nf aW5kZXgodW5zaWduZWQgaW50IGlkeCkKK3sKKwlpZiAoSFlQRVJWSVNPUl9zZXRfc2VnbWVudF9i YXNlKFNFR0JBU0VfR1NfVVNFUl9TRUwsIGlkeCkpCisJCUJVRygpOworfQorI2VuZGlmCisKK3N0 YXRpYyB2b2lkIHhlbl93cml0ZV9sZHRfZW50cnkoc3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50 IGVudHJ5bnVtLAorCQkJCWNvbnN0IHZvaWQgKnB0cikKK3sKKwl4bWFkZHJfdCBtYWNoX2xwID0g YXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZSgmZHRbZW50cnludW1dKTsKKwl1NjQgZW50cnkgPSAq KHU2NCAqKXB0cjsKKworCXRyYWNlX3hlbl9jcHVfd3JpdGVfbGR0X2VudHJ5KGR0LCBlbnRyeW51 bSwgZW50cnkpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwl4ZW5fbWNfZmx1c2goKTsKKwlp ZiAoSFlQRVJWSVNPUl91cGRhdGVfZGVzY3JpcHRvcihtYWNoX2xwLm1hZGRyLCBlbnRyeSkpCisJ CUJVRygpOworCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworc3RhdGljIGludCBjdnRfZ2F0ZV90 b190cmFwKGludCB2ZWN0b3IsIGNvbnN0IGdhdGVfZGVzYyAqdmFsLAorCQkJICAgIHN0cnVjdCB0 cmFwX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQgbG9uZyBhZGRyOworCisJaWYgKHZhbC0+dHlw ZSAhPSBHQVRFX1RSQVAgJiYgdmFsLT50eXBlICE9IEdBVEVfSU5URVJSVVBUKQorCQlyZXR1cm4g MDsKKworCWluZm8tPnZlY3RvciA9IHZlY3RvcjsKKworCWFkZHIgPSBnYXRlX29mZnNldCgqdmFs KTsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLyoKKwkgKiBMb29rIGZvciBrbm93biB0cmFwcyB1 c2luZyBJU1QsIGFuZCBzdWJzdGl0dXRlIHRoZW0KKwkgKiBhcHByb3ByaWF0ZWx5LiAgVGhlIGRl YnVnZ2VyIG9uZXMgYXJlIHRoZSBvbmx5IG9uZXMgd2UgY2FyZQorCSAqIGFib3V0LiAgWGVuIHdp bGwgaGFuZGxlIGZhdWx0cyBsaWtlIGRvdWJsZV9mYXVsdCwKKwkgKiBzbyB3ZSBzaG91bGQgbmV2 ZXIgc2VlIHRoZW0uICBXYXJuIGlmCisJICogdGhlcmUncyBhbiB1bmV4cGVjdGVkIElTVC11c2lu ZyBmYXVsdCBoYW5kbGVyLgorCSAqLworCWlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKWRlYnVn KQorCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpeGVuX2RlYnVnOworCWVsc2UgaWYgKGFkZHIgPT0g KHVuc2lnbmVkIGxvbmcpaW50MykKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKXhlbl9pbnQzOwor CWVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpc3RhY2tfc2VnbWVudCkKKwkJYWRkciA9 ICh1bnNpZ25lZCBsb25nKXhlbl9zdGFja19zZWdtZW50OworCWVsc2UgaWYgKGFkZHIgPT0gKHVu c2lnbmVkIGxvbmcpZG91YmxlX2ZhdWx0KSB7CisJCS8qIERvbid0IG5lZWQgdG8gaGFuZGxlIHRo ZXNlICovCisJCXJldHVybiAwOworI2lmZGVmIENPTkZJR19YODZfTUNFCisJfSBlbHNlIGlmIChh ZGRyID09ICh1bnNpZ25lZCBsb25nKW1hY2hpbmVfY2hlY2spIHsKKwkJLyoKKwkJICogd2hlbiB4 ZW4gaHlwZXJ2aXNvciBpbmplY3Qgdk1DRSB0byBndWVzdCwKKwkJICogdXNlIG5hdGl2ZSBtY2Ug aGFuZGxlciB0byBoYW5kbGUgaXQKKwkJICovCisJCTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoYWRk ciA9PSAodW5zaWduZWQgbG9uZylubWkpCisJCS8qCisJCSAqIFVzZSB0aGUgbmF0aXZlIHZlcnNp b24gYXMgd2VsbC4KKwkJICovCisJCTsKKwllbHNlIHsKKwkJLyogU29tZSBvdGhlciB0cmFwIHVz aW5nIElTVD8gKi8KKwkJaWYgKFdBUk5fT04odmFsLT5pc3QgIT0gMCkpCisJCQlyZXR1cm4gMDsK Kwl9CisjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLworCWluZm8tPmFkZHJlc3MgPSBhZGRyOwor CisJaW5mby0+Y3MgPSBnYXRlX3NlZ21lbnQoKnZhbCk7CisJaW5mby0+ZmxhZ3MgPSB2YWwtPmRw bDsKKwkvKiBpbnRlcnJ1cHQgZ2F0ZXMgY2xlYXIgSUYgKi8KKwlpZiAodmFsLT50eXBlID09IEdB VEVfSU5URVJSVVBUKQorCQlpbmZvLT5mbGFncyB8PSAxIDw8IDI7CisKKwlyZXR1cm4gMTsKK30K KworLyogTG9jYXRpb25zIG9mIGVhY2ggQ1BVJ3MgSURUICovCitzdGF0aWMgREVGSU5FX1BFUl9D UFUoc3RydWN0IGRlc2NfcHRyLCBpZHRfZGVzYyk7CisKKy8qIFNldCBhbiBJRFQgZW50cnkuICBJ ZiB0aGUgZW50cnkgaXMgcGFydCBvZiB0aGUgY3VycmVudCBJRFQsIHRoZW4KKyAgIGFsc28gdXBk YXRlIFhlbi4gKi8KK3N0YXRpYyB2b2lkIHhlbl93cml0ZV9pZHRfZW50cnkoZ2F0ZV9kZXNjICpk dCwgaW50IGVudHJ5bnVtLCBjb25zdCBnYXRlX2Rlc2MgKmcpCit7CisJdW5zaWduZWQgbG9uZyBw ID0gKHVuc2lnbmVkIGxvbmcpJmR0W2VudHJ5bnVtXTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBl bmQ7CisKKwl0cmFjZV94ZW5fY3B1X3dyaXRlX2lkdF9lbnRyeShkdCwgZW50cnludW0sIGcpOwor CisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlzdGFydCA9IF9fdGhpc19jcHVfcmVhZChpZHRfZGVz Yy5hZGRyZXNzKTsKKwllbmQgPSBzdGFydCArIF9fdGhpc19jcHVfcmVhZChpZHRfZGVzYy5zaXpl KSArIDE7CisKKwl4ZW5fbWNfZmx1c2goKTsKKworCW5hdGl2ZV93cml0ZV9pZHRfZW50cnkoZHQs IGVudHJ5bnVtLCBnKTsKKworCWlmIChwID49IHN0YXJ0ICYmIChwICsgOCkgPD0gZW5kKSB7CisJ CXN0cnVjdCB0cmFwX2luZm8gaW5mb1syXTsKKworCQlpbmZvWzFdLmFkZHJlc3MgPSAwOworCisJ CWlmIChjdnRfZ2F0ZV90b190cmFwKGVudHJ5bnVtLCBnLCAmaW5mb1swXSkpCisJCQlpZiAoSFlQ RVJWSVNPUl9zZXRfdHJhcF90YWJsZShpbmZvKSkKKwkJCQlCVUcoKTsKKwl9CisKKwlwcmVlbXB0 X2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fY29udmVydF90cmFwX2luZm8oY29uc3Qg c3RydWN0IGRlc2NfcHRyICpkZXNjLAorCQkJCSAgc3RydWN0IHRyYXBfaW5mbyAqdHJhcHMpCit7 CisJdW5zaWduZWQgaW4sIG91dCwgY291bnQ7CisKKwljb3VudCA9IChkZXNjLT5zaXplKzEpIC8g c2l6ZW9mKGdhdGVfZGVzYyk7CisJQlVHX09OKGNvdW50ID4gMjU2KTsKKworCWZvciAoaW4gPSBv dXQgPSAwOyBpbiA8IGNvdW50OyBpbisrKSB7CisJCWdhdGVfZGVzYyAqZW50cnkgPSAoZ2F0ZV9k ZXNjICopKGRlc2MtPmFkZHJlc3MpICsgaW47CisKKwkJaWYgKGN2dF9nYXRlX3RvX3RyYXAoaW4s IGVudHJ5LCAmdHJhcHNbb3V0XSkpCisJCQlvdXQrKzsKKwl9CisJdHJhcHNbb3V0XS5hZGRyZXNz ID0gMDsKK30KKwordm9pZCB4ZW5fY29weV90cmFwX2luZm8oc3RydWN0IHRyYXBfaW5mbyAqdHJh cHMpCit7CisJY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkZXNjID0gdGhpc19jcHVfcHRyKCZpZHRf ZGVzYyk7CisKKwl4ZW5fY29udmVydF90cmFwX2luZm8oZGVzYywgdHJhcHMpOworfQorCisvKiBM b2FkIGEgbmV3IElEVCBpbnRvIFhlbi4gIEluIHByaW5jaXBsZSB0aGlzIGNhbiBiZSBwZXItQ1BV LCBzbyB3ZQorICAgaG9sZCBhIHNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHN0YXRpYyB0cmFwc1td IGFycmF5IChzdGF0aWMgYmVjYXVzZQorICAgaXQgYXZvaWRzIGFsbG9jYXRpb24sIGFuZCBzYXZl cyBzdGFjayBzcGFjZSkuICovCitzdGF0aWMgdm9pZCB4ZW5fbG9hZF9pZHQoY29uc3Qgc3RydWN0 IGRlc2NfcHRyICpkZXNjKQoreworCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7CisJc3Rh dGljIHN0cnVjdCB0cmFwX2luZm8gdHJhcHNbMjU3XTsKKworCXRyYWNlX3hlbl9jcHVfbG9hZF9p ZHQoZGVzYyk7CisKKwlzcGluX2xvY2soJmxvY2spOworCisJbWVtY3B5KHRoaXNfY3B1X3B0cigm aWR0X2Rlc2MpLCBkZXNjLCBzaXplb2YoaWR0X2Rlc2MpKTsKKworCXhlbl9jb252ZXJ0X3RyYXBf aW5mbyhkZXNjLCB0cmFwcyk7CisKKwl4ZW5fbWNfZmx1c2goKTsKKwlpZiAoSFlQRVJWSVNPUl9z ZXRfdHJhcF90YWJsZSh0cmFwcykpCisJCUJVRygpOworCisJc3Bpbl91bmxvY2soJmxvY2spOwor fQorCisvKiBXcml0ZSBhIEdEVCBkZXNjcmlwdG9yIGVudHJ5LiAgSWdub3JlIExEVCBkZXNjcmlw dG9ycywgc2luY2UKKyAgIHRoZXkncmUgaGFuZGxlZCBkaWZmZXJlbnRseS4gKi8KK3N0YXRpYyB2 b2lkIHhlbl93cml0ZV9nZHRfZW50cnkoc3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVudHJ5 LAorCQkJCWNvbnN0IHZvaWQgKmRlc2MsIGludCB0eXBlKQoreworCXRyYWNlX3hlbl9jcHVfd3Jp dGVfZ2R0X2VudHJ5KGR0LCBlbnRyeSwgZGVzYywgdHlwZSk7CisKKwlwcmVlbXB0X2Rpc2FibGUo KTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgREVTQ19MRFQ6CisJY2FzZSBERVNDX1RTUzoK KwkJLyogaWdub3JlICovCisJCWJyZWFrOworCisJZGVmYXVsdDogeworCQl4bWFkZHJfdCBtYWRk ciA9IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUoJmR0W2VudHJ5XSk7CisKKwkJeGVuX21jX2Zs dXNoKCk7CisJCWlmIChIWVBFUlZJU09SX3VwZGF0ZV9kZXNjcmlwdG9yKG1hZGRyLm1hZGRyLCAq KHU2NCAqKWRlc2MpKQorCQkJQlVHKCk7CisJfQorCisJfQorCisJcHJlZW1wdF9lbmFibGUoKTsK K30KKworLyoKKyAqIFZlcnNpb24gb2Ygd3JpdGVfZ2R0X2VudHJ5IGZvciB1c2UgYXQgZWFybHkg Ym9vdC10aW1lIG5lZWRlZCB0bworICogdXBkYXRlIGFuIGVudHJ5IGFzIHNpbXBseSBhcyBwb3Nz aWJsZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHhlbl93cml0ZV9nZHRfZW50cnlfYm9vdChz dHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LCBpbnQgZW50cnksCisJCQkJCSAgICBjb25zdCB2b2lkICpk ZXNjLCBpbnQgdHlwZSkKK3sKKwl0cmFjZV94ZW5fY3B1X3dyaXRlX2dkdF9lbnRyeShkdCwgZW50 cnksIGRlc2MsIHR5cGUpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBERVNDX0xEVDoKKwlj YXNlIERFU0NfVFNTOgorCQkvKiBpZ25vcmUgKi8KKwkJYnJlYWs7CisKKwlkZWZhdWx0OiB7CisJ CXhtYWRkcl90IG1hZGRyID0gdmlydF90b19tYWNoaW5lKCZkdFtlbnRyeV0pOworCisJCWlmIChI WVBFUlZJU09SX3VwZGF0ZV9kZXNjcmlwdG9yKG1hZGRyLm1hZGRyLCAqKHU2NCAqKWRlc2MpKQor CQkJZHRbZW50cnldID0gKihzdHJ1Y3QgZGVzY19zdHJ1Y3QgKilkZXNjOworCX0KKworCX0KK30K Kworc3RhdGljIHZvaWQgeGVuX2xvYWRfc3AwKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsCisJCQkg c3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCkKK3sKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNl IG1jczsKKworCW1jcyA9IHhlbl9tY19lbnRyeSgwKTsKKwlNVUxUSV9zdGFja19zd2l0Y2gobWNz Lm1jLCBfX0tFUk5FTF9EUywgdGhyZWFkLT5zcDApOworCXhlbl9tY19pc3N1ZShQQVJBVklSVF9M QVpZX0NQVSk7CisJdHNzLT54ODZfdHNzLnNwMCA9IHRocmVhZC0+c3AwOworfQorCit2b2lkIHhl bl9zZXRfaW9wbF9tYXNrKHVuc2lnbmVkIG1hc2spCit7CisJc3RydWN0IHBoeXNkZXZfc2V0X2lv cGwgc2V0X2lvcGw7CisKKwkvKiBGb3JjZSB0aGUgY2hhbmdlIGF0IHJpbmcgMC4gKi8KKwlzZXRf aW9wbC5pb3BsID0gKG1hc2sgPT0gMCkgPyAxIDogKG1hc2sgPj4gMTIpICYgMzsKKwlIWVBFUlZJ U09SX3BoeXNkZXZfb3AoUEhZU0RFVk9QX3NldF9pb3BsLCAmc2V0X2lvcGwpOworfQorCitzdGF0 aWMgdm9pZCB4ZW5faW9fZGVsYXkodm9pZCkKK3sKK30KKworc3RhdGljIERFRklORV9QRVJfQ1BV KHVuc2lnbmVkIGxvbmcsIHhlbl9jcjBfdmFsdWUpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4 ZW5fcmVhZF9jcjAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyMCA9IHRoaXNfY3B1X3JlYWQo eGVuX2NyMF92YWx1ZSk7CisKKwlpZiAodW5saWtlbHkoY3IwID09IDApKSB7CisJCWNyMCA9IG5h dGl2ZV9yZWFkX2NyMCgpOworCQl0aGlzX2NwdV93cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjApOwor CX0KKworCXJldHVybiBjcjA7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl93cml0ZV9jcjAodW5zaWdu ZWQgbG9uZyBjcjApCit7CisJc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7CisKKwl0aGlzX2Nw dV93cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjApOworCisJLyogT25seSBwYXkgYXR0ZW50aW9uIHRv IGNyMC5UUzsgZXZlcnl0aGluZyBlbHNlIGlzCisJICAgaWdub3JlZC4gKi8KKwltY3MgPSB4ZW5f bWNfZW50cnkoMCk7CisKKwlNVUxUSV9mcHVfdGFza3N3aXRjaChtY3MubWMsIChjcjAgJiBYODZf Q1IwX1RTKSAhPSAwKTsKKworCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7Cit9CisK K3N0YXRpYyB2b2lkIHhlbl93cml0ZV9jcjQodW5zaWduZWQgbG9uZyBjcjQpCit7CisJY3I0ICY9 IH4oWDg2X0NSNF9QR0UgfCBYODZfQ1I0X1BTRSB8IFg4Nl9DUjRfUENFKTsKKworCW5hdGl2ZV93 cml0ZV9jcjQoY3I0KTsKK30KKyNpZmRlZiBDT05GSUdfWDg2XzY0CitzdGF0aWMgaW5saW5lIHVu c2lnbmVkIGxvbmcgeGVuX3JlYWRfY3I4KHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMg aW5saW5lIHZvaWQgeGVuX3dyaXRlX2NyOCh1bnNpZ25lZCBsb25nIHZhbCkKK3sKKwlCVUdfT04o dmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdTY0IHhlbl9yZWFkX21zcl9zYWZlKHVuc2lnbmVk IGludCBtc3IsIGludCAqZXJyKQoreworCXU2NCB2YWw7CisKKwlpZiAocG11X21zcl9yZWFkKG1z ciwgJnZhbCwgZXJyKSkKKwkJcmV0dXJuIHZhbDsKKworCXZhbCA9IG5hdGl2ZV9yZWFkX21zcl9z YWZlKG1zciwgZXJyKTsKKwlzd2l0Y2ggKG1zcikgeworCWNhc2UgTVNSX0lBMzJfQVBJQ0JBU0U6 CisjaWZkZWYgQ09ORklHX1g4Nl9YMkFQSUMKKwkJaWYgKCEoY3B1aWRfZWN4KDEpICYgKDEgPDwg KFg4Nl9GRUFUVVJFX1gyQVBJQyAmIDMxKSkpKQorI2VuZGlmCisJCQl2YWwgJj0gflgyQVBJQ19F TkFCTEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gdmFsOworfQorCitzdGF0aWMgaW50IHhlbl93 cml0ZV9tc3Jfc2FmZSh1bnNpZ25lZCBpbnQgbXNyLCB1bnNpZ25lZCBsb3csIHVuc2lnbmVkIGhp Z2gpCit7CisJaW50IHJldDsKKworCXJldCA9IDA7CisKKwlzd2l0Y2ggKG1zcikgeworI2lmZGVm IENPTkZJR19YODZfNjQKKwkJdW5zaWduZWQgd2hpY2g7CisJCXU2NCBiYXNlOworCisJY2FzZSBN U1JfRlNfQkFTRToJCXdoaWNoID0gU0VHQkFTRV9GUzsgZ290byBzZXQ7CisJY2FzZSBNU1JfS0VS TkVMX0dTX0JBU0U6CXdoaWNoID0gU0VHQkFTRV9HU19VU0VSOyBnb3RvIHNldDsKKwljYXNlIE1T Ul9HU19CQVNFOgkJd2hpY2ggPSBTRUdCQVNFX0dTX0tFUk5FTDsgZ290byBzZXQ7CisKKwlzZXQ6 CisJCWJhc2UgPSAoKHU2NCloaWdoIDw8IDMyKSB8IGxvdzsKKwkJaWYgKEhZUEVSVklTT1Jfc2V0 X3NlZ21lbnRfYmFzZSh3aGljaCwgYmFzZSkgIT0gMCkKKwkJCXJldCA9IC1FSU87CisJCWJyZWFr OworI2VuZGlmCisKKwljYXNlIE1TUl9TVEFSOgorCWNhc2UgTVNSX0NTVEFSOgorCWNhc2UgTVNS X0xTVEFSOgorCWNhc2UgTVNSX1NZU0NBTExfTUFTSzoKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVS X0NTOgorCWNhc2UgTVNSX0lBMzJfU1lTRU5URVJfRVNQOgorCWNhc2UgTVNSX0lBMzJfU1lTRU5U RVJfRUlQOgorCQkvKiBGYXN0IHN5c2NhbGwgc2V0dXAgaXMgYWxsIGRvbmUgaW4gaHlwZXJjYWxs cywgc28KKwkJICAgdGhlc2UgYXJlIGFsbCBpZ25vcmVkLiAgU3R1YiB0aGVtIG91dCBoZXJlIHRv IHN0b3AKKwkJICAgWGVuIGNvbnNvbGUgbm9pc2UuICovCisJCWJyZWFrOworCisJZGVmYXVsdDoK KwkJaWYgKCFwbXVfbXNyX3dyaXRlKG1zciwgbG93LCBoaWdoLCAmcmV0KSkKKwkJCXJldCA9IG5h dGl2ZV93cml0ZV9tc3Jfc2FmZShtc3IsIGxvdywgaGlnaCk7CisJfQorCisJcmV0dXJuIHJldDsK K30KKworc3RhdGljIHU2NCB4ZW5fcmVhZF9tc3IodW5zaWduZWQgaW50IG1zcikKK3sKKwkvKgor CSAqIFRoaXMgd2lsbCBzaWxlbnRseSBzd2FsbG93IGEgI0dQIGZyb20gUkRNU1IuICBJdCBtYXkg YmUgd29ydGgKKwkgKiBjaGFuZ2luZyB0aGF0LgorCSAqLworCWludCBlcnI7CisKKwlyZXR1cm4g eGVuX3JlYWRfbXNyX3NhZmUobXNyLCAmZXJyKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3dyaXRl X21zcih1bnNpZ25lZCBpbnQgbXNyLCB1bnNpZ25lZCBsb3csIHVuc2lnbmVkIGhpZ2gpCit7CisJ LyoKKwkgKiBUaGlzIHdpbGwgc2lsZW50bHkgc3dhbGxvdyBhICNHUCBmcm9tIFdSTVNSLiAgSXQg bWF5IGJlIHdvcnRoCisJICogY2hhbmdpbmcgdGhhdC4KKwkgKi8KKwl4ZW5fd3JpdGVfbXNyX3Nh ZmUobXNyLCBsb3csIGhpZ2gpOworfQorCit2b2lkIHhlbl9zZXR1cF9zaGFyZWRfaW5mbyh2b2lk KQoreworCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkp IHsKKwkJc2V0X2ZpeG1hcChGSVhfUEFSQVZJUlRfQk9PVE1BUCwKKwkJCSAgIHhlbl9zdGFydF9p bmZvLT5zaGFyZWRfaW5mbyk7CisKKwkJSFlQRVJWSVNPUl9zaGFyZWRfaW5mbyA9CisJCQkoc3Ry dWN0IHNoYXJlZF9pbmZvICopZml4X3RvX3ZpcnQoRklYX1BBUkFWSVJUX0JPT1RNQVApOworCX0g ZWxzZQorCQlIWVBFUlZJU09SX3NoYXJlZF9pbmZvID0KKwkJCShzdHJ1Y3Qgc2hhcmVkX2luZm8g KilfX3ZhKHhlbl9zdGFydF9pbmZvLT5zaGFyZWRfaW5mbyk7CisKKyNpZm5kZWYgQ09ORklHX1NN UAorCS8qIEluIFVQIHRoaXMgaXMgYXMgZ29vZCBhIHBsYWNlIGFzIGFueSB0byBzZXQgdXAgc2hh cmVkIGluZm8gKi8KKwl4ZW5fc2V0dXBfdmNwdV9pbmZvX3BsYWNlbWVudCgpOworI2VuZGlmCisK Kwl4ZW5fc2V0dXBfbWZuX2xpc3RfbGlzdCgpOworfQorCisvKiBUaGlzIGlzIGNhbGxlZCBvbmNl IHdlIGhhdmUgdGhlIGNwdV9wb3NzaWJsZV9tYXNrICovCit2b2lkIHhlbl9zZXR1cF92Y3B1X2lu Zm9fcGxhY2VtZW50KHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2Nw dShjcHUpIHsKKwkJLyogU2V0IHVwIGRpcmVjdCB2Q1BVIGlkIG1hcHBpbmcgZm9yIFBWIGd1ZXN0 cy4gKi8KKwkJcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KSA9IGNwdTsKKwkJeGVuX3ZjcHVfc2V0 dXAoY3B1KTsKKwl9CisKKwkvKgorCSAqIHhlbl92Y3B1X3NldHVwIG1hbmFnZWQgdG8gcGxhY2Ug dGhlIHZjcHVfaW5mbyB3aXRoaW4gdGhlCisJICogcGVyY3B1IGFyZWEgZm9yIGFsbCBjcHVzLCBz byBtYWtlIHVzZSBvZiBpdC4KKwkgKi8KKwlpZiAoeGVuX2hhdmVfdmNwdV9pbmZvX3BsYWNlbWVu dCkgeworCQlwdl9pcnFfb3BzLnNhdmVfZmwgPSBfX1BWX0lTX0NBTExFRV9TQVZFKHhlbl9zYXZl X2ZsX2RpcmVjdCk7CisJCXB2X2lycV9vcHMucmVzdG9yZV9mbCA9IF9fUFZfSVNfQ0FMTEVFX1NB VkUoeGVuX3Jlc3RvcmVfZmxfZGlyZWN0KTsKKwkJcHZfaXJxX29wcy5pcnFfZGlzYWJsZSA9IF9f UFZfSVNfQ0FMTEVFX1NBVkUoeGVuX2lycV9kaXNhYmxlX2RpcmVjdCk7CisJCXB2X2lycV9vcHMu aXJxX2VuYWJsZSA9IF9fUFZfSVNfQ0FMTEVFX1NBVkUoeGVuX2lycV9lbmFibGVfZGlyZWN0KTsK KwkJcHZfbW11X29wcy5yZWFkX2NyMiA9IHhlbl9yZWFkX2NyMl9kaXJlY3Q7CisJfQorfQorCitz dGF0aWMgdW5zaWduZWQgeGVuX3BhdGNoKHU4IHR5cGUsIHUxNiBjbG9iYmVycywgdm9pZCAqaW5z bmJ1ZiwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsZW4pCit7CisJY2hhciAq c3RhcnQsICplbmQsICpyZWxvYzsKKwl1bnNpZ25lZCByZXQ7CisKKwlzdGFydCA9IGVuZCA9IHJl bG9jID0gTlVMTDsKKworI2RlZmluZSBTSVRFKG9wLCB4KQkJCQkJCQlcCisJY2FzZSBQQVJBVklS VF9QQVRDSChvcC54KToJCQkJCVwKKwlpZiAoeGVuX2hhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCkg ewkJCQlcCisJCXN0YXJ0ID0gKGNoYXIgKil4ZW5fIyN4IyNfZGlyZWN0OwkJCVwKKwkJZW5kID0g eGVuXyMjeCMjX2RpcmVjdF9lbmQ7CQkJCVwKKwkJcmVsb2MgPSB4ZW5fIyN4IyNfZGlyZWN0X3Jl bG9jOwkJCQlcCisJfQkJCQkJCQkJXAorCWdvdG8gcGF0Y2hfc2l0ZQorCisJc3dpdGNoICh0eXBl KSB7CisJCVNJVEUocHZfaXJxX29wcywgaXJxX2VuYWJsZSk7CisJCVNJVEUocHZfaXJxX29wcywg aXJxX2Rpc2FibGUpOworCQlTSVRFKHB2X2lycV9vcHMsIHNhdmVfZmwpOworCQlTSVRFKHB2X2ly cV9vcHMsIHJlc3RvcmVfZmwpOworI3VuZGVmIFNJVEUKKworCXBhdGNoX3NpdGU6CisJCWlmIChz dGFydCA9PSBOVUxMIHx8IChlbmQtc3RhcnQpID4gbGVuKQorCQkJZ290byBkZWZhdWx0X3BhdGNo OworCisJCXJldCA9IHBhcmF2aXJ0X3BhdGNoX2luc25zKGluc25idWYsIGxlbiwgc3RhcnQsIGVu ZCk7CisKKwkJLyogTm90ZTogYmVjYXVzZSByZWxvYyBpcyBhc3NpZ25lZCBmcm9tIHNvbWV0aGlu ZyB0aGF0CisJCSAgIGFwcGVhcnMgdG8gYmUgYW4gYXJyYXksIGdjYyBhc3N1bWVzIGl0J3Mgbm9u LW51bGwsCisJCSAgIGJ1dCBkb2Vzbid0IGtub3cgaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHN0YXJ0 IGFuZAorCQkgICBlbmQuICovCisJCWlmIChyZWxvYyA+IHN0YXJ0ICYmIHJlbG9jIDwgZW5kKSB7 CisJCQlpbnQgcmVsb2Nfb2ZmID0gcmVsb2MgLSBzdGFydDsKKwkJCWxvbmcgKnJlbG9jcCA9IChs b25nICopKGluc25idWYgKyByZWxvY19vZmYpOworCQkJbG9uZyBkZWx0YSA9IHN0YXJ0IC0gKGNo YXIgKilhZGRyOworCisJCQkqcmVsb2NwICs9IGRlbHRhOworCQl9CisJCWJyZWFrOworCisJZGVm YXVsdF9wYXRjaDoKKwlkZWZhdWx0OgorCQlyZXQgPSBwYXJhdmlydF9wYXRjaF9kZWZhdWx0KHR5 cGUsIGNsb2JiZXJzLCBpbnNuYnVmLAorCQkJCQkgICAgIGFkZHIsIGxlbik7CisJCWJyZWFrOwor CX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfaW5mbyB4ZW5f aW5mbyBfX2luaXRjb25zdCA9IHsKKwkuc2hhcmVkX2tlcm5lbF9wbWQgPSAwLAorCisjaWZkZWYg Q09ORklHX1g4Nl82NAorCS5leHRyYV91c2VyXzY0Yml0X2NzID0gRkxBVF9VU0VSX0NTNjQsCisj ZW5kaWYKKwkubmFtZSA9ICJYZW4iLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9pbml0 X29wcyB4ZW5faW5pdF9vcHMgX19pbml0Y29uc3QgPSB7CisJLnBhdGNoID0geGVuX3BhdGNoLAor fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9jcHVfb3BzIHhlbl9jcHVfb3BzIF9faW5pdGNv bnN0ID0geworCS5jcHVpZCA9IHhlbl9jcHVpZCwKKworCS5zZXRfZGVidWdyZWcgPSB4ZW5fc2V0 X2RlYnVncmVnLAorCS5nZXRfZGVidWdyZWcgPSB4ZW5fZ2V0X2RlYnVncmVnLAorCisJLnJlYWRf Y3IwID0geGVuX3JlYWRfY3IwLAorCS53cml0ZV9jcjAgPSB4ZW5fd3JpdGVfY3IwLAorCisJLnJl YWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAorCS53cml0ZV9jcjQgPSB4ZW5fd3JpdGVfY3I0LAor CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS5yZWFkX2NyOCA9IHhlbl9yZWFkX2NyOCwKKwkud3Jp dGVfY3I4ID0geGVuX3dyaXRlX2NyOCwKKyNlbmRpZgorCisJLndiaW52ZCA9IG5hdGl2ZV93Ymlu dmQsCisKKwkucmVhZF9tc3IgPSB4ZW5fcmVhZF9tc3IsCisJLndyaXRlX21zciA9IHhlbl93cml0 ZV9tc3IsCisKKwkucmVhZF9tc3Jfc2FmZSA9IHhlbl9yZWFkX21zcl9zYWZlLAorCS53cml0ZV9t c3Jfc2FmZSA9IHhlbl93cml0ZV9tc3Jfc2FmZSwKKworCS5yZWFkX3BtYyA9IHhlbl9yZWFkX3Bt YywKKworCS5pcmV0ID0geGVuX2lyZXQsCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS51c2VyZ3Nf c3lzcmV0NjQgPSB4ZW5fc3lzcmV0NjQsCisjZW5kaWYKKworCS5sb2FkX3RyX2Rlc2MgPSBwYXJh dmlydF9ub3AsCisJLnNldF9sZHQgPSB4ZW5fc2V0X2xkdCwKKwkubG9hZF9nZHQgPSB4ZW5fbG9h ZF9nZHQsCisJLmxvYWRfaWR0ID0geGVuX2xvYWRfaWR0LAorCS5sb2FkX3RscyA9IHhlbl9sb2Fk X3RscywKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLmxvYWRfZ3NfaW5kZXggPSB4ZW5fbG9hZF9n c19pbmRleCwKKyNlbmRpZgorCisJLmFsbG9jX2xkdCA9IHhlbl9hbGxvY19sZHQsCisJLmZyZWVf bGR0ID0geGVuX2ZyZWVfbGR0LAorCisJLnN0b3JlX2lkdCA9IG5hdGl2ZV9zdG9yZV9pZHQsCisJ LnN0b3JlX3RyID0geGVuX3N0b3JlX3RyLAorCisJLndyaXRlX2xkdF9lbnRyeSA9IHhlbl93cml0 ZV9sZHRfZW50cnksCisJLndyaXRlX2dkdF9lbnRyeSA9IHhlbl93cml0ZV9nZHRfZW50cnksCisJ LndyaXRlX2lkdF9lbnRyeSA9IHhlbl93cml0ZV9pZHRfZW50cnksCisJLmxvYWRfc3AwID0geGVu X2xvYWRfc3AwLAorCisJLnNldF9pb3BsX21hc2sgPSB4ZW5fc2V0X2lvcGxfbWFzaywKKwkuaW9f ZGVsYXkgPSB4ZW5faW9fZGVsYXksCisKKwkvKiBYZW4gdGFrZXMgY2FyZSBvZiAlZ3Mgd2hlbiBz d2l0Y2hpbmcgdG8gdXNlcm1vZGUgZm9yIHVzICovCisJLnN3YXBncyA9IHBhcmF2aXJ0X25vcCwK KworCS5zdGFydF9jb250ZXh0X3N3aXRjaCA9IHBhcmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dpdGNo LAorCS5lbmRfY29udGV4dF9zd2l0Y2ggPSB4ZW5fZW5kX2NvbnRleHRfc3dpdGNoLAorfTsKKwor c3RhdGljIHZvaWQgeGVuX3Jlc3RhcnQoY2hhciAqbXNnKQoreworCXhlbl9yZWJvb3QoU0hVVERP V05fcmVib290KTsKK30KKworc3RhdGljIHZvaWQgeGVuX21hY2hpbmVfaGFsdCh2b2lkKQorewor CXhlbl9yZWJvb3QoU0hVVERPV05fcG93ZXJvZmYpOworfQorCitzdGF0aWMgdm9pZCB4ZW5fbWFj aGluZV9wb3dlcl9vZmYodm9pZCkKK3sKKwlpZiAocG1fcG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9v ZmYoKTsKKwl4ZW5fcmVib290KFNIVVRET1dOX3Bvd2Vyb2ZmKTsKK30KKworc3RhdGljIHZvaWQg eGVuX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXhlbl9yZWJvb3Qo U0hVVERPV05fY3Jhc2gpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1hY2hpbmVfb3BzIHhl bl9tYWNoaW5lX29wcyBfX2luaXRjb25zdCA9IHsKKwkucmVzdGFydCA9IHhlbl9yZXN0YXJ0LAor CS5oYWx0ID0geGVuX21hY2hpbmVfaGFsdCwKKwkucG93ZXJfb2ZmID0geGVuX21hY2hpbmVfcG93 ZXJfb2ZmLAorCS5zaHV0ZG93biA9IHhlbl9tYWNoaW5lX2hhbHQsCisJLmNyYXNoX3NodXRkb3du ID0geGVuX2NyYXNoX3NodXRkb3duLAorCS5lbWVyZ2VuY3lfcmVzdGFydCA9IHhlbl9lbWVyZ2Vu Y3lfcmVzdGFydCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIHhlbl9nZXRfbm1pX3JlYXNv bih2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmVhc29uID0gMDsKKworCS8qIENvbnN0cnVjdCBh IHZhbHVlIHdoaWNoIGxvb2tzIGxpa2UgaXQgY2FtZSBmcm9tIHBvcnQgMHg2MS4gKi8KKwlpZiAo dGVzdF9iaXQoX1hFTl9OTUlSRUFTT05faW9fZXJyb3IsCisJCSAgICAgJkhZUEVSVklTT1Jfc2hh cmVkX2luZm8tPmFyY2gubm1pX3JlYXNvbikpCisJCXJlYXNvbiB8PSBOTUlfUkVBU09OX0lPQ0hL OworCWlmICh0ZXN0X2JpdChfWEVOX05NSVJFQVNPTl9wY2lfc2VyciwKKwkJICAgICAmSFlQRVJW SVNPUl9zaGFyZWRfaW5mby0+YXJjaC5ubWlfcmVhc29uKSkKKwkJcmVhc29uIHw9IE5NSV9SRUFT T05fU0VSUjsKKworCXJldHVybiByZWFzb247Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5f Ym9vdF9wYXJhbXNfaW5pdF9lZGQodm9pZCkKK3sKKyNpZiBJU19FTkFCTEVEKENPTkZJR19FREQp CisJc3RydWN0IHhlbl9wbGF0Zm9ybV9vcCBvcDsKKwlzdHJ1Y3QgZWRkX2luZm8gKmVkZF9pbmZv OworCXUzMiAqbWJyX3NpZ25hdHVyZTsKKwl1bnNpZ25lZCBucjsKKwlpbnQgcmV0OworCisJZWRk X2luZm8gPSBib290X3BhcmFtcy5lZGRidWY7CisJbWJyX3NpZ25hdHVyZSA9IGJvb3RfcGFyYW1z LmVkZF9tYnJfc2lnX2J1ZmZlcjsKKworCW9wLmNtZCA9IFhFTlBGX2Zpcm13YXJlX2luZm87CisK KwlvcC51LmZpcm13YXJlX2luZm8udHlwZSA9IFhFTl9GV19ESVNLX0lORk87CisJZm9yIChuciA9 IDA7IG5yIDwgRURETUFYTlI7IG5yKyspIHsKKwkJc3RydWN0IGVkZF9pbmZvICppbmZvID0gZWRk X2luZm8gKyBucjsKKworCQlvcC51LmZpcm13YXJlX2luZm8uaW5kZXggPSBucjsKKwkJaW5mby0+ cGFyYW1zLmxlbmd0aCA9IHNpemVvZihpbmZvLT5wYXJhbXMpOworCQlzZXRfeGVuX2d1ZXN0X2hh bmRsZShvcC51LmZpcm13YXJlX2luZm8udS5kaXNrX2luZm8uZWRkX3BhcmFtcywKKwkJCQkgICAg ICZpbmZvLT5wYXJhbXMpOworCQlyZXQgPSBIWVBFUlZJU09SX3BsYXRmb3JtX29wKCZvcCk7CisJ CWlmIChyZXQpCisJCQlicmVhazsKKworI2RlZmluZSBDKHgpIGluZm8tPnggPSBvcC51LmZpcm13 YXJlX2luZm8udS5kaXNrX2luZm8ueAorCQlDKGRldmljZSk7CisJCUModmVyc2lvbik7CisJCUMo aW50ZXJmYWNlX3N1cHBvcnQpOworCQlDKGxlZ2FjeV9tYXhfY3lsaW5kZXIpOworCQlDKGxlZ2Fj eV9tYXhfaGVhZCk7CisJCUMobGVnYWN5X3NlY3RvcnNfcGVyX3RyYWNrKTsKKyN1bmRlZiBDCisJ fQorCWJvb3RfcGFyYW1zLmVkZGJ1Zl9lbnRyaWVzID0gbnI7CisKKwlvcC51LmZpcm13YXJlX2lu Zm8udHlwZSA9IFhFTl9GV19ESVNLX01CUl9TSUdOQVRVUkU7CisJZm9yIChuciA9IDA7IG5yIDwg RUREX01CUl9TSUdfTUFYOyBucisrKSB7CisJCW9wLnUuZmlybXdhcmVfaW5mby5pbmRleCA9IG5y OworCQlyZXQgPSBIWVBFUlZJU09SX3BsYXRmb3JtX29wKCZvcCk7CisJCWlmIChyZXQpCisJCQli cmVhazsKKwkJbWJyX3NpZ25hdHVyZVtucl0gPSBvcC51LmZpcm13YXJlX2luZm8udS5kaXNrX21i cl9zaWduYXR1cmUubWJyX3NpZ25hdHVyZTsKKwl9CisJYm9vdF9wYXJhbXMuZWRkX21icl9zaWdf YnVmX2VudHJpZXMgPSBucjsKKyNlbmRpZgorfQorCisvKgorICogU2V0IHVwIHRoZSBHRFQgYW5k IHNlZ21lbnQgcmVnaXN0ZXJzIGZvciAtZnN0YWNrLXByb3RlY3Rvci4gIFVudGlsCisgKiB3ZSBk byB0aGlzLCB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwgbm90IHRvIGNhbGwgYW55IHN0YWNrLXByb3Rl Y3RlZAorICogZnVuY3Rpb24sIHdoaWNoIGlzIG1vc3Qgb2YgdGhlIGtlcm5lbC4KKyAqLworc3Rh dGljIHZvaWQgeGVuX3NldHVwX2dkdChpbnQgY3B1KQoreworCXB2X2NwdV9vcHMud3JpdGVfZ2R0 X2VudHJ5ID0geGVuX3dyaXRlX2dkdF9lbnRyeV9ib290OworCXB2X2NwdV9vcHMubG9hZF9nZHQg PSB4ZW5fbG9hZF9nZHRfYm9vdDsKKworCXNldHVwX3N0YWNrX2NhbmFyeV9zZWdtZW50KDApOwor CXN3aXRjaF90b19uZXdfZ2R0KDApOworCisJcHZfY3B1X29wcy53cml0ZV9nZHRfZW50cnkgPSB4 ZW5fd3JpdGVfZ2R0X2VudHJ5OworCXB2X2NwdV9vcHMubG9hZF9nZHQgPSB4ZW5fbG9hZF9nZHQ7 Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fZG9tMF9zZXRfbGVnYWN5X2ZlYXR1cmVzKHZv aWQpCit7CisJeDg2X3BsYXRmb3JtLmxlZ2FjeS5ydGMgPSAxOworfQorCisvKiBGaXJzdCBDIGZ1 bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBYZW4gYm9vdCAqLworYXNtbGlua2FnZSBfX3Zpc2libGUg dm9pZCBfX2luaXQgeGVuX3N0YXJ0X2tlcm5lbCh2b2lkKQoreworCXN0cnVjdCBwaHlzZGV2X3Nl dF9pb3BsIHNldF9pb3BsOworCXVuc2lnbmVkIGxvbmcgaW5pdHJkX3N0YXJ0ID0gMDsKKwlpbnQg cmM7CisKKwlpZiAoIXhlbl9zdGFydF9pbmZvKQorCQlyZXR1cm47CisKKwl4ZW5fZG9tYWluX3R5 cGUgPSBYRU5fUFZfRE9NQUlOOworCisJeGVuX3NldHVwX2ZlYXR1cmVzKCk7CisKKwl4ZW5fc2V0 dXBfbWFjaHBoeXNfbWFwcGluZygpOworCisJLyogSW5zdGFsbCBYZW4gcGFyYXZpcnQgb3BzICov CisJcHZfaW5mbyA9IHhlbl9pbmZvOworCXB2X2luaXRfb3BzID0geGVuX2luaXRfb3BzOworCXB2 X2NwdV9vcHMgPSB4ZW5fY3B1X29wczsKKworCXg4Nl9wbGF0Zm9ybS5nZXRfbm1pX3JlYXNvbiA9 IHhlbl9nZXRfbm1pX3JlYXNvbjsKKworCXg4Nl9pbml0LnJlc291cmNlcy5tZW1vcnlfc2V0dXAg PSB4ZW5fbWVtb3J5X3NldHVwOworCXg4Nl9pbml0Lm9lbS5hcmNoX3NldHVwID0geGVuX2FyY2hf c2V0dXA7CisJeDg2X2luaXQub2VtLmJhbm5lciA9IHhlbl9iYW5uZXI7CisKKwl4ZW5faW5pdF90 aW1lX29wcygpOworCisJLyoKKwkgKiBTZXQgdXAgc29tZSBwYWdldGFibGUgc3RhdGUgYmVmb3Jl IHN0YXJ0aW5nIHRvIHNldCBhbnkgcHRlcy4KKwkgKi8KKworCXhlbl9pbml0X21tdV9vcHMoKTsK KworCS8qIFByZXZlbnQgdW53YW50ZWQgYml0cyBmcm9tIGJlaW5nIHNldCBpbiBQVEVzLiAqLwor CV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9HTE9CQUw7CisKKwkvKgorCSAqIFByZXZl bnQgcGFnZSB0YWJsZXMgZnJvbSBiZWluZyBhbGxvY2F0ZWQgaW4gaGlnaG1lbSwgZXZlbgorCSAq IGlmIENPTkZJR19ISUdIUFRFIGlzIGVuYWJsZWQuCisJICovCisJX191c2VycHRlX2FsbG9jX2dm cCAmPSB+X19HRlBfSElHSE1FTTsKKworCS8qIFdvcmsgb3V0IGlmIHdlIHN1cHBvcnQgTlggKi8K Kwl4ODZfY29uZmlndXJlX254KCk7CisKKwkvKiBHZXQgbWZuIGxpc3QgKi8KKwl4ZW5fYnVpbGRf ZHluYW1pY19waHlzX3RvX21hY2hpbmUoKTsKKworCS8qCisJICogU2V0IHVwIGtlcm5lbCBHRFQg YW5kIHNlZ21lbnQgcmVnaXN0ZXJzLCBtYWlubHkgc28gdGhhdAorCSAqIC1mc3RhY2stcHJvdGVj dG9yIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLgorCSAqLworCXhlbl9zZXR1cF9nZHQoMCk7CisKKwl4 ZW5faW5pdF9pcnFfb3BzKCk7CisJeGVuX2luaXRfY3B1aWRfbWFzaygpOworCisjaWZkZWYgQ09O RklHX1g4Nl9MT0NBTF9BUElDCisJLyoKKwkgKiBzZXQgdXAgdGhlIGJhc2ljIGFwaWMgb3BzLgor CSAqLworCXhlbl9pbml0X2FwaWMoKTsKKyNlbmRpZgorCisJaWYgKHhlbl9mZWF0dXJlKFhFTkZF QVRfbW11X3B0X3VwZGF0ZV9wcmVzZXJ2ZV9hZCkpIHsKKwkJcHZfbW11X29wcy5wdGVwX21vZGlm eV9wcm90X3N0YXJ0ID0geGVuX3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQ7CisJCXB2X21tdV9vcHMu cHRlcF9tb2RpZnlfcHJvdF9jb21taXQgPSB4ZW5fcHRlcF9tb2RpZnlfcHJvdF9jb21taXQ7CisJ fQorCisJbWFjaGluZV9vcHMgPSB4ZW5fbWFjaGluZV9vcHM7CisKKwkvKgorCSAqIFRoZSBvbmx5 IHJlbGlhYmxlIHdheSB0byByZXRhaW4gdGhlIGluaXRpYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiBw ZXJjcHUgZ2R0X3BhZ2UgaXMgdG8gcmVtZW1iZXIgaXQgaGVyZSwgc28gd2UgY2FuIGdvIGFuZAor CSAqIG1hcmsgaXQgUlcgbGF0ZXIsIHdoZW4gdGhlIGluaXRpYWwgcGVyY3B1IGFyZWEgaXMgZnJl ZWQuCisJICovCisJeGVuX2luaXRpYWxfZ2R0ID0gJnBlcl9jcHUoZ2R0X3BhZ2UsIDApOworCisJ eGVuX3NtcF9pbml0KCk7CisKKyNpZmRlZiBDT05GSUdfQUNQSV9OVU1BCisJLyoKKwkgKiBUaGUg cGFnZXMgd2UgZnJvbSBYZW4gYXJlIG5vdCByZWxhdGVkIHRvIG1hY2hpbmUgcGFnZXMsIHNvCisJ ICogYW55IE5VTUEgaW5mb3JtYXRpb24gdGhlIGtlcm5lbCB0cmllcyB0byBnZXQgZnJvbSBBQ1BJ IHdpbGwKKwkgKiBiZSBtZWFuaW5nbGVzcy4gIFByZXZlbnQgaXQgZnJvbSB0cnlpbmcuCisJICov CisJYWNwaV9udW1hID0gLTE7CisjZW5kaWYKKwkvKiBEb24ndCBkbyB0aGUgZnVsbCB2Y3B1X2lu Zm8gcGxhY2VtZW50IHN0dWZmIHVudGlsIHdlIGhhdmUgYQorCSAgIHBvc3NpYmxlIG1hcCBhbmQg YSBub24tZHVtbXkgc2hhcmVkX2luZm8uICovCisJcGVyX2NwdSh4ZW5fdmNwdSwgMCkgPSAmSFlQ RVJWSVNPUl9zaGFyZWRfaW5mby0+dmNwdV9pbmZvWzBdOworCisJV0FSTl9PTih4ZW5fY3B1aHBf c2V0dXAoeGVuX2NwdV91cF9wcmVwYXJlX3B2LCB4ZW5fY3B1X2RlYWRfcHYpKTsKKworCWxvY2Fs X2lycV9kaXNhYmxlKCk7CisJZWFybHlfYm9vdF9pcnFzX2Rpc2FibGVkID0gdHJ1ZTsKKworCXhl bl9yYXdfY29uc29sZV93cml0ZSgibWFwcGluZyBrZXJuZWwgaW50byBwaHlzaWNhbCBtZW1vcnlc biIpOworCXhlbl9zZXR1cF9rZXJuZWxfcGFnZXRhYmxlKChwZ2RfdCAqKXhlbl9zdGFydF9pbmZv LT5wdF9iYXNlLAorCQkJCSAgIHhlbl9zdGFydF9pbmZvLT5ucl9wYWdlcyk7CisJeGVuX3Jlc2Vy dmVfc3BlY2lhbF9wYWdlcygpOworCisJLyoga2VlcCB1c2luZyBYZW4gZ2R0IGZvciBub3c7IG5v IHVyZ2VudCBuZWVkIHRvIGNoYW5nZSBpdCAqLworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCXB2 X2luZm8ua2VybmVsX3JwbCA9IDE7CisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfc3VwZXJ2aXNv cl9tb2RlX2tlcm5lbCkpCisJCXB2X2luZm8ua2VybmVsX3JwbCA9IDA7CisjZWxzZQorCXB2X2lu Zm8ua2VybmVsX3JwbCA9IDA7CisjZW5kaWYKKwkvKiBzZXQgdGhlIGxpbWl0IG9mIG91ciBhZGRy ZXNzIHNwYWNlICovCisJeGVuX3Jlc2VydmVfdG9wKCk7CisKKwkvKgorCSAqIFdlIHVzZWQgdG8g ZG8gdGhpcyBpbiB4ZW5fYXJjaF9zZXR1cCwgYnV0IHRoYXQgaXMgdG9vIGxhdGUKKwkgKiBvbiBB TUQgd2VyZSBlYXJseV9jcHVfaW5pdCAocnVuIGJlZm9yZSAtPmFyY2hfc2V0dXAoKSkgY2FsbHMK KwkgKiBlYXJseV9hbWRfaW5pdCB3aGljaCBwb2tlcyAweGNmOCBwb3J0LgorCSAqLworCXNldF9p b3BsLmlvcGwgPSAxOworCXJjID0gSFlQRVJWSVNPUl9waHlzZGV2X29wKFBIWVNERVZPUF9zZXRf aW9wbCwgJnNldF9pb3BsKTsKKwlpZiAocmMgIT0gMCkKKwkJeGVuX3Jhd19wcmludGsoInBoeXNk ZXZfb3AgZmFpbGVkICVkXG4iLCByYyk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJLyogc2V0 IHVwIGJhc2ljIENQVUlEIHN0dWZmICovCisJY3B1X2RldGVjdCgmbmV3X2NwdV9kYXRhKTsKKwlz ZXRfY3B1X2NhcCgmbmV3X2NwdV9kYXRhLCBYODZfRkVBVFVSRV9GUFUpOworCW5ld19jcHVfZGF0 YS53cF93b3Jrc19vayA9IDE7CisJbmV3X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5W0NQVUlEXzFf RURYXSA9IGNwdWlkX2VkeCgxKTsKKyNlbmRpZgorCisJaWYgKHhlbl9zdGFydF9pbmZvLT5tb2Rf c3RhcnQpIHsKKwkgICAgaWYgKHhlbl9zdGFydF9pbmZvLT5mbGFncyAmIFNJRl9NT0RfU1RBUlRf UEZOKQorCQlpbml0cmRfc3RhcnQgPSBQRk5fUEhZUyh4ZW5fc3RhcnRfaW5mby0+bW9kX3N0YXJ0 KTsKKwkgICAgZWxzZQorCQlpbml0cmRfc3RhcnQgPSBfX3BhKHhlbl9zdGFydF9pbmZvLT5tb2Rf c3RhcnQpOworCX0KKworCS8qIFBva2UgdmFyaW91cyB1c2VmdWwgdGhpbmdzIGludG8gYm9vdF9w YXJhbXMgKi8KKwlib290X3BhcmFtcy5oZHIudHlwZV9vZl9sb2FkZXIgPSAoOSA8PCA0KSB8IDA7 CisJYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfaW1hZ2UgPSBpbml0cmRfc3RhcnQ7CisJYm9vdF9w YXJhbXMuaGRyLnJhbWRpc2tfc2l6ZSA9IHhlbl9zdGFydF9pbmZvLT5tb2RfbGVuOworCWJvb3Rf cGFyYW1zLmhkci5jbWRfbGluZV9wdHIgPSBfX3BhKHhlbl9zdGFydF9pbmZvLT5jbWRfbGluZSk7 CisJYm9vdF9wYXJhbXMuaGRyLmhhcmR3YXJlX3N1YmFyY2ggPSBYODZfU1VCQVJDSF9YRU47CisK KwlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKSB7CisJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgi eGVuYm9vdCIsIDAsIE5VTEwpOworCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoInR0eSIsIDAsIE5V TEwpOworCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUoImh2YyIsIDAsIE5VTEwpOworCQlpZiAocGNp X3hlbikKKwkJCXg4Nl9pbml0LnBjaS5hcmNoX2luaXQgPSBwY2lfeGVuX2luaXQ7CisJfSBlbHNl IHsKKwkJY29uc3Qgc3RydWN0IGRvbTBfdmdhX2NvbnNvbGVfaW5mbyAqaW5mbyA9CisJCQkodm9p ZCAqKSgoY2hhciAqKXhlbl9zdGFydF9pbmZvICsKKwkJCQkgeGVuX3N0YXJ0X2luZm8tPmNvbnNv bGUuZG9tMC5pbmZvX29mZik7CisJCXN0cnVjdCB4ZW5fcGxhdGZvcm1fb3Agb3AgPSB7CisJCQku Y21kID0gWEVOUEZfZmlybXdhcmVfaW5mbywKKwkJCS5pbnRlcmZhY2VfdmVyc2lvbiA9IFhFTlBG X0lOVEVSRkFDRV9WRVJTSU9OLAorCQkJLnUuZmlybXdhcmVfaW5mby50eXBlID0gWEVOX0ZXX0tC RF9TSElGVF9GTEFHUywKKwkJfTsKKworCQl4ODZfcGxhdGZvcm0uc2V0X2xlZ2FjeV9mZWF0dXJl cyA9CisJCQkJeGVuX2RvbTBfc2V0X2xlZ2FjeV9mZWF0dXJlczsKKwkJeGVuX2luaXRfdmdhKGlu Zm8sIHhlbl9zdGFydF9pbmZvLT5jb25zb2xlLmRvbTAuaW5mb19zaXplKTsKKwkJeGVuX3N0YXJ0 X2luZm8tPmNvbnNvbGUuZG9tVS5tZm4gPSAwOworCQl4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5k b21VLmV2dGNobiA9IDA7CisKKwkJaWYgKEhZUEVSVklTT1JfcGxhdGZvcm1fb3AoJm9wKSA9PSAw KQorCQkJYm9vdF9wYXJhbXMua2JkX3N0YXR1cyA9IG9wLnUuZmlybXdhcmVfaW5mby51LmtiZF9z aGlmdF9mbGFnczsKKworCQkvKiBNYWtlIHN1cmUgQUNTIHdpbGwgYmUgZW5hYmxlZCAqLworCQlw Y2lfcmVxdWVzdF9hY3MoKTsKKworCQl4ZW5fYWNwaV9zbGVlcF9yZWdpc3RlcigpOworCisJCS8q IEF2b2lkIHNlYXJjaGluZyBmb3IgQklPUyBNUCB0YWJsZXMgKi8KKwkJeDg2X2luaXQubXBwYXJz ZS5maW5kX3NtcF9jb25maWcgPSB4ODZfaW5pdF9ub29wOworCQl4ODZfaW5pdC5tcHBhcnNlLmdl dF9zbXBfY29uZmlnID0geDg2X2luaXRfdWludF9ub29wOworCisJCXhlbl9ib290X3BhcmFtc19p bml0X2VkZCgpOworCX0KKyNpZmRlZiBDT05GSUdfUENJCisJLyogUENJIEJJT1Mgc2VydmljZSB3 b24ndCB3b3JrIGZyb20gYSBQViBndWVzdC4gKi8KKwlwY2lfcHJvYmUgJj0gflBDSV9QUk9CRV9C SU9TOworI2VuZGlmCisJeGVuX3Jhd19jb25zb2xlX3dyaXRlKCJhYm91dCB0byBnZXQgc3RhcnRl ZC4uLlxuIik7CisKKwkvKiBMZXQncyBwcmVzdW1lIFBWIGd1ZXN0cyBhbHdheXMgYm9vdCBvbiB2 Q1BVIHdpdGggaWQgMC4gKi8KKwlwZXJfY3B1KHhlbl92Y3B1X2lkLCAwKSA9IDA7CisKKwl4ZW5f c2V0dXBfcnVuc3RhdGVfaW5mbygwKTsKKworCXhlbl9lZmlfaW5pdCgpOworCisJLyogU3RhcnQg dGhlIHdvcmxkICovCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCWkzODZfc3RhcnRfa2VybmVsKCk7 CisjZWxzZQorCWNyNF9pbml0X3NoYWRvdygpOyAvKiAzMmIga2VybmVsIGRvZXMgdGhpcyBpbiBp Mzg2X3N0YXJ0X2tlcm5lbCgpICovCisJeDg2XzY0X3N0YXJ0X3Jlc2VydmF0aW9ucygoY2hhciAq KV9fcGFfc3ltYm9sKCZib290X3BhcmFtcykpOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgeGVu X2NwdV91cF9wcmVwYXJlX3B2KHVuc2lnbmVkIGludCBjcHUpCit7CisJaW50IHJjOworCisJeGVu X3NldHVwX3RpbWVyKGNwdSk7CisKKwlyYyA9IHhlbl9zbXBfaW50cl9pbml0KGNwdSk7CisJaWYg KHJjKSB7CisJCVdBUk4oMSwgInhlbl9zbXBfaW50cl9pbml0KCkgZm9yIENQVSAlZCBmYWlsZWQ6 ICVkXG4iLAorCQkgICAgIGNwdSwgcmMpOworCQlyZXR1cm4gcmM7CisJfQorCXJldHVybiAwOwor fQorCitzdGF0aWMgaW50IHhlbl9jcHVfZGVhZF9wdih1bnNpZ25lZCBpbnQgY3B1KQoreworCXhl bl9zbXBfaW50cl9mcmVlKGNwdSk7CisKKwl4ZW5fdGVhcmRvd25fdGltZXIoY3B1KTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3QgX19pbml0IHhlbl9wbGF0Zm9ybV9wdih2b2lk KQoreworCWlmICh4ZW5fcHZfZG9tYWluKCkpCisJCXJldHVybiB4ZW5fY3B1aWRfYmFzZSgpOwor CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9zZXRfY3B1X2ZlYXR1cmVzKHN0cnVj dCBjcHVpbmZvX3g4NiAqYykKK3sKKwljbGVhcl9jcHVfYnVnKGMsIFg4Nl9CVUdfU1lTUkVUX1NT X0FUVFJTKTsKKwlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9YRU5QVik7Cit9CisKK2NvbnN0 IHN0cnVjdCBoeXBlcnZpc29yX3g4NiB4ODZfaHlwZXJfeGVuX3B2ID0geworCS5uYW1lICAgICAg ICAgICAgICAgICAgID0gIlhlbiBQViIsCisJLmRldGVjdCAgICAgICAgICAgICAgICAgPSB4ZW5f cGxhdGZvcm1fcHYsCisJLnNldF9jcHVfZmVhdHVyZXMgICAgICAgPSB4ZW5fc2V0X2NwdV9mZWF0 dXJlcywKKwkucGluX3ZjcHUgICAgICAgICAgICAgICA9IHhlbl9waW5fdmNwdSwKK307CitFWFBP UlRfU1lNQk9MKHg4Nl9oeXBlcl94ZW5fcHYpOwotLSAKMi45LjMKCgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhl bi1kZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK