From mboxrd@z Thu Jan 1 00:00:00 1970 From: ville.syrjala@linux.intel.com Subject: [PATCH v4 05/14] drm/i915: Move most cdclk/rawclk related code to intel_cdclk.c Date: Tue, 7 Feb 2017 20:33:05 +0200 Message-ID: <20170207183305.19656-1-ville.syrjala@linux.intel.com> References: <20170120182205.8141-6-ville.syrjala@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by gabe.freedesktop.org (Postfix) with ESMTPS id 2EDBB6E087 for ; Tue, 7 Feb 2017 18:33:09 +0000 (UTC) In-Reply-To: <20170120182205.8141-6-ville.syrjala@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVmlsbGUgU3lyasOkbMOkIDx2aWxsZS5zeXJqYWxhQGxpbnV4LmludGVsLmNvbT4KCkxl dCdzIHRyeSB0byBzaHJpbmsgaW50ZWxfZGlzcGxheS5jIGEgYml0IGJ5IG1vdmluZyB0aGUgY2Rj bGsvcmF3Y2xrCnN0dWZmIHRvIGEgbmV3IGZpbGUuIEl0J3MgYWxsIHJlYXNvbmFibHkgc2VsZiBj b250YWluZWQgc28gd2UgZG9uJ3QKZXZlbiBoYXZlIHRvIGFkZCB0aGF0IG1hbnkgbm9uLXN0YXRp YyBzeW1ib2xzLgoKV2UnbGwgYWxzbyB0YWtlIHRoZSBvcHBvcnR1bml0eSB0byBzaHVmZmxlIGFy b3VuZCB0aGUgZnVuY3Rpb25zIGEgYml0CnRvIGdldCB0aGluZ3MgaW4gYSBtb3JlIGNvbnNpc3Rl bnQgb3JkZXIgYmFzZWQgb24gdGhlIHBsYXRmb3JtLgoKdjI6IEFkZCBrZXJuZWwtZG9jcyAoQW5k ZXIpCnYzOiBEZWFsIHdpdGggSVNfR0VOOV9CQygpCnY0OiBEZWFsIHdpdGggaTk0NWdtX2dldF9j ZGNsaygpCgpTaWduZWQtb2ZmLWJ5OiBWaWxsZSBTeXJqw6Rsw6QgPHZpbGxlLnN5cmphbGFAbGlu dXguaW50ZWwuY29tPgpSZXZpZXdlZC1ieTogQW5kZXIgQ29uc2VsdmFuIGRlIE9saXZlaXJhIDxj b25zZWx2YW4yQGdtYWlsLmNvbT4KTGluazogaHR0cDovL3BhdGNod29yay5mcmVlZGVza3RvcC5v cmcvcGF0Y2gvbXNnaWQvMjAxNzAxMjAxODIyMDUuODE0MS02LXZpbGxlLnN5cmphbGFAbGludXgu aW50ZWwuY29tCi0tLQogRG9jdW1lbnRhdGlvbi9ncHUvaTkxNS5yc3QgICAgICAgICAgIHwgICAg OSArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZSAgICAgICAgfCAgICAxICsKIGRyaXZl cnMvZ3B1L2RybS9pOTE1L2ludGVsX2NkY2xrLmMgICB8IDE3OTQgKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jIHwg MTY5NyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogZHJpdmVycy9ncHUvZHJtL2k5 MTUvaW50ZWxfZHJ2LmggICAgIHwgICAgOSArLQogNSBmaWxlcyBjaGFuZ2VkLCAxODE2IGluc2Vy dGlvbnMoKyksIDE2OTQgZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfY2RjbGsuYwoKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZ3B1 L2k5MTUucnN0IGIvRG9jdW1lbnRhdGlvbi9ncHUvaTkxNS5yc3QKaW5kZXggMTA0Mjk2ZGZmYWQx Li4xY2QwZWU1MThkZWUgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZ3B1L2k5MTUucnN0Cisr KyBiL0RvY3VtZW50YXRpb24vZ3B1L2k5MTUucnN0CkBAIC0yMTMsNiArMjEzLDE1IEBAIFZpZGVv IEJJT1MgVGFibGUgKFZCVCkKIC4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF92YnRfZGVmcy5oCiAgICA6aW50ZXJuYWw6CiAKK0Rpc3BsYXkgY2xvY2tzCistLS0tLS0t LS0tLS0tLQorCisuLiBrZXJuZWwtZG9jOjogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfY2Rj bGsuYworICAgOmRvYzogQ0RDTEsgLyBSQVdDTEsKKworLi4ga2VybmVsLWRvYzo6IGRyaXZlcnMv Z3B1L2RybS9pOTE1L2ludGVsX2NkY2xrLmMKKyAgIDppbnRlcm5hbDoKKwogRGlzcGxheSBQTExz CiAtLS0tLS0tLS0tLS0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZp bGUgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9NYWtlZmlsZQppbmRleCA3NGNhMmU4YjI0OTQuLmU1 OGZjOGYxYjgzYiAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUKQEAgLTcyLDYgKzcyLDcgQEAgaTkxNS15 ICs9IGludGVsX2F1ZGlvLm8gXAogCSAgaW50ZWxfYXRvbWljLm8gXAogCSAgaW50ZWxfYXRvbWlj X3BsYW5lLm8gXAogCSAgaW50ZWxfYmlvcy5vIFwKKwkgIGludGVsX2NkY2xrLm8gXAogCSAgaW50 ZWxfY29sb3IubyBcCiAJICBpbnRlbF9kaXNwbGF5Lm8gXAogCSAgaW50ZWxfZHBpb19waHkubyBc CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jZGNsay5jIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaW50ZWxfY2RjbGsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMDAuLjA0YTQ2YzE0Yzg5OAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2NkY2xrLmMKQEAgLTAsMCArMSwxNzk0IEBACisvKgorICogQ29weXJp Z2h0IMKpIDIwMDYtMjAxNyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMg aGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBh CisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBm aWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91 dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0 cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1Ymxp Y2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVy bWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBz bywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3Zl IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0 aGUgbmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9y IHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNP RlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQs IEVYUFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhF IFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNV TEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBU SEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwg REFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBD T05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJ TiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIKKyAqIERF QUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSAiaW50ZWxfZHJ2LmgiCisK Ky8qKgorICogRE9DOiBDRENMSyAvIFJBV0NMSworICoKKyAqIFRoZSBkaXNwbGF5IGVuZ2luZSB1 c2VzIHNldmVyYWwgZGlmZmVyZW50IGNsb2NrcyB0byBkbyBpdHMgd29yay4gVGhlcmUKKyAqIGFy ZSB0d28gbWFpbiBjbG9ja3MgaW52b2x2ZWQgdGhhdCBhcmVuJ3QgZGlyZWN0bHkgcmVsYXRlZCB0 byB0aGUgYWN0dWFsCisgKiBwaXhlbCBjbG9jayBvciBhbnkgc3ltYm9sL2JpdCBjbG9jayBvZiB0 aGUgYWN0dWFsIG91dHB1dCBwb3J0LiBUaGVzZQorICogYXJlIHRoZSBjb3JlIGRpc3BsYXkgY2xv Y2sgKENEQ0xLKSBhbmQgUkFXQ0xLLgorICoKKyAqIENEQ0xLIGNsb2NrcyBtb3N0IG9mIHRoZSBk aXNwbGF5IHBpcGUgbG9naWMsIGFuZCB0aHVzIGl0cyBmcmVxdWVuY3kKKyAqIG11c3QgYmUgaGln aCBlbm91Z2ggdG8gc3VwcG9ydCB0aGUgcmF0ZSBhdCB3aGljaCBwaXhlbHMgYXJlIGZsb3dpbmcK KyAqIHRocm91Z2ggdGhlIHBpcGVzLiBEb3duc2NhbGluZyBtdXN0IGFsc28gYmUgYWNjb3VudGVk IGFzIHRoYXQgaW5jcmVhc2VzCisgKiB0aGUgZWZmZWN0aXZlIHBpeGVsIHJhdGUuCisgKgorICog T24gc2V2ZXJhbCBwbGF0Zm9ybXMgdGhlIENEQ0xLIGZyZXF1ZW5jeSBjYW4gYmUgY2hhbmdlZCBk eW5hbWljYWxseQorICogdG8gbWluaW1pemUgcG93ZXIgY29uc3VtcHRpb24gZm9yIGEgZ2l2ZW4g ZGlzcGxheSBjb25maWd1cmF0aW9uLgorICogVHlwaWNhbGx5IGNoYW5nZXMgdG8gdGhlIENEQ0xL IGZyZXF1ZW5jeSByZXF1aXJlIGFsbCB0aGUgZGlzcGxheSBwaXBlcworICogdG8gYmUgc2h1dCBk b3duIHdoaWxlIHRoZSBmcmVxdWVuY3kgaXMgYmVpbmcgY2hhbmdlZC4KKyAqCisgKiBPbiBTS0wr IHRoZSBETUMgd2lsbCB0b2dnbGUgdGhlIENEQ0xLIG9mZi9vbiBkdXJpbmcgREM1LzYgZW50cnkv ZXhpdC4KKyAqIERNQyB3aWxsIG5vdCBjaGFuZ2UgdGhlIGFjdGl2ZSBDRENMSyBmcmVxdWVuY3kg aG93ZXZlciwgc28gdGhhdCBwYXJ0CisgKiB3aWxsIHN0aWxsIGJlIHBlcmZvcm1lZCBieSB0aGUg ZHJpdmVyIGRpcmVjdGx5LgorICoKKyAqIFJBV0NMSyBpcyBhIGZpeGVkIGZyZXF1ZW5jeSBjbG9j aywgb2Z0ZW4gdXNlZCBieSB2YXJpb3VzIGF1eGlsaWFyeQorICogYmxvY2tzIHN1Y2ggYXMgQVVY IENIIG9yIGJhY2tsaWdodCBQV00uIEhlbmNlIHRoZSBvbmx5IHRoaW5nIHdlCisgKiByZWFsbHkg bmVlZCB0byBrbm93IGFib3V0IFJBV0NMSyBpcyBpdHMgZnJlcXVlbmN5IHNvIHRoYXQgdmFyaW91 cworICogZGl2aWRlcnMgY2FuIGJlIHByb2dyYW1tZWQgY29ycmVjdGx5LgorICovCisKK3N0YXRp YyBpbnQgZml4ZWRfMTMzbWh6X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYpCit7CisJcmV0dXJuIDEzMzMzMzsKK30KKworc3RhdGljIGludCBmaXhlZF8yMDBtaHpf Z2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlyZXR1cm4g MjAwMDAwOworfQorCitzdGF0aWMgaW50IGZpeGVkXzI2Nm1oel9nZXRfY2RjbGsoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiAyNjY2Njc7Cit9CisKK3N0YXRp YyBpbnQgZml4ZWRfMzMzbWh6X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYpCit7CisJcmV0dXJuIDMzMzMzMzsKK30KKworc3RhdGljIGludCBmaXhlZF80MDBtaHpf Z2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlyZXR1cm4g NDAwMDAwOworfQorCitzdGF0aWMgaW50IGZpeGVkXzQ1MG1oel9nZXRfY2RjbGsoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiA0NTAwMDA7Cit9CisKK3N0YXRp YyBpbnQgaTg1eF9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQor eworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OworCXUxNiBocGxs Y2MgPSAwOworCisJLyoKKwkgKiA4NTJHTS84NTJHTVYgb25seSBzdXBwb3J0cyAxMzMgTUh6IGFu ZCB0aGUgSFBMTENDCisJICogZW5jb2RpbmcgaXMgZGlmZmVyZW50IDooCisJICogRklYTUUgaXMg dGhpcyB0aGUgcmlnaHQgd2F5IHRvIGRldGVjdCA4NTJHTS84NTJHTVY/CisJICovCisJaWYgKHBk ZXYtPnJldmlzaW9uID09IDB4MSkKKwkJcmV0dXJuIDEzMzMzMzsKKworCXBjaV9idXNfcmVhZF9j b25maWdfd29yZChwZGV2LT5idXMsCisJCQkJIFBDSV9ERVZGTigwLCAzKSwgSFBMTENDLCAmaHBs bGNjKTsKKworCS8qIEFzc3VtZSB0aGF0IHRoZSBoYXJkd2FyZSBpcyBpbiB0aGUgaGlnaCBzcGVl ZCBzdGF0ZS4gIFRoaXMKKwkgKiBzaG91bGQgYmUgdGhlIGRlZmF1bHQuCisJICovCisJc3dpdGNo IChocGxsY2MgJiBHQ19DTE9DS19DT05UUk9MX01BU0spIHsKKwljYXNlIEdDX0NMT0NLXzEzM18y MDA6CisJY2FzZSBHQ19DTE9DS18xMzNfMjAwXzI6CisJY2FzZSBHQ19DTE9DS18xMDBfMjAwOgor CQlyZXR1cm4gMjAwMDAwOworCWNhc2UgR0NfQ0xPQ0tfMTY2XzI1MDoKKwkJcmV0dXJuIDI1MDAw MDsKKwljYXNlIEdDX0NMT0NLXzEwMF8xMzM6CisJCXJldHVybiAxMzMzMzM7CisJY2FzZSBHQ19D TE9DS18xMzNfMjY2OgorCWNhc2UgR0NfQ0xPQ0tfMTMzXzI2Nl8yOgorCWNhc2UgR0NfQ0xPQ0tf MTY2XzI2NjoKKwkJcmV0dXJuIDI2NjY2NzsKKwl9CisKKwkvKiBTaG91bGRuJ3QgaGFwcGVuICov CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaTkxNWdtX2dldF9jZGNsayhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZf cHJpdi0+ZHJtLnBkZXY7CisJdTE2IGdjZmdjID0gMDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3Jk KHBkZXYsIEdDRkdDLCAmZ2NmZ2MpOworCisJaWYgKGdjZmdjICYgR0NfTE9XX0ZSRVFVRU5DWV9F TkFCTEUpCisJCXJldHVybiAxMzMzMzM7CisKKwlzd2l0Y2ggKGdjZmdjICYgR0NfRElTUExBWV9D TE9DS19NQVNLKSB7CisJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzMzM18zMjBfTUhaOgorCQlyZXR1 cm4gMzMzMzMzOworCWRlZmF1bHQ6CisJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzE5MF8yMDBfTUha OgorCQlyZXR1cm4gMTkwMDAwOworCX0KK30KKworc3RhdGljIGludCBpOTQ1Z21fZ2V0X2NkY2xr KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAq cGRldiA9IGRldl9wcml2LT5kcm0ucGRldjsKKwl1MTYgZ2NmZ2MgPSAwOworCisJcGNpX3JlYWRf Y29uZmlnX3dvcmQocGRldiwgR0NGR0MsICZnY2ZnYyk7CisKKwlpZiAoZ2NmZ2MgJiBHQ19MT1df RlJFUVVFTkNZX0VOQUJMRSkKKwkJcmV0dXJuIDEzMzMzMzsKKworCXN3aXRjaCAoZ2NmZ2MgJiBH Q19ESVNQTEFZX0NMT0NLX01BU0spIHsKKwljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMzMzXzMyMF9N SFo6CisJCXJldHVybiAzMjAwMDA7CisJZGVmYXVsdDoKKwljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tf MTkwXzIwMF9NSFo6CisJCXJldHVybiAyMDAwMDA7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQg aW50IGludGVsX2hwbGxfdmNvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sK KwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJsYl92Y29bOF0gPSB7CisJCVswXSA9IDMyMDAw MDAsCisJCVsxXSA9IDQwMDAwMDAsCisJCVsyXSA9IDUzMzMzMzMsCisJCVszXSA9IDQ4MDAwMDAs CisJCVs0XSA9IDY0MDAwMDAsCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHBudl92 Y29bOF0gPSB7CisJCVswXSA9IDMyMDAwMDAsCisJCVsxXSA9IDQwMDAwMDAsCisJCVsyXSA9IDUz MzMzMzMsCisJCVszXSA9IDQ4MDAwMDAsCisJCVs0XSA9IDI2NjY2NjcsCisJfTsKKwlzdGF0aWMg Y29uc3QgdW5zaWduZWQgaW50IGNsX3Zjb1s4XSA9IHsKKwkJWzBdID0gMzIwMDAwMCwKKwkJWzFd ID0gNDAwMDAwMCwKKwkJWzJdID0gNTMzMzMzMywKKwkJWzNdID0gNjQwMDAwMCwKKwkJWzRdID0g MzMzMzMzMywKKwkJWzVdID0gMzU2NjY2NywKKwkJWzZdID0gNDI2NjY2NywKKwl9OworCXN0YXRp YyBjb25zdCB1bnNpZ25lZCBpbnQgZWxrX3Zjb1s4XSA9IHsKKwkJWzBdID0gMzIwMDAwMCwKKwkJ WzFdID0gNDAwMDAwMCwKKwkJWzJdID0gNTMzMzMzMywKKwkJWzNdID0gNDgwMDAwMCwKKwl9Owor CXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3RnX3Zjb1s4XSA9IHsKKwkJWzBdID0gMzIwMDAw MCwKKwkJWzFdID0gNDAwMDAwMCwKKwkJWzJdID0gNTMzMzMzMywKKwkJWzNdID0gNjQwMDAwMCwK KwkJWzRdID0gMjY2NjY2NywKKwkJWzVdID0gNDI2NjY2NywKKwl9OworCWNvbnN0IHVuc2lnbmVk IGludCAqdmNvX3RhYmxlOworCXVuc2lnbmVkIGludCB2Y287CisJdWludDhfdCB0bXAgPSAwOwor CisJLyogRklYTUUgb3RoZXIgY2hpcHNldHM/ICovCisJaWYgKElTX0dNNDUoZGV2X3ByaXYpKQor CQl2Y29fdGFibGUgPSBjdGdfdmNvOworCWVsc2UgaWYgKElTX0c0WChkZXZfcHJpdikpCisJCXZj b190YWJsZSA9IGVsa192Y287CisJZWxzZSBpZiAoSVNfSTk2NUdNKGRldl9wcml2KSkKKwkJdmNv X3RhYmxlID0gY2xfdmNvOworCWVsc2UgaWYgKElTX1BJTkVWSUVXKGRldl9wcml2KSkKKwkJdmNv X3RhYmxlID0gcG52X3ZjbzsKKwllbHNlIGlmIChJU19HMzMoZGV2X3ByaXYpKQorCQl2Y29fdGFi bGUgPSBibGJfdmNvOworCWVsc2UKKwkJcmV0dXJuIDA7CisKKwl0bXAgPSBJOTE1X1JFQUQoSVNf TU9CSUxFKGRldl9wcml2KSA/IEhQTExWQ09fTU9CSUxFIDogSFBMTFZDTyk7CisKKwl2Y28gPSB2 Y29fdGFibGVbdG1wICYgMHg3XTsKKwlpZiAodmNvID09IDApCisJCURSTV9FUlJPUigiQmFkIEhQ TEwgVkNPIChIUExMVkNPPTB4JTAyeClcbiIsIHRtcCk7CisJZWxzZQorCQlEUk1fREVCVUdfS01T KCJIUExMIFZDTyAldSBrSHpcbiIsIHZjbyk7CisKKwlyZXR1cm4gdmNvOworfQorCitzdGF0aWMg aW50IGczM19nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQorewor CXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OworCXN0YXRpYyBjb25z dCB1aW50OF90IGRpdl8zMjAwW10gPSB7IDEyLCAxMCwgIDgsICA3LCA1LCAxNiB9OworCXN0YXRp YyBjb25zdCB1aW50OF90IGRpdl80MDAwW10gPSB7IDE0LCAxMiwgMTAsICA4LCA2LCAyMCB9Owor CXN0YXRpYyBjb25zdCB1aW50OF90IGRpdl80ODAwW10gPSB7IDIwLCAxNCwgMTIsIDEwLCA4LCAy NCB9OworCXN0YXRpYyBjb25zdCB1aW50OF90IGRpdl81MzMzW10gPSB7IDIwLCAxNiwgMTIsIDEy LCA4LCAyOCB9OworCWNvbnN0IHVpbnQ4X3QgKmRpdl90YWJsZTsKKwl1bnNpZ25lZCBpbnQgY2Rj bGtfc2VsLCB2Y28gPSBpbnRlbF9ocGxsX3ZjbyhkZXZfcHJpdik7CisJdWludDE2X3QgdG1wID0g MDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIEdDRkdDLCAmdG1wKTsKKworCWNkY2xr X3NlbCA9ICh0bXAgPj4gNCkgJiAweDc7CisKKwlpZiAoY2RjbGtfc2VsID49IEFSUkFZX1NJWkUo ZGl2XzMyMDApKQorCQlnb3RvIGZhaWw7CisKKwlzd2l0Y2ggKHZjbykgeworCWNhc2UgMzIwMDAw MDoKKwkJZGl2X3RhYmxlID0gZGl2XzMyMDA7CisJCWJyZWFrOworCWNhc2UgNDAwMDAwMDoKKwkJ ZGl2X3RhYmxlID0gZGl2XzQwMDA7CisJCWJyZWFrOworCWNhc2UgNDgwMDAwMDoKKwkJZGl2X3Rh YmxlID0gZGl2XzQ4MDA7CisJCWJyZWFrOworCWNhc2UgNTMzMzMzMzoKKwkJZGl2X3RhYmxlID0g ZGl2XzUzMzM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1 cm4gRElWX1JPVU5EX0NMT1NFU1QodmNvLCBkaXZfdGFibGVbY2RjbGtfc2VsXSk7CisKK2ZhaWw6 CisJRFJNX0VSUk9SKCJVbmFibGUgdG8gZGV0ZXJtaW5lIENEQ0xLLiBIUExMIFZDTz0ldSBrSHos IENGR0M9MHglMDh4XG4iLAorCQkgIHZjbywgdG1wKTsKKwlyZXR1cm4gMTkwNDc2OworfQorCitz dGF0aWMgaW50IHBudl9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OworCXUxNiBn Y2ZnYyA9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBHQ0ZHQywgJmdjZmdjKTsK KworCXN3aXRjaCAoZ2NmZ2MgJiBHQ19ESVNQTEFZX0NMT0NLX01BU0spIHsKKwljYXNlIEdDX0RJ U1BMQVlfQ0xPQ0tfMjY3X01IWl9QTlY6CisJCXJldHVybiAyNjY2Njc7CisJY2FzZSBHQ19ESVNQ TEFZX0NMT0NLXzMzM19NSFpfUE5WOgorCQlyZXR1cm4gMzMzMzMzOworCWNhc2UgR0NfRElTUExB WV9DTE9DS180NDRfTUhaX1BOVjoKKwkJcmV0dXJuIDQ0NDQ0NDsKKwljYXNlIEdDX0RJU1BMQVlf Q0xPQ0tfMjAwX01IWl9QTlY6CisJCXJldHVybiAyMDAwMDA7CisJZGVmYXVsdDoKKwkJRFJNX0VS Uk9SKCJVbmtub3duIHBudiBkaXNwbGF5IGNvcmUgY2xvY2sgMHglMDR4XG4iLCBnY2ZnYyk7CisJ Y2FzZSBHQ19ESVNQTEFZX0NMT0NLXzEzM19NSFpfUE5WOgorCQlyZXR1cm4gMTMzMzMzOworCWNh c2UgR0NfRElTUExBWV9DTE9DS18xNjdfTUhaX1BOVjoKKwkJcmV0dXJuIDE2NjY2NzsKKwl9Cit9 CisKK3N0YXRpYyBpbnQgaTk2NWdtX2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7 CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGl2XzMyMDBbXSA9IHsgMTYsIDEwLCAgOCB9OworCXN0 YXRpYyBjb25zdCB1aW50OF90IGRpdl80MDAwW10gPSB7IDIwLCAxMiwgMTAgfTsKKwlzdGF0aWMg Y29uc3QgdWludDhfdCBkaXZfNTMzM1tdID0geyAyNCwgMTYsIDE0IH07CisJY29uc3QgdWludDhf dCAqZGl2X3RhYmxlOworCXVuc2lnbmVkIGludCBjZGNsa19zZWwsIHZjbyA9IGludGVsX2hwbGxf dmNvKGRldl9wcml2KTsKKwl1aW50MTZfdCB0bXAgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX3dv cmQocGRldiwgR0NGR0MsICZ0bXApOworCisJY2RjbGtfc2VsID0gKCh0bXAgPj4gOCkgJiAweDFm KSAtIDE7CisKKwlpZiAoY2RjbGtfc2VsID49IEFSUkFZX1NJWkUoZGl2XzMyMDApKQorCQlnb3Rv IGZhaWw7CisKKwlzd2l0Y2ggKHZjbykgeworCWNhc2UgMzIwMDAwMDoKKwkJZGl2X3RhYmxlID0g ZGl2XzMyMDA7CisJCWJyZWFrOworCWNhc2UgNDAwMDAwMDoKKwkJZGl2X3RhYmxlID0gZGl2XzQw MDA7CisJCWJyZWFrOworCWNhc2UgNTMzMzMzMzoKKwkJZGl2X3RhYmxlID0gZGl2XzUzMzM7CisJ CWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gZmFpbDsKKwl9CisKKwlyZXR1cm4gRElWX1JPVU5E X0NMT1NFU1QodmNvLCBkaXZfdGFibGVbY2RjbGtfc2VsXSk7CisKK2ZhaWw6CisJRFJNX0VSUk9S KCJVbmFibGUgdG8gZGV0ZXJtaW5lIENEQ0xLLiBIUExMIFZDTz0ldSBrSHosIENGR0M9MHglMDR4 XG4iLAorCQkgIHZjbywgdG1wKTsKKwlyZXR1cm4gMjAwMDAwOworfQorCitzdGF0aWMgaW50IGdt NDVfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1 Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRldjsKKwl1bnNpZ25lZCBpbnQgY2Rj bGtfc2VsLCB2Y28gPSBpbnRlbF9ocGxsX3ZjbyhkZXZfcHJpdik7CisJdWludDE2X3QgdG1wID0g MDsKKworCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIEdDRkdDLCAmdG1wKTsKKworCWNkY2xr X3NlbCA9ICh0bXAgPj4gMTIpICYgMHgxOworCisJc3dpdGNoICh2Y28pIHsKKwljYXNlIDI2NjY2 Njc6CisJY2FzZSA0MDAwMDAwOgorCWNhc2UgNTMzMzMzMzoKKwkJcmV0dXJuIGNkY2xrX3NlbCA/ IDMzMzMzMyA6IDIyMjIyMjsKKwljYXNlIDMyMDAwMDA6CisJCXJldHVybiBjZGNsa19zZWwgPyAz MjAwMDAgOiAyMjg1NzE7CisJZGVmYXVsdDoKKwkJRFJNX0VSUk9SKCJVbmFibGUgdG8gZGV0ZXJt aW5lIENEQ0xLLiBIUExMIFZDTz0ldSwgQ0ZHQz0weCUwNHhcbiIsCisJCQkgIHZjbywgdG1wKTsK KwkJcmV0dXJuIDIyMjIyMjsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaHN3X2dldF9jZGNsayhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJdWludDMyX3QgbGNwbGwgPSBJOTE1 X1JFQUQoTENQTExfQ1RMKTsKKwl1aW50MzJfdCBmcmVxID0gbGNwbGwgJiBMQ1BMTF9DTEtfRlJF UV9NQVNLOworCisJaWYgKGxjcGxsICYgTENQTExfQ0RfU09VUkNFX0ZDTEspCisJCXJldHVybiA4 MDAwMDA7CisJZWxzZSBpZiAoSTkxNV9SRUFEKEZVU0VfU1RSQVApICYgSFNXX0NEQ0xLX0xJTUlU KQorCQlyZXR1cm4gNDUwMDAwOworCWVsc2UgaWYgKGZyZXEgPT0gTENQTExfQ0xLX0ZSRVFfNDUw KQorCQlyZXR1cm4gNDUwMDAwOworCWVsc2UgaWYgKElTX0hTV19VTFQoZGV2X3ByaXYpKQorCQly ZXR1cm4gMzM3NTAwOworCWVsc2UKKwkJcmV0dXJuIDU0MDAwMDsKK30KKworc3RhdGljIGludCB2 bHZfY2FsY19jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgIGlu dCBtYXhfcGl4Y2xrKQoreworCWludCBmcmVxXzMyMCA9IChkZXZfcHJpdi0+aHBsbF9mcmVxIDw8 ICAxKSAlIDMyMDAwMCAhPSAwID8KKwkJMzMzMzMzIDogMzIwMDAwOworCWludCBsaW1pdCA9IElT X0NIRVJSWVZJRVcoZGV2X3ByaXYpID8gOTUgOiA5MDsKKworCS8qCisJICogV2Ugc2VlbSB0byBn ZXQgYW4gdW5zdGFibGUgb3Igc29saWQgY29sb3IgcGljdHVyZSBhdCAyMDBNSHouCisJICogTm90 IHN1cmUgd2hhdCdzIHdyb25nLiBGb3Igbm93IHVzZSAyMDBNSHogb25seSB3aGVuIGFsbCBwaXBl cworCSAqIGFyZSBvZmYuCisJICovCisJaWYgKCFJU19DSEVSUllWSUVXKGRldl9wcml2KSAmJgor CSAgICBtYXhfcGl4Y2xrID4gZnJlcV8zMjAqbGltaXQvMTAwKQorCQlyZXR1cm4gNDAwMDAwOwor CWVsc2UgaWYgKG1heF9waXhjbGsgPiAyNjY2NjcqbGltaXQvMTAwKQorCQlyZXR1cm4gZnJlcV8z MjA7CisJZWxzZSBpZiAobWF4X3BpeGNsayA+IDApCisJCXJldHVybiAyNjY2Njc7CisJZWxzZQor CQlyZXR1cm4gMjAwMDAwOworfQorCitzdGF0aWMgaW50IHZsdl9nZXRfY2RjbGsoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiB2bHZfZ2V0X2Nja19jbG9ja19o cGxsKGRldl9wcml2LCAiY2RjbGsiLAorCQkJCSAgICAgIENDS19ESVNQTEFZX0NMT0NLX0NPTlRS T0wpOworfQorCitzdGF0aWMgdm9pZCB2bHZfcHJvZ3JhbV9wZmlfY3JlZGl0cyhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJdW5zaWduZWQgaW50IGNyZWRpdHMsIGRlZmF1 bHRfY3JlZGl0czsKKworCWlmIChJU19DSEVSUllWSUVXKGRldl9wcml2KSkKKwkJZGVmYXVsdF9j cmVkaXRzID0gUEZJX0NSRURJVCgxMik7CisJZWxzZQorCQlkZWZhdWx0X2NyZWRpdHMgPSBQRklf Q1JFRElUKDgpOworCisJaWYgKGRldl9wcml2LT5jZGNsa19mcmVxID49IGRldl9wcml2LT5jemNs a19mcmVxKSB7CisJCS8qIENIViBzdWdnZXN0ZWQgdmFsdWUgaXMgMzEgb3IgNjMgKi8KKwkJaWYg KElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQorCQkJY3JlZGl0cyA9IFBGSV9DUkVESVRfNjM7CisJ CWVsc2UKKwkJCWNyZWRpdHMgPSBQRklfQ1JFRElUKDE1KTsKKwl9IGVsc2UgeworCQljcmVkaXRz ID0gZGVmYXVsdF9jcmVkaXRzOworCX0KKworCS8qCisJICogV0EgLSB3cml0ZSBkZWZhdWx0IGNy ZWRpdHMgYmVmb3JlIHJlLXByb2dyYW1taW5nCisJICogRklYTUU6IHNob3VsZCB3ZSBhbHNvIHNl dCB0aGUgcmVzZW5kIGJpdCBoZXJlPworCSAqLworCUk5MTVfV1JJVEUoR0NJX0NPTlRST0wsIFZH QV9GQVNUX01PREVfRElTQUJMRSB8CisJCSAgIGRlZmF1bHRfY3JlZGl0cyk7CisKKwlJOTE1X1dS SVRFKEdDSV9DT05UUk9MLCBWR0FfRkFTVF9NT0RFX0RJU0FCTEUgfAorCQkgICBjcmVkaXRzIHwg UEZJX0NSRURJVF9SRVNFTkQpOworCisJLyoKKwkgKiBGSVhNRSBpcyB0aGlzIGd1YXJhbnRlZWQg dG8gY2xlYXIKKwkgKiBpbW1lZGlhdGVseSBvciBzaG91bGQgd2UgcG9sbCBmb3IgaXQ/CisJICov CisJV0FSTl9PTihJOTE1X1JFQUQoR0NJX0NPTlRST0wpICYgUEZJX0NSRURJVF9SRVNFTkQpOwor fQorCitzdGF0aWMgdm9pZCB2bHZfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGlu dCBjZGNsaykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1 KGRldik7CisJdTMyIHZhbCwgY21kOworCisJV0FSTl9PTihkZXZfcHJpdi0+ZGlzcGxheS5nZXRf Y2RjbGsoZGV2X3ByaXYpICE9IGRldl9wcml2LT5jZGNsa19mcmVxKTsKKworCWlmIChjZGNsayA+ PSAzMjAwMDApIC8qIGp1bXAgdG8gaGlnaGVzdCB2b2x0YWdlIGZvciA0MDBNSHogdG9vICovCisJ CWNtZCA9IDI7CisJZWxzZSBpZiAoY2RjbGsgPT0gMjY2NjY3KQorCQljbWQgPSAxOworCWVsc2UK KwkJY21kID0gMDsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisJdmFs ID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BGUkVRKTsKKwl2YWwgJj0g fkRTUEZSRVFHVUFSX01BU0s7CisJdmFsIHw9IChjbWQgPDwgRFNQRlJFUUdVQVJfU0hJRlQpOwor CXZsdl9wdW5pdF93cml0ZShkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEsIHZhbCk7CisJaWYg KHdhaXRfZm9yKCh2bHZfcHVuaXRfcmVhZChkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEpICYK KwkJICAgICAgRFNQRlJFUVNUQVRfTUFTSykgPT0gKGNtZCA8PCBEU1BGUkVRU1RBVF9TSElGVCks CisJCSAgICAgNTApKSB7CisJCURSTV9FUlJPUigidGltZWQgb3V0IHdhaXRpbmcgZm9yIENEY2xr IGNoYW5nZVxuIik7CisJfQorCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsK KworCW11dGV4X2xvY2soJmRldl9wcml2LT5zYl9sb2NrKTsKKworCWlmIChjZGNsayA9PSA0MDAw MDApIHsKKwkJdTMyIGRpdmlkZXI7CisKKwkJZGl2aWRlciA9IERJVl9ST1VORF9DTE9TRVNUKGRl dl9wcml2LT5ocGxsX2ZyZXEgPDwgMSwKKwkJCQkJICAgIGNkY2xrKSAtIDE7CisKKwkJLyogYWRq dXN0IGNkY2xrIGRpdmlkZXIgKi8KKwkJdmFsID0gdmx2X2Nja19yZWFkKGRldl9wcml2LCBDQ0tf RElTUExBWV9DTE9DS19DT05UUk9MKTsKKwkJdmFsICY9IH5DQ0tfRlJFUVVFTkNZX1ZBTFVFUzsK KwkJdmFsIHw9IGRpdmlkZXI7CisJCXZsdl9jY2tfd3JpdGUoZGV2X3ByaXYsIENDS19ESVNQTEFZ X0NMT0NLX0NPTlRST0wsIHZhbCk7CisKKwkJaWYgKHdhaXRfZm9yKCh2bHZfY2NrX3JlYWQoZGV2 X3ByaXYsIENDS19ESVNQTEFZX0NMT0NLX0NPTlRST0wpICYKKwkJCSAgICAgIENDS19GUkVRVUVO Q1lfU1RBVFVTKSA9PSAoZGl2aWRlciA8PCBDQ0tfRlJFUVVFTkNZX1NUQVRVU19TSElGVCksCisJ CQkgICAgIDUwKSkKKwkJCURSTV9FUlJPUigidGltZWQgb3V0IHdhaXRpbmcgZm9yIENEY2xrIGNo YW5nZVxuIik7CisJfQorCisJLyogYWRqdXN0IHNlbGYtcmVmcmVzaCBleGl0IGxhdGVuY3kgdmFs dWUgKi8KKwl2YWwgPSB2bHZfYnVuaXRfcmVhZChkZXZfcHJpdiwgQlVOSVRfUkVHX0JJU09DKTsK Kwl2YWwgJj0gfjB4N2Y7CisKKwkvKgorCSAqIEZvciBoaWdoIGJhbmR3aWR0aCBjb25maWdzLCB3 ZSBzZXQgYSBoaWdoZXIgbGF0ZW5jeSBpbiB0aGUgYnVuaXQKKwkgKiBzbyB0aGF0IHRoZSBjb3Jl IGRpc3BsYXkgZmV0Y2ggaGFwcGVucyBpbiB0aW1lIHRvIGF2b2lkIHVuZGVycnVucy4KKwkgKi8K KwlpZiAoY2RjbGsgPT0gNDAwMDAwKQorCQl2YWwgfD0gNDUwMCAvIDI1MDsgLyogNC41IHVzZWMg Ki8KKwllbHNlCisJCXZhbCB8PSAzMDAwIC8gMjUwOyAvKiAzLjAgdXNlYyAqLworCXZsdl9idW5p dF93cml0ZShkZXZfcHJpdiwgQlVOSVRfUkVHX0JJU09DLCB2YWwpOworCisJbXV0ZXhfdW5sb2Nr KCZkZXZfcHJpdi0+c2JfbG9jayk7CisKKwlpbnRlbF91cGRhdGVfY2RjbGsoZGV2X3ByaXYpOwor fQorCitzdGF0aWMgdm9pZCBjaHZfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGlu dCBjZGNsaykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1 KGRldik7CisJdTMyIHZhbCwgY21kOworCisJV0FSTl9PTihkZXZfcHJpdi0+ZGlzcGxheS5nZXRf Y2RjbGsoZGV2X3ByaXYpICE9IGRldl9wcml2LT5jZGNsa19mcmVxKTsKKworCXN3aXRjaCAoY2Rj bGspIHsKKwljYXNlIDMzMzMzMzoKKwljYXNlIDMyMDAwMDoKKwljYXNlIDI2NjY2NzoKKwljYXNl IDIwMDAwMDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKGNkY2xrKTsKKwkJ cmV0dXJuOworCX0KKworCS8qCisJICogU3BlY3MgYXJlIGZ1bGwgb2YgbWlzaW5mb3JtYXRpb24s IGJ1dCB0ZXN0aW5nIG9uIGFjdHVhbAorCSAqIGhhcmR3YXJlIGhhcyBzaG93biB0aGF0IHdlIGp1 c3QgbmVlZCB0byB3cml0ZSB0aGUgZGVzaXJlZAorCSAqIENDSyBkaXZpZGVyIGludG8gdGhlIFB1 bml0IHJlZ2lzdGVyLgorCSAqLworCWNtZCA9IERJVl9ST1VORF9DTE9TRVNUKGRldl9wcml2LT5o cGxsX2ZyZXEgPDwgMSwgY2RjbGspIC0gMTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMu aHdfbG9jayk7CisJdmFsID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BG UkVRKTsKKwl2YWwgJj0gfkRTUEZSRVFHVUFSX01BU0tfQ0hWOworCXZhbCB8PSAoY21kIDw8IERT UEZSRVFHVUFSX1NISUZUX0NIVik7CisJdmx2X3B1bml0X3dyaXRlKGRldl9wcml2LCBQVU5JVF9S RUdfRFNQRlJFUSwgdmFsKTsKKwlpZiAod2FpdF9mb3IoKHZsdl9wdW5pdF9yZWFkKGRldl9wcml2 LCBQVU5JVF9SRUdfRFNQRlJFUSkgJgorCQkgICAgICBEU1BGUkVRU1RBVF9NQVNLX0NIVikgPT0g KGNtZCA8PCBEU1BGUkVRU1RBVF9TSElGVF9DSFYpLAorCQkgICAgIDUwKSkgeworCQlEUk1fRVJS T1IoInRpbWVkIG91dCB3YWl0aW5nIGZvciBDRGNsayBjaGFuZ2VcbiIpOworCX0KKwltdXRleF91 bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisKKwlpbnRlbF91cGRhdGVfY2RjbGsoZGV2 X3ByaXYpOworfQorCitzdGF0aWMgaW50IGJkd19jYWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrKQor eworCWlmIChtYXhfcGl4Y2xrID4gNTQwMDAwKQorCQlyZXR1cm4gNjc1MDAwOworCWVsc2UgaWYg KG1heF9waXhjbGsgPiA0NTAwMDApCisJCXJldHVybiA1NDAwMDA7CisJZWxzZSBpZiAobWF4X3Bp eGNsayA+IDMzNzUwMCkKKwkJcmV0dXJuIDQ1MDAwMDsKKwllbHNlCisJCXJldHVybiAzMzc1MDA7 Cit9CisKK3N0YXRpYyBpbnQgYmR3X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYpCit7CisJdWludDMyX3QgbGNwbGwgPSBJOTE1X1JFQUQoTENQTExfQ1RMKTsKKwl1 aW50MzJfdCBmcmVxID0gbGNwbGwgJiBMQ1BMTF9DTEtfRlJFUV9NQVNLOworCisJaWYgKGxjcGxs ICYgTENQTExfQ0RfU09VUkNFX0ZDTEspCisJCXJldHVybiA4MDAwMDA7CisJZWxzZSBpZiAoSTkx NV9SRUFEKEZVU0VfU1RSQVApICYgSFNXX0NEQ0xLX0xJTUlUKQorCQlyZXR1cm4gNDUwMDAwOwor CWVsc2UgaWYgKGZyZXEgPT0gTENQTExfQ0xLX0ZSRVFfNDUwKQorCQlyZXR1cm4gNDUwMDAwOwor CWVsc2UgaWYgKGZyZXEgPT0gTENQTExfQ0xLX0ZSRVFfNTRPX0JEVykKKwkJcmV0dXJuIDU0MDAw MDsKKwllbHNlIGlmIChmcmVxID09IExDUExMX0NMS19GUkVRXzMzN181X0JEVykKKwkJcmV0dXJu IDMzNzUwMDsKKwllbHNlCisJCXJldHVybiA2NzUwMDA7Cit9CisKK3N0YXRpYyB2b2lkIGJkd19z ZXRfY2RjbGsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNkY2xrKQoreworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKKwl1aW50MzJfdCB2YWws IGRhdGE7CisJaW50IHJldDsKKworCWlmIChXQVJOKChJOTE1X1JFQUQoTENQTExfQ1RMKSAmCisJ CSAgKExDUExMX1BMTF9ESVNBQkxFIHwgTENQTExfUExMX0xPQ0sgfAorCQkgICBMQ1BMTF9DRF9D TE9DS19ESVNBQkxFIHwgTENQTExfUk9PVF9DRF9DTE9DS19ESVNBQkxFIHwKKwkJICAgTENQTExf Q0QyWF9DTE9DS19ESVNBQkxFIHwgTENQTExfUE9XRVJfRE9XTl9BTExPVyB8CisJCSAgIExDUExM X0NEX1NPVVJDRV9GQ0xLKSkgIT0gTENQTExfUExMX0xPQ0ssCisJCSAidHJ5aW5nIHRvIGNoYW5n ZSBjZGNsayBmcmVxdWVuY3kgd2l0aCBjZGNsayBub3QgZW5hYmxlZFxuIikpCisJCXJldHVybjsK KworCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisJcmV0ID0gc2FuZHlicmlk Z2VfcGNvZGVfd3JpdGUoZGV2X3ByaXYsCisJCQkJICAgICAgQkRXX1BDT0RFX0RJU1BMQVlfRlJF UV9DSEFOR0VfUkVRLCAweDApOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2Nr KTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiZmFpbGVkIHRvIGluZm9ybSBwY29kZSBhYm91 dCBjZGNsayBjaGFuZ2VcbiIpOworCQlyZXR1cm47CisJfQorCisJdmFsID0gSTkxNV9SRUFEKExD UExMX0NUTCk7CisJdmFsIHw9IExDUExMX0NEX1NPVVJDRV9GQ0xLOworCUk5MTVfV1JJVEUoTENQ TExfQ1RMLCB2YWwpOworCisJaWYgKHdhaXRfZm9yX3VzKEk5MTVfUkVBRChMQ1BMTF9DVEwpICYK KwkJCUxDUExMX0NEX1NPVVJDRV9GQ0xLX0RPTkUsIDEpKQorCQlEUk1fRVJST1IoIlN3aXRjaGlu ZyB0byBGQ0xLIGZhaWxlZFxuIik7CisKKwl2YWwgPSBJOTE1X1JFQUQoTENQTExfQ1RMKTsKKwl2 YWwgJj0gfkxDUExMX0NMS19GUkVRX01BU0s7CisKKwlzd2l0Y2ggKGNkY2xrKSB7CisJY2FzZSA0 NTAwMDA6CisJCXZhbCB8PSBMQ1BMTF9DTEtfRlJFUV80NTA7CisJCWRhdGEgPSAwOworCQlicmVh azsKKwljYXNlIDU0MDAwMDoKKwkJdmFsIHw9IExDUExMX0NMS19GUkVRXzU0T19CRFc7CisJCWRh dGEgPSAxOworCQlicmVhazsKKwljYXNlIDMzNzUwMDoKKwkJdmFsIHw9IExDUExMX0NMS19GUkVR XzMzN181X0JEVzsKKwkJZGF0YSA9IDI7CisJCWJyZWFrOworCWNhc2UgNjc1MDAwOgorCQl2YWwg fD0gTENQTExfQ0xLX0ZSRVFfNjc1X0JEVzsKKwkJZGF0YSA9IDM7CisJCWJyZWFrOworCWRlZmF1 bHQ6CisJCVdBUk4oMSwgImludmFsaWQgY2RjbGsgZnJlcXVlbmN5XG4iKTsKKwkJcmV0dXJuOwor CX0KKworCUk5MTVfV1JJVEUoTENQTExfQ1RMLCB2YWwpOworCisJdmFsID0gSTkxNV9SRUFEKExD UExMX0NUTCk7CisJdmFsICY9IH5MQ1BMTF9DRF9TT1VSQ0VfRkNMSzsKKwlJOTE1X1dSSVRFKExD UExMX0NUTCwgdmFsKTsKKworCWlmICh3YWl0X2Zvcl91cygoSTkxNV9SRUFEKExDUExMX0NUTCkg JgorCQkJTENQTExfQ0RfU09VUkNFX0ZDTEtfRE9ORSkgPT0gMCwgMSkpCisJCURSTV9FUlJPUigi U3dpdGNoaW5nIGJhY2sgdG8gTENQTEwgZmFpbGVkXG4iKTsKKworCW11dGV4X2xvY2soJmRldl9w cml2LT5ycHMuaHdfbG9jayk7CisJc2FuZHlicmlkZ2VfcGNvZGVfd3JpdGUoZGV2X3ByaXYsIEhT V19QQ09ERV9ERV9XUklURV9GUkVRX1JFUSwgZGF0YSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJp di0+cnBzLmh3X2xvY2spOworCisJSTkxNV9XUklURShDRENMS19GUkVRLCBESVZfUk9VTkRfQ0xP U0VTVChjZGNsaywgMTAwMCkgLSAxKTsKKworCWludGVsX3VwZGF0ZV9jZGNsayhkZXZfcHJpdik7 CisKKwlXQVJOKGNkY2xrICE9IGRldl9wcml2LT5jZGNsa19mcmVxLAorCSAgICAgImNkY2xrIHJl cXVlc3RlZCAlZCBrSHogYnV0IGdvdCAlZCBrSHpcbiIsCisJICAgICBjZGNsaywgZGV2X3ByaXYt PmNkY2xrX2ZyZXEpOworfQorCitzdGF0aWMgaW50IHNrbF9jYWxjX2NkY2xrKGludCBtYXhfcGl4 Y2xrLCBpbnQgdmNvKQoreworCWlmICh2Y28gPT0gODY0MDAwMCkgeworCQlpZiAobWF4X3BpeGNs ayA+IDU0MDAwMCkKKwkJCXJldHVybiA2MTcxNDM7CisJCWVsc2UgaWYgKG1heF9waXhjbGsgPiA0 MzIwMDApCisJCQlyZXR1cm4gNTQwMDAwOworCQllbHNlIGlmIChtYXhfcGl4Y2xrID4gMzA4NTcx KQorCQkJcmV0dXJuIDQzMjAwMDsKKwkJZWxzZQorCQkJcmV0dXJuIDMwODU3MTsKKwl9IGVsc2Ug eworCQlpZiAobWF4X3BpeGNsayA+IDU0MDAwMCkKKwkJCXJldHVybiA2NzUwMDA7CisJCWVsc2Ug aWYgKG1heF9waXhjbGsgPiA0NTAwMDApCisJCQlyZXR1cm4gNTQwMDAwOworCQllbHNlIGlmICht YXhfcGl4Y2xrID4gMzM3NTAwKQorCQkJcmV0dXJuIDQ1MDAwMDsKKwkJZWxzZQorCQkJcmV0dXJu IDMzNzUwMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNrbF9kcGxsMF91cGRhdGUoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXUzMiB2YWw7CisKKwlkZXZfcHJpdi0+Y2Rj bGtfcGxsLnJlZiA9IDI0MDAwOworCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gMDsKKworCXZh bCA9IEk5MTVfUkVBRChMQ1BMTDFfQ1RMKTsKKwlpZiAoKHZhbCAmIExDUExMX1BMTF9FTkFCTEUp ID09IDApCisJCXJldHVybjsKKworCWlmIChXQVJOX09OKCh2YWwgJiBMQ1BMTF9QTExfTE9DSykg PT0gMCkpCisJCXJldHVybjsKKworCXZhbCA9IEk5MTVfUkVBRChEUExMX0NUUkwxKTsKKworCWlm IChXQVJOX09OKCh2YWwgJiAoRFBMTF9DVFJMMV9IRE1JX01PREUoU0tMX0RQTEwwKSB8CisJCQkg ICAgRFBMTF9DVFJMMV9TU0MoU0tMX0RQTEwwKSB8CisJCQkgICAgRFBMTF9DVFJMMV9PVkVSUklE RShTS0xfRFBMTDApKSkgIT0KKwkJICAgIERQTExfQ1RSTDFfT1ZFUlJJREUoU0tMX0RQTEwwKSkp CisJCXJldHVybjsKKworCXN3aXRjaCAodmFsICYgRFBMTF9DVFJMMV9MSU5LX1JBVEVfTUFTSyhT S0xfRFBMTDApKSB7CisJY2FzZSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktf UkFURV84MTAsIFNLTF9EUExMMCk6CisJY2FzZSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NU UkwxX0xJTktfUkFURV8xMzUwLCBTS0xfRFBMTDApOgorCWNhc2UgRFBMTF9DVFJMMV9MSU5LX1JB VEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfMTYyMCwgU0tMX0RQTEwwKToKKwljYXNlIERQTExfQ1RS TDFfTElOS19SQVRFKERQTExfQ1RSTDFfTElOS19SQVRFXzI3MDAsIFNLTF9EUExMMCk6CisJCWRl dl9wcml2LT5jZGNsa19wbGwudmNvID0gODEwMDAwMDsKKwkJYnJlYWs7CisJY2FzZSBEUExMX0NU UkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktfUkFURV8xMDgwLCBTS0xfRFBMTDApOgorCWNh c2UgRFBMTF9DVFJMMV9MSU5LX1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfMjE2MCwgU0tMX0RQ TEwwKToKKwkJZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSA4NjQwMDAwOworCQlicmVhazsKKwlk ZWZhdWx0OgorCQlNSVNTSU5HX0NBU0UodmFsICYgRFBMTF9DVFJMMV9MSU5LX1JBVEVfTUFTSyhT S0xfRFBMTDApKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHNrbF9nZXRfY2RjbGso c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXUzMiBjZGN0bDsKKworCXNr bF9kcGxsMF91cGRhdGUoZGV2X3ByaXYpOworCisJaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNv ID09IDApCisJCXJldHVybiBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZjsKKworCWNkY3RsID0gSTkx NV9SRUFEKENEQ0xLX0NUTCk7CisKKwlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPT0gODY0 MDAwMCkgeworCQlzd2l0Y2ggKGNkY3RsICYgQ0RDTEtfRlJFUV9TRUxfTUFTSykgeworCQljYXNl IENEQ0xLX0ZSRVFfNDUwXzQzMjoKKwkJCXJldHVybiA0MzIwMDA7CisJCWNhc2UgQ0RDTEtfRlJF UV8zMzdfMzA4OgorCQkJcmV0dXJuIDMwODU3MTsKKwkJY2FzZSBDRENMS19GUkVRXzU0MDoKKwkJ CXJldHVybiA1NDAwMDA7CisJCWNhc2UgQ0RDTEtfRlJFUV82NzVfNjE3OgorCQkJcmV0dXJuIDYx NzE0MzsKKwkJZGVmYXVsdDoKKwkJCU1JU1NJTkdfQ0FTRShjZGN0bCAmIENEQ0xLX0ZSRVFfU0VM X01BU0spOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChjZGN0bCAmIENEQ0xLX0ZSRVFfU0VM X01BU0spIHsKKwkJY2FzZSBDRENMS19GUkVRXzQ1MF80MzI6CisJCQlyZXR1cm4gNDUwMDAwOwor CQljYXNlIENEQ0xLX0ZSRVFfMzM3XzMwODoKKwkJCXJldHVybiAzMzc1MDA7CisJCWNhc2UgQ0RD TEtfRlJFUV81NDA6CisJCQlyZXR1cm4gNTQwMDAwOworCQljYXNlIENEQ0xLX0ZSRVFfNjc1XzYx NzoKKwkJCXJldHVybiA2NzUwMDA7CisJCWRlZmF1bHQ6CisJCQlNSVNTSU5HX0NBU0UoY2RjdGwg JiBDRENMS19GUkVRX1NFTF9NQVNLKTsKKwkJfQorCX0KKworCXJldHVybiBkZXZfcHJpdi0+Y2Rj bGtfcGxsLnJlZjsKK30KKworLyogY29udmVydCBmcm9tIGtIeiB0byAuMSBmaXhwb2ludCBNSHog d2l0aCAtMU1IeiBvZmZzZXQgKi8KK3N0YXRpYyBpbnQgc2tsX2NkY2xrX2RlY2ltYWwoaW50IGNk Y2xrKQoreworCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVChjZGNsayAtIDEwMDAsIDUwMCk7Cit9 CisKK3N0YXRpYyB2b2lkIHNrbF9zZXRfcHJlZmVycmVkX2NkY2xrX3ZjbyhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkJCWludCB2Y28pCit7CisJYm9vbCBjaGFuZ2VkID0g ZGV2X3ByaXYtPnNrbF9wcmVmZXJyZWRfdmNvX2ZyZXEgIT0gdmNvOworCisJZGV2X3ByaXYtPnNr bF9wcmVmZXJyZWRfdmNvX2ZyZXEgPSB2Y287CisKKwlpZiAoY2hhbmdlZCkKKwkJaW50ZWxfdXBk YXRlX21heF9jZGNsayhkZXZfcHJpdik7Cit9CisKK3N0YXRpYyB2b2lkIHNrbF9kcGxsMF9lbmFi bGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgdmNvKQoreworCWludCBt aW5fY2RjbGsgPSBza2xfY2FsY19jZGNsaygwLCB2Y28pOworCXUzMiB2YWw7CisKKwlXQVJOX09O KHZjbyAhPSA4MTAwMDAwICYmIHZjbyAhPSA4NjQwMDAwKTsKKworCS8qIHNlbGVjdCB0aGUgbWlu aW11bSBDRENMSyBiZWZvcmUgZW5hYmxpbmcgRFBMTCAwICovCisJdmFsID0gQ0RDTEtfRlJFUV8z MzdfMzA4IHwgc2tsX2NkY2xrX2RlY2ltYWwobWluX2NkY2xrKTsKKwlJOTE1X1dSSVRFKENEQ0xL X0NUTCwgdmFsKTsKKwlQT1NUSU5HX1JFQUQoQ0RDTEtfQ1RMKTsKKworCS8qCisJICogV2UgYWx3 YXlzIGVuYWJsZSBEUExMMCB3aXRoIHRoZSBsb3dlc3QgbGluayByYXRlIHBvc3NpYmxlLCBidXQg c3RpbGwKKwkgKiB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBWQ08gcmVxdWlyZWQgdG8gb3BlcmF0 ZSB0aGUgZURQIHBhbmVsIGF0IHRoZQorCSAqIGRlc2lyZWQgZnJlcXVlbmN5LiBUaGUgdXN1YWwg RFAgbGluayByYXRlcyBvcGVyYXRlIHdpdGggYSBWQ08gb2YKKwkgKiA4MTAwIHdoaWxlIHRoZSBl RFAgMS40IGFsdGVybmF0ZSBsaW5rIHJhdGVzIG5lZWQgYSBWQ08gb2YgODY0MC4KKwkgKiBUaGUg bW9kZXNldCBjb2RlIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgc2VsZWN0aW9uIG9mIHRoZSBleGFj dCBsaW5rCisJICogcmF0ZSBsYXRlciBvbiwgd2l0aCB0aGUgY29uc3RyYWludCBvZiBjaG9vc2lu ZyBhIGZyZXF1ZW5jeSB0aGF0CisJICogd29ya3Mgd2l0aCB2Y28uCisJICovCisJdmFsID0gSTkx NV9SRUFEKERQTExfQ1RSTDEpOworCisJdmFsICY9IH4oRFBMTF9DVFJMMV9IRE1JX01PREUoU0tM X0RQTEwwKSB8IERQTExfQ1RSTDFfU1NDKFNLTF9EUExMMCkgfAorCQkgRFBMTF9DVFJMMV9MSU5L X1JBVEVfTUFTSyhTS0xfRFBMTDApKTsKKwl2YWwgfD0gRFBMTF9DVFJMMV9PVkVSUklERShTS0xf RFBMTDApOworCWlmICh2Y28gPT0gODY0MDAwMCkKKwkJdmFsIHw9IERQTExfQ1RSTDFfTElOS19S QVRFKERQTExfQ1RSTDFfTElOS19SQVRFXzEwODAsCisJCQkJCSAgICBTS0xfRFBMTDApOworCWVs c2UKKwkJdmFsIHw9IERQTExfQ1RSTDFfTElOS19SQVRFKERQTExfQ1RSTDFfTElOS19SQVRFXzgx MCwKKwkJCQkJICAgIFNLTF9EUExMMCk7CisKKwlJOTE1X1dSSVRFKERQTExfQ1RSTDEsIHZhbCk7 CisJUE9TVElOR19SRUFEKERQTExfQ1RSTDEpOworCisJSTkxNV9XUklURShMQ1BMTDFfQ1RMLCBJ OTE1X1JFQUQoTENQTEwxX0NUTCkgfCBMQ1BMTF9QTExfRU5BQkxFKTsKKworCWlmIChpbnRlbF93 YWl0X2Zvcl9yZWdpc3RlcihkZXZfcHJpdiwKKwkJCQkgICAgTENQTEwxX0NUTCwgTENQTExfUExM X0xPQ0ssIExDUExMX1BMTF9MT0NLLAorCQkJCSAgICA1KSkKKwkJRFJNX0VSUk9SKCJEUExMMCBu b3QgbG9ja2VkXG4iKTsKKworCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gdmNvOworCisJLyog V2UnbGwgd2FudCB0byBrZWVwIHVzaW5nIHRoZSBjdXJyZW50IHZjbyBmcm9tIG5vdyBvbi4gKi8K Kwlza2xfc2V0X3ByZWZlcnJlZF9jZGNsa192Y28oZGV2X3ByaXYsIHZjbyk7Cit9CisKK3N0YXRp YyB2b2lkIHNrbF9kcGxsMF9kaXNhYmxlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp dikKK3sKKwlJOTE1X1dSSVRFKExDUExMMV9DVEwsIEk5MTVfUkVBRChMQ1BMTDFfQ1RMKSAmIH5M Q1BMTF9QTExfRU5BQkxFKTsKKwlpZiAoaW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoZGV2X3ByaXYs CisJCQkJICAgTENQTEwxX0NUTCwgTENQTExfUExMX0xPQ0ssIDAsCisJCQkJICAgMSkpCisJCURS TV9FUlJPUigiQ291bGRuJ3QgZGlzYWJsZSBEUExMMFxuIik7CisKKwlkZXZfcHJpdi0+Y2RjbGtf cGxsLnZjbyA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHNrbF9zZXRfY2RjbGsoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICBpbnQgY2RjbGssIGludCB2Y28pCit7CisJdTMy IGZyZXFfc2VsZWN0LCBwY3VfYWNrOworCWludCByZXQ7CisKKwlXQVJOX09OKChjZGNsayA9PSAy NDAwMCkgIT0gKHZjbyA9PSAwKSk7CisKKwlEUk1fREVCVUdfRFJJVkVSKCJDaGFuZ2luZyBDRENM SyB0byAlZCBrSHogKFZDTyAlZCBrSHopXG4iLAorCQkJIGNkY2xrLCB2Y28pOworCisJbXV0ZXhf bG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKwlyZXQgPSBza2xfcGNvZGVfcmVxdWVzdChk ZXZfcHJpdiwgU0tMX1BDT0RFX0NEQ0xLX0NPTlRST0wsCisJCQkJU0tMX0NEQ0xLX1BSRVBBUkVf Rk9SX0NIQU5HRSwKKwkJCQlTS0xfQ0RDTEtfUkVBRFlfRk9SX0NIQU5HRSwKKwkJCQlTS0xfQ0RD TEtfUkVBRFlfRk9SX0NIQU5HRSwgMyk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3 X2xvY2spOworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5mb3JtIFBDVSBh Ym91dCBjZGNsayBjaGFuZ2UgKCVkKVxuIiwKKwkJCSAgcmV0KTsKKwkJcmV0dXJuOworCX0KKwor CS8qIHNldCBDRENMS19DVEwgKi8KKwlzd2l0Y2ggKGNkY2xrKSB7CisJY2FzZSA0NTAwMDA6CisJ Y2FzZSA0MzIwMDA6CisJCWZyZXFfc2VsZWN0ID0gQ0RDTEtfRlJFUV80NTBfNDMyOworCQlwY3Vf YWNrID0gMTsKKwkJYnJlYWs7CisJY2FzZSA1NDAwMDA6CisJCWZyZXFfc2VsZWN0ID0gQ0RDTEtf RlJFUV81NDA7CisJCXBjdV9hY2sgPSAyOworCQlicmVhazsKKwljYXNlIDMwODU3MToKKwljYXNl IDMzNzUwMDoKKwlkZWZhdWx0OgorCQlmcmVxX3NlbGVjdCA9IENEQ0xLX0ZSRVFfMzM3XzMwODsK KwkJcGN1X2FjayA9IDA7CisJCWJyZWFrOworCWNhc2UgNjE3MTQzOgorCWNhc2UgNjc1MDAwOgor CQlmcmVxX3NlbGVjdCA9IENEQ0xLX0ZSRVFfNjc1XzYxNzsKKwkJcGN1X2FjayA9IDM7CisJCWJy ZWFrOworCX0KKworCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSAwICYmCisJICAgIGRl dl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykKKwkJc2tsX2RwbGwwX2Rpc2FibGUoZGV2X3By aXYpOworCisJaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykKKwkJc2tsX2RwbGww X2VuYWJsZShkZXZfcHJpdiwgdmNvKTsKKworCUk5MTVfV1JJVEUoQ0RDTEtfQ1RMLCBmcmVxX3Nl bGVjdCB8IHNrbF9jZGNsa19kZWNpbWFsKGNkY2xrKSk7CisJUE9TVElOR19SRUFEKENEQ0xLX0NU TCk7CisKKwkvKiBpbmZvcm0gUENVIG9mIHRoZSBjaGFuZ2UgKi8KKwltdXRleF9sb2NrKCZkZXZf cHJpdi0+cnBzLmh3X2xvY2spOworCXNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKGRldl9wcml2LCBT S0xfUENPREVfQ0RDTEtfQ09OVFJPTCwgcGN1X2Fjayk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJp di0+cnBzLmh3X2xvY2spOworCisJaW50ZWxfdXBkYXRlX2NkY2xrKGRldl9wcml2KTsKK30KKwor c3RhdGljIHZvaWQgc2tsX3Nhbml0aXplX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdikKK3sKKwl1aW50MzJfdCBjZGN0bCwgZXhwZWN0ZWQ7CisKKwkvKgorCSAqIGNoZWNr IGlmIHRoZSBwcmUtb3MgaW5pdGlhbGl6ZWQgdGhlIGRpc3BsYXkKKwkgKiBUaGVyZSBpcyBTV0Yx OCBzY3JhdGNocGFkIHJlZ2lzdGVyIGRlZmluZWQgd2hpY2ggaXMgc2V0IGJ5IHRoZQorCSAqIHBy ZS1vcyB3aGljaCBjYW4gYmUgdXNlZCBieSB0aGUgT1MgZHJpdmVycyB0byBjaGVjayB0aGUgc3Rh dHVzCisJICovCisJaWYgKChJOTE1X1JFQUQoU1dGX0lMSygweDE4KSkgJiAweDAwRkZGRkZGKSA9 PSAwKQorCQlnb3RvIHNhbml0aXplOworCisJaW50ZWxfdXBkYXRlX2NkY2xrKGRldl9wcml2KTsK KwkvKiBJcyBQTEwgZW5hYmxlZCBhbmQgbG9ja2VkID8gKi8KKwlpZiAoZGV2X3ByaXYtPmNkY2xr X3BsbC52Y28gPT0gMCB8fAorCSAgICBkZXZfcHJpdi0+Y2RjbGtfZnJlcSA9PSBkZXZfcHJpdi0+ Y2RjbGtfcGxsLnJlZikKKwkJZ290byBzYW5pdGl6ZTsKKworCS8qIERQTEwgb2theTsgdmVyaWZ5 IHRoZSBjZGNsb2NrCisJICoKKwkgKiBOb3RpY2VkIGluIHNvbWUgaW5zdGFuY2VzIHRoYXQgdGhl IGZyZXEgc2VsZWN0aW9uIGlzIGNvcnJlY3QgYnV0CisJICogZGVjaW1hbCBwYXJ0IGlzIHByb2dy YW1tZWQgd3JvbmcgZnJvbSBCSU9TIHdoZXJlIHByZS1vcyBkb2VzIG5vdAorCSAqIGVuYWJsZSBk aXNwbGF5LiBWZXJpZnkgdGhlIHNhbWUgYXMgd2VsbC4KKwkgKi8KKwljZGN0bCA9IEk5MTVfUkVB RChDRENMS19DVEwpOworCWV4cGVjdGVkID0gKGNkY3RsICYgQ0RDTEtfRlJFUV9TRUxfTUFTSykg fAorCQlza2xfY2RjbGtfZGVjaW1hbChkZXZfcHJpdi0+Y2RjbGtfZnJlcSk7CisJaWYgKGNkY3Rs ID09IGV4cGVjdGVkKQorCQkvKiBBbGwgd2VsbDsgbm90aGluZyB0byBzYW5pdGl6ZSAqLworCQly ZXR1cm47CisKK3Nhbml0aXplOgorCURSTV9ERUJVR19LTVMoIlNhbml0aXppbmcgY2RjbGsgcHJv Z3JhbW1lZCBieSBwcmUtb3NcbiIpOworCisJLyogZm9yY2UgY2RjbGsgcHJvZ3JhbW1pbmcgKi8K KwlkZXZfcHJpdi0+Y2RjbGtfZnJlcSA9IDA7CisJLyogZm9yY2UgZnVsbCBQTEwgZGlzYWJsZSAr IGVuYWJsZSAqLworCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gLTE7Cit9CisKKy8qKgorICog c2tsX2luaXRfY2RjbGsgLSBJbml0aWFsaXplIENEQ0xLIG9uIFNLTAorICogQGRldl9wcml2OiBp OTE1IGRldmljZQorICoKKyAqIEluaXRpYWxpemUgQ0RDTEsgZm9yIFNLTCBhbmQgZGVyaXZhdGl2 ZXMuIFRoaXMgaXMgZ2VuZXJhbGx5CisgKiBkb25lIG9ubHkgZHVyaW5nIHRoZSBkaXNwbGF5IGNv cmUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UsCisgKiBhZnRlciB3aGljaCB0aGUgRE1DIHdpbGwg dGFrZSBjYXJlIG9mIHR1cm5pbmcgQ0RDTEsgb2ZmL29uCisgKiBhcyBuZWVkZWQuCisgKi8KK3Zv aWQgc2tsX2luaXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQorewor CWludCBjZGNsaywgdmNvOworCisJc2tsX3Nhbml0aXplX2NkY2xrKGRldl9wcml2KTsKKworCWlm IChkZXZfcHJpdi0+Y2RjbGtfZnJlcSAhPSAwICYmIGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9 IDApIHsKKwkJLyoKKwkJICogVXNlIHRoZSBjdXJyZW50IHZjbyBhcyBvdXIgaW5pdGlhbAorCQkg KiBndWVzcyBhcyB0byB3aGF0IHRoZSBwcmVmZXJyZWQgdmNvIGlzLgorCQkgKi8KKwkJaWYgKGRl dl9wcml2LT5za2xfcHJlZmVycmVkX3Zjb19mcmVxID09IDApCisJCQlza2xfc2V0X3ByZWZlcnJl ZF9jZGNsa192Y28oZGV2X3ByaXYsCisJCQkJCQkgICAgZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28p OworCQlyZXR1cm47CisJfQorCisJdmNvID0gZGV2X3ByaXYtPnNrbF9wcmVmZXJyZWRfdmNvX2Zy ZXE7CisJaWYgKHZjbyA9PSAwKQorCQl2Y28gPSA4MTAwMDAwOworCWNkY2xrID0gc2tsX2NhbGNf Y2RjbGsoMCwgdmNvKTsKKworCXNrbF9zZXRfY2RjbGsoZGV2X3ByaXYsIGNkY2xrLCB2Y28pOwor fQorCisvKioKKyAqIHNrbF91bmluaXRfY2RjbGsgLSBVbmluaXRpYWxpemUgQ0RDTEsgb24gU0tM CisgKiBAZGV2X3ByaXY6IGk5MTUgZGV2aWNlCisgKgorICogVW5pbml0aWFsaXplIENEQ0xLIGZv ciBTS0wgYW5kIGRlcml2YXRpdmVzLiBUaGlzIGlzIGRvbmUgb25seQorICogZHVyaW5nIHRoZSBk aXNwbGF5IGNvcmUgdW5pbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4KKyAqLwordm9pZCBza2xfdW5p bml0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlza2xfc2V0 X2NkY2xrKGRldl9wcml2LCBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZiwgMCk7Cit9CisKK3N0YXRp YyBpbnQgYnh0X2NhbGNfY2RjbGsoaW50IG1heF9waXhjbGspCit7CisJaWYgKG1heF9waXhjbGsg PiA1NzYwMDApCisJCXJldHVybiA2MjQwMDA7CisJZWxzZSBpZiAobWF4X3BpeGNsayA+IDM4NDAw MCkKKwkJcmV0dXJuIDU3NjAwMDsKKwllbHNlIGlmIChtYXhfcGl4Y2xrID4gMjg4MDAwKQorCQly ZXR1cm4gMzg0MDAwOworCWVsc2UgaWYgKG1heF9waXhjbGsgPiAxNDQwMDApCisJCXJldHVybiAy ODgwMDA7CisJZWxzZQorCQlyZXR1cm4gMTQ0MDAwOworfQorCitzdGF0aWMgaW50IGdsa19jYWxj X2NkY2xrKGludCBtYXhfcGl4Y2xrKQoreworCWlmIChtYXhfcGl4Y2xrID4gMiAqIDE1ODQwMCkK KwkJcmV0dXJuIDMxNjgwMDsKKwllbHNlIGlmIChtYXhfcGl4Y2xrID4gMiAqIDc5MjAwKQorCQly ZXR1cm4gMTU4NDAwOworCWVsc2UKKwkJcmV0dXJuIDc5MjAwOworfQorCitzdGF0aWMgaW50IGJ4 dF9kZV9wbGxfdmNvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGNkY2xr KQoreworCWludCByYXRpbzsKKworCWlmIChjZGNsayA9PSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJl ZikKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKGNkY2xrKSB7CisJZGVmYXVsdDoKKwkJTUlTU0lO R19DQVNFKGNkY2xrKTsKKwljYXNlIDE0NDAwMDoKKwljYXNlIDI4ODAwMDoKKwljYXNlIDM4NDAw MDoKKwljYXNlIDU3NjAwMDoKKwkJcmF0aW8gPSA2MDsKKwkJYnJlYWs7CisJY2FzZSA2MjQwMDA6 CisJCXJhdGlvID0gNjU7CisJCWJyZWFrOworCX0KKworCXJldHVybiBkZXZfcHJpdi0+Y2RjbGtf cGxsLnJlZiAqIHJhdGlvOworfQorCitzdGF0aWMgaW50IGdsa19kZV9wbGxfdmNvKHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGNkY2xrKQoreworCWludCByYXRpbzsKKwor CWlmIChjZGNsayA9PSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZikKKwkJcmV0dXJuIDA7CisKKwlz d2l0Y2ggKGNkY2xrKSB7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKGNkY2xrKTsKKwljYXNl ICA3OTIwMDoKKwljYXNlIDE1ODQwMDoKKwljYXNlIDMxNjgwMDoKKwkJcmF0aW8gPSAzMzsKKwkJ YnJlYWs7CisJfQorCisJcmV0dXJuIGRldl9wcml2LT5jZGNsa19wbGwucmVmICogcmF0aW87Cit9 CisKK3N0YXRpYyB2b2lkIGJ4dF9kZV9wbGxfdXBkYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKK3sKKwl1MzIgdmFsOworCisJZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYgPSAx OTIwMDsKKwlkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9IDA7CisKKwl2YWwgPSBJOTE1X1JFQUQo QlhUX0RFX1BMTF9FTkFCTEUpOworCWlmICgodmFsICYgQlhUX0RFX1BMTF9QTExfRU5BQkxFKSA9 PSAwKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTigodmFsICYgQlhUX0RFX1BMTF9MT0NLKSA9 PSAwKSkKKwkJcmV0dXJuOworCisJdmFsID0gSTkxNV9SRUFEKEJYVF9ERV9QTExfQ1RMKTsKKwlk ZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9ICh2YWwgJiBCWFRfREVfUExMX1JBVElPX01BU0spICoK KwkJZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWY7Cit9CisKK3N0YXRpYyBpbnQgYnh0X2dldF9jZGNs ayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJdTMyIGRpdmlkZXI7CisJ aW50IGRpdiwgdmNvOworCisJYnh0X2RlX3BsbF91cGRhdGUoZGV2X3ByaXYpOworCisJdmNvID0g ZGV2X3ByaXYtPmNkY2xrX3BsbC52Y287CisJaWYgKHZjbyA9PSAwKQorCQlyZXR1cm4gZGV2X3By aXYtPmNkY2xrX3BsbC5yZWY7CisKKwlkaXZpZGVyID0gSTkxNV9SRUFEKENEQ0xLX0NUTCkgJiBC WFRfQ0RDTEtfQ0QyWF9ESVZfU0VMX01BU0s7CisKKwlzd2l0Y2ggKGRpdmlkZXIpIHsKKwljYXNl IEJYVF9DRENMS19DRDJYX0RJVl9TRUxfMToKKwkJZGl2ID0gMjsKKwkJYnJlYWs7CisJY2FzZSBC WFRfQ0RDTEtfQ0QyWF9ESVZfU0VMXzFfNToKKwkJV0FSTihJU19HRU1JTklMQUtFKGRldl9wcml2 KSwgIlVuc3VwcG9ydGVkIGRpdmlkZXJcbiIpOworCQlkaXYgPSAzOworCQlicmVhazsKKwljYXNl IEJYVF9DRENMS19DRDJYX0RJVl9TRUxfMjoKKwkJZGl2ID0gNDsKKwkJYnJlYWs7CisJY2FzZSBC WFRfQ0RDTEtfQ0QyWF9ESVZfU0VMXzQ6CisJCWRpdiA9IDg7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCU1JU1NJTkdfQ0FTRShkaXZpZGVyKTsKKwkJcmV0dXJuIGRldl9wcml2LT5jZGNsa19wbGwu cmVmOworCX0KKworCXJldHVybiBESVZfUk9VTkRfQ0xPU0VTVCh2Y28sIGRpdik7Cit9CisKK3N0 YXRpYyB2b2lkIGJ4dF9kZV9wbGxfZGlzYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYpCit7CisJSTkxNV9XUklURShCWFRfREVfUExMX0VOQUJMRSwgMCk7CisKKwkvKiBUaW1l b3V0IDIwMHVzICovCisJaWYgKGludGVsX3dhaXRfZm9yX3JlZ2lzdGVyKGRldl9wcml2LAorCQkJ CSAgICBCWFRfREVfUExMX0VOQUJMRSwgQlhUX0RFX1BMTF9MT0NLLCAwLAorCQkJCSAgICAxKSkK KwkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIERFIFBMTCB1bmxvY2tcbiIpOworCisJ ZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSAwOworfQorCitzdGF0aWMgdm9pZCBieHRfZGVfcGxs X2VuYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCB2Y28pCit7CisJ aW50IHJhdGlvID0gRElWX1JPVU5EX0NMT1NFU1QodmNvLCBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJl Zik7CisJdTMyIHZhbDsKKworCXZhbCA9IEk5MTVfUkVBRChCWFRfREVfUExMX0NUTCk7CisJdmFs ICY9IH5CWFRfREVfUExMX1JBVElPX01BU0s7CisJdmFsIHw9IEJYVF9ERV9QTExfUkFUSU8ocmF0 aW8pOworCUk5MTVfV1JJVEUoQlhUX0RFX1BMTF9DVEwsIHZhbCk7CisKKwlJOTE1X1dSSVRFKEJY VF9ERV9QTExfRU5BQkxFLCBCWFRfREVfUExMX1BMTF9FTkFCTEUpOworCisJLyogVGltZW91dCAy MDB1cyAqLworCWlmIChpbnRlbF93YWl0X2Zvcl9yZWdpc3RlcihkZXZfcHJpdiwKKwkJCQkgICAg QlhUX0RFX1BMTF9FTkFCTEUsCisJCQkJICAgIEJYVF9ERV9QTExfTE9DSywKKwkJCQkgICAgQlhU X0RFX1BMTF9MT0NLLAorCQkJCSAgICAxKSkKKwkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRpbmcg Zm9yIERFIFBMTCBsb2NrXG4iKTsKKworCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gdmNvOwor fQorCitzdGF0aWMgdm9pZCBieHRfc2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdiwgaW50IGNkY2xrKQoreworCXUzMiB2YWwsIGRpdmlkZXI7CisJaW50IHZjbywgcmV0 OworCisJaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQorCQl2Y28gPSBnbGtfZGVfcGxsX3Zj byhkZXZfcHJpdiwgY2RjbGspOworCWVsc2UKKwkJdmNvID0gYnh0X2RlX3BsbF92Y28oZGV2X3By aXYsIGNkY2xrKTsKKworCURSTV9ERUJVR19EUklWRVIoIkNoYW5naW5nIENEQ0xLIHRvICVkIGtI eiAoVkNPICVkIGtIeilcbiIsCisJCQkgY2RjbGssIHZjbyk7CisKKwkvKiBjZGNsayA9IHZjbyAv IDIgLyBkaXZ7MSwxLjUsMiw0fSAqLworCXN3aXRjaCAoRElWX1JPVU5EX0NMT1NFU1QodmNvLCBj ZGNsaykpIHsKKwljYXNlIDg6CisJCWRpdmlkZXIgPSBCWFRfQ0RDTEtfQ0QyWF9ESVZfU0VMXzQ7 CisJCWJyZWFrOworCWNhc2UgNDoKKwkJZGl2aWRlciA9IEJYVF9DRENMS19DRDJYX0RJVl9TRUxf MjsKKwkJYnJlYWs7CisJY2FzZSAzOgorCQlXQVJOKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpLCAi VW5zdXBwb3J0ZWQgZGl2aWRlclxuIik7CisJCWRpdmlkZXIgPSBCWFRfQ0RDTEtfQ0QyWF9ESVZf U0VMXzFfNTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkaXZpZGVyID0gQlhUX0NEQ0xLX0NEMlhf RElWX1NFTF8xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOX09OKGNkY2xrICE9IGRldl9w cml2LT5jZGNsa19wbGwucmVmKTsKKwkJV0FSTl9PTih2Y28gIT0gMCk7CisKKwkJZGl2aWRlciA9 IEJYVF9DRENMS19DRDJYX0RJVl9TRUxfMTsKKwkJYnJlYWs7CisJfQorCisJLyogSW5mb3JtIHBv d2VyIGNvbnRyb2xsZXIgb2YgdXBjb21pbmcgZnJlcXVlbmN5IGNoYW5nZSAqLworCW11dGV4X2xv Y2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisJcmV0ID0gc2FuZHlicmlkZ2VfcGNvZGVfd3Jp dGUoZGV2X3ByaXYsIEhTV19QQ09ERV9ERV9XUklURV9GUkVRX1JFUSwKKwkJCQkgICAgICAweDgw MDAwMDAwKTsKKwltdXRleF91bmxvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisKKwlpZiAo cmV0KSB7CisJCURSTV9FUlJPUigiUENvZGUgQ0RDTEsgZnJlcSBjaGFuZ2Ugbm90aWZ5IGZhaWxl ZCAoZXJyICVkLCBmcmVxICVkKVxuIiwKKwkJCSAgcmV0LCBjZGNsayk7CisJCXJldHVybjsKKwl9 CisKKwlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gIT0gMCAmJgorCSAgICBkZXZfcHJpdi0+ Y2RjbGtfcGxsLnZjbyAhPSB2Y28pCisJCWJ4dF9kZV9wbGxfZGlzYWJsZShkZXZfcHJpdik7CisK KwlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gIT0gdmNvKQorCQlieHRfZGVfcGxsX2VuYWJs ZShkZXZfcHJpdiwgdmNvKTsKKworCXZhbCA9IGRpdmlkZXIgfCBza2xfY2RjbGtfZGVjaW1hbChj ZGNsayk7CisJLyoKKwkgKiBGSVhNRSBpZiBvbmx5IHRoZSBjZDJ4IGRpdmlkZXIgbmVlZHMgY2hh bmdpbmcsIGl0IGNvdWxkIGJlIGRvbmUKKwkgKiB3aXRob3V0IHNodXR0aW5nIG9mZiB0aGUgcGlw ZSAoaWYgb25seSBvbmUgcGlwZSBpcyBhY3RpdmUpLgorCSAqLworCXZhbCB8PSBCWFRfQ0RDTEtf Q0QyWF9QSVBFX05PTkU7CisJLyoKKwkgKiBEaXNhYmxlIFNTQSBQcmVjaGFyZ2Ugd2hlbiBDRCBj bG9jayBmcmVxdWVuY3kgPCA1MDAgTUh6LAorCSAqIGVuYWJsZSBvdGhlcndpc2UuCisJICovCisJ aWYgKGNkY2xrID49IDUwMDAwMCkKKwkJdmFsIHw9IEJYVF9DRENMS19TU0FfUFJFQ0hBUkdFX0VO QUJMRTsKKwlJOTE1X1dSSVRFKENEQ0xLX0NUTCwgdmFsKTsKKworCW11dGV4X2xvY2soJmRldl9w cml2LT5ycHMuaHdfbG9jayk7CisJcmV0ID0gc2FuZHlicmlkZ2VfcGNvZGVfd3JpdGUoZGV2X3By aXYsIEhTV19QQ09ERV9ERV9XUklURV9GUkVRX1JFUSwKKwkJCQkgICAgICBESVZfUk9VTkRfVVAo Y2RjbGssIDI1MDAwKSk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwor CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIlBDb2RlIENEQ0xLIGZyZXEgc2V0IGZhaWxlZCwg KGVyciAlZCwgZnJlcSAlZClcbiIsCisJCQkgIHJldCwgY2RjbGspOworCQlyZXR1cm47CisJfQor CisJaW50ZWxfdXBkYXRlX2NkY2xrKGRldl9wcml2KTsKK30KKworc3RhdGljIHZvaWQgYnh0X3Nh bml0aXplX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1MzIg Y2RjdGwsIGV4cGVjdGVkOworCisJaW50ZWxfdXBkYXRlX2NkY2xrKGRldl9wcml2KTsKKworCWlm IChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9PSAwIHx8CisJICAgIGRldl9wcml2LT5jZGNsa19m cmVxID09IGRldl9wcml2LT5jZGNsa19wbGwucmVmKQorCQlnb3RvIHNhbml0aXplOworCisJLyog RFBMTCBva2F5OyB2ZXJpZnkgdGhlIGNkY2xvY2sKKwkgKgorCSAqIFNvbWUgQklPUyB2ZXJzaW9u cyBsZWF2ZSBhbiBpbmNvcnJlY3QgZGVjaW1hbCBmcmVxdWVuY3kgdmFsdWUgYW5kCisJICogc2V0 IHJlc2VydmVkIE1CWiBiaXRzIGluIENEQ0xLX0NUTCBhdCBsZWFzdCBkdXJpbmcgZXhpdGluZyBm cm9tIFM0LAorCSAqIHNvIHNhbml0aXplIHRoaXMgcmVnaXN0ZXIuCisJICovCisJY2RjdGwgPSBJ OTE1X1JFQUQoQ0RDTEtfQ1RMKTsKKwkvKgorCSAqIExldCdzIGlnbm9yZSB0aGUgcGlwZSBmaWVs ZCwgc2luY2UgQklPUyBjb3VsZCBoYXZlIGNvbmZpZ3VyZWQgdGhlCisJICogZGl2aWRlcnMgYm90 aCBzeW5jaGluZyB0byBhbiBhY3RpdmUgcGlwZSwgb3IgYXN5bmNocm9ub3VzbHkKKwkgKiAoUElQ RV9OT05FKS4KKwkgKi8KKwljZGN0bCAmPSB+QlhUX0NEQ0xLX0NEMlhfUElQRV9OT05FOworCisJ ZXhwZWN0ZWQgPSAoY2RjdGwgJiBCWFRfQ0RDTEtfQ0QyWF9ESVZfU0VMX01BU0spIHwKKwkJICAg c2tsX2NkY2xrX2RlY2ltYWwoZGV2X3ByaXYtPmNkY2xrX2ZyZXEpOworCS8qCisJICogRGlzYWJs ZSBTU0EgUHJlY2hhcmdlIHdoZW4gQ0QgY2xvY2sgZnJlcXVlbmN5IDwgNTAwIE1IeiwKKwkgKiBl bmFibGUgb3RoZXJ3aXNlLgorCSAqLworCWlmIChkZXZfcHJpdi0+Y2RjbGtfZnJlcSA+PSA1MDAw MDApCisJCWV4cGVjdGVkIHw9IEJYVF9DRENMS19TU0FfUFJFQ0hBUkdFX0VOQUJMRTsKKworCWlm IChjZGN0bCA9PSBleHBlY3RlZCkKKwkJLyogQWxsIHdlbGw7IG5vdGhpbmcgdG8gc2FuaXRpemUg Ki8KKwkJcmV0dXJuOworCitzYW5pdGl6ZToKKwlEUk1fREVCVUdfS01TKCJTYW5pdGl6aW5nIGNk Y2xrIHByb2dyYW1tZWQgYnkgcHJlLW9zXG4iKTsKKworCS8qIGZvcmNlIGNkY2xrIHByb2dyYW1t aW5nICovCisJZGV2X3ByaXYtPmNkY2xrX2ZyZXEgPSAwOworCisJLyogZm9yY2UgZnVsbCBQTEwg ZGlzYWJsZSArIGVuYWJsZSAqLworCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gLTE7Cit9CisK Ky8qKgorICogYnh0X2luaXRfY2RjbGsgLSBJbml0aWFsaXplIENEQ0xLIG9uIEJYVAorICogQGRl dl9wcml2OiBpOTE1IGRldmljZQorICoKKyAqIEluaXRpYWxpemUgQ0RDTEsgZm9yIEJYVCBhbmQg ZGVyaXZhdGl2ZXMuIFRoaXMgaXMgZ2VuZXJhbGx5CisgKiBkb25lIG9ubHkgZHVyaW5nIHRoZSBk aXNwbGF5IGNvcmUgaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UsCisgKiBhZnRlciB3aGljaCB0aGUg RE1DIHdpbGwgdGFrZSBjYXJlIG9mIHR1cm5pbmcgQ0RDTEsgb2ZmL29uCisgKiBhcyBuZWVkZWQu CisgKi8KK3ZvaWQgYnh0X2luaXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2KQoreworCWludCBjZGNsazsKKworCWJ4dF9zYW5pdGl6ZV9jZGNsayhkZXZfcHJpdik7CisK KwlpZiAoZGV2X3ByaXYtPmNkY2xrX2ZyZXEgIT0gMCAmJiBkZXZfcHJpdi0+Y2RjbGtfcGxsLnZj byAhPSAwKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEZJWE1FOgorCSAqIC0gVGhlIGluaXRpYWwg Q0RDTEsgbmVlZHMgdG8gYmUgcmVhZCBmcm9tIFZCVC4KKwkgKiAgIE5lZWQgdG8gbWFrZSB0aGlz IGNoYW5nZSBhZnRlciBWQlQgaGFzIGNoYW5nZXMgZm9yIEJYVC4KKwkgKi8KKwlpZiAoSVNfR0VN SU5JTEFLRShkZXZfcHJpdikpCisJCWNkY2xrID0gZ2xrX2NhbGNfY2RjbGsoMCk7CisJZWxzZQor CQljZGNsayA9IGJ4dF9jYWxjX2NkY2xrKDApOworCisJYnh0X3NldF9jZGNsayhkZXZfcHJpdiwg Y2RjbGspOworfQorCisvKioKKyAqIGJ4dF91bmluaXRfY2RjbGsgLSBVbmluaXRpYWxpemUgQ0RD TEsgb24gQlhUCisgKiBAZGV2X3ByaXY6IGk5MTUgZGV2aWNlCisgKgorICogVW5pbml0aWFsaXpl IENEQ0xLIGZvciBCWFQgYW5kIGRlcml2YXRpdmVzLiBUaGlzIGlzIGRvbmUgb25seQorICogZHVy aW5nIHRoZSBkaXNwbGF5IGNvcmUgdW5pbml0aWFsaXphdGlvbiBzZXF1ZW5jZS4KKyAqLwordm9p ZCBieHRfdW5pbml0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sK KwlieHRfc2V0X2NkY2xrKGRldl9wcml2LCBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZik7Cit9CisK K3N0YXRpYyBpbnQgYmR3X2FkanVzdF9taW5fcGlwZV9waXhlbF9yYXRlKHN0cnVjdCBpbnRlbF9j cnRjX3N0YXRlICpjcnRjX3N0YXRlLAorCQkJCQkgIGludCBwaXhlbF9yYXRlKQoreworCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9CisJCXRvX2k5MTUoY3J0Y19zdGF0ZS0+YmFz ZS5jcnRjLT5kZXYpOworCisJLyogcGl4ZWwgcmF0ZSBtdXN0bid0IGV4Y2VlZCA5NSUgb2YgY2Rj bGsgd2l0aCBJUFMgb24gQkRXICovCisJaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikgJiYgY3J0 Y19zdGF0ZS0+aXBzX2VuYWJsZWQpCisJCXBpeGVsX3JhdGUgPSBESVZfUk9VTkRfVVAocGl4ZWxf cmF0ZSAqIDEwMCwgOTUpOworCisJLyogQlNwZWMgc2F5cyAiRG8gbm90IHVzZSBEaXNwbGF5UG9y dCB3aXRoIENEQ0xLIGxlc3MgdGhhbgorCSAqIDQzMiBNSHosIGF1ZGlvIGVuYWJsZWQsIHBvcnQg d2lkdGggeDQsIGFuZCBsaW5rIHJhdGUKKwkgKiBIQlIyICg1LjQgR0h6KSwgb3IgZWxzZSB0aGVy ZSBtYXkgYmUgYXVkaW8gY29ycnVwdGlvbiBvcgorCSAqIHNjcmVlbiBjb3JydXB0aW9uLiIKKwkg Ki8KKwlpZiAoaW50ZWxfY3J0Y19oYXNfZHBfZW5jb2RlcihjcnRjX3N0YXRlKSAmJgorCSAgICBj cnRjX3N0YXRlLT5oYXNfYXVkaW8gJiYKKwkgICAgY3J0Y19zdGF0ZS0+cG9ydF9jbG9jayA+PSA1 NDAwMDAgJiYKKwkgICAgY3J0Y19zdGF0ZS0+bGFuZV9jb3VudCA9PSA0KQorCQlwaXhlbF9yYXRl ID0gbWF4KDQzMjAwMCwgcGl4ZWxfcmF0ZSk7CisKKwlyZXR1cm4gcGl4ZWxfcmF0ZTsKK30KKwor LyogY29tcHV0ZSB0aGUgbWF4IHJhdGUgZm9yIG5ldyBjb25maWd1cmF0aW9uICovCitzdGF0aWMg aW50IGludGVsX21heF9waXhlbF9yYXRlKHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkK K3sKKwlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICppbnRlbF9zdGF0ZSA9IHRvX2ludGVsX2F0 b21pY19zdGF0ZShzdGF0ZSk7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0g dG9faTkxNShzdGF0ZS0+ZGV2KTsKKwlzdHJ1Y3QgZHJtX2NydGMgKmNydGM7CisJc3RydWN0IGRy bV9jcnRjX3N0YXRlICpjc3RhdGU7CisJc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNydGNfc3Rh dGU7CisJdW5zaWduZWQgaW50IG1heF9waXhlbF9yYXRlID0gMCwgaTsKKwllbnVtIHBpcGUgcGlw ZTsKKworCW1lbWNweShpbnRlbF9zdGF0ZS0+bWluX3BpeGNsaywgZGV2X3ByaXYtPm1pbl9waXhj bGssCisJICAgICAgIHNpemVvZihpbnRlbF9zdGF0ZS0+bWluX3BpeGNsaykpOworCisJZm9yX2Vh Y2hfY3J0Y19pbl9zdGF0ZShzdGF0ZSwgY3J0YywgY3N0YXRlLCBpKSB7CisJCWludCBwaXhlbF9y YXRlOworCisJCWNydGNfc3RhdGUgPSB0b19pbnRlbF9jcnRjX3N0YXRlKGNzdGF0ZSk7CisJCWlm ICghY3J0Y19zdGF0ZS0+YmFzZS5lbmFibGUpIHsKKwkJCWludGVsX3N0YXRlLT5taW5fcGl4Y2xr W2ldID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcGl4ZWxfcmF0ZSA9IGNydGNfc3RhdGUt PnBpeGVsX3JhdGU7CisKKwkJaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikgfHwgSVNfR0VOOShk ZXZfcHJpdikpCisJCQlwaXhlbF9yYXRlID0KKwkJCQliZHdfYWRqdXN0X21pbl9waXBlX3BpeGVs X3JhdGUoY3J0Y19zdGF0ZSwKKwkJCQkJCQkgICAgICAgcGl4ZWxfcmF0ZSk7CisKKwkJaW50ZWxf c3RhdGUtPm1pbl9waXhjbGtbaV0gPSBwaXhlbF9yYXRlOworCX0KKworCWZvcl9lYWNoX3BpcGUo ZGV2X3ByaXYsIHBpcGUpCisJCW1heF9waXhlbF9yYXRlID0gbWF4KGludGVsX3N0YXRlLT5taW5f cGl4Y2xrW3BpcGVdLAorCQkJCSAgICAgbWF4X3BpeGVsX3JhdGUpOworCisJcmV0dXJuIG1heF9w aXhlbF9yYXRlOworfQorCitzdGF0aWMgaW50IHZsdl9tb2Rlc2V0X2NhbGNfY2RjbGsoc3RydWN0 IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBz dGF0ZS0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUo ZGV2KTsKKwlpbnQgbWF4X3BpeGNsayA9IGludGVsX21heF9waXhlbF9yYXRlKHN0YXRlKTsKKwlz dHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICppbnRlbF9zdGF0ZSA9CisJCXRvX2ludGVsX2F0b21p Y19zdGF0ZShzdGF0ZSk7CisKKwlpbnRlbF9zdGF0ZS0+Y2RjbGsgPSBpbnRlbF9zdGF0ZS0+ZGV2 X2NkY2xrID0KKwkJdmx2X2NhbGNfY2RjbGsoZGV2X3ByaXYsIG1heF9waXhjbGspOworCisJaWYg KCFpbnRlbF9zdGF0ZS0+YWN0aXZlX2NydGNzKQorCQlpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0g dmx2X2NhbGNfY2RjbGsoZGV2X3ByaXYsIDApOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2 b2lkIHZsdl9tb2Rlc2V0X2NvbW1pdF9jZGNsayhzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqb2xk X3N0YXRlKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvbGRfc3RhdGUtPmRldjsKKwlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CisJc3RydWN0 IGludGVsX2F0b21pY19zdGF0ZSAqb2xkX2ludGVsX3N0YXRlID0KKwkJdG9faW50ZWxfYXRvbWlj X3N0YXRlKG9sZF9zdGF0ZSk7CisJdW5zaWduZWQgaW50IHJlcV9jZGNsayA9IG9sZF9pbnRlbF9z dGF0ZS0+ZGV2X2NkY2xrOworCisJLyoKKwkgKiBGSVhNRTogV2UgY2FuIGVuZCB1cCBoZXJlIHdp dGggYWxsIHBvd2VyIGRvbWFpbnMgb2ZmLCB5ZXQKKwkgKiB3aXRoIGEgQ0RDTEsgZnJlcXVlbmN5 IG90aGVyIHRoYW4gdGhlIG1pbmltdW0uIFRvIGFjY291bnQKKwkgKiBmb3IgdGhpcyB0YWtlIHRo ZSBQSVBFLUEgcG93ZXIgZG9tYWluLCB3aGljaCBjb3ZlcnMgdGhlIEhXCisJICogYmxvY2tzIG5l ZWRlZCBmb3IgdGhlIGZvbGxvd2luZyBwcm9ncmFtbWluZy4gVGhpcyBjYW4gYmUKKwkgKiByZW1v dmVkIG9uY2UgaXQncyBndWFyYW50ZWVkIHRoYXQgd2UgZ2V0IGhlcmUgZWl0aGVyIHdpdGgKKwkg KiB0aGUgbWluaW11bSBDRENMSyBzZXQsIG9yIHRoZSByZXF1aXJlZCBwb3dlciBkb21haW5zCisJ ICogZW5hYmxlZC4KKwkgKi8KKwlpbnRlbF9kaXNwbGF5X3Bvd2VyX2dldChkZXZfcHJpdiwgUE9X RVJfRE9NQUlOX1BJUEVfQSk7CisKKwlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCisJCWNo dl9zZXRfY2RjbGsoZGV2LCByZXFfY2RjbGspOworCWVsc2UKKwkJdmx2X3NldF9jZGNsayhkZXYs IHJlcV9jZGNsayk7CisKKwl2bHZfcHJvZ3JhbV9wZmlfY3JlZGl0cyhkZXZfcHJpdik7CisKKwlp bnRlbF9kaXNwbGF5X3Bvd2VyX3B1dChkZXZfcHJpdiwgUE9XRVJfRE9NQUlOX1BJUEVfQSk7Cit9 CisKK3N0YXRpYyBpbnQgYmR3X21vZGVzZXRfY2FsY19jZGNsayhzdHJ1Y3QgZHJtX2F0b21pY19z dGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9f aTkxNShzdGF0ZS0+ZGV2KTsKKwlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICppbnRlbF9zdGF0 ZSA9IHRvX2ludGVsX2F0b21pY19zdGF0ZShzdGF0ZSk7CisJaW50IG1heF9waXhjbGsgPSBpbnRl bF9tYXhfcGl4ZWxfcmF0ZShzdGF0ZSk7CisJaW50IGNkY2xrOworCisJLyoKKwkgKiBGSVhNRSBz aG91bGQgYWxzbyBhY2NvdW50IGZvciBwbGFuZSByYXRpbworCSAqIG9uY2UgNjRicHAgcGl4ZWwg Zm9ybWF0cyBhcmUgc3VwcG9ydGVkLgorCSAqLworCWNkY2xrID0gYmR3X2NhbGNfY2RjbGsobWF4 X3BpeGNsayk7CisKKwlpZiAoY2RjbGsgPiBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEpIHsKKwkJ RFJNX0RFQlVHX0tNUygicmVxdWVzdGVkIGNkY2xrICglZCBrSHopIGV4Y2VlZHMgbWF4ICglZCBr SHopXG4iLAorCQkJICAgICAgY2RjbGssIGRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSk7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCWludGVsX3N0YXRlLT5jZGNsayA9IGludGVsX3N0YXRlLT5k ZXZfY2RjbGsgPSBjZGNsazsKKwlpZiAoIWludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MpCisJCWlu dGVsX3N0YXRlLT5kZXZfY2RjbGsgPSBiZHdfY2FsY19jZGNsaygwKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCBiZHdfbW9kZXNldF9jb21taXRfY2RjbGsoc3RydWN0IGRybV9hdG9t aWNfc3RhdGUgKm9sZF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2xkX3N0 YXRlLT5kZXY7CisJc3RydWN0IGludGVsX2F0b21pY19zdGF0ZSAqb2xkX2ludGVsX3N0YXRlID0K KwkJdG9faW50ZWxfYXRvbWljX3N0YXRlKG9sZF9zdGF0ZSk7CisJdW5zaWduZWQgaW50IHJlcV9j ZGNsayA9IG9sZF9pbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrOworCisJYmR3X3NldF9jZGNsayhkZXYs IHJlcV9jZGNsayk7Cit9CisKK3N0YXRpYyBpbnQgc2tsX21vZGVzZXRfY2FsY19jZGNsayhzdHJ1 Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGludGVsX2F0b21pY19zdGF0 ZSAqaW50ZWxfc3RhdGUgPSB0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoc3RhdGUtPmRldik7CisJY29uc3Qg aW50IG1heF9waXhjbGsgPSBpbnRlbF9tYXhfcGl4ZWxfcmF0ZShzdGF0ZSk7CisJaW50IHZjbyA9 IGludGVsX3N0YXRlLT5jZGNsa19wbGxfdmNvOworCWludCBjZGNsazsKKworCS8qCisJICogRklY TUUgc2hvdWxkIGFsc28gYWNjb3VudCBmb3IgcGxhbmUgcmF0aW8KKwkgKiBvbmNlIDY0YnBwIHBp eGVsIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KKwkgKi8KKwljZGNsayA9IHNrbF9jYWxjX2NkY2xr KG1heF9waXhjbGssIHZjbyk7CisKKwkvKgorCSAqIEZJWE1FIG1vdmUgdGhlIGNkY2xrIGNhY2x1 bGF0aW9uIHRvCisJICogY29tcHV0ZV9jb25maWcoKSBzbyB3ZSBjYW4gZmFpbCBncmFjZWd1bGx5 LgorCSAqLworCWlmIChjZGNsayA+IGRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSkgeworCQlEUk1f RVJST1IoInJlcXVlc3RlZCBjZGNsayAoJWQga0h6KSBleGNlZWRzIG1heCAoJWQga0h6KVxuIiwK KwkJCSAgY2RjbGssIGRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSk7CisJCWNkY2xrID0gZGV2X3By aXYtPm1heF9jZGNsa19mcmVxOworCX0KKworCWludGVsX3N0YXRlLT5jZGNsayA9IGludGVsX3N0 YXRlLT5kZXZfY2RjbGsgPSBjZGNsazsKKwlpZiAoIWludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3Mp CisJCWludGVsX3N0YXRlLT5kZXZfY2RjbGsgPSBza2xfY2FsY19jZGNsaygwLCB2Y28pOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHNrbF9tb2Rlc2V0X2NvbW1pdF9jZGNsayhzdHJ1 Y3QgZHJtX2F0b21pY19zdGF0ZSAqb2xkX3N0YXRlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUob2xkX3N0YXRlLT5kZXYpOworCXN0cnVjdCBpbnRlbF9h dG9taWNfc3RhdGUgKmludGVsX3N0YXRlID0KKwkJdG9faW50ZWxfYXRvbWljX3N0YXRlKG9sZF9z dGF0ZSk7CisJdW5zaWduZWQgaW50IHJlcV9jZGNsayA9IGludGVsX3N0YXRlLT5kZXZfY2RjbGs7 CisJdW5zaWduZWQgaW50IHJlcV92Y28gPSBpbnRlbF9zdGF0ZS0+Y2RjbGtfcGxsX3ZjbzsKKwor CXNrbF9zZXRfY2RjbGsoZGV2X3ByaXYsIHJlcV9jZGNsaywgcmVxX3Zjbyk7Cit9CisKK3N0YXRp YyBpbnQgYnh0X21vZGVzZXRfY2FsY19jZGNsayhzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3Rh dGUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShzdGF0 ZS0+ZGV2KTsKKwlpbnQgbWF4X3BpeGNsayA9IGludGVsX21heF9waXhlbF9yYXRlKHN0YXRlKTsK KwlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICppbnRlbF9zdGF0ZSA9CisJCXRvX2ludGVsX2F0 b21pY19zdGF0ZShzdGF0ZSk7CisJaW50IGNkY2xrOworCisJaWYgKElTX0dFTUlOSUxBS0UoZGV2 X3ByaXYpKQorCQljZGNsayA9IGdsa19jYWxjX2NkY2xrKG1heF9waXhjbGspOworCWVsc2UKKwkJ Y2RjbGsgPSBieHRfY2FsY19jZGNsayhtYXhfcGl4Y2xrKTsKKworCWludGVsX3N0YXRlLT5jZGNs ayA9IGludGVsX3N0YXRlLT5kZXZfY2RjbGsgPSBjZGNsazsKKworCWlmICghaW50ZWxfc3RhdGUt PmFjdGl2ZV9jcnRjcykgeworCQlpZiAoSVNfR0VNSU5JTEFLRShkZXZfcHJpdikpCisJCQljZGNs ayA9IGdsa19jYWxjX2NkY2xrKDApOworCQllbHNlCisJCQljZGNsayA9IGJ4dF9jYWxjX2NkY2xr KDApOworCisJCWludGVsX3N0YXRlLT5kZXZfY2RjbGsgPSBjZGNsazsKKwl9CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIHZvaWQgYnh0X21vZGVzZXRfY29tbWl0X2NkY2xrKHN0cnVjdCBkcm1f YXRvbWljX3N0YXRlICpvbGRfc3RhdGUpCit7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IG9s ZF9zdGF0ZS0+ZGV2OworCXN0cnVjdCBpbnRlbF9hdG9taWNfc3RhdGUgKm9sZF9pbnRlbF9zdGF0 ZSA9CisJCXRvX2ludGVsX2F0b21pY19zdGF0ZShvbGRfc3RhdGUpOworCXVuc2lnbmVkIGludCBy ZXFfY2RjbGsgPSBvbGRfaW50ZWxfc3RhdGUtPmRldl9jZGNsazsKKworCWJ4dF9zZXRfY2RjbGso dG9faTkxNShkZXYpLCByZXFfY2RjbGspOworfQorCitzdGF0aWMgaW50IGludGVsX2NvbXB1dGVf bWF4X2RvdGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaW50IG1h eF9jZGNsa19mcmVxID0gZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxOworCisJaWYgKElTX0dFTUlO SUxBS0UoZGV2X3ByaXYpKQorCQlyZXR1cm4gMiAqIG1heF9jZGNsa19mcmVxOworCWVsc2UgaWYg KElOVEVMX0lORk8oZGV2X3ByaXYpLT5nZW4gPj0gOSB8fAorCQkgSVNfSEFTV0VMTChkZXZfcHJp dikgfHwgSVNfQlJPQURXRUxMKGRldl9wcml2KSkKKwkJcmV0dXJuIG1heF9jZGNsa19mcmVxOwor CWVsc2UgaWYgKElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQorCQlyZXR1cm4gbWF4X2NkY2xrX2Zy ZXEqOTUvMTAwOworCWVsc2UgaWYgKElOVEVMX0lORk8oZGV2X3ByaXYpLT5nZW4gPCA0KQorCQly ZXR1cm4gMiptYXhfY2RjbGtfZnJlcSo5MC8xMDA7CisJZWxzZQorCQlyZXR1cm4gbWF4X2NkY2xr X2ZyZXEqOTAvMTAwOworfQorCisvKioKKyAqIGludGVsX3VwZGF0ZV9tYXhfY2RjbGsgLSBEZXRl cm1pbmUgdGhlIG1heGltdW0gc3VwcG9ydCBDRENMSyBmcmVxdWVuY3kKKyAqIEBkZXZfcHJpdjog aTkxNSBkZXZpY2UKKyAqCisgKiBEZXRlcm1pbmUgdGhlIG1heGltdW0gQ0RDTEsgZnJlcXVlbmN5 IHRoZSBwbGF0Zm9ybSBzdXBwb3J0cywgYW5kIGFsc28KKyAqIGRlcml2ZSB0aGUgbWF4aW11bSBk b3QgY2xvY2sgZnJlcXVlbmN5IHRoZSBtYXhpbXVtIENEQ0xLIGZyZXF1ZW5jeQorICogYWxsb3dz LgorICovCit2b2lkIGludGVsX3VwZGF0ZV9tYXhfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2KQoreworCWlmIChJU19HRU45X0JDKGRldl9wcml2KSkgeworCQl1MzIgbGlt aXQgPSBJOTE1X1JFQUQoU0tMX0RGU00pICYgU0tMX0RGU01fQ0RDTEtfTElNSVRfTUFTSzsKKwkJ aW50IG1heF9jZGNsaywgdmNvOworCisJCXZjbyA9IGRldl9wcml2LT5za2xfcHJlZmVycmVkX3Zj b19mcmVxOworCQlXQVJOX09OKHZjbyAhPSA4MTAwMDAwICYmIHZjbyAhPSA4NjQwMDAwKTsKKwor CQkvKgorCQkgKiBVc2UgdGhlIGxvd2VyICh2Y28gODY0MCkgY2RjbGsgdmFsdWVzIGFzIGEKKwkJ ICogZmlyc3QgZ3Vlc3MuIHNrbF9jYWxjX2NkY2xrKCkgd2lsbCBjb3JyZWN0IGl0CisJCSAqIGlm IHRoZSBwcmVmZXJyZWQgdmNvIGlzIDgxMDAgaW5zdGVhZC4KKwkJICovCisJCWlmIChsaW1pdCA9 PSBTS0xfREZTTV9DRENMS19MSU1JVF82NzUpCisJCQltYXhfY2RjbGsgPSA2MTcxNDM7CisJCWVs c2UgaWYgKGxpbWl0ID09IFNLTF9ERlNNX0NEQ0xLX0xJTUlUXzU0MCkKKwkJCW1heF9jZGNsayA9 IDU0MDAwMDsKKwkJZWxzZSBpZiAobGltaXQgPT0gU0tMX0RGU01fQ0RDTEtfTElNSVRfNDUwKQor CQkJbWF4X2NkY2xrID0gNDMyMDAwOworCQllbHNlCisJCQltYXhfY2RjbGsgPSAzMDg1NzE7CisK KwkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0gc2tsX2NhbGNfY2RjbGsobWF4X2NkY2xrLCB2 Y28pOworCX0gZWxzZSBpZiAoSVNfR0VNSU5JTEFLRShkZXZfcHJpdikpIHsKKwkJZGV2X3ByaXYt Pm1heF9jZGNsa19mcmVxID0gMzE2ODAwOworCX0gZWxzZSBpZiAoSVNfQlJPWFRPTihkZXZfcHJp dikpIHsKKwkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0gNjI0MDAwOworCX0gZWxzZSBpZiAo SVNfQlJPQURXRUxMKGRldl9wcml2KSkgIHsKKwkJLyoKKwkJICogRklYTUUgd2l0aCBleHRyYSBj b29saW5nIHdlIGNhbiBhbGxvdworCQkgKiA1NDAgTUh6IGZvciBVTFggYW5kIDY3NSBNaHogZm9y IFVMVC4KKwkJICogSG93IGNhbiB3ZSBrbm93IGlmIGV4dHJhIGNvb2xpbmcgaXMKKwkJICogYXZh aWxhYmxlPyBQQ0kgSUQsIFZUQiwgc29tZXRoaW5nIGVsc2U/CisJCSAqLworCQlpZiAoSTkxNV9S RUFEKEZVU0VfU1RSQVApICYgSFNXX0NEQ0xLX0xJTUlUKQorCQkJZGV2X3ByaXYtPm1heF9jZGNs a19mcmVxID0gNDUwMDAwOworCQllbHNlIGlmIChJU19CRFdfVUxYKGRldl9wcml2KSkKKwkJCWRl dl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDQ1MDAwMDsKKwkJZWxzZSBpZiAoSVNfQkRXX1VMVChk ZXZfcHJpdikpCisJCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA1NDAwMDA7CisJCWVsc2UK KwkJCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDY3NTAwMDsKKwl9IGVsc2UgaWYgKElTX0NI RVJSWVZJRVcoZGV2X3ByaXYpKSB7CisJCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDMyMDAw MDsKKwl9IGVsc2UgaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYpKSB7CisJCWRldl9wcml2LT5t YXhfY2RjbGtfZnJlcSA9IDQwMDAwMDsKKwl9IGVsc2UgeworCQkvKiBvdGhlcndpc2UgYXNzdW1l IGNkY2xrIGlzIGZpeGVkICovCisJCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IGRldl9wcml2 LT5jZGNsa19mcmVxOworCX0KKworCWRldl9wcml2LT5tYXhfZG90Y2xrX2ZyZXEgPSBpbnRlbF9j b21wdXRlX21heF9kb3RjbGsoZGV2X3ByaXYpOworCisJRFJNX0RFQlVHX0RSSVZFUigiTWF4IENE IGNsb2NrIHJhdGU6ICVkIGtIelxuIiwKKwkJCSBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEpOwor CisJRFJNX0RFQlVHX0RSSVZFUigiTWF4IGRvdGNsb2NrIHJhdGU6ICVkIGtIelxuIiwKKwkJCSBk ZXZfcHJpdi0+bWF4X2RvdGNsa19mcmVxKTsKK30KKworLyoqCisgKiBpbnRlbF91cGRhdGVfY2Rj bGsgLSBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgQ0RDTEsgZnJlcXVlbmN5CisgKiBAZGV2X3ByaXY6 IGk5MTUgZGV2aWNlCisgKgorICogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IENEQ0xLIGZyZXF1ZW5j eS4KKyAqLwordm9pZCBpbnRlbF91cGRhdGVfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2KQoreworCWRldl9wcml2LT5jZGNsa19mcmVxID0gZGV2X3ByaXYtPmRpc3BsYXku Z2V0X2NkY2xrKGRldl9wcml2KTsKKworCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpID49IDkpCisJ CURSTV9ERUJVR19EUklWRVIoIkN1cnJlbnQgQ0QgY2xvY2sgcmF0ZTogJWQga0h6LCBWQ086ICVk IGtIeiwgcmVmOiAlZCBrSHpcbiIsCisJCQkJIGRldl9wcml2LT5jZGNsa19mcmVxLCBkZXZfcHJp di0+Y2RjbGtfcGxsLnZjbywKKwkJCQkgZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYpOworCWVsc2UK KwkJRFJNX0RFQlVHX0RSSVZFUigiQ3VycmVudCBDRCBjbG9jayByYXRlOiAlZCBrSHpcbiIsCisJ CQkJIGRldl9wcml2LT5jZGNsa19mcmVxKTsKKworCS8qCisJICogOTowIENNQlVTIFtzaWNdIENE Q0xLIGZyZXF1ZW5jeSAoY2RmcmVxKToKKwkgKiBQcm9ncmFtbW5nIFtzaWNdIG5vdGU6IGJpdFs5 OjJdIHNob3VsZCBiZSBwcm9ncmFtbWVkIHRvIHRoZSBudW1iZXIKKwkgKiBvZiBjZGNsayB0aGF0 IGdlbmVyYXRlcyA0TUh6IHJlZmVyZW5jZSBjbG9jayBmcmVxIHdoaWNoIGlzIHVzZWQgdG8KKwkg KiBnZW5lcmF0ZSBHTUJ1cyBjbG9jay4gVGhpcyB3aWxsIHZhcnkgd2l0aCB0aGUgY2RjbGsgZnJl cS4KKwkgKi8KKwlpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdikgfHwgSVNfQ0hFUlJZVklFVyhk ZXZfcHJpdikpCisJCUk5MTVfV1JJVEUoR01CVVNGUkVRX1ZMViwKKwkJCSAgIERJVl9ST1VORF9V UChkZXZfcHJpdi0+Y2RjbGtfZnJlcSwgMTAwMCkpOworfQorCitzdGF0aWMgaW50IHBjaF9yYXdj bGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiAoSTkxNV9S RUFEKFBDSF9SQVdDTEtfRlJFUSkgJiBSQVdDTEtfRlJFUV9NQVNLKSAqIDEwMDA7Cit9CisKK3N0 YXRpYyBpbnQgdmx2X2hyYXdjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQor eworCS8qIFJBV0NMS19GUkVRX1ZMViByZWdpc3RlciB1cGRhdGVkIGZyb20gcG93ZXIgd2VsbCBj b2RlICovCisJcmV0dXJuIHZsdl9nZXRfY2NrX2Nsb2NrX2hwbGwoZGV2X3ByaXYsICJocmF3Y2xr IiwKKwkJCQkgICAgICBDQ0tfRElTUExBWV9SRUZfQ0xPQ0tfQ09OVFJPTCk7Cit9CisKK3N0YXRp YyBpbnQgZzR4X2hyYXdjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQorewor CXVpbnQzMl90IGNsa2NmZzsKKworCS8qIGhyYXdjbG9jayBpcyAxLzQgdGhlIEZTQiBmcmVxdWVu Y3kgKi8KKwljbGtjZmcgPSBJOTE1X1JFQUQoQ0xLQ0ZHKTsKKwlzd2l0Y2ggKGNsa2NmZyAmIENM S0NGR19GU0JfTUFTSykgeworCWNhc2UgQ0xLQ0ZHX0ZTQl80MDA6CisJCXJldHVybiAxMDAwMDA7 CisJY2FzZSBDTEtDRkdfRlNCXzUzMzoKKwkJcmV0dXJuIDEzMzMzMzsKKwljYXNlIENMS0NGR19G U0JfNjY3OgorCQlyZXR1cm4gMTY2NjY3OworCWNhc2UgQ0xLQ0ZHX0ZTQl84MDA6CisJCXJldHVy biAyMDAwMDA7CisJY2FzZSBDTEtDRkdfRlNCXzEwNjc6CisJCXJldHVybiAyNjY2Njc7CisJY2Fz ZSBDTEtDRkdfRlNCXzEzMzM6CisJCXJldHVybiAzMzMzMzM7CisJLyogdGhlc2UgdHdvIGFyZSBq dXN0IGEgZ3Vlc3M7IG9uZSBvZiB0aGVtIG1pZ2h0IGJlIHJpZ2h0ICovCisJY2FzZSBDTEtDRkdf RlNCXzE2MDA6CisJY2FzZSBDTEtDRkdfRlNCXzE2MDBfQUxUOgorCQlyZXR1cm4gNDAwMDAwOwor CWRlZmF1bHQ6CisJCXJldHVybiAxMzMzMzM7CisJfQorfQorCisvKioKKyAqIGludGVsX3VwZGF0 ZV9yYXdjbGsgLSBEZXRlcm1pbmUgdGhlIGN1cnJlbnQgUkFXQ0xLIGZyZXF1ZW5jeQorICogQGRl dl9wcml2OiBpOTE1IGRldmljZQorICoKKyAqIERldGVybWluZSB0aGUgY3VycmVudCBSQVdDTEsg ZnJlcXVlbmN5LiBSQVdDTEsgaXMgYSBmaXhlZAorICogZnJlcXVlbmN5IGNsb2NrIHNvIHRoaXMg bmVlZHMgdG8gZG9uZSBvbmx5IG9uY2UuCisgKi8KK3ZvaWQgaW50ZWxfdXBkYXRlX3Jhd2Nsayhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaWYgKEhBU19QQ0hfU1BMSVQo ZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+cmF3Y2xrX2ZyZXEgPSBwY2hfcmF3Y2xrKGRldl9wcml2 KTsKKwllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSB8fCBJU19DSEVSUllWSUVXKGRl dl9wcml2KSkKKwkJZGV2X3ByaXYtPnJhd2Nsa19mcmVxID0gdmx2X2hyYXdjbGsoZGV2X3ByaXYp OworCWVsc2UgaWYgKElTX0c0WChkZXZfcHJpdikgfHwgSVNfUElORVZJRVcoZGV2X3ByaXYpKQor CQlkZXZfcHJpdi0+cmF3Y2xrX2ZyZXEgPSBnNHhfaHJhd2NsayhkZXZfcHJpdik7CisJZWxzZQor CQkvKiBubyByYXdjbGsgb24gb3RoZXIgcGxhdGZvcm1zLCBvciBubyBuZWVkIHRvIGtub3cgaXQg Ki8KKwkJcmV0dXJuOworCisJRFJNX0RFQlVHX0RSSVZFUigicmF3Y2xrIHJhdGU6ICVkIGtIelxu IiwgZGV2X3ByaXYtPnJhd2Nsa19mcmVxKTsKK30KKworLyoqCisgKiBpbnRlbF9pbml0X2NkY2xr X2hvb2tzIC0gSW5pdGlhbGl6ZSBDRENMSyByZWxhdGVkIG1vZGVzZXR0aW5nIGhvb2tzCisgKiBA ZGV2X3ByaXY6IGk5MTUgZGV2aWNlCisgKi8KK3ZvaWQgaW50ZWxfaW5pdF9jZGNsa19ob29rcyhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJaWYgKElTX1ZBTExFWVZJRVco ZGV2X3ByaXYpIHx8IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKSB7CisJCWRldl9wcml2LT5kaXNw bGF5Lm1vZGVzZXRfY29tbWl0X2NkY2xrID0KKwkJCXZsdl9tb2Rlc2V0X2NvbW1pdF9jZGNsazsK KwkJZGV2X3ByaXYtPmRpc3BsYXkubW9kZXNldF9jYWxjX2NkY2xrID0KKwkJCXZsdl9tb2Rlc2V0 X2NhbGNfY2RjbGs7CisJfSBlbHNlIGlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYpKSB7CisJCWRl dl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY29tbWl0X2NkY2xrID0KKwkJCWJkd19tb2Rlc2V0X2Nv bW1pdF9jZGNsazsKKwkJZGV2X3ByaXYtPmRpc3BsYXkubW9kZXNldF9jYWxjX2NkY2xrID0KKwkJ CWJkd19tb2Rlc2V0X2NhbGNfY2RjbGs7CisJfSBlbHNlIGlmIChJU19HRU45X0xQKGRldl9wcml2 KSkgeworCQlkZXZfcHJpdi0+ZGlzcGxheS5tb2Rlc2V0X2NvbW1pdF9jZGNsayA9CisJCQlieHRf bW9kZXNldF9jb21taXRfY2RjbGs7CisJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY2FsY19j ZGNsayA9CisJCQlieHRfbW9kZXNldF9jYWxjX2NkY2xrOworCX0gZWxzZSBpZiAoSVNfR0VOOV9C QyhkZXZfcHJpdikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkubW9kZXNldF9jb21taXRfY2RjbGsg PQorCQkJc2tsX21vZGVzZXRfY29tbWl0X2NkY2xrOworCQlkZXZfcHJpdi0+ZGlzcGxheS5tb2Rl c2V0X2NhbGNfY2RjbGsgPQorCQkJc2tsX21vZGVzZXRfY2FsY19jZGNsazsKKwl9CisKKwlpZiAo SVNfR0VOOV9CQyhkZXZfcHJpdikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IHNr bF9nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfR0VOOV9MUChkZXZfcHJpdikpCisJCWRldl9wcml2 LT5kaXNwbGF5LmdldF9jZGNsayA9IGJ4dF9nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfQlJPQURX RUxMKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gYmR3X2dldF9j ZGNsazsKKwllbHNlIGlmIChJU19IQVNXRUxMKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3Bs YXkuZ2V0X2NkY2xrID0gaHN3X2dldF9jZGNsazsKKwllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRl dl9wcml2KSB8fCBJU19DSEVSUllWSUVXKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXku Z2V0X2NkY2xrID0gdmx2X2dldF9jZGNsazsKKwllbHNlIGlmIChJU19HRU42KGRldl9wcml2KSB8 fCBJU19JVllCUklER0UoZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsg PSBmaXhlZF80MDBtaHpfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0dFTjUoZGV2X3ByaXYpKQor CQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBmaXhlZF80NTBtaHpfZ2V0X2NkY2xrOwor CWVsc2UgaWYgKElTX0dNNDUoZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2Rj bGsgPSBnbTQ1X2dldF9jZGNsazsKKwllbHNlIGlmIChJU19HNFgoZGV2X3ByaXYpKQorCQlkZXZf cHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBnMzNfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0k5 NjVHTShkZXZfcHJpdikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGk5NjVnbV9n ZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfSTk2NUcoZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlz cGxheS5nZXRfY2RjbGsgPSBmaXhlZF80MDBtaHpfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX1BJ TkVWSUVXKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gcG52X2dl dF9jZGNsazsKKwllbHNlIGlmIChJU19HMzMoZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxh eS5nZXRfY2RjbGsgPSBnMzNfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0k5NDVHTShkZXZfcHJp dikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGk5NDVnbV9nZXRfY2RjbGs7CisJ ZWxzZSBpZiAoSVNfSTk0NUcoZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2Rj bGsgPSBmaXhlZF80MDBtaHpfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0k5MTVHTShkZXZfcHJp dikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGk5MTVnbV9nZXRfY2RjbGs7CisJ ZWxzZSBpZiAoSVNfSTkxNUcoZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2Rj bGsgPSBmaXhlZF8zMzNtaHpfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0k4NjVHKGRldl9wcml2 KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfMjY2bWh6X2dldF9jZGNs azsKKwllbHNlIGlmIChJU19JODVYKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0 X2NkY2xrID0gaTg1eF9nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfSTg0NUcoZGV2X3ByaXYpKQor CQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBmaXhlZF8yMDBtaHpfZ2V0X2NkY2xrOwor CWVsc2UgeyAvKiA4MzAgKi8KKwkJV0FSTighSVNfSTgzMChkZXZfcHJpdiksCisJCSAgICAgIlVu a25vd24gcGxhdGZvcm0uIEFzc3VtaW5nIDEzMyBNSHogQ0RDTEtcbiIpOworCQlkZXZfcHJpdi0+ ZGlzcGxheS5nZXRfY2RjbGsgPSBmaXhlZF8xMzNtaHpfZ2V0X2NkY2xrOworCX0KK30KZGlmZiAt LWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwppbmRleCBjNDA3Y2M0MWMwYzkuLmU5OTZmOGVjOGYw OCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZGlzcGxheS5jCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rpc3BsYXkuYwpAQCAtMTIyLDkgKzEyMiw2IEBA IHN0YXRpYyB2b2lkIGlyb25sYWtlX3BmaXRfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0 YywgYm9vbCBmb3JjZSk7CiBzdGF0aWMgdm9pZCBpcm9ubGFrZV9wZml0X2VuYWJsZShzdHJ1Y3Qg aW50ZWxfY3J0YyAqY3J0Yyk7CiBzdGF0aWMgdm9pZCBpbnRlbF9tb2Rlc2V0X3NldHVwX2h3X3N0 YXRlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpOwogc3RhdGljIHZvaWQgaW50ZWxfcHJlX2Rpc2Fi bGVfcHJpbWFyeV9ub2F0b21pYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpOwotc3RhdGljIGludCBp bnRlbF9tYXhfcGl4ZWxfcmF0ZShzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpOwotc3Rh dGljIGludCBnbGtfY2FsY19jZGNsayhpbnQgbWF4X3BpeGNsayk7Ci1zdGF0aWMgaW50IGJ4dF9j YWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrKTsKIAogc3RydWN0IGludGVsX2xpbWl0IHsKIAlzdHJ1 Y3QgewpAQCAtMTcwLDggKzE2Nyw4IEBAIGludCB2bHZfZ2V0X2Nja19jbG9jayhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKHJlZl9m cmVxIDw8IDEsIGRpdmlkZXIgKyAxKTsKIH0KIAotc3RhdGljIGludCB2bHZfZ2V0X2Nja19jbG9j a19ocGxsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJCQkgIGNvbnN0IGNo YXIgKm5hbWUsIHUzMiByZWcpCitpbnQgdmx2X2dldF9jY2tfY2xvY2tfaHBsbChzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCQkgICBjb25zdCBjaGFyICpuYW1lLCB1MzIgcmVn KQogewogCWlmIChkZXZfcHJpdi0+aHBsbF9mcmVxID09IDApCiAJCWRldl9wcml2LT5ocGxsX2Zy ZXEgPSB2YWxsZXl2aWV3X2dldF92Y28oZGV2X3ByaXYpOwpAQCAtMTgwLDYzICsxNzcsNiBAQCBz dGF0aWMgaW50IHZsdl9nZXRfY2NrX2Nsb2NrX2hwbGwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2LAogCQkJCSBkZXZfcHJpdi0+aHBsbF9mcmVxKTsKIH0KIAotc3RhdGljIGludAot aW50ZWxfcGNoX3Jhd2NsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0J cmV0dXJuIChJOTE1X1JFQUQoUENIX1JBV0NMS19GUkVRKSAmIFJBV0NMS19GUkVRX01BU0spICog MTAwMDsKLX0KLQotc3RhdGljIGludAotaW50ZWxfdmx2X2hyYXdjbGsoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2KQotewotCS8qIFJBV0NMS19GUkVRX1ZMViByZWdpc3RlciB1cGRh dGVkIGZyb20gcG93ZXIgd2VsbCBjb2RlICovCi0JcmV0dXJuIHZsdl9nZXRfY2NrX2Nsb2NrX2hw bGwoZGV2X3ByaXYsICJocmF3Y2xrIiwKLQkJCQkgICAgICBDQ0tfRElTUExBWV9SRUZfQ0xPQ0tf Q09OVFJPTCk7Ci19Ci0KLXN0YXRpYyBpbnQKLWludGVsX2c0eF9ocmF3Y2xrKHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQl1aW50MzJfdCBjbGtjZmc7Ci0KLQkvKiBocmF3 Y2xvY2sgaXMgMS80IHRoZSBGU0IgZnJlcXVlbmN5ICovCi0JY2xrY2ZnID0gSTkxNV9SRUFEKENM S0NGRyk7Ci0Jc3dpdGNoIChjbGtjZmcgJiBDTEtDRkdfRlNCX01BU0spIHsKLQljYXNlIENMS0NG R19GU0JfNDAwOgotCQlyZXR1cm4gMTAwMDAwOwotCWNhc2UgQ0xLQ0ZHX0ZTQl81MzM6Ci0JCXJl dHVybiAxMzMzMzM7Ci0JY2FzZSBDTEtDRkdfRlNCXzY2NzoKLQkJcmV0dXJuIDE2NjY2NzsKLQlj YXNlIENMS0NGR19GU0JfODAwOgotCQlyZXR1cm4gMjAwMDAwOwotCWNhc2UgQ0xLQ0ZHX0ZTQl8x MDY3OgotCQlyZXR1cm4gMjY2NjY3OwotCWNhc2UgQ0xLQ0ZHX0ZTQl8xMzMzOgotCQlyZXR1cm4g MzMzMzMzOwotCS8qIHRoZXNlIHR3byBhcmUganVzdCBhIGd1ZXNzOyBvbmUgb2YgdGhlbSBtaWdo dCBiZSByaWdodCAqLwotCWNhc2UgQ0xLQ0ZHX0ZTQl8xNjAwOgotCWNhc2UgQ0xLQ0ZHX0ZTQl8x NjAwX0FMVDoKLQkJcmV0dXJuIDQwMDAwMDsKLQlkZWZhdWx0OgotCQlyZXR1cm4gMTMzMzMzOwot CX0KLX0KLQotdm9pZCBpbnRlbF91cGRhdGVfcmF3Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKLXsKLQlpZiAoSEFTX1BDSF9TUExJVChkZXZfcHJpdikpCi0JCWRldl9wcml2 LT5yYXdjbGtfZnJlcSA9IGludGVsX3BjaF9yYXdjbGsoZGV2X3ByaXYpOwotCWVsc2UgaWYgKElT X1ZBTExFWVZJRVcoZGV2X3ByaXYpIHx8IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQlkZXZf cHJpdi0+cmF3Y2xrX2ZyZXEgPSBpbnRlbF92bHZfaHJhd2NsayhkZXZfcHJpdik7Ci0JZWxzZSBp ZiAoSVNfRzRYKGRldl9wcml2KSB8fCBJU19QSU5FVklFVyhkZXZfcHJpdikpCi0JCWRldl9wcml2 LT5yYXdjbGtfZnJlcSA9IGludGVsX2c0eF9ocmF3Y2xrKGRldl9wcml2KTsKLQllbHNlCi0JCXJl dHVybjsgLyogbm8gcmF3Y2xrIG9uIG90aGVyIHBsYXRmb3Jtcywgb3Igbm8gbmVlZCB0byBrbm93 IGl0ICovCi0KLQlEUk1fREVCVUdfRFJJVkVSKCJyYXdjbGsgcmF0ZTogJWQga0h6XG4iLCBkZXZf cHJpdi0+cmF3Y2xrX2ZyZXEpOwotfQotCiBzdGF0aWMgdm9pZCBpbnRlbF91cGRhdGVfY3pjbGso c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogewogCWlmICghKElTX1ZBTExFWVZJ RVcoZGV2X3ByaXYpIHx8IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKSkKQEAgLTU3OTEsODg4ICs1 NzMxLDYgQEAgc3RhdGljIHZvaWQgbW9kZXNldF9wdXRfcG93ZXJfZG9tYWlucyhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCiAJCWludGVsX2Rpc3BsYXlfcG93ZXJfcHV0KGRldl9w cml2LCBkb21haW4pOwogfQogCi1zdGF0aWMgaW50IGludGVsX2NvbXB1dGVfbWF4X2RvdGNsayhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JaW50IG1heF9jZGNsa19mcmVx ID0gZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxOwotCi0JaWYgKElTX0dFTUlOSUxBS0UoZGV2X3By aXYpKQotCQlyZXR1cm4gMiAqIG1heF9jZGNsa19mcmVxOwotCWVsc2UgaWYgKElOVEVMX0lORk8o ZGV2X3ByaXYpLT5nZW4gPj0gOSB8fAotCQkgSVNfSEFTV0VMTChkZXZfcHJpdikgfHwgSVNfQlJP QURXRUxMKGRldl9wcml2KSkKLQkJcmV0dXJuIG1heF9jZGNsa19mcmVxOwotCWVsc2UgaWYgKElT X0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQlyZXR1cm4gbWF4X2NkY2xrX2ZyZXEqOTUvMTAwOwot CWVsc2UgaWYgKElOVEVMX0lORk8oZGV2X3ByaXYpLT5nZW4gPCA0KQotCQlyZXR1cm4gMiptYXhf Y2RjbGtfZnJlcSo5MC8xMDA7Ci0JZWxzZQotCQlyZXR1cm4gbWF4X2NkY2xrX2ZyZXEqOTAvMTAw OwotfQotCi1zdGF0aWMgaW50IHNrbF9jYWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrLCBpbnQgdmNv KTsKLQotc3RhdGljIHZvaWQgaW50ZWxfdXBkYXRlX21heF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JaWYgKElTX0dFTjlfQkMoZGV2X3ByaXYpKSB7Ci0JCXUz MiBsaW1pdCA9IEk5MTVfUkVBRChTS0xfREZTTSkgJiBTS0xfREZTTV9DRENMS19MSU1JVF9NQVNL OwotCQlpbnQgbWF4X2NkY2xrLCB2Y287Ci0KLQkJdmNvID0gZGV2X3ByaXYtPnNrbF9wcmVmZXJy ZWRfdmNvX2ZyZXE7Ci0JCVdBUk5fT04odmNvICE9IDgxMDAwMDAgJiYgdmNvICE9IDg2NDAwMDAp OwotCi0JCS8qCi0JCSAqIFVzZSB0aGUgbG93ZXIgKHZjbyA4NjQwKSBjZGNsayB2YWx1ZXMgYXMg YQotCQkgKiBmaXJzdCBndWVzcy4gc2tsX2NhbGNfY2RjbGsoKSB3aWxsIGNvcnJlY3QgaXQKLQkJ ICogaWYgdGhlIHByZWZlcnJlZCB2Y28gaXMgODEwMCBpbnN0ZWFkLgotCQkgKi8KLQkJaWYgKGxp bWl0ID09IFNLTF9ERlNNX0NEQ0xLX0xJTUlUXzY3NSkKLQkJCW1heF9jZGNsayA9IDYxNzE0MzsK LQkJZWxzZSBpZiAobGltaXQgPT0gU0tMX0RGU01fQ0RDTEtfTElNSVRfNTQwKQotCQkJbWF4X2Nk Y2xrID0gNTQwMDAwOwotCQllbHNlIGlmIChsaW1pdCA9PSBTS0xfREZTTV9DRENMS19MSU1JVF80 NTApCi0JCQltYXhfY2RjbGsgPSA0MzIwMDA7Ci0JCWVsc2UKLQkJCW1heF9jZGNsayA9IDMwODU3 MTsKLQotCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSBza2xfY2FsY19jZGNsayhtYXhfY2Rj bGssIHZjbyk7Ci0JfSBlbHNlIGlmIChJU19HRU1JTklMQUtFKGRldl9wcml2KSkgewotCQlkZXZf cHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSAzMTY4MDA7Ci0JfSBlbHNlIGlmIChJU19CUk9YVE9OKGRl dl9wcml2KSkgewotCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA2MjQwMDA7Ci0JfSBlbHNl IGlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYpKSAgewotCQkvKgotCQkgKiBGSVhNRSB3aXRoIGV4 dHJhIGNvb2xpbmcgd2UgY2FuIGFsbG93Ci0JCSAqIDU0MCBNSHogZm9yIFVMWCBhbmQgNjc1IE1o eiBmb3IgVUxULgotCQkgKiBIb3cgY2FuIHdlIGtub3cgaWYgZXh0cmEgY29vbGluZyBpcwotCQkg KiBhdmFpbGFibGU/IFBDSSBJRCwgVlRCLCBzb21ldGhpbmcgZWxzZT8KLQkJICovCi0JCWlmIChJ OTE1X1JFQUQoRlVTRV9TVFJBUCkgJiBIU1dfQ0RDTEtfTElNSVQpCi0JCQlkZXZfcHJpdi0+bWF4 X2NkY2xrX2ZyZXEgPSA0NTAwMDA7Ci0JCWVsc2UgaWYgKElTX0JEV19VTFgoZGV2X3ByaXYpKQot CQkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0gNDUwMDAwOwotCQllbHNlIGlmIChJU19CRFdf VUxUKGRldl9wcml2KSkKLQkJCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDU0MDAwMDsKLQkJ ZWxzZQotCQkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0gNjc1MDAwOwotCX0gZWxzZSBpZiAo SVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpIHsKLQkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0g MzIwMDAwOwotCX0gZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdikpIHsKLQkJZGV2X3By aXYtPm1heF9jZGNsa19mcmVxID0gNDAwMDAwOwotCX0gZWxzZSB7Ci0JCS8qIG90aGVyd2lzZSBh c3N1bWUgY2RjbGsgaXMgZml4ZWQgKi8KLQkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0gZGV2 X3ByaXYtPmNkY2xrX2ZyZXE7Ci0JfQotCi0JZGV2X3ByaXYtPm1heF9kb3RjbGtfZnJlcSA9IGlu dGVsX2NvbXB1dGVfbWF4X2RvdGNsayhkZXZfcHJpdik7Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCJN YXggQ0QgY2xvY2sgcmF0ZTogJWQga0h6XG4iLAotCQkJIGRldl9wcml2LT5tYXhfY2RjbGtfZnJl cSk7Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCJNYXggZG90Y2xvY2sgcmF0ZTogJWQga0h6XG4iLAot CQkJIGRldl9wcml2LT5tYXhfZG90Y2xrX2ZyZXEpOwotfQotCi1zdGF0aWMgdm9pZCBpbnRlbF91 cGRhdGVfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCWRldl9w cml2LT5jZGNsa19mcmVxID0gZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrKGRldl9wcml2KTsK LQotCWlmIChJTlRFTF9HRU4oZGV2X3ByaXYpID49IDkpCi0JCURSTV9ERUJVR19EUklWRVIoIkN1 cnJlbnQgQ0QgY2xvY2sgcmF0ZTogJWQga0h6LCBWQ086ICVkIGtIeiwgcmVmOiAlZCBrSHpcbiIs Ci0JCQkJIGRldl9wcml2LT5jZGNsa19mcmVxLCBkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbywKLQkJ CQkgZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYpOwotCWVsc2UKLQkJRFJNX0RFQlVHX0RSSVZFUigi Q3VycmVudCBDRCBjbG9jayByYXRlOiAlZCBrSHpcbiIsCi0JCQkJIGRldl9wcml2LT5jZGNsa19m cmVxKTsKLQotCS8qCi0JICogOTowIENNQlVTIFtzaWNdIENEQ0xLIGZyZXF1ZW5jeSAoY2RmcmVx KToKLQkgKiBQcm9ncmFtbW5nIFtzaWNdIG5vdGU6IGJpdFs5OjJdIHNob3VsZCBiZSBwcm9ncmFt bWVkIHRvIHRoZSBudW1iZXIKLQkgKiBvZiBjZGNsayB0aGF0IGdlbmVyYXRlcyA0TUh6IHJlZmVy ZW5jZSBjbG9jayBmcmVxIHdoaWNoIGlzIHVzZWQgdG8KLQkgKiBnZW5lcmF0ZSBHTUJ1cyBjbG9j ay4gVGhpcyB3aWxsIHZhcnkgd2l0aCB0aGUgY2RjbGsgZnJlcS4KLQkgKi8KLQlpZiAoSVNfVkFM TEVZVklFVyhkZXZfcHJpdikgfHwgSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCi0JCUk5MTVfV1JJ VEUoR01CVVNGUkVRX1ZMViwgRElWX1JPVU5EX1VQKGRldl9wcml2LT5jZGNsa19mcmVxLCAxMDAw KSk7Ci19Ci0KLS8qIGNvbnZlcnQgZnJvbSBrSHogdG8gLjEgZml4cG9pbnQgTUh6IHdpdGggLTFN SHogb2Zmc2V0ICovCi1zdGF0aWMgaW50IHNrbF9jZGNsa19kZWNpbWFsKGludCBjZGNsaykKLXsK LQlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QoY2RjbGsgLSAxMDAwLCA1MDApOwotfQotCi1zdGF0 aWMgaW50IGJ4dF9kZV9wbGxfdmNvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwg aW50IGNkY2xrKQotewotCWludCByYXRpbzsKLQotCWlmIChjZGNsayA9PSBkZXZfcHJpdi0+Y2Rj bGtfcGxsLnJlZikKLQkJcmV0dXJuIDA7Ci0KLQlzd2l0Y2ggKGNkY2xrKSB7Ci0JZGVmYXVsdDoK LQkJTUlTU0lOR19DQVNFKGNkY2xrKTsKLQljYXNlIDE0NDAwMDoKLQljYXNlIDI4ODAwMDoKLQlj YXNlIDM4NDAwMDoKLQljYXNlIDU3NjAwMDoKLQkJcmF0aW8gPSA2MDsKLQkJYnJlYWs7Ci0JY2Fz ZSA2MjQwMDA6Ci0JCXJhdGlvID0gNjU7Ci0JCWJyZWFrOwotCX0KLQotCXJldHVybiBkZXZfcHJp di0+Y2RjbGtfcGxsLnJlZiAqIHJhdGlvOwotfQotCi1zdGF0aWMgaW50IGdsa19kZV9wbGxfdmNv KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGNkY2xrKQotewotCWludCBy YXRpbzsKLQotCWlmIChjZGNsayA9PSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZikKLQkJcmV0dXJu IDA7Ci0KLQlzd2l0Y2ggKGNkY2xrKSB7Ci0JZGVmYXVsdDoKLQkJTUlTU0lOR19DQVNFKGNkY2xr KTsKLQljYXNlICA3OTIwMDoKLQljYXNlIDE1ODQwMDoKLQljYXNlIDMxNjgwMDoKLQkJcmF0aW8g PSAzMzsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGRldl9wcml2LT5jZGNsa19wbGwucmVmICog cmF0aW87Ci19Ci0KLXN0YXRpYyB2b2lkIGJ4dF9kZV9wbGxfZGlzYWJsZShzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JSTkxNV9XUklURShCWFRfREVfUExMX0VOQUJMRSwg MCk7Ci0KLQkvKiBUaW1lb3V0IDIwMHVzICovCi0JaWYgKGludGVsX3dhaXRfZm9yX3JlZ2lzdGVy KGRldl9wcml2LAotCQkJCSAgICBCWFRfREVfUExMX0VOQUJMRSwgQlhUX0RFX1BMTF9MT0NLLCAw LAotCQkJCSAgICAxKSkKLQkJRFJNX0VSUk9SKCJ0aW1lb3V0IHdhaXRpbmcgZm9yIERFIFBMTCB1 bmxvY2tcbiIpOwotCi0JZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSAwOwotfQotCi1zdGF0aWMg dm9pZCBieHRfZGVfcGxsX2VuYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYs IGludCB2Y28pCi17Ci0JaW50IHJhdGlvID0gRElWX1JPVU5EX0NMT1NFU1QodmNvLCBkZXZfcHJp di0+Y2RjbGtfcGxsLnJlZik7Ci0JdTMyIHZhbDsKLQotCXZhbCA9IEk5MTVfUkVBRChCWFRfREVf UExMX0NUTCk7Ci0JdmFsICY9IH5CWFRfREVfUExMX1JBVElPX01BU0s7Ci0JdmFsIHw9IEJYVF9E RV9QTExfUkFUSU8ocmF0aW8pOwotCUk5MTVfV1JJVEUoQlhUX0RFX1BMTF9DVEwsIHZhbCk7Ci0K LQlJOTE1X1dSSVRFKEJYVF9ERV9QTExfRU5BQkxFLCBCWFRfREVfUExMX1BMTF9FTkFCTEUpOwot Ci0JLyogVGltZW91dCAyMDB1cyAqLwotCWlmIChpbnRlbF93YWl0X2Zvcl9yZWdpc3RlcihkZXZf cHJpdiwKLQkJCQkgICAgQlhUX0RFX1BMTF9FTkFCTEUsCi0JCQkJICAgIEJYVF9ERV9QTExfTE9D SywKLQkJCQkgICAgQlhUX0RFX1BMTF9MT0NLLAotCQkJCSAgICAxKSkKLQkJRFJNX0VSUk9SKCJ0 aW1lb3V0IHdhaXRpbmcgZm9yIERFIFBMTCBsb2NrXG4iKTsKLQotCWRldl9wcml2LT5jZGNsa19w bGwudmNvID0gdmNvOwotfQotCi1zdGF0aWMgdm9pZCBieHRfc2V0X2NkY2xrKHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGNkY2xrKQotewotCXUzMiB2YWwsIGRpdmlkZXI7 Ci0JaW50IHZjbywgcmV0OwotCi0JaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQotCQl2Y28g PSBnbGtfZGVfcGxsX3ZjbyhkZXZfcHJpdiwgY2RjbGspOwotCWVsc2UKLQkJdmNvID0gYnh0X2Rl X3BsbF92Y28oZGV2X3ByaXYsIGNkY2xrKTsKLQotCURSTV9ERUJVR19EUklWRVIoIkNoYW5naW5n IENEQ0xLIHRvICVkIGtIeiAoVkNPICVkIGtIeilcbiIsIGNkY2xrLCB2Y28pOwotCi0JLyogY2Rj bGsgPSB2Y28gLyAyIC8gZGl2ezEsMS41LDIsNH0gKi8KLQlzd2l0Y2ggKERJVl9ST1VORF9DTE9T RVNUKHZjbywgY2RjbGspKSB7Ci0JY2FzZSA4OgotCQlkaXZpZGVyID0gQlhUX0NEQ0xLX0NEMlhf RElWX1NFTF80OwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWRpdmlkZXIgPSBCWFRfQ0RDTEtfQ0Qy WF9ESVZfU0VMXzI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJV0FSTihJU19HRU1JTklMQUtFKGRl dl9wcml2KSwgIlVuc3VwcG9ydGVkIGRpdmlkZXJcbiIpOwotCQlkaXZpZGVyID0gQlhUX0NEQ0xL X0NEMlhfRElWX1NFTF8xXzU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZGl2aWRlciA9IEJYVF9D RENMS19DRDJYX0RJVl9TRUxfMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJV0FSTl9PTihjZGNs ayAhPSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZik7Ci0JCVdBUk5fT04odmNvICE9IDApOwotCi0J CWRpdmlkZXIgPSBCWFRfQ0RDTEtfQ0QyWF9ESVZfU0VMXzE7Ci0JCWJyZWFrOwotCX0KLQotCS8q IEluZm9ybSBwb3dlciBjb250cm9sbGVyIG9mIHVwY29taW5nIGZyZXF1ZW5jeSBjaGFuZ2UgKi8K LQltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwotCXJldCA9IHNhbmR5YnJpZGdl X3Bjb2RlX3dyaXRlKGRldl9wcml2LCBIU1dfUENPREVfREVfV1JJVEVfRlJFUV9SRVEsCi0JCQkJ ICAgICAgMHg4MDAwMDAwMCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2sp OwotCi0JaWYgKHJldCkgewotCQlEUk1fRVJST1IoIlBDb2RlIENEQ0xLIGZyZXEgY2hhbmdlIG5v dGlmeSBmYWlsZWQgKGVyciAlZCwgZnJlcSAlZClcbiIsCi0JCQkgIHJldCwgY2RjbGspOwotCQly ZXR1cm47Ci0JfQotCi0JaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IDAgJiYKLQkgICAg ZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gIT0gdmNvKQotCQlieHRfZGVfcGxsX2Rpc2FibGUoZGV2 X3ByaXYpOwotCi0JaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykKLQkJYnh0X2Rl X3BsbF9lbmFibGUoZGV2X3ByaXYsIHZjbyk7Ci0KLQl2YWwgPSBkaXZpZGVyIHwgc2tsX2NkY2xr X2RlY2ltYWwoY2RjbGspOwotCS8qCi0JICogRklYTUUgaWYgb25seSB0aGUgY2QyeCBkaXZpZGVy IG5lZWRzIGNoYW5naW5nLCBpdCBjb3VsZCBiZSBkb25lCi0JICogd2l0aG91dCBzaHV0dGluZyBv ZmYgdGhlIHBpcGUgKGlmIG9ubHkgb25lIHBpcGUgaXMgYWN0aXZlKS4KLQkgKi8KLQl2YWwgfD0g QlhUX0NEQ0xLX0NEMlhfUElQRV9OT05FOwotCS8qCi0JICogRGlzYWJsZSBTU0EgUHJlY2hhcmdl IHdoZW4gQ0QgY2xvY2sgZnJlcXVlbmN5IDwgNTAwIE1IeiwKLQkgKiBlbmFibGUgb3RoZXJ3aXNl LgotCSAqLwotCWlmIChjZGNsayA+PSA1MDAwMDApCi0JCXZhbCB8PSBCWFRfQ0RDTEtfU1NBX1BS RUNIQVJHRV9FTkFCTEU7Ci0JSTkxNV9XUklURShDRENMS19DVEwsIHZhbCk7Ci0KLQltdXRleF9s b2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwotCXJldCA9IHNhbmR5YnJpZGdlX3Bjb2RlX3dy aXRlKGRldl9wcml2LCBIU1dfUENPREVfREVfV1JJVEVfRlJFUV9SRVEsCi0JCQkJICAgICAgRElW X1JPVU5EX1VQKGNkY2xrLCAyNTAwMCkpOwotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5o d19sb2NrKTsKLQotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJQQ29kZSBDRENMSyBmcmVxIHNl dCBmYWlsZWQsIChlcnIgJWQsIGZyZXEgJWQpXG4iLAotCQkJICByZXQsIGNkY2xrKTsKLQkJcmV0 dXJuOwotCX0KLQotCWludGVsX3VwZGF0ZV9jZGNsayhkZXZfcHJpdik7Ci19Ci0KLXN0YXRpYyB2 b2lkIGJ4dF9zYW5pdGl6ZV9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYp Ci17Ci0JdTMyIGNkY3RsLCBleHBlY3RlZDsKLQotCWludGVsX3VwZGF0ZV9jZGNsayhkZXZfcHJp dik7Ci0KLQlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPT0gMCB8fAotCSAgICBkZXZfcHJp di0+Y2RjbGtfZnJlcSA9PSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZikKLQkJZ290byBzYW5pdGl6 ZTsKLQotCS8qIERQTEwgb2theTsgdmVyaWZ5IHRoZSBjZGNsb2NrCi0JICoKLQkgKiBTb21lIEJJ T1MgdmVyc2lvbnMgbGVhdmUgYW4gaW5jb3JyZWN0IGRlY2ltYWwgZnJlcXVlbmN5IHZhbHVlIGFu ZAotCSAqIHNldCByZXNlcnZlZCBNQlogYml0cyBpbiBDRENMS19DVEwgYXQgbGVhc3QgZHVyaW5n IGV4aXRpbmcgZnJvbSBTNCwKLQkgKiBzbyBzYW5pdGl6ZSB0aGlzIHJlZ2lzdGVyLgotCSAqLwot CWNkY3RsID0gSTkxNV9SRUFEKENEQ0xLX0NUTCk7Ci0JLyoKLQkgKiBMZXQncyBpZ25vcmUgdGhl IHBpcGUgZmllbGQsIHNpbmNlIEJJT1MgY291bGQgaGF2ZSBjb25maWd1cmVkIHRoZQotCSAqIGRp dmlkZXJzIGJvdGggc3luY2hpbmcgdG8gYW4gYWN0aXZlIHBpcGUsIG9yIGFzeW5jaHJvbm91c2x5 Ci0JICogKFBJUEVfTk9ORSkuCi0JICovCi0JY2RjdGwgJj0gfkJYVF9DRENMS19DRDJYX1BJUEVf Tk9ORTsKLQotCWV4cGVjdGVkID0gKGNkY3RsICYgQlhUX0NEQ0xLX0NEMlhfRElWX1NFTF9NQVNL KSB8Ci0JCSAgIHNrbF9jZGNsa19kZWNpbWFsKGRldl9wcml2LT5jZGNsa19mcmVxKTsKLQkvKgot CSAqIERpc2FibGUgU1NBIFByZWNoYXJnZSB3aGVuIENEIGNsb2NrIGZyZXF1ZW5jeSA8IDUwMCBN SHosCi0JICogZW5hYmxlIG90aGVyd2lzZS4KLQkgKi8KLQlpZiAoZGV2X3ByaXYtPmNkY2xrX2Zy ZXEgPj0gNTAwMDAwKQotCQlleHBlY3RlZCB8PSBCWFRfQ0RDTEtfU1NBX1BSRUNIQVJHRV9FTkFC TEU7Ci0KLQlpZiAoY2RjdGwgPT0gZXhwZWN0ZWQpCi0JCS8qIEFsbCB3ZWxsOyBub3RoaW5nIHRv IHNhbml0aXplICovCi0JCXJldHVybjsKLQotc2FuaXRpemU6Ci0JRFJNX0RFQlVHX0tNUygiU2Fu aXRpemluZyBjZGNsayBwcm9ncmFtbWVkIGJ5IHByZS1vc1xuIik7Ci0KLQkvKiBmb3JjZSBjZGNs ayBwcm9ncmFtbWluZyAqLwotCWRldl9wcml2LT5jZGNsa19mcmVxID0gMDsKLQotCS8qIGZvcmNl IGZ1bGwgUExMIGRpc2FibGUgKyBlbmFibGUgKi8KLQlkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9 IC0xOwotfQotCi12b2lkIGJ4dF9pbml0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdikKLXsKLQlpbnQgY2RjbGs7Ci0KLQlieHRfc2FuaXRpemVfY2RjbGsoZGV2X3ByaXYp OwotCi0JaWYgKGRldl9wcml2LT5jZGNsa19mcmVxICE9IDAgJiYgZGV2X3ByaXYtPmNkY2xrX3Bs bC52Y28gIT0gMCkKLQkJcmV0dXJuOwotCi0JLyoKLQkgKiBGSVhNRToKLQkgKiAtIFRoZSBpbml0 aWFsIENEQ0xLIG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBWQlQuCi0JICogICBOZWVkIHRvIG1ha2Ug dGhpcyBjaGFuZ2UgYWZ0ZXIgVkJUIGhhcyBjaGFuZ2VzIGZvciBCWFQuCi0JICovCi0JaWYgKElT X0dFTUlOSUxBS0UoZGV2X3ByaXYpKQotCQljZGNsayA9IGdsa19jYWxjX2NkY2xrKDApOwotCWVs c2UKLQkJY2RjbGsgPSBieHRfY2FsY19jZGNsaygwKTsKLQotCWJ4dF9zZXRfY2RjbGsoZGV2X3By aXYsIGNkY2xrKTsKLX0KLQotdm9pZCBieHRfdW5pbml0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdikKLXsKLQlieHRfc2V0X2NkY2xrKGRldl9wcml2LCBkZXZfcHJpdi0+ Y2RjbGtfcGxsLnJlZik7Ci19Ci0KLXN0YXRpYyBpbnQgc2tsX2NhbGNfY2RjbGsoaW50IG1heF9w aXhjbGssIGludCB2Y28pCi17Ci0JaWYgKHZjbyA9PSA4NjQwMDAwKSB7Ci0JCWlmIChtYXhfcGl4 Y2xrID4gNTQwMDAwKQotCQkJcmV0dXJuIDYxNzE0MzsKLQkJZWxzZSBpZiAobWF4X3BpeGNsayA+ IDQzMjAwMCkKLQkJCXJldHVybiA1NDAwMDA7Ci0JCWVsc2UgaWYgKG1heF9waXhjbGsgPiAzMDg1 NzEpCi0JCQlyZXR1cm4gNDMyMDAwOwotCQllbHNlCi0JCQlyZXR1cm4gMzA4NTcxOwotCX0gZWxz ZSB7Ci0JCWlmIChtYXhfcGl4Y2xrID4gNTQwMDAwKQotCQkJcmV0dXJuIDY3NTAwMDsKLQkJZWxz ZSBpZiAobWF4X3BpeGNsayA+IDQ1MDAwMCkKLQkJCXJldHVybiA1NDAwMDA7Ci0JCWVsc2UgaWYg KG1heF9waXhjbGsgPiAzMzc1MDApCi0JCQlyZXR1cm4gNDUwMDAwOwotCQllbHNlCi0JCQlyZXR1 cm4gMzM3NTAwOwotCX0KLX0KLQotc3RhdGljIHZvaWQKLXNrbF9kcGxsMF91cGRhdGUoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXUzMiB2YWw7Ci0KLQlkZXZfcHJpdi0+ Y2RjbGtfcGxsLnJlZiA9IDI0MDAwOwotCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gMDsKLQot CXZhbCA9IEk5MTVfUkVBRChMQ1BMTDFfQ1RMKTsKLQlpZiAoKHZhbCAmIExDUExMX1BMTF9FTkFC TEUpID09IDApCi0JCXJldHVybjsKLQotCWlmIChXQVJOX09OKCh2YWwgJiBMQ1BMTF9QTExfTE9D SykgPT0gMCkpCi0JCXJldHVybjsKLQotCXZhbCA9IEk5MTVfUkVBRChEUExMX0NUUkwxKTsKLQot CWlmIChXQVJOX09OKCh2YWwgJiAoRFBMTF9DVFJMMV9IRE1JX01PREUoU0tMX0RQTEwwKSB8Ci0J CQkgICAgRFBMTF9DVFJMMV9TU0MoU0tMX0RQTEwwKSB8Ci0JCQkgICAgRFBMTF9DVFJMMV9PVkVS UklERShTS0xfRFBMTDApKSkgIT0KLQkJICAgIERQTExfQ1RSTDFfT1ZFUlJJREUoU0tMX0RQTEww KSkpCi0JCXJldHVybjsKLQotCXN3aXRjaCAodmFsICYgRFBMTF9DVFJMMV9MSU5LX1JBVEVfTUFT SyhTS0xfRFBMTDApKSB7Ci0JY2FzZSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJ TktfUkFURV84MTAsIFNLTF9EUExMMCk6Ci0JY2FzZSBEUExMX0NUUkwxX0xJTktfUkFURShEUExM X0NUUkwxX0xJTktfUkFURV8xMzUwLCBTS0xfRFBMTDApOgotCWNhc2UgRFBMTF9DVFJMMV9MSU5L X1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfMTYyMCwgU0tMX0RQTEwwKToKLQljYXNlIERQTExf Q1RSTDFfTElOS19SQVRFKERQTExfQ1RSTDFfTElOS19SQVRFXzI3MDAsIFNLTF9EUExMMCk6Ci0J CWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gODEwMDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSBEUExM X0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktfUkFURV8xMDgwLCBTS0xfRFBMTDApOgot CWNhc2UgRFBMTF9DVFJMMV9MSU5LX1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfMjE2MCwgU0tM X0RQTEwwKToKLQkJZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSA4NjQwMDAwOwotCQlicmVhazsK LQlkZWZhdWx0OgotCQlNSVNTSU5HX0NBU0UodmFsICYgRFBMTF9DVFJMMV9MSU5LX1JBVEVfTUFT SyhTS0xfRFBMTDApKTsKLQkJYnJlYWs7Ci0JfQotfQotCi12b2lkIHNrbF9zZXRfcHJlZmVycmVk X2NkY2xrX3ZjbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCB2Y28pCi17 Ci0JYm9vbCBjaGFuZ2VkID0gZGV2X3ByaXYtPnNrbF9wcmVmZXJyZWRfdmNvX2ZyZXEgIT0gdmNv OwotCi0JZGV2X3ByaXYtPnNrbF9wcmVmZXJyZWRfdmNvX2ZyZXEgPSB2Y287Ci0KLQlpZiAoY2hh bmdlZCkKLQkJaW50ZWxfdXBkYXRlX21heF9jZGNsayhkZXZfcHJpdik7Ci19Ci0KLXN0YXRpYyB2 b2lkCi1za2xfZHBsbDBfZW5hYmxlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwg aW50IHZjbykKLXsKLQlpbnQgbWluX2NkY2xrID0gc2tsX2NhbGNfY2RjbGsoMCwgdmNvKTsKLQl1 MzIgdmFsOwotCi0JV0FSTl9PTih2Y28gIT0gODEwMDAwMCAmJiB2Y28gIT0gODY0MDAwMCk7Ci0K LQkvKiBzZWxlY3QgdGhlIG1pbmltdW0gQ0RDTEsgYmVmb3JlIGVuYWJsaW5nIERQTEwgMCAqLwot CXZhbCA9IENEQ0xLX0ZSRVFfMzM3XzMwOCB8IHNrbF9jZGNsa19kZWNpbWFsKG1pbl9jZGNsayk7 Ci0JSTkxNV9XUklURShDRENMS19DVEwsIHZhbCk7Ci0JUE9TVElOR19SRUFEKENEQ0xLX0NUTCk7 Ci0KLQkvKgotCSAqIFdlIGFsd2F5cyBlbmFibGUgRFBMTDAgd2l0aCB0aGUgbG93ZXN0IGxpbmsg cmF0ZSBwb3NzaWJsZSwgYnV0IHN0aWxsCi0JICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgVkNP IHJlcXVpcmVkIHRvIG9wZXJhdGUgdGhlIGVEUCBwYW5lbCBhdCB0aGUKLQkgKiBkZXNpcmVkIGZy ZXF1ZW5jeS4gVGhlIHVzdWFsIERQIGxpbmsgcmF0ZXMgb3BlcmF0ZSB3aXRoIGEgVkNPIG9mCi0J ICogODEwMCB3aGlsZSB0aGUgZURQIDEuNCBhbHRlcm5hdGUgbGluayByYXRlcyBuZWVkIGEgVkNP IG9mIDg2NDAuCi0JICogVGhlIG1vZGVzZXQgY29kZSBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHNl bGVjdGlvbiBvZiB0aGUgZXhhY3QgbGluawotCSAqIHJhdGUgbGF0ZXIgb24sIHdpdGggdGhlIGNv bnN0cmFpbnQgb2YgY2hvb3NpbmcgYSBmcmVxdWVuY3kgdGhhdAotCSAqIHdvcmtzIHdpdGggdmNv LgotCSAqLwotCXZhbCA9IEk5MTVfUkVBRChEUExMX0NUUkwxKTsKLQotCXZhbCAmPSB+KERQTExf Q1RSTDFfSERNSV9NT0RFKFNLTF9EUExMMCkgfCBEUExMX0NUUkwxX1NTQyhTS0xfRFBMTDApIHwK LQkJIERQTExfQ1RSTDFfTElOS19SQVRFX01BU0soU0tMX0RQTEwwKSk7Ci0JdmFsIHw9IERQTExf Q1RSTDFfT1ZFUlJJREUoU0tMX0RQTEwwKTsKLQlpZiAodmNvID09IDg2NDAwMDApCi0JCXZhbCB8 PSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktfUkFURV8xMDgwLAotCQkJCQkg ICAgU0tMX0RQTEwwKTsKLQllbHNlCi0JCXZhbCB8PSBEUExMX0NUUkwxX0xJTktfUkFURShEUExM X0NUUkwxX0xJTktfUkFURV84MTAsCi0JCQkJCSAgICBTS0xfRFBMTDApOwotCi0JSTkxNV9XUklU RShEUExMX0NUUkwxLCB2YWwpOwotCVBPU1RJTkdfUkVBRChEUExMX0NUUkwxKTsKLQotCUk5MTVf V1JJVEUoTENQTEwxX0NUTCwgSTkxNV9SRUFEKExDUExMMV9DVEwpIHwgTENQTExfUExMX0VOQUJM RSk7Ci0KLQlpZiAoaW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoZGV2X3ByaXYsCi0JCQkJICAgIExD UExMMV9DVEwsIExDUExMX1BMTF9MT0NLLCBMQ1BMTF9QTExfTE9DSywKLQkJCQkgICAgNSkpCi0J CURSTV9FUlJPUigiRFBMTDAgbm90IGxvY2tlZFxuIik7Ci0KLQlkZXZfcHJpdi0+Y2RjbGtfcGxs LnZjbyA9IHZjbzsKLQotCS8qIFdlJ2xsIHdhbnQgdG8ga2VlcCB1c2luZyB0aGUgY3VycmVudCB2 Y28gZnJvbSBub3cgb24uICovCi0Jc2tsX3NldF9wcmVmZXJyZWRfY2RjbGtfdmNvKGRldl9wcml2 LCB2Y28pOwotfQotCi1zdGF0aWMgdm9pZAotc2tsX2RwbGwwX2Rpc2FibGUoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCUk5MTVfV1JJVEUoTENQTEwxX0NUTCwgSTkxNV9S RUFEKExDUExMMV9DVEwpICYgfkxDUExMX1BMTF9FTkFCTEUpOwotCWlmIChpbnRlbF93YWl0X2Zv cl9yZWdpc3RlcihkZXZfcHJpdiwKLQkJCQkgICBMQ1BMTDFfQ1RMLCBMQ1BMTF9QTExfTE9DSywg MCwKLQkJCQkgICAxKSkKLQkJRFJNX0VSUk9SKCJDb3VsZG4ndCBkaXNhYmxlIERQTEwwXG4iKTsK LQotCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gMDsKLX0KLQotc3RhdGljIHZvaWQgc2tsX3Nl dF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBjZGNsaywgaW50 IHZjbykKLXsKLQl1MzIgZnJlcV9zZWxlY3QsIHBjdV9hY2s7Ci0JaW50IHJldDsKLQotCVdBUk5f T04oKGNkY2xrID09IDI0MDAwKSAhPSAodmNvID09IDApKTsKLQotCURSTV9ERUJVR19EUklWRVIo IkNoYW5naW5nIENEQ0xLIHRvICVkIGtIeiAoVkNPICVkIGtIeilcbiIsIGNkY2xrLCB2Y28pOwot Ci0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQlyZXQgPSBza2xfcGNvZGVf cmVxdWVzdChkZXZfcHJpdiwgU0tMX1BDT0RFX0NEQ0xLX0NPTlRST0wsCi0JCQkJU0tMX0NEQ0xL X1BSRVBBUkVfRk9SX0NIQU5HRSwKLQkJCQlTS0xfQ0RDTEtfUkVBRFlfRk9SX0NIQU5HRSwKLQkJ CQlTS0xfQ0RDTEtfUkVBRFlfRk9SX0NIQU5HRSwgMyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJp di0+cnBzLmh3X2xvY2spOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW5m b3JtIFBDVSBhYm91dCBjZGNsayBjaGFuZ2UgKCVkKVxuIiwKLQkJCSAgcmV0KTsKLQkJcmV0dXJu OwotCX0KLQotCS8qIHNldCBDRENMS19DVEwgKi8KLQlzd2l0Y2ggKGNkY2xrKSB7Ci0JY2FzZSA0 NTAwMDA6Ci0JY2FzZSA0MzIwMDA6Ci0JCWZyZXFfc2VsZWN0ID0gQ0RDTEtfRlJFUV80NTBfNDMy OwotCQlwY3VfYWNrID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSA1NDAwMDA6Ci0JCWZyZXFfc2VsZWN0 ID0gQ0RDTEtfRlJFUV81NDA7Ci0JCXBjdV9hY2sgPSAyOwotCQlicmVhazsKLQljYXNlIDMwODU3 MToKLQljYXNlIDMzNzUwMDoKLQlkZWZhdWx0OgotCQlmcmVxX3NlbGVjdCA9IENEQ0xLX0ZSRVFf MzM3XzMwODsKLQkJcGN1X2FjayA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgNjE3MTQzOgotCWNhc2Ug Njc1MDAwOgotCQlmcmVxX3NlbGVjdCA9IENEQ0xLX0ZSRVFfNjc1XzYxNzsKLQkJcGN1X2FjayA9 IDM7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSAwICYm Ci0JICAgIGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykKLQkJc2tsX2RwbGwwX2Rpc2Fi bGUoZGV2X3ByaXYpOwotCi0JaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykKLQkJ c2tsX2RwbGwwX2VuYWJsZShkZXZfcHJpdiwgdmNvKTsKLQotCUk5MTVfV1JJVEUoQ0RDTEtfQ1RM LCBmcmVxX3NlbGVjdCB8IHNrbF9jZGNsa19kZWNpbWFsKGNkY2xrKSk7Ci0JUE9TVElOR19SRUFE KENEQ0xLX0NUTCk7Ci0KLQkvKiBpbmZvcm0gUENVIG9mIHRoZSBjaGFuZ2UgKi8KLQltdXRleF9s b2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwotCXNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKGRl dl9wcml2LCBTS0xfUENPREVfQ0RDTEtfQ09OVFJPTCwgcGN1X2Fjayk7Ci0JbXV0ZXhfdW5sb2Nr KCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwotCi0JaW50ZWxfdXBkYXRlX2NkY2xrKGRldl9wcml2 KTsKLX0KLQotc3RhdGljIHZvaWQgc2tsX3Nhbml0aXplX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdik7Ci0KLXZvaWQgc2tsX3VuaW5pdF9jZGNsayhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc2tsX3NldF9jZGNsayhkZXZfcHJpdiwgZGV2X3By aXYtPmNkY2xrX3BsbC5yZWYsIDApOwotfQotCi12b2lkIHNrbF9pbml0X2NkY2xrKHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQlpbnQgY2RjbGssIHZjbzsKLQotCXNrbF9z YW5pdGl6ZV9jZGNsayhkZXZfcHJpdik7Ci0KLQlpZiAoZGV2X3ByaXYtPmNkY2xrX2ZyZXEgIT0g MCAmJiBkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSAwKSB7Ci0JCS8qCi0JCSAqIFVzZSB0aGUg Y3VycmVudCB2Y28gYXMgb3VyIGluaXRpYWwKLQkJICogZ3Vlc3MgYXMgdG8gd2hhdCB0aGUgcHJl ZmVycmVkIHZjbyBpcy4KLQkJICovCi0JCWlmIChkZXZfcHJpdi0+c2tsX3ByZWZlcnJlZF92Y29f ZnJlcSA9PSAwKQotCQkJc2tsX3NldF9wcmVmZXJyZWRfY2RjbGtfdmNvKGRldl9wcml2LAotCQkJ CQkJICAgIGRldl9wcml2LT5jZGNsa19wbGwudmNvKTsKLQkJcmV0dXJuOwotCX0KLQotCXZjbyA9 IGRldl9wcml2LT5za2xfcHJlZmVycmVkX3Zjb19mcmVxOwotCWlmICh2Y28gPT0gMCkKLQkJdmNv ID0gODEwMDAwMDsKLQljZGNsayA9IHNrbF9jYWxjX2NkY2xrKDAsIHZjbyk7Ci0KLQlza2xfc2V0 X2NkY2xrKGRldl9wcml2LCBjZGNsaywgdmNvKTsKLX0KLQotc3RhdGljIHZvaWQgc2tsX3Nhbml0 aXplX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQl1aW50MzJf dCBjZGN0bCwgZXhwZWN0ZWQ7Ci0KLQkvKgotCSAqIGNoZWNrIGlmIHRoZSBwcmUtb3MgaW50aWFs aXplZCB0aGUgZGlzcGxheQotCSAqIFRoZXJlIGlzIFNXRjE4IHNjcmF0Y2hwYWQgcmVnaXN0ZXIg ZGVmaW5lZCB3aGljaCBpcyBzZXQgYnkgdGhlCi0JICogcHJlLW9zIHdoaWNoIGNhbiBiZSB1c2Vk IGJ5IHRoZSBPUyBkcml2ZXJzIHRvIGNoZWNrIHRoZSBzdGF0dXMKLQkgKi8KLQlpZiAoKEk5MTVf UkVBRChTV0ZfSUxLKDB4MTgpKSAmIDB4MDBGRkZGRkYpID09IDApCi0JCWdvdG8gc2FuaXRpemU7 Ci0KLQlpbnRlbF91cGRhdGVfY2RjbGsoZGV2X3ByaXYpOwotCS8qIElzIFBMTCBlbmFibGVkIGFu ZCBsb2NrZWQgPyAqLwotCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9PSAwIHx8Ci0JICAg IGRldl9wcml2LT5jZGNsa19mcmVxID09IGRldl9wcml2LT5jZGNsa19wbGwucmVmKQotCQlnb3Rv IHNhbml0aXplOwotCi0JLyogRFBMTCBva2F5OyB2ZXJpZnkgdGhlIGNkY2xvY2sKLQkgKgotCSAq IE5vdGljZWQgaW4gc29tZSBpbnN0YW5jZXMgdGhhdCB0aGUgZnJlcSBzZWxlY3Rpb24gaXMgY29y cmVjdCBidXQKLQkgKiBkZWNpbWFsIHBhcnQgaXMgcHJvZ3JhbW1lZCB3cm9uZyBmcm9tIEJJT1Mg d2hlcmUgcHJlLW9zIGRvZXMgbm90Ci0JICogZW5hYmxlIGRpc3BsYXkuIFZlcmlmeSB0aGUgc2Ft ZSBhcyB3ZWxsLgotCSAqLwotCWNkY3RsID0gSTkxNV9SRUFEKENEQ0xLX0NUTCk7Ci0JZXhwZWN0 ZWQgPSAoY2RjdGwgJiBDRENMS19GUkVRX1NFTF9NQVNLKSB8Ci0JCXNrbF9jZGNsa19kZWNpbWFs KGRldl9wcml2LT5jZGNsa19mcmVxKTsKLQlpZiAoY2RjdGwgPT0gZXhwZWN0ZWQpCi0JCS8qIEFs bCB3ZWxsOyBub3RoaW5nIHRvIHNhbml0aXplICovCi0JCXJldHVybjsKLQotc2FuaXRpemU6Ci0J RFJNX0RFQlVHX0tNUygiU2FuaXRpemluZyBjZGNsayBwcm9ncmFtbWVkIGJ5IHByZS1vc1xuIik7 Ci0KLQkvKiBmb3JjZSBjZGNsayBwcm9ncmFtbWluZyAqLwotCWRldl9wcml2LT5jZGNsa19mcmVx ID0gMDsKLQkvKiBmb3JjZSBmdWxsIFBMTCBkaXNhYmxlICsgZW5hYmxlICovCi0JZGV2X3ByaXYt PmNkY2xrX3BsbC52Y28gPSAtMTsKLX0KLQotLyogQWRqdXN0IENEY2xrIGRpdmlkZXJzIHRvIGFs bG93IGhpZ2ggcmVzIG9yIHNhdmUgcG93ZXIgaWYgcG9zc2libGUgKi8KLXN0YXRpYyB2b2lkIHZh bGxleXZpZXdfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjZGNsaykKLXsK LQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7Ci0JdTMy IHZhbCwgY21kOwotCi0JV0FSTl9PTihkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsoZGV2X3By aXYpICE9IGRldl9wcml2LT5jZGNsa19mcmVxKTsKLQotCWlmIChjZGNsayA+PSAzMjAwMDApIC8q IGp1bXAgdG8gaGlnaGVzdCB2b2x0YWdlIGZvciA0MDBNSHogdG9vICovCi0JCWNtZCA9IDI7Ci0J ZWxzZSBpZiAoY2RjbGsgPT0gMjY2NjY3KQotCQljbWQgPSAxOwotCWVsc2UKLQkJY21kID0gMDsK LQotCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JdmFsID0gdmx2X3B1bml0 X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BGUkVRKTsKLQl2YWwgJj0gfkRTUEZSRVFHVUFS X01BU0s7Ci0JdmFsIHw9IChjbWQgPDwgRFNQRlJFUUdVQVJfU0hJRlQpOwotCXZsdl9wdW5pdF93 cml0ZShkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEsIHZhbCk7Ci0JaWYgKHdhaXRfZm9yKCh2 bHZfcHVuaXRfcmVhZChkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEpICYKLQkJICAgICAgRFNQ RlJFUVNUQVRfTUFTSykgPT0gKGNtZCA8PCBEU1BGUkVRU1RBVF9TSElGVCksCi0JCSAgICAgNTAp KSB7Ci0JCURSTV9FUlJPUigidGltZWQgb3V0IHdhaXRpbmcgZm9yIENEY2xrIGNoYW5nZVxuIik7 Ci0JfQotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQotCW11dGV4X2xv Y2soJmRldl9wcml2LT5zYl9sb2NrKTsKLQotCWlmIChjZGNsayA9PSA0MDAwMDApIHsKLQkJdTMy IGRpdmlkZXI7Ci0KLQkJZGl2aWRlciA9IERJVl9ST1VORF9DTE9TRVNUKGRldl9wcml2LT5ocGxs X2ZyZXEgPDwgMSwgY2RjbGspIC0gMTsKLQotCQkvKiBhZGp1c3QgY2RjbGsgZGl2aWRlciAqLwot CQl2YWwgPSB2bHZfY2NrX3JlYWQoZGV2X3ByaXYsIENDS19ESVNQTEFZX0NMT0NLX0NPTlRST0wp OwotCQl2YWwgJj0gfkNDS19GUkVRVUVOQ1lfVkFMVUVTOwotCQl2YWwgfD0gZGl2aWRlcjsKLQkJ dmx2X2Nja193cml0ZShkZXZfcHJpdiwgQ0NLX0RJU1BMQVlfQ0xPQ0tfQ09OVFJPTCwgdmFsKTsK LQotCQlpZiAod2FpdF9mb3IoKHZsdl9jY2tfcmVhZChkZXZfcHJpdiwgQ0NLX0RJU1BMQVlfQ0xP Q0tfQ09OVFJPTCkgJgotCQkJICAgICAgQ0NLX0ZSRVFVRU5DWV9TVEFUVVMpID09IChkaXZpZGVy IDw8IENDS19GUkVRVUVOQ1lfU1RBVFVTX1NISUZUKSwKLQkJCSAgICAgNTApKQotCQkJRFJNX0VS Uk9SKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgQ0RjbGsgY2hhbmdlXG4iKTsKLQl9Ci0KLQkvKiBh ZGp1c3Qgc2VsZi1yZWZyZXNoIGV4aXQgbGF0ZW5jeSB2YWx1ZSAqLwotCXZhbCA9IHZsdl9idW5p dF9yZWFkKGRldl9wcml2LCBCVU5JVF9SRUdfQklTT0MpOwotCXZhbCAmPSB+MHg3ZjsKLQotCS8q Ci0JICogRm9yIGhpZ2ggYmFuZHdpZHRoIGNvbmZpZ3MsIHdlIHNldCBhIGhpZ2hlciBsYXRlbmN5 IGluIHRoZSBidW5pdAotCSAqIHNvIHRoYXQgdGhlIGNvcmUgZGlzcGxheSBmZXRjaCBoYXBwZW5z IGluIHRpbWUgdG8gYXZvaWQgdW5kZXJydW5zLgotCSAqLwotCWlmIChjZGNsayA9PSA0MDAwMDAp Ci0JCXZhbCB8PSA0NTAwIC8gMjUwOyAvKiA0LjUgdXNlYyAqLwotCWVsc2UKLQkJdmFsIHw9IDMw MDAgLyAyNTA7IC8qIDMuMCB1c2VjICovCi0Jdmx2X2J1bml0X3dyaXRlKGRldl9wcml2LCBCVU5J VF9SRUdfQklTT0MsIHZhbCk7Ci0KLQltdXRleF91bmxvY2soJmRldl9wcml2LT5zYl9sb2NrKTsK LQotCWludGVsX3VwZGF0ZV9jZGNsayhkZXZfcHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZXJy eXZpZXdfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjZGNsaykKLXsKLQlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7Ci0JdTMyIHZh bCwgY21kOwotCi0JV0FSTl9PTihkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsoZGV2X3ByaXYp ICE9IGRldl9wcml2LT5jZGNsa19mcmVxKTsKLQotCXN3aXRjaCAoY2RjbGspIHsKLQljYXNlIDMz MzMzMzoKLQljYXNlIDMyMDAwMDoKLQljYXNlIDI2NjY2NzoKLQljYXNlIDIwMDAwMDoKLQkJYnJl YWs7Ci0JZGVmYXVsdDoKLQkJTUlTU0lOR19DQVNFKGNkY2xrKTsKLQkJcmV0dXJuOwotCX0KLQot CS8qCi0JICogU3BlY3MgYXJlIGZ1bGwgb2YgbWlzaW5mb3JtYXRpb24sIGJ1dCB0ZXN0aW5nIG9u IGFjdHVhbAotCSAqIGhhcmR3YXJlIGhhcyBzaG93biB0aGF0IHdlIGp1c3QgbmVlZCB0byB3cml0 ZSB0aGUgZGVzaXJlZAotCSAqIENDSyBkaXZpZGVyIGludG8gdGhlIFB1bml0IHJlZ2lzdGVyLgot CSAqLwotCWNtZCA9IERJVl9ST1VORF9DTE9TRVNUKGRldl9wcml2LT5ocGxsX2ZyZXEgPDwgMSwg Y2RjbGspIC0gMTsKLQotCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JdmFs ID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BGUkVRKTsKLQl2YWwgJj0g fkRTUEZSRVFHVUFSX01BU0tfQ0hWOwotCXZhbCB8PSAoY21kIDw8IERTUEZSRVFHVUFSX1NISUZU X0NIVik7Ci0Jdmx2X3B1bml0X3dyaXRlKGRldl9wcml2LCBQVU5JVF9SRUdfRFNQRlJFUSwgdmFs KTsKLQlpZiAod2FpdF9mb3IoKHZsdl9wdW5pdF9yZWFkKGRldl9wcml2LCBQVU5JVF9SRUdfRFNQ RlJFUSkgJgotCQkgICAgICBEU1BGUkVRU1RBVF9NQVNLX0NIVikgPT0gKGNtZCA8PCBEU1BGUkVR U1RBVF9TSElGVF9DSFYpLAotCQkgICAgIDUwKSkgewotCQlEUk1fRVJST1IoInRpbWVkIG91dCB3 YWl0aW5nIGZvciBDRGNsayBjaGFuZ2VcbiIpOwotCX0KLQltdXRleF91bmxvY2soJmRldl9wcml2 LT5ycHMuaHdfbG9jayk7Ci0KLQlpbnRlbF91cGRhdGVfY2RjbGsoZGV2X3ByaXYpOwotfQotCi1z dGF0aWMgaW50IHZhbGxleXZpZXdfY2FsY19jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYsCi0JCQkJIGludCBtYXhfcGl4Y2xrKQotewotCWludCBmcmVxXzMyMCA9IChkZXZf cHJpdi0+aHBsbF9mcmVxIDw8ICAxKSAlIDMyMDAwMCAhPSAwID8gMzMzMzMzIDogMzIwMDAwOwot CWludCBsaW1pdCA9IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpID8gOTUgOiA5MDsKLQotCS8qCi0J ICogUmVhbGx5IG9ubHkgYSBmZXcgY2FzZXMgdG8gZGVhbCB3aXRoLCBhcyBvbmx5IDQgQ0RjbGtz IGFyZSBzdXBwb3J0ZWQ6Ci0JICogICAyMDBNSHoKLQkgKiAgIDI2N01IegotCSAqICAgMzIwLzMz M01IeiAoZGVwZW5kcyBvbiBIUExMIGZyZXEpCi0JICogICA0MDBNSHogKFZMViBvbmx5KQotCSAq IFNvIHdlIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHdlJ3JlIGFib3ZlIDkwJSAoVkxWKSBvciA5NSUg KENIVikKLQkgKiBvZiB0aGUgbG93ZXIgYmluIGFuZCBhZGp1c3QgaWYgbmVlZGVkLgotCSAqCi0J ICogV2Ugc2VlbSB0byBnZXQgYW4gdW5zdGFibGUgb3Igc29saWQgY29sb3IgcGljdHVyZSBhdCAy MDBNSHouCi0JICogTm90IHN1cmUgd2hhdCdzIHdyb25nLiBGb3Igbm93IHVzZSAyMDBNSHogb25s eSB3aGVuIGFsbCBwaXBlcwotCSAqIGFyZSBvZmYuCi0JICovCi0JaWYgKCFJU19DSEVSUllWSUVX KGRldl9wcml2KSAmJgotCSAgICBtYXhfcGl4Y2xrID4gZnJlcV8zMjAqbGltaXQvMTAwKQotCQly ZXR1cm4gNDAwMDAwOwotCWVsc2UgaWYgKG1heF9waXhjbGsgPiAyNjY2NjcqbGltaXQvMTAwKQot CQlyZXR1cm4gZnJlcV8zMjA7Ci0JZWxzZSBpZiAobWF4X3BpeGNsayA+IDApCi0JCXJldHVybiAy NjY2Njc7Ci0JZWxzZQotCQlyZXR1cm4gMjAwMDAwOwotfQotCi1zdGF0aWMgaW50IGdsa19jYWxj X2NkY2xrKGludCBtYXhfcGl4Y2xrKQotewotCWlmIChtYXhfcGl4Y2xrID4gMiAqIDE1ODQwMCkK LQkJcmV0dXJuIDMxNjgwMDsKLQllbHNlIGlmIChtYXhfcGl4Y2xrID4gMiAqIDc5MjAwKQotCQly ZXR1cm4gMTU4NDAwOwotCWVsc2UKLQkJcmV0dXJuIDc5MjAwOwotfQotCi1zdGF0aWMgaW50IGJ4 dF9jYWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrKQotewotCWlmIChtYXhfcGl4Y2xrID4gNTc2MDAw KQotCQlyZXR1cm4gNjI0MDAwOwotCWVsc2UgaWYgKG1heF9waXhjbGsgPiAzODQwMDApCi0JCXJl dHVybiA1NzYwMDA7Ci0JZWxzZSBpZiAobWF4X3BpeGNsayA+IDI4ODAwMCkKLQkJcmV0dXJuIDM4 NDAwMDsKLQllbHNlIGlmIChtYXhfcGl4Y2xrID4gMTQ0MDAwKQotCQlyZXR1cm4gMjg4MDAwOwot CWVsc2UKLQkJcmV0dXJuIDE0NDAwMDsKLX0KLQotc3RhdGljIGludCB2YWxsZXl2aWV3X21vZGVz ZXRfY2FsY19jZGNsayhzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0 IGRybV9kZXZpY2UgKmRldiA9IHN0YXRlLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCWludCBtYXhfcGl4Y2xrID0gaW50ZWxfbWF4X3Bp eGVsX3JhdGUoc3RhdGUpOwotCXN0cnVjdCBpbnRlbF9hdG9taWNfc3RhdGUgKmludGVsX3N0YXRl ID0KLQkJdG9faW50ZWxfYXRvbWljX3N0YXRlKHN0YXRlKTsKLQotCWludGVsX3N0YXRlLT5jZGNs ayA9IGludGVsX3N0YXRlLT5kZXZfY2RjbGsgPQotCQl2YWxsZXl2aWV3X2NhbGNfY2RjbGsoZGV2 X3ByaXYsIG1heF9waXhjbGspOwotCi0JaWYgKCFpbnRlbF9zdGF0ZS0+YWN0aXZlX2NydGNzKQot CQlpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gdmFsbGV5dmlld19jYWxjX2NkY2xrKGRldl9wcml2 LCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJ4dF9tb2Rlc2V0X2NhbGNfY2Rj bGsoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoc3RhdGUtPmRldik7Ci0JaW50IG1heF9waXhjbGsg PSBpbnRlbF9tYXhfcGl4ZWxfcmF0ZShzdGF0ZSk7Ci0Jc3RydWN0IGludGVsX2F0b21pY19zdGF0 ZSAqaW50ZWxfc3RhdGUgPQotCQl0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOwotCWludCBj ZGNsazsKLQotCWlmIChJU19HRU1JTklMQUtFKGRldl9wcml2KSkKLQkJY2RjbGsgPSBnbGtfY2Fs Y19jZGNsayhtYXhfcGl4Y2xrKTsKLQllbHNlCi0JCWNkY2xrID0gYnh0X2NhbGNfY2RjbGsobWF4 X3BpeGNsayk7Ci0KLQlpbnRlbF9zdGF0ZS0+Y2RjbGsgPSBpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xr ID0gY2RjbGs7Ci0KLQlpZiAoIWludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MpIHsKLQkJaWYgKElT X0dFTUlOSUxBS0UoZGV2X3ByaXYpKQotCQkJY2RjbGsgPSBnbGtfY2FsY19jZGNsaygwKTsKLQkJ ZWxzZQotCQkJY2RjbGsgPSBieHRfY2FsY19jZGNsaygwKTsKLQotCQlpbnRlbF9zdGF0ZS0+ZGV2 X2NkY2xrID0gY2RjbGs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZsdl9w cm9ncmFtX3BmaV9jcmVkaXRzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsK LQl1bnNpZ25lZCBpbnQgY3JlZGl0cywgZGVmYXVsdF9jcmVkaXRzOwotCi0JaWYgKElTX0NIRVJS WVZJRVcoZGV2X3ByaXYpKQotCQlkZWZhdWx0X2NyZWRpdHMgPSBQRklfQ1JFRElUKDEyKTsKLQll bHNlCi0JCWRlZmF1bHRfY3JlZGl0cyA9IFBGSV9DUkVESVQoOCk7Ci0KLQlpZiAoZGV2X3ByaXYt PmNkY2xrX2ZyZXEgPj0gZGV2X3ByaXYtPmN6Y2xrX2ZyZXEpIHsKLQkJLyogQ0hWIHN1Z2dlc3Rl ZCB2YWx1ZSBpcyAzMSBvciA2MyAqLwotCQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCi0J CQljcmVkaXRzID0gUEZJX0NSRURJVF82MzsKLQkJZWxzZQotCQkJY3JlZGl0cyA9IFBGSV9DUkVE SVQoMTUpOwotCX0gZWxzZSB7Ci0JCWNyZWRpdHMgPSBkZWZhdWx0X2NyZWRpdHM7Ci0JfQotCi0J LyoKLQkgKiBXQSAtIHdyaXRlIGRlZmF1bHQgY3JlZGl0cyBiZWZvcmUgcmUtcHJvZ3JhbW1pbmcK LQkgKiBGSVhNRTogc2hvdWxkIHdlIGFsc28gc2V0IHRoZSByZXNlbmQgYml0IGhlcmU/Ci0JICov Ci0JSTkxNV9XUklURShHQ0lfQ09OVFJPTCwgVkdBX0ZBU1RfTU9ERV9ESVNBQkxFIHwKLQkJICAg ZGVmYXVsdF9jcmVkaXRzKTsKLQotCUk5MTVfV1JJVEUoR0NJX0NPTlRST0wsIFZHQV9GQVNUX01P REVfRElTQUJMRSB8Ci0JCSAgIGNyZWRpdHMgfCBQRklfQ1JFRElUX1JFU0VORCk7Ci0KLQkvKgot CSAqIEZJWE1FIGlzIHRoaXMgZ3VhcmFudGVlZCB0byBjbGVhcgotCSAqIGltbWVkaWF0ZWx5IG9y IHNob3VsZCB3ZSBwb2xsIGZvciBpdD8KLQkgKi8KLQlXQVJOX09OKEk5MTVfUkVBRChHQ0lfQ09O VFJPTCkgJiBQRklfQ1JFRElUX1JFU0VORCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZhbGxleXZpZXdf bW9kZXNldF9jb21taXRfY2RjbGsoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9zdGF0ZSkK LXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2xkX3N0YXRlLT5kZXY7Ci0Jc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCXN0cnVjdCBpbnRlbF9h dG9taWNfc3RhdGUgKm9sZF9pbnRlbF9zdGF0ZSA9Ci0JCXRvX2ludGVsX2F0b21pY19zdGF0ZShv bGRfc3RhdGUpOwotCXVuc2lnbmVkIHJlcV9jZGNsayA9IG9sZF9pbnRlbF9zdGF0ZS0+ZGV2X2Nk Y2xrOwotCi0JLyoKLQkgKiBGSVhNRTogV2UgY2FuIGVuZCB1cCBoZXJlIHdpdGggYWxsIHBvd2Vy IGRvbWFpbnMgb2ZmLCB5ZXQKLQkgKiB3aXRoIGEgQ0RDTEsgZnJlcXVlbmN5IG90aGVyIHRoYW4g dGhlIG1pbmltdW0uIFRvIGFjY291bnQKLQkgKiBmb3IgdGhpcyB0YWtlIHRoZSBQSVBFLUEgcG93 ZXIgZG9tYWluLCB3aGljaCBjb3ZlcnMgdGhlIEhXCi0JICogYmxvY2tzIG5lZWRlZCBmb3IgdGhl IGZvbGxvd2luZyBwcm9ncmFtbWluZy4gVGhpcyBjYW4gYmUKLQkgKiByZW1vdmVkIG9uY2UgaXQn cyBndWFyYW50ZWVkIHRoYXQgd2UgZ2V0IGhlcmUgZWl0aGVyIHdpdGgKLQkgKiB0aGUgbWluaW11 bSBDRENMSyBzZXQsIG9yIHRoZSByZXF1aXJlZCBwb3dlciBkb21haW5zCi0JICogZW5hYmxlZC4K LQkgKi8KLQlpbnRlbF9kaXNwbGF5X3Bvd2VyX2dldChkZXZfcHJpdiwgUE9XRVJfRE9NQUlOX1BJ UEVfQSk7Ci0KLQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCi0JCWNoZXJyeXZpZXdfc2V0 X2NkY2xrKGRldiwgcmVxX2NkY2xrKTsKLQllbHNlCi0JCXZhbGxleXZpZXdfc2V0X2NkY2xrKGRl diwgcmVxX2NkY2xrKTsKLQotCXZsdl9wcm9ncmFtX3BmaV9jcmVkaXRzKGRldl9wcml2KTsKLQot CWludGVsX2Rpc3BsYXlfcG93ZXJfcHV0KGRldl9wcml2LCBQT1dFUl9ET01BSU5fUElQRV9BKTsK LX0KLQogc3RhdGljIHZvaWQgdmFsbGV5dmlld19jcnRjX2VuYWJsZShzdHJ1Y3QgaW50ZWxfY3J0 Y19zdGF0ZSAqcGlwZV9jb25maWcsCiAJCQkJICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9s ZF9zdGF0ZSkKIHsKQEAgLTcyNDcsNDQ4ICs2MzA1LDYgQEAgc3RhdGljIGludCBpbnRlbF9jcnRj X2NvbXB1dGVfY29uZmlnKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLAogCXJldHVybiAwOwogfQog Ci1zdGF0aWMgaW50IHNreWxha2VfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdikKLXsKLQl1MzIgY2RjdGw7Ci0KLQlza2xfZHBsbDBfdXBkYXRlKGRldl9wcml2KTsK LQotCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9PSAwKQotCQlyZXR1cm4gZGV2X3ByaXYt PmNkY2xrX3BsbC5yZWY7Ci0KLQljZGN0bCA9IEk5MTVfUkVBRChDRENMS19DVEwpOwotCi0JaWYg KGRldl9wcml2LT5jZGNsa19wbGwudmNvID09IDg2NDAwMDApIHsKLQkJc3dpdGNoIChjZGN0bCAm IENEQ0xLX0ZSRVFfU0VMX01BU0spIHsKLQkJY2FzZSBDRENMS19GUkVRXzQ1MF80MzI6Ci0JCQly ZXR1cm4gNDMyMDAwOwotCQljYXNlIENEQ0xLX0ZSRVFfMzM3XzMwODoKLQkJCXJldHVybiAzMDg1 NzE7Ci0JCWNhc2UgQ0RDTEtfRlJFUV81NDA6Ci0JCQlyZXR1cm4gNTQwMDAwOwotCQljYXNlIENE Q0xLX0ZSRVFfNjc1XzYxNzoKLQkJCXJldHVybiA2MTcxNDM7Ci0JCWRlZmF1bHQ6Ci0JCQlNSVNT SU5HX0NBU0UoY2RjdGwgJiBDRENMS19GUkVRX1NFTF9NQVNLKTsKLQkJfQotCX0gZWxzZSB7Ci0J CXN3aXRjaCAoY2RjdGwgJiBDRENMS19GUkVRX1NFTF9NQVNLKSB7Ci0JCWNhc2UgQ0RDTEtfRlJF UV80NTBfNDMyOgotCQkJcmV0dXJuIDQ1MDAwMDsKLQkJY2FzZSBDRENMS19GUkVRXzMzN18zMDg6 Ci0JCQlyZXR1cm4gMzM3NTAwOwotCQljYXNlIENEQ0xLX0ZSRVFfNTQwOgotCQkJcmV0dXJuIDU0 MDAwMDsKLQkJY2FzZSBDRENMS19GUkVRXzY3NV82MTc6Ci0JCQlyZXR1cm4gNjc1MDAwOwotCQlk ZWZhdWx0OgotCQkJTUlTU0lOR19DQVNFKGNkY3RsICYgQ0RDTEtfRlJFUV9TRUxfTUFTSyk7Ci0J CX0KLQl9Ci0KLQlyZXR1cm4gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWY7Ci19Ci0KLXN0YXRpYyB2 b2lkIGJ4dF9kZV9wbGxfdXBkYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK LXsKLQl1MzIgdmFsOwotCi0JZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYgPSAxOTIwMDsKLQlkZXZf cHJpdi0+Y2RjbGtfcGxsLnZjbyA9IDA7Ci0KLQl2YWwgPSBJOTE1X1JFQUQoQlhUX0RFX1BMTF9F TkFCTEUpOwotCWlmICgodmFsICYgQlhUX0RFX1BMTF9QTExfRU5BQkxFKSA9PSAwKQotCQlyZXR1 cm47Ci0KLQlpZiAoV0FSTl9PTigodmFsICYgQlhUX0RFX1BMTF9MT0NLKSA9PSAwKSkKLQkJcmV0 dXJuOwotCi0JdmFsID0gSTkxNV9SRUFEKEJYVF9ERV9QTExfQ1RMKTsKLQlkZXZfcHJpdi0+Y2Rj bGtfcGxsLnZjbyA9ICh2YWwgJiBCWFRfREVfUExMX1JBVElPX01BU0spICoKLQkJZGV2X3ByaXYt PmNkY2xrX3BsbC5yZWY7Ci19Ci0KLXN0YXRpYyBpbnQgYnJveHRvbl9nZXRfY2RjbGsoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXUzMiBkaXZpZGVyOwotCWludCBkaXYs IHZjbzsKLQotCWJ4dF9kZV9wbGxfdXBkYXRlKGRldl9wcml2KTsKLQotCXZjbyA9IGRldl9wcml2 LT5jZGNsa19wbGwudmNvOwotCWlmICh2Y28gPT0gMCkKLQkJcmV0dXJuIGRldl9wcml2LT5jZGNs a19wbGwucmVmOwotCi0JZGl2aWRlciA9IEk5MTVfUkVBRChDRENMS19DVEwpICYgQlhUX0NEQ0xL X0NEMlhfRElWX1NFTF9NQVNLOwotCi0Jc3dpdGNoIChkaXZpZGVyKSB7Ci0JY2FzZSBCWFRfQ0RD TEtfQ0QyWF9ESVZfU0VMXzE6Ci0JCWRpdiA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgQlhUX0NEQ0xL X0NEMlhfRElWX1NFTF8xXzU6Ci0JCVdBUk4oSVNfR0VNSU5JTEFLRShkZXZfcHJpdiksICJVbnN1 cHBvcnRlZCBkaXZpZGVyXG4iKTsKLQkJZGl2ID0gMzsKLQkJYnJlYWs7Ci0JY2FzZSBCWFRfQ0RD TEtfQ0QyWF9ESVZfU0VMXzI6Ci0JCWRpdiA9IDQ7Ci0JCWJyZWFrOwotCWNhc2UgQlhUX0NEQ0xL X0NEMlhfRElWX1NFTF80OgotCQlkaXYgPSA4OwotCQlicmVhazsKLQlkZWZhdWx0OgotCQlNSVNT SU5HX0NBU0UoZGl2aWRlcik7Ci0JCXJldHVybiBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZjsKLQl9 Ci0KLQlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QodmNvLCBkaXYpOwotfQotCi1zdGF0aWMgaW50 IGJyb2Fkd2VsbF9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQot ewotCXVpbnQzMl90IGxjcGxsID0gSTkxNV9SRUFEKExDUExMX0NUTCk7Ci0JdWludDMyX3QgZnJl cSA9IGxjcGxsICYgTENQTExfQ0xLX0ZSRVFfTUFTSzsKLQotCWlmIChsY3BsbCAmIExDUExMX0NE X1NPVVJDRV9GQ0xLKQotCQlyZXR1cm4gODAwMDAwOwotCWVsc2UgaWYgKEk5MTVfUkVBRChGVVNF X1NUUkFQKSAmIEhTV19DRENMS19MSU1JVCkKLQkJcmV0dXJuIDQ1MDAwMDsKLQllbHNlIGlmIChm cmVxID09IExDUExMX0NMS19GUkVRXzQ1MCkKLQkJcmV0dXJuIDQ1MDAwMDsKLQllbHNlIGlmIChm cmVxID09IExDUExMX0NMS19GUkVRXzU0T19CRFcpCi0JCXJldHVybiA1NDAwMDA7Ci0JZWxzZSBp ZiAoZnJlcSA9PSBMQ1BMTF9DTEtfRlJFUV8zMzdfNV9CRFcpCi0JCXJldHVybiAzMzc1MDA7Ci0J ZWxzZQotCQlyZXR1cm4gNjc1MDAwOwotfQotCi1zdGF0aWMgaW50IGhhc3dlbGxfZ2V0X2NkY2xr KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQl1aW50MzJfdCBsY3BsbCA9 IEk5MTVfUkVBRChMQ1BMTF9DVEwpOwotCXVpbnQzMl90IGZyZXEgPSBsY3BsbCAmIExDUExMX0NM S19GUkVRX01BU0s7Ci0KLQlpZiAobGNwbGwgJiBMQ1BMTF9DRF9TT1VSQ0VfRkNMSykKLQkJcmV0 dXJuIDgwMDAwMDsKLQllbHNlIGlmIChJOTE1X1JFQUQoRlVTRV9TVFJBUCkgJiBIU1dfQ0RDTEtf TElNSVQpCi0JCXJldHVybiA0NTAwMDA7Ci0JZWxzZSBpZiAoZnJlcSA9PSBMQ1BMTF9DTEtfRlJF UV80NTApCi0JCXJldHVybiA0NTAwMDA7Ci0JZWxzZSBpZiAoSVNfSFNXX1VMVChkZXZfcHJpdikp Ci0JCXJldHVybiAzMzc1MDA7Ci0JZWxzZQotCQlyZXR1cm4gNTQwMDAwOwotfQotCi1zdGF0aWMg aW50IHZhbGxleXZpZXdfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp dikKLXsKLQlyZXR1cm4gdmx2X2dldF9jY2tfY2xvY2tfaHBsbChkZXZfcHJpdiwgImNkY2xrIiwK LQkJCQkgICAgICBDQ0tfRElTUExBWV9DTE9DS19DT05UUk9MKTsKLX0KLQotc3RhdGljIGludCBm aXhlZF80NTBtaHpfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK LXsKLQlyZXR1cm4gNDUwMDAwOwotfQotCi1zdGF0aWMgaW50IGZpeGVkXzQwMG1oel9nZXRfY2Rj bGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXJldHVybiA0MDAwMDA7 Ci19Ci0KLXN0YXRpYyBpbnQgaTk0NWdtX2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBk ZXY7Ci0JdTE2IGdjZmdjID0gMDsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIEdDRkdD LCAmZ2NmZ2MpOwotCi0JaWYgKGdjZmdjICYgR0NfTE9XX0ZSRVFVRU5DWV9FTkFCTEUpCi0JCXJl dHVybiAxMzMzMzM7Ci0JZWxzZSB7Ci0JCXN3aXRjaCAoZ2NmZ2MgJiBHQ19ESVNQTEFZX0NMT0NL X01BU0spIHsKLQkJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzMzM18zMjBfTUhaOgotCQkJcmV0dXJu IDMyMDAwMDsKLQkJZGVmYXVsdDoKLQkJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzE5MF8yMDBfTUha OgotCQkJcmV0dXJuIDIwMDAwMDsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBmaXhlZF8zMzNt aHpfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQlyZXR1 cm4gMzMzMzMzOwotfQotCi1zdGF0aWMgaW50IGZpeGVkXzIwMG1oel9nZXRfY2RjbGsoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXJldHVybiAyMDAwMDA7Ci19Ci0KLXN0 YXRpYyBpbnQgcG52X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYp Ci17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7Ci0JdTE2IGdj ZmdjID0gMDsKLQotCXBjaV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIEdDRkdDLCAmZ2NmZ2MpOwot Ci0Jc3dpdGNoIChnY2ZnYyAmIEdDX0RJU1BMQVlfQ0xPQ0tfTUFTSykgewotCWNhc2UgR0NfRElT UExBWV9DTE9DS18yNjdfTUhaX1BOVjoKLQkJcmV0dXJuIDI2NjY2NzsKLQljYXNlIEdDX0RJU1BM QVlfQ0xPQ0tfMzMzX01IWl9QTlY6Ci0JCXJldHVybiAzMzMzMzM7Ci0JY2FzZSBHQ19ESVNQTEFZ X0NMT0NLXzQ0NF9NSFpfUE5WOgotCQlyZXR1cm4gNDQ0NDQ0OwotCWNhc2UgR0NfRElTUExBWV9D TE9DS18yMDBfTUhaX1BOVjoKLQkJcmV0dXJuIDIwMDAwMDsKLQlkZWZhdWx0OgotCQlEUk1fRVJS T1IoIlVua25vd24gcG52IGRpc3BsYXkgY29yZSBjbG9jayAweCUwNHhcbiIsIGdjZmdjKTsKLQlj YXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMTMzX01IWl9QTlY6Ci0JCXJldHVybiAxMzMzMzM7Ci0JY2Fz ZSBHQ19ESVNQTEFZX0NMT0NLXzE2N19NSFpfUE5WOgotCQlyZXR1cm4gMTY2NjY3OwotCX0KLX0K LQotc3RhdGljIGludCBpOTE1Z21fZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRldjsK LQl1MTYgZ2NmZ2MgPSAwOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgR0NGR0MsICZn Y2ZnYyk7Ci0KLQlpZiAoZ2NmZ2MgJiBHQ19MT1dfRlJFUVVFTkNZX0VOQUJMRSkKLQkJcmV0dXJu IDEzMzMzMzsKLQllbHNlIHsKLQkJc3dpdGNoIChnY2ZnYyAmIEdDX0RJU1BMQVlfQ0xPQ0tfTUFT SykgewotCQljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMzMzXzMyMF9NSFo6Ci0JCQlyZXR1cm4gMzMz MzMzOwotCQlkZWZhdWx0OgotCQljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMTkwXzIwMF9NSFo6Ci0J CQlyZXR1cm4gMTkwMDAwOwotCQl9Ci0JfQotfQotCi1zdGF0aWMgaW50IGZpeGVkXzI2Nm1oel9n ZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXJldHVybiAy NjY2Njc7Ci19Ci0KLXN0YXRpYyBpbnQgaTg1eF9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRy bS5wZGV2OwotCXUxNiBocGxsY2MgPSAwOwotCi0JLyoKLQkgKiA4NTJHTS84NTJHTVYgb25seSBz dXBwb3J0cyAxMzMgTUh6IGFuZCB0aGUgSFBMTENDCi0JICogZW5jb2RpbmcgaXMgZGlmZmVyZW50 IDooCi0JICogRklYTUUgaXMgdGhpcyB0aGUgcmlnaHQgd2F5IHRvIGRldGVjdCA4NTJHTS84NTJH TVY/Ci0JICovCi0JaWYgKHBkZXYtPnJldmlzaW9uID09IDB4MSkKLQkJcmV0dXJuIDEzMzMzMzsK LQotCXBjaV9idXNfcmVhZF9jb25maWdfd29yZChwZGV2LT5idXMsCi0JCQkJIFBDSV9ERVZGTigw LCAzKSwgSFBMTENDLCAmaHBsbGNjKTsKLQotCS8qIEFzc3VtZSB0aGF0IHRoZSBoYXJkd2FyZSBp cyBpbiB0aGUgaGlnaCBzcGVlZCBzdGF0ZS4gIFRoaXMKLQkgKiBzaG91bGQgYmUgdGhlIGRlZmF1 bHQuCi0JICovCi0Jc3dpdGNoIChocGxsY2MgJiBHQ19DTE9DS19DT05UUk9MX01BU0spIHsKLQlj YXNlIEdDX0NMT0NLXzEzM18yMDA6Ci0JY2FzZSBHQ19DTE9DS18xMzNfMjAwXzI6Ci0JY2FzZSBH Q19DTE9DS18xMDBfMjAwOgotCQlyZXR1cm4gMjAwMDAwOwotCWNhc2UgR0NfQ0xPQ0tfMTY2XzI1 MDoKLQkJcmV0dXJuIDI1MDAwMDsKLQljYXNlIEdDX0NMT0NLXzEwMF8xMzM6Ci0JCXJldHVybiAx MzMzMzM7Ci0JY2FzZSBHQ19DTE9DS18xMzNfMjY2OgotCWNhc2UgR0NfQ0xPQ0tfMTMzXzI2Nl8y OgotCWNhc2UgR0NfQ0xPQ0tfMTY2XzI2NjoKLQkJcmV0dXJuIDI2NjY2NzsKLQl9Ci0KLQkvKiBT aG91bGRuJ3QgaGFwcGVuICovCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZml4ZWRfMTMz bWh6X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JcmV0 dXJuIDEzMzMzMzsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9ocGxsX3ZjbyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVk IGludCBibGJfdmNvWzhdID0gewotCQlbMF0gPSAzMjAwMDAwLAotCQlbMV0gPSA0MDAwMDAwLAot CQlbMl0gPSA1MzMzMzMzLAotCQlbM10gPSA0ODAwMDAwLAotCQlbNF0gPSA2NDAwMDAwLAotCX07 Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwbnZfdmNvWzhdID0gewotCQlbMF0gPSAzMjAw MDAwLAotCQlbMV0gPSA0MDAwMDAwLAotCQlbMl0gPSA1MzMzMzMzLAotCQlbM10gPSA0ODAwMDAw LAotCQlbNF0gPSAyNjY2NjY3LAotCX07Ci0Jc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjbF92 Y29bOF0gPSB7Ci0JCVswXSA9IDMyMDAwMDAsCi0JCVsxXSA9IDQwMDAwMDAsCi0JCVsyXSA9IDUz MzMzMzMsCi0JCVszXSA9IDY0MDAwMDAsCi0JCVs0XSA9IDMzMzMzMzMsCi0JCVs1XSA9IDM1NjY2 NjcsCi0JCVs2XSA9IDQyNjY2NjcsCi0JfTsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVs a192Y29bOF0gPSB7Ci0JCVswXSA9IDMyMDAwMDAsCi0JCVsxXSA9IDQwMDAwMDAsCi0JCVsyXSA9 IDUzMzMzMzMsCi0JCVszXSA9IDQ4MDAwMDAsCi0JfTsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQg aW50IGN0Z192Y29bOF0gPSB7Ci0JCVswXSA9IDMyMDAwMDAsCi0JCVsxXSA9IDQwMDAwMDAsCi0J CVsyXSA9IDUzMzMzMzMsCi0JCVszXSA9IDY0MDAwMDAsCi0JCVs0XSA9IDI2NjY2NjcsCi0JCVs1 XSA9IDQyNjY2NjcsCi0JfTsKLQljb25zdCB1bnNpZ25lZCBpbnQgKnZjb190YWJsZTsKLQl1bnNp Z25lZCBpbnQgdmNvOwotCXVpbnQ4X3QgdG1wID0gMDsKLQotCS8qIEZJWE1FIG90aGVyIGNoaXBz ZXRzPyAqLwotCWlmIChJU19HTTQ1KGRldl9wcml2KSkKLQkJdmNvX3RhYmxlID0gY3RnX3ZjbzsK LQllbHNlIGlmIChJU19HNFgoZGV2X3ByaXYpKQotCQl2Y29fdGFibGUgPSBlbGtfdmNvOwotCWVs c2UgaWYgKElTX0k5NjVHTShkZXZfcHJpdikpCi0JCXZjb190YWJsZSA9IGNsX3ZjbzsKLQllbHNl IGlmIChJU19QSU5FVklFVyhkZXZfcHJpdikpCi0JCXZjb190YWJsZSA9IHBudl92Y287Ci0JZWxz ZSBpZiAoSVNfRzMzKGRldl9wcml2KSkKLQkJdmNvX3RhYmxlID0gYmxiX3ZjbzsKLQllbHNlCi0J CXJldHVybiAwOwotCi0JdG1wID0gSTkxNV9SRUFEKElTX01PQklMRShkZXZfcHJpdikgPyBIUExM VkNPX01PQklMRSA6IEhQTExWQ08pOwotCi0JdmNvID0gdmNvX3RhYmxlW3RtcCAmIDB4N107Ci0J aWYgKHZjbyA9PSAwKQotCQlEUk1fRVJST1IoIkJhZCBIUExMIFZDTyAoSFBMTFZDTz0weCUwMngp XG4iLCB0bXApOwotCWVsc2UKLQkJRFJNX0RFQlVHX0tNUygiSFBMTCBWQ08gJXUga0h6XG4iLCB2 Y28pOwotCi0JcmV0dXJuIHZjbzsKLX0KLQotc3RhdGljIGludCBnbTQ1X2dldF9jZGNsayhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IHBjaV9kZXYgKnBkZXYg PSBkZXZfcHJpdi0+ZHJtLnBkZXY7Ci0JdW5zaWduZWQgaW50IGNkY2xrX3NlbCwgdmNvID0gaW50 ZWxfaHBsbF92Y28oZGV2X3ByaXYpOwotCXVpbnQxNl90IHRtcCA9IDA7Ci0KLQlwY2lfcmVhZF9j b25maWdfd29yZChwZGV2LCBHQ0ZHQywgJnRtcCk7Ci0KLQljZGNsa19zZWwgPSAodG1wID4+IDEy KSAmIDB4MTsKLQotCXN3aXRjaCAodmNvKSB7Ci0JY2FzZSAyNjY2NjY3OgotCWNhc2UgNDAwMDAw MDoKLQljYXNlIDUzMzMzMzM6Ci0JCXJldHVybiBjZGNsa19zZWwgPyAzMzMzMzMgOiAyMjIyMjI7 Ci0JY2FzZSAzMjAwMDAwOgotCQlyZXR1cm4gY2RjbGtfc2VsID8gMzIwMDAwIDogMjI4NTcxOwot CWRlZmF1bHQ6Ci0JCURSTV9FUlJPUigiVW5hYmxlIHRvIGRldGVybWluZSBDRENMSy4gSFBMTCBW Q089JXUsIENGR0M9MHglMDR4XG4iLCB2Y28sIHRtcCk7Ci0JCXJldHVybiAyMjIyMjI7Ci0JfQot fQotCi1zdGF0aWMgaW50IGk5NjVnbV9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2 OwotCXN0YXRpYyBjb25zdCB1aW50OF90IGRpdl8zMjAwW10gPSB7IDE2LCAxMCwgIDggfTsKLQlz dGF0aWMgY29uc3QgdWludDhfdCBkaXZfNDAwMFtdID0geyAyMCwgMTIsIDEwIH07Ci0Jc3RhdGlj IGNvbnN0IHVpbnQ4X3QgZGl2XzUzMzNbXSA9IHsgMjQsIDE2LCAxNCB9OwotCWNvbnN0IHVpbnQ4 X3QgKmRpdl90YWJsZTsKLQl1bnNpZ25lZCBpbnQgY2RjbGtfc2VsLCB2Y28gPSBpbnRlbF9ocGxs X3ZjbyhkZXZfcHJpdik7Ci0JdWludDE2X3QgdG1wID0gMDsKLQotCXBjaV9yZWFkX2NvbmZpZ193 b3JkKHBkZXYsIEdDRkdDLCAmdG1wKTsKLQotCWNkY2xrX3NlbCA9ICgodG1wID4+IDgpICYgMHgx ZikgLSAxOwotCi0JaWYgKGNkY2xrX3NlbCA+PSBBUlJBWV9TSVpFKGRpdl8zMjAwKSkKLQkJZ290 byBmYWlsOwotCi0Jc3dpdGNoICh2Y28pIHsKLQljYXNlIDMyMDAwMDA6Ci0JCWRpdl90YWJsZSA9 IGRpdl8zMjAwOwotCQlicmVhazsKLQljYXNlIDQwMDAwMDA6Ci0JCWRpdl90YWJsZSA9IGRpdl80 MDAwOwotCQlicmVhazsKLQljYXNlIDUzMzMzMzM6Ci0JCWRpdl90YWJsZSA9IGRpdl81MzMzOwot CQlicmVhazsKLQlkZWZhdWx0OgotCQlnb3RvIGZhaWw7Ci0JfQotCi0JcmV0dXJuIERJVl9ST1VO RF9DTE9TRVNUKHZjbywgZGl2X3RhYmxlW2NkY2xrX3NlbF0pOwotCi1mYWlsOgotCURSTV9FUlJP UigiVW5hYmxlIHRvIGRldGVybWluZSBDRENMSy4gSFBMTCBWQ089JXUga0h6LCBDRkdDPTB4JTA0 eFxuIiwgdmNvLCB0bXApOwotCXJldHVybiAyMDAwMDA7Ci19Ci0KLXN0YXRpYyBpbnQgZzMzX2dl dF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc3RydWN0IHBj aV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7Ci0Jc3RhdGljIGNvbnN0IHVpbnQ4X3Qg ZGl2XzMyMDBbXSA9IHsgMTIsIDEwLCAgOCwgIDcsIDUsIDE2IH07Ci0Jc3RhdGljIGNvbnN0IHVp bnQ4X3QgZGl2XzQwMDBbXSA9IHsgMTQsIDEyLCAxMCwgIDgsIDYsIDIwIH07Ci0Jc3RhdGljIGNv bnN0IHVpbnQ4X3QgZGl2XzQ4MDBbXSA9IHsgMjAsIDE0LCAxMiwgMTAsIDgsIDI0IH07Ci0Jc3Rh dGljIGNvbnN0IHVpbnQ4X3QgZGl2XzUzMzNbXSA9IHsgMjAsIDE2LCAxMiwgMTIsIDgsIDI4IH07 Ci0JY29uc3QgdWludDhfdCAqZGl2X3RhYmxlOwotCXVuc2lnbmVkIGludCBjZGNsa19zZWwsIHZj byA9IGludGVsX2hwbGxfdmNvKGRldl9wcml2KTsKLQl1aW50MTZfdCB0bXAgPSAwOwotCi0JcGNp X3JlYWRfY29uZmlnX3dvcmQocGRldiwgR0NGR0MsICZ0bXApOwotCi0JY2RjbGtfc2VsID0gKHRt cCA+PiA0KSAmIDB4NzsKLQotCWlmIChjZGNsa19zZWwgPj0gQVJSQVlfU0laRShkaXZfMzIwMCkp Ci0JCWdvdG8gZmFpbDsKLQotCXN3aXRjaCAodmNvKSB7Ci0JY2FzZSAzMjAwMDAwOgotCQlkaXZf dGFibGUgPSBkaXZfMzIwMDsKLQkJYnJlYWs7Ci0JY2FzZSA0MDAwMDAwOgotCQlkaXZfdGFibGUg PSBkaXZfNDAwMDsKLQkJYnJlYWs7Ci0JY2FzZSA0ODAwMDAwOgotCQlkaXZfdGFibGUgPSBkaXZf NDgwMDsKLQkJYnJlYWs7Ci0JY2FzZSA1MzMzMzMzOgotCQlkaXZfdGFibGUgPSBkaXZfNTMzMzsK LQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZ290byBmYWlsOwotCX0KLQotCXJldHVybiBESVZfUk9V TkRfQ0xPU0VTVCh2Y28sIGRpdl90YWJsZVtjZGNsa19zZWxdKTsKLQotZmFpbDoKLQlEUk1fRVJS T1IoIlVuYWJsZSB0byBkZXRlcm1pbmUgQ0RDTEsuIEhQTEwgVkNPPSV1IGtIeiwgQ0ZHQz0weCUw OHhcbiIsIHZjbywgdG1wKTsKLQlyZXR1cm4gMTkwNDc2OwotfQotCiBzdGF0aWMgdm9pZAogaW50 ZWxfcmVkdWNlX21fbl9yYXRpbyh1aW50MzJfdCAqbnVtLCB1aW50MzJfdCAqZGVuKQogewpAQCAt MTAyNTAsMjQ1ICs4ODY2LDYgQEAgdm9pZCBoc3dfZGlzYWJsZV9wYzgoc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmRldl9wcml2KQogCX0KIH0KIAotc3RhdGljIHZvaWQgYnh0X21vZGVzZXRfY29t bWl0X2NkY2xrKHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpvbGRfc3RhdGUpCi17Ci0Jc3RydWN0 IGRybV9kZXZpY2UgKmRldiA9IG9sZF9zdGF0ZS0+ZGV2OwotCXN0cnVjdCBpbnRlbF9hdG9taWNf c3RhdGUgKm9sZF9pbnRlbF9zdGF0ZSA9Ci0JCXRvX2ludGVsX2F0b21pY19zdGF0ZShvbGRfc3Rh dGUpOwotCXVuc2lnbmVkIGludCByZXFfY2RjbGsgPSBvbGRfaW50ZWxfc3RhdGUtPmRldl9jZGNs azsKLQotCWJ4dF9zZXRfY2RjbGsodG9faTkxNShkZXYpLCByZXFfY2RjbGspOwotfQotCi1zdGF0 aWMgaW50IGJkd19hZGp1c3RfbWluX3BpcGVfcGl4ZWxfcmF0ZShzdHJ1Y3QgaW50ZWxfY3J0Y19z dGF0ZSAqY3J0Y19zdGF0ZSwKLQkJCQkJICBpbnQgcGl4ZWxfcmF0ZSkKLXsKLQlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGNydGNfc3RhdGUtPmJhc2UuY3J0Yy0+ ZGV2KTsKLQotCS8qIHBpeGVsIHJhdGUgbXVzdG4ndCBleGNlZWQgOTUlIG9mIGNkY2xrIHdpdGgg SVBTIG9uIEJEVyAqLwotCWlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYpICYmIGNydGNfc3RhdGUt Pmlwc19lbmFibGVkKQotCQlwaXhlbF9yYXRlID0gRElWX1JPVU5EX1VQKHBpeGVsX3JhdGUgKiAx MDAsIDk1KTsKLQotCS8qIEJTcGVjIHNheXMgIkRvIG5vdCB1c2UgRGlzcGxheVBvcnQgd2l0aCBD RENMSyBsZXNzIHRoYW4KLQkgKiA0MzIgTUh6LCBhdWRpbyBlbmFibGVkLCBwb3J0IHdpZHRoIHg0 LCBhbmQgbGluayByYXRlCi0JICogSEJSMiAoNS40IEdIeiksIG9yIGVsc2UgdGhlcmUgbWF5IGJl IGF1ZGlvIGNvcnJ1cHRpb24gb3IKLQkgKiBzY3JlZW4gY29ycnVwdGlvbi4iCi0JICovCi0JaWYg KGludGVsX2NydGNfaGFzX2RwX2VuY29kZXIoY3J0Y19zdGF0ZSkgJiYKLQkgICAgY3J0Y19zdGF0 ZS0+aGFzX2F1ZGlvICYmCi0JICAgIGNydGNfc3RhdGUtPnBvcnRfY2xvY2sgPj0gNTQwMDAwICYm Ci0JICAgIGNydGNfc3RhdGUtPmxhbmVfY291bnQgPT0gNCkKLQkJcGl4ZWxfcmF0ZSA9IG1heCg0 MzIwMDAsIHBpeGVsX3JhdGUpOwotCi0JcmV0dXJuIHBpeGVsX3JhdGU7Ci19Ci0KLS8qIGNvbXB1 dGUgdGhlIG1heCByYXRlIGZvciBuZXcgY29uZmlndXJhdGlvbiAqLwotc3RhdGljIGludCBpbnRl bF9tYXhfcGl4ZWxfcmF0ZShzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3Ry dWN0IGludGVsX2F0b21pY19zdGF0ZSAqaW50ZWxfc3RhdGUgPSB0b19pbnRlbF9hdG9taWNfc3Rh dGUoc3RhdGUpOwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUo c3RhdGUtPmRldik7Ci0Jc3RydWN0IGRybV9jcnRjICpjcnRjOwotCXN0cnVjdCBkcm1fY3J0Y19z dGF0ZSAqY3N0YXRlOwotCXN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwotCXVu c2lnbmVkIG1heF9waXhlbF9yYXRlID0gMCwgaTsKLQllbnVtIHBpcGUgcGlwZTsKLQotCW1lbWNw eShpbnRlbF9zdGF0ZS0+bWluX3BpeGNsaywgZGV2X3ByaXYtPm1pbl9waXhjbGssCi0JICAgICAg IHNpemVvZihpbnRlbF9zdGF0ZS0+bWluX3BpeGNsaykpOwotCi0JZm9yX2VhY2hfY3J0Y19pbl9z dGF0ZShzdGF0ZSwgY3J0YywgY3N0YXRlLCBpKSB7Ci0JCWludCBwaXhlbF9yYXRlOwotCi0JCWNy dGNfc3RhdGUgPSB0b19pbnRlbF9jcnRjX3N0YXRlKGNzdGF0ZSk7Ci0JCWlmICghY3J0Y19zdGF0 ZS0+YmFzZS5lbmFibGUpIHsKLQkJCWludGVsX3N0YXRlLT5taW5fcGl4Y2xrW2ldID0gMDsKLQkJ CWNvbnRpbnVlOwotCQl9Ci0KLQkJcGl4ZWxfcmF0ZSA9IGNydGNfc3RhdGUtPnBpeGVsX3JhdGU7 Ci0KLQkJaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikgfHwgSVNfR0VOOShkZXZfcHJpdikpCi0J CQlwaXhlbF9yYXRlID0gYmR3X2FkanVzdF9taW5fcGlwZV9waXhlbF9yYXRlKGNydGNfc3RhdGUs Ci0JCQkJCQkJCSAgICBwaXhlbF9yYXRlKTsKLQotCQlpbnRlbF9zdGF0ZS0+bWluX3BpeGNsa1tp XSA9IHBpeGVsX3JhdGU7Ci0JfQotCi0JZm9yX2VhY2hfcGlwZShkZXZfcHJpdiwgcGlwZSkKLQkJ bWF4X3BpeGVsX3JhdGUgPSBtYXgoaW50ZWxfc3RhdGUtPm1pbl9waXhjbGtbcGlwZV0sIG1heF9w aXhlbF9yYXRlKTsKLQotCXJldHVybiBtYXhfcGl4ZWxfcmF0ZTsKLX0KLQotc3RhdGljIHZvaWQg YnJvYWR3ZWxsX3NldF9jZGNsayhzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCBpbnQgY2RjbGspCi17 Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCXVp bnQzMl90IHZhbCwgZGF0YTsKLQlpbnQgcmV0OwotCi0JaWYgKFdBUk4oKEk5MTVfUkVBRChMQ1BM TF9DVEwpICYKLQkJICAoTENQTExfUExMX0RJU0FCTEUgfCBMQ1BMTF9QTExfTE9DSyB8Ci0JCSAg IExDUExMX0NEX0NMT0NLX0RJU0FCTEUgfCBMQ1BMTF9ST09UX0NEX0NMT0NLX0RJU0FCTEUgfAot CQkgICBMQ1BMTF9DRDJYX0NMT0NLX0RJU0FCTEUgfCBMQ1BMTF9QT1dFUl9ET1dOX0FMTE9XIHwK LQkJICAgTENQTExfQ0RfU09VUkNFX0ZDTEspKSAhPSBMQ1BMTF9QTExfTE9DSywKLQkJICJ0cnlp bmcgdG8gY2hhbmdlIGNkY2xrIGZyZXF1ZW5jeSB3aXRoIGNkY2xrIG5vdCBlbmFibGVkXG4iKSkK LQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQlyZXQg PSBzYW5keWJyaWRnZV9wY29kZV93cml0ZShkZXZfcHJpdiwKLQkJCQkgICAgICBCRFdfUENPREVf RElTUExBWV9GUkVRX0NIQU5HRV9SRVEsIDB4MCk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ cnBzLmh3X2xvY2spOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJmYWlsZWQgdG8gaW5mb3Jt IHBjb2RlIGFib3V0IGNkY2xrIGNoYW5nZVxuIik7Ci0JCXJldHVybjsKLQl9Ci0KLQl2YWwgPSBJ OTE1X1JFQUQoTENQTExfQ1RMKTsKLQl2YWwgfD0gTENQTExfQ0RfU09VUkNFX0ZDTEs7Ci0JSTkx NV9XUklURShMQ1BMTF9DVEwsIHZhbCk7Ci0KLQlpZiAod2FpdF9mb3JfdXMoSTkxNV9SRUFEKExD UExMX0NUTCkgJgotCQkJTENQTExfQ0RfU09VUkNFX0ZDTEtfRE9ORSwgMSkpCi0JCURSTV9FUlJP UigiU3dpdGNoaW5nIHRvIEZDTEsgZmFpbGVkXG4iKTsKLQotCXZhbCA9IEk5MTVfUkVBRChMQ1BM TF9DVEwpOwotCXZhbCAmPSB+TENQTExfQ0xLX0ZSRVFfTUFTSzsKLQotCXN3aXRjaCAoY2RjbGsp IHsKLQljYXNlIDQ1MDAwMDoKLQkJdmFsIHw9IExDUExMX0NMS19GUkVRXzQ1MDsKLQkJZGF0YSA9 IDA7Ci0JCWJyZWFrOwotCWNhc2UgNTQwMDAwOgotCQl2YWwgfD0gTENQTExfQ0xLX0ZSRVFfNTRP X0JEVzsKLQkJZGF0YSA9IDE7Ci0JCWJyZWFrOwotCWNhc2UgMzM3NTAwOgotCQl2YWwgfD0gTENQ TExfQ0xLX0ZSRVFfMzM3XzVfQkRXOwotCQlkYXRhID0gMjsKLQkJYnJlYWs7Ci0JY2FzZSA2NzUw MDA6Ci0JCXZhbCB8PSBMQ1BMTF9DTEtfRlJFUV82NzVfQkRXOwotCQlkYXRhID0gMzsKLQkJYnJl YWs7Ci0JZGVmYXVsdDoKLQkJV0FSTigxLCAiaW52YWxpZCBjZGNsayBmcmVxdWVuY3lcbiIpOwot CQlyZXR1cm47Ci0JfQotCi0JSTkxNV9XUklURShMQ1BMTF9DVEwsIHZhbCk7Ci0KLQl2YWwgPSBJ OTE1X1JFQUQoTENQTExfQ1RMKTsKLQl2YWwgJj0gfkxDUExMX0NEX1NPVVJDRV9GQ0xLOwotCUk5 MTVfV1JJVEUoTENQTExfQ1RMLCB2YWwpOwotCi0JaWYgKHdhaXRfZm9yX3VzKChJOTE1X1JFQUQo TENQTExfQ1RMKSAmCi0JCQlMQ1BMTF9DRF9TT1VSQ0VfRkNMS19ET05FKSA9PSAwLCAxKSkKLQkJ RFJNX0VSUk9SKCJTd2l0Y2hpbmcgYmFjayB0byBMQ1BMTCBmYWlsZWRcbiIpOwotCi0JbXV0ZXhf bG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQlzYW5keWJyaWRnZV9wY29kZV93cml0ZShk ZXZfcHJpdiwgSFNXX1BDT0RFX0RFX1dSSVRFX0ZSRVFfUkVRLCBkYXRhKTsKLQltdXRleF91bmxv Y2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0KLQlJOTE1X1dSSVRFKENEQ0xLX0ZSRVEsIERJ Vl9ST1VORF9DTE9TRVNUKGNkY2xrLCAxMDAwKSAtIDEpOwotCi0JaW50ZWxfdXBkYXRlX2NkY2xr KGRldl9wcml2KTsKLQotCVdBUk4oY2RjbGsgIT0gZGV2X3ByaXYtPmNkY2xrX2ZyZXEsCi0JICAg ICAiY2RjbGsgcmVxdWVzdGVkICVkIGtIeiBidXQgZ290ICVkIGtIelxuIiwKLQkgICAgIGNkY2xr LCBkZXZfcHJpdi0+Y2RjbGtfZnJlcSk7Ci19Ci0KLXN0YXRpYyBpbnQgYnJvYWR3ZWxsX2NhbGNf Y2RjbGsoaW50IG1heF9waXhjbGspCi17Ci0JaWYgKG1heF9waXhjbGsgPiA1NDAwMDApCi0JCXJl dHVybiA2NzUwMDA7Ci0JZWxzZSBpZiAobWF4X3BpeGNsayA+IDQ1MDAwMCkKLQkJcmV0dXJuIDU0 MDAwMDsKLQllbHNlIGlmIChtYXhfcGl4Y2xrID4gMzM3NTAwKQotCQlyZXR1cm4gNDUwMDAwOwot CWVsc2UKLQkJcmV0dXJuIDMzNzUwMDsKLX0KLQotc3RhdGljIGludCBicm9hZHdlbGxfbW9kZXNl dF9jYWxjX2NkY2xrKHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKLXsKLQlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHN0YXRlLT5kZXYpOwotCXN0cnVj dCBpbnRlbF9hdG9taWNfc3RhdGUgKmludGVsX3N0YXRlID0gdG9faW50ZWxfYXRvbWljX3N0YXRl KHN0YXRlKTsKLQlpbnQgbWF4X3BpeGNsayA9IGludGVsX21heF9waXhlbF9yYXRlKHN0YXRlKTsK LQlpbnQgY2RjbGs7Ci0KLQkvKgotCSAqIEZJWE1FIHNob3VsZCBhbHNvIGFjY291bnQgZm9yIHBs YW5lIHJhdGlvCi0JICogb25jZSA2NGJwcCBwaXhlbCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCi0J ICovCi0JY2RjbGsgPSBicm9hZHdlbGxfY2FsY19jZGNsayhtYXhfcGl4Y2xrKTsKLQotCWlmIChj ZGNsayA+IGRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSkgewotCQlEUk1fREVCVUdfS01TKCJyZXF1 ZXN0ZWQgY2RjbGsgKCVkIGtIeikgZXhjZWVkcyBtYXggKCVkIGtIeilcbiIsCi0JCQkgICAgICBj ZGNsaywgZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQot Ci0JaW50ZWxfc3RhdGUtPmNkY2xrID0gaW50ZWxfc3RhdGUtPmRldl9jZGNsayA9IGNkY2xrOwot CWlmICghaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcykKLQkJaW50ZWxfc3RhdGUtPmRldl9jZGNs ayA9IGJyb2Fkd2VsbF9jYWxjX2NkY2xrKDApOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2 b2lkIGJyb2Fkd2VsbF9tb2Rlc2V0X2NvbW1pdF9jZGNsayhzdHJ1Y3QgZHJtX2F0b21pY19zdGF0 ZSAqb2xkX3N0YXRlKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBvbGRfc3RhdGUtPmRl djsKLQlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICpvbGRfaW50ZWxfc3RhdGUgPQotCQl0b19p bnRlbF9hdG9taWNfc3RhdGUob2xkX3N0YXRlKTsKLQl1bnNpZ25lZCByZXFfY2RjbGsgPSBvbGRf aW50ZWxfc3RhdGUtPmRldl9jZGNsazsKLQotCWJyb2Fkd2VsbF9zZXRfY2RjbGsoZGV2LCByZXFf Y2RjbGspOwotfQotCi1zdGF0aWMgaW50IHNrbF9tb2Rlc2V0X2NhbGNfY2RjbGsoc3RydWN0IGRy bV9hdG9taWNfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBpbnRlbF9hdG9taWNfc3RhdGUgKmlu dGVsX3N0YXRlID0gdG9faW50ZWxfYXRvbWljX3N0YXRlKHN0YXRlKTsKLQlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHN0YXRlLT5kZXYpOwotCWNvbnN0IGludCBt YXhfcGl4Y2xrID0gaW50ZWxfbWF4X3BpeGVsX3JhdGUoc3RhdGUpOwotCWludCB2Y28gPSBpbnRl bF9zdGF0ZS0+Y2RjbGtfcGxsX3ZjbzsKLQlpbnQgY2RjbGs7Ci0KLQkvKgotCSAqIEZJWE1FIHNo b3VsZCBhbHNvIGFjY291bnQgZm9yIHBsYW5lIHJhdGlvCi0JICogb25jZSA2NGJwcCBwaXhlbCBm b3JtYXRzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JY2RjbGsgPSBza2xfY2FsY19jZGNsayhtYXhf cGl4Y2xrLCB2Y28pOwotCi0JLyoKLQkgKiBGSVhNRSBtb3ZlIHRoZSBjZGNsayBjYWNsdWxhdGlv biB0bwotCSAqIGNvbXB1dGVfY29uZmlnKCkgc28gd2UgY2FuIGZhaWwgZ3JhY2VndWxseS4KLQkg Ki8KLQlpZiAoY2RjbGsgPiBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEpIHsKLQkJRFJNX0VSUk9S KCJyZXF1ZXN0ZWQgY2RjbGsgKCVkIGtIeikgZXhjZWVkcyBtYXggKCVkIGtIeilcbiIsCi0JCQkg IGNkY2xrLCBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEpOwotCQljZGNsayA9IGRldl9wcml2LT5t YXhfY2RjbGtfZnJlcTsKLQl9Ci0KLQlpbnRlbF9zdGF0ZS0+Y2RjbGsgPSBpbnRlbF9zdGF0ZS0+ ZGV2X2NkY2xrID0gY2RjbGs7Ci0JaWYgKCFpbnRlbF9zdGF0ZS0+YWN0aXZlX2NydGNzKQotCQlp bnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gc2tsX2NhbGNfY2RjbGsoMCwgdmNvKTsKLQotCXJldHVy biAwOwotfQotCi1zdGF0aWMgdm9pZCBza2xfbW9kZXNldF9jb21taXRfY2RjbGsoc3RydWN0IGRy bV9hdG9taWNfc3RhdGUgKm9sZF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYgPSB0b19pOTE1KG9sZF9zdGF0ZS0+ZGV2KTsKLQlzdHJ1Y3QgaW50ZWxfYXRvbWlj X3N0YXRlICppbnRlbF9zdGF0ZSA9IHRvX2ludGVsX2F0b21pY19zdGF0ZShvbGRfc3RhdGUpOwot CXVuc2lnbmVkIGludCByZXFfY2RjbGsgPSBpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrOwotCXVuc2ln bmVkIGludCByZXFfdmNvID0gaW50ZWxfc3RhdGUtPmNkY2xrX3BsbF92Y287Ci0KLQlza2xfc2V0 X2NkY2xrKGRldl9wcml2LCByZXFfY2RjbGssIHJlcV92Y28pOwotfQotCiBzdGF0aWMgaW50IGhh c3dlbGxfY3J0Y19jb21wdXRlX2Nsb2NrKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjLAogCQkJCSAg ICAgIHN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpjcnRjX3N0YXRlKQogewpAQCAtMTYxNzAsNiAr MTQ1NDcsOCBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9tb2RlX2NvbmZpZ19mdW5jcyBpbnRl bF9tb2RlX2Z1bmNzID0gewogICovCiB2b2lkIGludGVsX2luaXRfZGlzcGxheV9ob29rcyhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCiB7CisJaW50ZWxfaW5pdF9jZGNsa19ob29r cyhkZXZfcHJpdik7CisKIAlpZiAoSU5URUxfSU5GTyhkZXZfcHJpdiktPmdlbiA+PSA5KSB7CiAJ CWRldl9wcml2LT5kaXNwbGF5LmdldF9waXBlX2NvbmZpZyA9IGhhc3dlbGxfZ2V0X3BpcGVfY29u ZmlnOwogCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfaW5pdGlhbF9wbGFuZV9jb25maWcgPQpAQCAt MTYyMzgsNTIgKzE0NjE3LDYgQEAgdm9pZCBpbnRlbF9pbml0X2Rpc3BsYXlfaG9va3Moc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQogCQlkZXZfcHJpdi0+ZGlzcGxheS5jcnRjX2Rp c2FibGUgPSBpOXh4X2NydGNfZGlzYWJsZTsKIAl9CiAKLQkvKiBSZXR1cm5zIHRoZSBjb3JlIGRp c3BsYXkgY2xvY2sgc3BlZWQgKi8KLQlpZiAoSVNfR0VOOV9CQyhkZXZfcHJpdikpCi0JCWRldl9w cml2LT5kaXNwbGF5LmdldF9jZGNsayA9IHNreWxha2VfZ2V0X2NkY2xrOwotCWVsc2UgaWYgKElT X0dFTjlfTFAoZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBicm94 dG9uX2dldF9jZGNsazsKLQllbHNlIGlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYpKQotCQlkZXZf cHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBicm9hZHdlbGxfZ2V0X2NkY2xrOwotCWVsc2UgaWYg KElTX0hBU1dFTEwoZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBo YXN3ZWxsX2dldF9jZGNsazsKLQllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSB8fCBJ U19DSEVSUllWSUVXKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0g dmFsbGV5dmlld19nZXRfY2RjbGs7Ci0JZWxzZSBpZiAoSVNfR0VONihkZXZfcHJpdikgfHwgSVNf SVZZQlJJREdFKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4 ZWRfNDAwbWh6X2dldF9jZGNsazsKLQllbHNlIGlmIChJU19HRU41KGRldl9wcml2KSkKLQkJZGV2 X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfNDUwbWh6X2dldF9jZGNsazsKLQllbHNl IGlmIChJU19HTTQ1KGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0g Z200NV9nZXRfY2RjbGs7Ci0JZWxzZSBpZiAoSVNfRzRYKGRldl9wcml2KSkKLQkJZGV2X3ByaXYt PmRpc3BsYXkuZ2V0X2NkY2xrID0gZzMzX2dldF9jZGNsazsKLQllbHNlIGlmIChJU19JOTY1R00o ZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBpOTY1Z21fZ2V0X2Nk Y2xrOwotCWVsc2UgaWYgKElTX0k5NjVHKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXku Z2V0X2NkY2xrID0gZml4ZWRfNDAwbWh6X2dldF9jZGNsazsKLQllbHNlIGlmIChJU19QSU5FVklF VyhkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IHBudl9nZXRfY2Rj bGs7Ci0JZWxzZSBpZiAoSVNfRzMzKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0 X2NkY2xrID0gZzMzX2dldF9jZGNsazsKLQllbHNlIGlmIChJU19JOTQ1R00oZGV2X3ByaXYpKQot CQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBpOTQ1Z21fZ2V0X2NkY2xrOwotCWVsc2Ug aWYgKElTX0k5NDVHKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0g Zml4ZWRfNDAwbWh6X2dldF9jZGNsazsKLQllbHNlIGlmIChJU19JOTE1R00oZGV2X3ByaXYpKQot CQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBpOTE1Z21fZ2V0X2NkY2xrOwotCWVsc2Ug aWYgKElTX0k5MTVHKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0g Zml4ZWRfMzMzbWh6X2dldF9jZGNsazsKLQllbHNlIGlmIChJU19JODY1RyhkZXZfcHJpdikpCi0J CWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGZpeGVkXzI2Nm1oel9nZXRfY2RjbGs7Ci0J ZWxzZSBpZiAoSVNfSTg1WChkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNs ayA9IGk4NXhfZ2V0X2NkY2xrOwotCWVsc2UgIGlmIChJU19JODQ1RyhkZXZfcHJpdikpCi0JCWRl dl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGZpeGVkXzIwMG1oel9nZXRfY2RjbGs7Ci0JZWxz ZSB7IC8qIDgzMCAqLwotCQlXQVJOKCFJU19JODMwKGRldl9wcml2KSwgIlVua25vd24gcGxhdGZv cm0uIEFzc3VtaW5nIDEzMyBNSHogQ0RDTEtcbiIpOwotCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRf Y2RjbGsgPSBmaXhlZF8xMzNtaHpfZ2V0X2NkY2xrOwotCX0KLQogCWlmIChJU19HRU41KGRldl9w cml2KSkgewogCQlkZXZfcHJpdi0+ZGlzcGxheS5mZGlfbGlua190cmFpbiA9IGlyb25sYWtlX2Zk aV9saW5rX3RyYWluOwogCX0gZWxzZSBpZiAoSVNfR0VONihkZXZfcHJpdikpIHsKQEAgLTE2Mjk1 LDI4ICsxNDYyOCw2IEBAIHZvaWQgaW50ZWxfaW5pdF9kaXNwbGF5X2hvb2tzKHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdikKIAkJZGV2X3ByaXYtPmRpc3BsYXkuZmRpX2xpbmtfdHJh aW4gPSBoc3dfZmRpX2xpbmtfdHJhaW47CiAJfQogCi0JaWYgKElTX0JST0FEV0VMTChkZXZfcHJp dikpIHsKLQkJZGV2X3ByaXYtPmRpc3BsYXkubW9kZXNldF9jb21taXRfY2RjbGsgPQotCQkJYnJv YWR3ZWxsX21vZGVzZXRfY29tbWl0X2NkY2xrOwotCQlkZXZfcHJpdi0+ZGlzcGxheS5tb2Rlc2V0 X2NhbGNfY2RjbGsgPQotCQkJYnJvYWR3ZWxsX21vZGVzZXRfY2FsY19jZGNsazsKLQl9IGVsc2Ug aWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYpIHx8IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKSB7 Ci0JCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY29tbWl0X2NkY2xrID0KLQkJCXZhbGxleXZp ZXdfbW9kZXNldF9jb21taXRfY2RjbGs7Ci0JCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY2Fs Y19jZGNsayA9Ci0JCQl2YWxsZXl2aWV3X21vZGVzZXRfY2FsY19jZGNsazsKLQl9IGVsc2UgaWYg KElTX0dFTjlfTFAoZGV2X3ByaXYpKSB7Ci0JCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY29t bWl0X2NkY2xrID0KLQkJCWJ4dF9tb2Rlc2V0X2NvbW1pdF9jZGNsazsKLQkJZGV2X3ByaXYtPmRp c3BsYXkubW9kZXNldF9jYWxjX2NkY2xrID0KLQkJCWJ4dF9tb2Rlc2V0X2NhbGNfY2RjbGs7Ci0J fSBlbHNlIGlmIChJU19HRU45X0JDKGRldl9wcml2KSkgewotCQlkZXZfcHJpdi0+ZGlzcGxheS5t b2Rlc2V0X2NvbW1pdF9jZGNsayA9Ci0JCQlza2xfbW9kZXNldF9jb21taXRfY2RjbGs7Ci0JCWRl dl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY2FsY19jZGNsayA9Ci0JCQlza2xfbW9kZXNldF9jYWxj X2NkY2xrOwotCX0KLQogCWlmIChkZXZfcHJpdi0+aW5mby5nZW4gPj0gOSkKIAkJZGV2X3ByaXYt PmRpc3BsYXkudXBkYXRlX2NydGNzID0gc2tsX3VwZGF0ZV9jcnRjczsKIAllbHNlCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaCBiL2RyaXZlcnMvZ3B1L2RybS9p OTE1L2ludGVsX2Rydi5oCmluZGV4IGUxZGJkOWFhNTcwMS4uNGJkYjFmM2NiMGI1IDEwMDY0NAot LS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kcnYuaAorKysgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9kcnYuaApAQCAtMTI0NiwxMiArMTI0NiwxOSBAQCB2b2lkIGludGVsX2F1 ZGlvX2NvZGVjX2Rpc2FibGUoc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29kZXIpOwogdm9pZCBp OTE1X2F1ZGlvX2NvbXBvbmVudF9pbml0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp dik7CiB2b2lkIGk5MTVfYXVkaW9fY29tcG9uZW50X2NsZWFudXAoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2KTsKIAorLyogaW50ZWxfY2RjbGsuYyAqLwordm9pZCBpbnRlbF9pbml0 X2NkY2xrX2hvb2tzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cit2b2lkIGlu dGVsX3VwZGF0ZV9tYXhfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsK K3ZvaWQgaW50ZWxfdXBkYXRlX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp dik7Cit2b2lkIGludGVsX3VwZGF0ZV9yYXdjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2KTsKKwogLyogaW50ZWxfZGlzcGxheS5jICovCiBlbnVtIHRyYW5zY29kZXIgaW50ZWxf Y3J0Y19wY2hfdHJhbnNjb2RlcihzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0Yyk7Ci12b2lkIHNrbF9z ZXRfcHJlZmVycmVkX2NkY2xrX3ZjbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYs IGludCB2Y28pOwogdm9pZCBpbnRlbF91cGRhdGVfcmF3Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdik7CiBpbnQgdmx2X2dldF9jY2tfY2xvY2soc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2LAogCQkgICAgICBjb25zdCBjaGFyICpuYW1lLCB1MzIgcmVnLCBpbnQg cmVmX2ZyZXEpOworaW50IHZsdl9nZXRfY2NrX2Nsb2NrX2hwbGwoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2LAorCQkJICAgY29uc3QgY2hhciAqbmFtZSwgdTMyIHJlZyk7CiB2b2lk IGxwdF9kaXNhYmxlX3BjaF90cmFuc2NvZGVyKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdik7CiB2b2lkIGxwdF9kaXNhYmxlX2ljbGtpcChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYpOwogZXh0ZXJuIGNvbnN0IHN0cnVjdCBkcm1fcGxhbmVfZnVuY3MgaW50ZWxfcGxh bmVfZnVuY3M7Ci0tIAoyLjEwLjIKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVk ZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2ludGVsLWdmeAo=