From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vitaly Kuznetsov Subject: [PATCH v2 06/21] x86/xen: split off enlighten_pv.c Date: Thu, 2 Mar 2017 18:53:42 +0100 Message-ID: <20170302175357.8222-7-vkuznets@redhat.com> References: <20170302175357.8222-1-vkuznets@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cjUvf-0003Te-GW for xen-devel@lists.xenproject.org; Thu, 02 Mar 2017 17:54:16 +0000 In-Reply-To: <20170302175357.8222-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+Ci0tLQogYXJjaC94ODYveGVu L01ha2VmaWxlICAgICAgIHwgICAgNCArLQogYXJjaC94ODYveGVuL2VubGlnaHRlbi5jICAgIHwg MTYyNiArKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBhcmNoL3g4 Ni94ZW4vZW5saWdodGVuX3B2LmMgfCAxNTUyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrCiAzIGZpbGVzIGNoYW5nZWQsIDE1OTYgaW5zZXJ0aW9ucygrKSwgMTU4NiBk ZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3g4Ni94ZW4vZW5saWdodGVuX3B2 LmMKCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUgYi9hcmNoL3g4Ni94ZW4vTWFr ZWZpbGUKaW5kZXggMWJjYTc1Yi4uNWNhOGQzZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9N YWtlZmlsZQorKysgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKQEAgLTcsMTMgKzcsMTMgQEAgZW5k aWYKIAogIyBNYWtlIHN1cmUgZWFybHkgYm9vdCBoYXMgbm8gc3RhY2twcm90ZWN0b3IKIG5vc3Rh Y2twIDo9ICQoY2FsbCBjYy1vcHRpb24sIC1mbm8tc3RhY2stcHJvdGVjdG9yKQotQ0ZMQUdTX2Vu bGlnaHRlbi5vCQk6PSAkKG5vc3RhY2twKQorQ0ZMQUdTX2VubGlnaHRlbl9wdi5vCQk6PSAkKG5v c3RhY2twKQogQ0ZMQUdTX21tdS5vCQkJOj0gJChub3N0YWNrcCkKIAogb2JqLXkJCTo9IGVubGln aHRlbi5vIHNldHVwLm8gbXVsdGljYWxscy5vIG1tdS5vIGlycS5vIFwKIAkJCXRpbWUubyB4ZW4t YXNtLm8geGVuLWFzbV8kKEJJVFMpLm8gXAogCQkJZ3JhbnQtdGFibGUubyBzdXNwZW5kLm8gcGxh dGZvcm0tcGNpLXVucGx1Zy5vIFwKLQkJCXAybS5vIGFwaWMubyBwbXUubworCQkJcDJtLm8gYXBp Yy5vIHBtdS5vIGVubGlnaHRlbl9wdi5vCiAKIG9iai0kKENPTkZJR19YRU5fUFZIVk0pCQkrPSBl bmxpZ2h0ZW5faHZtLm8KIG9iai0kKENPTkZJR19YRU5fUFZIKQkJCSs9IGVubGlnaHRlbl9wdmgu bwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jIGIvYXJjaC94ODYveGVuL2Vu bGlnaHRlbi5jCmluZGV4IDBjZDk5YWQuLjRiZDIwYmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hl bi9lbmxpZ2h0ZW4uYworKysgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKQEAgLTEsOTIgKzEs MTUgQEAKLS8qCi0gKiBDb3JlIG9mIFhlbiBwYXJhdmlydF9vcHMgaW1wbGVtZW50YXRpb24uCi0g KgotICogVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSB4ZW5fcGFyYXZpcnRfb3BzIHN0cnVjdHVyZSBp dHNlbGYsIGFuZCB0aGUKLSAqIGltcGxlbWVudGF0aW9ucyBmb3I6Ci0gKiAtIHByaXZpbGVnZWQg aW5zdHJ1Y3Rpb25zCi0gKiAtIGludGVycnVwdCBmbGFncwotICogLSBzZWdtZW50IG9wZXJhdGlv bnMKLSAqIC0gYm9vdGluZyBhbmQgc2V0dXAKLSAqCi0gKiBKZXJlbXkgRml0emhhcmRpbmdlIDxq ZXJlbXlAeGVuc291cmNlLmNvbT4sIFhlblNvdXJjZSBJbmMsIDIwMDcKLSAqLwotCiAjaW5jbHVk ZSA8bGludXgvY3B1Lmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGlu dXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgotI2luY2x1ZGUgPGxpbnV4L3ByZWVt cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvcGVyY3B1 Lmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLSNpbmNsdWRlIDxsaW51eC9zdGFydF9rZXJu ZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMu aD4KLSNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+Ci0jaW5jbHVkZSA8bGludXgvZXhwb3J0Lmg+ Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9wYWdlLWZsYWdzLmg+Ci0j aW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KLSNp bmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9nZnAuaD4KLSNpbmNsdWRlIDxs aW51eC9tZW1ibG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2VkZC5oPgotI2luY2x1ZGUgPGxpbnV4 L2ZyYW1lLmg+Ci0KICNpbmNsdWRlIDxsaW51eC9rZXhlYy5oPgogCi0jaW5jbHVkZSA8eGVuL3hl bi5oPgotI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KLSNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hl bi5oPgotI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmVyc2lvbi5oPgotI2luY2x1ZGUgPHhlbi9p bnRlcmZhY2UvcGh5c2Rldi5oPgotI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UvdmNwdS5oPgotI2lu Y2x1ZGUgPHhlbi9pbnRlcmZhY2UvbWVtb3J5Lmg+Ci0jaW5jbHVkZSA8eGVuL2ludGVyZmFjZS9u bWkuaD4KLSNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3hlbi1tY2EuaD4KICNpbmNsdWRlIDx4ZW4v ZmVhdHVyZXMuaD4KICNpbmNsdWRlIDx4ZW4vcGFnZS5oPgotI2luY2x1ZGUgPHhlbi9odmMtY29u c29sZS5oPgotI2luY2x1ZGUgPHhlbi9hY3BpLmg+CiAKLSNpbmNsdWRlIDxhc20vcGFyYXZpcnQu aD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVk ZSA8YXNtL3hlbi9wY2kuaD4KICNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgogI2luY2x1 ZGUgPGFzbS94ZW4vaHlwZXJ2aXNvci5oPgotI2luY2x1ZGUgPGFzbS94ZW4vY3B1aWQuaD4KLSNp bmNsdWRlIDxhc20vZml4bWFwLmg+Ci0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotI2luY2x1 ZGUgPGFzbS9wcm90by5oPgotI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KLSNpbmNsdWRlIDxh c20vdHJhcHMuaD4KLSNpbmNsdWRlIDxhc20vc2V0dXAuaD4KLSNpbmNsdWRlIDxhc20vZGVzYy5o PgotI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNp bmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vcmVib290Lmg+Ci0jaW5jbHVk ZSA8YXNtL3N0YWNrcHJvdGVjdG9yLmg+Ci0jaW5jbHVkZSA8YXNtL2h5cGVydmlzb3IuaD4KLSNp bmNsdWRlIDxhc20vbWFjaF90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9td2FpdC5oPgotI2luY2x1 ZGUgPGFzbS9wY2lfeDg2Lmg+CiAjaW5jbHVkZSA8YXNtL2NwdS5oPgogCi0jaWZkZWYgQ09ORklH X0FDUEkKLSNpbmNsdWRlIDxsaW51eC9hY3BpLmg+Ci0jaW5jbHVkZSA8YXNtL2FjcGkuaD4KLSNp bmNsdWRlIDxhY3BpL3BkY19pbnRlbC5oPgotI2luY2x1ZGUgPGFjcGkvcHJvY2Vzc29yLmg+Ci0j aW5jbHVkZSA8eGVuL2ludGVyZmFjZS9wbGF0Zm9ybS5oPgotI2VuZGlmCi0KICNpbmNsdWRlICJ4 ZW4tb3BzLmgiCi0jaW5jbHVkZSAibW11LmgiCiAjaW5jbHVkZSAic21wLmgiCi0jaW5jbHVkZSAi bXVsdGljYWxscy5oIgogI2luY2x1ZGUgInBtdS5oIgogCiBFWFBPUlRfU1lNQk9MX0dQTChoeXBl cmNhbGxfcGFnZSk7CkBAIC0xMzMsMTQgKzU2LDYgQEAgRVhQT1JUX1NZTUJPTF9HUEwoeGVuX3N0 YXJ0X2luZm8pOwogCiBzdHJ1Y3Qgc2hhcmVkX2luZm8geGVuX2R1bW15X3NoYXJlZF9pbmZvOwog Ci12b2lkICp4ZW5faW5pdGlhbF9nZHQ7Ci0KLVJFU0VSVkVfQlJLKHNoYXJlZF9pbmZvX3BhZ2Vf YnJrLCBQQUdFX1NJWkUpOwotCi1zdGF0aWMgaW50IHhlbl9jcHVfdXBfcHJlcGFyZV9wdih1bnNp Z25lZCBpbnQgY3B1KTsKLXN0YXRpYyBpbnQgeGVuX2NwdV91cF9vbmxpbmUodW5zaWduZWQgaW50 IGNwdSk7Ci1zdGF0aWMgaW50IHhlbl9jcHVfZGVhZF9wdih1bnNpZ25lZCBpbnQgY3B1KTsKLQog LyoKICAqIFBvaW50IGF0IHNvbWUgZW1wdHkgbWVtb3J5IHRvIHN0YXJ0IHdpdGguIFdlIG1hcCB0 aGUgcmVhbCBzaGFyZWRfaW5mbwogICogcGFnZSBhcyBzb29uIGFzIGZpeG1hcCBpcyB1cCBhbmQg cnVubmluZy4KQEAgLTE2MiwxOCArNzcsMzAgQEAgc3RydWN0IHNoYXJlZF9pbmZvICpIWVBFUlZJ U09SX3NoYXJlZF9pbmZvID0gJnhlbl9kdW1teV9zaGFyZWRfaW5mbzsKICAqLwogaW50IHhlbl9o YXZlX3ZjcHVfaW5mb19wbGFjZW1lbnQgPSAxOwogCi1zdHJ1Y3QgdGxzX2Rlc2NzIHsKLQlzdHJ1 Y3QgZGVzY19zdHJ1Y3QgZGVzY1szXTsKLX07CitzdGF0aWMgaW50IHhlbl9jcHVfdXBfb25saW5l KHVuc2lnbmVkIGludCBjcHUpCit7CisJeGVuX2luaXRfbG9ja19jcHUoY3B1KTsKKwlyZXR1cm4g MDsKK30KIAotLyoKLSAqIFVwZGF0aW5nIHRoZSAzIFRMUyBkZXNjcmlwdG9ycyBpbiB0aGUgR0RU IG9uIGV2ZXJ5IHRhc2sgc3dpdGNoIGlzCi0gKiBzdXJwcmlzaW5nbHkgZXhwZW5zaXZlIHNvIHdl IGF2b2lkIHVwZGF0aW5nIHRoZW0gaWYgdGhleSBoYXZlbid0Ci0gKiBjaGFuZ2VkLiAgU2luY2Ug WGVuIHdyaXRlcyBkaWZmZXJlbnQgZGVzY3JpcHRvcnMgdGhhbiB0aGUgb25lCi0gKiBwYXNzZWQg aW4gdGhlIHVwZGF0ZV9kZXNjcmlwdG9yIGh5cGVyY2FsbCB3ZSBrZWVwIHNoYWRvdyBjb3BpZXMg dG8KLSAqIGNvbXBhcmUgYWdhaW5zdC4KLSAqLwotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVj dCB0bHNfZGVzY3MsIHNoYWRvd190bHNfZGVzYyk7CitpbnQgeGVuX2NwdWhwX3NldHVwKGludCAo KmNwdV91cF9wcmVwYXJlX2NiKSh1bnNpZ25lZCBpbnQpLAorCQkgICAgaW50ICgqY3B1X2RlYWRf Y2IpKHVuc2lnbmVkIGludCkpCit7CisJaW50IHJjOworCisJcmMgPSBjcHVocF9zZXR1cF9zdGF0 ZV9ub2NhbGxzKENQVUhQX1hFTl9QUkVQQVJFLAorCQkJCSAgICAgICAieDg2L3hlbi9odm1fZ3Vl c3Q6cHJlcGFyZSIsCisJCQkJICAgICAgIGNwdV91cF9wcmVwYXJlX2NiLCBjcHVfZGVhZF9jYik7 CisJaWYgKHJjID49IDApIHsKKwkJcmMgPSBjcHVocF9zZXR1cF9zdGF0ZV9ub2NhbGxzKENQVUhQ X0FQX09OTElORV9EWU4sCisJCQkJCSAgICAgICAieDg2L3hlbi9odm1fZ3Vlc3Q6b25saW5lIiwK KwkJCQkJICAgICAgIHhlbl9jcHVfdXBfb25saW5lLCBOVUxMKTsKKwkJaWYgKHJjIDwgMCkKKwkJ CWNwdWhwX3JlbW92ZV9zdGF0ZV9ub2NhbGxzKENQVUhQX1hFTl9QUkVQQVJFKTsKKwl9CisKKwly ZXR1cm4gcmMgPj0gMCA/IDAgOiByYzsKK30KIAogc3RhdGljIHZvaWQgY2xhbXBfbWF4X2NwdXMo dm9pZCkKIHsKQEAgLTI0MiwxNTExICsxNjksNDIgQEAgdm9pZCB4ZW5fdmNwdV9zZXR1cChpbnQg Y3B1KQogCX0KIH0KIAotLyoKLSAqIE9uIHJlc3RvcmUsIHNldCB0aGUgdmNwdSBwbGFjZW1lbnQg dXAgYWdhaW4uCi0gKiBJZiBpdCBmYWlscywgdGhlbiB3ZSdyZSBpbiBhIGJhZCBzdGF0ZSwgc2lu Y2UKLSAqIHdlIGNhbid0IGJhY2sgb3V0IGZyb20gdXNpbmcgaXQuLi4KLSAqLwotdm9pZCB4ZW5f dmNwdV9yZXN0b3JlKHZvaWQpCit2b2lkIHhlbl9yZWJvb3QoaW50IHJlYXNvbikKIHsKKwlzdHJ1 Y3Qgc2NoZWRfc2h1dGRvd24gciA9IHsgLnJlYXNvbiA9IHJlYXNvbiB9OwogCWludCBjcHU7CiAK LQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KSB7Ci0JCWJvb2wgb3RoZXJfY3B1ID0gKGNwdSAh PSBzbXBfcHJvY2Vzc29yX2lkKCkpOwotCQlib29sIGlzX3VwID0gSFlQRVJWSVNPUl92Y3B1X29w KFZDUFVPUF9pc191cCwgeGVuX3ZjcHVfbnIoY3B1KSwKLQkJCQkJCU5VTEwpOwotCi0JCWlmIChv dGhlcl9jcHUgJiYgaXNfdXAgJiYKLQkJICAgIEhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfZG93 biwgeGVuX3ZjcHVfbnIoY3B1KSwgTlVMTCkpCi0JCQlCVUcoKTsKLQotCQl4ZW5fc2V0dXBfcnVu c3RhdGVfaW5mbyhjcHUpOwotCi0JCWlmICh4ZW5faGF2ZV92Y3B1X2luZm9fcGxhY2VtZW50KQot CQkJeGVuX3ZjcHVfc2V0dXAoY3B1KTsKLQotCQlpZiAob3RoZXJfY3B1ICYmIGlzX3VwICYmCi0J CSAgICBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX3VwLCB4ZW5fdmNwdV9ucihjcHUpLCBOVUxM KSkKLQkJCUJVRygpOwotCX0KLX0KLQotc3RhdGljIHZvaWQgX19pbml0IHhlbl9iYW5uZXIodm9p ZCkKLXsKLQl1bnNpZ25lZCB2ZXJzaW9uID0gSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJf dmVyc2lvbiwgTlVMTCk7Ci0Jc3RydWN0IHhlbl9leHRyYXZlcnNpb24gZXh0cmE7Ci0JSFlQRVJW SVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfZXh0cmF2ZXJzaW9uLCAmZXh0cmEpOwotCi0JcHJfaW5m bygiQm9vdGluZyBwYXJhdmlydHVhbGl6ZWQga2VybmVsICVzb24gJXNcbiIsCi0JCXhlbl9mZWF0 dXJlKFhFTkZFQVRfYXV0b190cmFuc2xhdGVkX3BoeXNtYXApID8KLQkJCSJ3aXRoIFBWSCBleHRl bnNpb25zICIgOiAiIiwgcHZfaW5mby5uYW1lKTsKLQlwcmludGsoS0VSTl9JTkZPICJYZW4gdmVy c2lvbjogJWQuJWQlcyVzXG4iLAotCSAgICAgICB2ZXJzaW9uID4+IDE2LCB2ZXJzaW9uICYgMHhm ZmZmLCBleHRyYS5leHRyYXZlcnNpb24sCi0JICAgICAgIHhlbl9mZWF0dXJlKFhFTkZFQVRfbW11 X3B0X3VwZGF0ZV9wcmVzZXJ2ZV9hZCkgPyAiIChwcmVzZXJ2ZS1BRCkiIDogIiIpOwotfQotLyog Q2hlY2sgaWYgcnVubmluZyBvbiBYZW4gdmVyc2lvbiAobWFqb3IsIG1pbm9yKSBvciBsYXRlciAq LwotYm9vbAoteGVuX3J1bm5pbmdfb25fdmVyc2lvbl9vcl9sYXRlcih1bnNpZ25lZCBpbnQgbWFq b3IsIHVuc2lnbmVkIGludCBtaW5vcikKLXsKLQl1bnNpZ25lZCBpbnQgdmVyc2lvbjsKLQotCWlm ICgheGVuX2RvbWFpbigpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQl2ZXJzaW9uID0gSFlQRVJWSVNP Ul94ZW5fdmVyc2lvbihYRU5WRVJfdmVyc2lvbiwgTlVMTCk7Ci0JaWYgKCgoKHZlcnNpb24gPj4g MTYpID09IG1ham9yKSAmJiAoKHZlcnNpb24gJiAweGZmZmYpID49IG1pbm9yKSkgfHwKLQkJKCh2 ZXJzaW9uID4+IDE2KSA+IG1ham9yKSkKLQkJcmV0dXJuIHRydWU7Ci0JcmV0dXJuIGZhbHNlOwot fQotCi0jZGVmaW5lIENQVUlEX1RIRVJNX1BPV0VSX0xFQUYgNgotI2RlZmluZSBBUEVSRk1QRVJG X1BSRVNFTlQgMAotCi1zdGF0aWMgX19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgY3B1aWRfbGVh ZjFfZWR4X21hc2sgPSB+MDsKLXN0YXRpYyBfX3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVp ZF9sZWFmMV9lY3hfbWFzayA9IH4wOwotCi1zdGF0aWMgX19yZWFkX21vc3RseSB1bnNpZ25lZCBp bnQgY3B1aWRfbGVhZjFfZWN4X3NldF9tYXNrOwotc3RhdGljIF9fcmVhZF9tb3N0bHkgdW5zaWdu ZWQgaW50IGNwdWlkX2xlYWY1X2VjeF92YWw7Ci1zdGF0aWMgX19yZWFkX21vc3RseSB1bnNpZ25l ZCBpbnQgY3B1aWRfbGVhZjVfZWR4X3ZhbDsKLQotc3RhdGljIHZvaWQgeGVuX2NwdWlkKHVuc2ln bmVkIGludCAqYXgsIHVuc2lnbmVkIGludCAqYngsCi0JCSAgICAgIHVuc2lnbmVkIGludCAqY3gs IHVuc2lnbmVkIGludCAqZHgpCi17Ci0JdW5zaWduZWQgbWFza2VieCA9IH4wOwotCXVuc2lnbmVk IG1hc2tlY3ggPSB+MDsKLQl1bnNpZ25lZCBtYXNrZWR4ID0gfjA7Ci0JdW5zaWduZWQgc2V0ZWN4 ID0gMDsKLQkvKgotCSAqIE1hc2sgb3V0IGluY29udmVuaWVudCBmZWF0dXJlcywgdG8gdHJ5IGFu ZCBkaXNhYmxlIGFzIG1hbnkKLQkgKiB1bnN1cHBvcnRlZCBrZXJuZWwgc3Vic3lzdGVtcyBhcyBw b3NzaWJsZS4KLQkgKi8KLQlzd2l0Y2ggKCpheCkgewotCWNhc2UgMToKLQkJbWFza2VjeCA9IGNw dWlkX2xlYWYxX2VjeF9tYXNrOwotCQlzZXRlY3ggPSBjcHVpZF9sZWFmMV9lY3hfc2V0X21hc2s7 Ci0JCW1hc2tlZHggPSBjcHVpZF9sZWFmMV9lZHhfbWFzazsKLQkJYnJlYWs7Ci0KLQljYXNlIENQ VUlEX01XQUlUX0xFQUY6Ci0JCS8qIFN5bnRoZXNpemUgdGhlIHZhbHVlcy4uICovCi0JCSpheCA9 IDA7Ci0JCSpieCA9IDA7Ci0JCSpjeCA9IGNwdWlkX2xlYWY1X2VjeF92YWw7Ci0JCSpkeCA9IGNw dWlkX2xlYWY1X2VkeF92YWw7Ci0JCXJldHVybjsKLQotCWNhc2UgQ1BVSURfVEhFUk1fUE9XRVJf TEVBRjoKLQkJLyogRGlzYWJsaW5nIEFQRVJGTVBFUkYgZm9yIGtlcm5lbCB1c2FnZSAqLwotCQlt YXNrZWN4ID0gfigxIDw8IEFQRVJGTVBFUkZfUFJFU0VOVCk7Ci0JCWJyZWFrOwotCi0JY2FzZSAw eGI6Ci0JCS8qIFN1cHByZXNzIGV4dGVuZGVkIHRvcG9sb2d5IHN0dWZmICovCi0JCW1hc2tlYngg PSAwOwotCQlicmVhazsKLQl9Ci0KLQlhc20oWEVOX0VNVUxBVEVfUFJFRklYICJjcHVpZCIKLQkJ OiAiPWEiICgqYXgpLAotCQkgICI9YiIgKCpieCksCi0JCSAgIj1jIiAoKmN4KSwKLQkJICAiPWQi ICgqZHgpCi0JCTogIjAiICgqYXgpLCAiMiIgKCpjeCkpOwotCi0JKmJ4ICY9IG1hc2tlYng7Ci0J KmN4ICY9IG1hc2tlY3g7Ci0JKmN4IHw9IHNldGVjeDsKLQkqZHggJj0gbWFza2VkeDsKLX0KLVNU QUNLX0ZSQU1FX05PTl9TVEFOREFSRCh4ZW5fY3B1aWQpOyAvKiBYRU5fRU1VTEFURV9QUkVGSVgg Ki8KLQotc3RhdGljIGJvb2wgX19pbml0IHhlbl9jaGVja19td2FpdCh2b2lkKQotewotI2lmZGVm IENPTkZJR19BQ1BJCi0Jc3RydWN0IHhlbl9wbGF0Zm9ybV9vcCBvcCA9IHsKLQkJLmNtZAkJCT0g WEVOUEZfc2V0X3Byb2Nlc3Nvcl9wbWluZm8sCi0JCS51LnNldF9wbWluZm8uaWQJPSAtMSwKLQkJ LnUuc2V0X3BtaW5mby50eXBlCT0gWEVOX1BNX1BEQywKLQl9OwotCXVpbnQzMl90IGJ1ZlszXTsK LQl1bnNpZ25lZCBpbnQgYXgsIGJ4LCBjeCwgZHg7Ci0JdW5zaWduZWQgaW50IG13YWl0X21hc2s7 Ci0KLQkvKiBXZSBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGl0IGlzIE9LIHRvIGV4cG9zZSB0 aGUgTVdBSVQKLQkgKiBjYXBhYmlsaXR5IHRvIHRoZSBrZXJuZWwgdG8gaGFydmVzdCBkZWVwZXIg dGhhbiBDMyBzdGF0ZXMgZnJvbSBBQ1BJCi0JICogX0NTVCB1c2luZyB0aGUgcHJvY2Vzc29yX2hh cnZlc3RfeGVuLmMgbW9kdWxlLiBGb3IgdGhpcyB0byB3b3JrLCB3ZQotCSAqIG5lZWQgdG8gZ2F0 aGVyIHRoZSBNV0FJVF9MRUFGIHZhbHVlcyAod2hpY2ggdGhlIGNzdGF0ZS5jIGNvZGUKLQkgKiBj aGVja3MgYWdhaW5zdCkuIFRoZSBoeXBlcnZpc29yIHdvbid0IGV4cG9zZSB0aGUgTVdBSVQgZmxh ZyBiZWNhdXNlCi0JICogaXQgd291bGQgYnJlYWsgYmFja3dhcmRzIGNvbXBhdGliaWxpdHk7IHNv IHdlIHdpbGwgZmluZCBvdXQgZGlyZWN0bHkKLQkgKiBmcm9tIHRoZSBoYXJkd2FyZSBhbmQgaHlw ZXJjYWxsLgotCSAqLwotCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCi0JCXJldHVybiBmYWxz ZTsKLQotCS8qCi0JICogV2hlbiBydW5uaW5nIHVuZGVyIHBsYXRmb3JtIGVhcmxpZXIgdGhhbiBY ZW40LjIsIGRvIG5vdCBleHBvc2UKLQkgKiBtd2FpdCwgdG8gYXZvaWQgdGhlIHJpc2sgb2YgbG9h ZGluZyBuYXRpdmUgYWNwaSBwYWQgZHJpdmVyCi0JICovCi0JaWYgKCF4ZW5fcnVubmluZ19vbl92 ZXJzaW9uX29yX2xhdGVyKDQsIDIpKQotCQlyZXR1cm4gZmFsc2U7Ci0KLQlheCA9IDE7Ci0JY3gg PSAwOwotCi0JbmF0aXZlX2NwdWlkKCZheCwgJmJ4LCAmY3gsICZkeCk7Ci0KLQltd2FpdF9tYXNr ID0gKDEgPDwgKFg4Nl9GRUFUVVJFX0VTVCAlIDMyKSkgfAotCQkgICAgICgxIDw8IChYODZfRkVB VFVSRV9NV0FJVCAlIDMyKSk7Ci0KLQlpZiAoKGN4ICYgbXdhaXRfbWFzaykgIT0gbXdhaXRfbWFz aykKLQkJcmV0dXJuIGZhbHNlOwotCi0JLyogV2UgbmVlZCB0byBlbXVsYXRlIHRoZSBNV0FJVF9M RUFGIGFuZCBmb3IgdGhhdCB3ZSBuZWVkIGJvdGgKLQkgKiBlY3ggYW5kIGVkeC4gVGhlIGh5cGVy Y2FsbCBwcm92aWRlcyBvbmx5IHBhcnRpYWwgaW5mb3JtYXRpb24uCi0JICovCi0KLQlheCA9IENQ VUlEX01XQUlUX0xFQUY7Ci0JYnggPSAwOwotCWN4ID0gMDsKLQlkeCA9IDA7Ci0KLQluYXRpdmVf Y3B1aWQoJmF4LCAmYngsICZjeCwgJmR4KTsKLQotCS8qIEFzayB0aGUgSHlwZXJ2aXNvciB3aGV0 aGVyIHRvIGNsZWFyIEFDUElfUERDX0NfQzJDM19GRkguIElmIHNvLAotCSAqIGRvbid0IGV4cG9z ZSBNV0FJVF9MRUFGIGFuZCBsZXQgQUNQSSBwaWNrIHRoZSBJT1BPUlQgdmVyc2lvbiBvZiBDMy4K LQkgKi8KLQlidWZbMF0gPSBBQ1BJX1BEQ19SRVZJU0lPTl9JRDsKLQlidWZbMV0gPSAxOwotCWJ1 ZlsyXSA9IChBQ1BJX1BEQ19DX0NBUEFCSUxJVFlfU01QIHwgQUNQSV9QRENfRVNUX0NBUEFCSUxJ VFlfU1dTTVApOwotCi0Jc2V0X3hlbl9ndWVzdF9oYW5kbGUob3AudS5zZXRfcG1pbmZvLnBkYywg YnVmKTsKLQotCWlmICgoSFlQRVJWSVNPUl9wbGF0Zm9ybV9vcCgmb3ApID09IDApICYmCi0JICAg IChidWZbMl0gJiAoQUNQSV9QRENfQ19DMV9GRkggfCBBQ1BJX1BEQ19DX0MyQzNfRkZIKSkpIHsK LQkJY3B1aWRfbGVhZjVfZWN4X3ZhbCA9IGN4OwotCQljcHVpZF9sZWFmNV9lZHhfdmFsID0gZHg7 Ci0JfQotCXJldHVybiB0cnVlOwotI2Vsc2UKLQlyZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLXN0 YXRpYyB2b2lkIF9faW5pdCB4ZW5faW5pdF9jcHVpZF9tYXNrKHZvaWQpCi17Ci0JdW5zaWduZWQg aW50IGF4LCBieCwgY3gsIGR4OwotCXVuc2lnbmVkIGludCB4c2F2ZV9tYXNrOwotCi0JY3B1aWRf bGVhZjFfZWR4X21hc2sgPQotCQl+KCgxIDw8IFg4Nl9GRUFUVVJFX01UUlIpIHwgIC8qIGRpc2Fi bGUgTVRSUiAqLwotCQkgICgxIDw8IFg4Nl9GRUFUVVJFX0FDQykpOyAgIC8qIHRoZXJtYWwgbW9u aXRvcmluZyAqLwotCi0JaWYgKCF4ZW5faW5pdGlhbF9kb21haW4oKSkKLQkJY3B1aWRfbGVhZjFf ZWR4X21hc2sgJj0KLQkJCX4oKDEgPDwgWDg2X0ZFQVRVUkVfQUNQSSkpOyAgLyogZGlzYWJsZSBB Q1BJICovCi0KLQljcHVpZF9sZWFmMV9lY3hfbWFzayAmPSB+KDEgPDwgKFg4Nl9GRUFUVVJFX1gy QVBJQyAlIDMyKSk7Ci0KLQlheCA9IDE7Ci0JY3ggPSAwOwotCWNwdWlkKDEsICZheCwgJmJ4LCAm Y3gsICZkeCk7Ci0KLQl4c2F2ZV9tYXNrID0KLQkJKDEgPDwgKFg4Nl9GRUFUVVJFX1hTQVZFICUg MzIpKSB8Ci0JCSgxIDw8IChYODZfRkVBVFVSRV9PU1hTQVZFICUgMzIpKTsKLQotCS8qIFhlbiB3 aWxsIHNldCBDUjQuT1NYU0FWRSBpZiBzdXBwb3J0ZWQgYW5kIG5vdCBkaXNhYmxlZCBieSBmb3Jj ZSAqLwotCWlmICgoY3ggJiB4c2F2ZV9tYXNrKSAhPSB4c2F2ZV9tYXNrKQotCQljcHVpZF9sZWFm MV9lY3hfbWFzayAmPSB+eHNhdmVfbWFzazsgLyogZGlzYWJsZSBYU0FWRSAmIE9TWFNBVkUgKi8K LQlpZiAoeGVuX2NoZWNrX213YWl0KCkpCi0JCWNwdWlkX2xlYWYxX2VjeF9zZXRfbWFzayA9ICgx IDw8IChYODZfRkVBVFVSRV9NV0FJVCAlIDMyKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zZXRf ZGVidWdyZWcoaW50IHJlZywgdW5zaWduZWQgbG9uZyB2YWwpCi17Ci0JSFlQRVJWSVNPUl9zZXRf ZGVidWdyZWcocmVnLCB2YWwpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fZ2V0X2Rl YnVncmVnKGludCByZWcpCi17Ci0JcmV0dXJuIEhZUEVSVklTT1JfZ2V0X2RlYnVncmVnKHJlZyk7 Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9lbmRfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3Ry dWN0ICpuZXh0KQotewotCXhlbl9tY19mbHVzaCgpOwotCXBhcmF2aXJ0X2VuZF9jb250ZXh0X3N3 aXRjaChuZXh0KTsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgeGVuX3N0b3JlX3RyKHZvaWQp Ci17Ci0JcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBTZXQgdGhlIHBhZ2UgcGVybWlzc2lvbnMgZm9y IGEgcGFydGljdWxhciB2aXJ0dWFsIGFkZHJlc3MuICBJZiB0aGUKLSAqIGFkZHJlc3MgaXMgYSB2 bWFsbG9jIG1hcHBpbmcgKG9yIG90aGVyIG5vbi1saW5lYXIgbWFwcGluZyksIHRoZW4KLSAqIGZp bmQgdGhlIGxpbmVhciBtYXBwaW5nIG9mIHRoZSBwYWdlIGFuZCBhbHNvIHNldCBpdHMgcHJvdGVj dGlvbnMgdG8KLSAqIG1hdGNoLgotICovCi1zdGF0aWMgdm9pZCBzZXRfYWxpYXNlZF9wcm90KHZv aWQgKnYsIHBncHJvdF90IHByb3QpCi17Ci0JaW50IGxldmVsOwotCXB0ZV90ICpwdGVwOwotCXB0 ZV90IHB0ZTsKLQl1bnNpZ25lZCBsb25nIHBmbjsKLQlzdHJ1Y3QgcGFnZSAqcGFnZTsKLQl1bnNp Z25lZCBjaGFyIGR1bW15OwotCi0JcHRlcCA9IGxvb2t1cF9hZGRyZXNzKCh1bnNpZ25lZCBsb25n KXYsICZsZXZlbCk7Ci0JQlVHX09OKHB0ZXAgPT0gTlVMTCk7Ci0KLQlwZm4gPSBwdGVfcGZuKCpw dGVwKTsKLQlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQotCXB0ZSA9IHBmbl9wdGUocGZuLCBw cm90KTsKLQotCS8qCi0JICogQ2FyZWZ1bDogdXBkYXRlX3ZhX21hcHBpbmcoKSB3aWxsIGZhaWwg aWYgdGhlIHZpcnR1YWwgYWRkcmVzcwotCSAqIHdlJ3JlIHBva2luZyBpc24ndCBwb3B1bGF0ZWQg aW4gdGhlIHBhZ2UgdGFibGVzLiAgV2UgZG9uJ3QKLQkgKiBuZWVkIHRvIHdvcnJ5IGFib3V0IHRo ZSBkaXJlY3QgbWFwICh0aGF0J3MgYWx3YXlzIGluIHRoZSBwYWdlCi0JICogdGFibGVzKSwgYnV0 IHdlIG5lZWQgdG8gYmUgY2FyZWZ1bCBhYm91dCB2bWFwIHNwYWNlLiAgSW4KLQkgKiBwYXJ0aWN1 bGFyLCB0aGUgdG9wIGxldmVsIHBhZ2UgdGFibGUgY2FuIGxhemlseSBwcm9wYWdhdGUKLQkgKiBl bnRyaWVzIGJldHdlZW4gcHJvY2Vzc2VzLCBzbyBpZiB3ZSd2ZSBzd2l0Y2hlZCBtbXMgc2luY2Ug d2UKLQkgKiB2bWFwcGVkIHRoZSB0YXJnZXQgaW4gdGhlIGZpcnN0IHBsYWNlLCB3ZSBtaWdodCBu b3QgaGF2ZSB0aGUKLQkgKiB0b3AtbGV2ZWwgcGFnZSB0YWJsZSBlbnRyeSBwb3B1bGF0ZWQuCi0J ICoKLQkgKiBXZSBkaXNhYmxlIHByZWVtcHRpb24gYmVjYXVzZSB3ZSB3YW50IHRoZSBzYW1lIG1t IGFjdGl2ZSB3aGVuCi0JICogd2UgcHJvYmUgdGhlIHRhcmdldCBhbmQgd2hlbiB3ZSBpc3N1ZSB0 aGUgaHlwZXJjYWxsLiAgV2UnbGwKLQkgKiBoYXZlIHRoZSBzYW1lIG5vbWluYWwgbW0sIGJ1dCBp ZiB3ZSdyZSBhIGtlcm5lbCB0aHJlYWQsIGxhenkKLQkgKiBtbSBkcm9wcGluZyBjb3VsZCBjaGFu Z2Ugb3VyIHBnZC4KLQkgKgotCSAqIE91dCBvZiBhbiBhYnVuZGFuY2Ugb2YgY2F1dGlvbiwgdGhp cyB1c2VzIF9fZ2V0X3VzZXIoKSB0byBmYXVsdAotCSAqIGluIHRoZSB0YXJnZXQgYWRkcmVzcyBq dXN0IGluIGNhc2UgdGhlcmUncyBzb21lIG9ic2N1cmUgY2FzZQotCSAqIGluIHdoaWNoIHRoZSB0 YXJnZXQgYWRkcmVzcyBpc24ndCByZWFkYWJsZS4KLQkgKi8KLQotCXByZWVtcHRfZGlzYWJsZSgp OwotCi0JcHJvYmVfa2VybmVsX3JlYWQoJmR1bW15LCB2LCAxKTsKLQotCWlmIChIWVBFUlZJU09S X3VwZGF0ZV92YV9tYXBwaW5nKCh1bnNpZ25lZCBsb25nKXYsIHB0ZSwgMCkpCi0JCUJVRygpOwot Ci0JaWYgKCFQYWdlSGlnaE1lbShwYWdlKSkgewotCQl2b2lkICphdiA9IF9fdmEoUEZOX1BIWVMo cGZuKSk7Ci0KLQkJaWYgKGF2ICE9IHYpCi0JCQlpZiAoSFlQRVJWSVNPUl91cGRhdGVfdmFfbWFw cGluZygodW5zaWduZWQgbG9uZylhdiwgcHRlLCAwKSkKLQkJCQlCVUcoKTsKLQl9IGVsc2UKLQkJ a21hcF9mbHVzaF91bnVzZWQoKTsKLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KLXN0YXRpYyB2 b2lkIHhlbl9hbGxvY19sZHQoc3RydWN0IGRlc2Nfc3RydWN0ICpsZHQsIHVuc2lnbmVkIGVudHJp ZXMpCi17Ci0JY29uc3QgdW5zaWduZWQgZW50cmllc19wZXJfcGFnZSA9IFBBR0VfU0laRSAvIExE VF9FTlRSWV9TSVpFOwotCWludCBpOwotCi0JLyoKLQkgKiBXZSBuZWVkIHRvIG1hcmsgdGhlIGFs bCBhbGlhc2VzIG9mIHRoZSBMRFQgcGFnZXMgUk8uICBXZQotCSAqIGRvbid0IG5lZWQgdG8gY2Fs bCB2bV9mbHVzaF9hbGlhc2VzKCksIHRob3VnaCwgc2luY2UgdGhhdCdzCi0JICogb25seSByZXNw b25zaWJsZSBmb3IgZmx1c2hpbmcgYWxpYXNlcyBvdXQgdGhlIFRMQnMsIG5vdCB0aGUKLQkgKiBw YWdlIHRhYmxlcywgYW5kIFhlbiB3aWxsIGZsdXNoIHRoZSBUTEIgZm9yIHVzIGlmIG5lZWRlZC4K LQkgKgotCSAqIFRvIGF2b2lkIGNvbmZ1c2luZyBmdXR1cmUgcmVhZGVyczogbm9uZSBvZiB0aGlz IGlzIG5lY2Vzc2FyeQotCSAqIHRvIGxvYWQgdGhlIExEVC4gIFRoZSBoeXBlcnZpc29yIG9ubHkg Y2hlY2tzIHRoaXMgd2hlbiB0aGUKLQkgKiBMRFQgaXMgZmF1bHRlZCBpbiBkdWUgdG8gc3Vic2Vx dWVudCBkZXNjcmlwdG9yIGFjY2Vzcy4KLQkgKi8KLQotCWZvcihpID0gMDsgaSA8IGVudHJpZXM7 IGkgKz0gZW50cmllc19wZXJfcGFnZSkKLQkJc2V0X2FsaWFzZWRfcHJvdChsZHQgKyBpLCBQQUdF X0tFUk5FTF9STyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9mcmVlX2xkdChzdHJ1Y3QgZGVzY19z dHJ1Y3QgKmxkdCwgdW5zaWduZWQgZW50cmllcykKLXsKLQljb25zdCB1bnNpZ25lZCBlbnRyaWVz X3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gTERUX0VOVFJZX1NJWkU7Ci0JaW50IGk7Ci0KLQlmb3Io aSA9IDA7IGkgPCBlbnRyaWVzOyBpICs9IGVudHJpZXNfcGVyX3BhZ2UpCi0JCXNldF9hbGlhc2Vk X3Byb3QobGR0ICsgaSwgUEFHRV9LRVJORUwpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fc2V0X2xk dChjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBlbnRyaWVzKQotewotCXN0cnVjdCBtbXVleHRf b3AgKm9wOwotCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWNzID0geGVuX21jX2VudHJ5KHNpemVv Zigqb3ApKTsKLQotCXRyYWNlX3hlbl9jcHVfc2V0X2xkdChhZGRyLCBlbnRyaWVzKTsKLQotCW9w ID0gbWNzLmFyZ3M7Ci0Jb3AtPmNtZCA9IE1NVUVYVF9TRVRfTERUOwotCW9wLT5hcmcxLmxpbmVh cl9hZGRyID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKLQlvcC0+YXJnMi5ucl9lbnRzID0gZW50cmll czsKLQotCU1VTFRJX21tdWV4dF9vcChtY3MubWMsIG9wLCAxLCBOVUxMLCBET01JRF9TRUxGKTsK LQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhl bl9sb2FkX2dkdChjb25zdCBzdHJ1Y3QgZGVzY19wdHIgKmR0cikKLXsKLQl1bnNpZ25lZCBsb25n IHZhID0gZHRyLT5hZGRyZXNzOwotCXVuc2lnbmVkIGludCBzaXplID0gZHRyLT5zaXplICsgMTsK LQl1bnNpZ25lZCBwYWdlcyA9IERJVl9ST1VORF9VUChzaXplLCBQQUdFX1NJWkUpOwotCXVuc2ln bmVkIGxvbmcgZnJhbWVzW3BhZ2VzXTsKLQlpbnQgZjsKLQotCS8qCi0JICogQSBHRFQgY2FuIGJl IHVwIHRvIDY0ayBpbiBzaXplLCB3aGljaCBjb3JyZXNwb25kcyB0byA4MTkyCi0JICogOC1ieXRl IGVudHJpZXMsIG9yIDE2IDRrIHBhZ2VzLi4KLQkgKi8KLQotCUJVR19PTihzaXplID4gNjU1MzYp OwotCUJVR19PTih2YSAmIH5QQUdFX01BU0spOwotCi0JZm9yIChmID0gMDsgdmEgPCBkdHItPmFk ZHJlc3MgKyBzaXplOyB2YSArPSBQQUdFX1NJWkUsIGYrKykgewotCQlpbnQgbGV2ZWw7Ci0JCXB0 ZV90ICpwdGVwOwotCQl1bnNpZ25lZCBsb25nIHBmbiwgbWZuOwotCQl2b2lkICp2aXJ0OwotCi0J CS8qCi0JCSAqIFRoZSBHRFQgaXMgcGVyLWNwdSBhbmQgaXMgaW4gdGhlIHBlcmNwdSBkYXRhIGFy ZWEuCi0JCSAqIFRoYXQgY2FuIGJlIHZpcnR1YWxseSBtYXBwZWQsIHNvIHdlIG5lZWQgdG8gZG8g YQotCQkgKiBwYWdlLXdhbGsgdG8gZ2V0IHRoZSB1bmRlcmx5aW5nIE1GTiBmb3IgdGhlCi0JCSAq IGh5cGVyY2FsbC4gIFRoZSBwYWdlIGNhbiBhbHNvIGJlIGluIHRoZSBrZXJuZWwncwotCQkgKiBs aW5lYXIgcmFuZ2UsIHNvIHdlIG5lZWQgdG8gUk8gdGhhdCBtYXBwaW5nIHRvby4KLQkJICovCi0J CXB0ZXAgPSBsb29rdXBfYWRkcmVzcyh2YSwgJmxldmVsKTsKLQkJQlVHX09OKHB0ZXAgPT0gTlVM TCk7Ci0KLQkJcGZuID0gcHRlX3BmbigqcHRlcCk7Ci0JCW1mbiA9IHBmbl90b19tZm4ocGZuKTsK LQkJdmlydCA9IF9fdmEoUEZOX1BIWVMocGZuKSk7Ci0KLQkJZnJhbWVzW2ZdID0gbWZuOwotCi0J CW1ha2VfbG93bWVtX3BhZ2VfcmVhZG9ubHkoKHZvaWQgKil2YSk7Ci0JCW1ha2VfbG93bWVtX3Bh Z2VfcmVhZG9ubHkodmlydCk7Ci0JfQotCi0JaWYgKEhZUEVSVklTT1Jfc2V0X2dkdChmcmFtZXMs IHNpemUgLyBzaXplb2Yoc3RydWN0IGRlc2Nfc3RydWN0KSkpCi0JCUJVRygpOwotfQotCi0vKgot ICogbG9hZF9nZHQgZm9yIGVhcmx5IGJvb3QsIHdoZW4gdGhlIGdkdCBpcyBvbmx5IG1hcHBlZCBv bmNlCi0gKi8KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fbG9hZF9nZHRfYm9vdChjb25zdCBzdHJ1 Y3QgZGVzY19wdHIgKmR0cikKLXsKLQl1bnNpZ25lZCBsb25nIHZhID0gZHRyLT5hZGRyZXNzOwot CXVuc2lnbmVkIGludCBzaXplID0gZHRyLT5zaXplICsgMTsKLQl1bnNpZ25lZCBwYWdlcyA9IERJ Vl9ST1VORF9VUChzaXplLCBQQUdFX1NJWkUpOwotCXVuc2lnbmVkIGxvbmcgZnJhbWVzW3BhZ2Vz XTsKLQlpbnQgZjsKLQotCS8qCi0JICogQSBHRFQgY2FuIGJlIHVwIHRvIDY0ayBpbiBzaXplLCB3 aGljaCBjb3JyZXNwb25kcyB0byA4MTkyCi0JICogOC1ieXRlIGVudHJpZXMsIG9yIDE2IDRrIHBh Z2VzLi4KLQkgKi8KLQotCUJVR19PTihzaXplID4gNjU1MzYpOwotCUJVR19PTih2YSAmIH5QQUdF X01BU0spOwotCi0JZm9yIChmID0gMDsgdmEgPCBkdHItPmFkZHJlc3MgKyBzaXplOyB2YSArPSBQ QUdFX1NJWkUsIGYrKykgewotCQlwdGVfdCBwdGU7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuLCBtZm47 Ci0KLQkJcGZuID0gdmlydF90b19wZm4odmEpOwotCQltZm4gPSBwZm5fdG9fbWZuKHBmbik7Ci0K LQkJcHRlID0gcGZuX3B0ZShwZm4sIFBBR0VfS0VSTkVMX1JPKTsKLQotCQlpZiAoSFlQRVJWSVNP Ul91cGRhdGVfdmFfbWFwcGluZygodW5zaWduZWQgbG9uZyl2YSwgcHRlLCAwKSkKLQkJCUJVRygp OwotCi0JCWZyYW1lc1tmXSA9IG1mbjsKLQl9Ci0KLQlpZiAoSFlQRVJWSVNPUl9zZXRfZ2R0KGZy YW1lcywgc2l6ZSAvIHNpemVvZihzdHJ1Y3QgZGVzY19zdHJ1Y3QpKSkKLQkJQlVHKCk7Ci19Ci0K LXN0YXRpYyBpbmxpbmUgYm9vbCBkZXNjX2VxdWFsKGNvbnN0IHN0cnVjdCBkZXNjX3N0cnVjdCAq ZDEsCi0JCQkgICAgICBjb25zdCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmQyKQotewotCXJldHVybiBk MS0+YSA9PSBkMi0+YSAmJiBkMS0+YiA9PSBkMi0+YjsKLX0KLQotc3RhdGljIHZvaWQgbG9hZF9U TFNfZGVzY3JpcHRvcihzdHJ1Y3QgdGhyZWFkX3N0cnVjdCAqdCwKLQkJCQl1bnNpZ25lZCBpbnQg Y3B1LCB1bnNpZ25lZCBpbnQgaSkKLXsKLQlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKnNoYWRvdyA9ICZw ZXJfY3B1KHNoYWRvd190bHNfZGVzYywgY3B1KS5kZXNjW2ldOwotCXN0cnVjdCBkZXNjX3N0cnVj dCAqZ2R0OwotCXhtYWRkcl90IG1hZGRyOwotCXN0cnVjdCBtdWx0aWNhbGxfc3BhY2UgbWM7Ci0K LQlpZiAoZGVzY19lcXVhbChzaGFkb3csICZ0LT50bHNfYXJyYXlbaV0pKQotCQlyZXR1cm47Ci0K LQkqc2hhZG93ID0gdC0+dGxzX2FycmF5W2ldOwotCi0JZ2R0ID0gZ2V0X2NwdV9nZHRfdGFibGUo Y3B1KTsKLQltYWRkciA9IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUoJmdkdFtHRFRfRU5UUllf VExTX01JTitpXSk7Ci0JbWMgPSBfX3hlbl9tY19lbnRyeSgwKTsKLQotCU1VTFRJX3VwZGF0ZV9k ZXNjcmlwdG9yKG1jLm1jLCBtYWRkci5tYWRkciwgdC0+dGxzX2FycmF5W2ldKTsKLX0KLQotc3Rh dGljIHZvaWQgeGVuX2xvYWRfdGxzKHN0cnVjdCB0aHJlYWRfc3RydWN0ICp0LCB1bnNpZ25lZCBp bnQgY3B1KQotewotCS8qCi0JICogWFhYIHNsZWF6eSBoYWNrOiBJZiB3ZSdyZSBiZWluZyBjYWxs ZWQgaW4gYSBsYXp5LWNwdSB6b25lCi0JICogYW5kIGxhenkgZ3MgaGFuZGxpbmcgaXMgZW5hYmxl ZCwgaXQgbWVhbnMgd2UncmUgaW4gYQotCSAqIGNvbnRleHQgc3dpdGNoLCBhbmQgJWdzIGhhcyBq dXN0IGJlZW4gc2F2ZWQuICBUaGlzIG1lYW5zIHdlCi0JICogY2FuIHplcm8gaXQgb3V0IHRvIHBy ZXZlbnQgZmF1bHRzIG9uIGV4aXQgZnJvbSB0aGUKLQkgKiBoeXBlcnZpc29yIGlmIHRoZSBuZXh0 IHByb2Nlc3MgaGFzIG5vICVncy4gIEVpdGhlciB3YXksIGl0Ci0JICogaGFzIGJlZW4gc2F2ZWQs IGFuZCB0aGUgbmV3IHZhbHVlIHdpbGwgZ2V0IGxvYWRlZCBwcm9wZXJseS4KLQkgKiBUaGlzIHdp bGwgZ28gYXdheSBhcyBzb29uIGFzIFhlbiBoYXMgYmVlbiBtb2RpZmllZCB0byBub3QKLQkgKiBz YXZlL3Jlc3RvcmUgJWdzIGZvciBub3JtYWwgaHlwZXJjYWxscy4KLQkgKgotCSAqIE9uIHg4Nl82 NCwgdGhpcyBoYWNrIGlzIG5vdCB1c2VkIGZvciAlZ3MsIGJlY2F1c2UgZ3MgcG9pbnRzCi0JICog dG8gS0VSTkVMX0dTX0JBU0UgKGFuZCB1c2VzIGl0IGZvciBQREEgcmVmZXJlbmNlcyksIHNvIHdl Ci0JICogbXVzdCBub3QgemVybyAlZ3Mgb24geDg2XzY0Ci0JICoKLQkgKiBGb3IgeDg2XzY0LCB3 ZSBuZWVkIHRvIHplcm8gJWZzLCBvdGhlcndpc2Ugd2UgbWF5IGdldCBhbgotCSAqIGV4Y2VwdGlv biBiZXR3ZWVuIHRoZSBuZXcgJWZzIGRlc2NyaXB0b3IgYmVpbmcgbG9hZGVkIGFuZAotCSAqICVm cyBiZWluZyBlZmZlY3RpdmVseSBjbGVhcmVkIGF0IF9fc3dpdGNoX3RvKCkuCi0JICovCi0JaWYg KHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSA9PSBQQVJBVklSVF9MQVpZX0NQVSkgewotI2lmZGVm IENPTkZJR19YODZfMzIKLQkJbGF6eV9sb2FkX2dzKDApOwotI2Vsc2UKLQkJbG9hZHNlZ21lbnQo ZnMsIDApOwotI2VuZGlmCi0JfQotCi0JeGVuX21jX2JhdGNoKCk7Ci0KLQlsb2FkX1RMU19kZXNj cmlwdG9yKHQsIGNwdSwgMCk7Ci0JbG9hZF9UTFNfZGVzY3JpcHRvcih0LCBjcHUsIDEpOwotCWxv YWRfVExTX2Rlc2NyaXB0b3IodCwgY3B1LCAyKTsKLQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9M QVpZX0NQVSk7Ci19CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCXhlbl9wbXVfZmluaXNo KGNwdSk7CiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci1zdGF0aWMgdm9pZCB4ZW5fbG9hZF9nc19p bmRleCh1bnNpZ25lZCBpbnQgaWR4KQotewotCWlmIChIWVBFUlZJU09SX3NldF9zZWdtZW50X2Jh c2UoU0VHQkFTRV9HU19VU0VSX1NFTCwgaWR4KSkKKwlpZiAoSFlQRVJWSVNPUl9zY2hlZF9vcChT Q0hFRE9QX3NodXRkb3duLCAmcikpCiAJCUJVRygpOwogfQotI2VuZGlmCiAKLXN0YXRpYyB2b2lk IHhlbl93cml0ZV9sZHRfZW50cnkoc3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVudHJ5bnVt LAotCQkJCWNvbnN0IHZvaWQgKnB0cikKK3ZvaWQgeGVuX2VtZXJnZW5jeV9yZXN0YXJ0KHZvaWQp CiB7Ci0JeG1hZGRyX3QgbWFjaF9scCA9IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUoJmR0W2Vu dHJ5bnVtXSk7Ci0JdTY0IGVudHJ5ID0gKih1NjQgKilwdHI7Ci0KLQl0cmFjZV94ZW5fY3B1X3dy aXRlX2xkdF9lbnRyeShkdCwgZW50cnludW0sIGVudHJ5KTsKLQotCXByZWVtcHRfZGlzYWJsZSgp OwotCi0JeGVuX21jX2ZsdXNoKCk7Ci0JaWYgKEhZUEVSVklTT1JfdXBkYXRlX2Rlc2NyaXB0b3Io bWFjaF9scC5tYWRkciwgZW50cnkpKQotCQlCVUcoKTsKLQotCXByZWVtcHRfZW5hYmxlKCk7CisJ eGVuX3JlYm9vdChTSFVURE9XTl9yZWJvb3QpOwogfQogCi1zdGF0aWMgaW50IGN2dF9nYXRlX3Rv X3RyYXAoaW50IHZlY3RvciwgY29uc3QgZ2F0ZV9kZXNjICp2YWwsCi0JCQkgICAgc3RydWN0IHRy YXBfaW5mbyAqaW5mbykKK3N0YXRpYyBpbnQKK3hlbl9wYW5pY19ldmVudChzdHJ1Y3Qgbm90aWZp ZXJfYmxvY2sgKnRoaXMsIHVuc2lnbmVkIGxvbmcgZXZlbnQsIHZvaWQgKnB0cikKIHsKLQl1bnNp Z25lZCBsb25nIGFkZHI7Ci0KLQlpZiAodmFsLT50eXBlICE9IEdBVEVfVFJBUCAmJiB2YWwtPnR5 cGUgIT0gR0FURV9JTlRFUlJVUFQpCi0JCXJldHVybiAwOwotCi0JaW5mby0+dmVjdG9yID0gdmVj dG9yOwotCi0JYWRkciA9IGdhdGVfb2Zmc2V0KCp2YWwpOwotI2lmZGVmIENPTkZJR19YODZfNjQK LQkvKgotCSAqIExvb2sgZm9yIGtub3duIHRyYXBzIHVzaW5nIElTVCwgYW5kIHN1YnN0aXR1dGUg dGhlbQotCSAqIGFwcHJvcHJpYXRlbHkuICBUaGUgZGVidWdnZXIgb25lcyBhcmUgdGhlIG9ubHkg b25lcyB3ZSBjYXJlCi0JICogYWJvdXQuICBYZW4gd2lsbCBoYW5kbGUgZmF1bHRzIGxpa2UgZG91 YmxlX2ZhdWx0LAotCSAqIHNvIHdlIHNob3VsZCBuZXZlciBzZWUgdGhlbS4gIFdhcm4gaWYKLQkg KiB0aGVyZSdzIGFuIHVuZXhwZWN0ZWQgSVNULXVzaW5nIGZhdWx0IGhhbmRsZXIuCi0JICovCi0J aWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpZGVidWcpCi0JCWFkZHIgPSAodW5zaWduZWQgbG9u Zyl4ZW5fZGVidWc7Ci0JZWxzZSBpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZylpbnQzKQotCQlh ZGRyID0gKHVuc2lnbmVkIGxvbmcpeGVuX2ludDM7Ci0JZWxzZSBpZiAoYWRkciA9PSAodW5zaWdu ZWQgbG9uZylzdGFja19zZWdtZW50KQotCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpeGVuX3N0YWNr X3NlZ21lbnQ7Ci0JZWxzZSBpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZylkb3VibGVfZmF1bHQp IHsKLQkJLyogRG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhlc2UgKi8KLQkJcmV0dXJuIDA7Ci0jaWZk ZWYgQ09ORklHX1g4Nl9NQ0UKLQl9IGVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpbWFj aGluZV9jaGVjaykgewotCQkvKgotCQkgKiB3aGVuIHhlbiBoeXBlcnZpc29yIGluamVjdCB2TUNF IHRvIGd1ZXN0LAotCQkgKiB1c2UgbmF0aXZlIG1jZSBoYW5kbGVyIHRvIGhhbmRsZSBpdAotCQkg Ki8KLQkJOwotI2VuZGlmCi0JfSBlbHNlIGlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKW5taSkK LQkJLyoKLQkJICogVXNlIHRoZSBuYXRpdmUgdmVyc2lvbiBhcyB3ZWxsLgotCQkgKi8KLQkJOwot CWVsc2UgewotCQkvKiBTb21lIG90aGVyIHRyYXAgdXNpbmcgSVNUPyAqLwotCQlpZiAoV0FSTl9P Tih2YWwtPmlzdCAhPSAwKSkKLQkJCXJldHVybiAwOwotCX0KLSNlbmRpZgkvKiBDT05GSUdfWDg2 XzY0ICovCi0JaW5mby0+YWRkcmVzcyA9IGFkZHI7Ci0KLQlpbmZvLT5jcyA9IGdhdGVfc2VnbWVu dCgqdmFsKTsKLQlpbmZvLT5mbGFncyA9IHZhbC0+ZHBsOwotCS8qIGludGVycnVwdCBnYXRlcyBj bGVhciBJRiAqLwotCWlmICh2YWwtPnR5cGUgPT0gR0FURV9JTlRFUlJVUFQpCi0JCWluZm8tPmZs YWdzIHw9IDEgPDwgMjsKLQotCXJldHVybiAxOworCWlmICgha2V4ZWNfY3Jhc2hfbG9hZGVkKCkp CisJCXhlbl9yZWJvb3QoU0hVVERPV05fY3Jhc2gpOworCXJldHVybiBOT1RJRllfRE9ORTsKIH0K IAotLyogTG9jYXRpb25zIG9mIGVhY2ggQ1BVJ3MgSURUICovCi1zdGF0aWMgREVGSU5FX1BFUl9D UFUoc3RydWN0IGRlc2NfcHRyLCBpZHRfZGVzYyk7Ci0KLS8qIFNldCBhbiBJRFQgZW50cnkuICBJ ZiB0aGUgZW50cnkgaXMgcGFydCBvZiB0aGUgY3VycmVudCBJRFQsIHRoZW4KLSAgIGFsc28gdXBk YXRlIFhlbi4gKi8KLXN0YXRpYyB2b2lkIHhlbl93cml0ZV9pZHRfZW50cnkoZ2F0ZV9kZXNjICpk dCwgaW50IGVudHJ5bnVtLCBjb25zdCBnYXRlX2Rlc2MgKmcpCi17Ci0JdW5zaWduZWQgbG9uZyBw ID0gKHVuc2lnbmVkIGxvbmcpJmR0W2VudHJ5bnVtXTsKLQl1bnNpZ25lZCBsb25nIHN0YXJ0LCBl bmQ7Ci0KLQl0cmFjZV94ZW5fY3B1X3dyaXRlX2lkdF9lbnRyeShkdCwgZW50cnludW0sIGcpOwot Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0KLQlzdGFydCA9IF9fdGhpc19jcHVfcmVhZChpZHRfZGVz Yy5hZGRyZXNzKTsKLQllbmQgPSBzdGFydCArIF9fdGhpc19jcHVfcmVhZChpZHRfZGVzYy5zaXpl KSArIDE7Ci0KLQl4ZW5fbWNfZmx1c2goKTsKLQotCW5hdGl2ZV93cml0ZV9pZHRfZW50cnkoZHQs IGVudHJ5bnVtLCBnKTsKLQotCWlmIChwID49IHN0YXJ0ICYmIChwICsgOCkgPD0gZW5kKSB7Ci0J CXN0cnVjdCB0cmFwX2luZm8gaW5mb1syXTsKLQotCQlpbmZvWzFdLmFkZHJlc3MgPSAwOwotCi0J CWlmIChjdnRfZ2F0ZV90b190cmFwKGVudHJ5bnVtLCBnLCAmaW5mb1swXSkpCi0JCQlpZiAoSFlQ RVJWSVNPUl9zZXRfdHJhcF90YWJsZShpbmZvKSkKLQkJCQlCVUcoKTsKLQl9Ci0KLQlwcmVlbXB0 X2VuYWJsZSgpOwotfQorc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB4ZW5fcGFuaWNfYmxv Y2sgPSB7CisJLm5vdGlmaWVyX2NhbGwgPSB4ZW5fcGFuaWNfZXZlbnQsCisJLnByaW9yaXR5ID0g SU5UX01JTgorfTsKIAotc3RhdGljIHZvaWQgeGVuX2NvbnZlcnRfdHJhcF9pbmZvKGNvbnN0IHN0 cnVjdCBkZXNjX3B0ciAqZGVzYywKLQkJCQkgIHN0cnVjdCB0cmFwX2luZm8gKnRyYXBzKQoraW50 IHhlbl9wYW5pY19oYW5kbGVyX2luaXQodm9pZCkKIHsKLQl1bnNpZ25lZCBpbiwgb3V0LCBjb3Vu dDsKLQotCWNvdW50ID0gKGRlc2MtPnNpemUrMSkgLyBzaXplb2YoZ2F0ZV9kZXNjKTsKLQlCVUdf T04oY291bnQgPiAyNTYpOwotCi0JZm9yIChpbiA9IG91dCA9IDA7IGluIDwgY291bnQ7IGluKysp IHsKLQkJZ2F0ZV9kZXNjICplbnRyeSA9IChnYXRlX2Rlc2MqKShkZXNjLT5hZGRyZXNzKSArIGlu OwotCi0JCWlmIChjdnRfZ2F0ZV90b190cmFwKGluLCBlbnRyeSwgJnRyYXBzW291dF0pKQotCQkJ b3V0Kys7Ci0JfQotCXRyYXBzW291dF0uYWRkcmVzcyA9IDA7CisJYXRvbWljX25vdGlmaWVyX2No YWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LCAmeGVuX3BhbmljX2Jsb2NrKTsKKwly ZXR1cm4gMDsKIH0KIAotdm9pZCB4ZW5fY29weV90cmFwX2luZm8oc3RydWN0IHRyYXBfaW5mbyAq dHJhcHMpCi17Ci0JY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkZXNjID0gdGhpc19jcHVfcHRyKCZp ZHRfZGVzYyk7Ci0KLQl4ZW5fY29udmVydF90cmFwX2luZm8oZGVzYywgdHJhcHMpOwotfQotCi0v KiBMb2FkIGEgbmV3IElEVCBpbnRvIFhlbi4gIEluIHByaW5jaXBsZSB0aGlzIGNhbiBiZSBwZXIt Q1BVLCBzbyB3ZQotICAgaG9sZCBhIHNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHN0YXRpYyB0cmFw c1tdIGFycmF5IChzdGF0aWMgYmVjYXVzZQotICAgaXQgYXZvaWRzIGFsbG9jYXRpb24sIGFuZCBz YXZlcyBzdGFjayBzcGFjZSkuICovCi1zdGF0aWMgdm9pZCB4ZW5fbG9hZF9pZHQoY29uc3Qgc3Ry dWN0IGRlc2NfcHRyICpkZXNjKQotewotCXN0YXRpYyBERUZJTkVfU1BJTkxPQ0sobG9jayk7Ci0J c3RhdGljIHN0cnVjdCB0cmFwX2luZm8gdHJhcHNbMjU3XTsKLQotCXRyYWNlX3hlbl9jcHVfbG9h ZF9pZHQoZGVzYyk7Ci0KLQlzcGluX2xvY2soJmxvY2spOwotCi0JbWVtY3B5KHRoaXNfY3B1X3B0 cigmaWR0X2Rlc2MpLCBkZXNjLCBzaXplb2YoaWR0X2Rlc2MpKTsKLQotCXhlbl9jb252ZXJ0X3Ry YXBfaW5mbyhkZXNjLCB0cmFwcyk7Ci0KLQl4ZW5fbWNfZmx1c2goKTsKLQlpZiAoSFlQRVJWSVNP Ul9zZXRfdHJhcF90YWJsZSh0cmFwcykpCi0JCUJVRygpOwotCi0Jc3Bpbl91bmxvY2soJmxvY2sp OwotfQotCi0vKiBXcml0ZSBhIEdEVCBkZXNjcmlwdG9yIGVudHJ5LiAgSWdub3JlIExEVCBkZXNj cmlwdG9ycywgc2luY2UKLSAgIHRoZXkncmUgaGFuZGxlZCBkaWZmZXJlbnRseS4gKi8KLXN0YXRp YyB2b2lkIHhlbl93cml0ZV9nZHRfZW50cnkoc3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVu dHJ5LAotCQkJCWNvbnN0IHZvaWQgKmRlc2MsIGludCB0eXBlKQotewotCXRyYWNlX3hlbl9jcHVf d3JpdGVfZ2R0X2VudHJ5KGR0LCBlbnRyeSwgZGVzYywgdHlwZSk7Ci0KLQlwcmVlbXB0X2Rpc2Fi bGUoKTsKLQotCXN3aXRjaCAodHlwZSkgewotCWNhc2UgREVTQ19MRFQ6Ci0JY2FzZSBERVNDX1RT UzoKLQkJLyogaWdub3JlICovCi0JCWJyZWFrOwotCi0JZGVmYXVsdDogewotCQl4bWFkZHJfdCBt YWRkciA9IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUoJmR0W2VudHJ5XSk7Ci0KLQkJeGVuX21j X2ZsdXNoKCk7Ci0JCWlmIChIWVBFUlZJU09SX3VwZGF0ZV9kZXNjcmlwdG9yKG1hZGRyLm1hZGRy LCAqKHU2NCAqKWRlc2MpKQotCQkJQlVHKCk7Ci0JfQotCi0JfQotCi0JcHJlZW1wdF9lbmFibGUo KTsKLX0KLQotLyoKLSAqIFZlcnNpb24gb2Ygd3JpdGVfZ2R0X2VudHJ5IGZvciB1c2UgYXQgZWFy bHkgYm9vdC10aW1lIG5lZWRlZCB0bwotICogdXBkYXRlIGFuIGVudHJ5IGFzIHNpbXBseSBhcyBw b3NzaWJsZS4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHhlbl93cml0ZV9nZHRfZW50cnlfYm9v dChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LCBpbnQgZW50cnksCi0JCQkJCSAgICBjb25zdCB2b2lk ICpkZXNjLCBpbnQgdHlwZSkKLXsKLQl0cmFjZV94ZW5fY3B1X3dyaXRlX2dkdF9lbnRyeShkdCwg ZW50cnksIGRlc2MsIHR5cGUpOwotCi0Jc3dpdGNoICh0eXBlKSB7Ci0JY2FzZSBERVNDX0xEVDoK LQljYXNlIERFU0NfVFNTOgotCQkvKiBpZ25vcmUgKi8KLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OiB7 Ci0JCXhtYWRkcl90IG1hZGRyID0gdmlydF90b19tYWNoaW5lKCZkdFtlbnRyeV0pOwotCi0JCWlm IChIWVBFUlZJU09SX3VwZGF0ZV9kZXNjcmlwdG9yKG1hZGRyLm1hZGRyLCAqKHU2NCAqKWRlc2Mp KQotCQkJZHRbZW50cnldID0gKihzdHJ1Y3QgZGVzY19zdHJ1Y3QgKilkZXNjOwotCX0KLQotCX0K LX0KLQotc3RhdGljIHZvaWQgeGVuX2xvYWRfc3AwKHN0cnVjdCB0c3Nfc3RydWN0ICp0c3MsCi0J CQkgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCkKLXsKLQlzdHJ1Y3QgbXVsdGljYWxsX3Nw YWNlIG1jczsKLQotCW1jcyA9IHhlbl9tY19lbnRyeSgwKTsKLQlNVUxUSV9zdGFja19zd2l0Y2go bWNzLm1jLCBfX0tFUk5FTF9EUywgdGhyZWFkLT5zcDApOwotCXhlbl9tY19pc3N1ZShQQVJBVklS VF9MQVpZX0NQVSk7Ci0JdHNzLT54ODZfdHNzLnNwMCA9IHRocmVhZC0+c3AwOwotfQotCi12b2lk IHhlbl9zZXRfaW9wbF9tYXNrKHVuc2lnbmVkIG1hc2spCi17Ci0Jc3RydWN0IHBoeXNkZXZfc2V0 X2lvcGwgc2V0X2lvcGw7Ci0KLQkvKiBGb3JjZSB0aGUgY2hhbmdlIGF0IHJpbmcgMC4gKi8KLQlz ZXRfaW9wbC5pb3BsID0gKG1hc2sgPT0gMCkgPyAxIDogKG1hc2sgPj4gMTIpICYgMzsKLQlIWVBF UlZJU09SX3BoeXNkZXZfb3AoUEhZU0RFVk9QX3NldF9pb3BsLCAmc2V0X2lvcGwpOwotfQotCi1z dGF0aWMgdm9pZCB4ZW5faW9fZGVsYXkodm9pZCkKLXsKLX0KLQotc3RhdGljIERFRklORV9QRVJf Q1BVKHVuc2lnbmVkIGxvbmcsIHhlbl9jcjBfdmFsdWUpOwotCi1zdGF0aWMgdW5zaWduZWQgbG9u ZyB4ZW5fcmVhZF9jcjAodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGNyMCA9IHRoaXNfY3B1X3Jl YWQoeGVuX2NyMF92YWx1ZSk7Ci0KLQlpZiAodW5saWtlbHkoY3IwID09IDApKSB7Ci0JCWNyMCA9 IG5hdGl2ZV9yZWFkX2NyMCgpOwotCQl0aGlzX2NwdV93cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjAp OwotCX0KLQotCXJldHVybiBjcjA7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl93cml0ZV9jcjAodW5z aWduZWQgbG9uZyBjcjApCi17Ci0Jc3RydWN0IG11bHRpY2FsbF9zcGFjZSBtY3M7Ci0KLQl0aGlz X2NwdV93cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjApOwotCi0JLyogT25seSBwYXkgYXR0ZW50aW9u IHRvIGNyMC5UUzsgZXZlcnl0aGluZyBlbHNlIGlzCi0JICAgaWdub3JlZC4gKi8KLQltY3MgPSB4 ZW5fbWNfZW50cnkoMCk7Ci0KLQlNVUxUSV9mcHVfdGFza3N3aXRjaChtY3MubWMsIChjcjAgJiBY ODZfQ1IwX1RTKSAhPSAwKTsKLQotCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7Ci19 Ci0KLXN0YXRpYyB2b2lkIHhlbl93cml0ZV9jcjQodW5zaWduZWQgbG9uZyBjcjQpCi17Ci0JY3I0 ICY9IH4oWDg2X0NSNF9QR0UgfCBYODZfQ1I0X1BTRSB8IFg4Nl9DUjRfUENFKTsKLQotCW5hdGl2 ZV93cml0ZV9jcjQoY3I0KTsKLX0KLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci1zdGF0aWMgaW5saW5l IHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3I4KHZvaWQpCi17Ci0JcmV0dXJuIDA7Ci19Ci1zdGF0 aWMgaW5saW5lIHZvaWQgeGVuX3dyaXRlX2NyOCh1bnNpZ25lZCBsb25nIHZhbCkKLXsKLQlCVUdf T04odmFsKTsKLX0KLSNlbmRpZgotCi1zdGF0aWMgdTY0IHhlbl9yZWFkX21zcl9zYWZlKHVuc2ln bmVkIGludCBtc3IsIGludCAqZXJyKQotewotCXU2NCB2YWw7Ci0KLQlpZiAocG11X21zcl9yZWFk KG1zciwgJnZhbCwgZXJyKSkKLQkJcmV0dXJuIHZhbDsKLQotCXZhbCA9IG5hdGl2ZV9yZWFkX21z cl9zYWZlKG1zciwgZXJyKTsKLQlzd2l0Y2ggKG1zcikgewotCWNhc2UgTVNSX0lBMzJfQVBJQ0JB U0U6Ci0jaWZkZWYgQ09ORklHX1g4Nl9YMkFQSUMKLQkJaWYgKCEoY3B1aWRfZWN4KDEpICYgKDEg PDwgKFg4Nl9GRUFUVVJFX1gyQVBJQyAmIDMxKSkpKQotI2VuZGlmCi0JCQl2YWwgJj0gflgyQVBJ Q19FTkFCTEU7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gdmFsOwotfQotCi1zdGF0aWMgaW50IHhl bl93cml0ZV9tc3Jfc2FmZSh1bnNpZ25lZCBpbnQgbXNyLCB1bnNpZ25lZCBsb3csIHVuc2lnbmVk IGhpZ2gpCi17Ci0JaW50IHJldDsKLQotCXJldCA9IDA7Ci0KLQlzd2l0Y2ggKG1zcikgewotI2lm ZGVmIENPTkZJR19YODZfNjQKLQkJdW5zaWduZWQgd2hpY2g7Ci0JCXU2NCBiYXNlOwotCi0JY2Fz ZSBNU1JfRlNfQkFTRToJCXdoaWNoID0gU0VHQkFTRV9GUzsgZ290byBzZXQ7Ci0JY2FzZSBNU1Jf S0VSTkVMX0dTX0JBU0U6CXdoaWNoID0gU0VHQkFTRV9HU19VU0VSOyBnb3RvIHNldDsKLQljYXNl IE1TUl9HU19CQVNFOgkJd2hpY2ggPSBTRUdCQVNFX0dTX0tFUk5FTDsgZ290byBzZXQ7Ci0KLQlz ZXQ6Ci0JCWJhc2UgPSAoKHU2NCloaWdoIDw8IDMyKSB8IGxvdzsKLQkJaWYgKEhZUEVSVklTT1Jf c2V0X3NlZ21lbnRfYmFzZSh3aGljaCwgYmFzZSkgIT0gMCkKLQkJCXJldCA9IC1FSU87Ci0JCWJy ZWFrOwotI2VuZGlmCi0KLQljYXNlIE1TUl9TVEFSOgotCWNhc2UgTVNSX0NTVEFSOgotCWNhc2Ug TVNSX0xTVEFSOgotCWNhc2UgTVNSX1NZU0NBTExfTUFTSzoKLQljYXNlIE1TUl9JQTMyX1NZU0VO VEVSX0NTOgotCWNhc2UgTVNSX0lBMzJfU1lTRU5URVJfRVNQOgotCWNhc2UgTVNSX0lBMzJfU1lT RU5URVJfRUlQOgotCQkvKiBGYXN0IHN5c2NhbGwgc2V0dXAgaXMgYWxsIGRvbmUgaW4gaHlwZXJj YWxscywgc28KLQkJICAgdGhlc2UgYXJlIGFsbCBpZ25vcmVkLiAgU3R1YiB0aGVtIG91dCBoZXJl IHRvIHN0b3AKLQkJICAgWGVuIGNvbnNvbGUgbm9pc2UuICovCi0JCWJyZWFrOwotCi0JZGVmYXVs dDoKLQkJaWYgKCFwbXVfbXNyX3dyaXRlKG1zciwgbG93LCBoaWdoLCAmcmV0KSkKLQkJCXJldCA9 IG5hdGl2ZV93cml0ZV9tc3Jfc2FmZShtc3IsIGxvdywgaGlnaCk7Ci0JfQotCi0JcmV0dXJuIHJl dDsKLX0KLQotc3RhdGljIHU2NCB4ZW5fcmVhZF9tc3IodW5zaWduZWQgaW50IG1zcikKLXsKLQkv KgotCSAqIFRoaXMgd2lsbCBzaWxlbnRseSBzd2FsbG93IGEgI0dQIGZyb20gUkRNU1IuICBJdCBt YXkgYmUgd29ydGgKLQkgKiBjaGFuZ2luZyB0aGF0LgotCSAqLwotCWludCBlcnI7Ci0KLQlyZXR1 cm4geGVuX3JlYWRfbXNyX3NhZmUobXNyLCAmZXJyKTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3dy aXRlX21zcih1bnNpZ25lZCBpbnQgbXNyLCB1bnNpZ25lZCBsb3csIHVuc2lnbmVkIGhpZ2gpCi17 Ci0JLyoKLQkgKiBUaGlzIHdpbGwgc2lsZW50bHkgc3dhbGxvdyBhICNHUCBmcm9tIFdSTVNSLiAg SXQgbWF5IGJlIHdvcnRoCi0JICogY2hhbmdpbmcgdGhhdC4KLQkgKi8KLQl4ZW5fd3JpdGVfbXNy X3NhZmUobXNyLCBsb3csIGhpZ2gpOwotfQotCi12b2lkIHhlbl9zZXR1cF9zaGFyZWRfaW5mbyh2 b2lkKQotewotCWlmICgheGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21h cCkpIHsKLQkJc2V0X2ZpeG1hcChGSVhfUEFSQVZJUlRfQk9PVE1BUCwKLQkJCSAgIHhlbl9zdGFy dF9pbmZvLT5zaGFyZWRfaW5mbyk7Ci0KLQkJSFlQRVJWSVNPUl9zaGFyZWRfaW5mbyA9Ci0JCQko c3RydWN0IHNoYXJlZF9pbmZvICopZml4X3RvX3ZpcnQoRklYX1BBUkFWSVJUX0JPT1RNQVApOwot CX0gZWxzZQotCQlIWVBFUlZJU09SX3NoYXJlZF9pbmZvID0KLQkJCShzdHJ1Y3Qgc2hhcmVkX2lu Zm8gKilfX3ZhKHhlbl9zdGFydF9pbmZvLT5zaGFyZWRfaW5mbyk7Ci0KLSNpZm5kZWYgQ09ORklH X1NNUAotCS8qIEluIFVQIHRoaXMgaXMgYXMgZ29vZCBhIHBsYWNlIGFzIGFueSB0byBzZXQgdXAg c2hhcmVkIGluZm8gKi8KLQl4ZW5fc2V0dXBfdmNwdV9pbmZvX3BsYWNlbWVudCgpOwotI2VuZGlm Ci0KLQl4ZW5fc2V0dXBfbWZuX2xpc3RfbGlzdCgpOwotfQotCi0vKiBUaGlzIGlzIGNhbGxlZCBv bmNlIHdlIGhhdmUgdGhlIGNwdV9wb3NzaWJsZV9tYXNrICovCi12b2lkIHhlbl9zZXR1cF92Y3B1 X2luZm9fcGxhY2VtZW50KHZvaWQpCi17Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX3Bvc3NpYmxl X2NwdShjcHUpIHsKLQkJLyogU2V0IHVwIGRpcmVjdCB2Q1BVIGlkIG1hcHBpbmcgZm9yIFBWIGd1 ZXN0cy4gKi8KLQkJcGVyX2NwdSh4ZW5fdmNwdV9pZCwgY3B1KSA9IGNwdTsKLQkJeGVuX3ZjcHVf c2V0dXAoY3B1KTsKLQl9Ci0KLQkvKgotCSAqIHhlbl92Y3B1X3NldHVwIG1hbmFnZWQgdG8gcGxh Y2UgdGhlIHZjcHVfaW5mbyB3aXRoaW4gdGhlCi0JICogcGVyY3B1IGFyZWEgZm9yIGFsbCBjcHVz LCBzbyBtYWtlIHVzZSBvZiBpdC4KLQkgKi8KLQlpZiAoeGVuX2hhdmVfdmNwdV9pbmZvX3BsYWNl bWVudCkgewotCQlwdl9pcnFfb3BzLnNhdmVfZmwgPSBfX1BWX0lTX0NBTExFRV9TQVZFKHhlbl9z YXZlX2ZsX2RpcmVjdCk7Ci0JCXB2X2lycV9vcHMucmVzdG9yZV9mbCA9IF9fUFZfSVNfQ0FMTEVF X1NBVkUoeGVuX3Jlc3RvcmVfZmxfZGlyZWN0KTsKLQkJcHZfaXJxX29wcy5pcnFfZGlzYWJsZSA9 IF9fUFZfSVNfQ0FMTEVFX1NBVkUoeGVuX2lycV9kaXNhYmxlX2RpcmVjdCk7Ci0JCXB2X2lycV9v cHMuaXJxX2VuYWJsZSA9IF9fUFZfSVNfQ0FMTEVFX1NBVkUoeGVuX2lycV9lbmFibGVfZGlyZWN0 KTsKLQkJcHZfbW11X29wcy5yZWFkX2NyMiA9IHhlbl9yZWFkX2NyMl9kaXJlY3Q7Ci0JfQotfQot Ci1zdGF0aWMgdW5zaWduZWQgeGVuX3BhdGNoKHU4IHR5cGUsIHUxNiBjbG9iYmVycywgdm9pZCAq aW5zbmJ1ZiwKLQkJCSAgdW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsZW4pCi17Ci0JY2hh ciAqc3RhcnQsICplbmQsICpyZWxvYzsKLQl1bnNpZ25lZCByZXQ7Ci0KLQlzdGFydCA9IGVuZCA9 IHJlbG9jID0gTlVMTDsKLQotI2RlZmluZSBTSVRFKG9wLCB4KQkJCQkJCQlcCi0JY2FzZSBQQVJB VklSVF9QQVRDSChvcC54KToJCQkJCVwKLQlpZiAoeGVuX2hhdmVfdmNwdV9pbmZvX3BsYWNlbWVu dCkgewkJCQlcCi0JCXN0YXJ0ID0gKGNoYXIgKil4ZW5fIyN4IyNfZGlyZWN0OwkJCVwKLQkJZW5k ID0geGVuXyMjeCMjX2RpcmVjdF9lbmQ7CQkJCVwKLQkJcmVsb2MgPSB4ZW5fIyN4IyNfZGlyZWN0 X3JlbG9jOwkJCQlcCi0JfQkJCQkJCQkJXAotCWdvdG8gcGF0Y2hfc2l0ZQotCi0Jc3dpdGNoICh0 eXBlKSB7Ci0JCVNJVEUocHZfaXJxX29wcywgaXJxX2VuYWJsZSk7Ci0JCVNJVEUocHZfaXJxX29w cywgaXJxX2Rpc2FibGUpOwotCQlTSVRFKHB2X2lycV9vcHMsIHNhdmVfZmwpOwotCQlTSVRFKHB2 X2lycV9vcHMsIHJlc3RvcmVfZmwpOwotI3VuZGVmIFNJVEUKLQotCXBhdGNoX3NpdGU6Ci0JCWlm IChzdGFydCA9PSBOVUxMIHx8IChlbmQtc3RhcnQpID4gbGVuKQotCQkJZ290byBkZWZhdWx0X3Bh dGNoOwotCi0JCXJldCA9IHBhcmF2aXJ0X3BhdGNoX2luc25zKGluc25idWYsIGxlbiwgc3RhcnQs IGVuZCk7Ci0KLQkJLyogTm90ZTogYmVjYXVzZSByZWxvYyBpcyBhc3NpZ25lZCBmcm9tIHNvbWV0 aGluZyB0aGF0Ci0JCSAgIGFwcGVhcnMgdG8gYmUgYW4gYXJyYXksIGdjYyBhc3N1bWVzIGl0J3Mg bm9uLW51bGwsCi0JCSAgIGJ1dCBkb2Vzbid0IGtub3cgaXRzIHJlbGF0aW9uc2hpcCB3aXRoIHN0 YXJ0IGFuZAotCQkgICBlbmQuICovCi0JCWlmIChyZWxvYyA+IHN0YXJ0ICYmIHJlbG9jIDwgZW5k KSB7Ci0JCQlpbnQgcmVsb2Nfb2ZmID0gcmVsb2MgLSBzdGFydDsKLQkJCWxvbmcgKnJlbG9jcCA9 IChsb25nICopKGluc25idWYgKyByZWxvY19vZmYpOwotCQkJbG9uZyBkZWx0YSA9IHN0YXJ0IC0g KGNoYXIgKilhZGRyOwotCi0JCQkqcmVsb2NwICs9IGRlbHRhOwotCQl9Ci0JCWJyZWFrOwotCi0J ZGVmYXVsdF9wYXRjaDoKLQlkZWZhdWx0OgotCQlyZXQgPSBwYXJhdmlydF9wYXRjaF9kZWZhdWx0 KHR5cGUsIGNsb2JiZXJzLCBpbnNuYnVmLAotCQkJCQkgICAgIGFkZHIsIGxlbik7Ci0JCWJyZWFr OwotCX0KLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgcHZfaW5mbyB4 ZW5faW5mbyBfX2luaXRjb25zdCA9IHsKLQkuc2hhcmVkX2tlcm5lbF9wbWQgPSAwLAotCi0jaWZk ZWYgQ09ORklHX1g4Nl82NAotCS5leHRyYV91c2VyXzY0Yml0X2NzID0gRkxBVF9VU0VSX0NTNjQs Ci0jZW5kaWYKLQkubmFtZSA9ICJYZW4iLAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9p bml0X29wcyB4ZW5faW5pdF9vcHMgX19pbml0Y29uc3QgPSB7Ci0JLnBhdGNoID0geGVuX3BhdGNo LAotfTsKLQotc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9jcHVfb3BzIHhlbl9jcHVfb3BzIF9faW5p dGNvbnN0ID0gewotCS5jcHVpZCA9IHhlbl9jcHVpZCwKLQotCS5zZXRfZGVidWdyZWcgPSB4ZW5f c2V0X2RlYnVncmVnLAotCS5nZXRfZGVidWdyZWcgPSB4ZW5fZ2V0X2RlYnVncmVnLAotCi0JLnJl YWRfY3IwID0geGVuX3JlYWRfY3IwLAotCS53cml0ZV9jcjAgPSB4ZW5fd3JpdGVfY3IwLAotCi0J LnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAotCS53cml0ZV9jcjQgPSB4ZW5fd3JpdGVfY3I0 LAotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCS5yZWFkX2NyOCA9IHhlbl9yZWFkX2NyOCwKLQku d3JpdGVfY3I4ID0geGVuX3dyaXRlX2NyOCwKLSNlbmRpZgotCi0JLndiaW52ZCA9IG5hdGl2ZV93 YmludmQsCi0KLQkucmVhZF9tc3IgPSB4ZW5fcmVhZF9tc3IsCi0JLndyaXRlX21zciA9IHhlbl93 cml0ZV9tc3IsCi0KLQkucmVhZF9tc3Jfc2FmZSA9IHhlbl9yZWFkX21zcl9zYWZlLAotCS53cml0 ZV9tc3Jfc2FmZSA9IHhlbl93cml0ZV9tc3Jfc2FmZSwKLQotCS5yZWFkX3BtYyA9IHhlbl9yZWFk X3BtYywKLQotCS5pcmV0ID0geGVuX2lyZXQsCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCS51c2Vy Z3Nfc3lzcmV0NjQgPSB4ZW5fc3lzcmV0NjQsCi0jZW5kaWYKLQotCS5sb2FkX3RyX2Rlc2MgPSBw YXJhdmlydF9ub3AsCi0JLnNldF9sZHQgPSB4ZW5fc2V0X2xkdCwKLQkubG9hZF9nZHQgPSB4ZW5f bG9hZF9nZHQsCi0JLmxvYWRfaWR0ID0geGVuX2xvYWRfaWR0LAotCS5sb2FkX3RscyA9IHhlbl9s b2FkX3RscywKLSNpZmRlZiBDT05GSUdfWDg2XzY0Ci0JLmxvYWRfZ3NfaW5kZXggPSB4ZW5fbG9h ZF9nc19pbmRleCwKLSNlbmRpZgotCi0JLmFsbG9jX2xkdCA9IHhlbl9hbGxvY19sZHQsCi0JLmZy ZWVfbGR0ID0geGVuX2ZyZWVfbGR0LAotCi0JLnN0b3JlX2lkdCA9IG5hdGl2ZV9zdG9yZV9pZHQs Ci0JLnN0b3JlX3RyID0geGVuX3N0b3JlX3RyLAotCi0JLndyaXRlX2xkdF9lbnRyeSA9IHhlbl93 cml0ZV9sZHRfZW50cnksCi0JLndyaXRlX2dkdF9lbnRyeSA9IHhlbl93cml0ZV9nZHRfZW50cnks Ci0JLndyaXRlX2lkdF9lbnRyeSA9IHhlbl93cml0ZV9pZHRfZW50cnksCi0JLmxvYWRfc3AwID0g eGVuX2xvYWRfc3AwLAotCi0JLnNldF9pb3BsX21hc2sgPSB4ZW5fc2V0X2lvcGxfbWFzaywKLQku aW9fZGVsYXkgPSB4ZW5faW9fZGVsYXksCi0KLQkvKiBYZW4gdGFrZXMgY2FyZSBvZiAlZ3Mgd2hl biBzd2l0Y2hpbmcgdG8gdXNlcm1vZGUgZm9yIHVzICovCi0JLnN3YXBncyA9IHBhcmF2aXJ0X25v cCwKLQotCS5zdGFydF9jb250ZXh0X3N3aXRjaCA9IHBhcmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dp dGNoLAotCS5lbmRfY29udGV4dF9zd2l0Y2ggPSB4ZW5fZW5kX2NvbnRleHRfc3dpdGNoLAotfTsK LQotdm9pZCB4ZW5fcmVib290KGludCByZWFzb24pCi17Ci0Jc3RydWN0IHNjaGVkX3NodXRkb3du IHIgPSB7IC5yZWFzb24gPSByZWFzb24gfTsKLQlpbnQgY3B1OwotCi0JZm9yX2VhY2hfb25saW5l X2NwdShjcHUpCi0JCXhlbl9wbXVfZmluaXNoKGNwdSk7Ci0KLQlpZiAoSFlQRVJWSVNPUl9zY2hl ZF9vcChTQ0hFRE9QX3NodXRkb3duLCAmcikpCi0JCUJVRygpOwotfQotCi1zdGF0aWMgdm9pZCB4 ZW5fcmVzdGFydChjaGFyICptc2cpCi17Ci0JeGVuX3JlYm9vdChTSFVURE9XTl9yZWJvb3QpOwot fQotCi12b2lkIHhlbl9lbWVyZ2VuY3lfcmVzdGFydCh2b2lkKQotewotCXhlbl9yZWJvb3QoU0hV VERPV05fcmVib290KTsKLX0KLQotc3RhdGljIHZvaWQgeGVuX21hY2hpbmVfaGFsdCh2b2lkKQot ewotCXhlbl9yZWJvb3QoU0hVVERPV05fcG93ZXJvZmYpOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5f bWFjaGluZV9wb3dlcl9vZmYodm9pZCkKLXsKLQlpZiAocG1fcG93ZXJfb2ZmKQotCQlwbV9wb3dl cl9vZmYoKTsKLQl4ZW5fcmVib290KFNIVVRET1dOX3Bvd2Vyb2ZmKTsKLX0KLQotc3RhdGljIHZv aWQgeGVuX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9yZWdzICpyZWdzKQotewotCXhlbl9yZWJv b3QoU0hVVERPV05fY3Jhc2gpOwotfQotCi1zdGF0aWMgaW50Ci14ZW5fcGFuaWNfZXZlbnQoc3Ry dWN0IG5vdGlmaWVyX2Jsb2NrICp0aGlzLCB1bnNpZ25lZCBsb25nIGV2ZW50LCB2b2lkICpwdHIp Ci17Ci0JaWYgKCFrZXhlY19jcmFzaF9sb2FkZWQoKSkKLQkJeGVuX3JlYm9vdChTSFVURE9XTl9j cmFzaCk7Ci0JcmV0dXJuIE5PVElGWV9ET05FOwotfQotCi1zdGF0aWMgc3RydWN0IG5vdGlmaWVy X2Jsb2NrIHhlbl9wYW5pY19ibG9jayA9IHsKLQkubm90aWZpZXJfY2FsbD0geGVuX3BhbmljX2V2 ZW50LAotCS5wcmlvcml0eSA9IElOVF9NSU4KLX07Ci0KLWludCB4ZW5fcGFuaWNfaGFuZGxlcl9p bml0KHZvaWQpCi17Ci0JYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3Rp Zmllcl9saXN0LCAmeGVuX3BhbmljX2Jsb2NrKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGNv bnN0IHN0cnVjdCBtYWNoaW5lX29wcyB4ZW5fbWFjaGluZV9vcHMgX19pbml0Y29uc3QgPSB7Ci0J LnJlc3RhcnQgPSB4ZW5fcmVzdGFydCwKLQkuaGFsdCA9IHhlbl9tYWNoaW5lX2hhbHQsCi0JLnBv d2VyX29mZiA9IHhlbl9tYWNoaW5lX3Bvd2VyX29mZiwKLQkuc2h1dGRvd24gPSB4ZW5fbWFjaGlu ZV9oYWx0LAotCS5jcmFzaF9zaHV0ZG93biA9IHhlbl9jcmFzaF9zaHV0ZG93biwKLQkuZW1lcmdl bmN5X3Jlc3RhcnQgPSB4ZW5fZW1lcmdlbmN5X3Jlc3RhcnQsCi19OwotCi1zdGF0aWMgdW5zaWdu ZWQgY2hhciB4ZW5fZ2V0X25taV9yZWFzb24odm9pZCkKLXsKLQl1bnNpZ25lZCBjaGFyIHJlYXNv biA9IDA7Ci0KLQkvKiBDb25zdHJ1Y3QgYSB2YWx1ZSB3aGljaCBsb29rcyBsaWtlIGl0IGNhbWUg ZnJvbSBwb3J0IDB4NjEuICovCi0JaWYgKHRlc3RfYml0KF9YRU5fTk1JUkVBU09OX2lvX2Vycm9y LAotCQkgICAgICZIWVBFUlZJU09SX3NoYXJlZF9pbmZvLT5hcmNoLm5taV9yZWFzb24pKQotCQly ZWFzb24gfD0gTk1JX1JFQVNPTl9JT0NISzsKLQlpZiAodGVzdF9iaXQoX1hFTl9OTUlSRUFTT05f cGNpX3NlcnIsCi0JCSAgICAgJkhZUEVSVklTT1Jfc2hhcmVkX2luZm8tPmFyY2gubm1pX3JlYXNv bikpCi0JCXJlYXNvbiB8PSBOTUlfUkVBU09OX1NFUlI7Ci0KLQlyZXR1cm4gcmVhc29uOwotfQot Ci1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX2Jvb3RfcGFyYW1zX2luaXRfZWRkKHZvaWQpCi17Ci0j aWYgSVNfRU5BQkxFRChDT05GSUdfRUREKQotCXN0cnVjdCB4ZW5fcGxhdGZvcm1fb3Agb3A7Ci0J c3RydWN0IGVkZF9pbmZvICplZGRfaW5mbzsKLQl1MzIgKm1icl9zaWduYXR1cmU7Ci0JdW5zaWdu ZWQgbnI7Ci0JaW50IHJldDsKLQotCWVkZF9pbmZvID0gYm9vdF9wYXJhbXMuZWRkYnVmOwotCW1i cl9zaWduYXR1cmUgPSBib290X3BhcmFtcy5lZGRfbWJyX3NpZ19idWZmZXI7Ci0KLQlvcC5jbWQg PSBYRU5QRl9maXJtd2FyZV9pbmZvOwotCi0Jb3AudS5maXJtd2FyZV9pbmZvLnR5cGUgPSBYRU5f RldfRElTS19JTkZPOwotCWZvciAobnIgPSAwOyBuciA8IEVERE1BWE5SOyBucisrKSB7Ci0JCXN0 cnVjdCBlZGRfaW5mbyAqaW5mbyA9IGVkZF9pbmZvICsgbnI7Ci0KLQkJb3AudS5maXJtd2FyZV9p bmZvLmluZGV4ID0gbnI7Ci0JCWluZm8tPnBhcmFtcy5sZW5ndGggPSBzaXplb2YoaW5mby0+cGFy YW1zKTsKLQkJc2V0X3hlbl9ndWVzdF9oYW5kbGUob3AudS5maXJtd2FyZV9pbmZvLnUuZGlza19p bmZvLmVkZF9wYXJhbXMsCi0JCQkJICAgICAmaW5mby0+cGFyYW1zKTsKLQkJcmV0ID0gSFlQRVJW SVNPUl9wbGF0Zm9ybV9vcCgmb3ApOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0KLSNkZWZpbmUg Qyh4KSBpbmZvLT54ID0gb3AudS5maXJtd2FyZV9pbmZvLnUuZGlza19pbmZvLngKLQkJQyhkZXZp Y2UpOwotCQlDKHZlcnNpb24pOwotCQlDKGludGVyZmFjZV9zdXBwb3J0KTsKLQkJQyhsZWdhY3lf bWF4X2N5bGluZGVyKTsKLQkJQyhsZWdhY3lfbWF4X2hlYWQpOwotCQlDKGxlZ2FjeV9zZWN0b3Jz X3Blcl90cmFjayk7Ci0jdW5kZWYgQwotCX0KLQlib290X3BhcmFtcy5lZGRidWZfZW50cmllcyA9 IG5yOwotCi0Jb3AudS5maXJtd2FyZV9pbmZvLnR5cGUgPSBYRU5fRldfRElTS19NQlJfU0lHTkFU VVJFOwotCWZvciAobnIgPSAwOyBuciA8IEVERF9NQlJfU0lHX01BWDsgbnIrKykgewotCQlvcC51 LmZpcm13YXJlX2luZm8uaW5kZXggPSBucjsKLQkJcmV0ID0gSFlQRVJWSVNPUl9wbGF0Zm9ybV9v cCgmb3ApOwotCQlpZiAocmV0KQotCQkJYnJlYWs7Ci0JCW1icl9zaWduYXR1cmVbbnJdID0gb3Au dS5maXJtd2FyZV9pbmZvLnUuZGlza19tYnJfc2lnbmF0dXJlLm1icl9zaWduYXR1cmU7Ci0JfQot CWJvb3RfcGFyYW1zLmVkZF9tYnJfc2lnX2J1Zl9lbnRyaWVzID0gbnI7Ci0jZW5kaWYKLX0KLQot LyoKLSAqIFNldCB1cCB0aGUgR0RUIGFuZCBzZWdtZW50IHJlZ2lzdGVycyBmb3IgLWZzdGFjay1w cm90ZWN0b3IuICBVbnRpbAotICogd2UgZG8gdGhpcywgd2UgaGF2ZSB0byBiZSBjYXJlZnVsIG5v dCB0byBjYWxsIGFueSBzdGFjay1wcm90ZWN0ZWQKLSAqIGZ1bmN0aW9uLCB3aGljaCBpcyBtb3N0 IG9mIHRoZSBrZXJuZWwuCi0gKi8KLXN0YXRpYyB2b2lkIHhlbl9zZXR1cF9nZHQoaW50IGNwdSkK LXsKLQlwdl9jcHVfb3BzLndyaXRlX2dkdF9lbnRyeSA9IHhlbl93cml0ZV9nZHRfZW50cnlfYm9v dDsKLQlwdl9jcHVfb3BzLmxvYWRfZ2R0ID0geGVuX2xvYWRfZ2R0X2Jvb3Q7Ci0KLQlzZXR1cF9z dGFja19jYW5hcnlfc2VnbWVudCgwKTsKLQlzd2l0Y2hfdG9fbmV3X2dkdCgwKTsKLQotCXB2X2Nw dV9vcHMud3JpdGVfZ2R0X2VudHJ5ID0geGVuX3dyaXRlX2dkdF9lbnRyeTsKLQlwdl9jcHVfb3Bz LmxvYWRfZ2R0ID0geGVuX2xvYWRfZ2R0OwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX2Rv bTBfc2V0X2xlZ2FjeV9mZWF0dXJlcyh2b2lkKQotewotCXg4Nl9wbGF0Zm9ybS5sZWdhY3kucnRj ID0gMTsKLX0KLQotaW50IHhlbl9jcHVocF9zZXR1cChpbnQgKCpjcHVfdXBfcHJlcGFyZV9jYiko dW5zaWduZWQgaW50KSwKLQkJICAgIGludCAoKmNwdV9kZWFkX2NiKSh1bnNpZ25lZCBpbnQpKQot ewotCWludCByYzsKLQotCXJjID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9YRU5f UFJFUEFSRSwKLQkJCQkgICAgICAgIng4Ni94ZW4vaHZtX2d1ZXN0OnByZXBhcmUiLAotCQkJCSAg ICAgICBjcHVfdXBfcHJlcGFyZV9jYiwgY3B1X2RlYWRfY2IpOwotCWlmIChyYyA+PSAwKSB7Ci0J CXJjID0gY3B1aHBfc2V0dXBfc3RhdGVfbm9jYWxscyhDUFVIUF9BUF9PTkxJTkVfRFlOLAotCQkJ CQkgICAgICAgIng4Ni94ZW4vaHZtX2d1ZXN0Om9ubGluZSIsCi0JCQkJCSAgICAgICB4ZW5fY3B1 X3VwX29ubGluZSwgTlVMTCk7Ci0JCWlmIChyYyA8IDApCi0JCQljcHVocF9yZW1vdmVfc3RhdGVf bm9jYWxscyhDUFVIUF9YRU5fUFJFUEFSRSk7Ci0JfQotCi0JcmV0dXJuIHJjID49IDAgPyAwIDog cmM7Ci19Ci0KLS8qIEZpcnN0IEMgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIG9uIFhlbiBib290ICov Ci1hc21saW5rYWdlIF9fdmlzaWJsZSB2b2lkIF9faW5pdCB4ZW5fc3RhcnRfa2VybmVsKHZvaWQp Ci17Ci0Jc3RydWN0IHBoeXNkZXZfc2V0X2lvcGwgc2V0X2lvcGw7Ci0JdW5zaWduZWQgbG9uZyBp bml0cmRfc3RhcnQgPSAwOwotCWludCByYzsKLQotCWlmICgheGVuX3N0YXJ0X2luZm8pCi0JCXJl dHVybjsKLQotCXhlbl9kb21haW5fdHlwZSA9IFhFTl9QVl9ET01BSU47Ci0KLQl4ZW5fc2V0dXBf ZmVhdHVyZXMoKTsKLQotCXhlbl9zZXR1cF9tYWNocGh5c19tYXBwaW5nKCk7Ci0KLQkvKiBJbnN0 YWxsIFhlbiBwYXJhdmlydCBvcHMgKi8KLQlwdl9pbmZvID0geGVuX2luZm87Ci0JcHZfaW5pdF9v cHMgPSB4ZW5faW5pdF9vcHM7Ci0JcHZfY3B1X29wcyA9IHhlbl9jcHVfb3BzOwotCi0JeDg2X3Bs YXRmb3JtLmdldF9ubWlfcmVhc29uID0geGVuX2dldF9ubWlfcmVhc29uOwotCi0JeDg2X2luaXQu cmVzb3VyY2VzLm1lbW9yeV9zZXR1cCA9IHhlbl9tZW1vcnlfc2V0dXA7Ci0JeDg2X2luaXQub2Vt LmFyY2hfc2V0dXAgPSB4ZW5fYXJjaF9zZXR1cDsKLQl4ODZfaW5pdC5vZW0uYmFubmVyID0geGVu X2Jhbm5lcjsKLQotCXhlbl9pbml0X3RpbWVfb3BzKCk7Ci0KLQkvKgotCSAqIFNldCB1cCBzb21l IHBhZ2V0YWJsZSBzdGF0ZSBiZWZvcmUgc3RhcnRpbmcgdG8gc2V0IGFueSBwdGVzLgotCSAqLwot Ci0JeGVuX2luaXRfbW11X29wcygpOwotCi0JLyogUHJldmVudCB1bndhbnRlZCBiaXRzIGZyb20g YmVpbmcgc2V0IGluIFBURXMuICovCi0JX19zdXBwb3J0ZWRfcHRlX21hc2sgJj0gfl9QQUdFX0dM T0JBTDsKLQotCS8qCi0JICogUHJldmVudCBwYWdlIHRhYmxlcyBmcm9tIGJlaW5nIGFsbG9jYXRl ZCBpbiBoaWdobWVtLCBldmVuCi0JICogaWYgQ09ORklHX0hJR0hQVEUgaXMgZW5hYmxlZC4KLQkg Ki8KLQlfX3VzZXJwdGVfYWxsb2NfZ2ZwICY9IH5fX0dGUF9ISUdITUVNOwotCi0JLyogV29yayBv dXQgaWYgd2Ugc3VwcG9ydCBOWCAqLwotCXg4Nl9jb25maWd1cmVfbngoKTsKLQotCS8qIEdldCBt Zm4gbGlzdCAqLwotCXhlbl9idWlsZF9keW5hbWljX3BoeXNfdG9fbWFjaGluZSgpOwotCi0JLyoK LQkgKiBTZXQgdXAga2VybmVsIEdEVCBhbmQgc2VnbWVudCByZWdpc3RlcnMsIG1haW5seSBzbyB0 aGF0Ci0JICogLWZzdGFjay1wcm90ZWN0b3IgY29kZSBjYW4gYmUgZXhlY3V0ZWQuCi0JICovCi0J eGVuX3NldHVwX2dkdCgwKTsKLQotCXhlbl9pbml0X2lycV9vcHMoKTsKLQl4ZW5faW5pdF9jcHVp ZF9tYXNrKCk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKLQkvKgotCSAqIHNldCB1 cCB0aGUgYmFzaWMgYXBpYyBvcHMuCi0JICovCi0JeGVuX2luaXRfYXBpYygpOwotI2VuZGlmCi0K LQlpZiAoeGVuX2ZlYXR1cmUoWEVORkVBVF9tbXVfcHRfdXBkYXRlX3ByZXNlcnZlX2FkKSkgewot CQlwdl9tbXVfb3BzLnB0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQgPSB4ZW5fcHRlcF9tb2RpZnlfcHJv dF9zdGFydDsKLQkJcHZfbW11X29wcy5wdGVwX21vZGlmeV9wcm90X2NvbW1pdCA9IHhlbl9wdGVw X21vZGlmeV9wcm90X2NvbW1pdDsKLQl9Ci0KLQltYWNoaW5lX29wcyA9IHhlbl9tYWNoaW5lX29w czsKLQotCS8qCi0JICogVGhlIG9ubHkgcmVsaWFibGUgd2F5IHRvIHJldGFpbiB0aGUgaW5pdGlh bCBhZGRyZXNzIG9mIHRoZQotCSAqIHBlcmNwdSBnZHRfcGFnZSBpcyB0byByZW1lbWJlciBpdCBo ZXJlLCBzbyB3ZSBjYW4gZ28gYW5kCi0JICogbWFyayBpdCBSVyBsYXRlciwgd2hlbiB0aGUgaW5p dGlhbCBwZXJjcHUgYXJlYSBpcyBmcmVlZC4KLQkgKi8KLQl4ZW5faW5pdGlhbF9nZHQgPSAmcGVy X2NwdShnZHRfcGFnZSwgMCk7Ci0KLQl4ZW5fc21wX2luaXQoKTsKLQotI2lmZGVmIENPTkZJR19B Q1BJX05VTUEKLQkvKgotCSAqIFRoZSBwYWdlcyB3ZSBmcm9tIFhlbiBhcmUgbm90IHJlbGF0ZWQg dG8gbWFjaGluZSBwYWdlcywgc28KLQkgKiBhbnkgTlVNQSBpbmZvcm1hdGlvbiB0aGUga2VybmVs IHRyaWVzIHRvIGdldCBmcm9tIEFDUEkgd2lsbAotCSAqIGJlIG1lYW5pbmdsZXNzLiAgUHJldmVu dCBpdCBmcm9tIHRyeWluZy4KLQkgKi8KLQlhY3BpX251bWEgPSAtMTsKLSNlbmRpZgotCS8qIERv bid0IGRvIHRoZSBmdWxsIHZjcHVfaW5mbyBwbGFjZW1lbnQgc3R1ZmYgdW50aWwgd2UgaGF2ZSBh Ci0JICAgcG9zc2libGUgbWFwIGFuZCBhIG5vbi1kdW1teSBzaGFyZWRfaW5mby4gKi8KLQlwZXJf Y3B1KHhlbl92Y3B1LCAwKSA9ICZIWVBFUlZJU09SX3NoYXJlZF9pbmZvLT52Y3B1X2luZm9bMF07 Ci0KLQlXQVJOX09OKHhlbl9jcHVocF9zZXR1cCh4ZW5fY3B1X3VwX3ByZXBhcmVfcHYsIHhlbl9j cHVfZGVhZF9wdikpOwotCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQllYXJseV9ib290X2lycXNf ZGlzYWJsZWQgPSB0cnVlOwotCi0JeGVuX3Jhd19jb25zb2xlX3dyaXRlKCJtYXBwaW5nIGtlcm5l bCBpbnRvIHBoeXNpY2FsIG1lbW9yeVxuIik7Ci0JeGVuX3NldHVwX2tlcm5lbF9wYWdldGFibGUo KHBnZF90ICopeGVuX3N0YXJ0X2luZm8tPnB0X2Jhc2UsCi0JCQkJICAgeGVuX3N0YXJ0X2luZm8t Pm5yX3BhZ2VzKTsKLQl4ZW5fcmVzZXJ2ZV9zcGVjaWFsX3BhZ2VzKCk7Ci0KLQkvKiBrZWVwIHVz aW5nIFhlbiBnZHQgZm9yIG5vdzsgbm8gdXJnZW50IG5lZWQgdG8gY2hhbmdlIGl0ICovCi0KLSNp ZmRlZiBDT05GSUdfWDg2XzMyCi0JcHZfaW5mby5rZXJuZWxfcnBsID0gMTsKLQlpZiAoeGVuX2Zl YXR1cmUoWEVORkVBVF9zdXBlcnZpc29yX21vZGVfa2VybmVsKSkKLQkJcHZfaW5mby5rZXJuZWxf cnBsID0gMDsKLSNlbHNlCi0JcHZfaW5mby5rZXJuZWxfcnBsID0gMDsKLSNlbmRpZgotCS8qIHNl dCB0aGUgbGltaXQgb2Ygb3VyIGFkZHJlc3Mgc3BhY2UgKi8KLQl4ZW5fcmVzZXJ2ZV90b3AoKTsK LQotCS8qCi0JICogV2UgdXNlZCB0byBkbyB0aGlzIGluIHhlbl9hcmNoX3NldHVwLCBidXQgdGhh dCBpcyB0b28gbGF0ZQotCSAqIG9uIEFNRCB3ZXJlIGVhcmx5X2NwdV9pbml0IChydW4gYmVmb3Jl IC0+YXJjaF9zZXR1cCgpKSBjYWxscwotCSAqIGVhcmx5X2FtZF9pbml0IHdoaWNoIHBva2VzIDB4 Y2Y4IHBvcnQuCi0JICovCi0Jc2V0X2lvcGwuaW9wbCA9IDE7Ci0JcmMgPSBIWVBFUlZJU09SX3Bo eXNkZXZfb3AoUEhZU0RFVk9QX3NldF9pb3BsLCAmc2V0X2lvcGwpOwotCWlmIChyYyAhPSAwKQot CQl4ZW5fcmF3X3ByaW50aygicGh5c2Rldl9vcCBmYWlsZWQgJWRcbiIsIHJjKTsKLQotI2lmZGVm IENPTkZJR19YODZfMzIKLQkvKiBzZXQgdXAgYmFzaWMgQ1BVSUQgc3R1ZmYgKi8KLQljcHVfZGV0 ZWN0KCZuZXdfY3B1X2RhdGEpOwotCXNldF9jcHVfY2FwKCZuZXdfY3B1X2RhdGEsIFg4Nl9GRUFU VVJFX0ZQVSk7Ci0JbmV3X2NwdV9kYXRhLndwX3dvcmtzX29rID0gMTsKLQluZXdfY3B1X2RhdGEu eDg2X2NhcGFiaWxpdHlbQ1BVSURfMV9FRFhdID0gY3B1aWRfZWR4KDEpOwotI2VuZGlmCi0KLQlp ZiAoeGVuX3N0YXJ0X2luZm8tPm1vZF9zdGFydCkgewotCSAgICBpZiAoeGVuX3N0YXJ0X2luZm8t PmZsYWdzICYgU0lGX01PRF9TVEFSVF9QRk4pCi0JCWluaXRyZF9zdGFydCA9IFBGTl9QSFlTKHhl bl9zdGFydF9pbmZvLT5tb2Rfc3RhcnQpOwotCSAgICBlbHNlCi0JCWluaXRyZF9zdGFydCA9IF9f cGEoeGVuX3N0YXJ0X2luZm8tPm1vZF9zdGFydCk7Ci0JfQotCi0JLyogUG9rZSB2YXJpb3VzIHVz ZWZ1bCB0aGluZ3MgaW50byBib290X3BhcmFtcyAqLwotCWJvb3RfcGFyYW1zLmhkci50eXBlX29m X2xvYWRlciA9ICg5IDw8IDQpIHwgMDsKLQlib290X3BhcmFtcy5oZHIucmFtZGlza19pbWFnZSA9 IGluaXRyZF9zdGFydDsKLQlib290X3BhcmFtcy5oZHIucmFtZGlza19zaXplID0geGVuX3N0YXJ0 X2luZm8tPm1vZF9sZW47Ci0JYm9vdF9wYXJhbXMuaGRyLmNtZF9saW5lX3B0ciA9IF9fcGEoeGVu X3N0YXJ0X2luZm8tPmNtZF9saW5lKTsKLQlib290X3BhcmFtcy5oZHIuaGFyZHdhcmVfc3ViYXJj aCA9IFg4Nl9TVUJBUkNIX1hFTjsKLQotCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpIHsKLQkJ YWRkX3ByZWZlcnJlZF9jb25zb2xlKCJ4ZW5ib290IiwgMCwgTlVMTCk7Ci0JCWFkZF9wcmVmZXJy ZWRfY29uc29sZSgidHR5IiwgMCwgTlVMTCk7Ci0JCWFkZF9wcmVmZXJyZWRfY29uc29sZSgiaHZj IiwgMCwgTlVMTCk7Ci0JCWlmIChwY2lfeGVuKQotCQkJeDg2X2luaXQucGNpLmFyY2hfaW5pdCA9 IHBjaV94ZW5faW5pdDsKLQl9IGVsc2UgewotCQljb25zdCBzdHJ1Y3QgZG9tMF92Z2FfY29uc29s ZV9pbmZvICppbmZvID0KLQkJCSh2b2lkICopKChjaGFyICopeGVuX3N0YXJ0X2luZm8gKwotCQkJ CSB4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5kb20wLmluZm9fb2ZmKTsKLQkJc3RydWN0IHhlbl9w bGF0Zm9ybV9vcCBvcCA9IHsKLQkJCS5jbWQgPSBYRU5QRl9maXJtd2FyZV9pbmZvLAotCQkJLmlu dGVyZmFjZV92ZXJzaW9uID0gWEVOUEZfSU5URVJGQUNFX1ZFUlNJT04sCi0JCQkudS5maXJtd2Fy ZV9pbmZvLnR5cGUgPSBYRU5fRldfS0JEX1NISUZUX0ZMQUdTLAotCQl9OwotCi0JCXg4Nl9wbGF0 Zm9ybS5zZXRfbGVnYWN5X2ZlYXR1cmVzID0KLQkJCQl4ZW5fZG9tMF9zZXRfbGVnYWN5X2ZlYXR1 cmVzOwotCQl4ZW5faW5pdF92Z2EoaW5mbywgeGVuX3N0YXJ0X2luZm8tPmNvbnNvbGUuZG9tMC5p bmZvX3NpemUpOwotCQl4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5kb21VLm1mbiA9IDA7Ci0JCXhl bl9zdGFydF9pbmZvLT5jb25zb2xlLmRvbVUuZXZ0Y2huID0gMDsKLQotCQlpZiAoSFlQRVJWSVNP Ul9wbGF0Zm9ybV9vcCgmb3ApID09IDApCi0JCQlib290X3BhcmFtcy5rYmRfc3RhdHVzID0gb3Au dS5maXJtd2FyZV9pbmZvLnUua2JkX3NoaWZ0X2ZsYWdzOwotCi0JCS8qIE1ha2Ugc3VyZSBBQ1Mg d2lsbCBiZSBlbmFibGVkICovCi0JCXBjaV9yZXF1ZXN0X2FjcygpOwotCi0JCXhlbl9hY3BpX3Ns ZWVwX3JlZ2lzdGVyKCk7Ci0KLQkJLyogQXZvaWQgc2VhcmNoaW5nIGZvciBCSU9TIE1QIHRhYmxl cyAqLwotCQl4ODZfaW5pdC5tcHBhcnNlLmZpbmRfc21wX2NvbmZpZyA9IHg4Nl9pbml0X25vb3A7 Ci0JCXg4Nl9pbml0Lm1wcGFyc2UuZ2V0X3NtcF9jb25maWcgPSB4ODZfaW5pdF91aW50X25vb3A7 Ci0KLQkJeGVuX2Jvb3RfcGFyYW1zX2luaXRfZWRkKCk7Ci0JfQotI2lmZGVmIENPTkZJR19QQ0kK LQkvKiBQQ0kgQklPUyBzZXJ2aWNlIHdvbid0IHdvcmsgZnJvbSBhIFBWIGd1ZXN0LiAqLwotCXBj aV9wcm9iZSAmPSB+UENJX1BST0JFX0JJT1M7Ci0jZW5kaWYKLQl4ZW5fcmF3X2NvbnNvbGVfd3Jp dGUoImFib3V0IHRvIGdldCBzdGFydGVkLi4uXG4iKTsKLQotCS8qIExldCdzIHByZXN1bWUgUFYg Z3Vlc3RzIGFsd2F5cyBib290IG9uIHZDUFUgd2l0aCBpZCAwLiAqLwotCXBlcl9jcHUoeGVuX3Zj cHVfaWQsIDApID0gMDsKLQotCXhlbl9zZXR1cF9ydW5zdGF0ZV9pbmZvKDApOwotCi0JeGVuX2Vm aV9pbml0KCk7Ci0KLQkvKiBTdGFydCB0aGUgd29ybGQgKi8KLSNpZmRlZiBDT05GSUdfWDg2XzMy Ci0JaTM4Nl9zdGFydF9rZXJuZWwoKTsKLSNlbHNlCi0JY3I0X2luaXRfc2hhZG93KCk7IC8qIDMy YiBrZXJuZWwgZG9lcyB0aGlzIGluIGkzODZfc3RhcnRfa2VybmVsKCkgKi8KLQl4ODZfNjRfc3Rh cnRfcmVzZXJ2YXRpb25zKChjaGFyICopX19wYV9zeW1ib2woJmJvb3RfcGFyYW1zKSk7Ci0jZW5k aWYKLX0KLQotc3RhdGljIGludCB4ZW5fY3B1X3VwX3ByZXBhcmVfcHYodW5zaWduZWQgaW50IGNw dSkKLXsKLQlpbnQgcmM7Ci0KLQl4ZW5fc2V0dXBfdGltZXIoY3B1KTsKLQotCXJjID0geGVuX3Nt cF9pbnRyX2luaXQoY3B1KTsKLQlpZiAocmMpIHsKLQkJV0FSTigxLCAieGVuX3NtcF9pbnRyX2lu aXQoKSBmb3IgQ1BVICVkIGZhaWxlZDogJWRcbiIsCi0JCSAgICAgY3B1LCByYyk7Ci0JCXJldHVy biByYzsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgeGVuX2NwdV9kZWFkX3B2KHVu c2lnbmVkIGludCBjcHUpCi17Ci0JeGVuX3NtcF9pbnRyX2ZyZWUoY3B1KTsKLQotCXhlbl90ZWFy ZG93bl90aW1lcihjcHUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgeGVuX2NwdV91 cF9vbmxpbmUodW5zaWduZWQgaW50IGNwdSkKLXsKLQl4ZW5faW5pdF9sb2NrX2NwdShjcHUpOwot CXJldHVybiAwOwotfQotCi1zdGF0aWMgdWludDMyX3QgX19pbml0IHhlbl9wbGF0Zm9ybV9wdih2 b2lkKQotewotCWlmICh4ZW5fcHZfZG9tYWluKCkpCi0JCXJldHVybiB4ZW5fY3B1aWRfYmFzZSgp OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zZXRfY3B1X2ZlYXR1cmVzKHN0 cnVjdCBjcHVpbmZvX3g4NiAqYykKLXsKLQljbGVhcl9jcHVfYnVnKGMsIFg4Nl9CVUdfU1lTUkVU X1NTX0FUVFJTKTsKLQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9YRU5QVik7Ci19Ci0KLXN0 YXRpYyB2b2lkIHhlbl9waW5fdmNwdShpbnQgY3B1KQotewotCXN0YXRpYyBib29sIGRpc2FibGVf cGlubmluZzsKLQlzdHJ1Y3Qgc2NoZWRfcGluX292ZXJyaWRlIHBpbl9vdmVycmlkZTsKLQlpbnQg cmV0OwotCi0JaWYgKGRpc2FibGVfcGlubmluZykKLQkJcmV0dXJuOwotCi0JcGluX292ZXJyaWRl LnBjcHUgPSBjcHU7Ci0JcmV0ID0gSFlQRVJWSVNPUl9zY2hlZF9vcChTQ0hFRE9QX3Bpbl9vdmVy cmlkZSwgJnBpbl9vdmVycmlkZSk7Ci0KLQkvKiBJZ25vcmUgZXJyb3JzIHdoZW4gcmVtb3Zpbmcg b3ZlcnJpZGUuICovCi0JaWYgKGNwdSA8IDApCi0JCXJldHVybjsKLQotCXN3aXRjaCAocmV0KSB7 Ci0JY2FzZSAtRU5PU1lTOgotCQlwcl93YXJuKCJVbmFibGUgdG8gcGluIG9uIHBoeXNpY2FsIGNw dSAlZC4gSW4gY2FzZSBvZiBwcm9ibGVtcyBjb25zaWRlciB2Y3B1IHBpbm5pbmcuXG4iLAotCQkJ Y3B1KTsKLQkJZGlzYWJsZV9waW5uaW5nID0gdHJ1ZTsKLQkJYnJlYWs7Ci0JY2FzZSAtRVBFUk06 Ci0JCVdBUk4oMSwgIlRyeWluZyB0byBwaW4gdmNwdSB3aXRob3V0IGhhdmluZyBwcml2aWxlZ2Ug dG8gZG8gc29cbiIpOwotCQlkaXNhYmxlX3Bpbm5pbmcgPSB0cnVlOwotCQlicmVhazsKLQljYXNl IC1FSU5WQUw6Ci0JY2FzZSAtRUJVU1k6Ci0JCXByX3dhcm4oIlBoeXNpY2FsIGNwdSAlZCBub3Qg YXZhaWxhYmxlIGZvciBwaW5uaW5nLiBDaGVjayBYZW4gY3B1IGNvbmZpZ3VyYXRpb24uXG4iLAot CQkJY3B1KTsKLQkJYnJlYWs7Ci0JY2FzZSAwOgotCQlicmVhazsKLQlkZWZhdWx0OgotCQlXQVJO KDEsICJyYyAlZCB3aGlsZSB0cnlpbmcgdG8gcGluIHZjcHVcbiIsIHJldCk7Ci0JCWRpc2FibGVf cGlubmluZyA9IHRydWU7Ci0JfQotfQotCi1jb25zdCBzdHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2 X2h5cGVyX3hlbl9wdiA9IHsKLQkubmFtZSAgICAgICAgICAgICAgICAgICA9ICJYZW4gUFYiLAot CS5kZXRlY3QgICAgICAgICAgICAgICAgID0geGVuX3BsYXRmb3JtX3B2LAotCS5zZXRfY3B1X2Zl YXR1cmVzICAgICAgID0geGVuX3NldF9jcHVfZmVhdHVyZXMsCi0JLnBpbl92Y3B1ICAgICAgICAg ICAgICAgPSB4ZW5fcGluX3ZjcHUsCi19OwotRVhQT1JUX1NZTUJPTCh4ODZfaHlwZXJfeGVuX3B2 KTsKLQogI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQogdm9pZCB4ZW5fYXJjaF9yZWdpc3Rlcl9j cHUoaW50IG51bSkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW5fcHYuYyBi L2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW5fcHYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwLi5iOWZmMjNjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYveGVuL2VubGlnaHRl bl9wdi5jCkBAIC0wLDAgKzEsMTU1MiBAQAorLyoKKyAqIENvcmUgb2YgWGVuIHBhcmF2aXJ0X29w cyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHhlbl9wYXJh dmlydF9vcHMgc3RydWN0dXJlIGl0c2VsZiwgYW5kIHRoZQorICogaW1wbGVtZW50YXRpb25zIGZv cjoKKyAqIC0gcHJpdmlsZWdlZCBpbnN0cnVjdGlvbnMKKyAqIC0gaW50ZXJydXB0IGZsYWdzCisg KiAtIHNlZ21lbnQgb3BlcmF0aW9ucworICogLSBib290aW5nIGFuZCBzZXR1cAorICoKKyAqIEpl cmVteSBGaXR6aGFyZGluZ2UgPGplcmVteUB4ZW5zb3VyY2UuY29tPiwgWGVuU291cmNlIEluYywg MjAwNworICovCisKKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJu ZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+Cisj aW5jbHVkZSA8bGludXgvcHJlZW1wdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNp bmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1 ZGUgPGxpbnV4L3N0YXJ0X2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5j bHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Jvb3RtZW0uaD4KKyNpbmNs dWRlIDxsaW51eC9leHBvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxp bnV4L3BhZ2UtZmxhZ3MuaD4KKyNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CisjaW5jbHVkZSA8 bGludXgvY29uc29sZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4 L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+CisjaW5jbHVkZSA8bGludXgvZWRk Lmg+CisjaW5jbHVkZSA8bGludXgvZnJhbWUuaD4KKworI2luY2x1ZGUgPHhlbi94ZW4uaD4KKyNp bmNsdWRlIDx4ZW4vZXZlbnRzLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4uaD4KKyNp bmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZlcnNpb24uaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNl L3BoeXNkZXYuaD4KKyNpbmNsdWRlIDx4ZW4vaW50ZXJmYWNlL3ZjcHUuaD4KKyNpbmNsdWRlIDx4 ZW4vaW50ZXJmYWNlL21lbW9yeS5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2Uvbm1pLmg+Cisj aW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW4tbWNhLmg+CisjaW5jbHVkZSA8eGVuL2ZlYXR1cmVz Lmg+CisjaW5jbHVkZSA8eGVuL3BhZ2UuaD4KKyNpbmNsdWRlIDx4ZW4vaHZjLWNvbnNvbGUuaD4K KyNpbmNsdWRlIDx4ZW4vYWNwaS5oPgorCisjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjaW5j bHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS94 ZW4vcGNpLmg+CisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KKyNpbmNsdWRlIDxhc20v eGVuL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20veGVuL2NwdWlkLmg+CisjaW5jbHVkZSA8 YXNtL2ZpeG1hcC5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKyNpbmNsdWRlIDxhc20v cHJvdG8uaD4KKyNpbmNsdWRlIDxhc20vbXNyLWluZGV4Lmg+CisjaW5jbHVkZSA8YXNtL3RyYXBz Lmg+CisjaW5jbHVkZSA8YXNtL3NldHVwLmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNs dWRlIDxhc20vcGdhbGxvYy5oPgorI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CisjaW5jbHVkZSA8 YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL3JlYm9vdC5oPgorI2luY2x1ZGUgPGFzbS9z dGFja3Byb3RlY3Rvci5oPgorI2luY2x1ZGUgPGFzbS9oeXBlcnZpc29yLmg+CisjaW5jbHVkZSA8 YXNtL21hY2hfdHJhcHMuaD4KKyNpbmNsdWRlIDxhc20vbXdhaXQuaD4KKyNpbmNsdWRlIDxhc20v cGNpX3g4Ni5oPgorI2luY2x1ZGUgPGFzbS9jcHUuaD4KKworI2lmZGVmIENPTkZJR19BQ1BJCisj aW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGFzbS9hY3BpLmg+CisjaW5jbHVkZSA8 YWNwaS9wZGNfaW50ZWwuaD4KKyNpbmNsdWRlIDxhY3BpL3Byb2Nlc3Nvci5oPgorI2luY2x1ZGUg PHhlbi9pbnRlcmZhY2UvcGxhdGZvcm0uaD4KKyNlbmRpZgorCisjaW5jbHVkZSAieGVuLW9wcy5o IgorI2luY2x1ZGUgIm1tdS5oIgorI2luY2x1ZGUgInNtcC5oIgorI2luY2x1ZGUgIm11bHRpY2Fs bHMuaCIKKyNpbmNsdWRlICJwbXUuaCIKKwordm9pZCAqeGVuX2luaXRpYWxfZ2R0OworCitSRVNF UlZFX0JSSyhzaGFyZWRfaW5mb19wYWdlX2JyaywgUEFHRV9TSVpFKTsKKworc3RhdGljIGludCB4 ZW5fY3B1X3VwX3ByZXBhcmVfcHYodW5zaWduZWQgaW50IGNwdSk7CitzdGF0aWMgaW50IHhlbl9j cHVfZGVhZF9wdih1bnNpZ25lZCBpbnQgY3B1KTsKKworc3RydWN0IHRsc19kZXNjcyB7CisJc3Ry dWN0IGRlc2Nfc3RydWN0IGRlc2NbM107Cit9OworCisvKgorICogVXBkYXRpbmcgdGhlIDMgVExT IGRlc2NyaXB0b3JzIGluIHRoZSBHRFQgb24gZXZlcnkgdGFzayBzd2l0Y2ggaXMKKyAqIHN1cnBy aXNpbmdseSBleHBlbnNpdmUgc28gd2UgYXZvaWQgdXBkYXRpbmcgdGhlbSBpZiB0aGV5IGhhdmVu J3QKKyAqIGNoYW5nZWQuICBTaW5jZSBYZW4gd3JpdGVzIGRpZmZlcmVudCBkZXNjcmlwdG9ycyB0 aGFuIHRoZSBvbmUKKyAqIHBhc3NlZCBpbiB0aGUgdXBkYXRlX2Rlc2NyaXB0b3IgaHlwZXJjYWxs IHdlIGtlZXAgc2hhZG93IGNvcGllcyB0bworICogY29tcGFyZSBhZ2FpbnN0LgorICovCitzdGF0 aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRsc19kZXNjcywgc2hhZG93X3Rsc19kZXNjKTsKKwor LyoKKyAqIE9uIHJlc3RvcmUsIHNldCB0aGUgdmNwdSBwbGFjZW1lbnQgdXAgYWdhaW4uCisgKiBJ ZiBpdCBmYWlscywgdGhlbiB3ZSdyZSBpbiBhIGJhZCBzdGF0ZSwgc2luY2UKKyAqIHdlIGNhbid0 IGJhY2sgb3V0IGZyb20gdXNpbmcgaXQuLi4KKyAqLwordm9pZCB4ZW5fdmNwdV9yZXN0b3JlKHZv aWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJYm9v bCBvdGhlcl9jcHUgPSAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWJvb2wgaXNfdXAg PSBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX2lzX3VwLCB4ZW5fdmNwdV9ucihjcHUpLAorCQkJ CQkJTlVMTCk7CisKKwkJaWYgKG90aGVyX2NwdSAmJiBpc191cCAmJgorCQkgICAgSFlQRVJWSVNP Ul92Y3B1X29wKFZDUFVPUF9kb3duLCB4ZW5fdmNwdV9ucihjcHUpLCBOVUxMKSkKKwkJCUJVRygp OworCisJCXhlbl9zZXR1cF9ydW5zdGF0ZV9pbmZvKGNwdSk7CisKKwkJaWYgKHhlbl9oYXZlX3Zj cHVfaW5mb19wbGFjZW1lbnQpCisJCQl4ZW5fdmNwdV9zZXR1cChjcHUpOworCisJCWlmIChvdGhl cl9jcHUgJiYgaXNfdXAgJiYKKwkJICAgIEhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfdXAsIHhl bl92Y3B1X25yKGNwdSksIE5VTEwpKQorCQkJQlVHKCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBf X2luaXQgeGVuX2Jhbm5lcih2b2lkKQoreworCXVuc2lnbmVkIHZlcnNpb24gPSBIWVBFUlZJU09S X3hlbl92ZXJzaW9uKFhFTlZFUl92ZXJzaW9uLCBOVUxMKTsKKwlzdHJ1Y3QgeGVuX2V4dHJhdmVy c2lvbiBleHRyYTsKKwlIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9leHRyYXZlcnNpb24s ICZleHRyYSk7CisKKwlwcl9pbmZvKCJCb290aW5nIHBhcmF2aXJ0dWFsaXplZCBrZXJuZWwgJXNv biAlc1xuIiwKKwkJeGVuX2ZlYXR1cmUoWEVORkVBVF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkg PworCQkJIndpdGggUFZIIGV4dGVuc2lvbnMgIiA6ICIiLCBwdl9pbmZvLm5hbWUpOworCXByaW50 ayhLRVJOX0lORk8gIlhlbiB2ZXJzaW9uOiAlZC4lZCVzJXNcbiIsCisJICAgICAgIHZlcnNpb24g Pj4gMTYsIHZlcnNpb24gJiAweGZmZmYsIGV4dHJhLmV4dHJhdmVyc2lvbiwKKwkgICAgICAgeGVu X2ZlYXR1cmUoWEVORkVBVF9tbXVfcHRfdXBkYXRlX3ByZXNlcnZlX2FkKSA/ICIgKHByZXNlcnZl LUFEKSIgOiAiIik7Cit9CisvKiBDaGVjayBpZiBydW5uaW5nIG9uIFhlbiB2ZXJzaW9uIChtYWpv ciwgbWlub3IpIG9yIGxhdGVyICovCitib29sCit4ZW5fcnVubmluZ19vbl92ZXJzaW9uX29yX2xh dGVyKHVuc2lnbmVkIGludCBtYWpvciwgdW5zaWduZWQgaW50IG1pbm9yKQoreworCXVuc2lnbmVk IGludCB2ZXJzaW9uOworCisJaWYgKCF4ZW5fZG9tYWluKCkpCisJCXJldHVybiBmYWxzZTsKKwor CXZlcnNpb24gPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl92ZXJzaW9uLCBOVUxMKTsK KwlpZiAoKCgodmVyc2lvbiA+PiAxNikgPT0gbWFqb3IpICYmICgodmVyc2lvbiAmIDB4ZmZmZikg Pj0gbWlub3IpKSB8fAorCQkoKHZlcnNpb24gPj4gMTYpID4gbWFqb3IpKQorCQlyZXR1cm4gdHJ1 ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKyNkZWZpbmUgQ1BVSURfVEhFUk1fUE9XRVJfTEVBRiA2 CisjZGVmaW5lIEFQRVJGTVBFUkZfUFJFU0VOVCAwCisKK3N0YXRpYyBfX3JlYWRfbW9zdGx5IHVu c2lnbmVkIGludCBjcHVpZF9sZWFmMV9lZHhfbWFzayA9IH4wOworc3RhdGljIF9fcmVhZF9tb3N0 bHkgdW5zaWduZWQgaW50IGNwdWlkX2xlYWYxX2VjeF9tYXNrID0gfjA7CisKK3N0YXRpYyBfX3Jl YWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVpZF9sZWFmMV9lY3hfc2V0X21hc2s7CitzdGF0aWMg X19yZWFkX21vc3RseSB1bnNpZ25lZCBpbnQgY3B1aWRfbGVhZjVfZWN4X3ZhbDsKK3N0YXRpYyBf X3JlYWRfbW9zdGx5IHVuc2lnbmVkIGludCBjcHVpZF9sZWFmNV9lZHhfdmFsOworCitzdGF0aWMg dm9pZCB4ZW5fY3B1aWQodW5zaWduZWQgaW50ICpheCwgdW5zaWduZWQgaW50ICpieCwKKwkJICAg ICAgdW5zaWduZWQgaW50ICpjeCwgdW5zaWduZWQgaW50ICpkeCkKK3sKKwl1bnNpZ25lZCBtYXNr ZWJ4ID0gfjA7CisJdW5zaWduZWQgbWFza2VjeCA9IH4wOworCXVuc2lnbmVkIG1hc2tlZHggPSB+ MDsKKwl1bnNpZ25lZCBzZXRlY3ggPSAwOworCS8qCisJICogTWFzayBvdXQgaW5jb252ZW5pZW50 IGZlYXR1cmVzLCB0byB0cnkgYW5kIGRpc2FibGUgYXMgbWFueQorCSAqIHVuc3VwcG9ydGVkIGtl cm5lbCBzdWJzeXN0ZW1zIGFzIHBvc3NpYmxlLgorCSAqLworCXN3aXRjaCAoKmF4KSB7CisJY2Fz ZSAxOgorCQltYXNrZWN4ID0gY3B1aWRfbGVhZjFfZWN4X21hc2s7CisJCXNldGVjeCA9IGNwdWlk X2xlYWYxX2VjeF9zZXRfbWFzazsKKwkJbWFza2VkeCA9IGNwdWlkX2xlYWYxX2VkeF9tYXNrOwor CQlicmVhazsKKworCWNhc2UgQ1BVSURfTVdBSVRfTEVBRjoKKwkJLyogU3ludGhlc2l6ZSB0aGUg dmFsdWVzLi4gKi8KKwkJKmF4ID0gMDsKKwkJKmJ4ID0gMDsKKwkJKmN4ID0gY3B1aWRfbGVhZjVf ZWN4X3ZhbDsKKwkJKmR4ID0gY3B1aWRfbGVhZjVfZWR4X3ZhbDsKKwkJcmV0dXJuOworCisJY2Fz ZSBDUFVJRF9USEVSTV9QT1dFUl9MRUFGOgorCQkvKiBEaXNhYmxpbmcgQVBFUkZNUEVSRiBmb3Ig a2VybmVsIHVzYWdlICovCisJCW1hc2tlY3ggPSB+KDEgPDwgQVBFUkZNUEVSRl9QUkVTRU5UKTsK KwkJYnJlYWs7CisKKwljYXNlIDB4YjoKKwkJLyogU3VwcHJlc3MgZXh0ZW5kZWQgdG9wb2xvZ3kg c3R1ZmYgKi8KKwkJbWFza2VieCA9IDA7CisJCWJyZWFrOworCX0KKworCWFzbShYRU5fRU1VTEFU RV9QUkVGSVggImNwdWlkIgorCQk6ICI9YSIgKCpheCksCisJCSAgIj1iIiAoKmJ4KSwKKwkJICAi PWMiICgqY3gpLAorCQkgICI9ZCIgKCpkeCkKKwkJOiAiMCIgKCpheCksICIyIiAoKmN4KSk7CisK KwkqYnggJj0gbWFza2VieDsKKwkqY3ggJj0gbWFza2VjeDsKKwkqY3ggfD0gc2V0ZWN4OworCSpk eCAmPSBtYXNrZWR4OworfQorU1RBQ0tfRlJBTUVfTk9OX1NUQU5EQVJEKHhlbl9jcHVpZCk7IC8q IFhFTl9FTVVMQVRFX1BSRUZJWCAqLworCitzdGF0aWMgYm9vbCBfX2luaXQgeGVuX2NoZWNrX213 YWl0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX0FDUEkKKwlzdHJ1Y3QgeGVuX3BsYXRmb3JtX29w IG9wID0geworCQkuY21kCQkJPSBYRU5QRl9zZXRfcHJvY2Vzc29yX3BtaW5mbywKKwkJLnUuc2V0 X3BtaW5mby5pZAk9IC0xLAorCQkudS5zZXRfcG1pbmZvLnR5cGUJPSBYRU5fUE1fUERDLAorCX07 CisJdWludDMyX3QgYnVmWzNdOworCXVuc2lnbmVkIGludCBheCwgYngsIGN4LCBkeDsKKwl1bnNp Z25lZCBpbnQgbXdhaXRfbWFzazsKKworCS8qIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIg aXQgaXMgT0sgdG8gZXhwb3NlIHRoZSBNV0FJVAorCSAqIGNhcGFiaWxpdHkgdG8gdGhlIGtlcm5l bCB0byBoYXJ2ZXN0IGRlZXBlciB0aGFuIEMzIHN0YXRlcyBmcm9tIEFDUEkKKwkgKiBfQ1NUIHVz aW5nIHRoZSBwcm9jZXNzb3JfaGFydmVzdF94ZW4uYyBtb2R1bGUuIEZvciB0aGlzIHRvIHdvcmss IHdlCisJICogbmVlZCB0byBnYXRoZXIgdGhlIE1XQUlUX0xFQUYgdmFsdWVzICh3aGljaCB0aGUg Y3N0YXRlLmMgY29kZQorCSAqIGNoZWNrcyBhZ2FpbnN0KS4gVGhlIGh5cGVydmlzb3Igd29uJ3Qg ZXhwb3NlIHRoZSBNV0FJVCBmbGFnIGJlY2F1c2UKKwkgKiBpdCB3b3VsZCBicmVhayBiYWNrd2Fy ZHMgY29tcGF0aWJpbGl0eTsgc28gd2Ugd2lsbCBmaW5kIG91dCBkaXJlY3RseQorCSAqIGZyb20g dGhlIGhhcmR3YXJlIGFuZCBoeXBlcmNhbGwuCisJICovCisJaWYgKCF4ZW5faW5pdGlhbF9kb21h aW4oKSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyoKKwkgKiBXaGVuIHJ1bm5pbmcgdW5kZXIgcGxh dGZvcm0gZWFybGllciB0aGFuIFhlbjQuMiwgZG8gbm90IGV4cG9zZQorCSAqIG13YWl0LCB0byBh dm9pZCB0aGUgcmlzayBvZiBsb2FkaW5nIG5hdGl2ZSBhY3BpIHBhZCBkcml2ZXIKKwkgKi8KKwlp ZiAoIXhlbl9ydW5uaW5nX29uX3ZlcnNpb25fb3JfbGF0ZXIoNCwgMikpCisJCXJldHVybiBmYWxz ZTsKKworCWF4ID0gMTsKKwljeCA9IDA7CisKKwluYXRpdmVfY3B1aWQoJmF4LCAmYngsICZjeCwg JmR4KTsKKworCW13YWl0X21hc2sgPSAoMSA8PCAoWDg2X0ZFQVRVUkVfRVNUICUgMzIpKSB8CisJ CSAgICAgKDEgPDwgKFg4Nl9GRUFUVVJFX01XQUlUICUgMzIpKTsKKworCWlmICgoY3ggJiBtd2Fp dF9tYXNrKSAhPSBtd2FpdF9tYXNrKQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBXZSBuZWVkIHRv IGVtdWxhdGUgdGhlIE1XQUlUX0xFQUYgYW5kIGZvciB0aGF0IHdlIG5lZWQgYm90aAorCSAqIGVj eCBhbmQgZWR4LiBUaGUgaHlwZXJjYWxsIHByb3ZpZGVzIG9ubHkgcGFydGlhbCBpbmZvcm1hdGlv bi4KKwkgKi8KKworCWF4ID0gQ1BVSURfTVdBSVRfTEVBRjsKKwlieCA9IDA7CisJY3ggPSAwOwor CWR4ID0gMDsKKworCW5hdGl2ZV9jcHVpZCgmYXgsICZieCwgJmN4LCAmZHgpOworCisJLyogQXNr IHRoZSBIeXBlcnZpc29yIHdoZXRoZXIgdG8gY2xlYXIgQUNQSV9QRENfQ19DMkMzX0ZGSC4gSWYg c28sCisJICogZG9uJ3QgZXhwb3NlIE1XQUlUX0xFQUYgYW5kIGxldCBBQ1BJIHBpY2sgdGhlIElP UE9SVCB2ZXJzaW9uIG9mIEMzLgorCSAqLworCWJ1ZlswXSA9IEFDUElfUERDX1JFVklTSU9OX0lE OworCWJ1ZlsxXSA9IDE7CisJYnVmWzJdID0gKEFDUElfUERDX0NfQ0FQQUJJTElUWV9TTVAgfCBB Q1BJX1BEQ19FU1RfQ0FQQUJJTElUWV9TV1NNUCk7CisKKwlzZXRfeGVuX2d1ZXN0X2hhbmRsZShv cC51LnNldF9wbWluZm8ucGRjLCBidWYpOworCisJaWYgKChIWVBFUlZJU09SX3BsYXRmb3JtX29w KCZvcCkgPT0gMCkgJiYKKwkgICAgKGJ1ZlsyXSAmIChBQ1BJX1BEQ19DX0MxX0ZGSCB8IEFDUElf UERDX0NfQzJDM19GRkgpKSkgeworCQljcHVpZF9sZWFmNV9lY3hfdmFsID0gY3g7CisJCWNwdWlk X2xlYWY1X2VkeF92YWwgPSBkeDsKKwl9CisJcmV0dXJuIHRydWU7CisjZWxzZQorCXJldHVybiBm YWxzZTsKKyNlbmRpZgorfQorc3RhdGljIHZvaWQgX19pbml0IHhlbl9pbml0X2NwdWlkX21hc2so dm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgYXgsIGJ4LCBjeCwgZHg7CisJdW5zaWduZWQgaW50IHhz YXZlX21hc2s7CisKKwljcHVpZF9sZWFmMV9lZHhfbWFzayA9CisJCX4oKDEgPDwgWDg2X0ZFQVRV UkVfTVRSUikgfCAgLyogZGlzYWJsZSBNVFJSICovCisJCSAgKDEgPDwgWDg2X0ZFQVRVUkVfQUND KSk7ICAgLyogdGhlcm1hbCBtb25pdG9yaW5nICovCisKKwlpZiAoIXhlbl9pbml0aWFsX2RvbWFp bigpKQorCQljcHVpZF9sZWFmMV9lZHhfbWFzayAmPQorCQkJfigoMSA8PCBYODZfRkVBVFVSRV9B Q1BJKSk7ICAvKiBkaXNhYmxlIEFDUEkgKi8KKworCWNwdWlkX2xlYWYxX2VjeF9tYXNrICY9IH4o MSA8PCAoWDg2X0ZFQVRVUkVfWDJBUElDICUgMzIpKTsKKworCWF4ID0gMTsKKwljeCA9IDA7CisJ Y3B1aWQoMSwgJmF4LCAmYngsICZjeCwgJmR4KTsKKworCXhzYXZlX21hc2sgPQorCQkoMSA8PCAo WDg2X0ZFQVRVUkVfWFNBVkUgJSAzMikpIHwKKwkJKDEgPDwgKFg4Nl9GRUFUVVJFX09TWFNBVkUg JSAzMikpOworCisJLyogWGVuIHdpbGwgc2V0IENSNC5PU1hTQVZFIGlmIHN1cHBvcnRlZCBhbmQg bm90IGRpc2FibGVkIGJ5IGZvcmNlICovCisJaWYgKChjeCAmIHhzYXZlX21hc2spICE9IHhzYXZl X21hc2spCisJCWNwdWlkX2xlYWYxX2VjeF9tYXNrICY9IH54c2F2ZV9tYXNrOyAvKiBkaXNhYmxl IFhTQVZFICYgT1NYU0FWRSAqLworCWlmICh4ZW5fY2hlY2tfbXdhaXQoKSkKKwkJY3B1aWRfbGVh ZjFfZWN4X3NldF9tYXNrID0gKDEgPDwgKFg4Nl9GRUFUVVJFX01XQUlUICUgMzIpKTsKK30KKwor c3RhdGljIHZvaWQgeGVuX3NldF9kZWJ1Z3JlZyhpbnQgcmVnLCB1bnNpZ25lZCBsb25nIHZhbCkK K3sKKwlIWVBFUlZJU09SX3NldF9kZWJ1Z3JlZyhyZWcsIHZhbCk7Cit9CisKK3N0YXRpYyB1bnNp Z25lZCBsb25nIHhlbl9nZXRfZGVidWdyZWcoaW50IHJlZykKK3sKKwlyZXR1cm4gSFlQRVJWSVNP Ul9nZXRfZGVidWdyZWcocmVnKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2VuZF9jb250ZXh0X3N3 aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCit7CisJeGVuX21jX2ZsdXNoKCk7CisJcGFy YXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKG5leHQpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9u ZyB4ZW5fc3RvcmVfdHIodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFNldCB0aGUg cGFnZSBwZXJtaXNzaW9ucyBmb3IgYSBwYXJ0aWN1bGFyIHZpcnR1YWwgYWRkcmVzcy4gIElmIHRo ZQorICogYWRkcmVzcyBpcyBhIHZtYWxsb2MgbWFwcGluZyAob3Igb3RoZXIgbm9uLWxpbmVhciBt YXBwaW5nKSwgdGhlbgorICogZmluZCB0aGUgbGluZWFyIG1hcHBpbmcgb2YgdGhlIHBhZ2UgYW5k IGFsc28gc2V0IGl0cyBwcm90ZWN0aW9ucyB0bworICogbWF0Y2guCisgKi8KK3N0YXRpYyB2b2lk IHNldF9hbGlhc2VkX3Byb3Qodm9pZCAqdiwgcGdwcm90X3QgcHJvdCkKK3sKKwlpbnQgbGV2ZWw7 CisJcHRlX3QgKnB0ZXA7CisJcHRlX3QgcHRlOworCXVuc2lnbmVkIGxvbmcgcGZuOworCXN0cnVj dCBwYWdlICpwYWdlOworCXVuc2lnbmVkIGNoYXIgZHVtbXk7CisKKwlwdGVwID0gbG9va3VwX2Fk ZHJlc3MoKHVuc2lnbmVkIGxvbmcpdiwgJmxldmVsKTsKKwlCVUdfT04ocHRlcCA9PSBOVUxMKTsK KworCXBmbiA9IHB0ZV9wZm4oKnB0ZXApOworCXBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOworCisJ cHRlID0gcGZuX3B0ZShwZm4sIHByb3QpOworCisJLyoKKwkgKiBDYXJlZnVsOiB1cGRhdGVfdmFf bWFwcGluZygpIHdpbGwgZmFpbCBpZiB0aGUgdmlydHVhbCBhZGRyZXNzCisJICogd2UncmUgcG9r aW5nIGlzbid0IHBvcHVsYXRlZCBpbiB0aGUgcGFnZSB0YWJsZXMuICBXZSBkb24ndAorCSAqIG5l ZWQgdG8gd29ycnkgYWJvdXQgdGhlIGRpcmVjdCBtYXAgKHRoYXQncyBhbHdheXMgaW4gdGhlIHBh Z2UKKwkgKiB0YWJsZXMpLCBidXQgd2UgbmVlZCB0byBiZSBjYXJlZnVsIGFib3V0IHZtYXAgc3Bh Y2UuICBJbgorCSAqIHBhcnRpY3VsYXIsIHRoZSB0b3AgbGV2ZWwgcGFnZSB0YWJsZSBjYW4gbGF6 aWx5IHByb3BhZ2F0ZQorCSAqIGVudHJpZXMgYmV0d2VlbiBwcm9jZXNzZXMsIHNvIGlmIHdlJ3Zl IHN3aXRjaGVkIG1tcyBzaW5jZSB3ZQorCSAqIHZtYXBwZWQgdGhlIHRhcmdldCBpbiB0aGUgZmly c3QgcGxhY2UsIHdlIG1pZ2h0IG5vdCBoYXZlIHRoZQorCSAqIHRvcC1sZXZlbCBwYWdlIHRhYmxl IGVudHJ5IHBvcHVsYXRlZC4KKwkgKgorCSAqIFdlIGRpc2FibGUgcHJlZW1wdGlvbiBiZWNhdXNl IHdlIHdhbnQgdGhlIHNhbWUgbW0gYWN0aXZlIHdoZW4KKwkgKiB3ZSBwcm9iZSB0aGUgdGFyZ2V0 IGFuZCB3aGVuIHdlIGlzc3VlIHRoZSBoeXBlcmNhbGwuICBXZSdsbAorCSAqIGhhdmUgdGhlIHNh bWUgbm9taW5hbCBtbSwgYnV0IGlmIHdlJ3JlIGEga2VybmVsIHRocmVhZCwgbGF6eQorCSAqIG1t IGRyb3BwaW5nIGNvdWxkIGNoYW5nZSBvdXIgcGdkLgorCSAqCisJICogT3V0IG9mIGFuIGFidW5k YW5jZSBvZiBjYXV0aW9uLCB0aGlzIHVzZXMgX19nZXRfdXNlcigpIHRvIGZhdWx0CisJICogaW4g dGhlIHRhcmdldCBhZGRyZXNzIGp1c3QgaW4gY2FzZSB0aGVyZSdzIHNvbWUgb2JzY3VyZSBjYXNl CisJICogaW4gd2hpY2ggdGhlIHRhcmdldCBhZGRyZXNzIGlzbid0IHJlYWRhYmxlLgorCSAqLwor CisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlwcm9iZV9rZXJuZWxfcmVhZCgmZHVtbXksIHYsIDEp OworCisJaWYgKEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBpbmcoKHVuc2lnbmVkIGxvbmcpdiwg cHRlLCAwKSkKKwkJQlVHKCk7CisKKwlpZiAoIVBhZ2VIaWdoTWVtKHBhZ2UpKSB7CisJCXZvaWQg KmF2ID0gX192YShQRk5fUEhZUyhwZm4pKTsKKworCQlpZiAoYXYgIT0gdikKKwkJCWlmIChIWVBF UlZJU09SX3VwZGF0ZV92YV9tYXBwaW5nKCh1bnNpZ25lZCBsb25nKWF2LCBwdGUsIDApKQorCQkJ CUJVRygpOworCX0gZWxzZQorCQlrbWFwX2ZsdXNoX3VudXNlZCgpOworCisJcHJlZW1wdF9lbmFi bGUoKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2FsbG9jX2xkdChzdHJ1Y3QgZGVzY19zdHJ1Y3Qg KmxkdCwgdW5zaWduZWQgZW50cmllcykKK3sKKwljb25zdCB1bnNpZ25lZCBlbnRyaWVzX3Blcl9w YWdlID0gUEFHRV9TSVpFIC8gTERUX0VOVFJZX1NJWkU7CisJaW50IGk7CisKKwkvKgorCSAqIFdl IG5lZWQgdG8gbWFyayB0aGUgYWxsIGFsaWFzZXMgb2YgdGhlIExEVCBwYWdlcyBSTy4gIFdlCisJ ICogZG9uJ3QgbmVlZCB0byBjYWxsIHZtX2ZsdXNoX2FsaWFzZXMoKSwgdGhvdWdoLCBzaW5jZSB0 aGF0J3MKKwkgKiBvbmx5IHJlc3BvbnNpYmxlIGZvciBmbHVzaGluZyBhbGlhc2VzIG91dCB0aGUg VExCcywgbm90IHRoZQorCSAqIHBhZ2UgdGFibGVzLCBhbmQgWGVuIHdpbGwgZmx1c2ggdGhlIFRM QiBmb3IgdXMgaWYgbmVlZGVkLgorCSAqCisJICogVG8gYXZvaWQgY29uZnVzaW5nIGZ1dHVyZSBy ZWFkZXJzOiBub25lIG9mIHRoaXMgaXMgbmVjZXNzYXJ5CisJICogdG8gbG9hZCB0aGUgTERULiAg VGhlIGh5cGVydmlzb3Igb25seSBjaGVja3MgdGhpcyB3aGVuIHRoZQorCSAqIExEVCBpcyBmYXVs dGVkIGluIGR1ZSB0byBzdWJzZXF1ZW50IGRlc2NyaXB0b3IgYWNjZXNzLgorCSAqLworCisJZm9y IChpID0gMDsgaSA8IGVudHJpZXM7IGkgKz0gZW50cmllc19wZXJfcGFnZSkKKwkJc2V0X2FsaWFz ZWRfcHJvdChsZHQgKyBpLCBQQUdFX0tFUk5FTF9STyk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9m cmVlX2xkdChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmxkdCwgdW5zaWduZWQgZW50cmllcykKK3sKKwlj b25zdCB1bnNpZ25lZCBlbnRyaWVzX3Blcl9wYWdlID0gUEFHRV9TSVpFIC8gTERUX0VOVFJZX1NJ WkU7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgZW50cmllczsgaSArPSBlbnRyaWVzX3Bl cl9wYWdlKQorCQlzZXRfYWxpYXNlZF9wcm90KGxkdCArIGksIFBBR0VfS0VSTkVMKTsKK30KKwor c3RhdGljIHZvaWQgeGVuX3NldF9sZHQoY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgZW50cmll cykKK3sKKwlzdHJ1Y3QgbW11ZXh0X29wICpvcDsKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1j cyA9IHhlbl9tY19lbnRyeShzaXplb2YoKm9wKSk7CisKKwl0cmFjZV94ZW5fY3B1X3NldF9sZHQo YWRkciwgZW50cmllcyk7CisKKwlvcCA9IG1jcy5hcmdzOworCW9wLT5jbWQgPSBNTVVFWFRfU0VU X0xEVDsKKwlvcC0+YXJnMS5saW5lYXJfYWRkciA9ICh1bnNpZ25lZCBsb25nKWFkZHI7CisJb3At PmFyZzIubnJfZW50cyA9IGVudHJpZXM7CisKKwlNVUxUSV9tbXVleHRfb3AobWNzLm1jLCBvcCwg MSwgTlVMTCwgRE9NSURfU0VMRik7CisKKwl4ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUp OworfQorCitzdGF0aWMgdm9pZCB4ZW5fbG9hZF9nZHQoY29uc3Qgc3RydWN0IGRlc2NfcHRyICpk dHIpCit7CisJdW5zaWduZWQgbG9uZyB2YSA9IGR0ci0+YWRkcmVzczsKKwl1bnNpZ25lZCBpbnQg c2l6ZSA9IGR0ci0+c2l6ZSArIDE7CisJdW5zaWduZWQgcGFnZXMgPSBESVZfUk9VTkRfVVAoc2l6 ZSwgUEFHRV9TSVpFKTsKKwl1bnNpZ25lZCBsb25nIGZyYW1lc1twYWdlc107CisJaW50IGY7CisK KwkvKgorCSAqIEEgR0RUIGNhbiBiZSB1cCB0byA2NGsgaW4gc2l6ZSwgd2hpY2ggY29ycmVzcG9u ZHMgdG8gODE5MgorCSAqIDgtYnl0ZSBlbnRyaWVzLCBvciAxNiA0ayBwYWdlcy4uCisJICovCisK KwlCVUdfT04oc2l6ZSA+IDY1NTM2KTsKKwlCVUdfT04odmEgJiB+UEFHRV9NQVNLKTsKKworCWZv ciAoZiA9IDA7IHZhIDwgZHRyLT5hZGRyZXNzICsgc2l6ZTsgdmEgKz0gUEFHRV9TSVpFLCBmKysp IHsKKwkJaW50IGxldmVsOworCQlwdGVfdCAqcHRlcDsKKwkJdW5zaWduZWQgbG9uZyBwZm4sIG1m bjsKKwkJdm9pZCAqdmlydDsKKworCQkvKgorCQkgKiBUaGUgR0RUIGlzIHBlci1jcHUgYW5kIGlz IGluIHRoZSBwZXJjcHUgZGF0YSBhcmVhLgorCQkgKiBUaGF0IGNhbiBiZSB2aXJ0dWFsbHkgbWFw cGVkLCBzbyB3ZSBuZWVkIHRvIGRvIGEKKwkJICogcGFnZS13YWxrIHRvIGdldCB0aGUgdW5kZXJs eWluZyBNRk4gZm9yIHRoZQorCQkgKiBoeXBlcmNhbGwuICBUaGUgcGFnZSBjYW4gYWxzbyBiZSBp biB0aGUga2VybmVsJ3MKKwkJICogbGluZWFyIHJhbmdlLCBzbyB3ZSBuZWVkIHRvIFJPIHRoYXQg bWFwcGluZyB0b28uCisJCSAqLworCQlwdGVwID0gbG9va3VwX2FkZHJlc3ModmEsICZsZXZlbCk7 CisJCUJVR19PTihwdGVwID09IE5VTEwpOworCisJCXBmbiA9IHB0ZV9wZm4oKnB0ZXApOworCQlt Zm4gPSBwZm5fdG9fbWZuKHBmbik7CisJCXZpcnQgPSBfX3ZhKFBGTl9QSFlTKHBmbikpOworCisJ CWZyYW1lc1tmXSA9IG1mbjsKKworCQltYWtlX2xvd21lbV9wYWdlX3JlYWRvbmx5KCh2b2lkICop dmEpOworCQltYWtlX2xvd21lbV9wYWdlX3JlYWRvbmx5KHZpcnQpOworCX0KKworCWlmIChIWVBF UlZJU09SX3NldF9nZHQoZnJhbWVzLCBzaXplIC8gc2l6ZW9mKHN0cnVjdCBkZXNjX3N0cnVjdCkp KQorCQlCVUcoKTsKK30KKworLyoKKyAqIGxvYWRfZ2R0IGZvciBlYXJseSBib290LCB3aGVuIHRo ZSBnZHQgaXMgb25seSBtYXBwZWQgb25jZQorICovCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2xv YWRfZ2R0X2Jvb3QoY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkdHIpCit7CisJdW5zaWduZWQgbG9u ZyB2YSA9IGR0ci0+YWRkcmVzczsKKwl1bnNpZ25lZCBpbnQgc2l6ZSA9IGR0ci0+c2l6ZSArIDE7 CisJdW5zaWduZWQgcGFnZXMgPSBESVZfUk9VTkRfVVAoc2l6ZSwgUEFHRV9TSVpFKTsKKwl1bnNp Z25lZCBsb25nIGZyYW1lc1twYWdlc107CisJaW50IGY7CisKKwkvKgorCSAqIEEgR0RUIGNhbiBi ZSB1cCB0byA2NGsgaW4gc2l6ZSwgd2hpY2ggY29ycmVzcG9uZHMgdG8gODE5MgorCSAqIDgtYnl0 ZSBlbnRyaWVzLCBvciAxNiA0ayBwYWdlcy4uCisJICovCisKKwlCVUdfT04oc2l6ZSA+IDY1NTM2 KTsKKwlCVUdfT04odmEgJiB+UEFHRV9NQVNLKTsKKworCWZvciAoZiA9IDA7IHZhIDwgZHRyLT5h ZGRyZXNzICsgc2l6ZTsgdmEgKz0gUEFHRV9TSVpFLCBmKyspIHsKKwkJcHRlX3QgcHRlOworCQl1 bnNpZ25lZCBsb25nIHBmbiwgbWZuOworCisJCXBmbiA9IHZpcnRfdG9fcGZuKHZhKTsKKwkJbWZu ID0gcGZuX3RvX21mbihwZm4pOworCisJCXB0ZSA9IHBmbl9wdGUocGZuLCBQQUdFX0tFUk5FTF9S Tyk7CisKKwkJaWYgKEhZUEVSVklTT1JfdXBkYXRlX3ZhX21hcHBpbmcoKHVuc2lnbmVkIGxvbmcp dmEsIHB0ZSwgMCkpCisJCQlCVUcoKTsKKworCQlmcmFtZXNbZl0gPSBtZm47CisJfQorCisJaWYg KEhZUEVSVklTT1Jfc2V0X2dkdChmcmFtZXMsIHNpemUgLyBzaXplb2Yoc3RydWN0IGRlc2Nfc3Ry dWN0KSkpCisJCUJVRygpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgZGVzY19lcXVhbChjb25z dCBzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmQxLAorCQkJICAgICAgY29uc3Qgc3RydWN0IGRlc2Nfc3Ry dWN0ICpkMikKK3sKKwlyZXR1cm4gZDEtPmEgPT0gZDItPmEgJiYgZDEtPmIgPT0gZDItPmI7Cit9 CisKK3N0YXRpYyB2b2lkIGxvYWRfVExTX2Rlc2NyaXB0b3Ioc3RydWN0IHRocmVhZF9zdHJ1Y3Qg KnQsCisJCQkJdW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IGkpCit7CisJc3RydWN0IGRl c2Nfc3RydWN0ICpzaGFkb3cgPSAmcGVyX2NwdShzaGFkb3dfdGxzX2Rlc2MsIGNwdSkuZGVzY1tp XTsKKwlzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmdkdDsKKwl4bWFkZHJfdCBtYWRkcjsKKwlzdHJ1Y3Qg bXVsdGljYWxsX3NwYWNlIG1jOworCisJaWYgKGRlc2NfZXF1YWwoc2hhZG93LCAmdC0+dGxzX2Fy cmF5W2ldKSkKKwkJcmV0dXJuOworCisJKnNoYWRvdyA9IHQtPnRsc19hcnJheVtpXTsKKworCWdk dCA9IGdldF9jcHVfZ2R0X3RhYmxlKGNwdSk7CisJbWFkZHIgPSBhcmJpdHJhcnlfdmlydF90b19t YWNoaW5lKCZnZHRbR0RUX0VOVFJZX1RMU19NSU4raV0pOworCW1jID0gX194ZW5fbWNfZW50cnko MCk7CisKKwlNVUxUSV91cGRhdGVfZGVzY3JpcHRvcihtYy5tYywgbWFkZHIubWFkZHIsIHQtPnRs c19hcnJheVtpXSk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9sb2FkX3RscyhzdHJ1Y3QgdGhyZWFk X3N0cnVjdCAqdCwgdW5zaWduZWQgaW50IGNwdSkKK3sKKwkvKgorCSAqIFhYWCBzbGVhenkgaGFj azogSWYgd2UncmUgYmVpbmcgY2FsbGVkIGluIGEgbGF6eS1jcHUgem9uZQorCSAqIGFuZCBsYXp5 IGdzIGhhbmRsaW5nIGlzIGVuYWJsZWQsIGl0IG1lYW5zIHdlJ3JlIGluIGEKKwkgKiBjb250ZXh0 IHN3aXRjaCwgYW5kICVncyBoYXMganVzdCBiZWVuIHNhdmVkLiAgVGhpcyBtZWFucyB3ZQorCSAq IGNhbiB6ZXJvIGl0IG91dCB0byBwcmV2ZW50IGZhdWx0cyBvbiBleGl0IGZyb20gdGhlCisJICog aHlwZXJ2aXNvciBpZiB0aGUgbmV4dCBwcm9jZXNzIGhhcyBubyAlZ3MuICBFaXRoZXIgd2F5LCBp dAorCSAqIGhhcyBiZWVuIHNhdmVkLCBhbmQgdGhlIG5ldyB2YWx1ZSB3aWxsIGdldCBsb2FkZWQg cHJvcGVybHkuCisJICogVGhpcyB3aWxsIGdvIGF3YXkgYXMgc29vbiBhcyBYZW4gaGFzIGJlZW4g bW9kaWZpZWQgdG8gbm90CisJICogc2F2ZS9yZXN0b3JlICVncyBmb3Igbm9ybWFsIGh5cGVyY2Fs bHMuCisJICoKKwkgKiBPbiB4ODZfNjQsIHRoaXMgaGFjayBpcyBub3QgdXNlZCBmb3IgJWdzLCBi ZWNhdXNlIGdzIHBvaW50cworCSAqIHRvIEtFUk5FTF9HU19CQVNFIChhbmQgdXNlcyBpdCBmb3Ig UERBIHJlZmVyZW5jZXMpLCBzbyB3ZQorCSAqIG11c3Qgbm90IHplcm8gJWdzIG9uIHg4Nl82NAor CSAqCisJICogRm9yIHg4Nl82NCwgd2UgbmVlZCB0byB6ZXJvICVmcywgb3RoZXJ3aXNlIHdlIG1h eSBnZXQgYW4KKwkgKiBleGNlcHRpb24gYmV0d2VlbiB0aGUgbmV3ICVmcyBkZXNjcmlwdG9yIGJl aW5nIGxvYWRlZCBhbmQKKwkgKiAlZnMgYmVpbmcgZWZmZWN0aXZlbHkgY2xlYXJlZCBhdCBfX3N3 aXRjaF90bygpLgorCSAqLworCWlmIChwYXJhdmlydF9nZXRfbGF6eV9tb2RlKCkgPT0gUEFSQVZJ UlRfTEFaWV9DUFUpIHsKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJCWxhenlfbG9hZF9ncygwKTsK KyNlbHNlCisJCWxvYWRzZWdtZW50KGZzLCAwKTsKKyNlbmRpZgorCX0KKworCXhlbl9tY19iYXRj aCgpOworCisJbG9hZF9UTFNfZGVzY3JpcHRvcih0LCBjcHUsIDApOworCWxvYWRfVExTX2Rlc2Ny aXB0b3IodCwgY3B1LCAxKTsKKwlsb2FkX1RMU19kZXNjcmlwdG9yKHQsIGNwdSwgMik7CisKKwl4 ZW5fbWNfaXNzdWUoUEFSQVZJUlRfTEFaWV9DUFUpOworfQorCisjaWZkZWYgQ09ORklHX1g4Nl82 NAorc3RhdGljIHZvaWQgeGVuX2xvYWRfZ3NfaW5kZXgodW5zaWduZWQgaW50IGlkeCkKK3sKKwlp ZiAoSFlQRVJWSVNPUl9zZXRfc2VnbWVudF9iYXNlKFNFR0JBU0VfR1NfVVNFUl9TRUwsIGlkeCkp CisJCUJVRygpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHhlbl93cml0ZV9sZHRfZW50cnko c3RydWN0IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVudHJ5bnVtLAorCQkJCWNvbnN0IHZvaWQgKnB0 cikKK3sKKwl4bWFkZHJfdCBtYWNoX2xwID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWFjaGluZSgmZHRb ZW50cnludW1dKTsKKwl1NjQgZW50cnkgPSAqKHU2NCAqKXB0cjsKKworCXRyYWNlX3hlbl9jcHVf d3JpdGVfbGR0X2VudHJ5KGR0LCBlbnRyeW51bSwgZW50cnkpOworCisJcHJlZW1wdF9kaXNhYmxl KCk7CisKKwl4ZW5fbWNfZmx1c2goKTsKKwlpZiAoSFlQRVJWSVNPUl91cGRhdGVfZGVzY3JpcHRv cihtYWNoX2xwLm1hZGRyLCBlbnRyeSkpCisJCUJVRygpOworCisJcHJlZW1wdF9lbmFibGUoKTsK K30KKworc3RhdGljIGludCBjdnRfZ2F0ZV90b190cmFwKGludCB2ZWN0b3IsIGNvbnN0IGdhdGVf ZGVzYyAqdmFsLAorCQkJICAgIHN0cnVjdCB0cmFwX2luZm8gKmluZm8pCit7CisJdW5zaWduZWQg bG9uZyBhZGRyOworCisJaWYgKHZhbC0+dHlwZSAhPSBHQVRFX1RSQVAgJiYgdmFsLT50eXBlICE9 IEdBVEVfSU5URVJSVVBUKQorCQlyZXR1cm4gMDsKKworCWluZm8tPnZlY3RvciA9IHZlY3RvcjsK KworCWFkZHIgPSBnYXRlX29mZnNldCgqdmFsKTsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLyoK KwkgKiBMb29rIGZvciBrbm93biB0cmFwcyB1c2luZyBJU1QsIGFuZCBzdWJzdGl0dXRlIHRoZW0K KwkgKiBhcHByb3ByaWF0ZWx5LiAgVGhlIGRlYnVnZ2VyIG9uZXMgYXJlIHRoZSBvbmx5IG9uZXMg d2UgY2FyZQorCSAqIGFib3V0LiAgWGVuIHdpbGwgaGFuZGxlIGZhdWx0cyBsaWtlIGRvdWJsZV9m YXVsdCwKKwkgKiBzbyB3ZSBzaG91bGQgbmV2ZXIgc2VlIHRoZW0uICBXYXJuIGlmCisJICogdGhl cmUncyBhbiB1bmV4cGVjdGVkIElTVC11c2luZyBmYXVsdCBoYW5kbGVyLgorCSAqLworCWlmIChh ZGRyID09ICh1bnNpZ25lZCBsb25nKWRlYnVnKQorCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpeGVu X2RlYnVnOworCWVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpaW50MykKKwkJYWRkciA9 ICh1bnNpZ25lZCBsb25nKXhlbl9pbnQzOworCWVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxv bmcpc3RhY2tfc2VnbWVudCkKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKXhlbl9zdGFja19zZWdt ZW50OworCWVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpZG91YmxlX2ZhdWx0KSB7CisJ CS8qIERvbid0IG5lZWQgdG8gaGFuZGxlIHRoZXNlICovCisJCXJldHVybiAwOworI2lmZGVmIENP TkZJR19YODZfTUNFCisJfSBlbHNlIGlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKW1hY2hpbmVf Y2hlY2spIHsKKwkJLyoKKwkJICogd2hlbiB4ZW4gaHlwZXJ2aXNvciBpbmplY3Qgdk1DRSB0byBn dWVzdCwKKwkJICogdXNlIG5hdGl2ZSBtY2UgaGFuZGxlciB0byBoYW5kbGUgaXQKKwkJICovCisJ CTsKKyNlbmRpZgorCX0gZWxzZSBpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZylubWkpCisJCS8q CisJCSAqIFVzZSB0aGUgbmF0aXZlIHZlcnNpb24gYXMgd2VsbC4KKwkJICovCisJCTsKKwllbHNl IHsKKwkJLyogU29tZSBvdGhlciB0cmFwIHVzaW5nIElTVD8gKi8KKwkJaWYgKFdBUk5fT04odmFs LT5pc3QgIT0gMCkpCisJCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAq LworCWluZm8tPmFkZHJlc3MgPSBhZGRyOworCisJaW5mby0+Y3MgPSBnYXRlX3NlZ21lbnQoKnZh bCk7CisJaW5mby0+ZmxhZ3MgPSB2YWwtPmRwbDsKKwkvKiBpbnRlcnJ1cHQgZ2F0ZXMgY2xlYXIg SUYgKi8KKwlpZiAodmFsLT50eXBlID09IEdBVEVfSU5URVJSVVBUKQorCQlpbmZvLT5mbGFncyB8 PSAxIDw8IDI7CisKKwlyZXR1cm4gMTsKK30KKworLyogTG9jYXRpb25zIG9mIGVhY2ggQ1BVJ3Mg SURUICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRlc2NfcHRyLCBpZHRfZGVzYyk7 CisKKy8qIFNldCBhbiBJRFQgZW50cnkuICBJZiB0aGUgZW50cnkgaXMgcGFydCBvZiB0aGUgY3Vy cmVudCBJRFQsIHRoZW4KKyAgIGFsc28gdXBkYXRlIFhlbi4gKi8KK3N0YXRpYyB2b2lkIHhlbl93 cml0ZV9pZHRfZW50cnkoZ2F0ZV9kZXNjICpkdCwgaW50IGVudHJ5bnVtLCBjb25zdCBnYXRlX2Rl c2MgKmcpCit7CisJdW5zaWduZWQgbG9uZyBwID0gKHVuc2lnbmVkIGxvbmcpJmR0W2VudHJ5bnVt XTsKKwl1bnNpZ25lZCBsb25nIHN0YXJ0LCBlbmQ7CisKKwl0cmFjZV94ZW5fY3B1X3dyaXRlX2lk dF9lbnRyeShkdCwgZW50cnludW0sIGcpOworCisJcHJlZW1wdF9kaXNhYmxlKCk7CisKKwlzdGFy dCA9IF9fdGhpc19jcHVfcmVhZChpZHRfZGVzYy5hZGRyZXNzKTsKKwllbmQgPSBzdGFydCArIF9f dGhpc19jcHVfcmVhZChpZHRfZGVzYy5zaXplKSArIDE7CisKKwl4ZW5fbWNfZmx1c2goKTsKKwor CW5hdGl2ZV93cml0ZV9pZHRfZW50cnkoZHQsIGVudHJ5bnVtLCBnKTsKKworCWlmIChwID49IHN0 YXJ0ICYmIChwICsgOCkgPD0gZW5kKSB7CisJCXN0cnVjdCB0cmFwX2luZm8gaW5mb1syXTsKKwor CQlpbmZvWzFdLmFkZHJlc3MgPSAwOworCisJCWlmIChjdnRfZ2F0ZV90b190cmFwKGVudHJ5bnVt LCBnLCAmaW5mb1swXSkpCisJCQlpZiAoSFlQRVJWSVNPUl9zZXRfdHJhcF90YWJsZShpbmZvKSkK KwkJCQlCVUcoKTsKKwl9CisKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCB4 ZW5fY29udmVydF90cmFwX2luZm8oY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkZXNjLAorCQkJCSAg c3RydWN0IHRyYXBfaW5mbyAqdHJhcHMpCit7CisJdW5zaWduZWQgaW4sIG91dCwgY291bnQ7CisK Kwljb3VudCA9IChkZXNjLT5zaXplKzEpIC8gc2l6ZW9mKGdhdGVfZGVzYyk7CisJQlVHX09OKGNv dW50ID4gMjU2KTsKKworCWZvciAoaW4gPSBvdXQgPSAwOyBpbiA8IGNvdW50OyBpbisrKSB7CisJ CWdhdGVfZGVzYyAqZW50cnkgPSAoZ2F0ZV9kZXNjICopKGRlc2MtPmFkZHJlc3MpICsgaW47CisK KwkJaWYgKGN2dF9nYXRlX3RvX3RyYXAoaW4sIGVudHJ5LCAmdHJhcHNbb3V0XSkpCisJCQlvdXQr KzsKKwl9CisJdHJhcHNbb3V0XS5hZGRyZXNzID0gMDsKK30KKwordm9pZCB4ZW5fY29weV90cmFw X2luZm8oc3RydWN0IHRyYXBfaW5mbyAqdHJhcHMpCit7CisJY29uc3Qgc3RydWN0IGRlc2NfcHRy ICpkZXNjID0gdGhpc19jcHVfcHRyKCZpZHRfZGVzYyk7CisKKwl4ZW5fY29udmVydF90cmFwX2lu Zm8oZGVzYywgdHJhcHMpOworfQorCisvKiBMb2FkIGEgbmV3IElEVCBpbnRvIFhlbi4gIEluIHBy aW5jaXBsZSB0aGlzIGNhbiBiZSBwZXItQ1BVLCBzbyB3ZQorICAgaG9sZCBhIHNwaW5sb2NrIHRv IHByb3RlY3QgdGhlIHN0YXRpYyB0cmFwc1tdIGFycmF5IChzdGF0aWMgYmVjYXVzZQorICAgaXQg YXZvaWRzIGFsbG9jYXRpb24sIGFuZCBzYXZlcyBzdGFjayBzcGFjZSkuICovCitzdGF0aWMgdm9p ZCB4ZW5fbG9hZF9pZHQoY29uc3Qgc3RydWN0IGRlc2NfcHRyICpkZXNjKQoreworCXN0YXRpYyBE RUZJTkVfU1BJTkxPQ0sobG9jayk7CisJc3RhdGljIHN0cnVjdCB0cmFwX2luZm8gdHJhcHNbMjU3 XTsKKworCXRyYWNlX3hlbl9jcHVfbG9hZF9pZHQoZGVzYyk7CisKKwlzcGluX2xvY2soJmxvY2sp OworCisJbWVtY3B5KHRoaXNfY3B1X3B0cigmaWR0X2Rlc2MpLCBkZXNjLCBzaXplb2YoaWR0X2Rl c2MpKTsKKworCXhlbl9jb252ZXJ0X3RyYXBfaW5mbyhkZXNjLCB0cmFwcyk7CisKKwl4ZW5fbWNf Zmx1c2goKTsKKwlpZiAoSFlQRVJWSVNPUl9zZXRfdHJhcF90YWJsZSh0cmFwcykpCisJCUJVRygp OworCisJc3Bpbl91bmxvY2soJmxvY2spOworfQorCisvKiBXcml0ZSBhIEdEVCBkZXNjcmlwdG9y IGVudHJ5LiAgSWdub3JlIExEVCBkZXNjcmlwdG9ycywgc2luY2UKKyAgIHRoZXkncmUgaGFuZGxl ZCBkaWZmZXJlbnRseS4gKi8KK3N0YXRpYyB2b2lkIHhlbl93cml0ZV9nZHRfZW50cnkoc3RydWN0 IGRlc2Nfc3RydWN0ICpkdCwgaW50IGVudHJ5LAorCQkJCWNvbnN0IHZvaWQgKmRlc2MsIGludCB0 eXBlKQoreworCXRyYWNlX3hlbl9jcHVfd3JpdGVfZ2R0X2VudHJ5KGR0LCBlbnRyeSwgZGVzYywg dHlwZSk7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCXN3aXRjaCAodHlwZSkgeworCWNhc2Ug REVTQ19MRFQ6CisJY2FzZSBERVNDX1RTUzoKKwkJLyogaWdub3JlICovCisJCWJyZWFrOworCisJ ZGVmYXVsdDogeworCQl4bWFkZHJfdCBtYWRkciA9IGFyYml0cmFyeV92aXJ0X3RvX21hY2hpbmUo JmR0W2VudHJ5XSk7CisKKwkJeGVuX21jX2ZsdXNoKCk7CisJCWlmIChIWVBFUlZJU09SX3VwZGF0 ZV9kZXNjcmlwdG9yKG1hZGRyLm1hZGRyLCAqKHU2NCAqKWRlc2MpKQorCQkJQlVHKCk7CisJfQor CisJfQorCisJcHJlZW1wdF9lbmFibGUoKTsKK30KKworLyoKKyAqIFZlcnNpb24gb2Ygd3JpdGVf Z2R0X2VudHJ5IGZvciB1c2UgYXQgZWFybHkgYm9vdC10aW1lIG5lZWRlZCB0bworICogdXBkYXRl IGFuIGVudHJ5IGFzIHNpbXBseSBhcyBwb3NzaWJsZS4KKyAqLworc3RhdGljIHZvaWQgX19pbml0 IHhlbl93cml0ZV9nZHRfZW50cnlfYm9vdChzdHJ1Y3QgZGVzY19zdHJ1Y3QgKmR0LCBpbnQgZW50 cnksCisJCQkJCSAgICBjb25zdCB2b2lkICpkZXNjLCBpbnQgdHlwZSkKK3sKKwl0cmFjZV94ZW5f Y3B1X3dyaXRlX2dkdF9lbnRyeShkdCwgZW50cnksIGRlc2MsIHR5cGUpOworCisJc3dpdGNoICh0 eXBlKSB7CisJY2FzZSBERVNDX0xEVDoKKwljYXNlIERFU0NfVFNTOgorCQkvKiBpZ25vcmUgKi8K KwkJYnJlYWs7CisKKwlkZWZhdWx0OiB7CisJCXhtYWRkcl90IG1hZGRyID0gdmlydF90b19tYWNo aW5lKCZkdFtlbnRyeV0pOworCisJCWlmIChIWVBFUlZJU09SX3VwZGF0ZV9kZXNjcmlwdG9yKG1h ZGRyLm1hZGRyLCAqKHU2NCAqKWRlc2MpKQorCQkJZHRbZW50cnldID0gKihzdHJ1Y3QgZGVzY19z dHJ1Y3QgKilkZXNjOworCX0KKworCX0KK30KKworc3RhdGljIHZvaWQgeGVuX2xvYWRfc3AwKHN0 cnVjdCB0c3Nfc3RydWN0ICp0c3MsCisJCQkgc3RydWN0IHRocmVhZF9zdHJ1Y3QgKnRocmVhZCkK K3sKKwlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKKworCW1jcyA9IHhlbl9tY19lbnRyeSgw KTsKKwlNVUxUSV9zdGFja19zd2l0Y2gobWNzLm1jLCBfX0tFUk5FTF9EUywgdGhyZWFkLT5zcDAp OworCXhlbl9tY19pc3N1ZShQQVJBVklSVF9MQVpZX0NQVSk7CisJdHNzLT54ODZfdHNzLnNwMCA9 IHRocmVhZC0+c3AwOworfQorCit2b2lkIHhlbl9zZXRfaW9wbF9tYXNrKHVuc2lnbmVkIG1hc2sp Cit7CisJc3RydWN0IHBoeXNkZXZfc2V0X2lvcGwgc2V0X2lvcGw7CisKKwkvKiBGb3JjZSB0aGUg Y2hhbmdlIGF0IHJpbmcgMC4gKi8KKwlzZXRfaW9wbC5pb3BsID0gKG1hc2sgPT0gMCkgPyAxIDog KG1hc2sgPj4gMTIpICYgMzsKKwlIWVBFUlZJU09SX3BoeXNkZXZfb3AoUEhZU0RFVk9QX3NldF9p b3BsLCAmc2V0X2lvcGwpOworfQorCitzdGF0aWMgdm9pZCB4ZW5faW9fZGVsYXkodm9pZCkKK3sK K30KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHhlbl9jcjBfdmFsdWUp OworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fcmVhZF9jcjAodm9pZCkKK3sKKwl1bnNpZ25l ZCBsb25nIGNyMCA9IHRoaXNfY3B1X3JlYWQoeGVuX2NyMF92YWx1ZSk7CisKKwlpZiAodW5saWtl bHkoY3IwID09IDApKSB7CisJCWNyMCA9IG5hdGl2ZV9yZWFkX2NyMCgpOworCQl0aGlzX2NwdV93 cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjApOworCX0KKworCXJldHVybiBjcjA7Cit9CisKK3N0YXRp YyB2b2lkIHhlbl93cml0ZV9jcjAodW5zaWduZWQgbG9uZyBjcjApCit7CisJc3RydWN0IG11bHRp Y2FsbF9zcGFjZSBtY3M7CisKKwl0aGlzX2NwdV93cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjApOwor CisJLyogT25seSBwYXkgYXR0ZW50aW9uIHRvIGNyMC5UUzsgZXZlcnl0aGluZyBlbHNlIGlzCisJ ICAgaWdub3JlZC4gKi8KKwltY3MgPSB4ZW5fbWNfZW50cnkoMCk7CisKKwlNVUxUSV9mcHVfdGFz a3N3aXRjaChtY3MubWMsIChjcjAgJiBYODZfQ1IwX1RTKSAhPSAwKTsKKworCXhlbl9tY19pc3N1 ZShQQVJBVklSVF9MQVpZX0NQVSk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl93cml0ZV9jcjQodW5z aWduZWQgbG9uZyBjcjQpCit7CisJY3I0ICY9IH4oWDg2X0NSNF9QR0UgfCBYODZfQ1I0X1BTRSB8 IFg4Nl9DUjRfUENFKTsKKworCW5hdGl2ZV93cml0ZV9jcjQoY3I0KTsKK30KKyNpZmRlZiBDT05G SUdfWDg2XzY0CitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgeGVuX3JlYWRfY3I4KHZvaWQp Cit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgeGVuX3dyaXRlX2NyOCh1bnNp Z25lZCBsb25nIHZhbCkKK3sKKwlCVUdfT04odmFsKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdTY0 IHhlbl9yZWFkX21zcl9zYWZlKHVuc2lnbmVkIGludCBtc3IsIGludCAqZXJyKQoreworCXU2NCB2 YWw7CisKKwlpZiAocG11X21zcl9yZWFkKG1zciwgJnZhbCwgZXJyKSkKKwkJcmV0dXJuIHZhbDsK KworCXZhbCA9IG5hdGl2ZV9yZWFkX21zcl9zYWZlKG1zciwgZXJyKTsKKwlzd2l0Y2ggKG1zcikg eworCWNhc2UgTVNSX0lBMzJfQVBJQ0JBU0U6CisjaWZkZWYgQ09ORklHX1g4Nl9YMkFQSUMKKwkJ aWYgKCEoY3B1aWRfZWN4KDEpICYgKDEgPDwgKFg4Nl9GRUFUVVJFX1gyQVBJQyAmIDMxKSkpKQor I2VuZGlmCisJCQl2YWwgJj0gflgyQVBJQ19FTkFCTEU7CisJCWJyZWFrOworCX0KKwlyZXR1cm4g dmFsOworfQorCitzdGF0aWMgaW50IHhlbl93cml0ZV9tc3Jfc2FmZSh1bnNpZ25lZCBpbnQgbXNy LCB1bnNpZ25lZCBsb3csIHVuc2lnbmVkIGhpZ2gpCit7CisJaW50IHJldDsKKworCXJldCA9IDA7 CisKKwlzd2l0Y2ggKG1zcikgeworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJdW5zaWduZWQgd2hp Y2g7CisJCXU2NCBiYXNlOworCisJY2FzZSBNU1JfRlNfQkFTRToJCXdoaWNoID0gU0VHQkFTRV9G UzsgZ290byBzZXQ7CisJY2FzZSBNU1JfS0VSTkVMX0dTX0JBU0U6CXdoaWNoID0gU0VHQkFTRV9H U19VU0VSOyBnb3RvIHNldDsKKwljYXNlIE1TUl9HU19CQVNFOgkJd2hpY2ggPSBTRUdCQVNFX0dT X0tFUk5FTDsgZ290byBzZXQ7CisKKwlzZXQ6CisJCWJhc2UgPSAoKHU2NCloaWdoIDw8IDMyKSB8 IGxvdzsKKwkJaWYgKEhZUEVSVklTT1Jfc2V0X3NlZ21lbnRfYmFzZSh3aGljaCwgYmFzZSkgIT0g MCkKKwkJCXJldCA9IC1FSU87CisJCWJyZWFrOworI2VuZGlmCisKKwljYXNlIE1TUl9TVEFSOgor CWNhc2UgTVNSX0NTVEFSOgorCWNhc2UgTVNSX0xTVEFSOgorCWNhc2UgTVNSX1NZU0NBTExfTUFT SzoKKwljYXNlIE1TUl9JQTMyX1NZU0VOVEVSX0NTOgorCWNhc2UgTVNSX0lBMzJfU1lTRU5URVJf RVNQOgorCWNhc2UgTVNSX0lBMzJfU1lTRU5URVJfRUlQOgorCQkvKiBGYXN0IHN5c2NhbGwgc2V0 dXAgaXMgYWxsIGRvbmUgaW4gaHlwZXJjYWxscywgc28KKwkJICAgdGhlc2UgYXJlIGFsbCBpZ25v cmVkLiAgU3R1YiB0aGVtIG91dCBoZXJlIHRvIHN0b3AKKwkJICAgWGVuIGNvbnNvbGUgbm9pc2Uu ICovCisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJaWYgKCFwbXVfbXNyX3dyaXRlKG1zciwgbG93 LCBoaWdoLCAmcmV0KSkKKwkJCXJldCA9IG5hdGl2ZV93cml0ZV9tc3Jfc2FmZShtc3IsIGxvdywg aGlnaCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHU2NCB4ZW5fcmVhZF9tc3Io dW5zaWduZWQgaW50IG1zcikKK3sKKwkvKgorCSAqIFRoaXMgd2lsbCBzaWxlbnRseSBzd2FsbG93 IGEgI0dQIGZyb20gUkRNU1IuICBJdCBtYXkgYmUgd29ydGgKKwkgKiBjaGFuZ2luZyB0aGF0Lgor CSAqLworCWludCBlcnI7CisKKwlyZXR1cm4geGVuX3JlYWRfbXNyX3NhZmUobXNyLCAmZXJyKTsK K30KKworc3RhdGljIHZvaWQgeGVuX3dyaXRlX21zcih1bnNpZ25lZCBpbnQgbXNyLCB1bnNpZ25l ZCBsb3csIHVuc2lnbmVkIGhpZ2gpCit7CisJLyoKKwkgKiBUaGlzIHdpbGwgc2lsZW50bHkgc3dh bGxvdyBhICNHUCBmcm9tIFdSTVNSLiAgSXQgbWF5IGJlIHdvcnRoCisJICogY2hhbmdpbmcgdGhh dC4KKwkgKi8KKwl4ZW5fd3JpdGVfbXNyX3NhZmUobXNyLCBsb3csIGhpZ2gpOworfQorCit2b2lk IHhlbl9zZXR1cF9zaGFyZWRfaW5mbyh2b2lkKQoreworCWlmICgheGVuX2ZlYXR1cmUoWEVORkVB VF9hdXRvX3RyYW5zbGF0ZWRfcGh5c21hcCkpIHsKKwkJc2V0X2ZpeG1hcChGSVhfUEFSQVZJUlRf Qk9PVE1BUCwKKwkJCSAgIHhlbl9zdGFydF9pbmZvLT5zaGFyZWRfaW5mbyk7CisKKwkJSFlQRVJW SVNPUl9zaGFyZWRfaW5mbyA9CisJCQkoc3RydWN0IHNoYXJlZF9pbmZvICopZml4X3RvX3ZpcnQo RklYX1BBUkFWSVJUX0JPT1RNQVApOworCX0gZWxzZQorCQlIWVBFUlZJU09SX3NoYXJlZF9pbmZv ID0KKwkJCShzdHJ1Y3Qgc2hhcmVkX2luZm8gKilfX3ZhKHhlbl9zdGFydF9pbmZvLT5zaGFyZWRf aW5mbyk7CisKKyNpZm5kZWYgQ09ORklHX1NNUAorCS8qIEluIFVQIHRoaXMgaXMgYXMgZ29vZCBh IHBsYWNlIGFzIGFueSB0byBzZXQgdXAgc2hhcmVkIGluZm8gKi8KKwl4ZW5fc2V0dXBfdmNwdV9p bmZvX3BsYWNlbWVudCgpOworI2VuZGlmCisKKwl4ZW5fc2V0dXBfbWZuX2xpc3RfbGlzdCgpOwor fQorCisvKiBUaGlzIGlzIGNhbGxlZCBvbmNlIHdlIGhhdmUgdGhlIGNwdV9wb3NzaWJsZV9tYXNr ICovCit2b2lkIHhlbl9zZXR1cF92Y3B1X2luZm9fcGxhY2VtZW50KHZvaWQpCit7CisJaW50IGNw dTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJLyogU2V0IHVwIGRpcmVjdCB2 Q1BVIGlkIG1hcHBpbmcgZm9yIFBWIGd1ZXN0cy4gKi8KKwkJcGVyX2NwdSh4ZW5fdmNwdV9pZCwg Y3B1KSA9IGNwdTsKKwkJeGVuX3ZjcHVfc2V0dXAoY3B1KTsKKwl9CisKKwkvKgorCSAqIHhlbl92 Y3B1X3NldHVwIG1hbmFnZWQgdG8gcGxhY2UgdGhlIHZjcHVfaW5mbyB3aXRoaW4gdGhlCisJICog cGVyY3B1IGFyZWEgZm9yIGFsbCBjcHVzLCBzbyBtYWtlIHVzZSBvZiBpdC4KKwkgKi8KKwlpZiAo eGVuX2hhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCkgeworCQlwdl9pcnFfb3BzLnNhdmVfZmwgPSBf X1BWX0lTX0NBTExFRV9TQVZFKHhlbl9zYXZlX2ZsX2RpcmVjdCk7CisJCXB2X2lycV9vcHMucmVz dG9yZV9mbCA9IF9fUFZfSVNfQ0FMTEVFX1NBVkUoeGVuX3Jlc3RvcmVfZmxfZGlyZWN0KTsKKwkJ cHZfaXJxX29wcy5pcnFfZGlzYWJsZSA9IF9fUFZfSVNfQ0FMTEVFX1NBVkUoeGVuX2lycV9kaXNh YmxlX2RpcmVjdCk7CisJCXB2X2lycV9vcHMuaXJxX2VuYWJsZSA9IF9fUFZfSVNfQ0FMTEVFX1NB VkUoeGVuX2lycV9lbmFibGVfZGlyZWN0KTsKKwkJcHZfbW11X29wcy5yZWFkX2NyMiA9IHhlbl9y ZWFkX2NyMl9kaXJlY3Q7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgeGVuX3BhdGNoKHU4IHR5 cGUsIHUxNiBjbG9iYmVycywgdm9pZCAqaW5zbmJ1ZiwKKwkJCSAgdW5zaWduZWQgbG9uZyBhZGRy LCB1bnNpZ25lZCBsZW4pCit7CisJY2hhciAqc3RhcnQsICplbmQsICpyZWxvYzsKKwl1bnNpZ25l ZCByZXQ7CisKKwlzdGFydCA9IGVuZCA9IHJlbG9jID0gTlVMTDsKKworI2RlZmluZSBTSVRFKG9w LCB4KQkJCQkJCQlcCisJY2FzZSBQQVJBVklSVF9QQVRDSChvcC54KToJCQkJCVwKKwlpZiAoeGVu X2hhdmVfdmNwdV9pbmZvX3BsYWNlbWVudCkgewkJCQlcCisJCXN0YXJ0ID0gKGNoYXIgKil4ZW5f IyN4IyNfZGlyZWN0OwkJCVwKKwkJZW5kID0geGVuXyMjeCMjX2RpcmVjdF9lbmQ7CQkJCVwKKwkJ cmVsb2MgPSB4ZW5fIyN4IyNfZGlyZWN0X3JlbG9jOwkJCQlcCisJfQkJCQkJCQkJXAorCWdvdG8g cGF0Y2hfc2l0ZQorCisJc3dpdGNoICh0eXBlKSB7CisJCVNJVEUocHZfaXJxX29wcywgaXJxX2Vu YWJsZSk7CisJCVNJVEUocHZfaXJxX29wcywgaXJxX2Rpc2FibGUpOworCQlTSVRFKHB2X2lycV9v cHMsIHNhdmVfZmwpOworCQlTSVRFKHB2X2lycV9vcHMsIHJlc3RvcmVfZmwpOworI3VuZGVmIFNJ VEUKKworCXBhdGNoX3NpdGU6CisJCWlmIChzdGFydCA9PSBOVUxMIHx8IChlbmQtc3RhcnQpID4g bGVuKQorCQkJZ290byBkZWZhdWx0X3BhdGNoOworCisJCXJldCA9IHBhcmF2aXJ0X3BhdGNoX2lu c25zKGluc25idWYsIGxlbiwgc3RhcnQsIGVuZCk7CisKKwkJLyogTm90ZTogYmVjYXVzZSByZWxv YyBpcyBhc3NpZ25lZCBmcm9tIHNvbWV0aGluZyB0aGF0CisJCSAgIGFwcGVhcnMgdG8gYmUgYW4g YXJyYXksIGdjYyBhc3N1bWVzIGl0J3Mgbm9uLW51bGwsCisJCSAgIGJ1dCBkb2Vzbid0IGtub3cg aXRzIHJlbGF0aW9uc2hpcCB3aXRoIHN0YXJ0IGFuZAorCQkgICBlbmQuICovCisJCWlmIChyZWxv YyA+IHN0YXJ0ICYmIHJlbG9jIDwgZW5kKSB7CisJCQlpbnQgcmVsb2Nfb2ZmID0gcmVsb2MgLSBz dGFydDsKKwkJCWxvbmcgKnJlbG9jcCA9IChsb25nICopKGluc25idWYgKyByZWxvY19vZmYpOwor CQkJbG9uZyBkZWx0YSA9IHN0YXJ0IC0gKGNoYXIgKilhZGRyOworCisJCQkqcmVsb2NwICs9IGRl bHRhOworCQl9CisJCWJyZWFrOworCisJZGVmYXVsdF9wYXRjaDoKKwlkZWZhdWx0OgorCQlyZXQg PSBwYXJhdmlydF9wYXRjaF9kZWZhdWx0KHR5cGUsIGNsb2JiZXJzLCBpbnNuYnVmLAorCQkJCQkg ICAgIGFkZHIsIGxlbik7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyBjb25zdCBzdHJ1Y3QgcHZfaW5mbyB4ZW5faW5mbyBfX2luaXRjb25zdCA9IHsKKwkuc2hhcmVk X2tlcm5lbF9wbWQgPSAwLAorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS5leHRyYV91c2VyXzY0 Yml0X2NzID0gRkxBVF9VU0VSX0NTNjQsCisjZW5kaWYKKwkubmFtZSA9ICJYZW4iLAorfTsKKwor c3RhdGljIGNvbnN0IHN0cnVjdCBwdl9pbml0X29wcyB4ZW5faW5pdF9vcHMgX19pbml0Y29uc3Qg PSB7CisJLnBhdGNoID0geGVuX3BhdGNoLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBwdl9j cHVfb3BzIHhlbl9jcHVfb3BzIF9faW5pdGNvbnN0ID0geworCS5jcHVpZCA9IHhlbl9jcHVpZCwK KworCS5zZXRfZGVidWdyZWcgPSB4ZW5fc2V0X2RlYnVncmVnLAorCS5nZXRfZGVidWdyZWcgPSB4 ZW5fZ2V0X2RlYnVncmVnLAorCisJLnJlYWRfY3IwID0geGVuX3JlYWRfY3IwLAorCS53cml0ZV9j cjAgPSB4ZW5fd3JpdGVfY3IwLAorCisJLnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LAorCS53 cml0ZV9jcjQgPSB4ZW5fd3JpdGVfY3I0LAorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCS5yZWFk X2NyOCA9IHhlbl9yZWFkX2NyOCwKKwkud3JpdGVfY3I4ID0geGVuX3dyaXRlX2NyOCwKKyNlbmRp ZgorCisJLndiaW52ZCA9IG5hdGl2ZV93YmludmQsCisKKwkucmVhZF9tc3IgPSB4ZW5fcmVhZF9t c3IsCisJLndyaXRlX21zciA9IHhlbl93cml0ZV9tc3IsCisKKwkucmVhZF9tc3Jfc2FmZSA9IHhl bl9yZWFkX21zcl9zYWZlLAorCS53cml0ZV9tc3Jfc2FmZSA9IHhlbl93cml0ZV9tc3Jfc2FmZSwK KworCS5yZWFkX3BtYyA9IHhlbl9yZWFkX3BtYywKKworCS5pcmV0ID0geGVuX2lyZXQsCisjaWZk ZWYgQ09ORklHX1g4Nl82NAorCS51c2VyZ3Nfc3lzcmV0NjQgPSB4ZW5fc3lzcmV0NjQsCisjZW5k aWYKKworCS5sb2FkX3RyX2Rlc2MgPSBwYXJhdmlydF9ub3AsCisJLnNldF9sZHQgPSB4ZW5fc2V0 X2xkdCwKKwkubG9hZF9nZHQgPSB4ZW5fbG9hZF9nZHQsCisJLmxvYWRfaWR0ID0geGVuX2xvYWRf aWR0LAorCS5sb2FkX3RscyA9IHhlbl9sb2FkX3RscywKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJ LmxvYWRfZ3NfaW5kZXggPSB4ZW5fbG9hZF9nc19pbmRleCwKKyNlbmRpZgorCisJLmFsbG9jX2xk dCA9IHhlbl9hbGxvY19sZHQsCisJLmZyZWVfbGR0ID0geGVuX2ZyZWVfbGR0LAorCisJLnN0b3Jl X2lkdCA9IG5hdGl2ZV9zdG9yZV9pZHQsCisJLnN0b3JlX3RyID0geGVuX3N0b3JlX3RyLAorCisJ LndyaXRlX2xkdF9lbnRyeSA9IHhlbl93cml0ZV9sZHRfZW50cnksCisJLndyaXRlX2dkdF9lbnRy eSA9IHhlbl93cml0ZV9nZHRfZW50cnksCisJLndyaXRlX2lkdF9lbnRyeSA9IHhlbl93cml0ZV9p ZHRfZW50cnksCisJLmxvYWRfc3AwID0geGVuX2xvYWRfc3AwLAorCisJLnNldF9pb3BsX21hc2sg PSB4ZW5fc2V0X2lvcGxfbWFzaywKKwkuaW9fZGVsYXkgPSB4ZW5faW9fZGVsYXksCisKKwkvKiBY ZW4gdGFrZXMgY2FyZSBvZiAlZ3Mgd2hlbiBzd2l0Y2hpbmcgdG8gdXNlcm1vZGUgZm9yIHVzICov CisJLnN3YXBncyA9IHBhcmF2aXJ0X25vcCwKKworCS5zdGFydF9jb250ZXh0X3N3aXRjaCA9IHBh cmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dpdGNoLAorCS5lbmRfY29udGV4dF9zd2l0Y2ggPSB4ZW5f ZW5kX2NvbnRleHRfc3dpdGNoLAorfTsKKworc3RhdGljIHZvaWQgeGVuX3Jlc3RhcnQoY2hhciAq bXNnKQoreworCXhlbl9yZWJvb3QoU0hVVERPV05fcmVib290KTsKK30KKworc3RhdGljIHZvaWQg eGVuX21hY2hpbmVfaGFsdCh2b2lkKQoreworCXhlbl9yZWJvb3QoU0hVVERPV05fcG93ZXJvZmYp OworfQorCitzdGF0aWMgdm9pZCB4ZW5fbWFjaGluZV9wb3dlcl9vZmYodm9pZCkKK3sKKwlpZiAo cG1fcG93ZXJfb2ZmKQorCQlwbV9wb3dlcl9vZmYoKTsKKwl4ZW5fcmVib290KFNIVVRET1dOX3Bv d2Vyb2ZmKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2NyYXNoX3NodXRkb3duKHN0cnVjdCBwdF9y ZWdzICpyZWdzKQoreworCXhlbl9yZWJvb3QoU0hVVERPV05fY3Jhc2gpOworfQorCitzdGF0aWMg Y29uc3Qgc3RydWN0IG1hY2hpbmVfb3BzIHhlbl9tYWNoaW5lX29wcyBfX2luaXRjb25zdCA9IHsK KwkucmVzdGFydCA9IHhlbl9yZXN0YXJ0LAorCS5oYWx0ID0geGVuX21hY2hpbmVfaGFsdCwKKwku cG93ZXJfb2ZmID0geGVuX21hY2hpbmVfcG93ZXJfb2ZmLAorCS5zaHV0ZG93biA9IHhlbl9tYWNo aW5lX2hhbHQsCisJLmNyYXNoX3NodXRkb3duID0geGVuX2NyYXNoX3NodXRkb3duLAorCS5lbWVy Z2VuY3lfcmVzdGFydCA9IHhlbl9lbWVyZ2VuY3lfcmVzdGFydCwKK307CisKK3N0YXRpYyB1bnNp Z25lZCBjaGFyIHhlbl9nZXRfbm1pX3JlYXNvbih2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgcmVh c29uID0gMDsKKworCS8qIENvbnN0cnVjdCBhIHZhbHVlIHdoaWNoIGxvb2tzIGxpa2UgaXQgY2Ft ZSBmcm9tIHBvcnQgMHg2MS4gKi8KKwlpZiAodGVzdF9iaXQoX1hFTl9OTUlSRUFTT05faW9fZXJy b3IsCisJCSAgICAgJkhZUEVSVklTT1Jfc2hhcmVkX2luZm8tPmFyY2gubm1pX3JlYXNvbikpCisJ CXJlYXNvbiB8PSBOTUlfUkVBU09OX0lPQ0hLOworCWlmICh0ZXN0X2JpdChfWEVOX05NSVJFQVNP Tl9wY2lfc2VyciwKKwkJICAgICAmSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+YXJjaC5ubWlfcmVh c29uKSkKKwkJcmVhc29uIHw9IE5NSV9SRUFTT05fU0VSUjsKKworCXJldHVybiByZWFzb247Cit9 CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fYm9vdF9wYXJhbXNfaW5pdF9lZGQodm9pZCkKK3sK KyNpZiBJU19FTkFCTEVEKENPTkZJR19FREQpCisJc3RydWN0IHhlbl9wbGF0Zm9ybV9vcCBvcDsK KwlzdHJ1Y3QgZWRkX2luZm8gKmVkZF9pbmZvOworCXUzMiAqbWJyX3NpZ25hdHVyZTsKKwl1bnNp Z25lZCBucjsKKwlpbnQgcmV0OworCisJZWRkX2luZm8gPSBib290X3BhcmFtcy5lZGRidWY7CisJ bWJyX3NpZ25hdHVyZSA9IGJvb3RfcGFyYW1zLmVkZF9tYnJfc2lnX2J1ZmZlcjsKKworCW9wLmNt ZCA9IFhFTlBGX2Zpcm13YXJlX2luZm87CisKKwlvcC51LmZpcm13YXJlX2luZm8udHlwZSA9IFhF Tl9GV19ESVNLX0lORk87CisJZm9yIChuciA9IDA7IG5yIDwgRURETUFYTlI7IG5yKyspIHsKKwkJ c3RydWN0IGVkZF9pbmZvICppbmZvID0gZWRkX2luZm8gKyBucjsKKworCQlvcC51LmZpcm13YXJl X2luZm8uaW5kZXggPSBucjsKKwkJaW5mby0+cGFyYW1zLmxlbmd0aCA9IHNpemVvZihpbmZvLT5w YXJhbXMpOworCQlzZXRfeGVuX2d1ZXN0X2hhbmRsZShvcC51LmZpcm13YXJlX2luZm8udS5kaXNr X2luZm8uZWRkX3BhcmFtcywKKwkJCQkgICAgICZpbmZvLT5wYXJhbXMpOworCQlyZXQgPSBIWVBF UlZJU09SX3BsYXRmb3JtX29wKCZvcCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKworI2RlZmlu ZSBDKHgpIGluZm8tPnggPSBvcC51LmZpcm13YXJlX2luZm8udS5kaXNrX2luZm8ueAorCQlDKGRl dmljZSk7CisJCUModmVyc2lvbik7CisJCUMoaW50ZXJmYWNlX3N1cHBvcnQpOworCQlDKGxlZ2Fj eV9tYXhfY3lsaW5kZXIpOworCQlDKGxlZ2FjeV9tYXhfaGVhZCk7CisJCUMobGVnYWN5X3NlY3Rv cnNfcGVyX3RyYWNrKTsKKyN1bmRlZiBDCisJfQorCWJvb3RfcGFyYW1zLmVkZGJ1Zl9lbnRyaWVz ID0gbnI7CisKKwlvcC51LmZpcm13YXJlX2luZm8udHlwZSA9IFhFTl9GV19ESVNLX01CUl9TSUdO QVRVUkU7CisJZm9yIChuciA9IDA7IG5yIDwgRUREX01CUl9TSUdfTUFYOyBucisrKSB7CisJCW9w LnUuZmlybXdhcmVfaW5mby5pbmRleCA9IG5yOworCQlyZXQgPSBIWVBFUlZJU09SX3BsYXRmb3Jt X29wKCZvcCk7CisJCWlmIChyZXQpCisJCQlicmVhazsKKwkJbWJyX3NpZ25hdHVyZVtucl0gPSBv cC51LmZpcm13YXJlX2luZm8udS5kaXNrX21icl9zaWduYXR1cmUubWJyX3NpZ25hdHVyZTsKKwl9 CisJYm9vdF9wYXJhbXMuZWRkX21icl9zaWdfYnVmX2VudHJpZXMgPSBucjsKKyNlbmRpZgorfQor CisvKgorICogU2V0IHVwIHRoZSBHRFQgYW5kIHNlZ21lbnQgcmVnaXN0ZXJzIGZvciAtZnN0YWNr LXByb3RlY3Rvci4gIFVudGlsCisgKiB3ZSBkbyB0aGlzLCB3ZSBoYXZlIHRvIGJlIGNhcmVmdWwg bm90IHRvIGNhbGwgYW55IHN0YWNrLXByb3RlY3RlZAorICogZnVuY3Rpb24sIHdoaWNoIGlzIG1v c3Qgb2YgdGhlIGtlcm5lbC4KKyAqLworc3RhdGljIHZvaWQgeGVuX3NldHVwX2dkdChpbnQgY3B1 KQoreworCXB2X2NwdV9vcHMud3JpdGVfZ2R0X2VudHJ5ID0geGVuX3dyaXRlX2dkdF9lbnRyeV9i b290OworCXB2X2NwdV9vcHMubG9hZF9nZHQgPSB4ZW5fbG9hZF9nZHRfYm9vdDsKKworCXNldHVw X3N0YWNrX2NhbmFyeV9zZWdtZW50KDApOworCXN3aXRjaF90b19uZXdfZ2R0KDApOworCisJcHZf Y3B1X29wcy53cml0ZV9nZHRfZW50cnkgPSB4ZW5fd3JpdGVfZ2R0X2VudHJ5OworCXB2X2NwdV9v cHMubG9hZF9nZHQgPSB4ZW5fbG9hZF9nZHQ7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5f ZG9tMF9zZXRfbGVnYWN5X2ZlYXR1cmVzKHZvaWQpCit7CisJeDg2X3BsYXRmb3JtLmxlZ2FjeS5y dGMgPSAxOworfQorCisvKiBGaXJzdCBDIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBYZW4gYm9v dCAqLworYXNtbGlua2FnZSBfX3Zpc2libGUgdm9pZCBfX2luaXQgeGVuX3N0YXJ0X2tlcm5lbCh2 b2lkKQoreworCXN0cnVjdCBwaHlzZGV2X3NldF9pb3BsIHNldF9pb3BsOworCXVuc2lnbmVkIGxv bmcgaW5pdHJkX3N0YXJ0ID0gMDsKKwlpbnQgcmM7CisKKwlpZiAoIXhlbl9zdGFydF9pbmZvKQor CQlyZXR1cm47CisKKwl4ZW5fZG9tYWluX3R5cGUgPSBYRU5fUFZfRE9NQUlOOworCisJeGVuX3Nl dHVwX2ZlYXR1cmVzKCk7CisKKwl4ZW5fc2V0dXBfbWFjaHBoeXNfbWFwcGluZygpOworCisJLyog SW5zdGFsbCBYZW4gcGFyYXZpcnQgb3BzICovCisJcHZfaW5mbyA9IHhlbl9pbmZvOworCXB2X2lu aXRfb3BzID0geGVuX2luaXRfb3BzOworCXB2X2NwdV9vcHMgPSB4ZW5fY3B1X29wczsKKworCXg4 Nl9wbGF0Zm9ybS5nZXRfbm1pX3JlYXNvbiA9IHhlbl9nZXRfbm1pX3JlYXNvbjsKKworCXg4Nl9p bml0LnJlc291cmNlcy5tZW1vcnlfc2V0dXAgPSB4ZW5fbWVtb3J5X3NldHVwOworCXg4Nl9pbml0 Lm9lbS5hcmNoX3NldHVwID0geGVuX2FyY2hfc2V0dXA7CisJeDg2X2luaXQub2VtLmJhbm5lciA9 IHhlbl9iYW5uZXI7CisKKwl4ZW5faW5pdF90aW1lX29wcygpOworCisJLyoKKwkgKiBTZXQgdXAg c29tZSBwYWdldGFibGUgc3RhdGUgYmVmb3JlIHN0YXJ0aW5nIHRvIHNldCBhbnkgcHRlcy4KKwkg Ki8KKworCXhlbl9pbml0X21tdV9vcHMoKTsKKworCS8qIFByZXZlbnQgdW53YW50ZWQgYml0cyBm cm9tIGJlaW5nIHNldCBpbiBQVEVzLiAqLworCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFH RV9HTE9CQUw7CisKKwkvKgorCSAqIFByZXZlbnQgcGFnZSB0YWJsZXMgZnJvbSBiZWluZyBhbGxv Y2F0ZWQgaW4gaGlnaG1lbSwgZXZlbgorCSAqIGlmIENPTkZJR19ISUdIUFRFIGlzIGVuYWJsZWQu CisJICovCisJX191c2VycHRlX2FsbG9jX2dmcCAmPSB+X19HRlBfSElHSE1FTTsKKworCS8qIFdv cmsgb3V0IGlmIHdlIHN1cHBvcnQgTlggKi8KKwl4ODZfY29uZmlndXJlX254KCk7CisKKwkvKiBH ZXQgbWZuIGxpc3QgKi8KKwl4ZW5fYnVpbGRfZHluYW1pY19waHlzX3RvX21hY2hpbmUoKTsKKwor CS8qCisJICogU2V0IHVwIGtlcm5lbCBHRFQgYW5kIHNlZ21lbnQgcmVnaXN0ZXJzLCBtYWlubHkg c28gdGhhdAorCSAqIC1mc3RhY2stcHJvdGVjdG9yIGNvZGUgY2FuIGJlIGV4ZWN1dGVkLgorCSAq LworCXhlbl9zZXR1cF9nZHQoMCk7CisKKwl4ZW5faW5pdF9pcnFfb3BzKCk7CisJeGVuX2luaXRf Y3B1aWRfbWFzaygpOworCisjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCisJLyoKKwkgKiBz ZXQgdXAgdGhlIGJhc2ljIGFwaWMgb3BzLgorCSAqLworCXhlbl9pbml0X2FwaWMoKTsKKyNlbmRp ZgorCisJaWYgKHhlbl9mZWF0dXJlKFhFTkZFQVRfbW11X3B0X3VwZGF0ZV9wcmVzZXJ2ZV9hZCkp IHsKKwkJcHZfbW11X29wcy5wdGVwX21vZGlmeV9wcm90X3N0YXJ0ID0geGVuX3B0ZXBfbW9kaWZ5 X3Byb3Rfc3RhcnQ7CisJCXB2X21tdV9vcHMucHRlcF9tb2RpZnlfcHJvdF9jb21taXQgPSB4ZW5f cHRlcF9tb2RpZnlfcHJvdF9jb21taXQ7CisJfQorCisJbWFjaGluZV9vcHMgPSB4ZW5fbWFjaGlu ZV9vcHM7CisKKwkvKgorCSAqIFRoZSBvbmx5IHJlbGlhYmxlIHdheSB0byByZXRhaW4gdGhlIGlu aXRpYWwgYWRkcmVzcyBvZiB0aGUKKwkgKiBwZXJjcHUgZ2R0X3BhZ2UgaXMgdG8gcmVtZW1iZXIg aXQgaGVyZSwgc28gd2UgY2FuIGdvIGFuZAorCSAqIG1hcmsgaXQgUlcgbGF0ZXIsIHdoZW4gdGhl IGluaXRpYWwgcGVyY3B1IGFyZWEgaXMgZnJlZWQuCisJICovCisJeGVuX2luaXRpYWxfZ2R0ID0g JnBlcl9jcHUoZ2R0X3BhZ2UsIDApOworCisJeGVuX3NtcF9pbml0KCk7CisKKyNpZmRlZiBDT05G SUdfQUNQSV9OVU1BCisJLyoKKwkgKiBUaGUgcGFnZXMgd2UgZnJvbSBYZW4gYXJlIG5vdCByZWxh dGVkIHRvIG1hY2hpbmUgcGFnZXMsIHNvCisJICogYW55IE5VTUEgaW5mb3JtYXRpb24gdGhlIGtl cm5lbCB0cmllcyB0byBnZXQgZnJvbSBBQ1BJIHdpbGwKKwkgKiBiZSBtZWFuaW5nbGVzcy4gIFBy ZXZlbnQgaXQgZnJvbSB0cnlpbmcuCisJICovCisJYWNwaV9udW1hID0gLTE7CisjZW5kaWYKKwkv KiBEb24ndCBkbyB0aGUgZnVsbCB2Y3B1X2luZm8gcGxhY2VtZW50IHN0dWZmIHVudGlsIHdlIGhh dmUgYQorCSAgIHBvc3NpYmxlIG1hcCBhbmQgYSBub24tZHVtbXkgc2hhcmVkX2luZm8uICovCisJ cGVyX2NwdSh4ZW5fdmNwdSwgMCkgPSAmSFlQRVJWSVNPUl9zaGFyZWRfaW5mby0+dmNwdV9pbmZv WzBdOworCisJV0FSTl9PTih4ZW5fY3B1aHBfc2V0dXAoeGVuX2NwdV91cF9wcmVwYXJlX3B2LCB4 ZW5fY3B1X2RlYWRfcHYpKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisJZWFybHlfYm9vdF9p cnFzX2Rpc2FibGVkID0gdHJ1ZTsKKworCXhlbl9yYXdfY29uc29sZV93cml0ZSgibWFwcGluZyBr ZXJuZWwgaW50byBwaHlzaWNhbCBtZW1vcnlcbiIpOworCXhlbl9zZXR1cF9rZXJuZWxfcGFnZXRh YmxlKChwZ2RfdCAqKXhlbl9zdGFydF9pbmZvLT5wdF9iYXNlLAorCQkJCSAgIHhlbl9zdGFydF9p bmZvLT5ucl9wYWdlcyk7CisJeGVuX3Jlc2VydmVfc3BlY2lhbF9wYWdlcygpOworCisJLyoga2Vl cCB1c2luZyBYZW4gZ2R0IGZvciBub3c7IG5vIHVyZ2VudCBuZWVkIHRvIGNoYW5nZSBpdCAqLwor CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCXB2X2luZm8ua2VybmVsX3JwbCA9IDE7CisJaWYgKHhl bl9mZWF0dXJlKFhFTkZFQVRfc3VwZXJ2aXNvcl9tb2RlX2tlcm5lbCkpCisJCXB2X2luZm8ua2Vy bmVsX3JwbCA9IDA7CisjZWxzZQorCXB2X2luZm8ua2VybmVsX3JwbCA9IDA7CisjZW5kaWYKKwkv KiBzZXQgdGhlIGxpbWl0IG9mIG91ciBhZGRyZXNzIHNwYWNlICovCisJeGVuX3Jlc2VydmVfdG9w KCk7CisKKwkvKgorCSAqIFdlIHVzZWQgdG8gZG8gdGhpcyBpbiB4ZW5fYXJjaF9zZXR1cCwgYnV0 IHRoYXQgaXMgdG9vIGxhdGUKKwkgKiBvbiBBTUQgd2VyZSBlYXJseV9jcHVfaW5pdCAocnVuIGJl Zm9yZSAtPmFyY2hfc2V0dXAoKSkgY2FsbHMKKwkgKiBlYXJseV9hbWRfaW5pdCB3aGljaCBwb2tl cyAweGNmOCBwb3J0LgorCSAqLworCXNldF9pb3BsLmlvcGwgPSAxOworCXJjID0gSFlQRVJWSVNP Ul9waHlzZGV2X29wKFBIWVNERVZPUF9zZXRfaW9wbCwgJnNldF9pb3BsKTsKKwlpZiAocmMgIT0g MCkKKwkJeGVuX3Jhd19wcmludGsoInBoeXNkZXZfb3AgZmFpbGVkICVkXG4iLCByYyk7CisKKyNp ZmRlZiBDT05GSUdfWDg2XzMyCisJLyogc2V0IHVwIGJhc2ljIENQVUlEIHN0dWZmICovCisJY3B1 X2RldGVjdCgmbmV3X2NwdV9kYXRhKTsKKwlzZXRfY3B1X2NhcCgmbmV3X2NwdV9kYXRhLCBYODZf RkVBVFVSRV9GUFUpOworCW5ld19jcHVfZGF0YS53cF93b3Jrc19vayA9IDE7CisJbmV3X2NwdV9k YXRhLng4Nl9jYXBhYmlsaXR5W0NQVUlEXzFfRURYXSA9IGNwdWlkX2VkeCgxKTsKKyNlbmRpZgor CisJaWYgKHhlbl9zdGFydF9pbmZvLT5tb2Rfc3RhcnQpIHsKKwkgICAgaWYgKHhlbl9zdGFydF9p bmZvLT5mbGFncyAmIFNJRl9NT0RfU1RBUlRfUEZOKQorCQlpbml0cmRfc3RhcnQgPSBQRk5fUEhZ Uyh4ZW5fc3RhcnRfaW5mby0+bW9kX3N0YXJ0KTsKKwkgICAgZWxzZQorCQlpbml0cmRfc3RhcnQg PSBfX3BhKHhlbl9zdGFydF9pbmZvLT5tb2Rfc3RhcnQpOworCX0KKworCS8qIFBva2UgdmFyaW91 cyB1c2VmdWwgdGhpbmdzIGludG8gYm9vdF9wYXJhbXMgKi8KKwlib290X3BhcmFtcy5oZHIudHlw ZV9vZl9sb2FkZXIgPSAoOSA8PCA0KSB8IDA7CisJYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfaW1h Z2UgPSBpbml0cmRfc3RhcnQ7CisJYm9vdF9wYXJhbXMuaGRyLnJhbWRpc2tfc2l6ZSA9IHhlbl9z dGFydF9pbmZvLT5tb2RfbGVuOworCWJvb3RfcGFyYW1zLmhkci5jbWRfbGluZV9wdHIgPSBfX3Bh KHhlbl9zdGFydF9pbmZvLT5jbWRfbGluZSk7CisJYm9vdF9wYXJhbXMuaGRyLmhhcmR3YXJlX3N1 YmFyY2ggPSBYODZfU1VCQVJDSF9YRU47CisKKwlpZiAoIXhlbl9pbml0aWFsX2RvbWFpbigpKSB7 CisJCWFkZF9wcmVmZXJyZWRfY29uc29sZSgieGVuYm9vdCIsIDAsIE5VTEwpOworCQlhZGRfcHJl ZmVycmVkX2NvbnNvbGUoInR0eSIsIDAsIE5VTEwpOworCQlhZGRfcHJlZmVycmVkX2NvbnNvbGUo Imh2YyIsIDAsIE5VTEwpOworCQlpZiAocGNpX3hlbikKKwkJCXg4Nl9pbml0LnBjaS5hcmNoX2lu aXQgPSBwY2lfeGVuX2luaXQ7CisJfSBlbHNlIHsKKwkJY29uc3Qgc3RydWN0IGRvbTBfdmdhX2Nv bnNvbGVfaW5mbyAqaW5mbyA9CisJCQkodm9pZCAqKSgoY2hhciAqKXhlbl9zdGFydF9pbmZvICsK KwkJCQkgeGVuX3N0YXJ0X2luZm8tPmNvbnNvbGUuZG9tMC5pbmZvX29mZik7CisJCXN0cnVjdCB4 ZW5fcGxhdGZvcm1fb3Agb3AgPSB7CisJCQkuY21kID0gWEVOUEZfZmlybXdhcmVfaW5mbywKKwkJ CS5pbnRlcmZhY2VfdmVyc2lvbiA9IFhFTlBGX0lOVEVSRkFDRV9WRVJTSU9OLAorCQkJLnUuZmly bXdhcmVfaW5mby50eXBlID0gWEVOX0ZXX0tCRF9TSElGVF9GTEFHUywKKwkJfTsKKworCQl4ODZf cGxhdGZvcm0uc2V0X2xlZ2FjeV9mZWF0dXJlcyA9CisJCQkJeGVuX2RvbTBfc2V0X2xlZ2FjeV9m ZWF0dXJlczsKKwkJeGVuX2luaXRfdmdhKGluZm8sIHhlbl9zdGFydF9pbmZvLT5jb25zb2xlLmRv bTAuaW5mb19zaXplKTsKKwkJeGVuX3N0YXJ0X2luZm8tPmNvbnNvbGUuZG9tVS5tZm4gPSAwOwor CQl4ZW5fc3RhcnRfaW5mby0+Y29uc29sZS5kb21VLmV2dGNobiA9IDA7CisKKwkJaWYgKEhZUEVS VklTT1JfcGxhdGZvcm1fb3AoJm9wKSA9PSAwKQorCQkJYm9vdF9wYXJhbXMua2JkX3N0YXR1cyA9 IG9wLnUuZmlybXdhcmVfaW5mby51LmtiZF9zaGlmdF9mbGFnczsKKworCQkvKiBNYWtlIHN1cmUg QUNTIHdpbGwgYmUgZW5hYmxlZCAqLworCQlwY2lfcmVxdWVzdF9hY3MoKTsKKworCQl4ZW5fYWNw aV9zbGVlcF9yZWdpc3RlcigpOworCisJCS8qIEF2b2lkIHNlYXJjaGluZyBmb3IgQklPUyBNUCB0 YWJsZXMgKi8KKwkJeDg2X2luaXQubXBwYXJzZS5maW5kX3NtcF9jb25maWcgPSB4ODZfaW5pdF9u b29wOworCQl4ODZfaW5pdC5tcHBhcnNlLmdldF9zbXBfY29uZmlnID0geDg2X2luaXRfdWludF9u b29wOworCisJCXhlbl9ib290X3BhcmFtc19pbml0X2VkZCgpOworCX0KKyNpZmRlZiBDT05GSUdf UENJCisJLyogUENJIEJJT1Mgc2VydmljZSB3b24ndCB3b3JrIGZyb20gYSBQViBndWVzdC4gKi8K KwlwY2lfcHJvYmUgJj0gflBDSV9QUk9CRV9CSU9TOworI2VuZGlmCisJeGVuX3Jhd19jb25zb2xl X3dyaXRlKCJhYm91dCB0byBnZXQgc3RhcnRlZC4uLlxuIik7CisKKwkvKiBMZXQncyBwcmVzdW1l IFBWIGd1ZXN0cyBhbHdheXMgYm9vdCBvbiB2Q1BVIHdpdGggaWQgMC4gKi8KKwlwZXJfY3B1KHhl bl92Y3B1X2lkLCAwKSA9IDA7CisKKwl4ZW5fc2V0dXBfcnVuc3RhdGVfaW5mbygwKTsKKworCXhl bl9lZmlfaW5pdCgpOworCisJLyogU3RhcnQgdGhlIHdvcmxkICovCisjaWZkZWYgQ09ORklHX1g4 Nl8zMgorCWkzODZfc3RhcnRfa2VybmVsKCk7CisjZWxzZQorCWNyNF9pbml0X3NoYWRvdygpOyAv KiAzMmIga2VybmVsIGRvZXMgdGhpcyBpbiBpMzg2X3N0YXJ0X2tlcm5lbCgpICovCisJeDg2XzY0 X3N0YXJ0X3Jlc2VydmF0aW9ucygoY2hhciAqKV9fcGFfc3ltYm9sKCZib290X3BhcmFtcykpOwor I2VuZGlmCit9CisKK3N0YXRpYyBpbnQgeGVuX2NwdV91cF9wcmVwYXJlX3B2KHVuc2lnbmVkIGlu dCBjcHUpCit7CisJaW50IHJjOworCisJeGVuX3NldHVwX3RpbWVyKGNwdSk7CisKKwlyYyA9IHhl bl9zbXBfaW50cl9pbml0KGNwdSk7CisJaWYgKHJjKSB7CisJCVdBUk4oMSwgInhlbl9zbXBfaW50 cl9pbml0KCkgZm9yIENQVSAlZCBmYWlsZWQ6ICVkXG4iLAorCQkgICAgIGNwdSwgcmMpOworCQly ZXR1cm4gcmM7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHhlbl9jcHVfZGVhZF9w dih1bnNpZ25lZCBpbnQgY3B1KQoreworCXhlbl9zbXBfaW50cl9mcmVlKGNwdSk7CisKKwl4ZW5f dGVhcmRvd25fdGltZXIoY3B1KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdWludDMyX3Qg X19pbml0IHhlbl9wbGF0Zm9ybV9wdih2b2lkKQoreworCWlmICh4ZW5fcHZfZG9tYWluKCkpCisJ CXJldHVybiB4ZW5fY3B1aWRfYmFzZSgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IHhlbl9zZXRfY3B1X2ZlYXR1cmVzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYykKK3sKKwljbGVhcl9j cHVfYnVnKGMsIFg4Nl9CVUdfU1lTUkVUX1NTX0FUVFJTKTsKKwlzZXRfY3B1X2NhcChjLCBYODZf RkVBVFVSRV9YRU5QVik7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9waW5fdmNwdShpbnQgY3B1KQor eworCXN0YXRpYyBib29sIGRpc2FibGVfcGlubmluZzsKKwlzdHJ1Y3Qgc2NoZWRfcGluX292ZXJy aWRlIHBpbl9vdmVycmlkZTsKKwlpbnQgcmV0OworCisJaWYgKGRpc2FibGVfcGlubmluZykKKwkJ cmV0dXJuOworCisJcGluX292ZXJyaWRlLnBjcHUgPSBjcHU7CisJcmV0ID0gSFlQRVJWSVNPUl9z Y2hlZF9vcChTQ0hFRE9QX3Bpbl9vdmVycmlkZSwgJnBpbl9vdmVycmlkZSk7CisKKwkvKiBJZ25v cmUgZXJyb3JzIHdoZW4gcmVtb3Zpbmcgb3ZlcnJpZGUuICovCisJaWYgKGNwdSA8IDApCisJCXJl dHVybjsKKworCXN3aXRjaCAocmV0KSB7CisJY2FzZSAtRU5PU1lTOgorCQlwcl93YXJuKCJVbmFi bGUgdG8gcGluIG9uIHBoeXNpY2FsIGNwdSAlZC4gSW4gY2FzZSBvZiBwcm9ibGVtcyBjb25zaWRl ciB2Y3B1IHBpbm5pbmcuXG4iLAorCQkJY3B1KTsKKwkJZGlzYWJsZV9waW5uaW5nID0gdHJ1ZTsK KwkJYnJlYWs7CisJY2FzZSAtRVBFUk06CisJCVdBUk4oMSwgIlRyeWluZyB0byBwaW4gdmNwdSB3 aXRob3V0IGhhdmluZyBwcml2aWxlZ2UgdG8gZG8gc29cbiIpOworCQlkaXNhYmxlX3Bpbm5pbmcg PSB0cnVlOworCQlicmVhazsKKwljYXNlIC1FSU5WQUw6CisJY2FzZSAtRUJVU1k6CisJCXByX3dh cm4oIlBoeXNpY2FsIGNwdSAlZCBub3QgYXZhaWxhYmxlIGZvciBwaW5uaW5nLiBDaGVjayBYZW4g Y3B1IGNvbmZpZ3VyYXRpb24uXG4iLAorCQkJY3B1KTsKKwkJYnJlYWs7CisJY2FzZSAwOgorCQli cmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJyYyAlZCB3aGlsZSB0cnlpbmcgdG8gcGluIHZj cHVcbiIsIHJldCk7CisJCWRpc2FibGVfcGlubmluZyA9IHRydWU7CisJfQorfQorCitjb25zdCBz dHJ1Y3QgaHlwZXJ2aXNvcl94ODYgeDg2X2h5cGVyX3hlbl9wdiA9IHsKKwkubmFtZSAgICAgICAg ICAgICAgICAgICA9ICJYZW4gUFYiLAorCS5kZXRlY3QgICAgICAgICAgICAgICAgID0geGVuX3Bs YXRmb3JtX3B2LAorCS5zZXRfY3B1X2ZlYXR1cmVzICAgICAgID0geGVuX3NldF9jcHVfZmVhdHVy ZXMsCisJLnBpbl92Y3B1ICAgICAgICAgICAgICAgPSB4ZW5fcGluX3ZjcHUsCit9OworRVhQT1JU X1NZTUJPTCh4ODZfaHlwZXJfeGVuX3B2KTsKLS0gCjIuOS4zCgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4t ZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcveGVuLWRldmVsCg==