From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Airlie Subject: [PATCH 07/11] drm/helper: add Displayport multi-stream helper (v0.5) Date: Wed, 21 May 2014 12:55:00 +1000 Message-ID: <1400640904-16847-8-git-send-email-airlied@gmail.com> References: <1400640904-16847-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: <1400640904-16847-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: dri-devel@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 aW5nIGluIGRlYnVnZnMKClRPRE86Cm1pc2MgZmVhdHVyZXMKClNpZ25lZC1vZmYtYnk6IERhdmUg QWlybGllIDxhaXJsaWVkQHJlZGhhdC5jb20+Ci0tLQogRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2Ry bS50bXBsICAgICAgICB8ICAgIDYgKwogZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlICAgICAgICAg ICAgICB8ICAgIDIgKy0KIGRyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMgfCAy NzM5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogaW5jbHVkZS9kcm0vZHJtX2Rw X21zdF9oZWxwZXIuaCAgICAgICB8ICA1MDcgKysrKysrCiA0IGZpbGVzIGNoYW5nZWQsIDMyNTMg aW5zZXJ0aW9ucygrKSwgMSBkZWxldGlvbigtKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBpbmNsdWRl L2RybS9kcm1fZHBfbXN0X2hlbHBlci5oCgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9Eb2NC b29rL2RybS50bXBsIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL2RybS50bXBsCmluZGV4IDgzZGQw YjAuLjE4ODM5NzYgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9kcm0udG1wbAor KysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svZHJtLnRtcGwKQEAgLTIyOTYsNiArMjI5NiwxMiBA QCB2b2lkIGludGVsX2NydF9pbml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiAhRWRyaXZlcnMv Z3B1L2RybS9kcm1fZHBfaGVscGVyLmMKICAgICA8L3NlY3QyPgogICAgIDxzZWN0Mj4KKyAgICAg IDx0aXRsZT5EaXNwbGF5IFBvcnQgTVNUIEhlbHBlciBGdW5jdGlvbnMgUmVmZXJlbmNlPC90aXRs ZT4KKyFQZHJpdmVycy9ncHUvZHJtL2RybV9kcF9tc3RfdG9wb2xvZ3kuYyBkcCBtc3QgaGVscGVy CishSWluY2x1ZGUvZHJtL2RybV9kcF9tc3RfaGVscGVyLmgKKyFFZHJpdmVycy9ncHUvZHJtL2Ry bV9kcF9tc3RfdG9wb2xvZ3kuYworICAgIDwvc2VjdDI+CisgICAgPHNlY3QyPgogICAgICAgPHRp dGxlPkVESUQgSGVscGVyIEZ1bmN0aW9ucyBSZWZlcmVuY2U8L3RpdGxlPgogIUVkcml2ZXJzL2dw dS9kcm0vZHJtX2VkaWQuYwogICAgIDwvc2VjdDI+CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9k cm0vTWFrZWZpbGUgYi9kcml2ZXJzL2dwdS9kcm0vTWFrZWZpbGUKaW5kZXggNDhlMzhiYS4uNzEy YjczZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL01ha2VmaWxlCisrKyBiL2RyaXZlcnMv Z3B1L2RybS9NYWtlZmlsZQpAQCAtMjMsNyArMjMsNyBAQCBkcm0tJChDT05GSUdfRFJNX1BBTkVM KSArPSBkcm1fcGFuZWwubwogCiBkcm0tdXNiLXkgICA6PSBkcm1fdXNiLm8KIAotZHJtX2ttc19o ZWxwZXIteSA6PSBkcm1fY3J0Y19oZWxwZXIubyBkcm1fZHBfaGVscGVyLm8gZHJtX3Byb2JlX2hl bHBlci5vCitkcm1fa21zX2hlbHBlci15IDo9IGRybV9jcnRjX2hlbHBlci5vIGRybV9kcF9oZWxw ZXIubyBkcm1fcHJvYmVfaGVscGVyLm8gZHJtX2RwX21zdF90b3BvbG9neS5vCiBkcm1fa21zX2hl bHBlci0kKENPTkZJR19EUk1fTE9BRF9FRElEX0ZJUk1XQVJFKSArPSBkcm1fZWRpZF9sb2FkLm8K IGRybV9rbXNfaGVscGVyLSQoQ09ORklHX0RSTV9LTVNfRkJfSEVMUEVSKSArPSBkcm1fZmJfaGVs cGVyLm8KIGRybV9rbXNfaGVscGVyLSQoQ09ORklHX0RSTV9LTVNfQ01BX0hFTFBFUikgKz0gZHJt X2ZiX2NtYV9oZWxwZXIubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2RybV9kcF9tc3Rf dG9wb2xvZ3kuYyBiL2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOTI5MgotLS0gL2Rldi9udWxsCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9kcm1fZHBfbXN0X3RvcG9sb2d5LmMKQEAgLTAsMCArMSwyNzM5IEBA CisvKgorICogQ29weXJpZ2h0IMKpIDIwMTQgUmVkIEhhdAorICoKKyAqIFBlcm1pc3Npb24gdG8g dXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5k IGl0cworICogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQg d2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQKKyAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNl IGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQKKyAqIG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1 bWVudGF0aW9uLCBhbmQKKyAqIHRoYXQgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJz IG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yCisgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0 byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsCisgKiB3cml0 dGVuIHByaW9yIHBlcm1pc3Npb24uICBUaGUgY29weXJpZ2h0IGhvbGRlcnMgbWFrZSBubyByZXBy ZXNlbnRhdGlvbnMKKyAqIGFib3V0IHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZv ciBhbnkgcHVycG9zZS4gIEl0IGlzIHByb3ZpZGVkICJhcworICogaXMiIHdpdGhvdXQgZXhwcmVz cyBvciBpbXBsaWVkIHdhcnJhbnR5LgorICoKKyAqIFRIRSBDT1BZUklHSFQgSE9MREVSUyBESVND TEFJTSBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAorICogSU5D TFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRO RVNTLCBJTiBOTworICogRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJM RSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMg T1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKKyAq IERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJ R0VOQ0UgT1IgT1RIRVIKKyAqIFRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4g Q09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UKKyAqIE9GIFRISVMgU09GVFdB UkUuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2Rl bGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+ CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNs dWRlIDxkcm0vZHJtX2RwX21zdF9oZWxwZXIuaD4KKyNpbmNsdWRlIDxkcm0vZHJtUC5oPgorCisj aW5jbHVkZSA8ZHJtL2RybV9maXhlZC5oPgorCisvKioKKyAqIERPQzogZHAgbXN0IGhlbHBlcgor ICoKKyAqIFRoZXNlIGZ1bmN0aW9ucyBjb250YWluIHBhcnRzIG9mIHRoZSBEaXNwbGF5UG9ydCAx LjJhIE11bHRpU3RyZWFtIFRyYW5zcG9ydAorICogcHJvdG9jb2wuIFRoZSBoZWxwZXJzIGNvbnRh aW4gYSB0b3BvbG9neSBtYW5hZ2VyIGFuZCBiYW5kd2lkdGggbWFuYWdlci4KKyAqIFRoZSBoZWxw ZXJzIGVuY2Fwc3VsYXRlIHRoZSBzZW5kaW5nIGFuZCByZWNlaXZlZCBvZiBzaWRlYmFuZCBtc2dz LgorICovCitzdGF0aWMgYm9vbCBkdW1wX2RwX3BheWxvYWRfdGFibGUoc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICBjaGFyICpidWYpOworc3RhdGljIGludCB0ZXN0 X2NhbGNfcGJuX21vZGUodm9pZCk7CisKK3N0YXRpYyB2b2lkIGRybV9kcF9wdXRfcG9ydChzdHJ1 Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KTsKKworc3RhdGljIGludCBkcm1fZHBfZHBjZF93cml0 ZV9wYXlsb2FkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgICAg aW50IGlkLAorCQkJCSAgICAgc3RydWN0IGRybV9kcF9wYXlsb2FkICpwYXlsb2FkKTsKKworc3Rh dGljIGludCBkcm1fZHBfc2VuZF9kcGNkX3dyaXRlKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5 X21nciAqbWdyLAorCQkJCSAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgIGlu dCBvZmZzZXQsIGludCBzaXplLCB1OCAqYnl0ZXMpOworCitzdGF0aWMgaW50IGRybV9kcF9zZW5k X2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkg ICAgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiKTsKK3N0YXRpYyBpbnQgZHJtX2RwX3Nl bmRfZW51bV9wYXRoX3Jlc291cmNlcyhzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1n ciwKKwkJCQkJICAgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiLAorCQkJCQkgICBzdHJ1 Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KTsKK3N0YXRpYyBib29sIGRybV9kcF92YWxpZGF0ZV9n dWlkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSB1OCAqZ3VpZCk7 CisKK3N0YXRpYyBpbnQgZHJtX2RwX21zdF9yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBf YXV4ICphdXgpOworc3RhdGljIHZvaWQgZHJtX2RwX21zdF91bnJlZ2lzdGVyX2kyY19idXMoc3Ry dWN0IGRybV9kcF9hdXggKmF1eCk7CitzdGF0aWMgdm9pZCBkcm1fZHBfbXN0X2tpY2tfdHgoc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpOworLyogc2lkZWJhbmQgbXNnIGhhbmRs aW5nICovCitzdGF0aWMgdTggZHJtX2RwX21zZ19oZWFkZXJfY3JjNChjb25zdCB1aW50OF90ICpk YXRhLCBzaXplX3QgbnVtX25pYmJsZXMpCit7CisJdTggYml0bWFzayA9IDB4ODA7CisJdTggYml0 c2hpZnQgPSA3OworCXU4IGFycmF5X2luZGV4ID0gMDsKKwlpbnQgbnVtYmVyX29mX2JpdHMgPSBu dW1fbmliYmxlcyAqIDQ7CisJdTggcmVtYWluZGVyID0gMDsKKworCXdoaWxlIChudW1iZXJfb2Zf Yml0cyAhPSAwKSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8PD0gMTsKKwkJ cmVtYWluZGVyIHw9IChkYXRhW2FycmF5X2luZGV4XSAmIGJpdG1hc2spID4+IGJpdHNoaWZ0Owor CQliaXRtYXNrID4+PSAxOworCQliaXRzaGlmdC0tOworCQlpZiAoYml0bWFzayA9PSAwKSB7CisJ CQliaXRtYXNrID0gMHg4MDsKKwkJCWJpdHNoaWZ0ID0gNzsKKwkJCWFycmF5X2luZGV4Kys7CisJ CX0KKwkJaWYgKChyZW1haW5kZXIgJiAweDEwKSA9PSAweDEwKQorCQkJcmVtYWluZGVyIF49IDB4 MTM7CisJfQorCisJbnVtYmVyX29mX2JpdHMgPSA0OworCXdoaWxlIChudW1iZXJfb2ZfYml0cyAh PSAwKSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRlciA8PD0gMTsKKwkJaWYgKChy ZW1haW5kZXIgJiAweDEwKSAhPSAwKQorCQkJcmVtYWluZGVyIF49IDB4MTM7CisJfQorCisJcmV0 dXJuIHJlbWFpbmRlcjsKK30KKworc3RhdGljIHU4IGRybV9kcF9tc2dfZGF0YV9jcmM0KGNvbnN0 IHVpbnQ4X3QgKmRhdGEsIHU4IG51bWJlcl9vZl9ieXRlcykKK3sKKwl1OCBiaXRtYXNrID0gMHg4 MDsKKwl1OCBiaXRzaGlmdCA9IDc7CisJdTggYXJyYXlfaW5kZXggPSAwOworCWludCBudW1iZXJf b2ZfYml0cyA9IG51bWJlcl9vZl9ieXRlcyAqIDg7CisJdTE2IHJlbWFpbmRlciA9IDA7CisKKwl3 aGlsZSAobnVtYmVyX29mX2JpdHMgIT0gMCkgeworCQludW1iZXJfb2ZfYml0cy0tOworCQlyZW1h aW5kZXIgPDw9IDE7CisJCXJlbWFpbmRlciB8PSAoZGF0YVthcnJheV9pbmRleF0gJiBiaXRtYXNr KSA+PiBiaXRzaGlmdDsKKwkJYml0bWFzayA+Pj0gMTsKKwkJYml0c2hpZnQtLTsKKwkJaWYgKGJp dG1hc2sgPT0gMCkgeworCQkJYml0bWFzayA9IDB4ODA7CisJCQliaXRzaGlmdCA9IDc7CisJCQlh cnJheV9pbmRleCsrOworCQl9CisJCWlmICgocmVtYWluZGVyICYgMHgxMDApID09IDB4MTAwKQor CQkJcmVtYWluZGVyIF49IDB4ZDU7CisJfQorCisJbnVtYmVyX29mX2JpdHMgPSA4OworCXdoaWxl IChudW1iZXJfb2ZfYml0cyAhPSAwKSB7CisJCW51bWJlcl9vZl9iaXRzLS07CisJCXJlbWFpbmRl ciA8PD0gMTsKKwkJaWYgKChyZW1haW5kZXIgJiAweDEwMCkgIT0gMCkKKwkJCXJlbWFpbmRlciBe PSAweGQ1OworCX0KKworCXJldHVybiByZW1haW5kZXIgJiAweGZmOworfQorc3RhdGljIGlubGlu ZSB1OCBkcm1fZHBfY2FsY19zYl9oZHJfc2l6ZShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19o ZHIgKmhkcikKK3sKKwl1OCBzaXplID0gMzsKKwlzaXplICs9IChoZHItPmxjdCAvIDIpOworCXJl dHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX21zZ19o ZHIoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyICpoZHIsCisJCQkJCSAgIHU4ICpidWYs IGludCAqbGVuKQoreworCWludCBpZHggPSAwOworCWludCBpOworCXU4IGNyYzQ7CisJYnVmW2lk eCsrXSA9ICgoaGRyLT5sY3QgJiAweGYpIDw8IDQpIHwgKGhkci0+bGNyICYgMHhmKTsKKwlmb3Ig KGkgPSAwOyBpIDwgKGhkci0+bGN0IC8gMik7IGkrKykKKwkJYnVmW2lkeCsrXSA9IGhkci0+cmFk W2ldOworCWJ1ZltpZHgrK10gPSAoaGRyLT5icm9hZGNhc3QgPDwgNykgfCAoaGRyLT5wYXRoX21z ZyA8PCA2KSB8CisJCShoZHItPm1zZ19sZW4gJiAweDNmKTsKKwlidWZbaWR4KytdID0gKGhkci0+ c29tdCA8PCA3KSB8IChoZHItPmVvbXQgPDwgNikgfCAoaGRyLT5zZXFubyA8PCA0KTsKKworCWNy YzQgPSBkcm1fZHBfbXNnX2hlYWRlcl9jcmM0KGJ1ZiwgKGlkeCAqIDIpIC0gMSk7CisJYnVmW2lk eCAtIDFdIHw9IChjcmM0ICYgMHhmKTsKKworCSpsZW4gPSBpZHg7Cit9CisKK3N0YXRpYyBib29s IGRybV9kcF9kZWNvZGVfc2lkZWJhbmRfbXNnX2hkcihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21z Z19oZHIgKmhkciwKKwkJCQkJICAgdTggKmJ1ZiwgaW50IGJ1ZmxlbiwgdTggKmhkcmxlbikKK3sK Kwl1OCBjcmM0OworCXU4IGxlbjsKKwlpbnQgaTsKKwl1OCBpZHg7CisJaWYgKGJ1ZlswXSA9PSAw KQorCQlyZXR1cm4gZmFsc2U7CisJbGVuID0gMzsKKwlsZW4gKz0gKChidWZbMF0gJiAweGYwKSA+ PiA0KSAvIDI7CisJaWYgKGxlbiA+IGJ1ZmxlbikKKwkJcmV0dXJuIGZhbHNlOworCWNyYzQgPSBk cm1fZHBfbXNnX2hlYWRlcl9jcmM0KGJ1ZiwgKGxlbiAqIDIpIC0gMSk7CisKKwlpZiAoKGNyYzQg JiAweGYpICE9IChidWZbbGVuIC0gMV0gJiAweGYpKSB7CisJCURSTV9ERUJVR19LTVMoImNyYzQg bWlzbWF0Y2ggMHgleCAweCV4XG4iLCBjcmM0LCBidWZbbGVuIC0gMV0pOworCQlyZXR1cm4gZmFs c2U7CisJfQorCisJaGRyLT5sY3QgPSAoYnVmWzBdICYgMHhmMCkgPj4gNDsKKwloZHItPmxjciA9 IChidWZbMF0gJiAweGYpOworCWlkeCA9IDE7CisJZm9yIChpID0gMDsgaSA8IChoZHItPmxjdCAv IDIpOyBpKyspCisJCWhkci0+cmFkW2ldID0gYnVmW2lkeCsrXTsKKwloZHItPmJyb2FkY2FzdCA9 IChidWZbaWR4XSA+PiA3KSAmIDB4MTsKKwloZHItPnBhdGhfbXNnID0gKGJ1ZltpZHhdID4+IDYp ICYgMHgxOworCWhkci0+bXNnX2xlbiA9IGJ1ZltpZHhdICYgMHgzZjsKKwlpZHgrKzsKKwloZHIt PnNvbXQgPSAoYnVmW2lkeF0gPj4gNykgJiAweDE7CisJaGRyLT5lb210ID0gKGJ1ZltpZHhdID4+ IDYpICYgMHgxOworCWhkci0+c2Vxbm8gPSAoYnVmW2lkeF0gPj4gNCkgJiAweDE7CisJaWR4Kys7 CisJKmhkcmxlbiA9IGlkeDsKKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgZHJtX2Rw X2VuY29kZV9zaWRlYmFuZF9yZXEoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkg KnJlcSwKKwkJCQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnJhdykKK3sK KwlpbnQgaWR4ID0gMDsKKwlpbnQgaTsKKwl1OCAqYnVmID0gcmF3LT5tc2c7CisJYnVmW2lkeCsr XSA9IHJlcS0+cmVxX3R5cGUgJiAweDdmOworCisJc3dpdGNoIChyZXEtPnJlcV90eXBlKSB7CisJ Y2FzZSBEUF9FTlVNX1BBVEhfUkVTT1VSQ0VTOgorCQlidWZbaWR4XSA9IChyZXEtPnUucG9ydF9u dW0ucG9ydF9udW1iZXIgJiAweGYpIDw8IDQ7CisJCWlkeCsrOworCQlicmVhazsKKwljYXNlIERQ X0FMTE9DQVRFX1BBWUxPQUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5hbGxvY2F0ZV9wYXlsb2Fk LnBvcnRfbnVtYmVyICYgMHhmKSA8PCA0IHwKKwkJCShyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5u dW1iZXJfc2RwX3N0cmVhbXMgJiAweGYpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51 LmFsbG9jYXRlX3BheWxvYWQudmNwaSAmIDB4N2YpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAo cmVxLT51LmFsbG9jYXRlX3BheWxvYWQucGJuID4+IDgpOworCQlpZHgrKzsKKwkJYnVmW2lkeF0g PSAocmVxLT51LmFsbG9jYXRlX3BheWxvYWQucGJuICYgMHhmZik7CisJCWlkeCsrOworCQlmb3Ig KGkgPSAwOyBpIDwgcmVxLT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zIC8g MjsgaSsrKSB7CisJCQlidWZbaWR4XSA9ICgocmVxLT51LmFsbG9jYXRlX3BheWxvYWQuc2RwX3N0 cmVhbV9zaW5rW2kgKiAyXSAmIDB4ZikgPDwgNCkgfAorCQkJCShyZXEtPnUuYWxsb2NhdGVfcGF5 bG9hZC5zZHBfc3RyZWFtX3NpbmtbaSAqIDIgKyAxXSAmIDB4Zik7CisJCQlpZHgrKzsKKwkJfQor CQlpZiAocmVxLT51LmFsbG9jYXRlX3BheWxvYWQubnVtYmVyX3NkcF9zdHJlYW1zICYgMSkgewor CQkJaSA9IHJlcS0+dS5hbGxvY2F0ZV9wYXlsb2FkLm51bWJlcl9zZHBfc3RyZWFtcyAtIDE7CisJ CQlidWZbaWR4XSA9IChyZXEtPnUuYWxsb2NhdGVfcGF5bG9hZC5zZHBfc3RyZWFtX3NpbmtbaV0g JiAweGYpIDw8IDQ7CisJCQlpZHgrKzsKKwkJfQorCQlicmVhazsKKwljYXNlIERQX1FVRVJZX1BB WUxPQUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5xdWVyeV9wYXlsb2FkLnBvcnRfbnVtYmVyICYg MHhmKSA8PCA0OworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LnF1ZXJ5X3BheWxvYWQu dmNwaSAmIDB4N2YpOworCQlpZHgrKzsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfRFBDRF9S RUFEOgorCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF9yZWFkLnBvcnRfbnVtYmVyICYgMHhmKSA8 PCA0OworCQlidWZbaWR4XSB8PSAoKHJlcS0+dS5kcGNkX3JlYWQuZHBjZF9hZGRyZXNzICYgMHhm MDAwMCkgPj4gMTYpICYgMHhmOworCQlpZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmRwY2Rf cmVhZC5kcGNkX2FkZHJlc3MgJiAweGZmMDApID4+IDg7CisJCWlkeCsrOworCQlidWZbaWR4XSA9 IChyZXEtPnUuZHBjZF9yZWFkLmRwY2RfYWRkcmVzcyAmIDB4ZmYpOworCQlpZHgrKzsKKwkJYnVm W2lkeF0gPSAocmVxLT51LmRwY2RfcmVhZC5udW1fYnl0ZXMpOworCQlpZHgrKzsKKwkJYnJlYWs7 CisKKwljYXNlIERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlidWZbaWR4XSA9IChyZXEtPnUuZHBj ZF93cml0ZS5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJYnVmW2lkeF0gfD0gKChyZXEtPnUu ZHBjZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAweGYwMDAwKSA+PiAxNikgJiAweGY7CisJCWlkeCsr OworCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2FkZHJlc3MgJiAweGZmMDAp ID4+IDg7CisJCWlkeCsrOworCQlidWZbaWR4XSA9IChyZXEtPnUuZHBjZF93cml0ZS5kcGNkX2Fk ZHJlc3MgJiAweGZmKTsKKwkJaWR4Kys7CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5kcGNkX3dyaXRl Lm51bV9ieXRlcyk7CisJCWlkeCsrOworCQltZW1jcHkoJmJ1ZltpZHhdLCByZXEtPnUuZHBjZF93 cml0ZS5ieXRlcywgcmVxLT51LmRwY2Rfd3JpdGUubnVtX2J5dGVzKTsKKwkJaWR4ICs9IHJlcS0+ dS5kcGNkX3dyaXRlLm51bV9ieXRlczsKKwkJYnJlYWs7CisJY2FzZSBEUF9SRU1PVEVfSTJDX1JF QUQ6CisJCWJ1ZltpZHhdID0gKHJlcS0+dS5pMmNfcmVhZC5wb3J0X251bWJlciAmIDB4ZikgPDwg NDsKKwkJYnVmW2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC5udW1fdHJhbnNhY3Rpb25zICYgMHgz KTsKKwkJaWR4Kys7CisJCWZvciAoaSA9IDA7IGkgPCAocmVxLT51LmkyY19yZWFkLm51bV90cmFu c2FjdGlvbnMgJiAweDMpOyBpKyspIHsKKwkJCWJ1ZltpZHhdID0gcmVxLT51LmkyY19yZWFkLnRy YW5zYWN0aW9uc1tpXS5pMmNfZGV2X2lkICYgMHg3ZjsKKwkJCWlkeCsrOworCQkJYnVmW2lkeF0g PSByZXEtPnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm51bV9ieXRlczsKKwkJCWlkeCsrOwor CQkJbWVtY3B5KCZidWZbaWR4XSwgcmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5ieXRl cywgcmVxLT51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tpXS5udW1fYnl0ZXMpOworCQkJaWR4ICs9 IHJlcS0+dS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0ubnVtX2J5dGVzOworCisJCQlidWZbaWR4 XSA9IChyZXEtPnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLm5vX3N0b3BfYml0ICYgMHgxKSA8 PCA1OworCQkJYnVmW2lkeF0gfD0gKHJlcS0+dS5pMmNfcmVhZC50cmFuc2FjdGlvbnNbaV0uaTJj X3RyYW5zYWN0aW9uX2RlbGF5ICYgMHhmKTsKKwkJCWlkeCsrOworCQl9CisJCWJ1ZltpZHhdID0g KHJlcS0+dS5pMmNfcmVhZC5yZWFkX2kyY19kZXZpY2VfaWQpICYgMHg3ZjsKKwkJaWR4Kys7CisJ CWJ1ZltpZHhdID0gKHJlcS0+dS5pMmNfcmVhZC5udW1fYnl0ZXNfcmVhZCk7CisJCWlkeCsrOwor CQlicmVhazsKKworCWNhc2UgRFBfUkVNT1RFX0kyQ19XUklURToKKwkJYnVmW2lkeF0gPSAocmVx LT51LmkyY193cml0ZS5wb3J0X251bWJlciAmIDB4ZikgPDwgNDsKKwkJaWR4Kys7CisJCWJ1Zltp ZHhdID0gKHJlcS0+dS5pMmNfd3JpdGUud3JpdGVfaTJjX2RldmljZV9pZCkgJiAweDdmOworCQlp ZHgrKzsKKwkJYnVmW2lkeF0gPSAocmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXMpOworCQlpZHgr KzsKKwkJbWVtY3B5KCZidWZbaWR4XSwgcmVxLT51LmkyY193cml0ZS5ieXRlcywgcmVxLT51Lmky Y193cml0ZS5udW1fYnl0ZXMpOworCQlpZHggKz0gcmVxLT51LmkyY193cml0ZS5udW1fYnl0ZXM7 CisJCWJyZWFrOworCX0KKwlyYXctPmN1cl9sZW4gPSBpZHg7Cit9CisKK3N0YXRpYyB2b2lkIGRy bV9kcF9jcmNfc2lkZWJhbmRfY2h1bmtfcmVxKHU4ICptc2csIHU4IGxlbikKK3sKKwl1OCBjcmM0 OworCWNyYzQgPSBkcm1fZHBfbXNnX2RhdGFfY3JjNChtc2csIGxlbik7CisJbXNnW2xlbl0gPSBj cmM0OworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcGx5KHN0cnVj dCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcCwKKwkJCQkJIHN0cnVjdCBkcm1f ZHBfc2lkZWJhbmRfbXNnX3R4ICpyYXcpCit7CisJaW50IGlkeCA9IDA7CisJdTggKmJ1ZiA9IHJh dy0+bXNnOworCisJYnVmW2lkeCsrXSA9IChyZXAtPnJlcGx5X3R5cGUgJiAweDEpIDw8IDcgfCAo cmVwLT5yZXFfdHlwZSAmIDB4N2YpOworCisJcmF3LT5jdXJfbGVuID0gaWR4OworfQorCisvKiB0 aGlzIGFkZHMgYSBjaHVuayBvZiBtc2cgdG8gdGhlIGJ1aWxkZXIgdG8gZ2V0IHRoZSBmaW5hbCBt c2cgKi8KK3N0YXRpYyBib29sIGRybV9kcF9zaWRlYmFuZF9tc2dfYnVpbGQoc3RydWN0IGRybV9k cF9zaWRlYmFuZF9tc2dfcnggKm1zZywKKwkJCQkgICAgICB1OCAqcmVwbHlidWYsIHU4IHJlcGx5 YnVmbGVuLCBib29sIGhkcikKK3sKKwlpbnQgcmV0OworCXU4IGNyYzQ7CisKKwlpZiAoaGRyKSB7 CisJCXU4IGhkcmxlbjsKKwkJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfaGRyIHJlY3ZfaGRy OworCQlyZXQgPSBkcm1fZHBfZGVjb2RlX3NpZGViYW5kX21zZ19oZHIoJnJlY3ZfaGRyLCByZXBs eWJ1ZiwgcmVwbHlidWZsZW4sICZoZHJsZW4pOworCQlpZiAocmV0ID09IGZhbHNlKSB7CisJCQlw cmludF9oZXhfZHVtcChLRVJOX0RFQlVHLCAiZmFpbGVkIGhkciIsIERVTVBfUFJFRklYX05PTkUs IDE2LCAxLCByZXBseWJ1ZiwgcmVwbHlidWZsZW4sIGZhbHNlKTsKKwkJCXJldHVybiBmYWxzZTsK KwkJfQorCisJCS8qIGdldCBsZW5ndGggY29udGFpbmVkIGluIHRoaXMgcG9ydGlvbiAqLworCQlt c2ctPmN1cmNodW5rX2xlbiA9IHJlY3ZfaGRyLm1zZ19sZW47CisJCW1zZy0+Y3VyY2h1bmtfaGRy bGVuID0gaGRybGVuOworCisJCS8qIHdlIGhhdmUgYWxyZWFkeSBnb3R0ZW4gYW4gc29tdCAtIGRv bid0IGJvdGhlciBwYXJzaW5nICovCisJCWlmIChyZWN2X2hkci5zb210ICYmIG1zZy0+aGF2ZV9z b210KQorCQkJcmV0dXJuIGZhbHNlOworCisJCWlmIChyZWN2X2hkci5zb210KSB7CisJCQltZW1j cHkoJm1zZy0+aW5pdGlhbF9oZHIsICZyZWN2X2hkciwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lk ZWJhbmRfbXNnX2hkcikpOworCQkJbXNnLT5oYXZlX3NvbXQgPSB0cnVlOworCQl9CisJCWlmIChy ZWN2X2hkci5lb210KQorCQkJbXNnLT5oYXZlX2VvbXQgPSB0cnVlOworCisJCS8qIGNvcHkgdGhl IGJ5dGVzIGZvciB0aGUgcmVtYWluZGVyIG9mIHRoaXMgaGVhZGVyIGNodW5rICovCisJCW1zZy0+ Y3VyY2h1bmtfaWR4ID0gbWluKG1zZy0+Y3VyY2h1bmtfbGVuLCAodTgpKHJlcGx5YnVmbGVuIC0g aGRybGVuKSk7CisJCW1lbWNweSgmbXNnLT5jaHVua1swXSwgcmVwbHlidWYgKyBoZHJsZW4sIG1z Zy0+Y3VyY2h1bmtfaWR4KTsKKwl9IGVsc2UgeworCQltZW1jcHkoJm1zZy0+Y2h1bmtbbXNnLT5j dXJjaHVua19pZHhdLCByZXBseWJ1ZiwgcmVwbHlidWZsZW4pOworCQltc2ctPmN1cmNodW5rX2lk eCArPSByZXBseWJ1ZmxlbjsKKwl9CisKKwlpZiAobXNnLT5jdXJjaHVua19pZHggPj0gbXNnLT5j dXJjaHVua19sZW4pIHsKKwkJLyogZG8gQ1JDICovCisJCWNyYzQgPSBkcm1fZHBfbXNnX2RhdGFf Y3JjNChtc2ctPmNodW5rLCBtc2ctPmN1cmNodW5rX2xlbiAtIDEpOworCQkvKiBjb3B5IGNodW5r IGludG8gYmlnZ2VyIG1zZyAqLworCQltZW1jcHkoJm1zZy0+bXNnW21zZy0+Y3VybGVuXSwgbXNn LT5jaHVuaywgbXNnLT5jdXJjaHVua19sZW4gLSAxKTsKKwkJbXNnLT5jdXJsZW4gKz0gbXNnLT5j dXJjaHVua19sZW4gLSAxOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIGJvb2wgZHJt X2RwX3NpZGViYW5kX3BhcnNlX2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21z Z19yeCAqcmF3LAorCQkJCQkgICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlf Ym9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOworCWludCBpOworCW1lbWNweShyZXBtc2ct PnUubGlua19hZGRyLmd1aWQsICZyYXctPm1zZ1tpZHhdLCAxNik7CisJaWR4ICs9IDE2OworCXJl cG1zZy0+dS5saW5rX2FkZHIubnBvcnRzID0gcmF3LT5tc2dbaWR4XSAmIDB4ZjsKKwlpZHgrKzsK KwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJZm9yIChpID0gMDsg aSA8IHJlcG1zZy0+dS5saW5rX2FkZHIubnBvcnRzOyBpKyspIHsKKwkJaWYgKHJhdy0+bXNnW2lk eF0gJiAweDgwKQorCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5pbnB1dF9wb3J0ID0g MTsKKworCQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLnBlZXJfZGV2aWNlX3R5cGUgPSAo cmF3LT5tc2dbaWR4XSA+PiA0KSAmIDB4NzsKKwkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tp XS5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKworCQlpZHgrKzsKKwkJaWYg KGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwkJcmVwbXNnLT51Lmxpbmtf YWRkci5wb3J0c1tpXS5tY3MgPSAocmF3LT5tc2dbaWR4XSA+PiA3KSAmIDB4MTsKKwkJcmVwbXNn LT51LmxpbmtfYWRkci5wb3J0c1tpXS5kZHBzID0gKHJhdy0+bXNnW2lkeF0gPj4gNikgJiAweDE7 CisJCWlmIChyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLmlucHV0X3BvcnQgPT0gMCkKKwkJ CXJlcG1zZy0+dS5saW5rX2FkZHIucG9ydHNbaV0ubGVnYWN5X2RldmljZV9wbHVnX3N0YXR1cyA9 IChyYXctPm1zZ1tpZHhdID4+IDUpICYgMHgxOworCQlpZHgrKzsKKwkJaWYgKGlkeCA+IHJhdy0+ Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwkJaWYgKHJlcG1zZy0+dS5saW5rX2FkZHIucG9y dHNbaV0uaW5wdXRfcG9ydCA9PSAwKSB7CisJCQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ld LmRwY2RfcmV2aXNpb24gPSAocmF3LT5tc2dbaWR4XSk7CisJCQlpZHgrKzsKKwkJCWlmIChpZHgg PiByYXctPmN1cmxlbikKKwkJCQlnb3RvIGZhaWxfbGVuOworCQkJbWVtY3B5KHJlcG1zZy0+dS5s aW5rX2FkZHIucG9ydHNbaV0ucGVlcl9ndWlkLCAmcmF3LT5tc2dbaWR4XSwgMTYpOworCQkJaWR4 ICs9IDE2OworCQkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJCWdvdG8gZmFpbF9sZW47CisJ CQlyZXBtc2ctPnUubGlua19hZGRyLnBvcnRzW2ldLm51bV9zZHBfc3RyZWFtcyA9IChyYXctPm1z Z1tpZHhdID4+IDQpICYgMHhmOworCQkJcmVwbXNnLT51LmxpbmtfYWRkci5wb3J0c1tpXS5udW1f c2RwX3N0cmVhbV9zaW5rcyA9IChyYXctPm1zZ1tpZHhdICYgMHhmKTsKKwkJCWlkeCsrOworCisJ CX0KKwkJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQkJZ290byBmYWlsX2xlbjsKKwl9CisKKwly ZXR1cm4gdHJ1ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVzcyByZXBs eSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJu IGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2Rw Y2RfcmVhZChzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJICAgc3Ry dWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHgg PSAxOworCXJlcG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5wb3J0X251bWJlciA9IHJhdy0+ bXNnW2lkeF0gJiAweGY7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3Rv IGZhaWxfbGVuOworCXJlcG1zZy0+dS5yZW1vdGVfZHBjZF9yZWFkX2Fjay5udW1fYnl0ZXMgPSBy YXctPm1zZ1tpZHhdOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsK KworCW1lbWNweShyZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2suYnl0ZXMsICZyYXctPm1z Z1tpZHhdLCByZXBtc2ctPnUucmVtb3RlX2RwY2RfcmVhZF9hY2subnVtX2J5dGVzKTsKKwlyZXR1 cm4gdHJ1ZTsKK2ZhaWxfbGVuOgorCURSTV9ERUJVR19LTVMoImxpbmsgYWRkcmVzcyByZXBseSBw YXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZh bHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2RwY2Rf d3JpdGUoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAgICAgIHN0 cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcG1zZykKK3sKKwlpbnQgaWR4 ID0gMTsKKwlyZXBtc2ctPnUucmVtb3RlX2RwY2Rfd3JpdGVfYWNrLnBvcnRfbnVtYmVyID0gcmF3 LT5tc2dbaWR4XSAmIDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdv dG8gZmFpbF9sZW47CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlEUk1fREVCVUdfS01TKCJw YXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZh bHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVtb3RlX2kyY19y ZWFkX2FjayhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJICAgICAg c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBp ZHggPSAxOworCisJcmVwbXNnLT51LnJlbW90ZV9pMmNfcmVhZF9hY2sucG9ydF9udW1iZXIgPSAo cmF3LT5tc2dbaWR4XSAmIDB4Zik7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQor CQlnb3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51bV9ieXRl cyA9IHJhdy0+bXNnW2lkeF07CisJaWR4Kys7CisJLyogVE9ETyBjaGVjayAqLworCW1lbWNweShy ZXBtc2ctPnUucmVtb3RlX2kyY19yZWFkX2Fjay5ieXRlcywgJnJhdy0+bXNnW2lkeF0sIHJlcG1z Zy0+dS5yZW1vdGVfaTJjX3JlYWRfYWNrLm51bV9ieXRlcyk7CisJcmV0dXJuIHRydWU7CitmYWls X2xlbjoKKwlEUk1fREVCVUdfS01TKCJyZW1vdGUgaTJjIHJlcGx5IHBhcnNlIGxlbmd0aCBmYWls ICVkICVkXG4iLCBpZHgsIHJhdy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRp YyBib29sIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9lbnVtX3BhdGhfcmVzb3VyY2VzX2FjayhzdHJ1 Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgc3RydWN0IGRybV9kcF9z aWRlYmFuZF9tc2dfcmVwbHlfYm9keSAqcmVwbXNnKQoreworCWludCBpZHggPSAxOworCXJlcG1z Zy0+dS5wYXRoX3Jlc291cmNlcy5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdID4+IDQpICYg MHhmOworCWlkeCsrOworCWlmIChpZHggPiByYXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsK KwlyZXBtc2ctPnUucGF0aF9yZXNvdXJjZXMuZnVsbF9wYXlsb2FkX2J3X251bWJlciA9IChyYXct Pm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJaWYgKGlk eCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJlcG1zZy0+dS5wYXRoX3Jlc291 cmNlcy5hdmFpbF9wYXlsb2FkX2J3X251bWJlciA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJh dy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9IDI7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQln b3RvIGZhaWxfbGVuOworCXJldHVybiB0cnVlOworZmFpbF9sZW46CisJRFJNX0RFQlVHX0tNUygi ZW51bSByZXNvdXJjZSBwYXJzZSBsZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxl bik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFy c2VfYWxsb2NhdGVfcGF5bG9hZF9hY2soc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJh dywKKwkJCQkJCQkgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgKnJlcG1z ZykKK3sKKwlpbnQgaWR4ID0gMTsKKwlyZXBtc2ctPnUuYWxsb2NhdGVfcGF5bG9hZC5wb3J0X251 bWJlciA9IChyYXctPm1zZ1tpZHhdID4+IDQpICYgMHhmOworCWlkeCsrOworCWlmIChpZHggPiBy YXctPmN1cmxlbikKKwkJZ290byBmYWlsX2xlbjsKKwlyZXBtc2ctPnUuYWxsb2NhdGVfcGF5bG9h ZC52Y3BpID0gcmF3LT5tc2dbaWR4XTsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4p CisJCWdvdG8gZmFpbF9sZW47CisJcmVwbXNnLT51LmFsbG9jYXRlX3BheWxvYWQuYWxsb2NhdGVk X3BibiA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCsxXSk7CisJaWR4ICs9 IDI7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCXJldHVybiB0 cnVlOworZmFpbF9sZW46CisJRFJNX0RFQlVHX0tNUygiYWxsb2NhdGUgcGF5bG9hZCBwYXJzZSBs ZW5ndGggZmFpbCAlZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOwor fQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcXVlcnlfcGF5bG9hZF9hY2so c3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggKnJhdywKKwkJCQkJCSAgICBzdHJ1Y3QgZHJt X2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5ICpyZXBtc2cpCit7CisJaW50IGlkeCA9IDE7CisJ cmVwbXNnLT51LnF1ZXJ5X3BheWxvYWQucG9ydF9udW1iZXIgPSAocmF3LT5tc2dbaWR4XSA+PiA0 KSAmIDB4ZjsKKwlpZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9s ZW47CisJcmVwbXNnLT51LnF1ZXJ5X3BheWxvYWQuYWxsb2NhdGVkX3BibiA9IChyYXctPm1zZ1tp ZHhdIDw8IDgpIHwgKHJhdy0+bXNnW2lkeCArIDFdKTsKKwlpZHggKz0gMjsKKwlpZiAoaWR4ID4g cmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoK KwlEUk1fREVCVUdfS01TKCJxdWVyeSBwYXlsb2FkIHBhcnNlIGxlbmd0aCBmYWlsICVkICVkXG4i LCBpZHgsIHJhdy0+Y3VybGVuKTsKKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyBib29sIGRy bV9kcF9zaWRlYmFuZF9wYXJzZV9yZXBseShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCAq cmF3LAorCQkJCQlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5ICptc2cpCit7 CisJbWVtc2V0KG1zZywgMCwgc2l6ZW9mKCptc2cpKTsKKwltc2ctPnJlcGx5X3R5cGUgPSAocmF3 LT5tc2dbMF0gJiAweDgwKSA+PiA3OworCW1zZy0+cmVxX3R5cGUgPSAocmF3LT5tc2dbMF0gJiAw eDdmKTsKKworCWlmIChtc2ctPnJlcGx5X3R5cGUpIHsKKwkJbWVtY3B5KG1zZy0+dS5uYWsuZ3Vp ZCwgJnJhdy0+bXNnWzFdLCAxNik7CisJCW1zZy0+dS5uYWsucmVhc29uID0gcmF3LT5tc2dbMTdd OworCQltc2ctPnUubmFrLm5ha19kYXRhID0gcmF3LT5tc2dbMThdOworCQlyZXR1cm4gZmFsc2U7 CisJfQorCisJc3dpdGNoIChtc2ctPnJlcV90eXBlKSB7CisJY2FzZSBEUF9MSU5LX0FERFJFU1M6 CisJCXJldHVybiBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfbGlua19hZGRyZXNzKHJhdywgbXNnKTsK KwljYXNlIERQX1FVRVJZX1BBWUxPQUQ6CisJCXJldHVybiBkcm1fZHBfc2lkZWJhbmRfcGFyc2Vf cXVlcnlfcGF5bG9hZF9hY2socmF3LCBtc2cpOworCWNhc2UgRFBfUkVNT1RFX0RQQ0RfUkVBRDoK KwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfZHBjZF9yZWFkKHJhdywgbXNn KTsKKwljYXNlIERQX1JFTU9URV9EUENEX1dSSVRFOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5k X3BhcnNlX3JlbW90ZV9kcGNkX3dyaXRlKHJhdywgbXNnKTsKKwljYXNlIERQX1JFTU9URV9JMkNf UkVBRDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZW1vdGVfaTJjX3JlYWRfYWNr KHJhdywgbXNnKTsKKwljYXNlIERQX0VOVU1fUEFUSF9SRVNPVVJDRVM6CisJCXJldHVybiBkcm1f ZHBfc2lkZWJhbmRfcGFyc2VfZW51bV9wYXRoX3Jlc291cmNlc19hY2socmF3LCBtc2cpOworCWNh c2UgRFBfQUxMT0NBVEVfUEFZTE9BRDoKKwkJcmV0dXJuIGRybV9kcF9zaWRlYmFuZF9wYXJzZV9h bGxvY2F0ZV9wYXlsb2FkX2FjayhyYXcsIG1zZyk7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJH b3QgdW5rbm93biByZXBseSAweCUwMnhcbiIsIG1zZy0+cmVxX3R5cGUpOworCQlyZXR1cm4gZmFs c2U7CisJfQorfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfY29ubmVjdGlv bl9zdGF0dXNfbm90aWZ5KHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4ICpyYXcsCisJCQkJ CQkJICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgKm1zZykKK3sKKwlpbnQg aWR4ID0gMTsKKworCW1zZy0+dS5jb25uX3N0YXQucG9ydF9udW1iZXIgPSAocmF3LT5tc2dbaWR4 XSAmIDB4ZjApID4+IDQ7CisJaWR4Kys7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3Rv IGZhaWxfbGVuOworCisJbWVtY3B5KG1zZy0+dS5jb25uX3N0YXQuZ3VpZCwgJnJhdy0+bXNnW2lk eF0sIDE2KTsKKwlpZHggKz0gMTY7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZh aWxfbGVuOworCisJbXNnLT51LmNvbm5fc3RhdC5sZWdhY3lfZGV2aWNlX3BsdWdfc3RhdHVzID0g KHJhdy0+bXNnW2lkeF0gPj4gNikgJiAweDE7CisJbXNnLT51LmNvbm5fc3RhdC5kaXNwbGF5cG9y dF9kZXZpY2VfcGx1Z19zdGF0dXMgPSAocmF3LT5tc2dbaWR4XSA+PiA1KSAmIDB4MTsKKwltc2ct PnUuY29ubl9zdGF0Lm1lc3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXMgPSAocmF3LT5tc2dbaWR4XSA+ PiA0KSAmIDB4MTsKKwltc2ctPnUuY29ubl9zdGF0LmlucHV0X3BvcnQgPSAocmF3LT5tc2dbaWR4 XSA+PiAzKSAmIDB4MTsKKwltc2ctPnUuY29ubl9zdGF0LnBlZXJfZGV2aWNlX3R5cGUgPSAocmF3 LT5tc2dbaWR4XSAmIDB4Nyk7CisJaWR4Kys7CisJcmV0dXJuIHRydWU7CitmYWlsX2xlbjoKKwlE Uk1fREVCVUdfS01TKCJjb25uZWN0aW9uIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGggZmFpbCAl ZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMg Ym9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVzb3VyY2Vfc3RhdHVzX25vdGlmeShzdHJ1Y3Qg ZHJtX2RwX3NpZGViYW5kX21zZ19yeCAqcmF3LAorCQkJCQkJCSAgIHN0cnVjdCBkcm1fZHBfc2lk ZWJhbmRfbXNnX3JlcV9ib2R5ICptc2cpCit7CisJaW50IGlkeCA9IDE7CisKKwltc2ctPnUucmVz b3VyY2Vfc3RhdC5wb3J0X251bWJlciA9IChyYXctPm1zZ1tpZHhdICYgMHhmMCkgPj4gNDsKKwlp ZHgrKzsKKwlpZiAoaWR4ID4gcmF3LT5jdXJsZW4pCisJCWdvdG8gZmFpbF9sZW47CisKKwltZW1j cHkobXNnLT51LnJlc291cmNlX3N0YXQuZ3VpZCwgJnJhdy0+bXNnW2lkeF0sIDE2KTsKKwlpZHgg Kz0gMTY7CisJaWYgKGlkeCA+IHJhdy0+Y3VybGVuKQorCQlnb3RvIGZhaWxfbGVuOworCisJbXNn LT51LnJlc291cmNlX3N0YXQuYXZhaWxhYmxlX3BibiA9IChyYXctPm1zZ1tpZHhdIDw8IDgpIHwg KHJhdy0+bXNnW2lkeCArIDFdKTsKKwlpZHgrKzsKKwlyZXR1cm4gdHJ1ZTsKK2ZhaWxfbGVuOgor CURSTV9ERUJVR19LTVMoInJlc291cmNlIHN0YXR1cyByZXBseSBwYXJzZSBsZW5ndGggZmFpbCAl ZCAlZFxuIiwgaWR4LCByYXctPmN1cmxlbik7CisJcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMg Ym9vbCBkcm1fZHBfc2lkZWJhbmRfcGFyc2VfcmVxKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3J4ICpyYXcsCisJCQkJICAgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkg Km1zZykKK3sKKwltZW1zZXQobXNnLCAwLCBzaXplb2YoKm1zZykpOworCW1zZy0+cmVxX3R5cGUg PSAocmF3LT5tc2dbMF0gJiAweDdmKTsKKworCXN3aXRjaCAobXNnLT5yZXFfdHlwZSkgeworCWNh c2UgRFBfQ09OTkVDVElPTl9TVEFUVVNfTk9USUZZOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5k X3BhcnNlX2Nvbm5lY3Rpb25fc3RhdHVzX25vdGlmeShyYXcsIG1zZyk7CisJY2FzZSBEUF9SRVNP VVJDRV9TVEFUVVNfTk9USUZZOgorCQlyZXR1cm4gZHJtX2RwX3NpZGViYW5kX3BhcnNlX3Jlc291 cmNlX3N0YXR1c19ub3RpZnkocmF3LCBtc2cpOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigiR290 IHVua25vd24gcmVxdWVzdCAweCUwMnhcbiIsIG1zZy0+cmVxX3R5cGUpOworCQlyZXR1cm4gZmFs c2U7CisJfQorfQorCitzdGF0aWMgaW50IGJ1aWxkX2RwY2Rfd3JpdGUoc3RydWN0IGRybV9kcF9z aWRlYmFuZF9tc2dfdHggKm1zZywgdTggcG9ydF9udW0sIHUzMiBvZmZzZXQsIHU4IG51bV9ieXRl cywgdTggKmJ5dGVzKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJl cTsKKworCXJlcS5yZXFfdHlwZSA9IERQX1JFTU9URV9EUENEX1dSSVRFOworCXJlcS51LmRwY2Rf d3JpdGUucG9ydF9udW1iZXIgPSBwb3J0X251bTsKKwlyZXEudS5kcGNkX3dyaXRlLmRwY2RfYWRk cmVzcyA9IG9mZnNldDsKKwlyZXEudS5kcGNkX3dyaXRlLm51bV9ieXRlcyA9IG51bV9ieXRlczsK KwltZW1jcHkocmVxLnUuZHBjZF93cml0ZS5ieXRlcywgYnl0ZXMsIG51bV9ieXRlcyk7CisJZHJt X2RwX2VuY29kZV9zaWRlYmFuZF9yZXEoJnJlcSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgaW50IGJ1aWxkX2xpbmtfYWRkcmVzcyhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190 eCAqbXNnKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKwor CXJlcS5yZXFfdHlwZSA9IERQX0xJTktfQUREUkVTUzsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5k X3JlcSgmcmVxLCBtc2cpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2VudW1f cGF0aF9yZXNvdXJjZXMoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1zZywgaW50IHBv cnRfbnVtKQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKwor CXJlcS5yZXFfdHlwZSA9IERQX0VOVU1fUEFUSF9SRVNPVVJDRVM7CisJcmVxLnUucG9ydF9udW0u cG9ydF9udW1iZXIgPSBwb3J0X251bTsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcSgmcmVx LCBtc2cpOworCW1zZy0+cGF0aF9tc2cgPSB0cnVlOworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IGJ1aWxkX2FsbG9jYXRlX3BheWxvYWQoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHgg Km1zZywgaW50IHBvcnRfbnVtLAorCQkJCSAgdTggdmNwaSwgdWludDE2X3QgcGJuKQoreworCXN0 cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcV9ib2R5IHJlcTsKKwltZW1zZXQoJnJlcSwgMCwg c2l6ZW9mKHJlcSkpOworCXJlcS5yZXFfdHlwZSA9IERQX0FMTE9DQVRFX1BBWUxPQUQ7CisJcmVx LnUuYWxsb2NhdGVfcGF5bG9hZC5wb3J0X251bWJlciA9IHBvcnRfbnVtOworCXJlcS51LmFsbG9j YXRlX3BheWxvYWQudmNwaSA9IHZjcGk7CisJcmVxLnUuYWxsb2NhdGVfcGF5bG9hZC5wYm4gPSBw Ym47CisJZHJtX2RwX2VuY29kZV9zaWRlYmFuZF9yZXEoJnJlcSwgbXNnKTsKKwltc2ctPnBhdGhf bXNnID0gdHJ1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkcm1fZHBfbXN0X2Fzc2ln bl9wYXlsb2FkX2lkKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCQlz dHJ1Y3QgZHJtX2RwX3ZjcGkgKnZjcGkpCit7CisJaW50IHJldDsKKworCW11dGV4X2xvY2soJm1n ci0+cGF5bG9hZF9sb2NrKTsKKwlyZXQgPSBmaW5kX2ZpcnN0X3plcm9fYml0KCZtZ3ItPnBheWxv YWRfbWFzaywgbWdyLT5tYXhfcGF5bG9hZHMgKyAxKTsKKwlpZiAocmV0ID4gbWdyLT5tYXhfcGF5 bG9hZHMpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJRFJNX0RFQlVHX0tNUygib3V0IG9mIHBheWxv YWQgaWRzICVkXG4iLCByZXQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJc2V0X2JpdChy ZXQsICZtZ3ItPnBheWxvYWRfbWFzayk7CisJdmNwaS0+dmNwaSA9IHJldDsKKwltZ3ItPnByb3Bv c2VkX3ZjcGlzW3JldCAtIDFdID0gdmNwaTsKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZt Z3ItPnBheWxvYWRfbG9jayk7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgZHJtX2Rw X21zdF9wdXRfcGF5bG9hZF9pZChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwK KwkJCQkgICAgICBpbnQgaWQpCit7CisJaWYgKGlkID09IDApCisJCXJldHVybjsKKworCW11dGV4 X2xvY2soJm1nci0+cGF5bG9hZF9sb2NrKTsKKwlEUk1fREVCVUdfS01TKCJwdXR0aW5nIHBheWxv YWQgJWRcbiIsIGlkKTsKKwljbGVhcl9iaXQoaWQsICZtZ3ItPnBheWxvYWRfbWFzayk7CisJbWdy LT5wcm9wb3NlZF92Y3Bpc1tpZCAtIDFdID0gTlVMTDsKKwltdXRleF91bmxvY2soJm1nci0+cGF5 bG9hZF9sb2NrKTsKK30KKworc3RhdGljIGJvb2wgY2hlY2tfdHhtc2dfc3RhdGUoc3RydWN0IGRy bV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkgICAgICBzdHJ1Y3QgZHJtX2RwX3NpZGVi YW5kX21zZ190eCAqdHhtc2cpCit7CisJYm9vbCByZXQ7CisJbXV0ZXhfbG9jaygmbWdyLT5xbG9j ayk7CisJcmV0ID0gKHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lERUJBTkRfVFhfUlggfHwKKwkg ICAgICAgdHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFORF9UWF9USU1FT1VUKTsKKwltdXRl eF91bmxvY2soJm1nci0+cWxvY2spOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZHJt X2RwX21zdF93YWl0X3R4X3JlcGx5KHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJ CQkgICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnKQoreworCXN0cnVjdCBk cm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyID0gbXN0Yi0+bWdyOworCWludCByZXQ7CisKKwly ZXQgPSB3YWl0X2V2ZW50X3RpbWVvdXQobWdyLT50eF93YWl0cSwKKwkJCQkgY2hlY2tfdHhtc2df c3RhdGUobWdyLCB0eG1zZyksCisJCQkJICg0ICogSFopKTsKKwltdXRleF9sb2NrKCZtc3RiLT5t Z3ItPnFsb2NrKTsKKwlpZiAocmV0ID4gMCkgeworCQlpZiAodHhtc2ctPnN0YXRlID09IERSTV9E UF9TSURFQkFORF9UWF9USU1FT1VUKSB7CisJCQlyZXQgPSAtRUlPOworCQkJZ290byBvdXQ7CisJ CX0KKwl9IGVsc2UgeworCQlEUk1fREVCVUdfS01TKCJ0aW1lZG91dCBtc2cgc2VuZCAlcCAlZCAl ZFxuIiwgdHhtc2csIHR4bXNnLT5zdGF0ZSwgdHhtc2ctPnNlcW5vKTsKKworCQkvKiBkdW1wIHNv bWUgc3RhdGUgKi8KKwkJcmV0ID0gLUVJTzsKKworCQkvKiByZW1vdmUgZnJvbSBxICovCisJCWlm ICh0eG1zZy0+c3RhdGUgPT0gRFJNX0RQX1NJREVCQU5EX1RYX1FVRVVFRCB8fAorCQkgICAgdHht c2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFORF9UWF9TVEFSVF9TRU5EKSB7CisJCQlsaXN0X2Rl bCgmdHhtc2ctPm5leHQpOworCQl9CisKKwkJaWYgKHR4bXNnLT5zdGF0ZSA9PSBEUk1fRFBfU0lE RUJBTkRfVFhfU1RBUlRfU0VORCB8fAorCQkgICAgdHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURF QkFORF9UWF9TRU5UKSB7CisJCQltc3RiLT50eF9zbG90c1t0eG1zZy0+c2Vxbm9dID0gTlVMTDsK KwkJfQorCX0KK291dDoKKwltdXRleF91bmxvY2soJm1nci0+cWxvY2spOworCisJcmV0dXJuIHJl dDsKK30KKworc3RhdGljIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqZHJtX2RwX2FkZF9tc3Rf YnJhbmNoX2RldmljZSh1OCBsY3QsIHU4ICpyYWQpCit7CisJc3RydWN0IGRybV9kcF9tc3RfYnJh bmNoICptc3RiOworCisJbXN0YiA9IGt6YWxsb2Moc2l6ZW9mKCptc3RiKSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCFtc3RiKQorCQlyZXR1cm4gTlVMTDsKKworCW1zdGItPmxjdCA9IGxjdDsKKwlpZiAo bGN0ID4gMSkKKwkJbWVtY3B5KG1zdGItPnJhZCwgcmFkLCBsY3QgLyAyKTsKKwlJTklUX0xJU1Rf SEVBRCgmbXN0Yi0+cG9ydHMpOworCWtyZWZfaW5pdCgmbXN0Yi0+a3JlZik7CisJcmV0dXJuIG1z dGI7Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9kZXN0cm95X21zdF9icmFuY2hfZGV2aWNlKHN0 cnVjdCBrcmVmICprcmVmKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiA9IGNv bnRhaW5lcl9vZihrcmVmLCBzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2gsIGtyZWYpOworCXN0cnVj dCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsICp0bXA7CisJYm9vbCB3YWtlX3R4ID0gZmFsc2U7CisK KwljYW5jZWxfd29ya19zeW5jKCZtc3RiLT5tZ3ItPndvcmspOworCisJLyoKKwkgKiBkZXN0cm95 IGFsbCBwb3J0cyAtIGRvbid0IG5lZWQgbG9jaworCSAqIGFzIHRoZXJlIGFyZSBubyBtb3JlIHJl ZmVyZW5jZXMgdG8gdGhlIG1zdCBicmFuY2gKKwkgKiBkZXZpY2UgYXQgdGhpcyBwb2ludC4KKwkg Ki8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocG9ydCwgdG1wLCAmbXN0Yi0+cG9ydHMsIG5l eHQpIHsKKwkJbGlzdF9kZWwoJnBvcnQtPm5leHQpOworCQlkcm1fZHBfcHV0X3BvcnQocG9ydCk7 CisJfQorCisJLyogZHJvcCBhbnkgdHggc2xvdHMgbXNnICovCisJbXV0ZXhfbG9jaygmbXN0Yi0+ bWdyLT5xbG9jayk7CisJaWYgKG1zdGItPnR4X3Nsb3RzWzBdKSB7CisJCW1zdGItPnR4X3Nsb3Rz WzBdLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9UWF9USU1FT1VUOworCQltc3RiLT50eF9zbG90 c1swXSA9IE5VTEw7CisJCXdha2VfdHggPSB0cnVlOworCX0KKwlpZiAobXN0Yi0+dHhfc2xvdHNb MV0pIHsKKwkJbXN0Yi0+dHhfc2xvdHNbMV0tPnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1RJ TUVPVVQ7CisJCW1zdGItPnR4X3Nsb3RzWzFdID0gTlVMTDsKKwkJd2FrZV90eCA9IHRydWU7CisJ fQorCW11dGV4X3VubG9jaygmbXN0Yi0+bWdyLT5xbG9jayk7CisKKwlpZiAod2FrZV90eCkKKwkJ d2FrZV91cCgmbXN0Yi0+bWdyLT50eF93YWl0cSk7CisJa2ZyZWUobXN0Yik7Cit9CisKK3N0YXRp YyB2b2lkIGRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2Uoc3RydWN0IGRybV9kcF9tc3RfYnJh bmNoICptc3RiKQoreworCWtyZWZfcHV0KCZtc3RiLT5rcmVmLCBkcm1fZHBfZGVzdHJveV9tc3Rf YnJhbmNoX2RldmljZSk7Cit9CisKKworc3RhdGljIHZvaWQgZHJtX2RwX3BvcnRfdGVhcmRvd25f cGR0KHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsIGludCBvbGRfcGR0KQoreworCXN3aXRj aCAob2xkX3BkdCkgeworCWNhc2UgRFBfUEVFUl9ERVZJQ0VfRFBfTEVHQUNZX0NPTlY6CisJY2Fz ZSBEUF9QRUVSX0RFVklDRV9TU1RfU0lOSzoKKwkJLyogcmVtb3ZlIGkyYyBvdmVyIHNpZGViYW5k ICovCisJCWRybV9kcF9tc3RfdW5yZWdpc3Rlcl9pMmNfYnVzKCZwb3J0LT5hdXgpOworCQlicmVh azsKKwljYXNlIERQX1BFRVJfREVWSUNFX01TVF9CUkFOQ0hJTkc6CisJCWRybV9kcF9wdXRfbXN0 X2JyYW5jaF9kZXZpY2UocG9ydC0+bXN0Yik7CisJCXBvcnQtPm1zdGIgPSBOVUxMOworCQlicmVh azsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRybV9kcF9kZXN0cm95X3BvcnQoc3RydWN0IGtyZWYg KmtyZWYpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCA9IGNvbnRhaW5lcl9vZihr cmVmLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0LCBrcmVmKTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF90 b3BvbG9neV9tZ3IgKm1nciA9IHBvcnQtPm1ncjsKKwlpZiAoIXBvcnQtPmlucHV0KSB7CisJCXBv cnQtPnZjcGkubnVtX3Nsb3RzID0gMDsKKwkJaWYgKHBvcnQtPmNvbm5lY3RvcikKKwkJCSgqcG9y dC0+bWdyLT5jYnMtPmRlc3Ryb3lfY29ubmVjdG9yKShtZ3IsIHBvcnQtPmNvbm5lY3Rvcik7CisJ CWRybV9kcF9wb3J0X3RlYXJkb3duX3BkdChwb3J0LCBwb3J0LT5wZHQpOworCisJCWlmICghcG9y dC0+aW5wdXQgJiYgcG9ydC0+dmNwaS52Y3BpID4gMCkKKwkJCWRybV9kcF9tc3RfcHV0X3BheWxv YWRfaWQobWdyLCBwb3J0LT52Y3BpLnZjcGkpOworCX0KKwlrZnJlZShwb3J0KTsKK30KKworc3Rh dGljIHZvaWQgZHJtX2RwX3B1dF9wb3J0KHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpCit7 CisJa3JlZl9wdXQoJnBvcnQtPmtyZWYsIGRybV9kcF9kZXN0cm95X3BvcnQpOworfQorCitzdGF0 aWMgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICpkcm1fZHBfbXN0X2dldF92YWxpZGF0ZWRfbXN0 Yl9yZWZfbG9ja2VkKHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0Yiwgc3RydWN0IGRybV9k cF9tc3RfYnJhbmNoICp0b19maW5kKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQ7 CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICpybXN0YjsKKwlpZiAodG9fZmluZCA9PSBtc3Ri KSB7CisJCWtyZWZfZ2V0KCZtc3RiLT5rcmVmKTsKKwkJcmV0dXJuIG1zdGI7CisJfQorCWxpc3Rf Zm9yX2VhY2hfZW50cnkocG9ydCwgJm1zdGItPnBvcnRzLCBuZXh0KSB7CisJCWlmIChwb3J0LT5t c3RiKSB7CisJCQlybXN0YiA9IGRybV9kcF9tc3RfZ2V0X3ZhbGlkYXRlZF9tc3RiX3JlZl9sb2Nr ZWQocG9ydC0+bXN0YiwgdG9fZmluZCk7CisJCQlpZiAocm1zdGIpCisJCQkJcmV0dXJuIHJtc3Ri OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRybV9kcF9tc3Rf YnJhbmNoICpkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9tc3RiX3JlZihzdHJ1Y3QgZHJtX2RwX21zdF90 b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiKQoreworCXN0 cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqcm1zdGIgPSBOVUxMOworCW11dGV4X2xvY2soJm1nci0+ bG9jayk7CisJaWYgKG1nci0+bXN0X3ByaW1hcnkpCisJCXJtc3RiID0gZHJtX2RwX21zdF9nZXRf dmFsaWRhdGVkX21zdGJfcmVmX2xvY2tlZChtZ3ItPm1zdF9wcmltYXJ5LCBtc3RiKTsKKwltdXRl eF91bmxvY2soJm1nci0+bG9jayk7CisJcmV0dXJuIHJtc3RiOworfQorCitzdGF0aWMgc3RydWN0 IGRybV9kcF9tc3RfcG9ydCAqZHJtX2RwX21zdF9nZXRfcG9ydF9yZWZfbG9ja2VkKHN0cnVjdCBk cm1fZHBfbXN0X2JyYW5jaCAqbXN0Yiwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqdG9fZmluZCkK K3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LCAqbXBvcnQ7CisKKwlsaXN0X2Zvcl9l YWNoX2VudHJ5KHBvcnQsICZtc3RiLT5wb3J0cywgbmV4dCkgeworCQlpZiAocG9ydCA9PSB0b19m aW5kKSB7CisJCQlrcmVmX2dldCgmcG9ydC0+a3JlZik7CisJCQlyZXR1cm4gcG9ydDsKKwkJfQor CQlpZiAocG9ydC0+bXN0YikgeworCQkJbXBvcnQgPSBkcm1fZHBfbXN0X2dldF9wb3J0X3JlZl9s b2NrZWQocG9ydC0+bXN0YiwgdG9fZmluZCk7CisJCQlpZiAobXBvcnQpCisJCQkJcmV0dXJuIG1w b3J0OworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRybV9kcF9t c3RfcG9ydCAqZHJtX2RwX2dldF92YWxpZGF0ZWRfcG9ydF9yZWYoc3RydWN0IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpCit7CisJc3Ry dWN0IGRybV9kcF9tc3RfcG9ydCAqcnBvcnQgPSBOVUxMOworCW11dGV4X2xvY2soJm1nci0+bG9j ayk7CisJaWYgKG1nci0+bXN0X3ByaW1hcnkpCisJCXJwb3J0ID0gZHJtX2RwX21zdF9nZXRfcG9y dF9yZWZfbG9ja2VkKG1nci0+bXN0X3ByaW1hcnksIHBvcnQpOworCW11dGV4X3VubG9jaygmbWdy LT5sb2NrKTsKKwlyZXR1cm4gcnBvcnQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2RwX21zdF9w b3J0ICpkcm1fZHBfZ2V0X3BvcnQoc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiLCB1OCBw b3J0X251bSkKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0OworCisJbGlzdF9mb3Jf ZWFjaF9lbnRyeShwb3J0LCAmbXN0Yi0+cG9ydHMsIG5leHQpIHsKKwkJaWYgKHBvcnQtPnBvcnRf bnVtID09IHBvcnRfbnVtKSB7CisJCQlrcmVmX2dldCgmcG9ydC0+a3JlZik7CisJCQlyZXR1cm4g cG9ydDsKKwkJfQorCX0KKworCXJldHVybiBOVUxMOworfQorCisvKgorICogY2FsY3VsYXRlIGEg bmV3IFJBRCBmb3IgdGhpcyBNU1QgYnJhbmNoIGRldmljZQorICogaWYgcGFyZW50IGhhcyBhbiBM Q1Qgb2YgMiB0aGVuIGl0IGhhcyAxIG5pYmJsZSBvZiBSQUQsCisgKiBpZiBwYXJlbnQgaGFzIGFu IExDVCBvZiAzIHRoZW4gaXQgaGFzIDIgbmliYmxlcyBvZiBSQUQsCisgKi8KK3N0YXRpYyB1OCBk cm1fZHBfY2FsY3VsYXRlX3JhZChzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0LAorCQkJCSB1 OCAqcmFkKQoreworCWludCBsY3QgPSBwb3J0LT5wYXJlbnQtPmxjdDsKKwlpbnQgc2hpZnQgPSA0 OworCWludCBpZHggPSBsY3QgLyAyOworCWlmIChsY3QgPiAxKSB7CisJCW1lbWNweShyYWQsIHBv cnQtPnBhcmVudC0+cmFkLCBpZHgpOworCQlzaGlmdCA9IChsY3QgJSAyKSA/IDQgOiAwOworCX0g ZWxzZQorCQlyYWRbMF0gPSAwOworCisJcmFkW2lkeF0gfD0gcG9ydC0+cG9ydF9udW0gPDwgc2hp ZnQ7CisJcmV0dXJuIGxjdCArIDE7Cit9CisKKy8qCisgKiByZXR1cm4gc2VuZHMgbGluayBhZGRy ZXNzIGZvciBuZXcgbXN0YgorICovCitzdGF0aWMgYm9vbCBkcm1fZHBfcG9ydF9zZXR1cF9wZHQo c3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCkKK3sKKwlpbnQgcmV0OworCXU4IHJhZFs2XSwg bGN0OworCWJvb2wgc2VuZF9saW5rID0gZmFsc2U7CisJc3dpdGNoIChwb3J0LT5wZHQpIHsKKwlj YXNlIERQX1BFRVJfREVWSUNFX0RQX0xFR0FDWV9DT05WOgorCWNhc2UgRFBfUEVFUl9ERVZJQ0Vf U1NUX1NJTks6CisJCS8qIGFkZCBpMmMgb3ZlciBzaWRlYmFuZCAqLworCQlyZXQgPSBkcm1fZHBf bXN0X3JlZ2lzdGVyX2kyY19idXMoJnBvcnQtPmF1eCk7CisJCWJyZWFrOworCWNhc2UgRFBfUEVF Ul9ERVZJQ0VfTVNUX0JSQU5DSElORzoKKwkJbGN0ID0gZHJtX2RwX2NhbGN1bGF0ZV9yYWQocG9y dCwgcmFkKTsKKworCQlwb3J0LT5tc3RiID0gZHJtX2RwX2FkZF9tc3RfYnJhbmNoX2RldmljZShs Y3QsIHJhZCk7CisJCXBvcnQtPm1zdGItPm1nciA9IHBvcnQtPm1ncjsKKwkJcG9ydC0+bXN0Yi0+ cG9ydF9wYXJlbnQgPSBwb3J0OworCisJCXNlbmRfbGluayA9IHRydWU7CisJCWJyZWFrOworCX0K KwlyZXR1cm4gc2VuZF9saW5rOworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfY2hlY2tfcG9ydF9n dWlkKHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCQkgICBzdHJ1Y3QgZHJtX2Rw X21zdF9wb3J0ICpwb3J0KQoreworCWludCByZXQ7CisJaWYgKHBvcnQtPmRwY2RfcmV2ID49IDB4 MTIpIHsKKwkJcG9ydC0+Z3VpZF92YWxpZCA9IGRybV9kcF92YWxpZGF0ZV9ndWlkKG1zdGItPm1n ciwgcG9ydC0+Z3VpZCk7CisJCWlmICghcG9ydC0+Z3VpZF92YWxpZCkgeworCQkJcmV0ID0gZHJt X2RwX3NlbmRfZHBjZF93cml0ZShtc3RiLT5tZ3IsCisJCQkJCQkgICAgIHBvcnQsCisJCQkJCQkg ICAgIERQX0dVSUQsCisJCQkJCQkgICAgIDE2LCBwb3J0LT5ndWlkKTsKKwkJCXBvcnQtPmd1aWRf dmFsaWQgPSB0cnVlOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBidWlsZF9tc3RfcHJvcF9w YXRoKHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsCisJCQkJc3RydWN0IGRybV9kcF9tc3Rf YnJhbmNoICptc3RiLAorCQkJCWNoYXIgKnByb3BwYXRoKQoreworCWludCBpOworCWNoYXIgdGVt cFs4XTsKKwlzbnByaW50Zihwcm9wcGF0aCwgMjU1LCAibXN0OiVkIiwgbXN0Yi0+bWdyLT5jb25u X2Jhc2VfaWQpOworCWZvciAoaSA9IDA7IGkgPCAobXN0Yi0+bGN0IC0gMSk7IGkrKykgeworCQlp bnQgc2hpZnQgPSAoaSAlIDIpID8gMCA6IDQ7CisJCWludCBwb3J0X251bSA9IG1zdGItPnJhZFtp IC8gMl0gPj4gc2hpZnQ7CisJCXNucHJpbnRmKHRlbXAsIDgsICItJWQiLCBwb3J0X251bSk7CisJ CXN0cm5jYXQocHJvcHBhdGgsIHRlbXAsIDI1NSk7CisJfQorCXNucHJpbnRmKHRlbXAsIDgsICIt JWQiLCBwb3J0LT5wb3J0X251bSk7CisJc3RybmNhdChwcm9wcGF0aCwgdGVtcCwgMjU1KTsKK30K Kworc3RhdGljIHZvaWQgZHJtX2RwX2FkZF9wb3J0KHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAq bXN0YiwKKwkJCSAgICBzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkgICAgc3RydWN0IGRybV9kcF9s aW5rX2FkZHJfcmVwbHlfcG9ydCAqcG9ydF9tc2cpCit7CisJc3RydWN0IGRybV9kcF9tc3RfcG9y dCAqcG9ydDsKKwlib29sIHJldDsKKwlib29sIGNyZWF0ZWQgPSBmYWxzZTsKKwlpbnQgb2xkX3Bk dCA9IDA7CisJaW50IG9sZF9kZHBzID0gMDsKKwlwb3J0ID0gZHJtX2RwX2dldF9wb3J0KG1zdGIs IHBvcnRfbXNnLT5wb3J0X251bWJlcik7CisJaWYgKCFwb3J0KSB7CisJCXBvcnQgPSBremFsbG9j KHNpemVvZigqcG9ydCksIEdGUF9LRVJORUwpOworCQlpZiAoIXBvcnQpCisJCQlyZXR1cm47CisJ CWtyZWZfaW5pdCgmcG9ydC0+a3JlZik7CisJCXBvcnQtPnBhcmVudCA9IG1zdGI7CisJCXBvcnQt PnBvcnRfbnVtID0gcG9ydF9tc2ctPnBvcnRfbnVtYmVyOworCQlwb3J0LT5tZ3IgPSBtc3RiLT5t Z3I7CisJCXBvcnQtPmF1eC5uYW1lID0gIkRQTVNUIjsKKwkJcG9ydC0+YXV4LmRldiA9IGRldjsK KwkJY3JlYXRlZCA9IHRydWU7CisJfSBlbHNlIHsKKwkJb2xkX3BkdCA9IHBvcnQtPnBkdDsKKwkJ b2xkX2RkcHMgPSBwb3J0LT5kZHBzOworCX0KKworCXBvcnQtPnBkdCA9IHBvcnRfbXNnLT5wZWVy X2RldmljZV90eXBlOworCXBvcnQtPmlucHV0ID0gcG9ydF9tc2ctPmlucHV0X3BvcnQ7CisJcG9y dC0+bWNzID0gcG9ydF9tc2ctPm1jczsKKwlwb3J0LT5kZHBzID0gcG9ydF9tc2ctPmRkcHM7CisJ cG9ydC0+bGRwcyA9IHBvcnRfbXNnLT5sZWdhY3lfZGV2aWNlX3BsdWdfc3RhdHVzOworCXBvcnQt PmRwY2RfcmV2ID0gcG9ydF9tc2ctPmRwY2RfcmV2aXNpb247CisKKwltZW1jcHkocG9ydC0+Z3Vp ZCwgcG9ydF9tc2ctPnBlZXJfZ3VpZCwgMTYpOworCisJLyogbWFuYWdlIG1zdGIgcG9ydCBsaXN0 cyB3aXRoIG1nciBsb2NrIC0gdGFrZSBhIHJlZmVyZW5jZQorCSAgIGZvciB0aGlzIGxpc3QgKi8K KwlpZiAoY3JlYXRlZCkgeworCQltdXRleF9sb2NrKCZtc3RiLT5tZ3ItPmxvY2spOworCQlrcmVm X2dldCgmcG9ydC0+a3JlZik7CisJCWxpc3RfYWRkKCZwb3J0LT5uZXh0LCAmbXN0Yi0+cG9ydHMp OworCQltdXRleF91bmxvY2soJm1zdGItPm1nci0+bG9jayk7CisJfQorCisJaWYgKG9sZF9kZHBz ICE9IHBvcnQtPmRkcHMpIHsKKwkJaWYgKHBvcnQtPmRkcHMpIHsKKwkJCWRybV9kcF9jaGVja19w b3J0X2d1aWQobXN0YiwgcG9ydCk7CisJCQlpZiAoIXBvcnQtPmlucHV0KQorCQkJCWRybV9kcF9z ZW5kX2VudW1fcGF0aF9yZXNvdXJjZXMobXN0Yi0+bWdyLCBtc3RiLCBwb3J0KTsKKwkJfSBlbHNl IHsKKwkJCXBvcnQtPmd1aWRfdmFsaWQgPSBmYWxzZTsKKwkJCXBvcnQtPmF2YWlsYWJsZV9wYm4g PSAwOworCQkJfQorCX0KKworCWlmIChvbGRfcGR0ICE9IHBvcnQtPnBkdCAmJiAhcG9ydC0+aW5w dXQpIHsKKwkJZHJtX2RwX3BvcnRfdGVhcmRvd25fcGR0KHBvcnQsIG9sZF9wZHQpOworCisJCXJl dCA9IGRybV9kcF9wb3J0X3NldHVwX3BkdChwb3J0KTsKKwkJaWYgKHJldCA9PSB0cnVlKSB7CisJ CQlkcm1fZHBfc2VuZF9saW5rX2FkZHJlc3MobXN0Yi0+bWdyLCBwb3J0LT5tc3RiKTsKKwkJCXBv cnQtPm1zdGItPmxpbmtfYWRkcmVzc19zZW50ID0gdHJ1ZTsKKwkJfQorCX0KKworCWlmIChjcmVh dGVkICYmICFwb3J0LT5pbnB1dCkgeworCQljaGFyIHByb3BwYXRoWzI1NV07CisJCWJ1aWxkX21z dF9wcm9wX3BhdGgocG9ydCwgbXN0YiwgcHJvcHBhdGgpOworCQlwb3J0LT5jb25uZWN0b3IgPSAo Km1zdGItPm1nci0+Y2JzLT5hZGRfY29ubmVjdG9yKShtc3RiLT5tZ3IsIHBvcnQsIHByb3BwYXRo KTsKKwl9CisKKwkvKiBwdXQgcmVmZXJlbmNlIHRvIHRoaXMgcG9ydCAqLworCWRybV9kcF9wdXRf cG9ydChwb3J0KTsKK30KKworc3RhdGljIHZvaWQgZHJtX2RwX3VwZGF0ZV9wb3J0KHN0cnVjdCBk cm1fZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCSAgICAgICBzdHJ1Y3QgZHJtX2RwX2Nvbm5lY3Rp b25fc3RhdHVzX25vdGlmeSAqY29ubl9zdGF0KQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQg KnBvcnQ7CisJaW50IG9sZF9wZHQ7CisJaW50IG9sZF9kZHBzOworCWJvb2wgZG93b3JrID0gZmFs c2U7CisJcG9ydCA9IGRybV9kcF9nZXRfcG9ydChtc3RiLCBjb25uX3N0YXQtPnBvcnRfbnVtYmVy KTsKKwlpZiAoIXBvcnQpCisJCXJldHVybjsKKworCW9sZF9kZHBzID0gcG9ydC0+ZGRwczsKKwlv bGRfcGR0ID0gcG9ydC0+cGR0OworCXBvcnQtPnBkdCA9IGNvbm5fc3RhdC0+cGVlcl9kZXZpY2Vf dHlwZTsKKwlwb3J0LT5tY3MgPSBjb25uX3N0YXQtPm1lc3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXM7 CisJcG9ydC0+bGRwcyA9IGNvbm5fc3RhdC0+bGVnYWN5X2RldmljZV9wbHVnX3N0YXR1czsKKwlw b3J0LT5kZHBzID0gY29ubl9zdGF0LT5kaXNwbGF5cG9ydF9kZXZpY2VfcGx1Z19zdGF0dXM7CisK KwlpZiAob2xkX2RkcHMgIT0gcG9ydC0+ZGRwcykgeworCQlpZiAocG9ydC0+ZGRwcykgeworCQkJ ZHJtX2RwX2NoZWNrX3BvcnRfZ3VpZChtc3RiLCBwb3J0KTsKKwkJCWRvd29yayA9IHRydWU7CisJ CX0gZWxzZSB7CisJCQlwb3J0LT5ndWlkX3ZhbGlkID0gZmFsc2U7CisJCQlwb3J0LT5hdmFpbGFi bGVfcGJuID0gMDsKKwkJfQorCX0KKwlpZiAob2xkX3BkdCAhPSBwb3J0LT5wZHQgJiYgIXBvcnQt PmlucHV0KSB7CisJCWRybV9kcF9wb3J0X3RlYXJkb3duX3BkdChwb3J0LCBvbGRfcGR0KTsKKwor CQlpZiAoZHJtX2RwX3BvcnRfc2V0dXBfcGR0KHBvcnQpKQorCQkJZG93b3JrID0gdHJ1ZTsKKwl9 CisKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7CisJaWYgKGRvd29yaykKKwkJcXVldWVfd29yayhz eXN0ZW1fbG9uZ193cSwgJm1zdGItPm1nci0+d29yayk7CisKK30KKworc3RhdGljIHN0cnVjdCBk cm1fZHBfbXN0X2JyYW5jaCAqZHJtX2RwX2dldF9tc3RfYnJhbmNoX2RldmljZShzdHJ1Y3QgZHJt X2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkJCQkgICAgICAgdTggbGN0LCB1OCAqcmFk KQoreworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YjsKKwlzdHJ1Y3QgZHJtX2RwX21z dF9wb3J0ICpwb3J0OworCWludCBpOworCS8qIGZpbmQgdGhlIHBvcnQgYnkgaXRlcmF0aW5nIGRv d24gKi8KKwltc3RiID0gbWdyLT5tc3RfcHJpbWFyeTsKKworCWZvciAoaSA9IDA7IGkgPCBsY3Qg LSAxOyBpKyspIHsKKwkJaW50IHNoaWZ0ID0gKGkgJSAyKSA/IDAgOiA0OworCQlpbnQgcG9ydF9u dW0gPSByYWRbaSAvIDJdID4+IHNoaWZ0OworCisJCWxpc3RfZm9yX2VhY2hfZW50cnkocG9ydCwg Jm1zdGItPnBvcnRzLCBuZXh0KSB7CisJCQlpZiAocG9ydC0+cG9ydF9udW0gPT0gcG9ydF9udW0p IHsKKwkJCQlpZiAoIXBvcnQtPm1zdGIpIHsKKwkJCQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gbG9v a3VwIE1TVEIgd2l0aCBsY3QgJWQsIHJhZCAlMDJ4XG4iLCBsY3QsIHJhZFswXSk7CisJCQkJCXJl dHVybiBOVUxMOworCQkJCX0KKworCQkJCW1zdGIgPSBwb3J0LT5tc3RiOworCQkJCWJyZWFrOwor CQkJfQorCQl9CisJfQorCWtyZWZfZ2V0KCZtc3RiLT5rcmVmKTsKKwlyZXR1cm4gbXN0YjsKK30K Kworc3RhdGljIHZvaWQgZHJtX2RwX2NoZWNrX2FuZF9zZW5kX2xpbmtfYWRkcmVzcyhzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkJICAgICAgIHN0cnVjdCBkcm1fZHBf bXN0X2JyYW5jaCAqbXN0YikKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0OworCisJ aWYgKCFtc3RiLT5saW5rX2FkZHJlc3Nfc2VudCkgeworCQlkcm1fZHBfc2VuZF9saW5rX2FkZHJl c3MobWdyLCBtc3RiKTsKKwkJbXN0Yi0+bGlua19hZGRyZXNzX3NlbnQgPSB0cnVlOworCX0KKwls aXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZtc3RiLT5wb3J0cywgbmV4dCkgeworCQlpZiAocG9y dC0+aW5wdXQpCisJCQljb250aW51ZTsKKworCQlpZiAoIXBvcnQtPmRkcHMpCisJCQljb250aW51 ZTsKKworCQlpZiAoIXBvcnQtPmF2YWlsYWJsZV9wYm4pCisJCQlkcm1fZHBfc2VuZF9lbnVtX3Bh dGhfcmVzb3VyY2VzKG1nciwgbXN0YiwgcG9ydCk7CisKKwkJaWYgKHBvcnQtPm1zdGIpCisJCQlk cm1fZHBfY2hlY2tfYW5kX3NlbmRfbGlua19hZGRyZXNzKG1nciwgcG9ydC0+bXN0Yik7CisJfQor fQorCitzdGF0aWMgdm9pZCBkcm1fZHBfbXN0X2xpbmtfcHJvYmVfd29yayhzdHJ1Y3Qgd29ya19z dHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IgPSBj b250YWluZXJfb2Yod29yaywgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyLCB3b3JrKTsK KworCWRybV9kcF9jaGVja19hbmRfc2VuZF9saW5rX2FkZHJlc3MobWdyLCBtZ3ItPm1zdF9wcmlt YXJ5KTsKKworfQorCitzdGF0aWMgYm9vbCBkcm1fZHBfdmFsaWRhdGVfZ3VpZChzdHJ1Y3QgZHJt X2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgdTggKmd1aWQpCit7CisJc3RhdGljIHU4 IHplcm9fZ3VpZFsxNl07CisKKwlpZiAoIW1lbWNtcChndWlkLCB6ZXJvX2d1aWQsIDE2KSkgewor CQl1NjQgc2FsdCA9IGdldF9qaWZmaWVzXzY0KCk7CisJCW1lbWNweSgmZ3VpZFswXSwgJnNhbHQs IHNpemVvZih1NjQpKTsKKwkJbWVtY3B5KCZndWlkWzhdLCAmc2FsdCwgc2l6ZW9mKHU2NCkpOwor CQlyZXR1cm4gZmFsc2U7CisJfQorCXJldHVybiB0cnVlOworfQorCisjaWYgMAorc3RhdGljIGlu dCBidWlsZF9kcGNkX3JlYWQoc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKm1zZywgdTgg cG9ydF9udW0sIHUzMiBvZmZzZXQsIHU4IG51bV9ieXRlcykKK3sKKwlzdHJ1Y3QgZHJtX2RwX3Np ZGViYW5kX21zZ19yZXFfYm9keSByZXE7CisKKwlyZXEucmVxX3R5cGUgPSBEUF9SRU1PVEVfRFBD RF9SRUFEOworCXJlcS51LmRwY2RfcmVhZC5wb3J0X251bWJlciA9IHBvcnRfbnVtOworCXJlcS51 LmRwY2RfcmVhZC5kcGNkX2FkZHJlc3MgPSBvZmZzZXQ7CisJcmVxLnUuZHBjZF9yZWFkLm51bV9i eXRlcyA9IG51bV9ieXRlczsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcSgmcmVxLCBtc2cp OworCisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBkcm1fZHBfc2VuZF9zaWRl YmFuZF9tc2coc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICAgIGJv b2wgdXAsIHU4ICptc2csIGludCBsZW4pCit7CisJaW50IHJldDsKKwlpbnQgcmVnYmFzZSA9IHVw ID8gRFBfU0lERUJBTkRfTVNHX1VQX1JFUF9CQVNFIDogRFBfU0lERUJBTkRfTVNHX0RPV05fUkVR X0JBU0U7CisJaW50IHRvc2VuZCwgdG90YWwsIG9mZnNldDsKKwlpbnQgcmV0cmllcyA9IDA7CisK K3JldHJ5OgorCXRvdGFsID0gbGVuOworCW9mZnNldCA9IDA7CisJZG8geworCQl0b3NlbmQgPSBt aW4zKG1nci0+bWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXMsIDE2LCB0b3RhbCk7CisKKwkJbXV0 ZXhfbG9jaygmbWdyLT5hdXhfbG9jayk7CisJCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlKG1nci0+ YXV4LCByZWdiYXNlICsgb2Zmc2V0LAorCQkJCQkmbXNnW29mZnNldF0sCisJCQkJCXRvc2VuZCk7 CisJCW11dGV4X3VubG9jaygmbWdyLT5hdXhfbG9jayk7CisJCWlmIChyZXQgIT0gdG9zZW5kKSB7 CisJCQlpZiAocmV0ID09IC1FSU8gJiYgcmV0cmllcyA8IDUpIHsKKwkJCQlyZXRyaWVzKys7CisJ CQkJZ290byByZXRyeTsKKwkJCX0KKwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBkcGNkIHdy aXRlICVkICVkXG4iLCB0b3NlbmQsIHJldCk7CisJCQlXQVJOKDEsICJmYWlsXG4iKTsKKworCQkJ cmV0dXJuIC1FSU87CisJCX0KKwkJb2Zmc2V0ICs9IHRvc2VuZDsKKwkJdG90YWwgLT0gdG9zZW5k OworCX0gd2hpbGUgKHRvdGFsID4gMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2V0 X2hkcl9mcm9tX2RzdF9xbG9jayhzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgKmhkciwK KwkJCQkgIHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZykKK3sKKwlzdHJ1Y3Qg ZHJtX2RwX21zdF9icmFuY2ggKm1zdGIgPSB0eG1zZy0+ZHN0OworCisJLyogYm90aCBtc2cgc2xv dHMgYXJlIGZ1bGwgKi8KKwlpZiAodHhtc2ctPnNlcW5vID09IC0xKSB7CisJCWlmIChtc3RiLT50 eF9zbG90c1swXSAmJiBtc3RiLT50eF9zbG90c1sxXSkgeworCQkJRFJNX0RFQlVHX0tNUygiJXM6 IGZhaWxlZCB0byBmaW5kIHNsb3RcbiIsIF9fZnVuY19fKTsKKwkJCXJldHVybiAtRUFHQUlOOwor CQl9CisJCWlmIChtc3RiLT50eF9zbG90c1swXSA9PSBOVUxMICYmIG1zdGItPnR4X3Nsb3RzWzFd ID09IE5VTEwpIHsKKwkJCXR4bXNnLT5zZXFubyA9IG1zdGItPmxhc3Rfc2Vxbm87CisJCQltc3Ri LT5sYXN0X3NlcW5vIF49IDE7CisJCX0gZWxzZSBpZiAobXN0Yi0+dHhfc2xvdHNbMF0gPT0gTlVM TCkKKwkJCXR4bXNnLT5zZXFubyA9IDA7CisJCWVsc2UKKwkJCXR4bXNnLT5zZXFubyA9IDE7CisJ CW1zdGItPnR4X3Nsb3RzW3R4bXNnLT5zZXFub10gPSB0eG1zZzsKKwl9CisJaGRyLT5icm9hZGNh c3QgPSAwOworCWhkci0+cGF0aF9tc2cgPSB0eG1zZy0+cGF0aF9tc2c7CisJaGRyLT5sY3QgPSBt c3RiLT5sY3Q7CisJaGRyLT5sY3IgPSBtc3RiLT5sY3QgLSAxOworCWlmIChtc3RiLT5sY3QgPiAx KQorCQltZW1jcHkoaGRyLT5yYWQsIG1zdGItPnJhZCwgbXN0Yi0+bGN0IC8gMik7CisJaGRyLT5z ZXFubyA9IHR4bXNnLT5zZXFubzsKKwlyZXR1cm4gMDsKK30KKy8qCisgKiBwcm9jZXNzIGEgc2lu Z2xlIGJsb2NrIG9mIHRoZSBuZXh0IG1lc3NhZ2UgaW4gdGhlIHNpZGViYW5kIHF1ZXVlCisgKi8K K3N0YXRpYyBpbnQgcHJvY2Vzc19zaW5nbGVfdHhfcWxvY2soc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyICptZ3IsCisJCQkJICAgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4 bXNnLAorCQkJCSAgIGJvb2wgdXApCit7CisJdTggY2h1bmtbNDhdOworCXN0cnVjdCBkcm1fZHBf c2lkZWJhbmRfbXNnX2hkciBoZHI7CisJaW50IGxlbiwgc3BhY2UsIGlkeCwgdG9zZW5kOworCWlu dCByZXQ7CisKKwlpZiAodHhtc2ctPnN0YXRlID09IERSTV9EUF9TSURFQkFORF9UWF9RVUVVRUQp IHsKKwkJdHhtc2ctPnNlcW5vID0gLTE7CisJCXR4bXNnLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFO RF9UWF9TVEFSVF9TRU5EOworCX0KKworCS8qIG1ha2UgaGRyIGZyb20gZHN0IG1zdCAtIGZvciBy ZXBsaWVzIHVzZSBzZXFubworCSAgIG90aGVyd2lzZSBhc3NpZ24gb25lICovCisJcmV0ID0gc2V0 X2hkcl9mcm9tX2RzdF9xbG9jaygmaGRyLCB0eG1zZyk7CisJaWYgKHJldCA8IDApCisJCXJldHVy biByZXQ7CisKKwkvKiBhbW91bnQgbGVmdCB0byBzZW5kIGluIHRoaXMgbWVzc2FnZSAqLworCWxl biA9IHR4bXNnLT5jdXJfbGVuIC0gdHhtc2ctPmN1cl9vZmZzZXQ7CisKKwkvKiA0OCAtIHNpZGVi YW5kIG1zZyBzaXplIC0gMSBieXRlIGZvciBkYXRhIENSQywgeCBoZWFkZXIgYnl0ZXMgKi8KKwlz cGFjZSA9IDQ4IC0gMSAtIGRybV9kcF9jYWxjX3NiX2hkcl9zaXplKCZoZHIpOworCisJdG9zZW5k ID0gbWluKGxlbiwgc3BhY2UpOworCWlmIChsZW4gPT0gdHhtc2ctPmN1cl9sZW4pCisJCWhkci5z b210ID0gMTsKKwlpZiAoc3BhY2UgPj0gbGVuKQorCQloZHIuZW9tdCA9IDE7CisKKworCWhkci5t c2dfbGVuID0gdG9zZW5kICsgMTsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX21zZ19oZHIoJmhk ciwgY2h1bmssICZpZHgpOworCW1lbWNweSgmY2h1bmtbaWR4XSwgJnR4bXNnLT5tc2dbdHhtc2ct PmN1cl9vZmZzZXRdLCB0b3NlbmQpOworCS8qIGFkZCBjcmMgYXQgZW5kICovCisJZHJtX2RwX2Ny Y19zaWRlYmFuZF9jaHVua19yZXEoJmNodW5rW2lkeF0sIHRvc2VuZCk7CisJaWR4ICs9IHRvc2Vu ZCArIDE7CisKKwlyZXQgPSBkcm1fZHBfc2VuZF9zaWRlYmFuZF9tc2cobWdyLCB1cCwgY2h1bmss IGlkeCk7CisJaWYgKHJldCkgeworCQlEUk1fREVCVUdfS01TKCJzaWRlYmFuZCBtc2cgZmFpbGVk IHRvIHNlbmRcbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXR4bXNnLT5jdXJfb2Zmc2V0ICs9 IHRvc2VuZDsKKwlpZiAodHhtc2ctPmN1cl9vZmZzZXQgPT0gdHhtc2ctPmN1cl9sZW4pIHsKKwkJ dHhtc2ctPnN0YXRlID0gRFJNX0RQX1NJREVCQU5EX1RYX1NFTlQ7CisJCXJldHVybiAxOworCX0K KwlyZXR1cm4gMDsKK30KKworLyogbXVzdCBiZSBjYWxsZWQgaG9sZGluZyBxbG9jayAqLworc3Rh dGljIHZvaWQgcHJvY2Vzc19zaW5nbGVfZG93bl90eF9xbG9jayhzdHJ1Y3QgZHJtX2RwX21zdF90 b3BvbG9neV9tZ3IgKm1ncikKK3sKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHht c2c7CisJaW50IHJldDsKKworCS8qIGNvbnN0cnVjdCBhIGNodW5rIGZyb20gdGhlIGZpcnN0IG1z ZyBpbiB0aGUgdHhfbXNnIHF1ZXVlICovCisJaWYgKGxpc3RfZW1wdHkoJm1nci0+dHhfbXNnX2Rv d25xKSkgeworCQltZ3ItPnR4X2Rvd25faW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJcmV0dXJuOwor CX0KKwltZ3ItPnR4X2Rvd25faW5fcHJvZ3Jlc3MgPSB0cnVlOworCisJdHhtc2cgPSBsaXN0X2Zp cnN0X2VudHJ5KCZtZ3ItPnR4X21zZ19kb3ducSwgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2df dHgsIG5leHQpOworCXJldCA9IHByb2Nlc3Nfc2luZ2xlX3R4X3Fsb2NrKG1nciwgdHhtc2csIGZh bHNlKTsKKwlpZiAocmV0ID09IDEpIHsKKwkJLyogdHhtc2cgaXMgc2VudCBpdCBzaG91bGQgYmUg aW4gdGhlIHNsb3RzIG5vdyAqLworCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCX0gZWxzZSBp ZiAocmV0KSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBzZW5kIG1zZyBpbiBxICVkXG4i LCByZXQpOworCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCQlpZiAodHhtc2ctPnNlcW5vICE9 IC0xKQorCQkJdHhtc2ctPmRzdC0+dHhfc2xvdHNbdHhtc2ctPnNlcW5vXSA9IE5VTEw7CisJCXR4 bXNnLT5zdGF0ZSA9IERSTV9EUF9TSURFQkFORF9UWF9USU1FT1VUOworCQl3YWtlX3VwKCZtZ3It PnR4X3dhaXRxKTsKKwl9CisJaWYgKGxpc3RfZW1wdHkoJm1nci0+dHhfbXNnX2Rvd25xKSkgewor CQltZ3ItPnR4X2Rvd25faW5fcHJvZ3Jlc3MgPSBmYWxzZTsKKwkJcmV0dXJuOworCX0KK30KKwor LyogY2FsbGVkIGhvbGRpbmcgcWxvY2sgKi8KK3N0YXRpYyB2b2lkIHByb2Nlc3Nfc2luZ2xlX3Vw X3R4X3Fsb2NrKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCXN0cnVj dCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsKKwlpbnQgcmV0OworCisJLyogY29uc3Ry dWN0IGEgY2h1bmsgZnJvbSB0aGUgZmlyc3QgbXNnIGluIHRoZSB0eF9tc2cgcXVldWUgKi8KKwlp ZiAobGlzdF9lbXB0eSgmbWdyLT50eF9tc2dfdXBxKSkgeworCQltZ3ItPnR4X3VwX2luX3Byb2dy ZXNzID0gZmFsc2U7CisJCXJldHVybjsKKwl9CisKKwl0eG1zZyA9IGxpc3RfZmlyc3RfZW50cnko Jm1nci0+dHhfbXNnX3VwcSwgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHgsIG5leHQpOwor CXJldCA9IHByb2Nlc3Nfc2luZ2xlX3R4X3Fsb2NrKG1nciwgdHhtc2csIHRydWUpOworCWlmIChy ZXQgPT0gMSkgeworCQkvKiB1cCB0eG1zZ3MgYXJlbid0IHB1dCBpbiBzbG90cyAtIHNvIGZyZWUg YWZ0ZXIgd2Ugc2VuZCBpdCAqLworCQlsaXN0X2RlbCgmdHhtc2ctPm5leHQpOworCQlrZnJlZSh0 eG1zZyk7CisJfSBlbHNlIGlmIChyZXQpCisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBzZW5k IG1zZyBpbiBxICVkXG4iLCByZXQpOworCW1nci0+dHhfdXBfaW5fcHJvZ3Jlc3MgPSB0cnVlOwor fQorCitzdGF0aWMgdm9pZCBkcm1fZHBfcXVldWVfZG93bl90eChzdHJ1Y3QgZHJtX2RwX21zdF90 b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4 bXNnKQoreworCW11dGV4X2xvY2soJm1nci0+cWxvY2spOworCWxpc3RfYWRkX3RhaWwoJnR4bXNn LT5uZXh0LCAmbWdyLT50eF9tc2dfZG93bnEpOworCWlmICghbWdyLT50eF9kb3duX2luX3Byb2dy ZXNzKQorCQlwcm9jZXNzX3NpbmdsZV9kb3duX3R4X3Fsb2NrKG1ncik7CisJbXV0ZXhfdW5sb2Nr KCZtZ3ItPnFsb2NrKTsKK30KKworc3RhdGljIGludCBkcm1fZHBfc2VuZF9saW5rX2FkZHJlc3Mo c3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICAgIHN0cnVjdCBkcm1f ZHBfbXN0X2JyYW5jaCAqbXN0YikKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3R4ICp0eG1zZzsKKwlpbnQgcmV0OworCisJdHhtc2cgPSBremFsbG9jKHNpemVvZigq dHhtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwor CXR4bXNnLT5kc3QgPSBtc3RiOworCWxlbiA9IGJ1aWxkX2xpbmtfYWRkcmVzcyh0eG1zZyk7CisK Kwlkcm1fZHBfcXVldWVfZG93bl90eChtZ3IsIHR4bXNnKTsKKworCXJldCA9IGRybV9kcF9tc3Rf d2FpdF90eF9yZXBseShtc3RiLCB0eG1zZyk7CisJaWYgKHJldCA+IDApIHsKKwkJaW50IGk7CisK KwkJaWYgKHR4bXNnLT5yZXBseS5yZXBseV90eXBlID09IDEpCisJCQlEUk1fREVCVUdfS01TKCJs aW5rIGFkZHJlc3MgbmFrIHJlY2VpdmVkXG4iKTsKKwkJZWxzZSB7CisJCQlEUk1fREVCVUdfS01T KCJsaW5rIGFkZHJlc3MgcmVwbHk6ICVkXG4iLCB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIubnBv cnRzKTsKKwkJCWZvciAoaSA9IDA7IGkgPCB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIubnBvcnRz OyBpKyspIHsKKwkJCQlEUk1fREVCVUdfS01TKCJwb3J0ICVkOiBpbnB1dCAlZCwgcGR0OiAlZCwg cG46ICVkLCBkcGNkX3JldjogJTAyeCwgbWNzOiAlZCwgZGRwczogJWQsIGxkcHMgJWRcbiIsIGks CisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51LmxpbmtfYWRkci5wb3J0c1tpXS5pbnB1dF9wb3J0 LAorCQkJCSAgICAgICB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIucG9ydHNbaV0ucGVlcl9kZXZp Y2VfdHlwZSwKKwkJCQkgICAgICAgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRzW2ldLnBv cnRfbnVtYmVyLAorCQkJCSAgICAgICB0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIucG9ydHNbaV0u ZHBjZF9yZXZpc2lvbiwKKwkJCQkgICAgICAgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRz W2ldLm1jcywKKwkJCQkgICAgICAgdHhtc2ctPnJlcGx5LnUubGlua19hZGRyLnBvcnRzW2ldLmRk cHMsCisJCQkJICAgICAgIHR4bXNnLT5yZXBseS51LmxpbmtfYWRkci5wb3J0c1tpXS5sZWdhY3lf ZGV2aWNlX3BsdWdfc3RhdHVzKTsKKwkJCX0KKwkJCWZvciAoaSA9IDA7IGkgPCB0eG1zZy0+cmVw bHkudS5saW5rX2FkZHIubnBvcnRzOyBpKyspIHsKKwkJCQlkcm1fZHBfYWRkX3BvcnQobXN0Yiwg bWdyLT5kZXYsICZ0eG1zZy0+cmVwbHkudS5saW5rX2FkZHIucG9ydHNbaV0pOworCQkJfQorCQkJ KCptZ3ItPmNicy0+aG90cGx1ZykobWdyKTsKKwkJfQorCX0gZWxzZQorCQlEUk1fREVCVUdfS01T KCJsaW5rIGFkZHJlc3MgZmFpbGVkICVkXG4iLCByZXQpOworCisJa2ZyZWUodHhtc2cpOworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IGRybV9kcF9zZW5kX2VudW1fcGF0aF9yZXNvdXJjZXMo c3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJCSAgIHN0cnVjdCBkcm1f ZHBfbXN0X2JyYW5jaCAqbXN0YiwKKwkJCQkJICAgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9y dCkKK3sKKwlpbnQgbGVuOworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsK KwlpbnQgcmV0OworCisJdHhtc2cgPSBremFsbG9jKHNpemVvZigqdHhtc2cpLCBHRlBfS0VSTkVM KTsKKwlpZiAoIXR4bXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXR4bXNnLT5kc3QgPSBtc3Ri OworCWxlbiA9IGJ1aWxkX2VudW1fcGF0aF9yZXNvdXJjZXModHhtc2csIHBvcnQtPnBvcnRfbnVt KTsKKworCWRybV9kcF9xdWV1ZV9kb3duX3R4KG1nciwgdHhtc2cpOworCisJcmV0ID0gZHJtX2Rw X21zdF93YWl0X3R4X3JlcGx5KG1zdGIsIHR4bXNnKTsKKwlpZiAocmV0ID4gMCkgeworCQlpZiAo dHhtc2ctPnJlcGx5LnJlcGx5X3R5cGUgPT0gMSkKKwkJCURSTV9ERUJVR19LTVMoImVudW0gcGF0 aCByZXNvdXJjZXMgbmFrIHJlY2VpdmVkXG4iKTsKKwkJZWxzZSB7CisJCQlpZiAocG9ydC0+cG9y dF9udW0gIT0gdHhtc2ctPnJlcGx5LnUucGF0aF9yZXNvdXJjZXMucG9ydF9udW1iZXIpCisJCQkJ RFJNX0VSUk9SKCJnb3QgaW5jb3JyZWN0IHBvcnQgaW4gcmVzcG9uc2VcbiIpOworCQkJRFJNX0RF QlVHX0tNUygiZW51bSBwYXRoIHJlc291cmNlcyAlZDogJWQgJWRcbiIsIHR4bXNnLT5yZXBseS51 LnBhdGhfcmVzb3VyY2VzLnBvcnRfbnVtYmVyLCB0eG1zZy0+cmVwbHkudS5wYXRoX3Jlc291cmNl cy5mdWxsX3BheWxvYWRfYndfbnVtYmVyLAorCQkJICAgICAgIHR4bXNnLT5yZXBseS51LnBhdGhf cmVzb3VyY2VzLmF2YWlsX3BheWxvYWRfYndfbnVtYmVyKTsKKwkJCXBvcnQtPmF2YWlsYWJsZV9w Ym4gPSB0eG1zZy0+cmVwbHkudS5wYXRoX3Jlc291cmNlcy5hdmFpbF9wYXlsb2FkX2J3X251bWJl cjsKKwkJfQorCX0KKworCWtmcmVlKHR4bXNnKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRybV9k cF9wYXlsb2FkX3NlbmRfbXNnKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAor CQkJICAgIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsCisJCQkgICAgaW50IGlkLAorCQkJ ICAgIGludCBwYm4pCit7CisJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfdHggKnR4bXNnOwor CXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0YjsKKwlpbnQgbGVuLCByZXQ7CisKKwltc3Ri ID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfbXN0Yl9yZWYobWdyLCBwb3J0LT5wYXJlbnQpOworCWlm ICghbXN0YikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0eG1zZyA9IGt6YWxsb2Moc2l6ZW9mKCp0 eG1zZyksIEdGUF9LRVJORUwpOworCWlmICghdHhtc2cpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJ Z290byBmYWlsX3B1dDsKKwl9CisKKwl0eG1zZy0+ZHN0ID0gbXN0YjsKKwlsZW4gPSBidWlsZF9h bGxvY2F0ZV9wYXlsb2FkKHR4bXNnLCBwb3J0LT5wb3J0X251bSwKKwkJCQkgICAgIGlkLAorCQkJ CSAgICAgcGJuKTsKKworCWRybV9kcF9xdWV1ZV9kb3duX3R4KG1nciwgdHhtc2cpOworCisJcmV0 ID0gZHJtX2RwX21zdF93YWl0X3R4X3JlcGx5KG1zdGIsIHR4bXNnKTsKKwlpZiAocmV0ID4gMCkg eworCQlpZiAodHhtc2ctPnJlcGx5LnJlcGx5X3R5cGUgPT0gMSkgeworCQkJcmV0ID0gLUVJTlZB TDsKKwkJfSBlbHNlCisJCQlyZXQgPSAwOworCX0KKwlrZnJlZSh0eG1zZyk7CitmYWlsX3B1dDoK Kwlkcm1fZHBfcHV0X21zdF9icmFuY2hfZGV2aWNlKG1zdGIpOworCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyBpbnQgZHJtX2RwX2NyZWF0ZV9wYXlsb2FkX3N0ZXAxKHN0cnVjdCBkcm1fZHBfbXN0 X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAgICAgICBpbnQgaWQsCisJCQkJICAgICAgIHN0cnVj dCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZCkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gZHJtX2Rw X2RwY2Rfd3JpdGVfcGF5bG9hZChtZ3IsIGlkLCBwYXlsb2FkKTsKKwlpZiAocmV0IDwgMCkgewor CQlwYXlsb2FkLT5wYXlsb2FkX3N0YXRlID0gMDsKKwkJcmV0dXJuIHJldDsKKwl9CisJcGF5bG9h ZC0+cGF5bG9hZF9zdGF0ZSA9IERQX1BBWUxPQURfTE9DQUw7CisJcmV0dXJuIDA7Cit9CisKK2lu dCBkcm1fZHBfY3JlYXRlX3BheWxvYWRfc3RlcDIoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lf bWdyICptZ3IsCisJCQkJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQlpbnQgaWQs CisJCQkJc3RydWN0IGRybV9kcF9wYXlsb2FkICpwYXlsb2FkKQoreworCWludCByZXQ7CisJcmV0 ID0gZHJtX2RwX3BheWxvYWRfc2VuZF9tc2cobWdyLCBwb3J0LCBpZCwgcG9ydC0+dmNwaS5wYm4p OworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCXBheWxvYWQtPnBheWxvYWRfc3RhdGUg PSBEUF9QQVlMT0FEX1JFTU9URTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgZHJtX2RwX2Rlc3Ry b3lfcGF5bG9hZF9zdGVwMShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJ CQkgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCwKKwkJCQkgaW50IGlkLAorCQkJCSBzdHJ1 Y3QgZHJtX2RwX3BheWxvYWQgKnBheWxvYWQpCit7CisJRFJNX0RFQlVHX0tNUygiXG4iKTsKKwkv KiBpdHMgb2theSBmb3IgdGhlc2UgdG8gZmFpbCAqLworCWlmIChwb3J0KSB7CisJCWRybV9kcF9w YXlsb2FkX3NlbmRfbXNnKG1nciwgcG9ydCwgaWQsIDApOworCX0KKworCWRybV9kcF9kcGNkX3dy aXRlX3BheWxvYWQobWdyLCBpZCwgcGF5bG9hZCk7CisJcGF5bG9hZC0+cGF5bG9hZF9zdGF0ZSA9 IDA7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkcm1fZHBfZGVzdHJveV9wYXlsb2FkX3N0ZXAyKHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSBpbnQgaWQsCisJCQkJIHN0 cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZCkKK3sKKwlwYXlsb2FkLT5wYXlsb2FkX3N0YXRl ID0gMDsKKwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkcm1fZHBfdXBkYXRlX3BheWxvYWRfcGFy dDEoKSAtIEV4ZWN1dGUgcGF5bG9hZCB1cGRhdGUgcGFydCAxCisgKiBAbWdyOiBtYW5hZ2VyIHRv IHVzZS4KKyAqCisgKiBUaGlzIGl0ZXJhdGVzIG92ZXIgYWxsIHByb3Bvc2VkIHZpcnR1YWwgY2hh bm5lbHMsIGFuZCB0cmllcyB0bworICogYWxsb2NhdGUgc3BhY2UgaW4gdGhlIGxpbmsgZm9yIHRo ZW0uIEZvciAwLT5zbG90cyB0cmFuc2l0aW9ucywKKyAqIHRoaXMgc3RlcCBqdXN0IHdyaXRlcyB0 aGUgVkNQSSB0byB0aGUgTVNUIGRldmljZS4gRm9yIHNsb3RzLT4wCisgKiB0cmFuc2l0aW9ucywg dGhpcyB3cml0ZXMgdGhlIHVwZGF0ZWQgVkNQSXMgYW5kIHJlbW92ZXMgdGhlCisgKiByZW1vdGUg VkMgcGF5bG9hZHMuCisgKgorICogYWZ0ZXIgY2FsbGluZyB0aGlzIHRoZSBkcml2ZXIgc2hvdWxk IGdlbmVyYXRlIEFDVCBhbmQgcGF5bG9hZAorICogcGFja2V0cy4KKyAqLworaW50IGRybV9kcF91 cGRhdGVfcGF5bG9hZF9wYXJ0MShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncikK K3sKKwlpbnQgaTsKKwlpbnQgY3VyX3Nsb3RzID0gMTsKKwlzdHJ1Y3QgZHJtX2RwX3BheWxvYWQg cmVxX3BheWxvYWQ7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsKKworCW11dGV4X2xv Y2soJm1nci0+cGF5bG9hZF9sb2NrKTsKKwlmb3IgKGkgPSAwOyBpIDwgbWdyLT5tYXhfcGF5bG9h ZHM7IGkrKykgeworCQkvKiBzb2x2ZSB0aGUgY3VycmVudCBwYXlsb2FkcyAtIGNvbXBhcmUgdG8g dGhlIGh3IG9uZXMKKwkJICAgLSB1cGRhdGUgdGhlIGh3IHZpZXcgKi8KKwkJcmVxX3BheWxvYWQu c3RhcnRfc2xvdCA9IGN1cl9zbG90czsKKwkJaWYgKG1nci0+cHJvcG9zZWRfdmNwaXNbaV0pIHsK KwkJCXBvcnQgPSBjb250YWluZXJfb2YobWdyLT5wcm9wb3NlZF92Y3Bpc1tpXSwgc3RydWN0IGRy bV9kcF9tc3RfcG9ydCwgdmNwaSk7CisJCQlyZXFfcGF5bG9hZC5udW1fc2xvdHMgPSBtZ3ItPnBy b3Bvc2VkX3ZjcGlzW2ldLT5udW1fc2xvdHM7CisJCX0gZWxzZSB7CisJCQlwb3J0ID0gTlVMTDsK KwkJCXJlcV9wYXlsb2FkLm51bV9zbG90cyA9IDA7CisJCX0KKwkJLyogd29yayBvdXQgd2hhdCBp cyByZXF1aXJlZCB0byBoYXBwZW4gd2l0aCB0aGlzIHBheWxvYWQgKi8KKwkJaWYgKG1nci0+cGF5 bG9hZHNbaV0uc3RhcnRfc2xvdCAhPSByZXFfcGF5bG9hZC5zdGFydF9zbG90IHx8CisJCSAgICBt Z3ItPnBheWxvYWRzW2ldLm51bV9zbG90cyAhPSByZXFfcGF5bG9hZC5udW1fc2xvdHMpIHsKKwor CQkJLyogbmVlZCB0byBwdXNoIGFuIHVwZGF0ZSBmb3IgdGhpcyBwYXlsb2FkICovCisJCQlpZiAo cmVxX3BheWxvYWQubnVtX3Nsb3RzKSB7CisJCQkJZHJtX2RwX2NyZWF0ZV9wYXlsb2FkX3N0ZXAx KG1nciwgaSArIDEsICZyZXFfcGF5bG9hZCk7CisJCQkJbWdyLT5wYXlsb2Fkc1tpXS5udW1fc2xv dHMgPSByZXFfcGF5bG9hZC5udW1fc2xvdHM7CisJCQl9IGVsc2UgaWYgKG1nci0+cGF5bG9hZHNb aV0ubnVtX3Nsb3RzKSB7CisJCQkJbWdyLT5wYXlsb2Fkc1tpXS5udW1fc2xvdHMgPSAwOworCQkJ CWRybV9kcF9kZXN0cm95X3BheWxvYWRfc3RlcDEobWdyLCBwb3J0LCBpICsgMSwgJm1nci0+cGF5 bG9hZHNbaV0pOworCQkJCXJlcV9wYXlsb2FkLnBheWxvYWRfc3RhdGUgPSBtZ3ItPnBheWxvYWRz W2ldLnBheWxvYWRfc3RhdGU7CisJCQl9CisJCQltZ3ItPnBheWxvYWRzW2ldLnN0YXJ0X3Nsb3Qg PSByZXFfcGF5bG9hZC5zdGFydF9zbG90OworCQkJbWdyLT5wYXlsb2Fkc1tpXS5wYXlsb2FkX3N0 YXRlID0gcmVxX3BheWxvYWQucGF5bG9hZF9zdGF0ZTsKKwkJfQorCQljdXJfc2xvdHMgKz0gcmVx X3BheWxvYWQubnVtX3Nsb3RzOworCX0KKwltdXRleF91bmxvY2soJm1nci0+cGF5bG9hZF9sb2Nr KTsKKworCXJldHVybiAwOworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfdXBkYXRlX3BheWxvYWRf cGFydDEpOworCisvKioKKyAqIGRybV9kcF91cGRhdGVfcGF5bG9hZF9wYXJ0MigpIC0gRXhlY3V0 ZSBwYXlsb2FkIHVwZGF0ZSBwYXJ0IDIKKyAqIEBtZ3I6IG1hbmFnZXIgdG8gdXNlLgorICoKKyAq IFRoaXMgaXRlcmF0ZXMgb3ZlciBhbGwgcHJvcG9zZWQgdmlydHVhbCBjaGFubmVscywgYW5kIHRy aWVzIHRvCisgKiBhbGxvY2F0ZSBzcGFjZSBpbiB0aGUgbGluayBmb3IgdGhlbS4gRm9yIDAtPnNs b3RzIHRyYW5zaXRpb25zLAorICogdGhpcyBzdGVwIHdyaXRlcyB0aGUgcmVtb3RlIFZDIHBheWxv YWQgY29tbWFuZHMuIEZvciBzbG90cy0+MAorICogdGhpcyBqdXN0IHJlc2V0cyBzb21lIGludGVy bmFsIHN0YXRlLgorICovCitpbnQgZHJtX2RwX3VwZGF0ZV9wYXlsb2FkX3BhcnQyKHN0cnVjdCBk cm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCXN0cnVjdCBkcm1fZHBfbXN0X3BvcnQg KnBvcnQ7CisJaW50IGk7CisJaW50IHJldDsKKwltdXRleF9sb2NrKCZtZ3ItPnBheWxvYWRfbG9j ayk7CisJZm9yIChpID0gMDsgaSA8IG1nci0+bWF4X3BheWxvYWRzOyBpKyspIHsKKworCQlpZiAo IW1nci0+cHJvcG9zZWRfdmNwaXNbaV0pCisJCQljb250aW51ZTsKKworCQlwb3J0ID0gY29udGFp bmVyX29mKG1nci0+cHJvcG9zZWRfdmNwaXNbaV0sIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQsIHZj cGkpOworCisJCURSTV9ERUJVR19LTVMoInBheWxvYWQgJWQgJWRcbiIsIGksIG1nci0+cGF5bG9h ZHNbaV0ucGF5bG9hZF9zdGF0ZSk7CisJCWlmIChtZ3ItPnBheWxvYWRzW2ldLnBheWxvYWRfc3Rh dGUgPT0gRFBfUEFZTE9BRF9MT0NBTCkgeworCQkJcmV0ID0gZHJtX2RwX2NyZWF0ZV9wYXlsb2Fk X3N0ZXAyKG1nciwgcG9ydCwgaSArIDEsICZtZ3ItPnBheWxvYWRzW2ldKTsKKwkJfSBlbHNlIGlm IChtZ3ItPnBheWxvYWRzW2ldLnBheWxvYWRfc3RhdGUgPT0gRFBfUEFZTE9BRF9ERUxFVEVfTE9D QUwpIHsKKwkJCXJldCA9IGRybV9kcF9kZXN0cm95X3BheWxvYWRfc3RlcDIobWdyLCBpICsgMSwg Jm1nci0+cGF5bG9hZHNbaV0pOworCQl9CisJCWlmIChyZXQpIHsKKwkJCW11dGV4X3VubG9jaygm bWdyLT5wYXlsb2FkX2xvY2spOworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwltdXRleF91bmxv Y2soJm1nci0+cGF5bG9hZF9sb2NrKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJt X2RwX3VwZGF0ZV9wYXlsb2FkX3BhcnQyKTsKKworI2lmIDAgLyogdW51c2VkIGFzIG9mIHlldCAq Lworc3RhdGljIGludCBkcm1fZHBfc2VuZF9kcGNkX3JlYWQoc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyICptZ3IsCisJCQkJIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsCisJCQkJ IGludCBvZmZzZXQsIGludCBzaXplKQoreworCWludCBsZW47CisJc3RydWN0IGRybV9kcF9zaWRl YmFuZF9tc2dfdHggKnR4bXNnOworCisJdHhtc2cgPSBremFsbG9jKHNpemVvZigqdHhtc2cpLCBH RlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxlbiA9IGJ1 aWxkX2RwY2RfcmVhZCh0eG1zZywgcG9ydC0+cG9ydF9udW0sIDAsIDgpOworCXR4bXNnLT5kc3Qg PSBwb3J0LT5wYXJlbnQ7CisKKwlkcm1fZHBfcXVldWVfZG93bl90eChtZ3IsIHR4bXNnKTsKKwor CXJldHVybiAwOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZHJtX2RwX3NlbmRfZHBjZF93cml0 ZShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgIHN0cnVjdCBkcm1f ZHBfbXN0X3BvcnQgKnBvcnQsCisJCQkJICBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgdTggKmJ5dGVz KQoreworCWludCBsZW47CisJaW50IHJldDsKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190 eCAqdHhtc2c7CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICptc3RiOworCisJbXN0YiA9IGRy bV9kcF9nZXRfdmFsaWRhdGVkX21zdGJfcmVmKG1nciwgcG9ydC0+cGFyZW50KTsKKwlpZiAoIW1z dGIpCisJCXJldHVybiAtRUlOVkFMOworCisJdHhtc2cgPSBremFsbG9jKHNpemVvZigqdHhtc2cp LCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8g ZmFpbF9wdXQ7CisJfQorCisJbGVuID0gYnVpbGRfZHBjZF93cml0ZSh0eG1zZywgcG9ydC0+cG9y dF9udW0sIG9mZnNldCwgc2l6ZSwgYnl0ZXMpOworCXR4bXNnLT5kc3QgPSBtc3RiOworCisJZHJt X2RwX3F1ZXVlX2Rvd25fdHgobWdyLCB0eG1zZyk7CisKKwlyZXQgPSBkcm1fZHBfbXN0X3dhaXRf dHhfcmVwbHkobXN0YiwgdHhtc2cpOworCWlmIChyZXQgPiAwKSB7CisJCWlmICh0eG1zZy0+cmVw bHkucmVwbHlfdHlwZSA9PSAxKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQl9IGVsc2UKKwkJCXJl dCA9IDA7CisJfQorCWtmcmVlKHR4bXNnKTsKK2ZhaWxfcHV0OgorCWRybV9kcF9wdXRfbXN0X2Jy YW5jaF9kZXZpY2UobXN0Yik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcm1fZHBf ZW5jb2RlX3VwX2Fja19yZXBseShzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqbXNnLCB1 OCByZXFfdHlwZSkKK3sKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yZXBseV9ib2R5IHJl cGx5OworCisJcmVwbHkucmVwbHlfdHlwZSA9IDE7CisJcmVwbHkucmVxX3R5cGUgPSByZXFfdHlw ZTsKKwlkcm1fZHBfZW5jb2RlX3NpZGViYW5kX3JlcGx5KCZyZXBseSwgbXNnKTsKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBkcm1fZHBfc2VuZF91cF9hY2tfcmVwbHkoc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJICAgIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5j aCAqbXN0YiwKKwkJCQkgICAgaW50IHJlcV90eXBlLCBpbnQgc2Vxbm8sIGJvb2wgYnJvYWRjYXN0 KQoreworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4ICp0eG1zZzsKKworCXR4bXNnID0g a3phbGxvYyhzaXplb2YoKnR4bXNnKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF0eG1zZykKKwkJcmV0 dXJuIC1FTk9NRU07CisKKwl0eG1zZy0+ZHN0ID0gbXN0YjsKKwl0eG1zZy0+c2Vxbm8gPSBzZXFu bzsKKwlkcm1fZHBfZW5jb2RlX3VwX2Fja19yZXBseSh0eG1zZywgcmVxX3R5cGUpOworCisJbXV0 ZXhfbG9jaygmbWdyLT5xbG9jayk7CisJbGlzdF9hZGRfdGFpbCgmdHhtc2ctPm5leHQsICZtZ3It PnR4X21zZ191cHEpOworCWlmICghbWdyLT50eF91cF9pbl9wcm9ncmVzcykgeworCQlwcm9jZXNz X3NpbmdsZV91cF90eF9xbG9jayhtZ3IpOworCX0KKwltdXRleF91bmxvY2soJm1nci0+cWxvY2sp OworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRybV9kcF9nZXRfdmNfcGF5bG9hZF9idyhp bnQgZHBfbGlua19idywgaW50IGRwX2xpbmtfY291bnQpCit7CisJc3dpdGNoIChkcF9saW5rX2J3 KSB7CisJY2FzZSBEUF9MSU5LX0JXXzFfNjI6CisJCXJldHVybiAzICogZHBfbGlua19jb3VudDsK KwljYXNlIERQX0xJTktfQldfMl83OgorCQlyZXR1cm4gNSAqIGRwX2xpbmtfY291bnQ7CisJY2Fz ZSBEUF9MSU5LX0JXXzVfNDoKKwkJcmV0dXJuIDEwICogZHBfbGlua19jb3VudDsKKwl9CisJcmV0 dXJuIDA7Cit9CisKKy8qKgorICogZHJtX2RwX21zdF90b3BvbG9neV9tZ3Jfc2V0X21zdCgpIC0g U2V0IHRoZSBNU1Qgc3RhdGUgZm9yIGEgdG9wb2xvZ3kgbWFuYWdlcgorICogQG1ncjogbWFuYWdl ciB0byBzZXQgc3RhdGUgZm9yCisgKiBAbXN0X3N0YXRlOiB0cnVlIHRvIGVuYWJsZSBNU1Qgb24g dGhpcyBjb25uZWN0b3IgLSBmYWxzZSB0byBkaXNhYmxlLgorICoKKyAqIFRoaXMgaXMgY2FsbGVk IGJ5IHRoZSBkcml2ZXIgd2hlbiBpdCBkZXRlY3RzIGFuIE1TVCBjYXBhYmxlIGRldmljZSBwbHVn Z2VkCisgKiBpbnRvIGEgRFAgTVNUIGNhcGFibGUgcG9ydCwgb3Igd2hlbiBhIERQIE1TVCBjYXBh YmxlIGRldmljZSBpcyB1bnBsdWdnZWQuCisgKi8KK2ludCBkcm1fZHBfbXN0X3RvcG9sb2d5X21n cl9zZXRfbXN0KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBib29sIG1zdF9z dGF0ZSkKK3sKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGIg PSBOVUxMOworCisJbXV0ZXhfbG9jaygmbWdyLT5sb2NrKTsKKwlpZiAobXN0X3N0YXRlID09IG1n ci0+bXN0X3N0YXRlKQorCQlnb3RvIG91dF91bmxvY2s7CisKKwltZ3ItPm1zdF9zdGF0ZSA9IG1z dF9zdGF0ZTsKKwkvKiBzZXQgdGhlIGRldmljZSBpbnRvIE1TVCBtb2RlICovCisJaWYgKG1zdF9z dGF0ZSkgeworCQlXQVJOX09OKG1nci0+bXN0X3ByaW1hcnkpOworCisJCS8qIGdldCBkcGNkIGlu Zm8gKi8KKwkJbXV0ZXhfbG9jaygmbWdyLT5hdXhfbG9jayk7CisJCXJldCA9IGRybV9kcF9kcGNk X3JlYWQobWdyLT5hdXgsIERQX0RQQ0RfUkVWLCBtZ3ItPmRwY2QsIERQX1JFQ0VJVkVSX0NBUF9T SVpFKTsKKwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwkJaWYgKHJldCAhPSBEUF9S RUNFSVZFUl9DQVBfU0laRSkgeworCQkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIHJlYWQgRFBD RFxuIik7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQltZ3ItPnBibl9kaXYgPSBkcm1f ZHBfZ2V0X3ZjX3BheWxvYWRfYncobWdyLT5kcGNkWzFdLCBtZ3ItPmRwY2RbMl0gJiBEUF9NQVhf TEFORV9DT1VOVF9NQVNLKTsKKwkJbWdyLT50b3RhbF9wYm4gPSAyNTYwOworCQltZ3ItPnRvdGFs X3Nsb3RzID0gRElWX1JPVU5EX1VQKG1nci0+dG90YWxfcGJuLCBtZ3ItPnBibl9kaXYpOworCQlt Z3ItPmF2YWlsX3Nsb3RzID0gbWdyLT50b3RhbF9zbG90czsKKworCQkvKiBhZGQgaW5pdGlhbCBi cmFuY2ggZGV2aWNlIGF0IExDVCAxICovCisJCW1zdGIgPSBkcm1fZHBfYWRkX21zdF9icmFuY2hf ZGV2aWNlKDEsIE5VTEwpOworCQlpZiAobXN0YiA9PSBOVUxMKSB7CisJCQlyZXQgPSAtRU5PTUVN OworCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJCW1zdGItPm1nciA9IG1ncjsKKworCQkvKiBn aXZlIHRoaXMgdGhlIG1haW4gcmVmZXJlbmNlICovCisJCW1nci0+bXN0X3ByaW1hcnkgPSBtc3Ri OworCQlrcmVmX2dldCgmbWdyLT5tc3RfcHJpbWFyeS0+a3JlZik7CisKKwkJeworCQkJc3RydWN0 IGRybV9kcF9wYXlsb2FkIHJlc2V0X3BheTsKKwkJCXJlc2V0X3BheS5zdGFydF9zbG90ID0gMDsK KwkJCXJlc2V0X3BheS5udW1fc2xvdHMgPSAweDNmOworCQkJZHJtX2RwX2RwY2Rfd3JpdGVfcGF5 bG9hZChtZ3IsIDAsICZyZXNldF9wYXkpOworCQl9CisKKwkJbXV0ZXhfbG9jaygmbWdyLT5hdXhf bG9jayk7CisJCXJldCA9IGRybV9kcF9kcGNkX3dyaXRlYihtZ3ItPmF1eCwgRFBfTVNUTV9DVFJM LAorCQkJCQkgRFBfTVNUX0VOIHwgRFBfVVBfUkVRX0VOIHwgRFBfVVBTVFJFQU1fSVNfU1JDKTsK KwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWdv dG8gb3V0X3VubG9jazsKKwkJfQorCisKKwkJLyogc29ydCBvdXQgZ3VpZCAqLworCQltdXRleF9s b2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwkJcmV0ID0gZHJtX2RwX2RwY2RfcmVhZChtZ3ItPmF1eCwg RFBfR1VJRCwgbWdyLT5ndWlkLCAxNik7CisJCW11dGV4X3VubG9jaygmbWdyLT5hdXhfbG9jayk7 CisJCWlmIChyZXQgIT0gMTYpIHsKKwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byByZWFkIERQ IEdVSUQgJWRcbiIsIHJldCk7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQltZ3ItPmd1 aWRfdmFsaWQgPSBkcm1fZHBfdmFsaWRhdGVfZ3VpZChtZ3IsIG1nci0+Z3VpZCk7CisJCWlmICgh bWdyLT5ndWlkX3ZhbGlkKSB7CisJCQlyZXQgPSBkcm1fZHBfZHBjZF93cml0ZShtZ3ItPmF1eCwg RFBfR1VJRCwgbWdyLT5ndWlkLCAxNik7CisJCQltZ3ItPmd1aWRfdmFsaWQgPSB0cnVlOworCQl9 CisKKwkJcXVldWVfd29yayhzeXN0ZW1fbG9uZ193cSwgJm1nci0+d29yayk7CisKKwkJcmV0ID0g MDsKKwl9IGVsc2UgeworCQkvKiBkaXNhYmxlIE1TVCBvbiB0aGUgZGV2aWNlICovCisJCW1zdGIg PSBtZ3ItPm1zdF9wcmltYXJ5OworCQltZ3ItPm1zdF9wcmltYXJ5ID0gTlVMTDsKKwkJLyogdGhp cyBjYW4gZmFpbCBpZiB0aGUgZGV2aWNlIGlzIGdvbmUgKi8KKwkJZHJtX2RwX2RwY2Rfd3JpdGVi KG1nci0+YXV4LCBEUF9NU1RNX0NUUkwsIDApOworCQlyZXQgPSAwOworCQltZW1zZXQobWdyLT5w YXlsb2FkcywgMCwgbWdyLT5tYXhfcGF5bG9hZHMgKiBzaXplb2Yoc3RydWN0IGRybV9kcF9wYXls b2FkKSk7CisJCW1nci0+cGF5bG9hZF9tYXNrID0gMDsKKwkJc2V0X2JpdCgwLCAmbWdyLT5wYXls b2FkX21hc2spOworCX0KKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJm1nci0+bG9jayk7 CisJaWYgKG1zdGIpCisJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UobXN0Yik7CisJcmV0 dXJuIHJldDsKKworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9zZXRf bXN0KTsKKworLyoqCisgKiBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9zdXNwZW5kKCkgLSBzdXNw ZW5kIHRoZSBNU1QgbWFuYWdlcgorICogQG1ncjogbWFuYWdlciB0byBzdXNwZW5kCisgKgorICog VGhpcyBmdW5jdGlvbiB0ZWxscyB0aGUgTVNUIGRldmljZSB0aGF0IHdlIGNhbid0IGhhbmRsZSBV UCBtZXNzYWdlcworICogYW55bW9yZS4gVGhpcyBzaG91bGQgc3RvcCBpdCBmcm9tIHNlbmRpbmcg YW55IHNpbmNlIHdlIGFyZSBzdXNwZW5kZWQuCisgKi8KK3ZvaWQgZHJtX2RwX21zdF90b3BvbG9n eV9tZ3Jfc3VzcGVuZChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncikKK3sKKwlt dXRleF9sb2NrKCZtZ3ItPmxvY2spOworCW11dGV4X2xvY2soJm1nci0+YXV4X2xvY2spOworCWRy bV9kcF9kcGNkX3dyaXRlYihtZ3ItPmF1eCwgRFBfTVNUTV9DVFJMLAorCQkJICAgRFBfTVNUX0VO IHwgRFBfVVBTVFJFQU1fSVNfU1JDKTsKKwltdXRleF91bmxvY2soJm1nci0+YXV4X2xvY2spOwor CW11dGV4X3VubG9jaygmbWdyLT5sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF90 b3BvbG9neV9tZ3Jfc3VzcGVuZCk7CisKKy8qKgorICogZHJtX2RwX21zdF90b3BvbG9neV9tZ3Jf cmVzdW1lKCkgLSByZXN1bWUgdGhlIE1TVCBtYW5hZ2VyCisgKiBAbWdyOiBtYW5hZ2VyIHRvIHJl c3VtZQorICoKKyAqIFRoaXMgd2lsbCBmZXRjaCBEUENEIGFuZCBzZWUgaWYgdGhlIGRldmljZSBp cyBzdGlsbCB0aGVyZSwKKyAqIGlmIGl0IGlzLCBpdCB3aWxsIHJld3JpdGUgdGhlIE1TVE0gY29u dHJvbCBiaXRzLCBhbmQgcmV0dXJuLgorICoKKyAqIGlmIHRoZSBkZXZpY2UgZmFpbHMgdGhpcyBy ZXR1cm5zIC0xLCBhbmQgdGhlIGRyaXZlciBzaG91bGQgZG8KKyAqIGEgZnVsbCBNU1QgcmVwcm9i ZSwgaW4gY2FzZSB3ZSB3ZXJlIHVuZG9ja2VkLgorICovCitpbnQgZHJtX2RwX21zdF90b3BvbG9n eV9tZ3JfcmVzdW1lKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCWlu dCByZXQgPSAwOworCisJbXV0ZXhfbG9jaygmbWdyLT5sb2NrKTsKKworCWlmIChtZ3ItPm1zdF9w cmltYXJ5KSB7CisJCWludCBzcmV0OworCQltdXRleF9sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwkJ c3JldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIERQX0RQQ0RfUkVWLCBtZ3ItPmRwY2Qs IERQX1JFQ0VJVkVSX0NBUF9TSVpFKTsKKwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsK KwkJaWYgKHNyZXQgIT0gRFBfUkVDRUlWRVJfQ0FQX1NJWkUpIHsKKwkJCURSTV9ERUJVR19LTVMo ImRwY2QgcmVhZCBmYWlsZWQgLSB1bmRvY2tlZCBkdXJpbmcgc3VzcGVuZD9cbiIpOworCQkJcmV0 ID0gLTE7CisJCQlnb3RvIG91dF91bmxvY2s7CisJCX0KKworCQltdXRleF9sb2NrKCZtZ3ItPmF1 eF9sb2NrKTsKKwkJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGViKG1nci0+YXV4LCBEUF9NU1RNX0NU UkwsCisJCQkJCSBEUF9NU1RfRU4gfCBEUF9VUF9SRVFfRU4gfCBEUF9VUFNUUkVBTV9JU19TUkMp OworCQltdXRleF91bmxvY2soJm1nci0+YXV4X2xvY2spOworCQlpZiAocmV0IDwgMCkgeworCQkJ RFJNX0RFQlVHX0tNUygibXN0IHdyaXRlIGZhaWxlZCAtIHVuZG9ja2VkIGR1cmluZyBzdXNwZW5k P1xuIik7CisJCQlyZXQgPSAtMTsKKwkJCWdvdG8gb3V0X3VubG9jazsKKwkJfQorCQlyZXQgPSAw OworCX0gZWxzZQorCQlyZXQgPSAtMTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJm1n ci0+bG9jayk7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3Bv bG9neV9tZ3JfcmVzdW1lKTsKKworc3RhdGljIHZvaWQgZHJtX2RwX2dldF9vbmVfc2JfbXNnKHN0 cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBib29sIHVwKQoreworCWludCBsZW47 CisJdTggcmVwbHlibG9ja1szMl07CisJaW50IHJlcGx5bGVuLCBvcmlnbGVuLCBjdXJyZXBseTsK KwlpbnQgcmV0OworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4ICptc2c7CisJaW50IGJh c2VyZWcgPSB1cCA/IERQX1NJREVCQU5EX01TR19VUF9SRVFfQkFTRSA6IERQX1NJREVCQU5EX01T R19ET1dOX1JFUF9CQVNFOworCW1zZyA9IHVwID8gJm1nci0+dXBfcmVxX3JlY3YgOiAmbWdyLT5k b3duX3JlcF9yZWN2OworCisJbGVuID0gbWluKG1nci0+bWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0 ZXMsIDE2KTsKKwltdXRleF9sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwlyZXQgPSBkcm1fZHBfZHBj ZF9yZWFkKG1nci0+YXV4LCBiYXNlcmVnLAorCQkJICAgICAgIHJlcGx5YmxvY2ssIGxlbik7CisJ bXV0ZXhfdW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwlpZiAocmV0ICE9IGxlbikgeworCQlEUk1f REVCVUdfS01TKCJmYWlsZWQgdG8gcmVhZCBEUENEIGRvd24gcmVwICVkICVkXG4iLCBsZW4sIHJl dCk7CisJCXJldHVybjsKKwl9CisJcmV0ID0gZHJtX2RwX3NpZGViYW5kX21zZ19idWlsZChtc2cs IHJlcGx5YmxvY2ssIGxlbiwgdHJ1ZSk7CisJaWYgKCFyZXQpIHsKKwkJRFJNX0RFQlVHX0tNUygi c2lkZWJhbmQgbXNnIGJ1aWxkIGZhaWxlZCAlZFxuIiwgcmVwbHlibG9ja1swXSk7CisJCXJldHVy bjsKKwl9CisJcmVwbHlsZW4gPSBtc2ctPmN1cmNodW5rX2xlbiArIG1zZy0+Y3VyY2h1bmtfaGRy bGVuOworCisJb3JpZ2xlbiA9IHJlcGx5bGVuOworCXJlcGx5bGVuIC09IGxlbjsKKwljdXJyZXBs eSA9IGxlbjsKKwl3aGlsZSAocmVwbHlsZW4gPiAwKSB7CisJCWxlbiA9IG1pbjMocmVwbHlsZW4s IG1nci0+bWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXMsIDE2KTsKKwkJbXV0ZXhfbG9jaygmbWdy LT5hdXhfbG9jayk7CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIGJhc2VyZWcg KyBjdXJyZXBseSwKKwkJCQkgICAgcmVwbHlibG9jaywgbGVuKTsKKwkJbXV0ZXhfdW5sb2NrKCZt Z3ItPmF1eF9sb2NrKTsKKwkJaWYgKHJldCAhPSBsZW4pIHsKKwkJCURSTV9ERUJVR19LTVMoImZh aWxlZCB0byByZWFkIGEgY2h1bmtcbiIpOworCQl9CisJCXJldCA9IGRybV9kcF9zaWRlYmFuZF9t c2dfYnVpbGQobXNnLCByZXBseWJsb2NrLCBsZW4sIGZhbHNlKTsKKwkJaWYgKHJldCA9PSBmYWxz ZSkKKwkJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byBidWlsZCBzaWRlYmFuZCBtc2dcbiIpOwor CQljdXJyZXBseSArPSBsZW47CisJCXJlcGx5bGVuIC09IGxlbjsKKwl9Cit9CisKK3N0YXRpYyBp bnQgZHJtX2RwX21zdF9oYW5kbGVfZG93bl9yZXAoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lf bWdyICptZ3IpCit7CisJaW50IHJldCA9IDA7CisKKwlkcm1fZHBfZ2V0X29uZV9zYl9tc2cobWdy LCBmYWxzZSk7CisKKwlpZiAobWdyLT5kb3duX3JlcF9yZWN2LmhhdmVfZW9tdCkgeworCQlzdHJ1 Y3QgZHJtX2RwX3NpZGViYW5kX21zZ190eCAqdHhtc2c7CisJCXN0cnVjdCBkcm1fZHBfbXN0X2Jy YW5jaCAqbXN0YjsKKwkJaW50IHNsb3QgPSAtMTsKKwkJbXN0YiA9IGRybV9kcF9nZXRfbXN0X2Jy YW5jaF9kZXZpY2UobWdyLAorCQkJCQkJICAgIG1nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hk ci5sY3QsCisJCQkJCQkgICAgbWdyLT5kb3duX3JlcF9yZWN2LmluaXRpYWxfaGRyLnJhZCk7CisK KwkJaWYgKCFtc3RiKSB7CisJCQlEUk1fREVCVUdfS01TKCJHb3QgTVNUIHJlcGx5IGZyb20gdW5r bm93biBkZXZpY2UgJWRcbiIsIG1nci0+ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5sY3QpOwor CQkJbWVtc2V0KCZtZ3ItPmRvd25fcmVwX3JlY3YsIDAsIHNpemVvZihzdHJ1Y3QgZHJtX2RwX3Np ZGViYW5kX21zZ19yeCkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiBmaW5kIHRoZSBtZXNz YWdlICovCisJCXNsb3QgPSBtZ3ItPmRvd25fcmVwX3JlY3YuaW5pdGlhbF9oZHIuc2Vxbm87CisJ CW11dGV4X2xvY2soJm1nci0+cWxvY2spOworCQl0eG1zZyA9IG1zdGItPnR4X3Nsb3RzW3Nsb3Rd OworCQkvKiByZW1vdmUgZnJvbSBzbG90cyAqLworCQltdXRleF91bmxvY2soJm1nci0+cWxvY2sp OworCisJCWlmICghdHhtc2cpIHsKKwkJCURSTV9ERUJVR19LTVMoIkdvdCBNU1QgcmVwbHkgd2l0 aCBubyBtc2cgJXAgJWQgJWQgJTAyeCAlMDJ4XG4iLAorCQkJICAgICAgIG1zdGIsCisJCQkgICAg ICAgbWdyLT5kb3duX3JlcF9yZWN2LmluaXRpYWxfaGRyLnNlcW5vLAorCQkJICAgICAgIG1nci0+ ZG93bl9yZXBfcmVjdi5pbml0aWFsX2hkci5sY3QsCisJCQkJICAgICAgbWdyLT5kb3duX3JlcF9y ZWN2LmluaXRpYWxfaGRyLnJhZFswXSwKKwkJCQkgICAgICBtZ3ItPmRvd25fcmVwX3JlY3YubXNn WzBdKTsKKwkJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UobXN0Yik7CisJCQltZW1zZXQo Jm1nci0+ZG93bl9yZXBfcmVjdiwgMCwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNn X3J4KSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRybV9kcF9zaWRlYmFuZF9wYXJzZV9yZXBs eSgmbWdyLT5kb3duX3JlcF9yZWN2LCAmdHhtc2ctPnJlcGx5KTsKKwkJaWYgKHR4bXNnLT5yZXBs eS5yZXBseV90eXBlID09IDEpIHsKKwkJCURSTV9ERUJVR19LTVMoIkdvdCBOQUsgcmVwbHk6IHJl cSAweCUwMngsIHJlYXNvbiAweCUwMngsIG5hayBkYXRhIDB4JTAyeFxuIiwgdHhtc2ctPnJlcGx5 LnJlcV90eXBlLCB0eG1zZy0+cmVwbHkudS5uYWsucmVhc29uLCB0eG1zZy0+cmVwbHkudS5uYWsu bmFrX2RhdGEpOworCQl9CisKKwkJbWVtc2V0KCZtZ3ItPmRvd25fcmVwX3JlY3YsIDAsIHNpemVv ZihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCkpOworCQlkcm1fZHBfcHV0X21zdF9icmFu Y2hfZGV2aWNlKG1zdGIpOworCisJCW11dGV4X2xvY2soJm1nci0+cWxvY2spOworCQl0eG1zZy0+ c3RhdGUgPSBEUk1fRFBfU0lERUJBTkRfVFhfUlg7CisJCW1zdGItPnR4X3Nsb3RzW3Nsb3RdID0g TlVMTDsKKwkJbXV0ZXhfdW5sb2NrKCZtZ3ItPnFsb2NrKTsKKworCQl3YWtlX3VwKCZtZ3ItPnR4 X3dhaXRxKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBkcm1fZHBfbXN0X2hh bmRsZV91cF9yZXEoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJaW50 IHJldCA9IDA7CisJZHJtX2RwX2dldF9vbmVfc2JfbXNnKG1nciwgdHJ1ZSk7CisKKwlpZiAobWdy LT51cF9yZXFfcmVjdi5oYXZlX2VvbXQpIHsKKwkJc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2df cmVxX2JvZHkgbXNnOworCQlzdHJ1Y3QgZHJtX2RwX21zdF9icmFuY2ggKm1zdGI7CisJCWJvb2wg c2Vxbm87CisJCW1zdGIgPSBkcm1fZHBfZ2V0X21zdF9icmFuY2hfZGV2aWNlKG1nciwKKwkJCQkJ CSAgICBtZ3ItPnVwX3JlcV9yZWN2LmluaXRpYWxfaGRyLmxjdCwKKwkJCQkJCSAgICBtZ3ItPnVw X3JlcV9yZWN2LmluaXRpYWxfaGRyLnJhZCk7CisJCWlmICghbXN0YikgeworCQkJRFJNX0RFQlVH X0tNUygiR290IE1TVCByZXBseSBmcm9tIHVua25vd24gZGV2aWNlICVkXG4iLCBtZ3ItPnVwX3Jl cV9yZWN2LmluaXRpYWxfaGRyLmxjdCk7CisJCQltZW1zZXQoJm1nci0+dXBfcmVxX3JlY3YsIDAs IHNpemVvZihzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19yeCkpOworCQkJcmV0dXJuIDA7CisJ CX0KKworCQlzZXFubyA9IG1nci0+dXBfcmVxX3JlY3YuaW5pdGlhbF9oZHIuc2Vxbm87CisJCWRy bV9kcF9zaWRlYmFuZF9wYXJzZV9yZXEoJm1nci0+dXBfcmVxX3JlY3YsICZtc2cpOworCisJCWlm IChtc2cucmVxX3R5cGUgPT0gRFBfQ09OTkVDVElPTl9TVEFUVVNfTk9USUZZKSB7CisJCQlkcm1f ZHBfc2VuZF91cF9hY2tfcmVwbHkobWdyLCBtc3RiLCBtc2cucmVxX3R5cGUsIHNlcW5vLCBmYWxz ZSk7CisJCQlkcm1fZHBfdXBkYXRlX3BvcnQobXN0YiwgJm1zZy51LmNvbm5fc3RhdCk7CisJCQlE Uk1fREVCVUdfS01TKCJHb3QgQ1NOOiBwbjogJWQgbGRwczolZCBkZHBzOiAlZCBtY3M6ICVkIGlw OiAlZCBwZHQ6ICVkXG4iLCBtc2cudS5jb25uX3N0YXQucG9ydF9udW1iZXIsIG1zZy51LmNvbm5f c3RhdC5sZWdhY3lfZGV2aWNlX3BsdWdfc3RhdHVzLCBtc2cudS5jb25uX3N0YXQuZGlzcGxheXBv cnRfZGV2aWNlX3BsdWdfc3RhdHVzLCBtc2cudS5jb25uX3N0YXQubWVzc2FnZV9jYXBhYmlsaXR5 X3N0YXR1cywgbXNnLnUuY29ubl9zdGF0LmlucHV0X3BvcnQsIG1zZy51LmNvbm5fc3RhdC5wZWVy X2RldmljZV90eXBlKTsKKwkJCSgqbWdyLT5jYnMtPmhvdHBsdWcpKG1ncik7CisKKwkJfSBlbHNl IGlmIChtc2cucmVxX3R5cGUgPT0gRFBfUkVTT1VSQ0VfU1RBVFVTX05PVElGWSkgeworCQkJZHJt X2RwX3NlbmRfdXBfYWNrX3JlcGx5KG1nciwgbXN0YiwgbXNnLnJlcV90eXBlLCBzZXFubywgZmFs c2UpOworCQkJRFJNX0RFQlVHX0tNUygiR290IFJTTjogcG46ICVkIGF2YWlsX3BibiAlZFxuIiwg bXNnLnUucmVzb3VyY2Vfc3RhdC5wb3J0X251bWJlciwgbXNnLnUucmVzb3VyY2Vfc3RhdC5hdmFp bGFibGVfcGJuKTsKKwkJfQorCisJCWRybV9kcF9wdXRfbXN0X2JyYW5jaF9kZXZpY2UobXN0Yik7 CisJCW1lbXNldCgmbWdyLT51cF9yZXFfcmVjdiwgMCwgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfc2lk ZWJhbmRfbXNnX3J4KSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZHJtX2RwX21z dF9ocGRfaXJxKCkgLSBNU1QgaG90cGx1ZyBJUlEgbm90aWZ5CisgKiBAbWdyOiBtYW5hZ2VyIHRv IG5vdGlmeSBpcnEgZm9yLgorICogQGVzaTogNCBieXRlcyBmcm9tIFNJTktfQ09VTlRfRVNJCisg KgorICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGRyaXZlciB3aGVuIGl0IGRldGVj dHMgYSBzaG9ydCBJUlEsCisgKiBhbG9uZyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgREVWSUNFX1NF UlZJQ0VfSVJRX1ZFQ1RPUl9FU0kwLiBUaGUKKyAqIHRvcG9sb2d5IG1hbmFnZXIgd2lsbCBwcm9j ZXNzIHRoZSBzaWRlYmFuZCBtZXNzYWdlcyByZWNlaXZlZCBhcyBhIHJlc3VsdAorICogb2YgdGhp cy4KKyAqLworaW50IGRybV9kcF9tc3RfaHBkX2lycShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9n eV9tZ3IgKm1nciwgdTggKmVzaSwgYm9vbCAqaGFuZGxlZCkKK3sKKwlpbnQgcmV0ID0gMDsKKwlp bnQgc2M7CisJKmhhbmRsZWQgPSBmYWxzZTsKKwlzYyA9IGVzaVswXSAmIDB4M2Y7CisJaWYgKHNj ICE9IG1nci0+c2lua19jb3VudCkgeworCisJCWlmIChtZ3ItPm1zdF9wcmltYXJ5ICYmIG1nci0+ c2lua19jb3VudCA9PSAwICYmIHNjKSB7CisJCQltZ3ItPm1zdF9wcmltYXJ5LT5saW5rX2FkZHJl c3Nfc2VudCA9IGZhbHNlOworCQkJcXVldWVfd29yayhzeXN0ZW1fbG9uZ193cSwgJm1nci0+d29y ayk7CisJCX0KKwkJbWdyLT5zaW5rX2NvdW50ID0gc2M7CisJCSpoYW5kbGVkID0gdHJ1ZTsKKwor CX0KKworCWlmIChlc2lbMV0gJiBEUF9ET1dOX1JFUF9NU0dfUkRZKSB7CisJCXJldCA9IGRybV9k cF9tc3RfaGFuZGxlX2Rvd25fcmVwKG1ncik7CisJCSpoYW5kbGVkID0gdHJ1ZTsKKwl9CisKKwlp ZiAoZXNpWzFdICYgRFBfVVBfUkVRX01TR19SRFkpIHsKKwkJcmV0IHw9IGRybV9kcF9tc3RfaGFu ZGxlX3VwX3JlcShtZ3IpOworCQkqaGFuZGxlZCA9IHRydWU7CisJfQorCisJZHJtX2RwX21zdF9r aWNrX3R4KG1ncik7CisJcmV0dXJuIHJldDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9o cGRfaXJxKTsKKworLyoqCisgKiBkcm1fZHBfbXN0X2RldGVjdF9wb3J0KCkgLSBnZXQgY29ubmVj dGlvbiBzdGF0dXMgZm9yIGFuIE1TVCBwb3J0CisgKiBAbWdyOiBtYW5hZ2VyIGZvciB0aGlzIHBv cnQKKyAqIEBwb3J0OiB1bnZlcmlmaWVkIHBvaW50ZXIgdG8gYSBwb3J0CisgKgorICogVGhpcyBy ZXR1cm5zIHRoZSBjdXJyZW50IGNvbm5lY3Rpb24gc3RhdGUgZm9yIGEgcG9ydC4gSXQgdmFsaWRh dGVzIHRoZQorICogcG9ydCBwb2ludGVyIHN0aWxsIGV4aXN0cyBzbyB0aGUgY2FsbGVyIGRvZXNu J3QgcmVxdWlyZSBhIHJlZmVyZW5jZQorICovCitlbnVtIGRybV9jb25uZWN0b3Jfc3RhdHVzIGRy bV9kcF9tc3RfZGV0ZWN0X3BvcnQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3Is IHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpCit7CisJZW51bSBkcm1fY29ubmVjdG9yX3N0 YXR1cyBzdGF0dXMgPSBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKworCS8qIHdlIG5l ZWQgdG8gc2VhcmNoIGZvciB0aGUgcG9ydCBpbiB0aGUgbWdyIGluIGNhc2UgaXRzIGdvbmUgKi8K Kwlwb3J0ID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfcG9ydF9yZWYobWdyLCBwb3J0KTsKKwlpZiAo IXBvcnQpCisJCXJldHVybiBjb25uZWN0b3Jfc3RhdHVzX2Rpc2Nvbm5lY3RlZDsKKworCWlmICgh cG9ydC0+ZGRwcykKKwkJZ290byBvdXQ7CisKKwlzd2l0Y2ggKHBvcnQtPnBkdCkgeworCWNhc2Ug RFBfUEVFUl9ERVZJQ0VfTk9ORToKKwljYXNlIERQX1BFRVJfREVWSUNFX01TVF9CUkFOQ0hJTkc6 CisJCWJyZWFrOworCisJY2FzZSBEUF9QRUVSX0RFVklDRV9TU1RfU0lOSzoKKwkJc3RhdHVzID0g Y29ubmVjdG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWJyZWFrOworCWNhc2UgRFBfUEVFUl9ERVZJ Q0VfRFBfTEVHQUNZX0NPTlY6CisJCWlmIChwb3J0LT5sZHBzKQorCQkJc3RhdHVzID0gY29ubmVj dG9yX3N0YXR1c19jb25uZWN0ZWQ7CisJCWJyZWFrOworCX0KK291dDoKKwlkcm1fZHBfcHV0X3Bv cnQocG9ydCk7CisJcmV0dXJuIHN0YXR1czsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9k ZXRlY3RfcG9ydCk7CisKKy8qKgorICogZHJtX2RwX21zdF9nZXRfZWRpZCgpIC0gZ2V0IEVESUQg Zm9yIGFuIE1TVCBwb3J0CisgKiBAY29ubmVjdG9yOiB0b3BsZXZlbCBjb25uZWN0b3IgdG8gZ2V0 IEVESUQgZm9yCisgKiBAbWdyOiBtYW5hZ2VyIGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiB1bnZl cmlmaWVkIHBvaW50ZXIgdG8gYSBwb3J0LgorICoKKyAqIFRoaXMgcmV0dXJucyBhbiBFRElEIGZv ciB0aGUgcG9ydCBjb25uZWN0ZWQgdG8gYSBjb25uZWN0b3IsCisgKiBJdCB2YWxpZGF0ZXMgdGhl IHBvaW50ZXIgc3RpbGwgZXhpc3RzIHNvIHRoZSBjYWxsZXIgZG9lc24ndCByZXF1aXJlIGEKKyAq IHJlZmVyZW5jZS4KKyAqLworc3RydWN0IGVkaWQgKmRybV9kcF9tc3RfZ2V0X2VkaWQoc3RydWN0 IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdy ICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQpCit7CisJc3RydWN0IGVkaWQgKmVk aWQgPSBOVUxMOworCisJLyogd2UgbmVlZCB0byBzZWFyY2ggZm9yIHRoZSBwb3J0IGluIHRoZSBt Z3IgaW4gY2FzZSBpdHMgZ29uZSAqLworCXBvcnQgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9wb3J0 X3JlZihtZ3IsIHBvcnQpOworCWlmICghcG9ydCkKKwkJcmV0dXJuIE5VTEw7CisKKwllZGlkID0g ZHJtX2dldF9lZGlkKGNvbm5lY3RvciwgJnBvcnQtPmF1eC5kZGMpOworCWRybV9kcF9wdXRfcG9y dChwb3J0KTsKKwlyZXR1cm4gZWRpZDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9nZXRf ZWRpZCk7CisKKy8qKgorICogZHJtX2RwX2ZpbmRfdmNwaV9zbG90cygpIC0gZmluZCBzbG90cyBm b3IgdGhpcyBQQk4gdmFsdWUKKyAqIEBtZ3I6IG1hbmFnZXIgdG8gdXNlCisgKiBAcGJuOiBwYXls b2FkIGJhbmR3aWR0aCB0byBjb252ZXJ0IGludG8gc2xvdHMuCisgKi8KK2ludCBkcm1fZHBfZmlu ZF92Y3BpX3Nsb3RzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJICAg aW50IHBibikKK3sKKwlpbnQgbnVtX3Nsb3RzOworCisJbnVtX3Nsb3RzID0gRElWX1JPVU5EX1VQ KHBibiwgbWdyLT5wYm5fZGl2KTsKKworCWlmIChudW1fc2xvdHMgPiBtZ3ItPmF2YWlsX3Nsb3Rz KQorCQlyZXR1cm4gLUVOT1NQQzsKKwlyZXR1cm4gbnVtX3Nsb3RzOworfQorRVhQT1JUX1NZTUJP TChkcm1fZHBfZmluZF92Y3BpX3Nsb3RzKTsKKworc3RhdGljIGludCBkcm1fZHBfaW5pdF92Y3Bp KHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJICAgIHN0cnVjdCBkcm1f ZHBfdmNwaSAqdmNwaSwgaW50IHBibikKK3sKKwlpbnQgbnVtX3Nsb3RzOworCWludCByZXQ7CisK KwludW1fc2xvdHMgPSBESVZfUk9VTkRfVVAocGJuLCBtZ3ItPnBibl9kaXYpOworCisJaWYgKG51 bV9zbG90cyA+IG1nci0+YXZhaWxfc2xvdHMpCisJCXJldHVybiAtRU5PU1BDOworCisJdmNwaS0+ cGJuID0gcGJuOworCXZjcGktPmFsaWduZWRfcGJuID0gbnVtX3Nsb3RzICogbWdyLT5wYm5fZGl2 OworCXZjcGktPm51bV9zbG90cyA9IG51bV9zbG90czsKKworCXJldCA9IGRybV9kcF9tc3RfYXNz aWduX3BheWxvYWRfaWQobWdyLCB2Y3BpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsK KwlyZXR1cm4gMDsKK30KKworLyoqCisgKiBkcm1fZHBfbXN0X2FsbG9jYXRlX3ZjcGkoKSAtIEFs bG9jYXRlIGEgdmlydHVhbCBjaGFubmVsCisgKiBAbWdyOiBtYW5hZ2VyIGZvciB0aGlzIHBvcnQK KyAqIEBwb3J0OiBwb3J0IHRvIGFsbG9jYXRlIGEgdmlydHVhbCBjaGFubmVsIGZvci4KKyAqIEBw Ym46IHBheWxvYWQgYmFuZHdpZHRoIG51bWJlciB0byByZXF1ZXN0CisgKiBAc2xvdHM6IHJldHVy bmVkIG51bWJlciBvZiBzbG90cyBmb3IgdGhpcyBQQk4uCisgKi8KK2Jvb2wgZHJtX2RwX21zdF9h bGxvY2F0ZV92Y3BpKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3Qg ZHJtX2RwX21zdF9wb3J0ICpwb3J0LCBpbnQgcGJuLCBpbnQgKnNsb3RzKQoreworCWludCByZXQ7 CisKKwlwb3J0ID0gZHJtX2RwX2dldF92YWxpZGF0ZWRfcG9ydF9yZWYobWdyLCBwb3J0KTsKKwlp ZiAoIXBvcnQpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChwb3J0LT52Y3BpLnZjcGkgPiAwKSB7 CisJCURSTV9ERUJVR19LTVMoInBheWxvYWQ6IHZjcGkgJWQgYWxyZWFkeSBhbGxvY2F0ZWQgZm9y IHBibiAlZCAtIHJlcXVlc3RlZCBwYm4gJWRcbiIsIHBvcnQtPnZjcGkudmNwaSwgcG9ydC0+dmNw aS5wYm4sIHBibik7CisJCWlmIChwYm4gPT0gcG9ydC0+dmNwaS5wYm4pIHsKKwkJCSpzbG90cyA9 IHBvcnQtPnZjcGkubnVtX3Nsb3RzOworCQkJcmV0dXJuIHRydWU7CisJCX0KKwl9CisKKwlyZXQg PSBkcm1fZHBfaW5pdF92Y3BpKG1nciwgJnBvcnQtPnZjcGksIHBibik7CisJaWYgKHJldCkgewor CQlEUk1fREVCVUdfS01TKCJmYWlsZWQgdG8gaW5pdCB2Y3BpICVkICVkICVkXG4iLCBESVZfUk9V TkRfVVAocGJuLCBtZ3ItPnBibl9kaXYpLCBtZ3ItPmF2YWlsX3Nsb3RzLCByZXQpOworCQlnb3Rv IG91dDsKKwl9CisJRFJNX0RFQlVHX0tNUygiaW5pdGluZyB2Y3BpIGZvciAlZCAlZFxuIiwgcGJu LCBwb3J0LT52Y3BpLm51bV9zbG90cyk7CisJKnNsb3RzID0gcG9ydC0+dmNwaS5udW1fc2xvdHM7 CisKKwlkcm1fZHBfcHV0X3BvcnQocG9ydCk7CisJcmV0dXJuIHRydWU7CitvdXQ6CisJcmV0dXJu IGZhbHNlOworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfbXN0X2FsbG9jYXRlX3ZjcGkpOworCisv KioKKyAqIGRybV9kcF9tc3RfcmVzZXRfdmNwaV9zbG90cygpIC0gUmVzZXQgbnVtYmVyIG9mIHNs b3RzIHRvIDAgZm9yIFZDUEkKKyAqIEBtZ3I6IG1hbmFnZXIgZm9yIHRoaXMgcG9ydAorICogQHBv cnQ6IHVudmVyaWZpZWQgcG9pbnRlciB0byBhIHBvcnQuCisgKgorICogVGhpcyBqdXN0IHJlc2V0 cyB0aGUgbnVtYmVyIG9mIHNsb3RzIGZvciB0aGUgcG9ydHMgVkNQSSBmb3IgbGF0ZXIgcHJvZ3Jh bW1pbmcuCisgKi8KK3ZvaWQgZHJtX2RwX21zdF9yZXNldF92Y3BpX3Nsb3RzKHN0cnVjdCBkcm1f ZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQor eworCXBvcnQgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRlZF9wb3J0X3JlZihtZ3IsIHBvcnQpOworCWlm ICghcG9ydCkKKwkJcmV0dXJuOworCXBvcnQtPnZjcGkubnVtX3Nsb3RzID0gMDsKKwlkcm1fZHBf cHV0X3BvcnQocG9ydCk7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9kcF9tc3RfcmVzZXRfdmNwaV9z bG90cyk7CisKKy8qKgorICogZHJtX2RwX21zdF9kZWFsbG9jYXRlX3ZjcGkoKSAtIGRlYWxsb2Nh dGUgYSBWQ1BJCisgKiBAbWdyOiBtYW5hZ2VyIGZvciB0aGlzIHBvcnQKKyAqIEBwb3J0OiB1bnZl cmlmaWVkIHBvcnQgdG8gZGVhbGxvY2F0ZSB2Y3BpIGZvcgorICovCit2b2lkIGRybV9kcF9tc3Rf ZGVhbGxvY2F0ZV92Y3BpKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1 Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0KQoreworCXBvcnQgPSBkcm1fZHBfZ2V0X3ZhbGlkYXRl ZF9wb3J0X3JlZihtZ3IsIHBvcnQpOworCWlmICghcG9ydCkKKwkJcmV0dXJuOworCisJZHJtX2Rw X21zdF9wdXRfcGF5bG9hZF9pZChtZ3IsIHBvcnQtPnZjcGkudmNwaSk7CisJcG9ydC0+dmNwaS5u dW1fc2xvdHMgPSAwOworCXBvcnQtPnZjcGkucGJuID0gMDsKKwlwb3J0LT52Y3BpLmFsaWduZWRf cGJuID0gMDsKKwlwb3J0LT52Y3BpLnZjcGkgPSAwOworCWRybV9kcF9wdXRfcG9ydChwb3J0KTsK K30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF9kZWFsbG9jYXRlX3ZjcGkpOworCitzdGF0aWMg aW50IGRybV9kcF9kcGNkX3dyaXRlX3BheWxvYWQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lf bWdyICptZ3IsCisJCQkJICAgICBpbnQgaWQsIHN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9h ZCkKK3sKKwl1OCBwYXlsb2FkX2FsbG9jWzNdLCBzdGF0dXM7CisJaW50IHJldDsKKwlpbnQgcmV0 cmllcyA9IDA7CisKKwltdXRleF9sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwlkcm1fZHBfZHBjZF93 cml0ZWIobWdyLT5hdXgsIERQX1BBWUxPQURfVEFCTEVfVVBEQVRFX1NUQVRVUywKKwkJCSAgIERQ X1BBWUxPQURfVEFCTEVfVVBEQVRFRCk7CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsK KworCXBheWxvYWRfYWxsb2NbMF0gPSBpZDsKKwlwYXlsb2FkX2FsbG9jWzFdID0gcGF5bG9hZC0+ c3RhcnRfc2xvdDsKKwlwYXlsb2FkX2FsbG9jWzJdID0gcGF5bG9hZC0+bnVtX3Nsb3RzOworCisJ bXV0ZXhfbG9jaygmbWdyLT5hdXhfbG9jayk7CisJcmV0ID0gZHJtX2RwX2RwY2Rfd3JpdGUobWdy LT5hdXgsIERQX1BBWUxPQURfQUxMT0NBVEVfU0VULCBwYXlsb2FkX2FsbG9jLCAzKTsKKwltdXRl eF91bmxvY2soJm1nci0+YXV4X2xvY2spOworCWlmIChyZXQgIT0gMykgeworCQlEUk1fREVCVUdf S01TKCJmYWlsZWQgdG8gd3JpdGUgcGF5bG9hZCBhbGxvY2F0aW9uICVkXG4iLCByZXQpOworCQln b3RvIGZhaWw7CisJfQorCityZXRyeToKKwltdXRleF9sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwly ZXQgPSBkcm1fZHBfZHBjZF9yZWFkYihtZ3ItPmF1eCwgRFBfUEFZTE9BRF9UQUJMRV9VUERBVEVf U1RBVFVTLCAmc3RhdHVzKTsKKwltdXRleF91bmxvY2soJm1nci0+YXV4X2xvY2spOworCWlmIChy ZXQgPCAwKSB7CisJCURSTV9ERUJVR19LTVMoImZhaWxlZCB0byByZWFkIHBheWxvYWQgdGFibGUg c3RhdHVzICVkXG4iLCByZXQpOworCQlnb3RvIGZhaWw7CisJfQorCisJaWYgKCEoc3RhdHVzICYg RFBfUEFZTE9BRF9UQUJMRV9VUERBVEVEKSkgeworCQlyZXRyaWVzKys7CisJCWlmIChyZXRyaWVz IDwgMjApIHsKKwkJCXVzbGVlcF9yYW5nZSgxMDAwMCwgMjAwMDApOworCQkJZ290byByZXRyeTsK KwkJfQorCQlEUk1fREVCVUdfS01TKCJzdGF0dXMgbm90IHNldCBhZnRlciByZWFkIHBheWxvYWQg dGFibGUgc3RhdHVzICVkXG4iLCBzdGF0dXMpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZh aWw7CisJfQorCXJldCA9IDA7CitmYWlsOgorCXJldHVybiByZXQ7Cit9CisKKworLyoqCisgKiBk cm1fZHBfY2hlY2tfYWN0X3N0YXR1cygpIC0gQ2hlY2sgQUNUIGhhbmRsZWQgc3RhdHVzLgorICog QG1ncjogbWFuYWdlciB0byB1c2UKKyAqCisgKiBDaGVjayB0aGUgcGF5bG9hZCBzdGF0dXMgYml0 cyBpbiB0aGUgRFBDRCBmb3IgQUNUIGhhbmRsZWQgY29tcGxldGlvbi4KKyAqLworaW50IGRybV9k cF9jaGVja19hY3Rfc3RhdHVzKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQor eworCXU4IHN0YXR1czsKKwlpbnQgcmV0OworCWludCBjb3VudCA9IDA7CisKKwlkbyB7CisJCW11 dGV4X2xvY2soJm1nci0+YXV4X2xvY2spOworCQlyZXQgPSBkcm1fZHBfZHBjZF9yZWFkYihtZ3It PmF1eCwgRFBfUEFZTE9BRF9UQUJMRV9VUERBVEVfU1RBVFVTLCAmc3RhdHVzKTsKKwkJbXV0ZXhf dW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKworCQlpZiAocmV0IDwgMCkgeworCQkJRFJNX0RFQlVH X0tNUygiZmFpbGVkIHRvIHJlYWQgcGF5bG9hZCB0YWJsZSBzdGF0dXMgJWRcbiIsIHJldCk7CisJ CQlnb3RvIGZhaWw7CisJCX0KKworCQlpZiAoc3RhdHVzICYgRFBfUEFZTE9BRF9BQ1RfSEFORExF RCkKKwkJCWJyZWFrOworCQljb3VudCsrOworCQl1ZGVsYXkoMTAwKTsKKworCX0gd2hpbGUgKGNv dW50IDwgMzApOworCisJaWYgKCEoc3RhdHVzICYgRFBfUEFZTE9BRF9BQ1RfSEFORExFRCkpIHsK KwkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIGdldCBBQ1QgYml0ICVkIGFmdGVyICVkIHJldHJp ZXNcbiIsIHN0YXR1cywgY291bnQpOworCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIGZhaWw7CisJ fQorCXJldHVybiAwOworZmFpbDoKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkcm1f ZHBfY2hlY2tfYWN0X3N0YXR1cyk7CisKKy8qKgorICogZHJtX2RwX2NhbGNfcGJuX21vZGUoKSAt IENhbGN1bGF0ZSB0aGUgUEJOIGZvciBhIG1vZGUuCisgKiBAY2xvY2s6IGRvdCBjbG9jayBmb3Ig dGhlIG1vZGUKKyAqIEBicHA6IGJwcCBmb3IgdGhlIG1vZGUuCisgKgorICogVGhpcyB1c2VzIHRo ZSBmb3JtdWxhIGluIHRoZSBzcGVjIHRvIGNhbGN1bGF0ZSB0aGUgUEJOIHZhbHVlIGZvciBhIG1v ZGUuCisgKi8KK2ludCBkcm1fZHBfY2FsY19wYm5fbW9kZShpbnQgY2xvY2ssIGludCBicHApCit7 CisJZml4ZWQyMF8xMiBwaXhfYnc7CisJZml4ZWQyMF8xMiBmYnBwOworCWZpeGVkMjBfMTIgcmVz dWx0OworCWZpeGVkMjBfMTIgbWFyZ2luLCB0bXA7CisJdTMyIHJlczsKKworCXBpeF9idy5mdWxs ID0gZGZpeGVkX2NvbnN0KGNsb2NrKTsKKwlmYnBwLmZ1bGwgPSBkZml4ZWRfY29uc3QoYnBwKTsK Kwl0bXAuZnVsbCA9IGRmaXhlZF9jb25zdCg4KTsKKwlmYnBwLmZ1bGwgPSBkZml4ZWRfZGl2KGZi cHAsIHRtcCk7CisKKwlyZXN1bHQuZnVsbCA9IGRmaXhlZF9tdWwocGl4X2J3LCBmYnBwKTsKKwlt YXJnaW4uZnVsbCA9IGRmaXhlZF9jb25zdCg1NCk7CisJdG1wLmZ1bGwgPSBkZml4ZWRfY29uc3Qo NjQpOworCW1hcmdpbi5mdWxsID0gZGZpeGVkX2RpdihtYXJnaW4sIHRtcCk7CisJcmVzdWx0LmZ1 bGwgPSBkZml4ZWRfZGl2KHJlc3VsdCwgbWFyZ2luKTsKKworCW1hcmdpbi5mdWxsID0gZGZpeGVk X2NvbnN0KDEwMDYpOworCXRtcC5mdWxsID0gZGZpeGVkX2NvbnN0KDEwMDApOworCW1hcmdpbi5m dWxsID0gZGZpeGVkX2RpdihtYXJnaW4sIHRtcCk7CisJcmVzdWx0LmZ1bGwgPSBkZml4ZWRfbXVs KHJlc3VsdCwgbWFyZ2luKTsKKworCXJlc3VsdC5mdWxsID0gZGZpeGVkX2RpdihyZXN1bHQsIHRt cCk7CisJcmVzdWx0LmZ1bGwgPSBkZml4ZWRfY2VpbChyZXN1bHQpOworCXJlcyA9IGRmaXhlZF90 cnVuYyhyZXN1bHQpOworCXJldHVybiByZXM7Cit9CitFWFBPUlRfU1lNQk9MKGRybV9kcF9jYWxj X3Bibl9tb2RlKTsKKworc3RhdGljIGludCB0ZXN0X2NhbGNfcGJuX21vZGUodm9pZCkKK3sKKwlp bnQgcmV0OworCXJldCA9IGRybV9kcF9jYWxjX3Bibl9tb2RlKDE1NDAwMCwgMzApOworCWlmIChy ZXQgIT0gNjg5KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXQgPSBkcm1fZHBfY2FsY19wYm5fbW9k ZSgyMzQwMDAsIDMwKTsKKwlpZiAocmV0ICE9IDEwNDcpCisJCXJldHVybiAtRUlOVkFMOworCXJl dHVybiAwOworfQorCisvKiB3ZSB3YW50IHRvIGtpY2sgdGhlIFRYIGFmdGVyIHdlJ3ZlIGFjayB0 aGUgdXAvZG93biBJUlFzLiAqLworc3RhdGljIHZvaWQgZHJtX2RwX21zdF9raWNrX3R4KHN0cnVj dCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKQoreworCXF1ZXVlX3dvcmsoc3lzdGVtX2xv bmdfd3EsICZtZ3ItPnR4X3dvcmspOworfQorCitzdGF0aWMgdm9pZCBkcm1fZHBfbXN0X2R1bXBf bXN0YihzdHJ1Y3Qgc2VxX2ZpbGUgKm0sCisJCQkJIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAq bXN0YikKK3sKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0OworCWludCB0YWJzID0gbXN0 Yi0+bGN0OworCWNoYXIgcHJlZml4WzEwXTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB0 YWJzOyBpKyspCisJCXByZWZpeFtpXSA9ICdcdCc7CisJcHJlZml4W2ldID0gJ1wwJzsKKworCXNl cV9wcmludGYobSwgIiVzbXN0OiAlcCwgJWRcbiIsIHByZWZpeCwgbXN0YiwgbXN0Yi0+bnVtX3Bv cnRzKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcnQsICZtc3RiLT5wb3J0cywgbmV4dCkgewor CQlzZXFfcHJpbnRmKG0sICIlc3BvcnQ6ICVkOiBkZHBzOiAlZCBsZHBzOiAlZCwgJXAsIGNvbm46 ICVwXG4iLCBwcmVmaXgsIHBvcnQtPnBvcnRfbnVtLCBwb3J0LT5kZHBzLCBwb3J0LT5sZHBzLCBw b3J0LCBwb3J0LT5jb25uZWN0b3IpOworCQlpZiAocG9ydC0+bXN0YikKKwkJCWRybV9kcF9tc3Rf ZHVtcF9tc3RiKG0sIHBvcnQtPm1zdGIpOworCX0KK30KKworc3RhdGljIGJvb2wgZHVtcF9kcF9w YXlsb2FkX3RhYmxlKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLAorCQkJCSAg Y2hhciAqYnVmKQoreworCWludCByZXQ7CisJaW50IGk7CisJbXV0ZXhfbG9jaygmbWdyLT5hdXhf bG9jayk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlyZXQgPSBkcm1fZHBfZHBjZF9y ZWFkKG1nci0+YXV4LCBEUF9QQVlMT0FEX1RBQkxFX1VQREFURV9TVEFUVVMgKyAoaSAqIDE2KSwg JmJ1ZltpICogMTZdLCAxNik7CisJCWlmIChyZXQgIT0gMTYpCisJCQlicmVhazsKKwl9CisJbXV0 ZXhfdW5sb2NrKCZtZ3ItPmF1eF9sb2NrKTsKKwlpZiAoaSA9PSA0KQorCQlyZXR1cm4gdHJ1ZTsK KwlyZXR1cm4gZmFsc2U7Cit9CisKKy8qKgorICogZHJtX2RwX21zdF9kdW1wX3RvcG9sb2d5KCk6 IGR1bXAgdG9wb2xvZ3kgdG8gc2VxIGZpbGUuCisgKiBAbTogc2VxX2ZpbGUgdG8gZHVtcCBvdXRw dXQgdG8KKyAqIEBtZ3I6IG1hbmFnZXIgdG8gZHVtcCBjdXJyZW50IHRvcG9sb2d5IGZvci4KKyAq CisgKiBoZWxwZXIgdG8gZHVtcCBNU1QgdG9wb2xvZ3kgdG8gYSBzZXEgZmlsZSBmb3IgZGVidWdm cy4KKyAqLwordm9pZCBkcm1fZHBfbXN0X2R1bXBfdG9wb2xvZ3koc3RydWN0IHNlcV9maWxlICpt LAorCQkJICAgICAgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpCit7CisJaW50 IGk7CisJc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydDsKKwltdXRleF9sb2NrKCZtZ3ItPmxv Y2spOworCWlmIChtZ3ItPm1zdF9wcmltYXJ5KQorCQlkcm1fZHBfbXN0X2R1bXBfbXN0YihtLCBt Z3ItPm1zdF9wcmltYXJ5KTsKKworCS8qIGR1bXAgVkNQSXMgKi8KKwltdXRleF91bmxvY2soJm1n ci0+bG9jayk7CisKKwltdXRleF9sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJc2VxX3ByaW50 ZihtLCAidmNwaTogJWx4XG4iLCBtZ3ItPnBheWxvYWRfbWFzayk7CisKKwlmb3IgKGkgPSAwOyBp IDwgbWdyLT5tYXhfcGF5bG9hZHM7IGkrKykgeworCQlpZiAobWdyLT5wcm9wb3NlZF92Y3Bpc1tp XSkgeworCQkJcG9ydCA9IGNvbnRhaW5lcl9vZihtZ3ItPnByb3Bvc2VkX3ZjcGlzW2ldLCBzdHJ1 Y3QgZHJtX2RwX21zdF9wb3J0LCB2Y3BpKTsKKwkJCXNlcV9wcmludGYobSwgInZjcGkgJWQ6ICVk ICVkICVkXG4iLCBpLCBwb3J0LT5wb3J0X251bSwgcG9ydC0+dmNwaS52Y3BpLCBwb3J0LT52Y3Bp Lm51bV9zbG90cyk7CisJCX0gZWxzZQorCQkJc2VxX3ByaW50ZihtLCAidmNwaSAlZDp1bnNlZFxu IiwgaSk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBtZ3ItPm1heF9wYXlsb2FkczsgaSsrKSB7CisJ CXNlcV9wcmludGYobSwgInBheWxvYWQgJWQ6ICVkLCAlZCwgJWRcbiIsCisJCQkgICBpLAorCQkJ ICAgbWdyLT5wYXlsb2Fkc1tpXS5wYXlsb2FkX3N0YXRlLAorCQkJICAgbWdyLT5wYXlsb2Fkc1tp XS5zdGFydF9zbG90LAorCQkJICAgbWdyLT5wYXlsb2Fkc1tpXS5udW1fc2xvdHMpOworCisKKwl9 CisJbXV0ZXhfdW5sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisKKwltdXRleF9sb2NrKCZtZ3It PmxvY2spOworCWlmIChtZ3ItPm1zdF9wcmltYXJ5KSB7CisJCXU4IGJ1Zls2NF07CisJCWJvb2wg YnJldDsKKwkJaW50IHJldDsKKwkJcmV0ID0gZHJtX2RwX2RwY2RfcmVhZChtZ3ItPmF1eCwgRFBf RFBDRF9SRVYsIGJ1ZiwgRFBfUkVDRUlWRVJfQ0FQX1NJWkUpOworCQlzZXFfcHJpbnRmKG0sICJk cGNkOiAiKTsKKwkJZm9yIChpID0gMDsgaSA8IERQX1JFQ0VJVkVSX0NBUF9TSVpFOyBpKyspCisJ CQlzZXFfcHJpbnRmKG0sICIlMDJ4ICIsIGJ1ZltpXSk7CisJCXNlcV9wcmludGYobSwgIlxuIik7 CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIERQX0ZBVVhfQ0FQLCBidWYsIDIp OworCQlzZXFfcHJpbnRmKG0sICJmYXV4L21zdDogIik7CisJCWZvciAoaSA9IDA7IGkgPCAyOyBp KyspCisJCQlzZXFfcHJpbnRmKG0sICIlMDJ4ICIsIGJ1ZltpXSk7CisJCXNlcV9wcmludGYobSwg IlxuIik7CisJCXJldCA9IGRybV9kcF9kcGNkX3JlYWQobWdyLT5hdXgsIERQX01TVE1fQ1RSTCwg YnVmLCAxKTsKKwkJc2VxX3ByaW50ZihtLCAibXN0IGN0cmw6ICIpOworCQlmb3IgKGkgPSAwOyBp IDwgMTsgaSsrKQorCQkJc2VxX3ByaW50ZihtLCAiJTAyeCAiLCBidWZbaV0pOworCQlzZXFfcHJp bnRmKG0sICJcbiIpOworCisJCWJyZXQgPSBkdW1wX2RwX3BheWxvYWRfdGFibGUobWdyLCBidWYp OworCQlpZiAoYnJldCA9PSB0cnVlKSB7CisJCQlzZXFfcHJpbnRmKG0sICJwYXlsb2FkIHRhYmxl OiAiKTsKKwkJCWZvciAoaSA9IDA7IGkgPCA2MzsgaSsrKQorCQkJCXNlcV9wcmludGYobSwgIiUw MnggIiwgYnVmW2ldKTsKKwkJCXNlcV9wcmludGYobSwgIlxuIik7CisJCX0KKworCX0KKworCW11 dGV4X3VubG9jaygmbWdyLT5sb2NrKTsKKworfQorRVhQT1JUX1NZTUJPTChkcm1fZHBfbXN0X2R1 bXBfdG9wb2xvZ3kpOworCitzdGF0aWMgdm9pZCBkcm1fZHBfdHhfd29yayhzdHJ1Y3Qgd29ya19z dHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IgPSBj b250YWluZXJfb2Yod29yaywgc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyLCB0eF93b3Jr KTsKKworCW11dGV4X2xvY2soJm1nci0+cWxvY2spOworCWlmIChtZ3ItPnR4X2Rvd25faW5fcHJv Z3Jlc3MpCisJCXByb2Nlc3Nfc2luZ2xlX2Rvd25fdHhfcWxvY2sobWdyKTsKKwltdXRleF91bmxv Y2soJm1nci0+cWxvY2spOworfQorCisvKioKKyAqIGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX2lu aXQgLSBpbml0aWFsaXNlIGEgdG9wb2xvZ3kgbWFuYWdlcgorICogQG1ncjogbWFuYWdlciBzdHJ1 Y3QgdG8gaW5pdGlhbGlzZQorICogQGRldjogZGV2aWNlIHByb3ZpZGluZyB0aGlzIHN0cnVjdHVy ZSAtIGZvciBpMmMgYWRkaXRpb24uCisgKiBAYXV4OiBEUCBoZWxwZXIgYXV4IGNoYW5uZWwgdG8g dGFsayB0byB0aGlzIGRldmljZQorICogQG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzOiBodyBz cGVjaWZpYyBEUENEIHRyYW5zYWN0aW9uIGxpbWl0CisgKiBAbWF4X3BheWxvYWRzOiBtYXhpbXVt IG51bWJlciBvZiBwYXlsb2FkcyB0aGlzIEdQVSBjYW4gc291cmNlCisgKiBAY29ubl9iYXNlX2lk OiB0aGUgY29ubmVjdG9yIG9iamVjdCBJRCB0aGUgTVNUIGRldmljZSBpcyBjb25uZWN0ZWQgdG8u CisgKgorICogUmV0dXJuIDAgZm9yIHN1Y2Nlc3MsIG9yIG5lZ2F0aXZlIGVycm9yIGNvZGUgb24g ZmFpbHVyZQorICovCitpbnQgZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfaW5pdChzdHJ1Y3QgZHJt X2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwKKwkJCQkgc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1 Y3QgZHJtX2RwX2F1eCAqYXV4LAorCQkJCSBpbnQgbWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXMs CisJCQkJIGludCBtYXhfcGF5bG9hZHMsIGludCBjb25uX2Jhc2VfaWQpCit7CisJbXV0ZXhfaW5p dCgmbWdyLT5sb2NrKTsKKwltdXRleF9pbml0KCZtZ3ItPnFsb2NrKTsKKwltdXRleF9pbml0KCZt Z3ItPmF1eF9sb2NrKTsKKwltdXRleF9pbml0KCZtZ3ItPnBheWxvYWRfbG9jayk7CisJSU5JVF9M SVNUX0hFQUQoJm1nci0+dHhfbXNnX3VwcSk7CisJSU5JVF9MSVNUX0hFQUQoJm1nci0+dHhfbXNn X2Rvd25xKTsKKwlJTklUX1dPUksoJm1nci0+d29yaywgZHJtX2RwX21zdF9saW5rX3Byb2JlX3dv cmspOworCUlOSVRfV09SSygmbWdyLT50eF93b3JrLCBkcm1fZHBfdHhfd29yayk7CisJaW5pdF93 YWl0cXVldWVfaGVhZCgmbWdyLT50eF93YWl0cSk7CisJbWdyLT5kZXYgPSBkZXY7CisJbWdyLT5h dXggPSBhdXg7CisJbWdyLT5tYXhfZHBjZF90cmFuc2FjdGlvbl9ieXRlcyA9IG1heF9kcGNkX3Ry YW5zYWN0aW9uX2J5dGVzOworCW1nci0+bWF4X3BheWxvYWRzID0gbWF4X3BheWxvYWRzOworCW1n ci0+Y29ubl9iYXNlX2lkID0gY29ubl9iYXNlX2lkOworCW1nci0+cGF5bG9hZHMgPSBrY2FsbG9j KG1heF9wYXlsb2Fkcywgc2l6ZW9mKHN0cnVjdCBkcm1fZHBfcGF5bG9hZCksIEdGUF9LRVJORUwp OworCWlmICghbWdyLT5wYXlsb2FkcykKKwkJcmV0dXJuIC1FTk9NRU07CisJbWdyLT5wcm9wb3Nl ZF92Y3BpcyA9IGtjYWxsb2MobWF4X3BheWxvYWRzLCBzaXplb2Yoc3RydWN0IGRybV9kcF92Y3Bp ICopLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW1nci0+cHJvcG9zZWRfdmNwaXMpCisJCXJldHVybiAt RU5PTUVNOworCXNldF9iaXQoMCwgJm1nci0+cGF5bG9hZF9tYXNrKTsKKwl0ZXN0X2NhbGNfcGJu X21vZGUoKTsKKwlyZXR1cm4gMDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3BvbG9n eV9tZ3JfaW5pdCk7CisKKy8qKgorICogZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfZGVzdHJveSgp IC0gZGVzdHJveSB0b3BvbG9neSBtYW5hZ2VyLgorICogQG1ncjogbWFuYWdlciB0byBkZXN0cm95 CisgKi8KK3ZvaWQgZHJtX2RwX21zdF90b3BvbG9neV9tZ3JfZGVzdHJveShzdHJ1Y3QgZHJtX2Rw X21zdF90b3BvbG9neV9tZ3IgKm1ncikKK3sKKwltdXRleF9sb2NrKCZtZ3ItPnBheWxvYWRfbG9j ayk7CisJa2ZyZWUobWdyLT5wYXlsb2Fkcyk7CisJbWdyLT5wYXlsb2FkcyA9IE5VTEw7CisJa2Zy ZWUobWdyLT5wcm9wb3NlZF92Y3Bpcyk7CisJbWdyLT5wcm9wb3NlZF92Y3BpcyA9IE5VTEw7CisJ bXV0ZXhfdW5sb2NrKCZtZ3ItPnBheWxvYWRfbG9jayk7CisJbWdyLT5kZXYgPSBOVUxMOworCW1n ci0+YXV4ID0gTlVMTDsKK30KK0VYUE9SVF9TWU1CT0woZHJtX2RwX21zdF90b3BvbG9neV9tZ3Jf ZGVzdHJveSk7CisKKy8qIEkyQyBkZXZpY2UgKi8KK3N0YXRpYyBpbnQgZHJtX2RwX21zdF9pMmNf eGZlcihzdHJ1Y3QgaTJjX2FkYXB0ZXIgKmFkYXB0ZXIsIHN0cnVjdCBpMmNfbXNnICptc2dzLAor CQkJICAgICAgIGludCBudW0pCit7CisJc3RydWN0IGRybV9kcF9hdXggKmF1eCA9IGFkYXB0ZXIt PmFsZ29fZGF0YTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0ID0gY29udGFpbmVyX29m KGF1eCwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCwgYXV4KTsKKwlzdHJ1Y3QgZHJtX2RwX21zdF9i cmFuY2ggKm1zdGI7CisJc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IgPSBwb3J0 LT5tZ3I7CisJdW5zaWduZWQgaW50IGk7CisJYm9vbCByZWFkaW5nID0gZmFsc2U7CisJc3RydWN0 IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgbXNnOworCXN0cnVjdCBkcm1fZHBfc2lkZWJh bmRfbXNnX3R4ICp0eG1zZyA9IE5VTEw7CisJaW50IHJldDsKKworCW1zdGIgPSBkcm1fZHBfZ2V0 X3ZhbGlkYXRlZF9tc3RiX3JlZihtZ3IsIHBvcnQtPnBhcmVudCk7CisJaWYgKCFtc3RiKQorCQly ZXR1cm4gLUVSRU1PVEVJTzsKKworCS8qIGNvbnN0cnVjdCBpMmMgbXNnICovCisJLyogc2VlIGlm IGxhc3QgbXNnIGlzIGEgcmVhZCAqLworCWlmIChtc2dzW251bSAtIDFdLmZsYWdzICYgSTJDX01f UkQpCisJCXJlYWRpbmcgPSB0cnVlOworCisJaWYgKCFyZWFkaW5nKSB7CisJCURSTV9ERUJVR19L TVMoIlVuc3VwcG9ydGVkIEkyQyB0cmFuc2FjdGlvbiBmb3IgTVNUIGRldmljZVxuIik7CisJCXJl dCA9IC1FSU87CisJCWdvdG8gb3V0OworCX0KKworCW1zZy5yZXFfdHlwZSA9IERQX1JFTU9URV9J MkNfUkVBRDsKKwltc2cudS5pMmNfcmVhZC5udW1fdHJhbnNhY3Rpb25zID0gbnVtIC0gMTsKKwlt c2cudS5pMmNfcmVhZC5wb3J0X251bWJlciA9IHBvcnQtPnBvcnRfbnVtOworCWZvciAoaSA9IDA7 IGkgPCBudW0gLSAxOyBpKyspIHsKKwkJbXNnLnUuaTJjX3JlYWQudHJhbnNhY3Rpb25zW2ldLmky Y19kZXZfaWQgPSBtc2dzW2ldLmFkZHI7CisJCW1zZy51LmkyY19yZWFkLnRyYW5zYWN0aW9uc1tp XS5udW1fYnl0ZXMgPSBtc2dzW2ldLmxlbjsKKwkJbWVtY3B5KCZtc2cudS5pMmNfcmVhZC50cmFu c2FjdGlvbnNbaV0uYnl0ZXMsIG1zZ3NbaV0uYnVmLCBtc2dzW2ldLmxlbik7CisJfQorCW1zZy51 LmkyY19yZWFkLnJlYWRfaTJjX2RldmljZV9pZCA9IG1zZ3NbbnVtIC0gMV0uYWRkcjsKKwltc2cu dS5pMmNfcmVhZC5udW1fYnl0ZXNfcmVhZCA9IG1zZ3NbbnVtIC0gMV0ubGVuOworCisJdHhtc2cg PSBremFsbG9jKHNpemVvZigqdHhtc2cpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXR4bXNnKSB7CisJ CXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0OworCX0KKworCXR4bXNnLT5kc3QgPSBtc3RiOwor CWRybV9kcF9lbmNvZGVfc2lkZWJhbmRfcmVxKCZtc2csIHR4bXNnKTsKKworCWRybV9kcF9xdWV1 ZV9kb3duX3R4KG1nciwgdHhtc2cpOworCisJcmV0ID0gZHJtX2RwX21zdF93YWl0X3R4X3JlcGx5 KG1zdGIsIHR4bXNnKTsKKwlpZiAocmV0ID4gMCkgeworCisJCWlmICh0eG1zZy0+cmVwbHkucmVw bHlfdHlwZSA9PSAxKSB7IC8qIGdvdCBhIE5BSyBiYWNrICovCisJCQlyZXQgPSAtRVJFTU9URUlP OworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKHR4bXNnLT5yZXBseS51LnJlbW90ZV9pMmNfcmVh ZF9hY2subnVtX2J5dGVzICE9IG1zZ3NbbnVtIC0gMV0ubGVuKSB7CisJCQlyZXQgPSAtRUlPOwor CQkJZ290byBvdXQ7CisJCX0KKwkJbWVtY3B5KG1zZ3NbbnVtIC0gMV0uYnVmLCB0eG1zZy0+cmVw bHkudS5yZW1vdGVfaTJjX3JlYWRfYWNrLmJ5dGVzLCBtc2dzW251bSAtIDFdLmxlbik7CisJCXJl dCA9IG51bTsKKwl9CitvdXQ6CisJa2ZyZWUodHhtc2cpOworCWRybV9kcF9wdXRfbXN0X2JyYW5j aF9kZXZpY2UobXN0Yik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHUzMiBkcm1fZHBfbXN0 X2kyY19mdW5jdGlvbmFsaXR5KHN0cnVjdCBpMmNfYWRhcHRlciAqYWRhcHRlcikKK3sKKwlyZXR1 cm4gSTJDX0ZVTkNfSTJDIHwgSTJDX0ZVTkNfU01CVVNfRU1VTCB8CisJICAgICAgIEkyQ19GVU5D X1NNQlVTX1JFQURfQkxPQ0tfREFUQSB8CisJICAgICAgIEkyQ19GVU5DX1NNQlVTX0JMT0NLX1BS T0NfQ0FMTCB8CisJICAgICAgIEkyQ19GVU5DXzEwQklUX0FERFI7Cit9CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgaTJjX2FsZ29yaXRobSBkcm1fZHBfbXN0X2kyY19hbGdvID0geworCS5mdW5jdGlv bmFsaXR5ID0gZHJtX2RwX21zdF9pMmNfZnVuY3Rpb25hbGl0eSwKKwkubWFzdGVyX3hmZXIgPSBk cm1fZHBfbXN0X2kyY194ZmVyLAorfTsKKworLyoqCisgKiBkcm1fZHBfbXN0X3JlZ2lzdGVyX2ky Y19idXMoKSAtIHJlZ2lzdGVyIGFuIEkyQyBhZGFwdGVyIGZvciBJMkMtb3Zlci1BVVgKKyAqIEBh dXg6IERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3Mg b3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIG9uIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgZHJt X2RwX21zdF9yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCit7CisJYXV4 LT5kZGMuYWxnbyA9ICZkcm1fZHBfbXN0X2kyY19hbGdvOworCWF1eC0+ZGRjLmFsZ29fZGF0YSA9 IGF1eDsKKwlhdXgtPmRkYy5yZXRyaWVzID0gMzsKKworCWF1eC0+ZGRjLmNsYXNzID0gSTJDX0NM QVNTX0REQzsKKwlhdXgtPmRkYy5vd25lciA9IFRISVNfTU9EVUxFOworCWF1eC0+ZGRjLmRldi5w YXJlbnQgPSBhdXgtPmRldjsKKwlhdXgtPmRkYy5kZXYub2Zfbm9kZSA9IGF1eC0+ZGV2LT5vZl9u b2RlOworCisJc3RybGNweShhdXgtPmRkYy5uYW1lLCBhdXgtPm5hbWUgPyBhdXgtPm5hbWUgOiBk ZXZfbmFtZShhdXgtPmRldiksCisJCXNpemVvZihhdXgtPmRkYy5uYW1lKSk7CisKKwlyZXR1cm4g aTJjX2FkZF9hZGFwdGVyKCZhdXgtPmRkYyk7Cit9CisKKy8qKgorICogZHJtX2RwX21zdF91bnJl Z2lzdGVyX2kyY19idXMoKSAtIHVucmVnaXN0ZXIgYW4gSTJDLW92ZXItQVVYIGFkYXB0ZXIKKyAq IEBhdXg6IERpc3BsYXlQb3J0IEFVWCBjaGFubmVsCisgKi8KK3N0YXRpYyB2b2lkIGRybV9kcF9t c3RfdW5yZWdpc3Rlcl9pMmNfYnVzKHN0cnVjdCBkcm1fZHBfYXV4ICphdXgpCit7CisJaTJjX2Rl bF9hZGFwdGVyKCZhdXgtPmRkYyk7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RybS9kcm1fZHBf bXN0X2hlbHBlci5oIGIvaW5jbHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaApuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjI2ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvaW5j bHVkZS9kcm0vZHJtX2RwX21zdF9oZWxwZXIuaApAQCAtMCwwICsxLDUwNyBAQAorLyoKKyAqIENv cHlyaWdodCDCqSAyMDE0IFJlZCBIYXQuCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHks IG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCisgKiBk b2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZl ZSwgcHJvdmlkZWQgdGhhdAorICogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGlu IGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodAorICogbm90aWNlIGFuZCB0 aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24s IGFuZAorICogdGhhdCB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm90IGJlIHVz ZWQgaW4gYWR2ZXJ0aXNpbmcgb3IKKyAqIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1 dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywKKyAqIHdyaXR0ZW4gcHJpb3Ig cGVybWlzc2lvbi4gIFRoZSBjb3B5cmlnaHQgaG9sZGVycyBtYWtlIG5vIHJlcHJlc2VudGF0aW9u cworICogYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJw b3NlLiAgSXQgaXMgcHJvdmlkZWQgImFzCisgKiBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxp ZWQgd2FycmFudHkuCisgKgorICogVEhFIENPUFlSSUdIVCBIT0xERVJTIERJU0NMQUlNIEFMTCBX QVJSQU5USUVTIFdJVEggUkVHQVJEIFRPIFRISVMgU09GVFdBUkUsCisgKiBJTkNMVURJTkcgQUxM IElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5P CisgKiBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkg U1BFQ0lBTCwgSU5ESVJFQ1QgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFN QUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLAorICogREFUQSBPUiBQ Uk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBP VEhFUgorICogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9O IFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRQorICogT0YgVEhJUyBTT0ZUV0FSRS4KKyAqLwor I2lmbmRlZiBfRFJNX0RQX01TVF9IRUxQRVJfSF8KKyNkZWZpbmUgX0RSTV9EUF9NU1RfSEVMUEVS X0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGRybS9kcm1fZHBfaGVs cGVyLmg+CisKK3N0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaDsKKworLyoqCisgKiBzdHJ1Y3QgZHJt X2RwX3ZjcGkgLSBWaXJ0dWFsIENoYW5uZWwgUGF5bG9hZCBJZGVudGlmZXIKKyAqIEB2Y3BpOiBW aXJ0dWFsIGNoYW5uZWwgSUQuCisgKiBAcGJuOiBQYXlsb2FkIEJhbmR3aWR0aCBOdW1iZXIgZm9y IHRoaXMgY2hhbm5lbAorICogQGFsaWduZWRfcGJuOiBQQk4gYWxpZ25lZCB3aXRoIHNsb3Qgc2l6 ZQorICogQG51bV9zbG90czogbnVtYmVyIG9mIHNsb3RzIGZvciB0aGlzIFBCTgorICovCitzdHJ1 Y3QgZHJtX2RwX3ZjcGkgeworCWludCB2Y3BpOworCWludCBwYm47CisJaW50IGFsaWduZWRfcGJu OworCWludCBudW1fc2xvdHM7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQg LSBNU1QgcG9ydAorICogQGtyZWY6IHJlZmVyZW5jZSBjb3VudCBmb3IgdGhpcyBwb3J0LgorICog QGd1aWRfdmFsaWQ6IGZvciBEUCAxLjIgZGV2aWNlcyBpZiB3ZSBoYXZlIHZhbGlkYXRlZCB0aGUg R1VJRC4KKyAqIEBndWlkOiBndWlkIGZvciBEUCAxLjIgZGV2aWNlIG9uIHRoaXMgcG9ydC4KKyAq IEBwb3J0X251bTogcG9ydCBudW1iZXIKKyAqIEBpbnB1dDogaWYgdGhpcyBwb3J0IGlzIGFuIGlu cHV0IHBvcnQuCisgKiBAbWNzOiBtZXNzYWdlIGNhcGFiaWxpdHkgc3RhdHVzIC0gRFAgMS4yIHNw ZWMuCisgKiBAZGRwczogRGlzcGxheVBvcnQgRGV2aWNlIFBsdWcgU3RhdHVzIC0gRFAgMS4yCisg KiBAcGR0OiBQZWVyIERldmljZSBUeXBlCisgKiBAbGRwczogTGVnYWN5IERldmljZSBQbHVnIFN0 YXR1cworICogQGRwY2RfcmV2OiBEUENEIHJldmlzaW9uIG9mIGRldmljZSBvbiB0aGlzIHBvcnQK KyAqIEBhdmFpbGFibGVfcGJuOiBBdmFpbGFibGUgYmFuZHdpZHRoIGZvciB0aGlzIHBvcnQuCisg KiBAbmV4dDogbGluayB0byBuZXh0IHBvcnQgb24gdGhpcyBicmFuY2ggZGV2aWNlCisgKiBAbXN0 YjogYnJhbmNoIGRldmljZSBhdHRhY2ggYmVsb3cgdGhpcyBwb3J0CisgKiBAYXV4OiBpMmMgYXV4 IHRyYW5zcG9ydCB0byB0YWxrIHRvIGRldmljZSBjb25uZWN0ZWQgdG8gdGhpcyBwb3J0LgorICog QHBhcmVudDogYnJhbmNoIGRldmljZSBwYXJlbnQgb2YgdGhpcyBwb3J0CisgKiBAdmNwaTogVmly dHVhbCBDaGFubmVsIFBheWxvYWQgaW5mbyBmb3IgdGhpcyBwb3J0LgorICogQGNvbm5lY3Rvcjog RFJNIGNvbm5lY3RvciB0aGlzIHBvcnQgaXMgY29ubmVjdGVkIHRvLgorICogQG1ncjogdG9wb2xv Z3kgbWFuYWdlciB0aGlzIHBvcnQgbGl2ZXMgdW5kZXIuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUg cmVwcmVzZW50cyBhbiBNU1QgcG9ydCBlbmRwb2ludCBvbiBhIGRldmljZSBzb21ld2hlcmUKKyAq IGluIHRoZSBNU1QgdG9wb2xvZ3kuCisgKi8KK3N0cnVjdCBkcm1fZHBfbXN0X3BvcnQgeworCXN0 cnVjdCBrcmVmIGtyZWY7CisKKwkvKiBpZiBkcGNkIDEuMiBkZXZpY2UgaXMgb24gdGhpcyBwb3J0 IC0gaXRzIEdVSUQgaW5mbyAqLworCWJvb2wgZ3VpZF92YWxpZDsKKwl1OCBndWlkWzE2XTsKKwor CXU4IHBvcnRfbnVtOworCWJvb2wgaW5wdXQ7CisJYm9vbCBtY3M7CisJYm9vbCBkZHBzOworCXU4 IHBkdDsKKwlib29sIGxkcHM7CisJdTggZHBjZF9yZXY7CisJdWludDE2X3QgYXZhaWxhYmxlX3Bi bjsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5leHQ7CisJc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoICpt c3RiOyAvKiBwb2ludGVyIHRvIGFuIG1zdGIgaWYgdGhpcyBwb3J0IGhhcyBvbmUgKi8KKwlzdHJ1 Y3QgZHJtX2RwX2F1eCBhdXg7IC8qIGkyYyBidXMgZm9yIHRoaXMgcG9ydD8gKi8KKwlzdHJ1Y3Qg ZHJtX2RwX21zdF9icmFuY2ggKnBhcmVudDsKKworCXN0cnVjdCBkcm1fZHBfdmNwaSB2Y3BpOwor CXN0cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3I7CisJc3RydWN0IGRybV9kcF9tc3RfdG9w b2xvZ3lfbWdyICptZ3I7Cit9OworCisvKioKKyAqIHN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAt IE1TVCBicmFuY2ggZGV2aWNlLgorICogQGtyZWY6IHJlZmVyZW5jZSBjb3VudCBmb3IgdGhpcyBw b3J0LgorICogQHJhZDogUmVsYXRpdmUgQWRkcmVzcyB0byB0YWxrIHRvIHRoaXMgYnJhbmNoIGRl dmljZS4KKyAqIEBsY3Q6IExpbmsgY291bnQgdG90YWwgdG8gdGFsayB0byB0aGlzIGJyYW5jaCBk ZXZpY2UuCisgKiBAbnVtX3BvcnRzOiBudW1iZXIgb2YgcG9ydHMgb24gdGhlIGJyYW5jaC4KKyAq IEBtc2dfc2xvdHM6IG9uZSBiaXQgcGVyIHRyYW5zbWl0dGVkIG1zZyBzbG90LgorICogQHBvcnRz OiBsaW5rZWQgbGlzdCBvZiBwb3J0cyBvbiB0aGlzIGJyYW5jaC4KKyAqIEBwb3J0X3BhcmVudDog cG9pbnRlciB0byB0aGUgcG9ydCBwYXJlbnQsIE5VTEwgaWYgdG9wbGV2ZWwuCisgKiBAbWdyOiB0 b3BvbG9neSBtYW5hZ2VyIGZvciB0aGlzIGJyYW5jaCBkZXZpY2UuCisgKiBAdHhfc2xvdHM6IHRy YW5zbWlzc2lvbiBzbG90cyBmb3IgdGhpcyBkZXZpY2UuCisgKiBAbGFzdF9zZXFubzogbGFzdCBz ZXF1ZW5jZSBudW1iZXIgdXNlZCB0byB0YWxrIHRvIHRoaXMuCisgKiBAbGlua19hZGRyZXNzX3Nl bnQ6IGlmIGEgbGluayBhZGRyZXNzIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCB0byB0aGlzIGRldmlj ZSB5ZXQuCisgKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhbiBNU1QgYnJhbmNoIGRl dmljZSwgdGhlcmUgaXMgb25lCisgKiBwcmltYXJ5IGJyYW5jaCBkZXZpY2UgYXQgdGhlIHJvb3Qs IGFsb25nIHdpdGggYW55IG90aGVycyBjb25uZWN0ZWQKKyAqIHRvIGRvd25zdHJlYW0gcG9ydHMK KyAqLworc3RydWN0IGRybV9kcF9tc3RfYnJhbmNoIHsKKwlzdHJ1Y3Qga3JlZiBrcmVmOworCXU4 IHJhZFs4XTsKKwl1OCBsY3Q7CisJaW50IG51bV9wb3J0czsKKworCWludCBtc2dfc2xvdHM7CisJ c3RydWN0IGxpc3RfaGVhZCBwb3J0czsKKworCS8qIGxpc3Qgb2YgdHggb3BzIHF1ZXVlIGZvciB0 aGlzIHBvcnQgKi8KKwlzdHJ1Y3QgZHJtX2RwX21zdF9wb3J0ICpwb3J0X3BhcmVudDsKKwlzdHJ1 Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncjsKKworCS8qIHNsb3RzIGFyZSBwcm90ZWN0 ZWQgYnkgbXN0Yi0+bWdyLT5xbG9jayAqLworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4 ICp0eF9zbG90c1syXTsKKwlpbnQgbGFzdF9zZXFubzsKKwlib29sIGxpbmtfYWRkcmVzc19zZW50 OworfTsKKworCisvKiBzaWRlYmFuZCBtc2cgaGVhZGVyIC0gbm90IGJpdCBzdHJ1Y3QgKi8KK3N0 cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX2hkciB7CisJdTggbGN0OworCXU4IGxjcjsKKwl1OCBy YWRbOF07CisJYm9vbCBicm9hZGNhc3Q7CisJYm9vbCBwYXRoX21zZzsKKwl1OCBtc2dfbGVuOwor CWJvb2wgc29tdDsKKwlib29sIGVvbXQ7CisJYm9vbCBzZXFubzsKK307CisKK3N0cnVjdCBkcm1f ZHBfbmFrX3JlcGx5IHsKKwl1OCBndWlkWzE2XTsKKwl1OCByZWFzb247CisJdTggbmFrX2RhdGE7 Cit9OworCitzdHJ1Y3QgZHJtX2RwX2xpbmtfYWRkcmVzc19hY2tfcmVwbHkgeworCXU4IGd1aWRb MTZdOworCXU4IG5wb3J0czsKKwlzdHJ1Y3QgZHJtX2RwX2xpbmtfYWRkcl9yZXBseV9wb3J0IHsK KwkJYm9vbCBpbnB1dF9wb3J0OworCQl1OCBwZWVyX2RldmljZV90eXBlOworCQl1OCBwb3J0X251 bWJlcjsKKwkJYm9vbCBtY3M7CisJCWJvb2wgZGRwczsKKwkJYm9vbCBsZWdhY3lfZGV2aWNlX3Bs dWdfc3RhdHVzOworCQl1OCBkcGNkX3JldmlzaW9uOworCQl1OCBwZWVyX2d1aWRbMTZdOworCQli b29sIG51bV9zZHBfc3RyZWFtczsKKwkJYm9vbCBudW1fc2RwX3N0cmVhbV9zaW5rczsKKwl9IHBv cnRzWzE2XTsKK307CisKK3N0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2RfcmVhZF9hY2tfcmVwbHkg eworCXU4IHBvcnRfbnVtYmVyOworCXU4IG51bV9ieXRlczsKKwl1OCBieXRlc1syNTVdOworfTsK Kworc3RydWN0IGRybV9kcF9yZW1vdGVfZHBjZF93cml0ZV9hY2tfcmVwbHkgeworCXU4IHBvcnRf bnVtYmVyOworfTsKKworc3RydWN0IGRybV9kcF9yZW1vdGVfZHBjZF93cml0ZV9uYWtfcmVwbHkg eworCXU4IHBvcnRfbnVtYmVyOworCXU4IHJlYXNvbjsKKwl1OCBieXRlc193cml0dGVuX2JlZm9y ZV9mYWlsdXJlOworfTsKKworc3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3JlYWRfYWNrX3JlcGx5 IHsKKwl1OCBwb3J0X251bWJlcjsKKwl1OCBudW1fYnl0ZXM7CisJdTggYnl0ZXNbMjU1XTsKK307 CisKK3N0cnVjdCBkcm1fZHBfcmVtb3RlX2kyY19yZWFkX25ha19yZXBseSB7CisJdTggcG9ydF9u dW1iZXI7CisJdTggbmFrX3JlYXNvbjsKKwl1OCBpMmNfbmFrX3RyYW5zYWN0aW9uOworfTsKKwor c3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3dyaXRlX2Fja19yZXBseSB7CisJdTggcG9ydF9udW1i ZXI7Cit9OworCisKK3N0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4IHsKKwl1OCBjaHVua1s0 OF07CisJdTggbXNnWzI1Nl07CisJdTggY3VyY2h1bmtfbGVuOworCXU4IGN1cmNodW5rX2lkeDsg LyogY2h1bmsgd2UgYXJlIHBhcnNpbmcgbm93ICovCisJdTggY3VyY2h1bmtfaGRybGVuOworCXU4 IGN1cmxlbjsgLyogdG90YWwgbGVuZ3RoIG9mIHRoZSBtc2cgKi8KKwlib29sIGhhdmVfc29tdDsK Kwlib29sIGhhdmVfZW9tdDsKKwlzdHJ1Y3QgZHJtX2RwX3NpZGViYW5kX21zZ19oZHIgaW5pdGlh bF9oZHI7Cit9OworCisKK3N0cnVjdCBkcm1fZHBfYWxsb2NhdGVfcGF5bG9hZCB7CisJdTggcG9y dF9udW1iZXI7CisJdTggbnVtYmVyX3NkcF9zdHJlYW1zOworCXU4IHZjcGk7CisJdTE2IHBibjsK Kwl1OCBzZHBfc3RyZWFtX3NpbmtbOF07Cit9OworCitzdHJ1Y3QgZHJtX2RwX2FsbG9jYXRlX3Bh eWxvYWRfYWNrX3JlcGx5IHsKKwl1OCBwb3J0X251bWJlcjsKKwl1OCB2Y3BpOworCXUxNiBhbGxv Y2F0ZWRfcGJuOworfTsKKworc3RydWN0IGRybV9kcF9jb25uZWN0aW9uX3N0YXR1c19ub3RpZnkg eworCXU4IGd1aWRbMTZdOworCXU4IHBvcnRfbnVtYmVyOworCWJvb2wgbGVnYWN5X2RldmljZV9w bHVnX3N0YXR1czsKKwlib29sIGRpc3BsYXlwb3J0X2RldmljZV9wbHVnX3N0YXR1czsKKwlib29s IG1lc3NhZ2VfY2FwYWJpbGl0eV9zdGF0dXM7CisJYm9vbCBpbnB1dF9wb3J0OworCXU4IHBlZXJf ZGV2aWNlX3R5cGU7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9kcGNkX3JlYWQgeworCXU4 IHBvcnRfbnVtYmVyOworCXUzMiBkcGNkX2FkZHJlc3M7CisJdTggbnVtX2J5dGVzOworfTsKKwor c3RydWN0IGRybV9kcF9yZW1vdGVfZHBjZF93cml0ZSB7CisJdTggcG9ydF9udW1iZXI7CisJdTMy IGRwY2RfYWRkcmVzczsKKwl1OCBudW1fYnl0ZXM7CisJdTggYnl0ZXNbMjU1XTsKK307CisKK3N0 cnVjdCBkcm1fZHBfcmVtb3RlX2kyY19yZWFkIHsKKwl1OCBudW1fdHJhbnNhY3Rpb25zOworCXU4 IHBvcnRfbnVtYmVyOworCXN0cnVjdCB7CisJCXU4IGkyY19kZXZfaWQ7CisJCXU4IG51bV9ieXRl czsKKwkJdTggYnl0ZXNbMjU1XTsKKwkJdTggbm9fc3RvcF9iaXQ7CisJCXU4IGkyY190cmFuc2Fj dGlvbl9kZWxheTsKKwl9IHRyYW5zYWN0aW9uc1s0XTsKKwl1OCByZWFkX2kyY19kZXZpY2VfaWQ7 CisJdTggbnVtX2J5dGVzX3JlYWQ7Cit9OworCitzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfd3Jp dGUgeworCXU4IHBvcnRfbnVtYmVyOworCXU4IHdyaXRlX2kyY19kZXZpY2VfaWQ7CisJdTggbnVt X2J5dGVzOworCXU4IGJ5dGVzWzI1NV07Cit9OworCisvKiB0aGlzIGNvdmVycyBFTlVNX1JFU09V UkNFUywgUE9XRVJfRE9XTl9QSFksIFBPV0VSX1VQX1BIWSAqLworc3RydWN0IGRybV9kcF9wb3J0 X251bWJlcl9yZXEgeworCXU4IHBvcnRfbnVtYmVyOworfTsKKworc3RydWN0IGRybV9kcF9lbnVt X3BhdGhfcmVzb3VyY2VzX2Fja19yZXBseSB7CisJdTggcG9ydF9udW1iZXI7CisJdTE2IGZ1bGxf cGF5bG9hZF9id19udW1iZXI7CisJdTE2IGF2YWlsX3BheWxvYWRfYndfbnVtYmVyOworfTsKKwor LyogY292ZXJzIFBPV0VSX0RPV05fUEhZLCBQT1dFUl9VUF9QSFkgKi8KK3N0cnVjdCBkcm1fZHBf cG9ydF9udW1iZXJfcmVwIHsKKwl1OCBwb3J0X251bWJlcjsKK307CisKK3N0cnVjdCBkcm1fZHBf cXVlcnlfcGF5bG9hZCB7CisJdTggcG9ydF9udW1iZXI7CisJdTggdmNwaTsKK307CisKK3N0cnVj dCBkcm1fZHBfcmVzb3VyY2Vfc3RhdHVzX25vdGlmeSB7CisJdTggcG9ydF9udW1iZXI7CisJdTgg Z3VpZFsxNl07CisJdTE2IGF2YWlsYWJsZV9wYm47Cit9OworCitzdHJ1Y3QgZHJtX2RwX3F1ZXJ5 X3BheWxvYWRfYWNrX3JlcGx5IHsKKwl1OCBwb3J0X251bWJlcjsKKwl1OCBhbGxvY2F0ZWRfcGJu OworfTsKKworc3RydWN0IGRybV9kcF9zaWRlYmFuZF9tc2dfcmVxX2JvZHkgeworCXU4IHJlcV90 eXBlOworCXVuaW9uIGFja19yZXEgeworCQlzdHJ1Y3QgZHJtX2RwX2Nvbm5lY3Rpb25fc3RhdHVz X25vdGlmeSBjb25uX3N0YXQ7CisJCXN0cnVjdCBkcm1fZHBfcG9ydF9udW1iZXJfcmVxIHBvcnRf bnVtOworCQlzdHJ1Y3QgZHJtX2RwX3Jlc291cmNlX3N0YXR1c19ub3RpZnkgcmVzb3VyY2Vfc3Rh dDsKKworCQlzdHJ1Y3QgZHJtX2RwX3F1ZXJ5X3BheWxvYWQgcXVlcnlfcGF5bG9hZDsKKwkJc3Ry dWN0IGRybV9kcF9hbGxvY2F0ZV9wYXlsb2FkIGFsbG9jYXRlX3BheWxvYWQ7CisKKwkJc3RydWN0 IGRybV9kcF9yZW1vdGVfZHBjZF9yZWFkIGRwY2RfcmVhZDsKKwkJc3RydWN0IGRybV9kcF9yZW1v dGVfZHBjZF93cml0ZSBkcGNkX3dyaXRlOworCisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2kyY19y ZWFkIGkyY19yZWFkOworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfd3JpdGUgaTJjX3dyaXRl OworCX0gdTsKK307CisKK3N0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3JlcGx5X2JvZHkgewor CXU4IHJlcGx5X3R5cGU7CisJdTggcmVxX3R5cGU7CisJdW5pb24gYWNrX3JlcGxpZXMgeworCQlz dHJ1Y3QgZHJtX2RwX25ha19yZXBseSBuYWs7CisJCXN0cnVjdCBkcm1fZHBfbGlua19hZGRyZXNz X2Fja19yZXBseSBsaW5rX2FkZHI7CisJCXN0cnVjdCBkcm1fZHBfcG9ydF9udW1iZXJfcmVwIHBv cnRfbnVtYmVyOworCisJCXN0cnVjdCBkcm1fZHBfZW51bV9wYXRoX3Jlc291cmNlc19hY2tfcmVw bHkgcGF0aF9yZXNvdXJjZXM7CisJCXN0cnVjdCBkcm1fZHBfYWxsb2NhdGVfcGF5bG9hZF9hY2tf cmVwbHkgYWxsb2NhdGVfcGF5bG9hZDsKKwkJc3RydWN0IGRybV9kcF9xdWVyeV9wYXlsb2FkX2Fj a19yZXBseSBxdWVyeV9wYXlsb2FkOworCisJCXN0cnVjdCBkcm1fZHBfcmVtb3RlX2RwY2RfcmVh ZF9hY2tfcmVwbHkgcmVtb3RlX2RwY2RfcmVhZF9hY2s7CisJCXN0cnVjdCBkcm1fZHBfcmVtb3Rl X2RwY2Rfd3JpdGVfYWNrX3JlcGx5IHJlbW90ZV9kcGNkX3dyaXRlX2FjazsKKwkJc3RydWN0IGRy bV9kcF9yZW1vdGVfZHBjZF93cml0ZV9uYWtfcmVwbHkgcmVtb3RlX2RwY2Rfd3JpdGVfbmFjazsK KworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfcmVhZF9hY2tfcmVwbHkgcmVtb3RlX2kyY19y ZWFkX2FjazsKKwkJc3RydWN0IGRybV9kcF9yZW1vdGVfaTJjX3JlYWRfbmFrX3JlcGx5IHJlbW90 ZV9pMmNfcmVhZF9uYWNrOworCQlzdHJ1Y3QgZHJtX2RwX3JlbW90ZV9pMmNfd3JpdGVfYWNrX3Jl cGx5IHJlbW90ZV9pMmNfd3JpdGVfYWNrOworCX0gdTsKK307CisKKy8qIG1zZyBpcyBxdWV1ZWQg dG8gYmUgcHV0IGludG8gYSBzbG90ICovCisjZGVmaW5lIERSTV9EUF9TSURFQkFORF9UWF9RVUVV RUQgMAorLyogbXNnIGhhcyBzdGFydGVkIHRyYW5zbWl0dGluZyBvbiBhIHNsb3QgLSBzdGlsbCBv biBtc2dxICovCisjZGVmaW5lIERSTV9EUF9TSURFQkFORF9UWF9TVEFSVF9TRU5EIDEKKy8qIG1z ZyBoYXMgZmluaXNoZWQgdHJhbnNtaXR0aW5nIG9uIGEgc2xvdCAtIHJlbW92ZWQgZnJvbSBtc2dx IG9ubHkgaW4gc2xvdCAqLworI2RlZmluZSBEUk1fRFBfU0lERUJBTkRfVFhfU0VOVCAyCisvKiBt c2cgaGFzIHJlY2VpdmVkIGEgcmVzcG9uc2UgLSByZW1vdmVkIGZyb20gc2xvdCAqLworI2RlZmlu ZSBEUk1fRFBfU0lERUJBTkRfVFhfUlggMworI2RlZmluZSBEUk1fRFBfU0lERUJBTkRfVFhfVElN RU9VVCA0CisKK3N0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3R4IHsKKwl1OCBtc2dbMjU2XTsK Kwl1OCBjaHVua1s0OF07CisJdTggY3VyX29mZnNldDsKKwl1OCBjdXJfbGVuOworCXN0cnVjdCBk cm1fZHBfbXN0X2JyYW5jaCAqZHN0OworCXN0cnVjdCBsaXN0X2hlYWQgbmV4dDsKKwlpbnQgc2Vx bm87CisJaW50IHN0YXRlOworCWJvb2wgcGF0aF9tc2c7CisJc3RydWN0IGRybV9kcF9zaWRlYmFu ZF9tc2dfcmVwbHlfYm9keSByZXBseTsKK307CisKKy8qIHNpZGViYW5kIG1zZyBoYW5kbGVyICov CitzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3I7CitzdHJ1Y3QgZHJtX2RwX21zdF90b3Bv bG9neV9jYnMgeworCS8qIGNyZWF0ZSBhIGNvbm5lY3RvciBmb3IgYSBwb3J0ICovCisJc3RydWN0 IGRybV9jb25uZWN0b3IgKigqYWRkX2Nvbm5lY3Rvcikoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBfbXN0X3BvcnQgKnBvcnQsIGNoYXIgKnBhdGgpOwor CXZvaWQgKCpkZXN0cm95X2Nvbm5lY3Rvcikoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdy ICptZ3IsCisJCQkJICBzdHJ1Y3QgZHJtX2Nvbm5lY3RvciAqY29ubmVjdG9yKTsKKwl2b2lkICgq aG90cGx1Zykoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpOworCit9OworCisj ZGVmaW5lIERQX01BWF9QQVlMT0FEIChzaXplb2YodW5zaWduZWQgbG9uZykgKiA4KQorCisjZGVm aW5lIERQX1BBWUxPQURfTE9DQUwgMQorI2RlZmluZSBEUF9QQVlMT0FEX1JFTU9URSAyCisjZGVm aW5lIERQX1BBWUxPQURfREVMRVRFX0xPQ0FMIDMKKworc3RydWN0IGRybV9kcF9wYXlsb2FkIHsK KwlpbnQgcGF5bG9hZF9zdGF0ZTsKKwlpbnQgc3RhcnRfc2xvdDsKKwlpbnQgbnVtX3Nsb3RzOwor fTsKKworLyoqCisgKiBzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgLSBEaXNwbGF5UG9y dCBNU1QgbWFuYWdlcgorICogQGRldjogZGV2aWNlIHBvaW50ZXIgZm9yIGFkZGluZyBpMmMgZGV2 aWNlcyBldGMuCisgKiBAY2JzOiBjYWxsYmFja3MgZm9yIGNvbm5lY3RvciBhZGRpdGlvbiBhbmQg ZGVzdHJ1Y3Rpb24uCisgKiBAbWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXMgLSBtYXhpbXVtIG51 bWJlciBvZiBieXRlcyB0byByZWFkL3dyaXRlIGluIG9uZSBnby4KKyAqIEBhdXg6IGF1eCBjaGFu bmVsIGZvciB0aGUgRFAgY29ubmVjdG9yLgorICogQG1heF9wYXlsb2FkczogbWF4aW11bSBudW1i ZXIgb2YgcGF5bG9hZHMgdGhlIEdQVSBjYW4gZ2VuZXJhdGUuCisgKiBAY29ubl9iYXNlX2lkOiBE Uk0gY29ubmVjdG9yIElEIHRoaXMgbWdyIGlzIGNvbm5lY3RlZCB0by4KKyAqIEBkb3duX3JlcF9y ZWN2OiBtc2cgcmVjZWl2ZXIgc3RhdGUgZm9yIGRvd24gcmVwbGllcy4KKyAqIEB1cF9yZXFfcmVj djogbXNnIHJlY2VpdmVyIHN0YXRlIGZvciB1cCByZXF1ZXN0cy4KKyAqIEBsb2NrOiBwcm90ZWN0 cyBtc3Qgc3RhdGUsIHByaW1hcnksIGd1aWQsIGRwY2QuCisgKiBAYXV4X2xvY2s6IHByb3RlY3Rz IGF1eCBjaGFubmVsLgorICogQG1zdF9zdGF0ZTogaWYgdGhpcyBtYW5hZ2VyIGlzIGVuYWJsZWQg Zm9yIGFuIE1TVCBjYXBhYmxlIHBvcnQuCisgKiBAbXN0X3ByaW1hcnk6IHBvaW50ZXIgdG8gdGhl IHByaW1hcnkgYnJhbmNoIGRldmljZS4KKyAqIEBndWlkX3ZhbGlkOiBHVUlEIHZhbGlkIGZvciB0 aGUgcHJpbWFyeSBicmFuY2ggZGV2aWNlLgorICogQGd1aWQ6IEdVSUQgZm9yIHByaW1hcnkgcG9y dC4KKyAqIEBkcGNkOiBjYWNoZSBvZiBEUENEIGZvciBwcmltYXJ5IHBvcnQuCisgKiBAcGJuX2Rp djogUEJOIHRvIHNsb3RzIGRpdmlzb3IuCisgKgorICogVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyB0 aGUgdG9wbGV2ZWwgZGlzcGxheXBvcnQgTVNUIHRvcG9sb2d5IG1hbmFnZXIuCisgKiBUaGVyZSBz aG91bGQgYmUgb25lIGluc3RhbmNlIG9mIHRoaXMgZm9yIGV2ZXJ5IE1TVCBjYXBhYmxlIERQIGNv bm5lY3RvcgorICogb24gdGhlIEdQVS4KKyAqLworc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lf bWdyIHsKKworCXN0cnVjdCBkZXZpY2UgKmRldjsKKwlzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9n eV9jYnMgKmNiczsKKwlpbnQgbWF4X2RwY2RfdHJhbnNhY3Rpb25fYnl0ZXM7CisJc3RydWN0IGRy bV9kcF9hdXggKmF1eDsgLyogYXV4Y2ggZm9yIHRoaXMgdG9wb2xvZ3kgbWdyIHRvIHVzZSAqLwor CWludCBtYXhfcGF5bG9hZHM7CisJaW50IGNvbm5fYmFzZV9pZDsKKworCS8qIG9ubHkgZXZlciBh Y2Nlc3NlZCBmcm9tIHRoZSB3b3JrcXVldWUgLSB3aGljaCBzaG91bGQgYmUgc2VyaWFsaXNlZCAq LworCXN0cnVjdCBkcm1fZHBfc2lkZWJhbmRfbXNnX3J4IGRvd25fcmVwX3JlY3Y7CisJc3RydWN0 IGRybV9kcF9zaWRlYmFuZF9tc2dfcnggdXBfcmVxX3JlY3Y7CisKKwkvKiBwb2ludGVyIHRvIGlu Zm8gYWJvdXQgdGhlIGluaXRpYWwgTVNUIGRldmljZSAqLworCXN0cnVjdCBtdXRleCBsb2NrOyAv KiBwcm90ZWN0cyBtc3Rfc3RhdGUgKyBwcmltYXJ5ICsgZ3VpZCArIGRwY2QgKi8KKworCXN0cnVj dCBtdXRleCBhdXhfbG9jazsgLyogcHJvdGVjdCBhY2Nlc3MgdG8gdGhlIEFVWCAqLworCWJvb2wg bXN0X3N0YXRlOworCXN0cnVjdCBkcm1fZHBfbXN0X2JyYW5jaCAqbXN0X3ByaW1hcnk7CisJLyog cHJpbWFyeSBNU1QgZGV2aWNlIEdVSUQgKi8KKwlib29sIGd1aWRfdmFsaWQ7CisJdTggZ3VpZFsx Nl07CisJdTggZHBjZFtEUF9SRUNFSVZFUl9DQVBfU0laRV07CisJdTggc2lua19jb3VudDsKKwlp bnQgcGJuX2RpdjsKKwlpbnQgdG90YWxfc2xvdHM7CisJaW50IGF2YWlsX3Nsb3RzOworCWludCB0 b3RhbF9wYm47CisKKwkvKiBtZXNzYWdlcyB0byBiZSB0cmFuc21pdHRlZCAqLworCS8qIHFsb2Nr IHByb3RlY3RzIHRoZSB1cHEvZG93bnEgYW5kIGluX3Byb2dyZXNzLAorCSAgIHRoZSBtc3RiIHR4 X3Nsb3RzIGFuZCB0eG1zZy0+c3RhdGUgb25jZSB0aGV5IGFyZSBxdWV1ZWQgKi8KKwlzdHJ1Y3Qg bXV0ZXggcWxvY2s7CisJc3RydWN0IGxpc3RfaGVhZCB0eF9tc2dfZG93bnE7CisJc3RydWN0IGxp c3RfaGVhZCB0eF9tc2dfdXBxOworCWJvb2wgdHhfZG93bl9pbl9wcm9ncmVzczsKKwlib29sIHR4 X3VwX2luX3Byb2dyZXNzOworCisJLyogcGF5bG9hZCBpbmZvICsgbG9jayBmb3IgaXQgKi8KKwlz dHJ1Y3QgbXV0ZXggcGF5bG9hZF9sb2NrOworCXN0cnVjdCBkcm1fZHBfdmNwaSAqKnByb3Bvc2Vk X3ZjcGlzOworCXN0cnVjdCBkcm1fZHBfcGF5bG9hZCAqcGF5bG9hZHM7CisJdW5zaWduZWQgbG9u ZyBwYXlsb2FkX21hc2s7CisKKwl3YWl0X3F1ZXVlX2hlYWRfdCB0eF93YWl0cTsKKwlzdHJ1Y3Qg d29ya19zdHJ1Y3Qgd29yazsKKworCXN0cnVjdCB3b3JrX3N0cnVjdCB0eF93b3JrOworfTsKKwor aW50IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX2luaXQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xv Z3lfbWdyICptZ3IsIHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRybV9kcF9hdXggKmF1eCwg aW50IG1heF9kcGNkX3RyYW5zYWN0aW9uX2J5dGVzLCBpbnQgbWF4X3BheWxvYWRzLCBpbnQgY29u bl9iYXNlX2lkKTsKKwordm9pZCBkcm1fZHBfbXN0X3RvcG9sb2d5X21ncl9kZXN0cm95KHN0cnVj dCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKTsKKworCitpbnQgZHJtX2RwX21zdF90b3Bv bG9neV9tZ3Jfc2V0X21zdChzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgYm9v bCBtc3Rfc3RhdGUpOworCisKK2ludCBkcm1fZHBfbXN0X2hwZF9pcnEoc3RydWN0IGRybV9kcF9t c3RfdG9wb2xvZ3lfbWdyICptZ3IsIHU4ICplc2ksIGJvb2wgKmhhbmRsZWQpOworCisKK2VudW0g ZHJtX2Nvbm5lY3Rvcl9zdGF0dXMgZHJtX2RwX21zdF9kZXRlY3RfcG9ydChzdHJ1Y3QgZHJtX2Rw X21zdF90b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9ydCk7CisK K3N0cnVjdCBlZGlkICpkcm1fZHBfbXN0X2dldF9lZGlkKHN0cnVjdCBkcm1fY29ubmVjdG9yICpj b25uZWN0b3IsIHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyLCBzdHJ1Y3QgZHJt X2RwX21zdF9wb3J0ICpwb3J0KTsKKworCitpbnQgZHJtX2RwX2NhbGNfcGJuX21vZGUoaW50IGNs b2NrLCBpbnQgYnBwKTsKKworCitib29sIGRybV9kcF9tc3RfYWxsb2NhdGVfdmNwaShzdHJ1Y3Qg ZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1nciwgc3RydWN0IGRybV9kcF9tc3RfcG9ydCAqcG9y dCwgaW50IHBibiwgaW50ICpzbG90cyk7CisKKwordm9pZCBkcm1fZHBfbXN0X3Jlc2V0X3ZjcGlf c2xvdHMoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsIHN0cnVjdCBkcm1fZHBf bXN0X3BvcnQgKnBvcnQpOworCisKK3ZvaWQgZHJtX2RwX21zdF9kZWFsbG9jYXRlX3ZjcGkoc3Ry dWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkJc3RydWN0IGRybV9kcF9tc3Rf cG9ydCAqcG9ydCk7CisKKworaW50IGRybV9kcF9maW5kX3ZjcGlfc2xvdHMoc3RydWN0IGRybV9k cF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IsCisJCQkgICBpbnQgcGJuKTsKKworCitpbnQgZHJtX2Rw X3VwZGF0ZV9wYXlsb2FkX3BhcnQxKHN0cnVjdCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdy KTsKKworCitpbnQgZHJtX2RwX3VwZGF0ZV9wYXlsb2FkX3BhcnQyKHN0cnVjdCBkcm1fZHBfbXN0 X3RvcG9sb2d5X21nciAqbWdyKTsKKworaW50IGRybV9kcF9jaGVja19hY3Rfc3RhdHVzKHN0cnVj dCBkcm1fZHBfbXN0X3RvcG9sb2d5X21nciAqbWdyKTsKKwordm9pZCBkcm1fZHBfbXN0X2R1bXBf dG9wb2xvZ3koc3RydWN0IHNlcV9maWxlICptLAorCQkJICAgICAgc3RydWN0IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyICptZ3IpOworCit2b2lkIGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyX3N1c3Bl bmQoc3RydWN0IGRybV9kcF9tc3RfdG9wb2xvZ3lfbWdyICptZ3IpOworaW50IGRybV9kcF9tc3Rf dG9wb2xvZ3lfbWdyX3Jlc3VtZShzdHJ1Y3QgZHJtX2RwX21zdF90b3BvbG9neV9tZ3IgKm1ncik7 CisjZW5kaWYKLS0gCjEuOS4wCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVz a3RvcC5vcmcKaHR0cDovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lu dGVsLWdmeAo=