From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Airlie Subject: [PATCH 06/10] drm/helper: add Displayport multi-stream helper (v0.3) Date: Mon, 12 May 2014 16:46:43 +1000 Message-ID: <1399877207-15868-7-git-send-email-airlied@gmail.com> References: <1399877207-15868-1-git-send-email-airlied@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <1399877207-15868-1-git-send-email-airlied@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: dri-devel@lists.freedesktop.org, intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogRGF2ZSBBaXJsaWUgPGFpcmxpZWRAcmVkaGF0LmNvbT4KClRoaXMgaXMgdGhlIGluaXRp YWwgaW1wb3J0IG9mIHRoZSBoZWxwZXIgZm9yIGRpc3BsYXlwb3J0IG11bHRpc3RyZWFtLgoKSXQg Y29uc2lzdHMgb2YgYSB0b3BvbG9neSBtYW5hZ2VyLCBpbml0L2Rlc3Ryb3kvc2V0IG1zdCBzdGF0 ZQoKSXQgc3VwcG9ydHMgRFAgMS4yIE1TVCBzaWRlYmFuZCBtc2cgcHJvdG9jb2wgaGFuZGxlciAt IHZpYSBocGQgaXJxcwoKY29ubmVjdG9yIGRldGVjdCBhbmQgZWRpZCByZXRyaWV2YWwgaW50ZXJm YWNlLgoKSXQgc3VwcG9ydHMgaTJjIGRldmljZSBvdmVyIERQIDEuMiBzaWRlYmFuZCBtc2cgcHJv dG9jb2wgKEVESUQgcmVhZHMgb25seSkKCmJhbmR3aWR0aCBtYW5hZ2VyIEFQSSB2aWEgdmNwaSBh bGxvY2F0aW9uIGFuZCBwYXlsb2FkIHVwZGF0aW5nLAphbG9uZyB3aXRoIGEgaGVscGVyIHRvIGNo ZWNrIHRoZSBBQ1Qgc3RhdHVzLgoKT2JqZWN0czoKTVNUIHRvcG9sb2d5IG1hbmFnZXIgLSBvbmUg cGVyIHRvcGxldmVsIE1TVCBjYXBhYmxlIEdQVSBwb3J0IC0gbm90IHN1cmUgaWYgdGhpcyBzaG91 bGQgYmUgaGlnaGVyIGxldmVsIGFnYWluCk1TVCBicmFuY2ggdW5pdCAtIG9uZSBpbnN0YW5jZSBw ZXIgcGx1Z2dlZCBicmFuY2hpbmcgdW5pdCAtIG9uZSBhdCB0b3Agb2YgaGllcmFyY2h5IC0gb3Ro ZXJzIGhhbmdpbmcgZnJvbSBwb3J0cwpNU1QgcG9ydCAtIG9uZSBwb3J0IHBlciBwb3J0IHJlcG9y dGVkIGJ5IGJyYW5jaGluZyB1bml0cywgY2FuIGhhdmUgTVNUIHVuaXRzIGhhbmdpbmcgZnJvbSB0 aGVtIGFzIHdlbGwuCgpDaGFuZ2VzIHNpbmNlIGluaXRpYWwgcG9zdGluZzoKYSkgYWRkIGEgbXV0 ZXggcmVzcG9uc2JpbGUgZm9yIHRoZSBxdWV1ZXMsIGl0IGxvY2tzIHRoZSBzaWRlYmFuZCBhbmQg bXNnIHNsb3RzLCBhbmQgbXNncyB0byB0cmFuc21pdCBzdGF0ZQpiKSBhZGQgd29ya2VyIHRvIGhh bmRsZSBjb25uZWN0aW9uIHN0YXRlIGNoYW5nZSBldmVudHMsIGZvciBNU1QgZGV2aWNlIGNoYWlu aW5nIGFuZCBob3RwbHVnCmMpIGFkZCBhIHBheWxvYWQgc3BpbmxvY2sKZCkgYWRkIHBhdGggc2lk ZWJhbmQgbXNnIHN1cHBvcnQKZSkgZml4dXAgZW51bSBwYXRoIHJlc291cmNlcyB0cmFuc21pdApm KSByZWR1Y2UgbWF4IGRwY2QgbXNnIHRvIDE2LCBhcyBwZXIgRFAxLjIgc3BlYy4KZykgc2VwYXJh dGUgdHggcXVldWUga2lja2luZyBmcm9tIGlycSBwcm9jZXNzaW5nIGFuZCBtb3ZlIGlycSBhY2tp bmcgYmFjayB0byBkcml2ZXJzLgoKQ2hhbmdlcyBzaW5jZSB2MC4yOgphKSByZW9yZ2FuaXNlIGNv ZGUsCmIpIGRyb3AgQUNUIGZvcmNpbmcgY29kZQpjKSBhZGQgY29ubmVjdG9yIG5hbWluZyBpbnRl cmZhY2UgdXNpbmcgcGF0aCBwcm9wZXJ0eQpkKSBhZGQgdG9wb2xvZ3kgZHVtcGVyIGhlbHBlcgpl KSBwcm9wZXIgcmVmZXJlbmNlIGNvdW50aW5nIGFuZCBsb29rdXAgZm9yIHBvcnRzIGFuZCBtc3Ri cy4KZikgbW92ZSB0eCBraWNraW5nIGludG8gYSB3b3JrcQpnKSBhZGQgYXV4IGxvY2tpbmcgLSB0 aGlzIHNob3VsZCBiZSByZWRvbmUKaCkgc3BsaXQgdGVhcmRvd24gaW50byB0d28gcGFydHMKaSkg c3RhcnQgd29ya2luZyBvbiBkb2N1bWVudGF0aW9uIG9uIGludGVyZmFjZS4KClRPRE86Cm1pc2Mg ZmVhdHVyZXMKClNpZ25lZC1vZmYtYnk6IERhdmUgQWlybGllIDxhaXJsaWVkQHJlZGhhdC5jb20+ Ci0tLQogRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsICAgICAgICB8ICAgIDYgKwogZHJp dmVycy9ncHUvZHJtL01ha2VmaWxlICAgICAgICAgICAgICB8ICAgIDIgKy0KIGRyaXZlcnMvZ3B1 L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMgfCAyNTM2ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwogaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaCAgICAgICB8ICA1MDMg KysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAzMDQ2IGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24o LSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vZHJtX2RwX21zdF90b3BvbG9n eS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaAoK ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kcm0udG1wbCBiL0RvY3VtZW50YXRp b24vRG9jQm9vay9kcm0udG1wbAppbmRleCA4M2RkMGIwLi4xODgzOTc2IDEwMDY0NAotLS0gYS9E b2N1bWVudGF0aW9uL0RvY0Jvb2svZHJtLnRtcGwKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29r L2RybS50bXBsCkBAIC0yMjk2LDYgKzIyOTYsMTIgQEAgdm9pZCBpbnRlbF9jcnRfaW5pdChzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2KQogIUVkcml2ZXJzL2dwdS9kcm0vZHJtX2RwX2hlbHBlci5jCiAg ICAgPC9zZWN0Mj4KICAgICA8c2VjdDI+CisgICAgICA8dGl0bGU+RGlzcGxheSBQb3J0IE1TVCBI ZWxwZXIgRnVuY3Rpb25zIFJlZmVyZW5jZTwvdGl0bGU+CishUGRyaXZlcnMvZ3B1L2RybS9kcm1f ZHBfbXN0X3RvcG9sb2d5LmMgZHAgbXN0IGhlbHBlcgorIUlpbmNsdWRlL2RybS9kcm1fZHBfbXN0 X2hlbHBlci5oCishRWRyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKKyAgICA8 L3NlY3QyPgorICAgIDxzZWN0Mj4KICAgICAgIDx0aXRsZT5FRElEIEhlbHBlciBGdW5jdGlvbnMg UmVmZXJlbmNlPC90aXRsZT4KICFFZHJpdmVycy9ncHUvZHJtL2RybV9lZGlkLmMKICAgICA8L3Nl Y3QyPgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlIGIvZHJpdmVycy9ncHUv ZHJtL01ha2VmaWxlCmluZGV4IDQ4ZTM4YmEuLjcxMmI3M2UgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv Z3B1L2RybS9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKQEAgLTIzLDcg KzIzLDcgQEAgZHJtLSQoQ09ORklHX0RSTV9QQU5FTCkgKz0gZHJtX3BhbmVsLm8KIAogZHJtLXVz Yi15ICAgOj0gZHJtX3VzYi5vCiAKLWRybV9rbXNfaGVscGVyLXkgOj0gZHJtX2NydGNfaGVscGVy Lm8gZHJtX2RwX2hlbHBlci5vIGRybV9wcm9iZV9oZWxwZXIubworZHJtX2ttc19oZWxwZXIteSA6 PSBkcm1fY3J0Y19oZWxwZXIubyBkcm1fZHBfaGVscGVyLm8gZHJtX3Byb2JlX2hlbHBlci5vIGRy bV9kcF9tc3RfdG9wb2xvZ3kubwogZHJtX2ttc19oZWxwZXItJChDT05GSUdfRFJNX0xPQURfRURJ RF9GSVJNV0FSRSkgKz0gZHJtX2VkaWRfbG9hZC5vCiBkcm1fa21zX2hlbHBlci0kKENPTkZJR19E Uk1fS01TX0ZCX0hFTFBFUikgKz0gZHJtX2ZiX2hlbHBlci5vCiBkcm1fa21zX2hlbHBlci0kKENP TkZJR19EUk1fS01TX0NNQV9IRUxQRVIpICs9IGRybV9mYl9jbWFfaGVscGVyLm8KZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMgYi9kcml2ZXJzL2dwdS9k cm0vZHJtX2RwX21zdF90b3BvbG9neS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAuLmNhNWM1OTMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX2RwX21z dF90b3BvbG9neS5jCkBAIC0wLDAgKzEsMjUzNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDE0 IFJlZCBIYXQKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmli dXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHMKKyAqIGRvY3VtZW50YXRpb24gZm9y IGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0 CisgKiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQg dGhhdCBib3RoIHRoYXQgY29weXJpZ2h0CisgKiBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBu b3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kCisgKiB0aGF0IHRo ZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2lu ZyBvcgorICogcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0 d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAgVGhl IGNvcHlyaWdodCBob2xkZXJzIG1ha2Ugbm8gcmVwcmVzZW50YXRpb25zCisgKiBhYm91dCB0aGUg c3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdCBpcyBwcm92 aWRlZCAiYXMKKyAqIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KKyAq CisgKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMgRElTQ0xBSU0gQUxMIFdBUlJBTlRJRVMgV0lUSCBS RUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKKyAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5U SUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8KKyAqIEVWRU5UIFNIQUxM IFRIRSBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVD VCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIg UkVTVUxUSU5HIEZST00gTE9TUyBPRiBVU0UsCisgKiBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIg SU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSCisgKiBUT1JUSU9V UyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9S IFBFUkZPUk1BTkNFCisgKiBPRiBUSElTIFNPRlRXQVJFLgorICovCisKKyNpbmNsdWRlIDxsaW51 eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lu aXQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+ CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVkZSA8ZHJtL2RybV9kcF9tc3RfaGVscGVy Lmg+CisjaW5jbHVkZSA8ZHJtL2RybVAuaD4KKworI2luY2x1ZGUgPGRybS9kcm1fZml4ZWQuaD4K KworLyoqCisgKiBET0M6IGRwIG1zdCBoZWxwZXIKKyAqCisgKiBUaGVzZSBmdW5jdGlvbnMgY29u dGFpbiBwYXJ0cyBvZiB0aGUgRGlzcGxheVBvcnQgMS4yYSBNdWx0aVN0cmVhbSBUcmFuc3BvcnQK KyAqIHByb3RvY29sLiBUaGUgaGVscGVycyBjb250YWluIGEgdG9wb2xvZ3kgbWFuYWdlciBhbmQg YmFuZHdpZHRoIG1hbmFnZXIuCisgKiBUaGUgaGVscGVycyBlbmNhcHN1bGF0ZSB0aGUgc2VuZGlu ZyBhbmQgcmVjZWl2ZWQgb2Ygc2lkZWJhbmQgbXNncy4KKyAqLworc3RhdGljIGludCB0ZXN0X2Nh bGNfcGJuX21vZGUodm9pZCk7CisKK3N0YXRpYyB2b2lkIGRybV9kcF9wdXRfcG9ydChzdHJ1Y3Qg ZHJtX2RwX21zdF9wb3J0ICpwb3J0KTsKKworc3RhdGljIGludCBkcm1fZHBfZHBjZF93cml0ZV9w YXlsb2FkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgICAgaW50 IGlkLAorCQkJCSAgICAgc3RydWN0IGRybV9kcF9wYXlsb2FkICpwYXlsb2FkKTsKKworc3RhdGlj IGludCBkcm1fZHBfc2VuZF9kcGNkX3dyaXRlKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21n ciAqbWdyLAorCQkJCSAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgIGludCBv ZmZzZXQsIGludCBzaXplLCB1OCAqYnl0ZXMpOworCitzdGF0aWMgaW50IGRybV9kcF9zZW5kX2xp bmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgICAg c3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiKTsKK3N0YXRpYyBpbnQgZHJtX2RwX3NlbmRf ZW51bV9wYXRoX3Jlc291cmNlcyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwK KwkJCQkJICAgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiLAorCQkJCQkgICBzdHJ1Y3Qg ZHJtX2RwX21zdF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBib29sIGRybV9kcF92YWxpZGF0ZV9ndWlk KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSB1OCAqZ3VpZCk7CisK K3N0YXRpYyBpbnQgZHJtX2RwX21zdF9yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4 ICphdXgpOworc3RhdGljIHZvaWQgZHJtX2RwX21zdF91bnJlZ2lzdGVyX2kyY19idXMoc3RydWN0 IGRybV9kcF9hdXggKmF1eCk7CitzdGF0aWMgdm9pZCBkcm1fZHBfbXN0X2tpY2tfdHgoc3RydWN0 IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpOworLyogc2lkZWJhbmQgbXNnIGhhbmRsaW5n ICovCitzdGF0aWMgdTggZHJtX2RwX21zZ19oZWFkZXJfY3JjNChjb25zdCB1aW50OF90ICpkYXRh LCBzaXplX3QgbnVtX25pYmJsZXMpCit7CisJdTggYml0bWFzayA9IDB4ODA7CisJdTggYml0c2hp ZnQgPSA3OworCXU4IGFycmF5X2luZGV4ID0gMDsKKwlpbnQgbnVtYmVyX29mX2JpdHMgPSBudW1f bmliYmxlcyAqIDQ7CisJdTggcmVtYWluZGVyID0gMDsKKworCXdoaWxlIChudW1iZXJfb2ZfYml0 cyAhPSAwKSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8PD0gMTsKKwkJcmVt YWluZGVyIHw9IChkYXRhW2FycmF5X2luZGV4XSAmIGJpdG1hc2spID4+IGJpdHNoaWZ0OworCQli aXRtYXNrID4+PSAxOworCQliaXRzaGlmdC0tOworCQlpZiAoYml0bWFzayA9PSAwKSB7CisJCQli aXRtYXNrID0gMHg4MDsKKwkJCWJpdHNoaWZ0ID0gNzsKKwkJCWFycmF5X2luZGV4Kys7CisJCX0K KwkJaWYgKChyZW1haW5kZXIgJiAweDEwKSA9PSAweDEwKQorCQkJcmVtYWluZGVyIF49IDB4MTM7 CisJfQorCisJbnVtYmVyX29mX2JpdHMgPSA0OworCXdoaWxlIChudW1iZXJfb2ZfYml0cyAhPSAw KSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8PD0gMTsKKwkJaWYgKChyZW1h aW5kZXIgJiAweDEwKSAhPSAwKQorCQkJcmVtYWluZGVyIF49IDB4MTM7CisJfQorCisJcmV0dXJu IHJlbWFpbmRlcjsKK30KKworc3RhdGljIHU4IGRybV9kcF9tc2dfZGF0YV9jcmM0KGNvbnN0IHVp bnQ4X3QgKmRhdGEsIHU4IG51bWJlcl9vZl9ieXRlcykKK3sKKwl1OCBiaXRtYXNrID0gMHg4MDsK Kwl1OCBiaXRzaGlmdCA9IDc7CisJdTggYXJyYXlfaW5kZXggPSAwOworCWludCBudW1iZXJfb2Zf Yml0cyA9IG51bWJlcl9vZl9ieXRlcyAqIDg7CisJdTE2IHJlbWFpbmRlciA9IDA7CisKKwl3aGls ZSAobnVtYmVyX29mX2JpdHMgIT0gMCkgeworCQludW1iZXJfb2ZfYml0cy0tOworCQlyZW1haW5k ZXIgPDw9IDE7CisJCXJlbWFpbmRlciB8PSAoZGF0YVthcnJheV9pbmRleF0gJiBiaXRtYXNrKSA+ PiBiaXRzaGlmdDsKKwkJYml0bWFzayA+Pj0gMTsKKwkJYml0c2hpZnQtLTsKKwkJaWYgKGJpdG1h c2sgPT0gMCkgeworCQkJYml0bWFzayA9IDB4ODA7CisJCQliaXRzaGlmdCA9IDc7CisJCQlhcnJh eV9pbmRleCsrOworCQl9CisJCWlmICgocmVtYWluZGVyICYgMHgxMDApID09IDB4MTAwKQorCQkJ cmVtYWluZGVyIF49IDB4ZDU7CisJfQorCisJbnVtYmVyX29mX2JpdHMgPSA4OworCXdoaWxlIChu dW1iZXJfb2ZfYml0cyAhPSAwKSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8 PD0gMTsKKwkJaWYgKChyZW1haW5kZXIgJiAweDEwMCkgIT0gMCkKKwkJCXJlbWFpbmRlciBePSAw eGQ1OworCX0KKworCXJldHVybiByZW1haW5kZXIgJiAweGZmOworfQorc3RhdGljIGlubGluZSB1 OCBkcm1fZHBfY2FsY19zYl9oZHJfc2l6ZShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIg KmhkcikKK3sKKwl1OCBzaXplID0gMzsKKwlzaXplICs9IChoZHItPmxjdCAvIDIpOworCXJldHVy biBzaXplOworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX21zZ19oZHIo c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyICpoZHIsCisJCQkJCSAgIHU4ICpidWYsIGlu dCAqbGVuKQoreworCWludCBpZHggPSAwOworCWludCBpOworCXU4IGNyYzQ7CisJYnVmW2lkeCsr XSA9ICgoaGRyLT5sY3QgJiAweGYpIDw8IDQpIHwgKGhkci0+bGNyICYgMHhmKTsKKwlmb3IgKGkg PSAwOyBpIDwgKGhkci0+bGN0IC8gMik7IGkrKykKKwkJYnVmW2lkeCsrXSA9IGhkci0+cmFkW2ld OworCWJ1ZltpZHgrK10gPSAoaGRyLT5icm9hZGNhc3QgPDwgNykgfCAoaGRyLT5wYXRoX21zZyA8 PCA2KSB8CisJCShoZHItPm1zZ19sZW4gJiAweDNmKTsKKwlidWZbaWR4KytdID0gKGhkci0+c29t dCA8PCA3KSB8IChoZHItPmVvbXQgPDwgNikgfCAoaGRyLT5zZXFubyA8PCA0KTsKKworCWNyYzQg PSBkcm1fZHBfbXNnX2hlYWRlcl9jcmM0KGJ1ZiwgKGlkeCAqIDIpIC0gMSk7CisJYnVmW2lkeCAt IDFdIHw9IChjcmM0ICYgMHhmKTsKKworCSpsZW4gPSBpZHg7Cit9CisKK3N0YXRpYyBib29sIGRy bV9kcF9kZWNvZGVfc2lkZWJhbmRfbXNnX2hkcihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19o ZHIgKmhkciwKKwkJCQkJICAgdTggKmJ1ZiwgaW50IGJ1ZmxlbiwgdTggKmhkcmxlbikKK3sKKwl1 OCBjcmM0OworCXU4IGxlbjsKKwlpbnQgaTsKKwl1OCBpZHg7CisJaWYgKGJ1ZlswXSA9PSAwKQor CQlyZXR1cm4gZmFsc2U7CisJbGVuID0gMzsKKwlsZW4gKz0gKChidWZbMF0gJiAweGYwKSA+PiA0 KSAvIDI7CisJaWYgKGxlbiA+IGJ1ZmxlbikKKwkJcmV0dXJuIGZhbHNlOworCWNyYzQgPSBkcm1f ZHBfbXNnX2hlYWRlcl9jcmM0KGJ1ZiwgKGxlbiAqIDIpIC0gMSk7CisKKwlpZiAoKGNyYzQgJiAw eGYpICE9IChidWZbbGVuIC0gMV0gJiAweGYpKSB7CisJCURSTV9ERUJVR19LTVMoImNyYzQgbWlz bWF0Y2ggMHgleCAweCV4XG4iLCBjcmM0LCBidWZbbGVuIC0gMV0pOworCQlyZXR1cm4gZmFsc2U7 CisJfQorCisJaGRyLT5sY3QgPSAoYnVmWzBdICYgMHhmMCkgPj4gNDsKKwloZHItPmxjciA9IChi dWZbMF0gJiAweGYpOworCWlkeCA9IDE7CisJZm9yIChpID0gMDsgaSA8IChoZHItPmxjdCAvIDIp OyBpKyspCisJCWhkci0+cmFkW2ldID0gYnVmW2lkeCsrXTsKKwloZHItPmJyb2FkY2FzdCA9IChi dWZbaWR4XSA+PiA3KSAmIDB4MTsKKwloZHItPnBhdGhfbXNnID0gKGJ1ZltpZHhdID4+IDYpICYg MHgxOworCWhkci0+bXNnX2xlbiA9IGJ1ZltpZHhdICYgMHgzZjsKKwlpZHgrKzsKKwloZHItPnNv bXQgPSAoYnVmW2lkeF0gPj4gNykgJiAweDE7CisJaGRyLT5lb210ID0gKGJ1ZltpZHhdID4+IDYp ICYgMHgxOworCWhkci0+c2Vxbm8gPSAoYnVmW2lkeF0gPj4gNCkgJiAweDE7CisJaWR4Kys7CisJ KmhkcmxlbiA9IGlkeDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX2Vu Y29kZV9zaWRlYmFuZF9yZXEoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKnJl cSwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnJhdykKK3sKKwlp bnQgaWR4ID0gMDsKKwlpbnQgaTsKKwl1OCAqYnVmID0gcmF3LT5tc2c7CisJYnVmW2lkeCsrXSA9 IHJlcS0+cmVxX3R5cGUgJiAweDdmOworCisJc3dpdGNoIChyZXEtPnJlcV90eXBlKSB7CisJY2Fz ZSBEUF9FTlVNX1BBVEhfUkVTT1VSQ0VTOgorCQlidWZbaWR4XSA9IChyZXEtPnUucG9ydF9udW0u cG9ydF9udW1iZXIgJiAweGYpIDw8IDQ7CisJCWlkeCsrOworCQlicmVhazsKKwljYXNlIERQX0FM TE9DQVRFX1BBWUxPQUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5hbGxvY2F0ZV9wYXlsb2FkLnBv cnRfbnVtYmVyICYgMHhmKSA8PCA0IHwKKwkJCShyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5udW1i ZXJfc2RwX3N0cmVhbXMgJiAweGYpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmFs bG9jYXRlX3BheWxvYWQudmNwaSAmIDB4N2YpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVx LT51LmFsbG9jYXRlX3BheWxvYWQucGJuID4+IDgpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAo cmVxLT51LmFsbG9jYXRlX3BheWxvYWQucGJuICYgMHhmZik7CisJCWlkeCsrOworCQlmb3IgKGkg PSAwOyBpIDwgcmVxLT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zIC8gMjsg aSsrKSB7CisJCQlidWZbaWR4XSA9ICgocmVxLT51LmFsbG9jYXRlX3BheWxvYWQuc2RwX3N0cmVh bV9zaW5rW2kgKiAyXSAmIDB4ZikgPDwgNCkgfAorCQkJCShyZXEtPnUuYWxsb2NhdGVfcGF5bG9h ZC5zZHBfc3RyZWFtX3NpbmtbaSAqIDIgKyAxXSAmIDB4Zik7CisJCQlpZHgrKzsKKwkJfQorCQlp ZiAocmVxLT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zICYgMSkgeworCQkJ aSA9IHJlcS0+dS5hbGxvY2F0ZV9wYXlsb2FkLm51bWJlcl9zZHBfc3RyZWFtcyAtIDE7CisJCQli dWZbaWR4XSA9IChyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5zZHBfc3RyZWFtX3NpbmtbaV0gJiAw eGYpIDw8IDQ7CisJCQlpZHgrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIERQX1FVRVJZX1BBWUxP QUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5xdWVyeV9wYXlsb2FkLnBvcnRfbnVtYmVyICYgMHhm KSA8PCA0OworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LnF1ZXJ5X3BheWxvYWQudmNw aSAmIDB4N2YpOworCQlpZHgrKzsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfRFBDRF9SRUFE OgorCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF9yZWFkLnBvcnRfbnVtYmVyICYgMHhmKSA8PCA0 OworCQlidWZbaWR4XSB8PSAoKHJlcS0+dS5kcGNkX3JlYWQuZHBjZF9hZGRyZXNzICYgMHhmMDAw MCkgPj4gMTYpICYgMHhmOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmRwY2RfcmVh ZC5kcGNkX2FkZHJlc3MgJiAweGZmMDApID4+IDg7CisJCWlkeCsrOworCQlidWZbaWR4XSA9IChy ZXEtPnUuZHBjZF9yZWFkLmRwY2RfYWRkcmVzcyAmIDB4ZmYpOworCQlpZHgrKzsKKwkJYnVmW2lk eF0gPSAocmVxLT51LmRwY2RfcmVhZC5udW1fYnl0ZXMpOworCQlpZHgrKzsKKwkJYnJlYWs7CisK KwljYXNlIERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93 cml0ZS5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJYnVmW2lkeF0gfD0gKChyZXEtPnUuZHBj ZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAweGYwMDAwKSA+PiAxNikgJiAweGY7CisJCWlkeCsrOwor CQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAweGZmMDApID4+ IDg7CisJCWlkeCsrOworCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2FkZHJl c3MgJiAweGZmKTsKKwkJaWR4Kys7CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5kcGNkX3dyaXRlLm51 bV9ieXRlcyk7CisJCWlkeCsrOworCQltZW1jcHkoJmJ1ZltpZHhdLCByZXEtPnUuZHBjZF93cml0 ZS5ieXRlcywgcmVxLT51LmRwY2Rfd3JpdGUubnVtX2J5dGVzKTsKKwkJaWR4ICs9IHJlcS0+dS5k cGNkX3dyaXRlLm51bV9ieXRlczsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfSTJDX1JFQUQ6 CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5pMmNfcmVhZC5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsK KwkJYnVmW2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC5udW1fdHJhbnNhY3Rpb25zICYgMHgzKTsK KwkJaWR4Kys7CisJCWZvciAoaSA9IDA7IGkgPCAocmVxLT51LmkyY19yZWFkLm51bV90cmFuc2Fj dGlvbnMgJiAweDMpOyBpKyspIHsKKwkJCWJ1ZltpZHhdID0gcmVxLT51LmkyY19yZWFkLnRyYW5z YWN0aW9uc1tpXS5pMmNfZGV2X2lkICYgMHg3ZjsKKwkJCWlkeCsrOworCQkJYnVmW2lkeF0gPSBy ZXEtPnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm51bV9ieXRlczsKKwkJCWlkeCsrOworCQkJ bWVtY3B5KCZidWZbaWR4XSwgcmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5ieXRlcywg cmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5udW1fYnl0ZXMpOworCQkJaWR4ICs9IHJl cS0+dS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0ubnVtX2J5dGVzOworCisJCQlidWZbaWR4XSA9 IChyZXEtPnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm5vX3N0b3BfYml0ICYgMHgxKSA8PCA1 OworCQkJYnVmW2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0uaTJjX3Ry YW5zYWN0aW9uX2RlbGF5ICYgMHhmKTsKKwkJCWlkeCsrOworCQl9CisJCWJ1ZltpZHhdID0gKHJl cS0+dS5pMmNfcmVhZC5yZWFkX2kyY19kZXZpY2VfaWQpICYgMHg3ZjsKKwkJaWR4Kys7CisJCWJ1 ZltpZHhdID0gKHJlcS0+dS5pMmNfcmVhZC5udW1fYnl0ZXNfcmVhZCk7CisJCWlkeCsrOworCQli cmVhazsKKworCWNhc2UgRFBfUkVNT1RFX0kyQ19XUklURToKKwkJYnVmW2lkeF0gPSAocmVxLT51 LmkyY193cml0ZS5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJaWR4Kys7CisJCWJ1ZltpZHhd ID0gKHJlcS0+dS5pMmNfd3JpdGUud3JpdGVfaTJjX2RldmljZV9pZCkgJiAweDdmOworCQlpZHgr KzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXMpOworCQlpZHgrKzsK KwkJbWVtY3B5KCZidWZbaWR4XSwgcmVxLT51LmkyY193cml0ZS5ieXRlcywgcmVxLT51LmkyY193 cml0ZS5udW1fYnl0ZXMpOworCQlpZHggKz0gcmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXM7CisJ CWJyZWFrOworCX0KKwlyYXctPmN1cl9sZW4gPSBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9k cF9jcmNfc2lkZWJhbmRfY2h1bmtfcmVxKHU4ICptc2csIHU4IGxlbikKK3sKKwl1OCBjcmM0Owor CWNyYzQgPSBkcm1fZHBfbXNnX2RhdGFfY3JjNChtc2csIGxlbik7CisJbXNnW2xlbl0gPSBjcmM0 OworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcGx5KHN0cnVjdCBk cm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcCwKKwkJCQkJIHN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX3R4ICpyYXcpCit7CisJaW50IGlkeCA9IDA7CisJdTggKmJ1ZiA9IHJhdy0+ bXNnOworCisJYnVmW2lkeCsrXSA9IChyZXAtPnJlcGx5X3R5cGUgJiAweDEpIDw8IDcgfCAocmVw LT5yZXFfdHlwZSAmIDB4N2YpOworCisJcmF3LT5jdXJfbGVuID0gaWR4OworfQorCisvKiB0aGlz IGFkZHMgYSBjaHVuayBvZiBtc2cgdG8gdGhlIGJ1aWxkZXIgdG8gZ2V0IHRoZSBmaW5hbCBtc2cg Ki8KK3N0YXRpYyBib29sIGRybV9kcF9zaWRlYmFuZF9tc2dfYnVpbGQoc3RydWN0IGRybV9kcF9z aWRlYmFuZF9tc2dfcnggKm1zZywKKwkJCQkgICAgICB1OCAqcmVwbHlidWYsIHU4IHJlcGx5YnVm bGVuLCBib29sIGhkcikKK3sKKwlpbnQgcmV0OworCXU4IGNyYzQ7CisKKwlpZiAoaGRyKSB7CisJ CXU4IGhkcmxlbjsKKwkJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyIHJlY3ZfaGRyOwor CQlyZXQgPSBkcm1fZHBfZGVjb2RlX3NpZGViYW5kX21zZ19oZHIoJnJlY3ZfaGRyLCByZXBseWJ1 ZiwgcmVwbHlidWZsZW4sICZoZHJsZW4pOworCQlpZiAocmV0ID09IGZhbHNlKSB7CisJCQlwcmlu dF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiZmFpbGVkIGhkciIsIERVTVBfUFJFRklYX05PTkUsIDE2 LCAxLCByZXBseWJ1ZiwgcmVwbHlidWZsZW4sIGZhbHNlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJ fQorCisJCS8qIGdldCBsZW5ndGggY29udGFpbmVkIGluIHRoaXMgcG9ydGlvbiAqLworCQltc2ct PmN1cmNodW5rX2xlbiA9IHJlY3ZfaGRyLm1zZ19sZW47CisJCW1zZy0+Y3VyY2h1bmtfaGRybGVu ID0gaGRybGVuOworCisJCS8qIHdlIGhhdmUgYWxyZWFkeSBnb3R0ZW4gYW4gc29tdCAtIGRvbid0 IGJvdGhlciBwYXJzaW5nICovCisJCWlmIChyZWN2X2hkci5zb210ICYmIG1zZy0+aGF2ZV9zb210 KQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChyZWN2X2hkci5zb210KSB7CisJCQltZW1jcHko Jm1zZy0+aW5pdGlhbF9oZHIsICZyZWN2X2hkciwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX2hkcikpOworCQkJbXNnLT5oYXZlX3NvbXQgPSB0cnVlOworCQl9CisJCWlmIChyZWN2 X2hkci5lb210KQorCQkJbXNnLT5oYXZlX2VvbXQgPSB0cnVlOworCisJCS8qIGNvcHkgdGhlIGJ5 dGVzIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoaXMgaGVhZGVyIGNodW5rICovCisJCW1zZy0+Y3Vy Y2h1bmtfaWR4ID0gbWluKG1zZy0+Y3VyY2h1bmtfbGVuLCAodTgpKHJlcGx5YnVmbGVuIC0gaGRy bGVuKSk7CisJCW1lbWNweSgmbXNnLT5jaHVua1swXSwgcmVwbHlidWYgKyBoZHJsZW4sIG1zZy0+ Y3VyY2h1bmtfaWR4KTsKKwl9IGVsc2UgeworCQltZW1jcHkoJm1zZy0+Y2h1bmtbbXNnLT5jdXJj aHVua19pZHhdLCByZXBseWJ1ZiwgcmVwbHlidWZsZW4pOworCQltc2ctPmN1cmNodW5rX2lkeCAr PSByZXBseWJ1ZmxlbjsKKwl9CisKKwlpZiAobXNnLT5jdXJjaHVua19pZHggPj0gbXNnLT5jdXJj aHVua19sZW4pIHsKKwkJLyogZG8gQ1JDICovCisJCWNyYzQgPSBkcm1fZHBfbXNnX2RhdGFfY3Jj NChtc2ctPmNodW5rLCBtc2ctPmN1cmNodW5rX2xlbiAtIDEpOworCQkvKiBjb3B5IGNodW5rIGlu dG8gYmlnZ2VyIG1zZyAqLworCQltZW1jcHkoJm1zZy0+bXNnW21zZy0+Y3VybGVuXSwgbXNnLT5j aHVuaywgbXNnLT5jdXJjaHVua19sZW4gLSAxKTsKKwkJbXNnLT5jdXJsZW4gKz0gbXNnLT5jdXJj aHVua19sZW4gLSAxOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZHJtX2Rw X3NpZGViYW5kX3BhcnNlX2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19y eCAqcmF3LAorCQkJCQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9k eSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOworCWludCBpOworCW1lbWNweShyZXBtc2ctPnUu bGlua19hZGRyLmd1aWQsICZyYXctPm1zZ1tpZHhdLCAxNik7CisJaWR4ICs9IDE2OworCXJlcG1z Zy0+dS5saW5rX2FkZHIubnBvcnRzID0gcmF3LT5tc2dbaWR4XSAmIDB4ZjsKKwlpZHgrKzsKKwlp ZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJZm9yIChpID0gMDsgaSA8 IHJlcG1zZy0+dS5saW5rX2FkZHIubnBvcnRzOyBpKyspIHsKKwkJaWYgKHJhdy0+bXNnW2lkeF0g JiAweDgwKQorCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5pbnB1dF9wb3J0ID0gMTsK KworCQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLnBlZXJfZGV2aWNlX3R5cGUgPSAocmF3 LT5tc2dbaWR4XSA+PiA0KSAmIDB4NzsKKwkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5w b3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKworCQlpZHgrKzsKKwkJaWYgKGlk eCA+IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwkJcmVwbXNnLT51LmxpbmtfYWRk ci5wb3J0c1tpXS5tY3MgPSAocmF3LT5tc2dbaWR4XSA+PiA3KSAmIDB4MTsKKwkJcmVwbXNnLT51 LmxpbmtfYWRkci5wb3J0c1tpXS5kZHBzID0gKHJhdy0+bXNnW2lkeF0gPj4gNikgJiAweDE7CisJ CWlmIChyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLmlucHV0X3BvcnQgPT0gMCkKKwkJCXJl cG1zZy0+dS5saW5rX2FkZHIucG9ydHNbaV0ubGVnYWN5X2RldmljZV9wbHVnX3N0YXR1cyA9IChy YXctPm1zZ1tpZHhdID4+IDUpICYgMHgxOworCQlpZHgrKzsKKwkJaWYgKGlkeCA+IHJhdy0+Y3Vy bGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwkJaWYgKHJlcG1zZy0+dS5saW5rX2FkZHIucG9ydHNb aV0uaW5wdXRfcG9ydCA9PSAwKSB7CisJCQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLmRw Y2RfcmV2aXNpb24gPSAocmF3LT5tc2dbaWR4XSk7CisJCQlpZHgrKzsKKwkJCWlmIChpZHggPiBy YXctPmN1cmxlbikKKwkJCQlnb3RvIGZhaWxfbGVuOworCQkJbWVtY3B5KHJlcG1zZy0+dS5saW5r X2FkZHIucG9ydHNbaV0ucGVlcl9ndWlkLCAmcmF3LT5tc2dbaWR4XSwgMTYpOworCQkJaWR4ICs9 IDE2OworCQkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJCWdvdG8gZmFpbF9sZW47CisJCQly ZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLm51bV9zZHBfc3RyZWFtcyA9IChyYXctPm1zZ1tp ZHhdID4+IDQpICYgMHhmOworCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5udW1fc2Rw X3N0cmVhbV9zaW5rcyA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKwkJCWlkeCsrOworCisJCX0K KwkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwl9CisKKwlyZXR1 cm4gdHJ1ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVzcyByZXBseSBw YXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZh bHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2RwY2Rf cmVhZChzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJICAgc3RydWN0 IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAx OworCXJlcG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5wb3J0X251bWJlciA9IHJhdy0+bXNn W2lkeF0gJiAweGY7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZh aWxfbGVuOworCXJlcG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5udW1fYnl0ZXMgPSByYXct Pm1zZ1tpZHhdOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsKKwor CW1lbWNweShyZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2suYnl0ZXMsICZyYXctPm1zZ1tp ZHhdLCByZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2subnVtX2J5dGVzKTsKKwlyZXR1cm4g dHJ1ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVzcyByZXBseSBwYXJz ZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNl OworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2RwY2Rfd3Jp dGUoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAgICAgIHN0cnVj dCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcG1zZykKK3sKKwlpbnQgaWR4ID0g MTsKKwlyZXBtc2ctPnUucmVtb3RlX2RwY2Rfd3JpdGVfYWNrLnBvcnRfbnVtYmVyID0gcmF3LT5t c2dbaWR4XSAmIDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8g ZmFpbF9sZW47CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlEUk1fREVCVUdfS01TKCJwYXJz ZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNl OworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2kyY19yZWFk X2FjayhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJICAgICAgc3Ry dWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHgg PSAxOworCisJcmVwbXNnLT51LnJlbW90ZV9pMmNfcmVhZF9hY2sucG9ydF9udW1iZXIgPSAocmF3 LT5tc2dbaWR4XSAmIDB4Zik7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQln b3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51bV9ieXRlcyA9 IHJhdy0+bXNnW2lkeF07CisJaWR4Kys7CisJLyogVE9ETyBjaGVjayAqLworCW1lbWNweShyZXBt c2ctPnUucmVtb3RlX2kyY19yZWFkX2Fjay5ieXRlcywgJnJhdy0+bXNnW2lkeF0sIHJlcG1zZy0+ dS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51bV9ieXRlcyk7CisJcmV0dXJuIHRydWU7CitmYWlsX2xl bjoKKwlEUk1fREVCVUdfS01TKCJyZW1vdGUgaTJjIHJlcGx5IHBhcnNlIGxlbmd0aCBmYWlsICVk ICVkXG4iLCBpZHgsIHJhdy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBi b29sIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9lbnVtX3BhdGhfcmVzb3VyY2VzX2FjayhzdHJ1Y3Qg ZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgc3RydWN0IGRybV9kcF9zaWRl YmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOworCXJlcG1zZy0+ dS5wYXRoX3Jlc291cmNlcy5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdID4+IDQpICYgMHhm OworCWlkeCsrOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsKKwly ZXBtc2ctPnUucGF0aF9yZXNvdXJjZXMuZnVsbF9wYXlsb2FkX2J3X251bWJlciA9IChyYXctPm1z Z1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJaWYgKGlkeCA+ IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5wYXRoX3Jlc291cmNl cy5hdmFpbF9wYXlsb2FkX2J3X251bWJlciA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+ bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3Rv IGZhaWxfbGVuOworCXJldHVybiB0cnVlOworZmFpbF9sZW46CisJRFJNX0RFQlVHX0tNUygiZW51 bSByZXNvdXJjZSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7 CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2Vf YWxsb2NhdGVfcGF5bG9hZF9hY2soc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywK KwkJCQkJCQkgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcG1zZykK K3sKKwlpbnQgaWR4ID0gMTsKKwlyZXBtc2ctPnUuYWxsb2NhdGVfcGF5bG9hZC5wb3J0X251bWJl ciA9IChyYXctPm1zZ1tpZHhdID4+IDQpICYgMHhmOworCWlkeCsrOworCWlmIChpZHggPiByYXct PmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsKKwlyZXBtc2ctPnUuYWxsb2NhdGVfcGF5bG9hZC52 Y3BpID0gcmF3LT5tc2dbaWR4XTsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJ CWdvdG8gZmFpbF9sZW47CisJcmVwbXNnLT51LmFsbG9jYXRlX3BheWxvYWQuYWxsb2NhdGVkX3Bi biA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7 CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJldHVybiB0cnVl OworZmFpbF9sZW46CisJRFJNX0RFQlVHX0tNUygiYWxsb2NhdGUgcGF5bG9hZCBwYXJzZSBsZW5n dGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQor CitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcXVlcnlfcGF5bG9hZF9hY2soc3Ry dWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAgICBzdHJ1Y3QgZHJtX2Rw X3NpZGViYW5kX21zZ19yZXBseV9ib2R5ICpyZXBtc2cpCit7CisJaW50IGlkeCA9IDE7CisJcmVw bXNnLT51LnF1ZXJ5X3BheWxvYWQucG9ydF9udW1iZXIgPSAocmF3LT5tc2dbaWR4XSA+PiA0KSAm IDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47 CisJcmVwbXNnLT51LnF1ZXJ5X3BheWxvYWQuYWxsb2NhdGVkX3BibiA9IChyYXctPm1zZ1tpZHhd IDw8IDgpIHwgKHJhdy0+bXNnW2lkeCArIDFdKTsKKwlpZHggKz0gMjsKKwlpZiAoaWR4ID4gcmF3 LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlE Uk1fREVCVUdfS01TKCJxdWVyeSBwYXlsb2FkIHBhcnNlIGxlbmd0aCBmYWlsICVkICVkXG4iLCBp ZHgsIHJhdy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGRybV9k cF9zaWRlYmFuZF9wYXJzZV9yZXBseShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3 LAorCQkJCQlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5ICptc2cpCit7CisJ bWVtc2V0KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKKwltc2ctPnJlcGx5X3R5cGUgPSAocmF3LT5t c2dbMF0gJiAweDgwKSA+PiA3OworCW1zZy0+cmVxX3R5cGUgPSAocmF3LT5tc2dbMF0gJiAweDdm KTsKKworCWlmIChtc2ctPnJlcGx5X3R5cGUpIHsKKwkJbWVtY3B5KG1zZy0+dS5uYWsuZ3VpZCwg JnJhdy0+bXNnWzFdLCAxNik7CisJCW1zZy0+dS5uYWsucmVhc29uID0gcmF3LT5tc2dbMTddOwor CQltc2ctPnUubmFrLm5ha19kYXRhID0gcmF3LT5tc2dbMThdOworCQlyZXR1cm4gZmFsc2U7CisJ fQorCisJc3dpdGNoIChtc2ctPnJlcV90eXBlKSB7CisJY2FzZSBEUF9MSU5LX0FERFJFU1M6CisJ CXJldHVybiBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfbGlua19hZGRyZXNzKHJhdywgbXNnKTsKKwlj YXNlIERQX1FVRVJZX1BBWUxPQUQ6CisJCXJldHVybiBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcXVl cnlfcGF5bG9hZF9hY2socmF3LCBtc2cpOworCWNhc2UgRFBfUkVNT1RFX0RQQ0RfUkVBRDoKKwkJ cmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfZHBjZF9yZWFkKHJhdywgbXNnKTsK KwljYXNlIERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5kX3Bh cnNlX3JlbW90ZV9kcGNkX3dyaXRlKHJhdywgbXNnKTsKKwljYXNlIERQX1JFTU9URV9JMkNfUkVB RDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfaTJjX3JlYWRfYWNrKHJh dywgbXNnKTsKKwljYXNlIERQX0VOVU1fUEFUSF9SRVNPVVJDRVM6CisJCXJldHVybiBkcm1fZHBf c2lkZWJhbmRfcGFyc2VfZW51bV9wYXRoX3Jlc291cmNlc19hY2socmF3LCBtc2cpOworCWNhc2Ug RFBfQUxMT0NBVEVfUEFZTE9BRDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9hbGxv Y2F0ZV9wYXlsb2FkX2FjayhyYXcsIG1zZyk7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJHb3Qg dW5rbm93biByZXBseSAweCUwMnhcbiIsIG1zZy0+cmVxX3R5cGUpOworCQlyZXR1cm4gZmFsc2U7 CisJfQorfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfY29ubmVjdGlvbl9z dGF0dXNfbm90aWZ5KHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4ICpyYXcsCisJCQkJCQkJ ICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKm1zZykKK3sKKwlpbnQgaWR4 ID0gMTsKKworCW1zZy0+dS5jb25uX3N0YXQucG9ydF9udW1iZXIgPSAocmF3LT5tc2dbaWR4XSAm IDB4ZjApID4+IDQ7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZh aWxfbGVuOworCisJbWVtY3B5KG1zZy0+dS5jb25uX3N0YXQuZ3VpZCwgJnJhdy0+bXNnW2lkeF0s IDE2KTsKKwlpZHggKz0gMTY7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxf bGVuOworCisJbXNnLT51LmNvbm5fc3RhdC5sZWdhY3lfZGV2aWNlX3BsdWdfc3RhdHVzID0gKHJh dy0+bXNnW2lkeF0gPj4gNikgJiAweDE7CisJbXNnLT51LmNvbm5fc3RhdC5kaXNwbGF5cG9ydF9k ZXZpY2VfcGx1Z19zdGF0dXMgPSAocmF3LT5tc2dbaWR4XSA+PiA1KSAmIDB4MTsKKwltc2ctPnUu Y29ubl9zdGF0Lm1lc3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXMgPSAocmF3LT5tc2dbaWR4XSA+PiA0 KSAmIDB4MTsKKwltc2ctPnUuY29ubl9zdGF0LmlucHV0X3BvcnQgPSAocmF3LT5tc2dbaWR4XSA+ PiAzKSAmIDB4MTsKKwltc2ctPnUuY29ubl9zdGF0LnBlZXJfZGV2aWNlX3R5cGUgPSAocmF3LT5t c2dbaWR4XSAmIDB4Nyk7CisJaWR4Kys7CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlEUk1f REVCVUdfS01TKCJjb25uZWN0aW9uIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGggZmFpbCAlZCAl ZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9v bCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVzb3VyY2Vfc3RhdHVzX25vdGlmeShzdHJ1Y3QgZHJt X2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgIHN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3JlcV9ib2R5ICptc2cpCit7CisJaW50IGlkeCA9IDE7CisKKwltc2ctPnUucmVzb3Vy Y2Vfc3RhdC5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmMCkgPj4gNDsKKwlpZHgr KzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisKKwltZW1jcHko bXNnLT51LnJlc291cmNlX3N0YXQuZ3VpZCwgJnJhdy0+bXNnW2lkeF0sIDE2KTsKKwlpZHggKz0g MTY7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCisJbXNnLT51 LnJlc291cmNlX3N0YXQuYXZhaWxhYmxlX3BibiA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJh dy0+bXNnW2lkeCArIDFdKTsKKwlpZHgrKzsKKwlyZXR1cm4gdHJ1ZTsKK2ZhaWxfbGVuOgorCURS TV9ERUJVR19LTVMoInJlc291cmNlIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGggZmFpbCAlZCAl ZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9v bCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVxKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4 ICpyYXcsCisJCQkJICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKm1z ZykKK3sKKwltZW1zZXQobXNnLCAwLCBzaXplb2YoKm1zZykpOworCW1zZy0+cmVxX3R5cGUgPSAo cmF3LT5tc2dbMF0gJiAweDdmKTsKKworCXN3aXRjaCAobXNnLT5yZXFfdHlwZSkgeworCWNhc2Ug RFBfQ09OTkVDVElPTl9TVEFUVVNfTk9USUZZOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5kX3Bh cnNlX2Nvbm5lY3Rpb25fc3RhdHVzX25vdGlmeShyYXcsIG1zZyk7CisJY2FzZSBEUF9SRVNPVVJD RV9TVEFUVVNfTk9USUZZOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5kX3BhcnNlX3Jlc291cmNl X3N0YXR1c19ub3RpZnkocmF3LCBtc2cpOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiR290IHVu a25vd24gcmVxdWVzdCAweCUwMnhcbiIsIG1zZy0+cmVxX3R5cGUpOworCQlyZXR1cm4gZmFsc2U7 CisJfQorfQorCitzdGF0aWMgaW50IGJ1aWxkX2RwY2Rfd3JpdGUoc3RydWN0IGRybV9kcF9zaWRl YmFuZF9tc2dfdHggKm1zZywgdTggcG9ydF9udW0sIHUzMiBvZmZzZXQsIHU4IG51bV9ieXRlcywg dTggKmJ5dGVzKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsK KworCXJlcS5yZXFfdHlwZSA9IERQX1JFTU9URV9EUENEX1dSSVRFOworCXJlcS51LmRwY2Rfd3Jp dGUucG9ydF9udW1iZXIgPSBwb3J0X251bTsKKwlyZXEudS5kcGNkX3dyaXRlLmRwY2RfYWRkcmVz cyA9IG9mZnNldDsKKwlyZXEudS5kcGNkX3dyaXRlLm51bV9ieXRlcyA9IG51bV9ieXRlczsKKwlt ZW1jcHkocmVxLnUuZHBjZF93cml0ZS5ieXRlcywgYnl0ZXMsIG51bV9ieXRlcyk7CisJZHJtX2Rw X2VuY29kZV9zaWRlYmFuZF9yZXEoJnJlcSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGJ1aWxkX2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAq bXNnKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKworCXJl cS5yZXFfdHlwZSA9IERQX0xJTktfQUREUkVTUzsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3Jl cSgmcmVxLCBtc2cpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2VudW1fcGF0 aF9yZXNvdXJjZXMoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1zZywgaW50IHBvcnRf bnVtKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKworCXJl cS5yZXFfdHlwZSA9IERQX0VOVU1fUEFUSF9SRVNPVVJDRVM7CisJcmVxLnUucG9ydF9udW0ucG9y dF9udW1iZXIgPSBwb3J0X251bTsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcSgmcmVxLCBt c2cpOworCW1zZy0+cGF0aF9tc2cgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGJ1aWxkX2FsbG9jYXRlX3BheWxvYWQoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1z ZywgaW50IHBvcnRfbnVtLAorCQkJCSAgdTggdmNwaSwgdWludDE2X3QgcGJuKQoreworCXN0cnVj dCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKwltZW1zZXQoJnJlcSwgMCwgc2l6 ZW9mKHJlcSkpOworCXJlcS5yZXFfdHlwZSA9IERQX0FMTE9DQVRFX1BBWUxPQUQ7CisJcmVxLnUu YWxsb2NhdGVfcGF5bG9hZC5wb3J0X251bWJlciA9IHBvcnRfbnVtOworCXJlcS51LmFsbG9jYXRl X3BheWxvYWQudmNwaSA9IHZjcGk7CisJcmVxLnUuYWxsb2NhdGVfcGF5bG9hZC5wYm4gPSBwYm47 CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9yZXEoJnJlcSwgbXNnKTsKKwltc2ctPnBhdGhfbXNn ID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcm1fZHBfbXN0X2Fzc2lnbl9w YXlsb2FkX2lkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCQlzdHJ1 Y3QgZHJtX2RwX3ZjcGkgKnZjcGkpCit7CisJaW50IHJldDsKKworCXNwaW5fbG9jaygmbWdyLT5w YXlsb2FkX2xvY2spOworCXJldCA9IGZpbmRfZmlyc3RfemVyb19iaXQoJm1nci0+cGF5bG9hZF9t YXNrLCBEUF9NQVhfUEFZTE9BRCk7CisJaWYgKHJldCA+IG1nci0+bWF4X3BheWxvYWRzKSB7CisJ CURSTV9ERUJVR19LTVMoIm91dCBvZiBwYXlsb2FkIGlkcyAlZFxuIiwgcmV0KTsKKwkJc3Bpbl91 bmxvY2soJm1nci0+cGF5bG9hZF9sb2NrKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJc2V0 X2JpdChyZXQsICZtZ3ItPnBheWxvYWRfbWFzayk7CisJdmNwaS0+dmNwaSA9IHJldDsKKwltZ3It PnByb3Bvc2VkX3ZjcGlzW3JldF0gPSB2Y3BpOworCXNwaW5fdW5sb2NrKCZtZ3ItPnBheWxvYWRf bG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX21zdF9wdXRfcGF5 bG9hZF9pZChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgICAgICBp bnQgaWQpCit7CisJc3Bpbl9sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJY2xlYXJfYml0KGlk LCAmbWdyLT5wYXlsb2FkX21hc2spOworCW1nci0+cHJvcG9zZWRfdmNwaXNbaWRdID0gTlVMTDsK KwlzcGluX3VubG9jaygmbWdyLT5wYXlsb2FkX2xvY2spOworfQorCitzdGF0aWMgYm9vbCBjaGVj a190eG1zZ19zdGF0ZShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCSAg ICAgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZykKK3sKKwlib29sIHJldDsK KwltdXRleF9sb2NrKCZtZ3ItPnFsb2NrKTsKKwlyZXQgPSAodHhtc2ctPnN0YXRlID09IERSTV9E UF9TSURFQkFORF9UWF9SWCB8fAorCSAgICAgICB0eG1zZy0+c3RhdGUgPT0gRFJNX0RQX1NJREVC QU5EX1RYX1RJTUVPVVQpOworCURSTV9ERUJVR19LTVMoInR4bXNnIHN0YXRlICVwICVkICVkICVk ICVkXG4iLCB0eG1zZywgdHhtc2ctPnN0YXRlLCB0eG1zZy0+Y3VyX2xlbiwgdHhtc2ctPmN1cl9v ZmZzZXQsIG1nci0+dHhfZG93bl9pbl9wcm9ncmVzcyk7CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPnFs b2NrKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRybV9kcF9tc3Rfd2FpdF90eF9y ZXBseShzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkJICAgIHN0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZykKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9n eV9tZ3IgKm1nciA9IG1zdGItPm1ncjsKKwlpbnQgcmV0OworCisJcmV0ID0gd2FpdF9ldmVudF90 aW1lb3V0KG1nci0+dHhfd2FpdHEsCisJCQkJIGNoZWNrX3R4bXNnX3N0YXRlKG1nciwgdHhtc2cp LAorCQkJCSAoNCAqIEhaKSk7CisJbXV0ZXhfbG9jaygmbXN0Yi0+bWdyLT5xbG9jayk7CisJaWYg KHJldCA+IDApIHsKKwkJaWYgKHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJBTkRfVFhfVElN RU9VVCkgeworCQkJcmV0ID0gLUVJTzsKKwkJCWdvdG8gb3V0OworCQl9CisJfSBlbHNlIHsKKwkJ RFJNX0RFQlVHX0tNUygidGltZWRvdXQgbXNnIHNlbmQgJXAgJWQgJWRcbiIsIHR4bXNnLCB0eG1z Zy0+c3RhdGUsIHR4bXNnLT5zZXFubyk7CisKKwkJLyogZHVtcCBzb21lIHN0YXRlICovCisJCXJl dCA9IC1FSU87CisKKwkJLyogcmVtb3ZlIGZyb20gcSAqLworCQlpZiAodHhtc2ctPnN0YXRlID09 IERSTV9EUF9TSURFQkFORF9UWF9RVUVVRUQgfHwKKwkJICAgIHR4bXNnLT5zdGF0ZSA9PSBEUk1f RFBfU0lERUJBTkRfVFhfU1RBUlRfU0VORCkgeworCQkJbGlzdF9kZWwoJnR4bXNnLT5uZXh0KTsK KwkJfQorCisJCWlmICh0eG1zZy0+c3RhdGUgPT0gRFJNX0RQX1NJREVCQU5EX1RYX1NUQVJUX1NF TkQgfHwKKwkJICAgIHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJBTkRfVFhfU0VOVCkgewor CQkJbXN0Yi0+dHhfc2xvdHNbdHhtc2ctPnNlcW5vXSA9IE5VTEw7CisJCX0KKwl9CitvdXQ6CisJ bXV0ZXhfdW5sb2NrKCZtZ3ItPnFsb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKmRybV9kcF9hZGRfbXN0X2JyYW5jaF9kZXZpY2UodTgg bGN0LCB1OCAqcmFkKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YjsKKworCW1z dGIgPSBremFsbG9jKHNpemVvZigqbXN0YiksIEdGUF9LRVJORUwpOworCWlmICghbXN0YikKKwkJ cmV0dXJuIE5VTEw7CisKKwltc3RiLT5sY3QgPSBsY3Q7CisJaWYgKGxjdCA+IDEpCisJCW1lbWNw eShtc3RiLT5yYWQsIHJhZCwgbGN0IC8gMik7CisJSU5JVF9MSVNUX0hFQUQoJm1zdGItPnBvcnRz KTsKKwlrcmVmX2luaXQoJm1zdGItPmtyZWYpOworCXJldHVybiBtc3RiOworfQorCitzdGF0aWMg dm9pZCBkcm1fZHBfZGVzdHJveV9tc3RfYnJhbmNoX2RldmljZShzdHJ1Y3Qga3JlZiAqa3JlZikK K3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIgPSBjb250YWluZXJfb2Yoa3JlZiwg c3RydWN0IGRybV9kcF9tc3RfYnJhbmNoLCBrcmVmKTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0 ICpwb3J0LCAqdG1wOworCWJvb2wgd2FrZV90eCA9IGZhbHNlOworCisJY2FuY2VsX3dvcmtfc3lu YygmbXN0Yi0+bWdyLT53b3JrKTsKKworCS8qIGRlc3Ryb3kgYWxsIHBvcnRzICovCisJbXV0ZXhf bG9jaygmbXN0Yi0+bWdyLT5sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwg dG1wLCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsKKwkJbGlzdF9kZWwoJnBvcnQtPm5leHQpOworCQlk cm1fZHBfcHV0X3BvcnQocG9ydCk7CisJfQorCW11dGV4X3VubG9jaygmbXN0Yi0+bWdyLT5sb2Nr KTsKKworCS8qIGRyb3AgYW55IHR4IHNsb3RzIG1zZyAqLworCW11dGV4X2xvY2soJm1zdGItPm1n ci0+cWxvY2spOworCWlmIChtc3RiLT50eF9zbG90c1swXSkgeworCQltc3RiLT50eF9zbG90c1sw XS0+c3RhdGUgPSBEUk1fRFBfU0lERUJBTkRfVFhfVElNRU9VVDsKKwkJbXN0Yi0+dHhfc2xvdHNb MF0gPSBOVUxMOworCQl3YWtlX3R4ID0gdHJ1ZTsKKwl9CisJaWYgKG1zdGItPnR4X3Nsb3RzWzFd KSB7CisJCW1zdGItPnR4X3Nsb3RzWzFdLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9UWF9USU1F T1VUOworCQltc3RiLT50eF9zbG90c1sxXSA9IE5VTEw7CisJCXdha2VfdHggPSB0cnVlOworCX0K KwltdXRleF91bmxvY2soJm1zdGItPm1nci0+cWxvY2spOworCisJaWYgKHdha2VfdHgpCisJCXdh a2VfdXAoJm1zdGItPm1nci0+dHhfd2FpdHEpOworCWtmcmVlKG1zdGIpOworfQorCitzdGF0aWMg dm9pZCBkcm1fZHBfcHV0X21zdF9icmFuY2hfZGV2aWNlKHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5j aCAqbXN0YikKK3sKKwlrcmVmX3B1dCgmbXN0Yi0+a3JlZiwgZHJtX2RwX2Rlc3Ryb3lfbXN0X2Jy YW5jaF9kZXZpY2UpOworfQorCisKK3N0YXRpYyB2b2lkIGRybV9kcF9wb3J0X3RlYXJkb3duX3Bk dChzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LCBpbnQgb2xkX3BkdCkKK3sKKwlzd2l0Y2gg KG9sZF9wZHQpIHsKKwljYXNlIERQX1BFRVJfREVWSUNFX0RQX0xFR0FDWV9DT05WOgorCWNhc2Ug RFBfUEVFUl9ERVZJQ0VfU1NUX1NJTks6CisJCS8qIHJlbW92ZSBpMmMgb3ZlciBzaWRlYmFuZCAq LworCQlkcm1fZHBfbXN0X3VucmVnaXN0ZXJfaTJjX2J1cygmcG9ydC0+YXV4KTsKKwkJYnJlYWs7 CisJY2FzZSBEUF9QRUVSX0RFVklDRV9NU1RfQlJBTkNISU5HOgorCQlkcm1fZHBfcHV0X21zdF9i cmFuY2hfZGV2aWNlKHBvcnQtPm1zdGIpOworCQlwb3J0LT5tc3RiID0gTlVMTDsKKwkJYnJlYWs7 CisJfQorfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZGVzdHJveV9wb3J0KHN0cnVjdCBrcmVmICpr cmVmKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQgPSBjb250YWluZXJfb2Yoa3Jl Ziwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCwga3JlZik7CisJc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyICptZ3IgPSBwb3J0LT5tZ3I7CisJaWYgKHBvcnQtPmNvbm5lY3RvcikKKwkJKCpw b3J0LT5tZ3ItPmNicy0+ZGVzdHJveV9jb25uZWN0b3IpKG1nciwgcG9ydC0+Y29ubmVjdG9yKTsK Kwlkcm1fZHBfcG9ydF90ZWFyZG93bl9wZHQocG9ydCwgcG9ydC0+cGR0KTsKKwlrZnJlZShwb3J0 KTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX3B1dF9wb3J0KHN0cnVjdCBkcm1fZHBfbXN0X3Bv cnQgKnBvcnQpCit7CisJa3JlZl9wdXQoJnBvcnQtPmtyZWYsIGRybV9kcF9kZXN0cm95X3BvcnQp OworfQorCitzdGF0aWMgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICpkcm1fZHBfbXN0X2dldF92 YWxpZGF0ZWRfbXN0Yl9yZWZfbG9ja2VkKHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0Yiwg c3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICp0b19maW5kKQoreworCXN0cnVjdCBkcm1fZHBfbXN0 X3BvcnQgKnBvcnQ7CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICpybXN0YjsKKwlpZiAodG9f ZmluZCA9PSBtc3RiKSB7CisJCWtyZWZfZ2V0KCZtc3RiLT5rcmVmKTsKKwkJcmV0dXJuIG1zdGI7 CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJm1zdGItPnBvcnRzLCBuZXh0KSB7CisJ CWlmIChwb3J0LT5tc3RiKSB7CisJCQlybXN0YiA9IGRybV9kcF9tc3RfZ2V0X3ZhbGlkYXRlZF9t c3RiX3JlZl9sb2NrZWQocG9ydC0+bXN0YiwgdG9fZmluZCk7CisJCQlpZiAocm1zdGIpCisJCQkJ cmV0dXJuIHJtc3RiOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0 IGRybV9kcF9tc3RfYnJhbmNoICpkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9tc3RiX3JlZihzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICpt c3RiKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqcm1zdGIgPSBOVUxMOworCW11dGV4 X2xvY2soJm1nci0+bG9jayk7CisJaWYgKG1nci0+bXN0X3ByaW1hcnkpCisJCXJtc3RiID0gZHJt X2RwX21zdF9nZXRfdmFsaWRhdGVkX21zdGJfcmVmX2xvY2tlZChtZ3ItPm1zdF9wcmltYXJ5LCBt c3RiKTsKKwltdXRleF91bmxvY2soJm1nci0+bG9jayk7CisJcmV0dXJuIHJtc3RiOworfQorCitz dGF0aWMgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqZHJtX2RwX21zdF9nZXRfcG9ydF9yZWZfbG9j a2VkKHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0Yiwgc3RydWN0IGRybV9kcF9tc3RfcG9y dCAqdG9fZmluZCkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LCAqbXBvcnQ7CisK KwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZtc3RiLT5wb3J0cywgbmV4dCkgeworCQlpZiAo cG9ydCA9PSB0b19maW5kKSB7CisJCQlrcmVmX2dldCgmcG9ydC0+a3JlZik7CisJCQlyZXR1cm4g cG9ydDsKKwkJfQorCQlpZiAocG9ydC0+bXN0YikgeworCQkJbXBvcnQgPSBkcm1fZHBfbXN0X2dl dF9wb3J0X3JlZl9sb2NrZWQocG9ydC0+bXN0YiwgdG9fZmluZCk7CisJCQlpZiAobXBvcnQpCisJ CQkJcmV0dXJuIG1wb3J0OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3Ry dWN0IGRybV9kcF9tc3RfcG9ydCAqZHJtX2RwX2dldF92YWxpZGF0ZWRfcG9ydF9yZWYoc3RydWN0 IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBv cnQpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcnBvcnQgPSBOVUxMOworCW11dGV4X2xv Y2soJm1nci0+bG9jayk7CisJaWYgKG1nci0+bXN0X3ByaW1hcnkpCisJCXJwb3J0ID0gZHJtX2Rw X21zdF9nZXRfcG9ydF9yZWZfbG9ja2VkKG1nci0+bXN0X3ByaW1hcnksIHBvcnQpOworCW11dGV4 X3VubG9jaygmbWdyLT5sb2NrKTsKKwlyZXR1cm4gcnBvcnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qg ZHJtX2RwX21zdF9wb3J0ICpkcm1fZHBfZ2V0X3BvcnQoc3RydWN0IGRybV9kcF9tc3RfYnJhbmNo ICptc3RiLCB1OCBwb3J0X251bSkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0Owor CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsKKwkJaWYg KHBvcnQtPnBvcnRfbnVtID09IHBvcnRfbnVtKSB7CisJCQlrcmVmX2dldCgmcG9ydC0+a3JlZik7 CisJCQlyZXR1cm4gcG9ydDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICog Y2FsY3VsYXRlIGEgbmV3IFJBRCBmb3IgdGhpcyBNU1QgYnJhbmNoIGRldmljZQorICogaWYgcGFy ZW50IGhhcyBhbiBMQ1Qgb2YgMiB0aGVuIGl0IGhhcyAxIG5pYmJsZSBvZiBSQUQsCisgKiBpZiBw YXJlbnQgaGFzIGFuIExDVCBvZiAzIHRoZW4gaXQgaGFzIDIgbmliYmxlcyBvZiBSQUQsCisgKi8K K3N0YXRpYyB1OCBkcm1fZHBfY2FsY3VsYXRlX3JhZChzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpw b3J0LAorCQkJCSB1OCAqcmFkKQoreworCWludCBsY3QgPSBwb3J0LT5wYXJlbnQtPmxjdDsKKwlp bnQgc2hpZnQgPSA0OworCWludCBpZHggPSBsY3QgLyAyOworCWlmIChsY3QgPiAxKSB7CisJCW1l bWNweShyYWQsIHBvcnQtPnBhcmVudC0+cmFkLCBpZHgpOworCQlzaGlmdCA9IChsY3QgJSAyKSA/ IDQgOiAwOworCX0gZWxzZQorCQlyYWRbMF0gPSAwOworCisJcmFkW2lkeF0gfD0gcG9ydC0+cG9y dF9udW0gPDwgc2hpZnQ7CisJcmV0dXJuIGxjdCArIDE7Cit9CisKKy8qCisgKiByZXR1cm4gc2Vu ZHMgbGluayBhZGRyZXNzIGZvciBuZXcgbXN0YgorICovCitzdGF0aWMgYm9vbCBkcm1fZHBfcG9y dF9zZXR1cF9wZHQoc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCkKK3sKKwlpbnQgcmV0Owor CXU4IHJhZFs2XSwgbGN0OworCWJvb2wgc2VuZF9saW5rID0gZmFsc2U7CisJc3dpdGNoIChwb3J0 LT5wZHQpIHsKKwljYXNlIERQX1BFRVJfREVWSUNFX0RQX0xFR0FDWV9DT05WOgorCWNhc2UgRFBf UEVFUl9ERVZJQ0VfU1NUX1NJTks6CisJCS8qIGFkZCBpMmMgb3ZlciBzaWRlYmFuZCAqLworCQly ZXQgPSBkcm1fZHBfbXN0X3JlZ2lzdGVyX2kyY19idXMoJnBvcnQtPmF1eCk7CisJCWJyZWFrOwor CWNhc2UgRFBfUEVFUl9ERVZJQ0VfTVNUX0JSQU5DSElORzoKKwkJbGN0ID0gZHJtX2RwX2NhbGN1 bGF0ZV9yYWQocG9ydCwgcmFkKTsKKworCQlwb3J0LT5tc3RiID0gZHJtX2RwX2FkZF9tc3RfYnJh bmNoX2RldmljZShsY3QsIHJhZCk7CisJCXBvcnQtPm1zdGItPm1nciA9IHBvcnQtPm1ncjsKKwkJ cG9ydC0+bXN0Yi0+cG9ydF9wYXJlbnQgPSBwb3J0OworCisJCXNlbmRfbGluayA9IHRydWU7CisJ CWJyZWFrOworCX0KKwlyZXR1cm4gc2VuZF9saW5rOworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBf Y2hlY2tfcG9ydF9ndWlkKHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCQkgICBz dHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQoreworCWludCByZXQ7CisJaWYgKHBvcnQtPmRw Y2RfcmV2ID49IDB4MTIpIHsKKwkJcG9ydC0+Z3VpZF92YWxpZCA9IGRybV9kcF92YWxpZGF0ZV9n dWlkKG1zdGItPm1nciwgcG9ydC0+Z3VpZCk7CisJCWlmICghcG9ydC0+Z3VpZF92YWxpZCkgewor CQkJcmV0ID0gZHJtX2RwX3NlbmRfZHBjZF93cml0ZShtc3RiLT5tZ3IsCisJCQkJCQkgICAgIHBv cnQsCisJCQkJCQkgICAgIERQX0dVSUQsCisJCQkJCQkgICAgIDE2LCBwb3J0LT5ndWlkKTsKKwkJ CXBvcnQtPmd1aWRfdmFsaWQgPSB0cnVlOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBidWls ZF9tc3RfcHJvcF9wYXRoKHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsCisJCQkJc3RydWN0 IGRybV9kcF9tc3RfYnJhbmNoICptc3RiLAorCQkJCWNoYXIgKnByb3BwYXRoKQoreworCWludCBp OworCWNoYXIgdGVtcFs4XTsKKwlzbnByaW50Zihwcm9wcGF0aCwgMjU1LCAibXN0OiVkIiwgbXN0 Yi0+bWdyLT5jb25uX2Jhc2VfaWQpOworCWZvciAoaSA9IDA7IGkgPCAobXN0Yi0+bGN0IC0gMSk7 IGkrKykgeworCQlpbnQgc2hpZnQgPSAoaSAlIDIpID8gMCA6IDQ7CisJCWludCBwb3J0X251bSA9 IG1zdGItPnJhZFtpIC8gMl0gPj4gc2hpZnQ7CisJCXNucHJpbnRmKHRlbXAsIDgsICItJWQiLCBw b3J0X251bSk7CisJCXN0cm5jYXQocHJvcHBhdGgsIHRlbXAsIDI1NSk7CisJfQorCXNucHJpbnRm KHRlbXAsIDgsICItJWQiLCBwb3J0LT5wb3J0X251bSk7CisJc3RybmNhdChwcm9wcGF0aCwgdGVt cCwgMjU1KTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX2FkZF9wb3J0KHN0cnVjdCBkcm1fZHBf bXN0X2JyYW5jaCAqbXN0YiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3Ry dWN0IGRybV9kcF9saW5rX2FkZHJfcmVwbHlfcG9ydCAqcG9ydF9tc2cpCit7CisJc3RydWN0IGRy bV9kcF9tc3RfcG9ydCAqcG9ydDsKKwlib29sIHJldDsKKworCXBvcnQgPSBremFsbG9jKHNpemVv ZigqcG9ydCksIEdGUF9LRVJORUwpOworCWlmICghcG9ydCkKKwkJcmV0dXJuOworCisJa3JlZl9p bml0KCZwb3J0LT5rcmVmKTsKKwlwb3J0LT5wYXJlbnQgPSBtc3RiOworCXBvcnQtPnBvcnRfbnVt ID0gcG9ydF9tc2ctPnBvcnRfbnVtYmVyOworCXBvcnQtPnBkdCA9IHBvcnRfbXNnLT5wZWVyX2Rl dmljZV90eXBlOworCXBvcnQtPmlucHV0ID0gcG9ydF9tc2ctPmlucHV0X3BvcnQ7CisJcG9ydC0+ bWNzID0gcG9ydF9tc2ctPm1jczsKKwlwb3J0LT5kZHBzID0gcG9ydF9tc2ctPmRkcHM7CisJcG9y dC0+bGRwcyA9IHBvcnRfbXNnLT5sZWdhY3lfZGV2aWNlX3BsdWdfc3RhdHVzOworCXBvcnQtPmRw Y2RfcmV2ID0gcG9ydF9tc2ctPmRwY2RfcmV2aXNpb247CisJcG9ydC0+bWdyID0gbXN0Yi0+bWdy OworCW1lbWNweShwb3J0LT5ndWlkLCBwb3J0X21zZy0+cGVlcl9ndWlkLCAxNik7CisKKwlwb3J0 LT5hdXgubmFtZSA9ICJEUE1TVCI7CisJcG9ydC0+YXV4LmRldiA9IGRldjsKKworCS8qIG1hbmFn ZSBtc3RiIHBvcnQgbGlzdHMgd2l0aCBtZ3IgbG9jayAtIHRha2UgYSByZWZlcmVuY2UKKwkgICBm b3IgdGhpcyBsaXN0ICovCisJbXV0ZXhfbG9jaygmbXN0Yi0+bWdyLT5sb2NrKTsKKwlrcmVmX2dl dCgmcG9ydC0+a3JlZik7CisJbGlzdF9hZGQoJnBvcnQtPm5leHQsICZtc3RiLT5wb3J0cyk7CisJ bXV0ZXhfdW5sb2NrKCZtc3RiLT5tZ3ItPmxvY2spOworCisJaWYgKHBvcnQtPmRkcHMpIHsKKwkJ ZHJtX2RwX2NoZWNrX3BvcnRfZ3VpZChtc3RiLCBwb3J0KTsKKworCQlpZiAoIXBvcnQtPmlucHV0 KSB7CisJCQlkcm1fZHBfc2VuZF9lbnVtX3BhdGhfcmVzb3VyY2VzKG1zdGItPm1nciwgbXN0Yiwg cG9ydCk7CisKKwkJCXJldCA9IGRybV9kcF9wb3J0X3NldHVwX3BkdChwb3J0KTsKKwkJCWlmIChy ZXQgPT0gdHJ1ZSkgeworCQkJCWRybV9kcF9zZW5kX2xpbmtfYWRkcmVzcyhtc3RiLT5tZ3IsIHBv cnQtPm1zdGIpOworCQkJCXBvcnQtPm1zdGItPmxpbmtfYWRkcmVzc19zZW50ID0gdHJ1ZTsKKwkJ CX0KKwkJfQorCX0KKworCWlmICghcG9ydC0+aW5wdXQpIHsKKwkJY2hhciBwcm9wcGF0aFsyNTVd OworCQlidWlsZF9tc3RfcHJvcF9wYXRoKHBvcnQsIG1zdGIsIHByb3BwYXRoKTsKKwkJcG9ydC0+ Y29ubmVjdG9yID0gKCptc3RiLT5tZ3ItPmNicy0+YWRkX2Nvbm5lY3RvcikobXN0Yi0+bWdyLCBw b3J0LCBwcm9wcGF0aCk7CisJfQorCisJLyogcHV0IHJlZmVyZW5jZSB0byB0aGlzIHBvcnQgKi8K Kwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF91cGRhdGVf cG9ydChzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkgICAgICAgc3RydWN0IGRy bV9kcF9jb25uZWN0aW9uX3N0YXR1c19ub3RpZnkgKmNvbm5fc3RhdCkKK3sKKwlzdHJ1Y3QgZHJt X2RwX21zdF9wb3J0ICpwb3J0OworCWludCBvbGRfcGR0OworCWludCBvbGRfZGRwczsKKwlib29s IGRvd29yayA9IGZhbHNlOworCXBvcnQgPSBkcm1fZHBfZ2V0X3BvcnQobXN0YiwgY29ubl9zdGF0 LT5wb3J0X251bWJlcik7CisJaWYgKCFwb3J0KQorCQlyZXR1cm47CisKKwlvbGRfZGRwcyA9IHBv cnQtPmRkcHM7CisJb2xkX3BkdCA9IHBvcnQtPnBkdDsKKwlwb3J0LT5wZHQgPSBjb25uX3N0YXQt PnBlZXJfZGV2aWNlX3R5cGU7CisJcG9ydC0+bWNzID0gY29ubl9zdGF0LT5tZXNzYWdlX2NhcGFi aWxpdHlfc3RhdHVzOworCXBvcnQtPmxkcHMgPSBjb25uX3N0YXQtPmxlZ2FjeV9kZXZpY2VfcGx1 Z19zdGF0dXM7CisJcG9ydC0+ZGRwcyA9IGNvbm5fc3RhdC0+ZGlzcGxheXBvcnRfZGV2aWNlX3Bs dWdfc3RhdHVzOworCisJaWYgKG9sZF9kZHBzICE9IHBvcnQtPmRkcHMpIHsKKwkJaWYgKHBvcnQt PmRkcHMpIHsKKwkJCWRybV9kcF9jaGVja19wb3J0X2d1aWQobXN0YiwgcG9ydCk7CisJCQlkb3dv cmsgPSB0cnVlOworCQl9IGVsc2UgeworCQkJcG9ydC0+Z3VpZF92YWxpZCA9IGZhbHNlOworCQkJ cG9ydC0+YXZhaWxhYmxlX3BibiA9IDA7CisJCX0KKwl9CisJaWYgKG9sZF9wZHQgIT0gcG9ydC0+ cGR0ICYmICFwb3J0LT5pbnB1dCkgeworCQlkcm1fZHBfcG9ydF90ZWFyZG93bl9wZHQocG9ydCwg b2xkX3BkdCk7CisKKwkJaWYgKGRybV9kcF9wb3J0X3NldHVwX3BkdChwb3J0KSkKKwkJCWRvd29y ayA9IHRydWU7CisJfQorCisJZHJtX2RwX3B1dF9wb3J0KHBvcnQpOworCWlmIChkb3dvcmspCisJ CXF1ZXVlX3dvcmsoc3lzdGVtX2xvbmdfd3EsICZtc3RiLT5tZ3ItPndvcmspOworCit9CisKK3N0 YXRpYyBzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKmRybV9kcF9nZXRfbXN0X2JyYW5jaF9kZXZp Y2Uoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCQkJICAgICAgIHU4 IGxjdCwgdTggKnJhZCkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7CisJc3Ry dWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsKKwlpbnQgaTsKKwkvKiBmaW5kIHRoZSBwb3J0IGJ5 IGl0ZXJhdGluZyBkb3duICovCisJbXN0YiA9IG1nci0+bXN0X3ByaW1hcnk7CisKKwlmb3IgKGkg PSAwOyBpIDwgbGN0IC0gMTsgaSsrKSB7CisJCWludCBzaGlmdCA9IChpICUgMikgPyAwIDogNDsK KwkJaW50IHBvcnRfbnVtID0gcmFkW2kgLyAyXSA+PiBzaGlmdDsKKworCQlsaXN0X2Zvcl9lYWNo X2VudHJ5KHBvcnQsICZtc3RiLT5wb3J0cywgbmV4dCkgeworCQkJaWYgKHBvcnQtPnBvcnRfbnVt ID09IHBvcnRfbnVtKSB7CisJCQkJaWYgKCFwb3J0LT5tc3RiKSB7CisJCQkJCURSTV9FUlJPUigi ZmFpbGVkIHRvIGxvb2t1cCBNU1RCIHdpdGggbGN0ICVkLCByYWQgJTAyeFxuIiwgbGN0LCByYWRb MF0pOworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQl9CisKKwkJCQltc3RiID0gcG9ydC0+bXN0YjsK KwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlrcmVmX2dldCgmbXN0Yi0+a3JlZik7CisJcmV0 dXJuIG1zdGI7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9jaGVja19hbmRfc2VuZF9saW5rX2Fk ZHJlc3Moc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCSAgICAgICBz dHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9y dCAqcG9ydDsKKworCWlmICghbXN0Yi0+bGlua19hZGRyZXNzX3NlbnQpIHsKKwkJZHJtX2RwX3Nl bmRfbGlua19hZGRyZXNzKG1nciwgbXN0Yik7CisJCW1zdGItPmxpbmtfYWRkcmVzc19zZW50ID0g dHJ1ZTsKKwl9CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmbXN0Yi0+cG9ydHMsIG5leHQp IHsKKwkJaWYgKHBvcnQtPmlucHV0KQorCQkJY29udGludWU7CisKKwkJaWYgKCFwb3J0LT5kZHBz KQorCQkJY29udGludWU7CisKKwkJaWYgKCFwb3J0LT5hdmFpbGFibGVfcGJuKQorCQkJZHJtX2Rw X3NlbmRfZW51bV9wYXRoX3Jlc291cmNlcyhtZ3IsIG1zdGIsIHBvcnQpOworCisJCWlmIChwb3J0 LT5tc3RiKQorCQkJZHJtX2RwX2NoZWNrX2FuZF9zZW5kX2xpbmtfYWRkcmVzcyhtZ3IsIHBvcnQt Pm1zdGIpOworCX0KK30KKworc3RhdGljIHZvaWQgZHJtX2RwX21zdF9saW5rX3Byb2JlX3dvcmso c3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciwgd29yayk7CisKKwlkcm1fZHBfY2hlY2tfYW5kX3NlbmRfbGlua19hZGRyZXNzKG1nciwg bWdyLT5tc3RfcHJpbWFyeSk7CisKK30KKworc3RhdGljIGJvb2wgZHJtX2RwX3ZhbGlkYXRlX2d1 aWQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJIHU4ICpndWlkKQor eworCXN0YXRpYyB1OCB6ZXJvX2d1aWRbMTZdOworCisJaWYgKCFtZW1jbXAoZ3VpZCwgemVyb19n dWlkLCAxNikpIHsKKwkJdTY0IHNhbHQgPSBnZXRfamlmZmllc182NCgpOworCQltZW1jcHkoJmd1 aWRbMF0sICZzYWx0LCBzaXplb2YodTY0KSk7CisJCW1lbWNweSgmZ3VpZFs4XSwgJnNhbHQsIHNp emVvZih1NjQpKTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworI2lm IDAKK3N0YXRpYyBpbnQgYnVpbGRfZHBjZF9yZWFkKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3R4ICptc2csIHU4IHBvcnRfbnVtLCB1MzIgb2Zmc2V0LCB1OCBudW1fYnl0ZXMpCit7CisJc3Ry dWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgcmVxOworCisJcmVxLnJlcV90eXBlID0g RFBfUkVNT1RFX0RQQ0RfUkVBRDsKKwlyZXEudS5kcGNkX3JlYWQucG9ydF9udW1iZXIgPSBwb3J0 X251bTsKKwlyZXEudS5kcGNkX3JlYWQuZHBjZF9hZGRyZXNzID0gb2Zmc2V0OworCXJlcS51LmRw Y2RfcmVhZC5udW1fYnl0ZXMgPSBudW1fYnl0ZXM7CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9y ZXEoJnJlcSwgbXNnKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHJt X2RwX3NlbmRfc2lkZWJhbmRfbXNnKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy LAorCQkJCSAgICBib29sIHVwLCB1OCAqbXNnLCBpbnQgbGVuKQoreworCWludCByZXQ7CisJaW50 IHJlZ2Jhc2UgPSB1cCA/IERQX1NJREVCQU5EX01TR19VUF9SRVBfQkFTRSA6IERQX1NJREVCQU5E X01TR19ET1dOX1JFUV9CQVNFOworCWludCB0b3NlbmQsIHRvdGFsLCBvZmZzZXQ7CisJaW50IHJl dHJpZXMgPSAwOworCityZXRyeToKKwl0b3RhbCA9IGxlbjsKKwlvZmZzZXQgPSAwOworCWRvIHsK KwkJdG9zZW5kID0gbWluMyhtZ3ItPm1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCAxNiwgdG90 YWwpOworCisJCW11dGV4X2xvY2soJm1nci0+YXV4X2xvY2spOworCQlyZXQgPSBkcm1fZHBfZHBj ZF93cml0ZShtZ3ItPmF1eCwgcmVnYmFzZSArIG9mZnNldCwKKwkJCQkJJm1zZ1tvZmZzZXRdLAor CQkJCQl0b3NlbmQpOworCQltdXRleF91bmxvY2soJm1nci0+YXV4X2xvY2spOworCQlpZiAocmV0 ICE9IHRvc2VuZCkgeworCQkJaWYgKHJldCA9PSAtRUlPICYmIHJldHJpZXMgPCA1KSB7CisJCQkJ cmV0cmllcysrOworCQkJCWdvdG8gcmV0cnk7CisJCQl9CisJCQlEUk1fREVCVUdfS01TKCJmYWls ZWQgdG8gZHBjZCB3cml0ZSAlZCAlZFxuIiwgdG9zZW5kLCByZXQpOworCQkJV0FSTigxLCAiZmFp bFxuIik7CisKKwkJCXJldHVybiAtRUlPOworCQl9CisJCW9mZnNldCArPSB0b3NlbmQ7CisJCXRv dGFsIC09IHRvc2VuZDsKKwl9IHdoaWxlICh0b3RhbCA+IDApOworCXJldHVybiAwOworfQorCitz dGF0aWMgaW50IHNldF9oZHJfZnJvbV9kc3RfcWxvY2soc3RydWN0IGRybV9kcF9zaWRlYmFuZF9t c2dfaGRyICpoZHIsCisJCQkJICBzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2cp Cit7CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiID0gdHhtc2ctPmRzdDsKKworCS8q IGJvdGggbXNnIHNsb3RzIGFyZSBmdWxsICovCisJaWYgKHR4bXNnLT5zZXFubyA9PSAtMSkgewor CQlpZiAobXN0Yi0+dHhfc2xvdHNbMF0gJiYgbXN0Yi0+dHhfc2xvdHNbMV0pIHsKKwkJCURSTV9E RUJVR19LTVMoIiVzOiBmYWlsZWQgdG8gZmluZCBzbG90XG4iLCBfX2Z1bmNfXyk7CisJCQlyZXR1 cm4gLUVBR0FJTjsKKwkJfQorCQlpZiAobXN0Yi0+dHhfc2xvdHNbMF0gPT0gTlVMTCAmJiBtc3Ri LT50eF9zbG90c1sxXSA9PSBOVUxMKSB7CisJCQl0eG1zZy0+c2Vxbm8gPSBtc3RiLT5sYXN0X3Nl cW5vOworCQkJbXN0Yi0+bGFzdF9zZXFubyBePSAxOworCQl9IGVsc2UgaWYgKG1zdGItPnR4X3Ns b3RzWzBdID09IE5VTEwpCisJCQl0eG1zZy0+c2Vxbm8gPSAwOworCQllbHNlCisJCQl0eG1zZy0+ c2Vxbm8gPSAxOworCQltc3RiLT50eF9zbG90c1t0eG1zZy0+c2Vxbm9dID0gdHhtc2c7CisJfQor CWhkci0+YnJvYWRjYXN0ID0gMDsKKwloZHItPnBhdGhfbXNnID0gdHhtc2ctPnBhdGhfbXNnOwor CWhkci0+bGN0ID0gbXN0Yi0+bGN0OworCWhkci0+bGNyID0gbXN0Yi0+bGN0IC0gMTsKKwlpZiAo bXN0Yi0+bGN0ID4gMSkKKwkJbWVtY3B5KGhkci0+cmFkLCBtc3RiLT5yYWQsIG1zdGItPmxjdCAv IDIpOworCWhkci0+c2Vxbm8gPSB0eG1zZy0+c2Vxbm87CisJcmV0dXJuIDA7Cit9CisvKgorICog cHJvY2VzcyBhIHNpbmdsZSBibG9jayBvZiB0aGUgbmV4dCBtZXNzYWdlIGluIHRoZSBzaWRlYmFu ZCBxdWV1ZQorICovCitzdGF0aWMgaW50IHByb2Nlc3Nfc2luZ2xlX3R4X3Fsb2NrKHN0cnVjdCBk cm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgIHN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3R4ICp0eG1zZywKKwkJCQkgICBib29sIHVwKQoreworCXU4IGNodW5rWzQ4XTsKKwlz dHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgaGRyOworCWludCBsZW4sIHNwYWNlLCBpZHgs IHRvc2VuZDsKKwlpbnQgcmV0OworCisJaWYgKHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJB TkRfVFhfUVVFVUVEKSB7CisJCXR4bXNnLT5zZXFubyA9IC0xOworCQl0eG1zZy0+c3RhdGUgPSBE Uk1fRFBfU0lERUJBTkRfVFhfU1RBUlRfU0VORDsKKwl9CisKKwkvKiBtYWtlIGhkciBmcm9tIGRz dCBtc3QgLSBmb3IgcmVwbGllcyB1c2Ugc2Vxbm8KKwkgICBvdGhlcndpc2UgYXNzaWduIG9uZSAq LworCXJldCA9IHNldF9oZHJfZnJvbV9kc3RfcWxvY2soJmhkciwgdHhtc2cpOworCWlmIChyZXQg PCAwKQorCQlyZXR1cm4gcmV0OworCisJLyogYW1vdW50IGxlZnQgdG8gc2VuZCBpbiB0aGlzIG1l c3NhZ2UgKi8KKwlsZW4gPSB0eG1zZy0+Y3VyX2xlbiAtIHR4bXNnLT5jdXJfb2Zmc2V0OworCisJ LyogNDggLSBzaWRlYmFuZCBtc2cgc2l6ZSAtIDEgYnl0ZSBmb3IgZGF0YSBDUkMsIHggaGVhZGVy IGJ5dGVzICovCisJc3BhY2UgPSA0OCAtIDEgLSBkcm1fZHBfY2FsY19zYl9oZHJfc2l6ZSgmaGRy KTsKKworCXRvc2VuZCA9IG1pbihsZW4sIHNwYWNlKTsKKwlpZiAobGVuID09IHR4bXNnLT5jdXJf bGVuKQorCQloZHIuc29tdCA9IDE7CisJaWYgKHNwYWNlID49IGxlbikKKwkJaGRyLmVvbXQgPSAx OworCisKKwloZHIubXNnX2xlbiA9IHRvc2VuZCArIDE7CisJZHJtX2RwX2VuY29kZV9zaWRlYmFu ZF9tc2dfaGRyKCZoZHIsIGNodW5rLCAmaWR4KTsKKwltZW1jcHkoJmNodW5rW2lkeF0sICZ0eG1z Zy0+bXNnW3R4bXNnLT5jdXJfb2Zmc2V0XSwgdG9zZW5kKTsKKwkvKiBhZGQgY3JjIGF0IGVuZCAq LworCWRybV9kcF9jcmNfc2lkZWJhbmRfY2h1bmtfcmVxKCZjaHVua1tpZHhdLCB0b3NlbmQpOwor CWlkeCArPSB0b3NlbmQgKyAxOworCisJcmV0ID0gZHJtX2RwX3NlbmRfc2lkZWJhbmRfbXNnKG1n ciwgdXAsIGNodW5rLCBpZHgpOworCWlmIChyZXQpIHsKKwkJRFJNX0RFQlVHX0tNUygic2lkZWJh bmQgbXNnIGZhaWxlZCB0byBzZW5kXG4iKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwl0eG1zZy0+ Y3VyX29mZnNldCArPSB0b3NlbmQ7CisJaWYgKHR4bXNnLT5jdXJfb2Zmc2V0ID09IHR4bXNnLT5j dXJfbGVuKSB7CisJCXR4bXNnLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9UWF9TRU5UOworCQly ZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIG11c3QgYmUgY2FsbGVkIGhvbGRpbmcg cWxvY2sgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2luZ2xlX2Rvd25fdHhfcWxvY2soc3RydWN0 IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJc3RydWN0IGRybV9kcF9zaWRlYmFu ZF9tc2dfdHggKnR4bXNnOworCWludCByZXQ7CisKKwkvKiBjb25zdHJ1Y3QgYSBjaHVuayBmcm9t IHRoZSBmaXJzdCBtc2cgaW4gdGhlIHR4X21zZyBxdWV1ZSAqLworCWlmIChsaXN0X2VtcHR5KCZt Z3ItPnR4X21zZ19kb3ducSkpIHsKKwkJbWdyLT50eF9kb3duX2luX3Byb2dyZXNzID0gZmFsc2U7 CisJCXJldHVybjsKKwl9CisJbWdyLT50eF9kb3duX2luX3Byb2dyZXNzID0gdHJ1ZTsKKworCXR4 bXNnID0gbGlzdF9maXJzdF9lbnRyeSgmbWdyLT50eF9tc2dfZG93bnEsIHN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX3R4LCBuZXh0KTsKKwlyZXQgPSBwcm9jZXNzX3NpbmdsZV90eF9xbG9jayht Z3IsIHR4bXNnLCBmYWxzZSk7CisJaWYgKHJldCA9PSAxKSB7CisJCS8qIHR4bXNnIGlzIHNlbnQg aXQgc2hvdWxkIGJlIGluIHRoZSBzbG90cyBub3cgKi8KKwkJbGlzdF9kZWwoJnR4bXNnLT5uZXh0 KTsKKwl9IGVsc2UgaWYgKHJldCkgeworCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8gc2VuZCBt c2cgaW4gcSAlZFxuIiwgcmV0KTsKKwkJbGlzdF9kZWwoJnR4bXNnLT5uZXh0KTsKKwkJaWYgKHR4 bXNnLT5zZXFubyAhPSAtMSkKKwkJCXR4bXNnLT5kc3QtPnR4X3Nsb3RzW3R4bXNnLT5zZXFub10g PSBOVUxMOworCQl0eG1zZy0+c3RhdGUgPSBEUk1fRFBfU0lERUJBTkRfVFhfVElNRU9VVDsKKwkJ d2FrZV91cCgmbWdyLT50eF93YWl0cSk7CisJfQorCWlmIChsaXN0X2VtcHR5KCZtZ3ItPnR4X21z Z19kb3ducSkpIHsKKwkJbWdyLT50eF9kb3duX2luX3Byb2dyZXNzID0gZmFsc2U7CisJCXJldHVy bjsKKwl9Cit9CisKKy8qIGNhbGxlZCBob2xkaW5nIHFsb2NrICovCitzdGF0aWMgdm9pZCBwcm9j ZXNzX3NpbmdsZV91cF90eF9xbG9jayhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1n cikKK3sKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisJaW50IHJldDsK KworCS8qIGNvbnN0cnVjdCBhIGNodW5rIGZyb20gdGhlIGZpcnN0IG1zZyBpbiB0aGUgdHhfbXNn IHF1ZXVlICovCisJaWYgKGxpc3RfZW1wdHkoJm1nci0+dHhfbXNnX3VwcSkpIHsKKwkJbWdyLT50 eF91cF9pbl9wcm9ncmVzcyA9IGZhbHNlOworCQlyZXR1cm47CisJfQorCisJdHhtc2cgPSBsaXN0 X2ZpcnN0X2VudHJ5KCZtZ3ItPnR4X21zZ191cHEsIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3R4LCBuZXh0KTsKKwlyZXQgPSBwcm9jZXNzX3NpbmdsZV90eF9xbG9jayhtZ3IsIHR4bXNnLCB0 cnVlKTsKKwlpZiAocmV0ID09IDEpIHsKKwkJLyogdXAgdHhtc2dzIGFyZW4ndCBwdXQgaW4gc2xv dHMgLSBzbyBmcmVlIGFmdGVyIHdlIHNlbmQgaXQgKi8KKwkJbGlzdF9kZWwoJnR4bXNnLT5uZXh0 KTsKKwkJa2ZyZWUodHhtc2cpOworCX0gZWxzZSBpZiAocmV0KQorCQlEUk1fREVCVUdfS01TKCJm YWlsZWQgdG8gc2VuZCBtc2cgaW4gcSAlZFxuIiwgcmV0KTsKKwltZ3ItPnR4X3VwX2luX3Byb2dy ZXNzID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX3F1ZXVlX2Rvd25fdHgoc3RydWN0 IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJIHN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3R4ICp0eG1zZykKK3sKKwltdXRleF9sb2NrKCZtZ3ItPnFsb2NrKTsKKwlsaXN0X2Fk ZF90YWlsKCZ0eG1zZy0+bmV4dCwgJm1nci0+dHhfbXNnX2Rvd25xKTsKKwlpZiAoIW1nci0+dHhf ZG93bl9pbl9wcm9ncmVzcykKKwkJcHJvY2Vzc19zaW5nbGVfZG93bl90eF9xbG9jayhtZ3IpOwor CW11dGV4X3VubG9jaygmbWdyLT5xbG9jayk7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX3NlbmRf bGlua19hZGRyZXNzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAg ICBzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3Qg ZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisJaW50IHJldDsKKworCXR4bXNnID0ga3ph bGxvYyhzaXplb2YoKnR4bXNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eG1zZykKKwkJcmV0dXJu IC1FTk9NRU07CisKKwl0eG1zZy0+ZHN0ID0gbXN0YjsKKwlsZW4gPSBidWlsZF9saW5rX2FkZHJl c3ModHhtc2cpOworCisJZHJtX2RwX3F1ZXVlX2Rvd25fdHgobWdyLCB0eG1zZyk7CisKKwlyZXQg PSBkcm1fZHBfbXN0X3dhaXRfdHhfcmVwbHkobXN0YiwgdHhtc2cpOworCWlmIChyZXQgPiAwKSB7 CisJCWludCBpOworCisJCWlmICh0eG1zZy0+cmVwbHkucmVwbHlfdHlwZSA9PSAxKQorCQkJRFJN X0RFQlVHX0tNUygibGluayBhZGRyZXNzIG5hayByZWNlaXZlZFxuIik7CisJCWVsc2UgeworCQkJ RFJNX0RFQlVHX0tNUygibGluayBhZGRyZXNzIHJlcGx5OiAlZFxuIiwgdHhtc2ctPnJlcGx5LnUu bGlua19hZGRyLm5wb3J0cyk7CisJCQlmb3IgKGkgPSAwOyBpIDwgdHhtc2ctPnJlcGx5LnUubGlu a19hZGRyLm5wb3J0czsgaSsrKSB7CisJCQkJRFJNX0RFQlVHX0tNUygicG9ydCAlZDogaW5wdXQg JWQsIHBkdDogJWQsIHBuOiAlZCwgZHBjZF9yZXY6ICUwMngsIG1jczogJWQsIGRkcHM6ICVkLCBs ZHBzICVkXG4iLCBpLAorCQkJCSAgICAgICB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIucG9ydHNb aV0uaW5wdXRfcG9ydCwKKwkJCQkgICAgICAgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRz W2ldLnBlZXJfZGV2aWNlX3R5cGUsCisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51LmxpbmtfYWRk ci5wb3J0c1tpXS5wb3J0X251bWJlciwKKwkJCQkgICAgICAgdHhtc2ctPnJlcGx5LnUubGlua19h ZGRyLnBvcnRzW2ldLmRwY2RfcmV2aXNpb24sCisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51Lmxp bmtfYWRkci5wb3J0c1tpXS5tY3MsCisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51LmxpbmtfYWRk ci5wb3J0c1tpXS5kZHBzLAorCQkJCSAgICAgICB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIucG9y dHNbaV0ubGVnYWN5X2RldmljZV9wbHVnX3N0YXR1cyk7CisJCQl9CisJCQlmb3IgKGkgPSAwOyBp IDwgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLm5wb3J0czsgaSsrKSB7CisJCQkJZHJtX2RwX2Fk ZF9wb3J0KG1zdGIsIG1nci0+ZGV2LCAmdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRzW2ld KTsKKwkJCX0KKwkJfQorCX0gZWxzZQorCQlEUk1fREVCVUdfS01TKCJsaW5rIGFkZHJlc3MgZmFp bGVkICVkXG4iLCByZXQpOworCisJa2ZyZWUodHhtc2cpOworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGRybV9kcF9zZW5kX2VudW1fcGF0aF9yZXNvdXJjZXMoc3RydWN0IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCSAgIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0 YiwKKwkJCQkJICAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCkKK3sKKwlpbnQgbGVuOwor CXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsKKwlpbnQgcmV0OworCisJdHht c2cgPSBremFsbG9jKHNpemVvZigqdHhtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKQor CQlyZXR1cm4gLUVOT01FTTsKKworCXR4bXNnLT5kc3QgPSBtc3RiOworCWxlbiA9IGJ1aWxkX2Vu dW1fcGF0aF9yZXNvdXJjZXModHhtc2csIHBvcnQtPnBvcnRfbnVtKTsKKworCWRybV9kcF9xdWV1 ZV9kb3duX3R4KG1nciwgdHhtc2cpOworCisJcmV0ID0gZHJtX2RwX21zdF93YWl0X3R4X3JlcGx5 KG1zdGIsIHR4bXNnKTsKKwlpZiAocmV0ID4gMCkgeworCQlpZiAodHhtc2ctPnJlcGx5LnJlcGx5 X3R5cGUgPT0gMSkKKwkJCURSTV9ERUJVR19LTVMoImVudW0gcGF0aCByZXNvdXJjZXMgbmFrIHJl Y2VpdmVkXG4iKTsKKwkJZWxzZSB7CisJCQlpZiAocG9ydC0+cG9ydF9udW0gIT0gdHhtc2ctPnJl cGx5LnUucGF0aF9yZXNvdXJjZXMucG9ydF9udW1iZXIpCisJCQkJRFJNX0VSUk9SKCJnb3QgaW5j b3JyZWN0IHBvcnQgaW4gcmVzcG9uc2VcbiIpOworCQkJRFJNX0RFQlVHX0tNUygiZW51bSBwYXRo IHJlc291cmNlcyAlZDogJWQgJWRcbiIsIHR4bXNnLT5yZXBseS51LnBhdGhfcmVzb3VyY2VzLnBv cnRfbnVtYmVyLCB0eG1zZy0+cmVwbHkudS5wYXRoX3Jlc291cmNlcy5mdWxsX3BheWxvYWRfYndf bnVtYmVyLAorCQkJICAgICAgIHR4bXNnLT5yZXBseS51LnBhdGhfcmVzb3VyY2VzLmF2YWlsX3Bh eWxvYWRfYndfbnVtYmVyKTsKKwkJCXBvcnQtPmF2YWlsYWJsZV9wYm4gPSB0eG1zZy0+cmVwbHku dS5wYXRoX3Jlc291cmNlcy5hdmFpbF9wYXlsb2FkX2J3X251bWJlcjsKKwkJfQorCX0KKworCWtm cmVlKHR4bXNnKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRybV9kcF9wYXlsb2FkX3NlbmRfbXNn KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJICAgIHN0cnVjdCBkcm1f ZHBfbXN0X3BvcnQgKnBvcnQsCisJCQkgICAgaW50IGlkLAorCQkJICAgIGludCBwYm4pCit7CisJ c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnOworCXN0cnVjdCBkcm1fZHBfbXN0 X2JyYW5jaCAqbXN0YjsKKwlpbnQgbGVuLCByZXQ7CisKKwltc3RiID0gZHJtX2RwX2dldF92YWxp ZGF0ZWRfbXN0Yl9yZWYobWdyLCBwb3J0LT5wYXJlbnQpOworCWlmICghbXN0YikKKwkJcmV0dXJu IC1FSU5WQUw7CisKKwl0eG1zZyA9IGt6YWxsb2Moc2l6ZW9mKCp0eG1zZyksIEdGUF9LRVJORUwp OworCWlmICghdHhtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJdHhtc2ctPmRzdCA9IG1zdGI7 CisJbGVuID0gYnVpbGRfYWxsb2NhdGVfcGF5bG9hZCh0eG1zZywgcG9ydC0+cG9ydF9udW0sCisJ CQkJICAgICBpZCwKKwkJCQkgICAgIHBibik7CisKKwlkcm1fZHBfcXVldWVfZG93bl90eChtZ3Is IHR4bXNnKTsKKworCXJldCA9IGRybV9kcF9tc3Rfd2FpdF90eF9yZXBseShtc3RiLCB0eG1zZyk7 CisKKwlrZnJlZSh0eG1zZyk7CisJZHJtX2RwX3B1dF9tc3RfYnJhbmNoX2RldmljZShtc3RiKTsK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcm1fZHBfY3JlYXRlX3BheWxvYWRfc3RlcDEo c3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICAgICAgIGludCBpZCwK KwkJCQkgICAgICAgc3RydWN0IGRybV9kcF9wYXlsb2FkICpwYXlsb2FkKQoreworCWludCByZXQ7 CisKKwlyZXQgPSBkcm1fZHBfZHBjZF93cml0ZV9wYXlsb2FkKG1nciwgaWQsIHBheWxvYWQpOwor CWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXBheWxvYWQtPnBheWxvYWRfc3RhdGUgPSBE UF9QQVlMT0FEX0xPQ0FMOworCXJldHVybiAwOworfQorCitpbnQgZHJtX2RwX2NyZWF0ZV9wYXls b2FkX3N0ZXAyKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCXN0cnVj dCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsCisJCQkJaW50IGlkLAorCQkJCXN0cnVjdCBkcm1fZHBf cGF5bG9hZCAqcGF5bG9hZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IGRybV9kcF9wYXlsb2FkX3Nl bmRfbXNnKG1nciwgcG9ydCwgaWQsIHBvcnQtPnZjcGkucGJuKTsKKwlpZiAocmV0IDwgMCkKKwkJ cmV0dXJuIHJldDsKKwlwYXlsb2FkLT5wYXlsb2FkX3N0YXRlID0gRFBfUEFZTE9BRF9SRU1PVEU7 CisJcmV0dXJuIHJldDsKK30KKworaW50IGRybV9kcF9kZXN0cm95X3BheWxvYWRfc3RlcDEoc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJIHN0cnVjdCBkcm1fZHBfbXN0 X3BvcnQgKnBvcnQsCisJCQkJIGludCBpZCwKKwkJCQkgc3RydWN0IGRybV9kcF9wYXlsb2FkICpw YXlsb2FkKQoreworCWludCByZXQ7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKKwlpZiAocG9ydCkg eworCQlyZXQgPSBkcm1fZHBfcGF5bG9hZF9zZW5kX21zZyhtZ3IsIHBvcnQsIGlkLCAwKTsKKwkJ aWYgKHJldCkKKwkJCURSTV9FUlJPUigiZXJyb3Igc2VuZGluZyBwYXlsb2FkIGRlc3Ryb3lcbiIp OworCX0KKworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlX3BheWxvYWQobWdyLCBpZCwgcGF5bG9h ZCk7CisJaWYgKHJldCkKKwkJRFJNX0VSUk9SKCJlcnJvciB3cml0aW5nIHBheWxvYWQgZGVzdHJv eVxuIik7CisJcGF5bG9hZC0+cGF5bG9hZF9zdGF0ZSA9IDA7CisJcmV0dXJuIHJldDsKK30KKwor aW50IGRybV9kcF9kZXN0cm95X3BheWxvYWRfc3RlcDIoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsCisJCQkJIGludCBpZCwKKwkJCQkgc3RydWN0IGRybV9kcF9wYXlsb2FkICpw YXlsb2FkKQoreworCXBheWxvYWQtPnBheWxvYWRfc3RhdGUgPSAwOworCXJldHVybiAwOworfQor CisvKioKKyAqIGRybV9kcF91cGRhdGVfcGF5bG9hZF9wYXJ0MSgpIC0gRXhlY3V0ZSBwYXlsb2Fk IHVwZGF0ZSBwYXJ0IDEKKyAqIEBtZ3I6IG1hbmFnZXIgdG8gdXNlLgorICoKKyAqIFRoaXMgaXRl cmF0ZXMgb3ZlciBhbGwgcHJvcG9zZWQgdmlydHVhbCBjaGFubmVscywgYW5kIHRyaWVzIHRvCisg KiBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgbGluayBmb3IgdGhlbS4gRm9yIDAtPnNsb3RzIHRyYW5z aXRpb25zLAorICogdGhpcyBzdGVwIGp1c3Qgd3JpdGVzIHRoZSBWQ1BJIHRvIHRoZSBNU1QgZGV2 aWNlLiBGb3Igc2xvdHMtPjAKKyAqIHRyYW5zaXRpb25zLCB0aGlzIHdyaXRlcyB0aGUgdXBkYXRl ZCBWQ1BJcyBhbmQgcmVtb3ZlcyB0aGUKKyAqIHJlbW90ZSBWQyBwYXlsb2Fkcy4KKyAqCisgKiBh ZnRlciBjYWxsaW5nIHRoaXMgdGhlIGRyaXZlciBzaG91bGQgZ2VuZXJhdGUgQUNUIGFuZCBwYXls b2FkCisgKiBwYWNrZXRzLgorICovCitpbnQgZHJtX2RwX3VwZGF0ZV9wYXlsb2FkX3BhcnQxKHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCWludCBpOworCWludCBjdXJf c2xvdHMgPSAxOworCXN0cnVjdCBkcm1fZHBfcGF5bG9hZCByZXFfcGF5bG9hZDsKKworCWZvciAo aSA9IDA7IGkgPCBtZ3ItPm1heF9wYXlsb2FkczsgaSsrKSB7CisJCS8qIHNvbHZlIHRoZSBjdXJy ZW50IHBheWxvYWRzIC0gY29tcGFyZSB0byB0aGUgaHcgb25lcworCQkgICAtIHVwZGF0ZSB0aGUg aHcgdmlldyAqLworCQlyZXFfcGF5bG9hZC5zdGFydF9zbG90ID0gY3VyX3Nsb3RzOworCQlpZiAo bWdyLT5wcm9wb3NlZF92Y3Bpc1tpXSkKKwkJCXJlcV9wYXlsb2FkLm51bV9zbG90cyA9IG1nci0+ cHJvcG9zZWRfdmNwaXNbaV0tPm51bV9zbG90czsKKwkJZWxzZQorCQkJcmVxX3BheWxvYWQubnVt X3Nsb3RzID0gMDsKKworCQkvKiB3b3JrIG91dCB3aGF0IGlzIHJlcXVpcmVkIHRvIGhhcHBlbiB3 aXRoIHRoaXMgcGF5bG9hZCAqLworCQlpZiAobWdyLT5wYXlsb2Fkc1tpXS5zdGFydF9zbG90ICE9 IHJlcV9wYXlsb2FkLnN0YXJ0X3Nsb3QgfHwKKwkJICAgIG1nci0+cGF5bG9hZHNbaV0ubnVtX3Ns b3RzICE9IHJlcV9wYXlsb2FkLm51bV9zbG90cykgeworCQkJc3RydWN0IGRybV9kcF9tc3RfcG9y dCAqcG9ydCA9IE5VTEw7CisKKwkJCWlmIChtZ3ItPnByb3Bvc2VkX3ZjcGlzW2ldKQorCQkJCXBv cnQgPSBjb250YWluZXJfb2YobWdyLT5wcm9wb3NlZF92Y3Bpc1tpXSwgc3RydWN0IGRybV9kcF9t c3RfcG9ydCwgdmNwaSk7CisKKwkJCS8qIG5lZWQgdG8gcHVzaCBhbiB1cGRhdGUgZm9yIHRoaXMg cGF5bG9hZCAqLworCQkJaWYgKHJlcV9wYXlsb2FkLm51bV9zbG90cykgeworCQkJCWRybV9kcF9j cmVhdGVfcGF5bG9hZF9zdGVwMShtZ3IsIGksICZyZXFfcGF5bG9hZCk7CisJCQkJbWdyLT5wYXls b2Fkc1tpXS5udW1fc2xvdHMgPSByZXFfcGF5bG9hZC5udW1fc2xvdHM7CisJCQl9IGVsc2UgaWYg KG1nci0+cGF5bG9hZHNbaV0ubnVtX3Nsb3RzKSB7CisJCQkJbWdyLT5wYXlsb2Fkc1tpXS5udW1f c2xvdHMgPSAwOworCQkJCWRybV9kcF9kZXN0cm95X3BheWxvYWRfc3RlcDEobWdyLCBwb3J0LCBp LCAmbWdyLT5wYXlsb2Fkc1tpXSk7CisJCQkJcmVxX3BheWxvYWQucGF5bG9hZF9zdGF0ZSA9IG1n ci0+cGF5bG9hZHNbaV0ucGF5bG9hZF9zdGF0ZTsKKwkJCX0KKwkJCW1nci0+cGF5bG9hZHNbaV0u c3RhcnRfc2xvdCA9IHJlcV9wYXlsb2FkLnN0YXJ0X3Nsb3Q7CisJCQltZ3ItPnBheWxvYWRzW2ld LnBheWxvYWRfc3RhdGUgPSByZXFfcGF5bG9hZC5wYXlsb2FkX3N0YXRlOworCQl9CisJCWN1cl9z bG90cyArPSByZXFfcGF5bG9hZC5udW1fc2xvdHM7CisJfQorCisJcmV0dXJuIDA7Cit9CitFWFBP UlRfU1lNQk9MKGRybV9kcF91cGRhdGVfcGF5bG9hZF9wYXJ0MSk7CisKKy8qKgorICogZHJtX2Rw X3VwZGF0ZV9wYXlsb2FkX3BhcnQyKCkgLSBFeGVjdXRlIHBheWxvYWQgdXBkYXRlIHBhcnQgMgor ICogQG1ncjogbWFuYWdlciB0byB1c2UuCisgKgorICogVGhpcyBpdGVyYXRlcyBvdmVyIGFsbCBw cm9wb3NlZCB2aXJ0dWFsIGNoYW5uZWxzLCBhbmQgdHJpZXMgdG8KKyAqIGFsbG9jYXRlIHNwYWNl IGluIHRoZSBsaW5rIGZvciB0aGVtLiBGb3IgMC0+c2xvdHMgdHJhbnNpdGlvbnMsCisgKiB0aGlz IHN0ZXAgd3JpdGVzIHRoZSByZW1vdGUgVkMgcGF5bG9hZCBjb21tYW5kcy4gRm9yIHNsb3RzLT4w CisgKiB0aGlzIGp1c3QgcmVzZXRzIHNvbWUgaW50ZXJuYWwgc3RhdGUuCisgKi8KK2ludCBkcm1f ZHBfdXBkYXRlX3BheWxvYWRfcGFydDIoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICpt Z3IpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsKKwlpbnQgaTsKKwlpbnQgcmV0 OworCWZvciAoaSA9IDA7IGkgPCBtZ3ItPm1heF9wYXlsb2FkczsgaSsrKSB7CisJCWlmICghbWdy LT5wcm9wb3NlZF92Y3Bpc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCURSTV9ERUJVR19LTVMoInBh eWxvYWQgJWQgJWRcbiIsIGksIG1nci0+cGF5bG9hZHNbaV0ucGF5bG9hZF9zdGF0ZSk7CisJCWlm IChtZ3ItPnBheWxvYWRzW2ldLnBheWxvYWRfc3RhdGUgPT0gRFBfUEFZTE9BRF9MT0NBTCkgewor CQkJcG9ydCA9IGNvbnRhaW5lcl9vZihtZ3ItPnByb3Bvc2VkX3ZjcGlzW2ldLCBzdHJ1Y3QgZHJt X2RwX21zdF9wb3J0LCB2Y3BpKTsKKwkJCXJldCA9IGRybV9kcF9jcmVhdGVfcGF5bG9hZF9zdGVw MihtZ3IsIHBvcnQsIGksICZtZ3ItPnBheWxvYWRzW2ldKTsKKwkJfSBlbHNlIGlmIChtZ3ItPnBh eWxvYWRzW2ldLnBheWxvYWRfc3RhdGUgPT0gRFBfUEFZTE9BRF9ERUxFVEVfTE9DQUwpIHsKKwkJ CXJldCA9IGRybV9kcF9kZXN0cm95X3BheWxvYWRfc3RlcDIobWdyLCBpLCAmbWdyLT5wYXlsb2Fk c1tpXSk7CisJCX0KKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOwor fQorRVhQT1JUX1NZTUJPTChkcm1fZHBfdXBkYXRlX3BheWxvYWRfcGFydDIpOworCisjaWYgMCAv KiB1bnVzZWQgYXMgb2YgeWV0ICovCitzdGF0aWMgaW50IGRybV9kcF9zZW5kX2RwY2RfcmVhZChz dHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgc3RydWN0IGRybV9kcF9t c3RfcG9ydCAqcG9ydCwKKwkJCQkgaW50IG9mZnNldCwgaW50IHNpemUpCit7CisJaW50IGxlbjsK KwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisKKwl0eG1zZyA9IGt6YWxs b2Moc2l6ZW9mKCp0eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cpCisJCXJldHVybiAt RU5PTUVNOworCisJbGVuID0gYnVpbGRfZHBjZF9yZWFkKHR4bXNnLCBwb3J0LT5wb3J0X251bSwg MCwgOCk7CisJdHhtc2ctPmRzdCA9IHBvcnQtPnBhcmVudDsKKworCWRybV9kcF9xdWV1ZV9kb3du X3R4KG1nciwgdHhtc2cpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBk cm1fZHBfc2VuZF9kcGNkX3dyaXRlKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy LAorCQkJCSAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgIGludCBvZmZzZXQs IGludCBzaXplLCB1OCAqYnl0ZXMpCit7CisJaW50IGxlbjsKKwlpbnQgcmV0OworCXN0cnVjdCBk cm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2gg Km1zdGI7CisKKwltc3RiID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfbXN0Yl9yZWYobWdyLCBwb3J0 LT5wYXJlbnQpOworCWlmICghbXN0YikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eG1zZyA9IGt6 YWxsb2Moc2l6ZW9mKCp0eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cpCisJCXJldHVy biAtRU5PTUVNOworCisJbGVuID0gYnVpbGRfZHBjZF93cml0ZSh0eG1zZywgcG9ydC0+cG9ydF9u dW0sIG9mZnNldCwgc2l6ZSwgYnl0ZXMpOworCXR4bXNnLT5kc3QgPSBtc3RiOworCisJZHJtX2Rw X3F1ZXVlX2Rvd25fdHgobWdyLCB0eG1zZyk7CisKKwlyZXQgPSBkcm1fZHBfbXN0X3dhaXRfdHhf cmVwbHkobXN0YiwgdHhtc2cpOworCWlmIChyZXQgPiAwKSB7CisJCWlmICh0eG1zZy0+cmVwbHku cmVwbHlfdHlwZSA9PSAxKSB7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfSBlbHNlCisJCQlyZXR1 cm4gMDsKKwl9CisJa2ZyZWUodHhtc2cpOworCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2Uo bXN0Yik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX2VuY29kZV91cF9hY2tf cmVwbHkoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1zZywgdTggcmVxX3R5cGUpCit7 CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSByZXBseTsKKworCXJlcGx5 LnJlcGx5X3R5cGUgPSAxOworCXJlcGx5LnJlcV90eXBlID0gcmVxX3R5cGU7CisJZHJtX2RwX2Vu Y29kZV9zaWRlYmFuZF9yZXBseSgmcmVwbHksIG1zZyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgZHJtX2RwX3NlbmRfdXBfYWNrX3JlcGx5KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyLAorCQkJCSAgICBzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkJ ICAgIGludCByZXFfdHlwZSwgaW50IHNlcW5vLCBib29sIGJyb2FkY2FzdCkKK3sKKwlzdHJ1Y3Qg ZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisKKwl0eG1zZyA9IGt6YWxsb2Moc2l6ZW9m KCp0eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cpCisJCXJldHVybiAtRU5PTUVNOwor CisJdHhtc2ctPmRzdCA9IG1zdGI7CisJdHhtc2ctPnNlcW5vID0gc2Vxbm87CisJZHJtX2RwX2Vu Y29kZV91cF9hY2tfcmVwbHkodHhtc2csIHJlcV90eXBlKTsKKworCW11dGV4X2xvY2soJm1nci0+ cWxvY2spOworCWxpc3RfYWRkX3RhaWwoJnR4bXNnLT5uZXh0LCAmbWdyLT50eF9tc2dfdXBxKTsK KwlpZiAoIW1nci0+dHhfdXBfaW5fcHJvZ3Jlc3MpIHsKKwkJcHJvY2Vzc19zaW5nbGVfdXBfdHhf cWxvY2sobWdyKTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPnFsb2NrKTsKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBkcm1fZHBfZ2V0X3ZjX3BheWxvYWRfYncoaW50IGRwX2xpbmtfYncs IGludCBkcF9saW5rX2NvdW50KQoreworCXN3aXRjaCAoZHBfbGlua19idykgeworCWNhc2UgRFBf TElOS19CV18xXzYyOgorCQlyZXR1cm4gMyAqIGRwX2xpbmtfY291bnQ7CisJY2FzZSBEUF9MSU5L X0JXXzJfNzoKKwkJcmV0dXJuIDUgKiBkcF9saW5rX2NvdW50OworCWNhc2UgRFBfTElOS19CV181 XzQ6CisJCXJldHVybiAxMCAqIGRwX2xpbmtfY291bnQ7CisJfQorCXJldHVybiAwOworfQorCisv KioKKyAqIGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3NldF9tc3QoKSAtIFNldCB0aGUgTVNUIHN0 YXRlIGZvciBhIHRvcG9sb2d5IG1hbmFnZXIKKyAqIEBtZ3I6IG1hbmFnZXIgdG8gc2V0IHN0YXRl IGZvcgorICogQG1zdF9zdGF0ZTogdHJ1ZSB0byBlbmFibGUgTVNUIG9uIHRoaXMgY29ubmVjdG9y IC0gZmFsc2UgdG8gZGlzYWJsZS4KKyAqCisgKiBUaGlzIGlzIGNhbGxlZCBieSB0aGUgZHJpdmVy IHdoZW4gaXQgZGV0ZWN0cyBhbiBNU1QgY2FwYWJsZSBkZXZpY2UgcGx1Z2dlZAorICogaW50byBh IERQIE1TVCBjYXBhYmxlIHBvcnQsIG9yIHdoZW4gYSBEUCBNU1QgY2FwYWJsZSBkZXZpY2UgaXMg dW5wbHVnZ2VkLgorICovCitpbnQgZHJtX2RwX21zdF90b3BvbG9neV9tZ3Jfc2V0X21zdChzdHJ1 Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgYm9vbCBtc3Rfc3RhdGUpCit7CisJaW50 IHJldCA9IDA7CisKKwltdXRleF9sb2NrKCZtZ3ItPmxvY2spOworCWlmIChtc3Rfc3RhdGUgPT0g bWdyLT5tc3Rfc3RhdGUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW1nci0+bXN0X3N0YXRlID0g bXN0X3N0YXRlOworCS8qIHNldCB0aGUgZGV2aWNlIGludG8gTVNUIG1vZGUgKi8KKwlpZiAobXN0 X3N0YXRlKSB7CisJCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YjsKKwkJV0FSTl9PTiht Z3ItPm1zdF9wcmltYXJ5KTsKKworCQkvKiBnZXQgZHBjZCBpbmZvICovCisJCW11dGV4X2xvY2so Jm1nci0+YXV4X2xvY2spOworCQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkKG1nci0+YXV4LCBEUF9E UENEX1JFViwgbWdyLT5kcGNkLCBEUF9SRUNFSVZFUl9DQVBfU0laRSk7CisJCW11dGV4X3VubG9j aygmbWdyLT5hdXhfbG9jayk7CisJCWlmIChyZXQgIT0gRFBfUkVDRUlWRVJfQ0FQX1NJWkUpIHsK KwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byByZWFkIERQQ0RcbiIpOworCQkJZ290byBvdXRf dW5sb2NrOworCQl9CisKKwkJbWdyLT5wYm5fZGl2ID0gZHJtX2RwX2dldF92Y19wYXlsb2FkX2J3 KG1nci0+ZHBjZFsxXSwgbWdyLT5kcGNkWzJdICYgRFBfTUFYX0xBTkVfQ09VTlRfTUFTSyk7CisJ CW1nci0+dG90YWxfcGJuID0gMjU2MDsKKwkJbWdyLT50b3RhbF9zbG90cyA9IERJVl9ST1VORF9V UChtZ3ItPnRvdGFsX3BibiwgbWdyLT5wYm5fZGl2KTsKKwkJbWdyLT5hdmFpbF9zbG90cyA9IG1n ci0+dG90YWxfc2xvdHM7CisKKwkJLyogYWRkIGluaXRpYWwgYnJhbmNoIGRldmljZSBhdCBMQ1Qg MSAqLworCQltc3RiID0gZHJtX2RwX2FkZF9tc3RfYnJhbmNoX2RldmljZSgxLCBOVUxMKTsKKwkJ aWYgKG1zdGIgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0X3VubG9j azsKKwkJfQorCQltc3RiLT5tZ3IgPSBtZ3I7CisKKwkJLyogZ2l2ZSB0aGlzIHRoZSBtYWluIHJl ZmVyZW5jZSAqLworCQltZ3ItPm1zdF9wcmltYXJ5ID0gbXN0YjsKKwkJa3JlZl9nZXQoJm1nci0+ bXN0X3ByaW1hcnktPmtyZWYpOworCisJCXsKKwkJCXN0cnVjdCBkcm1fZHBfcGF5bG9hZCByZXNl dF9wYXk7CisJCQlyZXNldF9wYXkuc3RhcnRfc2xvdCA9IDA7CisJCQlyZXNldF9wYXkubnVtX3Ns b3RzID0gMHgzZjsKKwkJCWRybV9kcF9kcGNkX3dyaXRlX3BheWxvYWQobWdyLCAwLCAmcmVzZXRf cGF5KTsKKwkJfQorCisJCW11dGV4X2xvY2soJm1nci0+YXV4X2xvY2spOworCQlyZXQgPSBkcm1f ZHBfZHBjZF93cml0ZWIobWdyLT5hdXgsIERQX01TVE1fQ1RSTCwKKwkJCQkJIERQX01TVF9FTiB8 IERQX1VQX1JFUV9FTiB8IERQX1VQU1RSRUFNX0lTX1NSQyk7CisJCW11dGV4X3VubG9jaygmbWdy LT5hdXhfbG9jayk7CisJCWlmIChyZXQgPCAwKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCS8q IHNvcnQgb3V0IGd1aWQgKi8KKwkJbXV0ZXhfbG9jaygmbWdyLT5hdXhfbG9jayk7CisJCXJldCA9 IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIERQX0dVSUQsIG1nci0+Z3VpZCwgMTYpOworCQlt dXRleF91bmxvY2soJm1nci0+YXV4X2xvY2spOworCQlpZiAocmV0ICE9IDE2KSB7CisJCQlEUk1f REVCVUdfS01TKCJmYWlsZWQgdG8gcmVhZCBEUCBHVUlEICVkXG4iLCByZXQpOworCQkJZ290byBv dXRfdW5sb2NrOworCQl9CisKKwkJbWdyLT5ndWlkX3ZhbGlkID0gZHJtX2RwX3ZhbGlkYXRlX2d1 aWQobWdyLCBtZ3ItPmd1aWQpOworCQlpZiAoIW1nci0+Z3VpZF92YWxpZCkgeworCQkJcmV0ID0g ZHJtX2RwX2RwY2Rfd3JpdGUobWdyLT5hdXgsIERQX0dVSUQsIG1nci0+Z3VpZCwgMTYpOworCQkJ bWdyLT5ndWlkX3ZhbGlkID0gdHJ1ZTsKKwkJfQorCisJCW11dGV4X3VubG9jaygmbWdyLT5sb2Nr KTsKKworCQlxdWV1ZV93b3JrKHN5c3RlbV9sb25nX3dxLCAmbWdyLT53b3JrKTsKKworCQkvKiB3 ZSBuZWVkIHRvIHNlbmQgdGhlIGxpbmsgYWRkcmVzcyBpbiBhIHdvcmsgcXVldWUKKwkJICAgc28g d2UgY2FuIGF2b2lkIHJlY3VzaW5nIHRoZSBtb2Rlc2V0IGxvY2tzIGlmIHdlIGdldAorCQkgICBu ZXcgY29ubmVjdG9ycyAqLworCQlkcm1fZHBfcHV0X21zdF9icmFuY2hfZGV2aWNlKG1nci0+bXN0 X3ByaW1hcnkpOworCisJCXJldCA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKG1nci0+bXN0X3ByaW1h cnkpIHsKKwkJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UobWdyLT5tc3RfcHJpbWFyeSk7 CisJCQltZ3ItPm1zdF9wcmltYXJ5ID0gTlVMTDsKKwkJfQorCQkvKiBkaXNhYmxlIE1TVCBvbiB0 aGUgZGV2aWNlICovCisJCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYihtZ3ItPmF1eCwgRFBfTVNU TV9DVFJMLCAwKTsKKwkJaWYgKHJldCA8IDApCisJCQlnb3RvIG91dF91bmxvY2s7CisJCXJldCA9 IDA7CisJCW11dGV4X3VubG9jaygmbWdyLT5sb2NrKTsKKwl9CisKKwlyZXR1cm4gcmV0Oworb3V0 X3VubG9jazoKKwltdXRleF91bmxvY2soJm1nci0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VY UE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3BvbG9neV9tZ3Jfc2V0X21zdCk7CisKK3N0YXRpYyB2 b2lkIGRybV9kcF9nZXRfb25lX3NiX21zZyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3Ig Km1nciwgYm9vbCB1cCkKK3sKKwlpbnQgbGVuOworCXU4IHJlcGx5YmxvY2tbMzJdOworCWludCBy ZXBseWxlbiwgb3JpZ2xlbiwgY3VycmVwbHk7CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2RwX3Np ZGViYW5kX21zZ19yeCAqbXNnOworCWludCBiYXNlcmVnID0gdXAgPyBEUF9TSURFQkFORF9NU0df VVBfUkVRX0JBU0UgOiBEUF9TSURFQkFORF9NU0dfRE9XTl9SRVBfQkFTRTsKKwltc2cgPSB1cCA/ ICZtZ3ItPnVwX3JlcV9yZWN2IDogJm1nci0+ZG93bl9yZXBfcmVjdjsKKworCWxlbiA9IG1pbiht Z3ItPm1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCAxNik7CisJbXV0ZXhfbG9jaygmbWdyLT5h dXhfbG9jayk7CisJcmV0ID0gZHJtX2RwX2RwY2RfcmVhZChtZ3ItPmF1eCwgYmFzZXJlZywKKwkJ CSAgICAgICByZXBseWJsb2NrLCBsZW4pOworCW11dGV4X3VubG9jaygmbWdyLT5hdXhfbG9jayk7 CisJaWYgKHJldCAhPSBsZW4pIHsKKwkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIHJlYWQgRFBD RCBkb3duIHJlcCAlZCAlZFxuIiwgbGVuLCByZXQpOworCQlyZXR1cm47CisJfQorCXJldCA9IGRy bV9kcF9zaWRlYmFuZF9tc2dfYnVpbGQobXNnLCByZXBseWJsb2NrLCBsZW4sIHRydWUpOworCWlm ICghcmV0KSB7CisJCURSTV9ERUJVR19LTVMoInNpZGViYW5kIG1zZyBidWlsZCBmYWlsZWQgJWRc biIsIHJlcGx5YmxvY2tbMF0pOworCQlyZXR1cm47CisJfQorCXJlcGx5bGVuID0gbXNnLT5jdXJj aHVua19sZW4gKyBtc2ctPmN1cmNodW5rX2hkcmxlbjsKKworCW9yaWdsZW4gPSByZXBseWxlbjsK KwlyZXBseWxlbiAtPSBsZW47CisJY3VycmVwbHkgPSBsZW47CisJd2hpbGUgKHJlcGx5bGVuID4g MCkgeworCQlsZW4gPSBtaW4zKHJlcGx5bGVuLCBtZ3ItPm1heF9kcGNkX3RyYW5zYWN0aW9uX2J5 dGVzLCAxNik7CisJCW11dGV4X2xvY2soJm1nci0+YXV4X2xvY2spOworCQlyZXQgPSBkcm1fZHBf ZHBjZF9yZWFkKG1nci0+YXV4LCBiYXNlcmVnICsgY3VycmVwbHksCisJCQkJICAgIHJlcGx5Ymxv Y2ssIGxlbik7CisJCW11dGV4X3VubG9jaygmbWdyLT5hdXhfbG9jayk7CisJCWlmIChyZXQgIT0g bGVuKSB7CisJCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8gcmVhZCBhIGNodW5rXG4iKTsKKwkJ fQorCQlyZXQgPSBkcm1fZHBfc2lkZWJhbmRfbXNnX2J1aWxkKG1zZywgcmVwbHlibG9jaywgbGVu LCBmYWxzZSk7CisJCWlmIChyZXQgPT0gZmFsc2UpCisJCQlEUk1fREVCVUdfS01TKCJmYWlsZWQg dG8gYnVpbGQgc2lkZWJhbmQgbXNnXG4iKTsKKwkJY3VycmVwbHkgKz0gbGVuOworCQlyZXBseWxl biAtPSBsZW47CisJfQorfQorCitzdGF0aWMgaW50IGRybV9kcF9tc3RfaGFuZGxlX2Rvd25fcmVw KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCWludCByZXQgPSAwOwor CisJZHJtX2RwX2dldF9vbmVfc2JfbXNnKG1nciwgZmFsc2UpOworCisJaWYgKG1nci0+ZG93bl9y ZXBfcmVjdi5oYXZlX2VvbXQpIHsKKwkJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4 bXNnOworCQlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7CisJCWludCBzbG90ID0gLTE7 CisJCW1zdGIgPSBkcm1fZHBfZ2V0X21zdF9icmFuY2hfZGV2aWNlKG1nciwKKwkJCQkJCSAgICBt Z3ItPmRvd25fcmVwX3JlY3YuaW5pdGlhbF9oZHIubGN0LAorCQkJCQkJICAgIG1nci0+ZG93bl9y ZXBfcmVjdi5pbml0aWFsX2hkci5yYWQpOworCisJCWlmICghbXN0YikgeworCQkJRFJNX0RFQlVH X0tNUygiR290IE1TVCByZXBseSBmcm9tIHVua25vd24gZGV2aWNlICVkXG4iLCBtZ3ItPmRvd25f cmVwX3JlY3YuaW5pdGlhbF9oZHIubGN0KTsKKwkJCW1lbXNldCgmbWdyLT5kb3duX3JlcF9yZWN2 LCAwLCBzaXplb2Yoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcngpKTsKKwkJCXJldHVybiAw OworCQl9CisKKwkJLyogZmluZCB0aGUgbWVzc2FnZSAqLworCQlzbG90ID0gbWdyLT5kb3duX3Jl cF9yZWN2LmluaXRpYWxfaGRyLnNlcW5vOworCQltdXRleF9sb2NrKCZtZ3ItPnFsb2NrKTsKKwkJ dHhtc2cgPSBtc3RiLT50eF9zbG90c1tzbG90XTsKKwkJLyogcmVtb3ZlIGZyb20gc2xvdHMgKi8K KwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPnFsb2NrKTsKKworCQlpZiAoIXR4bXNnKSB7CisJCQlEUk1f REVCVUdfS01TKCJHb3QgTVNUIHJlcGx5IHdpdGggbm8gbXNnICVwICVkICVkICUwMnggJTAyeFxu IiwKKwkJCSAgICAgICBtc3RiLAorCQkJICAgICAgIG1nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFs X2hkci5zZXFubywKKwkJCSAgICAgICBtZ3ItPmRvd25fcmVwX3JlY3YuaW5pdGlhbF9oZHIubGN0 LAorCQkJCSAgICAgIG1nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5yYWRbMF0sCisJCQkJ ICAgICAgbWdyLT5kb3duX3JlcF9yZWN2Lm1zZ1swXSk7CisJCQlkcm1fZHBfcHV0X21zdF9icmFu Y2hfZGV2aWNlKG1zdGIpOworCQkJbWVtc2V0KCZtZ3ItPmRvd25fcmVwX3JlY3YsIDAsIHNpemVv ZihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCkpOworCQkJcmV0dXJuIDA7CisJCX0KKwor CQlkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVwbHkoJm1nci0+ZG93bl9yZXBfcmVjdiwgJnR4bXNn LT5yZXBseSk7CisJCWlmICh0eG1zZy0+cmVwbHkucmVwbHlfdHlwZSA9PSAxKSB7CisJCQlEUk1f REVCVUdfS01TKCJHb3QgTkFLIHJlcGx5OiByZXEgMHglMDJ4LCByZWFzb24gMHglMDJ4LCBuYWsg ZGF0YSAweCUwMnhcbiIsIHR4bXNnLT5yZXBseS5yZXFfdHlwZSwgdHhtc2ctPnJlcGx5LnUubmFr LnJlYXNvbiwgdHhtc2ctPnJlcGx5LnUubmFrLm5ha19kYXRhKTsKKwkJfSBlbHNlCisJCQlEUk1f REVCVUdfS01TKCJnb3QgYWNrXG4iKTsKKworCQltZW1zZXQoJm1nci0+ZG93bl9yZXBfcmVjdiwg MCwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4KSk7CisJCWRybV9kcF9wdXRf bXN0X2JyYW5jaF9kZXZpY2UobXN0Yik7CisKKwkJbXV0ZXhfbG9jaygmbWdyLT5xbG9jayk7CisJ CXR4bXNnLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9UWF9SWDsKKwkJbXN0Yi0+dHhfc2xvdHNb c2xvdF0gPSBOVUxMOworCQltdXRleF91bmxvY2soJm1nci0+cWxvY2spOworCisJCXdha2VfdXAo Jm1nci0+dHhfd2FpdHEpOworCX0KKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRybV9k cF9tc3RfaGFuZGxlX3VwX3JlcShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncikK K3sKKwlpbnQgcmV0ID0gMDsKKwlkcm1fZHBfZ2V0X29uZV9zYl9tc2cobWdyLCB0cnVlKTsKKwor CWlmIChtZ3ItPnVwX3JlcV9yZWN2LmhhdmVfZW9tdCkgeworCQlzdHJ1Y3QgZHJtX2RwX3NpZGVi YW5kX21zZ19yZXFfYm9keSBtc2c7CisJCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YjsK KwkJYm9vbCBzZXFubzsKKwkJbXN0YiA9IGRybV9kcF9nZXRfbXN0X2JyYW5jaF9kZXZpY2UobWdy LAorCQkJCQkJICAgIG1nci0+dXBfcmVxX3JlY3YuaW5pdGlhbF9oZHIubGN0LAorCQkJCQkJICAg IG1nci0+dXBfcmVxX3JlY3YuaW5pdGlhbF9oZHIucmFkKTsKKwkJaWYgKCFtc3RiKSB7CisJCQlE Uk1fREVCVUdfS01TKCJHb3QgTVNUIHJlcGx5IGZyb20gdW5rbm93biBkZXZpY2UgJWRcbiIsIG1n ci0+dXBfcmVxX3JlY3YuaW5pdGlhbF9oZHIubGN0KTsKKwkJCW1lbXNldCgmbWdyLT51cF9yZXFf cmVjdiwgMCwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4KSk7CisJCQlyZXR1 cm4gMDsKKwkJfQorCisJCXNlcW5vID0gbWdyLT51cF9yZXFfcmVjdi5pbml0aWFsX2hkci5zZXFu bzsKKwkJZHJtX2RwX3NpZGViYW5kX3BhcnNlX3JlcSgmbWdyLT51cF9yZXFfcmVjdiwgJm1zZyk7 CisKKwkJaWYgKG1zZy5yZXFfdHlwZSA9PSBEUF9DT05ORUNUSU9OX1NUQVRVU19OT1RJRlkpIHsK KwkJCWRybV9kcF9zZW5kX3VwX2Fja19yZXBseShtZ3IsIG1zdGIsIG1zZy5yZXFfdHlwZSwgc2Vx bm8sIGZhbHNlKTsKKwkJCWRybV9kcF91cGRhdGVfcG9ydChtc3RiLCAmbXNnLnUuY29ubl9zdGF0 KTsKKwkJCURSTV9ERUJVR19LTVMoIkdvdCBDU046IHBuOiAlZCBsZHBzOiVkIGRkcHM6ICVkIG1j czogJWQgaXA6ICVkIHBkdDogJWRcbiIsIG1zZy51LmNvbm5fc3RhdC5wb3J0X251bWJlciwgbXNn LnUuY29ubl9zdGF0LmxlZ2FjeV9kZXZpY2VfcGx1Z19zdGF0dXMsIG1zZy51LmNvbm5fc3RhdC5k aXNwbGF5cG9ydF9kZXZpY2VfcGx1Z19zdGF0dXMsIG1zZy51LmNvbm5fc3RhdC5tZXNzYWdlX2Nh cGFiaWxpdHlfc3RhdHVzLCBtc2cudS5jb25uX3N0YXQuaW5wdXRfcG9ydCwgbXNnLnUuY29ubl9z dGF0LnBlZXJfZGV2aWNlX3R5cGUpOworCQkJcmV0ID0gMTsKKwkJfSBlbHNlIGlmIChtc2cucmVx X3R5cGUgPT0gRFBfUkVTT1VSQ0VfU1RBVFVTX05PVElGWSkgeworCQkJZHJtX2RwX3NlbmRfdXBf YWNrX3JlcGx5KG1nciwgbXN0YiwgbXNnLnJlcV90eXBlLCBzZXFubywgZmFsc2UpOworCQkJRFJN X0RFQlVHX0tNUygiR290IFJTTjogcG46ICVkIGF2YWlsX3BibiAlZFxuIiwgbXNnLnUucmVzb3Vy Y2Vfc3RhdC5wb3J0X251bWJlciwgbXNnLnUucmVzb3VyY2Vfc3RhdC5hdmFpbGFibGVfcGJuKTsK KwkJfQorCisJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UobXN0Yik7CisJCW1lbXNldCgm bWdyLT51cF9yZXFfcmVjdiwgMCwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4 KSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJtX2RwX21zdF9ocGRfaXJxKCkg LSBNU1QgaG90cGx1ZyBJUlEgbm90aWZ5CisgKiBAbWdyOiBtYW5hZ2VyIHRvIG5vdGlmeSBpcnEg Zm9yLgorICogQGlycV92ZWN0b3I6IHNlcnZpY2UgaXJxIHZlY3RvciBjb250YWluaW5nIFVQL0RP V04gUkVRLgorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2ZXIgd2hl biBpdCBkZXRlY3RzIGEgc2hvcnQgSVJRLAorICogYWxvbmcgd2l0aCB0aGUgdmFsdWUgb2YgdGhl IERFVklDRV9TRVJWSUNFX0lSUV9WRUNUT1JfRVNJMC4gVGhlCisgKiB0b3BvbG9neSBtYW5hZ2Vy IHdpbGwgcHJvY2VzcyB0aGUgc2lkZWJhbmQgbWVzc2FnZXMgcmVjZWl2ZWQgYXMgYSByZXN1bHQK KyAqIG9mIHRoaXMuCisgKi8KK2ludCBkcm1fZHBfbXN0X2hwZF9pcnEoc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IsIGludCBpcnFfdmVjdG9yKQoreworCWludCByZXQgPSAwOwor CisJaWYgKGlycV92ZWN0b3IgJiBEUF9ET1dOX1JFUF9NU0dfUkRZKSB7CisJCXJldCA9IGRybV9k cF9tc3RfaGFuZGxlX2Rvd25fcmVwKG1ncik7CisJfQorCisJaWYgKGlycV92ZWN0b3IgJiBEUF9V UF9SRVFfTVNHX1JEWSkgeworCQlyZXQgfD0gZHJtX2RwX21zdF9oYW5kbGVfdXBfcmVxKG1ncik7 CisJfQorCisJZHJtX2RwX21zdF9raWNrX3R4KG1ncik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9S VF9TWU1CT0woZHJtX2RwX21zdF9ocGRfaXJxKTsKKworLyoqCisgKiBkcm1fZHBfbXN0X2RldGVj dF9wb3J0KCkgLSBnZXQgY29ubmVjdGlvbiBzdGF0dXMgZm9yIGFuIE1TVCBwb3J0CisgKiBAbWdy OiBtYW5hZ2VyIGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiB1bnZlcmlmaWVkIHBvaW50ZXIgdG8g YSBwb3J0CisgKgorICogVGhpcyByZXR1cm5zIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gc3RhdGUg Zm9yIGEgcG9ydC4gSXQgdmFsaWRhdGVzIHRoZQorICogcG9ydCBwb2ludGVyIHN0aWxsIGV4aXN0 cyBzbyB0aGUgY2FsbGVyIGRvZXNuJ3QgcmVxdWlyZSBhIHJlZmVyZW5jZQorICovCitlbnVtIGRy bV9jb25uZWN0b3Jfc3RhdHVzIGRybV9kcF9tc3RfZGV0ZWN0X3BvcnQoc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpCit7CisJ ZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nv bm5lY3RlZDsKKworCS8qIHdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUgcG9ydCBpbiB0aGUgbWdy IGluIGNhc2UgaXRzIGdvbmUgKi8KKwlwb3J0ID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfcG9ydF9y ZWYobWdyLCBwb3J0KTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rp c2Nvbm5lY3RlZDsKKworCWlmICghcG9ydC0+ZGRwcykKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2gg KHBvcnQtPnBkdCkgeworCWNhc2UgRFBfUEVFUl9ERVZJQ0VfTk9ORToKKwljYXNlIERQX1BFRVJf REVWSUNFX01TVF9CUkFOQ0hJTkc6CisJCWJyZWFrOworCisJY2FzZSBEUF9QRUVSX0RFVklDRV9T U1RfU0lOSzoKKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWJyZWFr OworCWNhc2UgRFBfUEVFUl9ERVZJQ0VfRFBfTEVHQUNZX0NPTlY6CisJCWlmIChwb3J0LT5sZHBz KQorCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWJyZWFrOworCX0K K291dDoKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9S VF9TWU1CT0woZHJtX2RwX21zdF9kZXRlY3RfcG9ydCk7CisKKy8qKgorICogZHJtX2RwX21zdF9n ZXRfZWRpZCgpIC0gZ2V0IEVESUQgZm9yIGFuIE1TVCBwb3J0CisgKiBAY29ubmVjdG9yOiB0b3Bs ZXZlbCBjb25uZWN0b3IgdG8gZ2V0IEVESUQgZm9yCisgKiBAbWdyOiBtYW5hZ2VyIGZvciB0aGlz IHBvcnQKKyAqIEBwb3J0OiB1bnZlcmlmaWVkIHBvaW50ZXIgdG8gYSBwb3J0LgorICoKKyAqIFRo aXMgcmV0dXJucyBhbiBFRElEIGZvciB0aGUgcG9ydCBjb25uZWN0ZWQgdG8gYSBjb25uZWN0b3Is CisgKiBJdCB2YWxpZGF0ZXMgdGhlIHBvaW50ZXIgc3RpbGwgZXhpc3RzIHNvIHRoZSBjYWxsZXIg ZG9lc24ndCByZXF1aXJlIGEKKyAqIHJlZmVyZW5jZS4KKyAqLworc3RydWN0IGVkaWQgKmRybV9k cF9tc3RfZ2V0X2VkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRy bV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQp Cit7CisJc3RydWN0IGVkaWQgKmVkaWQgPSBOVUxMOworCisJLyogd2UgbmVlZCB0byBzZWFyY2gg Zm9yIHRoZSBwb3J0IGluIHRoZSBtZ3IgaW4gY2FzZSBpdHMgZ29uZSAqLworCXBvcnQgPSBkcm1f ZHBfZ2V0X3ZhbGlkYXRlZF9wb3J0X3JlZihtZ3IsIHBvcnQpOworCWlmICghcG9ydCkKKwkJcmV0 dXJuIE5VTEw7CisKKwllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJnBvcnQtPmF1eC5k ZGMpOworCWRybV9kcF9wdXRfcG9ydChwb3J0KTsKKwlyZXR1cm4gZWRpZDsKK30KK0VYUE9SVF9T WU1CT0woZHJtX2RwX21zdF9nZXRfZWRpZCk7CisKKy8qKgorICogZHJtX2RwX2ZpbmRfdmNwaV9z bG90cygpIC0gZmluZCBzbG90cyBmb3IgdGhpcyBQQk4gdmFsdWUKKyAqIEBtZ3I6IG1hbmFnZXIg dG8gdXNlCisgKiBAcGJuOiBwYXlsb2FkIGJhbmR3aWR0aCB0byBjb252ZXJ0IGludG8gc2xvdHMu CisgKi8KK2ludCBkcm1fZHBfZmluZF92Y3BpX3Nsb3RzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9s b2d5X21nciAqbWdyLAorCQkJICAgaW50IHBibikKK3sKKwlpbnQgbnVtX3Nsb3RzOworCisJbnVt X3Nsb3RzID0gRElWX1JPVU5EX1VQKHBibiwgbWdyLT5wYm5fZGl2KTsKKworCWlmIChudW1fc2xv dHMgPiBtZ3ItPmF2YWlsX3Nsb3RzKQorCQlyZXR1cm4gLUVOT1NQQzsKKwlyZXR1cm4gbnVtX3Ns b3RzOworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfZmluZF92Y3BpX3Nsb3RzKTsKKworc3RhdGlj IGludCBkcm1fZHBfaW5pdF92Y3BpKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy LAorCQkJICAgIHN0cnVjdCBkcm1fZHBfdmNwaSAqdmNwaSwgaW50IHBibikKK3sKKwlpbnQgbnVt X3Nsb3RzOworCWludCByZXQ7CisKKwludW1fc2xvdHMgPSBESVZfUk9VTkRfVVAocGJuLCBtZ3It PnBibl9kaXYpOworCisJaWYgKG51bV9zbG90cyA+IG1nci0+YXZhaWxfc2xvdHMpCisJCXJldHVy biAtRU5PU1BDOworCisJdmNwaS0+cGJuID0gcGJuOworCXZjcGktPmFsaWduZWRfcGJuID0gbnVt X3Nsb3RzICogbWdyLT5wYm5fZGl2OworCXZjcGktPm51bV9zbG90cyA9IG51bV9zbG90czsKKwor CXJldCA9IGRybV9kcF9tc3RfYXNzaWduX3BheWxvYWRfaWQobWdyLCB2Y3BpKTsKKwlpZiAocmV0 IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkcm1fZHBfbXN0 X2FsbG9jYXRlX3ZjcGkoKSAtIEFsbG9jYXRlIGEgdmlydHVhbCBjaGFubmVsCisgKiBAbWdyOiBt YW5hZ2VyIGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiBwb3J0IHRvIGFsbG9jYXRlIGEgdmlydHVh bCBjaGFubmVsIGZvci4KKyAqIEBwYm46IHBheWxvYWQgYmFuZHdpZHRoIG51bWJlciB0byByZXF1 ZXN0CisgKiBAc2xvdHM6IHJldHVybmVkIG51bWJlciBvZiBzbG90cyBmb3IgdGhpcyBQQk4uCisg Ki8KK2Jvb2wgZHJtX2RwX21zdF9hbGxvY2F0ZV92Y3BpKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9s b2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LCBpbnQgcGJuLCBpbnQg KnNsb3RzKQoreworCWludCByZXQ7CisKKwlwb3J0ID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfcG9y dF9yZWYobWdyLCBwb3J0KTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChw Ym4gPT0gcG9ydC0+dmNwaS5wYm4pIHsKKwkJRFJNX0RFQlVHX0tNUygiYWxyZWFkeSBoYXZlIHZj cGkgYWxsb2NhdGVkIGZvciBwYm4gJWRcbiIsIHBibik7CisJCSpzbG90cyA9IHBvcnQtPnZjcGku bnVtX3Nsb3RzOworCQlyZXR1cm4gdHJ1ZTsKKwl9CisKKwlyZXQgPSBkcm1fZHBfaW5pdF92Y3Bp KG1nciwgJnBvcnQtPnZjcGksIHBibik7CisJaWYgKHJldCkgeworCQlEUk1fREVCVUdfS01TKCJm YWlsZWQgdG8gaW5pdCB2Y3BpICVkICVkICVkXG4iLCBESVZfUk9VTkRfVVAocGJuLCBtZ3ItPnBi bl9kaXYpLCBtZ3ItPmF2YWlsX3Nsb3RzLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJRFJNX0RF QlVHX0tNUygiaW5pdGluZyB2Y3BpIGZvciAlZCAlZFxuIiwgcGJuLCBwb3J0LT52Y3BpLm51bV9z bG90cyk7CisJKnNsb3RzID0gcG9ydC0+dmNwaS5udW1fc2xvdHM7CisKKwlkcm1fZHBfcHV0X3Bv cnQocG9ydCk7CisJcmV0dXJuIHRydWU7CitvdXQ6CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JU X1NZTUJPTChkcm1fZHBfbXN0X2FsbG9jYXRlX3ZjcGkpOworCisvKioKKyAqIGRybV9kcF9tc3Rf cmVzZXRfdmNwaV9zbG90cygpIC0gUmVzZXQgbnVtYmVyIG9mIHNsb3RzIHRvIDAgZm9yIFZDUEkK KyAqIEBtZ3I6IG1hbmFnZXIgZm9yIHRoaXMgcG9ydAorICogQHBvcnQ6IHVudmVyaWZpZWQgcG9p bnRlciB0byBhIHBvcnQuCisgKgorICogVGhpcyBqdXN0IHJlc2V0cyB0aGUgbnVtYmVyIG9mIHNs b3RzIGZvciB0aGUgcG9ydHMgVkNQSSBmb3IgbGF0ZXIgcHJvZ3JhbW1pbmcuCisgKi8KK3ZvaWQg ZHJtX2RwX21zdF9yZXNldF92Y3BpX3Nsb3RzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21n ciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQoreworCXBvcnQgPSBkcm1fZHBf Z2V0X3ZhbGlkYXRlZF9wb3J0X3JlZihtZ3IsIHBvcnQpOworCWlmICghcG9ydCkKKwkJcmV0dXJu OworCXBvcnQtPnZjcGkubnVtX3Nsb3RzID0gMDsKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7Cit9 CitFWFBPUlRfU1lNQk9MKGRybV9kcF9tc3RfcmVzZXRfdmNwaV9zbG90cyk7CisKKy8qKgorICog ZHJtX2RwX21zdF9kZWFsbG9jYXRlX3ZjcGkoKSAtIGRlYWxsb2NhdGUgYSBWQ1BJCisgKiBAbWdy OiBtYW5hZ2VyIGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiB1bnZlcmlmaWVkIHBvcnQgdG8gZGVh bGxvY2F0ZSB2Y3BpIGZvcgorICovCit2b2lkIGRybV9kcF9tc3RfZGVhbGxvY2F0ZV92Y3BpKHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0 ICpwb3J0KQoreworCXBvcnQgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9wb3J0X3JlZihtZ3IsIHBv cnQpOworCWlmICghcG9ydCkKKwkJcmV0dXJuOworCisJZHJtX2RwX21zdF9wdXRfcGF5bG9hZF9p ZChtZ3IsIHBvcnQtPnZjcGkudmNwaSk7CisJcG9ydC0+dmNwaS5udW1fc2xvdHMgPSAwOworCXBv cnQtPnZjcGkucGJuID0gMDsKKwlwb3J0LT52Y3BpLmFsaWduZWRfcGJuID0gMDsKKwlwb3J0LT52 Y3BpLnZjcGkgPSAtMTsKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7Cit9CitFWFBPUlRfU1lNQk9M KGRybV9kcF9tc3RfZGVhbGxvY2F0ZV92Y3BpKTsKKworc3RhdGljIGludCBkcm1fZHBfZHBjZF93 cml0ZV9wYXlsb2FkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAg ICAgaW50IGlkLCBzdHJ1Y3QgZHJtX2RwX3BheWxvYWQgKnBheWxvYWQpCit7CisJdTggcGF5bG9h ZF9hbGxvY1szXSwgc3RhdHVzOworCWludCByZXQ7CisJaW50IHJldHJpZXMgPSAwOworCisJbXV0 ZXhfbG9jaygmbWdyLT5hdXhfbG9jayk7CisJZHJtX2RwX2RwY2Rfd3JpdGViKG1nci0+YXV4LCBE UF9QQVlMT0FEX1RBQkxFX1VQREFURV9TVEFUVVMsCisJCQkgICBEUF9QQVlMT0FEX1RBQkxFX1VQ REFURUQpOworCW11dGV4X3VubG9jaygmbWdyLT5hdXhfbG9jayk7CisKKwlwYXlsb2FkX2FsbG9j WzBdID0gaWQ7CisJcGF5bG9hZF9hbGxvY1sxXSA9IHBheWxvYWQtPnN0YXJ0X3Nsb3Q7CisJcGF5 bG9hZF9hbGxvY1syXSA9IHBheWxvYWQtPm51bV9zbG90czsKKworCW11dGV4X2xvY2soJm1nci0+ YXV4X2xvY2spOworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlKG1nci0+YXV4LCBEUF9QQVlMT0FE X0FMTE9DQVRFX1NFVCwgcGF5bG9hZF9hbGxvYywgMyk7CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPmF1 eF9sb2NrKTsKKwlpZiAocmV0ICE9IDMpIHsKKwkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIHdy aXRlIHBheWxvYWQgYWxsb2NhdGlvbiAlZFxuIiwgcmV0KTsKKwkJZ290byBmYWlsOworCX0KKwor IHJldHJ5OgorCW11dGV4X2xvY2soJm1nci0+YXV4X2xvY2spOworCXJldCA9IGRybV9kcF9kcGNk X3JlYWRiKG1nci0+YXV4LCBEUF9QQVlMT0FEX1RBQkxFX1VQREFURV9TVEFUVVMsICZzdGF0dXMp OworCW11dGV4X3VubG9jaygmbWdyLT5hdXhfbG9jayk7CisJaWYgKHJldCA8IDApIHsKKwkJRFJN X0RFQlVHX0tNUygiZmFpbGVkIHRvIHJlYWQgcGF5bG9hZCB0YWJsZSBzdGF0dXMgJWRcbiIsIHJl dCk7CisJCWdvdG8gZmFpbDsKKwl9CisKKwlpZiAoIShzdGF0dXMgJiBEUF9QQVlMT0FEX1RBQkxF X1VQREFURUQpKSB7CisJCWlmIChyZXRyaWVzKysgPCA1KSB7CisJCQl1ZGVsYXkoMTApOworCQkJ Z290byByZXRyeTsKKwkJfQorCQlEUk1fREVCVUdfS01TKCJzdGF0dXMgbm90IHNldCBhZnRlciBy ZWFkIHBheWxvYWQgdGFibGUgc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQlyZXQgPSAtRUlOVkFM OworCQlnb3RvIGZhaWw7CisJfQorCXJldCA9IDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisK KworLyoqCisgKiBkcm1fZHBfY2hlY2tfYWN0X3N0YXR1cygpIC0gQ2hlY2sgQUNUIGhhbmRsZWQg c3RhdHVzLgorICogQG1ncjogbWFuYWdlciB0byB1c2UKKyAqCisgKiBDaGVjayB0aGUgcGF5bG9h ZCBzdGF0dXMgYml0cyBpbiB0aGUgRFBDRCBmb3IgQUNUIGhhbmRsZWQgY29tcGxldGlvbi4KKyAq LworaW50IGRybV9kcF9jaGVja19hY3Rfc3RhdHVzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyKQoreworCXU4IHN0YXR1czsKKwlpbnQgcmV0OworCWludCBjb3VudCA9IDA7CisK KwlkbyB7CisJCW11dGV4X2xvY2soJm1nci0+YXV4X2xvY2spOworCQlyZXQgPSBkcm1fZHBfZHBj ZF9yZWFkYihtZ3ItPmF1eCwgRFBfUEFZTE9BRF9UQUJMRV9VUERBVEVfU1RBVFVTLCAmc3RhdHVz KTsKKwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKworCQlpZiAocmV0IDwgMCkgewor CQkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIHJlYWQgcGF5bG9hZCB0YWJsZSBzdGF0dXMgJWRc biIsIHJldCk7CisJCQlnb3RvIGZhaWw7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRFBfUEFZTE9B RF9BQ1RfSEFORExFRCkKKwkJCWJyZWFrOworCQljb3VudCsrOworCQl1ZGVsYXkoMTAwKTsKKwor CX0gd2hpbGUgKGNvdW50IDwgMzApOworCisJaWYgKCEoc3RhdHVzICYgRFBfUEFZTE9BRF9BQ1Rf SEFORExFRCkpIHsKKwkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIGdldCBBQ1QgYml0ICVkIGFm dGVyICVkIHJldHJpZXNcbiIsIHN0YXR1cywgY291bnQpOworCQlyZXQgPSAtRUlOVkFMOworCQln b3RvIGZhaWw7CisJfQorCXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JU X1NZTUJPTChkcm1fZHBfY2hlY2tfYWN0X3N0YXR1cyk7CisKKy8qKgorICogZHJtX2RwX2NhbGNf cGJuX21vZGUoKSAtIENhbGN1bGF0ZSB0aGUgUEJOIGZvciBhIG1vZGUuCisgKiBAY2xvY2s6IGRv dCBjbG9jayBmb3IgdGhlIG1vZGUKKyAqIEBicHA6IGJwcCBmb3IgdGhlIG1vZGUuCisgKgorICog VGhpcyB1c2VzIHRoZSBmb3JtdWxhIGluIHRoZSBzcGVjIHRvIGNhbGN1bGF0ZSB0aGUgUEJOIHZh bHVlIGZvciBhIG1vZGUuCisgKi8KK2ludCBkcm1fZHBfY2FsY19wYm5fbW9kZShpbnQgY2xvY2ss IGludCBicHApCit7CisJZml4ZWQyMF8xMiBwaXhfYnc7CisJZml4ZWQyMF8xMiBmYnBwOworCWZp eGVkMjBfMTIgcmVzdWx0OworCWZpeGVkMjBfMTIgbWFyZ2luLCB0bXA7CisJdTMyIHJlczsKKwor CXBpeF9idy5mdWxsID0gZGZpeGVkX2NvbnN0KGNsb2NrKTsKKwlmYnBwLmZ1bGwgPSBkZml4ZWRf Y29uc3QoYnBwKTsKKwl0bXAuZnVsbCA9IGRmaXhlZF9jb25zdCg4KTsKKwlmYnBwLmZ1bGwgPSBk Zml4ZWRfZGl2KGZicHAsIHRtcCk7CisKKwlyZXN1bHQuZnVsbCA9IGRmaXhlZF9tdWwocGl4X2J3 LCBmYnBwKTsKKwltYXJnaW4uZnVsbCA9IGRmaXhlZF9jb25zdCg1NCk7CisJdG1wLmZ1bGwgPSBk Zml4ZWRfY29uc3QoNjQpOworCW1hcmdpbi5mdWxsID0gZGZpeGVkX2RpdihtYXJnaW4sIHRtcCk7 CisJcmVzdWx0LmZ1bGwgPSBkZml4ZWRfZGl2KHJlc3VsdCwgbWFyZ2luKTsKKworCW1hcmdpbi5m dWxsID0gZGZpeGVkX2NvbnN0KDEwMDYpOworCXRtcC5mdWxsID0gZGZpeGVkX2NvbnN0KDEwMDAp OworCW1hcmdpbi5mdWxsID0gZGZpeGVkX2RpdihtYXJnaW4sIHRtcCk7CisJcmVzdWx0LmZ1bGwg PSBkZml4ZWRfbXVsKHJlc3VsdCwgbWFyZ2luKTsKKworCXJlc3VsdC5mdWxsID0gZGZpeGVkX2Rp dihyZXN1bHQsIHRtcCk7CisJcmVzdWx0LmZ1bGwgPSBkZml4ZWRfY2VpbChyZXN1bHQpOworCXJl cyA9IGRmaXhlZF90cnVuYyhyZXN1bHQpOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9M KGRybV9kcF9jYWxjX3Bibl9tb2RlKTsKKworc3RhdGljIGludCB0ZXN0X2NhbGNfcGJuX21vZGUo dm9pZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IGRybV9kcF9jYWxjX3Bibl9tb2RlKDE1NDAwMCwg MzApOworCWlmIChyZXQgIT0gNjg5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBkcm1fZHBf Y2FsY19wYm5fbW9kZSgyMzQwMDAsIDMwKTsKKwlpZiAocmV0ICE9IDEwNDcpCisJCXJldHVybiAt RUlOVkFMOworCXJldHVybiAwOworfQorCisvKiB3ZSB3YW50IHRvIGtpY2sgdGhlIFRYIGFmdGVy IHdlJ3ZlIGFjayB0aGUgdXAvZG93biBJUlFzLiAqLworc3RhdGljIHZvaWQgZHJtX2RwX21zdF9r aWNrX3R4KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCXF1ZXVlX3dv cmsoc3lzdGVtX2xvbmdfd3EsICZtZ3ItPnR4X3dvcmspOworfQorCitzdGF0aWMgdm9pZCBkcm1f ZHBfbXN0X2R1bXBfbXN0YihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJCQkJIHN0cnVjdCBkcm1fZHBf bXN0X2JyYW5jaCAqbXN0YikKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0OworCWlu dCB0YWJzID0gbXN0Yi0+bGN0OworCWNoYXIgcHJlZml4WzEwXTsKKwlpbnQgaTsKKworCWZvciAo aSA9IDA7IGkgPCB0YWJzOyBpKyspCisJCXByZWZpeFtpXSA9ICdcdCc7CisJcHJlZml4W2ldID0g J1wwJzsKKworCXNlcV9wcmludGYobSwgIiVzbXN0OiAlcCwgJWRcbiIsIHByZWZpeCwgbXN0Yiwg bXN0Yi0+bnVtX3BvcnRzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZtc3RiLT5wb3J0 cywgbmV4dCkgeworCQlzZXFfcHJpbnRmKG0sICIlc3BvcnQ6ICVkOiBkZHBzOiAlZCBsZHBzOiAl ZCwgJXAsIGNvbm46ICVwXG4iLCBwcmVmaXgsIHBvcnQtPnBvcnRfbnVtLCBwb3J0LT5kZHBzLCBw b3J0LT5sZHBzLCBwb3J0LCBwb3J0LT5jb25uZWN0b3IpOworCQlpZiAocG9ydC0+bXN0YikKKwkJ CWRybV9kcF9tc3RfZHVtcF9tc3RiKG0sIHBvcnQtPm1zdGIpOworCX0KK30KKworCisvKioKKyAq IGRybV9kcF9tc3RfZHVtcF90b3BvbG9neSgpOiBkdW1wIHRvcG9sb2d5IHRvIHNlcSBmaWxlLgor ICogQG06IHNlcV9maWxlIHRvIGR1bXAgb3V0cHV0IHRvCisgKiBAbWdyOiBtYW5hZ2VyIHRvIGR1 bXAgY3VycmVudCB0b3BvbG9neSBmb3IuCisgKgorICogaGVscGVyIHRvIGR1bXAgTVNUIHRvcG9s b2d5IHRvIGEgc2VxIGZpbGUgZm9yIGRlYnVnZnMuCisgKi8KK3ZvaWQgZHJtX2RwX21zdF9kdW1w X3RvcG9sb2d5KHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZHBfbXN0 X3RvcG9sb2d5X21nciAqbWdyKQoreworCW11dGV4X2xvY2soJm1nci0+bG9jayk7CisJZHJtX2Rw X21zdF9kdW1wX21zdGIobSwgbWdyLT5tc3RfcHJpbWFyeSk7CisJbXV0ZXhfdW5sb2NrKCZtZ3It PmxvY2spOworCit9CitFWFBPUlRfU1lNQk9MKGRybV9kcF9tc3RfZHVtcF90b3BvbG9neSk7CisK K3N0YXRpYyB2b2lkIGRybV9kcF90eF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sK KwlzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciA9IGNvbnRhaW5lcl9vZih3b3Jr LCBzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IsIHR4X3dvcmspOworCisJbXV0ZXhfbG9j aygmbWdyLT5xbG9jayk7CisJaWYgKG1nci0+dHhfZG93bl9pbl9wcm9ncmVzcykKKwkJcHJvY2Vz c19zaW5nbGVfZG93bl90eF9xbG9jayhtZ3IpOworCW11dGV4X3VubG9jaygmbWdyLT5xbG9jayk7 Cit9CisKKworLyoqCisgKiBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9pbml0IC0gaW5pdGlhbGlz ZSBhIHRvcG9sb2d5IG1hbmFnZXIKKyAqIEBtZ3I6IG1hbmFnZXIgc3RydWN0IHRvIGluaXRpYWxp c2UKKyAqIEBkZXY6IGRldmljZSBwcm92aWRpbmcgdGhpcyBzdHJ1Y3R1cmUgLSBmb3IgaTJjIGFk ZGl0aW9uLgorICogQGF1eDogRFAgaGVscGVyIGF1eCBjaGFubmVsIHRvIHRhbGsgdG8gdGhpcyBk ZXZpY2UKKyAqIEBtYXhfZHBjZF90cmFuc2FjdGlvbl9ieXRlczogaHcgc3BlY2lmaWMgRFBDRCB0 cmFuc2FjdGlvbiBsaW1pdAorICogQG1heF9wYXlsb2FkczogbWF4aW11bSBudW1iZXIgb2YgcGF5 bG9hZHMgdGhpcyBHUFUgY2FuIHNvdXJjZQorICogQGNvbm5fYmFzZV9pZDogdGhlIGNvbm5lY3Rv ciBvYmplY3QgSUQgdGhlIE1TVCBkZXZpY2UgaXMgY29ubmVjdGVkIHRvLgorICoKKyAqIFJldHVy biAwIGZvciBzdWNjZXNzLCBvciBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUKKyAqLwor aW50IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX2luaXQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsCisJCQkJIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRybV9kcF9hdXgg KmF1eCwKKwkJCQkgaW50IG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLAorCQkJCSBpbnQgbWF4 X3BheWxvYWRzLCBpbnQgY29ubl9iYXNlX2lkKQoreworCW11dGV4X2luaXQoJm1nci0+bG9jayk7 CisJbXV0ZXhfaW5pdCgmbWdyLT5xbG9jayk7CisJbXV0ZXhfaW5pdCgmbWdyLT5hdXhfbG9jayk7 CisJc3Bpbl9sb2NrX2luaXQoJm1nci0+cGF5bG9hZF9sb2NrKTsKKwlJTklUX0xJU1RfSEVBRCgm bWdyLT50eF9tc2dfdXBxKTsKKwlJTklUX0xJU1RfSEVBRCgmbWdyLT50eF9tc2dfZG93bnEpOwor CUlOSVRfV09SSygmbWdyLT53b3JrLCBkcm1fZHBfbXN0X2xpbmtfcHJvYmVfd29yayk7CisJSU5J VF9XT1JLKCZtZ3ItPnR4X3dvcmssIGRybV9kcF90eF93b3JrKTsKKwlpbml0X3dhaXRxdWV1ZV9o ZWFkKCZtZ3ItPnR4X3dhaXRxKTsKKwltZ3ItPmRldiA9IGRldjsKKwltZ3ItPmF1eCA9IGF1eDsK KwltZ3ItPm1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzID0gbWF4X2RwY2RfdHJhbnNhY3Rpb25f Ynl0ZXM7CisJbWdyLT5tYXhfcGF5bG9hZHMgPSBtYXhfcGF5bG9hZHM7CisJbWdyLT5jb25uX2Jh c2VfaWQgPSBjb25uX2Jhc2VfaWQ7CisJbWdyLT5wYXlsb2FkcyA9IGtjYWxsb2MobWF4X3BheWxv YWRzLCBzaXplb2Yoc3RydWN0IGRybV9kcF9wYXlsb2FkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFt Z3ItPnBheWxvYWRzKQorCQlyZXR1cm4gLUVOT01FTTsKKwltZ3ItPnByb3Bvc2VkX3ZjcGlzID0g a2NhbGxvYyhtYXhfcGF5bG9hZHMsIHNpemVvZihzdHJ1Y3QgZHJtX2RwX3ZjcGkgKiksIEdGUF9L RVJORUwpOworCWlmICghbWdyLT5wcm9wb3NlZF92Y3BpcykKKwkJcmV0dXJuIC1FTk9NRU07CisJ c2V0X2JpdCgwLCAmbWdyLT5wYXlsb2FkX21hc2spOworCXRlc3RfY2FsY19wYm5fbW9kZSgpOwor CXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9pbml0 KTsKKworLyoqCisgKiBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9kZXN0cm95KCkgLSBkZXN0cm95 IHRvcG9sb2d5IG1hbmFnZXIuCisgKiBAbWdyOiBtYW5hZ2VyIHRvIGRlc3Ryb3kKKyAqLwordm9p ZCBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9kZXN0cm95KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9s b2d5X21nciAqbWdyKQoreworCXNwaW5fbG9jaygmbWdyLT5wYXlsb2FkX2xvY2spOworCWtmcmVl KG1nci0+cGF5bG9hZHMpOworCWtmcmVlKG1nci0+cHJvcG9zZWRfdmNwaXMpOworCXNwaW5fdW5s b2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJbWdyLT5kZXYgPSBOVUxMOworCW1nci0+YXV4ID0g TlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfZGVzdHJveSk7 CisKKy8qIEkyQyBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgZHJtX2RwX21zdF9pMmNfeGZlcihzdHJ1 Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpMmNfbXNnICptc2dzLAorCQkJICAgICAg IGludCBudW0pCit7CisJc3RydWN0IGRybV9kcF9hdXggKmF1eCA9IGFkYXB0ZXItPmFsZ29fZGF0 YTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKGF1eCwgc3Ry dWN0IGRybV9kcF9tc3RfcG9ydCwgYXV4KTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1z dGI7CisJc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IgPSBwb3J0LT5tZ3I7CisJ dW5zaWduZWQgaW50IGk7CisJYm9vbCByZWFkaW5nID0gZmFsc2U7CisJc3RydWN0IGRybV9kcF9z aWRlYmFuZF9tc2dfcmVxX2JvZHkgbXNnOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4 ICp0eG1zZyA9IE5VTEw7CisJaW50IHJldDsKKworCW1zdGIgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRl ZF9tc3RiX3JlZihtZ3IsIHBvcnQtPnBhcmVudCk7CisJaWYgKCFtc3RiKQorCQlyZXR1cm4gLUVS RU1PVEVJTzsKKworCS8qIGNvbnN0cnVjdCBpMmMgbXNnICovCisJLyogc2VlIGlmIGxhc3QgbXNn IGlzIGEgcmVhZCAqLworCWlmIChtc2dzW251bSAtIDFdLmZsYWdzICYgSTJDX01fUkQpCisJCXJl YWRpbmcgPSB0cnVlOworCisJaWYgKCFyZWFkaW5nKSB7CisJCURSTV9ERUJVR19LTVMoIlVuc3Vw cG9ydGVkIEkyQyB0cmFuc2FjdGlvbiBmb3IgTVNUIGRldmljZVxuIik7CisJCXJldCA9IC1FSU87 CisJCWdvdG8gb3V0OworCX0KKworCW1zZy5yZXFfdHlwZSA9IERQX1JFTU9URV9JMkNfUkVBRDsK Kwltc2cudS5pMmNfcmVhZC5udW1fdHJhbnNhY3Rpb25zID0gbnVtIC0gMTsKKwltc2cudS5pMmNf cmVhZC5wb3J0X251bWJlciA9IHBvcnQtPnBvcnRfbnVtOworCWZvciAoaSA9IDA7IGkgPCBudW0g LSAxOyBpKyspIHsKKwkJbXNnLnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLmkyY19kZXZfaWQg PSBtc2dzW2ldLmFkZHI7CisJCW1zZy51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5udW1fYnl0 ZXMgPSBtc2dzW2ldLmxlbjsKKwkJbWVtY3B5KCZtc2cudS5pMmNfcmVhZC50cmFuc2FjdGlvbnNb aV0uYnl0ZXMsIG1zZ3NbaV0uYnVmLCBtc2dzW2ldLmxlbik7CisJfQorCW1zZy51LmkyY19yZWFk LnJlYWRfaTJjX2RldmljZV9pZCA9IG1zZ3NbbnVtIC0gMV0uYWRkcjsKKwltc2cudS5pMmNfcmVh ZC5udW1fYnl0ZXNfcmVhZCA9IG1zZ3NbbnVtIC0gMV0ubGVuOworCisJdHhtc2cgPSBremFsbG9j KHNpemVvZigqdHhtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKSB7CisJCXJldCA9IC1F Tk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXR4bXNnLT5kc3QgPSBtc3RiOworCWRybV9kcF9l bmNvZGVfc2lkZWJhbmRfcmVxKCZtc2csIHR4bXNnKTsKKworCWRybV9kcF9xdWV1ZV9kb3duX3R4 KG1nciwgdHhtc2cpOworCisJcmV0ID0gZHJtX2RwX21zdF93YWl0X3R4X3JlcGx5KG1zdGIsIHR4 bXNnKTsKKwlpZiAocmV0ID4gMCkgeworCisJCWlmICh0eG1zZy0+cmVwbHkucmVwbHlfdHlwZSA9 PSAxKSB7IC8qIGdvdCBhIE5BSyBiYWNrICovCisJCQlyZXQgPSAtRVJFTU9URUlPOworCQkJZ290 byBvdXQ7CisJCX0KKwkJaWYgKHR4bXNnLT5yZXBseS51LnJlbW90ZV9pMmNfcmVhZF9hY2subnVt X2J5dGVzICE9IG1zZ3NbbnVtIC0gMV0ubGVuKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBv dXQ7CisJCX0KKwkJbWVtY3B5KG1zZ3NbbnVtIC0gMV0uYnVmLCB0eG1zZy0+cmVwbHkudS5yZW1v dGVfaTJjX3JlYWRfYWNrLmJ5dGVzLCBtc2dzW251bSAtIDFdLmxlbik7CisJCXJldCA9IG51bTsK Kwl9CitvdXQ6CisJa2ZyZWUodHhtc2cpOworCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2Uo bXN0Yik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBkcm1fZHBfbXN0X2kyY19mdW5j dGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1cm4gSTJDX0ZV TkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTCB8CisJICAgICAgIEkyQ19GVU5DX1NNQlVTX1JF QURfQkxPQ0tfREFUQSB8CisJICAgICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX1BST0NfQ0FMTCB8 CisJICAgICAgIEkyQ19GVU5DXzEwQklUX0FERFI7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qg aTJjX2FsZ29yaXRobSBkcm1fZHBfbXN0X2kyY19hbGdvID0geworCS5mdW5jdGlvbmFsaXR5ID0g ZHJtX2RwX21zdF9pMmNfZnVuY3Rpb25hbGl0eSwKKwkubWFzdGVyX3hmZXIgPSBkcm1fZHBfbXN0 X2kyY194ZmVyLAorfTsKKworLyoqCisgKiBkcm1fZHBfbXN0X3JlZ2lzdGVyX2kyY19idXMoKSAt IHJlZ2lzdGVyIGFuIEkyQyBhZGFwdGVyIGZvciBJMkMtb3Zlci1BVVgKKyAqIEBhdXg6IERpc3Bs YXlQb3J0IEFVWCBjaGFubmVsCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mgb3IgYSBuZWdh dGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZHJtX2RwX21zdF9y ZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCit7CisJYXV4LT5kZGMuYWxn byA9ICZkcm1fZHBfbXN0X2kyY19hbGdvOworCWF1eC0+ZGRjLmFsZ29fZGF0YSA9IGF1eDsKKwlh dXgtPmRkYy5yZXRyaWVzID0gMzsKKworCWF1eC0+ZGRjLmNsYXNzID0gSTJDX0NMQVNTX0REQzsK KwlhdXgtPmRkYy5vd25lciA9IFRISVNfTU9EVUxFOworCWF1eC0+ZGRjLmRldi5wYXJlbnQgPSBh dXgtPmRldjsKKwlhdXgtPmRkYy5kZXYub2Zfbm9kZSA9IGF1eC0+ZGV2LT5vZl9ub2RlOworCisJ c3RybGNweShhdXgtPmRkYy5uYW1lLCBhdXgtPm5hbWUgPyBhdXgtPm5hbWUgOiBkZXZfbmFtZShh dXgtPmRldiksCisJCXNpemVvZihhdXgtPmRkYy5uYW1lKSk7CisKKwlyZXR1cm4gaTJjX2FkZF9h ZGFwdGVyKCZhdXgtPmRkYyk7Cit9CisKKy8qKgorICogZHJtX2RwX21zdF91bnJlZ2lzdGVyX2ky Y19idXMoKSAtIHVucmVnaXN0ZXIgYW4gSTJDLW92ZXItQVVYIGFkYXB0ZXIKKyAqIEBhdXg6IERp c3BsYXlQb3J0IEFVWCBjaGFubmVsCisgKi8KK3N0YXRpYyB2b2lkIGRybV9kcF9tc3RfdW5yZWdp c3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCit7CisJaTJjX2RlbF9hZGFwdGVy KCZhdXgtPmRkYyk7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZHBfbXN0X2hlbHBl ci5oIGIvaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwLi5lZjE1NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9kcm0v ZHJtX2RwX21zdF9oZWxwZXIuaApAQCAtMCwwICsxLDUwMyBAQAorLyoKKyAqIENvcHlyaWdodCDC qSAyMDE0IFJlZCBIYXQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwg ZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBkb2N1bWVudGF0 aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlk ZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3Bp ZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0aGlzIHBlcm1p c3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZAorICog dGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm90IGJlIHVzZWQgaW4gYWR2 ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZiB0 aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lv bi4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJlc2VudGF0aW9ucworICogYWJv dXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQg aXMgcHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFu dHkuCisgKgorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NMQUlNIEFMTCBXQVJSQU5USUVT IFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxMIElNUExJRUQg V0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCisgKiBFVkVO VCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwg SU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFU U09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQUk9GSVRTLCBX SEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgorICog VE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhF IFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLworI2lmbmRlZiBf RFJNX0RQX01TVF9IRUxQRVJfSF8KKyNkZWZpbmUgX0RSTV9EUF9NU1RfSEVMUEVSX0hfCisKKyNp bmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVscGVyLmg+CisK K3N0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaDsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX2RwX3ZjcGkg LSBWaXJ0dWFsIENoYW5uZWwgUGF5bG9hZCBJZGVudGlmZXIKKyAqIEB2Y3BpOiBWaXJ0dWFsIGNo YW5uZWwgSUQuCisgKiBAcGJuOiBQYXlsb2FkIEJhbmR3aWR0aCBOdW1iZXIgZm9yIHRoaXMgY2hh bm5lbAorICogQGFsaWduZWRfcGJuOiBQQk4gYWxpZ25lZCB3aXRoIHNsb3Qgc2l6ZQorICogQG51 bV9zbG90czogbnVtYmVyIG9mIHNsb3RzIGZvciB0aGlzIFBCTgorICovCitzdHJ1Y3QgZHJtX2Rw X3ZjcGkgeworCWludCB2Y3BpOworCWludCBwYm47CisJaW50IGFsaWduZWRfcGJuOworCWludCBu dW1fc2xvdHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgLSBNU1QgcG9y dAorICogQGtyZWY6IHJlZmVyZW5jZSBjb3VudCBmb3IgdGhpcyBwb3J0LgorICogQGd1aWRfdmFs aWQ6IGZvciBEUCAxLjIgZGV2aWNlcyBpZiB3ZSBoYXZlIHZhbGlkYXRlZCB0aGUgR1VJRC4KKyAq IEBndWlkOiBndWlkIGZvciBEUCAxLjIgZGV2aWNlIG9uIHRoaXMgcG9ydC4KKyAqIEBwb3J0X251 bTogcG9ydCBudW1iZXIKKyAqIEBpbnB1dDogaWYgdGhpcyBwb3J0IGlzIGFuIGlucHV0IHBvcnQu CisgKiBAbWNzOiBtZXNzYWdlIGNhcGFiaWxpdHkgc3RhdHVzIC0gRFAgMS4yIHNwZWMuCisgKiBA ZGRwczogRGlzcGxheVBvcnQgRGV2aWNlIFBsdWcgU3RhdHVzIC0gRFAgMS4yCisgKiBAcGR0OiBQ ZWVyIERldmljZSBUeXBlCisgKiBAbGRwczogTGVnYWN5IERldmljZSBQbHVnIFN0YXR1cworICog QGRwY2RfcmV2OiBEUENEIHJldmlzaW9uIG9mIGRldmljZSBvbiB0aGlzIHBvcnQKKyAqIEBhdmFp bGFibGVfcGJuOiBBdmFpbGFibGUgYmFuZHdpZHRoIGZvciB0aGlzIHBvcnQuCisgKiBAbmV4dDog bGluayB0byBuZXh0IHBvcnQgb24gdGhpcyBicmFuY2ggZGV2aWNlCisgKiBAbXN0YjogYnJhbmNo IGRldmljZSBhdHRhY2ggYmVsb3cgdGhpcyBwb3J0CisgKiBAYXV4OiBpMmMgYXV4IHRyYW5zcG9y dCB0byB0YWxrIHRvIGRldmljZSBjb25uZWN0ZWQgdG8gdGhpcyBwb3J0LgorICogQHBhcmVudDog YnJhbmNoIGRldmljZSBwYXJlbnQgb2YgdGhpcyBwb3J0CisgKiBAdmNwaTogVmlydHVhbCBDaGFu bmVsIFBheWxvYWQgaW5mbyBmb3IgdGhpcyBwb3J0LgorICogQGNvbm5lY3RvcjogRFJNIGNvbm5l Y3RvciB0aGlzIHBvcnQgaXMgY29ubmVjdGVkIHRvLgorICogQG1ncjogdG9wb2xvZ3kgbWFuYWdl ciB0aGlzIHBvcnQgbGl2ZXMgdW5kZXIuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50 cyBhbiBNU1QgcG9ydCBlbmRwb2ludCBvbiBhIGRldmljZSBzb21ld2hlcmUKKyAqIGluIHRoZSBN U1QgdG9wb2xvZ3kuCisgKi8KK3N0cnVjdCBkcm1fZHBfbXN0X3BvcnQgeworCXN0cnVjdCBrcmVm IGtyZWY7CisKKwkvKiBpZiBkcGNkIDEuMiBkZXZpY2UgaXMgb24gdGhpcyBwb3J0IC0gaXRzIEdV SUQgaW5mbyAqLworCWJvb2wgZ3VpZF92YWxpZDsKKwl1OCBndWlkWzE2XTsKKworCXU4IHBvcnRf bnVtOworCWJvb2wgaW5wdXQ7CisJYm9vbCBtY3M7CisJYm9vbCBkZHBzOworCXU4IHBkdDsKKwli b29sIGxkcHM7CisJdTggZHBjZF9yZXY7CisJdWludDE2X3QgYXZhaWxhYmxlX3BibjsKKwlzdHJ1 Y3QgbGlzdF9oZWFkIG5leHQ7CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiOyAvKiBw b2ludGVyIHRvIGFuIG1zdGIgaWYgdGhpcyBwb3J0IGhhcyBvbmUgKi8KKwlzdHJ1Y3QgZHJtX2Rw X2F1eCBhdXg7IC8qIGkyYyBidXMgZm9yIHRoaXMgcG9ydD8gKi8KKwlzdHJ1Y3QgZHJtX2RwX21z dF9icmFuY2ggKnBhcmVudDsKKworCXN0cnVjdCBkcm1fZHBfdmNwaSB2Y3BpOworCXN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdy ICptZ3I7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAtIE1TVCBicmFu Y2ggZGV2aWNlLgorICogQGtyZWY6IHJlZmVyZW5jZSBjb3VudCBmb3IgdGhpcyBwb3J0LgorICog QHJhZDogUmVsYXRpdmUgQWRkcmVzcyB0byB0YWxrIHRvIHRoaXMgYnJhbmNoIGRldmljZS4KKyAq IEBsY3Q6IExpbmsgY291bnQgdG90YWwgdG8gdGFsayB0byB0aGlzIGJyYW5jaCBkZXZpY2UuCisg KiBAbnVtX3BvcnRzOiBudW1iZXIgb2YgcG9ydHMgb24gdGhlIGJyYW5jaC4KKyAqIEBtc2dfc2xv dHM6IG9uZSBiaXQgcGVyIHRyYW5zbWl0dGVkIG1zZyBzbG90LgorICogQHBvcnRzOiBsaW5rZWQg bGlzdCBvZiBwb3J0cyBvbiB0aGlzIGJyYW5jaC4KKyAqIEBwb3J0X3BhcmVudDogcG9pbnRlciB0 byB0aGUgcG9ydCBwYXJlbnQsIE5VTEwgaWYgdG9wbGV2ZWwuCisgKiBAbWdyOiB0b3BvbG9neSBt YW5hZ2VyIGZvciB0aGlzIGJyYW5jaCBkZXZpY2UuCisgKiBAdHhfc2xvdHM6IHRyYW5zbWlzc2lv biBzbG90cyBmb3IgdGhpcyBkZXZpY2UuCisgKiBAbGFzdF9zZXFubzogbGFzdCBzZXF1ZW5jZSBu dW1iZXIgdXNlZCB0byB0YWxrIHRvIHRoaXMuCisgKiBAbGlua19hZGRyZXNzX3NlbnQ6IGlmIGEg bGluayBhZGRyZXNzIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCB0byB0aGlzIGRldmljZSB5ZXQuCisg KgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhbiBNU1QgYnJhbmNoIGRldmljZSwgdGhl cmUgaXMgb25lCisgKiBwcmltYXJ5IGJyYW5jaCBkZXZpY2UgYXQgdGhlIHJvb3QsIGFsb25nIHdp dGggYW55IG90aGVycyBjb25uZWN0ZWQKKyAqIHRvIGRvd25zdHJlYW0gcG9ydHMKKyAqLworc3Ry dWN0IGRybV9kcF9tc3RfYnJhbmNoIHsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXU4IHJhZFs4XTsK Kwl1OCBsY3Q7CisJaW50IG51bV9wb3J0czsKKworCWludCBtc2dfc2xvdHM7CisJc3RydWN0IGxp c3RfaGVhZCBwb3J0czsKKworCS8qIGxpc3Qgb2YgdHggb3BzIHF1ZXVlIGZvciB0aGlzIHBvcnQg Ki8KKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0X3BhcmVudDsKKwlzdHJ1Y3QgZHJtX2Rw X21zdF90b3BvbG9neV9tZ3IgKm1ncjsKKworCS8qIHNsb3RzIGFyZSBwcm90ZWN0ZWQgYnkgbXN0 Yi0+bWdyLT5xbG9jayAqLworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eF9zbG90 c1syXTsKKwlpbnQgbGFzdF9zZXFubzsKKwlib29sIGxpbmtfYWRkcmVzc19zZW50OworfTsKKwor CisvKiBzaWRlYmFuZCBtc2cgaGVhZGVyIC0gbm90IGJpdCBzdHJ1Y3QgKi8KK3N0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX2hkciB7CisJdTggbGN0OworCXU4IGxjcjsKKwl1OCByYWRbOF07CisJ Ym9vbCBicm9hZGNhc3Q7CisJYm9vbCBwYXRoX21zZzsKKwl1OCBtc2dfbGVuOworCWJvb2wgc29t dDsKKwlib29sIGVvbXQ7CisJYm9vbCBzZXFubzsKK307CisKK3N0cnVjdCBkcm1fZHBfbmFrX3Jl cGx5IHsKKwl1OCBndWlkWzE2XTsKKwl1OCByZWFzb247CisJdTggbmFrX2RhdGE7Cit9OworCitz dHJ1Y3QgZHJtX2RwX2xpbmtfYWRkcmVzc19hY2tfcmVwbHkgeworCXU4IGd1aWRbMTZdOworCXU4 IG5wb3J0czsKKwlzdHJ1Y3QgZHJtX2RwX2xpbmtfYWRkcl9yZXBseV9wb3J0IHsKKwkJYm9vbCBp bnB1dF9wb3J0OworCQl1OCBwZWVyX2RldmljZV90eXBlOworCQl1OCBwb3J0X251bWJlcjsKKwkJ Ym9vbCBtY3M7CisJCWJvb2wgZGRwczsKKwkJYm9vbCBsZWdhY3lfZGV2aWNlX3BsdWdfc3RhdHVz OworCQl1OCBkcGNkX3JldmlzaW9uOworCQl1OCBwZWVyX2d1aWRbMTZdOworCQlib29sIG51bV9z ZHBfc3RyZWFtczsKKwkJYm9vbCBudW1fc2RwX3N0cmVhbV9zaW5rczsKKwl9IHBvcnRzWzE2XTsK K307CisKK3N0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2RfcmVhZF9hY2tfcmVwbHkgeworCXU4IHBv cnRfbnVtYmVyOworCXU4IG51bV9ieXRlczsKKwl1OCBieXRlc1syNTVdOworfTsKKworc3RydWN0 IGRybV9kcF9yZW1vdGVfZHBjZF93cml0ZV9hY2tfcmVwbHkgeworCXU4IHBvcnRfbnVtYmVyOwor fTsKKworc3RydWN0IGRybV9kcF9yZW1vdGVfZHBjZF93cml0ZV9uYWtfcmVwbHkgeworCXU4IHBv cnRfbnVtYmVyOworCXU4IHJlYXNvbjsKKwl1OCBieXRlc193cml0dGVuX2JlZm9yZV9mYWlsdXJl OworfTsKKworc3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3JlYWRfYWNrX3JlcGx5IHsKKwl1OCBw b3J0X251bWJlcjsKKwl1OCBudW1fYnl0ZXM7CisJdTggYnl0ZXNbMjU1XTsKK307CisKK3N0cnVj dCBkcm1fZHBfcmVtb3RlX2kyY19yZWFkX25ha19yZXBseSB7CisJdTggcG9ydF9udW1iZXI7CisJ dTggbmFrX3JlYXNvbjsKKwl1OCBpMmNfbmFrX3RyYW5zYWN0aW9uOworfTsKKworc3RydWN0IGRy bV9kcF9yZW1vdGVfaTJjX3dyaXRlX2Fja19yZXBseSB7CisJdTggcG9ydF9udW1iZXI7Cit9Owor CisKK3N0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4IHsKKwl1OCBjaHVua1s0OF07CisJdTgg bXNnWzI1Nl07CisJdTggY3VyY2h1bmtfbGVuOworCXU4IGN1cmNodW5rX2lkeDsgLyogY2h1bmsg d2UgYXJlIHBhcnNpbmcgbm93ICovCisJdTggY3VyY2h1bmtfaGRybGVuOworCXU4IGN1cmxlbjsg LyogdG90YWwgbGVuZ3RoIG9mIHRoZSBtc2cgKi8KKwlib29sIGhhdmVfc29tdDsKKwlib29sIGhh dmVfZW9tdDsKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgaW5pdGlhbF9oZHI7Cit9 OworCisKK3N0cnVjdCBkcm1fZHBfYWxsb2NhdGVfcGF5bG9hZCB7CisJdTggcG9ydF9udW1iZXI7 CisJdTggbnVtYmVyX3NkcF9zdHJlYW1zOworCXU4IHZjcGk7CisJdTE2IHBibjsKKwl1OCBzZHBf c3RyZWFtX3NpbmtbOF07Cit9OworCitzdHJ1Y3QgZHJtX2RwX2FsbG9jYXRlX3BheWxvYWRfYWNr X3JlcGx5IHsKKwl1OCBwb3J0X251bWJlcjsKKwl1OCB2Y3BpOworCXUxNiBhbGxvY2F0ZWRfcGJu OworfTsKKworc3RydWN0IGRybV9kcF9jb25uZWN0aW9uX3N0YXR1c19ub3RpZnkgeworCXU4IGd1 aWRbMTZdOworCXU4IHBvcnRfbnVtYmVyOworCWJvb2wgbGVnYWN5X2RldmljZV9wbHVnX3N0YXR1 czsKKwlib29sIGRpc3BsYXlwb3J0X2RldmljZV9wbHVnX3N0YXR1czsKKwlib29sIG1lc3NhZ2Vf Y2FwYWJpbGl0eV9zdGF0dXM7CisJYm9vbCBpbnB1dF9wb3J0OworCXU4IHBlZXJfZGV2aWNlX3R5 cGU7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNkX3JlYWQgeworCXU4IHBvcnRfbnVt YmVyOworCXUzMiBkcGNkX2FkZHJlc3M7CisJdTggbnVtX2J5dGVzOworfTsKKworc3RydWN0IGRy bV9kcF9yZW1vdGVfZHBjZF93cml0ZSB7CisJdTggcG9ydF9udW1iZXI7CisJdTMyIGRwY2RfYWRk cmVzczsKKwl1OCBudW1fYnl0ZXM7CisJdTggYnl0ZXNbMjU1XTsKK307CisKK3N0cnVjdCBkcm1f ZHBfcmVtb3RlX2kyY19yZWFkIHsKKwl1OCBudW1fdHJhbnNhY3Rpb25zOworCXU4IHBvcnRfbnVt YmVyOworCXN0cnVjdCB7CisJCXU4IGkyY19kZXZfaWQ7CisJCXU4IG51bV9ieXRlczsKKwkJdTgg Ynl0ZXNbMjU1XTsKKwkJdTggbm9fc3RvcF9iaXQ7CisJCXU4IGkyY190cmFuc2FjdGlvbl9kZWxh eTsKKwl9IHRyYW5zYWN0aW9uc1s0XTsKKwl1OCByZWFkX2kyY19kZXZpY2VfaWQ7CisJdTggbnVt X2J5dGVzX3JlYWQ7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfd3JpdGUgeworCXU4 IHBvcnRfbnVtYmVyOworCXU4IHdyaXRlX2kyY19kZXZpY2VfaWQ7CisJdTggbnVtX2J5dGVzOwor CXU4IGJ5dGVzWzI1NV07Cit9OworCisvKiB0aGlzIGNvdmVycyBFTlVNX1JFU09VUkNFUywgUE9X RVJfRE9XTl9QSFksIFBPV0VSX1VQX1BIWSAqLworc3RydWN0IGRybV9kcF9wb3J0X251bWJlcl9y ZXEgeworCXU4IHBvcnRfbnVtYmVyOworfTsKKworc3RydWN0IGRybV9kcF9lbnVtX3BhdGhfcmVz b3VyY2VzX2Fja19yZXBseSB7CisJdTggcG9ydF9udW1iZXI7CisJdTE2IGZ1bGxfcGF5bG9hZF9i d19udW1iZXI7CisJdTE2IGF2YWlsX3BheWxvYWRfYndfbnVtYmVyOworfTsKKworLyogY292ZXJz IFBPV0VSX0RPV05fUEhZLCBQT1dFUl9VUF9QSFkgKi8KK3N0cnVjdCBkcm1fZHBfcG9ydF9udW1i ZXJfcmVwIHsKKwl1OCBwb3J0X251bWJlcjsKK307CisKK3N0cnVjdCBkcm1fZHBfcXVlcnlfcGF5 bG9hZCB7CisJdTggcG9ydF9udW1iZXI7CisJdTggdmNwaTsKK307CisKK3N0cnVjdCBkcm1fZHBf cmVzb3VyY2Vfc3RhdHVzX25vdGlmeSB7CisJdTggcG9ydF9udW1iZXI7CisJdTggZ3VpZFsxNl07 CisJdTE2IGF2YWlsYWJsZV9wYm47Cit9OworCitzdHJ1Y3QgZHJtX2RwX3F1ZXJ5X3BheWxvYWRf YWNrX3JlcGx5IHsKKwl1OCBwb3J0X251bWJlcjsKKwl1OCBhbGxvY2F0ZWRfcGJuOworfTsKKwor c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgeworCXU4IHJlcV90eXBlOworCXVu aW9uIGFja19yZXEgeworCQlzdHJ1Y3QgZHJtX2RwX2Nvbm5lY3Rpb25fc3RhdHVzX25vdGlmeSBj b25uX3N0YXQ7CisJCXN0cnVjdCBkcm1fZHBfcG9ydF9udW1iZXJfcmVxIHBvcnRfbnVtOworCQlz dHJ1Y3QgZHJtX2RwX3Jlc291cmNlX3N0YXR1c19ub3RpZnkgcmVzb3VyY2Vfc3RhdDsKKworCQlz dHJ1Y3QgZHJtX2RwX3F1ZXJ5X3BheWxvYWQgcXVlcnlfcGF5bG9hZDsKKwkJc3RydWN0IGRybV9k cF9hbGxvY2F0ZV9wYXlsb2FkIGFsbG9jYXRlX3BheWxvYWQ7CisKKwkJc3RydWN0IGRybV9kcF9y ZW1vdGVfZHBjZF9yZWFkIGRwY2RfcmVhZDsKKwkJc3RydWN0IGRybV9kcF9yZW1vdGVfZHBjZF93 cml0ZSBkcGNkX3dyaXRlOworCisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2kyY19yZWFkIGkyY19y ZWFkOworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfd3JpdGUgaTJjX3dyaXRlOworCX0gdTsK K307CisKK3N0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgeworCXU4IHJlcGx5 X3R5cGU7CisJdTggcmVxX3R5cGU7CisJdW5pb24gYWNrX3JlcGxpZXMgeworCQlzdHJ1Y3QgZHJt X2RwX25ha19yZXBseSBuYWs7CisJCXN0cnVjdCBkcm1fZHBfbGlua19hZGRyZXNzX2Fja19yZXBs eSBsaW5rX2FkZHI7CisJCXN0cnVjdCBkcm1fZHBfcG9ydF9udW1iZXJfcmVwIHBvcnRfbnVtYmVy OworCisJCXN0cnVjdCBkcm1fZHBfZW51bV9wYXRoX3Jlc291cmNlc19hY2tfcmVwbHkgcGF0aF9y ZXNvdXJjZXM7CisJCXN0cnVjdCBkcm1fZHBfYWxsb2NhdGVfcGF5bG9hZF9hY2tfcmVwbHkgYWxs b2NhdGVfcGF5bG9hZDsKKwkJc3RydWN0IGRybV9kcF9xdWVyeV9wYXlsb2FkX2Fja19yZXBseSBx dWVyeV9wYXlsb2FkOworCisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2RfcmVhZF9hY2tfcmVw bHkgcmVtb3RlX2RwY2RfcmVhZF9hY2s7CisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2Rfd3Jp dGVfYWNrX3JlcGx5IHJlbW90ZV9kcGNkX3dyaXRlX2FjazsKKwkJc3RydWN0IGRybV9kcF9yZW1v dGVfZHBjZF93cml0ZV9uYWtfcmVwbHkgcmVtb3RlX2RwY2Rfd3JpdGVfbmFjazsKKworCQlzdHJ1 Y3QgZHJtX2RwX3JlbW90ZV9pMmNfcmVhZF9hY2tfcmVwbHkgcmVtb3RlX2kyY19yZWFkX2FjazsK KwkJc3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3JlYWRfbmFrX3JlcGx5IHJlbW90ZV9pMmNfcmVh ZF9uYWNrOworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfd3JpdGVfYWNrX3JlcGx5IHJlbW90 ZV9pMmNfd3JpdGVfYWNrOworCX0gdTsKK307CisKKy8qIG1zZyBpcyBxdWV1ZWQgdG8gYmUgcHV0 IGludG8gYSBzbG90ICovCisjZGVmaW5lIERSTV9EUF9TSURFQkFORF9UWF9RVUVVRUQgMAorLyog bXNnIGhhcyBzdGFydGVkIHRyYW5zbWl0dGluZyBvbiBhIHNsb3QgLSBzdGlsbCBvbiBtc2dxICov CisjZGVmaW5lIERSTV9EUF9TSURFQkFORF9UWF9TVEFSVF9TRU5EIDEKKy8qIG1zZyBoYXMgZmlu aXNoZWQgdHJhbnNtaXR0aW5nIG9uIGEgc2xvdCAtIHJlbW92ZWQgZnJvbSBtc2dxIG9ubHkgaW4g c2xvdCAqLworI2RlZmluZSBEUk1fRFBfU0lERUJBTkRfVFhfU0VOVCAyCisvKiBtc2cgaGFzIHJl Y2VpdmVkIGEgcmVzcG9uc2UgLSByZW1vdmVkIGZyb20gc2xvdCAqLworI2RlZmluZSBEUk1fRFBf U0lERUJBTkRfVFhfUlggMworI2RlZmluZSBEUk1fRFBfU0lERUJBTkRfVFhfVElNRU9VVCA0CisK K3N0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4IHsKKwl1OCBtc2dbMjU2XTsKKwl1OCBjaHVu a1s0OF07CisJdTggY3VyX29mZnNldDsKKwl1OCBjdXJfbGVuOworCXN0cnVjdCBkcm1fZHBfbXN0 X2JyYW5jaCAqZHN0OworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsKKwlpbnQgc2Vxbm87CisJaW50 IHN0YXRlOworCWJvb2wgcGF0aF9tc2c7CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVw bHlfYm9keSByZXBseTsKK307CisKKy8qIHNpZGViYW5kIG1zZyBoYW5kbGVyICovCitzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3I7CitzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9jYnMg eworCS8qIGNyZWF0ZSBhIGNvbm5lY3RvciBmb3IgYSBwb3J0ICovCisJc3RydWN0IGRybV9jb25u ZWN0b3IgKigqYWRkX2Nvbm5lY3Rvcikoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICpt Z3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsIGNoYXIgKnBhdGgpOworCXZvaWQgKCpk ZXN0cm95X2Nvbm5lY3Rvcikoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJ CQkJICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKK307CisKKyNkZWZpbmUgRFBf TUFYX1BBWUxPQUQgKHNpemVvZih1bnNpZ25lZCBsb25nKSAqIDgpCisKKyNkZWZpbmUgRFBfUEFZ TE9BRF9MT0NBTCAxCisjZGVmaW5lIERQX1BBWUxPQURfUkVNT1RFIDIKKyNkZWZpbmUgRFBfUEFZ TE9BRF9ERUxFVEVfTE9DQUwgMworCitzdHJ1Y3QgZHJtX2RwX3BheWxvYWQgeworCWludCBwYXls b2FkX3N0YXRlOworCWludCBzdGFydF9zbG90OworCWludCBudW1fc2xvdHM7CisJc3RydWN0IGRy bV9kcF9tc3RfcG9ydCAqcG9ydDsKK307CisKKy8qKgorICogc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyIC0gRGlzcGxheVBvcnQgTVNUIG1hbmFnZXIKKyAqIEBkZXY6IGRldmljZSBwb2lu dGVyIGZvciBhZGRpbmcgaTJjIGRldmljZXMgZXRjLgorICogQGNiczogY2FsbGJhY2tzIGZvciBj b25uZWN0b3IgYWRkaXRpb24gYW5kIGRlc3RydWN0aW9uLgorICogQG1heF9kcGNkX3RyYW5zYWN0 aW9uX2J5dGVzIC0gbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC93cml0ZSBpbiBvbmUg Z28uCisgKiBAYXV4OiBhdXggY2hhbm5lbCBmb3IgdGhlIERQIGNvbm5lY3Rvci4KKyAqIEBtYXhf cGF5bG9hZHM6IG1heGltdW0gbnVtYmVyIG9mIHBheWxvYWRzIHRoZSBHUFUgY2FuIGdlbmVyYXRl LgorICogQGNvbm5fYmFzZV9pZDogRFJNIGNvbm5lY3RvciBJRCB0aGlzIG1nciBpcyBjb25uZWN0 ZWQgdG8uCisgKiBAZG93bl9yZXBfcmVjdjogbXNnIHJlY2VpdmVyIHN0YXRlIGZvciBkb3duIHJl cGxpZXMuCisgKiBAdXBfcmVxX3JlY3Y6IG1zZyByZWNlaXZlciBzdGF0ZSBmb3IgdXAgcmVxdWVz dHMuCisgKiBAbG9jazogcHJvdGVjdHMgbXN0IHN0YXRlLCBwcmltYXJ5LCBndWlkLCBkcGNkLgor ICogQGF1eF9sb2NrOiBwcm90ZWN0cyBhdXggY2hhbm5lbC4KKyAqIEBtc3Rfc3RhdGU6IGlmIHRo aXMgbWFuYWdlciBpcyBlbmFibGVkIGZvciBhbiBNU1QgY2FwYWJsZSBwb3J0LgorICogQG1zdF9w cmltYXJ5OiBwb2ludGVyIHRvIHRoZSBwcmltYXJ5IGJyYW5jaCBkZXZpY2UuCisgKiBAZ3VpZF92 YWxpZDogR1VJRCB2YWxpZCBmb3IgdGhlIHByaW1hcnkgYnJhbmNoIGRldmljZS4KKyAqIEBndWlk OiBHVUlEIGZvciBwcmltYXJ5IHBvcnQuCisgKiBAZHBjZDogY2FjaGUgb2YgRFBDRCBmb3IgcHJp bWFyeSBwb3J0LgorICogQHBibl9kaXY6IFBCTiB0byBzbG90cyBkaXZpc29yLgorICoKKyAqIFRo aXMgc3RydWN0IHJlcHJlc2VudHMgdGhlIHRvcGxldmVsIGRpc3BsYXlwb3J0IE1TVCB0b3BvbG9n eSBtYW5hZ2VyLgorICogVGhlcmUgc2hvdWxkIGJlIG9uZSBpbnN0YW5jZSBvZiB0aGlzIGZvciBl dmVyeSBNU1QgY2FwYWJsZSBEUCBjb25uZWN0b3IKKyAqIG9uIHRoZSBHUFUuCisgKi8KK3N0cnVj dCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciB7CisKKwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfY2JzICpjYnM7CisJaW50IG1heF9kcGNkX3RyYW5zYWN0 aW9uX2J5dGVzOworCXN0cnVjdCBkcm1fZHBfYXV4ICphdXg7IC8qIGF1eGNoIGZvciB0aGlzIHRv cG9sb2d5IG1nciB0byB1c2UgKi8KKwlpbnQgbWF4X3BheWxvYWRzOworCWludCBjb25uX2Jhc2Vf aWQ7CisKKwkvKiBvbmx5IGV2ZXIgYWNjZXNzZWQgZnJvbSB0aGUgd29ya3F1ZXVlIC0gd2hpY2gg c2hvdWxkIGJlIHNlcmlhbGlzZWQgKi8KKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCBk b3duX3JlcF9yZWN2OworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4IHVwX3JlcV9yZWN2 OworCisJLyogcG9pbnRlciB0byBpbmZvIGFib3V0IHRoZSBpbml0aWFsIE1TVCBkZXZpY2UgKi8K KwlzdHJ1Y3QgbXV0ZXggbG9jazsgLyogcHJvdGVjdHMgbXN0X3N0YXRlICsgcHJpbWFyeSArIGd1 aWQgKyBkcGNkICovCisKKwlzdHJ1Y3QgbXV0ZXggYXV4X2xvY2s7IC8qIHByb3RlY3QgYWNjZXNz IHRvIHRoZSBBVVggKi8KKwlib29sIG1zdF9zdGF0ZTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFu Y2ggKm1zdF9wcmltYXJ5OworCS8qIHByaW1hcnkgTVNUIGRldmljZSBHVUlEICovCisJYm9vbCBn dWlkX3ZhbGlkOworCXU4IGd1aWRbMTZdOworCXU4IGRwY2RbRFBfUkVDRUlWRVJfQ0FQX1NJWkVd OworCWludCBwYm5fZGl2OworCWludCB0b3RhbF9zbG90czsKKwlpbnQgYXZhaWxfc2xvdHM7CisJ aW50IHRvdGFsX3BibjsKKworCS8qIG1lc3NhZ2VzIHRvIGJlIHRyYW5zbWl0dGVkICovCisJLyog cWxvY2sgcHJvdGVjdHMgdGhlIHVwcS9kb3ducSBhbmQgaW5fcHJvZ3Jlc3MsCisJICAgdGhlIG1z dGIgdHhfc2xvdHMgYW5kIHR4bXNnLT5zdGF0ZSBvbmNlIHRoZXkgYXJlIHF1ZXVlZCAqLworCXN0 cnVjdCBtdXRleCBxbG9jazsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHR4X21zZ19kb3ducTsKKwlzdHJ1 Y3QgbGlzdF9oZWFkIHR4X21zZ191cHE7CisJYm9vbCB0eF9kb3duX2luX3Byb2dyZXNzOworCWJv b2wgdHhfdXBfaW5fcHJvZ3Jlc3M7CisKKwkvKiBwYXlsb2FkIGluZm8gKyBsb2NrIGZvciBpdCAq LworCXNwaW5sb2NrX3QgcGF5bG9hZF9sb2NrOworCXN0cnVjdCBkcm1fZHBfdmNwaSAqKnByb3Bv c2VkX3ZjcGlzOworCXN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZHM7CisJdW5zaWduZWQg bG9uZyBwYXlsb2FkX21hc2s7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0eF93YWl0cTsKKwlzdHJ1 Y3Qgd29ya19zdHJ1Y3Qgd29yazsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOworfTsK KworaW50IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX2luaXQoc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRybV9kcF9hdXggKmF1 eCwgaW50IG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCBpbnQgbWF4X3BheWxvYWRzLCBpbnQg Y29ubl9iYXNlX2lkKTsKKwordm9pZCBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9kZXN0cm95KHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKTsKKworCitpbnQgZHJtX2RwX21zdF90 b3BvbG9neV9tZ3Jfc2V0X21zdChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwg Ym9vbCBtc3Rfc3RhdGUpOworCisKK2ludCBkcm1fZHBfbXN0X2hwZF9pcnEoc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIGludCBpcnFfdmVjdG9yKTsKKworCitlbnVtIGRybV9j b25uZWN0b3Jfc3RhdHVzIGRybV9kcF9tc3RfZGV0ZWN0X3BvcnQoc3RydWN0IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpOworCitzdHJ1 Y3QgZWRpZCAqZHJtX2RwX21zdF9nZXRfZWRpZChzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVj dG9yLCBzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9t c3RfcG9ydCAqcG9ydCk7CisKKworaW50IGRybV9kcF9jYWxjX3Bibl9tb2RlKGludCBjbG9jaywg aW50IGJwcCk7CisKKworYm9vbCBkcm1fZHBfbXN0X2FsbG9jYXRlX3ZjcGkoc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsIGlu dCBwYm4sIGludCAqc2xvdHMpOworCisKK3ZvaWQgZHJtX2RwX21zdF9yZXNldF92Y3BpX3Nsb3Rz KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9w b3J0ICpwb3J0KTsKKworCit2b2lkIGRybV9kcF9tc3RfZGVhbGxvY2F0ZV92Y3BpKHN0cnVjdCBk cm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQg KnBvcnQpOworCisKK2ludCBkcm1fZHBfZmluZF92Y3BpX3Nsb3RzKHN0cnVjdCBkcm1fZHBfbXN0 X3RvcG9sb2d5X21nciAqbWdyLAorCQkJICAgaW50IHBibik7CisKKworaW50IGRybV9kcF91cGRh dGVfcGF5bG9hZF9wYXJ0MShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncik7CisK KworaW50IGRybV9kcF91cGRhdGVfcGF5bG9hZF9wYXJ0MihzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3IgKm1ncik7CisKK2ludCBkcm1fZHBfY2hlY2tfYWN0X3N0YXR1cyhzdHJ1Y3QgZHJt X2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncik7CisKK3ZvaWQgZHJtX2RwX21zdF9kdW1wX3RvcG9s b2d5KHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCSAgICAgIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9s b2d5X21nciAqbWdyKTsKKworI2VuZGlmCi0tIAoxLjkuMAoKX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX18KZHJpLWRldmVsIG1haWxpbmcgbGlzdApkcmktZGV2 ZWxAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHA6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9kcmktZGV2ZWwK