From mboxrd@z Thu Jan 1 00:00:00 1970 From: Vitaly Kuznetsov Subject: [PATCH 2/5] x86/xen: split smp.c for PV and PVHVM guests Date: Fri, 24 Feb 2017 17:14:37 +0100 Message-ID: <20170224161440.2136-3-vkuznets@redhat.com> References: <20170224161440.2136-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 1chIWA-0005NL-B5 for xen-devel@lists.xenproject.org; Fri, 24 Feb 2017 16:14:50 +0000 In-Reply-To: <20170224161440.2136-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 TW9yZSBvciBsZXNzIG1lY2hhbmljYWxseSBzcGxpdCBzbXAuYyBpbnRvIDMgZmlsZXMuIFhFTl9Q Vl9TTVAgYW5kClhFTl9QVkhWTV9TTVAgY29uZmlnIG9wdGlvbnMgYWRkZWQgdG8gc3VwcG9ydCB0 aGUgY2hhbmdlLgoKU2lnbmVkLW9mZi1ieTogVml0YWx5IEt1em5ldHNvdiA8dmt1em5ldHNAcmVk aGF0LmNvbT4KLS0tCiBhcmNoL3g4Ni94ZW4vS2NvbmZpZyAgICAgICAgfCAgIDggKwogYXJjaC94 ODYveGVuL01ha2VmaWxlICAgICAgIHwgICAzICsKIGFyY2gveDg2L3hlbi9lbmxpZ2h0ZW5fcHYu YyB8ICAgOSArCiBhcmNoL3g4Ni94ZW4vc21wLmMgICAgICAgICAgfCA1MzEgKy0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGFyY2gveDg2L3hlbi9zbXAuaCAgICAg ICAgICB8ICAyMyArKwogYXJjaC94ODYveGVuL3NtcF9odm0uYyAgICAgIHwgIDU4ICsrKysrCiBh cmNoL3g4Ni94ZW4vc21wX3B2LmMgICAgICAgfCA0OTkgKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysKIDcgZmlsZXMgY2hhbmdlZCwgNjExIGluc2VydGlvbnMoKyksIDUy MCBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3g4Ni94ZW4vc21wX2h2bS5j CiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC94ODYveGVuL3NtcF9wdi5jCgpkaWZmIC0tZ2l0IGEv YXJjaC94ODYveGVuL0tjb25maWcgYi9hcmNoL3g4Ni94ZW4vS2NvbmZpZwppbmRleCBjMzg3NTYw Li45ZWJmZDc3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4vS2NvbmZpZworKysgYi9hcmNoL3g4 Ni94ZW4vS2NvbmZpZwpAQCAtMjEsNiArMjEsMTAgQEAgY29uZmlnIFhFTl9QVgogCWhlbHAKIAkg IFN1cHBvcnQgcnVubmluZyBhcyBhIFhlbiBQViBndWVzdC4KIAorY29uZmlnIFhFTl9QVl9TTVAK KwlkZWZfYm9vbCB5CisJZGVwZW5kcyBvbiBYRU5fUFYgJiYgU01QCisKIGNvbmZpZyBYRU5fRE9N MAogCWJvb2wgIlhlbiBQViBEb20wIHN1cHBvcnQiCiAJZGVmYXVsdCB5CkBAIC0zNyw2ICs0MSwx MCBAQCBjb25maWcgWEVOX1BWSFZNCiAJaGVscAogCSAgU3VwcG9ydCBydW5uaW5nIGFzIGEgWGVu IFBWSFZNIGd1ZXN0LgogCitjb25maWcgWEVOX1BWSFZNX1NNUAorCWRlZl9ib29sIHkKKwlkZXBl bmRzIG9uIFhFTl9QVkhWTSAmJiBTTVAKKwogY29uZmlnIFhFTl81MTJHQgogCWJvb2wgIkxpbWl0 IFhlbiBwdi1kb21haW4gbWVtb3J5IHRvIDUxMkdCIgogCWRlcGVuZHMgb24gWEVOX1BWICYmIFg4 Nl82NApkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL01ha2VmaWxlIGIvYXJjaC94ODYveGVuL01h a2VmaWxlCmluZGV4IDc1MDcyN2IuLmVkNmYxMjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9N YWtlZmlsZQorKysgYi9hcmNoL3g4Ni94ZW4vTWFrZWZpbGUKQEAgLTIyLDYgKzIyLDkgQEAgb2Jq LSQoQ09ORklHX1hFTl9QVkgpCQkrPSBlbmxpZ2h0ZW5fcHZoLm8KIG9iai0kKENPTkZJR19FVkVO VF9UUkFDSU5HKSArPSB0cmFjZS5vCiAKIG9iai0kKENPTkZJR19TTVApCQkrPSBzbXAubworb2Jq LSQoQ09ORklHX1hFTl9QVl9TTVApCSs9IHNtcF9wdi5vCitvYmotJChDT05GSUdfWEVOX1BWSFZN X1NNUCkJKz0gc21wX2h2bS5vCisKIG9iai0kKENPTkZJR19QQVJBVklSVF9TUElOTE9DS1MpKz0g c3BpbmxvY2subwogb2JqLSQoQ09ORklHX1hFTl9ERUJVR19GUykJKz0gZGVidWdmcy5vCiBvYmot JChDT05GSUdfWEVOX0RPTTApCQkrPSB2Z2EubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL2Vu bGlnaHRlbl9wdi5jIGIvYXJjaC94ODYveGVuL2VubGlnaHRlbl9wdi5jCmluZGV4IGI5ZmYyM2Mu LmFjZmQ4OTYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW5fcHYuYworKysgYi9h cmNoL3g4Ni94ZW4vZW5saWdodGVuX3B2LmMKQEAgLTE0NzgsMTIgKzE0NzgsMjEgQEAgc3RhdGlj IGludCB4ZW5fY3B1X3VwX3ByZXBhcmVfcHYodW5zaWduZWQgaW50IGNwdSkKIAkJICAgICBjcHUs IHJjKTsKIAkJcmV0dXJuIHJjOwogCX0KKworCXJjID0geGVuX3NtcF9pbnRyX2luaXRfcHYoY3B1 KTsKKwlpZiAocmMpIHsKKwkJV0FSTigxLCAieGVuX3NtcF9pbnRyX2luaXRfcHYoKSBmb3IgQ1BV ICVkIGZhaWxlZDogJWRcbiIsCisJCSAgICAgY3B1LCByYyk7CisJCXJldHVybiByYzsKKwl9CisK IAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCB4ZW5fY3B1X2RlYWRfcHYodW5zaWduZWQgaW50 IGNwdSkKIHsKIAl4ZW5fc21wX2ludHJfZnJlZShjcHUpOworCXhlbl9zbXBfaW50cl9mcmVlX3B2 KGNwdSk7CiAKIAl4ZW5fdGVhcmRvd25fdGltZXIoY3B1KTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94 ODYveGVuL3NtcC5jIGIvYXJjaC94ODYveGVuL3NtcC5jCmluZGV4IDE0ZmQ3ZjMuLmRkMTE1MGUg MTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zbXAuYworKysgYi9hcmNoL3g4Ni94ZW4vc21wLmMK QEAgLTEsNjIgKzEsMjEgQEAKLS8qCi0gKiBYZW4gU01QIHN1cHBvcnQKLSAqCi0gKiBUaGlzIGZp bGUgaW1wbGVtZW50cyB0aGUgWGVuIHZlcnNpb25zIG9mIHNtcF9vcHMuICBTTVAgdW5kZXIgWGVu IGlzCi0gKiB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZC4gIEJyaW5naW5nIGEgQ1BVIHVwIGlzIHNpbXBs eSBhIG1hdHRlciBvZgotICogbG9hZGluZyBpdHMgaW5pdGlhbCBjb250ZXh0IGFuZCBzZXR0aW5n IGl0IHJ1bm5pbmcuCi0gKgotICogSVBJcyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSBYZW4gZXZl bnQgbWVjaGFuaXNtLgotICoKLSAqIEJlY2F1c2UgdmlydHVhbCBDUFVzIGNhbiBiZSBzY2hlZHVs ZWQgb250byBhbnkgcmVhbCBDUFUsIHRoZXJlJ3Mgbm8KLSAqIHVzZWZ1bCB0b3BvbG9neSBpbmZv cm1hdGlvbiBmb3IgdGhlIGtlcm5lbCB0byBtYWtlIHVzZSBvZi4gIEFzIGEKLSAqIHJlc3VsdCwg YWxsIENQVXMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSdyZSBzaW5nbGUtY29yZSBhbmQKLSAqIHNp bmdsZS10aHJlYWRlZC4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8 bGludXgvZXJyLmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L3Nt cC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+Ci0jaW5jbHVkZSA8bGludXgvdGljay5o PgotCi0jaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+Ci0jaW5jbHVkZSA8YXNtL2Rlc2MuaD4KLSNp bmNsdWRlIDxhc20vcGd0YWJsZS5oPgotI2luY2x1ZGUgPGFzbS9jcHUuaD4KLQotI2luY2x1ZGUg PHhlbi9pbnRlcmZhY2UveGVuLmg+Ci0jaW5jbHVkZSA8eGVuL2ludGVyZmFjZS92Y3B1Lmg+Ci0j aW5jbHVkZSA8eGVuL2ludGVyZmFjZS94ZW5wbXUuaD4KLQotI2luY2x1ZGUgPGFzbS94ZW4vaW50 ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KKyNpbmNsdWRlIDxsaW51 eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L3Bl cmNwdS5oPgogCi0jaW5jbHVkZSA8eGVuL3hlbi5oPgotI2luY2x1ZGUgPHhlbi9wYWdlLmg+CiAj aW5jbHVkZSA8eGVuL2V2ZW50cy5oPgogCiAjaW5jbHVkZSA8eGVuL2h2Yy1jb25zb2xlLmg+CiAj aW5jbHVkZSAieGVuLW9wcy5oIgotI2luY2x1ZGUgIm1tdS5oIgogI2luY2x1ZGUgInNtcC5oIgot I2luY2x1ZGUgInBtdS5oIgotCi1jcHVtYXNrX3Zhcl90IHhlbl9jcHVfaW5pdGlhbGl6ZWRfbWFw OwogCi1zdHJ1Y3QgeGVuX2NvbW1vbl9pcnEgewotCWludCBpcnE7Ci0JY2hhciAqbmFtZTsKLX07 CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHhlbl9jb21tb25faXJxLCB4ZW5fcmVzY2hl ZF9pcnEpID0geyAuaXJxID0gLTEgfTsKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgeGVu X2NvbW1vbl9pcnEsIHhlbl9jYWxsZnVuY19pcnEpID0geyAuaXJxID0gLTEgfTsKIHN0YXRpYyBE RUZJTkVfUEVSX0NQVShzdHJ1Y3QgeGVuX2NvbW1vbl9pcnEsIHhlbl9jYWxsZnVuY3NpbmdsZV9p cnEpID0geyAuaXJxID0gLTEgfTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgeGVuX2Nv bW1vbl9pcnEsIHhlbl9pcnFfd29yaykgPSB7IC5pcnEgPSAtMSB9Owogc3RhdGljIERFRklORV9Q RVJfQ1BVKHN0cnVjdCB4ZW5fY29tbW9uX2lycSwgeGVuX2RlYnVnX2lycSkgPSB7IC5pcnEgPSAt MSB9Owotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCB4ZW5fY29tbW9uX2lycSwgeGVuX3Bt dV9pcnEpID0geyAuaXJxID0gLTEgfTsKIAogc3RhdGljIGlycXJldHVybl90IHhlbl9jYWxsX2Z1 bmN0aW9uX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogc3RhdGljIGlycXJldHVy bl90IHhlbl9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2 X2lkKTsKLXN0YXRpYyBpcnFyZXR1cm5fdCB4ZW5faXJxX3dvcmtfaW50ZXJydXB0KGludCBpcnEs IHZvaWQgKmRldl9pZCk7CiAKIC8qCiAgKiBSZXNjaGVkdWxlIGNhbGwgYmFjay4KQEAgLTY5LDQy ICsyOCw2IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCB4ZW5fcmVzY2hlZHVsZV9pbnRlcnJ1cHQoaW50 IGlycSwgdm9pZCAqZGV2X2lkKQogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIAotc3RhdGljIHZv aWQgY3B1X2JyaW5ndXAodm9pZCkKLXsKLQlpbnQgY3B1OwotCi0JY3B1X2luaXQoKTsKLQl0b3Vj aF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0KLQkvKiBQVkgg cnVucyBpbiByaW5nIDAgYW5kIGFsbG93cyB1cyB0byBkbyBuYXRpdmUgc3lzY2FsbHMuIFlheSEg Ki8KLQlpZiAoIXhlbl9mZWF0dXJlKFhFTkZFQVRfc3VwZXJ2aXNvcl9tb2RlX2tlcm5lbCkpIHsK LQkJeGVuX2VuYWJsZV9zeXNlbnRlcigpOwotCQl4ZW5fZW5hYmxlX3N5c2NhbGwoKTsKLQl9Ci0J Y3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCXNtcF9zdG9yZV9jcHVfaW5mbyhjcHUpOwotCWNw dV9kYXRhKGNwdSkueDg2X21heF9jb3JlcyA9IDE7Ci0Jc2V0X2NwdV9zaWJsaW5nX21hcChjcHUp OwotCi0JeGVuX3NldHVwX2NwdV9jbG9ja2V2ZW50cygpOwotCi0Jbm90aWZ5X2NwdV9zdGFydGlu ZyhjcHUpOwotCi0Jc2V0X2NwdV9vbmxpbmUoY3B1LCB0cnVlKTsKLQotCWNwdV9zZXRfc3RhdGVf b25saW5lKGNwdSk7ICAvKiBJbXBsaWVzIGZ1bGwgbWVtb3J5IGJhcnJpZXIuICovCi0KLQkvKiBX ZSBjYW4gdGFrZSBpbnRlcnJ1cHRzIG5vdzogd2UncmUgb2ZmaWNpYWxseSAidXAiLiAqLwotCWxv Y2FsX2lycV9lbmFibGUoKTsKLX0KLQotYXNtbGlua2FnZSBfX3Zpc2libGUgdm9pZCBjcHVfYnJp bmd1cF9hbmRfaWRsZSh2b2lkKQotewotCWNwdV9icmluZ3VwKCk7Ci0JY3B1X3N0YXJ0dXBfZW50 cnkoQ1BVSFBfQVBfT05MSU5FX0lETEUpOwotfQotCiB2b2lkIHhlbl9zbXBfaW50cl9mcmVlKHVu c2lnbmVkIGludCBjcHUpCiB7CiAJaWYgKHBlcl9jcHUoeGVuX3Jlc2NoZWRfaXJxLCBjcHUpLmly cSA+PSAwKSB7CkBAIC0xMzIsMjcgKzU1LDEyIEBAIHZvaWQgeGVuX3NtcF9pbnRyX2ZyZWUodW5z aWduZWQgaW50IGNwdSkKIAkJa2ZyZWUocGVyX2NwdSh4ZW5fY2FsbGZ1bmNzaW5nbGVfaXJxLCBj cHUpLm5hbWUpOwogCQlwZXJfY3B1KHhlbl9jYWxsZnVuY3NpbmdsZV9pcnEsIGNwdSkubmFtZSA9 IE5VTEw7CiAJfQotCWlmICh4ZW5faHZtX2RvbWFpbigpKQotCQlyZXR1cm47Ci0KLQlpZiAocGVy X2NwdSh4ZW5faXJxX3dvcmssIGNwdSkuaXJxID49IDApIHsKLQkJdW5iaW5kX2Zyb21faXJxaGFu ZGxlcihwZXJfY3B1KHhlbl9pcnFfd29yaywgY3B1KS5pcnEsIE5VTEwpOwotCQlwZXJfY3B1KHhl bl9pcnFfd29yaywgY3B1KS5pcnEgPSAtMTsKLQkJa2ZyZWUocGVyX2NwdSh4ZW5faXJxX3dvcmss IGNwdSkubmFtZSk7Ci0JCXBlcl9jcHUoeGVuX2lycV93b3JrLCBjcHUpLm5hbWUgPSBOVUxMOwot CX0KK30KIAotCWlmIChwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUpLmlycSA+PSAwKSB7Ci0JCXVu YmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdSh4ZW5fcG11X2lycSwgY3B1KS5pcnEsIE5VTEwp OwotCQlwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUpLmlycSA9IC0xOwotCQlrZnJlZShwZXJfY3B1 KHhlbl9wbXVfaXJxLCBjcHUpLm5hbWUpOwotCQlwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUpLm5h bWUgPSBOVUxMOwotCX0KLX07CiBpbnQgeGVuX3NtcF9pbnRyX2luaXQodW5zaWduZWQgaW50IGNw dSkKIHsKIAlpbnQgcmM7Ci0JY2hhciAqcmVzY2hlZF9uYW1lLCAqY2FsbGZ1bmNfbmFtZSwgKmRl YnVnX25hbWUsICpwbXVfbmFtZTsKKwljaGFyICpyZXNjaGVkX25hbWUsICpjYWxsZnVuY19uYW1l LCAqZGVidWdfbmFtZTsKIAogCXJlc2NoZWRfbmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAi cmVzY2hlZCVkIiwgY3B1KTsKIAlyYyA9IGJpbmRfaXBpX3RvX2lycWhhbmRsZXIoWEVOX1JFU0NI RURVTEVfVkVDVE9SLApAQCAtMTk5LDM3ICsxMDcsNiBAQCBpbnQgeGVuX3NtcF9pbnRyX2luaXQo dW5zaWduZWQgaW50IGNwdSkKIAlwZXJfY3B1KHhlbl9jYWxsZnVuY3NpbmdsZV9pcnEsIGNwdSku aXJxID0gcmM7CiAJcGVyX2NwdSh4ZW5fY2FsbGZ1bmNzaW5nbGVfaXJxLCBjcHUpLm5hbWUgPSBj YWxsZnVuY19uYW1lOwogCi0JLyoKLQkgKiBUaGUgSVJRIHdvcmtlciBvbiBQVkhWTSBnb2VzIHRo cm91Z2ggdGhlIG5hdGl2ZSBwYXRoIGFuZCB1c2VzIHRoZQotCSAqIElQSSBtZWNoYW5pc20uCi0J ICovCi0JaWYgKHhlbl9odm1fZG9tYWluKCkpCi0JCXJldHVybiAwOwotCi0JY2FsbGZ1bmNfbmFt ZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiaXJxd29yayVkIiwgY3B1KTsKLQlyYyA9IGJpbmRf aXBpX3RvX2lycWhhbmRsZXIoWEVOX0lSUV9XT1JLX1ZFQ1RPUiwKLQkJCQkgICAgY3B1LAotCQkJ CSAgICB4ZW5faXJxX3dvcmtfaW50ZXJydXB0LAotCQkJCSAgICBJUlFGX1BFUkNQVXxJUlFGX05P QkFMQU5DSU5HLAotCQkJCSAgICBjYWxsZnVuY19uYW1lLAotCQkJCSAgICBOVUxMKTsKLQlpZiAo cmMgPCAwKQotCQlnb3RvIGZhaWw7Ci0JcGVyX2NwdSh4ZW5faXJxX3dvcmssIGNwdSkuaXJxID0g cmM7Ci0JcGVyX2NwdSh4ZW5faXJxX3dvcmssIGNwdSkubmFtZSA9IGNhbGxmdW5jX25hbWU7Ci0K LQlpZiAoaXNfeGVuX3BtdShjcHUpKSB7Ci0JCXBtdV9uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJO RUwsICJwbXUlZCIsIGNwdSk7Ci0JCXJjID0gYmluZF92aXJxX3RvX2lycWhhbmRsZXIoVklSUV9Y RU5QTVUsIGNwdSwKLQkJCQkJICAgICB4ZW5fcG11X2lycV9oYW5kbGVyLAotCQkJCQkgICAgIElS UUZfUEVSQ1BVfElSUUZfTk9CQUxBTkNJTkcsCi0JCQkJCSAgICAgcG11X25hbWUsIE5VTEwpOwot CQlpZiAocmMgPCAwKQotCQkJZ290byBmYWlsOwotCQlwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUp LmlycSA9IHJjOwotCQlwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUpLm5hbWUgPSBwbXVfbmFtZTsK LQl9Ci0KIAlyZXR1cm4gMDsKIAogIGZhaWw6CkBAIC0yMzcsMzQ1ICsxMTQsMTMgQEAgaW50IHhl bl9zbXBfaW50cl9pbml0KHVuc2lnbmVkIGludCBjcHUpCiAJcmV0dXJuIHJjOwogfQogCi0jaWZk ZWYgQ09ORklHX1hFTl9QVgotc3RhdGljIHZvaWQgX19pbml0IHhlbl9maWxsX3Bvc3NpYmxlX21h cCh2b2lkKQotewotCWludCBpLCByYzsKLQotCWlmICh4ZW5faW5pdGlhbF9kb21haW4oKSkKLQkJ cmV0dXJuOwotCi0JZm9yIChpID0gMDsgaSA8IG5yX2NwdV9pZHM7IGkrKykgewotCQlyYyA9IEhZ UEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfaXNfdXAsIGksIE5VTEwpOwotCQlpZiAocmMgPj0gMCkg ewotCQkJbnVtX3Byb2Nlc3NvcnMrKzsKLQkJCXNldF9jcHVfcG9zc2libGUoaSwgdHJ1ZSk7Ci0J CX0KLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIF9faW5pdCB4ZW5fZmlsdGVyX2NwdV9tYXBzKHZvaWQp Ci17Ci0JaW50IGksIHJjOwotCXVuc2lnbmVkIGludCBzdWJ0cmFjdCA9IDA7Ci0KLQlpZiAoIXhl bl9pbml0aWFsX2RvbWFpbigpKQotCQlyZXR1cm47Ci0KLQludW1fcHJvY2Vzc29ycyA9IDA7Ci0J ZGlzYWJsZWRfY3B1cyA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IG5yX2NwdV9pZHM7IGkrKykgewot CQlyYyA9IEhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfaXNfdXAsIGksIE5VTEwpOwotCQlpZiAo cmMgPj0gMCkgewotCQkJbnVtX3Byb2Nlc3NvcnMrKzsKLQkJCXNldF9jcHVfcG9zc2libGUoaSwg dHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQlzZXRfY3B1X3Bvc3NpYmxlKGksIGZhbHNlKTsKLQkJCXNl dF9jcHVfcHJlc2VudChpLCBmYWxzZSk7Ci0JCQlzdWJ0cmFjdCsrOwotCQl9Ci0JfQotI2lmZGVm IENPTkZJR19IT1RQTFVHX0NQVQotCS8qIFRoaXMgaXMgYWtpbiB0byB1c2luZyAnbnJfY3B1cycg b24gdGhlIExpbnV4IGNvbW1hbmQgbGluZS4KLQkgKiBXaGljaCBpcyBPSyBhcyB3aGVuIHdlIHVz ZSAnZG9tMF9tYXhfdmNwdXM9WCcgd2UgY2FuIG9ubHkKLQkgKiBoYXZlIHVwIHRvIFgsIHdoaWxl IG5yX2NwdV9pZHMgaXMgZ3JlYXRlciB0aGFuIFguIFRoaXMKLQkgKiBub3JtYWxseSBpcyBub3Qg YSBwcm9ibGVtLCBleGNlcHQgd2hlbiBDUFUgaG90cGx1Z2dpbmcKLQkgKiBpcyBpbnZvbHZlZCBh bmQgdGhlbiB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gWCBDUFVzCi0JICogaW4gdGhlIGd1ZXN0 IC0gd2hpY2ggd2lsbCBub3Qgd29yayBhcyB0aGVyZSBpcyBubwotCSAqIGh5cGVyY2FsbCB0byBl eHBhbmQgdGhlIG1heCBudW1iZXIgb2YgVkNQVXMgYW4gYWxyZWFkeQotCSAqIHJ1bm5pbmcgZ3Vl c3QgaGFzLiBTbyBjYXAgaXQgdXAgdG8gWC4gKi8KLQlpZiAoc3VidHJhY3QpCi0JCW5yX2NwdV9p ZHMgPSBucl9jcHVfaWRzIC0gc3VidHJhY3Q7Ci0jZW5kaWYKLQotfQotI2VuZGlmCi0KLXN0YXRp YyB2b2lkIF9faW5pdCB4ZW5fc21wX3ByZXBhcmVfYm9vdF9jcHUodm9pZCkKLXsKLQlCVUdfT04o c21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApOwotCW5hdGl2ZV9zbXBfcHJlcGFyZV9ib290X2NwdSgp OwotCi0JaWYgKHhlbl9wdl9kb21haW4oKSkgewotI2lmZGVmIENPTkZJR19YRU5fUFYKLQkJaWYg KCF4ZW5fZmVhdHVyZShYRU5GRUFUX3dyaXRhYmxlX3BhZ2VfdGFibGVzKSkKLQkJCS8qIFdlJ3Zl IHN3aXRjaGVkIHRvIHRoZSAicmVhbCIgcGVyLWNwdSBnZHQsIHNvIG1ha2UKLQkJCSAqIHN1cmUg dGhlIG9sZCBtZW1vcnkgY2FuIGJlIHJlY3ljbGVkLiAqLwotCQkJbWFrZV9sb3dtZW1fcGFnZV9y ZWFkd3JpdGUoeGVuX2luaXRpYWxfZ2R0KTsKLQotI2lmZGVmIENPTkZJR19YODZfMzIKLQkJLyoK LQkJICogWGVuIHN0YXJ0cyB1cyB3aXRoIFhFTl9GTEFUX1JJTkcxX0RTLCBidXQgbGludXggY29k ZQotCQkgKiBleHBlY3RzIF9fVVNFUl9EUwotCQkgKi8KLQkJbG9hZHNlZ21lbnQoZHMsIF9fVVNF Ul9EUyk7Ci0JCWxvYWRzZWdtZW50KGVzLCBfX1VTRVJfRFMpOwotI2VuZGlmCi0KLQkJeGVuX2Zp bHRlcl9jcHVfbWFwcygpOwotCQl4ZW5fc2V0dXBfdmNwdV9pbmZvX3BsYWNlbWVudCgpOwotI2Vu ZGlmCi0JfQotCi0JLyoKLQkgKiBTZXR1cCB2Y3B1X2luZm8gZm9yIGJvb3QgQ1BVLgotCSAqLwot CWlmICh4ZW5faHZtX2RvbWFpbigpKQotCQl4ZW5fdmNwdV9zZXR1cCgwKTsKLQotCS8qCi0JICog VGhlIGFsdGVybmF0aXZlIGxvZ2ljICh3aGljaCBwYXRjaGVzIHRoZSB1bmxvY2svbG9jaykgcnVu cyBiZWZvcmUKLQkgKiB0aGUgc21wIGJvb3R1cCB1cCBjb2RlIGlzIGFjdGl2YXRlZC4gSGVuY2Ug d2UgbmVlZCB0byBzZXQgdGhpcyB1cAotCSAqIHRoZSBjb3JlIGtlcm5lbCBpcyBiZWluZyBwYXRj aGVkLiBPdGhlcndpc2Ugd2Ugd2lsbCBoYXZlIG9ubHkKLQkgKiBtb2R1bGVzIHBhdGNoZWQgYnV0 IG5vdCBjb3JlIGNvZGUuCi0JICovCi0JeGVuX2luaXRfc3BpbmxvY2tzKCk7Ci19Ci0KLSNpZmRl ZiBDT05GSUdfWEVOX1BWCi1zdGF0aWMgdm9pZCBfX2luaXQgeGVuX3NtcF9wcmVwYXJlX2NwdXMo dW5zaWduZWQgaW50IG1heF9jcHVzKQotewotCXVuc2lnbmVkIGNwdTsKLQl1bnNpZ25lZCBpbnQg aTsKLQotCWlmIChza2lwX2lvYXBpY19zZXR1cCkgewotCQljaGFyICptID0gKG1heF9jcHVzID09 IDApID8KLQkJCSJUaGUgbm9zbXAgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIFhlbjsg IiBcCi0JCQkidXNlIFhlbiBkb20wX21heF92Y3B1cz0xIHBhcmFtZXRlciIgOgotCQkJIlRoZSBu b2FwaWMgcGFyYW1ldGVyIGlzIGluY29tcGF0aWJsZSB3aXRoIFhlbiI7Ci0KLQkJeGVuX3Jhd19w cmludGsobSk7Ci0JCXBhbmljKG0pOwotCX0KLQl4ZW5faW5pdF9sb2NrX2NwdSgwKTsKLQotCXNt cF9zdG9yZV9ib290X2NwdV9pbmZvKCk7Ci0JY3B1X2RhdGEoMCkueDg2X21heF9jb3JlcyA9IDE7 Ci0KLQlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoaSkgewotCQl6YWxsb2NfY3B1bWFza192YXIoJnBl cl9jcHUoY3B1X3NpYmxpbmdfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7Ci0JCXphbGxvY19jcHVtYXNr X3ZhcigmcGVyX2NwdShjcHVfY29yZV9tYXAsIGkpLCBHRlBfS0VSTkVMKTsKLQkJemFsbG9jX2Nw dW1hc2tfdmFyKCZwZXJfY3B1KGNwdV9sbGNfc2hhcmVkX21hcCwgaSksIEdGUF9LRVJORUwpOwot CX0KLQlzZXRfY3B1X3NpYmxpbmdfbWFwKDApOwotCi0JeGVuX3BtdV9pbml0KDApOwotCi0JaWYg KHhlbl9zbXBfaW50cl9pbml0KDApKQotCQlCVUcoKTsKLQotCWlmICghYWxsb2NfY3B1bWFza192 YXIoJnhlbl9jcHVfaW5pdGlhbGl6ZWRfbWFwLCBHRlBfS0VSTkVMKSkKLQkJcGFuaWMoImNvdWxk IG5vdCBhbGxvY2F0ZSB4ZW5fY3B1X2luaXRpYWxpemVkX21hcFxuIik7Ci0KLQljcHVtYXNrX2Nv cHkoeGVuX2NwdV9pbml0aWFsaXplZF9tYXAsIGNwdW1hc2tfb2YoMCkpOwotCi0JLyogUmVzdHJp Y3QgdGhlIHBvc3NpYmxlX21hcCBhY2NvcmRpbmcgdG8gbWF4X2NwdXMuICovCi0Jd2hpbGUgKChu dW1fcG9zc2libGVfY3B1cygpID4gMSkgJiYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiBtYXhfY3B1 cykpIHsKLQkJZm9yIChjcHUgPSBucl9jcHVfaWRzIC0gMTsgIWNwdV9wb3NzaWJsZShjcHUpOyBj cHUtLSkKLQkJCWNvbnRpbnVlOwotCQlzZXRfY3B1X3Bvc3NpYmxlKGNwdSwgZmFsc2UpOwotCX0K LQotCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCi0JCXNldF9jcHVfcHJlc2VudChjcHUsIHRy dWUpOwotfQotCi1zdGF0aWMgaW50Ci1jcHVfaW5pdGlhbGl6ZV9jb250ZXh0KHVuc2lnbmVkIGlu dCBjcHUsIHN0cnVjdCB0YXNrX3N0cnVjdCAqaWRsZSkKLXsKLQlzdHJ1Y3QgdmNwdV9ndWVzdF9j b250ZXh0ICpjdHh0OwotCXN0cnVjdCBkZXNjX3N0cnVjdCAqZ2R0OwotCXVuc2lnbmVkIGxvbmcg Z2R0X21mbjsKLQotCS8qIHVzZWQgdG8gdGVsbCBjcHVfaW5pdCgpIHRoYXQgaXQgY2FuIHByb2Nl ZWQgd2l0aCBpbml0aWFsaXphdGlvbiAqLwotCWNwdW1hc2tfc2V0X2NwdShjcHUsIGNwdV9jYWxs b3V0X21hc2spOwotCWlmIChjcHVtYXNrX3Rlc3RfYW5kX3NldF9jcHUoY3B1LCB4ZW5fY3B1X2lu aXRpYWxpemVkX21hcCkpCi0JCXJldHVybiAwOwotCi0JY3R4dCA9IGt6YWxsb2Moc2l6ZW9mKCpj dHh0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKGN0eHQgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07 Ci0KLQlnZHQgPSBnZXRfY3B1X2dkdF90YWJsZShjcHUpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl8z MgotCWN0eHQtPnVzZXJfcmVncy5mcyA9IF9fS0VSTkVMX1BFUkNQVTsKLQljdHh0LT51c2VyX3Jl Z3MuZ3MgPSBfX0tFUk5FTF9TVEFDS19DQU5BUlk7Ci0jZW5kaWYKLQltZW1zZXQoJmN0eHQtPmZw dV9jdHh0LCAwLCBzaXplb2YoY3R4dC0+ZnB1X2N0eHQpKTsKLQotCWN0eHQtPnVzZXJfcmVncy5l aXAgPSAodW5zaWduZWQgbG9uZyljcHVfYnJpbmd1cF9hbmRfaWRsZTsKLQljdHh0LT5mbGFncyA9 IFZHQ0ZfSU5fS0VSTkVMOwotCWN0eHQtPnVzZXJfcmVncy5lZmxhZ3MgPSAweDEwMDA7IC8qIElP UExfUklORzEgKi8KLQljdHh0LT51c2VyX3JlZ3MuZHMgPSBfX1VTRVJfRFM7Ci0JY3R4dC0+dXNl cl9yZWdzLmVzID0gX19VU0VSX0RTOwotCWN0eHQtPnVzZXJfcmVncy5zcyA9IF9fS0VSTkVMX0RT OwotCi0JeGVuX2NvcHlfdHJhcF9pbmZvKGN0eHQtPnRyYXBfY3R4dCk7Ci0KLQljdHh0LT5sZHRf ZW50cyA9IDA7Ci0KLQlCVUdfT04oKHVuc2lnbmVkIGxvbmcpZ2R0ICYgflBBR0VfTUFTSyk7Ci0K LQlnZHRfbWZuID0gYXJiaXRyYXJ5X3ZpcnRfdG9fbWZuKGdkdCk7Ci0JbWFrZV9sb3dtZW1fcGFn ZV9yZWFkb25seShnZHQpOwotCW1ha2VfbG93bWVtX3BhZ2VfcmVhZG9ubHkobWZuX3RvX3ZpcnQo Z2R0X21mbikpOwotCi0JY3R4dC0+Z2R0X2ZyYW1lc1swXSA9IGdkdF9tZm47Ci0JY3R4dC0+Z2R0 X2VudHMgICAgICA9IEdEVF9FTlRSSUVTOwotCi0JY3R4dC0+a2VybmVsX3NzID0gX19LRVJORUxf RFM7Ci0JY3R4dC0+a2VybmVsX3NwID0gaWRsZS0+dGhyZWFkLnNwMDsKLQotI2lmZGVmIENPTkZJ R19YODZfMzIKLQljdHh0LT5ldmVudF9jYWxsYmFja19jcyAgICAgPSBfX0tFUk5FTF9DUzsKLQlj dHh0LT5mYWlsc2FmZV9jYWxsYmFja19jcyAgPSBfX0tFUk5FTF9DUzsKLSNlbHNlCi0JY3R4dC0+ Z3NfYmFzZV9rZXJuZWwgPSBwZXJfY3B1X29mZnNldChjcHUpOwotI2VuZGlmCi0JY3R4dC0+ZXZl bnRfY2FsbGJhY2tfZWlwICAgID0KLQkJKHVuc2lnbmVkIGxvbmcpeGVuX2h5cGVydmlzb3JfY2Fs bGJhY2s7Ci0JY3R4dC0+ZmFpbHNhZmVfY2FsbGJhY2tfZWlwID0KLQkJKHVuc2lnbmVkIGxvbmcp eGVuX2ZhaWxzYWZlX2NhbGxiYWNrOwotCWN0eHQtPnVzZXJfcmVncy5jcyA9IF9fS0VSTkVMX0NT OwotCXBlcl9jcHUoeGVuX2NyMywgY3B1KSA9IF9fcGEoc3dhcHBlcl9wZ19kaXIpOwotCi0JY3R4 dC0+dXNlcl9yZWdzLmVzcCA9IGlkbGUtPnRocmVhZC5zcDAgLSBzaXplb2Yoc3RydWN0IHB0X3Jl Z3MpOwotCWN0eHQtPmN0cmxyZWdbM10gPSB4ZW5fcGZuX3RvX2NyMyh2aXJ0X3RvX2dmbihzd2Fw cGVyX3BnX2RpcikpOwotCWlmIChIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX2luaXRpYWxpc2Us IHhlbl92Y3B1X25yKGNwdSksIGN0eHQpKQotCQlCVUcoKTsKLQotCWtmcmVlKGN0eHQpOwotCXJl dHVybiAwOwotfQotCi1zdGF0aWMgaW50IHhlbl9jcHVfdXAodW5zaWduZWQgaW50IGNwdSwgc3Ry dWN0IHRhc2tfc3RydWN0ICppZGxlKQotewotCWludCByYzsKLQotCWNvbW1vbl9jcHVfdXAoY3B1 LCBpZGxlKTsKLQotCXhlbl9zZXR1cF9ydW5zdGF0ZV9pbmZvKGNwdSk7Ci0KLQkvKgotCSAqIFBW IFZDUFVzIGFyZSBhbHdheXMgc3VjY2Vzc2Z1bGx5IHRha2VuIGRvd24gKHNlZSAnd2hpbGUnIGxv b3AKLQkgKiBpbiB4ZW5fY3B1X2RpZSgpKSwgc28gLUVCVVNZIGlzIGFuIGVycm9yLgotCSAqLwot CXJjID0gY3B1X2NoZWNrX3VwX3ByZXBhcmUoY3B1KTsKLQlpZiAocmMpCi0JCXJldHVybiByYzsK LQotCS8qIG1ha2Ugc3VyZSBpbnRlcnJ1cHRzIHN0YXJ0IGJsb2NrZWQgKi8KLQlwZXJfY3B1KHhl bl92Y3B1LCBjcHUpLT5ldnRjaG5fdXBjYWxsX21hc2sgPSAxOwotCi0JcmMgPSBjcHVfaW5pdGlh bGl6ZV9jb250ZXh0KGNwdSwgaWRsZSk7Ci0JaWYgKHJjKQotCQlyZXR1cm4gcmM7Ci0KLQl4ZW5f cG11X2luaXQoY3B1KTsKLQotCXJjID0gSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF91cCwgeGVu X3ZjcHVfbnIoY3B1KSwgTlVMTCk7Ci0JQlVHX09OKHJjKTsKLQotCXdoaWxlIChjcHVfcmVwb3J0 X3N0YXRlKGNwdSkgIT0gQ1BVX09OTElORSkKLQkJSFlQRVJWSVNPUl9zY2hlZF9vcChTQ0hFRE9Q X3lpZWxkLCBOVUxMKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCB4ZW5fc21wX2Nw dXNfZG9uZSh1bnNpZ25lZCBpbnQgbWF4X2NwdXMpCi17Ci19Ci0KLSNpZmRlZiBDT05GSUdfSE9U UExVR19DUFUKLXN0YXRpYyBpbnQgeGVuX2NwdV9kaXNhYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQg aW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpZiAoY3B1ID09IDApCi0JCXJldHVybiAt RUJVU1k7Ci0KLQljcHVfZGlzYWJsZV9jb21tb24oKTsKLQotCWxvYWRfY3IzKHN3YXBwZXJfcGdf ZGlyKTsKLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgeGVuX3BsYXlfZGVhZCh2b2lkKSAv KiB1c2VkIG9ubHkgd2l0aCBIT1RQTFVHX0NQVSAqLwotewotCXBsYXlfZGVhZF9jb21tb24oKTsK LQlIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX2Rvd24sIHhlbl92Y3B1X25yKHNtcF9wcm9jZXNz b3JfaWQoKSksIE5VTEwpOwotCWNwdV9icmluZ3VwKCk7Ci0JLyoKLQkgKiBjb21taXQgNGIwYzBm Mjk0ICh0aWNrOiBDbGVhbnVwIE5PSFogcGVyIGNwdSBkYXRhIG9uIGNwdSBkb3duKQotCSAqIGNs ZWFycyBjZXJ0YWluIGRhdGEgdGhhdCB0aGUgY3B1X2lkbGUgbG9vcCAod2hpY2ggY2FsbGVkIHVz Ci0JICogYW5kIHRoYXQgd2UgcmV0dXJuIGZyb20pIGV4cGVjdHMuIFRoZSBvbmx5IHdheSB0byBn ZXQgdGhhdAotCSAqIGRhdGEgYmFjayBpcyB0byBjYWxsOgotCSAqLwotCXRpY2tfbm9oel9pZGxl X2VudGVyKCk7Ci0KLQljcHVfc3RhcnR1cF9lbnRyeShDUFVIUF9BUF9PTkxJTkVfSURMRSk7Ci19 Ci0KLSNlbHNlIC8qICFDT05GSUdfSE9UUExVR19DUFUgKi8KLXN0YXRpYyBpbnQgeGVuX2NwdV9k aXNhYmxlKHZvaWQpCi17Ci0JcmV0dXJuIC1FTk9TWVM7Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9j cHVfZGllKHVuc2lnbmVkIGludCBjcHUpCi17Ci0JQlVHKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHhl bl9wbGF5X2RlYWQodm9pZCkKLXsKLQlCVUcoKTsKLX0KLQotI2VuZGlmCi1zdGF0aWMgdm9pZCBz dG9wX3NlbGYodm9pZCAqdikKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0J LyogbWFrZSBzdXJlIHdlJ3JlIG5vdCBwaW5uaW5nIHNvbWV0aGluZyBkb3duICovCi0JbG9hZF9j cjMoc3dhcHBlcl9wZ19kaXIpOwotCS8qIHNob3VsZCBzZXQgdXAgYSBtaW5pbWFsIGdkdCAqLwot Ci0Jc2V0X2NwdV9vbmxpbmUoY3B1LCBmYWxzZSk7Ci0KLQlIWVBFUlZJU09SX3ZjcHVfb3AoVkNQ VU9QX2Rvd24sIHhlbl92Y3B1X25yKGNwdSksIE5VTEwpOwotCUJVRygpOwotfQotCi1zdGF0aWMg dm9pZCB4ZW5fc3RvcF9vdGhlcl9jcHVzKGludCB3YWl0KQotewotCXNtcF9jYWxsX2Z1bmN0aW9u KHN0b3Bfc2VsZiwgTlVMTCwgd2FpdCk7Ci19Ci0jZW5kaWYgLyogQ09ORklHX1hFTl9QViAqLwot Ci1zdGF0aWMgdm9pZCB4ZW5fY3B1X2RpZSh1bnNpZ25lZCBpbnQgY3B1KQotewotCXdoaWxlICh4 ZW5fcHZfZG9tYWluKCkgJiYgSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9pc191cCwKLQkJCQkJ CSAgICAgeGVuX3ZjcHVfbnIoY3B1KSwgTlVMTCkpIHsKLQkJX19zZXRfY3VycmVudF9zdGF0ZShU QVNLX1VOSU5URVJSVVBUSUJMRSk7Ci0JCXNjaGVkdWxlX3RpbWVvdXQoSFovMTApOwotCX0KLQot CWlmIChjb21tb25fY3B1X2RpZShjcHUpID09IDApIHsKLQkJeGVuX3NtcF9pbnRyX2ZyZWUoY3B1 KTsKLQkJeGVuX3VuaW5pdF9sb2NrX2NwdShjcHUpOwotCQl4ZW5fdGVhcmRvd25fdGltZXIoY3B1 KTsKLQkJeGVuX3BtdV9maW5pc2goY3B1KTsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkIHhlbl9zbXBf c2VuZF9yZXNjaGVkdWxlKGludCBjcHUpCit2b2lkIHhlbl9zbXBfc2VuZF9yZXNjaGVkdWxlKGlu dCBjcHUpCiB7CiAJeGVuX3NlbmRfSVBJX29uZShjcHUsIFhFTl9SRVNDSEVEVUxFX1ZFQ1RPUik7 CiB9CiAKIHN0YXRpYyB2b2lkIF9feGVuX3NlbmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1h c2sgKm1hc2ssCi0JCQkgICAgICBpbnQgdmVjdG9yKQorCQkJCWludCB2ZWN0b3IpCiB7CiAJdW5z aWduZWQgY3B1OwogCkBAIC01ODMsNyArMTI4LDcgQEAgc3RhdGljIHZvaWQgX194ZW5fc2VuZF9J UElfbWFzayhjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaywKIAkJeGVuX3NlbmRfSVBJX29uZShj cHUsIHZlY3Rvcik7CiB9CiAKLXN0YXRpYyB2b2lkIHhlbl9zbXBfc2VuZF9jYWxsX2Z1bmN0aW9u X2lwaShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3ZvaWQgeGVuX3NtcF9zZW5kX2NhbGxf ZnVuY3Rpb25faXBpKGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCWludCBjcHU7CiAK QEAgLTU5OCwxMCArMTQzLDEwIEBAIHN0YXRpYyB2b2lkIHhlbl9zbXBfc2VuZF9jYWxsX2Z1bmN0 aW9uX2lwaShjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIAl9CiB9CiAKLXN0YXRpYyB2b2lk IHhlbl9zbXBfc2VuZF9jYWxsX2Z1bmN0aW9uX3NpbmdsZV9pcGkoaW50IGNwdSkKK3ZvaWQgeGVu X3NtcF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lwaShpbnQgY3B1KQogewogCV9feGVuX3Nl bmRfSVBJX21hc2soY3B1bWFza19vZihjcHUpLAotCQkJICBYRU5fQ0FMTF9GVU5DVElPTl9TSU5H TEVfVkVDVE9SKTsKKwkJCSAgICBYRU5fQ0FMTF9GVU5DVElPTl9TSU5HTEVfVkVDVE9SKTsKIH0K IAogc3RhdGljIGlubGluZSBpbnQgeGVuX21hcF92ZWN0b3IoaW50IHZlY3RvcikKQEAgLTYzNiw4 ICsxODEsNyBAQCBzdGF0aWMgaW5saW5lIGludCB4ZW5fbWFwX3ZlY3RvcihpbnQgdmVjdG9yKQog CXJldHVybiB4ZW5fdmVjdG9yOwogfQogCi12b2lkIHhlbl9zZW5kX0lQSV9tYXNrKGNvbnN0IHN0 cnVjdCBjcHVtYXNrICptYXNrLAotCQkJICAgICAgaW50IHZlY3RvcikKK3ZvaWQgeGVuX3NlbmRf SVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCB2ZWN0b3IpCiB7CiAJaW50 IHhlbl92ZWN0b3IgPSB4ZW5fbWFwX3ZlY3Rvcih2ZWN0b3IpOwogCkBAIC03MDMsNTYgKzI0Nywz IEBAIHN0YXRpYyBpcnFyZXR1cm5fdCB4ZW5fY2FsbF9mdW5jdGlvbl9zaW5nbGVfaW50ZXJydXB0 KGludCBpcnEsIHZvaWQgKmRldl9pZCkKIAogCXJldHVybiBJUlFfSEFORExFRDsKIH0KLQotc3Rh dGljIGlycXJldHVybl90IHhlbl9pcnFfd29ya19pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGV2 X2lkKQotewotCWlycV9lbnRlcigpOwotCWlycV93b3JrX3J1bigpOwotCWluY19pcnFfc3RhdChh cGljX2lycV93b3JrX2lycXMpOwotCWlycV9leGl0KCk7Ci0KLQlyZXR1cm4gSVJRX0hBTkRMRUQ7 Ci19Ci0KLSNpZmRlZiBDT05GSUdfWEVOX1BWCi1zdGF0aWMgY29uc3Qgc3RydWN0IHNtcF9vcHMg eGVuX3NtcF9vcHMgX19pbml0Y29uc3QgPSB7Ci0JLnNtcF9wcmVwYXJlX2Jvb3RfY3B1ID0geGVu X3NtcF9wcmVwYXJlX2Jvb3RfY3B1LAotCS5zbXBfcHJlcGFyZV9jcHVzID0geGVuX3NtcF9wcmVw YXJlX2NwdXMsCi0JLnNtcF9jcHVzX2RvbmUgPSB4ZW5fc21wX2NwdXNfZG9uZSwKLQotCS5jcHVf dXAgPSB4ZW5fY3B1X3VwLAotCS5jcHVfZGllID0geGVuX2NwdV9kaWUsCi0JLmNwdV9kaXNhYmxl ID0geGVuX2NwdV9kaXNhYmxlLAotCS5wbGF5X2RlYWQgPSB4ZW5fcGxheV9kZWFkLAotCi0JLnN0 b3Bfb3RoZXJfY3B1cyA9IHhlbl9zdG9wX290aGVyX2NwdXMsCi0JLnNtcF9zZW5kX3Jlc2NoZWR1 bGUgPSB4ZW5fc21wX3NlbmRfcmVzY2hlZHVsZSwKLQotCS5zZW5kX2NhbGxfZnVuY19pcGkgPSB4 ZW5fc21wX3NlbmRfY2FsbF9mdW5jdGlvbl9pcGksCi0JLnNlbmRfY2FsbF9mdW5jX3NpbmdsZV9p cGkgPSB4ZW5fc21wX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVfaXBpLAotfTsKLQotdm9pZCBf X2luaXQgeGVuX3NtcF9pbml0KHZvaWQpCi17Ci0Jc21wX29wcyA9IHhlbl9zbXBfb3BzOwotCXhl bl9maWxsX3Bvc3NpYmxlX21hcCgpOwotfQotI2VuZGlmCi0KLXN0YXRpYyB2b2lkIF9faW5pdCB4 ZW5faHZtX3NtcF9wcmVwYXJlX2NwdXModW5zaWduZWQgaW50IG1heF9jcHVzKQotewotCW5hdGl2 ZV9zbXBfcHJlcGFyZV9jcHVzKG1heF9jcHVzKTsKLQlXQVJOX09OKHhlbl9zbXBfaW50cl9pbml0 KDApKTsKLQotCXhlbl9pbml0X2xvY2tfY3B1KDApOwotfQotCi12b2lkIF9faW5pdCB4ZW5faHZt X3NtcF9pbml0KHZvaWQpCi17Ci0Jc21wX29wcy5zbXBfcHJlcGFyZV9jcHVzID0geGVuX2h2bV9z bXBfcHJlcGFyZV9jcHVzOwotCXNtcF9vcHMuc21wX3NlbmRfcmVzY2hlZHVsZSA9IHhlbl9zbXBf c2VuZF9yZXNjaGVkdWxlOwotCXNtcF9vcHMuY3B1X2RpZSA9IHhlbl9jcHVfZGllOwotCXNtcF9v cHMuc2VuZF9jYWxsX2Z1bmNfaXBpID0geGVuX3NtcF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpOwot CXNtcF9vcHMuc2VuZF9jYWxsX2Z1bmNfc2luZ2xlX2lwaSA9IHhlbl9zbXBfc2VuZF9jYWxsX2Z1 bmN0aW9uX3NpbmdsZV9pcGk7Ci0Jc21wX29wcy5zbXBfcHJlcGFyZV9ib290X2NwdSA9IHhlbl9z bXBfcHJlcGFyZV9ib290X2NwdTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3hlbi9zbXAuaCBi L2FyY2gveDg2L3hlbi9zbXAuaAppbmRleCA5YmVlZjMzLi5iMzFkNDNiIDEwMDY0NAotLS0gYS9h cmNoL3g4Ni94ZW4vc21wLmgKKysrIGIvYXJjaC94ODYveGVuL3NtcC5oCkBAIC04LDkgKzgsMjIg QEAgZXh0ZXJuIHZvaWQgeGVuX3NlbmRfSVBJX21hc2tfYWxsYnV0c2VsZihjb25zdCBzdHJ1Y3Qg Y3B1bWFzayAqbWFzaywKIGV4dGVybiB2b2lkIHhlbl9zZW5kX0lQSV9hbGxidXRzZWxmKGludCB2 ZWN0b3IpOwogZXh0ZXJuIHZvaWQgeGVuX3NlbmRfSVBJX2FsbChpbnQgdmVjdG9yKTsKIGV4dGVy biB2b2lkIHhlbl9zZW5kX0lQSV9zZWxmKGludCB2ZWN0b3IpOworZXh0ZXJuIHZvaWQgeGVuX3Nl bmRfSVBJX21hc2soY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2ssIGludCB2ZWN0b3IpOwogCiBl eHRlcm4gaW50IHhlbl9zbXBfaW50cl9pbml0KHVuc2lnbmVkIGludCBjcHUpOwogZXh0ZXJuIHZv aWQgeGVuX3NtcF9pbnRyX2ZyZWUodW5zaWduZWQgaW50IGNwdSk7CisjaWZkZWYgQ09ORklHX1hF Tl9QVgorZXh0ZXJuIGludCB4ZW5fc21wX2ludHJfaW5pdF9wdih1bnNpZ25lZCBpbnQgY3B1KTsK K2V4dGVybiB2b2lkIHhlbl9zbXBfaW50cl9mcmVlX3B2KHVuc2lnbmVkIGludCBjcHUpOworI2Vu ZGlmCitleHRlcm4gdm9pZCB4ZW5fc21wX3NlbmRfcmVzY2hlZHVsZShpbnQgY3B1KTsKK2V4dGVy biB2b2lkIHhlbl9zbXBfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaShjb25zdCBzdHJ1Y3QgY3B1bWFz ayAqbWFzayk7CitleHRlcm4gdm9pZCB4ZW5fc21wX3NlbmRfY2FsbF9mdW5jdGlvbl9zaW5nbGVf aXBpKGludCBjcHUpOworCitzdHJ1Y3QgeGVuX2NvbW1vbl9pcnEgeworCWludCBpcnE7CisJY2hh ciAqbmFtZTsKK307CiAKICNlbHNlIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMTgsNiArMzEsMTYg QEAgc3RhdGljIGlubGluZSBpbnQgeGVuX3NtcF9pbnRyX2luaXQodW5zaWduZWQgaW50IGNwdSkK IHsKIAlyZXR1cm4gMDsKIH0KKworI2lmZGVmIENPTkZJR19YRU5fUFYKK3N0YXRpYyBpbmxpbmUg aW50IHhlbl9zbXBfaW50cl9pbml0X3B2KHVuc2lnbmVkIGludCBjcHUpCit7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fc21wX2ludHJfZnJlZV9wdih1bnNpZ25lZCBp bnQgY3B1KSB7fQorI2VuZGlmCisKIHN0YXRpYyBpbmxpbmUgdm9pZCB4ZW5fc21wX2ludHJfZnJl ZSh1bnNpZ25lZCBpbnQgY3B1KSB7fQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApkaWZmIC0t Z2l0IGEvYXJjaC94ODYveGVuL3NtcF9odm0uYyBiL2FyY2gveDg2L3hlbi9zbXBfaHZtLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJlZDQzNAotLS0gL2Rldi9udWxsCisr KyBiL2FyY2gveDg2L3hlbi9zbXBfaHZtLmMKQEAgLTAsMCArMSw1OCBAQAorI2luY2x1ZGUgPGFz bS9zbXAuaD4KKworI2luY2x1ZGUgInhlbi1vcHMuaCIKKyNpbmNsdWRlICJzbXAuaCIKKworCitz dGF0aWMgdm9pZCBfX2luaXQgeGVuX2h2bV9zbXBfcHJlcGFyZV9ib290X2NwdSh2b2lkKQorewor CUJVR19PTihzbXBfcHJvY2Vzc29yX2lkKCkgIT0gMCk7CisJbmF0aXZlX3NtcF9wcmVwYXJlX2Jv b3RfY3B1KCk7CisKKwkvKgorCSAqIFNldHVwIHZjcHVfaW5mbyBmb3IgYm9vdCBDUFUuCisJICov CisJeGVuX3ZjcHVfc2V0dXAoMCk7CisKKwkvKgorCSAqIFRoZSBhbHRlcm5hdGl2ZSBsb2dpYyAo d2hpY2ggcGF0Y2hlcyB0aGUgdW5sb2NrL2xvY2spIHJ1bnMgYmVmb3JlCisJICogdGhlIHNtcCBi b290dXAgdXAgY29kZSBpcyBhY3RpdmF0ZWQuIEhlbmNlIHdlIG5lZWQgdG8gc2V0IHRoaXMgdXAK KwkgKiB0aGUgY29yZSBrZXJuZWwgaXMgYmVpbmcgcGF0Y2hlZC4gT3RoZXJ3aXNlIHdlIHdpbGwg aGF2ZSBvbmx5CisJICogbW9kdWxlcyBwYXRjaGVkIGJ1dCBub3QgY29yZSBjb2RlLgorCSAqLwor CXhlbl9pbml0X3NwaW5sb2NrcygpOworfQorCitzdGF0aWMgdm9pZCBfX2luaXQgeGVuX2h2bV9z bXBfcHJlcGFyZV9jcHVzKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKKwluYXRpdmVfc21wX3By ZXBhcmVfY3B1cyhtYXhfY3B1cyk7CisJV0FSTl9PTih4ZW5fc21wX2ludHJfaW5pdCgwKSk7CisK Kwl4ZW5faW5pdF9sb2NrX2NwdSgwKTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQor c3RhdGljIHZvaWQgeGVuX2h2bV9jcHVfZGllKHVuc2lnbmVkIGludCBjcHUpCit7CisJaWYgKGNv bW1vbl9jcHVfZGllKGNwdSkgPT0gMCkgeworCQl4ZW5fc21wX2ludHJfZnJlZShjcHUpOworCQl4 ZW5fdW5pbml0X2xvY2tfY3B1KGNwdSk7CisJCXhlbl90ZWFyZG93bl90aW1lcihjcHUpOworCX0K K30KKyNlbHNlCitzdGF0aWMgdm9pZCB4ZW5faHZtX2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkK K3sKKwlCVUcoKTsKK30KKyNlbmRpZgorCit2b2lkIF9faW5pdCB4ZW5faHZtX3NtcF9pbml0KHZv aWQpCit7CisJc21wX29wcy5zbXBfcHJlcGFyZV9jcHVzID0geGVuX2h2bV9zbXBfcHJlcGFyZV9j cHVzOworCXNtcF9vcHMuc21wX3NlbmRfcmVzY2hlZHVsZSA9IHhlbl9zbXBfc2VuZF9yZXNjaGVk dWxlOworCXNtcF9vcHMuY3B1X2RpZSA9IHhlbl9odm1fY3B1X2RpZTsKKwlzbXBfb3BzLnNlbmRf Y2FsbF9mdW5jX2lwaSA9IHhlbl9zbXBfc2VuZF9jYWxsX2Z1bmN0aW9uX2lwaTsKKwlzbXBfb3Bz LnNlbmRfY2FsbF9mdW5jX3NpbmdsZV9pcGkgPSB4ZW5fc21wX3NlbmRfY2FsbF9mdW5jdGlvbl9z aW5nbGVfaXBpOworCXNtcF9vcHMuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSB4ZW5faHZtX3NtcF9w cmVwYXJlX2Jvb3RfY3B1OworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL3NtcF9wdi5jIGIv YXJjaC94ODYveGVuL3NtcF9wdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAu LmZjODk5MDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni94ZW4vc21wX3B2LmMKQEAgLTAs MCArMSw0OTkgQEAKKy8qCisgKiBYZW4gU01QIHN1cHBvcnQKKyAqCisgKiBUaGlzIGZpbGUgaW1w bGVtZW50cyB0aGUgWGVuIHZlcnNpb25zIG9mIHNtcF9vcHMuICBTTVAgdW5kZXIgWGVuIGlzCisg KiB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZC4gIEJyaW5naW5nIGEgQ1BVIHVwIGlzIHNpbXBseSBhIG1h dHRlciBvZgorICogbG9hZGluZyBpdHMgaW5pdGlhbCBjb250ZXh0IGFuZCBzZXR0aW5nIGl0IHJ1 bm5pbmcuCisgKgorICogSVBJcyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSBYZW4gZXZlbnQgbWVj aGFuaXNtLgorICoKKyAqIEJlY2F1c2UgdmlydHVhbCBDUFVzIGNhbiBiZSBzY2hlZHVsZWQgb250 byBhbnkgcmVhbCBDUFUsIHRoZXJlJ3Mgbm8KKyAqIHVzZWZ1bCB0b3BvbG9neSBpbmZvcm1hdGlv biBmb3IgdGhlIGtlcm5lbCB0byBtYWtlIHVzZSBvZi4gIEFzIGEKKyAqIHJlc3VsdCwgYWxsIENQ VXMgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSdyZSBzaW5nbGUtY29yZSBhbmQKKyAqIHNpbmdsZS10 aHJlYWRlZC4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgv ZXJyLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgor I2luY2x1ZGUgPGxpbnV4L2lycV93b3JrLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorCisj aW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CisjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KKyNpbmNsdWRl IDxhc20vcGd0YWJsZS5oPgorI2luY2x1ZGUgPGFzbS9jcHUuaD4KKworI2luY2x1ZGUgPHhlbi9p bnRlcmZhY2UveGVuLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS92Y3B1Lmg+CisjaW5jbHVk ZSA8eGVuL2ludGVyZmFjZS94ZW5wbXUuaD4KKworI2luY2x1ZGUgPGFzbS94ZW4vaW50ZXJmYWNl Lmg+CisjaW5jbHVkZSA8YXNtL3hlbi9oeXBlcmNhbGwuaD4KKworI2luY2x1ZGUgPHhlbi94ZW4u aD4KKyNpbmNsdWRlIDx4ZW4vcGFnZS5oPgorI2luY2x1ZGUgPHhlbi9ldmVudHMuaD4KKworI2lu Y2x1ZGUgPHhlbi9odmMtY29uc29sZS5oPgorI2luY2x1ZGUgInhlbi1vcHMuaCIKKyNpbmNsdWRl ICJtbXUuaCIKKyNpbmNsdWRlICJzbXAuaCIKKyNpbmNsdWRlICJwbXUuaCIKKworY3B1bWFza192 YXJfdCB4ZW5fY3B1X2luaXRpYWxpemVkX21hcDsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0 cnVjdCB4ZW5fY29tbW9uX2lycSwgeGVuX2lycV93b3JrKSA9IHsgLmlycSA9IC0xIH07CitzdGF0 aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHhlbl9jb21tb25faXJxLCB4ZW5fcG11X2lycSkgPSB7 IC5pcnEgPSAtMSB9OworCitzdGF0aWMgaXJxcmV0dXJuX3QgeGVuX2lycV93b3JrX2ludGVycnVw dChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOworCitzdGF0aWMgdm9pZCBjcHVfYnJpbmd1cCh2b2lk KQoreworCWludCBjcHU7CisKKwljcHVfaW5pdCgpOworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hk b2coKTsKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKworCS8qIFBWSCBydW5zIGluIHJpbmcgMCBhbmQg YWxsb3dzIHVzIHRvIGRvIG5hdGl2ZSBzeXNjYWxscy4gWWF5ISAqLworCWlmICgheGVuX2ZlYXR1 cmUoWEVORkVBVF9zdXBlcnZpc29yX21vZGVfa2VybmVsKSkgeworCQl4ZW5fZW5hYmxlX3N5c2Vu dGVyKCk7CisJCXhlbl9lbmFibGVfc3lzY2FsbCgpOworCX0KKwljcHUgPSBzbXBfcHJvY2Vzc29y X2lkKCk7CisJc21wX3N0b3JlX2NwdV9pbmZvKGNwdSk7CisJY3B1X2RhdGEoY3B1KS54ODZfbWF4 X2NvcmVzID0gMTsKKwlzZXRfY3B1X3NpYmxpbmdfbWFwKGNwdSk7CisKKwl4ZW5fc2V0dXBfY3B1 X2Nsb2NrZXZlbnRzKCk7CisKKwlub3RpZnlfY3B1X3N0YXJ0aW5nKGNwdSk7CisKKwlzZXRfY3B1 X29ubGluZShjcHUsIHRydWUpOworCisJY3B1X3NldF9zdGF0ZV9vbmxpbmUoY3B1KTsgIC8qIElt cGxpZXMgZnVsbCBtZW1vcnkgYmFycmllci4gKi8KKworCS8qIFdlIGNhbiB0YWtlIGludGVycnVw dHMgbm93OiB3ZSdyZSBvZmZpY2lhbGx5ICJ1cCIuICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOwor fQorCithc21saW5rYWdlIF9fdmlzaWJsZSB2b2lkIGNwdV9icmluZ3VwX2FuZF9pZGxlKHZvaWQp Cit7CisJY3B1X2JyaW5ndXAoKTsKKwljcHVfc3RhcnR1cF9lbnRyeShDUFVIUF9BUF9PTkxJTkVf SURMRSk7Cit9CisKK3ZvaWQgeGVuX3NtcF9pbnRyX2ZyZWVfcHYodW5zaWduZWQgaW50IGNwdSkK K3sKKwlpZiAocGVyX2NwdSh4ZW5faXJxX3dvcmssIGNwdSkuaXJxID49IDApIHsKKwkJdW5iaW5k X2Zyb21faXJxaGFuZGxlcihwZXJfY3B1KHhlbl9pcnFfd29yaywgY3B1KS5pcnEsIE5VTEwpOwor CQlwZXJfY3B1KHhlbl9pcnFfd29yaywgY3B1KS5pcnEgPSAtMTsKKwkJa2ZyZWUocGVyX2NwdSh4 ZW5faXJxX3dvcmssIGNwdSkubmFtZSk7CisJCXBlcl9jcHUoeGVuX2lycV93b3JrLCBjcHUpLm5h bWUgPSBOVUxMOworCX0KKworCWlmIChwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUpLmlycSA+PSAw KSB7CisJCXVuYmluZF9mcm9tX2lycWhhbmRsZXIocGVyX2NwdSh4ZW5fcG11X2lycSwgY3B1KS5p cnEsIE5VTEwpOworCQlwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUpLmlycSA9IC0xOworCQlrZnJl ZShwZXJfY3B1KHhlbl9wbXVfaXJxLCBjcHUpLm5hbWUpOworCQlwZXJfY3B1KHhlbl9wbXVfaXJx LCBjcHUpLm5hbWUgPSBOVUxMOworCX0KK30KKworaW50IHhlbl9zbXBfaW50cl9pbml0X3B2KHVu c2lnbmVkIGludCBjcHUpCit7CisJaW50IHJjOworCWNoYXIgKmNhbGxmdW5jX25hbWUsICpwbXVf bmFtZTsKKworCWNhbGxmdW5jX25hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImlycXdvcmsl ZCIsIGNwdSk7CisJcmMgPSBiaW5kX2lwaV90b19pcnFoYW5kbGVyKFhFTl9JUlFfV09SS19WRUNU T1IsCisJCQkJICAgIGNwdSwKKwkJCQkgICAgeGVuX2lycV93b3JrX2ludGVycnVwdCwKKwkJCQkg ICAgSVJRRl9QRVJDUFV8SVJRRl9OT0JBTEFOQ0lORywKKwkJCQkgICAgY2FsbGZ1bmNfbmFtZSwK KwkJCQkgICAgTlVMTCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBmYWlsOworCXBlcl9jcHUoeGVu X2lycV93b3JrLCBjcHUpLmlycSA9IHJjOworCXBlcl9jcHUoeGVuX2lycV93b3JrLCBjcHUpLm5h bWUgPSBjYWxsZnVuY19uYW1lOworCisJaWYgKGlzX3hlbl9wbXUoY3B1KSkgeworCQlwbXVfbmFt ZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAicG11JWQiLCBjcHUpOworCQlyYyA9IGJpbmRfdmly cV90b19pcnFoYW5kbGVyKFZJUlFfWEVOUE1VLCBjcHUsCisJCQkJCSAgICAgeGVuX3BtdV9pcnFf aGFuZGxlciwKKwkJCQkJICAgICBJUlFGX1BFUkNQVXxJUlFGX05PQkFMQU5DSU5HLAorCQkJCQkg ICAgIHBtdV9uYW1lLCBOVUxMKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWdvdG8gZmFpbDsKKwkJcGVy X2NwdSh4ZW5fcG11X2lycSwgY3B1KS5pcnEgPSByYzsKKwkJcGVyX2NwdSh4ZW5fcG11X2lycSwg Y3B1KS5uYW1lID0gcG11X25hbWU7CisJfQorCisJcmV0dXJuIDA7CisKKyBmYWlsOgorCXhlbl9z bXBfaW50cl9mcmVlX3B2KGNwdSk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBfX2lu aXQgeGVuX2ZpbGxfcG9zc2libGVfbWFwKHZvaWQpCit7CisJaW50IGksIHJjOworCisJaWYgKHhl bl9pbml0aWFsX2RvbWFpbigpKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgbnJfY3B1 X2lkczsgaSsrKSB7CisJCXJjID0gSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9pc191cCwgaSwg TlVMTCk7CisJCWlmIChyYyA+PSAwKSB7CisJCQludW1fcHJvY2Vzc29ycysrOworCQkJc2V0X2Nw dV9wb3NzaWJsZShpLCB0cnVlKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHhl bl9maWx0ZXJfY3B1X21hcHModm9pZCkKK3sKKwlpbnQgaSwgcmM7CisJdW5zaWduZWQgaW50IHN1 YnRyYWN0ID0gMDsKKworCWlmICgheGVuX2luaXRpYWxfZG9tYWluKCkpCisJCXJldHVybjsKKwor CW51bV9wcm9jZXNzb3JzID0gMDsKKwlkaXNhYmxlZF9jcHVzID0gMDsKKwlmb3IgKGkgPSAwOyBp IDwgbnJfY3B1X2lkczsgaSsrKSB7CisJCXJjID0gSFlQRVJWSVNPUl92Y3B1X29wKFZDUFVPUF9p c191cCwgaSwgTlVMTCk7CisJCWlmIChyYyA+PSAwKSB7CisJCQludW1fcHJvY2Vzc29ycysrOwor CQkJc2V0X2NwdV9wb3NzaWJsZShpLCB0cnVlKTsKKwkJfSBlbHNlIHsKKwkJCXNldF9jcHVfcG9z c2libGUoaSwgZmFsc2UpOworCQkJc2V0X2NwdV9wcmVzZW50KGksIGZhbHNlKTsKKwkJCXN1YnRy YWN0Kys7CisJCX0KKwl9CisjaWZkZWYgQ09ORklHX0hPVFBMVUdfQ1BVCisJLyogVGhpcyBpcyBh a2luIHRvIHVzaW5nICducl9jcHVzJyBvbiB0aGUgTGludXggY29tbWFuZCBsaW5lLgorCSAqIFdo aWNoIGlzIE9LIGFzIHdoZW4gd2UgdXNlICdkb20wX21heF92Y3B1cz1YJyB3ZSBjYW4gb25seQor CSAqIGhhdmUgdXAgdG8gWCwgd2hpbGUgbnJfY3B1X2lkcyBpcyBncmVhdGVyIHRoYW4gWC4gVGhp cworCSAqIG5vcm1hbGx5IGlzIG5vdCBhIHByb2JsZW0sIGV4Y2VwdCB3aGVuIENQVSBob3RwbHVn Z2luZworCSAqIGlzIGludm9sdmVkIGFuZCB0aGVuIHRoZXJlIG1pZ2h0IGJlIG1vcmUgdGhhbiBY IENQVXMKKwkgKiBpbiB0aGUgZ3Vlc3QgLSB3aGljaCB3aWxsIG5vdCB3b3JrIGFzIHRoZXJlIGlz IG5vCisJICogaHlwZXJjYWxsIHRvIGV4cGFuZCB0aGUgbWF4IG51bWJlciBvZiBWQ1BVcyBhbiBh bHJlYWR5CisJICogcnVubmluZyBndWVzdCBoYXMuIFNvIGNhcCBpdCB1cCB0byBYLiAqLworCWlm IChzdWJ0cmFjdCkKKwkJbnJfY3B1X2lkcyA9IG5yX2NwdV9pZHMgLSBzdWJ0cmFjdDsKKyNlbmRp ZgorCit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcHZfc21wX3ByZXBhcmVfYm9vdF9jcHUo dm9pZCkKK3sKKwlCVUdfT04oc21wX3Byb2Nlc3Nvcl9pZCgpICE9IDApOworCW5hdGl2ZV9zbXBf cHJlcGFyZV9ib290X2NwdSgpOworCisJaWYgKHhlbl9wdl9kb21haW4oKSkgeworI2lmZGVmIENP TkZJR19YRU5fUFYKKwkJaWYgKCF4ZW5fZmVhdHVyZShYRU5GRUFUX3dyaXRhYmxlX3BhZ2VfdGFi bGVzKSkKKwkJCS8qIFdlJ3ZlIHN3aXRjaGVkIHRvIHRoZSAicmVhbCIgcGVyLWNwdSBnZHQsIHNv IG1ha2UKKwkJCSAqIHN1cmUgdGhlIG9sZCBtZW1vcnkgY2FuIGJlIHJlY3ljbGVkLiAqLworCQkJ bWFrZV9sb3dtZW1fcGFnZV9yZWFkd3JpdGUoeGVuX2luaXRpYWxfZ2R0KTsKKworI2lmZGVmIENP TkZJR19YODZfMzIKKwkJLyoKKwkJICogWGVuIHN0YXJ0cyB1cyB3aXRoIFhFTl9GTEFUX1JJTkcx X0RTLCBidXQgbGludXggY29kZQorCQkgKiBleHBlY3RzIF9fVVNFUl9EUworCQkgKi8KKwkJbG9h ZHNlZ21lbnQoZHMsIF9fVVNFUl9EUyk7CisJCWxvYWRzZWdtZW50KGVzLCBfX1VTRVJfRFMpOwor I2VuZGlmCisKKwkJeGVuX2ZpbHRlcl9jcHVfbWFwcygpOworCQl4ZW5fc2V0dXBfdmNwdV9pbmZv X3BsYWNlbWVudCgpOworI2VuZGlmCisJfQorCisJLyoKKwkgKiBTZXR1cCB2Y3B1X2luZm8gZm9y IGJvb3QgQ1BVLgorCSAqLworCWlmICh4ZW5faHZtX2RvbWFpbigpKQorCQl4ZW5fdmNwdV9zZXR1 cCgwKTsKKworCS8qCisJICogVGhlIGFsdGVybmF0aXZlIGxvZ2ljICh3aGljaCBwYXRjaGVzIHRo ZSB1bmxvY2svbG9jaykgcnVucyBiZWZvcmUKKwkgKiB0aGUgc21wIGJvb3R1cCB1cCBjb2RlIGlz IGFjdGl2YXRlZC4gSGVuY2Ugd2UgbmVlZCB0byBzZXQgdGhpcyB1cAorCSAqIHRoZSBjb3JlIGtl cm5lbCBpcyBiZWluZyBwYXRjaGVkLiBPdGhlcndpc2Ugd2Ugd2lsbCBoYXZlIG9ubHkKKwkgKiBt b2R1bGVzIHBhdGNoZWQgYnV0IG5vdCBjb3JlIGNvZGUuCisJICovCisJeGVuX2luaXRfc3Bpbmxv Y2tzKCk7Cit9CisKK3N0YXRpYyB2b2lkIF9faW5pdCB4ZW5fcHZfc21wX3ByZXBhcmVfY3B1cyh1 bnNpZ25lZCBpbnQgbWF4X2NwdXMpCit7CisJdW5zaWduZWQgY3B1OworCXVuc2lnbmVkIGludCBp OworCisJaWYgKHNraXBfaW9hcGljX3NldHVwKSB7CisJCWNoYXIgKm0gPSAobWF4X2NwdXMgPT0g MCkgPworCQkJIlRoZSBub3NtcCBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggWGVuOyAi IFwKKwkJCSJ1c2UgWGVuIGRvbTBfbWF4X3ZjcHVzPTEgcGFyYW1ldGVyIiA6CisJCQkiVGhlIG5v YXBpYyBwYXJhbWV0ZXIgaXMgaW5jb21wYXRpYmxlIHdpdGggWGVuIjsKKworCQl4ZW5fcmF3X3By aW50ayhtKTsKKwkJcGFuaWMobSk7CisJfQorCXhlbl9pbml0X2xvY2tfY3B1KDApOworCisJc21w X3N0b3JlX2Jvb3RfY3B1X2luZm8oKTsKKwljcHVfZGF0YSgwKS54ODZfbWF4X2NvcmVzID0gMTsK KworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShpKSB7CisJCXphbGxvY19jcHVtYXNrX3ZhcigmcGVy X2NwdShjcHVfc2libGluZ19tYXAsIGkpLCBHRlBfS0VSTkVMKTsKKwkJemFsbG9jX2NwdW1hc2tf dmFyKCZwZXJfY3B1KGNwdV9jb3JlX21hcCwgaSksIEdGUF9LRVJORUwpOworCQl6YWxsb2NfY3B1 bWFza192YXIoJnBlcl9jcHUoY3B1X2xsY19zaGFyZWRfbWFwLCBpKSwgR0ZQX0tFUk5FTCk7CisJ fQorCXNldF9jcHVfc2libGluZ19tYXAoMCk7CisKKwl4ZW5fcG11X2luaXQoMCk7CisKKwlpZiAo eGVuX3NtcF9pbnRyX2luaXQoMCkpCisJCUJVRygpOworCisJaWYgKCFhbGxvY19jcHVtYXNrX3Zh cigmeGVuX2NwdV9pbml0aWFsaXplZF9tYXAsIEdGUF9LRVJORUwpKQorCQlwYW5pYygiY291bGQg bm90IGFsbG9jYXRlIHhlbl9jcHVfaW5pdGlhbGl6ZWRfbWFwXG4iKTsKKworCWNwdW1hc2tfY29w eSh4ZW5fY3B1X2luaXRpYWxpemVkX21hcCwgY3B1bWFza19vZigwKSk7CisKKwkvKiBSZXN0cmlj dCB0aGUgcG9zc2libGVfbWFwIGFjY29yZGluZyB0byBtYXhfY3B1cy4gKi8KKwl3aGlsZSAoKG51 bV9wb3NzaWJsZV9jcHVzKCkgPiAxKSAmJiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA+IG1heF9jcHVz KSkgeworCQlmb3IgKGNwdSA9IG5yX2NwdV9pZHMgLSAxOyAhY3B1X3Bvc3NpYmxlKGNwdSk7IGNw dS0tKQorCQkJY29udGludWU7CisJCXNldF9jcHVfcG9zc2libGUoY3B1LCBmYWxzZSk7CisJfQor CisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkKKwkJc2V0X2NwdV9wcmVzZW50KGNwdSwgdHJ1 ZSk7Cit9CisKK3N0YXRpYyBpbnQKK2NwdV9pbml0aWFsaXplX2NvbnRleHQodW5zaWduZWQgaW50 IGNwdSwgc3RydWN0IHRhc2tfc3RydWN0ICppZGxlKQoreworCXN0cnVjdCB2Y3B1X2d1ZXN0X2Nv bnRleHQgKmN0eHQ7CisJc3RydWN0IGRlc2Nfc3RydWN0ICpnZHQ7CisJdW5zaWduZWQgbG9uZyBn ZHRfbWZuOworCisJLyogdXNlZCB0byB0ZWxsIGNwdV9pbml0KCkgdGhhdCBpdCBjYW4gcHJvY2Vl ZCB3aXRoIGluaXRpYWxpemF0aW9uICovCisJY3B1bWFza19zZXRfY3B1KGNwdSwgY3B1X2NhbGxv dXRfbWFzayk7CisJaWYgKGNwdW1hc2tfdGVzdF9hbmRfc2V0X2NwdShjcHUsIHhlbl9jcHVfaW5p dGlhbGl6ZWRfbWFwKSkKKwkJcmV0dXJuIDA7CisKKwljdHh0ID0ga3phbGxvYyhzaXplb2YoKmN0 eHQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3R4dCA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT01FTTsK KworCWdkdCA9IGdldF9jcHVfZ2R0X3RhYmxlKGNwdSk7CisKKyNpZmRlZiBDT05GSUdfWDg2XzMy CisJY3R4dC0+dXNlcl9yZWdzLmZzID0gX19LRVJORUxfUEVSQ1BVOworCWN0eHQtPnVzZXJfcmVn cy5ncyA9IF9fS0VSTkVMX1NUQUNLX0NBTkFSWTsKKyNlbmRpZgorCW1lbXNldCgmY3R4dC0+ZnB1 X2N0eHQsIDAsIHNpemVvZihjdHh0LT5mcHVfY3R4dCkpOworCisJY3R4dC0+dXNlcl9yZWdzLmVp cCA9ICh1bnNpZ25lZCBsb25nKWNwdV9icmluZ3VwX2FuZF9pZGxlOworCWN0eHQtPmZsYWdzID0g VkdDRl9JTl9LRVJORUw7CisJY3R4dC0+dXNlcl9yZWdzLmVmbGFncyA9IDB4MTAwMDsgLyogSU9Q TF9SSU5HMSAqLworCWN0eHQtPnVzZXJfcmVncy5kcyA9IF9fVVNFUl9EUzsKKwljdHh0LT51c2Vy X3JlZ3MuZXMgPSBfX1VTRVJfRFM7CisJY3R4dC0+dXNlcl9yZWdzLnNzID0gX19LRVJORUxfRFM7 CisKKwl4ZW5fY29weV90cmFwX2luZm8oY3R4dC0+dHJhcF9jdHh0KTsKKworCWN0eHQtPmxkdF9l bnRzID0gMDsKKworCUJVR19PTigodW5zaWduZWQgbG9uZylnZHQgJiB+UEFHRV9NQVNLKTsKKwor CWdkdF9tZm4gPSBhcmJpdHJhcnlfdmlydF90b19tZm4oZ2R0KTsKKwltYWtlX2xvd21lbV9wYWdl X3JlYWRvbmx5KGdkdCk7CisJbWFrZV9sb3dtZW1fcGFnZV9yZWFkb25seShtZm5fdG9fdmlydChn ZHRfbWZuKSk7CisKKwljdHh0LT5nZHRfZnJhbWVzWzBdID0gZ2R0X21mbjsKKwljdHh0LT5nZHRf ZW50cyAgICAgID0gR0RUX0VOVFJJRVM7CisKKwljdHh0LT5rZXJuZWxfc3MgPSBfX0tFUk5FTF9E UzsKKwljdHh0LT5rZXJuZWxfc3AgPSBpZGxlLT50aHJlYWQuc3AwOworCisjaWZkZWYgQ09ORklH X1g4Nl8zMgorCWN0eHQtPmV2ZW50X2NhbGxiYWNrX2NzICAgICA9IF9fS0VSTkVMX0NTOworCWN0 eHQtPmZhaWxzYWZlX2NhbGxiYWNrX2NzICA9IF9fS0VSTkVMX0NTOworI2Vsc2UKKwljdHh0LT5n c19iYXNlX2tlcm5lbCA9IHBlcl9jcHVfb2Zmc2V0KGNwdSk7CisjZW5kaWYKKwljdHh0LT5ldmVu dF9jYWxsYmFja19laXAgICAgPQorCQkodW5zaWduZWQgbG9uZyl4ZW5faHlwZXJ2aXNvcl9jYWxs YmFjazsKKwljdHh0LT5mYWlsc2FmZV9jYWxsYmFja19laXAgPQorCQkodW5zaWduZWQgbG9uZyl4 ZW5fZmFpbHNhZmVfY2FsbGJhY2s7CisJY3R4dC0+dXNlcl9yZWdzLmNzID0gX19LRVJORUxfQ1M7 CisJcGVyX2NwdSh4ZW5fY3IzLCBjcHUpID0gX19wYShzd2FwcGVyX3BnX2Rpcik7CisKKwljdHh0 LT51c2VyX3JlZ3MuZXNwID0gaWRsZS0+dGhyZWFkLnNwMCAtIHNpemVvZihzdHJ1Y3QgcHRfcmVn cyk7CisJY3R4dC0+Y3RybHJlZ1szXSA9IHhlbl9wZm5fdG9fY3IzKHZpcnRfdG9fZ2ZuKHN3YXBw ZXJfcGdfZGlyKSk7CisJaWYgKEhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfaW5pdGlhbGlzZSwg eGVuX3ZjcHVfbnIoY3B1KSwgY3R4dCkpCisJCUJVRygpOworCisJa2ZyZWUoY3R4dCk7CisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgeGVuX3B2X2NwdV91cCh1bnNpZ25lZCBpbnQgY3B1LCBz dHJ1Y3QgdGFza19zdHJ1Y3QgKmlkbGUpCit7CisJaW50IHJjOworCisJY29tbW9uX2NwdV91cChj cHUsIGlkbGUpOworCisJeGVuX3NldHVwX3J1bnN0YXRlX2luZm8oY3B1KTsKKworCS8qCisJICog UFYgVkNQVXMgYXJlIGFsd2F5cyBzdWNjZXNzZnVsbHkgdGFrZW4gZG93biAoc2VlICd3aGlsZScg bG9vcAorCSAqIGluIHhlbl9jcHVfZGllKCkpLCBzbyAtRUJVU1kgaXMgYW4gZXJyb3IuCisJICov CisJcmMgPSBjcHVfY2hlY2tfdXBfcHJlcGFyZShjcHUpOworCWlmIChyYykKKwkJcmV0dXJuIHJj OworCisJLyogbWFrZSBzdXJlIGludGVycnVwdHMgc3RhcnQgYmxvY2tlZCAqLworCXBlcl9jcHUo eGVuX3ZjcHUsIGNwdSktPmV2dGNobl91cGNhbGxfbWFzayA9IDE7CisKKwlyYyA9IGNwdV9pbml0 aWFsaXplX2NvbnRleHQoY3B1LCBpZGxlKTsKKwlpZiAocmMpCisJCXJldHVybiByYzsKKworCXhl bl9wbXVfaW5pdChjcHUpOworCisJcmMgPSBIWVBFUlZJU09SX3ZjcHVfb3AoVkNQVU9QX3VwLCB4 ZW5fdmNwdV9ucihjcHUpLCBOVUxMKTsKKwlCVUdfT04ocmMpOworCisJd2hpbGUgKGNwdV9yZXBv cnRfc3RhdGUoY3B1KSAhPSBDUFVfT05MSU5FKQorCQlIWVBFUlZJU09SX3NjaGVkX29wKFNDSEVE T1BfeWllbGQsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wdl9z bXBfY3B1c19kb25lKHVuc2lnbmVkIGludCBtYXhfY3B1cykKK3sKK30KKworI2lmZGVmIENPTkZJ R19IT1RQTFVHX0NQVQorc3RhdGljIGludCB4ZW5fcHZfY3B1X2Rpc2FibGUodm9pZCkKK3sKKwl1 bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWlmIChjcHUgPT0gMCkKKwkJ cmV0dXJuIC1FQlVTWTsKKworCWNwdV9kaXNhYmxlX2NvbW1vbigpOworCisJbG9hZF9jcjMoc3dh cHBlcl9wZ19kaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB4ZW5fcHZfcGxheV9k ZWFkKHZvaWQpIC8qIHVzZWQgb25seSB3aXRoIEhPVFBMVUdfQ1BVICovCit7CisJcGxheV9kZWFk X2NvbW1vbigpOworCUhZUEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfZG93biwgeGVuX3ZjcHVfbnIo c21wX3Byb2Nlc3Nvcl9pZCgpKSwgTlVMTCk7CisJY3B1X2JyaW5ndXAoKTsKKwkvKgorCSAqIGNv bW1pdCA0YjBjMGYyOTQgKHRpY2s6IENsZWFudXAgTk9IWiBwZXIgY3B1IGRhdGEgb24gY3B1IGRv d24pCisJICogY2xlYXJzIGNlcnRhaW4gZGF0YSB0aGF0IHRoZSBjcHVfaWRsZSBsb29wICh3aGlj aCBjYWxsZWQgdXMKKwkgKiBhbmQgdGhhdCB3ZSByZXR1cm4gZnJvbSkgZXhwZWN0cy4gVGhlIG9u bHkgd2F5IHRvIGdldCB0aGF0CisJICogZGF0YSBiYWNrIGlzIHRvIGNhbGw6CisJICovCisJdGlj a19ub2h6X2lkbGVfZW50ZXIoKTsKKworCWNwdV9zdGFydHVwX2VudHJ5KENQVUhQX0FQX09OTElO RV9JRExFKTsKK30KKworI2Vsc2UgLyogIUNPTkZJR19IT1RQTFVHX0NQVSAqLworc3RhdGljIGlu dCB4ZW5fcHZfY3B1X2Rpc2FibGUodm9pZCkKK3sKKwlyZXR1cm4gLUVOT1NZUzsKK30KKworc3Rh dGljIHZvaWQgeGVuX3B2X2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwlCVUcoKTsKK30K Kworc3RhdGljIHZvaWQgeGVuX3B2X3BsYXlfZGVhZCh2b2lkKQoreworCUJVRygpOworfQorCisj ZW5kaWYKK3N0YXRpYyB2b2lkIHN0b3Bfc2VsZih2b2lkICp2KQoreworCWludCBjcHUgPSBzbXBf cHJvY2Vzc29yX2lkKCk7CisKKwkvKiBtYWtlIHN1cmUgd2UncmUgbm90IHBpbm5pbmcgc29tZXRo aW5nIGRvd24gKi8KKwlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7CisJLyogc2hvdWxkIHNldCB1 cCBhIG1pbmltYWwgZ2R0ICovCisKKwlzZXRfY3B1X29ubGluZShjcHUsIGZhbHNlKTsKKworCUhZ UEVSVklTT1JfdmNwdV9vcChWQ1BVT1BfZG93biwgeGVuX3ZjcHVfbnIoY3B1KSwgTlVMTCk7CisJ QlVHKCk7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9wdl9zdG9wX290aGVyX2NwdXMoaW50IHdhaXQp Cit7CisJc21wX2NhbGxfZnVuY3Rpb24oc3RvcF9zZWxmLCBOVUxMLCB3YWl0KTsKK30KKworc3Rh dGljIHZvaWQgeGVuX3B2X2NwdV9kaWUodW5zaWduZWQgaW50IGNwdSkKK3sKKwl3aGlsZSAoSFlQ RVJWSVNPUl92Y3B1X29wKFZDUFVPUF9pc191cCwKKwkJCQkgIHhlbl92Y3B1X25yKGNwdSksIE5V TEwpKSB7CisJCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19VTklOVEVSUlVQVElCTEUpOworCQlz Y2hlZHVsZV90aW1lb3V0KEhaLzEwKTsKKwl9CisKKwlpZiAoY29tbW9uX2NwdV9kaWUoY3B1KSA9 PSAwKSB7CisJCXhlbl9zbXBfaW50cl9mcmVlKGNwdSk7CisJCXhlbl91bmluaXRfbG9ja19jcHUo Y3B1KTsKKwkJeGVuX3RlYXJkb3duX3RpbWVyKGNwdSk7CisJCXhlbl9wbXVfZmluaXNoKGNwdSk7 CisJfQorfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgeGVuX2lycV93b3JrX2ludGVycnVwdChpbnQg aXJxLCB2b2lkICpkZXZfaWQpCit7CisJaXJxX2VudGVyKCk7CisJaXJxX3dvcmtfcnVuKCk7CisJ aW5jX2lycV9zdGF0KGFwaWNfaXJxX3dvcmtfaXJxcyk7CisJaXJxX2V4aXQoKTsKKworCXJldHVy biBJUlFfSEFORExFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbXBfb3BzIHhlbl9zbXBf b3BzIF9faW5pdGNvbnN0ID0geworCS5zbXBfcHJlcGFyZV9ib290X2NwdSA9IHhlbl9wdl9zbXBf cHJlcGFyZV9ib290X2NwdSwKKwkuc21wX3ByZXBhcmVfY3B1cyA9IHhlbl9wdl9zbXBfcHJlcGFy ZV9jcHVzLAorCS5zbXBfY3B1c19kb25lID0geGVuX3B2X3NtcF9jcHVzX2RvbmUsCisKKwkuY3B1 X3VwID0geGVuX3B2X2NwdV91cCwKKwkuY3B1X2RpZSA9IHhlbl9wdl9jcHVfZGllLAorCS5jcHVf ZGlzYWJsZSA9IHhlbl9wdl9jcHVfZGlzYWJsZSwKKwkucGxheV9kZWFkID0geGVuX3B2X3BsYXlf ZGVhZCwKKworCS5zdG9wX290aGVyX2NwdXMgPSB4ZW5fcHZfc3RvcF9vdGhlcl9jcHVzLAorCS5z bXBfc2VuZF9yZXNjaGVkdWxlID0geGVuX3NtcF9zZW5kX3Jlc2NoZWR1bGUsCisKKwkuc2VuZF9j YWxsX2Z1bmNfaXBpID0geGVuX3NtcF9zZW5kX2NhbGxfZnVuY3Rpb25faXBpLAorCS5zZW5kX2Nh bGxfZnVuY19zaW5nbGVfaXBpID0geGVuX3NtcF9zZW5kX2NhbGxfZnVuY3Rpb25fc2luZ2xlX2lw aSwKK307CisKK3ZvaWQgX19pbml0IHhlbl9zbXBfaW5pdCh2b2lkKQoreworCXNtcF9vcHMgPSB4 ZW5fc21wX29wczsKKwl4ZW5fZmlsbF9wb3NzaWJsZV9tYXAoKTsKK30KLS0gCjIuOS4zCgoKX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KWGVuLWRldmVsIG1h aWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVuLm9yZwpodHRwczovL2xpc3RzLnhlbi5vcmcv eGVuLWRldmVsCg==