From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Airlie Subject: [PATCH 05/11] drm/helper: add Displayport multi-stream helper (v0.6) Date: Thu, 5 Jun 2014 14:01:32 +1000 Message-ID: <1401940898-2825-6-git-send-email-airlied@gmail.com> References: <1401940898-2825-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: <1401940898-2825-1-git-send-email-airlied@gmail.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" 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 c3RhcnQgd29ya2luZyBvbiBkb2N1bWVudGF0aW9uIG9uIGludGVyZmFjZS4KCkNoYW5nZXMgc2lu Y2UgdjAuMzoKYSkgdmMgcGF5bG9hZCBsb2NraW5nIGFuZCB0cmFja2luZyBmaXhlcwpiKSBhZGQg aG90cGx1ZyBjYWxsYmFjayBpbnRvIGRyaXZlciAtIHJlcGxhY2VzIGNyYXp5IHJldHVybiAxIHNj aGVtZQpjKSB0eG1zZyArIG1zdCBicmFuY2ggZGV2aWNlIHJlZmNvdW50IGZpeGVzCmQpIGRvbid0 IGJhaWwgb24gbXN0IHNodXRkb3duIGlmIGRldmljZSBpcyBnb25lCmUpIGNoYW5nZSBpcnEgaGFu ZGxlciB0byB0YWtlIGFsbCA0IGJ5dGVzIG9mIFNJTktfQ09VTlQgKyBFU0kgdmVjdG9ycwpmKSBt YWtlIERQIHBheWxvYWQgdXBkYXRlcyB0aW1lb3V0IGxvbmdlciAtIG9ic2VydmVkIG9uIGRvY2tp bmcgc3RhdGlvbiByZWRvY2sKZykgYWRkIG1vcmUgaW5mbyB0byBkZWJ1Z2ZzIGR1bXBlcgoKQ2hh bmdlcyBzaW5jZSB2MC40OgphKSBzdXNwZW5kL3Jlc3VtZSBzdXBwb3J0CmIpIG1vcmUgZGVidWdn aW5nIGluIGRlYnVnZnMKCkNoYW5nZXMgc2luY2UgdjAuNToKYSkgdXNlIGJ5dGUgKiB0byBhdm9p ZCB1bm5lY2Vzc2FyeSBzdGFjayB1c2FnZQpiKSBmaXggbnVtX3NkcF9zdHJlYW1zIGludGVycHJl dGF0aW9uLgpjKSBpbml0IHBheWxvYWQgc3RhdGUgZm9yIHVucGx1ZyBldmVudHMKZCkgcmVtb3Zl IGxlbm92byBkb2NrIHNpbmsgY291bnQgaGFjawplKSBkcm9wIGF1eCBsb2NrIC0gcG9zdCByZWJh c2UKZikgY2FsbCBob3RwbHVnIG9uIHBvcnQgZGVzdHJveQoKVE9ETzoKbWlzYyBmZWF0dXJlcwoK U2lnbmVkLW9mZi1ieTogRGF2ZSBBaXJsaWUgPGFpcmxpZWRAcmVkaGF0LmNvbT4KLS0tCiBEb2N1 bWVudGF0aW9uL0RvY0Jvb2svZHJtLnRtcGwgICAgICAgIHwgICAgNiArCiBkcml2ZXJzL2dwdS9k cm0vTWFrZWZpbGUgICAgICAgICAgICAgIHwgICAgMiArLQogZHJpdmVycy9ncHUvZHJtL2RybV9k cF9tc3RfdG9wb2xvZ3kuYyB8IDI3MTIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr CiBpbmNsdWRlL2RybS9kcm1fZHBfbXN0X2hlbHBlci5oICAgICAgIHwgIDUwOSArKysrKysrCiA0 IGZpbGVzIGNoYW5nZWQsIDMyMjggaW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRl IG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKIGNyZWF0 ZSBtb2RlIDEwMDY0NCBpbmNsdWRlL2RybS9kcm1fZHBfbXN0X2hlbHBlci5oCgpkaWZmIC0tZ2l0 IGEvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29r L2RybS50bXBsCmluZGV4IDAwZjFjMjUuLmMwYWUzNmEgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRp b24vRG9jQm9vay9kcm0udG1wbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHJtLnRtcGwK QEAgLTIyOTYsNiArMjI5NiwxMiBAQCB2b2lkIGludGVsX2NydF9pbml0KHN0cnVjdCBkcm1fZGV2 aWNlICpkZXYpCiAhRWRyaXZlcnMvZ3B1L2RybS9kcm1fZHBfaGVscGVyLmMKICAgICA8L3NlY3Qy PgogICAgIDxzZWN0Mj4KKyAgICAgIDx0aXRsZT5EaXNwbGF5IFBvcnQgTVNUIEhlbHBlciBGdW5j dGlvbnMgUmVmZXJlbmNlPC90aXRsZT4KKyFQZHJpdmVycy9ncHUvZHJtL2RybV9kcF9tc3RfdG9w b2xvZ3kuYyBkcCBtc3QgaGVscGVyCishSWluY2x1ZGUvZHJtL2RybV9kcF9tc3RfaGVscGVyLmgK KyFFZHJpdmVycy9ncHUvZHJtL2RybV9kcF9tc3RfdG9wb2xvZ3kuYworICAgIDwvc2VjdDI+Cisg ICAgPHNlY3QyPgogICAgICAgPHRpdGxlPkVESUQgSGVscGVyIEZ1bmN0aW9ucyBSZWZlcmVuY2U8 L3RpdGxlPgogIUVkcml2ZXJzL2dwdS9kcm0vZHJtX2VkaWQuYwogICAgIDwvc2VjdDI+CmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZp bGUKaW5kZXggODYzZGI4NC4uMjhmNjc3NCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL01h a2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9NYWtlZmlsZQpAQCAtMjMsNyArMjMsNyBAQCBk cm0tJChDT05GSUdfRFJNX1BBTkVMKSArPSBkcm1fcGFuZWwubwogZHJtLXVzYi15ICAgOj0gZHJt X3VzYi5vCiAKIGRybV9rbXNfaGVscGVyLXkgOj0gZHJtX2NydGNfaGVscGVyLm8gZHJtX2RwX2hl bHBlci5vIGRybV9wcm9iZV9oZWxwZXIubyBcCi0JCWRybV9wbGFuZV9oZWxwZXIubworCQlkcm1f cGxhbmVfaGVscGVyLm8gZHJtX2RwX21zdF90b3BvbG9neS5vCiBkcm1fa21zX2hlbHBlci0kKENP TkZJR19EUk1fTE9BRF9FRElEX0ZJUk1XQVJFKSArPSBkcm1fZWRpZF9sb2FkLm8KIGRybV9rbXNf aGVscGVyLSQoQ09ORklHX0RSTV9LTVNfRkJfSEVMUEVSKSArPSBkcm1fZmJfaGVscGVyLm8KIGRy bV9rbXNfaGVscGVyLSQoQ09ORklHX0RSTV9LTVNfQ01BX0hFTFBFUikgKz0gZHJtX2ZiX2NtYV9o ZWxwZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9tc3RfdG9wb2xvZ3ku YyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKbmV3IGZpbGUgbW9kZSAx MDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiYzc3MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKQEAgLTAsMCArMSwyNzEyIEBACisvKgorICog Q29weXJpZ2h0IMKpIDIwMTQgUmVkIEhhdAorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5 LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cworICog ZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBm ZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBp biBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5vdGljZSBhbmQg dGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9u LCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vdCBiZSB1 c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmli dXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0dGVuIHByaW9y IHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXByZXNlbnRhdGlv bnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVy cG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBs aWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVNDTEFJTSBBTEwg V0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5DTFVESU5HIEFM TCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBO TworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5Z IFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERB TUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAqIERBVEEgT1Ig UFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1Ig T1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElP TiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdBUkUuCisgKi8K KworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+Cisj aW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVk ZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxkcm0v ZHJtX2RwX21zdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorCisjaW5jbHVkZSA8 ZHJtL2RybV9maXhlZC5oPgorCisvKioKKyAqIERPQzogZHAgbXN0IGhlbHBlcgorICoKKyAqIFRo ZXNlIGZ1bmN0aW9ucyBjb250YWluIHBhcnRzIG9mIHRoZSBEaXNwbGF5UG9ydCAxLjJhIE11bHRp U3RyZWFtIFRyYW5zcG9ydAorICogcHJvdG9jb2wuIFRoZSBoZWxwZXJzIGNvbnRhaW4gYSB0b3Bv bG9neSBtYW5hZ2VyIGFuZCBiYW5kd2lkdGggbWFuYWdlci4KKyAqIFRoZSBoZWxwZXJzIGVuY2Fw c3VsYXRlIHRoZSBzZW5kaW5nIGFuZCByZWNlaXZlZCBvZiBzaWRlYmFuZCBtc2dzLgorICovCitz dGF0aWMgYm9vbCBkdW1wX2RwX3BheWxvYWRfdGFibGUoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsCisJCQkJICBjaGFyICpidWYpOworc3RhdGljIGludCB0ZXN0X2NhbGNfcGJu X21vZGUodm9pZCk7CisKK3N0YXRpYyB2b2lkIGRybV9kcF9wdXRfcG9ydChzdHJ1Y3QgZHJtX2Rw X21zdF9wb3J0ICpwb3J0KTsKKworc3RhdGljIGludCBkcm1fZHBfZHBjZF93cml0ZV9wYXlsb2Fk KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgICAgaW50IGlkLAor CQkJCSAgICAgc3RydWN0IGRybV9kcF9wYXlsb2FkICpwYXlsb2FkKTsKKworc3RhdGljIGludCBk cm1fZHBfc2VuZF9kcGNkX3dyaXRlKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy LAorCQkJCSAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgIGludCBvZmZzZXQs IGludCBzaXplLCB1OCAqYnl0ZXMpOworCitzdGF0aWMgaW50IGRybV9kcF9zZW5kX2xpbmtfYWRk cmVzcyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgICAgc3RydWN0 IGRybV9kcF9tc3RfYnJhbmNoICptc3RiKTsKK3N0YXRpYyBpbnQgZHJtX2RwX3NlbmRfZW51bV9w YXRoX3Jlc291cmNlcyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkJ ICAgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiLAorCQkJCQkgICBzdHJ1Y3QgZHJtX2Rw X21zdF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBib29sIGRybV9kcF92YWxpZGF0ZV9ndWlkKHN0cnVj dCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSB1OCAqZ3VpZCk7CisKK3N0YXRp YyBpbnQgZHJtX2RwX21zdF9yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgp Oworc3RhdGljIHZvaWQgZHJtX2RwX21zdF91bnJlZ2lzdGVyX2kyY19idXMoc3RydWN0IGRybV9k cF9hdXggKmF1eCk7CitzdGF0aWMgdm9pZCBkcm1fZHBfbXN0X2tpY2tfdHgoc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpOworLyogc2lkZWJhbmQgbXNnIGhhbmRsaW5nICovCitz dGF0aWMgdTggZHJtX2RwX21zZ19oZWFkZXJfY3JjNChjb25zdCB1aW50OF90ICpkYXRhLCBzaXpl X3QgbnVtX25pYmJsZXMpCit7CisJdTggYml0bWFzayA9IDB4ODA7CisJdTggYml0c2hpZnQgPSA3 OworCXU4IGFycmF5X2luZGV4ID0gMDsKKwlpbnQgbnVtYmVyX29mX2JpdHMgPSBudW1fbmliYmxl cyAqIDQ7CisJdTggcmVtYWluZGVyID0gMDsKKworCXdoaWxlIChudW1iZXJfb2ZfYml0cyAhPSAw KSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8PD0gMTsKKwkJcmVtYWluZGVy IHw9IChkYXRhW2FycmF5X2luZGV4XSAmIGJpdG1hc2spID4+IGJpdHNoaWZ0OworCQliaXRtYXNr ID4+PSAxOworCQliaXRzaGlmdC0tOworCQlpZiAoYml0bWFzayA9PSAwKSB7CisJCQliaXRtYXNr ID0gMHg4MDsKKwkJCWJpdHNoaWZ0ID0gNzsKKwkJCWFycmF5X2luZGV4Kys7CisJCX0KKwkJaWYg KChyZW1haW5kZXIgJiAweDEwKSA9PSAweDEwKQorCQkJcmVtYWluZGVyIF49IDB4MTM7CisJfQor CisJbnVtYmVyX29mX2JpdHMgPSA0OworCXdoaWxlIChudW1iZXJfb2ZfYml0cyAhPSAwKSB7CisJ CW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8PD0gMTsKKwkJaWYgKChyZW1haW5kZXIg JiAweDEwKSAhPSAwKQorCQkJcmVtYWluZGVyIF49IDB4MTM7CisJfQorCisJcmV0dXJuIHJlbWFp bmRlcjsKK30KKworc3RhdGljIHU4IGRybV9kcF9tc2dfZGF0YV9jcmM0KGNvbnN0IHVpbnQ4X3Qg KmRhdGEsIHU4IG51bWJlcl9vZl9ieXRlcykKK3sKKwl1OCBiaXRtYXNrID0gMHg4MDsKKwl1OCBi aXRzaGlmdCA9IDc7CisJdTggYXJyYXlfaW5kZXggPSAwOworCWludCBudW1iZXJfb2ZfYml0cyA9 IG51bWJlcl9vZl9ieXRlcyAqIDg7CisJdTE2IHJlbWFpbmRlciA9IDA7CisKKwl3aGlsZSAobnVt YmVyX29mX2JpdHMgIT0gMCkgeworCQludW1iZXJfb2ZfYml0cy0tOworCQlyZW1haW5kZXIgPDw9 IDE7CisJCXJlbWFpbmRlciB8PSAoZGF0YVthcnJheV9pbmRleF0gJiBiaXRtYXNrKSA+PiBiaXRz aGlmdDsKKwkJYml0bWFzayA+Pj0gMTsKKwkJYml0c2hpZnQtLTsKKwkJaWYgKGJpdG1hc2sgPT0g MCkgeworCQkJYml0bWFzayA9IDB4ODA7CisJCQliaXRzaGlmdCA9IDc7CisJCQlhcnJheV9pbmRl eCsrOworCQl9CisJCWlmICgocmVtYWluZGVyICYgMHgxMDApID09IDB4MTAwKQorCQkJcmVtYWlu ZGVyIF49IDB4ZDU7CisJfQorCisJbnVtYmVyX29mX2JpdHMgPSA4OworCXdoaWxlIChudW1iZXJf b2ZfYml0cyAhPSAwKSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8PD0gMTsK KwkJaWYgKChyZW1haW5kZXIgJiAweDEwMCkgIT0gMCkKKwkJCXJlbWFpbmRlciBePSAweGQ1Owor CX0KKworCXJldHVybiByZW1haW5kZXIgJiAweGZmOworfQorc3RhdGljIGlubGluZSB1OCBkcm1f ZHBfY2FsY19zYl9oZHJfc2l6ZShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgKmhkcikK K3sKKwl1OCBzaXplID0gMzsKKwlzaXplICs9IChoZHItPmxjdCAvIDIpOworCXJldHVybiBzaXpl OworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX21zZ19oZHIoc3RydWN0 IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyICpoZHIsCisJCQkJCSAgIHU4ICpidWYsIGludCAqbGVu KQoreworCWludCBpZHggPSAwOworCWludCBpOworCXU4IGNyYzQ7CisJYnVmW2lkeCsrXSA9ICgo aGRyLT5sY3QgJiAweGYpIDw8IDQpIHwgKGhkci0+bGNyICYgMHhmKTsKKwlmb3IgKGkgPSAwOyBp IDwgKGhkci0+bGN0IC8gMik7IGkrKykKKwkJYnVmW2lkeCsrXSA9IGhkci0+cmFkW2ldOworCWJ1 ZltpZHgrK10gPSAoaGRyLT5icm9hZGNhc3QgPDwgNykgfCAoaGRyLT5wYXRoX21zZyA8PCA2KSB8 CisJCShoZHItPm1zZ19sZW4gJiAweDNmKTsKKwlidWZbaWR4KytdID0gKGhkci0+c29tdCA8PCA3 KSB8IChoZHItPmVvbXQgPDwgNikgfCAoaGRyLT5zZXFubyA8PCA0KTsKKworCWNyYzQgPSBkcm1f ZHBfbXNnX2hlYWRlcl9jcmM0KGJ1ZiwgKGlkeCAqIDIpIC0gMSk7CisJYnVmW2lkeCAtIDFdIHw9 IChjcmM0ICYgMHhmKTsKKworCSpsZW4gPSBpZHg7Cit9CisKK3N0YXRpYyBib29sIGRybV9kcF9k ZWNvZGVfc2lkZWJhbmRfbXNnX2hkcihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgKmhk ciwKKwkJCQkJICAgdTggKmJ1ZiwgaW50IGJ1ZmxlbiwgdTggKmhkcmxlbikKK3sKKwl1OCBjcmM0 OworCXU4IGxlbjsKKwlpbnQgaTsKKwl1OCBpZHg7CisJaWYgKGJ1ZlswXSA9PSAwKQorCQlyZXR1 cm4gZmFsc2U7CisJbGVuID0gMzsKKwlsZW4gKz0gKChidWZbMF0gJiAweGYwKSA+PiA0KSAvIDI7 CisJaWYgKGxlbiA+IGJ1ZmxlbikKKwkJcmV0dXJuIGZhbHNlOworCWNyYzQgPSBkcm1fZHBfbXNn X2hlYWRlcl9jcmM0KGJ1ZiwgKGxlbiAqIDIpIC0gMSk7CisKKwlpZiAoKGNyYzQgJiAweGYpICE9 IChidWZbbGVuIC0gMV0gJiAweGYpKSB7CisJCURSTV9ERUJVR19LTVMoImNyYzQgbWlzbWF0Y2gg MHgleCAweCV4XG4iLCBjcmM0LCBidWZbbGVuIC0gMV0pOworCQlyZXR1cm4gZmFsc2U7CisJfQor CisJaGRyLT5sY3QgPSAoYnVmWzBdICYgMHhmMCkgPj4gNDsKKwloZHItPmxjciA9IChidWZbMF0g JiAweGYpOworCWlkeCA9IDE7CisJZm9yIChpID0gMDsgaSA8IChoZHItPmxjdCAvIDIpOyBpKysp CisJCWhkci0+cmFkW2ldID0gYnVmW2lkeCsrXTsKKwloZHItPmJyb2FkY2FzdCA9IChidWZbaWR4 XSA+PiA3KSAmIDB4MTsKKwloZHItPnBhdGhfbXNnID0gKGJ1ZltpZHhdID4+IDYpICYgMHgxOwor CWhkci0+bXNnX2xlbiA9IGJ1ZltpZHhdICYgMHgzZjsKKwlpZHgrKzsKKwloZHItPnNvbXQgPSAo YnVmW2lkeF0gPj4gNykgJiAweDE7CisJaGRyLT5lb210ID0gKGJ1ZltpZHhdID4+IDYpICYgMHgx OworCWhkci0+c2Vxbm8gPSAoYnVmW2lkeF0gPj4gNCkgJiAweDE7CisJaWR4Kys7CisJKmhkcmxl biA9IGlkeDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX2VuY29kZV9z aWRlYmFuZF9yZXEoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKnJlcSwKKwkJ CQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnJhdykKK3sKKwlpbnQgaWR4 ID0gMDsKKwlpbnQgaTsKKwl1OCAqYnVmID0gcmF3LT5tc2c7CisJYnVmW2lkeCsrXSA9IHJlcS0+ cmVxX3R5cGUgJiAweDdmOworCisJc3dpdGNoIChyZXEtPnJlcV90eXBlKSB7CisJY2FzZSBEUF9F TlVNX1BBVEhfUkVTT1VSQ0VTOgorCQlidWZbaWR4XSA9IChyZXEtPnUucG9ydF9udW0ucG9ydF9u dW1iZXIgJiAweGYpIDw8IDQ7CisJCWlkeCsrOworCQlicmVhazsKKwljYXNlIERQX0FMTE9DQVRF X1BBWUxPQUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5hbGxvY2F0ZV9wYXlsb2FkLnBvcnRfbnVt YmVyICYgMHhmKSA8PCA0IHwKKwkJCShyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5udW1iZXJfc2Rw X3N0cmVhbXMgJiAweGYpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmFsbG9jYXRl X3BheWxvYWQudmNwaSAmIDB4N2YpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmFs bG9jYXRlX3BheWxvYWQucGJuID4+IDgpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51 LmFsbG9jYXRlX3BheWxvYWQucGJuICYgMHhmZik7CisJCWlkeCsrOworCQlmb3IgKGkgPSAwOyBp IDwgcmVxLT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zIC8gMjsgaSsrKSB7 CisJCQlidWZbaWR4XSA9ICgocmVxLT51LmFsbG9jYXRlX3BheWxvYWQuc2RwX3N0cmVhbV9zaW5r W2kgKiAyXSAmIDB4ZikgPDwgNCkgfAorCQkJCShyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5zZHBf c3RyZWFtX3NpbmtbaSAqIDIgKyAxXSAmIDB4Zik7CisJCQlpZHgrKzsKKwkJfQorCQlpZiAocmVx LT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zICYgMSkgeworCQkJaSA9IHJl cS0+dS5hbGxvY2F0ZV9wYXlsb2FkLm51bWJlcl9zZHBfc3RyZWFtcyAtIDE7CisJCQlidWZbaWR4 XSA9IChyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5zZHBfc3RyZWFtX3NpbmtbaV0gJiAweGYpIDw8 IDQ7CisJCQlpZHgrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIERQX1FVRVJZX1BBWUxPQUQ6CisJ CWJ1ZltpZHhdID0gKHJlcS0+dS5xdWVyeV9wYXlsb2FkLnBvcnRfbnVtYmVyICYgMHhmKSA8PCA0 OworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LnF1ZXJ5X3BheWxvYWQudmNwaSAmIDB4 N2YpOworCQlpZHgrKzsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfRFBDRF9SRUFEOgorCQli dWZbaWR4XSA9IChyZXEtPnUuZHBjZF9yZWFkLnBvcnRfbnVtYmVyICYgMHhmKSA8PCA0OworCQli dWZbaWR4XSB8PSAoKHJlcS0+dS5kcGNkX3JlYWQuZHBjZF9hZGRyZXNzICYgMHhmMDAwMCkgPj4g MTYpICYgMHhmOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmRwY2RfcmVhZC5kcGNk X2FkZHJlc3MgJiAweGZmMDApID4+IDg7CisJCWlkeCsrOworCQlidWZbaWR4XSA9IChyZXEtPnUu ZHBjZF9yZWFkLmRwY2RfYWRkcmVzcyAmIDB4ZmYpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAo cmVxLT51LmRwY2RfcmVhZC5udW1fYnl0ZXMpOworCQlpZHgrKzsKKwkJYnJlYWs7CisKKwljYXNl IERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5w b3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJYnVmW2lkeF0gfD0gKChyZXEtPnUuZHBjZF93cml0 ZS5kcGNkX2FkZHJlc3MgJiAweGYwMDAwKSA+PiAxNikgJiAweGY7CisJCWlkeCsrOworCQlidWZb aWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAweGZmMDApID4+IDg7CisJ CWlkeCsrOworCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAw eGZmKTsKKwkJaWR4Kys7CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5kcGNkX3dyaXRlLm51bV9ieXRl cyk7CisJCWlkeCsrOworCQltZW1jcHkoJmJ1ZltpZHhdLCByZXEtPnUuZHBjZF93cml0ZS5ieXRl cywgcmVxLT51LmRwY2Rfd3JpdGUubnVtX2J5dGVzKTsKKwkJaWR4ICs9IHJlcS0+dS5kcGNkX3dy aXRlLm51bV9ieXRlczsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfSTJDX1JFQUQ6CisJCWJ1 ZltpZHhdID0gKHJlcS0+dS5pMmNfcmVhZC5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJYnVm W2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC5udW1fdHJhbnNhY3Rpb25zICYgMHgzKTsKKwkJaWR4 Kys7CisJCWZvciAoaSA9IDA7IGkgPCAocmVxLT51LmkyY19yZWFkLm51bV90cmFuc2FjdGlvbnMg JiAweDMpOyBpKyspIHsKKwkJCWJ1ZltpZHhdID0gcmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9u c1tpXS5pMmNfZGV2X2lkICYgMHg3ZjsKKwkJCWlkeCsrOworCQkJYnVmW2lkeF0gPSByZXEtPnUu aTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm51bV9ieXRlczsKKwkJCWlkeCsrOworCQkJbWVtY3B5 KCZidWZbaWR4XSwgcmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5ieXRlcywgcmVxLT51 LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5udW1fYnl0ZXMpOworCQkJaWR4ICs9IHJlcS0+dS5p MmNfcmVhZC50cmFuc2FjdGlvbnNbaV0ubnVtX2J5dGVzOworCisJCQlidWZbaWR4XSA9IChyZXEt PnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm5vX3N0b3BfYml0ICYgMHgxKSA8PCA1OworCQkJ YnVmW2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0uaTJjX3RyYW5zYWN0 aW9uX2RlbGF5ICYgMHhmKTsKKwkJCWlkeCsrOworCQl9CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5p MmNfcmVhZC5yZWFkX2kyY19kZXZpY2VfaWQpICYgMHg3ZjsKKwkJaWR4Kys7CisJCWJ1ZltpZHhd ID0gKHJlcS0+dS5pMmNfcmVhZC5udW1fYnl0ZXNfcmVhZCk7CisJCWlkeCsrOworCQlicmVhazsK KworCWNhc2UgRFBfUkVNT1RFX0kyQ19XUklURToKKwkJYnVmW2lkeF0gPSAocmVxLT51LmkyY193 cml0ZS5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJaWR4Kys7CisJCWJ1ZltpZHhdID0gKHJl cS0+dS5pMmNfd3JpdGUud3JpdGVfaTJjX2RldmljZV9pZCkgJiAweDdmOworCQlpZHgrKzsKKwkJ YnVmW2lkeF0gPSAocmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXMpOworCQlpZHgrKzsKKwkJbWVt Y3B5KCZidWZbaWR4XSwgcmVxLT51LmkyY193cml0ZS5ieXRlcywgcmVxLT51LmkyY193cml0ZS5u dW1fYnl0ZXMpOworCQlpZHggKz0gcmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXM7CisJCWJyZWFr OworCX0KKwlyYXctPmN1cl9sZW4gPSBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9jcmNf c2lkZWJhbmRfY2h1bmtfcmVxKHU4ICptc2csIHU4IGxlbikKK3sKKwl1OCBjcmM0OworCWNyYzQg PSBkcm1fZHBfbXNnX2RhdGFfY3JjNChtc2csIGxlbik7CisJbXNnW2xlbl0gPSBjcmM0OworfQor CitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcGx5KHN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcCwKKwkJCQkJIHN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3R4ICpyYXcpCit7CisJaW50IGlkeCA9IDA7CisJdTggKmJ1ZiA9IHJhdy0+bXNnOwor CisJYnVmW2lkeCsrXSA9IChyZXAtPnJlcGx5X3R5cGUgJiAweDEpIDw8IDcgfCAocmVwLT5yZXFf dHlwZSAmIDB4N2YpOworCisJcmF3LT5jdXJfbGVuID0gaWR4OworfQorCisvKiB0aGlzIGFkZHMg YSBjaHVuayBvZiBtc2cgdG8gdGhlIGJ1aWxkZXIgdG8gZ2V0IHRoZSBmaW5hbCBtc2cgKi8KK3N0 YXRpYyBib29sIGRybV9kcF9zaWRlYmFuZF9tc2dfYnVpbGQoc3RydWN0IGRybV9kcF9zaWRlYmFu ZF9tc2dfcnggKm1zZywKKwkJCQkgICAgICB1OCAqcmVwbHlidWYsIHU4IHJlcGx5YnVmbGVuLCBi b29sIGhkcikKK3sKKwlpbnQgcmV0OworCXU4IGNyYzQ7CisKKwlpZiAoaGRyKSB7CisJCXU4IGhk cmxlbjsKKwkJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyIHJlY3ZfaGRyOworCQlyZXQg PSBkcm1fZHBfZGVjb2RlX3NpZGViYW5kX21zZ19oZHIoJnJlY3ZfaGRyLCByZXBseWJ1ZiwgcmVw bHlidWZsZW4sICZoZHJsZW4pOworCQlpZiAocmV0ID09IGZhbHNlKSB7CisJCQlwcmludF9oZXhf ZHVtcChLRVJOX0RFQlVHLCAiZmFpbGVkIGhkciIsIERVTVBfUFJFRklYX05PTkUsIDE2LCAxLCBy ZXBseWJ1ZiwgcmVwbHlidWZsZW4sIGZhbHNlKTsKKwkJCXJldHVybiBmYWxzZTsKKwkJfQorCisJ CS8qIGdldCBsZW5ndGggY29udGFpbmVkIGluIHRoaXMgcG9ydGlvbiAqLworCQltc2ctPmN1cmNo dW5rX2xlbiA9IHJlY3ZfaGRyLm1zZ19sZW47CisJCW1zZy0+Y3VyY2h1bmtfaGRybGVuID0gaGRy bGVuOworCisJCS8qIHdlIGhhdmUgYWxyZWFkeSBnb3R0ZW4gYW4gc29tdCAtIGRvbid0IGJvdGhl ciBwYXJzaW5nICovCisJCWlmIChyZWN2X2hkci5zb210ICYmIG1zZy0+aGF2ZV9zb210KQorCQkJ cmV0dXJuIGZhbHNlOworCisJCWlmIChyZWN2X2hkci5zb210KSB7CisJCQltZW1jcHkoJm1zZy0+ aW5pdGlhbF9oZHIsICZyZWN2X2hkciwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X2hkcikpOworCQkJbXNnLT5oYXZlX3NvbXQgPSB0cnVlOworCQl9CisJCWlmIChyZWN2X2hkci5l b210KQorCQkJbXNnLT5oYXZlX2VvbXQgPSB0cnVlOworCisJCS8qIGNvcHkgdGhlIGJ5dGVzIGZv ciB0aGUgcmVtYWluZGVyIG9mIHRoaXMgaGVhZGVyIGNodW5rICovCisJCW1zZy0+Y3VyY2h1bmtf aWR4ID0gbWluKG1zZy0+Y3VyY2h1bmtfbGVuLCAodTgpKHJlcGx5YnVmbGVuIC0gaGRybGVuKSk7 CisJCW1lbWNweSgmbXNnLT5jaHVua1swXSwgcmVwbHlidWYgKyBoZHJsZW4sIG1zZy0+Y3VyY2h1 bmtfaWR4KTsKKwl9IGVsc2UgeworCQltZW1jcHkoJm1zZy0+Y2h1bmtbbXNnLT5jdXJjaHVua19p ZHhdLCByZXBseWJ1ZiwgcmVwbHlidWZsZW4pOworCQltc2ctPmN1cmNodW5rX2lkeCArPSByZXBs eWJ1ZmxlbjsKKwl9CisKKwlpZiAobXNnLT5jdXJjaHVua19pZHggPj0gbXNnLT5jdXJjaHVua19s ZW4pIHsKKwkJLyogZG8gQ1JDICovCisJCWNyYzQgPSBkcm1fZHBfbXNnX2RhdGFfY3JjNChtc2ct PmNodW5rLCBtc2ctPmN1cmNodW5rX2xlbiAtIDEpOworCQkvKiBjb3B5IGNodW5rIGludG8gYmln Z2VyIG1zZyAqLworCQltZW1jcHkoJm1zZy0+bXNnW21zZy0+Y3VybGVuXSwgbXNnLT5jaHVuaywg bXNnLT5jdXJjaHVua19sZW4gLSAxKTsKKwkJbXNnLT5jdXJsZW4gKz0gbXNnLT5jdXJjaHVua19s ZW4gLSAxOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZHJtX2RwX3NpZGVi YW5kX3BhcnNlX2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3 LAorCQkJCQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVw bXNnKQoreworCWludCBpZHggPSAxOworCWludCBpOworCW1lbWNweShyZXBtc2ctPnUubGlua19h ZGRyLmd1aWQsICZyYXctPm1zZ1tpZHhdLCAxNik7CisJaWR4ICs9IDE2OworCXJlcG1zZy0+dS5s aW5rX2FkZHIubnBvcnRzID0gcmF3LT5tc2dbaWR4XSAmIDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4 ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJZm9yIChpID0gMDsgaSA8IHJlcG1z Zy0+dS5saW5rX2FkZHIubnBvcnRzOyBpKyspIHsKKwkJaWYgKHJhdy0+bXNnW2lkeF0gJiAweDgw KQorCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5pbnB1dF9wb3J0ID0gMTsKKworCQly ZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLnBlZXJfZGV2aWNlX3R5cGUgPSAocmF3LT5tc2db aWR4XSA+PiA0KSAmIDB4NzsKKwkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5wb3J0X251 bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKworCQlpZHgrKzsKKwkJaWYgKGlkeCA+IHJh dy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0 c1tpXS5tY3MgPSAocmF3LT5tc2dbaWR4XSA+PiA3KSAmIDB4MTsKKwkJcmVwbXNnLT51Lmxpbmtf YWRkci5wb3J0c1tpXS5kZHBzID0gKHJhdy0+bXNnW2lkeF0gPj4gNikgJiAweDE7CisJCWlmIChy ZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLmlucHV0X3BvcnQgPT0gMCkKKwkJCXJlcG1zZy0+ dS5saW5rX2FkZHIucG9ydHNbaV0ubGVnYWN5X2RldmljZV9wbHVnX3N0YXR1cyA9IChyYXctPm1z Z1tpZHhdID4+IDUpICYgMHgxOworCQlpZHgrKzsKKwkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQor CQkJZ290byBmYWlsX2xlbjsKKwkJaWYgKHJlcG1zZy0+dS5saW5rX2FkZHIucG9ydHNbaV0uaW5w dXRfcG9ydCA9PSAwKSB7CisJCQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLmRwY2RfcmV2 aXNpb24gPSAocmF3LT5tc2dbaWR4XSk7CisJCQlpZHgrKzsKKwkJCWlmIChpZHggPiByYXctPmN1 cmxlbikKKwkJCQlnb3RvIGZhaWxfbGVuOworCQkJbWVtY3B5KHJlcG1zZy0+dS5saW5rX2FkZHIu cG9ydHNbaV0ucGVlcl9ndWlkLCAmcmF3LT5tc2dbaWR4XSwgMTYpOworCQkJaWR4ICs9IDE2Owor CQkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJCWdvdG8gZmFpbF9sZW47CisJCQlyZXBtc2ct PnUubGlua19hZGRyLnBvcnRzW2ldLm51bV9zZHBfc3RyZWFtcyA9IChyYXctPm1zZ1tpZHhdID4+ IDQpICYgMHhmOworCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5udW1fc2RwX3N0cmVh bV9zaW5rcyA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKwkJCWlkeCsrOworCisJCX0KKwkJaWYg KGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwl9CisKKwlyZXR1cm4gdHJ1 ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVzcyByZXBseSBwYXJzZSBs ZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOwor fQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2RwY2RfcmVhZChz dHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJICAgc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOworCXJl cG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5wb3J0X251bWJlciA9IHJhdy0+bXNnW2lkeF0g JiAweGY7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVu OworCXJlcG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5udW1fYnl0ZXMgPSByYXctPm1zZ1tp ZHhdOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsKKworCW1lbWNw eShyZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2suYnl0ZXMsICZyYXctPm1zZ1tpZHhdLCBy ZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2subnVtX2J5dGVzKTsKKwlyZXR1cm4gdHJ1ZTsK K2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVzcyByZXBseSBwYXJzZSBsZW5n dGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQor CitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2RwY2Rfd3JpdGUoc3Ry dWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAgICAgIHN0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcG1zZykKK3sKKwlpbnQgaWR4ID0gMTsKKwly ZXBtc2ctPnUucmVtb3RlX2RwY2Rfd3JpdGVfYWNrLnBvcnRfbnVtYmVyID0gcmF3LT5tc2dbaWR4 XSAmIDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9s ZW47CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlEUk1fREVCVUdfS01TKCJwYXJzZSBsZW5n dGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQor CitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2kyY19yZWFkX2Fjayhz dHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJICAgICAgc3RydWN0IGRy bV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOwor CisJcmVwbXNnLT51LnJlbW90ZV9pMmNfcmVhZF9hY2sucG9ydF9udW1iZXIgPSAocmF3LT5tc2db aWR4XSAmIDB4Zik7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZh aWxfbGVuOworCXJlcG1zZy0+dS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51bV9ieXRlcyA9IHJhdy0+ bXNnW2lkeF07CisJaWR4Kys7CisJLyogVE9ETyBjaGVjayAqLworCW1lbWNweShyZXBtc2ctPnUu cmVtb3RlX2kyY19yZWFkX2Fjay5ieXRlcywgJnJhdy0+bXNnW2lkeF0sIHJlcG1zZy0+dS5yZW1v dGVfaTJjX3JlYWRfYWNrLm51bV9ieXRlcyk7CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlE Uk1fREVCVUdfS01TKCJyZW1vdGUgaTJjIHJlcGx5IHBhcnNlIGxlbmd0aCBmYWlsICVkICVkXG4i LCBpZHgsIHJhdy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGRy bV9kcF9zaWRlYmFuZF9wYXJzZV9lbnVtX3BhdGhfcmVzb3VyY2VzX2FjayhzdHJ1Y3QgZHJtX2Rw X3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9t c2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOworCXJlcG1zZy0+dS5wYXRo X3Jlc291cmNlcy5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdID4+IDQpICYgMHhmOworCWlk eCsrOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsKKwlyZXBtc2ct PnUucGF0aF9yZXNvdXJjZXMuZnVsbF9wYXlsb2FkX2J3X251bWJlciA9IChyYXctPm1zZ1tpZHhd IDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJaWYgKGlkeCA+IHJhdy0+ Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5wYXRoX3Jlc291cmNlcy5hdmFp bF9wYXlsb2FkX2J3X251bWJlciA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lk eCsxXSk7CisJaWR4ICs9IDI7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxf bGVuOworCXJldHVybiB0cnVlOworZmFpbF9sZW46CisJRFJNX0RFQlVHX0tNUygiZW51bSByZXNv dXJjZSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0 dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfYWxsb2Nh dGVfcGF5bG9hZF9hY2soc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJ CQkgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcG1zZykKK3sKKwlp bnQgaWR4ID0gMTsKKwlyZXBtc2ctPnUuYWxsb2NhdGVfcGF5bG9hZC5wb3J0X251bWJlciA9IChy YXctPm1zZ1tpZHhdID4+IDQpICYgMHhmOworCWlkeCsrOworCWlmIChpZHggPiByYXctPmN1cmxl bikKKwkJZ290byBmYWlsX2xlbjsKKwlyZXBtc2ctPnUuYWxsb2NhdGVfcGF5bG9hZC52Y3BpID0g cmF3LT5tc2dbaWR4XTsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8g ZmFpbF9sZW47CisJcmVwbXNnLT51LmFsbG9jYXRlX3BheWxvYWQuYWxsb2NhdGVkX3BibiA9IChy YXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJaWYg KGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJldHVybiB0cnVlOworZmFp bF9sZW46CisJRFJNX0RFQlVHX0tNUygiYWxsb2NhdGUgcGF5bG9hZCBwYXJzZSBsZW5ndGggZmFp bCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0 aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcXVlcnlfcGF5bG9hZF9hY2soc3RydWN0IGRy bV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAgICBzdHJ1Y3QgZHJtX2RwX3NpZGVi YW5kX21zZ19yZXBseV9ib2R5ICpyZXBtc2cpCit7CisJaW50IGlkeCA9IDE7CisJcmVwbXNnLT51 LnF1ZXJ5X3BheWxvYWQucG9ydF9udW1iZXIgPSAocmF3LT5tc2dbaWR4XSA+PiA0KSAmIDB4ZjsK KwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJcmVw bXNnLT51LnF1ZXJ5X3BheWxvYWQuYWxsb2NhdGVkX3BibiA9IChyYXctPm1zZ1tpZHhdIDw8IDgp IHwgKHJhdy0+bXNnW2lkeCArIDFdKTsKKwlpZHggKz0gMjsKKwlpZiAoaWR4ID4gcmF3LT5jdXJs ZW4pCisJCWdvdG8gZmFpbF9sZW47CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlEUk1fREVC VUdfS01TKCJxdWVyeSBwYXlsb2FkIHBhcnNlIGxlbmd0aCBmYWlsICVkICVkXG4iLCBpZHgsIHJh dy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGRybV9kcF9zaWRl YmFuZF9wYXJzZV9yZXBseShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJ CQlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5ICptc2cpCit7CisJbWVtc2V0 KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKKwltc2ctPnJlcGx5X3R5cGUgPSAocmF3LT5tc2dbMF0g JiAweDgwKSA+PiA3OworCW1zZy0+cmVxX3R5cGUgPSAocmF3LT5tc2dbMF0gJiAweDdmKTsKKwor CWlmIChtc2ctPnJlcGx5X3R5cGUpIHsKKwkJbWVtY3B5KG1zZy0+dS5uYWsuZ3VpZCwgJnJhdy0+ bXNnWzFdLCAxNik7CisJCW1zZy0+dS5uYWsucmVhc29uID0gcmF3LT5tc2dbMTddOworCQltc2ct PnUubmFrLm5ha19kYXRhID0gcmF3LT5tc2dbMThdOworCQlyZXR1cm4gZmFsc2U7CisJfQorCisJ c3dpdGNoIChtc2ctPnJlcV90eXBlKSB7CisJY2FzZSBEUF9MSU5LX0FERFJFU1M6CisJCXJldHVy biBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfbGlua19hZGRyZXNzKHJhdywgbXNnKTsKKwljYXNlIERQ X1FVRVJZX1BBWUxPQUQ6CisJCXJldHVybiBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcXVlcnlfcGF5 bG9hZF9hY2socmF3LCBtc2cpOworCWNhc2UgRFBfUkVNT1RFX0RQQ0RfUkVBRDoKKwkJcmV0dXJu IGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfZHBjZF9yZWFkKHJhdywgbXNnKTsKKwljYXNl IERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5kX3BhcnNlX3Jl bW90ZV9kcGNkX3dyaXRlKHJhdywgbXNnKTsKKwljYXNlIERQX1JFTU9URV9JMkNfUkVBRDoKKwkJ cmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfaTJjX3JlYWRfYWNrKHJhdywgbXNn KTsKKwljYXNlIERQX0VOVU1fUEFUSF9SRVNPVVJDRVM6CisJCXJldHVybiBkcm1fZHBfc2lkZWJh bmRfcGFyc2VfZW51bV9wYXRoX3Jlc291cmNlc19hY2socmF3LCBtc2cpOworCWNhc2UgRFBfQUxM T0NBVEVfUEFZTE9BRDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9hbGxvY2F0ZV9w YXlsb2FkX2FjayhyYXcsIG1zZyk7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJHb3QgdW5rbm93 biByZXBseSAweCUwMnhcbiIsIG1zZy0+cmVxX3R5cGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQor fQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfY29ubmVjdGlvbl9zdGF0dXNf bm90aWZ5KHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4ICpyYXcsCisJCQkJCQkJICAgc3Ry dWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKm1zZykKK3sKKwlpbnQgaWR4ID0gMTsK KworCW1zZy0+dS5jb25uX3N0YXQucG9ydF9udW1iZXIgPSAocmF3LT5tc2dbaWR4XSAmIDB4ZjAp ID4+IDQ7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVu OworCisJbWVtY3B5KG1zZy0+dS5jb25uX3N0YXQuZ3VpZCwgJnJhdy0+bXNnW2lkeF0sIDE2KTsK KwlpZHggKz0gMTY7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOwor CisJbXNnLT51LmNvbm5fc3RhdC5sZWdhY3lfZGV2aWNlX3BsdWdfc3RhdHVzID0gKHJhdy0+bXNn W2lkeF0gPj4gNikgJiAweDE7CisJbXNnLT51LmNvbm5fc3RhdC5kaXNwbGF5cG9ydF9kZXZpY2Vf cGx1Z19zdGF0dXMgPSAocmF3LT5tc2dbaWR4XSA+PiA1KSAmIDB4MTsKKwltc2ctPnUuY29ubl9z dGF0Lm1lc3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXMgPSAocmF3LT5tc2dbaWR4XSA+PiA0KSAmIDB4 MTsKKwltc2ctPnUuY29ubl9zdGF0LmlucHV0X3BvcnQgPSAocmF3LT5tc2dbaWR4XSA+PiAzKSAm IDB4MTsKKwltc2ctPnUuY29ubl9zdGF0LnBlZXJfZGV2aWNlX3R5cGUgPSAocmF3LT5tc2dbaWR4 XSAmIDB4Nyk7CisJaWR4Kys7CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlEUk1fREVCVUdf S01TKCJjb25uZWN0aW9uIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwg aWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1f ZHBfc2lkZWJhbmRfcGFyc2VfcmVzb3VyY2Vfc3RhdHVzX25vdGlmeShzdHJ1Y3QgZHJtX2RwX3Np ZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3JlcV9ib2R5ICptc2cpCit7CisJaW50IGlkeCA9IDE7CisKKwltc2ctPnUucmVzb3VyY2Vfc3Rh dC5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmMCkgPj4gNDsKKwlpZHgrKzsKKwlp ZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisKKwltZW1jcHkobXNnLT51 LnJlc291cmNlX3N0YXQuZ3VpZCwgJnJhdy0+bXNnW2lkeF0sIDE2KTsKKwlpZHggKz0gMTY7CisJ aWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCisJbXNnLT51LnJlc291 cmNlX3N0YXQuYXZhaWxhYmxlX3BibiA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNn W2lkeCArIDFdKTsKKwlpZHgrKzsKKwlyZXR1cm4gdHJ1ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJV R19LTVMoInJlc291cmNlIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwg aWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1f ZHBfc2lkZWJhbmRfcGFyc2VfcmVxKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4ICpyYXcs CisJCQkJICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKm1zZykKK3sK KwltZW1zZXQobXNnLCAwLCBzaXplb2YoKm1zZykpOworCW1zZy0+cmVxX3R5cGUgPSAocmF3LT5t c2dbMF0gJiAweDdmKTsKKworCXN3aXRjaCAobXNnLT5yZXFfdHlwZSkgeworCWNhc2UgRFBfQ09O TkVDVElPTl9TVEFUVVNfTk9USUZZOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5kX3BhcnNlX2Nv bm5lY3Rpb25fc3RhdHVzX25vdGlmeShyYXcsIG1zZyk7CisJY2FzZSBEUF9SRVNPVVJDRV9TVEFU VVNfTk9USUZZOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5kX3BhcnNlX3Jlc291cmNlX3N0YXR1 c19ub3RpZnkocmF3LCBtc2cpOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiR290IHVua25vd24g cmVxdWVzdCAweCUwMnhcbiIsIG1zZy0+cmVxX3R5cGUpOworCQlyZXR1cm4gZmFsc2U7CisJfQor fQorCitzdGF0aWMgaW50IGJ1aWxkX2RwY2Rfd3JpdGUoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9t c2dfdHggKm1zZywgdTggcG9ydF9udW0sIHUzMiBvZmZzZXQsIHU4IG51bV9ieXRlcywgdTggKmJ5 dGVzKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKworCXJl cS5yZXFfdHlwZSA9IERQX1JFTU9URV9EUENEX1dSSVRFOworCXJlcS51LmRwY2Rfd3JpdGUucG9y dF9udW1iZXIgPSBwb3J0X251bTsKKwlyZXEudS5kcGNkX3dyaXRlLmRwY2RfYWRkcmVzcyA9IG9m ZnNldDsKKwlyZXEudS5kcGNkX3dyaXRlLm51bV9ieXRlcyA9IG51bV9ieXRlczsKKwlyZXEudS5k cGNkX3dyaXRlLmJ5dGVzID0gYnl0ZXM7CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9yZXEoJnJl cSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2xpbmtfYWRkcmVz cyhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqbXNnKQoreworCXN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKworCXJlcS5yZXFfdHlwZSA9IERQX0xJTktfQURE UkVTUzsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcSgmcmVxLCBtc2cpOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGJ1aWxkX2VudW1fcGF0aF9yZXNvdXJjZXMoc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfdHggKm1zZywgaW50IHBvcnRfbnVtKQoreworCXN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKworCXJlcS5yZXFfdHlwZSA9IERQX0VOVU1fUEFU SF9SRVNPVVJDRVM7CisJcmVxLnUucG9ydF9udW0ucG9ydF9udW1iZXIgPSBwb3J0X251bTsKKwlk cm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcSgmcmVxLCBtc2cpOworCW1zZy0+cGF0aF9tc2cgPSB0 cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2FsbG9jYXRlX3BheWxvYWQo c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1zZywgaW50IHBvcnRfbnVtLAorCQkJCSAg dTggdmNwaSwgdWludDE2X3QgcGJuKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3Jl cV9ib2R5IHJlcTsKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCXJlcS5yZXFfdHlw ZSA9IERQX0FMTE9DQVRFX1BBWUxPQUQ7CisJcmVxLnUuYWxsb2NhdGVfcGF5bG9hZC5wb3J0X251 bWJlciA9IHBvcnRfbnVtOworCXJlcS51LmFsbG9jYXRlX3BheWxvYWQudmNwaSA9IHZjcGk7CisJ cmVxLnUuYWxsb2NhdGVfcGF5bG9hZC5wYm4gPSBwYm47CisJZHJtX2RwX2VuY29kZV9zaWRlYmFu ZF9yZXEoJnJlcSwgbXNnKTsKKwltc2ctPnBhdGhfbXNnID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBkcm1fZHBfbXN0X2Fzc2lnbl9wYXlsb2FkX2lkKHN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCQlzdHJ1Y3QgZHJtX2RwX3ZjcGkgKnZjcGkpCit7 CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm1nci0+cGF5bG9hZF9sb2NrKTsKKwlyZXQgPSBm aW5kX2ZpcnN0X3plcm9fYml0KCZtZ3ItPnBheWxvYWRfbWFzaywgbWdyLT5tYXhfcGF5bG9hZHMg KyAxKTsKKwlpZiAocmV0ID4gbWdyLT5tYXhfcGF5bG9hZHMpIHsKKwkJcmV0ID0gLUVJTlZBTDsK KwkJRFJNX0RFQlVHX0tNUygib3V0IG9mIHBheWxvYWQgaWRzICVkXG4iLCByZXQpOworCQlnb3Rv IG91dF91bmxvY2s7CisJfQorCisJc2V0X2JpdChyZXQsICZtZ3ItPnBheWxvYWRfbWFzayk7CisJ dmNwaS0+dmNwaSA9IHJldDsKKwltZ3ItPnByb3Bvc2VkX3ZjcGlzW3JldCAtIDFdID0gdmNwaTsK K291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX21zdF9wdXRfcGF5bG9hZF9pZChzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgICAgICBpbnQgaWQpCit7CisJaWYg KGlkID09IDApCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJm1nci0+cGF5bG9hZF9sb2NrKTsK KwlEUk1fREVCVUdfS01TKCJwdXR0aW5nIHBheWxvYWQgJWRcbiIsIGlkKTsKKwljbGVhcl9iaXQo aWQsICZtZ3ItPnBheWxvYWRfbWFzayk7CisJbWdyLT5wcm9wb3NlZF92Y3Bpc1tpZCAtIDFdID0g TlVMTDsKKwltdXRleF91bmxvY2soJm1nci0+cGF5bG9hZF9sb2NrKTsKK30KKworc3RhdGljIGJv b2wgY2hlY2tfdHhtc2dfc3RhdGUoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3Is CisJCQkgICAgICBzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2cpCit7CisJYm9v bCByZXQ7CisJbXV0ZXhfbG9jaygmbWdyLT5xbG9jayk7CisJcmV0ID0gKHR4bXNnLT5zdGF0ZSA9 PSBEUk1fRFBfU0lERUJBTkRfVFhfUlggfHwKKwkgICAgICAgdHhtc2ctPnN0YXRlID09IERSTV9E UF9TSURFQkFORF9UWF9USU1FT1VUKTsKKwltdXRleF91bmxvY2soJm1nci0+cWxvY2spOworCXJl dHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX21zdF93YWl0X3R4X3JlcGx5KHN0cnVj dCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCQkgICAgc3RydWN0IGRybV9kcF9zaWRlYmFu ZF9tc2dfdHggKnR4bXNnKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy ID0gbXN0Yi0+bWdyOworCWludCByZXQ7CisKKwlyZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobWdy LT50eF93YWl0cSwKKwkJCQkgY2hlY2tfdHhtc2dfc3RhdGUobWdyLCB0eG1zZyksCisJCQkJICg0 ICogSFopKTsKKwltdXRleF9sb2NrKCZtc3RiLT5tZ3ItPnFsb2NrKTsKKwlpZiAocmV0ID4gMCkg eworCQlpZiAodHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFORF9UWF9USU1FT1VUKSB7CisJ CQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwl9IGVsc2UgeworCQlEUk1fREVCVUdf S01TKCJ0aW1lZG91dCBtc2cgc2VuZCAlcCAlZCAlZFxuIiwgdHhtc2csIHR4bXNnLT5zdGF0ZSwg dHhtc2ctPnNlcW5vKTsKKworCQkvKiBkdW1wIHNvbWUgc3RhdGUgKi8KKwkJcmV0ID0gLUVJTzsK KworCQkvKiByZW1vdmUgZnJvbSBxICovCisJCWlmICh0eG1zZy0+c3RhdGUgPT0gRFJNX0RQX1NJ REVCQU5EX1RYX1FVRVVFRCB8fAorCQkgICAgdHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFO RF9UWF9TVEFSVF9TRU5EKSB7CisJCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCQl9CisKKwkJ aWYgKHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJBTkRfVFhfU1RBUlRfU0VORCB8fAorCQkg ICAgdHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFORF9UWF9TRU5UKSB7CisJCQltc3RiLT50 eF9zbG90c1t0eG1zZy0+c2Vxbm9dID0gTlVMTDsKKwkJfQorCX0KK291dDoKKwltdXRleF91bmxv Y2soJm1nci0+cWxvY2spOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1f ZHBfbXN0X2JyYW5jaCAqZHJtX2RwX2FkZF9tc3RfYnJhbmNoX2RldmljZSh1OCBsY3QsIHU4ICpy YWQpCit7CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiOworCisJbXN0YiA9IGt6YWxs b2Moc2l6ZW9mKCptc3RiKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFtc3RiKQorCQlyZXR1cm4gTlVM TDsKKworCW1zdGItPmxjdCA9IGxjdDsKKwlpZiAobGN0ID4gMSkKKwkJbWVtY3B5KG1zdGItPnJh ZCwgcmFkLCBsY3QgLyAyKTsKKwlJTklUX0xJU1RfSEVBRCgmbXN0Yi0+cG9ydHMpOworCWtyZWZf aW5pdCgmbXN0Yi0+a3JlZik7CisJcmV0dXJuIG1zdGI7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9k cF9kZXN0cm95X21zdF9icmFuY2hfZGV2aWNlKHN0cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVj dCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZHJt X2RwX21zdF9icmFuY2gsIGtyZWYpOworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsICp0 bXA7CisJYm9vbCB3YWtlX3R4ID0gZmFsc2U7CisKKwljYW5jZWxfd29ya19zeW5jKCZtc3RiLT5t Z3ItPndvcmspOworCisJLyoKKwkgKiBkZXN0cm95IGFsbCBwb3J0cyAtIGRvbid0IG5lZWQgbG9j aworCSAqIGFzIHRoZXJlIGFyZSBubyBtb3JlIHJlZmVyZW5jZXMgdG8gdGhlIG1zdCBicmFuY2gK KwkgKiBkZXZpY2UgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3Nh ZmUocG9ydCwgdG1wLCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsKKwkJbGlzdF9kZWwoJnBvcnQtPm5l eHQpOworCQlkcm1fZHBfcHV0X3BvcnQocG9ydCk7CisJfQorCisJLyogZHJvcCBhbnkgdHggc2xv dHMgbXNnICovCisJbXV0ZXhfbG9jaygmbXN0Yi0+bWdyLT5xbG9jayk7CisJaWYgKG1zdGItPnR4 X3Nsb3RzWzBdKSB7CisJCW1zdGItPnR4X3Nsb3RzWzBdLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFO RF9UWF9USU1FT1VUOworCQltc3RiLT50eF9zbG90c1swXSA9IE5VTEw7CisJCXdha2VfdHggPSB0 cnVlOworCX0KKwlpZiAobXN0Yi0+dHhfc2xvdHNbMV0pIHsKKwkJbXN0Yi0+dHhfc2xvdHNbMV0t PnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1RJTUVPVVQ7CisJCW1zdGItPnR4X3Nsb3RzWzFd ID0gTlVMTDsKKwkJd2FrZV90eCA9IHRydWU7CisJfQorCW11dGV4X3VubG9jaygmbXN0Yi0+bWdy LT5xbG9jayk7CisKKwlpZiAod2FrZV90eCkKKwkJd2FrZV91cCgmbXN0Yi0+bWdyLT50eF93YWl0 cSk7CisJa2ZyZWUobXN0Yik7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9wdXRfbXN0X2JyYW5j aF9kZXZpY2Uoc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiKQoreworCWtyZWZfcHV0KCZt c3RiLT5rcmVmLCBkcm1fZHBfZGVzdHJveV9tc3RfYnJhbmNoX2RldmljZSk7Cit9CisKKworc3Rh dGljIHZvaWQgZHJtX2RwX3BvcnRfdGVhcmRvd25fcGR0KHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQg KnBvcnQsIGludCBvbGRfcGR0KQoreworCXN3aXRjaCAob2xkX3BkdCkgeworCWNhc2UgRFBfUEVF Ul9ERVZJQ0VfRFBfTEVHQUNZX0NPTlY6CisJY2FzZSBEUF9QRUVSX0RFVklDRV9TU1RfU0lOSzoK KwkJLyogcmVtb3ZlIGkyYyBvdmVyIHNpZGViYW5kICovCisJCWRybV9kcF9tc3RfdW5yZWdpc3Rl cl9pMmNfYnVzKCZwb3J0LT5hdXgpOworCQlicmVhazsKKwljYXNlIERQX1BFRVJfREVWSUNFX01T VF9CUkFOQ0hJTkc6CisJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UocG9ydC0+bXN0Yik7 CisJCXBvcnQtPm1zdGIgPSBOVUxMOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRy bV9kcF9kZXN0cm95X3BvcnQoc3RydWN0IGtyZWYgKmtyZWYpCit7CisJc3RydWN0IGRybV9kcF9t c3RfcG9ydCAqcG9ydCA9IGNvbnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0 LCBrcmVmKTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciA9IHBvcnQtPm1n cjsKKwlpZiAoIXBvcnQtPmlucHV0KSB7CisJCXBvcnQtPnZjcGkubnVtX3Nsb3RzID0gMDsKKwkJ aWYgKHBvcnQtPmNvbm5lY3RvcikKKwkJCSgqcG9ydC0+bWdyLT5jYnMtPmRlc3Ryb3lfY29ubmVj dG9yKShtZ3IsIHBvcnQtPmNvbm5lY3Rvcik7CisJCWRybV9kcF9wb3J0X3RlYXJkb3duX3BkdChw b3J0LCBwb3J0LT5wZHQpOworCisJCWlmICghcG9ydC0+aW5wdXQgJiYgcG9ydC0+dmNwaS52Y3Bp ID4gMCkKKwkJCWRybV9kcF9tc3RfcHV0X3BheWxvYWRfaWQobWdyLCBwb3J0LT52Y3BpLnZjcGkp OworCX0KKwlrZnJlZShwb3J0KTsKKworCSgqbWdyLT5jYnMtPmhvdHBsdWcpKG1ncik7Cit9CisK K3N0YXRpYyB2b2lkIGRybV9kcF9wdXRfcG9ydChzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0 KQoreworCWtyZWZfcHV0KCZwb3J0LT5rcmVmLCBkcm1fZHBfZGVzdHJveV9wb3J0KTsKK30KKwor c3RhdGljIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqZHJtX2RwX21zdF9nZXRfdmFsaWRhdGVk X21zdGJfcmVmX2xvY2tlZChzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsIHN0cnVjdCBk cm1fZHBfbXN0X2JyYW5jaCAqdG9fZmluZCkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpw b3J0OworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqcm1zdGI7CisJaWYgKHRvX2ZpbmQgPT0g bXN0YikgeworCQlrcmVmX2dldCgmbXN0Yi0+a3JlZik7CisJCXJldHVybiBtc3RiOworCX0KKwls aXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZtc3RiLT5wb3J0cywgbmV4dCkgeworCQlpZiAocG9y dC0+bXN0YikgeworCQkJcm1zdGIgPSBkcm1fZHBfbXN0X2dldF92YWxpZGF0ZWRfbXN0Yl9yZWZf bG9ja2VkKHBvcnQtPm1zdGIsIHRvX2ZpbmQpOworCQkJaWYgKHJtc3RiKQorCQkJCXJldHVybiBy bXN0YjsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZHBf bXN0X2JyYW5jaCAqZHJtX2RwX2dldF92YWxpZGF0ZWRfbXN0Yl9yZWYoc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YikKK3sK KwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKnJtc3RiID0gTlVMTDsKKwltdXRleF9sb2NrKCZt Z3ItPmxvY2spOworCWlmIChtZ3ItPm1zdF9wcmltYXJ5KQorCQlybXN0YiA9IGRybV9kcF9tc3Rf Z2V0X3ZhbGlkYXRlZF9tc3RiX3JlZl9sb2NrZWQobWdyLT5tc3RfcHJpbWFyeSwgbXN0Yik7CisJ bXV0ZXhfdW5sb2NrKCZtZ3ItPmxvY2spOworCXJldHVybiBybXN0YjsKK30KKworc3RhdGljIHN0 cnVjdCBkcm1fZHBfbXN0X3BvcnQgKmRybV9kcF9tc3RfZ2V0X3BvcnRfcmVmX2xvY2tlZChzdHJ1 Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnRvX2Zp bmQpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwgKm1wb3J0OworCisJbGlzdF9m b3JfZWFjaF9lbnRyeShwb3J0LCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsKKwkJaWYgKHBvcnQgPT0g dG9fZmluZCkgeworCQkJa3JlZl9nZXQoJnBvcnQtPmtyZWYpOworCQkJcmV0dXJuIHBvcnQ7CisJ CX0KKwkJaWYgKHBvcnQtPm1zdGIpIHsKKwkJCW1wb3J0ID0gZHJtX2RwX21zdF9nZXRfcG9ydF9y ZWZfbG9ja2VkKHBvcnQtPm1zdGIsIHRvX2ZpbmQpOworCQkJaWYgKG1wb3J0KQorCQkJCXJldHVy biBtcG9ydDsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1f ZHBfbXN0X3BvcnQgKmRybV9kcF9nZXRfdmFsaWRhdGVkX3BvcnRfcmVmKHN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQorewor CXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnJwb3J0ID0gTlVMTDsKKwltdXRleF9sb2NrKCZtZ3It PmxvY2spOworCWlmIChtZ3ItPm1zdF9wcmltYXJ5KQorCQlycG9ydCA9IGRybV9kcF9tc3RfZ2V0 X3BvcnRfcmVmX2xvY2tlZChtZ3ItPm1zdF9wcmltYXJ5LCBwb3J0KTsKKwltdXRleF91bmxvY2so Jm1nci0+bG9jayk7CisJcmV0dXJuIHJwb3J0OworfQorCitzdGF0aWMgc3RydWN0IGRybV9kcF9t c3RfcG9ydCAqZHJtX2RwX2dldF9wb3J0KHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0Yiwg dTggcG9ydF9udW0pCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsKKworCWxpc3Rf Zm9yX2VhY2hfZW50cnkocG9ydCwgJm1zdGItPnBvcnRzLCBuZXh0KSB7CisJCWlmIChwb3J0LT5w b3J0X251bSA9PSBwb3J0X251bSkgeworCQkJa3JlZl9nZXQoJnBvcnQtPmtyZWYpOworCQkJcmV0 dXJuIHBvcnQ7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIGNhbGN1bGF0 ZSBhIG5ldyBSQUQgZm9yIHRoaXMgTVNUIGJyYW5jaCBkZXZpY2UKKyAqIGlmIHBhcmVudCBoYXMg YW4gTENUIG9mIDIgdGhlbiBpdCBoYXMgMSBuaWJibGUgb2YgUkFELAorICogaWYgcGFyZW50IGhh cyBhbiBMQ1Qgb2YgMyB0aGVuIGl0IGhhcyAyIG5pYmJsZXMgb2YgUkFELAorICovCitzdGF0aWMg dTggZHJtX2RwX2NhbGN1bGF0ZV9yYWQoc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJ CQkgdTggKnJhZCkKK3sKKwlpbnQgbGN0ID0gcG9ydC0+cGFyZW50LT5sY3Q7CisJaW50IHNoaWZ0 ID0gNDsKKwlpbnQgaWR4ID0gbGN0IC8gMjsKKwlpZiAobGN0ID4gMSkgeworCQltZW1jcHkocmFk LCBwb3J0LT5wYXJlbnQtPnJhZCwgaWR4KTsKKwkJc2hpZnQgPSAobGN0ICUgMikgPyA0IDogMDsK Kwl9IGVsc2UKKwkJcmFkWzBdID0gMDsKKworCXJhZFtpZHhdIHw9IHBvcnQtPnBvcnRfbnVtIDw8 IHNoaWZ0OworCXJldHVybiBsY3QgKyAxOworfQorCisvKgorICogcmV0dXJuIHNlbmRzIGxpbmsg YWRkcmVzcyBmb3IgbmV3IG1zdGIKKyAqLworc3RhdGljIGJvb2wgZHJtX2RwX3BvcnRfc2V0dXBf cGR0KHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpCit7CisJaW50IHJldDsKKwl1OCByYWRb Nl0sIGxjdDsKKwlib29sIHNlbmRfbGluayA9IGZhbHNlOworCXN3aXRjaCAocG9ydC0+cGR0KSB7 CisJY2FzZSBEUF9QRUVSX0RFVklDRV9EUF9MRUdBQ1lfQ09OVjoKKwljYXNlIERQX1BFRVJfREVW SUNFX1NTVF9TSU5LOgorCQkvKiBhZGQgaTJjIG92ZXIgc2lkZWJhbmQgKi8KKwkJcmV0ID0gZHJt X2RwX21zdF9yZWdpc3Rlcl9pMmNfYnVzKCZwb3J0LT5hdXgpOworCQlicmVhazsKKwljYXNlIERQ X1BFRVJfREVWSUNFX01TVF9CUkFOQ0hJTkc6CisJCWxjdCA9IGRybV9kcF9jYWxjdWxhdGVfcmFk KHBvcnQsIHJhZCk7CisKKwkJcG9ydC0+bXN0YiA9IGRybV9kcF9hZGRfbXN0X2JyYW5jaF9kZXZp Y2UobGN0LCByYWQpOworCQlwb3J0LT5tc3RiLT5tZ3IgPSBwb3J0LT5tZ3I7CisJCXBvcnQtPm1z dGItPnBvcnRfcGFyZW50ID0gcG9ydDsKKworCQlzZW5kX2xpbmsgPSB0cnVlOworCQlicmVhazsK Kwl9CisJcmV0dXJuIHNlbmRfbGluazsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX2NoZWNrX3Bv cnRfZ3VpZChzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkJICAgc3RydWN0IGRy bV9kcF9tc3RfcG9ydCAqcG9ydCkKK3sKKwlpbnQgcmV0OworCWlmIChwb3J0LT5kcGNkX3JldiA+ PSAweDEyKSB7CisJCXBvcnQtPmd1aWRfdmFsaWQgPSBkcm1fZHBfdmFsaWRhdGVfZ3VpZChtc3Ri LT5tZ3IsIHBvcnQtPmd1aWQpOworCQlpZiAoIXBvcnQtPmd1aWRfdmFsaWQpIHsKKwkJCXJldCA9 IGRybV9kcF9zZW5kX2RwY2Rfd3JpdGUobXN0Yi0+bWdyLAorCQkJCQkJICAgICBwb3J0LAorCQkJ CQkJICAgICBEUF9HVUlELAorCQkJCQkJICAgICAxNiwgcG9ydC0+Z3VpZCk7CisJCQlwb3J0LT5n dWlkX3ZhbGlkID0gdHJ1ZTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgYnVpbGRfbXN0X3By b3BfcGF0aChzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LAorCQkJCXN0cnVjdCBkcm1fZHBf bXN0X2JyYW5jaCAqbXN0YiwKKwkJCQljaGFyICpwcm9wcGF0aCkKK3sKKwlpbnQgaTsKKwljaGFy IHRlbXBbOF07CisJc25wcmludGYocHJvcHBhdGgsIDI1NSwgIm1zdDolZCIsIG1zdGItPm1nci0+ Y29ubl9iYXNlX2lkKTsKKwlmb3IgKGkgPSAwOyBpIDwgKG1zdGItPmxjdCAtIDEpOyBpKyspIHsK KwkJaW50IHNoaWZ0ID0gKGkgJSAyKSA/IDAgOiA0OworCQlpbnQgcG9ydF9udW0gPSBtc3RiLT5y YWRbaSAvIDJdID4+IHNoaWZ0OworCQlzbnByaW50Zih0ZW1wLCA4LCAiLSVkIiwgcG9ydF9udW0p OworCQlzdHJuY2F0KHByb3BwYXRoLCB0ZW1wLCAyNTUpOworCX0KKwlzbnByaW50Zih0ZW1wLCA4 LCAiLSVkIiwgcG9ydC0+cG9ydF9udW0pOworCXN0cm5jYXQocHJvcHBhdGgsIHRlbXAsIDI1NSk7 Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9hZGRfcG9ydChzdHJ1Y3QgZHJtX2RwX21zdF9icmFu Y2ggKm1zdGIsCisJCQkgICAgc3RydWN0IGRldmljZSAqZGV2LAorCQkJICAgIHN0cnVjdCBkcm1f ZHBfbGlua19hZGRyX3JlcGx5X3BvcnQgKnBvcnRfbXNnKQoreworCXN0cnVjdCBkcm1fZHBfbXN0 X3BvcnQgKnBvcnQ7CisJYm9vbCByZXQ7CisJYm9vbCBjcmVhdGVkID0gZmFsc2U7CisJaW50IG9s ZF9wZHQgPSAwOworCWludCBvbGRfZGRwcyA9IDA7CisJcG9ydCA9IGRybV9kcF9nZXRfcG9ydCht c3RiLCBwb3J0X21zZy0+cG9ydF9udW1iZXIpOworCWlmICghcG9ydCkgeworCQlwb3J0ID0ga3ph bGxvYyhzaXplb2YoKnBvcnQpLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFwb3J0KQorCQkJcmV0dXJu OworCQlrcmVmX2luaXQoJnBvcnQtPmtyZWYpOworCQlwb3J0LT5wYXJlbnQgPSBtc3RiOworCQlw b3J0LT5wb3J0X251bSA9IHBvcnRfbXNnLT5wb3J0X251bWJlcjsKKwkJcG9ydC0+bWdyID0gbXN0 Yi0+bWdyOworCQlwb3J0LT5hdXgubmFtZSA9ICJEUE1TVCI7CisJCXBvcnQtPmF1eC5kZXYgPSBk ZXY7CisJCWNyZWF0ZWQgPSB0cnVlOworCX0gZWxzZSB7CisJCW9sZF9wZHQgPSBwb3J0LT5wZHQ7 CisJCW9sZF9kZHBzID0gcG9ydC0+ZGRwczsKKwl9CisKKwlwb3J0LT5wZHQgPSBwb3J0X21zZy0+ cGVlcl9kZXZpY2VfdHlwZTsKKwlwb3J0LT5pbnB1dCA9IHBvcnRfbXNnLT5pbnB1dF9wb3J0Owor CXBvcnQtPm1jcyA9IHBvcnRfbXNnLT5tY3M7CisJcG9ydC0+ZGRwcyA9IHBvcnRfbXNnLT5kZHBz OworCXBvcnQtPmxkcHMgPSBwb3J0X21zZy0+bGVnYWN5X2RldmljZV9wbHVnX3N0YXR1czsKKwlw b3J0LT5kcGNkX3JldiA9IHBvcnRfbXNnLT5kcGNkX3JldmlzaW9uOworCXBvcnQtPm51bV9zZHBf c3RyZWFtcyA9IHBvcnRfbXNnLT5udW1fc2RwX3N0cmVhbXM7CisJcG9ydC0+bnVtX3NkcF9zdHJl YW1fc2lua3MgPSBwb3J0X21zZy0+bnVtX3NkcF9zdHJlYW1fc2lua3M7CisJbWVtY3B5KHBvcnQt Pmd1aWQsIHBvcnRfbXNnLT5wZWVyX2d1aWQsIDE2KTsKKworCS8qIG1hbmFnZSBtc3RiIHBvcnQg bGlzdHMgd2l0aCBtZ3IgbG9jayAtIHRha2UgYSByZWZlcmVuY2UKKwkgICBmb3IgdGhpcyBsaXN0 ICovCisJaWYgKGNyZWF0ZWQpIHsKKwkJbXV0ZXhfbG9jaygmbXN0Yi0+bWdyLT5sb2NrKTsKKwkJ a3JlZl9nZXQoJnBvcnQtPmtyZWYpOworCQlsaXN0X2FkZCgmcG9ydC0+bmV4dCwgJm1zdGItPnBv cnRzKTsKKwkJbXV0ZXhfdW5sb2NrKCZtc3RiLT5tZ3ItPmxvY2spOworCX0KKworCWlmIChvbGRf ZGRwcyAhPSBwb3J0LT5kZHBzKSB7CisJCWlmIChwb3J0LT5kZHBzKSB7CisJCQlkcm1fZHBfY2hl Y2tfcG9ydF9ndWlkKG1zdGIsIHBvcnQpOworCQkJaWYgKCFwb3J0LT5pbnB1dCkKKwkJCQlkcm1f ZHBfc2VuZF9lbnVtX3BhdGhfcmVzb3VyY2VzKG1zdGItPm1nciwgbXN0YiwgcG9ydCk7CisJCX0g ZWxzZSB7CisJCQlwb3J0LT5ndWlkX3ZhbGlkID0gZmFsc2U7CisJCQlwb3J0LT5hdmFpbGFibGVf cGJuID0gMDsKKwkJCX0KKwl9CisKKwlpZiAob2xkX3BkdCAhPSBwb3J0LT5wZHQgJiYgIXBvcnQt PmlucHV0KSB7CisJCWRybV9kcF9wb3J0X3RlYXJkb3duX3BkdChwb3J0LCBvbGRfcGR0KTsKKwor CQlyZXQgPSBkcm1fZHBfcG9ydF9zZXR1cF9wZHQocG9ydCk7CisJCWlmIChyZXQgPT0gdHJ1ZSkg eworCQkJZHJtX2RwX3NlbmRfbGlua19hZGRyZXNzKG1zdGItPm1nciwgcG9ydC0+bXN0Yik7CisJ CQlwb3J0LT5tc3RiLT5saW5rX2FkZHJlc3Nfc2VudCA9IHRydWU7CisJCX0KKwl9CisKKwlpZiAo Y3JlYXRlZCAmJiAhcG9ydC0+aW5wdXQpIHsKKwkJY2hhciBwcm9wcGF0aFsyNTVdOworCQlidWls ZF9tc3RfcHJvcF9wYXRoKHBvcnQsIG1zdGIsIHByb3BwYXRoKTsKKwkJcG9ydC0+Y29ubmVjdG9y ID0gKCptc3RiLT5tZ3ItPmNicy0+YWRkX2Nvbm5lY3RvcikobXN0Yi0+bWdyLCBwb3J0LCBwcm9w cGF0aCk7CisJfQorCisJLyogcHV0IHJlZmVyZW5jZSB0byB0aGlzIHBvcnQgKi8KKwlkcm1fZHBf cHV0X3BvcnQocG9ydCk7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF91cGRhdGVfcG9ydChzdHJ1 Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkgICAgICAgc3RydWN0IGRybV9kcF9jb25u ZWN0aW9uX3N0YXR1c19ub3RpZnkgKmNvbm5fc3RhdCkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9w b3J0ICpwb3J0OworCWludCBvbGRfcGR0OworCWludCBvbGRfZGRwczsKKwlib29sIGRvd29yayA9 IGZhbHNlOworCXBvcnQgPSBkcm1fZHBfZ2V0X3BvcnQobXN0YiwgY29ubl9zdGF0LT5wb3J0X251 bWJlcik7CisJaWYgKCFwb3J0KQorCQlyZXR1cm47CisKKwlvbGRfZGRwcyA9IHBvcnQtPmRkcHM7 CisJb2xkX3BkdCA9IHBvcnQtPnBkdDsKKwlwb3J0LT5wZHQgPSBjb25uX3N0YXQtPnBlZXJfZGV2 aWNlX3R5cGU7CisJcG9ydC0+bWNzID0gY29ubl9zdGF0LT5tZXNzYWdlX2NhcGFiaWxpdHlfc3Rh dHVzOworCXBvcnQtPmxkcHMgPSBjb25uX3N0YXQtPmxlZ2FjeV9kZXZpY2VfcGx1Z19zdGF0dXM7 CisJcG9ydC0+ZGRwcyA9IGNvbm5fc3RhdC0+ZGlzcGxheXBvcnRfZGV2aWNlX3BsdWdfc3RhdHVz OworCisJaWYgKG9sZF9kZHBzICE9IHBvcnQtPmRkcHMpIHsKKwkJaWYgKHBvcnQtPmRkcHMpIHsK KwkJCWRybV9kcF9jaGVja19wb3J0X2d1aWQobXN0YiwgcG9ydCk7CisJCQlkb3dvcmsgPSB0cnVl OworCQl9IGVsc2UgeworCQkJcG9ydC0+Z3VpZF92YWxpZCA9IGZhbHNlOworCQkJcG9ydC0+YXZh aWxhYmxlX3BibiA9IDA7CisJCX0KKwl9CisJaWYgKG9sZF9wZHQgIT0gcG9ydC0+cGR0ICYmICFw b3J0LT5pbnB1dCkgeworCQlkcm1fZHBfcG9ydF90ZWFyZG93bl9wZHQocG9ydCwgb2xkX3BkdCk7 CisKKwkJaWYgKGRybV9kcF9wb3J0X3NldHVwX3BkdChwb3J0KSkKKwkJCWRvd29yayA9IHRydWU7 CisJfQorCisJZHJtX2RwX3B1dF9wb3J0KHBvcnQpOworCWlmIChkb3dvcmspCisJCXF1ZXVlX3dv cmsoc3lzdGVtX2xvbmdfd3EsICZtc3RiLT5tZ3ItPndvcmspOworCit9CisKK3N0YXRpYyBzdHJ1 Y3QgZHJtX2RwX21zdF9icmFuY2ggKmRybV9kcF9nZXRfbXN0X2JyYW5jaF9kZXZpY2Uoc3RydWN0 IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCQkJICAgICAgIHU4IGxjdCwgdTgg KnJhZCkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7CisJc3RydWN0IGRybV9k cF9tc3RfcG9ydCAqcG9ydDsKKwlpbnQgaTsKKwkvKiBmaW5kIHRoZSBwb3J0IGJ5IGl0ZXJhdGlu ZyBkb3duICovCisJbXN0YiA9IG1nci0+bXN0X3ByaW1hcnk7CisKKwlmb3IgKGkgPSAwOyBpIDwg bGN0IC0gMTsgaSsrKSB7CisJCWludCBzaGlmdCA9IChpICUgMikgPyAwIDogNDsKKwkJaW50IHBv cnRfbnVtID0gcmFkW2kgLyAyXSA+PiBzaGlmdDsKKworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBv cnQsICZtc3RiLT5wb3J0cywgbmV4dCkgeworCQkJaWYgKHBvcnQtPnBvcnRfbnVtID09IHBvcnRf bnVtKSB7CisJCQkJaWYgKCFwb3J0LT5tc3RiKSB7CisJCQkJCURSTV9FUlJPUigiZmFpbGVkIHRv IGxvb2t1cCBNU1RCIHdpdGggbGN0ICVkLCByYWQgJTAyeFxuIiwgbGN0LCByYWRbMF0pOworCQkJ CQlyZXR1cm4gTlVMTDsKKwkJCQl9CisKKwkJCQltc3RiID0gcG9ydC0+bXN0YjsKKwkJCQlicmVh azsKKwkJCX0KKwkJfQorCX0KKwlrcmVmX2dldCgmbXN0Yi0+a3JlZik7CisJcmV0dXJuIG1zdGI7 Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9jaGVja19hbmRfc2VuZF9saW5rX2FkZHJlc3Moc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCSAgICAgICBzdHJ1Y3QgZHJt X2RwX21zdF9icmFuY2ggKm1zdGIpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsK KworCWlmICghbXN0Yi0+bGlua19hZGRyZXNzX3NlbnQpIHsKKwkJZHJtX2RwX3NlbmRfbGlua19h ZGRyZXNzKG1nciwgbXN0Yik7CisJCW1zdGItPmxpbmtfYWRkcmVzc19zZW50ID0gdHJ1ZTsKKwl9 CisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3J0LCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsKKwkJaWYg KHBvcnQtPmlucHV0KQorCQkJY29udGludWU7CisKKwkJaWYgKCFwb3J0LT5kZHBzKQorCQkJY29u dGludWU7CisKKwkJaWYgKCFwb3J0LT5hdmFpbGFibGVfcGJuKQorCQkJZHJtX2RwX3NlbmRfZW51 bV9wYXRoX3Jlc291cmNlcyhtZ3IsIG1zdGIsIHBvcnQpOworCisJCWlmIChwb3J0LT5tc3RiKQor CQkJZHJtX2RwX2NoZWNrX2FuZF9zZW5kX2xpbmtfYWRkcmVzcyhtZ3IsIHBvcnQtPm1zdGIpOwor CX0KK30KKworc3RhdGljIHZvaWQgZHJtX2RwX21zdF9saW5rX3Byb2JlX3dvcmsoc3RydWN0IHdv cmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy ID0gY29udGFpbmVyX29mKHdvcmssIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciwgd29y ayk7CisKKwlkcm1fZHBfY2hlY2tfYW5kX3NlbmRfbGlua19hZGRyZXNzKG1nciwgbWdyLT5tc3Rf cHJpbWFyeSk7CisKK30KKworc3RhdGljIGJvb2wgZHJtX2RwX3ZhbGlkYXRlX2d1aWQoc3RydWN0 IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJIHU4ICpndWlkKQoreworCXN0YXRp YyB1OCB6ZXJvX2d1aWRbMTZdOworCisJaWYgKCFtZW1jbXAoZ3VpZCwgemVyb19ndWlkLCAxNikp IHsKKwkJdTY0IHNhbHQgPSBnZXRfamlmZmllc182NCgpOworCQltZW1jcHkoJmd1aWRbMF0sICZz YWx0LCBzaXplb2YodTY0KSk7CisJCW1lbWNweSgmZ3VpZFs4XSwgJnNhbHQsIHNpemVvZih1NjQp KTsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworI2lmIDAKK3N0YXRp YyBpbnQgYnVpbGRfZHBjZF9yZWFkKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICptc2cs IHU4IHBvcnRfbnVtLCB1MzIgb2Zmc2V0LCB1OCBudW1fYnl0ZXMpCit7CisJc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgcmVxOworCisJcmVxLnJlcV90eXBlID0gRFBfUkVNT1RF X0RQQ0RfUkVBRDsKKwlyZXEudS5kcGNkX3JlYWQucG9ydF9udW1iZXIgPSBwb3J0X251bTsKKwly ZXEudS5kcGNkX3JlYWQuZHBjZF9hZGRyZXNzID0gb2Zmc2V0OworCXJlcS51LmRwY2RfcmVhZC5u dW1fYnl0ZXMgPSBudW1fYnl0ZXM7CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9yZXEoJnJlcSwg bXNnKTsKKworCXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHJtX2RwX3NlbmRf c2lkZWJhbmRfbXNnKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAg ICBib29sIHVwLCB1OCAqbXNnLCBpbnQgbGVuKQoreworCWludCByZXQ7CisJaW50IHJlZ2Jhc2Ug PSB1cCA/IERQX1NJREVCQU5EX01TR19VUF9SRVBfQkFTRSA6IERQX1NJREVCQU5EX01TR19ET1dO X1JFUV9CQVNFOworCWludCB0b3NlbmQsIHRvdGFsLCBvZmZzZXQ7CisJaW50IHJldHJpZXMgPSAw OworCityZXRyeToKKwl0b3RhbCA9IGxlbjsKKwlvZmZzZXQgPSAwOworCWRvIHsKKwkJdG9zZW5k ID0gbWluMyhtZ3ItPm1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCAxNiwgdG90YWwpOworCisJ CXJldCA9IGRybV9kcF9kcGNkX3dyaXRlKG1nci0+YXV4LCByZWdiYXNlICsgb2Zmc2V0LAorCQkJ CQkmbXNnW29mZnNldF0sCisJCQkJCXRvc2VuZCk7CisJCWlmIChyZXQgIT0gdG9zZW5kKSB7CisJ CQlpZiAocmV0ID09IC1FSU8gJiYgcmV0cmllcyA8IDUpIHsKKwkJCQlyZXRyaWVzKys7CisJCQkJ Z290byByZXRyeTsKKwkJCX0KKwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBkcGNkIHdyaXRl ICVkICVkXG4iLCB0b3NlbmQsIHJldCk7CisJCQlXQVJOKDEsICJmYWlsXG4iKTsKKworCQkJcmV0 dXJuIC1FSU87CisJCX0KKwkJb2Zmc2V0ICs9IHRvc2VuZDsKKwkJdG90YWwgLT0gdG9zZW5kOwor CX0gd2hpbGUgKHRvdGFsID4gMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2hk cl9mcm9tX2RzdF9xbG9jayhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgKmhkciwKKwkJ CQkgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZykKK3sKKwlzdHJ1Y3QgZHJt X2RwX21zdF9icmFuY2ggKm1zdGIgPSB0eG1zZy0+ZHN0OworCisJLyogYm90aCBtc2cgc2xvdHMg YXJlIGZ1bGwgKi8KKwlpZiAodHhtc2ctPnNlcW5vID09IC0xKSB7CisJCWlmIChtc3RiLT50eF9z bG90c1swXSAmJiBtc3RiLT50eF9zbG90c1sxXSkgeworCQkJRFJNX0RFQlVHX0tNUygiJXM6IGZh aWxlZCB0byBmaW5kIHNsb3RcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUFHQUlOOworCQl9 CisJCWlmIChtc3RiLT50eF9zbG90c1swXSA9PSBOVUxMICYmIG1zdGItPnR4X3Nsb3RzWzFdID09 IE5VTEwpIHsKKwkJCXR4bXNnLT5zZXFubyA9IG1zdGItPmxhc3Rfc2Vxbm87CisJCQltc3RiLT5s YXN0X3NlcW5vIF49IDE7CisJCX0gZWxzZSBpZiAobXN0Yi0+dHhfc2xvdHNbMF0gPT0gTlVMTCkK KwkJCXR4bXNnLT5zZXFubyA9IDA7CisJCWVsc2UKKwkJCXR4bXNnLT5zZXFubyA9IDE7CisJCW1z dGItPnR4X3Nsb3RzW3R4bXNnLT5zZXFub10gPSB0eG1zZzsKKwl9CisJaGRyLT5icm9hZGNhc3Qg PSAwOworCWhkci0+cGF0aF9tc2cgPSB0eG1zZy0+cGF0aF9tc2c7CisJaGRyLT5sY3QgPSBtc3Ri LT5sY3Q7CisJaGRyLT5sY3IgPSBtc3RiLT5sY3QgLSAxOworCWlmIChtc3RiLT5sY3QgPiAxKQor CQltZW1jcHkoaGRyLT5yYWQsIG1zdGItPnJhZCwgbXN0Yi0+bGN0IC8gMik7CisJaGRyLT5zZXFu byA9IHR4bXNnLT5zZXFubzsKKwlyZXR1cm4gMDsKK30KKy8qCisgKiBwcm9jZXNzIGEgc2luZ2xl IGJsb2NrIG9mIHRoZSBuZXh0IG1lc3NhZ2UgaW4gdGhlIHNpZGViYW5kIHF1ZXVlCisgKi8KK3N0 YXRpYyBpbnQgcHJvY2Vzc19zaW5nbGVfdHhfcWxvY2soc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsCisJCQkJICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNn LAorCQkJCSAgIGJvb2wgdXApCit7CisJdTggY2h1bmtbNDhdOworCXN0cnVjdCBkcm1fZHBfc2lk ZWJhbmRfbXNnX2hkciBoZHI7CisJaW50IGxlbiwgc3BhY2UsIGlkeCwgdG9zZW5kOworCWludCBy ZXQ7CisKKwlpZiAodHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFORF9UWF9RVUVVRUQpIHsK KwkJdHhtc2ctPnNlcW5vID0gLTE7CisJCXR4bXNnLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9U WF9TVEFSVF9TRU5EOworCX0KKworCS8qIG1ha2UgaGRyIGZyb20gZHN0IG1zdCAtIGZvciByZXBs aWVzIHVzZSBzZXFubworCSAgIG90aGVyd2lzZSBhc3NpZ24gb25lICovCisJcmV0ID0gc2V0X2hk cl9mcm9tX2RzdF9xbG9jaygmaGRyLCB0eG1zZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiBy ZXQ7CisKKwkvKiBhbW91bnQgbGVmdCB0byBzZW5kIGluIHRoaXMgbWVzc2FnZSAqLworCWxlbiA9 IHR4bXNnLT5jdXJfbGVuIC0gdHhtc2ctPmN1cl9vZmZzZXQ7CisKKwkvKiA0OCAtIHNpZGViYW5k IG1zZyBzaXplIC0gMSBieXRlIGZvciBkYXRhIENSQywgeCBoZWFkZXIgYnl0ZXMgKi8KKwlzcGFj ZSA9IDQ4IC0gMSAtIGRybV9kcF9jYWxjX3NiX2hkcl9zaXplKCZoZHIpOworCisJdG9zZW5kID0g bWluKGxlbiwgc3BhY2UpOworCWlmIChsZW4gPT0gdHhtc2ctPmN1cl9sZW4pCisJCWhkci5zb210 ID0gMTsKKwlpZiAoc3BhY2UgPj0gbGVuKQorCQloZHIuZW9tdCA9IDE7CisKKworCWhkci5tc2df bGVuID0gdG9zZW5kICsgMTsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX21zZ19oZHIoJmhkciwg Y2h1bmssICZpZHgpOworCW1lbWNweSgmY2h1bmtbaWR4XSwgJnR4bXNnLT5tc2dbdHhtc2ctPmN1 cl9vZmZzZXRdLCB0b3NlbmQpOworCS8qIGFkZCBjcmMgYXQgZW5kICovCisJZHJtX2RwX2NyY19z aWRlYmFuZF9jaHVua19yZXEoJmNodW5rW2lkeF0sIHRvc2VuZCk7CisJaWR4ICs9IHRvc2VuZCAr IDE7CisKKwlyZXQgPSBkcm1fZHBfc2VuZF9zaWRlYmFuZF9tc2cobWdyLCB1cCwgY2h1bmssIGlk eCk7CisJaWYgKHJldCkgeworCQlEUk1fREVCVUdfS01TKCJzaWRlYmFuZCBtc2cgZmFpbGVkIHRv IHNlbmRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXR4bXNnLT5jdXJfb2Zmc2V0ICs9IHRv c2VuZDsKKwlpZiAodHhtc2ctPmN1cl9vZmZzZXQgPT0gdHhtc2ctPmN1cl9sZW4pIHsKKwkJdHht c2ctPnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1NFTlQ7CisJCXJldHVybiAxOworCX0KKwly ZXR1cm4gMDsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgaG9sZGluZyBxbG9jayAqLworc3RhdGlj IHZvaWQgcHJvY2Vzc19zaW5nbGVfZG93bl90eF9xbG9jayhzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3IgKm1ncikKK3sKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7 CisJaW50IHJldDsKKworCS8qIGNvbnN0cnVjdCBhIGNodW5rIGZyb20gdGhlIGZpcnN0IG1zZyBp biB0aGUgdHhfbXNnIHF1ZXVlICovCisJaWYgKGxpc3RfZW1wdHkoJm1nci0+dHhfbXNnX2Rvd25x KSkgeworCQltZ3ItPnR4X2Rvd25faW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0K KwltZ3ItPnR4X2Rvd25faW5fcHJvZ3Jlc3MgPSB0cnVlOworCisJdHhtc2cgPSBsaXN0X2ZpcnN0 X2VudHJ5KCZtZ3ItPnR4X21zZ19kb3ducSwgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHgs IG5leHQpOworCXJldCA9IHByb2Nlc3Nfc2luZ2xlX3R4X3Fsb2NrKG1nciwgdHhtc2csIGZhbHNl KTsKKwlpZiAocmV0ID09IDEpIHsKKwkJLyogdHhtc2cgaXMgc2VudCBpdCBzaG91bGQgYmUgaW4g dGhlIHNsb3RzIG5vdyAqLworCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCX0gZWxzZSBpZiAo cmV0KSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBzZW5kIG1zZyBpbiBxICVkXG4iLCBy ZXQpOworCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCQlpZiAodHhtc2ctPnNlcW5vICE9IC0x KQorCQkJdHhtc2ctPmRzdC0+dHhfc2xvdHNbdHhtc2ctPnNlcW5vXSA9IE5VTEw7CisJCXR4bXNn LT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9UWF9USU1FT1VUOworCQl3YWtlX3VwKCZtZ3ItPnR4 X3dhaXRxKTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJm1nci0+dHhfbXNnX2Rvd25xKSkgeworCQlt Z3ItPnR4X2Rvd25faW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KK30KKworLyog Y2FsbGVkIGhvbGRpbmcgcWxvY2sgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2luZ2xlX3VwX3R4 X3Fsb2NrKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCXN0cnVjdCBk cm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsKKwlpbnQgcmV0OworCisJLyogY29uc3RydWN0 IGEgY2h1bmsgZnJvbSB0aGUgZmlyc3QgbXNnIGluIHRoZSB0eF9tc2cgcXVldWUgKi8KKwlpZiAo bGlzdF9lbXB0eSgmbWdyLT50eF9tc2dfdXBxKSkgeworCQltZ3ItPnR4X3VwX2luX3Byb2dyZXNz ID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwl0eG1zZyA9IGxpc3RfZmlyc3RfZW50cnkoJm1n ci0+dHhfbXNnX3VwcSwgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHgsIG5leHQpOworCXJl dCA9IHByb2Nlc3Nfc2luZ2xlX3R4X3Fsb2NrKG1nciwgdHhtc2csIHRydWUpOworCWlmIChyZXQg PT0gMSkgeworCQkvKiB1cCB0eG1zZ3MgYXJlbid0IHB1dCBpbiBzbG90cyAtIHNvIGZyZWUgYWZ0 ZXIgd2Ugc2VuZCBpdCAqLworCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCQlrZnJlZSh0eG1z Zyk7CisJfSBlbHNlIGlmIChyZXQpCisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBzZW5kIG1z ZyBpbiBxICVkXG4iLCByZXQpOworCW1nci0+dHhfdXBfaW5fcHJvZ3Jlc3MgPSB0cnVlOworfQor CitzdGF0aWMgdm9pZCBkcm1fZHBfcXVldWVfZG93bl90eChzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3IgKm1nciwKKwkJCQkgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNn KQoreworCW11dGV4X2xvY2soJm1nci0+cWxvY2spOworCWxpc3RfYWRkX3RhaWwoJnR4bXNnLT5u ZXh0LCAmbWdyLT50eF9tc2dfZG93bnEpOworCWlmICghbWdyLT50eF9kb3duX2luX3Byb2dyZXNz KQorCQlwcm9jZXNzX3NpbmdsZV9kb3duX3R4X3Fsb2NrKG1ncik7CisJbXV0ZXhfdW5sb2NrKCZt Z3ItPnFsb2NrKTsKK30KKworc3RhdGljIGludCBkcm1fZHBfc2VuZF9saW5rX2FkZHJlc3Moc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICAgIHN0cnVjdCBkcm1fZHBf bXN0X2JyYW5jaCAqbXN0YikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRf bXNnX3R4ICp0eG1zZzsKKwlpbnQgcmV0OworCisJdHhtc2cgPSBremFsbG9jKHNpemVvZigqdHht c2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR4 bXNnLT5kc3QgPSBtc3RiOworCWxlbiA9IGJ1aWxkX2xpbmtfYWRkcmVzcyh0eG1zZyk7CisKKwlk cm1fZHBfcXVldWVfZG93bl90eChtZ3IsIHR4bXNnKTsKKworCXJldCA9IGRybV9kcF9tc3Rfd2Fp dF90eF9yZXBseShtc3RiLCB0eG1zZyk7CisJaWYgKHJldCA+IDApIHsKKwkJaW50IGk7CisKKwkJ aWYgKHR4bXNnLT5yZXBseS5yZXBseV90eXBlID09IDEpCisJCQlEUk1fREVCVUdfS01TKCJsaW5r IGFkZHJlc3MgbmFrIHJlY2VpdmVkXG4iKTsKKwkJZWxzZSB7CisJCQlEUk1fREVCVUdfS01TKCJs aW5rIGFkZHJlc3MgcmVwbHk6ICVkXG4iLCB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIubnBvcnRz KTsKKwkJCWZvciAoaSA9IDA7IGkgPCB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIubnBvcnRzOyBp KyspIHsKKwkJCQlEUk1fREVCVUdfS01TKCJwb3J0ICVkOiBpbnB1dCAlZCwgcGR0OiAlZCwgcG46 ICVkLCBkcGNkX3JldjogJTAyeCwgbWNzOiAlZCwgZGRwczogJWQsIGxkcHMgJWQsIHNkcCAlZC8l ZFxuIiwgaSwKKwkJCQkgICAgICAgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRzW2ldLmlu cHV0X3BvcnQsCisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51LmxpbmtfYWRkci5wb3J0c1tpXS5w ZWVyX2RldmljZV90eXBlLAorCQkJCSAgICAgICB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIucG9y dHNbaV0ucG9ydF9udW1iZXIsCisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51LmxpbmtfYWRkci5w b3J0c1tpXS5kcGNkX3JldmlzaW9uLAorCQkJCSAgICAgICB0eG1zZy0+cmVwbHkudS5saW5rX2Fk ZHIucG9ydHNbaV0ubWNzLAorCQkJCSAgICAgICB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIucG9y dHNbaV0uZGRwcywKKwkJCQkgICAgICAgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRzW2ld LmxlZ2FjeV9kZXZpY2VfcGx1Z19zdGF0dXMsCisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51Lmxp bmtfYWRkci5wb3J0c1tpXS5udW1fc2RwX3N0cmVhbXMsCisJCQkJICAgICAgIHR4bXNnLT5yZXBs eS51LmxpbmtfYWRkci5wb3J0c1tpXS5udW1fc2RwX3N0cmVhbV9zaW5rcyk7CisJCQl9CisJCQlm b3IgKGkgPSAwOyBpIDwgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLm5wb3J0czsgaSsrKSB7CisJ CQkJZHJtX2RwX2FkZF9wb3J0KG1zdGIsIG1nci0+ZGV2LCAmdHhtc2ctPnJlcGx5LnUubGlua19h ZGRyLnBvcnRzW2ldKTsKKwkJCX0KKwkJCSgqbWdyLT5jYnMtPmhvdHBsdWcpKG1ncik7CisJCX0K Kwl9IGVsc2UKKwkJRFJNX0RFQlVHX0tNUygibGluayBhZGRyZXNzIGZhaWxlZCAlZFxuIiwgcmV0 KTsKKworCWtmcmVlKHR4bXNnKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcm1fZHBf c2VuZF9lbnVtX3BhdGhfcmVzb3VyY2VzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAq bWdyLAorCQkJCQkgICBzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIsCisJCQkJCSAgIHN0 cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgZHJtX2Rw X3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisJaW50IHJldDsKKworCXR4bXNnID0ga3phbGxvYyhz aXplb2YoKnR4bXNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eG1zZykKKwkJcmV0dXJuIC1FTk9N RU07CisKKwl0eG1zZy0+ZHN0ID0gbXN0YjsKKwlsZW4gPSBidWlsZF9lbnVtX3BhdGhfcmVzb3Vy Y2VzKHR4bXNnLCBwb3J0LT5wb3J0X251bSk7CisKKwlkcm1fZHBfcXVldWVfZG93bl90eChtZ3Is IHR4bXNnKTsKKworCXJldCA9IGRybV9kcF9tc3Rfd2FpdF90eF9yZXBseShtc3RiLCB0eG1zZyk7 CisJaWYgKHJldCA+IDApIHsKKwkJaWYgKHR4bXNnLT5yZXBseS5yZXBseV90eXBlID09IDEpCisJ CQlEUk1fREVCVUdfS01TKCJlbnVtIHBhdGggcmVzb3VyY2VzIG5hayByZWNlaXZlZFxuIik7CisJ CWVsc2UgeworCQkJaWYgKHBvcnQtPnBvcnRfbnVtICE9IHR4bXNnLT5yZXBseS51LnBhdGhfcmVz b3VyY2VzLnBvcnRfbnVtYmVyKQorCQkJCURSTV9FUlJPUigiZ290IGluY29ycmVjdCBwb3J0IGlu IHJlc3BvbnNlXG4iKTsKKwkJCURSTV9ERUJVR19LTVMoImVudW0gcGF0aCByZXNvdXJjZXMgJWQ6 ICVkICVkXG4iLCB0eG1zZy0+cmVwbHkudS5wYXRoX3Jlc291cmNlcy5wb3J0X251bWJlciwgdHht c2ctPnJlcGx5LnUucGF0aF9yZXNvdXJjZXMuZnVsbF9wYXlsb2FkX2J3X251bWJlciwKKwkJCSAg ICAgICB0eG1zZy0+cmVwbHkudS5wYXRoX3Jlc291cmNlcy5hdmFpbF9wYXlsb2FkX2J3X251bWJl cik7CisJCQlwb3J0LT5hdmFpbGFibGVfcGJuID0gdHhtc2ctPnJlcGx5LnUucGF0aF9yZXNvdXJj ZXMuYXZhaWxfcGF5bG9hZF9id19udW1iZXI7CisJCX0KKwl9CisKKwlrZnJlZSh0eG1zZyk7CisJ cmV0dXJuIDA7Cit9CisKK2ludCBkcm1fZHBfcGF5bG9hZF9zZW5kX21zZyhzdHJ1Y3QgZHJtX2Rw X21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCSAgICBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpw b3J0LAorCQkJICAgIGludCBpZCwKKwkJCSAgICBpbnQgcGJuKQoreworCXN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7 CisJaW50IGxlbiwgcmV0OworCisJbXN0YiA9IGRybV9kcF9nZXRfdmFsaWRhdGVkX21zdGJfcmVm KG1nciwgcG9ydC0+cGFyZW50KTsKKwlpZiAoIW1zdGIpCisJCXJldHVybiAtRUlOVkFMOworCisJ dHhtc2cgPSBremFsbG9jKHNpemVvZigqdHhtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNn KSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gZmFpbF9wdXQ7CisJfQorCisJdHhtc2ctPmRz dCA9IG1zdGI7CisJbGVuID0gYnVpbGRfYWxsb2NhdGVfcGF5bG9hZCh0eG1zZywgcG9ydC0+cG9y dF9udW0sCisJCQkJICAgICBpZCwKKwkJCQkgICAgIHBibik7CisKKwlkcm1fZHBfcXVldWVfZG93 bl90eChtZ3IsIHR4bXNnKTsKKworCXJldCA9IGRybV9kcF9tc3Rfd2FpdF90eF9yZXBseShtc3Ri LCB0eG1zZyk7CisJaWYgKHJldCA+IDApIHsKKwkJaWYgKHR4bXNnLT5yZXBseS5yZXBseV90eXBl ID09IDEpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0gZWxzZQorCQkJcmV0ID0gMDsKKwl9CisJ a2ZyZWUodHhtc2cpOworZmFpbF9wdXQ6CisJZHJtX2RwX3B1dF9tc3RfYnJhbmNoX2RldmljZSht c3RiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRybV9kcF9jcmVhdGVfcGF5bG9h ZF9zdGVwMShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgICAgICAg aW50IGlkLAorCQkJCSAgICAgICBzdHJ1Y3QgZHJtX2RwX3BheWxvYWQgKnBheWxvYWQpCit7CisJ aW50IHJldDsKKworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlX3BheWxvYWQobWdyLCBpZCwgcGF5 bG9hZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGF5bG9hZC0+cGF5bG9hZF9zdGF0ZSA9IDA7CisJ CXJldHVybiByZXQ7CisJfQorCXBheWxvYWQtPnBheWxvYWRfc3RhdGUgPSBEUF9QQVlMT0FEX0xP Q0FMOworCXJldHVybiAwOworfQorCitpbnQgZHJtX2RwX2NyZWF0ZV9wYXlsb2FkX3N0ZXAyKHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCXN0cnVjdCBkcm1fZHBfbXN0 X3BvcnQgKnBvcnQsCisJCQkJaW50IGlkLAorCQkJCXN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5 bG9hZCkKK3sKKwlpbnQgcmV0OworCXJldCA9IGRybV9kcF9wYXlsb2FkX3NlbmRfbXNnKG1nciwg cG9ydCwgaWQsIHBvcnQtPnZjcGkucGJuKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsK KwlwYXlsb2FkLT5wYXlsb2FkX3N0YXRlID0gRFBfUEFZTE9BRF9SRU1PVEU7CisJcmV0dXJuIHJl dDsKK30KKworaW50IGRybV9kcF9kZXN0cm95X3BheWxvYWRfc3RlcDEoc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQs CisJCQkJIGludCBpZCwKKwkJCQkgc3RydWN0IGRybV9kcF9wYXlsb2FkICpwYXlsb2FkKQorewor CURSTV9ERUJVR19LTVMoIlxuIik7CisJLyogaXRzIG9rYXkgZm9yIHRoZXNlIHRvIGZhaWwgKi8K KwlpZiAocG9ydCkgeworCQlkcm1fZHBfcGF5bG9hZF9zZW5kX21zZyhtZ3IsIHBvcnQsIGlkLCAw KTsKKwl9CisKKwlkcm1fZHBfZHBjZF93cml0ZV9wYXlsb2FkKG1nciwgaWQsIHBheWxvYWQpOwor CXBheWxvYWQtPnBheWxvYWRfc3RhdGUgPSAwOworCXJldHVybiAwOworfQorCitpbnQgZHJtX2Rw X2Rlc3Ryb3lfcGF5bG9hZF9zdGVwMihzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1n ciwKKwkJCQkgaW50IGlkLAorCQkJCSBzdHJ1Y3QgZHJtX2RwX3BheWxvYWQgKnBheWxvYWQpCit7 CisJcGF5bG9hZC0+cGF5bG9hZF9zdGF0ZSA9IDA7CisJcmV0dXJuIDA7Cit9CisKKy8qKgorICog ZHJtX2RwX3VwZGF0ZV9wYXlsb2FkX3BhcnQxKCkgLSBFeGVjdXRlIHBheWxvYWQgdXBkYXRlIHBh cnQgMQorICogQG1ncjogbWFuYWdlciB0byB1c2UuCisgKgorICogVGhpcyBpdGVyYXRlcyBvdmVy IGFsbCBwcm9wb3NlZCB2aXJ0dWFsIGNoYW5uZWxzLCBhbmQgdHJpZXMgdG8KKyAqIGFsbG9jYXRl IHNwYWNlIGluIHRoZSBsaW5rIGZvciB0aGVtLiBGb3IgMC0+c2xvdHMgdHJhbnNpdGlvbnMsCisg KiB0aGlzIHN0ZXAganVzdCB3cml0ZXMgdGhlIFZDUEkgdG8gdGhlIE1TVCBkZXZpY2UuIEZvciBz bG90cy0+MAorICogdHJhbnNpdGlvbnMsIHRoaXMgd3JpdGVzIHRoZSB1cGRhdGVkIFZDUElzIGFu ZCByZW1vdmVzIHRoZQorICogcmVtb3RlIFZDIHBheWxvYWRzLgorICoKKyAqIGFmdGVyIGNhbGxp bmcgdGhpcyB0aGUgZHJpdmVyIHNob3VsZCBnZW5lcmF0ZSBBQ1QgYW5kIHBheWxvYWQKKyAqIHBh Y2tldHMuCisgKi8KK2ludCBkcm1fZHBfdXBkYXRlX3BheWxvYWRfcGFydDEoc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJaW50IGk7CisJaW50IGN1cl9zbG90cyA9IDE7 CisJc3RydWN0IGRybV9kcF9wYXlsb2FkIHJlcV9wYXlsb2FkOworCXN0cnVjdCBkcm1fZHBfbXN0 X3BvcnQgKnBvcnQ7CisKKwltdXRleF9sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJZm9yIChp ID0gMDsgaSA8IG1nci0+bWF4X3BheWxvYWRzOyBpKyspIHsKKwkJLyogc29sdmUgdGhlIGN1cnJl bnQgcGF5bG9hZHMgLSBjb21wYXJlIHRvIHRoZSBodyBvbmVzCisJCSAgIC0gdXBkYXRlIHRoZSBo dyB2aWV3ICovCisJCXJlcV9wYXlsb2FkLnN0YXJ0X3Nsb3QgPSBjdXJfc2xvdHM7CisJCWlmICht Z3ItPnByb3Bvc2VkX3ZjcGlzW2ldKSB7CisJCQlwb3J0ID0gY29udGFpbmVyX29mKG1nci0+cHJv cG9zZWRfdmNwaXNbaV0sIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQsIHZjcGkpOworCQkJcmVxX3Bh eWxvYWQubnVtX3Nsb3RzID0gbWdyLT5wcm9wb3NlZF92Y3Bpc1tpXS0+bnVtX3Nsb3RzOworCQl9 IGVsc2UgeworCQkJcG9ydCA9IE5VTEw7CisJCQlyZXFfcGF5bG9hZC5udW1fc2xvdHMgPSAwOwor CQl9CisJCS8qIHdvcmsgb3V0IHdoYXQgaXMgcmVxdWlyZWQgdG8gaGFwcGVuIHdpdGggdGhpcyBw YXlsb2FkICovCisJCWlmIChtZ3ItPnBheWxvYWRzW2ldLnN0YXJ0X3Nsb3QgIT0gcmVxX3BheWxv YWQuc3RhcnRfc2xvdCB8fAorCQkgICAgbWdyLT5wYXlsb2Fkc1tpXS5udW1fc2xvdHMgIT0gcmVx X3BheWxvYWQubnVtX3Nsb3RzKSB7CisKKwkJCS8qIG5lZWQgdG8gcHVzaCBhbiB1cGRhdGUgZm9y IHRoaXMgcGF5bG9hZCAqLworCQkJaWYgKHJlcV9wYXlsb2FkLm51bV9zbG90cykgeworCQkJCWRy bV9kcF9jcmVhdGVfcGF5bG9hZF9zdGVwMShtZ3IsIGkgKyAxLCAmcmVxX3BheWxvYWQpOworCQkJ CW1nci0+cGF5bG9hZHNbaV0ubnVtX3Nsb3RzID0gcmVxX3BheWxvYWQubnVtX3Nsb3RzOworCQkJ fSBlbHNlIGlmIChtZ3ItPnBheWxvYWRzW2ldLm51bV9zbG90cykgeworCQkJCW1nci0+cGF5bG9h ZHNbaV0ubnVtX3Nsb3RzID0gMDsKKwkJCQlkcm1fZHBfZGVzdHJveV9wYXlsb2FkX3N0ZXAxKG1n ciwgcG9ydCwgaSArIDEsICZtZ3ItPnBheWxvYWRzW2ldKTsKKwkJCQlyZXFfcGF5bG9hZC5wYXls b2FkX3N0YXRlID0gbWdyLT5wYXlsb2Fkc1tpXS5wYXlsb2FkX3N0YXRlOworCQkJfSBlbHNlCisJ CQkJcmVxX3BheWxvYWQucGF5bG9hZF9zdGF0ZSA9IDA7CisKKwkJCW1nci0+cGF5bG9hZHNbaV0u c3RhcnRfc2xvdCA9IHJlcV9wYXlsb2FkLnN0YXJ0X3Nsb3Q7CisJCQltZ3ItPnBheWxvYWRzW2ld LnBheWxvYWRfc3RhdGUgPSByZXFfcGF5bG9hZC5wYXlsb2FkX3N0YXRlOworCQl9CisJCWN1cl9z bG90cyArPSByZXFfcGF5bG9hZC5udW1fc2xvdHM7CisJfQorCW11dGV4X3VubG9jaygmbWdyLT5w YXlsb2FkX2xvY2spOworCisJcmV0dXJuIDA7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9kcF91cGRh dGVfcGF5bG9hZF9wYXJ0MSk7CisKKy8qKgorICogZHJtX2RwX3VwZGF0ZV9wYXlsb2FkX3BhcnQy KCkgLSBFeGVjdXRlIHBheWxvYWQgdXBkYXRlIHBhcnQgMgorICogQG1ncjogbWFuYWdlciB0byB1 c2UuCisgKgorICogVGhpcyBpdGVyYXRlcyBvdmVyIGFsbCBwcm9wb3NlZCB2aXJ0dWFsIGNoYW5u ZWxzLCBhbmQgdHJpZXMgdG8KKyAqIGFsbG9jYXRlIHNwYWNlIGluIHRoZSBsaW5rIGZvciB0aGVt LiBGb3IgMC0+c2xvdHMgdHJhbnNpdGlvbnMsCisgKiB0aGlzIHN0ZXAgd3JpdGVzIHRoZSByZW1v dGUgVkMgcGF5bG9hZCBjb21tYW5kcy4gRm9yIHNsb3RzLT4wCisgKiB0aGlzIGp1c3QgcmVzZXRz IHNvbWUgaW50ZXJuYWwgc3RhdGUuCisgKi8KK2ludCBkcm1fZHBfdXBkYXRlX3BheWxvYWRfcGFy dDIoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJc3RydWN0IGRybV9k cF9tc3RfcG9ydCAqcG9ydDsKKwlpbnQgaTsKKwlpbnQgcmV0OworCW11dGV4X2xvY2soJm1nci0+ cGF5bG9hZF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWdyLT5tYXhfcGF5bG9hZHM7IGkrKykg eworCisJCWlmICghbWdyLT5wcm9wb3NlZF92Y3Bpc1tpXSkKKwkJCWNvbnRpbnVlOworCisJCXBv cnQgPSBjb250YWluZXJfb2YobWdyLT5wcm9wb3NlZF92Y3Bpc1tpXSwgc3RydWN0IGRybV9kcF9t c3RfcG9ydCwgdmNwaSk7CisKKwkJRFJNX0RFQlVHX0tNUygicGF5bG9hZCAlZCAlZFxuIiwgaSwg bWdyLT5wYXlsb2Fkc1tpXS5wYXlsb2FkX3N0YXRlKTsKKwkJaWYgKG1nci0+cGF5bG9hZHNbaV0u cGF5bG9hZF9zdGF0ZSA9PSBEUF9QQVlMT0FEX0xPQ0FMKSB7CisJCQlyZXQgPSBkcm1fZHBfY3Jl YXRlX3BheWxvYWRfc3RlcDIobWdyLCBwb3J0LCBpICsgMSwgJm1nci0+cGF5bG9hZHNbaV0pOwor CQl9IGVsc2UgaWYgKG1nci0+cGF5bG9hZHNbaV0ucGF5bG9hZF9zdGF0ZSA9PSBEUF9QQVlMT0FE X0RFTEVURV9MT0NBTCkgeworCQkJcmV0ID0gZHJtX2RwX2Rlc3Ryb3lfcGF5bG9hZF9zdGVwMiht Z3IsIGkgKyAxLCAmbWdyLT5wYXlsb2Fkc1tpXSk7CisJCX0KKwkJaWYgKHJldCkgeworCQkJbXV0 ZXhfdW5sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQor CW11dGV4X3VubG9jaygmbWdyLT5wYXlsb2FkX2xvY2spOworCXJldHVybiAwOworfQorRVhQT1JU X1NZTUJPTChkcm1fZHBfdXBkYXRlX3BheWxvYWRfcGFydDIpOworCisjaWYgMCAvKiB1bnVzZWQg YXMgb2YgeWV0ICovCitzdGF0aWMgaW50IGRybV9kcF9zZW5kX2RwY2RfcmVhZChzdHJ1Y3QgZHJt X2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAq cG9ydCwKKwkJCQkgaW50IG9mZnNldCwgaW50IHNpemUpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3Qg ZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisKKwl0eG1zZyA9IGt6YWxsb2Moc2l6ZW9m KCp0eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cpCisJCXJldHVybiAtRU5PTUVNOwor CisJbGVuID0gYnVpbGRfZHBjZF9yZWFkKHR4bXNnLCBwb3J0LT5wb3J0X251bSwgMCwgOCk7CisJ dHhtc2ctPmRzdCA9IHBvcnQtPnBhcmVudDsKKworCWRybV9kcF9xdWV1ZV9kb3duX3R4KG1nciwg dHhtc2cpOworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkcm1fZHBfc2Vu ZF9kcGNkX3dyaXRlKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAg c3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgIGludCBvZmZzZXQsIGludCBzaXpl LCB1OCAqYnl0ZXMpCit7CisJaW50IGxlbjsKKwlpbnQgcmV0OworCXN0cnVjdCBkcm1fZHBfc2lk ZWJhbmRfbXNnX3R4ICp0eG1zZzsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7CisK Kwltc3RiID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfbXN0Yl9yZWYobWdyLCBwb3J0LT5wYXJlbnQp OworCWlmICghbXN0YikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eG1zZyA9IGt6YWxsb2Moc2l6 ZW9mKCp0eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cpIHsKKwkJcmV0ID0gLUVOT01F TTsKKwkJZ290byBmYWlsX3B1dDsKKwl9CisKKwlsZW4gPSBidWlsZF9kcGNkX3dyaXRlKHR4bXNn LCBwb3J0LT5wb3J0X251bSwgb2Zmc2V0LCBzaXplLCBieXRlcyk7CisJdHhtc2ctPmRzdCA9IG1z dGI7CisKKwlkcm1fZHBfcXVldWVfZG93bl90eChtZ3IsIHR4bXNnKTsKKworCXJldCA9IGRybV9k cF9tc3Rfd2FpdF90eF9yZXBseShtc3RiLCB0eG1zZyk7CisJaWYgKHJldCA+IDApIHsKKwkJaWYg KHR4bXNnLT5yZXBseS5yZXBseV90eXBlID09IDEpIHsKKwkJCXJldCA9IC1FSU5WQUw7CisJCX0g ZWxzZQorCQkJcmV0ID0gMDsKKwl9CisJa2ZyZWUodHhtc2cpOworZmFpbF9wdXQ6CisJZHJtX2Rw X3B1dF9tc3RfYnJhbmNoX2RldmljZShtc3RiKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW50IGRybV9kcF9lbmNvZGVfdXBfYWNrX3JlcGx5KHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3R4ICptc2csIHU4IHJlcV90eXBlKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3Jl cGx5X2JvZHkgcmVwbHk7CisKKwlyZXBseS5yZXBseV90eXBlID0gMTsKKwlyZXBseS5yZXFfdHlw ZSA9IHJlcV90eXBlOworCWRybV9kcF9lbmNvZGVfc2lkZWJhbmRfcmVwbHkoJnJlcGx5LCBtc2cp OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRybV9kcF9zZW5kX3VwX2Fja19yZXBseShz dHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgICAgc3RydWN0IGRybV9k cF9tc3RfYnJhbmNoICptc3RiLAorCQkJCSAgICBpbnQgcmVxX3R5cGUsIGludCBzZXFubywgYm9v bCBicm9hZGNhc3QpCit7CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnOwor CisJdHhtc2cgPSBremFsbG9jKHNpemVvZigqdHhtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4 bXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR4bXNnLT5kc3QgPSBtc3RiOworCXR4bXNnLT5z ZXFubyA9IHNlcW5vOworCWRybV9kcF9lbmNvZGVfdXBfYWNrX3JlcGx5KHR4bXNnLCByZXFfdHlw ZSk7CisKKwltdXRleF9sb2NrKCZtZ3ItPnFsb2NrKTsKKwlsaXN0X2FkZF90YWlsKCZ0eG1zZy0+ bmV4dCwgJm1nci0+dHhfbXNnX3VwcSk7CisJaWYgKCFtZ3ItPnR4X3VwX2luX3Byb2dyZXNzKSB7 CisJCXByb2Nlc3Nfc2luZ2xlX3VwX3R4X3Fsb2NrKG1ncik7CisJfQorCW11dGV4X3VubG9jaygm bWdyLT5xbG9jayk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHJtX2RwX2dldF92Y19w YXlsb2FkX2J3KGludCBkcF9saW5rX2J3LCBpbnQgZHBfbGlua19jb3VudCkKK3sKKwlzd2l0Y2gg KGRwX2xpbmtfYncpIHsKKwljYXNlIERQX0xJTktfQldfMV82MjoKKwkJcmV0dXJuIDMgKiBkcF9s aW5rX2NvdW50OworCWNhc2UgRFBfTElOS19CV18yXzc6CisJCXJldHVybiA1ICogZHBfbGlua19j b3VudDsKKwljYXNlIERQX0xJTktfQldfNV80OgorCQlyZXR1cm4gMTAgKiBkcF9saW5rX2NvdW50 OworCX0KKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9z ZXRfbXN0KCkgLSBTZXQgdGhlIE1TVCBzdGF0ZSBmb3IgYSB0b3BvbG9neSBtYW5hZ2VyCisgKiBA bWdyOiBtYW5hZ2VyIHRvIHNldCBzdGF0ZSBmb3IKKyAqIEBtc3Rfc3RhdGU6IHRydWUgdG8gZW5h YmxlIE1TVCBvbiB0aGlzIGNvbm5lY3RvciAtIGZhbHNlIHRvIGRpc2FibGUuCisgKgorICogVGhp cyBpcyBjYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuIGl0IGRldGVjdHMgYW4gTVNUIGNhcGFibGUg ZGV2aWNlIHBsdWdnZWQKKyAqIGludG8gYSBEUCBNU1QgY2FwYWJsZSBwb3J0LCBvciB3aGVuIGEg RFAgTVNUIGNhcGFibGUgZGV2aWNlIGlzIHVucGx1Z2dlZC4KKyAqLworaW50IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyX3NldF9tc3Qoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3Is IGJvb2wgbXN0X3N0YXRlKQoreworCWludCByZXQgPSAwOworCXN0cnVjdCBkcm1fZHBfbXN0X2Jy YW5jaCAqbXN0YiA9IE5VTEw7CisKKwltdXRleF9sb2NrKCZtZ3ItPmxvY2spOworCWlmIChtc3Rf c3RhdGUgPT0gbWdyLT5tc3Rfc3RhdGUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCW1nci0+bXN0 X3N0YXRlID0gbXN0X3N0YXRlOworCS8qIHNldCB0aGUgZGV2aWNlIGludG8gTVNUIG1vZGUgKi8K KwlpZiAobXN0X3N0YXRlKSB7CisJCVdBUk5fT04obWdyLT5tc3RfcHJpbWFyeSk7CisKKwkJLyog Z2V0IGRwY2QgaW5mbyAqLworCQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkKG1nci0+YXV4LCBEUF9E UENEX1JFViwgbWdyLT5kcGNkLCBEUF9SRUNFSVZFUl9DQVBfU0laRSk7CisJCWlmIChyZXQgIT0g RFBfUkVDRUlWRVJfQ0FQX1NJWkUpIHsKKwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byByZWFk IERQQ0RcbiIpOworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisKKwkJbWdyLT5wYm5fZGl2ID0g ZHJtX2RwX2dldF92Y19wYXlsb2FkX2J3KG1nci0+ZHBjZFsxXSwgbWdyLT5kcGNkWzJdICYgRFBf TUFYX0xBTkVfQ09VTlRfTUFTSyk7CisJCW1nci0+dG90YWxfcGJuID0gMjU2MDsKKwkJbWdyLT50 b3RhbF9zbG90cyA9IERJVl9ST1VORF9VUChtZ3ItPnRvdGFsX3BibiwgbWdyLT5wYm5fZGl2KTsK KwkJbWdyLT5hdmFpbF9zbG90cyA9IG1nci0+dG90YWxfc2xvdHM7CisKKwkJLyogYWRkIGluaXRp YWwgYnJhbmNoIGRldmljZSBhdCBMQ1QgMSAqLworCQltc3RiID0gZHJtX2RwX2FkZF9tc3RfYnJh bmNoX2RldmljZSgxLCBOVUxMKTsKKwkJaWYgKG1zdGIgPT0gTlVMTCkgeworCQkJcmV0ID0gLUVO T01FTTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQltc3RiLT5tZ3IgPSBtZ3I7CisKKwkJ LyogZ2l2ZSB0aGlzIHRoZSBtYWluIHJlZmVyZW5jZSAqLworCQltZ3ItPm1zdF9wcmltYXJ5ID0g bXN0YjsKKwkJa3JlZl9nZXQoJm1nci0+bXN0X3ByaW1hcnktPmtyZWYpOworCisJCXsKKwkJCXN0 cnVjdCBkcm1fZHBfcGF5bG9hZCByZXNldF9wYXk7CisJCQlyZXNldF9wYXkuc3RhcnRfc2xvdCA9 IDA7CisJCQlyZXNldF9wYXkubnVtX3Nsb3RzID0gMHgzZjsKKwkJCWRybV9kcF9kcGNkX3dyaXRl X3BheWxvYWQobWdyLCAwLCAmcmVzZXRfcGF5KTsKKwkJfQorCisJCXJldCA9IGRybV9kcF9kcGNk X3dyaXRlYihtZ3ItPmF1eCwgRFBfTVNUTV9DVFJMLAorCQkJCQkgRFBfTVNUX0VOIHwgRFBfVVBf UkVRX0VOIHwgRFBfVVBTVFJFQU1fSVNfU1JDKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWdvdG8g b3V0X3VubG9jazsKKwkJfQorCisKKwkJLyogc29ydCBvdXQgZ3VpZCAqLworCQlyZXQgPSBkcm1f ZHBfZHBjZF9yZWFkKG1nci0+YXV4LCBEUF9HVUlELCBtZ3ItPmd1aWQsIDE2KTsKKwkJaWYgKHJl dCAhPSAxNikgeworCQkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIHJlYWQgRFAgR1VJRCAlZFxu IiwgcmV0KTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCisJCW1nci0+Z3VpZF92YWxpZCA9 IGRybV9kcF92YWxpZGF0ZV9ndWlkKG1nciwgbWdyLT5ndWlkKTsKKwkJaWYgKCFtZ3ItPmd1aWRf dmFsaWQpIHsKKwkJCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlKG1nci0+YXV4LCBEUF9HVUlELCBt Z3ItPmd1aWQsIDE2KTsKKwkJCW1nci0+Z3VpZF92YWxpZCA9IHRydWU7CisJCX0KKworCQlxdWV1 ZV93b3JrKHN5c3RlbV9sb25nX3dxLCAmbWdyLT53b3JrKTsKKworCQlyZXQgPSAwOworCX0gZWxz ZSB7CisJCS8qIGRpc2FibGUgTVNUIG9uIHRoZSBkZXZpY2UgKi8KKwkJbXN0YiA9IG1nci0+bXN0 X3ByaW1hcnk7CisJCW1nci0+bXN0X3ByaW1hcnkgPSBOVUxMOworCQkvKiB0aGlzIGNhbiBmYWls IGlmIHRoZSBkZXZpY2UgaXMgZ29uZSAqLworCQlkcm1fZHBfZHBjZF93cml0ZWIobWdyLT5hdXgs IERQX01TVE1fQ1RSTCwgMCk7CisJCXJldCA9IDA7CisJCW1lbXNldChtZ3ItPnBheWxvYWRzLCAw LCBtZ3ItPm1heF9wYXlsb2FkcyAqIHNpemVvZihzdHJ1Y3QgZHJtX2RwX3BheWxvYWQpKTsKKwkJ bWdyLT5wYXlsb2FkX21hc2sgPSAwOworCQlzZXRfYml0KDAsICZtZ3ItPnBheWxvYWRfbWFzayk7 CisJfQorCitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmbWdyLT5sb2NrKTsKKwlpZiAobXN0 YikKKwkJZHJtX2RwX3B1dF9tc3RfYnJhbmNoX2RldmljZShtc3RiKTsKKwlyZXR1cm4gcmV0Owor Cit9CitFWFBPUlRfU1lNQk9MKGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3NldF9tc3QpOworCisv KioKKyAqIGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3N1c3BlbmQoKSAtIHN1c3BlbmQgdGhlIE1T VCBtYW5hZ2VyCisgKiBAbWdyOiBtYW5hZ2VyIHRvIHN1c3BlbmQKKyAqCisgKiBUaGlzIGZ1bmN0 aW9uIHRlbGxzIHRoZSBNU1QgZGV2aWNlIHRoYXQgd2UgY2FuJ3QgaGFuZGxlIFVQIG1lc3NhZ2Vz CisgKiBhbnltb3JlLiBUaGlzIHNob3VsZCBzdG9wIGl0IGZyb20gc2VuZGluZyBhbnkgc2luY2Ug d2UgYXJlIHN1c3BlbmRlZC4KKyAqLwordm9pZCBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9zdXNw ZW5kKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCW11dGV4X2xvY2so Jm1nci0+bG9jayk7CisJZHJtX2RwX2RwY2Rfd3JpdGViKG1nci0+YXV4LCBEUF9NU1RNX0NUUkws CisJCQkgICBEUF9NU1RfRU4gfCBEUF9VUFNUUkVBTV9JU19TUkMpOworCW11dGV4X3VubG9jaygm bWdyLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3BvbG9neV9tZ3Jfc3Vz cGVuZCk7CisKKy8qKgorICogZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfcmVzdW1lKCkgLSByZXN1 bWUgdGhlIE1TVCBtYW5hZ2VyCisgKiBAbWdyOiBtYW5hZ2VyIHRvIHJlc3VtZQorICoKKyAqIFRo aXMgd2lsbCBmZXRjaCBEUENEIGFuZCBzZWUgaWYgdGhlIGRldmljZSBpcyBzdGlsbCB0aGVyZSwK KyAqIGlmIGl0IGlzLCBpdCB3aWxsIHJld3JpdGUgdGhlIE1TVE0gY29udHJvbCBiaXRzLCBhbmQg cmV0dXJuLgorICoKKyAqIGlmIHRoZSBkZXZpY2UgZmFpbHMgdGhpcyByZXR1cm5zIC0xLCBhbmQg dGhlIGRyaXZlciBzaG91bGQgZG8KKyAqIGEgZnVsbCBNU1QgcmVwcm9iZSwgaW4gY2FzZSB3ZSB3 ZXJlIHVuZG9ja2VkLgorICovCitpbnQgZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfcmVzdW1lKHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCWludCByZXQgPSAwOworCisJ bXV0ZXhfbG9jaygmbWdyLT5sb2NrKTsKKworCWlmIChtZ3ItPm1zdF9wcmltYXJ5KSB7CisJCWlu dCBzcmV0OworCQlzcmV0ID0gZHJtX2RwX2RwY2RfcmVhZChtZ3ItPmF1eCwgRFBfRFBDRF9SRVYs IG1nci0+ZHBjZCwgRFBfUkVDRUlWRVJfQ0FQX1NJWkUpOworCQlpZiAoc3JldCAhPSBEUF9SRUNF SVZFUl9DQVBfU0laRSkgeworCQkJRFJNX0RFQlVHX0tNUygiZHBjZCByZWFkIGZhaWxlZCAtIHVu ZG9ja2VkIGR1cmluZyBzdXNwZW5kP1xuIik7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gb3V0X3Vu bG9jazsKKwkJfQorCisJCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYihtZ3ItPmF1eCwgRFBfTVNU TV9DVFJMLAorCQkJCQkgRFBfTVNUX0VOIHwgRFBfVVBfUkVRX0VOIHwgRFBfVVBTVFJFQU1fSVNf U1JDKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCURSTV9ERUJVR19LTVMoIm1zdCB3cml0ZSBmYWls ZWQgLSB1bmRvY2tlZCBkdXJpbmcgc3VzcGVuZD9cbiIpOworCQkJcmV0ID0gLTE7CisJCQlnb3Rv IG91dF91bmxvY2s7CisJCX0KKwkJcmV0ID0gMDsKKwl9IGVsc2UKKwkJcmV0ID0gLTE7CisKK291 dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPmxvY2spOworCXJldHVybiByZXQ7Cit9CitF WFBPUlRfU1lNQk9MKGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3Jlc3VtZSk7CisKK3N0YXRpYyB2 b2lkIGRybV9kcF9nZXRfb25lX3NiX21zZyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3Ig Km1nciwgYm9vbCB1cCkKK3sKKwlpbnQgbGVuOworCXU4IHJlcGx5YmxvY2tbMzJdOworCWludCBy ZXBseWxlbiwgb3JpZ2xlbiwgY3VycmVwbHk7CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2RwX3Np ZGViYW5kX21zZ19yeCAqbXNnOworCWludCBiYXNlcmVnID0gdXAgPyBEUF9TSURFQkFORF9NU0df VVBfUkVRX0JBU0UgOiBEUF9TSURFQkFORF9NU0dfRE9XTl9SRVBfQkFTRTsKKwltc2cgPSB1cCA/ ICZtZ3ItPnVwX3JlcV9yZWN2IDogJm1nci0+ZG93bl9yZXBfcmVjdjsKKworCWxlbiA9IG1pbiht Z3ItPm1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCAxNik7CisJcmV0ID0gZHJtX2RwX2RwY2Rf cmVhZChtZ3ItPmF1eCwgYmFzZXJlZywKKwkJCSAgICAgICByZXBseWJsb2NrLCBsZW4pOworCWlm IChyZXQgIT0gbGVuKSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byByZWFkIERQQ0QgZG93 biByZXAgJWQgJWRcbiIsIGxlbiwgcmV0KTsKKwkJcmV0dXJuOworCX0KKwlyZXQgPSBkcm1fZHBf c2lkZWJhbmRfbXNnX2J1aWxkKG1zZywgcmVwbHlibG9jaywgbGVuLCB0cnVlKTsKKwlpZiAoIXJl dCkgeworCQlEUk1fREVCVUdfS01TKCJzaWRlYmFuZCBtc2cgYnVpbGQgZmFpbGVkICVkXG4iLCBy ZXBseWJsb2NrWzBdKTsKKwkJcmV0dXJuOworCX0KKwlyZXBseWxlbiA9IG1zZy0+Y3VyY2h1bmtf bGVuICsgbXNnLT5jdXJjaHVua19oZHJsZW47CisKKwlvcmlnbGVuID0gcmVwbHlsZW47CisJcmVw bHlsZW4gLT0gbGVuOworCWN1cnJlcGx5ID0gbGVuOworCXdoaWxlIChyZXBseWxlbiA+IDApIHsK KwkJbGVuID0gbWluMyhyZXBseWxlbiwgbWdyLT5tYXhfZHBjZF90cmFuc2FjdGlvbl9ieXRlcywg MTYpOworCQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkKG1nci0+YXV4LCBiYXNlcmVnICsgY3VycmVw bHksCisJCQkJICAgIHJlcGx5YmxvY2ssIGxlbik7CisJCWlmIChyZXQgIT0gbGVuKSB7CisJCQlE Uk1fREVCVUdfS01TKCJmYWlsZWQgdG8gcmVhZCBhIGNodW5rXG4iKTsKKwkJfQorCQlyZXQgPSBk cm1fZHBfc2lkZWJhbmRfbXNnX2J1aWxkKG1zZywgcmVwbHlibG9jaywgbGVuLCBmYWxzZSk7CisJ CWlmIChyZXQgPT0gZmFsc2UpCisJCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8gYnVpbGQgc2lk ZWJhbmQgbXNnXG4iKTsKKwkJY3VycmVwbHkgKz0gbGVuOworCQlyZXBseWxlbiAtPSBsZW47CisJ fQorfQorCitzdGF0aWMgaW50IGRybV9kcF9tc3RfaGFuZGxlX2Rvd25fcmVwKHN0cnVjdCBkcm1f ZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCWludCByZXQgPSAwOworCisJZHJtX2RwX2dl dF9vbmVfc2JfbXNnKG1nciwgZmFsc2UpOworCisJaWYgKG1nci0+ZG93bl9yZXBfcmVjdi5oYXZl X2VvbXQpIHsKKwkJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnOworCQlzdHJ1 Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7CisJCWludCBzbG90ID0gLTE7CisJCW1zdGIgPSBk cm1fZHBfZ2V0X21zdF9icmFuY2hfZGV2aWNlKG1nciwKKwkJCQkJCSAgICBtZ3ItPmRvd25fcmVw X3JlY3YuaW5pdGlhbF9oZHIubGN0LAorCQkJCQkJICAgIG1nci0+ZG93bl9yZXBfcmVjdi5pbml0 aWFsX2hkci5yYWQpOworCisJCWlmICghbXN0YikgeworCQkJRFJNX0RFQlVHX0tNUygiR290IE1T VCByZXBseSBmcm9tIHVua25vd24gZGV2aWNlICVkXG4iLCBtZ3ItPmRvd25fcmVwX3JlY3YuaW5p dGlhbF9oZHIubGN0KTsKKwkJCW1lbXNldCgmbWdyLT5kb3duX3JlcF9yZWN2LCAwLCBzaXplb2Yo c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcngpKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJ LyogZmluZCB0aGUgbWVzc2FnZSAqLworCQlzbG90ID0gbWdyLT5kb3duX3JlcF9yZWN2LmluaXRp YWxfaGRyLnNlcW5vOworCQltdXRleF9sb2NrKCZtZ3ItPnFsb2NrKTsKKwkJdHhtc2cgPSBtc3Ri LT50eF9zbG90c1tzbG90XTsKKwkJLyogcmVtb3ZlIGZyb20gc2xvdHMgKi8KKwkJbXV0ZXhfdW5s b2NrKCZtZ3ItPnFsb2NrKTsKKworCQlpZiAoIXR4bXNnKSB7CisJCQlEUk1fREVCVUdfS01TKCJH b3QgTVNUIHJlcGx5IHdpdGggbm8gbXNnICVwICVkICVkICUwMnggJTAyeFxuIiwKKwkJCSAgICAg ICBtc3RiLAorCQkJICAgICAgIG1nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5zZXFubywK KwkJCSAgICAgICBtZ3ItPmRvd25fcmVwX3JlY3YuaW5pdGlhbF9oZHIubGN0LAorCQkJCSAgICAg IG1nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5yYWRbMF0sCisJCQkJICAgICAgbWdyLT5k b3duX3JlcF9yZWN2Lm1zZ1swXSk7CisJCQlkcm1fZHBfcHV0X21zdF9icmFuY2hfZGV2aWNlKG1z dGIpOworCQkJbWVtc2V0KCZtZ3ItPmRvd25fcmVwX3JlY3YsIDAsIHNpemVvZihzdHJ1Y3QgZHJt X2RwX3NpZGViYW5kX21zZ19yeCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQlkcm1fZHBfc2lk ZWJhbmRfcGFyc2VfcmVwbHkoJm1nci0+ZG93bl9yZXBfcmVjdiwgJnR4bXNnLT5yZXBseSk7CisJ CWlmICh0eG1zZy0+cmVwbHkucmVwbHlfdHlwZSA9PSAxKSB7CisJCQlEUk1fREVCVUdfS01TKCJH b3QgTkFLIHJlcGx5OiByZXEgMHglMDJ4LCByZWFzb24gMHglMDJ4LCBuYWsgZGF0YSAweCUwMnhc biIsIHR4bXNnLT5yZXBseS5yZXFfdHlwZSwgdHhtc2ctPnJlcGx5LnUubmFrLnJlYXNvbiwgdHht c2ctPnJlcGx5LnUubmFrLm5ha19kYXRhKTsKKwkJfQorCisJCW1lbXNldCgmbWdyLT5kb3duX3Jl cF9yZWN2LCAwLCBzaXplb2Yoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcngpKTsKKwkJZHJt X2RwX3B1dF9tc3RfYnJhbmNoX2RldmljZShtc3RiKTsKKworCQltdXRleF9sb2NrKCZtZ3ItPnFs b2NrKTsKKwkJdHhtc2ctPnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1JYOworCQltc3RiLT50 eF9zbG90c1tzbG90XSA9IE5VTEw7CisJCW11dGV4X3VubG9jaygmbWdyLT5xbG9jayk7CisKKwkJ d2FrZV91cCgmbWdyLT50eF93YWl0cSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBp bnQgZHJtX2RwX21zdF9oYW5kbGVfdXBfcmVxKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21n ciAqbWdyKQoreworCWludCByZXQgPSAwOworCWRybV9kcF9nZXRfb25lX3NiX21zZyhtZ3IsIHRy dWUpOworCisJaWYgKG1nci0+dXBfcmVxX3JlY3YuaGF2ZV9lb210KSB7CisJCXN0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IG1zZzsKKwkJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNo ICptc3RiOworCQlib29sIHNlcW5vOworCQltc3RiID0gZHJtX2RwX2dldF9tc3RfYnJhbmNoX2Rl dmljZShtZ3IsCisJCQkJCQkgICAgbWdyLT51cF9yZXFfcmVjdi5pbml0aWFsX2hkci5sY3QsCisJ CQkJCQkgICAgbWdyLT51cF9yZXFfcmVjdi5pbml0aWFsX2hkci5yYWQpOworCQlpZiAoIW1zdGIp IHsKKwkJCURSTV9ERUJVR19LTVMoIkdvdCBNU1QgcmVwbHkgZnJvbSB1bmtub3duIGRldmljZSAl ZFxuIiwgbWdyLT51cF9yZXFfcmVjdi5pbml0aWFsX2hkci5sY3QpOworCQkJbWVtc2V0KCZtZ3It PnVwX3JlcV9yZWN2LCAwLCBzaXplb2Yoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcngpKTsK KwkJCXJldHVybiAwOworCQl9CisKKwkJc2Vxbm8gPSBtZ3ItPnVwX3JlcV9yZWN2LmluaXRpYWxf aGRyLnNlcW5vOworCQlkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVxKCZtZ3ItPnVwX3JlcV9yZWN2 LCAmbXNnKTsKKworCQlpZiAobXNnLnJlcV90eXBlID09IERQX0NPTk5FQ1RJT05fU1RBVFVTX05P VElGWSkgeworCQkJZHJtX2RwX3NlbmRfdXBfYWNrX3JlcGx5KG1nciwgbXN0YiwgbXNnLnJlcV90 eXBlLCBzZXFubywgZmFsc2UpOworCQkJZHJtX2RwX3VwZGF0ZV9wb3J0KG1zdGIsICZtc2cudS5j b25uX3N0YXQpOworCQkJRFJNX0RFQlVHX0tNUygiR290IENTTjogcG46ICVkIGxkcHM6JWQgZGRw czogJWQgbWNzOiAlZCBpcDogJWQgcGR0OiAlZFxuIiwgbXNnLnUuY29ubl9zdGF0LnBvcnRfbnVt YmVyLCBtc2cudS5jb25uX3N0YXQubGVnYWN5X2RldmljZV9wbHVnX3N0YXR1cywgbXNnLnUuY29u bl9zdGF0LmRpc3BsYXlwb3J0X2RldmljZV9wbHVnX3N0YXR1cywgbXNnLnUuY29ubl9zdGF0Lm1l c3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXMsIG1zZy51LmNvbm5fc3RhdC5pbnB1dF9wb3J0LCBtc2cu dS5jb25uX3N0YXQucGVlcl9kZXZpY2VfdHlwZSk7CisJCQkoKm1nci0+Y2JzLT5ob3RwbHVnKSht Z3IpOworCisJCX0gZWxzZSBpZiAobXNnLnJlcV90eXBlID09IERQX1JFU09VUkNFX1NUQVRVU19O T1RJRlkpIHsKKwkJCWRybV9kcF9zZW5kX3VwX2Fja19yZXBseShtZ3IsIG1zdGIsIG1zZy5yZXFf dHlwZSwgc2Vxbm8sIGZhbHNlKTsKKwkJCURSTV9ERUJVR19LTVMoIkdvdCBSU046IHBuOiAlZCBh dmFpbF9wYm4gJWRcbiIsIG1zZy51LnJlc291cmNlX3N0YXQucG9ydF9udW1iZXIsIG1zZy51LnJl c291cmNlX3N0YXQuYXZhaWxhYmxlX3Bibik7CisJCX0KKworCQlkcm1fZHBfcHV0X21zdF9icmFu Y2hfZGV2aWNlKG1zdGIpOworCQltZW1zZXQoJm1nci0+dXBfcmVxX3JlY3YsIDAsIHNpemVvZihz dHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCkpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisv KioKKyAqIGRybV9kcF9tc3RfaHBkX2lycSgpIC0gTVNUIGhvdHBsdWcgSVJRIG5vdGlmeQorICog QG1ncjogbWFuYWdlciB0byBub3RpZnkgaXJxIGZvci4KKyAqIEBlc2k6IDQgYnl0ZXMgZnJvbSBT SU5LX0NPVU5UX0VTSQorICoKKyAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBkcml2 ZXIgd2hlbiBpdCBkZXRlY3RzIGEgc2hvcnQgSVJRLAorICogYWxvbmcgd2l0aCB0aGUgdmFsdWUg b2YgdGhlIERFVklDRV9TRVJWSUNFX0lSUV9WRUNUT1JfRVNJMC4gVGhlCisgKiB0b3BvbG9neSBt YW5hZ2VyIHdpbGwgcHJvY2VzcyB0aGUgc2lkZWJhbmQgbWVzc2FnZXMgcmVjZWl2ZWQgYXMgYSBy ZXN1bHQKKyAqIG9mIHRoaXMuCisgKi8KK2ludCBkcm1fZHBfbXN0X2hwZF9pcnEoc3RydWN0IGRy bV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHU4ICplc2ksIGJvb2wgKmhhbmRsZWQpCit7CisJ aW50IHJldCA9IDA7CisJaW50IHNjOworCSpoYW5kbGVkID0gZmFsc2U7CisJc2MgPSBlc2lbMF0g JiAweDNmOworCisJaWYgKHNjICE9IG1nci0+c2lua19jb3VudCkgeworCQltZ3ItPnNpbmtfY291 bnQgPSBzYzsKKwkJKmhhbmRsZWQgPSB0cnVlOworCX0KKworCWlmIChlc2lbMV0gJiBEUF9ET1dO X1JFUF9NU0dfUkRZKSB7CisJCXJldCA9IGRybV9kcF9tc3RfaGFuZGxlX2Rvd25fcmVwKG1ncik7 CisJCSpoYW5kbGVkID0gdHJ1ZTsKKwl9CisKKwlpZiAoZXNpWzFdICYgRFBfVVBfUkVRX01TR19S RFkpIHsKKwkJcmV0IHw9IGRybV9kcF9tc3RfaGFuZGxlX3VwX3JlcShtZ3IpOworCQkqaGFuZGxl ZCA9IHRydWU7CisJfQorCisJZHJtX2RwX21zdF9raWNrX3R4KG1ncik7CisJcmV0dXJuIHJldDsK K30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9ocGRfaXJxKTsKKworLyoqCisgKiBkcm1fZHBf bXN0X2RldGVjdF9wb3J0KCkgLSBnZXQgY29ubmVjdGlvbiBzdGF0dXMgZm9yIGFuIE1TVCBwb3J0 CisgKiBAbWdyOiBtYW5hZ2VyIGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiB1bnZlcmlmaWVkIHBv aW50ZXIgdG8gYSBwb3J0CisgKgorICogVGhpcyByZXR1cm5zIHRoZSBjdXJyZW50IGNvbm5lY3Rp b24gc3RhdGUgZm9yIGEgcG9ydC4gSXQgdmFsaWRhdGVzIHRoZQorICogcG9ydCBwb2ludGVyIHN0 aWxsIGV4aXN0cyBzbyB0aGUgY2FsbGVyIGRvZXNuJ3QgcmVxdWlyZSBhIHJlZmVyZW5jZQorICov CitlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGRybV9kcF9tc3RfZGV0ZWN0X3BvcnQoc3RydWN0 IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBv cnQpCit7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3Rh dHVzX2Rpc2Nvbm5lY3RlZDsKKworCS8qIHdlIG5lZWQgdG8gc2VhcmNoIGZvciB0aGUgcG9ydCBp biB0aGUgbWdyIGluIGNhc2UgaXRzIGdvbmUgKi8KKwlwb3J0ID0gZHJtX2RwX2dldF92YWxpZGF0 ZWRfcG9ydF9yZWYobWdyLCBwb3J0KTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiBjb25uZWN0b3Jf c3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKworCWlmICghcG9ydC0+ZGRwcykKKwkJZ290byBvdXQ7CisK Kwlzd2l0Y2ggKHBvcnQtPnBkdCkgeworCWNhc2UgRFBfUEVFUl9ERVZJQ0VfTk9ORToKKwljYXNl IERQX1BFRVJfREVWSUNFX01TVF9CUkFOQ0hJTkc6CisJCWJyZWFrOworCisJY2FzZSBEUF9QRUVS X0RFVklDRV9TU1RfU0lOSzoKKwkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7 CisJCWJyZWFrOworCWNhc2UgRFBfUEVFUl9ERVZJQ0VfRFBfTEVHQUNZX0NPTlY6CisJCWlmIChw b3J0LT5sZHBzKQorCQkJc3RhdHVzID0gY29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWJy ZWFrOworCX0KK291dDoKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7CisJcmV0dXJuIHN0YXR1czsK K30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9kZXRlY3RfcG9ydCk7CisKKy8qKgorICogZHJt X2RwX21zdF9nZXRfZWRpZCgpIC0gZ2V0IEVESUQgZm9yIGFuIE1TVCBwb3J0CisgKiBAY29ubmVj dG9yOiB0b3BsZXZlbCBjb25uZWN0b3IgdG8gZ2V0IEVESUQgZm9yCisgKiBAbWdyOiBtYW5hZ2Vy IGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiB1bnZlcmlmaWVkIHBvaW50ZXIgdG8gYSBwb3J0Lgor ICoKKyAqIFRoaXMgcmV0dXJucyBhbiBFRElEIGZvciB0aGUgcG9ydCBjb25uZWN0ZWQgdG8gYSBj b25uZWN0b3IsCisgKiBJdCB2YWxpZGF0ZXMgdGhlIHBvaW50ZXIgc3RpbGwgZXhpc3RzIHNvIHRo ZSBjYWxsZXIgZG9lc24ndCByZXF1aXJlIGEKKyAqIHJlZmVyZW5jZS4KKyAqLworc3RydWN0IGVk aWQgKmRybV9kcF9tc3RfZ2V0X2VkaWQoc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwg c3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3Bv cnQgKnBvcnQpCit7CisJc3RydWN0IGVkaWQgKmVkaWQgPSBOVUxMOworCisJLyogd2UgbmVlZCB0 byBzZWFyY2ggZm9yIHRoZSBwb3J0IGluIHRoZSBtZ3IgaW4gY2FzZSBpdHMgZ29uZSAqLworCXBv cnQgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9wb3J0X3JlZihtZ3IsIHBvcnQpOworCWlmICghcG9y dCkKKwkJcmV0dXJuIE5VTEw7CisKKwllZGlkID0gZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJnBv cnQtPmF1eC5kZGMpOworCWRybV9kcF9wdXRfcG9ydChwb3J0KTsKKwlyZXR1cm4gZWRpZDsKK30K K0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9nZXRfZWRpZCk7CisKKy8qKgorICogZHJtX2RwX2Zp bmRfdmNwaV9zbG90cygpIC0gZmluZCBzbG90cyBmb3IgdGhpcyBQQk4gdmFsdWUKKyAqIEBtZ3I6 IG1hbmFnZXIgdG8gdXNlCisgKiBAcGJuOiBwYXlsb2FkIGJhbmR3aWR0aCB0byBjb252ZXJ0IGlu dG8gc2xvdHMuCisgKi8KK2ludCBkcm1fZHBfZmluZF92Y3BpX3Nsb3RzKHN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJICAgaW50IHBibikKK3sKKwlpbnQgbnVtX3Nsb3Rz OworCisJbnVtX3Nsb3RzID0gRElWX1JPVU5EX1VQKHBibiwgbWdyLT5wYm5fZGl2KTsKKworCWlm IChudW1fc2xvdHMgPiBtZ3ItPmF2YWlsX3Nsb3RzKQorCQlyZXR1cm4gLUVOT1NQQzsKKwlyZXR1 cm4gbnVtX3Nsb3RzOworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfZmluZF92Y3BpX3Nsb3RzKTsK Kworc3RhdGljIGludCBkcm1fZHBfaW5pdF92Y3BpKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyLAorCQkJICAgIHN0cnVjdCBkcm1fZHBfdmNwaSAqdmNwaSwgaW50IHBibikKK3sK KwlpbnQgbnVtX3Nsb3RzOworCWludCByZXQ7CisKKwludW1fc2xvdHMgPSBESVZfUk9VTkRfVVAo cGJuLCBtZ3ItPnBibl9kaXYpOworCisJaWYgKG51bV9zbG90cyA+IG1nci0+YXZhaWxfc2xvdHMp CisJCXJldHVybiAtRU5PU1BDOworCisJdmNwaS0+cGJuID0gcGJuOworCXZjcGktPmFsaWduZWRf cGJuID0gbnVtX3Nsb3RzICogbWdyLT5wYm5fZGl2OworCXZjcGktPm51bV9zbG90cyA9IG51bV9z bG90czsKKworCXJldCA9IGRybV9kcF9tc3RfYXNzaWduX3BheWxvYWRfaWQobWdyLCB2Y3BpKTsK KwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBk cm1fZHBfbXN0X2FsbG9jYXRlX3ZjcGkoKSAtIEFsbG9jYXRlIGEgdmlydHVhbCBjaGFubmVsCisg KiBAbWdyOiBtYW5hZ2VyIGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiBwb3J0IHRvIGFsbG9jYXRl IGEgdmlydHVhbCBjaGFubmVsIGZvci4KKyAqIEBwYm46IHBheWxvYWQgYmFuZHdpZHRoIG51bWJl ciB0byByZXF1ZXN0CisgKiBAc2xvdHM6IHJldHVybmVkIG51bWJlciBvZiBzbG90cyBmb3IgdGhp cyBQQk4uCisgKi8KK2Jvb2wgZHJtX2RwX21zdF9hbGxvY2F0ZV92Y3BpKHN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LCBpbnQg cGJuLCBpbnQgKnNsb3RzKQoreworCWludCByZXQ7CisKKwlwb3J0ID0gZHJtX2RwX2dldF92YWxp ZGF0ZWRfcG9ydF9yZWYobWdyLCBwb3J0KTsKKwlpZiAoIXBvcnQpCisJCXJldHVybiBmYWxzZTsK KworCWlmIChwb3J0LT52Y3BpLnZjcGkgPiAwKSB7CisJCURSTV9ERUJVR19LTVMoInBheWxvYWQ6 IHZjcGkgJWQgYWxyZWFkeSBhbGxvY2F0ZWQgZm9yIHBibiAlZCAtIHJlcXVlc3RlZCBwYm4gJWRc biIsIHBvcnQtPnZjcGkudmNwaSwgcG9ydC0+dmNwaS5wYm4sIHBibik7CisJCWlmIChwYm4gPT0g cG9ydC0+dmNwaS5wYm4pIHsKKwkJCSpzbG90cyA9IHBvcnQtPnZjcGkubnVtX3Nsb3RzOworCQkJ cmV0dXJuIHRydWU7CisJCX0KKwl9CisKKwlyZXQgPSBkcm1fZHBfaW5pdF92Y3BpKG1nciwgJnBv cnQtPnZjcGksIHBibik7CisJaWYgKHJldCkgeworCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8g aW5pdCB2Y3BpICVkICVkICVkXG4iLCBESVZfUk9VTkRfVVAocGJuLCBtZ3ItPnBibl9kaXYpLCBt Z3ItPmF2YWlsX3Nsb3RzLCByZXQpOworCQlnb3RvIG91dDsKKwl9CisJRFJNX0RFQlVHX0tNUygi aW5pdGluZyB2Y3BpIGZvciAlZCAlZFxuIiwgcGJuLCBwb3J0LT52Y3BpLm51bV9zbG90cyk7CisJ KnNsb3RzID0gcG9ydC0+dmNwaS5udW1fc2xvdHM7CisKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7 CisJcmV0dXJuIHRydWU7CitvdXQ6CisJcmV0dXJuIGZhbHNlOworfQorRVhQT1JUX1NZTUJPTChk cm1fZHBfbXN0X2FsbG9jYXRlX3ZjcGkpOworCisvKioKKyAqIGRybV9kcF9tc3RfcmVzZXRfdmNw aV9zbG90cygpIC0gUmVzZXQgbnVtYmVyIG9mIHNsb3RzIHRvIDAgZm9yIFZDUEkKKyAqIEBtZ3I6 IG1hbmFnZXIgZm9yIHRoaXMgcG9ydAorICogQHBvcnQ6IHVudmVyaWZpZWQgcG9pbnRlciB0byBh IHBvcnQuCisgKgorICogVGhpcyBqdXN0IHJlc2V0cyB0aGUgbnVtYmVyIG9mIHNsb3RzIGZvciB0 aGUgcG9ydHMgVkNQSSBmb3IgbGF0ZXIgcHJvZ3JhbW1pbmcuCisgKi8KK3ZvaWQgZHJtX2RwX21z dF9yZXNldF92Y3BpX3Nsb3RzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBz dHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQoreworCXBvcnQgPSBkcm1fZHBfZ2V0X3ZhbGlk YXRlZF9wb3J0X3JlZihtZ3IsIHBvcnQpOworCWlmICghcG9ydCkKKwkJcmV0dXJuOworCXBvcnQt PnZjcGkubnVtX3Nsb3RzID0gMDsKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7Cit9CitFWFBPUlRf U1lNQk9MKGRybV9kcF9tc3RfcmVzZXRfdmNwaV9zbG90cyk7CisKKy8qKgorICogZHJtX2RwX21z dF9kZWFsbG9jYXRlX3ZjcGkoKSAtIGRlYWxsb2NhdGUgYSBWQ1BJCisgKiBAbWdyOiBtYW5hZ2Vy IGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiB1bnZlcmlmaWVkIHBvcnQgdG8gZGVhbGxvY2F0ZSB2 Y3BpIGZvcgorICovCit2b2lkIGRybV9kcF9tc3RfZGVhbGxvY2F0ZV92Y3BpKHN0cnVjdCBkcm1f ZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQor eworCXBvcnQgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9wb3J0X3JlZihtZ3IsIHBvcnQpOworCWlm ICghcG9ydCkKKwkJcmV0dXJuOworCisJZHJtX2RwX21zdF9wdXRfcGF5bG9hZF9pZChtZ3IsIHBv cnQtPnZjcGkudmNwaSk7CisJcG9ydC0+dmNwaS5udW1fc2xvdHMgPSAwOworCXBvcnQtPnZjcGku cGJuID0gMDsKKwlwb3J0LT52Y3BpLmFsaWduZWRfcGJuID0gMDsKKwlwb3J0LT52Y3BpLnZjcGkg PSAwOworCWRybV9kcF9wdXRfcG9ydChwb3J0KTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21z dF9kZWFsbG9jYXRlX3ZjcGkpOworCitzdGF0aWMgaW50IGRybV9kcF9kcGNkX3dyaXRlX3BheWxv YWQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICAgICBpbnQgaWQs IHN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZCkKK3sKKwl1OCBwYXlsb2FkX2FsbG9jWzNd LCBzdGF0dXM7CisJaW50IHJldDsKKwlpbnQgcmV0cmllcyA9IDA7CisKKwlkcm1fZHBfZHBjZF93 cml0ZWIobWdyLT5hdXgsIERQX1BBWUxPQURfVEFCTEVfVVBEQVRFX1NUQVRVUywKKwkJCSAgIERQ X1BBWUxPQURfVEFCTEVfVVBEQVRFRCk7CisKKwlwYXlsb2FkX2FsbG9jWzBdID0gaWQ7CisJcGF5 bG9hZF9hbGxvY1sxXSA9IHBheWxvYWQtPnN0YXJ0X3Nsb3Q7CisJcGF5bG9hZF9hbGxvY1syXSA9 IHBheWxvYWQtPm51bV9zbG90czsKKworCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlKG1nci0+YXV4 LCBEUF9QQVlMT0FEX0FMTE9DQVRFX1NFVCwgcGF5bG9hZF9hbGxvYywgMyk7CisJaWYgKHJldCAh PSAzKSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byB3cml0ZSBwYXlsb2FkIGFsbG9jYXRp b24gJWRcbiIsIHJldCk7CisJCWdvdG8gZmFpbDsKKwl9CisKK3JldHJ5OgorCXJldCA9IGRybV9k cF9kcGNkX3JlYWRiKG1nci0+YXV4LCBEUF9QQVlMT0FEX1RBQkxFX1VQREFURV9TVEFUVVMsICZz dGF0dXMpOworCWlmIChyZXQgPCAwKSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byByZWFk IHBheWxvYWQgdGFibGUgc3RhdHVzICVkXG4iLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJ aWYgKCEoc3RhdHVzICYgRFBfUEFZTE9BRF9UQUJMRV9VUERBVEVEKSkgeworCQlyZXRyaWVzKys7 CisJCWlmIChyZXRyaWVzIDwgMjApIHsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOwor CQkJZ290byByZXRyeTsKKwkJfQorCQlEUk1fREVCVUdfS01TKCJzdGF0dXMgbm90IHNldCBhZnRl ciByZWFkIHBheWxvYWQgdGFibGUgc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQlyZXQgPSAtRUlO VkFMOworCQlnb3RvIGZhaWw7CisJfQorCXJldCA9IDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9 CisKKworLyoqCisgKiBkcm1fZHBfY2hlY2tfYWN0X3N0YXR1cygpIC0gQ2hlY2sgQUNUIGhhbmRs ZWQgc3RhdHVzLgorICogQG1ncjogbWFuYWdlciB0byB1c2UKKyAqCisgKiBDaGVjayB0aGUgcGF5 bG9hZCBzdGF0dXMgYml0cyBpbiB0aGUgRFBDRCBmb3IgQUNUIGhhbmRsZWQgY29tcGxldGlvbi4K KyAqLworaW50IGRybV9kcF9jaGVja19hY3Rfc3RhdHVzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9s b2d5X21nciAqbWdyKQoreworCXU4IHN0YXR1czsKKwlpbnQgcmV0OworCWludCBjb3VudCA9IDA7 CisKKwlkbyB7CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWRiKG1nci0+YXV4LCBEUF9QQVlMT0FE X1RBQkxFX1VQREFURV9TVEFUVVMsICZzdGF0dXMpOworCisJCWlmIChyZXQgPCAwKSB7CisJCQlE Uk1fREVCVUdfS01TKCJmYWlsZWQgdG8gcmVhZCBwYXlsb2FkIHRhYmxlIHN0YXR1cyAlZFxuIiwg cmV0KTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCisJCWlmIChzdGF0dXMgJiBEUF9QQVlMT0FEX0FD VF9IQU5ETEVEKQorCQkJYnJlYWs7CisJCWNvdW50Kys7CisJCXVkZWxheSgxMDApOworCisJfSB3 aGlsZSAoY291bnQgPCAzMCk7CisKKwlpZiAoIShzdGF0dXMgJiBEUF9QQVlMT0FEX0FDVF9IQU5E TEVEKSkgeworCQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8gZ2V0IEFDVCBiaXQgJWQgYWZ0ZXIg JWQgcmV0cmllc1xuIiwgc3RhdHVzLCBjb3VudCk7CisJCXJldCA9IC1FSU5WQUw7CisJCWdvdG8g ZmFpbDsKKwl9CisJcmV0dXJuIDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lN Qk9MKGRybV9kcF9jaGVja19hY3Rfc3RhdHVzKTsKKworLyoqCisgKiBkcm1fZHBfY2FsY19wYm5f bW9kZSgpIC0gQ2FsY3VsYXRlIHRoZSBQQk4gZm9yIGEgbW9kZS4KKyAqIEBjbG9jazogZG90IGNs b2NrIGZvciB0aGUgbW9kZQorICogQGJwcDogYnBwIGZvciB0aGUgbW9kZS4KKyAqCisgKiBUaGlz IHVzZXMgdGhlIGZvcm11bGEgaW4gdGhlIHNwZWMgdG8gY2FsY3VsYXRlIHRoZSBQQk4gdmFsdWUg Zm9yIGEgbW9kZS4KKyAqLworaW50IGRybV9kcF9jYWxjX3Bibl9tb2RlKGludCBjbG9jaywgaW50 IGJwcCkKK3sKKwlmaXhlZDIwXzEyIHBpeF9idzsKKwlmaXhlZDIwXzEyIGZicHA7CisJZml4ZWQy MF8xMiByZXN1bHQ7CisJZml4ZWQyMF8xMiBtYXJnaW4sIHRtcDsKKwl1MzIgcmVzOworCisJcGl4 X2J3LmZ1bGwgPSBkZml4ZWRfY29uc3QoY2xvY2spOworCWZicHAuZnVsbCA9IGRmaXhlZF9jb25z dChicHApOworCXRtcC5mdWxsID0gZGZpeGVkX2NvbnN0KDgpOworCWZicHAuZnVsbCA9IGRmaXhl ZF9kaXYoZmJwcCwgdG1wKTsKKworCXJlc3VsdC5mdWxsID0gZGZpeGVkX211bChwaXhfYncsIGZi cHApOworCW1hcmdpbi5mdWxsID0gZGZpeGVkX2NvbnN0KDU0KTsKKwl0bXAuZnVsbCA9IGRmaXhl ZF9jb25zdCg2NCk7CisJbWFyZ2luLmZ1bGwgPSBkZml4ZWRfZGl2KG1hcmdpbiwgdG1wKTsKKwly ZXN1bHQuZnVsbCA9IGRmaXhlZF9kaXYocmVzdWx0LCBtYXJnaW4pOworCisJbWFyZ2luLmZ1bGwg PSBkZml4ZWRfY29uc3QoMTAwNik7CisJdG1wLmZ1bGwgPSBkZml4ZWRfY29uc3QoMTAwMCk7CisJ bWFyZ2luLmZ1bGwgPSBkZml4ZWRfZGl2KG1hcmdpbiwgdG1wKTsKKwlyZXN1bHQuZnVsbCA9IGRm aXhlZF9tdWwocmVzdWx0LCBtYXJnaW4pOworCisJcmVzdWx0LmZ1bGwgPSBkZml4ZWRfZGl2KHJl c3VsdCwgdG1wKTsKKwlyZXN1bHQuZnVsbCA9IGRmaXhlZF9jZWlsKHJlc3VsdCk7CisJcmVzID0g ZGZpeGVkX3RydW5jKHJlc3VsdCk7CisJcmV0dXJuIHJlczsKK30KK0VYUE9SVF9TWU1CT0woZHJt X2RwX2NhbGNfcGJuX21vZGUpOworCitzdGF0aWMgaW50IHRlc3RfY2FsY19wYm5fbW9kZSh2b2lk KQoreworCWludCByZXQ7CisJcmV0ID0gZHJtX2RwX2NhbGNfcGJuX21vZGUoMTU0MDAwLCAzMCk7 CisJaWYgKHJldCAhPSA2ODkpCisJCXJldHVybiAtRUlOVkFMOworCXJldCA9IGRybV9kcF9jYWxj X3Bibl9tb2RlKDIzNDAwMCwgMzApOworCWlmIChyZXQgIT0gMTA0NykKKwkJcmV0dXJuIC1FSU5W QUw7CisJcmV0dXJuIDA7Cit9CisKKy8qIHdlIHdhbnQgdG8ga2ljayB0aGUgVFggYWZ0ZXIgd2Un dmUgYWNrIHRoZSB1cC9kb3duIElSUXMuICovCitzdGF0aWMgdm9pZCBkcm1fZHBfbXN0X2tpY2tf dHgoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJcXVldWVfd29yayhz eXN0ZW1fbG9uZ193cSwgJm1nci0+dHhfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9t c3RfZHVtcF9tc3RiKHN0cnVjdCBzZXFfZmlsZSAqbSwKKwkJCQkgc3RydWN0IGRybV9kcF9tc3Rf YnJhbmNoICptc3RiKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQ7CisJaW50IHRh YnMgPSBtc3RiLT5sY3Q7CisJY2hhciBwcmVmaXhbMTBdOworCWludCBpOworCisJZm9yIChpID0g MDsgaSA8IHRhYnM7IGkrKykKKwkJcHJlZml4W2ldID0gJ1x0JzsKKwlwcmVmaXhbaV0gPSAnXDAn OworCisJc2VxX3ByaW50ZihtLCAiJXNtc3Q6ICVwLCAlZFxuIiwgcHJlZml4LCBtc3RiLCBtc3Ri LT5udW1fcG9ydHMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwgJm1zdGItPnBvcnRzLCBu ZXh0KSB7CisJCXNlcV9wcmludGYobSwgIiVzcG9ydDogJWQ6IGRkcHM6ICVkIGxkcHM6ICVkLCAl cCwgY29ubjogJXBcbiIsIHByZWZpeCwgcG9ydC0+cG9ydF9udW0sIHBvcnQtPmRkcHMsIHBvcnQt PmxkcHMsIHBvcnQsIHBvcnQtPmNvbm5lY3Rvcik7CisJCWlmIChwb3J0LT5tc3RiKQorCQkJZHJt X2RwX21zdF9kdW1wX21zdGIobSwgcG9ydC0+bXN0Yik7CisJfQorfQorCitzdGF0aWMgYm9vbCBk dW1wX2RwX3BheWxvYWRfdGFibGUoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3Is CisJCQkJICBjaGFyICpidWYpCit7CisJaW50IHJldDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBp IDwgNDsgaSsrKSB7CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIERQX1BBWUxP QURfVEFCTEVfVVBEQVRFX1NUQVRVUyArIChpICogMTYpLCAmYnVmW2kgKiAxNl0sIDE2KTsKKwkJ aWYgKHJldCAhPSAxNikKKwkJCWJyZWFrOworCX0KKwlpZiAoaSA9PSA0KQorCQlyZXR1cm4gdHJ1 ZTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogZHJtX2RwX21zdF9kdW1wX3RvcG9sb2d5 KCk6IGR1bXAgdG9wb2xvZ3kgdG8gc2VxIGZpbGUuCisgKiBAbTogc2VxX2ZpbGUgdG8gZHVtcCBv dXRwdXQgdG8KKyAqIEBtZ3I6IG1hbmFnZXIgdG8gZHVtcCBjdXJyZW50IHRvcG9sb2d5IGZvci4K KyAqCisgKiBoZWxwZXIgdG8gZHVtcCBNU1QgdG9wb2xvZ3kgdG8gYSBzZXEgZmlsZSBmb3IgZGVi dWdmcy4KKyAqLwordm9pZCBkcm1fZHBfbXN0X2R1bXBfdG9wb2xvZ3koc3RydWN0IHNlcV9maWxl ICptLAorCQkJICAgICAgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJ aW50IGk7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsKKwltdXRleF9sb2NrKCZtZ3It PmxvY2spOworCWlmIChtZ3ItPm1zdF9wcmltYXJ5KQorCQlkcm1fZHBfbXN0X2R1bXBfbXN0Yiht LCBtZ3ItPm1zdF9wcmltYXJ5KTsKKworCS8qIGR1bXAgVkNQSXMgKi8KKwltdXRleF91bmxvY2so Jm1nci0+bG9jayk7CisKKwltdXRleF9sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJc2VxX3By aW50ZihtLCAidmNwaTogJWx4XG4iLCBtZ3ItPnBheWxvYWRfbWFzayk7CisKKwlmb3IgKGkgPSAw OyBpIDwgbWdyLT5tYXhfcGF5bG9hZHM7IGkrKykgeworCQlpZiAobWdyLT5wcm9wb3NlZF92Y3Bp c1tpXSkgeworCQkJcG9ydCA9IGNvbnRhaW5lcl9vZihtZ3ItPnByb3Bvc2VkX3ZjcGlzW2ldLCBz dHJ1Y3QgZHJtX2RwX21zdF9wb3J0LCB2Y3BpKTsKKwkJCXNlcV9wcmludGYobSwgInZjcGkgJWQ6 ICVkICVkICVkXG4iLCBpLCBwb3J0LT5wb3J0X251bSwgcG9ydC0+dmNwaS52Y3BpLCBwb3J0LT52 Y3BpLm51bV9zbG90cyk7CisJCX0gZWxzZQorCQkJc2VxX3ByaW50ZihtLCAidmNwaSAlZDp1bnNl ZFxuIiwgaSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBtZ3ItPm1heF9wYXlsb2FkczsgaSsrKSB7 CisJCXNlcV9wcmludGYobSwgInBheWxvYWQgJWQ6ICVkLCAlZCwgJWRcbiIsCisJCQkgICBpLAor CQkJICAgbWdyLT5wYXlsb2Fkc1tpXS5wYXlsb2FkX3N0YXRlLAorCQkJICAgbWdyLT5wYXlsb2Fk c1tpXS5zdGFydF9zbG90LAorCQkJICAgbWdyLT5wYXlsb2Fkc1tpXS5udW1fc2xvdHMpOworCisK Kwl9CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisKKwltdXRleF9sb2NrKCZt Z3ItPmxvY2spOworCWlmIChtZ3ItPm1zdF9wcmltYXJ5KSB7CisJCXU4IGJ1Zls2NF07CisJCWJv b2wgYnJldDsKKwkJaW50IHJldDsKKwkJcmV0ID0gZHJtX2RwX2RwY2RfcmVhZChtZ3ItPmF1eCwg RFBfRFBDRF9SRVYsIGJ1ZiwgRFBfUkVDRUlWRVJfQ0FQX1NJWkUpOworCQlzZXFfcHJpbnRmKG0s ICJkcGNkOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IERQX1JFQ0VJVkVSX0NBUF9TSVpFOyBpKysp CisJCQlzZXFfcHJpbnRmKG0sICIlMDJ4ICIsIGJ1ZltpXSk7CisJCXNlcV9wcmludGYobSwgIlxu Iik7CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIERQX0ZBVVhfQ0FQLCBidWYs IDIpOworCQlzZXFfcHJpbnRmKG0sICJmYXV4L21zdDogIik7CisJCWZvciAoaSA9IDA7IGkgPCAy OyBpKyspCisJCQlzZXFfcHJpbnRmKG0sICIlMDJ4ICIsIGJ1ZltpXSk7CisJCXNlcV9wcmludGYo bSwgIlxuIik7CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIERQX01TVE1fQ1RS TCwgYnVmLCAxKTsKKwkJc2VxX3ByaW50ZihtLCAibXN0IGN0cmw6ICIpOworCQlmb3IgKGkgPSAw OyBpIDwgMTsgaSsrKQorCQkJc2VxX3ByaW50ZihtLCAiJTAyeCAiLCBidWZbaV0pOworCQlzZXFf cHJpbnRmKG0sICJcbiIpOworCisJCWJyZXQgPSBkdW1wX2RwX3BheWxvYWRfdGFibGUobWdyLCBi dWYpOworCQlpZiAoYnJldCA9PSB0cnVlKSB7CisJCQlzZXFfcHJpbnRmKG0sICJwYXlsb2FkIHRh YmxlOiAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKQorCQkJCXNlcV9wcmludGYobSwg IiUwMnggIiwgYnVmW2ldKTsKKwkJCXNlcV9wcmludGYobSwgIlxuIik7CisJCX0KKworCX0KKwor CW11dGV4X3VubG9jaygmbWdyLT5sb2NrKTsKKworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfbXN0 X2R1bXBfdG9wb2xvZ3kpOworCitzdGF0aWMgdm9pZCBkcm1fZHBfdHhfd29yayhzdHJ1Y3Qgd29y a19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3Ig PSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyLCB0eF93 b3JrKTsKKworCW11dGV4X2xvY2soJm1nci0+cWxvY2spOworCWlmIChtZ3ItPnR4X2Rvd25faW5f cHJvZ3Jlc3MpCisJCXByb2Nlc3Nfc2luZ2xlX2Rvd25fdHhfcWxvY2sobWdyKTsKKwltdXRleF91 bmxvY2soJm1nci0+cWxvY2spOworfQorCisvKioKKyAqIGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdy X2luaXQgLSBpbml0aWFsaXNlIGEgdG9wb2xvZ3kgbWFuYWdlcgorICogQG1ncjogbWFuYWdlciBz dHJ1Y3QgdG8gaW5pdGlhbGlzZQorICogQGRldjogZGV2aWNlIHByb3ZpZGluZyB0aGlzIHN0cnVj dHVyZSAtIGZvciBpMmMgYWRkaXRpb24uCisgKiBAYXV4OiBEUCBoZWxwZXIgYXV4IGNoYW5uZWwg dG8gdGFsayB0byB0aGlzIGRldmljZQorICogQG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzOiBo dyBzcGVjaWZpYyBEUENEIHRyYW5zYWN0aW9uIGxpbWl0CisgKiBAbWF4X3BheWxvYWRzOiBtYXhp bXVtIG51bWJlciBvZiBwYXlsb2FkcyB0aGlzIEdQVSBjYW4gc291cmNlCisgKiBAY29ubl9iYXNl X2lkOiB0aGUgY29ubmVjdG9yIG9iamVjdCBJRCB0aGUgTVNUIGRldmljZSBpcyBjb25uZWN0ZWQg dG8uCisgKgorICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUg b24gZmFpbHVyZQorICovCitpbnQgZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfaW5pdChzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgc3RydWN0IGRldmljZSAqZGV2LCBz dHJ1Y3QgZHJtX2RwX2F1eCAqYXV4LAorCQkJCSBpbnQgbWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0 ZXMsCisJCQkJIGludCBtYXhfcGF5bG9hZHMsIGludCBjb25uX2Jhc2VfaWQpCit7CisJbXV0ZXhf aW5pdCgmbWdyLT5sb2NrKTsKKwltdXRleF9pbml0KCZtZ3ItPnFsb2NrKTsKKwltdXRleF9pbml0 KCZtZ3ItPnBheWxvYWRfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJm1nci0+dHhfbXNnX3VwcSk7 CisJSU5JVF9MSVNUX0hFQUQoJm1nci0+dHhfbXNnX2Rvd25xKTsKKwlJTklUX1dPUksoJm1nci0+ d29yaywgZHJtX2RwX21zdF9saW5rX3Byb2JlX3dvcmspOworCUlOSVRfV09SSygmbWdyLT50eF93 b3JrLCBkcm1fZHBfdHhfd29yayk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmbWdyLT50eF93YWl0 cSk7CisJbWdyLT5kZXYgPSBkZXY7CisJbWdyLT5hdXggPSBhdXg7CisJbWdyLT5tYXhfZHBjZF90 cmFuc2FjdGlvbl9ieXRlcyA9IG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzOworCW1nci0+bWF4 X3BheWxvYWRzID0gbWF4X3BheWxvYWRzOworCW1nci0+Y29ubl9iYXNlX2lkID0gY29ubl9iYXNl X2lkOworCW1nci0+cGF5bG9hZHMgPSBrY2FsbG9jKG1heF9wYXlsb2Fkcywgc2l6ZW9mKHN0cnVj dCBkcm1fZHBfcGF5bG9hZCksIEdGUF9LRVJORUwpOworCWlmICghbWdyLT5wYXlsb2FkcykKKwkJ cmV0dXJuIC1FTk9NRU07CisJbWdyLT5wcm9wb3NlZF92Y3BpcyA9IGtjYWxsb2MobWF4X3BheWxv YWRzLCBzaXplb2Yoc3RydWN0IGRybV9kcF92Y3BpICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1n ci0+cHJvcG9zZWRfdmNwaXMpCisJCXJldHVybiAtRU5PTUVNOworCXNldF9iaXQoMCwgJm1nci0+ cGF5bG9hZF9tYXNrKTsKKwl0ZXN0X2NhbGNfcGJuX21vZGUoKTsKKwlyZXR1cm4gMDsKK30KK0VY UE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfaW5pdCk7CisKKy8qKgorICogZHJt X2RwX21zdF90b3BvbG9neV9tZ3JfZGVzdHJveSgpIC0gZGVzdHJveSB0b3BvbG9neSBtYW5hZ2Vy LgorICogQG1ncjogbWFuYWdlciB0byBkZXN0cm95CisgKi8KK3ZvaWQgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3JfZGVzdHJveShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncikKK3sK KwltdXRleF9sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJa2ZyZWUobWdyLT5wYXlsb2Fkcyk7 CisJbWdyLT5wYXlsb2FkcyA9IE5VTEw7CisJa2ZyZWUobWdyLT5wcm9wb3NlZF92Y3Bpcyk7CisJ bWdyLT5wcm9wb3NlZF92Y3BpcyA9IE5VTEw7CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPnBheWxvYWRf bG9jayk7CisJbWdyLT5kZXYgPSBOVUxMOworCW1nci0+YXV4ID0gTlVMTDsKK30KK0VYUE9SVF9T WU1CT0woZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfZGVzdHJveSk7CisKKy8qIEkyQyBkZXZpY2Ug Ki8KK3N0YXRpYyBpbnQgZHJtX2RwX21zdF9pMmNfeGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFk YXB0ZXIsIHN0cnVjdCBpMmNfbXNnICptc2dzLAorCQkJICAgICAgIGludCBudW0pCit7CisJc3Ry dWN0IGRybV9kcF9hdXggKmF1eCA9IGFkYXB0ZXItPmFsZ29fZGF0YTsKKwlzdHJ1Y3QgZHJtX2Rw X21zdF9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29mKGF1eCwgc3RydWN0IGRybV9kcF9tc3RfcG9y dCwgYXV4KTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7CisJc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IgPSBwb3J0LT5tZ3I7CisJdW5zaWduZWQgaW50IGk7CisJ Ym9vbCByZWFkaW5nID0gZmFsc2U7CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2Jv ZHkgbXNnOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZyA9IE5VTEw7CisJ aW50IHJldDsKKworCW1zdGIgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9tc3RiX3JlZihtZ3IsIHBv cnQtPnBhcmVudCk7CisJaWYgKCFtc3RiKQorCQlyZXR1cm4gLUVSRU1PVEVJTzsKKworCS8qIGNv bnN0cnVjdCBpMmMgbXNnICovCisJLyogc2VlIGlmIGxhc3QgbXNnIGlzIGEgcmVhZCAqLworCWlm IChtc2dzW251bSAtIDFdLmZsYWdzICYgSTJDX01fUkQpCisJCXJlYWRpbmcgPSB0cnVlOworCisJ aWYgKCFyZWFkaW5nKSB7CisJCURSTV9ERUJVR19LTVMoIlVuc3VwcG9ydGVkIEkyQyB0cmFuc2Fj dGlvbiBmb3IgTVNUIGRldmljZVxuIik7CisJCXJldCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0K KworCW1zZy5yZXFfdHlwZSA9IERQX1JFTU9URV9JMkNfUkVBRDsKKwltc2cudS5pMmNfcmVhZC5u dW1fdHJhbnNhY3Rpb25zID0gbnVtIC0gMTsKKwltc2cudS5pMmNfcmVhZC5wb3J0X251bWJlciA9 IHBvcnQtPnBvcnRfbnVtOworCWZvciAoaSA9IDA7IGkgPCBudW0gLSAxOyBpKyspIHsKKwkJbXNn LnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLmkyY19kZXZfaWQgPSBtc2dzW2ldLmFkZHI7CisJ CW1zZy51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5udW1fYnl0ZXMgPSBtc2dzW2ldLmxlbjsK KwkJbXNnLnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLmJ5dGVzID0gbXNnc1tpXS5idWY7CisJ fQorCW1zZy51LmkyY19yZWFkLnJlYWRfaTJjX2RldmljZV9pZCA9IG1zZ3NbbnVtIC0gMV0uYWRk cjsKKwltc2cudS5pMmNfcmVhZC5udW1fYnl0ZXNfcmVhZCA9IG1zZ3NbbnVtIC0gMV0ubGVuOwor CisJdHhtc2cgPSBremFsbG9jKHNpemVvZigqdHhtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4 bXNnKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXR4bXNnLT5kc3Qg PSBtc3RiOworCWRybV9kcF9lbmNvZGVfc2lkZWJhbmRfcmVxKCZtc2csIHR4bXNnKTsKKworCWRy bV9kcF9xdWV1ZV9kb3duX3R4KG1nciwgdHhtc2cpOworCisJcmV0ID0gZHJtX2RwX21zdF93YWl0 X3R4X3JlcGx5KG1zdGIsIHR4bXNnKTsKKwlpZiAocmV0ID4gMCkgeworCisJCWlmICh0eG1zZy0+ cmVwbHkucmVwbHlfdHlwZSA9PSAxKSB7IC8qIGdvdCBhIE5BSyBiYWNrICovCisJCQlyZXQgPSAt RVJFTU9URUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHR4bXNnLT5yZXBseS51LnJlbW90 ZV9pMmNfcmVhZF9hY2subnVtX2J5dGVzICE9IG1zZ3NbbnVtIC0gMV0ubGVuKSB7CisJCQlyZXQg PSAtRUlPOworCQkJZ290byBvdXQ7CisJCX0KKwkJbWVtY3B5KG1zZ3NbbnVtIC0gMV0uYnVmLCB0 eG1zZy0+cmVwbHkudS5yZW1vdGVfaTJjX3JlYWRfYWNrLmJ5dGVzLCBtc2dzW251bSAtIDFdLmxl bik7CisJCXJldCA9IG51bTsKKwl9CitvdXQ6CisJa2ZyZWUodHhtc2cpOworCWRybV9kcF9wdXRf bXN0X2JyYW5jaF9kZXZpY2UobXN0Yik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBk cm1fZHBfbXN0X2kyY19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikK K3sKKwlyZXR1cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTCB8CisJICAgICAg IEkyQ19GVU5DX1NNQlVTX1JFQURfQkxPQ0tfREFUQSB8CisJICAgICAgIEkyQ19GVU5DX1NNQlVT X0JMT0NLX1BST0NfQ0FMTCB8CisJICAgICAgIEkyQ19GVU5DXzEwQklUX0FERFI7Cit9CisKK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkcm1fZHBfbXN0X2kyY19hbGdvID0gewor CS5mdW5jdGlvbmFsaXR5ID0gZHJtX2RwX21zdF9pMmNfZnVuY3Rpb25hbGl0eSwKKwkubWFzdGVy X3hmZXIgPSBkcm1fZHBfbXN0X2kyY194ZmVyLAorfTsKKworLyoqCisgKiBkcm1fZHBfbXN0X3Jl Z2lzdGVyX2kyY19idXMoKSAtIHJlZ2lzdGVyIGFuIEkyQyBhZGFwdGVyIGZvciBJMkMtb3Zlci1B VVgKKyAqIEBhdXg6IERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCisgKgorICogUmV0dXJucyAwIG9u IHN1Y2Nlc3Mgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRp YyBpbnQgZHJtX2RwX21zdF9yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgp Cit7CisJYXV4LT5kZGMuYWxnbyA9ICZkcm1fZHBfbXN0X2kyY19hbGdvOworCWF1eC0+ZGRjLmFs Z29fZGF0YSA9IGF1eDsKKwlhdXgtPmRkYy5yZXRyaWVzID0gMzsKKworCWF1eC0+ZGRjLmNsYXNz ID0gSTJDX0NMQVNTX0REQzsKKwlhdXgtPmRkYy5vd25lciA9IFRISVNfTU9EVUxFOworCWF1eC0+ ZGRjLmRldi5wYXJlbnQgPSBhdXgtPmRldjsKKwlhdXgtPmRkYy5kZXYub2Zfbm9kZSA9IGF1eC0+ ZGV2LT5vZl9ub2RlOworCisJc3RybGNweShhdXgtPmRkYy5uYW1lLCBhdXgtPm5hbWUgPyBhdXgt Pm5hbWUgOiBkZXZfbmFtZShhdXgtPmRldiksCisJCXNpemVvZihhdXgtPmRkYy5uYW1lKSk7CisK KwlyZXR1cm4gaTJjX2FkZF9hZGFwdGVyKCZhdXgtPmRkYyk7Cit9CisKKy8qKgorICogZHJtX2Rw X21zdF91bnJlZ2lzdGVyX2kyY19idXMoKSAtIHVucmVnaXN0ZXIgYW4gSTJDLW92ZXItQVVYIGFk YXB0ZXIKKyAqIEBhdXg6IERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCisgKi8KK3N0YXRpYyB2b2lk IGRybV9kcF9tc3RfdW5yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCit7 CisJaTJjX2RlbF9hZGFwdGVyKCZhdXgtPmRkYyk7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2Ry bS9kcm1fZHBfbXN0X2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaApu ZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQ0NmFkCi0tLSAvZGV2L251bGwK KysrIGIvaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaApAQCAtMCwwICsxLDUwOSBAQAor LyoKKyAqIENvcHlyaWdodCDCqSAyMDE0IFJlZCBIYXQuCisgKgorICogUGVybWlzc2lvbiB0byB1 c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQg aXRzCisgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3 aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2Ug YXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorICogbm90 aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3Vt ZW50YXRpb24sIGFuZAorICogdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMg bm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRv IGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0 ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJl c2VudGF0aW9ucworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9y IGFueSBwdXJwb3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNz IG9yIGltcGxpZWQgd2FycmFudHkuCisgKgorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NM QUlNIEFMTCBXQVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNM VURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5F U1MsIElOIE5PCisgKiBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxF IEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBP UiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICog REFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElH RU5DRSBPUiBPVEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FS RS4KKyAqLworI2lmbmRlZiBfRFJNX0RQX01TVF9IRUxQRVJfSF8KKyNkZWZpbmUgX0RSTV9EUF9N U1RfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGRybS9k cm1fZHBfaGVscGVyLmg+CisKK3N0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaDsKKworLyoqCisgKiBz dHJ1Y3QgZHJtX2RwX3ZjcGkgLSBWaXJ0dWFsIENoYW5uZWwgUGF5bG9hZCBJZGVudGlmZXIKKyAq IEB2Y3BpOiBWaXJ0dWFsIGNoYW5uZWwgSUQuCisgKiBAcGJuOiBQYXlsb2FkIEJhbmR3aWR0aCBO dW1iZXIgZm9yIHRoaXMgY2hhbm5lbAorICogQGFsaWduZWRfcGJuOiBQQk4gYWxpZ25lZCB3aXRo IHNsb3Qgc2l6ZQorICogQG51bV9zbG90czogbnVtYmVyIG9mIHNsb3RzIGZvciB0aGlzIFBCTgor ICovCitzdHJ1Y3QgZHJtX2RwX3ZjcGkgeworCWludCB2Y3BpOworCWludCBwYm47CisJaW50IGFs aWduZWRfcGJuOworCWludCBudW1fc2xvdHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fZHBf bXN0X3BvcnQgLSBNU1QgcG9ydAorICogQGtyZWY6IHJlZmVyZW5jZSBjb3VudCBmb3IgdGhpcyBw b3J0LgorICogQGd1aWRfdmFsaWQ6IGZvciBEUCAxLjIgZGV2aWNlcyBpZiB3ZSBoYXZlIHZhbGlk YXRlZCB0aGUgR1VJRC4KKyAqIEBndWlkOiBndWlkIGZvciBEUCAxLjIgZGV2aWNlIG9uIHRoaXMg cG9ydC4KKyAqIEBwb3J0X251bTogcG9ydCBudW1iZXIKKyAqIEBpbnB1dDogaWYgdGhpcyBwb3J0 IGlzIGFuIGlucHV0IHBvcnQuCisgKiBAbWNzOiBtZXNzYWdlIGNhcGFiaWxpdHkgc3RhdHVzIC0g RFAgMS4yIHNwZWMuCisgKiBAZGRwczogRGlzcGxheVBvcnQgRGV2aWNlIFBsdWcgU3RhdHVzIC0g RFAgMS4yCisgKiBAcGR0OiBQZWVyIERldmljZSBUeXBlCisgKiBAbGRwczogTGVnYWN5IERldmlj ZSBQbHVnIFN0YXR1cworICogQGRwY2RfcmV2OiBEUENEIHJldmlzaW9uIG9mIGRldmljZSBvbiB0 aGlzIHBvcnQKKyAqIEBudW1fc2RwX3N0cmVhbXM6IE51bWJlciBvZiBzaW11bHRhbmVvdXMgc3Ry ZWFtcworICogQG51bV9zZHBfc3RyZWFtX3NpbmtzOiBOdW1iZXIgb2Ygc3RyZWFtIHNpbmtzCisg KiBAYXZhaWxhYmxlX3BibjogQXZhaWxhYmxlIGJhbmR3aWR0aCBmb3IgdGhpcyBwb3J0LgorICog QG5leHQ6IGxpbmsgdG8gbmV4dCBwb3J0IG9uIHRoaXMgYnJhbmNoIGRldmljZQorICogQG1zdGI6 IGJyYW5jaCBkZXZpY2UgYXR0YWNoIGJlbG93IHRoaXMgcG9ydAorICogQGF1eDogaTJjIGF1eCB0 cmFuc3BvcnQgdG8gdGFsayB0byBkZXZpY2UgY29ubmVjdGVkIHRvIHRoaXMgcG9ydC4KKyAqIEBw YXJlbnQ6IGJyYW5jaCBkZXZpY2UgcGFyZW50IG9mIHRoaXMgcG9ydAorICogQHZjcGk6IFZpcnR1 YWwgQ2hhbm5lbCBQYXlsb2FkIGluZm8gZm9yIHRoaXMgcG9ydC4KKyAqIEBjb25uZWN0b3I6IERS TSBjb25uZWN0b3IgdGhpcyBwb3J0IGlzIGNvbm5lY3RlZCB0by4KKyAqIEBtZ3I6IHRvcG9sb2d5 IG1hbmFnZXIgdGhpcyBwb3J0IGxpdmVzIHVuZGVyLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIHJl cHJlc2VudHMgYW4gTVNUIHBvcnQgZW5kcG9pbnQgb24gYSBkZXZpY2Ugc29tZXdoZXJlCisgKiBp biB0aGUgTVNUIHRvcG9sb2d5LgorICovCitzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0IHsKKwlzdHJ1 Y3Qga3JlZiBrcmVmOworCisJLyogaWYgZHBjZCAxLjIgZGV2aWNlIGlzIG9uIHRoaXMgcG9ydCAt IGl0cyBHVUlEIGluZm8gKi8KKwlib29sIGd1aWRfdmFsaWQ7CisJdTggZ3VpZFsxNl07CisKKwl1 OCBwb3J0X251bTsKKwlib29sIGlucHV0OworCWJvb2wgbWNzOworCWJvb2wgZGRwczsKKwl1OCBw ZHQ7CisJYm9vbCBsZHBzOworCXU4IGRwY2RfcmV2OworCXU4IG51bV9zZHBfc3RyZWFtczsKKwl1 OCBudW1fc2RwX3N0cmVhbV9zaW5rczsKKwl1aW50MTZfdCBhdmFpbGFibGVfcGJuOworCXN0cnVj dCBsaXN0X2hlYWQgbmV4dDsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7IC8qIHBv aW50ZXIgdG8gYW4gbXN0YiBpZiB0aGlzIHBvcnQgaGFzIG9uZSAqLworCXN0cnVjdCBkcm1fZHBf YXV4IGF1eDsgLyogaTJjIGJ1cyBmb3IgdGhpcyBwb3J0PyAqLworCXN0cnVjdCBkcm1fZHBfbXN0 X2JyYW5jaCAqcGFyZW50OworCisJc3RydWN0IGRybV9kcF92Y3BpIHZjcGk7CisJc3RydWN0IGRy bV9jb25uZWN0b3IgKmNvbm5lY3RvcjsKKwlzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3Ig Km1ncjsKK307CisKKy8qKgorICogc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoIC0gTVNUIGJyYW5j aCBkZXZpY2UuCisgKiBAa3JlZjogcmVmZXJlbmNlIGNvdW50IGZvciB0aGlzIHBvcnQuCisgKiBA cmFkOiBSZWxhdGl2ZSBBZGRyZXNzIHRvIHRhbGsgdG8gdGhpcyBicmFuY2ggZGV2aWNlLgorICog QGxjdDogTGluayBjb3VudCB0b3RhbCB0byB0YWxrIHRvIHRoaXMgYnJhbmNoIGRldmljZS4KKyAq IEBudW1fcG9ydHM6IG51bWJlciBvZiBwb3J0cyBvbiB0aGUgYnJhbmNoLgorICogQG1zZ19zbG90 czogb25lIGJpdCBwZXIgdHJhbnNtaXR0ZWQgbXNnIHNsb3QuCisgKiBAcG9ydHM6IGxpbmtlZCBs aXN0IG9mIHBvcnRzIG9uIHRoaXMgYnJhbmNoLgorICogQHBvcnRfcGFyZW50OiBwb2ludGVyIHRv IHRoZSBwb3J0IHBhcmVudCwgTlVMTCBpZiB0b3BsZXZlbC4KKyAqIEBtZ3I6IHRvcG9sb2d5IG1h bmFnZXIgZm9yIHRoaXMgYnJhbmNoIGRldmljZS4KKyAqIEB0eF9zbG90czogdHJhbnNtaXNzaW9u IHNsb3RzIGZvciB0aGlzIGRldmljZS4KKyAqIEBsYXN0X3NlcW5vOiBsYXN0IHNlcXVlbmNlIG51 bWJlciB1c2VkIHRvIHRhbGsgdG8gdGhpcy4KKyAqIEBsaW5rX2FkZHJlc3Nfc2VudDogaWYgYSBs aW5rIGFkZHJlc3MgbWVzc2FnZSBoYXMgYmVlbiBzZW50IHRvIHRoaXMgZGV2aWNlIHlldC4KKyAq CisgKiBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGFuIE1TVCBicmFuY2ggZGV2aWNlLCB0aGVy ZSBpcyBvbmUKKyAqIHByaW1hcnkgYnJhbmNoIGRldmljZSBhdCB0aGUgcm9vdCwgYWxvbmcgd2l0 aCBhbnkgb3RoZXJzIGNvbm5lY3RlZAorICogdG8gZG93bnN0cmVhbSBwb3J0cworICovCitzdHJ1 Y3QgZHJtX2RwX21zdF9icmFuY2ggeworCXN0cnVjdCBrcmVmIGtyZWY7CisJdTggcmFkWzhdOwor CXU4IGxjdDsKKwlpbnQgbnVtX3BvcnRzOworCisJaW50IG1zZ19zbG90czsKKwlzdHJ1Y3QgbGlz dF9oZWFkIHBvcnRzOworCisJLyogbGlzdCBvZiB0eCBvcHMgcXVldWUgZm9yIHRoaXMgcG9ydCAq LworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnRfcGFyZW50OworCXN0cnVjdCBkcm1fZHBf bXN0X3RvcG9sb2d5X21nciAqbWdyOworCisJLyogc2xvdHMgYXJlIHByb3RlY3RlZCBieSBtc3Ri LT5tZ3ItPnFsb2NrICovCisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4X3Nsb3Rz WzJdOworCWludCBsYXN0X3NlcW5vOworCWJvb2wgbGlua19hZGRyZXNzX3NlbnQ7Cit9OworCisK Ky8qIHNpZGViYW5kIG1zZyBoZWFkZXIgLSBub3QgYml0IHN0cnVjdCAqLworc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfaGRyIHsKKwl1OCBsY3Q7CisJdTggbGNyOworCXU4IHJhZFs4XTsKKwli b29sIGJyb2FkY2FzdDsKKwlib29sIHBhdGhfbXNnOworCXU4IG1zZ19sZW47CisJYm9vbCBzb210 OworCWJvb2wgZW9tdDsKKwlib29sIHNlcW5vOworfTsKKworc3RydWN0IGRybV9kcF9uYWtfcmVw bHkgeworCXU4IGd1aWRbMTZdOworCXU4IHJlYXNvbjsKKwl1OCBuYWtfZGF0YTsKK307CisKK3N0 cnVjdCBkcm1fZHBfbGlua19hZGRyZXNzX2Fja19yZXBseSB7CisJdTggZ3VpZFsxNl07CisJdTgg bnBvcnRzOworCXN0cnVjdCBkcm1fZHBfbGlua19hZGRyX3JlcGx5X3BvcnQgeworCQlib29sIGlu cHV0X3BvcnQ7CisJCXU4IHBlZXJfZGV2aWNlX3R5cGU7CisJCXU4IHBvcnRfbnVtYmVyOworCQli b29sIG1jczsKKwkJYm9vbCBkZHBzOworCQlib29sIGxlZ2FjeV9kZXZpY2VfcGx1Z19zdGF0dXM7 CisJCXU4IGRwY2RfcmV2aXNpb247CisJCXU4IHBlZXJfZ3VpZFsxNl07CisJCXU4IG51bV9zZHBf c3RyZWFtczsKKwkJdTggbnVtX3NkcF9zdHJlYW1fc2lua3M7CisJfSBwb3J0c1sxNl07Cit9Owor CitzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNkX3JlYWRfYWNrX3JlcGx5IHsKKwl1OCBwb3J0X251 bWJlcjsKKwl1OCBudW1fYnl0ZXM7CisJdTggYnl0ZXNbMjU1XTsKK307CisKK3N0cnVjdCBkcm1f ZHBfcmVtb3RlX2RwY2Rfd3JpdGVfYWNrX3JlcGx5IHsKKwl1OCBwb3J0X251bWJlcjsKK307CisK K3N0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2Rfd3JpdGVfbmFrX3JlcGx5IHsKKwl1OCBwb3J0X251 bWJlcjsKKwl1OCByZWFzb247CisJdTggYnl0ZXNfd3JpdHRlbl9iZWZvcmVfZmFpbHVyZTsKK307 CisKK3N0cnVjdCBkcm1fZHBfcmVtb3RlX2kyY19yZWFkX2Fja19yZXBseSB7CisJdTggcG9ydF9u dW1iZXI7CisJdTggbnVtX2J5dGVzOworCXU4IGJ5dGVzWzI1NV07Cit9OworCitzdHJ1Y3QgZHJt X2RwX3JlbW90ZV9pMmNfcmVhZF9uYWtfcmVwbHkgeworCXU4IHBvcnRfbnVtYmVyOworCXU4IG5h a19yZWFzb247CisJdTggaTJjX25ha190cmFuc2FjdGlvbjsKK307CisKK3N0cnVjdCBkcm1fZHBf cmVtb3RlX2kyY193cml0ZV9hY2tfcmVwbHkgeworCXU4IHBvcnRfbnVtYmVyOworfTsKKworCitz dHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCB7CisJdTggY2h1bmtbNDhdOworCXU4IG1zZ1sy NTZdOworCXU4IGN1cmNodW5rX2xlbjsKKwl1OCBjdXJjaHVua19pZHg7IC8qIGNodW5rIHdlIGFy ZSBwYXJzaW5nIG5vdyAqLworCXU4IGN1cmNodW5rX2hkcmxlbjsKKwl1OCBjdXJsZW47IC8qIHRv dGFsIGxlbmd0aCBvZiB0aGUgbXNnICovCisJYm9vbCBoYXZlX3NvbXQ7CisJYm9vbCBoYXZlX2Vv bXQ7CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyIGluaXRpYWxfaGRyOworfTsKKwor CitzdHJ1Y3QgZHJtX2RwX2FsbG9jYXRlX3BheWxvYWQgeworCXU4IHBvcnRfbnVtYmVyOworCXU4 IG51bWJlcl9zZHBfc3RyZWFtczsKKwl1OCB2Y3BpOworCXUxNiBwYm47CisJdTggc2RwX3N0cmVh bV9zaW5rWzhdOworfTsKKworc3RydWN0IGRybV9kcF9hbGxvY2F0ZV9wYXlsb2FkX2Fja19yZXBs eSB7CisJdTggcG9ydF9udW1iZXI7CisJdTggdmNwaTsKKwl1MTYgYWxsb2NhdGVkX3BibjsKK307 CisKK3N0cnVjdCBkcm1fZHBfY29ubmVjdGlvbl9zdGF0dXNfbm90aWZ5IHsKKwl1OCBndWlkWzE2 XTsKKwl1OCBwb3J0X251bWJlcjsKKwlib29sIGxlZ2FjeV9kZXZpY2VfcGx1Z19zdGF0dXM7CisJ Ym9vbCBkaXNwbGF5cG9ydF9kZXZpY2VfcGx1Z19zdGF0dXM7CisJYm9vbCBtZXNzYWdlX2NhcGFi aWxpdHlfc3RhdHVzOworCWJvb2wgaW5wdXRfcG9ydDsKKwl1OCBwZWVyX2RldmljZV90eXBlOwor fTsKKworc3RydWN0IGRybV9kcF9yZW1vdGVfZHBjZF9yZWFkIHsKKwl1OCBwb3J0X251bWJlcjsK Kwl1MzIgZHBjZF9hZGRyZXNzOworCXU4IG51bV9ieXRlczsKK307CisKK3N0cnVjdCBkcm1fZHBf cmVtb3RlX2RwY2Rfd3JpdGUgeworCXU4IHBvcnRfbnVtYmVyOworCXUzMiBkcGNkX2FkZHJlc3M7 CisJdTggbnVtX2J5dGVzOworCXU4ICpieXRlczsKK307CisKK3N0cnVjdCBkcm1fZHBfcmVtb3Rl X2kyY19yZWFkIHsKKwl1OCBudW1fdHJhbnNhY3Rpb25zOworCXU4IHBvcnRfbnVtYmVyOworCXN0 cnVjdCB7CisJCXU4IGkyY19kZXZfaWQ7CisJCXU4IG51bV9ieXRlczsKKwkJdTggKmJ5dGVzOwor CQl1OCBub19zdG9wX2JpdDsKKwkJdTggaTJjX3RyYW5zYWN0aW9uX2RlbGF5OworCX0gdHJhbnNh Y3Rpb25zWzRdOworCXU4IHJlYWRfaTJjX2RldmljZV9pZDsKKwl1OCBudW1fYnl0ZXNfcmVhZDsK K307CisKK3N0cnVjdCBkcm1fZHBfcmVtb3RlX2kyY193cml0ZSB7CisJdTggcG9ydF9udW1iZXI7 CisJdTggd3JpdGVfaTJjX2RldmljZV9pZDsKKwl1OCBudW1fYnl0ZXM7CisJdTggKmJ5dGVzOwor fTsKKworLyogdGhpcyBjb3ZlcnMgRU5VTV9SRVNPVVJDRVMsIFBPV0VSX0RPV05fUEhZLCBQT1dF Ul9VUF9QSFkgKi8KK3N0cnVjdCBkcm1fZHBfcG9ydF9udW1iZXJfcmVxIHsKKwl1OCBwb3J0X251 bWJlcjsKK307CisKK3N0cnVjdCBkcm1fZHBfZW51bV9wYXRoX3Jlc291cmNlc19hY2tfcmVwbHkg eworCXU4IHBvcnRfbnVtYmVyOworCXUxNiBmdWxsX3BheWxvYWRfYndfbnVtYmVyOworCXUxNiBh dmFpbF9wYXlsb2FkX2J3X251bWJlcjsKK307CisKKy8qIGNvdmVycyBQT1dFUl9ET1dOX1BIWSwg UE9XRVJfVVBfUEhZICovCitzdHJ1Y3QgZHJtX2RwX3BvcnRfbnVtYmVyX3JlcCB7CisJdTggcG9y dF9udW1iZXI7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3F1ZXJ5X3BheWxvYWQgeworCXU4IHBvcnRf bnVtYmVyOworCXU4IHZjcGk7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3Jlc291cmNlX3N0YXR1c19u b3RpZnkgeworCXU4IHBvcnRfbnVtYmVyOworCXU4IGd1aWRbMTZdOworCXUxNiBhdmFpbGFibGVf cGJuOworfTsKKworc3RydWN0IGRybV9kcF9xdWVyeV9wYXlsb2FkX2Fja19yZXBseSB7CisJdTgg cG9ydF9udW1iZXI7CisJdTggYWxsb2NhdGVkX3BibjsKK307CisKK3N0cnVjdCBkcm1fZHBfc2lk ZWJhbmRfbXNnX3JlcV9ib2R5IHsKKwl1OCByZXFfdHlwZTsKKwl1bmlvbiBhY2tfcmVxIHsKKwkJ c3RydWN0IGRybV9kcF9jb25uZWN0aW9uX3N0YXR1c19ub3RpZnkgY29ubl9zdGF0OworCQlzdHJ1 Y3QgZHJtX2RwX3BvcnRfbnVtYmVyX3JlcSBwb3J0X251bTsKKwkJc3RydWN0IGRybV9kcF9yZXNv dXJjZV9zdGF0dXNfbm90aWZ5IHJlc291cmNlX3N0YXQ7CisKKwkJc3RydWN0IGRybV9kcF9xdWVy eV9wYXlsb2FkIHF1ZXJ5X3BheWxvYWQ7CisJCXN0cnVjdCBkcm1fZHBfYWxsb2NhdGVfcGF5bG9h ZCBhbGxvY2F0ZV9wYXlsb2FkOworCisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2RfcmVhZCBk cGNkX3JlYWQ7CisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2Rfd3JpdGUgZHBjZF93cml0ZTsK KworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfcmVhZCBpMmNfcmVhZDsKKwkJc3RydWN0IGRy bV9kcF9yZW1vdGVfaTJjX3dyaXRlIGkyY193cml0ZTsKKwl9IHU7Cit9OworCitzdHJ1Y3QgZHJt X2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5IHsKKwl1OCByZXBseV90eXBlOworCXU4IHJlcV90 eXBlOworCXVuaW9uIGFja19yZXBsaWVzIHsKKwkJc3RydWN0IGRybV9kcF9uYWtfcmVwbHkgbmFr OworCQlzdHJ1Y3QgZHJtX2RwX2xpbmtfYWRkcmVzc19hY2tfcmVwbHkgbGlua19hZGRyOworCQlz dHJ1Y3QgZHJtX2RwX3BvcnRfbnVtYmVyX3JlcCBwb3J0X251bWJlcjsKKworCQlzdHJ1Y3QgZHJt X2RwX2VudW1fcGF0aF9yZXNvdXJjZXNfYWNrX3JlcGx5IHBhdGhfcmVzb3VyY2VzOworCQlzdHJ1 Y3QgZHJtX2RwX2FsbG9jYXRlX3BheWxvYWRfYWNrX3JlcGx5IGFsbG9jYXRlX3BheWxvYWQ7CisJ CXN0cnVjdCBkcm1fZHBfcXVlcnlfcGF5bG9hZF9hY2tfcmVwbHkgcXVlcnlfcGF5bG9hZDsKKwor CQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNkX3JlYWRfYWNrX3JlcGx5IHJlbW90ZV9kcGNkX3Jl YWRfYWNrOworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNkX3dyaXRlX2Fja19yZXBseSByZW1v dGVfZHBjZF93cml0ZV9hY2s7CisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2Rfd3JpdGVfbmFr X3JlcGx5IHJlbW90ZV9kcGNkX3dyaXRlX25hY2s7CisKKwkJc3RydWN0IGRybV9kcF9yZW1vdGVf aTJjX3JlYWRfYWNrX3JlcGx5IHJlbW90ZV9pMmNfcmVhZF9hY2s7CisJCXN0cnVjdCBkcm1fZHBf cmVtb3RlX2kyY19yZWFkX25ha19yZXBseSByZW1vdGVfaTJjX3JlYWRfbmFjazsKKwkJc3RydWN0 IGRybV9kcF9yZW1vdGVfaTJjX3dyaXRlX2Fja19yZXBseSByZW1vdGVfaTJjX3dyaXRlX2FjazsK Kwl9IHU7Cit9OworCisvKiBtc2cgaXMgcXVldWVkIHRvIGJlIHB1dCBpbnRvIGEgc2xvdCAqLwor I2RlZmluZSBEUk1fRFBfU0lERUJBTkRfVFhfUVVFVUVEIDAKKy8qIG1zZyBoYXMgc3RhcnRlZCB0 cmFuc21pdHRpbmcgb24gYSBzbG90IC0gc3RpbGwgb24gbXNncSAqLworI2RlZmluZSBEUk1fRFBf U0lERUJBTkRfVFhfU1RBUlRfU0VORCAxCisvKiBtc2cgaGFzIGZpbmlzaGVkIHRyYW5zbWl0dGlu ZyBvbiBhIHNsb3QgLSByZW1vdmVkIGZyb20gbXNncSBvbmx5IGluIHNsb3QgKi8KKyNkZWZpbmUg RFJNX0RQX1NJREVCQU5EX1RYX1NFTlQgMgorLyogbXNnIGhhcyByZWNlaXZlZCBhIHJlc3BvbnNl IC0gcmVtb3ZlZCBmcm9tIHNsb3QgKi8KKyNkZWZpbmUgRFJNX0RQX1NJREVCQU5EX1RYX1JYIDMK KyNkZWZpbmUgRFJNX0RQX1NJREVCQU5EX1RYX1RJTUVPVVQgNAorCitzdHJ1Y3QgZHJtX2RwX3Np ZGViYW5kX21zZ190eCB7CisJdTggbXNnWzI1Nl07CisJdTggY2h1bmtbNDhdOworCXU4IGN1cl9v ZmZzZXQ7CisJdTggY3VyX2xlbjsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKmRzdDsKKwlz dHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CisJaW50IHNlcW5vOworCWludCBzdGF0ZTsKKwlib29sIHBh dGhfbXNnOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgcmVwbHk7Cit9 OworCisvKiBzaWRlYmFuZCBtc2cgaGFuZGxlciAqLworc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyOworc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfY2JzIHsKKwkvKiBjcmVhdGUgYSBj b25uZWN0b3IgZm9yIGEgcG9ydCAqLworCXN0cnVjdCBkcm1fY29ubmVjdG9yICooKmFkZF9jb25u ZWN0b3IpKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2Rw X21zdF9wb3J0ICpwb3J0LCBjaGFyICpwYXRoKTsKKwl2b2lkICgqZGVzdHJveV9jb25uZWN0b3Ip KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgc3RydWN0IGRybV9j b25uZWN0b3IgKmNvbm5lY3Rvcik7CisJdm9pZCAoKmhvdHBsdWcpKHN0cnVjdCBkcm1fZHBfbXN0 X3RvcG9sb2d5X21nciAqbWdyKTsKKworfTsKKworI2RlZmluZSBEUF9NQVhfUEFZTE9BRCAoc2l6 ZW9mKHVuc2lnbmVkIGxvbmcpICogOCkKKworI2RlZmluZSBEUF9QQVlMT0FEX0xPQ0FMIDEKKyNk ZWZpbmUgRFBfUEFZTE9BRF9SRU1PVEUgMgorI2RlZmluZSBEUF9QQVlMT0FEX0RFTEVURV9MT0NB TCAzCisKK3N0cnVjdCBkcm1fZHBfcGF5bG9hZCB7CisJaW50IHBheWxvYWRfc3RhdGU7CisJaW50 IHN0YXJ0X3Nsb3Q7CisJaW50IG51bV9zbG90czsKK307CisKKy8qKgorICogc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyIC0gRGlzcGxheVBvcnQgTVNUIG1hbmFnZXIKKyAqIEBkZXY6IGRl dmljZSBwb2ludGVyIGZvciBhZGRpbmcgaTJjIGRldmljZXMgZXRjLgorICogQGNiczogY2FsbGJh Y2tzIGZvciBjb25uZWN0b3IgYWRkaXRpb24gYW5kIGRlc3RydWN0aW9uLgorICogQG1heF9kcGNk X3RyYW5zYWN0aW9uX2J5dGVzIC0gbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC93cml0 ZSBpbiBvbmUgZ28uCisgKiBAYXV4OiBhdXggY2hhbm5lbCBmb3IgdGhlIERQIGNvbm5lY3Rvci4K KyAqIEBtYXhfcGF5bG9hZHM6IG1heGltdW0gbnVtYmVyIG9mIHBheWxvYWRzIHRoZSBHUFUgY2Fu IGdlbmVyYXRlLgorICogQGNvbm5fYmFzZV9pZDogRFJNIGNvbm5lY3RvciBJRCB0aGlzIG1nciBp cyBjb25uZWN0ZWQgdG8uCisgKiBAZG93bl9yZXBfcmVjdjogbXNnIHJlY2VpdmVyIHN0YXRlIGZv ciBkb3duIHJlcGxpZXMuCisgKiBAdXBfcmVxX3JlY3Y6IG1zZyByZWNlaXZlciBzdGF0ZSBmb3Ig dXAgcmVxdWVzdHMuCisgKiBAbG9jazogcHJvdGVjdHMgbXN0IHN0YXRlLCBwcmltYXJ5LCBndWlk LCBkcGNkLgorICogQG1zdF9zdGF0ZTogaWYgdGhpcyBtYW5hZ2VyIGlzIGVuYWJsZWQgZm9yIGFu IE1TVCBjYXBhYmxlIHBvcnQuCisgKiBAbXN0X3ByaW1hcnk6IHBvaW50ZXIgdG8gdGhlIHByaW1h cnkgYnJhbmNoIGRldmljZS4KKyAqIEBndWlkX3ZhbGlkOiBHVUlEIHZhbGlkIGZvciB0aGUgcHJp bWFyeSBicmFuY2ggZGV2aWNlLgorICogQGd1aWQ6IEdVSUQgZm9yIHByaW1hcnkgcG9ydC4KKyAq IEBkcGNkOiBjYWNoZSBvZiBEUENEIGZvciBwcmltYXJ5IHBvcnQuCisgKiBAcGJuX2RpdjogUEJO IHRvIHNsb3RzIGRpdmlzb3IuCisgKgorICogVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0aGUgdG9w bGV2ZWwgZGlzcGxheXBvcnQgTVNUIHRvcG9sb2d5IG1hbmFnZXIuCisgKiBUaGVyZSBzaG91bGQg YmUgb25lIGluc3RhbmNlIG9mIHRoaXMgZm9yIGV2ZXJ5IE1TVCBjYXBhYmxlIERQIGNvbm5lY3Rv cgorICogb24gdGhlIEdQVS4KKyAqLworc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyIHsK KworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9jYnMg KmNiczsKKwlpbnQgbWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXM7CisJc3RydWN0IGRybV9kcF9h dXggKmF1eDsgLyogYXV4Y2ggZm9yIHRoaXMgdG9wb2xvZ3kgbWdyIHRvIHVzZSAqLworCWludCBt YXhfcGF5bG9hZHM7CisJaW50IGNvbm5fYmFzZV9pZDsKKworCS8qIG9ubHkgZXZlciBhY2Nlc3Nl ZCBmcm9tIHRoZSB3b3JrcXVldWUgLSB3aGljaCBzaG91bGQgYmUgc2VyaWFsaXNlZCAqLworCXN0 cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4IGRvd25fcmVwX3JlY3Y7CisJc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfcnggdXBfcmVxX3JlY3Y7CisKKwkvKiBwb2ludGVyIHRvIGluZm8gYWJv dXQgdGhlIGluaXRpYWwgTVNUIGRldmljZSAqLworCXN0cnVjdCBtdXRleCBsb2NrOyAvKiBwcm90 ZWN0cyBtc3Rfc3RhdGUgKyBwcmltYXJ5ICsgZ3VpZCArIGRwY2QgKi8KKworCWJvb2wgbXN0X3N0 YXRlOworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0X3ByaW1hcnk7CisJLyogcHJpbWFy eSBNU1QgZGV2aWNlIEdVSUQgKi8KKwlib29sIGd1aWRfdmFsaWQ7CisJdTggZ3VpZFsxNl07CisJ dTggZHBjZFtEUF9SRUNFSVZFUl9DQVBfU0laRV07CisJdTggc2lua19jb3VudDsKKwlpbnQgcGJu X2RpdjsKKwlpbnQgdG90YWxfc2xvdHM7CisJaW50IGF2YWlsX3Nsb3RzOworCWludCB0b3RhbF9w Ym47CisKKwkvKiBtZXNzYWdlcyB0byBiZSB0cmFuc21pdHRlZCAqLworCS8qIHFsb2NrIHByb3Rl Y3RzIHRoZSB1cHEvZG93bnEgYW5kIGluX3Byb2dyZXNzLAorCSAgIHRoZSBtc3RiIHR4X3Nsb3Rz IGFuZCB0eG1zZy0+c3RhdGUgb25jZSB0aGV5IGFyZSBxdWV1ZWQgKi8KKwlzdHJ1Y3QgbXV0ZXgg cWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCB0eF9tc2dfZG93bnE7CisJc3RydWN0IGxpc3RfaGVh ZCB0eF9tc2dfdXBxOworCWJvb2wgdHhfZG93bl9pbl9wcm9ncmVzczsKKwlib29sIHR4X3VwX2lu X3Byb2dyZXNzOworCisJLyogcGF5bG9hZCBpbmZvICsgbG9jayBmb3IgaXQgKi8KKwlzdHJ1Y3Qg bXV0ZXggcGF5bG9hZF9sb2NrOworCXN0cnVjdCBkcm1fZHBfdmNwaSAqKnByb3Bvc2VkX3ZjcGlz OworCXN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZHM7CisJdW5zaWduZWQgbG9uZyBwYXls b2FkX21hc2s7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0eF93YWl0cTsKKwlzdHJ1Y3Qgd29ya19z dHJ1Y3Qgd29yazsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOworfTsKKworaW50IGRy bV9kcF9tc3RfdG9wb2xvZ3lfbWdyX2luaXQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdy ICptZ3IsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRybV9kcF9hdXggKmF1eCwgaW50IG1h eF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCBpbnQgbWF4X3BheWxvYWRzLCBpbnQgY29ubl9iYXNl X2lkKTsKKwordm9pZCBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9kZXN0cm95KHN0cnVjdCBkcm1f ZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKTsKKworCitpbnQgZHJtX2RwX21zdF90b3BvbG9neV9t Z3Jfc2V0X21zdChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgYm9vbCBtc3Rf c3RhdGUpOworCisKK2ludCBkcm1fZHBfbXN0X2hwZF9pcnEoc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyICptZ3IsIHU4ICplc2ksIGJvb2wgKmhhbmRsZWQpOworCisKK2VudW0gZHJtX2Nv bm5lY3Rvcl9zdGF0dXMgZHJtX2RwX21zdF9kZXRlY3RfcG9ydChzdHJ1Y3QgZHJtX2RwX21zdF90 b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCk7CisKK3N0cnVj dCBlZGlkICpkcm1fZHBfbXN0X2dldF9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0 b3IsIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21z dF9wb3J0ICpwb3J0KTsKKworCitpbnQgZHJtX2RwX2NhbGNfcGJuX21vZGUoaW50IGNsb2NrLCBp bnQgYnBwKTsKKworCitib29sIGRybV9kcF9tc3RfYWxsb2NhdGVfdmNwaShzdHJ1Y3QgZHJtX2Rw X21zdF90b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwgaW50 IHBibiwgaW50ICpzbG90cyk7CisKKwordm9pZCBkcm1fZHBfbXN0X3Jlc2V0X3ZjcGlfc2xvdHMo c3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3Bv cnQgKnBvcnQpOworCisKK3ZvaWQgZHJtX2RwX21zdF9kZWFsbG9jYXRlX3ZjcGkoc3RydWN0IGRy bV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAq cG9ydCk7CisKKworaW50IGRybV9kcF9maW5kX3ZjcGlfc2xvdHMoc3RydWN0IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyICptZ3IsCisJCQkgICBpbnQgcGJuKTsKKworCitpbnQgZHJtX2RwX3VwZGF0 ZV9wYXlsb2FkX3BhcnQxKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKTsKKwor CitpbnQgZHJtX2RwX3VwZGF0ZV9wYXlsb2FkX3BhcnQyKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9s b2d5X21nciAqbWdyKTsKKworaW50IGRybV9kcF9jaGVja19hY3Rfc3RhdHVzKHN0cnVjdCBkcm1f ZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKTsKKwordm9pZCBkcm1fZHBfbXN0X2R1bXBfdG9wb2xv Z3koc3RydWN0IHNlcV9maWxlICptLAorCQkJICAgICAgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IpOworCit2b2lkIGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3N1c3BlbmQoc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpOworaW50IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyX3Jlc3VtZShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncik7CisjZW5k aWYKLS0gCjEuOS4zCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdm eAo=