From mboxrd@z Thu Jan 1 00:00:00 1970 From: ville.syrjala@linux.intel.com Subject: [PATCH v3 05/14] drm/i915: Move most cdclk/rawclk related code to intel_cdclk.c Date: Thu, 26 Jan 2017 21:51:34 +0200 Message-ID: <20170126195134.32543-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 mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 74DD9895B6 for ; Thu, 26 Jan 2017 19:51:38 +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 ZXIpCnYzOiBEZWFsIHdpdGggSVNfR0VOOV9CQygpCgpTaWduZWQtb2ZmLWJ5OiBWaWxsZSBTeXJq w6Rsw6QgPHZpbGxlLnN5cmphbGFAbGludXguaW50ZWwuY29tPgpSZXZpZXdlZC1ieTogQW5kZXIg Q29uc2VsdmFuIGRlIE9saXZlaXJhIDxjb25zZWx2YW4yQGdtYWlsLmNvbT4KLS0tCiBEb2N1bWVu dGF0aW9uL2dwdS9pOTE1LnJzdCAgICAgICAgICAgfCAgICA5ICsKIGRyaXZlcnMvZ3B1L2RybS9p OTE1L01ha2VmaWxlICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxf Y2RjbGsuYyAgIHwgMTc3NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMgfCAyMTE3ICsrKystLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2Rydi5oICAgICB8ICAgIDkg Ky0KIDUgZmlsZXMgY2hhbmdlZCwgMjAxNyBpbnNlcnRpb25zKCspLCAxODk0IGRlbGV0aW9ucygt KQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NkY2xrLmMK CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwdS9pOTE1LnJzdCBiL0RvY3VtZW50YXRpb24v Z3B1L2k5MTUucnN0CmluZGV4IDEwNDI5NmRmZmFkMS4uMWNkMGVlNTE4ZGVlIDEwMDY0NAotLS0g YS9Eb2N1bWVudGF0aW9uL2dwdS9pOTE1LnJzdAorKysgYi9Eb2N1bWVudGF0aW9uL2dwdS9pOTE1 LnJzdApAQCAtMjEzLDYgKzIxMywxNSBAQCBWaWRlbyBCSU9TIFRhYmxlIChWQlQpCiAuLiBrZXJu ZWwtZG9jOjogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfdmJ0X2RlZnMuaAogICAgOmludGVy bmFsOgogCitEaXNwbGF5IGNsb2NrcworLS0tLS0tLS0tLS0tLS0KKworLi4ga2VybmVsLWRvYzo6 IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NkY2xrLmMKKyAgIDpkb2M6IENEQ0xLIC8gUkFX Q0xLCisKKy4uIGtlcm5lbC1kb2M6OiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jZGNsay5j CisgICA6aW50ZXJuYWw6CisKIERpc3BsYXkgUExMcwogLS0tLS0tLS0tLS0tCiAKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv TWFrZWZpbGUKaW5kZXggNzRjYTJlOGIyNDk0Li5lNThmYzhmMWI4M2IgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01h a2VmaWxlCkBAIC03Miw2ICs3Miw3IEBAIGk5MTUteSArPSBpbnRlbF9hdWRpby5vIFwKIAkgIGlu dGVsX2F0b21pYy5vIFwKIAkgIGludGVsX2F0b21pY19wbGFuZS5vIFwKIAkgIGludGVsX2Jpb3Mu byBcCisJICBpbnRlbF9jZGNsay5vIFwKIAkgIGludGVsX2NvbG9yLm8gXAogCSAgaW50ZWxfZGlz cGxheS5vIFwKIAkgIGludGVsX2RwaW9fcGh5Lm8gXApkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfY2RjbGsuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2NkY2xr LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi45MjhhMjMzMGFiNTcK LS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9jZGNsay5jCkBA IC0wLDAgKzEsMTc3NSBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAyMDA2LTIwMTcgSW50ZWwgQ29y cG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNo YXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJl IGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAq IHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3 aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1l cmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29w aWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisg KiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2lu ZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlz IHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hh bGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0 aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMi LCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJ TkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJ TElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5H RU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhP TERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJ TElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNF LCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZU V0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSCisgKiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCisg Ki8KKworI2luY2x1ZGUgImludGVsX2Rydi5oIgorCisvKioKKyAqIERPQzogQ0RDTEsgLyBSQVdD TEsKKyAqCisgKiBUaGUgZGlzcGxheSBlbmdpbmUgdXNlcyBzZXZlcmFsIGRpZmZlcmVudCBjbG9j a3MgdG8gZG8gaXRzIHdvcmsuIFRoZXJlCisgKiBhcmUgdHdvIG1haW4gY2xvY2tzIGludm9sdmVk IHRoYXQgYXJlbid0IGRpcmVjdGx5IHJlbGF0ZWQgdG8gdGhlIGFjdHVhbAorICogcGl4ZWwgY2xv Y2sgb3IgYW55IHN5bWJvbC9iaXQgY2xvY2sgb2YgdGhlIGFjdHVhbCBvdXRwdXQgcG9ydC4gVGhl c2UKKyAqIGFyZSB0aGUgY29yZSBkaXNwbGF5IGNsb2NrIChDRENMSykgYW5kIFJBV0NMSy4KKyAq CisgKiBDRENMSyBjbG9ja3MgbW9zdCBvZiB0aGUgZGlzcGxheSBwaXBlIGxvZ2ljLCBhbmQgdGh1 cyBpdHMgZnJlcXVlbmN5CisgKiBtdXN0IGJlIGhpZ2ggZW5vdWdoIHRvIHN1cHBvcnQgdGhlIHJh dGUgYXQgd2hpY2ggcGl4ZWxzIGFyZSBmbG93aW5nCisgKiB0aHJvdWdoIHRoZSBwaXBlcy4gRG93 bnNjYWxpbmcgbXVzdCBhbHNvIGJlIGFjY291bnRlZCBhcyB0aGF0IGluY3JlYXNlcworICogdGhl IGVmZmVjdGl2ZSBwaXhlbCByYXRlLgorICoKKyAqIE9uIHNldmVyYWwgcGxhdGZvcm1zIHRoZSBD RENMSyBmcmVxdWVuY3kgY2FuIGJlIGNoYW5nZWQgZHluYW1pY2FsbHkKKyAqIHRvIG1pbmltaXpl IHBvd2VyIGNvbnN1bXB0aW9uIGZvciBhIGdpdmVuIGRpc3BsYXkgY29uZmlndXJhdGlvbi4KKyAq IFR5cGljYWxseSBjaGFuZ2VzIHRvIHRoZSBDRENMSyBmcmVxdWVuY3kgcmVxdWlyZSBhbGwgdGhl IGRpc3BsYXkgcGlwZXMKKyAqIHRvIGJlIHNodXQgZG93biB3aGlsZSB0aGUgZnJlcXVlbmN5IGlz IGJlaW5nIGNoYW5nZWQuCisgKgorICogT24gU0tMKyB0aGUgRE1DIHdpbGwgdG9nZ2xlIHRoZSBD RENMSyBvZmYvb24gZHVyaW5nIERDNS82IGVudHJ5L2V4aXQuCisgKiBETUMgd2lsbCBub3QgY2hh bmdlIHRoZSBhY3RpdmUgQ0RDTEsgZnJlcXVlbmN5IGhvd2V2ZXIsIHNvIHRoYXQgcGFydAorICog d2lsbCBzdGlsbCBiZSBwZXJmb3JtZWQgYnkgdGhlIGRyaXZlciBkaXJlY3RseS4KKyAqCisgKiBS QVdDTEsgaXMgYSBmaXhlZCBmcmVxdWVuY3kgY2xvY2ssIG9mdGVuIHVzZWQgYnkgdmFyaW91cyBh dXhpbGlhcnkKKyAqIGJsb2NrcyBzdWNoIGFzIEFVWCBDSCBvciBiYWNrbGlnaHQgUFdNLiBIZW5j ZSB0aGUgb25seSB0aGluZyB3ZQorICogcmVhbGx5IG5lZWQgdG8ga25vdyBhYm91dCBSQVdDTEsg aXMgaXRzIGZyZXF1ZW5jeSBzbyB0aGF0IHZhcmlvdXMKKyAqIGRpdmlkZXJzIGNhbiBiZSBwcm9n cmFtbWVkIGNvcnJlY3RseS4KKyAqLworCitzdGF0aWMgaW50IGZpeGVkXzEzM21oel9nZXRfY2Rj bGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiAxMzMzMzM7 Cit9CisKK3N0YXRpYyBpbnQgZml4ZWRfMjAwbWh6X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJcmV0dXJuIDIwMDAwMDsKK30KKworc3RhdGljIGludCBm aXhlZF8yNjZtaHpfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK K3sKKwlyZXR1cm4gMjY2NjY3OworfQorCitzdGF0aWMgaW50IGZpeGVkXzMzM21oel9nZXRfY2Rj bGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXJldHVybiAzMzMzMzM7 Cit9CisKK3N0YXRpYyBpbnQgZml4ZWRfNDAwbWh6X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJcmV0dXJuIDQwMDAwMDsKK30KKworc3RhdGljIGludCBm aXhlZF80NTBtaHpfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK K3sKKwlyZXR1cm4gNDUwMDAwOworfQorCitzdGF0aWMgaW50IGk4NXhfZ2V0X2NkY2xrKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9 IGRldl9wcml2LT5kcm0ucGRldjsKKwl1MTYgaHBsbGNjID0gMDsKKworCS8qCisJICogODUyR00v ODUyR01WIG9ubHkgc3VwcG9ydHMgMTMzIE1IeiBhbmQgdGhlIEhQTExDQworCSAqIGVuY29kaW5n IGlzIGRpZmZlcmVudCA6KAorCSAqIEZJWE1FIGlzIHRoaXMgdGhlIHJpZ2h0IHdheSB0byBkZXRl Y3QgODUyR00vODUyR01WPworCSAqLworCWlmIChwZGV2LT5yZXZpc2lvbiA9PSAweDEpCisJCXJl dHVybiAxMzMzMzM7CisKKwlwY2lfYnVzX3JlYWRfY29uZmlnX3dvcmQocGRldi0+YnVzLAorCQkJ CSBQQ0lfREVWRk4oMCwgMyksIEhQTExDQywgJmhwbGxjYyk7CisKKwkvKiBBc3N1bWUgdGhhdCB0 aGUgaGFyZHdhcmUgaXMgaW4gdGhlIGhpZ2ggc3BlZWQgc3RhdGUuICBUaGlzCisJICogc2hvdWxk IGJlIHRoZSBkZWZhdWx0LgorCSAqLworCXN3aXRjaCAoaHBsbGNjICYgR0NfQ0xPQ0tfQ09OVFJP TF9NQVNLKSB7CisJY2FzZSBHQ19DTE9DS18xMzNfMjAwOgorCWNhc2UgR0NfQ0xPQ0tfMTMzXzIw MF8yOgorCWNhc2UgR0NfQ0xPQ0tfMTAwXzIwMDoKKwkJcmV0dXJuIDIwMDAwMDsKKwljYXNlIEdD X0NMT0NLXzE2Nl8yNTA6CisJCXJldHVybiAyNTAwMDA7CisJY2FzZSBHQ19DTE9DS18xMDBfMTMz OgorCQlyZXR1cm4gMTMzMzMzOworCWNhc2UgR0NfQ0xPQ0tfMTMzXzI2NjoKKwljYXNlIEdDX0NM T0NLXzEzM18yNjZfMjoKKwljYXNlIEdDX0NMT0NLXzE2Nl8yNjY6CisJCXJldHVybiAyNjY2Njc7 CisJfQorCisJLyogU2hvdWxkbid0IGhhcHBlbiAqLworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IGk5MTVnbV9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQor eworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OworCXUxNiBnY2Zn YyA9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBHQ0ZHQywgJmdjZmdjKTsKKwor CWlmIChnY2ZnYyAmIEdDX0xPV19GUkVRVUVOQ1lfRU5BQkxFKQorCQlyZXR1cm4gMTMzMzMzOwor CisJc3dpdGNoIChnY2ZnYyAmIEdDX0RJU1BMQVlfQ0xPQ0tfTUFTSykgeworCWNhc2UgR0NfRElT UExBWV9DTE9DS18zMzNfTUhaOgorCQlyZXR1cm4gMzMzMzMzOworCWRlZmF1bHQ6CisJY2FzZSBH Q19ESVNQTEFZX0NMT0NLXzE5MF8yMDBfTUhaOgorCQlyZXR1cm4gMTkwMDAwOworCX0KK30KKwor c3RhdGljIHVuc2lnbmVkIGludCBpbnRlbF9ocGxsX3ZjbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYpCit7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBibGJfdmNvWzhdID0g eworCQlbMF0gPSAzMjAwMDAwLAorCQlbMV0gPSA0MDAwMDAwLAorCQlbMl0gPSA1MzMzMzMzLAor CQlbM10gPSA0ODAwMDAwLAorCQlbNF0gPSA2NDAwMDAwLAorCX07CisJc3RhdGljIGNvbnN0IHVu c2lnbmVkIGludCBwbnZfdmNvWzhdID0geworCQlbMF0gPSAzMjAwMDAwLAorCQlbMV0gPSA0MDAw MDAwLAorCQlbMl0gPSA1MzMzMzMzLAorCQlbM10gPSA0ODAwMDAwLAorCQlbNF0gPSAyNjY2NjY3 LAorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBjbF92Y29bOF0gPSB7CisJCVswXSA9 IDMyMDAwMDAsCisJCVsxXSA9IDQwMDAwMDAsCisJCVsyXSA9IDUzMzMzMzMsCisJCVszXSA9IDY0 MDAwMDAsCisJCVs0XSA9IDMzMzMzMzMsCisJCVs1XSA9IDM1NjY2NjcsCisJCVs2XSA9IDQyNjY2 NjcsCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGVsa192Y29bOF0gPSB7CisJCVsw XSA9IDMyMDAwMDAsCisJCVsxXSA9IDQwMDAwMDAsCisJCVsyXSA9IDUzMzMzMzMsCisJCVszXSA9 IDQ4MDAwMDAsCisJfTsKKwlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGN0Z192Y29bOF0gPSB7 CisJCVswXSA9IDMyMDAwMDAsCisJCVsxXSA9IDQwMDAwMDAsCisJCVsyXSA9IDUzMzMzMzMsCisJ CVszXSA9IDY0MDAwMDAsCisJCVs0XSA9IDI2NjY2NjcsCisJCVs1XSA9IDQyNjY2NjcsCisJfTsK Kwljb25zdCB1bnNpZ25lZCBpbnQgKnZjb190YWJsZTsKKwl1bnNpZ25lZCBpbnQgdmNvOworCXVp bnQ4X3QgdG1wID0gMDsKKworCS8qIEZJWE1FIG90aGVyIGNoaXBzZXRzPyAqLworCWlmIChJU19H TTQ1KGRldl9wcml2KSkKKwkJdmNvX3RhYmxlID0gY3RnX3ZjbzsKKwllbHNlIGlmIChJU19HNFgo ZGV2X3ByaXYpKQorCQl2Y29fdGFibGUgPSBlbGtfdmNvOworCWVsc2UgaWYgKElTX0k5NjVHTShk ZXZfcHJpdikpCisJCXZjb190YWJsZSA9IGNsX3ZjbzsKKwllbHNlIGlmIChJU19QSU5FVklFVyhk ZXZfcHJpdikpCisJCXZjb190YWJsZSA9IHBudl92Y287CisJZWxzZSBpZiAoSVNfRzMzKGRldl9w cml2KSkKKwkJdmNvX3RhYmxlID0gYmxiX3ZjbzsKKwllbHNlCisJCXJldHVybiAwOworCisJdG1w ID0gSTkxNV9SRUFEKElTX01PQklMRShkZXZfcHJpdikgPyBIUExMVkNPX01PQklMRSA6IEhQTExW Q08pOworCisJdmNvID0gdmNvX3RhYmxlW3RtcCAmIDB4N107CisJaWYgKHZjbyA9PSAwKQorCQlE Uk1fRVJST1IoIkJhZCBIUExMIFZDTyAoSFBMTFZDTz0weCUwMngpXG4iLCB0bXApOworCWVsc2UK KwkJRFJNX0RFQlVHX0tNUygiSFBMTCBWQ08gJXUga0h6XG4iLCB2Y28pOworCisJcmV0dXJuIHZj bzsKK30KKworc3RhdGljIGludCBnMzNfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRl djsKKwlzdGF0aWMgY29uc3QgdWludDhfdCBkaXZfMzIwMFtdID0geyAxMiwgMTAsICA4LCAgNywg NSwgMTYgfTsKKwlzdGF0aWMgY29uc3QgdWludDhfdCBkaXZfNDAwMFtdID0geyAxNCwgMTIsIDEw LCAgOCwgNiwgMjAgfTsKKwlzdGF0aWMgY29uc3QgdWludDhfdCBkaXZfNDgwMFtdID0geyAyMCwg MTQsIDEyLCAxMCwgOCwgMjQgfTsKKwlzdGF0aWMgY29uc3QgdWludDhfdCBkaXZfNTMzM1tdID0g eyAyMCwgMTYsIDEyLCAxMiwgOCwgMjggfTsKKwljb25zdCB1aW50OF90ICpkaXZfdGFibGU7CisJ dW5zaWduZWQgaW50IGNkY2xrX3NlbCwgdmNvID0gaW50ZWxfaHBsbF92Y28oZGV2X3ByaXYpOwor CXVpbnQxNl90IHRtcCA9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBHQ0ZHQywg JnRtcCk7CisKKwljZGNsa19zZWwgPSAodG1wID4+IDQpICYgMHg3OworCisJaWYgKGNkY2xrX3Nl bCA+PSBBUlJBWV9TSVpFKGRpdl8zMjAwKSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICh2Y28p IHsKKwljYXNlIDMyMDAwMDA6CisJCWRpdl90YWJsZSA9IGRpdl8zMjAwOworCQlicmVhazsKKwlj YXNlIDQwMDAwMDA6CisJCWRpdl90YWJsZSA9IGRpdl80MDAwOworCQlicmVhazsKKwljYXNlIDQ4 MDAwMDA6CisJCWRpdl90YWJsZSA9IGRpdl80ODAwOworCQlicmVhazsKKwljYXNlIDUzMzMzMzM6 CisJCWRpdl90YWJsZSA9IGRpdl81MzMzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGZh aWw7CisJfQorCisJcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKHZjbywgZGl2X3RhYmxlW2NkY2xr X3NlbF0pOworCitmYWlsOgorCURSTV9FUlJPUigiVW5hYmxlIHRvIGRldGVybWluZSBDRENMSy4g SFBMTCBWQ089JXUga0h6LCBDRkdDPTB4JTA4eFxuIiwKKwkJICB2Y28sIHRtcCk7CisJcmV0dXJu IDE5MDQ3NjsKK30KKworc3RhdGljIGludCBwbnZfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdikKK3sKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5k cm0ucGRldjsKKwl1MTYgZ2NmZ2MgPSAwOworCisJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwg R0NGR0MsICZnY2ZnYyk7CisKKwlzd2l0Y2ggKGdjZmdjICYgR0NfRElTUExBWV9DTE9DS19NQVNL KSB7CisJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzI2N19NSFpfUE5WOgorCQlyZXR1cm4gMjY2NjY3 OworCWNhc2UgR0NfRElTUExBWV9DTE9DS18zMzNfTUhaX1BOVjoKKwkJcmV0dXJuIDMzMzMzMzsK KwljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfNDQ0X01IWl9QTlY6CisJCXJldHVybiA0NDQ0NDQ7CisJ Y2FzZSBHQ19ESVNQTEFZX0NMT0NLXzIwMF9NSFpfUE5WOgorCQlyZXR1cm4gMjAwMDAwOworCWRl ZmF1bHQ6CisJCURSTV9FUlJPUigiVW5rbm93biBwbnYgZGlzcGxheSBjb3JlIGNsb2NrIDB4JTA0 eFxuIiwgZ2NmZ2MpOworCWNhc2UgR0NfRElTUExBWV9DTE9DS18xMzNfTUhaX1BOVjoKKwkJcmV0 dXJuIDEzMzMzMzsKKwljYXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMTY3X01IWl9QTlY6CisJCXJldHVy biAxNjY2Njc7CisJfQorfQorCitzdGF0aWMgaW50IGk5NjVnbV9nZXRfY2RjbGsoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2 X3ByaXYtPmRybS5wZGV2OworCXN0YXRpYyBjb25zdCB1aW50OF90IGRpdl8zMjAwW10gPSB7IDE2 LCAxMCwgIDggfTsKKwlzdGF0aWMgY29uc3QgdWludDhfdCBkaXZfNDAwMFtdID0geyAyMCwgMTIs IDEwIH07CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGl2XzUzMzNbXSA9IHsgMjQsIDE2LCAxNCB9 OworCWNvbnN0IHVpbnQ4X3QgKmRpdl90YWJsZTsKKwl1bnNpZ25lZCBpbnQgY2RjbGtfc2VsLCB2 Y28gPSBpbnRlbF9ocGxsX3ZjbyhkZXZfcHJpdik7CisJdWludDE2X3QgdG1wID0gMDsKKworCXBj aV9yZWFkX2NvbmZpZ193b3JkKHBkZXYsIEdDRkdDLCAmdG1wKTsKKworCWNkY2xrX3NlbCA9ICgo dG1wID4+IDgpICYgMHgxZikgLSAxOworCisJaWYgKGNkY2xrX3NlbCA+PSBBUlJBWV9TSVpFKGRp dl8zMjAwKSkKKwkJZ290byBmYWlsOworCisJc3dpdGNoICh2Y28pIHsKKwljYXNlIDMyMDAwMDA6 CisJCWRpdl90YWJsZSA9IGRpdl8zMjAwOworCQlicmVhazsKKwljYXNlIDQwMDAwMDA6CisJCWRp dl90YWJsZSA9IGRpdl80MDAwOworCQlicmVhazsKKwljYXNlIDUzMzMzMzM6CisJCWRpdl90YWJs ZSA9IGRpdl81MzMzOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlnb3RvIGZhaWw7CisJfQorCisJ cmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKHZjbywgZGl2X3RhYmxlW2NkY2xrX3NlbF0pOworCitm YWlsOgorCURSTV9FUlJPUigiVW5hYmxlIHRvIGRldGVybWluZSBDRENMSy4gSFBMTCBWQ089JXUg a0h6LCBDRkdDPTB4JTA0eFxuIiwKKwkJICB2Y28sIHRtcCk7CisJcmV0dXJuIDIwMDAwMDsKK30K Kworc3RhdGljIGludCBnbTQ1X2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYpCit7CisJc3RydWN0IHBjaV9kZXYgKnBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7CisJ dW5zaWduZWQgaW50IGNkY2xrX3NlbCwgdmNvID0gaW50ZWxfaHBsbF92Y28oZGV2X3ByaXYpOwor CXVpbnQxNl90IHRtcCA9IDA7CisKKwlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBHQ0ZHQywg JnRtcCk7CisKKwljZGNsa19zZWwgPSAodG1wID4+IDEyKSAmIDB4MTsKKworCXN3aXRjaCAodmNv KSB7CisJY2FzZSAyNjY2NjY3OgorCWNhc2UgNDAwMDAwMDoKKwljYXNlIDUzMzMzMzM6CisJCXJl dHVybiBjZGNsa19zZWwgPyAzMzMzMzMgOiAyMjIyMjI7CisJY2FzZSAzMjAwMDAwOgorCQlyZXR1 cm4gY2RjbGtfc2VsID8gMzIwMDAwIDogMjI4NTcxOworCWRlZmF1bHQ6CisJCURSTV9FUlJPUigi VW5hYmxlIHRvIGRldGVybWluZSBDRENMSy4gSFBMTCBWQ089JXUsIENGR0M9MHglMDR4XG4iLAor CQkJICB2Y28sIHRtcCk7CisJCXJldHVybiAyMjIyMjI7CisJfQorfQorCitzdGF0aWMgaW50IGhz d19nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXVpbnQz Ml90IGxjcGxsID0gSTkxNV9SRUFEKExDUExMX0NUTCk7CisJdWludDMyX3QgZnJlcSA9IGxjcGxs ICYgTENQTExfQ0xLX0ZSRVFfTUFTSzsKKworCWlmIChsY3BsbCAmIExDUExMX0NEX1NPVVJDRV9G Q0xLKQorCQlyZXR1cm4gODAwMDAwOworCWVsc2UgaWYgKEk5MTVfUkVBRChGVVNFX1NUUkFQKSAm IEhTV19DRENMS19MSU1JVCkKKwkJcmV0dXJuIDQ1MDAwMDsKKwllbHNlIGlmIChmcmVxID09IExD UExMX0NMS19GUkVRXzQ1MCkKKwkJcmV0dXJuIDQ1MDAwMDsKKwllbHNlIGlmIChJU19IU1dfVUxU KGRldl9wcml2KSkKKwkJcmV0dXJuIDMzNzUwMDsKKwllbHNlCisJCXJldHVybiA1NDAwMDA7Cit9 CisKK3N0YXRpYyBpbnQgdmx2X2NhbGNfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2LAorCQkJICBpbnQgbWF4X3BpeGNsaykKK3sKKwlpbnQgZnJlcV8zMjAgPSAoZGV2X3By aXYtPmhwbGxfZnJlcSA8PCAgMSkgJSAzMjAwMDAgIT0gMCA/CisJCTMzMzMzMyA6IDMyMDAwMDsK KwlpbnQgbGltaXQgPSBJU19DSEVSUllWSUVXKGRldl9wcml2KSA/IDk1IDogOTA7CisKKwkvKgor CSAqIFdlIHNlZW0gdG8gZ2V0IGFuIHVuc3RhYmxlIG9yIHNvbGlkIGNvbG9yIHBpY3R1cmUgYXQg MjAwTUh6LgorCSAqIE5vdCBzdXJlIHdoYXQncyB3cm9uZy4gRm9yIG5vdyB1c2UgMjAwTUh6IG9u bHkgd2hlbiBhbGwgcGlwZXMKKwkgKiBhcmUgb2ZmLgorCSAqLworCWlmICghSVNfQ0hFUlJZVklF VyhkZXZfcHJpdikgJiYKKwkgICAgbWF4X3BpeGNsayA+IGZyZXFfMzIwKmxpbWl0LzEwMCkKKwkJ cmV0dXJuIDQwMDAwMDsKKwllbHNlIGlmIChtYXhfcGl4Y2xrID4gMjY2NjY3KmxpbWl0LzEwMCkK KwkJcmV0dXJuIGZyZXFfMzIwOworCWVsc2UgaWYgKG1heF9waXhjbGsgPiAwKQorCQlyZXR1cm4g MjY2NjY3OworCWVsc2UKKwkJcmV0dXJuIDIwMDAwMDsKK30KKworc3RhdGljIGludCB2bHZfZ2V0 X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlyZXR1cm4gdmx2 X2dldF9jY2tfY2xvY2tfaHBsbChkZXZfcHJpdiwgImNkY2xrIiwKKwkJCQkgICAgICBDQ0tfRElT UExBWV9DTE9DS19DT05UUk9MKTsKK30KKworc3RhdGljIHZvaWQgdmx2X3Byb2dyYW1fcGZpX2Ny ZWRpdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXVuc2lnbmVkIGlu dCBjcmVkaXRzLCBkZWZhdWx0X2NyZWRpdHM7CisKKwlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJp dikpCisJCWRlZmF1bHRfY3JlZGl0cyA9IFBGSV9DUkVESVQoMTIpOworCWVsc2UKKwkJZGVmYXVs dF9jcmVkaXRzID0gUEZJX0NSRURJVCg4KTsKKworCWlmIChkZXZfcHJpdi0+Y2RjbGtfZnJlcSA+ PSBkZXZfcHJpdi0+Y3pjbGtfZnJlcSkgeworCQkvKiBDSFYgc3VnZ2VzdGVkIHZhbHVlIGlzIDMx IG9yIDYzICovCisJCWlmIChJU19DSEVSUllWSUVXKGRldl9wcml2KSkKKwkJCWNyZWRpdHMgPSBQ RklfQ1JFRElUXzYzOworCQllbHNlCisJCQljcmVkaXRzID0gUEZJX0NSRURJVCgxNSk7CisJfSBl bHNlIHsKKwkJY3JlZGl0cyA9IGRlZmF1bHRfY3JlZGl0czsKKwl9CisKKwkvKgorCSAqIFdBIC0g d3JpdGUgZGVmYXVsdCBjcmVkaXRzIGJlZm9yZSByZS1wcm9ncmFtbWluZworCSAqIEZJWE1FOiBz aG91bGQgd2UgYWxzbyBzZXQgdGhlIHJlc2VuZCBiaXQgaGVyZT8KKwkgKi8KKwlJOTE1X1dSSVRF KEdDSV9DT05UUk9MLCBWR0FfRkFTVF9NT0RFX0RJU0FCTEUgfAorCQkgICBkZWZhdWx0X2NyZWRp dHMpOworCisJSTkxNV9XUklURShHQ0lfQ09OVFJPTCwgVkdBX0ZBU1RfTU9ERV9ESVNBQkxFIHwK KwkJICAgY3JlZGl0cyB8IFBGSV9DUkVESVRfUkVTRU5EKTsKKworCS8qCisJICogRklYTUUgaXMg dGhpcyBndWFyYW50ZWVkIHRvIGNsZWFyCisJICogaW1tZWRpYXRlbHkgb3Igc2hvdWxkIHdlIHBv bGwgZm9yIGl0PworCSAqLworCVdBUk5fT04oSTkxNV9SRUFEKEdDSV9DT05UUk9MKSAmIFBGSV9D UkVESVRfUkVTRU5EKTsKK30KKworc3RhdGljIHZvaWQgdmx2X3NldF9jZGNsayhzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCBpbnQgY2RjbGspCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gdG9faTkxNShkZXYpOworCXUzMiB2YWwsIGNtZDsKKworCVdBUk5fT04oZGV2X3By aXYtPmRpc3BsYXkuZ2V0X2NkY2xrKGRldl9wcml2KSAhPSBkZXZfcHJpdi0+Y2RjbGtfZnJlcSk7 CisKKwlpZiAoY2RjbGsgPj0gMzIwMDAwKSAvKiBqdW1wIHRvIGhpZ2hlc3Qgdm9sdGFnZSBmb3Ig NDAwTUh6IHRvbyAqLworCQljbWQgPSAyOworCWVsc2UgaWYgKGNkY2xrID09IDI2NjY2NykKKwkJ Y21kID0gMTsKKwllbHNlCisJCWNtZCA9IDA7CisKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBz Lmh3X2xvY2spOworCXZhbCA9IHZsdl9wdW5pdF9yZWFkKGRldl9wcml2LCBQVU5JVF9SRUdfRFNQ RlJFUSk7CisJdmFsICY9IH5EU1BGUkVRR1VBUl9NQVNLOworCXZhbCB8PSAoY21kIDw8IERTUEZS RVFHVUFSX1NISUZUKTsKKwl2bHZfcHVuaXRfd3JpdGUoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BG UkVRLCB2YWwpOworCWlmICh3YWl0X2Zvcigodmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklU X1JFR19EU1BGUkVRKSAmCisJCSAgICAgIERTUEZSRVFTVEFUX01BU0spID09IChjbWQgPDwgRFNQ RlJFUVNUQVRfU0hJRlQpLAorCQkgICAgIDUwKSkgeworCQlEUk1fRVJST1IoInRpbWVkIG91dCB3 YWl0aW5nIGZvciBDRGNsayBjaGFuZ2VcbiIpOworCX0KKwltdXRleF91bmxvY2soJmRldl9wcml2 LT5ycHMuaHdfbG9jayk7CisKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+c2JfbG9jayk7CisKKwlp ZiAoY2RjbGsgPT0gNDAwMDAwKSB7CisJCXUzMiBkaXZpZGVyOworCisJCWRpdmlkZXIgPSBESVZf Uk9VTkRfQ0xPU0VTVChkZXZfcHJpdi0+aHBsbF9mcmVxIDw8IDEsCisJCQkJCSAgICBjZGNsaykg LSAxOworCisJCS8qIGFkanVzdCBjZGNsayBkaXZpZGVyICovCisJCXZhbCA9IHZsdl9jY2tfcmVh ZChkZXZfcHJpdiwgQ0NLX0RJU1BMQVlfQ0xPQ0tfQ09OVFJPTCk7CisJCXZhbCAmPSB+Q0NLX0ZS RVFVRU5DWV9WQUxVRVM7CisJCXZhbCB8PSBkaXZpZGVyOworCQl2bHZfY2NrX3dyaXRlKGRldl9w cml2LCBDQ0tfRElTUExBWV9DTE9DS19DT05UUk9MLCB2YWwpOworCisJCWlmICh3YWl0X2Zvcigo dmx2X2Nja19yZWFkKGRldl9wcml2LCBDQ0tfRElTUExBWV9DTE9DS19DT05UUk9MKSAmCisJCQkg ICAgICBDQ0tfRlJFUVVFTkNZX1NUQVRVUykgPT0gKGRpdmlkZXIgPDwgQ0NLX0ZSRVFVRU5DWV9T VEFUVVNfU0hJRlQpLAorCQkJICAgICA1MCkpCisJCQlEUk1fRVJST1IoInRpbWVkIG91dCB3YWl0 aW5nIGZvciBDRGNsayBjaGFuZ2VcbiIpOworCX0KKworCS8qIGFkanVzdCBzZWxmLXJlZnJlc2gg ZXhpdCBsYXRlbmN5IHZhbHVlICovCisJdmFsID0gdmx2X2J1bml0X3JlYWQoZGV2X3ByaXYsIEJV TklUX1JFR19CSVNPQyk7CisJdmFsICY9IH4weDdmOworCisJLyoKKwkgKiBGb3IgaGlnaCBiYW5k d2lkdGggY29uZmlncywgd2Ugc2V0IGEgaGlnaGVyIGxhdGVuY3kgaW4gdGhlIGJ1bml0CisJICog c28gdGhhdCB0aGUgY29yZSBkaXNwbGF5IGZldGNoIGhhcHBlbnMgaW4gdGltZSB0byBhdm9pZCB1 bmRlcnJ1bnMuCisJICovCisJaWYgKGNkY2xrID09IDQwMDAwMCkKKwkJdmFsIHw9IDQ1MDAgLyAy NTA7IC8qIDQuNSB1c2VjICovCisJZWxzZQorCQl2YWwgfD0gMzAwMCAvIDI1MDsgLyogMy4wIHVz ZWMgKi8KKwl2bHZfYnVuaXRfd3JpdGUoZGV2X3ByaXYsIEJVTklUX1JFR19CSVNPQywgdmFsKTsK KworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnNiX2xvY2spOworCisJaW50ZWxfdXBkYXRlX2Nk Y2xrKGRldl9wcml2KTsKK30KKworc3RhdGljIHZvaWQgY2h2X3NldF9jZGNsayhzdHJ1Y3QgZHJt X2RldmljZSAqZGV2LCBpbnQgY2RjbGspCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gdG9faTkxNShkZXYpOworCXUzMiB2YWwsIGNtZDsKKworCVdBUk5fT04oZGV2X3By aXYtPmRpc3BsYXkuZ2V0X2NkY2xrKGRldl9wcml2KSAhPSBkZXZfcHJpdi0+Y2RjbGtfZnJlcSk7 CisKKwlzd2l0Y2ggKGNkY2xrKSB7CisJY2FzZSAzMzMzMzM6CisJY2FzZSAzMjAwMDA6CisJY2Fz ZSAyNjY2Njc6CisJY2FzZSAyMDAwMDA6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCU1JU1NJTkdf Q0FTRShjZGNsayk7CisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIFNwZWNzIGFyZSBmdWxsIG9m IG1pc2luZm9ybWF0aW9uLCBidXQgdGVzdGluZyBvbiBhY3R1YWwKKwkgKiBoYXJkd2FyZSBoYXMg c2hvd24gdGhhdCB3ZSBqdXN0IG5lZWQgdG8gd3JpdGUgdGhlIGRlc2lyZWQKKwkgKiBDQ0sgZGl2 aWRlciBpbnRvIHRoZSBQdW5pdCByZWdpc3Rlci4KKwkgKi8KKwljbWQgPSBESVZfUk9VTkRfQ0xP U0VTVChkZXZfcHJpdi0+aHBsbF9mcmVxIDw8IDEsIGNkY2xrKSAtIDE7CisKKwltdXRleF9sb2Nr KCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCXZhbCA9IHZsdl9wdW5pdF9yZWFkKGRldl9wcml2 LCBQVU5JVF9SRUdfRFNQRlJFUSk7CisJdmFsICY9IH5EU1BGUkVRR1VBUl9NQVNLX0NIVjsKKwl2 YWwgfD0gKGNtZCA8PCBEU1BGUkVRR1VBUl9TSElGVF9DSFYpOworCXZsdl9wdW5pdF93cml0ZShk ZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEsIHZhbCk7CisJaWYgKHdhaXRfZm9yKCh2bHZfcHVu aXRfcmVhZChkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEpICYKKwkJICAgICAgRFNQRlJFUVNU QVRfTUFTS19DSFYpID09IChjbWQgPDwgRFNQRlJFUVNUQVRfU0hJRlRfQ0hWKSwKKwkJICAgICA1 MCkpIHsKKwkJRFJNX0VSUk9SKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgQ0RjbGsgY2hhbmdlXG4i KTsKKwl9CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCisJaW50ZWxf dXBkYXRlX2NkY2xrKGRldl9wcml2KTsKK30KKworc3RhdGljIGludCBiZHdfY2FsY19jZGNsayhp bnQgbWF4X3BpeGNsaykKK3sKKwlpZiAobWF4X3BpeGNsayA+IDU0MDAwMCkKKwkJcmV0dXJuIDY3 NTAwMDsKKwllbHNlIGlmIChtYXhfcGl4Y2xrID4gNDUwMDAwKQorCQlyZXR1cm4gNTQwMDAwOwor CWVsc2UgaWYgKG1heF9waXhjbGsgPiAzMzc1MDApCisJCXJldHVybiA0NTAwMDA7CisJZWxzZQor CQlyZXR1cm4gMzM3NTAwOworfQorCitzdGF0aWMgaW50IGJkd19nZXRfY2RjbGsoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXVpbnQzMl90IGxjcGxsID0gSTkxNV9SRUFE KExDUExMX0NUTCk7CisJdWludDMyX3QgZnJlcSA9IGxjcGxsICYgTENQTExfQ0xLX0ZSRVFfTUFT SzsKKworCWlmIChsY3BsbCAmIExDUExMX0NEX1NPVVJDRV9GQ0xLKQorCQlyZXR1cm4gODAwMDAw OworCWVsc2UgaWYgKEk5MTVfUkVBRChGVVNFX1NUUkFQKSAmIEhTV19DRENMS19MSU1JVCkKKwkJ cmV0dXJuIDQ1MDAwMDsKKwllbHNlIGlmIChmcmVxID09IExDUExMX0NMS19GUkVRXzQ1MCkKKwkJ cmV0dXJuIDQ1MDAwMDsKKwllbHNlIGlmIChmcmVxID09IExDUExMX0NMS19GUkVRXzU0T19CRFcp CisJCXJldHVybiA1NDAwMDA7CisJZWxzZSBpZiAoZnJlcSA9PSBMQ1BMTF9DTEtfRlJFUV8zMzdf NV9CRFcpCisJCXJldHVybiAzMzc1MDA7CisJZWxzZQorCQlyZXR1cm4gNjc1MDAwOworfQorCitz dGF0aWMgdm9pZCBiZHdfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjZGNs aykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7 CisJdWludDMyX3QgdmFsLCBkYXRhOworCWludCByZXQ7CisKKwlpZiAoV0FSTigoSTkxNV9SRUFE KExDUExMX0NUTCkgJgorCQkgIChMQ1BMTF9QTExfRElTQUJMRSB8IExDUExMX1BMTF9MT0NLIHwK KwkJICAgTENQTExfQ0RfQ0xPQ0tfRElTQUJMRSB8IExDUExMX1JPT1RfQ0RfQ0xPQ0tfRElTQUJM RSB8CisJCSAgIExDUExMX0NEMlhfQ0xPQ0tfRElTQUJMRSB8IExDUExMX1BPV0VSX0RPV05fQUxM T1cgfAorCQkgICBMQ1BMTF9DRF9TT1VSQ0VfRkNMSykpICE9IExDUExMX1BMTF9MT0NLLAorCQkg InRyeWluZyB0byBjaGFuZ2UgY2RjbGsgZnJlcXVlbmN5IHdpdGggY2RjbGsgbm90IGVuYWJsZWRc biIpKQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwor CXJldCA9IHNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKGRldl9wcml2LAorCQkJCSAgICAgIEJEV19Q Q09ERV9ESVNQTEFZX0ZSRVFfQ0hBTkdFX1JFUSwgMHgwKTsKKwltdXRleF91bmxvY2soJmRldl9w cml2LT5ycHMuaHdfbG9jayk7CisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoImZhaWxlZCB0byBp bmZvcm0gcGNvZGUgYWJvdXQgY2RjbGsgY2hhbmdlXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXZh bCA9IEk5MTVfUkVBRChMQ1BMTF9DVEwpOworCXZhbCB8PSBMQ1BMTF9DRF9TT1VSQ0VfRkNMSzsK KwlJOTE1X1dSSVRFKExDUExMX0NUTCwgdmFsKTsKKworCWlmICh3YWl0X2Zvcl91cyhJOTE1X1JF QUQoTENQTExfQ1RMKSAmCisJCQlMQ1BMTF9DRF9TT1VSQ0VfRkNMS19ET05FLCAxKSkKKwkJRFJN X0VSUk9SKCJTd2l0Y2hpbmcgdG8gRkNMSyBmYWlsZWRcbiIpOworCisJdmFsID0gSTkxNV9SRUFE KExDUExMX0NUTCk7CisJdmFsICY9IH5MQ1BMTF9DTEtfRlJFUV9NQVNLOworCisJc3dpdGNoIChj ZGNsaykgeworCWNhc2UgNDUwMDAwOgorCQl2YWwgfD0gTENQTExfQ0xLX0ZSRVFfNDUwOworCQlk YXRhID0gMDsKKwkJYnJlYWs7CisJY2FzZSA1NDAwMDA6CisJCXZhbCB8PSBMQ1BMTF9DTEtfRlJF UV81NE9fQkRXOworCQlkYXRhID0gMTsKKwkJYnJlYWs7CisJY2FzZSAzMzc1MDA6CisJCXZhbCB8 PSBMQ1BMTF9DTEtfRlJFUV8zMzdfNV9CRFc7CisJCWRhdGEgPSAyOworCQlicmVhazsKKwljYXNl IDY3NTAwMDoKKwkJdmFsIHw9IExDUExMX0NMS19GUkVRXzY3NV9CRFc7CisJCWRhdGEgPSAzOwor CQlicmVhazsKKwlkZWZhdWx0OgorCQlXQVJOKDEsICJpbnZhbGlkIGNkY2xrIGZyZXF1ZW5jeVxu Iik7CisJCXJldHVybjsKKwl9CisKKwlJOTE1X1dSSVRFKExDUExMX0NUTCwgdmFsKTsKKworCXZh bCA9IEk5MTVfUkVBRChMQ1BMTF9DVEwpOworCXZhbCAmPSB+TENQTExfQ0RfU09VUkNFX0ZDTEs7 CisJSTkxNV9XUklURShMQ1BMTF9DVEwsIHZhbCk7CisKKwlpZiAod2FpdF9mb3JfdXMoKEk5MTVf UkVBRChMQ1BMTF9DVEwpICYKKwkJCUxDUExMX0NEX1NPVVJDRV9GQ0xLX0RPTkUpID09IDAsIDEp KQorCQlEUk1fRVJST1IoIlN3aXRjaGluZyBiYWNrIHRvIExDUExMIGZhaWxlZFxuIik7CisKKwlt dXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCXNhbmR5YnJpZGdlX3Bjb2RlX3dy aXRlKGRldl9wcml2LCBIU1dfUENPREVfREVfV1JJVEVfRlJFUV9SRVEsIGRhdGEpOworCW11dGV4 X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKworCUk5MTVfV1JJVEUoQ0RDTEtfRlJF USwgRElWX1JPVU5EX0NMT1NFU1QoY2RjbGssIDEwMDApIC0gMSk7CisKKwlpbnRlbF91cGRhdGVf Y2RjbGsoZGV2X3ByaXYpOworCisJV0FSTihjZGNsayAhPSBkZXZfcHJpdi0+Y2RjbGtfZnJlcSwK KwkgICAgICJjZGNsayByZXF1ZXN0ZWQgJWQga0h6IGJ1dCBnb3QgJWQga0h6XG4iLAorCSAgICAg Y2RjbGssIGRldl9wcml2LT5jZGNsa19mcmVxKTsKK30KKworc3RhdGljIGludCBza2xfY2FsY19j ZGNsayhpbnQgbWF4X3BpeGNsaywgaW50IHZjbykKK3sKKwlpZiAodmNvID09IDg2NDAwMDApIHsK KwkJaWYgKG1heF9waXhjbGsgPiA1NDAwMDApCisJCQlyZXR1cm4gNjE3MTQzOworCQllbHNlIGlm IChtYXhfcGl4Y2xrID4gNDMyMDAwKQorCQkJcmV0dXJuIDU0MDAwMDsKKwkJZWxzZSBpZiAobWF4 X3BpeGNsayA+IDMwODU3MSkKKwkJCXJldHVybiA0MzIwMDA7CisJCWVsc2UKKwkJCXJldHVybiAz MDg1NzE7CisJfSBlbHNlIHsKKwkJaWYgKG1heF9waXhjbGsgPiA1NDAwMDApCisJCQlyZXR1cm4g Njc1MDAwOworCQllbHNlIGlmIChtYXhfcGl4Y2xrID4gNDUwMDAwKQorCQkJcmV0dXJuIDU0MDAw MDsKKwkJZWxzZSBpZiAobWF4X3BpeGNsayA+IDMzNzUwMCkKKwkJCXJldHVybiA0NTAwMDA7CisJ CWVsc2UKKwkJCXJldHVybiAzMzc1MDA7CisJfQorfQorCitzdGF0aWMgdm9pZCBza2xfZHBsbDBf dXBkYXRlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1MzIgdmFsOwor CisJZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYgPSAyNDAwMDsKKwlkZXZfcHJpdi0+Y2RjbGtfcGxs LnZjbyA9IDA7CisKKwl2YWwgPSBJOTE1X1JFQUQoTENQTEwxX0NUTCk7CisJaWYgKCh2YWwgJiBM Q1BMTF9QTExfRU5BQkxFKSA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoV0FSTl9PTigodmFsICYg TENQTExfUExMX0xPQ0spID09IDApKQorCQlyZXR1cm47CisKKwl2YWwgPSBJOTE1X1JFQUQoRFBM TF9DVFJMMSk7CisKKwlpZiAoV0FSTl9PTigodmFsICYgKERQTExfQ1RSTDFfSERNSV9NT0RFKFNL TF9EUExMMCkgfAorCQkJICAgIERQTExfQ1RSTDFfU1NDKFNLTF9EUExMMCkgfAorCQkJICAgIERQ TExfQ1RSTDFfT1ZFUlJJREUoU0tMX0RQTEwwKSkpICE9CisJCSAgICBEUExMX0NUUkwxX09WRVJS SURFKFNLTF9EUExMMCkpKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKHZhbCAmIERQTExfQ1RSTDFf TElOS19SQVRFX01BU0soU0tMX0RQTEwwKSkgeworCWNhc2UgRFBMTF9DVFJMMV9MSU5LX1JBVEUo RFBMTF9DVFJMMV9MSU5LX1JBVEVfODEwLCBTS0xfRFBMTDApOgorCWNhc2UgRFBMTF9DVFJMMV9M SU5LX1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfMTM1MCwgU0tMX0RQTEwwKToKKwljYXNlIERQ TExfQ1RSTDFfTElOS19SQVRFKERQTExfQ1RSTDFfTElOS19SQVRFXzE2MjAsIFNLTF9EUExMMCk6 CisJY2FzZSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktfUkFURV8yNzAwLCBT S0xfRFBMTDApOgorCQlkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9IDgxMDAwMDA7CisJCWJyZWFr OworCWNhc2UgRFBMTF9DVFJMMV9MSU5LX1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfMTA4MCwg U0tMX0RQTEwwKToKKwljYXNlIERQTExfQ1RSTDFfTElOS19SQVRFKERQTExfQ1RSTDFfTElOS19S QVRFXzIxNjAsIFNLTF9EUExMMCk6CisJCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gODY0MDAw MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTUlTU0lOR19DQVNFKHZhbCAmIERQTExfQ1RSTDFf TElOS19SQVRFX01BU0soU0tMX0RQTEwwKSk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGlu dCBza2xfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwl1 MzIgY2RjdGw7CisKKwlza2xfZHBsbDBfdXBkYXRlKGRldl9wcml2KTsKKworCWlmIChkZXZfcHJp di0+Y2RjbGtfcGxsLnZjbyA9PSAwKQorCQlyZXR1cm4gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWY7 CisKKwljZGN0bCA9IEk5MTVfUkVBRChDRENMS19DVEwpOworCisJaWYgKGRldl9wcml2LT5jZGNs a19wbGwudmNvID09IDg2NDAwMDApIHsKKwkJc3dpdGNoIChjZGN0bCAmIENEQ0xLX0ZSRVFfU0VM X01BU0spIHsKKwkJY2FzZSBDRENMS19GUkVRXzQ1MF80MzI6CisJCQlyZXR1cm4gNDMyMDAwOwor CQljYXNlIENEQ0xLX0ZSRVFfMzM3XzMwODoKKwkJCXJldHVybiAzMDg1NzE7CisJCWNhc2UgQ0RD TEtfRlJFUV81NDA6CisJCQlyZXR1cm4gNTQwMDAwOworCQljYXNlIENEQ0xLX0ZSRVFfNjc1XzYx NzoKKwkJCXJldHVybiA2MTcxNDM7CisJCWRlZmF1bHQ6CisJCQlNSVNTSU5HX0NBU0UoY2RjdGwg JiBDRENMS19GUkVRX1NFTF9NQVNLKTsKKwkJfQorCX0gZWxzZSB7CisJCXN3aXRjaCAoY2RjdGwg JiBDRENMS19GUkVRX1NFTF9NQVNLKSB7CisJCWNhc2UgQ0RDTEtfRlJFUV80NTBfNDMyOgorCQkJ cmV0dXJuIDQ1MDAwMDsKKwkJY2FzZSBDRENMS19GUkVRXzMzN18zMDg6CisJCQlyZXR1cm4gMzM3 NTAwOworCQljYXNlIENEQ0xLX0ZSRVFfNTQwOgorCQkJcmV0dXJuIDU0MDAwMDsKKwkJY2FzZSBD RENMS19GUkVRXzY3NV82MTc6CisJCQlyZXR1cm4gNjc1MDAwOworCQlkZWZhdWx0OgorCQkJTUlT U0lOR19DQVNFKGNkY3RsICYgQ0RDTEtfRlJFUV9TRUxfTUFTSyk7CisJCX0KKwl9CisKKwlyZXR1 cm4gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWY7Cit9CisKKy8qIGNvbnZlcnQgZnJvbSBrSHogdG8g LjEgZml4cG9pbnQgTUh6IHdpdGggLTFNSHogb2Zmc2V0ICovCitzdGF0aWMgaW50IHNrbF9jZGNs a19kZWNpbWFsKGludCBjZGNsaykKK3sKKwlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QoY2RjbGsg LSAxMDAwLCA1MDApOworfQorCitzdGF0aWMgdm9pZCBza2xfc2V0X3ByZWZlcnJlZF9jZGNsa192 Y28oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJCQlpbnQgdmNvKQorewor CWJvb2wgY2hhbmdlZCA9IGRldl9wcml2LT5za2xfcHJlZmVycmVkX3Zjb19mcmVxICE9IHZjbzsK KworCWRldl9wcml2LT5za2xfcHJlZmVycmVkX3Zjb19mcmVxID0gdmNvOworCisJaWYgKGNoYW5n ZWQpCisJCWludGVsX3VwZGF0ZV9tYXhfY2RjbGsoZGV2X3ByaXYpOworfQorCitzdGF0aWMgdm9p ZCBza2xfZHBsbDBfZW5hYmxlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50 IHZjbykKK3sKKwlpbnQgbWluX2NkY2xrID0gc2tsX2NhbGNfY2RjbGsoMCwgdmNvKTsKKwl1MzIg dmFsOworCisJV0FSTl9PTih2Y28gIT0gODEwMDAwMCAmJiB2Y28gIT0gODY0MDAwMCk7CisKKwkv KiBzZWxlY3QgdGhlIG1pbmltdW0gQ0RDTEsgYmVmb3JlIGVuYWJsaW5nIERQTEwgMCAqLworCXZh bCA9IENEQ0xLX0ZSRVFfMzM3XzMwOCB8IHNrbF9jZGNsa19kZWNpbWFsKG1pbl9jZGNsayk7CisJ STkxNV9XUklURShDRENMS19DVEwsIHZhbCk7CisJUE9TVElOR19SRUFEKENEQ0xLX0NUTCk7CisK KwkvKgorCSAqIFdlIGFsd2F5cyBlbmFibGUgRFBMTDAgd2l0aCB0aGUgbG93ZXN0IGxpbmsgcmF0 ZSBwb3NzaWJsZSwgYnV0IHN0aWxsCisJICogdGFraW5nIGludG8gYWNjb3VudCB0aGUgVkNPIHJl cXVpcmVkIHRvIG9wZXJhdGUgdGhlIGVEUCBwYW5lbCBhdCB0aGUKKwkgKiBkZXNpcmVkIGZyZXF1 ZW5jeS4gVGhlIHVzdWFsIERQIGxpbmsgcmF0ZXMgb3BlcmF0ZSB3aXRoIGEgVkNPIG9mCisJICog ODEwMCB3aGlsZSB0aGUgZURQIDEuNCBhbHRlcm5hdGUgbGluayByYXRlcyBuZWVkIGEgVkNPIG9m IDg2NDAuCisJICogVGhlIG1vZGVzZXQgY29kZSBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHNlbGVj dGlvbiBvZiB0aGUgZXhhY3QgbGluaworCSAqIHJhdGUgbGF0ZXIgb24sIHdpdGggdGhlIGNvbnN0 cmFpbnQgb2YgY2hvb3NpbmcgYSBmcmVxdWVuY3kgdGhhdAorCSAqIHdvcmtzIHdpdGggdmNvLgor CSAqLworCXZhbCA9IEk5MTVfUkVBRChEUExMX0NUUkwxKTsKKworCXZhbCAmPSB+KERQTExfQ1RS TDFfSERNSV9NT0RFKFNLTF9EUExMMCkgfCBEUExMX0NUUkwxX1NTQyhTS0xfRFBMTDApIHwKKwkJ IERQTExfQ1RSTDFfTElOS19SQVRFX01BU0soU0tMX0RQTEwwKSk7CisJdmFsIHw9IERQTExfQ1RS TDFfT1ZFUlJJREUoU0tMX0RQTEwwKTsKKwlpZiAodmNvID09IDg2NDAwMDApCisJCXZhbCB8PSBE UExMX0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktfUkFURV8xMDgwLAorCQkJCQkgICAg U0tMX0RQTEwwKTsKKwllbHNlCisJCXZhbCB8PSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NU UkwxX0xJTktfUkFURV84MTAsCisJCQkJCSAgICBTS0xfRFBMTDApOworCisJSTkxNV9XUklURShE UExMX0NUUkwxLCB2YWwpOworCVBPU1RJTkdfUkVBRChEUExMX0NUUkwxKTsKKworCUk5MTVfV1JJ VEUoTENQTEwxX0NUTCwgSTkxNV9SRUFEKExDUExMMV9DVEwpIHwgTENQTExfUExMX0VOQUJMRSk7 CisKKwlpZiAoaW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoZGV2X3ByaXYsCisJCQkJICAgIExDUExM MV9DVEwsIExDUExMX1BMTF9MT0NLLCBMQ1BMTF9QTExfTE9DSywKKwkJCQkgICAgNSkpCisJCURS TV9FUlJPUigiRFBMTDAgbm90IGxvY2tlZFxuIik7CisKKwlkZXZfcHJpdi0+Y2RjbGtfcGxsLnZj byA9IHZjbzsKKworCS8qIFdlJ2xsIHdhbnQgdG8ga2VlcCB1c2luZyB0aGUgY3VycmVudCB2Y28g ZnJvbSBub3cgb24uICovCisJc2tsX3NldF9wcmVmZXJyZWRfY2RjbGtfdmNvKGRldl9wcml2LCB2 Y28pOworfQorCitzdGF0aWMgdm9pZCBza2xfZHBsbDBfZGlzYWJsZShzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJSTkxNV9XUklURShMQ1BMTDFfQ1RMLCBJOTE1X1JFQUQo TENQTEwxX0NUTCkgJiB+TENQTExfUExMX0VOQUJMRSk7CisJaWYgKGludGVsX3dhaXRfZm9yX3Jl Z2lzdGVyKGRldl9wcml2LAorCQkJCSAgIExDUExMMV9DVEwsIExDUExMX1BMTF9MT0NLLCAwLAor CQkJCSAgIDEpKQorCQlEUk1fRVJST1IoIkNvdWxkbid0IGRpc2FibGUgRFBMTDBcbiIpOworCisJ ZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSAwOworfQorCitzdGF0aWMgdm9pZCBza2xfc2V0X2Nk Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCSAgaW50IGNkY2xrLCBp bnQgdmNvKQoreworCXUzMiBmcmVxX3NlbGVjdCwgcGN1X2FjazsKKwlpbnQgcmV0OworCisJV0FS Tl9PTigoY2RjbGsgPT0gMjQwMDApICE9ICh2Y28gPT0gMCkpOworCisJRFJNX0RFQlVHX0RSSVZF UigiQ2hhbmdpbmcgQ0RDTEsgdG8gJWQga0h6IChWQ08gJWQga0h6KVxuIiwKKwkJCSBjZGNsaywg dmNvKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7CisJcmV0ID0gc2ts X3Bjb2RlX3JlcXVlc3QoZGV2X3ByaXYsIFNLTF9QQ09ERV9DRENMS19DT05UUk9MLAorCQkJCVNL TF9DRENMS19QUkVQQVJFX0ZPUl9DSEFOR0UsCisJCQkJU0tMX0NEQ0xLX1JFQURZX0ZPUl9DSEFO R0UsCisJCQkJU0tMX0NEQ0xLX1JFQURZX0ZPUl9DSEFOR0UsIDMpOworCW11dGV4X3VubG9jaygm ZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKwlpZiAocmV0KSB7CisJCURSTV9FUlJPUigiRmFpbGVk IHRvIGluZm9ybSBQQ1UgYWJvdXQgY2RjbGsgY2hhbmdlICglZClcbiIsCisJCQkgIHJldCk7CisJ CXJldHVybjsKKwl9CisKKwkvKiBzZXQgQ0RDTEtfQ1RMICovCisJc3dpdGNoIChjZGNsaykgewor CWNhc2UgNDUwMDAwOgorCWNhc2UgNDMyMDAwOgorCQlmcmVxX3NlbGVjdCA9IENEQ0xLX0ZSRVFf NDUwXzQzMjsKKwkJcGN1X2FjayA9IDE7CisJCWJyZWFrOworCWNhc2UgNTQwMDAwOgorCQlmcmVx X3NlbGVjdCA9IENEQ0xLX0ZSRVFfNTQwOworCQlwY3VfYWNrID0gMjsKKwkJYnJlYWs7CisJY2Fz ZSAzMDg1NzE6CisJY2FzZSAzMzc1MDA6CisJZGVmYXVsdDoKKwkJZnJlcV9zZWxlY3QgPSBDRENM S19GUkVRXzMzN18zMDg7CisJCXBjdV9hY2sgPSAwOworCQlicmVhazsKKwljYXNlIDYxNzE0MzoK KwljYXNlIDY3NTAwMDoKKwkJZnJlcV9zZWxlY3QgPSBDRENMS19GUkVRXzY3NV82MTc7CisJCXBj dV9hY2sgPSAzOworCQlicmVhazsKKwl9CisKKwlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28g IT0gMCAmJgorCSAgICBkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSB2Y28pCisJCXNrbF9kcGxs MF9kaXNhYmxlKGRldl9wcml2KTsKKworCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSB2 Y28pCisJCXNrbF9kcGxsMF9lbmFibGUoZGV2X3ByaXYsIHZjbyk7CisKKwlJOTE1X1dSSVRFKENE Q0xLX0NUTCwgZnJlcV9zZWxlY3QgfCBza2xfY2RjbGtfZGVjaW1hbChjZGNsaykpOworCVBPU1RJ TkdfUkVBRChDRENMS19DVEwpOworCisJLyogaW5mb3JtIFBDVSBvZiB0aGUgY2hhbmdlICovCisJ bXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKwlzYW5keWJyaWRnZV9wY29kZV93 cml0ZShkZXZfcHJpdiwgU0tMX1BDT0RFX0NEQ0xLX0NPTlRST0wsIHBjdV9hY2spOworCW11dGV4 X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKKworCWludGVsX3VwZGF0ZV9jZGNsayhk ZXZfcHJpdik7Cit9CisKK3N0YXRpYyB2b2lkIHNrbF9zYW5pdGl6ZV9jZGNsayhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJdWludDMyX3QgY2RjdGwsIGV4cGVjdGVkOwor CisJLyoKKwkgKiBjaGVjayBpZiB0aGUgcHJlLW9zIGluaXRpYWxpemVkIHRoZSBkaXNwbGF5CisJ ICogVGhlcmUgaXMgU1dGMTggc2NyYXRjaHBhZCByZWdpc3RlciBkZWZpbmVkIHdoaWNoIGlzIHNl dCBieSB0aGUKKwkgKiBwcmUtb3Mgd2hpY2ggY2FuIGJlIHVzZWQgYnkgdGhlIE9TIGRyaXZlcnMg dG8gY2hlY2sgdGhlIHN0YXR1cworCSAqLworCWlmICgoSTkxNV9SRUFEKFNXRl9JTEsoMHgxOCkp ICYgMHgwMEZGRkZGRikgPT0gMCkKKwkJZ290byBzYW5pdGl6ZTsKKworCWludGVsX3VwZGF0ZV9j ZGNsayhkZXZfcHJpdik7CisJLyogSXMgUExMIGVuYWJsZWQgYW5kIGxvY2tlZCA/ICovCisJaWYg KGRldl9wcml2LT5jZGNsa19wbGwudmNvID09IDAgfHwKKwkgICAgZGV2X3ByaXYtPmNkY2xrX2Zy ZXEgPT0gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYpCisJCWdvdG8gc2FuaXRpemU7CisKKwkvKiBE UExMIG9rYXk7IHZlcmlmeSB0aGUgY2RjbG9jaworCSAqCisJICogTm90aWNlZCBpbiBzb21lIGlu c3RhbmNlcyB0aGF0IHRoZSBmcmVxIHNlbGVjdGlvbiBpcyBjb3JyZWN0IGJ1dAorCSAqIGRlY2lt YWwgcGFydCBpcyBwcm9ncmFtbWVkIHdyb25nIGZyb20gQklPUyB3aGVyZSBwcmUtb3MgZG9lcyBu b3QKKwkgKiBlbmFibGUgZGlzcGxheS4gVmVyaWZ5IHRoZSBzYW1lIGFzIHdlbGwuCisJICovCisJ Y2RjdGwgPSBJOTE1X1JFQUQoQ0RDTEtfQ1RMKTsKKwlleHBlY3RlZCA9IChjZGN0bCAmIENEQ0xL X0ZSRVFfU0VMX01BU0spIHwKKwkJc2tsX2NkY2xrX2RlY2ltYWwoZGV2X3ByaXYtPmNkY2xrX2Zy ZXEpOworCWlmIChjZGN0bCA9PSBleHBlY3RlZCkKKwkJLyogQWxsIHdlbGw7IG5vdGhpbmcgdG8g c2FuaXRpemUgKi8KKwkJcmV0dXJuOworCitzYW5pdGl6ZToKKwlEUk1fREVCVUdfS01TKCJTYW5p dGl6aW5nIGNkY2xrIHByb2dyYW1tZWQgYnkgcHJlLW9zXG4iKTsKKworCS8qIGZvcmNlIGNkY2xr IHByb2dyYW1taW5nICovCisJZGV2X3ByaXYtPmNkY2xrX2ZyZXEgPSAwOworCS8qIGZvcmNlIGZ1 bGwgUExMIGRpc2FibGUgKyBlbmFibGUgKi8KKwlkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9IC0x OworfQorCisvKioKKyAqIHNrbF9pbml0X2NkY2xrIC0gSW5pdGlhbGl6ZSBDRENMSyBvbiBTS0wK KyAqIEBkZXZfcHJpdjogaTkxNSBkZXZpY2UKKyAqCisgKiBJbml0aWFsaXplIENEQ0xLIGZvciBT S0wgYW5kIGRlcml2YXRpdmVzLiBUaGlzIGlzIGdlbmVyYWxseQorICogZG9uZSBvbmx5IGR1cmlu ZyB0aGUgZGlzcGxheSBjb3JlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLAorICogYWZ0ZXIgd2hp Y2ggdGhlIERNQyB3aWxsIHRha2UgY2FyZSBvZiB0dXJuaW5nIENEQ0xLIG9mZi9vbgorICogYXMg bmVlZGVkLgorICovCit2b2lkIHNrbF9pbml0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKK3sKKwlpbnQgY2RjbGssIHZjbzsKKworCXNrbF9zYW5pdGl6ZV9jZGNsayhk ZXZfcHJpdik7CisKKwlpZiAoZGV2X3ByaXYtPmNkY2xrX2ZyZXEgIT0gMCAmJiBkZXZfcHJpdi0+ Y2RjbGtfcGxsLnZjbyAhPSAwKSB7CisJCS8qCisJCSAqIFVzZSB0aGUgY3VycmVudCB2Y28gYXMg b3VyIGluaXRpYWwKKwkJICogZ3Vlc3MgYXMgdG8gd2hhdCB0aGUgcHJlZmVycmVkIHZjbyBpcy4K KwkJICovCisJCWlmIChkZXZfcHJpdi0+c2tsX3ByZWZlcnJlZF92Y29fZnJlcSA9PSAwKQorCQkJ c2tsX3NldF9wcmVmZXJyZWRfY2RjbGtfdmNvKGRldl9wcml2LAorCQkJCQkJICAgIGRldl9wcml2 LT5jZGNsa19wbGwudmNvKTsKKwkJcmV0dXJuOworCX0KKworCXZjbyA9IGRldl9wcml2LT5za2xf cHJlZmVycmVkX3Zjb19mcmVxOworCWlmICh2Y28gPT0gMCkKKwkJdmNvID0gODEwMDAwMDsKKwlj ZGNsayA9IHNrbF9jYWxjX2NkY2xrKDAsIHZjbyk7CisKKwlza2xfc2V0X2NkY2xrKGRldl9wcml2 LCBjZGNsaywgdmNvKTsKK30KKworLyoqCisgKiBza2xfdW5pbml0X2NkY2xrIC0gVW5pbml0aWFs aXplIENEQ0xLIG9uIFNLTAorICogQGRldl9wcml2OiBpOTE1IGRldmljZQorICoKKyAqIFVuaW5p dGlhbGl6ZSBDRENMSyBmb3IgU0tMIGFuZCBkZXJpdmF0aXZlcy4gVGhpcyBpcyBkb25lIG9ubHkK KyAqIGR1cmluZyB0aGUgZGlzcGxheSBjb3JlIHVuaW5pdGlhbGl6YXRpb24gc2VxdWVuY2UuCisg Ki8KK3ZvaWQgc2tsX3VuaW5pdF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYpCit7CisJc2tsX3NldF9jZGNsayhkZXZfcHJpdiwgZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYs IDApOworfQorCitzdGF0aWMgaW50IGJ4dF9jYWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrKQorewor CWlmIChtYXhfcGl4Y2xrID4gNTc2MDAwKQorCQlyZXR1cm4gNjI0MDAwOworCWVsc2UgaWYgKG1h eF9waXhjbGsgPiAzODQwMDApCisJCXJldHVybiA1NzYwMDA7CisJZWxzZSBpZiAobWF4X3BpeGNs ayA+IDI4ODAwMCkKKwkJcmV0dXJuIDM4NDAwMDsKKwllbHNlIGlmIChtYXhfcGl4Y2xrID4gMTQ0 MDAwKQorCQlyZXR1cm4gMjg4MDAwOworCWVsc2UKKwkJcmV0dXJuIDE0NDAwMDsKK30KKworc3Rh dGljIGludCBnbGtfY2FsY19jZGNsayhpbnQgbWF4X3BpeGNsaykKK3sKKwlpZiAobWF4X3BpeGNs ayA+IDIgKiAxNTg0MDApCisJCXJldHVybiAzMTY4MDA7CisJZWxzZSBpZiAobWF4X3BpeGNsayA+ IDIgKiA3OTIwMCkKKwkJcmV0dXJuIDE1ODQwMDsKKwllbHNlCisJCXJldHVybiA3OTIwMDsKK30K Kworc3RhdGljIGludCBieHRfZGVfcGxsX3ZjbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYsIGludCBjZGNsaykKK3sKKwlpbnQgcmF0aW87CisKKwlpZiAoY2RjbGsgPT0gZGV2X3By aXYtPmNkY2xrX3BsbC5yZWYpCisJCXJldHVybiAwOworCisJc3dpdGNoIChjZGNsaykgeworCWRl ZmF1bHQ6CisJCU1JU1NJTkdfQ0FTRShjZGNsayk7CisJY2FzZSAxNDQwMDA6CisJY2FzZSAyODgw MDA6CisJY2FzZSAzODQwMDA6CisJY2FzZSA1NzYwMDA6CisJCXJhdGlvID0gNjA7CisJCWJyZWFr OworCWNhc2UgNjI0MDAwOgorCQlyYXRpbyA9IDY1OworCQlicmVhazsKKwl9CisKKwlyZXR1cm4g ZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYgKiByYXRpbzsKK30KKworc3RhdGljIGludCBnbGtfZGVf cGxsX3ZjbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBjZGNsaykKK3sK KwlpbnQgcmF0aW87CisKKwlpZiAoY2RjbGsgPT0gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYpCisJ CXJldHVybiAwOworCisJc3dpdGNoIChjZGNsaykgeworCWRlZmF1bHQ6CisJCU1JU1NJTkdfQ0FT RShjZGNsayk7CisJY2FzZSAgNzkyMDA6CisJY2FzZSAxNTg0MDA6CisJY2FzZSAzMTY4MDA6CisJ CXJhdGlvID0gMzM7CisJCWJyZWFrOworCX0KKworCXJldHVybiBkZXZfcHJpdi0+Y2RjbGtfcGxs LnJlZiAqIHJhdGlvOworfQorCitzdGF0aWMgdm9pZCBieHRfZGVfcGxsX3VwZGF0ZShzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJdTMyIHZhbDsKKworCWRldl9wcml2LT5j ZGNsa19wbGwucmVmID0gMTkyMDA7CisJZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSAwOworCisJ dmFsID0gSTkxNV9SRUFEKEJYVF9ERV9QTExfRU5BQkxFKTsKKwlpZiAoKHZhbCAmIEJYVF9ERV9Q TExfUExMX0VOQUJMRSkgPT0gMCkKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT04oKHZhbCAmIEJY VF9ERV9QTExfTE9DSykgPT0gMCkpCisJCXJldHVybjsKKworCXZhbCA9IEk5MTVfUkVBRChCWFRf REVfUExMX0NUTCk7CisJZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSAodmFsICYgQlhUX0RFX1BM TF9SQVRJT19NQVNLKSAqCisJCWRldl9wcml2LT5jZGNsa19wbGwucmVmOworfQorCitzdGF0aWMg aW50IGJ4dF9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQorewor CXUzMiBkaXZpZGVyOworCWludCBkaXYsIHZjbzsKKworCWJ4dF9kZV9wbGxfdXBkYXRlKGRldl9w cml2KTsKKworCXZjbyA9IGRldl9wcml2LT5jZGNsa19wbGwudmNvOworCWlmICh2Y28gPT0gMCkK KwkJcmV0dXJuIGRldl9wcml2LT5jZGNsa19wbGwucmVmOworCisJZGl2aWRlciA9IEk5MTVfUkVB RChDRENMS19DVEwpICYgQlhUX0NEQ0xLX0NEMlhfRElWX1NFTF9NQVNLOworCisJc3dpdGNoIChk aXZpZGVyKSB7CisJY2FzZSBCWFRfQ0RDTEtfQ0QyWF9ESVZfU0VMXzE6CisJCWRpdiA9IDI7CisJ CWJyZWFrOworCWNhc2UgQlhUX0NEQ0xLX0NEMlhfRElWX1NFTF8xXzU6CisJCVdBUk4oSVNfR0VN SU5JTEFLRShkZXZfcHJpdiksICJVbnN1cHBvcnRlZCBkaXZpZGVyXG4iKTsKKwkJZGl2ID0gMzsK KwkJYnJlYWs7CisJY2FzZSBCWFRfQ0RDTEtfQ0QyWF9ESVZfU0VMXzI6CisJCWRpdiA9IDQ7CisJ CWJyZWFrOworCWNhc2UgQlhUX0NEQ0xLX0NEMlhfRElWX1NFTF80OgorCQlkaXYgPSA4OworCQli cmVhazsKKwlkZWZhdWx0OgorCQlNSVNTSU5HX0NBU0UoZGl2aWRlcik7CisJCXJldHVybiBkZXZf cHJpdi0+Y2RjbGtfcGxsLnJlZjsKKwl9CisKKwlyZXR1cm4gRElWX1JPVU5EX0NMT1NFU1QodmNv LCBkaXYpOworfQorCitzdGF0aWMgdm9pZCBieHRfZGVfcGxsX2Rpc2FibGUoc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCUk5MTVfV1JJVEUoQlhUX0RFX1BMTF9FTkFCTEUs IDApOworCisJLyogVGltZW91dCAyMDB1cyAqLworCWlmIChpbnRlbF93YWl0X2Zvcl9yZWdpc3Rl cihkZXZfcHJpdiwKKwkJCQkgICAgQlhUX0RFX1BMTF9FTkFCTEUsIEJYVF9ERV9QTExfTE9DSywg MCwKKwkJCQkgICAgMSkpCisJCURSTV9FUlJPUigidGltZW91dCB3YWl0aW5nIGZvciBERSBQTEwg dW5sb2NrXG4iKTsKKworCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gMDsKK30KKworc3RhdGlj IHZvaWQgYnh0X2RlX3BsbF9lbmFibGUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 LCBpbnQgdmNvKQoreworCWludCByYXRpbyA9IERJVl9ST1VORF9DTE9TRVNUKHZjbywgZGV2X3By aXYtPmNkY2xrX3BsbC5yZWYpOworCXUzMiB2YWw7CisKKwl2YWwgPSBJOTE1X1JFQUQoQlhUX0RF X1BMTF9DVEwpOworCXZhbCAmPSB+QlhUX0RFX1BMTF9SQVRJT19NQVNLOworCXZhbCB8PSBCWFRf REVfUExMX1JBVElPKHJhdGlvKTsKKwlJOTE1X1dSSVRFKEJYVF9ERV9QTExfQ1RMLCB2YWwpOwor CisJSTkxNV9XUklURShCWFRfREVfUExMX0VOQUJMRSwgQlhUX0RFX1BMTF9QTExfRU5BQkxFKTsK KworCS8qIFRpbWVvdXQgMjAwdXMgKi8KKwlpZiAoaW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoZGV2 X3ByaXYsCisJCQkJICAgIEJYVF9ERV9QTExfRU5BQkxFLAorCQkJCSAgICBCWFRfREVfUExMX0xP Q0ssCisJCQkJICAgIEJYVF9ERV9QTExfTE9DSywKKwkJCQkgICAgMSkpCisJCURSTV9FUlJPUigi dGltZW91dCB3YWl0aW5nIGZvciBERSBQTEwgbG9ja1xuIik7CisKKwlkZXZfcHJpdi0+Y2RjbGtf cGxsLnZjbyA9IHZjbzsKK30KKworc3RhdGljIHZvaWQgYnh0X3NldF9jZGNsayhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBjZGNsaykKK3sKKwl1MzIgdmFsLCBkaXZpZGVy OworCWludCB2Y28sIHJldDsKKworCWlmIChJU19HRU1JTklMQUtFKGRldl9wcml2KSkKKwkJdmNv ID0gZ2xrX2RlX3BsbF92Y28oZGV2X3ByaXYsIGNkY2xrKTsKKwllbHNlCisJCXZjbyA9IGJ4dF9k ZV9wbGxfdmNvKGRldl9wcml2LCBjZGNsayk7CisKKwlEUk1fREVCVUdfRFJJVkVSKCJDaGFuZ2lu ZyBDRENMSyB0byAlZCBrSHogKFZDTyAlZCBrSHopXG4iLAorCQkJIGNkY2xrLCB2Y28pOworCisJ LyogY2RjbGsgPSB2Y28gLyAyIC8gZGl2ezEsMS41LDIsNH0gKi8KKwlzd2l0Y2ggKERJVl9ST1VO RF9DTE9TRVNUKHZjbywgY2RjbGspKSB7CisJY2FzZSA4OgorCQlkaXZpZGVyID0gQlhUX0NEQ0xL X0NEMlhfRElWX1NFTF80OworCQlicmVhazsKKwljYXNlIDQ6CisJCWRpdmlkZXIgPSBCWFRfQ0RD TEtfQ0QyWF9ESVZfU0VMXzI7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJV0FSTihJU19HRU1JTklM QUtFKGRldl9wcml2KSwgIlVuc3VwcG9ydGVkIGRpdmlkZXJcbiIpOworCQlkaXZpZGVyID0gQlhU X0NEQ0xLX0NEMlhfRElWX1NFTF8xXzU7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJZGl2aWRlciA9 IEJYVF9DRENMS19DRDJYX0RJVl9TRUxfMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJV0FSTl9P TihjZGNsayAhPSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZik7CisJCVdBUk5fT04odmNvICE9IDAp OworCisJCWRpdmlkZXIgPSBCWFRfQ0RDTEtfQ0QyWF9ESVZfU0VMXzE7CisJCWJyZWFrOworCX0K KworCS8qIEluZm9ybSBwb3dlciBjb250cm9sbGVyIG9mIHVwY29taW5nIGZyZXF1ZW5jeSBjaGFu Z2UgKi8KKwltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCXJldCA9IHNhbmR5 YnJpZGdlX3Bjb2RlX3dyaXRlKGRldl9wcml2LCBIU1dfUENPREVfREVfV1JJVEVfRlJFUV9SRVEs CisJCQkJICAgICAgMHg4MDAwMDAwMCk7CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3 X2xvY2spOworCisJaWYgKHJldCkgeworCQlEUk1fRVJST1IoIlBDb2RlIENEQ0xLIGZyZXEgY2hh bmdlIG5vdGlmeSBmYWlsZWQgKGVyciAlZCwgZnJlcSAlZClcbiIsCisJCQkgIHJldCwgY2RjbGsp OworCQlyZXR1cm47CisJfQorCisJaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IDAgJiYK KwkgICAgZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gIT0gdmNvKQorCQlieHRfZGVfcGxsX2Rpc2Fi bGUoZGV2X3ByaXYpOworCisJaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykKKwkJ Ynh0X2RlX3BsbF9lbmFibGUoZGV2X3ByaXYsIHZjbyk7CisKKwl2YWwgPSBkaXZpZGVyIHwgc2ts X2NkY2xrX2RlY2ltYWwoY2RjbGspOworCS8qCisJICogRklYTUUgaWYgb25seSB0aGUgY2QyeCBk aXZpZGVyIG5lZWRzIGNoYW5naW5nLCBpdCBjb3VsZCBiZSBkb25lCisJICogd2l0aG91dCBzaHV0 dGluZyBvZmYgdGhlIHBpcGUgKGlmIG9ubHkgb25lIHBpcGUgaXMgYWN0aXZlKS4KKwkgKi8KKwl2 YWwgfD0gQlhUX0NEQ0xLX0NEMlhfUElQRV9OT05FOworCS8qCisJICogRGlzYWJsZSBTU0EgUHJl Y2hhcmdlIHdoZW4gQ0QgY2xvY2sgZnJlcXVlbmN5IDwgNTAwIE1IeiwKKwkgKiBlbmFibGUgb3Ro ZXJ3aXNlLgorCSAqLworCWlmIChjZGNsayA+PSA1MDAwMDApCisJCXZhbCB8PSBCWFRfQ0RDTEtf U1NBX1BSRUNIQVJHRV9FTkFCTEU7CisJSTkxNV9XUklURShDRENMS19DVEwsIHZhbCk7CisKKwlt dXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCXJldCA9IHNhbmR5YnJpZGdlX3Bj b2RlX3dyaXRlKGRldl9wcml2LCBIU1dfUENPREVfREVfV1JJVEVfRlJFUV9SRVEsCisJCQkJICAg ICAgRElWX1JPVU5EX1VQKGNkY2xrLCAyNTAwMCkpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYt PnJwcy5od19sb2NrKTsKKworCWlmIChyZXQpIHsKKwkJRFJNX0VSUk9SKCJQQ29kZSBDRENMSyBm cmVxIHNldCBmYWlsZWQsIChlcnIgJWQsIGZyZXEgJWQpXG4iLAorCQkJICByZXQsIGNkY2xrKTsK KwkJcmV0dXJuOworCX0KKworCWludGVsX3VwZGF0ZV9jZGNsayhkZXZfcHJpdik7Cit9CisKK3N0 YXRpYyB2b2lkIGJ4dF9zYW5pdGl6ZV9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYpCit7CisJdTMyIGNkY3RsLCBleHBlY3RlZDsKKworCWludGVsX3VwZGF0ZV9jZGNsayhk ZXZfcHJpdik7CisKKwlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPT0gMCB8fAorCSAgICBk ZXZfcHJpdi0+Y2RjbGtfZnJlcSA9PSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZikKKwkJZ290byBz YW5pdGl6ZTsKKworCS8qIERQTEwgb2theTsgdmVyaWZ5IHRoZSBjZGNsb2NrCisJICoKKwkgKiBT b21lIEJJT1MgdmVyc2lvbnMgbGVhdmUgYW4gaW5jb3JyZWN0IGRlY2ltYWwgZnJlcXVlbmN5IHZh bHVlIGFuZAorCSAqIHNldCByZXNlcnZlZCBNQlogYml0cyBpbiBDRENMS19DVEwgYXQgbGVhc3Qg ZHVyaW5nIGV4aXRpbmcgZnJvbSBTNCwKKwkgKiBzbyBzYW5pdGl6ZSB0aGlzIHJlZ2lzdGVyLgor CSAqLworCWNkY3RsID0gSTkxNV9SRUFEKENEQ0xLX0NUTCk7CisJLyoKKwkgKiBMZXQncyBpZ25v cmUgdGhlIHBpcGUgZmllbGQsIHNpbmNlIEJJT1MgY291bGQgaGF2ZSBjb25maWd1cmVkIHRoZQor CSAqIGRpdmlkZXJzIGJvdGggc3luY2hpbmcgdG8gYW4gYWN0aXZlIHBpcGUsIG9yIGFzeW5jaHJv bm91c2x5CisJICogKFBJUEVfTk9ORSkuCisJICovCisJY2RjdGwgJj0gfkJYVF9DRENMS19DRDJY X1BJUEVfTk9ORTsKKworCWV4cGVjdGVkID0gKGNkY3RsICYgQlhUX0NEQ0xLX0NEMlhfRElWX1NF TF9NQVNLKSB8CisJCSAgIHNrbF9jZGNsa19kZWNpbWFsKGRldl9wcml2LT5jZGNsa19mcmVxKTsK KwkvKgorCSAqIERpc2FibGUgU1NBIFByZWNoYXJnZSB3aGVuIENEIGNsb2NrIGZyZXF1ZW5jeSA8 IDUwMCBNSHosCisJICogZW5hYmxlIG90aGVyd2lzZS4KKwkgKi8KKwlpZiAoZGV2X3ByaXYtPmNk Y2xrX2ZyZXEgPj0gNTAwMDAwKQorCQlleHBlY3RlZCB8PSBCWFRfQ0RDTEtfU1NBX1BSRUNIQVJH RV9FTkFCTEU7CisKKwlpZiAoY2RjdGwgPT0gZXhwZWN0ZWQpCisJCS8qIEFsbCB3ZWxsOyBub3Ro aW5nIHRvIHNhbml0aXplICovCisJCXJldHVybjsKKworc2FuaXRpemU6CisJRFJNX0RFQlVHX0tN UygiU2FuaXRpemluZyBjZGNsayBwcm9ncmFtbWVkIGJ5IHByZS1vc1xuIik7CisKKwkvKiBmb3Jj ZSBjZGNsayBwcm9ncmFtbWluZyAqLworCWRldl9wcml2LT5jZGNsa19mcmVxID0gMDsKKworCS8q IGZvcmNlIGZ1bGwgUExMIGRpc2FibGUgKyBlbmFibGUgKi8KKwlkZXZfcHJpdi0+Y2RjbGtfcGxs LnZjbyA9IC0xOworfQorCisvKioKKyAqIGJ4dF9pbml0X2NkY2xrIC0gSW5pdGlhbGl6ZSBDRENM SyBvbiBCWFQKKyAqIEBkZXZfcHJpdjogaTkxNSBkZXZpY2UKKyAqCisgKiBJbml0aWFsaXplIENE Q0xLIGZvciBCWFQgYW5kIGRlcml2YXRpdmVzLiBUaGlzIGlzIGdlbmVyYWxseQorICogZG9uZSBv bmx5IGR1cmluZyB0aGUgZGlzcGxheSBjb3JlIGluaXRpYWxpemF0aW9uIHNlcXVlbmNlLAorICog YWZ0ZXIgd2hpY2ggdGhlIERNQyB3aWxsIHRha2UgY2FyZSBvZiB0dXJuaW5nIENEQ0xLIG9mZi9v bgorICogYXMgbmVlZGVkLgorICovCit2b2lkIGJ4dF9pbml0X2NkY2xrKHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlpbnQgY2RjbGs7CisKKwlieHRfc2FuaXRpemVfY2Rj bGsoZGV2X3ByaXYpOworCisJaWYgKGRldl9wcml2LT5jZGNsa19mcmVxICE9IDAgJiYgZGV2X3By aXYtPmNkY2xrX3BsbC52Y28gIT0gMCkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBGSVhNRToKKwkg KiAtIFRoZSBpbml0aWFsIENEQ0xLIG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBWQlQuCisJICogICBO ZWVkIHRvIG1ha2UgdGhpcyBjaGFuZ2UgYWZ0ZXIgVkJUIGhhcyBjaGFuZ2VzIGZvciBCWFQuCisJ ICovCisJaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQorCQljZGNsayA9IGdsa19jYWxjX2Nk Y2xrKDApOworCWVsc2UKKwkJY2RjbGsgPSBieHRfY2FsY19jZGNsaygwKTsKKworCWJ4dF9zZXRf Y2RjbGsoZGV2X3ByaXYsIGNkY2xrKTsKK30KKworLyoqCisgKiBieHRfdW5pbml0X2NkY2xrIC0g VW5pbml0aWFsaXplIENEQ0xLIG9uIEJYVAorICogQGRldl9wcml2OiBpOTE1IGRldmljZQorICoK KyAqIFVuaW5pdGlhbGl6ZSBDRENMSyBmb3IgQlhUIGFuZCBkZXJpdmF0aXZlcy4gVGhpcyBpcyBk b25lIG9ubHkKKyAqIGR1cmluZyB0aGUgZGlzcGxheSBjb3JlIHVuaW5pdGlhbGl6YXRpb24gc2Vx dWVuY2UuCisgKi8KK3ZvaWQgYnh0X3VuaW5pdF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYpCit7CisJYnh0X3NldF9jZGNsayhkZXZfcHJpdiwgZGV2X3ByaXYtPmNkY2xr X3BsbC5yZWYpOworfQorCitzdGF0aWMgaW50IGJkd19hZGp1c3RfbWluX3BpcGVfcGl4ZWxfcmF0 ZShzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSwKKwkJCQkJICBpbnQgcGl4ZWxf cmF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPQorCQl0b19pOTE1 KGNydGNfc3RhdGUtPmJhc2UuY3J0Yy0+ZGV2KTsKKworCS8qIHBpeGVsIHJhdGUgbXVzdG4ndCBl eGNlZWQgOTUlIG9mIGNkY2xrIHdpdGggSVBTIG9uIEJEVyAqLworCWlmIChJU19CUk9BRFdFTEwo ZGV2X3ByaXYpICYmIGNydGNfc3RhdGUtPmlwc19lbmFibGVkKQorCQlwaXhlbF9yYXRlID0gRElW X1JPVU5EX1VQKHBpeGVsX3JhdGUgKiAxMDAsIDk1KTsKKworCS8qIEJTcGVjIHNheXMgIkRvIG5v dCB1c2UgRGlzcGxheVBvcnQgd2l0aCBDRENMSyBsZXNzIHRoYW4KKwkgKiA0MzIgTUh6LCBhdWRp byBlbmFibGVkLCBwb3J0IHdpZHRoIHg0LCBhbmQgbGluayByYXRlCisJICogSEJSMiAoNS40IEdI eiksIG9yIGVsc2UgdGhlcmUgbWF5IGJlIGF1ZGlvIGNvcnJ1cHRpb24gb3IKKwkgKiBzY3JlZW4g Y29ycnVwdGlvbi4iCisJICovCisJaWYgKGludGVsX2NydGNfaGFzX2RwX2VuY29kZXIoY3J0Y19z dGF0ZSkgJiYKKwkgICAgY3J0Y19zdGF0ZS0+aGFzX2F1ZGlvICYmCisJICAgIGNydGNfc3RhdGUt PnBvcnRfY2xvY2sgPj0gNTQwMDAwICYmCisJICAgIGNydGNfc3RhdGUtPmxhbmVfY291bnQgPT0g NCkKKwkJcGl4ZWxfcmF0ZSA9IG1heCg0MzIwMDAsIHBpeGVsX3JhdGUpOworCisJcmV0dXJuIHBp eGVsX3JhdGU7Cit9CisKKy8qIGNvbXB1dGUgdGhlIG1heCByYXRlIGZvciBuZXcgY29uZmlndXJh dGlvbiAqLworc3RhdGljIGludCBpbnRlbF9tYXhfcGl4ZWxfcmF0ZShzdHJ1Y3QgZHJtX2F0b21p Y19zdGF0ZSAqc3RhdGUpCit7CisJc3RydWN0IGludGVsX2F0b21pY19zdGF0ZSAqaW50ZWxfc3Rh dGUgPSB0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOworCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoc3RhdGUtPmRldik7CisJc3RydWN0IGRybV9jcnRjICpj cnRjOworCXN0cnVjdCBkcm1fY3J0Y19zdGF0ZSAqY3N0YXRlOworCXN0cnVjdCBpbnRlbF9jcnRj X3N0YXRlICpjcnRjX3N0YXRlOworCXVuc2lnbmVkIGludCBtYXhfcGl4ZWxfcmF0ZSA9IDAsIGk7 CisJZW51bSBwaXBlIHBpcGU7CisKKwltZW1jcHkoaW50ZWxfc3RhdGUtPm1pbl9waXhjbGssIGRl dl9wcml2LT5taW5fcGl4Y2xrLAorCSAgICAgICBzaXplb2YoaW50ZWxfc3RhdGUtPm1pbl9waXhj bGspKTsKKworCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoc3RhdGUsIGNydGMsIGNzdGF0ZSwgaSkg eworCQlpbnQgcGl4ZWxfcmF0ZTsKKworCQljcnRjX3N0YXRlID0gdG9faW50ZWxfY3J0Y19zdGF0 ZShjc3RhdGUpOworCQlpZiAoIWNydGNfc3RhdGUtPmJhc2UuZW5hYmxlKSB7CisJCQlpbnRlbF9z dGF0ZS0+bWluX3BpeGNsa1tpXSA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBpeGVsX3Jh dGUgPSBjcnRjX3N0YXRlLT5waXhlbF9yYXRlOworCisJCWlmIChJU19CUk9BRFdFTEwoZGV2X3By aXYpIHx8IElTX0dFTjkoZGV2X3ByaXYpKQorCQkJcGl4ZWxfcmF0ZSA9CisJCQkJYmR3X2FkanVz dF9taW5fcGlwZV9waXhlbF9yYXRlKGNydGNfc3RhdGUsCisJCQkJCQkJICAgICAgIHBpeGVsX3Jh dGUpOworCisJCWludGVsX3N0YXRlLT5taW5fcGl4Y2xrW2ldID0gcGl4ZWxfcmF0ZTsKKwl9CisK Kwlmb3JfZWFjaF9waXBlKGRldl9wcml2LCBwaXBlKQorCQltYXhfcGl4ZWxfcmF0ZSA9IG1heChp bnRlbF9zdGF0ZS0+bWluX3BpeGNsa1twaXBlXSwKKwkJCQkgICAgIG1heF9waXhlbF9yYXRlKTsK KworCXJldHVybiBtYXhfcGl4ZWxfcmF0ZTsKK30KKworc3RhdGljIGludCB2bHZfbW9kZXNldF9j YWxjX2NkY2xrKHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJt X2RldmljZSAqZGV2ID0gc3RhdGUtPmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYgPSB0b19pOTE1KGRldik7CisJaW50IG1heF9waXhjbGsgPSBpbnRlbF9tYXhfcGl4ZWxf cmF0ZShzdGF0ZSk7CisJc3RydWN0IGludGVsX2F0b21pY19zdGF0ZSAqaW50ZWxfc3RhdGUgPQor CQl0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOworCisJaW50ZWxfc3RhdGUtPmNkY2xrID0g aW50ZWxfc3RhdGUtPmRldl9jZGNsayA9CisJCXZsdl9jYWxjX2NkY2xrKGRldl9wcml2LCBtYXhf cGl4Y2xrKTsKKworCWlmICghaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcykKKwkJaW50ZWxfc3Rh dGUtPmRldl9jZGNsayA9IHZsdl9jYWxjX2NkY2xrKGRldl9wcml2LCAwKTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCB2bHZfbW9kZXNldF9jb21taXRfY2RjbGsoc3RydWN0IGRybV9h dG9taWNfc3RhdGUgKm9sZF9zdGF0ZSkKK3sKKwlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2xk X3N0YXRlLT5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkx NShkZXYpOworCXN0cnVjdCBpbnRlbF9hdG9taWNfc3RhdGUgKm9sZF9pbnRlbF9zdGF0ZSA9CisJ CXRvX2ludGVsX2F0b21pY19zdGF0ZShvbGRfc3RhdGUpOworCXVuc2lnbmVkIGludCByZXFfY2Rj bGsgPSBvbGRfaW50ZWxfc3RhdGUtPmRldl9jZGNsazsKKworCS8qCisJICogRklYTUU6IFdlIGNh biBlbmQgdXAgaGVyZSB3aXRoIGFsbCBwb3dlciBkb21haW5zIG9mZiwgeWV0CisJICogd2l0aCBh IENEQ0xLIGZyZXF1ZW5jeSBvdGhlciB0aGFuIHRoZSBtaW5pbXVtLiBUbyBhY2NvdW50CisJICog Zm9yIHRoaXMgdGFrZSB0aGUgUElQRS1BIHBvd2VyIGRvbWFpbiwgd2hpY2ggY292ZXJzIHRoZSBI VworCSAqIGJsb2NrcyBuZWVkZWQgZm9yIHRoZSBmb2xsb3dpbmcgcHJvZ3JhbW1pbmcuIFRoaXMg Y2FuIGJlCisJICogcmVtb3ZlZCBvbmNlIGl0J3MgZ3VhcmFudGVlZCB0aGF0IHdlIGdldCBoZXJl IGVpdGhlciB3aXRoCisJICogdGhlIG1pbmltdW0gQ0RDTEsgc2V0LCBvciB0aGUgcmVxdWlyZWQg cG93ZXIgZG9tYWlucworCSAqIGVuYWJsZWQuCisJICovCisJaW50ZWxfZGlzcGxheV9wb3dlcl9n ZXQoZGV2X3ByaXYsIFBPV0VSX0RPTUFJTl9QSVBFX0EpOworCisJaWYgKElTX0NIRVJSWVZJRVco ZGV2X3ByaXYpKQorCQljaHZfc2V0X2NkY2xrKGRldiwgcmVxX2NkY2xrKTsKKwllbHNlCisJCXZs dl9zZXRfY2RjbGsoZGV2LCByZXFfY2RjbGspOworCisJdmx2X3Byb2dyYW1fcGZpX2NyZWRpdHMo ZGV2X3ByaXYpOworCisJaW50ZWxfZGlzcGxheV9wb3dlcl9wdXQoZGV2X3ByaXYsIFBPV0VSX0RP TUFJTl9QSVBFX0EpOworfQorCitzdGF0aWMgaW50IGJkd19tb2Rlc2V0X2NhbGNfY2RjbGsoc3Ry dWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IHRvX2k5MTUoc3RhdGUtPmRldik7CisJc3RydWN0IGludGVsX2F0b21pY19z dGF0ZSAqaW50ZWxfc3RhdGUgPSB0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOworCWludCBt YXhfcGl4Y2xrID0gaW50ZWxfbWF4X3BpeGVsX3JhdGUoc3RhdGUpOworCWludCBjZGNsazsKKwor CS8qCisJICogRklYTUUgc2hvdWxkIGFsc28gYWNjb3VudCBmb3IgcGxhbmUgcmF0aW8KKwkgKiBv bmNlIDY0YnBwIHBpeGVsIGZvcm1hdHMgYXJlIHN1cHBvcnRlZC4KKwkgKi8KKwljZGNsayA9IGJk d19jYWxjX2NkY2xrKG1heF9waXhjbGspOworCisJaWYgKGNkY2xrID4gZGV2X3ByaXYtPm1heF9j ZGNsa19mcmVxKSB7CisJCURSTV9ERUJVR19LTVMoInJlcXVlc3RlZCBjZGNsayAoJWQga0h6KSBl eGNlZWRzIG1heCAoJWQga0h6KVxuIiwKKwkJCSAgICAgIGNkY2xrLCBkZXZfcHJpdi0+bWF4X2Nk Y2xrX2ZyZXEpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpbnRlbF9zdGF0ZS0+Y2RjbGsg PSBpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gY2RjbGs7CisJaWYgKCFpbnRlbF9zdGF0ZS0+YWN0 aXZlX2NydGNzKQorCQlpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gYmR3X2NhbGNfY2RjbGsoMCk7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYmR3X21vZGVzZXRfY29tbWl0X2NkY2xr KHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpvbGRfc3RhdGUpCit7CisJc3RydWN0IGRybV9kZXZp Y2UgKmRldiA9IG9sZF9zdGF0ZS0+ZGV2OworCXN0cnVjdCBpbnRlbF9hdG9taWNfc3RhdGUgKm9s ZF9pbnRlbF9zdGF0ZSA9CisJCXRvX2ludGVsX2F0b21pY19zdGF0ZShvbGRfc3RhdGUpOworCXVu c2lnbmVkIGludCByZXFfY2RjbGsgPSBvbGRfaW50ZWxfc3RhdGUtPmRldl9jZGNsazsKKworCWJk d19zZXRfY2RjbGsoZGV2LCByZXFfY2RjbGspOworfQorCitzdGF0aWMgaW50IHNrbF9tb2Rlc2V0 X2NhbGNfY2RjbGsoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBp bnRlbF9hdG9taWNfc3RhdGUgKmludGVsX3N0YXRlID0gdG9faW50ZWxfYXRvbWljX3N0YXRlKHN0 YXRlKTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHN0YXRl LT5kZXYpOworCWNvbnN0IGludCBtYXhfcGl4Y2xrID0gaW50ZWxfbWF4X3BpeGVsX3JhdGUoc3Rh dGUpOworCWludCB2Y28gPSBpbnRlbF9zdGF0ZS0+Y2RjbGtfcGxsX3ZjbzsKKwlpbnQgY2RjbGs7 CisKKwkvKgorCSAqIEZJWE1FIHNob3VsZCBhbHNvIGFjY291bnQgZm9yIHBsYW5lIHJhdGlvCisJ ICogb25jZSA2NGJwcCBwaXhlbCBmb3JtYXRzIGFyZSBzdXBwb3J0ZWQuCisJICovCisJY2RjbGsg PSBza2xfY2FsY19jZGNsayhtYXhfcGl4Y2xrLCB2Y28pOworCisJLyoKKwkgKiBGSVhNRSBtb3Zl IHRoZSBjZGNsayBjYWNsdWxhdGlvbiB0bworCSAqIGNvbXB1dGVfY29uZmlnKCkgc28gd2UgY2Fu IGZhaWwgZ3JhY2VndWxseS4KKwkgKi8KKwlpZiAoY2RjbGsgPiBkZXZfcHJpdi0+bWF4X2NkY2xr X2ZyZXEpIHsKKwkJRFJNX0VSUk9SKCJyZXF1ZXN0ZWQgY2RjbGsgKCVkIGtIeikgZXhjZWVkcyBt YXggKCVkIGtIeilcbiIsCisJCQkgIGNkY2xrLCBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEpOwor CQljZGNsayA9IGRldl9wcml2LT5tYXhfY2RjbGtfZnJlcTsKKwl9CisKKwlpbnRlbF9zdGF0ZS0+ Y2RjbGsgPSBpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gY2RjbGs7CisJaWYgKCFpbnRlbF9zdGF0 ZS0+YWN0aXZlX2NydGNzKQorCQlpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gc2tsX2NhbGNfY2Rj bGsoMCwgdmNvKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBza2xfbW9kZXNldF9j b21taXRfY2RjbGsoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9zdGF0ZSkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KG9sZF9zdGF0ZS0+ZGV2KTsK KwlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICppbnRlbF9zdGF0ZSA9CisJCXRvX2ludGVsX2F0 b21pY19zdGF0ZShvbGRfc3RhdGUpOworCXVuc2lnbmVkIGludCByZXFfY2RjbGsgPSBpbnRlbF9z dGF0ZS0+ZGV2X2NkY2xrOworCXVuc2lnbmVkIGludCByZXFfdmNvID0gaW50ZWxfc3RhdGUtPmNk Y2xrX3BsbF92Y287CisKKwlza2xfc2V0X2NkY2xrKGRldl9wcml2LCByZXFfY2RjbGssIHJlcV92 Y28pOworfQorCitzdGF0aWMgaW50IGJ4dF9tb2Rlc2V0X2NhbGNfY2RjbGsoc3RydWN0IGRybV9h dG9taWNfc3RhdGUgKnN0YXRlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp diA9IHRvX2k5MTUoc3RhdGUtPmRldik7CisJaW50IG1heF9waXhjbGsgPSBpbnRlbF9tYXhfcGl4 ZWxfcmF0ZShzdGF0ZSk7CisJc3RydWN0IGludGVsX2F0b21pY19zdGF0ZSAqaW50ZWxfc3RhdGUg PQorCQl0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOworCWludCBjZGNsazsKKworCWlmIChJ U19HRU1JTklMQUtFKGRldl9wcml2KSkKKwkJY2RjbGsgPSBnbGtfY2FsY19jZGNsayhtYXhfcGl4 Y2xrKTsKKwllbHNlCisJCWNkY2xrID0gYnh0X2NhbGNfY2RjbGsobWF4X3BpeGNsayk7CisKKwlp bnRlbF9zdGF0ZS0+Y2RjbGsgPSBpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gY2RjbGs7CisKKwlp ZiAoIWludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MpIHsKKwkJaWYgKElTX0dFTUlOSUxBS0UoZGV2 X3ByaXYpKQorCQkJY2RjbGsgPSBnbGtfY2FsY19jZGNsaygwKTsKKwkJZWxzZQorCQkJY2RjbGsg PSBieHRfY2FsY19jZGNsaygwKTsKKworCQlpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gY2RjbGs7 CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ4dF9tb2Rlc2V0X2NvbW1pdF9j ZGNsayhzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqb2xkX3N0YXRlKQoreworCXN0cnVjdCBkcm1f ZGV2aWNlICpkZXYgPSBvbGRfc3RhdGUtPmRldjsKKwlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRl ICpvbGRfaW50ZWxfc3RhdGUgPQorCQl0b19pbnRlbF9hdG9taWNfc3RhdGUob2xkX3N0YXRlKTsK Kwl1bnNpZ25lZCBpbnQgcmVxX2NkY2xrID0gb2xkX2ludGVsX3N0YXRlLT5kZXZfY2RjbGs7CisK KwlieHRfc2V0X2NkY2xrKHRvX2k5MTUoZGV2KSwgcmVxX2NkY2xrKTsKK30KKworc3RhdGljIGlu dCBpbnRlbF9jb21wdXRlX21heF9kb3RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2KQoreworCWludCBtYXhfY2RjbGtfZnJlcSA9IGRldl9wcml2LT5tYXhfY2RjbGtfZnJlcTsK KworCWlmIChJU19HRU1JTklMQUtFKGRldl9wcml2KSkKKwkJcmV0dXJuIDIgKiBtYXhfY2RjbGtf ZnJlcTsKKwllbHNlIGlmIChJTlRFTF9JTkZPKGRldl9wcml2KS0+Z2VuID49IDkgfHwKKwkJIElT X0hBU1dFTEwoZGV2X3ByaXYpIHx8IElTX0JST0FEV0VMTChkZXZfcHJpdikpCisJCXJldHVybiBt YXhfY2RjbGtfZnJlcTsKKwllbHNlIGlmIChJU19DSEVSUllWSUVXKGRldl9wcml2KSkKKwkJcmV0 dXJuIG1heF9jZGNsa19mcmVxKjk1LzEwMDsKKwllbHNlIGlmIChJTlRFTF9JTkZPKGRldl9wcml2 KS0+Z2VuIDwgNCkKKwkJcmV0dXJuIDIqbWF4X2NkY2xrX2ZyZXEqOTAvMTAwOworCWVsc2UKKwkJ cmV0dXJuIG1heF9jZGNsa19mcmVxKjkwLzEwMDsKK30KKworLyoqCisgKiBpbnRlbF91cGRhdGVf bWF4X2NkY2xrIC0gRGV0ZXJtaW5lIHRoZSBtYXhpbXVtIHN1cHBvcnQgQ0RDTEsgZnJlcXVlbmN5 CisgKiBAZGV2X3ByaXY6IGk5MTUgZGV2aWNlCisgKgorICogRGV0ZXJtaW5lIHRoZSBtYXhpbXVt IENEQ0xLIGZyZXF1ZW5jeSB0aGUgcGxhdGZvcm0gc3VwcG9ydHMsIGFuZCBhbHNvCisgKiBkZXJp dmUgdGhlIG1heGltdW0gZG90IGNsb2NrIGZyZXF1ZW5jeSB0aGUgbWF4aW11bSBDRENMSyBmcmVx dWVuY3kKKyAqIGFsbG93cy4KKyAqLwordm9pZCBpbnRlbF91cGRhdGVfbWF4X2NkY2xrKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlpZiAoSVNfR0VOOV9CQyhkZXZfcHJp dikpIHsKKwkJdTMyIGxpbWl0ID0gSTkxNV9SRUFEKFNLTF9ERlNNKSAmIFNLTF9ERlNNX0NEQ0xL X0xJTUlUX01BU0s7CisJCWludCBtYXhfY2RjbGssIHZjbzsKKworCQl2Y28gPSBkZXZfcHJpdi0+ c2tsX3ByZWZlcnJlZF92Y29fZnJlcTsKKwkJV0FSTl9PTih2Y28gIT0gODEwMDAwMCAmJiB2Y28g IT0gODY0MDAwMCk7CisKKwkJLyoKKwkJICogVXNlIHRoZSBsb3dlciAodmNvIDg2NDApIGNkY2xr IHZhbHVlcyBhcyBhCisJCSAqIGZpcnN0IGd1ZXNzLiBza2xfY2FsY19jZGNsaygpIHdpbGwgY29y cmVjdCBpdAorCQkgKiBpZiB0aGUgcHJlZmVycmVkIHZjbyBpcyA4MTAwIGluc3RlYWQuCisJCSAq LworCQlpZiAobGltaXQgPT0gU0tMX0RGU01fQ0RDTEtfTElNSVRfNjc1KQorCQkJbWF4X2NkY2xr ID0gNjE3MTQzOworCQllbHNlIGlmIChsaW1pdCA9PSBTS0xfREZTTV9DRENMS19MSU1JVF81NDAp CisJCQltYXhfY2RjbGsgPSA1NDAwMDA7CisJCWVsc2UgaWYgKGxpbWl0ID09IFNLTF9ERlNNX0NE Q0xLX0xJTUlUXzQ1MCkKKwkJCW1heF9jZGNsayA9IDQzMjAwMDsKKwkJZWxzZQorCQkJbWF4X2Nk Y2xrID0gMzA4NTcxOworCisJCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IHNrbF9jYWxjX2Nk Y2xrKG1heF9jZGNsaywgdmNvKTsKKwl9IGVsc2UgaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYp KSB7CisJCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDMxNjgwMDsKKwl9IGVsc2UgaWYgKElT X0JST1hUT04oZGV2X3ByaXYpKSB7CisJCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDYyNDAw MDsKKwl9IGVsc2UgaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikpICB7CisJCS8qCisJCSAqIEZJ WE1FIHdpdGggZXh0cmEgY29vbGluZyB3ZSBjYW4gYWxsb3cKKwkJICogNTQwIE1IeiBmb3IgVUxY IGFuZCA2NzUgTWh6IGZvciBVTFQuCisJCSAqIEhvdyBjYW4gd2Uga25vdyBpZiBleHRyYSBjb29s aW5nIGlzCisJCSAqIGF2YWlsYWJsZT8gUENJIElELCBWVEIsIHNvbWV0aGluZyBlbHNlPworCQkg Ki8KKwkJaWYgKEk5MTVfUkVBRChGVVNFX1NUUkFQKSAmIEhTV19DRENMS19MSU1JVCkKKwkJCWRl dl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDQ1MDAwMDsKKwkJZWxzZSBpZiAoSVNfQkRXX1VMWChk ZXZfcHJpdikpCisJCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA0NTAwMDA7CisJCWVsc2Ug aWYgKElTX0JEV19VTFQoZGV2X3ByaXYpKQorCQkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0g NTQwMDAwOworCQllbHNlCisJCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA2NzUwMDA7CisJ fSBlbHNlIGlmIChJU19DSEVSUllWSUVXKGRldl9wcml2KSkgeworCQlkZXZfcHJpdi0+bWF4X2Nk Y2xrX2ZyZXEgPSAzMjAwMDA7CisJfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSkg eworCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA0MDAwMDA7CisJfSBlbHNlIHsKKwkJLyog b3RoZXJ3aXNlIGFzc3VtZSBjZGNsayBpcyBmaXhlZCAqLworCQlkZXZfcHJpdi0+bWF4X2NkY2xr X2ZyZXEgPSBkZXZfcHJpdi0+Y2RjbGtfZnJlcTsKKwl9CisKKwlkZXZfcHJpdi0+bWF4X2RvdGNs a19mcmVxID0gaW50ZWxfY29tcHV0ZV9tYXhfZG90Y2xrKGRldl9wcml2KTsKKworCURSTV9ERUJV R19EUklWRVIoIk1heCBDRCBjbG9jayByYXRlOiAlZCBrSHpcbiIsCisJCQkgZGV2X3ByaXYtPm1h eF9jZGNsa19mcmVxKTsKKworCURSTV9ERUJVR19EUklWRVIoIk1heCBkb3RjbG9jayByYXRlOiAl ZCBrSHpcbiIsCisJCQkgZGV2X3ByaXYtPm1heF9kb3RjbGtfZnJlcSk7Cit9CisKKy8qKgorICog aW50ZWxfdXBkYXRlX2NkY2xrIC0gRGV0ZXJtaW5lIHRoZSBjdXJyZW50IENEQ0xLIGZyZXF1ZW5j eQorICogQGRldl9wcml2OiBpOTE1IGRldmljZQorICoKKyAqIERldGVybWluZSB0aGUgY3VycmVu dCBDRENMSyBmcmVxdWVuY3kuCisgKi8KK3ZvaWQgaW50ZWxfdXBkYXRlX2NkY2xrKHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sKKwlkZXZfcHJpdi0+Y2RjbGtfZnJlcSA9IGRl dl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayhkZXZfcHJpdik7CisKKwlpZiAoSU5URUxfR0VOKGRl dl9wcml2KSA+PSA5KQorCQlEUk1fREVCVUdfRFJJVkVSKCJDdXJyZW50IENEIGNsb2NrIHJhdGU6 ICVkIGtIeiwgVkNPOiAlZCBrSHosIHJlZjogJWQga0h6XG4iLAorCQkJCSBkZXZfcHJpdi0+Y2Rj bGtfZnJlcSwgZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28sCisJCQkJIGRldl9wcml2LT5jZGNsa19w bGwucmVmKTsKKwllbHNlCisJCURSTV9ERUJVR19EUklWRVIoIkN1cnJlbnQgQ0QgY2xvY2sgcmF0 ZTogJWQga0h6XG4iLAorCQkJCSBkZXZfcHJpdi0+Y2RjbGtfZnJlcSk7CisKKwkvKgorCSAqIDk6 MCBDTUJVUyBbc2ljXSBDRENMSyBmcmVxdWVuY3kgKGNkZnJlcSk6CisJICogUHJvZ3JhbW1uZyBb c2ljXSBub3RlOiBiaXRbOToyXSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB0byB0aGUgbnVtYmVyCisJ ICogb2YgY2RjbGsgdGhhdCBnZW5lcmF0ZXMgNE1IeiByZWZlcmVuY2UgY2xvY2sgZnJlcSB3aGlj aCBpcyB1c2VkIHRvCisJICogZ2VuZXJhdGUgR01CdXMgY2xvY2suIFRoaXMgd2lsbCB2YXJ5IHdp dGggdGhlIGNkY2xrIGZyZXEuCisJICovCisJaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYpIHx8 IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQorCQlJOTE1X1dSSVRFKEdNQlVTRlJFUV9WTFYsCisJ CQkgICBESVZfUk9VTkRfVVAoZGV2X3ByaXYtPmNkY2xrX2ZyZXEsIDEwMDApKTsKK30KKworc3Rh dGljIGludCBwY2hfcmF3Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sK KwlyZXR1cm4gKEk5MTVfUkVBRChQQ0hfUkFXQ0xLX0ZSRVEpICYgUkFXQ0xLX0ZSRVFfTUFTSykg KiAxMDAwOworfQorCitzdGF0aWMgaW50IHZsdl9ocmF3Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdikKK3sKKwkvKiBSQVdDTEtfRlJFUV9WTFYgcmVnaXN0ZXIgdXBkYXRlZCBm cm9tIHBvd2VyIHdlbGwgY29kZSAqLworCXJldHVybiB2bHZfZ2V0X2Nja19jbG9ja19ocGxsKGRl dl9wcml2LCAiaHJhd2NsayIsCisJCQkJICAgICAgQ0NLX0RJU1BMQVlfUkVGX0NMT0NLX0NPTlRS T0wpOworfQorCitzdGF0aWMgaW50IGc0eF9ocmF3Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKK3sKKwl1aW50MzJfdCBjbGtjZmc7CisKKwkvKiBocmF3Y2xvY2sgaXMgMS80 IHRoZSBGU0IgZnJlcXVlbmN5ICovCisJY2xrY2ZnID0gSTkxNV9SRUFEKENMS0NGRyk7CisJc3dp dGNoIChjbGtjZmcgJiBDTEtDRkdfRlNCX01BU0spIHsKKwljYXNlIENMS0NGR19GU0JfNDAwOgor CQlyZXR1cm4gMTAwMDAwOworCWNhc2UgQ0xLQ0ZHX0ZTQl81MzM6CisJCXJldHVybiAxMzMzMzM7 CisJY2FzZSBDTEtDRkdfRlNCXzY2NzoKKwkJcmV0dXJuIDE2NjY2NzsKKwljYXNlIENMS0NGR19G U0JfODAwOgorCQlyZXR1cm4gMjAwMDAwOworCWNhc2UgQ0xLQ0ZHX0ZTQl8xMDY3OgorCQlyZXR1 cm4gMjY2NjY3OworCWNhc2UgQ0xLQ0ZHX0ZTQl8xMzMzOgorCQlyZXR1cm4gMzMzMzMzOworCS8q IHRoZXNlIHR3byBhcmUganVzdCBhIGd1ZXNzOyBvbmUgb2YgdGhlbSBtaWdodCBiZSByaWdodCAq LworCWNhc2UgQ0xLQ0ZHX0ZTQl8xNjAwOgorCWNhc2UgQ0xLQ0ZHX0ZTQl8xNjAwX0FMVDoKKwkJ cmV0dXJuIDQwMDAwMDsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMTMzMzMzOworCX0KK30KKworLyoq CisgKiBpbnRlbF91cGRhdGVfcmF3Y2xrIC0gRGV0ZXJtaW5lIHRoZSBjdXJyZW50IFJBV0NMSyBm cmVxdWVuY3kKKyAqIEBkZXZfcHJpdjogaTkxNSBkZXZpY2UKKyAqCisgKiBEZXRlcm1pbmUgdGhl IGN1cnJlbnQgUkFXQ0xLIGZyZXF1ZW5jeS4gUkFXQ0xLIGlzIGEgZml4ZWQKKyAqIGZyZXF1ZW5j eSBjbG9jayBzbyB0aGlzIG5lZWRzIHRvIGRvbmUgb25seSBvbmNlLgorICovCit2b2lkIGludGVs X3VwZGF0ZV9yYXdjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWlm IChIQVNfUENIX1NQTElUKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPnJhd2Nsa19mcmVxID0gcGNo X3Jhd2NsayhkZXZfcHJpdik7CisJZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdikgfHwg SVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCisJCWRldl9wcml2LT5yYXdjbGtfZnJlcSA9IHZsdl9o cmF3Y2xrKGRldl9wcml2KTsKKwllbHNlIGlmIChJU19HNFgoZGV2X3ByaXYpIHx8IElTX1BJTkVW SUVXKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPnJhd2Nsa19mcmVxID0gZzR4X2hyYXdjbGsoZGV2 X3ByaXYpOworCWVsc2UKKwkJLyogbm8gcmF3Y2xrIG9uIG90aGVyIHBsYXRmb3Jtcywgb3Igbm8g bmVlZCB0byBrbm93IGl0ICovCisJCXJldHVybjsKKworCURSTV9ERUJVR19EUklWRVIoInJhd2Ns ayByYXRlOiAlZCBrSHpcbiIsIGRldl9wcml2LT5yYXdjbGtfZnJlcSk7Cit9CisKKy8qKgorICog aW50ZWxfaW5pdF9jZGNsa19ob29rcyAtIEluaXRpYWxpemUgQ0RDTEsgcmVsYXRlZCBtb2Rlc2V0 dGluZyBob29rcworICogQGRldl9wcml2OiBpOTE1IGRldmljZQorICovCit2b2lkIGludGVsX2lu aXRfY2RjbGtfaG9va3Moc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCWlm IChJU19WQUxMRVlWSUVXKGRldl9wcml2KSB8fCBJU19DSEVSUllWSUVXKGRldl9wcml2KSkgewor CQlkZXZfcHJpdi0+ZGlzcGxheS5tb2Rlc2V0X2NvbW1pdF9jZGNsayA9CisJCQl2bHZfbW9kZXNl dF9jb21taXRfY2RjbGs7CisJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY2FsY19jZGNsayA9 CisJCQl2bHZfbW9kZXNldF9jYWxjX2NkY2xrOworCX0gZWxzZSBpZiAoSVNfQlJPQURXRUxMKGRl dl9wcml2KSkgeworCQlkZXZfcHJpdi0+ZGlzcGxheS5tb2Rlc2V0X2NvbW1pdF9jZGNsayA9CisJ CQliZHdfbW9kZXNldF9jb21taXRfY2RjbGs7CisJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRf Y2FsY19jZGNsayA9CisJCQliZHdfbW9kZXNldF9jYWxjX2NkY2xrOworCX0gZWxzZSBpZiAoSVNf R0VOOV9MUChkZXZfcHJpdikpIHsKKwkJZGV2X3ByaXYtPmRpc3BsYXkubW9kZXNldF9jb21taXRf Y2RjbGsgPQorCQkJYnh0X21vZGVzZXRfY29tbWl0X2NkY2xrOworCQlkZXZfcHJpdi0+ZGlzcGxh eS5tb2Rlc2V0X2NhbGNfY2RjbGsgPQorCQkJYnh0X21vZGVzZXRfY2FsY19jZGNsazsKKwl9IGVs c2UgaWYgKElTX0dFTjlfQkMoZGV2X3ByaXYpKSB7CisJCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVz ZXRfY29tbWl0X2NkY2xrID0KKwkJCXNrbF9tb2Rlc2V0X2NvbW1pdF9jZGNsazsKKwkJZGV2X3By aXYtPmRpc3BsYXkubW9kZXNldF9jYWxjX2NkY2xrID0KKwkJCXNrbF9tb2Rlc2V0X2NhbGNfY2Rj bGs7CisJfQorCisJaWYgKElTX0dFTjlfQkMoZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxh eS5nZXRfY2RjbGsgPSBza2xfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0dFTjlfTFAoZGV2X3By aXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBieHRfZ2V0X2NkY2xrOworCWVs c2UgaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9j ZGNsayA9IGJkd19nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfSEFTV0VMTChkZXZfcHJpdikpCisJ CWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGhzd19nZXRfY2RjbGs7CisJZWxzZSBpZiAo SVNfVkFMTEVZVklFVyhkZXZfcHJpdikgfHwgSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCisJCWRl dl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IHZsdl9nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNf R0VONihkZXZfcHJpdikgfHwgSVNfSVZZQlJJREdFKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRp c3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfNDAwbWh6X2dldF9jZGNsazsKKwllbHNlIGlmIChJU19H RU41KGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfNDUw bWh6X2dldF9jZGNsazsKKwllbHNlIGlmIChJU19HTTQ1KGRldl9wcml2KSkKKwkJZGV2X3ByaXYt PmRpc3BsYXkuZ2V0X2NkY2xrID0gZ200NV9nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfRzRYKGRl dl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZzMzX2dldF9jZGNsazsK KwllbHNlIGlmIChJU19JOTY1R00oZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRf Y2RjbGsgPSBpOTY1Z21fZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0k5NjVHKGRldl9wcml2KSkK KwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfNDAwbWh6X2dldF9jZGNsazsK KwllbHNlIGlmIChJU19QSU5FVklFVyhkZXZfcHJpdikpCisJCWRldl9wcml2LT5kaXNwbGF5Lmdl dF9jZGNsayA9IHBudl9nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfRzMzKGRldl9wcml2KSkKKwkJ ZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZzMzX2dldF9jZGNsazsKKwllbHNlIGlmIChJ U19JOTQ1R00oZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBmaXhl ZF8yMDBtaHpfZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0k5NDVHKGRldl9wcml2KSkKKwkJZGV2 X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfNDAwbWh6X2dldF9jZGNsazsKKwllbHNl IGlmIChJU19JOTE1R00oZGV2X3ByaXYpKQorCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsg PSBpOTE1Z21fZ2V0X2NkY2xrOworCWVsc2UgaWYgKElTX0k5MTVHKGRldl9wcml2KSkKKwkJZGV2 X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfMzMzbWh6X2dldF9jZGNsazsKKwllbHNl IGlmIChJU19JODY1RyhkZXZfcHJpdikpCisJCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9 IGZpeGVkXzI2Nm1oel9nZXRfY2RjbGs7CisJZWxzZSBpZiAoSVNfSTg1WChkZXZfcHJpdikpCisJ CWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGk4NXhfZ2V0X2NkY2xrOworCWVsc2UgaWYg KElTX0k4NDVHKGRldl9wcml2KSkKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4 ZWRfMjAwbWh6X2dldF9jZGNsazsKKwllbHNlIHsgLyogODMwICovCisJCVdBUk4oIUlTX0k4MzAo ZGV2X3ByaXYpLAorCQkgICAgICJVbmtub3duIHBsYXRmb3JtLiBBc3N1bWluZyAxMzMgTUh6IENE Q0xLXG4iKTsKKwkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4ZWRfMTMzbWh6X2dl dF9jZGNsazsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9k aXNwbGF5LmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5LmMKaW5kZXggYTEx OTU4ZjBkMGE1Li5lMjlhODFjMTQ5Y2EgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2Rpc3BsYXkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9kaXNwbGF5 LmMKQEAgLTEyMiw5ICsxMjIsNiBAQCBzdGF0aWMgdm9pZCBpcm9ubGFrZV9wZml0X2Rpc2FibGUo c3RydWN0IGludGVsX2NydGMgKmNydGMsIGJvb2wgZm9yY2UpOwogc3RhdGljIHZvaWQgaXJvbmxh a2VfcGZpdF9lbmFibGUoc3RydWN0IGludGVsX2NydGMgKmNydGMpOwogc3RhdGljIHZvaWQgaW50 ZWxfbW9kZXNldF9zZXR1cF9od19zdGF0ZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2KTsKIHN0YXRp YyB2b2lkIGludGVsX3ByZV9kaXNhYmxlX3ByaW1hcnlfbm9hdG9taWMoc3RydWN0IGRybV9jcnRj ICpjcnRjKTsKLXN0YXRpYyBpbnQgaW50ZWxfbWF4X3BpeGVsX3JhdGUoc3RydWN0IGRybV9hdG9t aWNfc3RhdGUgKnN0YXRlKTsKLXN0YXRpYyBpbnQgZ2xrX2NhbGNfY2RjbGsoaW50IG1heF9waXhj bGspOwotc3RhdGljIGludCBieHRfY2FsY19jZGNsayhpbnQgbWF4X3BpeGNsayk7CiAKIHN0cnVj dCBpbnRlbF9saW1pdCB7CiAJc3RydWN0IHsKQEAgLTE3MCw4ICsxNjcsOCBAQCBpbnQgdmx2X2dl dF9jY2tfY2xvY2soc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCXJldHVybiBE SVZfUk9VTkRfQ0xPU0VTVChyZWZfZnJlcSA8PCAxLCBkaXZpZGVyICsgMSk7CiB9CiAKLXN0YXRp YyBpbnQgdmx2X2dldF9jY2tfY2xvY2tfaHBsbChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYsCi0JCQkJICBjb25zdCBjaGFyICpuYW1lLCB1MzIgcmVnKQoraW50IHZsdl9nZXRfY2Nr X2Nsb2NrX2hwbGwoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAorCQkJICAgY29u c3QgY2hhciAqbmFtZSwgdTMyIHJlZykKIHsKIAlpZiAoZGV2X3ByaXYtPmhwbGxfZnJlcSA9PSAw KQogCQlkZXZfcHJpdi0+aHBsbF9mcmVxID0gdmFsbGV5dmlld19nZXRfdmNvKGRldl9wcml2KTsK QEAgLTE4MCw2MyArMTc3LDYgQEAgc3RhdGljIGludCB2bHZfZ2V0X2Nja19jbG9ja19ocGxsKHN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKIAkJCQkgZGV2X3ByaXYtPmhwbGxfZnJl cSk7CiB9CiAKLXN0YXRpYyBpbnQKLWludGVsX3BjaF9yYXdjbGsoc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2KQotewotCXJldHVybiAoSTkxNV9SRUFEKFBDSF9SQVdDTEtfRlJFUSkg JiBSQVdDTEtfRlJFUV9NQVNLKSAqIDEwMDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWludGVsX3Zsdl9o cmF3Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQkvKiBSQVdDTEtf RlJFUV9WTFYgcmVnaXN0ZXIgdXBkYXRlZCBmcm9tIHBvd2VyIHdlbGwgY29kZSAqLwotCXJldHVy biB2bHZfZ2V0X2Nja19jbG9ja19ocGxsKGRldl9wcml2LCAiaHJhd2NsayIsCi0JCQkJICAgICAg Q0NLX0RJU1BMQVlfUkVGX0NMT0NLX0NPTlRST0wpOwotfQotCi1zdGF0aWMgaW50Ci1pbnRlbF9n NHhfaHJhd2NsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JdWludDMy X3QgY2xrY2ZnOwotCi0JLyogaHJhd2Nsb2NrIGlzIDEvNCB0aGUgRlNCIGZyZXF1ZW5jeSAqLwot CWNsa2NmZyA9IEk5MTVfUkVBRChDTEtDRkcpOwotCXN3aXRjaCAoY2xrY2ZnICYgQ0xLQ0ZHX0ZT Ql9NQVNLKSB7Ci0JY2FzZSBDTEtDRkdfRlNCXzQwMDoKLQkJcmV0dXJuIDEwMDAwMDsKLQljYXNl IENMS0NGR19GU0JfNTMzOgotCQlyZXR1cm4gMTMzMzMzOwotCWNhc2UgQ0xLQ0ZHX0ZTQl82Njc6 Ci0JCXJldHVybiAxNjY2Njc7Ci0JY2FzZSBDTEtDRkdfRlNCXzgwMDoKLQkJcmV0dXJuIDIwMDAw MDsKLQljYXNlIENMS0NGR19GU0JfMTA2NzoKLQkJcmV0dXJuIDI2NjY2NzsKLQljYXNlIENMS0NG R19GU0JfMTMzMzoKLQkJcmV0dXJuIDMzMzMzMzsKLQkvKiB0aGVzZSB0d28gYXJlIGp1c3QgYSBn dWVzczsgb25lIG9mIHRoZW0gbWlnaHQgYmUgcmlnaHQgKi8KLQljYXNlIENMS0NGR19GU0JfMTYw MDoKLQljYXNlIENMS0NGR19GU0JfMTYwMF9BTFQ6Ci0JCXJldHVybiA0MDAwMDA7Ci0JZGVmYXVs dDoKLQkJcmV0dXJuIDEzMzMzMzsKLQl9Ci19Ci0KLXZvaWQgaW50ZWxfdXBkYXRlX3Jhd2Nsayhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JaWYgKEhBU19QQ0hfU1BMSVQo ZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+cmF3Y2xrX2ZyZXEgPSBpbnRlbF9wY2hfcmF3Y2xrKGRl dl9wcml2KTsKLQllbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSB8fCBJU19DSEVSUllW SUVXKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPnJhd2Nsa19mcmVxID0gaW50ZWxfdmx2X2hyYXdj bGsoZGV2X3ByaXYpOwotCWVsc2UgaWYgKElTX0c0WChkZXZfcHJpdikgfHwgSVNfUElORVZJRVco ZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+cmF3Y2xrX2ZyZXEgPSBpbnRlbF9nNHhfaHJhd2Nsayhk ZXZfcHJpdik7Ci0JZWxzZQotCQlyZXR1cm47IC8qIG5vIHJhd2NsayBvbiBvdGhlciBwbGF0Zm9y bXMsIG9yIG5vIG5lZWQgdG8ga25vdyBpdCAqLwotCi0JRFJNX0RFQlVHX0RSSVZFUigicmF3Y2xr IHJhdGU6ICVkIGtIelxuIiwgZGV2X3ByaXYtPnJhd2Nsa19mcmVxKTsKLX0KLQogc3RhdGljIHZv aWQgaW50ZWxfdXBkYXRlX2N6Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK IHsKIAlpZiAoIShJU19WQUxMRVlWSUVXKGRldl9wcml2KSB8fCBJU19DSEVSUllWSUVXKGRldl9w cml2KSkpCkBAIC01Nzc5LDEwOTMgKzU3MTksMjExIEBAIHN0YXRpYyB2b2lkIG1vZGVzZXRfcHV0 X3Bvd2VyX2RvbWFpbnMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAogCQlpbnRl bF9kaXNwbGF5X3Bvd2VyX3B1dChkZXZfcHJpdiwgZG9tYWluKTsKIH0KIAotc3RhdGljIGludCBp bnRlbF9jb21wdXRlX21heF9kb3RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 KQorc3RhdGljIHZvaWQgdmFsbGV5dmlld19jcnRjX2VuYWJsZShzdHJ1Y3QgaW50ZWxfY3J0Y19z dGF0ZSAqcGlwZV9jb25maWcsCisJCQkJICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9z dGF0ZSkKIHsKLQlpbnQgbWF4X2NkY2xrX2ZyZXEgPSBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXE7 CisJc3RydWN0IGRybV9jcnRjICpjcnRjID0gcGlwZV9jb25maWctPmJhc2UuY3J0YzsKKwlzdHJ1 Y3QgZHJtX2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0 YyA9IHRvX2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwog Ci0JaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQotCQlyZXR1cm4gMiAqIG1heF9jZGNsa19m cmVxOwotCWVsc2UgaWYgKElOVEVMX0lORk8oZGV2X3ByaXYpLT5nZW4gPj0gOSB8fAotCQkgSVNf SEFTV0VMTChkZXZfcHJpdikgfHwgSVNfQlJPQURXRUxMKGRldl9wcml2KSkKLQkJcmV0dXJuIG1h eF9jZGNsa19mcmVxOwotCWVsc2UgaWYgKElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQlyZXR1 cm4gbWF4X2NkY2xrX2ZyZXEqOTUvMTAwOwotCWVsc2UgaWYgKElOVEVMX0lORk8oZGV2X3ByaXYp LT5nZW4gPCA0KQotCQlyZXR1cm4gMiptYXhfY2RjbGtfZnJlcSo5MC8xMDA7Ci0JZWxzZQotCQly ZXR1cm4gbWF4X2NkY2xrX2ZyZXEqOTAvMTAwOwotfQorCWlmIChXQVJOX09OKGludGVsX2NydGMt PmFjdGl2ZSkpCisJCXJldHVybjsKIAotc3RhdGljIGludCBza2xfY2FsY19jZGNsayhpbnQgbWF4 X3BpeGNsaywgaW50IHZjbyk7CisJaWYgKGludGVsX2NydGNfaGFzX2RwX2VuY29kZXIoaW50ZWxf Y3J0Yy0+Y29uZmlnKSkKKwkJaW50ZWxfZHBfc2V0X21fbihpbnRlbF9jcnRjLCBNMV9OMSk7CiAK LXN0YXRpYyB2b2lkIGludGVsX3VwZGF0ZV9tYXhfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2KQotewotCWlmIChJU19HRU45X0JDKGRldl9wcml2KSkgewotCQl1MzIgbGlt aXQgPSBJOTE1X1JFQUQoU0tMX0RGU00pICYgU0tMX0RGU01fQ0RDTEtfTElNSVRfTUFTSzsKLQkJ aW50IG1heF9jZGNsaywgdmNvOworCWludGVsX3NldF9waXBlX3RpbWluZ3MoaW50ZWxfY3J0Yyk7 CisJaW50ZWxfc2V0X3BpcGVfc3JjX3NpemUoaW50ZWxfY3J0Yyk7CiAKLQkJdmNvID0gZGV2X3By aXYtPnNrbF9wcmVmZXJyZWRfdmNvX2ZyZXE7Ci0JCVdBUk5fT04odmNvICE9IDgxMDAwMDAgJiYg dmNvICE9IDg2NDAwMDApOworCWlmIChJU19DSEVSUllWSUVXKGRldl9wcml2KSAmJiBwaXBlID09 IFBJUEVfQikgeworCQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1 KGRldik7CiAKLQkJLyoKLQkJICogVXNlIHRoZSBsb3dlciAodmNvIDg2NDApIGNkY2xrIHZhbHVl cyBhcyBhCi0JCSAqIGZpcnN0IGd1ZXNzLiBza2xfY2FsY19jZGNsaygpIHdpbGwgY29ycmVjdCBp dAotCQkgKiBpZiB0aGUgcHJlZmVycmVkIHZjbyBpcyA4MTAwIGluc3RlYWQuCi0JCSAqLwotCQlp ZiAobGltaXQgPT0gU0tMX0RGU01fQ0RDTEtfTElNSVRfNjc1KQotCQkJbWF4X2NkY2xrID0gNjE3 MTQzOwotCQllbHNlIGlmIChsaW1pdCA9PSBTS0xfREZTTV9DRENMS19MSU1JVF81NDApCi0JCQlt YXhfY2RjbGsgPSA1NDAwMDA7Ci0JCWVsc2UgaWYgKGxpbWl0ID09IFNLTF9ERlNNX0NEQ0xLX0xJ TUlUXzQ1MCkKLQkJCW1heF9jZGNsayA9IDQzMjAwMDsKLQkJZWxzZQotCQkJbWF4X2NkY2xrID0g MzA4NTcxOwotCi0JCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IHNrbF9jYWxjX2NkY2xrKG1h eF9jZGNsaywgdmNvKTsKLQl9IGVsc2UgaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKSB7Ci0J CWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDMxNjgwMDsKLQl9IGVsc2UgaWYgKElTX0JST1hU T04oZGV2X3ByaXYpKSB7Ci0JCWRldl9wcml2LT5tYXhfY2RjbGtfZnJlcSA9IDYyNDAwMDsKLQl9 IGVsc2UgaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikpICB7Ci0JCS8qCi0JCSAqIEZJWE1FIHdp dGggZXh0cmEgY29vbGluZyB3ZSBjYW4gYWxsb3cKLQkJICogNTQwIE1IeiBmb3IgVUxYIGFuZCA2 NzUgTWh6IGZvciBVTFQuCi0JCSAqIEhvdyBjYW4gd2Uga25vdyBpZiBleHRyYSBjb29saW5nIGlz Ci0JCSAqIGF2YWlsYWJsZT8gUENJIElELCBWVEIsIHNvbWV0aGluZyBlbHNlPwotCQkgKi8KLQkJ aWYgKEk5MTVfUkVBRChGVVNFX1NUUkFQKSAmIEhTV19DRENMS19MSU1JVCkKLQkJCWRldl9wcml2 LT5tYXhfY2RjbGtfZnJlcSA9IDQ1MDAwMDsKLQkJZWxzZSBpZiAoSVNfQkRXX1VMWChkZXZfcHJp dikpCi0JCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA0NTAwMDA7Ci0JCWVsc2UgaWYgKElT X0JEV19VTFQoZGV2X3ByaXYpKQotCQkJZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxID0gNTQwMDAw OwotCQllbHNlCi0JCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA2NzUwMDA7Ci0JfSBlbHNl IGlmIChJU19DSEVSUllWSUVXKGRldl9wcml2KSkgewotCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2Zy ZXEgPSAzMjAwMDA7Ci0JfSBlbHNlIGlmIChJU19WQUxMRVlWSUVXKGRldl9wcml2KSkgewotCQlk ZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgPSA0MDAwMDA7Ci0JfSBlbHNlIHsKLQkJLyogb3RoZXJ3 aXNlIGFzc3VtZSBjZGNsayBpcyBmaXhlZCAqLwotCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEg PSBkZXZfcHJpdi0+Y2RjbGtfZnJlcTsKKwkJSTkxNV9XUklURShDSFZfQkxFTkQocGlwZSksIENI Vl9CTEVORF9MRUdBQ1kpOworCQlJOTE1X1dSSVRFKENIVl9DQU5WQVMocGlwZSksIDApOwogCX0K IAotCWRldl9wcml2LT5tYXhfZG90Y2xrX2ZyZXEgPSBpbnRlbF9jb21wdXRlX21heF9kb3RjbGso ZGV2X3ByaXYpOwotCi0JRFJNX0RFQlVHX0RSSVZFUigiTWF4IENEIGNsb2NrIHJhdGU6ICVkIGtI elxuIiwKLQkJCSBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEpOwotCi0JRFJNX0RFQlVHX0RSSVZF UigiTWF4IGRvdGNsb2NrIHJhdGU6ICVkIGtIelxuIiwKLQkJCSBkZXZfcHJpdi0+bWF4X2RvdGNs a19mcmVxKTsKLX0KLQotc3RhdGljIHZvaWQgaW50ZWxfdXBkYXRlX2NkY2xrKHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQlkZXZfcHJpdi0+Y2RjbGtfZnJlcSA9IGRldl9w cml2LT5kaXNwbGF5LmdldF9jZGNsayhkZXZfcHJpdik7Ci0KLQlpZiAoSU5URUxfR0VOKGRldl9w cml2KSA+PSA5KQotCQlEUk1fREVCVUdfRFJJVkVSKCJDdXJyZW50IENEIGNsb2NrIHJhdGU6ICVk IGtIeiwgVkNPOiAlZCBrSHosIHJlZjogJWQga0h6XG4iLAotCQkJCSBkZXZfcHJpdi0+Y2RjbGtf ZnJlcSwgZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28sCi0JCQkJIGRldl9wcml2LT5jZGNsa19wbGwu cmVmKTsKLQllbHNlCi0JCURSTV9ERUJVR19EUklWRVIoIkN1cnJlbnQgQ0QgY2xvY2sgcmF0ZTog JWQga0h6XG4iLAotCQkJCSBkZXZfcHJpdi0+Y2RjbGtfZnJlcSk7Ci0KLQkvKgotCSAqIDk6MCBD TUJVUyBbc2ljXSBDRENMSyBmcmVxdWVuY3kgKGNkZnJlcSk6Ci0JICogUHJvZ3JhbW1uZyBbc2lj XSBub3RlOiBiaXRbOToyXSBzaG91bGQgYmUgcHJvZ3JhbW1lZCB0byB0aGUgbnVtYmVyCi0JICog b2YgY2RjbGsgdGhhdCBnZW5lcmF0ZXMgNE1IeiByZWZlcmVuY2UgY2xvY2sgZnJlcSB3aGljaCBp cyB1c2VkIHRvCi0JICogZ2VuZXJhdGUgR01CdXMgY2xvY2suIFRoaXMgd2lsbCB2YXJ5IHdpdGgg dGhlIGNkY2xrIGZyZXEuCi0JICovCi0JaWYgKElTX1ZBTExFWVZJRVcoZGV2X3ByaXYpIHx8IElT X0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQlJOTE1X1dSSVRFKEdNQlVTRlJFUV9WTFYsIERJVl9S T1VORF9VUChkZXZfcHJpdi0+Y2RjbGtfZnJlcSwgMTAwMCkpOwotfQorCWk5eHhfc2V0X3BpcGVj b25mKGludGVsX2NydGMpOwogCi0vKiBjb252ZXJ0IGZyb20ga0h6IHRvIC4xIGZpeHBvaW50IE1I eiB3aXRoIC0xTUh6IG9mZnNldCAqLwotc3RhdGljIGludCBza2xfY2RjbGtfZGVjaW1hbChpbnQg Y2RjbGspCi17Ci0JcmV0dXJuIERJVl9ST1VORF9DTE9TRVNUKGNkY2xrIC0gMTAwMCwgNTAwKTsK LX0KKwlpbnRlbF9jcnRjLT5hY3RpdmUgPSB0cnVlOwogCi1zdGF0aWMgaW50IGJ4dF9kZV9wbGxf dmNvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50IGNkY2xrKQotewotCWlu dCByYXRpbzsKKwlpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldl9wcml2 LCBwaXBlLCB0cnVlKTsKIAotCWlmIChjZGNsayA9PSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZikK LQkJcmV0dXJuIDA7CisJaW50ZWxfZW5jb2RlcnNfcHJlX3BsbF9lbmFibGUoY3J0YywgcGlwZV9j b25maWcsIG9sZF9zdGF0ZSk7CiAKLQlzd2l0Y2ggKGNkY2xrKSB7Ci0JZGVmYXVsdDoKLQkJTUlT U0lOR19DQVNFKGNkY2xrKTsKLQljYXNlIDE0NDAwMDoKLQljYXNlIDI4ODAwMDoKLQljYXNlIDM4 NDAwMDoKLQljYXNlIDU3NjAwMDoKLQkJcmF0aW8gPSA2MDsKLQkJYnJlYWs7Ci0JY2FzZSA2MjQw MDA6Ci0JCXJhdGlvID0gNjU7Ci0JCWJyZWFrOworCWlmIChJU19DSEVSUllWSUVXKGRldl9wcml2 KSkgeworCQljaHZfcHJlcGFyZV9wbGwoaW50ZWxfY3J0YywgaW50ZWxfY3J0Yy0+Y29uZmlnKTsK KwkJY2h2X2VuYWJsZV9wbGwoaW50ZWxfY3J0YywgaW50ZWxfY3J0Yy0+Y29uZmlnKTsKKwl9IGVs c2UgeworCQl2bHZfcHJlcGFyZV9wbGwoaW50ZWxfY3J0YywgaW50ZWxfY3J0Yy0+Y29uZmlnKTsK KwkJdmx2X2VuYWJsZV9wbGwoaW50ZWxfY3J0YywgaW50ZWxfY3J0Yy0+Y29uZmlnKTsKIAl9CiAK LQlyZXR1cm4gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYgKiByYXRpbzsKLX0KKwlpbnRlbF9lbmNv ZGVyc19wcmVfZW5hYmxlKGNydGMsIHBpcGVfY29uZmlnLCBvbGRfc3RhdGUpOwogCi1zdGF0aWMg aW50IGdsa19kZV9wbGxfdmNvKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwgaW50 IGNkY2xrKQotewotCWludCByYXRpbzsKKwlpOXh4X3BmaXRfZW5hYmxlKGludGVsX2NydGMpOwog Ci0JaWYgKGNkY2xrID09IGRldl9wcml2LT5jZGNsa19wbGwucmVmKQotCQlyZXR1cm4gMDsKKwlp bnRlbF9jb2xvcl9sb2FkX2x1dHMoJnBpcGVfY29uZmlnLT5iYXNlKTsKIAotCXN3aXRjaCAoY2Rj bGspIHsKLQlkZWZhdWx0OgotCQlNSVNTSU5HX0NBU0UoY2RjbGspOwotCWNhc2UgIDc5MjAwOgot CWNhc2UgMTU4NDAwOgotCWNhc2UgMzE2ODAwOgotCQlyYXRpbyA9IDMzOwotCQlicmVhazsKLQl9 CisJaW50ZWxfdXBkYXRlX3dhdGVybWFya3MoaW50ZWxfY3J0Yyk7CisJaW50ZWxfZW5hYmxlX3Bp cGUoaW50ZWxfY3J0Yyk7CisKKwlhc3NlcnRfdmJsYW5rX2Rpc2FibGVkKGNydGMpOworCWRybV9j cnRjX3ZibGFua19vbihjcnRjKTsKIAotCXJldHVybiBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZiAq IHJhdGlvOworCWludGVsX2VuY29kZXJzX2VuYWJsZShjcnRjLCBwaXBlX2NvbmZpZywgb2xkX3N0 YXRlKTsKIH0KIAotc3RhdGljIHZvaWQgYnh0X2RlX3BsbF9kaXNhYmxlKHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIGk5eHhfc2V0X3BsbF9kaXZpZGVycyhz dHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YykKIHsKLQlJOTE1X1dSSVRFKEJYVF9ERV9QTExfRU5BQkxF LCAwKTsKLQotCS8qIFRpbWVvdXQgMjAwdXMgKi8KLQlpZiAoaW50ZWxfd2FpdF9mb3JfcmVnaXN0 ZXIoZGV2X3ByaXYsCi0JCQkJICAgIEJYVF9ERV9QTExfRU5BQkxFLCBCWFRfREVfUExMX0xPQ0ss IDAsCi0JCQkJICAgIDEpKQotCQlEUk1fRVJST1IoInRpbWVvdXQgd2FpdGluZyBmb3IgREUgUExM IHVubG9ja1xuIik7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2Owor CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKIAotCWRl dl9wcml2LT5jZGNsa19wbGwudmNvID0gMDsKKwlJOTE1X1dSSVRFKEZQMChjcnRjLT5waXBlKSwg Y3J0Yy0+Y29uZmlnLT5kcGxsX2h3X3N0YXRlLmZwMCk7CisJSTkxNV9XUklURShGUDEoY3J0Yy0+ cGlwZSksIGNydGMtPmNvbmZpZy0+ZHBsbF9od19zdGF0ZS5mcDEpOwogfQogCi1zdGF0aWMgdm9p ZCBieHRfZGVfcGxsX2VuYWJsZShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGlu dCB2Y28pCitzdGF0aWMgdm9pZCBpOXh4X2NydGNfZW5hYmxlKHN0cnVjdCBpbnRlbF9jcnRjX3N0 YXRlICpwaXBlX2NvbmZpZywKKwkJCSAgICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9z dGF0ZSkKIHsKLQlpbnQgcmF0aW8gPSBESVZfUk9VTkRfQ0xPU0VTVCh2Y28sIGRldl9wcml2LT5j ZGNsa19wbGwucmVmKTsKLQl1MzIgdmFsOworCXN0cnVjdCBkcm1fY3J0YyAqY3J0YyA9IHBpcGVf Y29uZmlnLT5iYXNlLmNydGM7CisJc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmRldjsK KwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7CisJc3Ry dWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMpOworCWVudW0g cGlwZSBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKIAotCXZhbCA9IEk5MTVfUkVBRChCWFRfREVf UExMX0NUTCk7Ci0JdmFsICY9IH5CWFRfREVfUExMX1JBVElPX01BU0s7Ci0JdmFsIHw9IEJYVF9E RV9QTExfUkFUSU8ocmF0aW8pOwotCUk5MTVfV1JJVEUoQlhUX0RFX1BMTF9DVEwsIHZhbCk7CisJ aWYgKFdBUk5fT04oaW50ZWxfY3J0Yy0+YWN0aXZlKSkKKwkJcmV0dXJuOwogCi0JSTkxNV9XUklU RShCWFRfREVfUExMX0VOQUJMRSwgQlhUX0RFX1BMTF9QTExfRU5BQkxFKTsKKwlpOXh4X3NldF9w bGxfZGl2aWRlcnMoaW50ZWxfY3J0Yyk7CiAKLQkvKiBUaW1lb3V0IDIwMHVzICovCi0JaWYgKGlu dGVsX3dhaXRfZm9yX3JlZ2lzdGVyKGRldl9wcml2LAotCQkJCSAgICBCWFRfREVfUExMX0VOQUJM RSwKLQkJCQkgICAgQlhUX0RFX1BMTF9MT0NLLAotCQkJCSAgICBCWFRfREVfUExMX0xPQ0ssCi0J CQkJICAgIDEpKQotCQlEUk1fRVJST1IoInRpbWVvdXQgd2FpdGluZyBmb3IgREUgUExMIGxvY2tc biIpOworCWlmIChpbnRlbF9jcnRjX2hhc19kcF9lbmNvZGVyKGludGVsX2NydGMtPmNvbmZpZykp CisJCWludGVsX2RwX3NldF9tX24oaW50ZWxfY3J0YywgTTFfTjEpOwogCi0JZGV2X3ByaXYtPmNk Y2xrX3BsbC52Y28gPSB2Y287Ci19CisJaW50ZWxfc2V0X3BpcGVfdGltaW5ncyhpbnRlbF9jcnRj KTsKKwlpbnRlbF9zZXRfcGlwZV9zcmNfc2l6ZShpbnRlbF9jcnRjKTsKIAotc3RhdGljIHZvaWQg Ynh0X3NldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBjZGNs aykKLXsKLQl1MzIgdmFsLCBkaXZpZGVyOwotCWludCB2Y28sIHJldDsKKwlpOXh4X3NldF9waXBl Y29uZihpbnRlbF9jcnRjKTsKIAotCWlmIChJU19HRU1JTklMQUtFKGRldl9wcml2KSkKLQkJdmNv ID0gZ2xrX2RlX3BsbF92Y28oZGV2X3ByaXYsIGNkY2xrKTsKLQllbHNlCi0JCXZjbyA9IGJ4dF9k ZV9wbGxfdmNvKGRldl9wcml2LCBjZGNsayk7CisJaW50ZWxfY3J0Yy0+YWN0aXZlID0gdHJ1ZTsK IAotCURSTV9ERUJVR19EUklWRVIoIkNoYW5naW5nIENEQ0xLIHRvICVkIGtIeiAoVkNPICVkIGtI eilcbiIsIGNkY2xrLCB2Y28pOworCWlmICghSVNfR0VOMihkZXZfcHJpdikpCisJCWludGVsX3Nl dF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2X3ByaXYsIHBpcGUsIHRydWUpOwogCi0J LyogY2RjbGsgPSB2Y28gLyAyIC8gZGl2ezEsMS41LDIsNH0gKi8KLQlzd2l0Y2ggKERJVl9ST1VO RF9DTE9TRVNUKHZjbywgY2RjbGspKSB7Ci0JY2FzZSA4OgotCQlkaXZpZGVyID0gQlhUX0NEQ0xL X0NEMlhfRElWX1NFTF80OwotCQlicmVhazsKLQljYXNlIDQ6Ci0JCWRpdmlkZXIgPSBCWFRfQ0RD TEtfQ0QyWF9ESVZfU0VMXzI7Ci0JCWJyZWFrOwotCWNhc2UgMzoKLQkJV0FSTihJU19HRU1JTklM QUtFKGRldl9wcml2KSwgIlVuc3VwcG9ydGVkIGRpdmlkZXJcbiIpOwotCQlkaXZpZGVyID0gQlhU X0NEQ0xLX0NEMlhfRElWX1NFTF8xXzU7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJZGl2aWRlciA9 IEJYVF9DRENMS19DRDJYX0RJVl9TRUxfMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJV0FSTl9P TihjZGNsayAhPSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZik7Ci0JCVdBUk5fT04odmNvICE9IDAp OworCWludGVsX2VuY29kZXJzX3ByZV9lbmFibGUoY3J0YywgcGlwZV9jb25maWcsIG9sZF9zdGF0 ZSk7CiAKLQkJZGl2aWRlciA9IEJYVF9DRENMS19DRDJYX0RJVl9TRUxfMTsKLQkJYnJlYWs7Ci0J fQorCWk5eHhfZW5hYmxlX3BsbChpbnRlbF9jcnRjKTsKIAotCS8qIEluZm9ybSBwb3dlciBjb250 cm9sbGVyIG9mIHVwY29taW5nIGZyZXF1ZW5jeSBjaGFuZ2UgKi8KLQltdXRleF9sb2NrKCZkZXZf cHJpdi0+cnBzLmh3X2xvY2spOwotCXJldCA9IHNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKGRldl9w cml2LCBIU1dfUENPREVfREVfV1JJVEVfRlJFUV9SRVEsCi0JCQkJICAgICAgMHg4MDAwMDAwMCk7 Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOworCWk5eHhfcGZpdF9lbmFi bGUoaW50ZWxfY3J0Yyk7CiAKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiUENvZGUgQ0RDTEsg ZnJlcSBjaGFuZ2Ugbm90aWZ5IGZhaWxlZCAoZXJyICVkLCBmcmVxICVkKVxuIiwKLQkJCSAgcmV0 LCBjZGNsayk7Ci0JCXJldHVybjsKLQl9CisJaW50ZWxfY29sb3JfbG9hZF9sdXRzKCZwaXBlX2Nv bmZpZy0+YmFzZSk7CiAKLQlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gIT0gMCAmJgotCSAg ICBkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSB2Y28pCi0JCWJ4dF9kZV9wbGxfZGlzYWJsZShk ZXZfcHJpdik7CisJaW50ZWxfdXBkYXRlX3dhdGVybWFya3MoaW50ZWxfY3J0Yyk7CisJaW50ZWxf ZW5hYmxlX3BpcGUoaW50ZWxfY3J0Yyk7CiAKLQlpZiAoZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28g IT0gdmNvKQotCQlieHRfZGVfcGxsX2VuYWJsZShkZXZfcHJpdiwgdmNvKTsKKwlhc3NlcnRfdmJs YW5rX2Rpc2FibGVkKGNydGMpOworCWRybV9jcnRjX3ZibGFua19vbihjcnRjKTsKIAotCXZhbCA9 IGRpdmlkZXIgfCBza2xfY2RjbGtfZGVjaW1hbChjZGNsayk7Ci0JLyoKLQkgKiBGSVhNRSBpZiBv bmx5IHRoZSBjZDJ4IGRpdmlkZXIgbmVlZHMgY2hhbmdpbmcsIGl0IGNvdWxkIGJlIGRvbmUKLQkg KiB3aXRob3V0IHNodXR0aW5nIG9mZiB0aGUgcGlwZSAoaWYgb25seSBvbmUgcGlwZSBpcyBhY3Rp dmUpLgotCSAqLwotCXZhbCB8PSBCWFRfQ0RDTEtfQ0QyWF9QSVBFX05PTkU7Ci0JLyoKLQkgKiBE aXNhYmxlIFNTQSBQcmVjaGFyZ2Ugd2hlbiBDRCBjbG9jayBmcmVxdWVuY3kgPCA1MDAgTUh6LAot CSAqIGVuYWJsZSBvdGhlcndpc2UuCi0JICovCi0JaWYgKGNkY2xrID49IDUwMDAwMCkKLQkJdmFs IHw9IEJYVF9DRENMS19TU0FfUFJFQ0hBUkdFX0VOQUJMRTsKLQlJOTE1X1dSSVRFKENEQ0xLX0NU TCwgdmFsKTsKKwlpbnRlbF9lbmNvZGVyc19lbmFibGUoY3J0YywgcGlwZV9jb25maWcsIG9sZF9z dGF0ZSk7Cit9CiAKLQltdXRleF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwotCXJldCA9 IHNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRlKGRldl9wcml2LCBIU1dfUENPREVfREVfV1JJVEVfRlJF UV9SRVEsCi0JCQkJICAgICAgRElWX1JPVU5EX1VQKGNkY2xrLCAyNTAwMCkpOwotCW11dGV4X3Vu bG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKK3N0YXRpYyB2b2lkIGk5eHhfcGZpdF9kaXNh YmxlKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQoreworCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYg PSBjcnRjLT5iYXNlLmRldjsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0 b19pOTE1KGRldik7CiAKLQlpZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiUENvZGUgQ0RDTEsgZnJl cSBzZXQgZmFpbGVkLCAoZXJyICVkLCBmcmVxICVkKVxuIiwKLQkJCSAgcmV0LCBjZGNsayk7CisJ aWYgKCFjcnRjLT5jb25maWctPmdtY2hfcGZpdC5jb250cm9sKQogCQlyZXR1cm47Ci0JfQogCi0J aW50ZWxfdXBkYXRlX2NkY2xrKGRldl9wcml2KTsKKwlhc3NlcnRfcGlwZV9kaXNhYmxlZChkZXZf cHJpdiwgY3J0Yy0+cGlwZSk7CisKKwlEUk1fREVCVUdfRFJJVkVSKCJkaXNhYmxpbmcgcGZpdCwg Y3VycmVudDogMHglMDh4XG4iLAorCQkJIEk5MTVfUkVBRChQRklUX0NPTlRST0wpKTsKKwlJOTE1 X1dSSVRFKFBGSVRfQ09OVFJPTCwgMCk7CiB9CiAKLXN0YXRpYyB2b2lkIGJ4dF9zYW5pdGl6ZV9j ZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCitzdGF0aWMgdm9pZCBpOXh4 X2NydGNfZGlzYWJsZShzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqb2xkX2NydGNfc3RhdGUsCisJ CQkgICAgICBzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqb2xkX3N0YXRlKQogewotCXUzMiBjZGN0 bCwgZXhwZWN0ZWQ7Ci0KLQlpbnRlbF91cGRhdGVfY2RjbGsoZGV2X3ByaXYpOwotCi0JaWYgKGRl dl9wcml2LT5jZGNsa19wbGwudmNvID09IDAgfHwKLQkgICAgZGV2X3ByaXYtPmNkY2xrX2ZyZXEg PT0gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYpCi0JCWdvdG8gc2FuaXRpemU7Ci0KLQkvKiBEUExM IG9rYXk7IHZlcmlmeSB0aGUgY2RjbG9jawotCSAqCi0JICogU29tZSBCSU9TIHZlcnNpb25zIGxl YXZlIGFuIGluY29ycmVjdCBkZWNpbWFsIGZyZXF1ZW5jeSB2YWx1ZSBhbmQKLQkgKiBzZXQgcmVz ZXJ2ZWQgTUJaIGJpdHMgaW4gQ0RDTEtfQ1RMIGF0IGxlYXN0IGR1cmluZyBleGl0aW5nIGZyb20g UzQsCi0JICogc28gc2FuaXRpemUgdGhpcyByZWdpc3Rlci4KLQkgKi8KLQljZGN0bCA9IEk5MTVf UkVBRChDRENMS19DVEwpOwotCS8qCi0JICogTGV0J3MgaWdub3JlIHRoZSBwaXBlIGZpZWxkLCBz aW5jZSBCSU9TIGNvdWxkIGhhdmUgY29uZmlndXJlZCB0aGUKLQkgKiBkaXZpZGVycyBib3RoIHN5 bmNoaW5nIHRvIGFuIGFjdGl2ZSBwaXBlLCBvciBhc3luY2hyb25vdXNseQotCSAqIChQSVBFX05P TkUpLgotCSAqLwotCWNkY3RsICY9IH5CWFRfQ0RDTEtfQ0QyWF9QSVBFX05PTkU7CisJc3RydWN0 IGRybV9jcnRjICpjcnRjID0gb2xkX2NydGNfc3RhdGUtPmJhc2UuY3J0YzsKKwlzdHJ1Y3QgZHJt X2RldmljZSAqZGV2ID0gY3J0Yy0+ZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiA9IHRvX2k5MTUoZGV2KTsKKwlzdHJ1Y3QgaW50ZWxfY3J0YyAqaW50ZWxfY3J0YyA9IHRv X2ludGVsX2NydGMoY3J0Yyk7CisJaW50IHBpcGUgPSBpbnRlbF9jcnRjLT5waXBlOwogCi0JZXhw ZWN0ZWQgPSAoY2RjdGwgJiBCWFRfQ0RDTEtfQ0QyWF9ESVZfU0VMX01BU0spIHwKLQkJICAgc2ts X2NkY2xrX2RlY2ltYWwoZGV2X3ByaXYtPmNkY2xrX2ZyZXEpOwogCS8qCi0JICogRGlzYWJsZSBT U0EgUHJlY2hhcmdlIHdoZW4gQ0QgY2xvY2sgZnJlcXVlbmN5IDwgNTAwIE1IeiwKLQkgKiBlbmFi bGUgb3RoZXJ3aXNlLgorCSAqIE9uIGdlbjIgcGxhbmVzIGFyZSBkb3VibGUgYnVmZmVyZWQgYnV0 IHRoZSBwaXBlIGlzbid0LCBzbyB3ZSBtdXN0CisJICogd2FpdCBmb3IgcGxhbmVzIHRvIGZ1bGx5 IHR1cm4gb2ZmIGJlZm9yZSBkaXNhYmxpbmcgdGhlIHBpcGUuCiAJICovCi0JaWYgKGRldl9wcml2 LT5jZGNsa19mcmVxID49IDUwMDAwMCkKLQkJZXhwZWN0ZWQgfD0gQlhUX0NEQ0xLX1NTQV9QUkVD SEFSR0VfRU5BQkxFOwotCi0JaWYgKGNkY3RsID09IGV4cGVjdGVkKQotCQkvKiBBbGwgd2VsbDsg bm90aGluZyB0byBzYW5pdGl6ZSAqLwotCQlyZXR1cm47CisJaWYgKElTX0dFTjIoZGV2X3ByaXYp KQorCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2X3ByaXYsIHBpcGUpOwogCi1zYW5pdGl6ZToK LQlEUk1fREVCVUdfS01TKCJTYW5pdGl6aW5nIGNkY2xrIHByb2dyYW1tZWQgYnkgcHJlLW9zXG4i KTsKKwlpbnRlbF9lbmNvZGVyc19kaXNhYmxlKGNydGMsIG9sZF9jcnRjX3N0YXRlLCBvbGRfc3Rh dGUpOwogCi0JLyogZm9yY2UgY2RjbGsgcHJvZ3JhbW1pbmcgKi8KLQlkZXZfcHJpdi0+Y2RjbGtf ZnJlcSA9IDA7CisJZHJtX2NydGNfdmJsYW5rX29mZihjcnRjKTsKKwlhc3NlcnRfdmJsYW5rX2Rp c2FibGVkKGNydGMpOwogCi0JLyogZm9yY2UgZnVsbCBQTEwgZGlzYWJsZSArIGVuYWJsZSAqLwot CWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gLTE7Ci19CisJaW50ZWxfZGlzYWJsZV9waXBlKGlu dGVsX2NydGMpOwogCi12b2lkIGJ4dF9pbml0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKLXsKLQlpbnQgY2RjbGs7CisJaTl4eF9wZml0X2Rpc2FibGUoaW50ZWxfY3J0 Yyk7CiAKLQlieHRfc2FuaXRpemVfY2RjbGsoZGV2X3ByaXYpOworCWludGVsX2VuY29kZXJzX3Bv c3RfZGlzYWJsZShjcnRjLCBvbGRfY3J0Y19zdGF0ZSwgb2xkX3N0YXRlKTsKIAotCWlmIChkZXZf cHJpdi0+Y2RjbGtfZnJlcSAhPSAwICYmIGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IDApCi0J CXJldHVybjsKKwlpZiAoIWludGVsX2NydGNfaGFzX3R5cGUoaW50ZWxfY3J0Yy0+Y29uZmlnLCBJ TlRFTF9PVVRQVVRfRFNJKSkgeworCQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCisJCQlj aHZfZGlzYWJsZV9wbGwoZGV2X3ByaXYsIHBpcGUpOworCQllbHNlIGlmIChJU19WQUxMRVlWSUVX KGRldl9wcml2KSkKKwkJCXZsdl9kaXNhYmxlX3BsbChkZXZfcHJpdiwgcGlwZSk7CisJCWVsc2UK KwkJCWk5eHhfZGlzYWJsZV9wbGwoaW50ZWxfY3J0Yyk7CisJfQogCi0JLyoKLQkgKiBGSVhNRToK LQkgKiAtIFRoZSBpbml0aWFsIENEQ0xLIG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBWQlQuCi0JICog ICBOZWVkIHRvIG1ha2UgdGhpcyBjaGFuZ2UgYWZ0ZXIgVkJUIGhhcyBjaGFuZ2VzIGZvciBCWFQu Ci0JICovCi0JaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQotCQljZGNsayA9IGdsa19jYWxj X2NkY2xrKDApOwotCWVsc2UKLQkJY2RjbGsgPSBieHRfY2FsY19jZGNsaygwKTsKKwlpbnRlbF9l bmNvZGVyc19wb3N0X3BsbF9kaXNhYmxlKGNydGMsIG9sZF9jcnRjX3N0YXRlLCBvbGRfc3RhdGUp OwogCi0JYnh0X3NldF9jZGNsayhkZXZfcHJpdiwgY2RjbGspOworCWlmICghSVNfR0VOMihkZXZf cHJpdikpCisJCWludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2X3ByaXYs IHBpcGUsIGZhbHNlKTsKIH0KIAotdm9pZCBieHRfdW5pbml0X2NkY2xrKHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIGludGVsX2NydGNfZGlzYWJsZV9ub2F0 b21pYyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCiB7Ci0JYnh0X3NldF9jZGNsayhkZXZfcHJpdiwg ZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWYpOwotfQorCXN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNv ZGVyOworCXN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRj KTsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGNydGMtPmRl dik7CisJZW51bSBpbnRlbF9kaXNwbGF5X3Bvd2VyX2RvbWFpbiBkb21haW47CisJdW5zaWduZWQg bG9uZyBkb21haW5zOworCXN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpzdGF0ZTsKKwlzdHJ1Y3Qg aW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKKwlpbnQgcmV0OwogCi1zdGF0aWMgaW50IHNr bF9jYWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrLCBpbnQgdmNvKQotewotCWlmICh2Y28gPT0gODY0 MDAwMCkgewotCQlpZiAobWF4X3BpeGNsayA+IDU0MDAwMCkKLQkJCXJldHVybiA2MTcxNDM7Ci0J CWVsc2UgaWYgKG1heF9waXhjbGsgPiA0MzIwMDApCi0JCQlyZXR1cm4gNTQwMDAwOwotCQllbHNl IGlmIChtYXhfcGl4Y2xrID4gMzA4NTcxKQotCQkJcmV0dXJuIDQzMjAwMDsKLQkJZWxzZQotCQkJ cmV0dXJuIDMwODU3MTsKLQl9IGVsc2UgewotCQlpZiAobWF4X3BpeGNsayA+IDU0MDAwMCkKLQkJ CXJldHVybiA2NzUwMDA7Ci0JCWVsc2UgaWYgKG1heF9waXhjbGsgPiA0NTAwMDApCi0JCQlyZXR1 cm4gNTQwMDAwOwotCQllbHNlIGlmIChtYXhfcGl4Y2xrID4gMzM3NTAwKQotCQkJcmV0dXJuIDQ1 MDAwMDsKLQkJZWxzZQotCQkJcmV0dXJuIDMzNzUwMDsKLQl9Ci19CisJaWYgKCFpbnRlbF9jcnRj LT5hY3RpdmUpCisJCXJldHVybjsKIAotc3RhdGljIHZvaWQKLXNrbF9kcGxsMF91cGRhdGUoc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXUzMiB2YWw7CisJaWYgKGNydGMt PnByaW1hcnktPnN0YXRlLT52aXNpYmxlKSB7CisJCVdBUk5fT04oaW50ZWxfY3J0Yy0+ZmxpcF93 b3JrKTsKIAotCWRldl9wcml2LT5jZGNsa19wbGwucmVmID0gMjQwMDA7Ci0JZGV2X3ByaXYtPmNk Y2xrX3BsbC52Y28gPSAwOworCQlpbnRlbF9wcmVfZGlzYWJsZV9wcmltYXJ5X25vYXRvbWljKGNy dGMpOwogCi0JdmFsID0gSTkxNV9SRUFEKExDUExMMV9DVEwpOwotCWlmICgodmFsICYgTENQTExf UExMX0VOQUJMRSkgPT0gMCkKLQkJcmV0dXJuOworCQlpbnRlbF9jcnRjX2Rpc2FibGVfcGxhbmVz KGNydGMsIDEgPDwgZHJtX3BsYW5lX2luZGV4KGNydGMtPnByaW1hcnkpKTsKKwkJY3J0Yy0+cHJp bWFyeS0+c3RhdGUtPnZpc2libGUgPSBmYWxzZTsKKwl9CiAKLQlpZiAoV0FSTl9PTigodmFsICYg TENQTExfUExMX0xPQ0spID09IDApKQorCXN0YXRlID0gZHJtX2F0b21pY19zdGF0ZV9hbGxvYyhj cnRjLT5kZXYpOworCWlmICghc3RhdGUpIHsKKwkJRFJNX0RFQlVHX0tNUygiZmFpbGVkIHRvIGRp c2FibGUgW0NSVEM6JWQ6JXNdLCBvdXQgb2YgbWVtb3J5IiwKKwkJCSAgICAgIGNydGMtPmJhc2Uu aWQsIGNydGMtPm5hbWUpOwogCQlyZXR1cm47CisJfQogCi0JdmFsID0gSTkxNV9SRUFEKERQTExf Q1RSTDEpOworCXN0YXRlLT5hY3F1aXJlX2N0eCA9IGNydGMtPmRldi0+bW9kZV9jb25maWcuYWNx dWlyZV9jdHg7CiAKLQlpZiAoV0FSTl9PTigodmFsICYgKERQTExfQ1RSTDFfSERNSV9NT0RFKFNL TF9EUExMMCkgfAotCQkJICAgIERQTExfQ1RSTDFfU1NDKFNLTF9EUExMMCkgfAotCQkJICAgIERQ TExfQ1RSTDFfT1ZFUlJJREUoU0tMX0RQTEwwKSkpICE9Ci0JCSAgICBEUExMX0NUUkwxX09WRVJS SURFKFNLTF9EUExMMCkpKQotCQlyZXR1cm47CisJLyogRXZlcnl0aGluZydzIGFscmVhZHkgbG9j a2VkLCAtRURFQURMSyBjYW4ndCBoYXBwZW4uICovCisJY3J0Y19zdGF0ZSA9IGludGVsX2F0b21p Y19nZXRfY3J0Y19zdGF0ZShzdGF0ZSwgaW50ZWxfY3J0Yyk7CisJcmV0ID0gZHJtX2F0b21pY19h ZGRfYWZmZWN0ZWRfY29ubmVjdG9ycyhzdGF0ZSwgY3J0Yyk7CiAKLQlzd2l0Y2ggKHZhbCAmIERQ TExfQ1RSTDFfTElOS19SQVRFX01BU0soU0tMX0RQTEwwKSkgewotCWNhc2UgRFBMTF9DVFJMMV9M SU5LX1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfODEwLCBTS0xfRFBMTDApOgotCWNhc2UgRFBM TF9DVFJMMV9MSU5LX1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JBVEVfMTM1MCwgU0tMX0RQTEwwKToK LQljYXNlIERQTExfQ1RSTDFfTElOS19SQVRFKERQTExfQ1RSTDFfTElOS19SQVRFXzE2MjAsIFNL TF9EUExMMCk6Ci0JY2FzZSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktfUkFU RV8yNzAwLCBTS0xfRFBMTDApOgotCQlkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9IDgxMDAwMDA7 Ci0JCWJyZWFrOwotCWNhc2UgRFBMTF9DVFJMMV9MSU5LX1JBVEUoRFBMTF9DVFJMMV9MSU5LX1JB VEVfMTA4MCwgU0tMX0RQTEwwKToKLQljYXNlIERQTExfQ1RSTDFfTElOS19SQVRFKERQTExfQ1RS TDFfTElOS19SQVRFXzIxNjAsIFNLTF9EUExMMCk6Ci0JCWRldl9wcml2LT5jZGNsa19wbGwudmNv ID0gODY0MDAwMDsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTUlTU0lOR19DQVNFKHZhbCAmIERQ TExfQ1RSTDFfTElOS19SQVRFX01BU0soU0tMX0RQTEwwKSk7Ci0JCWJyZWFrOwotCX0KLX0KKwlX QVJOX09OKElTX0VSUihjcnRjX3N0YXRlKSB8fCByZXQpOwogCi12b2lkIHNrbF9zZXRfcHJlZmVy cmVkX2NkY2xrX3ZjbyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCB2Y28p Ci17Ci0JYm9vbCBjaGFuZ2VkID0gZGV2X3ByaXYtPnNrbF9wcmVmZXJyZWRfdmNvX2ZyZXEgIT0g dmNvOwotCi0JZGV2X3ByaXYtPnNrbF9wcmVmZXJyZWRfdmNvX2ZyZXEgPSB2Y287Ci0KLQlpZiAo Y2hhbmdlZCkKLQkJaW50ZWxfdXBkYXRlX21heF9jZGNsayhkZXZfcHJpdik7Ci19Ci0KLXN0YXRp YyB2b2lkCi1za2xfZHBsbDBfZW5hYmxlKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp diwgaW50IHZjbykKLXsKLQlpbnQgbWluX2NkY2xrID0gc2tsX2NhbGNfY2RjbGsoMCwgdmNvKTsK LQl1MzIgdmFsOwotCi0JV0FSTl9PTih2Y28gIT0gODEwMDAwMCAmJiB2Y28gIT0gODY0MDAwMCk7 Ci0KLQkvKiBzZWxlY3QgdGhlIG1pbmltdW0gQ0RDTEsgYmVmb3JlIGVuYWJsaW5nIERQTEwgMCAq LwotCXZhbCA9IENEQ0xLX0ZSRVFfMzM3XzMwOCB8IHNrbF9jZGNsa19kZWNpbWFsKG1pbl9jZGNs ayk7Ci0JSTkxNV9XUklURShDRENMS19DVEwsIHZhbCk7Ci0JUE9TVElOR19SRUFEKENEQ0xLX0NU TCk7Ci0KLQkvKgotCSAqIFdlIGFsd2F5cyBlbmFibGUgRFBMTDAgd2l0aCB0aGUgbG93ZXN0IGxp bmsgcmF0ZSBwb3NzaWJsZSwgYnV0IHN0aWxsCi0JICogdGFraW5nIGludG8gYWNjb3VudCB0aGUg VkNPIHJlcXVpcmVkIHRvIG9wZXJhdGUgdGhlIGVEUCBwYW5lbCBhdCB0aGUKLQkgKiBkZXNpcmVk IGZyZXF1ZW5jeS4gVGhlIHVzdWFsIERQIGxpbmsgcmF0ZXMgb3BlcmF0ZSB3aXRoIGEgVkNPIG9m Ci0JICogODEwMCB3aGlsZSB0aGUgZURQIDEuNCBhbHRlcm5hdGUgbGluayByYXRlcyBuZWVkIGEg VkNPIG9mIDg2NDAuCi0JICogVGhlIG1vZGVzZXQgY29kZSBpcyByZXNwb25zaWJsZSBmb3IgdGhl IHNlbGVjdGlvbiBvZiB0aGUgZXhhY3QgbGluawotCSAqIHJhdGUgbGF0ZXIgb24sIHdpdGggdGhl IGNvbnN0cmFpbnQgb2YgY2hvb3NpbmcgYSBmcmVxdWVuY3kgdGhhdAotCSAqIHdvcmtzIHdpdGgg dmNvLgotCSAqLwotCXZhbCA9IEk5MTVfUkVBRChEUExMX0NUUkwxKTsKLQotCXZhbCAmPSB+KERQ TExfQ1RSTDFfSERNSV9NT0RFKFNLTF9EUExMMCkgfCBEUExMX0NUUkwxX1NTQyhTS0xfRFBMTDAp IHwKLQkJIERQTExfQ1RSTDFfTElOS19SQVRFX01BU0soU0tMX0RQTEwwKSk7Ci0JdmFsIHw9IERQ TExfQ1RSTDFfT1ZFUlJJREUoU0tMX0RQTEwwKTsKLQlpZiAodmNvID09IDg2NDAwMDApCi0JCXZh bCB8PSBEUExMX0NUUkwxX0xJTktfUkFURShEUExMX0NUUkwxX0xJTktfUkFURV8xMDgwLAotCQkJ CQkgICAgU0tMX0RQTEwwKTsKLQllbHNlCi0JCXZhbCB8PSBEUExMX0NUUkwxX0xJTktfUkFURShE UExMX0NUUkwxX0xJTktfUkFURV84MTAsCi0JCQkJCSAgICBTS0xfRFBMTDApOwotCi0JSTkxNV9X UklURShEUExMX0NUUkwxLCB2YWwpOwotCVBPU1RJTkdfUkVBRChEUExMX0NUUkwxKTsKLQotCUk5 MTVfV1JJVEUoTENQTEwxX0NUTCwgSTkxNV9SRUFEKExDUExMMV9DVEwpIHwgTENQTExfUExMX0VO QUJMRSk7Ci0KLQlpZiAoaW50ZWxfd2FpdF9mb3JfcmVnaXN0ZXIoZGV2X3ByaXYsCi0JCQkJICAg IExDUExMMV9DVEwsIExDUExMX1BMTF9MT0NLLCBMQ1BMTF9QTExfTE9DSywKLQkJCQkgICAgNSkp Ci0JCURSTV9FUlJPUigiRFBMTDAgbm90IGxvY2tlZFxuIik7Ci0KLQlkZXZfcHJpdi0+Y2RjbGtf cGxsLnZjbyA9IHZjbzsKLQotCS8qIFdlJ2xsIHdhbnQgdG8ga2VlcCB1c2luZyB0aGUgY3VycmVu dCB2Y28gZnJvbSBub3cgb24uICovCi0Jc2tsX3NldF9wcmVmZXJyZWRfY2RjbGtfdmNvKGRldl9w cml2LCB2Y28pOwotfQotCi1zdGF0aWMgdm9pZAotc2tsX2RwbGwwX2Rpc2FibGUoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCUk5MTVfV1JJVEUoTENQTEwxX0NUTCwgSTkx NV9SRUFEKExDUExMMV9DVEwpICYgfkxDUExMX1BMTF9FTkFCTEUpOwotCWlmIChpbnRlbF93YWl0 X2Zvcl9yZWdpc3RlcihkZXZfcHJpdiwKLQkJCQkgICBMQ1BMTDFfQ1RMLCBMQ1BMTF9QTExfTE9D SywgMCwKLQkJCQkgICAxKSkKLQkJRFJNX0VSUk9SKCJDb3VsZG4ndCBkaXNhYmxlIERQTEwwXG4i KTsKLQotCWRldl9wcml2LT5jZGNsa19wbGwudmNvID0gMDsKLX0KLQotc3RhdGljIHZvaWQgc2ts X3NldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsIGludCBjZGNsaywg aW50IHZjbykKLXsKLQl1MzIgZnJlcV9zZWxlY3QsIHBjdV9hY2s7Ci0JaW50IHJldDsKLQotCVdB Uk5fT04oKGNkY2xrID09IDI0MDAwKSAhPSAodmNvID09IDApKTsKLQotCURSTV9ERUJVR19EUklW RVIoIkNoYW5naW5nIENEQ0xLIHRvICVkIGtIeiAoVkNPICVkIGtIeilcbiIsIGNkY2xrLCB2Y28p OwotCi0JbXV0ZXhfbG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQlyZXQgPSBza2xfcGNv ZGVfcmVxdWVzdChkZXZfcHJpdiwgU0tMX1BDT0RFX0NEQ0xLX0NPTlRST0wsCi0JCQkJU0tMX0NE Q0xLX1BSRVBBUkVfRk9SX0NIQU5HRSwKLQkJCQlTS0xfQ0RDTEtfUkVBRFlfRk9SX0NIQU5HRSwK LQkJCQlTS0xfQ0RDTEtfUkVBRFlfRk9SX0NIQU5HRSwgMyk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZf cHJpdi0+cnBzLmh3X2xvY2spOwotCWlmIChyZXQpIHsKLQkJRFJNX0VSUk9SKCJGYWlsZWQgdG8g aW5mb3JtIFBDVSBhYm91dCBjZGNsayBjaGFuZ2UgKCVkKVxuIiwKLQkJCSAgcmV0KTsKLQkJcmV0 dXJuOwotCX0KLQotCS8qIHNldCBDRENMS19DVEwgKi8KLQlzd2l0Y2ggKGNkY2xrKSB7Ci0JY2Fz ZSA0NTAwMDA6Ci0JY2FzZSA0MzIwMDA6Ci0JCWZyZXFfc2VsZWN0ID0gQ0RDTEtfRlJFUV80NTBf NDMyOwotCQlwY3VfYWNrID0gMTsKLQkJYnJlYWs7Ci0JY2FzZSA1NDAwMDA6Ci0JCWZyZXFfc2Vs ZWN0ID0gQ0RDTEtfRlJFUV81NDA7Ci0JCXBjdV9hY2sgPSAyOwotCQlicmVhazsKLQljYXNlIDMw ODU3MToKLQljYXNlIDMzNzUwMDoKLQlkZWZhdWx0OgotCQlmcmVxX3NlbGVjdCA9IENEQ0xLX0ZS RVFfMzM3XzMwODsKLQkJcGN1X2FjayA9IDA7Ci0JCWJyZWFrOwotCWNhc2UgNjE3MTQzOgotCWNh c2UgNjc1MDAwOgotCQlmcmVxX3NlbGVjdCA9IENEQ0xLX0ZSRVFfNjc1XzYxNzsKLQkJcGN1X2Fj ayA9IDM7Ci0JCWJyZWFrOwotCX0KLQotCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSAw ICYmCi0JICAgIGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykKLQkJc2tsX2RwbGwwX2Rp c2FibGUoZGV2X3ByaXYpOwotCi0JaWYgKGRldl9wcml2LT5jZGNsa19wbGwudmNvICE9IHZjbykK LQkJc2tsX2RwbGwwX2VuYWJsZShkZXZfcHJpdiwgdmNvKTsKLQotCUk5MTVfV1JJVEUoQ0RDTEtf Q1RMLCBmcmVxX3NlbGVjdCB8IHNrbF9jZGNsa19kZWNpbWFsKGNkY2xrKSk7Ci0JUE9TVElOR19S RUFEKENEQ0xLX0NUTCk7Ci0KLQkvKiBpbmZvcm0gUENVIG9mIHRoZSBjaGFuZ2UgKi8KLQltdXRl eF9sb2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwotCXNhbmR5YnJpZGdlX3Bjb2RlX3dyaXRl KGRldl9wcml2LCBTS0xfUENPREVfQ0RDTEtfQ09OVFJPTCwgcGN1X2Fjayk7Ci0JbXV0ZXhfdW5s b2NrKCZkZXZfcHJpdi0+cnBzLmh3X2xvY2spOwotCi0JaW50ZWxfdXBkYXRlX2NkY2xrKGRldl9w cml2KTsKLX0KLQotc3RhdGljIHZvaWQgc2tsX3Nhbml0aXplX2NkY2xrKHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdik7Ci0KLXZvaWQgc2tsX3VuaW5pdF9jZGNsayhzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0Jc2tsX3NldF9jZGNsayhkZXZfcHJpdiwgZGV2 X3ByaXYtPmNkY2xrX3BsbC5yZWYsIDApOwotfQotCi12b2lkIHNrbF9pbml0X2NkY2xrKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQlpbnQgY2RjbGssIHZjbzsKLQotCXNr bF9zYW5pdGl6ZV9jZGNsayhkZXZfcHJpdik7Ci0KLQlpZiAoZGV2X3ByaXYtPmNkY2xrX2ZyZXEg IT0gMCAmJiBkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyAhPSAwKSB7Ci0JCS8qCi0JCSAqIFVzZSB0 aGUgY3VycmVudCB2Y28gYXMgb3VyIGluaXRpYWwKLQkJICogZ3Vlc3MgYXMgdG8gd2hhdCB0aGUg cHJlZmVycmVkIHZjbyBpcy4KLQkJICovCi0JCWlmIChkZXZfcHJpdi0+c2tsX3ByZWZlcnJlZF92 Y29fZnJlcSA9PSAwKQotCQkJc2tsX3NldF9wcmVmZXJyZWRfY2RjbGtfdmNvKGRldl9wcml2LAot CQkJCQkJICAgIGRldl9wcml2LT5jZGNsa19wbGwudmNvKTsKLQkJcmV0dXJuOwotCX0KLQotCXZj byA9IGRldl9wcml2LT5za2xfcHJlZmVycmVkX3Zjb19mcmVxOwotCWlmICh2Y28gPT0gMCkKLQkJ dmNvID0gODEwMDAwMDsKLQljZGNsayA9IHNrbF9jYWxjX2NkY2xrKDAsIHZjbyk7Ci0KLQlza2xf c2V0X2NkY2xrKGRldl9wcml2LCBjZGNsaywgdmNvKTsKLX0KLQotc3RhdGljIHZvaWQgc2tsX3Nh bml0aXplX2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQl1aW50 MzJfdCBjZGN0bCwgZXhwZWN0ZWQ7Ci0KLQkvKgotCSAqIGNoZWNrIGlmIHRoZSBwcmUtb3MgaW50 aWFsaXplZCB0aGUgZGlzcGxheQotCSAqIFRoZXJlIGlzIFNXRjE4IHNjcmF0Y2hwYWQgcmVnaXN0 ZXIgZGVmaW5lZCB3aGljaCBpcyBzZXQgYnkgdGhlCi0JICogcHJlLW9zIHdoaWNoIGNhbiBiZSB1 c2VkIGJ5IHRoZSBPUyBkcml2ZXJzIHRvIGNoZWNrIHRoZSBzdGF0dXMKLQkgKi8KLQlpZiAoKEk5 MTVfUkVBRChTV0ZfSUxLKDB4MTgpKSAmIDB4MDBGRkZGRkYpID09IDApCi0JCWdvdG8gc2FuaXRp emU7Ci0KLQlpbnRlbF91cGRhdGVfY2RjbGsoZGV2X3ByaXYpOwotCS8qIElzIFBMTCBlbmFibGVk IGFuZCBsb2NrZWQgPyAqLwotCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9PSAwIHx8Ci0J ICAgIGRldl9wcml2LT5jZGNsa19mcmVxID09IGRldl9wcml2LT5jZGNsa19wbGwucmVmKQotCQln b3RvIHNhbml0aXplOwotCi0JLyogRFBMTCBva2F5OyB2ZXJpZnkgdGhlIGNkY2xvY2sKLQkgKgot CSAqIE5vdGljZWQgaW4gc29tZSBpbnN0YW5jZXMgdGhhdCB0aGUgZnJlcSBzZWxlY3Rpb24gaXMg Y29ycmVjdCBidXQKLQkgKiBkZWNpbWFsIHBhcnQgaXMgcHJvZ3JhbW1lZCB3cm9uZyBmcm9tIEJJ T1Mgd2hlcmUgcHJlLW9zIGRvZXMgbm90Ci0JICogZW5hYmxlIGRpc3BsYXkuIFZlcmlmeSB0aGUg c2FtZSBhcyB3ZWxsLgotCSAqLwotCWNkY3RsID0gSTkxNV9SRUFEKENEQ0xLX0NUTCk7Ci0JZXhw ZWN0ZWQgPSAoY2RjdGwgJiBDRENMS19GUkVRX1NFTF9NQVNLKSB8Ci0JCXNrbF9jZGNsa19kZWNp bWFsKGRldl9wcml2LT5jZGNsa19mcmVxKTsKLQlpZiAoY2RjdGwgPT0gZXhwZWN0ZWQpCi0JCS8q IEFsbCB3ZWxsOyBub3RoaW5nIHRvIHNhbml0aXplICovCi0JCXJldHVybjsKLQotc2FuaXRpemU6 Ci0JRFJNX0RFQlVHX0tNUygiU2FuaXRpemluZyBjZGNsayBwcm9ncmFtbWVkIGJ5IHByZS1vc1xu Iik7Ci0KLQkvKiBmb3JjZSBjZGNsayBwcm9ncmFtbWluZyAqLwotCWRldl9wcml2LT5jZGNsa19m cmVxID0gMDsKLQkvKiBmb3JjZSBmdWxsIFBMTCBkaXNhYmxlICsgZW5hYmxlICovCi0JZGV2X3By aXYtPmNkY2xrX3BsbC52Y28gPSAtMTsKLX0KLQotLyogQWRqdXN0IENEY2xrIGRpdmlkZXJzIHRv IGFsbG93IGhpZ2ggcmVzIG9yIHNhdmUgcG93ZXIgaWYgcG9zc2libGUgKi8KLXN0YXRpYyB2b2lk IHZhbGxleXZpZXdfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjZGNsaykK LXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7Ci0J dTMyIHZhbCwgY21kOwotCi0JV0FSTl9PTihkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsoZGV2 X3ByaXYpICE9IGRldl9wcml2LT5jZGNsa19mcmVxKTsKLQotCWlmIChjZGNsayA+PSAzMjAwMDAp IC8qIGp1bXAgdG8gaGlnaGVzdCB2b2x0YWdlIGZvciA0MDBNSHogdG9vICovCi0JCWNtZCA9IDI7 Ci0JZWxzZSBpZiAoY2RjbGsgPT0gMjY2NjY3KQotCQljbWQgPSAxOwotCWVsc2UKLQkJY21kID0g MDsKLQotCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JdmFsID0gdmx2X3B1 bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BGUkVRKTsKLQl2YWwgJj0gfkRTUEZSRVFH VUFSX01BU0s7Ci0JdmFsIHw9IChjbWQgPDwgRFNQRlJFUUdVQVJfU0hJRlQpOwotCXZsdl9wdW5p dF93cml0ZShkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEsIHZhbCk7Ci0JaWYgKHdhaXRfZm9y KCh2bHZfcHVuaXRfcmVhZChkZXZfcHJpdiwgUFVOSVRfUkVHX0RTUEZSRVEpICYKLQkJICAgICAg RFNQRlJFUVNUQVRfTUFTSykgPT0gKGNtZCA8PCBEU1BGUkVRU1RBVF9TSElGVCksCi0JCSAgICAg NTApKSB7Ci0JCURSTV9FUlJPUigidGltZWQgb3V0IHdhaXRpbmcgZm9yIENEY2xrIGNoYW5nZVxu Iik7Ci0JfQotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQotCW11dGV4 X2xvY2soJmRldl9wcml2LT5zYl9sb2NrKTsKLQotCWlmIChjZGNsayA9PSA0MDAwMDApIHsKLQkJ dTMyIGRpdmlkZXI7Ci0KLQkJZGl2aWRlciA9IERJVl9ST1VORF9DTE9TRVNUKGRldl9wcml2LT5o cGxsX2ZyZXEgPDwgMSwgY2RjbGspIC0gMTsKLQotCQkvKiBhZGp1c3QgY2RjbGsgZGl2aWRlciAq LwotCQl2YWwgPSB2bHZfY2NrX3JlYWQoZGV2X3ByaXYsIENDS19ESVNQTEFZX0NMT0NLX0NPTlRS T0wpOwotCQl2YWwgJj0gfkNDS19GUkVRVUVOQ1lfVkFMVUVTOwotCQl2YWwgfD0gZGl2aWRlcjsK LQkJdmx2X2Nja193cml0ZShkZXZfcHJpdiwgQ0NLX0RJU1BMQVlfQ0xPQ0tfQ09OVFJPTCwgdmFs KTsKLQotCQlpZiAod2FpdF9mb3IoKHZsdl9jY2tfcmVhZChkZXZfcHJpdiwgQ0NLX0RJU1BMQVlf Q0xPQ0tfQ09OVFJPTCkgJgotCQkJICAgICAgQ0NLX0ZSRVFVRU5DWV9TVEFUVVMpID09IChkaXZp ZGVyIDw8IENDS19GUkVRVUVOQ1lfU1RBVFVTX1NISUZUKSwKLQkJCSAgICAgNTApKQotCQkJRFJN X0VSUk9SKCJ0aW1lZCBvdXQgd2FpdGluZyBmb3IgQ0RjbGsgY2hhbmdlXG4iKTsKLQl9Ci0KLQkv KiBhZGp1c3Qgc2VsZi1yZWZyZXNoIGV4aXQgbGF0ZW5jeSB2YWx1ZSAqLwotCXZhbCA9IHZsdl9i dW5pdF9yZWFkKGRldl9wcml2LCBCVU5JVF9SRUdfQklTT0MpOwotCXZhbCAmPSB+MHg3ZjsKLQot CS8qCi0JICogRm9yIGhpZ2ggYmFuZHdpZHRoIGNvbmZpZ3MsIHdlIHNldCBhIGhpZ2hlciBsYXRl bmN5IGluIHRoZSBidW5pdAotCSAqIHNvIHRoYXQgdGhlIGNvcmUgZGlzcGxheSBmZXRjaCBoYXBw ZW5zIGluIHRpbWUgdG8gYXZvaWQgdW5kZXJydW5zLgotCSAqLwotCWlmIChjZGNsayA9PSA0MDAw MDApCi0JCXZhbCB8PSA0NTAwIC8gMjUwOyAvKiA0LjUgdXNlYyAqLwotCWVsc2UKLQkJdmFsIHw9 IDMwMDAgLyAyNTA7IC8qIDMuMCB1c2VjICovCi0Jdmx2X2J1bml0X3dyaXRlKGRldl9wcml2LCBC VU5JVF9SRUdfQklTT0MsIHZhbCk7Ci0KLQltdXRleF91bmxvY2soJmRldl9wcml2LT5zYl9sb2Nr KTsKLQotCWludGVsX3VwZGF0ZV9jZGNsayhkZXZfcHJpdik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNo ZXJyeXZpZXdfc2V0X2NkY2xrKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCBjZGNsaykKLXsK LQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7Ci0JdTMy IHZhbCwgY21kOwotCi0JV0FSTl9PTihkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsoZGV2X3By aXYpICE9IGRldl9wcml2LT5jZGNsa19mcmVxKTsKLQotCXN3aXRjaCAoY2RjbGspIHsKLQljYXNl IDMzMzMzMzoKLQljYXNlIDMyMDAwMDoKLQljYXNlIDI2NjY2NzoKLQljYXNlIDIwMDAwMDoKLQkJ YnJlYWs7Ci0JZGVmYXVsdDoKLQkJTUlTU0lOR19DQVNFKGNkY2xrKTsKLQkJcmV0dXJuOwotCX0K LQotCS8qCi0JICogU3BlY3MgYXJlIGZ1bGwgb2YgbWlzaW5mb3JtYXRpb24sIGJ1dCB0ZXN0aW5n IG9uIGFjdHVhbAotCSAqIGhhcmR3YXJlIGhhcyBzaG93biB0aGF0IHdlIGp1c3QgbmVlZCB0byB3 cml0ZSB0aGUgZGVzaXJlZAotCSAqIENDSyBkaXZpZGVyIGludG8gdGhlIFB1bml0IHJlZ2lzdGVy LgotCSAqLwotCWNtZCA9IERJVl9ST1VORF9DTE9TRVNUKGRldl9wcml2LT5ocGxsX2ZyZXEgPDwg MSwgY2RjbGspIC0gMTsKLQotCW11dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0J dmFsID0gdmx2X3B1bml0X3JlYWQoZGV2X3ByaXYsIFBVTklUX1JFR19EU1BGUkVRKTsKLQl2YWwg Jj0gfkRTUEZSRVFHVUFSX01BU0tfQ0hWOwotCXZhbCB8PSAoY21kIDw8IERTUEZSRVFHVUFSX1NI SUZUX0NIVik7Ci0Jdmx2X3B1bml0X3dyaXRlKGRldl9wcml2LCBQVU5JVF9SRUdfRFNQRlJFUSwg dmFsKTsKLQlpZiAod2FpdF9mb3IoKHZsdl9wdW5pdF9yZWFkKGRldl9wcml2LCBQVU5JVF9SRUdf RFNQRlJFUSkgJgotCQkgICAgICBEU1BGUkVRU1RBVF9NQVNLX0NIVikgPT0gKGNtZCA8PCBEU1BG UkVRU1RBVF9TSElGVF9DSFYpLAotCQkgICAgIDUwKSkgewotCQlEUk1fRVJST1IoInRpbWVkIG91 dCB3YWl0aW5nIGZvciBDRGNsayBjaGFuZ2VcbiIpOwotCX0KLQltdXRleF91bmxvY2soJmRldl9w cml2LT5ycHMuaHdfbG9jayk7Ci0KLQlpbnRlbF91cGRhdGVfY2RjbGsoZGV2X3ByaXYpOwotfQot Ci1zdGF0aWMgaW50IHZhbGxleXZpZXdfY2FsY19jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYsCi0JCQkJIGludCBtYXhfcGl4Y2xrKQotewotCWludCBmcmVxXzMyMCA9IChk ZXZfcHJpdi0+aHBsbF9mcmVxIDw8ICAxKSAlIDMyMDAwMCAhPSAwID8gMzMzMzMzIDogMzIwMDAw OwotCWludCBsaW1pdCA9IElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpID8gOTUgOiA5MDsKLQotCS8q Ci0JICogUmVhbGx5IG9ubHkgYSBmZXcgY2FzZXMgdG8gZGVhbCB3aXRoLCBhcyBvbmx5IDQgQ0Rj bGtzIGFyZSBzdXBwb3J0ZWQ6Ci0JICogICAyMDBNSHoKLQkgKiAgIDI2N01IegotCSAqICAgMzIw LzMzM01IeiAoZGVwZW5kcyBvbiBIUExMIGZyZXEpCi0JICogICA0MDBNSHogKFZMViBvbmx5KQot CSAqIFNvIHdlIGNoZWNrIHRvIHNlZSB3aGV0aGVyIHdlJ3JlIGFib3ZlIDkwJSAoVkxWKSBvciA5 NSUgKENIVikKLQkgKiBvZiB0aGUgbG93ZXIgYmluIGFuZCBhZGp1c3QgaWYgbmVlZGVkLgotCSAq Ci0JICogV2Ugc2VlbSB0byBnZXQgYW4gdW5zdGFibGUgb3Igc29saWQgY29sb3IgcGljdHVyZSBh dCAyMDBNSHouCi0JICogTm90IHN1cmUgd2hhdCdzIHdyb25nLiBGb3Igbm93IHVzZSAyMDBNSHog b25seSB3aGVuIGFsbCBwaXBlcwotCSAqIGFyZSBvZmYuCi0JICovCi0JaWYgKCFJU19DSEVSUllW SUVXKGRldl9wcml2KSAmJgotCSAgICBtYXhfcGl4Y2xrID4gZnJlcV8zMjAqbGltaXQvMTAwKQot CQlyZXR1cm4gNDAwMDAwOwotCWVsc2UgaWYgKG1heF9waXhjbGsgPiAyNjY2NjcqbGltaXQvMTAw KQotCQlyZXR1cm4gZnJlcV8zMjA7Ci0JZWxzZSBpZiAobWF4X3BpeGNsayA+IDApCi0JCXJldHVy biAyNjY2Njc7Ci0JZWxzZQotCQlyZXR1cm4gMjAwMDAwOwotfQotCi1zdGF0aWMgaW50IGdsa19j YWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrKQotewotCWlmIChtYXhfcGl4Y2xrID4gMiAqIDE1ODQw MCkKLQkJcmV0dXJuIDMxNjgwMDsKLQllbHNlIGlmIChtYXhfcGl4Y2xrID4gMiAqIDc5MjAwKQot CQlyZXR1cm4gMTU4NDAwOwotCWVsc2UKLQkJcmV0dXJuIDc5MjAwOwotfQotCi1zdGF0aWMgaW50 IGJ4dF9jYWxjX2NkY2xrKGludCBtYXhfcGl4Y2xrKQotewotCWlmIChtYXhfcGl4Y2xrID4gNTc2 MDAwKQotCQlyZXR1cm4gNjI0MDAwOwotCWVsc2UgaWYgKG1heF9waXhjbGsgPiAzODQwMDApCi0J CXJldHVybiA1NzYwMDA7Ci0JZWxzZSBpZiAobWF4X3BpeGNsayA+IDI4ODAwMCkKLQkJcmV0dXJu IDM4NDAwMDsKLQllbHNlIGlmIChtYXhfcGl4Y2xrID4gMTQ0MDAwKQotCQlyZXR1cm4gMjg4MDAw OwotCWVsc2UKLQkJcmV0dXJuIDE0NDAwMDsKLX0KLQotc3RhdGljIGludCB2YWxsZXl2aWV3X21v ZGVzZXRfY2FsY19jZGNsayhzdHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3Ry dWN0IGRybV9kZXZpY2UgKmRldiA9IHN0YXRlLT5kZXY7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCWludCBtYXhfcGl4Y2xrID0gaW50ZWxfbWF4 X3BpeGVsX3JhdGUoc3RhdGUpOwotCXN0cnVjdCBpbnRlbF9hdG9taWNfc3RhdGUgKmludGVsX3N0 YXRlID0KLQkJdG9faW50ZWxfYXRvbWljX3N0YXRlKHN0YXRlKTsKLQotCWludGVsX3N0YXRlLT5j ZGNsayA9IGludGVsX3N0YXRlLT5kZXZfY2RjbGsgPQotCQl2YWxsZXl2aWV3X2NhbGNfY2RjbGso ZGV2X3ByaXYsIG1heF9waXhjbGspOwotCi0JaWYgKCFpbnRlbF9zdGF0ZS0+YWN0aXZlX2NydGNz KQotCQlpbnRlbF9zdGF0ZS0+ZGV2X2NkY2xrID0gdmFsbGV5dmlld19jYWxjX2NkY2xrKGRldl9w cml2LCAwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGJ4dF9tb2Rlc2V0X2NhbGNf Y2RjbGsoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoc3RhdGUtPmRldik7Ci0JaW50IG1heF9waXhj bGsgPSBpbnRlbF9tYXhfcGl4ZWxfcmF0ZShzdGF0ZSk7Ci0Jc3RydWN0IGludGVsX2F0b21pY19z dGF0ZSAqaW50ZWxfc3RhdGUgPQotCQl0b19pbnRlbF9hdG9taWNfc3RhdGUoc3RhdGUpOwotCWlu dCBjZGNsazsKLQotCWlmIChJU19HRU1JTklMQUtFKGRldl9wcml2KSkKLQkJY2RjbGsgPSBnbGtf Y2FsY19jZGNsayhtYXhfcGl4Y2xrKTsKLQllbHNlCi0JCWNkY2xrID0gYnh0X2NhbGNfY2RjbGso bWF4X3BpeGNsayk7Ci0KLQlpbnRlbF9zdGF0ZS0+Y2RjbGsgPSBpbnRlbF9zdGF0ZS0+ZGV2X2Nk Y2xrID0gY2RjbGs7Ci0KLQlpZiAoIWludGVsX3N0YXRlLT5hY3RpdmVfY3J0Y3MpIHsKLQkJaWYg KElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQotCQkJY2RjbGsgPSBnbGtfY2FsY19jZGNsaygwKTsK LQkJZWxzZQotCQkJY2RjbGsgPSBieHRfY2FsY19jZGNsaygwKTsKLQotCQlpbnRlbF9zdGF0ZS0+ ZGV2X2NkY2xrID0gY2RjbGs7Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIHZs dl9wcm9ncmFtX3BmaV9jcmVkaXRzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikK LXsKLQl1bnNpZ25lZCBpbnQgY3JlZGl0cywgZGVmYXVsdF9jcmVkaXRzOwotCi0JaWYgKElTX0NI RVJSWVZJRVcoZGV2X3ByaXYpKQotCQlkZWZhdWx0X2NyZWRpdHMgPSBQRklfQ1JFRElUKDEyKTsK LQllbHNlCi0JCWRlZmF1bHRfY3JlZGl0cyA9IFBGSV9DUkVESVQoOCk7Ci0KLQlpZiAoZGV2X3By aXYtPmNkY2xrX2ZyZXEgPj0gZGV2X3ByaXYtPmN6Y2xrX2ZyZXEpIHsKLQkJLyogQ0hWIHN1Z2dl c3RlZCB2YWx1ZSBpcyAzMSBvciA2MyAqLwotCQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikp Ci0JCQljcmVkaXRzID0gUEZJX0NSRURJVF82MzsKLQkJZWxzZQotCQkJY3JlZGl0cyA9IFBGSV9D UkVESVQoMTUpOwotCX0gZWxzZSB7Ci0JCWNyZWRpdHMgPSBkZWZhdWx0X2NyZWRpdHM7Ci0JfQot Ci0JLyoKLQkgKiBXQSAtIHdyaXRlIGRlZmF1bHQgY3JlZGl0cyBiZWZvcmUgcmUtcHJvZ3JhbW1p bmcKLQkgKiBGSVhNRTogc2hvdWxkIHdlIGFsc28gc2V0IHRoZSByZXNlbmQgYml0IGhlcmU/Ci0J ICovCi0JSTkxNV9XUklURShHQ0lfQ09OVFJPTCwgVkdBX0ZBU1RfTU9ERV9ESVNBQkxFIHwKLQkJ ICAgZGVmYXVsdF9jcmVkaXRzKTsKLQotCUk5MTVfV1JJVEUoR0NJX0NPTlRST0wsIFZHQV9GQVNU X01PREVfRElTQUJMRSB8Ci0JCSAgIGNyZWRpdHMgfCBQRklfQ1JFRElUX1JFU0VORCk7Ci0KLQkv KgotCSAqIEZJWE1FIGlzIHRoaXMgZ3VhcmFudGVlZCB0byBjbGVhcgotCSAqIGltbWVkaWF0ZWx5 IG9yIHNob3VsZCB3ZSBwb2xsIGZvciBpdD8KLQkgKi8KLQlXQVJOX09OKEk5MTVfUkVBRChHQ0lf Q09OVFJPTCkgJiBQRklfQ1JFRElUX1JFU0VORCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZhbGxleXZp ZXdfbW9kZXNldF9jb21taXRfY2RjbGsoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9zdGF0 ZSkKLXsKLQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2xkX3N0YXRlLT5kZXY7Ci0Jc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCXN0cnVjdCBpbnRl bF9hdG9taWNfc3RhdGUgKm9sZF9pbnRlbF9zdGF0ZSA9Ci0JCXRvX2ludGVsX2F0b21pY19zdGF0 ZShvbGRfc3RhdGUpOwotCXVuc2lnbmVkIHJlcV9jZGNsayA9IG9sZF9pbnRlbF9zdGF0ZS0+ZGV2 X2NkY2xrOwotCi0JLyoKLQkgKiBGSVhNRTogV2UgY2FuIGVuZCB1cCBoZXJlIHdpdGggYWxsIHBv d2VyIGRvbWFpbnMgb2ZmLCB5ZXQKLQkgKiB3aXRoIGEgQ0RDTEsgZnJlcXVlbmN5IG90aGVyIHRo YW4gdGhlIG1pbmltdW0uIFRvIGFjY291bnQKLQkgKiBmb3IgdGhpcyB0YWtlIHRoZSBQSVBFLUEg cG93ZXIgZG9tYWluLCB3aGljaCBjb3ZlcnMgdGhlIEhXCi0JICogYmxvY2tzIG5lZWRlZCBmb3Ig dGhlIGZvbGxvd2luZyBwcm9ncmFtbWluZy4gVGhpcyBjYW4gYmUKLQkgKiByZW1vdmVkIG9uY2Ug aXQncyBndWFyYW50ZWVkIHRoYXQgd2UgZ2V0IGhlcmUgZWl0aGVyIHdpdGgKLQkgKiB0aGUgbWlu aW11bSBDRENMSyBzZXQsIG9yIHRoZSByZXF1aXJlZCBwb3dlciBkb21haW5zCi0JICogZW5hYmxl ZC4KLQkgKi8KLQlpbnRlbF9kaXNwbGF5X3Bvd2VyX2dldChkZXZfcHJpdiwgUE9XRVJfRE9NQUlO X1BJUEVfQSk7Ci0KLQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCi0JCWNoZXJyeXZpZXdf c2V0X2NkY2xrKGRldiwgcmVxX2NkY2xrKTsKLQllbHNlCi0JCXZhbGxleXZpZXdfc2V0X2NkY2xr KGRldiwgcmVxX2NkY2xrKTsKLQotCXZsdl9wcm9ncmFtX3BmaV9jcmVkaXRzKGRldl9wcml2KTsK LQotCWludGVsX2Rpc3BsYXlfcG93ZXJfcHV0KGRldl9wcml2LCBQT1dFUl9ET01BSU5fUElQRV9B KTsKLX0KLQotc3RhdGljIHZvaWQgdmFsbGV5dmlld19jcnRjX2VuYWJsZShzdHJ1Y3QgaW50ZWxf Y3J0Y19zdGF0ZSAqcGlwZV9jb25maWcsCi0JCQkJICAgc3RydWN0IGRybV9hdG9taWNfc3RhdGUg Km9sZF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBwaXBlX2NvbmZpZy0+YmFz ZS5jcnRjOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7Ci0Jc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCXN0cnVjdCBpbnRlbF9j cnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlpbnQgcGlwZSA9IGludGVs X2NydGMtPnBpcGU7Ci0KLQlpZiAoV0FSTl9PTihpbnRlbF9jcnRjLT5hY3RpdmUpKQotCQlyZXR1 cm47Ci0KLQlpZiAoaW50ZWxfY3J0Y19oYXNfZHBfZW5jb2RlcihpbnRlbF9jcnRjLT5jb25maWcp KQotCQlpbnRlbF9kcF9zZXRfbV9uKGludGVsX2NydGMsIE0xX04xKTsKLQotCWludGVsX3NldF9w aXBlX3RpbWluZ3MoaW50ZWxfY3J0Yyk7Ci0JaW50ZWxfc2V0X3BpcGVfc3JjX3NpemUoaW50ZWxf Y3J0Yyk7Ci0KLQlpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikgJiYgcGlwZSA9PSBQSVBFX0Ip IHsKLQkJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwot Ci0JCUk5MTVfV1JJVEUoQ0hWX0JMRU5EKHBpcGUpLCBDSFZfQkxFTkRfTEVHQUNZKTsKLQkJSTkx NV9XUklURShDSFZfQ0FOVkFTKHBpcGUpLCAwKTsKLQl9Ci0KLQlpOXh4X3NldF9waXBlY29uZihp bnRlbF9jcnRjKTsKLQotCWludGVsX2NydGMtPmFjdGl2ZSA9IHRydWU7Ci0KLQlpbnRlbF9zZXRf Y3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldl9wcml2LCBwaXBlLCB0cnVlKTsKLQotCWlu dGVsX2VuY29kZXJzX3ByZV9wbGxfZW5hYmxlKGNydGMsIHBpcGVfY29uZmlnLCBvbGRfc3RhdGUp OwotCi0JaWYgKElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKSB7Ci0JCWNodl9wcmVwYXJlX3BsbChp bnRlbF9jcnRjLCBpbnRlbF9jcnRjLT5jb25maWcpOwotCQljaHZfZW5hYmxlX3BsbChpbnRlbF9j cnRjLCBpbnRlbF9jcnRjLT5jb25maWcpOwotCX0gZWxzZSB7Ci0JCXZsdl9wcmVwYXJlX3BsbChp bnRlbF9jcnRjLCBpbnRlbF9jcnRjLT5jb25maWcpOwotCQl2bHZfZW5hYmxlX3BsbChpbnRlbF9j cnRjLCBpbnRlbF9jcnRjLT5jb25maWcpOwotCX0KLQotCWludGVsX2VuY29kZXJzX3ByZV9lbmFi bGUoY3J0YywgcGlwZV9jb25maWcsIG9sZF9zdGF0ZSk7Ci0KLQlpOXh4X3BmaXRfZW5hYmxlKGlu dGVsX2NydGMpOwotCi0JaW50ZWxfY29sb3JfbG9hZF9sdXRzKCZwaXBlX2NvbmZpZy0+YmFzZSk7 Ci0KLQlpbnRlbF91cGRhdGVfd2F0ZXJtYXJrcyhpbnRlbF9jcnRjKTsKLQlpbnRlbF9lbmFibGVf cGlwZShpbnRlbF9jcnRjKTsKLQotCWFzc2VydF92YmxhbmtfZGlzYWJsZWQoY3J0Yyk7Ci0JZHJt X2NydGNfdmJsYW5rX29uKGNydGMpOwotCi0JaW50ZWxfZW5jb2RlcnNfZW5hYmxlKGNydGMsIHBp cGVfY29uZmlnLCBvbGRfc3RhdGUpOwotfQotCi1zdGF0aWMgdm9pZCBpOXh4X3NldF9wbGxfZGl2 aWRlcnMoc3RydWN0IGludGVsX2NydGMgKmNydGMpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRl diA9IGNydGMtPmJhc2UuZGV2OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9 IHRvX2k5MTUoZGV2KTsKLQotCUk5MTVfV1JJVEUoRlAwKGNydGMtPnBpcGUpLCBjcnRjLT5jb25m aWctPmRwbGxfaHdfc3RhdGUuZnAwKTsKLQlJOTE1X1dSSVRFKEZQMShjcnRjLT5waXBlKSwgY3J0 Yy0+Y29uZmlnLT5kcGxsX2h3X3N0YXRlLmZwMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5eHhfY3J0 Y19lbmFibGUoc3RydWN0IGludGVsX2NydGNfc3RhdGUgKnBpcGVfY29uZmlnLAotCQkJICAgICBz dHJ1Y3QgZHJtX2F0b21pY19zdGF0ZSAqb2xkX3N0YXRlKQotewotCXN0cnVjdCBkcm1fY3J0YyAq Y3J0YyA9IHBpcGVfY29uZmlnLT5iYXNlLmNydGM7Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9 IGNydGMtPmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1 KGRldik7Ci0Jc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNy dGMpOwotCWVudW0gcGlwZSBwaXBlID0gaW50ZWxfY3J0Yy0+cGlwZTsKLQotCWlmIChXQVJOX09O KGludGVsX2NydGMtPmFjdGl2ZSkpCi0JCXJldHVybjsKLQotCWk5eHhfc2V0X3BsbF9kaXZpZGVy cyhpbnRlbF9jcnRjKTsKLQotCWlmIChpbnRlbF9jcnRjX2hhc19kcF9lbmNvZGVyKGludGVsX2Ny dGMtPmNvbmZpZykpCi0JCWludGVsX2RwX3NldF9tX24oaW50ZWxfY3J0YywgTTFfTjEpOwotCi0J aW50ZWxfc2V0X3BpcGVfdGltaW5ncyhpbnRlbF9jcnRjKTsKLQlpbnRlbF9zZXRfcGlwZV9zcmNf c2l6ZShpbnRlbF9jcnRjKTsKLQotCWk5eHhfc2V0X3BpcGVjb25mKGludGVsX2NydGMpOwotCi0J aW50ZWxfY3J0Yy0+YWN0aXZlID0gdHJ1ZTsKLQotCWlmICghSVNfR0VOMihkZXZfcHJpdikpCi0J CWludGVsX3NldF9jcHVfZmlmb191bmRlcnJ1bl9yZXBvcnRpbmcoZGV2X3ByaXYsIHBpcGUsIHRy dWUpOwotCi0JaW50ZWxfZW5jb2RlcnNfcHJlX2VuYWJsZShjcnRjLCBwaXBlX2NvbmZpZywgb2xk X3N0YXRlKTsKLQotCWk5eHhfZW5hYmxlX3BsbChpbnRlbF9jcnRjKTsKLQotCWk5eHhfcGZpdF9l bmFibGUoaW50ZWxfY3J0Yyk7Ci0KLQlpbnRlbF9jb2xvcl9sb2FkX2x1dHMoJnBpcGVfY29uZmln LT5iYXNlKTsKLQotCWludGVsX3VwZGF0ZV93YXRlcm1hcmtzKGludGVsX2NydGMpOwotCWludGVs X2VuYWJsZV9waXBlKGludGVsX2NydGMpOwotCi0JYXNzZXJ0X3ZibGFua19kaXNhYmxlZChjcnRj KTsKLQlkcm1fY3J0Y192Ymxhbmtfb24oY3J0Yyk7Ci0KLQlpbnRlbF9lbmNvZGVyc19lbmFibGUo Y3J0YywgcGlwZV9jb25maWcsIG9sZF9zdGF0ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGk5eHhfcGZp dF9kaXNhYmxlKHN0cnVjdCBpbnRlbF9jcnRjICpjcnRjKQotewotCXN0cnVjdCBkcm1fZGV2aWNl ICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYgPSB0b19pOTE1KGRldik7Ci0KLQlpZiAoIWNydGMtPmNvbmZpZy0+Z21jaF9wZml0LmNvbnRy b2wpCi0JCXJldHVybjsKLQotCWFzc2VydF9waXBlX2Rpc2FibGVkKGRldl9wcml2LCBjcnRjLT5w aXBlKTsKLQotCURSTV9ERUJVR19EUklWRVIoImRpc2FibGluZyBwZml0LCBjdXJyZW50OiAweCUw OHhcbiIsCi0JCQkgSTkxNV9SRUFEKFBGSVRfQ09OVFJPTCkpOwotCUk5MTVfV1JJVEUoUEZJVF9D T05UUk9MLCAwKTsKLX0KLQotc3RhdGljIHZvaWQgaTl4eF9jcnRjX2Rpc2FibGUoc3RydWN0IGlu dGVsX2NydGNfc3RhdGUgKm9sZF9jcnRjX3N0YXRlLAotCQkJICAgICAgc3RydWN0IGRybV9hdG9t aWNfc3RhdGUgKm9sZF9zdGF0ZSkKLXsKLQlzdHJ1Y3QgZHJtX2NydGMgKmNydGMgPSBvbGRfY3J0 Y19zdGF0ZS0+YmFzZS5jcnRjOwotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5kZXY7 Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShkZXYpOwotCXN0 cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRjID0gdG9faW50ZWxfY3J0YyhjcnRjKTsKLQlpbnQg cGlwZSA9IGludGVsX2NydGMtPnBpcGU7Ci0KLQkvKgotCSAqIE9uIGdlbjIgcGxhbmVzIGFyZSBk b3VibGUgYnVmZmVyZWQgYnV0IHRoZSBwaXBlIGlzbid0LCBzbyB3ZSBtdXN0Ci0JICogd2FpdCBm b3IgcGxhbmVzIHRvIGZ1bGx5IHR1cm4gb2ZmIGJlZm9yZSBkaXNhYmxpbmcgdGhlIHBpcGUuCi0J ICovCi0JaWYgKElTX0dFTjIoZGV2X3ByaXYpKQotCQlpbnRlbF93YWl0X2Zvcl92YmxhbmsoZGV2 X3ByaXYsIHBpcGUpOwotCi0JaW50ZWxfZW5jb2RlcnNfZGlzYWJsZShjcnRjLCBvbGRfY3J0Y19z dGF0ZSwgb2xkX3N0YXRlKTsKLQotCWRybV9jcnRjX3ZibGFua19vZmYoY3J0Yyk7Ci0JYXNzZXJ0 X3ZibGFua19kaXNhYmxlZChjcnRjKTsKLQotCWludGVsX2Rpc2FibGVfcGlwZShpbnRlbF9jcnRj KTsKLQotCWk5eHhfcGZpdF9kaXNhYmxlKGludGVsX2NydGMpOwotCi0JaW50ZWxfZW5jb2RlcnNf cG9zdF9kaXNhYmxlKGNydGMsIG9sZF9jcnRjX3N0YXRlLCBvbGRfc3RhdGUpOwotCi0JaWYgKCFp bnRlbF9jcnRjX2hhc190eXBlKGludGVsX2NydGMtPmNvbmZpZywgSU5URUxfT1VUUFVUX0RTSSkp IHsKLQkJaWYgKElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQkJY2h2X2Rpc2FibGVfcGxsKGRl dl9wcml2LCBwaXBlKTsKLQkJZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdikpCi0JCQl2 bHZfZGlzYWJsZV9wbGwoZGV2X3ByaXYsIHBpcGUpOwotCQllbHNlCi0JCQlpOXh4X2Rpc2FibGVf cGxsKGludGVsX2NydGMpOwotCX0KLQotCWludGVsX2VuY29kZXJzX3Bvc3RfcGxsX2Rpc2FibGUo Y3J0Yywgb2xkX2NydGNfc3RhdGUsIG9sZF9zdGF0ZSk7Ci0KLQlpZiAoIUlTX0dFTjIoZGV2X3By aXYpKQotCQlpbnRlbF9zZXRfY3B1X2ZpZm9fdW5kZXJydW5fcmVwb3J0aW5nKGRldl9wcml2LCBw aXBlLCBmYWxzZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGludGVsX2NydGNfZGlzYWJsZV9ub2F0b21p YyhzdHJ1Y3QgZHJtX2NydGMgKmNydGMpCi17Ci0Jc3RydWN0IGludGVsX2VuY29kZXIgKmVuY29k ZXI7Ci0Jc3RydWN0IGludGVsX2NydGMgKmludGVsX2NydGMgPSB0b19pbnRlbF9jcnRjKGNydGMp OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoY3J0Yy0+ZGV2 KTsKLQllbnVtIGludGVsX2Rpc3BsYXlfcG93ZXJfZG9tYWluIGRvbWFpbjsKLQl1bnNpZ25lZCBs b25nIGRvbWFpbnM7Ci0Jc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlOwotCXN0cnVjdCBp bnRlbF9jcnRjX3N0YXRlICpjcnRjX3N0YXRlOwotCWludCByZXQ7Ci0KLQlpZiAoIWludGVsX2Ny dGMtPmFjdGl2ZSkKLQkJcmV0dXJuOwotCi0JaWYgKGNydGMtPnByaW1hcnktPnN0YXRlLT52aXNp YmxlKSB7Ci0JCVdBUk5fT04oaW50ZWxfY3J0Yy0+ZmxpcF93b3JrKTsKLQotCQlpbnRlbF9wcmVf ZGlzYWJsZV9wcmltYXJ5X25vYXRvbWljKGNydGMpOwotCi0JCWludGVsX2NydGNfZGlzYWJsZV9w bGFuZXMoY3J0YywgMSA8PCBkcm1fcGxhbmVfaW5kZXgoY3J0Yy0+cHJpbWFyeSkpOwotCQljcnRj LT5wcmltYXJ5LT5zdGF0ZS0+dmlzaWJsZSA9IGZhbHNlOwotCX0KLQotCXN0YXRlID0gZHJtX2F0 b21pY19zdGF0ZV9hbGxvYyhjcnRjLT5kZXYpOwotCWlmICghc3RhdGUpIHsKLQkJRFJNX0RFQlVH X0tNUygiZmFpbGVkIHRvIGRpc2FibGUgW0NSVEM6JWQ6JXNdLCBvdXQgb2YgbWVtb3J5IiwKLQkJ CSAgICAgIGNydGMtPmJhc2UuaWQsIGNydGMtPm5hbWUpOwotCQlyZXR1cm47Ci0JfQotCi0Jc3Rh dGUtPmFjcXVpcmVfY3R4ID0gY3J0Yy0+ZGV2LT5tb2RlX2NvbmZpZy5hY3F1aXJlX2N0eDsKLQot CS8qIEV2ZXJ5dGhpbmcncyBhbHJlYWR5IGxvY2tlZCwgLUVERUFETEsgY2FuJ3QgaGFwcGVuLiAq LwotCWNydGNfc3RhdGUgPSBpbnRlbF9hdG9taWNfZ2V0X2NydGNfc3RhdGUoc3RhdGUsIGludGVs X2NydGMpOwotCXJldCA9IGRybV9hdG9taWNfYWRkX2FmZmVjdGVkX2Nvbm5lY3RvcnMoc3RhdGUs IGNydGMpOwotCi0JV0FSTl9PTihJU19FUlIoY3J0Y19zdGF0ZSkgfHwgcmV0KTsKLQotCWRldl9w cml2LT5kaXNwbGF5LmNydGNfZGlzYWJsZShjcnRjX3N0YXRlLCBzdGF0ZSk7CisJZGV2X3ByaXYt PmRpc3BsYXkuY3J0Y19kaXNhYmxlKGNydGNfc3RhdGUsIHN0YXRlKTsKIAogCWRybV9hdG9taWNf c3RhdGVfcHV0KHN0YXRlKTsKIApAQCAtNzExOCw1NDMgKzYxNzYsMTIxIEBAIHN0YXRpYyBpbnQg aXJvbmxha2VfZmRpX2NvbXB1dGVfY29uZmlnKHN0cnVjdCBpbnRlbF9jcnRjICppbnRlbF9jcnRj LAogCQlnb3RvIHJldHJ5OwogCX0KIAotCWlmIChuZWVkc19yZWNvbXB1dGUpCi0JCXJldHVybiBS RVRSWTsKLQotCXJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBib29sIHBpcGVfY29uZmlnX3N1cHBv cnRzX2lwcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCi0JCQkJICAgICBzdHJ1 Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqcGlwZV9jb25maWcpCi17Ci0JaWYgKHBpcGVfY29uZmlnLT5w aXBlX2JwcCA+IDI0KQotCQlyZXR1cm4gZmFsc2U7Ci0KLQkvKiBIU1cgY2FuIGhhbmRsZSBwaXhl bCByYXRlIHVwIHRvIGNkY2xrPyAqLwotCWlmIChJU19IQVNXRUxMKGRldl9wcml2KSkKLQkJcmV0 dXJuIHRydWU7Ci0KLQkvKgotCSAqIFdlIGNvbXBhcmUgYWdhaW5zdCBtYXggd2hpY2ggbWVhbnMg d2UgbXVzdCB0YWtlCi0JICogdGhlIGluY3JlYXNlZCBjZGNsayByZXF1aXJlbWVudCBpbnRvIGFj Y291bnQgd2hlbgotCSAqIGNhbGN1bGF0aW5nIHRoZSBuZXcgY2RjbGsuCi0JICoKLQkgKiBTaG91 bGQgbWVhc3VyZSB3aGV0aGVyIHVzaW5nIGEgbG93ZXIgY2RjbGsgdy9vIElQUwotCSAqLwotCXJl dHVybiBwaXBlX2NvbmZpZy0+cGl4ZWxfcmF0ZSA8PQotCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2Zy ZXEgKiA5NSAvIDEwMDsKLX0KLQotc3RhdGljIHZvaWQgaHN3X2NvbXB1dGVfaXBzX2NvbmZpZyhz dHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywKLQkJCQkgICBzdHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAq cGlwZV9jb25maWcpCi17Ci0Jc3RydWN0IGRybV9kZXZpY2UgKmRldiA9IGNydGMtPmJhc2UuZGV2 OwotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKLQot CXBpcGVfY29uZmlnLT5pcHNfZW5hYmxlZCA9IGk5MTUuZW5hYmxlX2lwcyAmJgotCQloc3dfY3J0 Y19zdXBwb3J0c19pcHMoY3J0YykgJiYKLQkJcGlwZV9jb25maWdfc3VwcG9ydHNfaXBzKGRldl9w cml2LCBwaXBlX2NvbmZpZyk7Ci19Ci0KLXN0YXRpYyBib29sIGludGVsX2NydGNfc3VwcG9ydHNf ZG91YmxlX3dpZGUoY29uc3Qgc3RydWN0IGludGVsX2NydGMgKmNydGMpCi17Ci0JY29uc3Qgc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShjcnRjLT5iYXNlLmRldik7 Ci0KLQkvKiBHREcgZG91YmxlIHdpZGUgb24gZWl0aGVyIHBpcGUsIG90aGVyd2lzZSBwaXBlIEEg b25seSAqLwotCXJldHVybiBJTlRFTF9JTkZPKGRldl9wcml2KS0+Z2VuIDwgNCAmJgotCQkoY3J0 Yy0+cGlwZSA9PSBQSVBFX0EgfHwgSVNfSTkxNUcoZGV2X3ByaXYpKTsKLX0KLQotc3RhdGljIHZv aWQgaW50ZWxfY3J0Y19jb21wdXRlX3BpeGVsX3JhdGUoc3RydWN0IGludGVsX2NydGNfc3RhdGUg KmNydGNfc3RhdGUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9f aTkxNShjcnRjX3N0YXRlLT5iYXNlLmNydGMtPmRldik7Ci0KLQlpZiAoSEFTX0dNQ0hfRElTUExB WShkZXZfcHJpdikpCi0JCS8qIEZJWE1FIGNhbGN1bGF0ZSBwcm9wZXIgcGlwZSBwaXhlbCByYXRl IGZvciBHTUNIIHBmaXQgKi8KLQkJY3J0Y19zdGF0ZS0+cGl4ZWxfcmF0ZSA9Ci0JCQljcnRjX3N0 YXRlLT5iYXNlLmFkanVzdGVkX21vZGUuY3J0Y19jbG9jazsKLQllbHNlCi0JCWNydGNfc3RhdGUt PnBpeGVsX3JhdGUgPQotCQkJaWxrX3BpcGVfcGl4ZWxfcmF0ZShjcnRjX3N0YXRlKTsKLX0KLQot c3RhdGljIGludCBpbnRlbF9jcnRjX2NvbXB1dGVfY29uZmlnKHN0cnVjdCBpbnRlbF9jcnRjICpj cnRjLAotCQkJCSAgICAgc3RydWN0IGludGVsX2NydGNfc3RhdGUgKnBpcGVfY29uZmlnKQotewot CXN0cnVjdCBkcm1fZGV2aWNlICpkZXYgPSBjcnRjLT5iYXNlLmRldjsKLQlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KGRldik7Ci0JY29uc3Qgc3RydWN0IGRybV9k aXNwbGF5X21vZGUgKmFkanVzdGVkX21vZGUgPSAmcGlwZV9jb25maWctPmJhc2UuYWRqdXN0ZWRf bW9kZTsKLQlpbnQgY2xvY2tfbGltaXQgPSBkZXZfcHJpdi0+bWF4X2RvdGNsa19mcmVxOwotCi0J aWYgKElOVEVMX0dFTihkZXZfcHJpdikgPCA0KSB7Ci0JCWNsb2NrX2xpbWl0ID0gZGV2X3ByaXYt Pm1heF9jZGNsa19mcmVxICogOSAvIDEwOwotCi0JCS8qCi0JCSAqIEVuYWJsZSBkb3VibGUgd2lk ZSBtb2RlIHdoZW4gdGhlIGRvdCBjbG9jawotCQkgKiBpcyA+IDkwJSBvZiB0aGUgKGRpc3BsYXkp IGNvcmUgc3BlZWQuCi0JCSAqLwotCQlpZiAoaW50ZWxfY3J0Y19zdXBwb3J0c19kb3VibGVfd2lk ZShjcnRjKSAmJgotCQkgICAgYWRqdXN0ZWRfbW9kZS0+Y3J0Y19jbG9jayA+IGNsb2NrX2xpbWl0 KSB7Ci0JCQljbG9ja19saW1pdCA9IGRldl9wcml2LT5tYXhfZG90Y2xrX2ZyZXE7Ci0JCQlwaXBl X2NvbmZpZy0+ZG91YmxlX3dpZGUgPSB0cnVlOwotCQl9Ci0JfQotCi0JaWYgKGFkanVzdGVkX21v ZGUtPmNydGNfY2xvY2sgPiBjbG9ja19saW1pdCkgewotCQlEUk1fREVCVUdfS01TKCJyZXF1ZXN0 ZWQgcGl4ZWwgY2xvY2sgKCVkIGtIeikgdG9vIGhpZ2ggKG1heDogJWQga0h6LCBkb3VibGUgd2lk ZTogJXMpXG4iLAotCQkJICAgICAgYWRqdXN0ZWRfbW9kZS0+Y3J0Y19jbG9jaywgY2xvY2tfbGlt aXQsCi0JCQkgICAgICB5ZXNubyhwaXBlX2NvbmZpZy0+ZG91YmxlX3dpZGUpKTsKLQkJcmV0dXJu IC1FSU5WQUw7Ci0JfQotCi0JLyoKLQkgKiBQaXBlIGhvcml6b250YWwgc2l6ZSBtdXN0IGJlIGV2 ZW4gaW46Ci0JICogLSBEVk8gZ2FuZ2VkIG1vZGUKLQkgKiAtIExWRFMgZHVhbCBjaGFubmVsIG1v ZGUKLQkgKiAtIERvdWJsZSB3aWRlIHBpcGUKLQkgKi8KLQlpZiAoKGludGVsX2NydGNfaGFzX3R5 cGUocGlwZV9jb25maWcsIElOVEVMX09VVFBVVF9MVkRTKSAmJgotCSAgICAgaW50ZWxfaXNfZHVh bF9saW5rX2x2ZHMoZGV2KSkgfHwgcGlwZV9jb25maWctPmRvdWJsZV93aWRlKQotCQlwaXBlX2Nv bmZpZy0+cGlwZV9zcmNfdyAmPSB+MTsKLQotCS8qIENhbnRpZ2ErIGNhbm5vdCBoYW5kbGUgbW9k ZXMgd2l0aCBhIGhzeW5jIGZyb250IHBvcmNoIG9mIDAuCi0JICogV2FQcnVuZU1vZGVXaXRoSW5j b3JyZWN0SHN5bmNPZmZzZXQ6Y3RnLGVsayxpbGssc25iLGl2Yix2bHYsaHN3LgotCSAqLwotCWlm ICgoSU5URUxfR0VOKGRldl9wcml2KSA+IDQgfHwgSVNfRzRYKGRldl9wcml2KSkgJiYKLQkJYWRq dXN0ZWRfbW9kZS0+Y3J0Y19oc3luY19zdGFydCA9PSBhZGp1c3RlZF9tb2RlLT5jcnRjX2hkaXNw bGF5KQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWludGVsX2NydGNfY29tcHV0ZV9waXhlbF9yYXRl KHBpcGVfY29uZmlnKTsKLQotCWlmIChIQVNfSVBTKGRldl9wcml2KSkKLQkJaHN3X2NvbXB1dGVf aXBzX2NvbmZpZyhjcnRjLCBwaXBlX2NvbmZpZyk7Ci0KLQlpZiAocGlwZV9jb25maWctPmhhc19w Y2hfZW5jb2RlcikKLQkJcmV0dXJuIGlyb25sYWtlX2ZkaV9jb21wdXRlX2NvbmZpZyhjcnRjLCBw aXBlX2NvbmZpZyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBza3lsYWtlX2dldF9j ZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JdTMyIGNkY3RsOwot Ci0Jc2tsX2RwbGwwX3VwZGF0ZShkZXZfcHJpdik7Ci0KLQlpZiAoZGV2X3ByaXYtPmNkY2xrX3Bs bC52Y28gPT0gMCkKLQkJcmV0dXJuIGRldl9wcml2LT5jZGNsa19wbGwucmVmOwotCi0JY2RjdGwg PSBJOTE1X1JFQUQoQ0RDTEtfQ1RMKTsKLQotCWlmIChkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbyA9 PSA4NjQwMDAwKSB7Ci0JCXN3aXRjaCAoY2RjdGwgJiBDRENMS19GUkVRX1NFTF9NQVNLKSB7Ci0J CWNhc2UgQ0RDTEtfRlJFUV80NTBfNDMyOgotCQkJcmV0dXJuIDQzMjAwMDsKLQkJY2FzZSBDRENM S19GUkVRXzMzN18zMDg6Ci0JCQlyZXR1cm4gMzA4NTcxOwotCQljYXNlIENEQ0xLX0ZSRVFfNTQw OgotCQkJcmV0dXJuIDU0MDAwMDsKLQkJY2FzZSBDRENMS19GUkVRXzY3NV82MTc6Ci0JCQlyZXR1 cm4gNjE3MTQzOwotCQlkZWZhdWx0OgotCQkJTUlTU0lOR19DQVNFKGNkY3RsICYgQ0RDTEtfRlJF UV9TRUxfTUFTSyk7Ci0JCX0KLQl9IGVsc2UgewotCQlzd2l0Y2ggKGNkY3RsICYgQ0RDTEtfRlJF UV9TRUxfTUFTSykgewotCQljYXNlIENEQ0xLX0ZSRVFfNDUwXzQzMjoKLQkJCXJldHVybiA0NTAw MDA7Ci0JCWNhc2UgQ0RDTEtfRlJFUV8zMzdfMzA4OgotCQkJcmV0dXJuIDMzNzUwMDsKLQkJY2Fz ZSBDRENMS19GUkVRXzU0MDoKLQkJCXJldHVybiA1NDAwMDA7Ci0JCWNhc2UgQ0RDTEtfRlJFUV82 NzVfNjE3OgotCQkJcmV0dXJuIDY3NTAwMDsKLQkJZGVmYXVsdDoKLQkJCU1JU1NJTkdfQ0FTRShj ZGN0bCAmIENEQ0xLX0ZSRVFfU0VMX01BU0spOwotCQl9Ci0JfQotCi0JcmV0dXJuIGRldl9wcml2 LT5jZGNsa19wbGwucmVmOwotfQotCi1zdGF0aWMgdm9pZCBieHRfZGVfcGxsX3VwZGF0ZShzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JdTMyIHZhbDsKLQotCWRldl9wcml2 LT5jZGNsa19wbGwucmVmID0gMTkyMDA7Ci0JZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSAwOwot Ci0JdmFsID0gSTkxNV9SRUFEKEJYVF9ERV9QTExfRU5BQkxFKTsKLQlpZiAoKHZhbCAmIEJYVF9E RV9QTExfUExMX0VOQUJMRSkgPT0gMCkKLQkJcmV0dXJuOwotCi0JaWYgKFdBUk5fT04oKHZhbCAm IEJYVF9ERV9QTExfTE9DSykgPT0gMCkpCi0JCXJldHVybjsKLQotCXZhbCA9IEk5MTVfUkVBRChC WFRfREVfUExMX0NUTCk7Ci0JZGV2X3ByaXYtPmNkY2xrX3BsbC52Y28gPSAodmFsICYgQlhUX0RF X1BMTF9SQVRJT19NQVNLKSAqCi0JCWRldl9wcml2LT5jZGNsa19wbGwucmVmOwotfQotCi1zdGF0 aWMgaW50IGJyb3h0b25fZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp dikKLXsKLQl1MzIgZGl2aWRlcjsKLQlpbnQgZGl2LCB2Y287Ci0KLQlieHRfZGVfcGxsX3VwZGF0 ZShkZXZfcHJpdik7Ci0KLQl2Y28gPSBkZXZfcHJpdi0+Y2RjbGtfcGxsLnZjbzsKLQlpZiAodmNv ID09IDApCi0JCXJldHVybiBkZXZfcHJpdi0+Y2RjbGtfcGxsLnJlZjsKLQotCWRpdmlkZXIgPSBJ OTE1X1JFQUQoQ0RDTEtfQ1RMKSAmIEJYVF9DRENMS19DRDJYX0RJVl9TRUxfTUFTSzsKLQotCXN3 aXRjaCAoZGl2aWRlcikgewotCWNhc2UgQlhUX0NEQ0xLX0NEMlhfRElWX1NFTF8xOgotCQlkaXYg PSAyOwotCQlicmVhazsKLQljYXNlIEJYVF9DRENMS19DRDJYX0RJVl9TRUxfMV81OgotCQlXQVJO KElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpLCAiVW5zdXBwb3J0ZWQgZGl2aWRlclxuIik7Ci0JCWRp diA9IDM7Ci0JCWJyZWFrOwotCWNhc2UgQlhUX0NEQ0xLX0NEMlhfRElWX1NFTF8yOgotCQlkaXYg PSA0OwotCQlicmVhazsKLQljYXNlIEJYVF9DRENMS19DRDJYX0RJVl9TRUxfNDoKLQkJZGl2ID0g ODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJTUlTU0lOR19DQVNFKGRpdmlkZXIpOwotCQlyZXR1 cm4gZGV2X3ByaXYtPmNkY2xrX3BsbC5yZWY7Ci0JfQotCi0JcmV0dXJuIERJVl9ST1VORF9DTE9T RVNUKHZjbywgZGl2KTsKLX0KLQotc3RhdGljIGludCBicm9hZHdlbGxfZ2V0X2NkY2xrKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQl1aW50MzJfdCBsY3BsbCA9IEk5MTVf UkVBRChMQ1BMTF9DVEwpOwotCXVpbnQzMl90IGZyZXEgPSBsY3BsbCAmIExDUExMX0NMS19GUkVR X01BU0s7Ci0KLQlpZiAobGNwbGwgJiBMQ1BMTF9DRF9TT1VSQ0VfRkNMSykKLQkJcmV0dXJuIDgw MDAwMDsKLQllbHNlIGlmIChJOTE1X1JFQUQoRlVTRV9TVFJBUCkgJiBIU1dfQ0RDTEtfTElNSVQp Ci0JCXJldHVybiA0NTAwMDA7Ci0JZWxzZSBpZiAoZnJlcSA9PSBMQ1BMTF9DTEtfRlJFUV80NTAp Ci0JCXJldHVybiA0NTAwMDA7Ci0JZWxzZSBpZiAoZnJlcSA9PSBMQ1BMTF9DTEtfRlJFUV81NE9f QkRXKQotCQlyZXR1cm4gNTQwMDAwOwotCWVsc2UgaWYgKGZyZXEgPT0gTENQTExfQ0xLX0ZSRVFf MzM3XzVfQkRXKQotCQlyZXR1cm4gMzM3NTAwOwotCWVsc2UKLQkJcmV0dXJuIDY3NTAwMDsKLX0K LQotc3RhdGljIGludCBoYXN3ZWxsX2dldF9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYpCi17Ci0JdWludDMyX3QgbGNwbGwgPSBJOTE1X1JFQUQoTENQTExfQ1RMKTsKLQl1 aW50MzJfdCBmcmVxID0gbGNwbGwgJiBMQ1BMTF9DTEtfRlJFUV9NQVNLOwotCi0JaWYgKGxjcGxs ICYgTENQTExfQ0RfU09VUkNFX0ZDTEspCi0JCXJldHVybiA4MDAwMDA7Ci0JZWxzZSBpZiAoSTkx NV9SRUFEKEZVU0VfU1RSQVApICYgSFNXX0NEQ0xLX0xJTUlUKQotCQlyZXR1cm4gNDUwMDAwOwot CWVsc2UgaWYgKGZyZXEgPT0gTENQTExfQ0xLX0ZSRVFfNDUwKQotCQlyZXR1cm4gNDUwMDAwOwot CWVsc2UgaWYgKElTX0hTV19VTFQoZGV2X3ByaXYpKQotCQlyZXR1cm4gMzM3NTAwOwotCWVsc2UK LQkJcmV0dXJuIDU0MDAwMDsKLX0KLQotc3RhdGljIGludCB2YWxsZXl2aWV3X2dldF9jZGNsayhz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JcmV0dXJuIHZsdl9nZXRfY2Nr X2Nsb2NrX2hwbGwoZGV2X3ByaXYsICJjZGNsayIsCi0JCQkJICAgICAgQ0NLX0RJU1BMQVlfQ0xP Q0tfQ09OVFJPTCk7Ci19Ci0KLXN0YXRpYyBpbnQgZml4ZWRfNDUwbWh6X2dldF9jZGNsayhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JcmV0dXJuIDQ1MDAwMDsKLX0KLQot c3RhdGljIGludCBmaXhlZF80MDBtaHpfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKLXsKLQlyZXR1cm4gNDAwMDAwOwotfQotCi1zdGF0aWMgaW50IGZpeGVkXzMz M21oel9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQotewotCXJl dHVybiAzMzMzMzM7Ci19Ci0KLXN0YXRpYyBpbnQgZml4ZWRfMjAwbWh6X2dldF9jZGNsayhzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCi17Ci0JcmV0dXJuIDIwMDAwMDsKLX0KLQot c3RhdGljIGludCBwbnZfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp dikKLXsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRldjsKLQl1MTYg Z2NmZ2MgPSAwOwotCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgR0NGR0MsICZnY2ZnYyk7 Ci0KLQlzd2l0Y2ggKGdjZmdjICYgR0NfRElTUExBWV9DTE9DS19NQVNLKSB7Ci0JY2FzZSBHQ19E SVNQTEFZX0NMT0NLXzI2N19NSFpfUE5WOgotCQlyZXR1cm4gMjY2NjY3OwotCWNhc2UgR0NfRElT UExBWV9DTE9DS18zMzNfTUhaX1BOVjoKLQkJcmV0dXJuIDMzMzMzMzsKLQljYXNlIEdDX0RJU1BM QVlfQ0xPQ0tfNDQ0X01IWl9QTlY6Ci0JCXJldHVybiA0NDQ0NDQ7Ci0JY2FzZSBHQ19ESVNQTEFZ X0NMT0NLXzIwMF9NSFpfUE5WOgotCQlyZXR1cm4gMjAwMDAwOwotCWRlZmF1bHQ6Ci0JCURSTV9F UlJPUigiVW5rbm93biBwbnYgZGlzcGxheSBjb3JlIGNsb2NrIDB4JTA0eFxuIiwgZ2NmZ2MpOwot CWNhc2UgR0NfRElTUExBWV9DTE9DS18xMzNfTUhaX1BOVjoKLQkJcmV0dXJuIDEzMzMzMzsKLQlj YXNlIEdDX0RJU1BMQVlfQ0xPQ0tfMTY3X01IWl9QTlY6Ci0JCXJldHVybiAxNjY2Njc7Ci0JfQot fQotCi1zdGF0aWMgaW50IGk5MTVnbV9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2KQotewotCXN0cnVjdCBwY2lfZGV2ICpwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2 OwotCXUxNiBnY2ZnYyA9IDA7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBHQ0ZHQywg JmdjZmdjKTsKLQotCWlmIChnY2ZnYyAmIEdDX0xPV19GUkVRVUVOQ1lfRU5BQkxFKQotCQlyZXR1 cm4gMTMzMzMzOwotCWVsc2UgewotCQlzd2l0Y2ggKGdjZmdjICYgR0NfRElTUExBWV9DTE9DS19N QVNLKSB7Ci0JCWNhc2UgR0NfRElTUExBWV9DTE9DS18zMzNfTUhaOgotCQkJcmV0dXJuIDMzMzMz MzsKLQkJZGVmYXVsdDoKLQkJY2FzZSBHQ19ESVNQTEFZX0NMT0NLXzE5MF8yMDBfTUhaOgotCQkJ cmV0dXJuIDE5MDAwMDsKLQkJfQotCX0KLX0KLQotc3RhdGljIGludCBmaXhlZF8yNjZtaHpfZ2V0 X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQlyZXR1cm4gMjY2 NjY3OworCWlmIChuZWVkc19yZWNvbXB1dGUpCisJCXJldHVybiBSRVRSWTsKKworCXJldHVybiBy ZXQ7CiB9CiAKLXN0YXRpYyBpbnQgaTg1eF9nZXRfY2RjbGsoc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2KQorc3RhdGljIGJvb2wgcGlwZV9jb25maWdfc3VwcG9ydHNfaXBzKHN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKKwkJCQkgICAgIHN0cnVjdCBpbnRlbF9jcnRj X3N0YXRlICpwaXBlX2NvbmZpZykKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2 LT5kcm0ucGRldjsKLQl1MTYgaHBsbGNjID0gMDsKLQotCS8qCi0JICogODUyR00vODUyR01WIG9u bHkgc3VwcG9ydHMgMTMzIE1IeiBhbmQgdGhlIEhQTExDQwotCSAqIGVuY29kaW5nIGlzIGRpZmZl cmVudCA6KAotCSAqIEZJWE1FIGlzIHRoaXMgdGhlIHJpZ2h0IHdheSB0byBkZXRlY3QgODUyR00v ODUyR01WPwotCSAqLwotCWlmIChwZGV2LT5yZXZpc2lvbiA9PSAweDEpCi0JCXJldHVybiAxMzMz MzM7CisJaWYgKHBpcGVfY29uZmlnLT5waXBlX2JwcCA+IDI0KQorCQlyZXR1cm4gZmFsc2U7CiAK LQlwY2lfYnVzX3JlYWRfY29uZmlnX3dvcmQocGRldi0+YnVzLAotCQkJCSBQQ0lfREVWRk4oMCwg MyksIEhQTExDQywgJmhwbGxjYyk7CisJLyogSFNXIGNhbiBoYW5kbGUgcGl4ZWwgcmF0ZSB1cCB0 byBjZGNsaz8gKi8KKwlpZiAoSVNfSEFTV0VMTChkZXZfcHJpdikpCisJCXJldHVybiB0cnVlOwog Ci0JLyogQXNzdW1lIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGluIHRoZSBoaWdoIHNwZWVkIHN0YXRl LiAgVGhpcwotCSAqIHNob3VsZCBiZSB0aGUgZGVmYXVsdC4KKwkvKgorCSAqIFdlIGNvbXBhcmUg YWdhaW5zdCBtYXggd2hpY2ggbWVhbnMgd2UgbXVzdCB0YWtlCisJICogdGhlIGluY3JlYXNlZCBj ZGNsayByZXF1aXJlbWVudCBpbnRvIGFjY291bnQgd2hlbgorCSAqIGNhbGN1bGF0aW5nIHRoZSBu ZXcgY2RjbGsuCisJICoKKwkgKiBTaG91bGQgbWVhc3VyZSB3aGV0aGVyIHVzaW5nIGEgbG93ZXIg Y2RjbGsgdy9vIElQUwogCSAqLwotCXN3aXRjaCAoaHBsbGNjICYgR0NfQ0xPQ0tfQ09OVFJPTF9N QVNLKSB7Ci0JY2FzZSBHQ19DTE9DS18xMzNfMjAwOgotCWNhc2UgR0NfQ0xPQ0tfMTMzXzIwMF8y OgotCWNhc2UgR0NfQ0xPQ0tfMTAwXzIwMDoKLQkJcmV0dXJuIDIwMDAwMDsKLQljYXNlIEdDX0NM T0NLXzE2Nl8yNTA6Ci0JCXJldHVybiAyNTAwMDA7Ci0JY2FzZSBHQ19DTE9DS18xMDBfMTMzOgot CQlyZXR1cm4gMTMzMzMzOwotCWNhc2UgR0NfQ0xPQ0tfMTMzXzI2NjoKLQljYXNlIEdDX0NMT0NL XzEzM18yNjZfMjoKLQljYXNlIEdDX0NMT0NLXzE2Nl8yNjY6Ci0JCXJldHVybiAyNjY2Njc7Ci0J fQotCi0JLyogU2hvdWxkbid0IGhhcHBlbiAqLwotCXJldHVybiAwOworCXJldHVybiBwaXBlX2Nv bmZpZy0+cGl4ZWxfcmF0ZSA8PQorCQlkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEgKiA5NSAvIDEw MDsKIH0KIAotc3RhdGljIGludCBmaXhlZF8xMzNtaHpfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIGhzd19jb21wdXRlX2lwc19jb25maWco c3RydWN0IGludGVsX2NydGMgKmNydGMsCisJCQkJICAgc3RydWN0IGludGVsX2NydGNfc3RhdGUg KnBpcGVfY29uZmlnKQogewotCXJldHVybiAxMzMzMzM7CisJc3RydWN0IGRybV9kZXZpY2UgKmRl diA9IGNydGMtPmJhc2UuZGV2OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9 IHRvX2k5MTUoZGV2KTsKKworCXBpcGVfY29uZmlnLT5pcHNfZW5hYmxlZCA9IGk5MTUuZW5hYmxl X2lwcyAmJgorCQloc3dfY3J0Y19zdXBwb3J0c19pcHMoY3J0YykgJiYKKwkJcGlwZV9jb25maWdf c3VwcG9ydHNfaXBzKGRldl9wcml2LCBwaXBlX2NvbmZpZyk7CiB9CiAKLXN0YXRpYyB1bnNpZ25l ZCBpbnQgaW50ZWxfaHBsbF92Y28oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQor c3RhdGljIGJvb2wgaW50ZWxfY3J0Y19zdXBwb3J0c19kb3VibGVfd2lkZShjb25zdCBzdHJ1Y3Qg aW50ZWxfY3J0YyAqY3J0YykKIHsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGJsYl92Y29b OF0gPSB7Ci0JCVswXSA9IDMyMDAwMDAsCi0JCVsxXSA9IDQwMDAwMDAsCi0JCVsyXSA9IDUzMzMz MzMsCi0JCVszXSA9IDQ4MDAwMDAsCi0JCVs0XSA9IDY0MDAwMDAsCi0JfTsKLQlzdGF0aWMgY29u c3QgdW5zaWduZWQgaW50IHBudl92Y29bOF0gPSB7Ci0JCVswXSA9IDMyMDAwMDAsCi0JCVsxXSA9 IDQwMDAwMDAsCi0JCVsyXSA9IDUzMzMzMzMsCi0JCVszXSA9IDQ4MDAwMDAsCi0JCVs0XSA9IDI2 NjY2NjcsCi0JfTsKLQlzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNsX3Zjb1s4XSA9IHsKLQkJ WzBdID0gMzIwMDAwMCwKLQkJWzFdID0gNDAwMDAwMCwKLQkJWzJdID0gNTMzMzMzMywKLQkJWzNd ID0gNjQwMDAwMCwKLQkJWzRdID0gMzMzMzMzMywKLQkJWzVdID0gMzU2NjY2NywKLQkJWzZdID0g NDI2NjY2NywKLQl9OwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZWxrX3Zjb1s4XSA9IHsK LQkJWzBdID0gMzIwMDAwMCwKLQkJWzFdID0gNDAwMDAwMCwKLQkJWzJdID0gNTMzMzMzMywKLQkJ WzNdID0gNDgwMDAwMCwKLQl9OwotCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgY3RnX3Zjb1s4 XSA9IHsKLQkJWzBdID0gMzIwMDAwMCwKLQkJWzFdID0gNDAwMDAwMCwKLQkJWzJdID0gNTMzMzMz MywKLQkJWzNdID0gNjQwMDAwMCwKLQkJWzRdID0gMjY2NjY2NywKLQkJWzVdID0gNDI2NjY2NywK LQl9OwotCWNvbnN0IHVuc2lnbmVkIGludCAqdmNvX3RhYmxlOwotCXVuc2lnbmVkIGludCB2Y287 Ci0JdWludDhfdCB0bXAgPSAwOwotCi0JLyogRklYTUUgb3RoZXIgY2hpcHNldHM/ICovCi0JaWYg KElTX0dNNDUoZGV2X3ByaXYpKQotCQl2Y29fdGFibGUgPSBjdGdfdmNvOwotCWVsc2UgaWYgKElT X0c0WChkZXZfcHJpdikpCi0JCXZjb190YWJsZSA9IGVsa192Y287Ci0JZWxzZSBpZiAoSVNfSTk2 NUdNKGRldl9wcml2KSkKLQkJdmNvX3RhYmxlID0gY2xfdmNvOwotCWVsc2UgaWYgKElTX1BJTkVW SUVXKGRldl9wcml2KSkKLQkJdmNvX3RhYmxlID0gcG52X3ZjbzsKLQllbHNlIGlmIChJU19HMzMo ZGV2X3ByaXYpKQotCQl2Y29fdGFibGUgPSBibGJfdmNvOwotCWVsc2UKLQkJcmV0dXJuIDA7Ci0K LQl0bXAgPSBJOTE1X1JFQUQoSVNfTU9CSUxFKGRldl9wcml2KSA/IEhQTExWQ09fTU9CSUxFIDog SFBMTFZDTyk7Ci0KLQl2Y28gPSB2Y29fdGFibGVbdG1wICYgMHg3XTsKLQlpZiAodmNvID09IDAp Ci0JCURSTV9FUlJPUigiQmFkIEhQTEwgVkNPIChIUExMVkNPPTB4JTAyeClcbiIsIHRtcCk7Ci0J ZWxzZQotCQlEUk1fREVCVUdfS01TKCJIUExMIFZDTyAldSBrSHpcbiIsIHZjbyk7CisJY29uc3Qg c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkxNShjcnRjLT5iYXNlLmRl dik7CiAKLQlyZXR1cm4gdmNvOworCS8qIEdERyBkb3VibGUgd2lkZSBvbiBlaXRoZXIgcGlwZSwg b3RoZXJ3aXNlIHBpcGUgQSBvbmx5ICovCisJcmV0dXJuIElOVEVMX0lORk8oZGV2X3ByaXYpLT5n ZW4gPCA0ICYmCisJCShjcnRjLT5waXBlID09IFBJUEVfQSB8fCBJU19JOTE1RyhkZXZfcHJpdikp OwogfQogCi1zdGF0aWMgaW50IGdtNDVfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKK3N0YXRpYyB2b2lkIGludGVsX2NydGNfY29tcHV0ZV9waXhlbF9yYXRlKHN0 cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpjcnRjX3N0YXRlKQogewotCXN0cnVjdCBwY2lfZGV2ICpw ZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OwotCXVuc2lnbmVkIGludCBjZGNsa19zZWwsIHZjbyA9 IGludGVsX2hwbGxfdmNvKGRldl9wcml2KTsKLQl1aW50MTZfdCB0bXAgPSAwOwotCi0JcGNpX3Jl YWRfY29uZmlnX3dvcmQocGRldiwgR0NGR0MsICZ0bXApOwotCi0JY2RjbGtfc2VsID0gKHRtcCA+ PiAxMikgJiAweDE7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkx NShjcnRjX3N0YXRlLT5iYXNlLmNydGMtPmRldik7CiAKLQlzd2l0Y2ggKHZjbykgewotCWNhc2Ug MjY2NjY2NzoKLQljYXNlIDQwMDAwMDA6Ci0JY2FzZSA1MzMzMzMzOgotCQlyZXR1cm4gY2RjbGtf c2VsID8gMzMzMzMzIDogMjIyMjIyOwotCWNhc2UgMzIwMDAwMDoKLQkJcmV0dXJuIGNkY2xrX3Nl bCA/IDMyMDAwMCA6IDIyODU3MTsKLQlkZWZhdWx0OgotCQlEUk1fRVJST1IoIlVuYWJsZSB0byBk ZXRlcm1pbmUgQ0RDTEsuIEhQTEwgVkNPPSV1LCBDRkdDPTB4JTA0eFxuIiwgdmNvLCB0bXApOwot CQlyZXR1cm4gMjIyMjIyOwotCX0KKwlpZiAoSEFTX0dNQ0hfRElTUExBWShkZXZfcHJpdikpCisJ CS8qIEZJWE1FIGNhbGN1bGF0ZSBwcm9wZXIgcGlwZSBwaXhlbCByYXRlIGZvciBHTUNIIHBmaXQg Ki8KKwkJY3J0Y19zdGF0ZS0+cGl4ZWxfcmF0ZSA9CisJCQljcnRjX3N0YXRlLT5iYXNlLmFkanVz dGVkX21vZGUuY3J0Y19jbG9jazsKKwllbHNlCisJCWNydGNfc3RhdGUtPnBpeGVsX3JhdGUgPQor CQkJaWxrX3BpcGVfcGl4ZWxfcmF0ZShjcnRjX3N0YXRlKTsKIH0KIAotc3RhdGljIGludCBpOTY1 Z21fZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3N0YXRpYyBp bnQgaW50ZWxfY3J0Y19jb21wdXRlX2NvbmZpZyhzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywKKwkJ CQkgICAgIHN0cnVjdCBpbnRlbF9jcnRjX3N0YXRlICpwaXBlX2NvbmZpZykKIHsKLQlzdHJ1Y3Qg cGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRldjsKLQlzdGF0aWMgY29uc3QgdWludDhf dCBkaXZfMzIwMFtdID0geyAxNiwgMTAsICA4IH07Ci0Jc3RhdGljIGNvbnN0IHVpbnQ4X3QgZGl2 XzQwMDBbXSA9IHsgMjAsIDEyLCAxMCB9OwotCXN0YXRpYyBjb25zdCB1aW50OF90IGRpdl81MzMz W10gPSB7IDI0LCAxNiwgMTQgfTsKLQljb25zdCB1aW50OF90ICpkaXZfdGFibGU7Ci0JdW5zaWdu ZWQgaW50IGNkY2xrX3NlbCwgdmNvID0gaW50ZWxfaHBsbF92Y28oZGV2X3ByaXYpOwotCXVpbnQx Nl90IHRtcCA9IDA7Ci0KLQlwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBHQ0ZHQywgJnRtcCk7 Ci0KLQljZGNsa19zZWwgPSAoKHRtcCA+PiA4KSAmIDB4MWYpIC0gMTsKKwlzdHJ1Y3QgZHJtX2Rl dmljZSAqZGV2ID0gY3J0Yy0+YmFzZS5kZXY7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gdG9faTkxNShkZXYpOworCWNvbnN0IHN0cnVjdCBkcm1fZGlzcGxheV9tb2RlICph ZGp1c3RlZF9tb2RlID0gJnBpcGVfY29uZmlnLT5iYXNlLmFkanVzdGVkX21vZGU7CisJaW50IGNs b2NrX2xpbWl0ID0gZGV2X3ByaXYtPm1heF9kb3RjbGtfZnJlcTsKIAotCWlmIChjZGNsa19zZWwg Pj0gQVJSQVlfU0laRShkaXZfMzIwMCkpCi0JCWdvdG8gZmFpbDsKKwlpZiAoSU5URUxfR0VOKGRl dl9wcml2KSA8IDQpIHsKKwkJY2xvY2tfbGltaXQgPSBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXEg KiA5IC8gMTA7CiAKLQlzd2l0Y2ggKHZjbykgewotCWNhc2UgMzIwMDAwMDoKLQkJZGl2X3RhYmxl ID0gZGl2XzMyMDA7Ci0JCWJyZWFrOwotCWNhc2UgNDAwMDAwMDoKLQkJZGl2X3RhYmxlID0gZGl2 XzQwMDA7Ci0JCWJyZWFrOwotCWNhc2UgNTMzMzMzMzoKLQkJZGl2X3RhYmxlID0gZGl2XzUzMzM7 Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gZmFpbDsKKwkJLyoKKwkJICogRW5hYmxlIGRv dWJsZSB3aWRlIG1vZGUgd2hlbiB0aGUgZG90IGNsb2NrCisJCSAqIGlzID4gOTAlIG9mIHRoZSAo ZGlzcGxheSkgY29yZSBzcGVlZC4KKwkJICovCisJCWlmIChpbnRlbF9jcnRjX3N1cHBvcnRzX2Rv dWJsZV93aWRlKGNydGMpICYmCisJCSAgICBhZGp1c3RlZF9tb2RlLT5jcnRjX2Nsb2NrID4gY2xv Y2tfbGltaXQpIHsKKwkJCWNsb2NrX2xpbWl0ID0gZGV2X3ByaXYtPm1heF9kb3RjbGtfZnJlcTsK KwkJCXBpcGVfY29uZmlnLT5kb3VibGVfd2lkZSA9IHRydWU7CisJCX0KIAl9CiAKLQlyZXR1cm4g RElWX1JPVU5EX0NMT1NFU1QodmNvLCBkaXZfdGFibGVbY2RjbGtfc2VsXSk7Ci0KLWZhaWw6Ci0J RFJNX0VSUk9SKCJVbmFibGUgdG8gZGV0ZXJtaW5lIENEQ0xLLiBIUExMIFZDTz0ldSBrSHosIENG R0M9MHglMDR4XG4iLCB2Y28sIHRtcCk7Ci0JcmV0dXJuIDIwMDAwMDsKLX0KLQotc3RhdGljIGlu dCBnMzNfZ2V0X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKLXsKLQlz dHJ1Y3QgcGNpX2RldiAqcGRldiA9IGRldl9wcml2LT5kcm0ucGRldjsKLQlzdGF0aWMgY29uc3Qg dWludDhfdCBkaXZfMzIwMFtdID0geyAxMiwgMTAsICA4LCAgNywgNSwgMTYgfTsKLQlzdGF0aWMg Y29uc3QgdWludDhfdCBkaXZfNDAwMFtdID0geyAxNCwgMTIsIDEwLCAgOCwgNiwgMjAgfTsKLQlz dGF0aWMgY29uc3QgdWludDhfdCBkaXZfNDgwMFtdID0geyAyMCwgMTQsIDEyLCAxMCwgOCwgMjQg fTsKLQlzdGF0aWMgY29uc3QgdWludDhfdCBkaXZfNTMzM1tdID0geyAyMCwgMTYsIDEyLCAxMiwg OCwgMjggfTsKLQljb25zdCB1aW50OF90ICpkaXZfdGFibGU7Ci0JdW5zaWduZWQgaW50IGNkY2xr X3NlbCwgdmNvID0gaW50ZWxfaHBsbF92Y28oZGV2X3ByaXYpOwotCXVpbnQxNl90IHRtcCA9IDA7 CisJaWYgKGFkanVzdGVkX21vZGUtPmNydGNfY2xvY2sgPiBjbG9ja19saW1pdCkgeworCQlEUk1f REVCVUdfS01TKCJyZXF1ZXN0ZWQgcGl4ZWwgY2xvY2sgKCVkIGtIeikgdG9vIGhpZ2ggKG1heDog JWQga0h6LCBkb3VibGUgd2lkZTogJXMpXG4iLAorCQkJICAgICAgYWRqdXN0ZWRfbW9kZS0+Y3J0 Y19jbG9jaywgY2xvY2tfbGltaXQsCisJCQkgICAgICB5ZXNubyhwaXBlX2NvbmZpZy0+ZG91Ymxl X3dpZGUpKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQogCi0JcGNpX3JlYWRfY29uZmlnX3dvcmQo cGRldiwgR0NGR0MsICZ0bXApOworCS8qCisJICogUGlwZSBob3Jpem9udGFsIHNpemUgbXVzdCBi ZSBldmVuIGluOgorCSAqIC0gRFZPIGdhbmdlZCBtb2RlCisJICogLSBMVkRTIGR1YWwgY2hhbm5l bCBtb2RlCisJICogLSBEb3VibGUgd2lkZSBwaXBlCisJICovCisJaWYgKChpbnRlbF9jcnRjX2hh c190eXBlKHBpcGVfY29uZmlnLCBJTlRFTF9PVVRQVVRfTFZEUykgJiYKKwkgICAgIGludGVsX2lz X2R1YWxfbGlua19sdmRzKGRldikpIHx8IHBpcGVfY29uZmlnLT5kb3VibGVfd2lkZSkKKwkJcGlw ZV9jb25maWctPnBpcGVfc3JjX3cgJj0gfjE7CiAKLQljZGNsa19zZWwgPSAodG1wID4+IDQpICYg MHg3OworCS8qIENhbnRpZ2ErIGNhbm5vdCBoYW5kbGUgbW9kZXMgd2l0aCBhIGhzeW5jIGZyb250 IHBvcmNoIG9mIDAuCisJICogV2FQcnVuZU1vZGVXaXRoSW5jb3JyZWN0SHN5bmNPZmZzZXQ6Y3Rn LGVsayxpbGssc25iLGl2Yix2bHYsaHN3LgorCSAqLworCWlmICgoSU5URUxfR0VOKGRldl9wcml2 KSA+IDQgfHwgSVNfRzRYKGRldl9wcml2KSkgJiYKKwkJYWRqdXN0ZWRfbW9kZS0+Y3J0Y19oc3lu Y19zdGFydCA9PSBhZGp1c3RlZF9tb2RlLT5jcnRjX2hkaXNwbGF5KQorCQlyZXR1cm4gLUVJTlZB TDsKIAotCWlmIChjZGNsa19zZWwgPj0gQVJSQVlfU0laRShkaXZfMzIwMCkpCi0JCWdvdG8gZmFp bDsKKwlpbnRlbF9jcnRjX2NvbXB1dGVfcGl4ZWxfcmF0ZShwaXBlX2NvbmZpZyk7CiAKLQlzd2l0 Y2ggKHZjbykgewotCWNhc2UgMzIwMDAwMDoKLQkJZGl2X3RhYmxlID0gZGl2XzMyMDA7Ci0JCWJy ZWFrOwotCWNhc2UgNDAwMDAwMDoKLQkJZGl2X3RhYmxlID0gZGl2XzQwMDA7Ci0JCWJyZWFrOwot CWNhc2UgNDgwMDAwMDoKLQkJZGl2X3RhYmxlID0gZGl2XzQ4MDA7Ci0JCWJyZWFrOwotCWNhc2Ug NTMzMzMzMzoKLQkJZGl2X3RhYmxlID0gZGl2XzUzMzM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0J CWdvdG8gZmFpbDsKLQl9CisJaWYgKEhBU19JUFMoZGV2X3ByaXYpKQorCQloc3dfY29tcHV0ZV9p cHNfY29uZmlnKGNydGMsIHBpcGVfY29uZmlnKTsKIAotCXJldHVybiBESVZfUk9VTkRfQ0xPU0VT VCh2Y28sIGRpdl90YWJsZVtjZGNsa19zZWxdKTsKKwlpZiAocGlwZV9jb25maWctPmhhc19wY2hf ZW5jb2RlcikKKwkJcmV0dXJuIGlyb25sYWtlX2ZkaV9jb21wdXRlX2NvbmZpZyhjcnRjLCBwaXBl X2NvbmZpZyk7CiAKLWZhaWw6Ci0JRFJNX0VSUk9SKCJVbmFibGUgdG8gZGV0ZXJtaW5lIENEQ0xL LiBIUExMIFZDTz0ldSBrSHosIENGR0M9MHglMDh4XG4iLCB2Y28sIHRtcCk7Ci0JcmV0dXJuIDE5 MDQ3NjsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTEwMjE4LDI0NSArODg1NCw2 IEBAIHZvaWQgaHN3X2Rpc2FibGVfcGM4KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp dikKIAl9CiB9CiAKLXN0YXRpYyB2b2lkIGJ4dF9tb2Rlc2V0X2NvbW1pdF9jZGNsayhzdHJ1Y3Qg ZHJtX2F0b21pY19zdGF0ZSAqb2xkX3N0YXRlKQotewotCXN0cnVjdCBkcm1fZGV2aWNlICpkZXYg PSBvbGRfc3RhdGUtPmRldjsKLQlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICpvbGRfaW50ZWxf c3RhdGUgPQotCQl0b19pbnRlbF9hdG9taWNfc3RhdGUob2xkX3N0YXRlKTsKLQl1bnNpZ25lZCBp bnQgcmVxX2NkY2xrID0gb2xkX2ludGVsX3N0YXRlLT5kZXZfY2RjbGs7Ci0KLQlieHRfc2V0X2Nk Y2xrKHRvX2k5MTUoZGV2KSwgcmVxX2NkY2xrKTsKLX0KLQotc3RhdGljIGludCBiZHdfYWRqdXN0 X21pbl9waXBlX3BpeGVsX3JhdGUoc3RydWN0IGludGVsX2NydGNfc3RhdGUgKmNydGNfc3RhdGUs Ci0JCQkJCSAgaW50IHBpeGVsX3JhdGUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRl dl9wcml2ID0gdG9faTkxNShjcnRjX3N0YXRlLT5iYXNlLmNydGMtPmRldik7Ci0KLQkvKiBwaXhl bCByYXRlIG11c3RuJ3QgZXhjZWVkIDk1JSBvZiBjZGNsayB3aXRoIElQUyBvbiBCRFcgKi8KLQlp ZiAoSVNfQlJPQURXRUxMKGRldl9wcml2KSAmJiBjcnRjX3N0YXRlLT5pcHNfZW5hYmxlZCkKLQkJ cGl4ZWxfcmF0ZSA9IERJVl9ST1VORF9VUChwaXhlbF9yYXRlICogMTAwLCA5NSk7Ci0KLQkvKiBC U3BlYyBzYXlzICJEbyBub3QgdXNlIERpc3BsYXlQb3J0IHdpdGggQ0RDTEsgbGVzcyB0aGFuCi0J ICogNDMyIE1IeiwgYXVkaW8gZW5hYmxlZCwgcG9ydCB3aWR0aCB4NCwgYW5kIGxpbmsgcmF0ZQot CSAqIEhCUjIgKDUuNCBHSHopLCBvciBlbHNlIHRoZXJlIG1heSBiZSBhdWRpbyBjb3JydXB0aW9u IG9yCi0JICogc2NyZWVuIGNvcnJ1cHRpb24uIgotCSAqLwotCWlmIChpbnRlbF9jcnRjX2hhc19k cF9lbmNvZGVyKGNydGNfc3RhdGUpICYmCi0JICAgIGNydGNfc3RhdGUtPmhhc19hdWRpbyAmJgot CSAgICBjcnRjX3N0YXRlLT5wb3J0X2Nsb2NrID49IDU0MDAwMCAmJgotCSAgICBjcnRjX3N0YXRl LT5sYW5lX2NvdW50ID09IDQpCi0JCXBpeGVsX3JhdGUgPSBtYXgoNDMyMDAwLCBwaXhlbF9yYXRl KTsKLQotCXJldHVybiBwaXhlbF9yYXRlOwotfQotCi0vKiBjb21wdXRlIHRoZSBtYXggcmF0ZSBm b3IgbmV3IGNvbmZpZ3VyYXRpb24gKi8KLXN0YXRpYyBpbnQgaW50ZWxfbWF4X3BpeGVsX3JhdGUo c3RydWN0IGRybV9hdG9taWNfc3RhdGUgKnN0YXRlKQotewotCXN0cnVjdCBpbnRlbF9hdG9taWNf c3RhdGUgKmludGVsX3N0YXRlID0gdG9faW50ZWxfYXRvbWljX3N0YXRlKHN0YXRlKTsKLQlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSB0b19pOTE1KHN0YXRlLT5kZXYpOwotCXN0 cnVjdCBkcm1fY3J0YyAqY3J0YzsKLQlzdHJ1Y3QgZHJtX2NydGNfc3RhdGUgKmNzdGF0ZTsKLQlz dHJ1Y3QgaW50ZWxfY3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZTsKLQl1bnNpZ25lZCBtYXhfcGl4ZWxf cmF0ZSA9IDAsIGk7Ci0JZW51bSBwaXBlIHBpcGU7Ci0KLQltZW1jcHkoaW50ZWxfc3RhdGUtPm1p bl9waXhjbGssIGRldl9wcml2LT5taW5fcGl4Y2xrLAotCSAgICAgICBzaXplb2YoaW50ZWxfc3Rh dGUtPm1pbl9waXhjbGspKTsKLQotCWZvcl9lYWNoX2NydGNfaW5fc3RhdGUoc3RhdGUsIGNydGMs IGNzdGF0ZSwgaSkgewotCQlpbnQgcGl4ZWxfcmF0ZTsKLQotCQljcnRjX3N0YXRlID0gdG9faW50 ZWxfY3J0Y19zdGF0ZShjc3RhdGUpOwotCQlpZiAoIWNydGNfc3RhdGUtPmJhc2UuZW5hYmxlKSB7 Ci0JCQlpbnRlbF9zdGF0ZS0+bWluX3BpeGNsa1tpXSA9IDA7Ci0JCQljb250aW51ZTsKLQkJfQot Ci0JCXBpeGVsX3JhdGUgPSBjcnRjX3N0YXRlLT5waXhlbF9yYXRlOwotCi0JCWlmIChJU19CUk9B RFdFTEwoZGV2X3ByaXYpIHx8IElTX0dFTjkoZGV2X3ByaXYpKQotCQkJcGl4ZWxfcmF0ZSA9IGJk d19hZGp1c3RfbWluX3BpcGVfcGl4ZWxfcmF0ZShjcnRjX3N0YXRlLAotCQkJCQkJCQkgICAgcGl4 ZWxfcmF0ZSk7Ci0KLQkJaW50ZWxfc3RhdGUtPm1pbl9waXhjbGtbaV0gPSBwaXhlbF9yYXRlOwot CX0KLQotCWZvcl9lYWNoX3BpcGUoZGV2X3ByaXYsIHBpcGUpCi0JCW1heF9waXhlbF9yYXRlID0g bWF4KGludGVsX3N0YXRlLT5taW5fcGl4Y2xrW3BpcGVdLCBtYXhfcGl4ZWxfcmF0ZSk7Ci0KLQly ZXR1cm4gbWF4X3BpeGVsX3JhdGU7Ci19Ci0KLXN0YXRpYyB2b2lkIGJyb2Fkd2VsbF9zZXRfY2Rj bGsoc3RydWN0IGRybV9kZXZpY2UgKmRldiwgaW50IGNkY2xrKQotewotCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IHRvX2k5MTUoZGV2KTsKLQl1aW50MzJfdCB2YWwsIGRhdGE7 Ci0JaW50IHJldDsKLQotCWlmIChXQVJOKChJOTE1X1JFQUQoTENQTExfQ1RMKSAmCi0JCSAgKExD UExMX1BMTF9ESVNBQkxFIHwgTENQTExfUExMX0xPQ0sgfAotCQkgICBMQ1BMTF9DRF9DTE9DS19E SVNBQkxFIHwgTENQTExfUk9PVF9DRF9DTE9DS19ESVNBQkxFIHwKLQkJICAgTENQTExfQ0QyWF9D TE9DS19ESVNBQkxFIHwgTENQTExfUE9XRVJfRE9XTl9BTExPVyB8Ci0JCSAgIExDUExMX0NEX1NP VVJDRV9GQ0xLKSkgIT0gTENQTExfUExMX0xPQ0ssCi0JCSAidHJ5aW5nIHRvIGNoYW5nZSBjZGNs ayBmcmVxdWVuY3kgd2l0aCBjZGNsayBub3QgZW5hYmxlZFxuIikpCi0JCXJldHVybjsKLQotCW11 dGV4X2xvY2soJmRldl9wcml2LT5ycHMuaHdfbG9jayk7Ci0JcmV0ID0gc2FuZHlicmlkZ2VfcGNv ZGVfd3JpdGUoZGV2X3ByaXYsCi0JCQkJICAgICAgQkRXX1BDT0RFX0RJU1BMQVlfRlJFUV9DSEFO R0VfUkVRLCAweDApOwotCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPnJwcy5od19sb2NrKTsKLQlp ZiAocmV0KSB7Ci0JCURSTV9FUlJPUigiZmFpbGVkIHRvIGluZm9ybSBwY29kZSBhYm91dCBjZGNs ayBjaGFuZ2VcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JdmFsID0gSTkxNV9SRUFEKExDUExMX0NU TCk7Ci0JdmFsIHw9IExDUExMX0NEX1NPVVJDRV9GQ0xLOwotCUk5MTVfV1JJVEUoTENQTExfQ1RM LCB2YWwpOwotCi0JaWYgKHdhaXRfZm9yX3VzKEk5MTVfUkVBRChMQ1BMTF9DVEwpICYKLQkJCUxD UExMX0NEX1NPVVJDRV9GQ0xLX0RPTkUsIDEpKQotCQlEUk1fRVJST1IoIlN3aXRjaGluZyB0byBG Q0xLIGZhaWxlZFxuIik7Ci0KLQl2YWwgPSBJOTE1X1JFQUQoTENQTExfQ1RMKTsKLQl2YWwgJj0g fkxDUExMX0NMS19GUkVRX01BU0s7Ci0KLQlzd2l0Y2ggKGNkY2xrKSB7Ci0JY2FzZSA0NTAwMDA6 Ci0JCXZhbCB8PSBMQ1BMTF9DTEtfRlJFUV80NTA7Ci0JCWRhdGEgPSAwOwotCQlicmVhazsKLQlj YXNlIDU0MDAwMDoKLQkJdmFsIHw9IExDUExMX0NMS19GUkVRXzU0T19CRFc7Ci0JCWRhdGEgPSAx OwotCQlicmVhazsKLQljYXNlIDMzNzUwMDoKLQkJdmFsIHw9IExDUExMX0NMS19GUkVRXzMzN181 X0JEVzsKLQkJZGF0YSA9IDI7Ci0JCWJyZWFrOwotCWNhc2UgNjc1MDAwOgotCQl2YWwgfD0gTENQ TExfQ0xLX0ZSRVFfNjc1X0JEVzsKLQkJZGF0YSA9IDM7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0J CVdBUk4oMSwgImludmFsaWQgY2RjbGsgZnJlcXVlbmN5XG4iKTsKLQkJcmV0dXJuOwotCX0KLQot CUk5MTVfV1JJVEUoTENQTExfQ1RMLCB2YWwpOwotCi0JdmFsID0gSTkxNV9SRUFEKExDUExMX0NU TCk7Ci0JdmFsICY9IH5MQ1BMTF9DRF9TT1VSQ0VfRkNMSzsKLQlJOTE1X1dSSVRFKExDUExMX0NU TCwgdmFsKTsKLQotCWlmICh3YWl0X2Zvcl91cygoSTkxNV9SRUFEKExDUExMX0NUTCkgJgotCQkJ TENQTExfQ0RfU09VUkNFX0ZDTEtfRE9ORSkgPT0gMCwgMSkpCi0JCURSTV9FUlJPUigiU3dpdGNo aW5nIGJhY2sgdG8gTENQTEwgZmFpbGVkXG4iKTsKLQotCW11dGV4X2xvY2soJmRldl9wcml2LT5y cHMuaHdfbG9jayk7Ci0Jc2FuZHlicmlkZ2VfcGNvZGVfd3JpdGUoZGV2X3ByaXYsIEhTV19QQ09E RV9ERV9XUklURV9GUkVRX1JFUSwgZGF0YSk7Ci0JbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+cnBz Lmh3X2xvY2spOwotCi0JSTkxNV9XUklURShDRENMS19GUkVRLCBESVZfUk9VTkRfQ0xPU0VTVChj ZGNsaywgMTAwMCkgLSAxKTsKLQotCWludGVsX3VwZGF0ZV9jZGNsayhkZXZfcHJpdik7Ci0KLQlX QVJOKGNkY2xrICE9IGRldl9wcml2LT5jZGNsa19mcmVxLAotCSAgICAgImNkY2xrIHJlcXVlc3Rl ZCAlZCBrSHogYnV0IGdvdCAlZCBrSHpcbiIsCi0JICAgICBjZGNsaywgZGV2X3ByaXYtPmNkY2xr X2ZyZXEpOwotfQotCi1zdGF0aWMgaW50IGJyb2Fkd2VsbF9jYWxjX2NkY2xrKGludCBtYXhfcGl4 Y2xrKQotewotCWlmIChtYXhfcGl4Y2xrID4gNTQwMDAwKQotCQlyZXR1cm4gNjc1MDAwOwotCWVs c2UgaWYgKG1heF9waXhjbGsgPiA0NTAwMDApCi0JCXJldHVybiA1NDAwMDA7Ci0JZWxzZSBpZiAo bWF4X3BpeGNsayA+IDMzNzUwMCkKLQkJcmV0dXJuIDQ1MDAwMDsKLQllbHNlCi0JCXJldHVybiAz Mzc1MDA7Ci19Ci0KLXN0YXRpYyBpbnQgYnJvYWR3ZWxsX21vZGVzZXRfY2FsY19jZGNsayhzdHJ1 Y3QgZHJtX2F0b21pY19zdGF0ZSAqc3RhdGUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2ID0gdG9faTkxNShzdGF0ZS0+ZGV2KTsKLQlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0 YXRlICppbnRlbF9zdGF0ZSA9IHRvX2ludGVsX2F0b21pY19zdGF0ZShzdGF0ZSk7Ci0JaW50IG1h eF9waXhjbGsgPSBpbnRlbF9tYXhfcGl4ZWxfcmF0ZShzdGF0ZSk7Ci0JaW50IGNkY2xrOwotCi0J LyoKLQkgKiBGSVhNRSBzaG91bGQgYWxzbyBhY2NvdW50IGZvciBwbGFuZSByYXRpbwotCSAqIG9u Y2UgNjRicHAgcGl4ZWwgZm9ybWF0cyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCWNkY2xrID0gYnJv YWR3ZWxsX2NhbGNfY2RjbGsobWF4X3BpeGNsayk7Ci0KLQlpZiAoY2RjbGsgPiBkZXZfcHJpdi0+ bWF4X2NkY2xrX2ZyZXEpIHsKLQkJRFJNX0RFQlVHX0tNUygicmVxdWVzdGVkIGNkY2xrICglZCBr SHopIGV4Y2VlZHMgbWF4ICglZCBrSHopXG4iLAotCQkJICAgICAgY2RjbGssIGRldl9wcml2LT5t YXhfY2RjbGtfZnJlcSk7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQotCWludGVsX3N0YXRlLT5j ZGNsayA9IGludGVsX3N0YXRlLT5kZXZfY2RjbGsgPSBjZGNsazsKLQlpZiAoIWludGVsX3N0YXRl LT5hY3RpdmVfY3J0Y3MpCi0JCWludGVsX3N0YXRlLT5kZXZfY2RjbGsgPSBicm9hZHdlbGxfY2Fs Y19jZGNsaygwKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBicm9hZHdlbGxfbW9k ZXNldF9jb21taXRfY2RjbGsoc3RydWN0IGRybV9hdG9taWNfc3RhdGUgKm9sZF9zdGF0ZSkKLXsK LQlzdHJ1Y3QgZHJtX2RldmljZSAqZGV2ID0gb2xkX3N0YXRlLT5kZXY7Ci0Jc3RydWN0IGludGVs X2F0b21pY19zdGF0ZSAqb2xkX2ludGVsX3N0YXRlID0KLQkJdG9faW50ZWxfYXRvbWljX3N0YXRl KG9sZF9zdGF0ZSk7Ci0JdW5zaWduZWQgcmVxX2NkY2xrID0gb2xkX2ludGVsX3N0YXRlLT5kZXZf Y2RjbGs7Ci0KLQlicm9hZHdlbGxfc2V0X2NkY2xrKGRldiwgcmVxX2NkY2xrKTsKLX0KLQotc3Rh dGljIGludCBza2xfbW9kZXNldF9jYWxjX2NkY2xrKHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpz dGF0ZSkKLXsKLQlzdHJ1Y3QgaW50ZWxfYXRvbWljX3N0YXRlICppbnRlbF9zdGF0ZSA9IHRvX2lu dGVsX2F0b21pY19zdGF0ZShzdGF0ZSk7Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2ID0gdG9faTkxNShzdGF0ZS0+ZGV2KTsKLQljb25zdCBpbnQgbWF4X3BpeGNsayA9IGludGVs X21heF9waXhlbF9yYXRlKHN0YXRlKTsKLQlpbnQgdmNvID0gaW50ZWxfc3RhdGUtPmNkY2xrX3Bs bF92Y287Ci0JaW50IGNkY2xrOwotCi0JLyoKLQkgKiBGSVhNRSBzaG91bGQgYWxzbyBhY2NvdW50 IGZvciBwbGFuZSByYXRpbwotCSAqIG9uY2UgNjRicHAgcGl4ZWwgZm9ybWF0cyBhcmUgc3VwcG9y dGVkLgotCSAqLwotCWNkY2xrID0gc2tsX2NhbGNfY2RjbGsobWF4X3BpeGNsaywgdmNvKTsKLQot CS8qCi0JICogRklYTUUgbW92ZSB0aGUgY2RjbGsgY2FjbHVsYXRpb24gdG8KLQkgKiBjb21wdXRl X2NvbmZpZygpIHNvIHdlIGNhbiBmYWlsIGdyYWNlZ3VsbHkuCi0JICovCi0JaWYgKGNkY2xrID4g ZGV2X3ByaXYtPm1heF9jZGNsa19mcmVxKSB7Ci0JCURSTV9FUlJPUigicmVxdWVzdGVkIGNkY2xr ICglZCBrSHopIGV4Y2VlZHMgbWF4ICglZCBrSHopXG4iLAotCQkJICBjZGNsaywgZGV2X3ByaXYt Pm1heF9jZGNsa19mcmVxKTsKLQkJY2RjbGsgPSBkZXZfcHJpdi0+bWF4X2NkY2xrX2ZyZXE7Ci0J fQotCi0JaW50ZWxfc3RhdGUtPmNkY2xrID0gaW50ZWxfc3RhdGUtPmRldl9jZGNsayA9IGNkY2xr OwotCWlmICghaW50ZWxfc3RhdGUtPmFjdGl2ZV9jcnRjcykKLQkJaW50ZWxfc3RhdGUtPmRldl9j ZGNsayA9IHNrbF9jYWxjX2NkY2xrKDAsIHZjbyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IHZvaWQgc2tsX21vZGVzZXRfY29tbWl0X2NkY2xrKHN0cnVjdCBkcm1fYXRvbWljX3N0YXRlICpv bGRfc3RhdGUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gdG9faTkx NShvbGRfc3RhdGUtPmRldik7Ci0Jc3RydWN0IGludGVsX2F0b21pY19zdGF0ZSAqaW50ZWxfc3Rh dGUgPSB0b19pbnRlbF9hdG9taWNfc3RhdGUob2xkX3N0YXRlKTsKLQl1bnNpZ25lZCBpbnQgcmVx X2NkY2xrID0gaW50ZWxfc3RhdGUtPmRldl9jZGNsazsKLQl1bnNpZ25lZCBpbnQgcmVxX3ZjbyA9 IGludGVsX3N0YXRlLT5jZGNsa19wbGxfdmNvOwotCi0Jc2tsX3NldF9jZGNsayhkZXZfcHJpdiwg cmVxX2NkY2xrLCByZXFfdmNvKTsKLX0KLQogc3RhdGljIGludCBoYXN3ZWxsX2NydGNfY29tcHV0 ZV9jbG9jayhzdHJ1Y3QgaW50ZWxfY3J0YyAqY3J0YywKIAkJCQkgICAgICBzdHJ1Y3QgaW50ZWxf Y3J0Y19zdGF0ZSAqY3J0Y19zdGF0ZSkKIHsKQEAgLTE2MTE4LDYgKzE0NTE1LDggQEAgc3RhdGlj IGNvbnN0IHN0cnVjdCBkcm1fbW9kZV9jb25maWdfZnVuY3MgaW50ZWxfbW9kZV9mdW5jcyA9IHsK ICAqLwogdm9pZCBpbnRlbF9pbml0X2Rpc3BsYXlfaG9va3Moc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmRldl9wcml2KQogeworCWludGVsX2luaXRfY2RjbGtfaG9va3MoZGV2X3ByaXYpOworCiAJ aWYgKElOVEVMX0lORk8oZGV2X3ByaXYpLT5nZW4gPj0gOSkgewogCQlkZXZfcHJpdi0+ZGlzcGxh eS5nZXRfcGlwZV9jb25maWcgPSBoYXN3ZWxsX2dldF9waXBlX2NvbmZpZzsKIAkJZGV2X3ByaXYt PmRpc3BsYXkuZ2V0X2luaXRpYWxfcGxhbmVfY29uZmlnID0KQEAgLTE2MTg2LDUyICsxNDU4NSw2 IEBAIHZvaWQgaW50ZWxfaW5pdF9kaXNwbGF5X2hvb2tzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdikKIAkJZGV2X3ByaXYtPmRpc3BsYXkuY3J0Y19kaXNhYmxlID0gaTl4eF9jcnRj X2Rpc2FibGU7CiAJfQogCi0JLyogUmV0dXJucyB0aGUgY29yZSBkaXNwbGF5IGNsb2NrIHNwZWVk ICovCi0JaWYgKElTX0dFTjlfQkMoZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRf Y2RjbGsgPSBza3lsYWtlX2dldF9jZGNsazsKLQllbHNlIGlmIChJU19HRU45X0xQKGRldl9wcml2 KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gYnJveHRvbl9nZXRfY2RjbGs7Ci0J ZWxzZSBpZiAoSVNfQlJPQURXRUxMKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0 X2NkY2xrID0gYnJvYWR3ZWxsX2dldF9jZGNsazsKLQllbHNlIGlmIChJU19IQVNXRUxMKGRldl9w cml2KSkKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gaGFzd2VsbF9nZXRfY2RjbGs7 Ci0JZWxzZSBpZiAoSVNfVkFMTEVZVklFVyhkZXZfcHJpdikgfHwgSVNfQ0hFUlJZVklFVyhkZXZf cHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IHZhbGxleXZpZXdfZ2V0X2Nk Y2xrOwotCWVsc2UgaWYgKElTX0dFTjYoZGV2X3ByaXYpIHx8IElTX0lWWUJSSURHRShkZXZfcHJp dikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGZpeGVkXzQwMG1oel9nZXRfY2Rj bGs7Ci0JZWxzZSBpZiAoSVNfR0VONShkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5Lmdl dF9jZGNsayA9IGZpeGVkXzQ1MG1oel9nZXRfY2RjbGs7Ci0JZWxzZSBpZiAoSVNfR000NShkZXZf cHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGdtNDVfZ2V0X2NkY2xrOwot CWVsc2UgaWYgKElTX0c0WChkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNs ayA9IGczM19nZXRfY2RjbGs7Ci0JZWxzZSBpZiAoSVNfSTk2NUdNKGRldl9wcml2KSkKLQkJZGV2 X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gaTk2NWdtX2dldF9jZGNsazsKLQllbHNlIGlmIChJ U19JOTY1RyhkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGZpeGVk XzQwMG1oel9nZXRfY2RjbGs7Ci0JZWxzZSBpZiAoSVNfUElORVZJRVcoZGV2X3ByaXYpKQotCQlk ZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBwbnZfZ2V0X2NkY2xrOwotCWVsc2UgaWYgKElT X0czMyhkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGczM19nZXRf Y2RjbGs7Ci0JZWxzZSBpZiAoSVNfSTk0NUdNKGRldl9wcml2KSkKLQkJZGV2X3ByaXYtPmRpc3Bs YXkuZ2V0X2NkY2xrID0gZml4ZWRfMjAwbWh6X2dldF9jZGNsazsKLQllbHNlIGlmIChJU19JOTQ1 RyhkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGZpeGVkXzQwMG1o el9nZXRfY2RjbGs7Ci0JZWxzZSBpZiAoSVNfSTkxNUdNKGRldl9wcml2KSkKLQkJZGV2X3ByaXYt PmRpc3BsYXkuZ2V0X2NkY2xrID0gaTkxNWdtX2dldF9jZGNsazsKLQllbHNlIGlmIChJU19JOTE1 RyhkZXZfcHJpdikpCi0JCWRldl9wcml2LT5kaXNwbGF5LmdldF9jZGNsayA9IGZpeGVkXzMzM21o el9nZXRfY2RjbGs7Ci0JZWxzZSBpZiAoSVNfSTg2NUcoZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+ ZGlzcGxheS5nZXRfY2RjbGsgPSBmaXhlZF8yNjZtaHpfZ2V0X2NkY2xrOwotCWVsc2UgaWYgKElT X0k4NVgoZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+ZGlzcGxheS5nZXRfY2RjbGsgPSBpODV4X2dl dF9jZGNsazsKLQllbHNlICBpZiAoSVNfSTg0NUcoZGV2X3ByaXYpKQotCQlkZXZfcHJpdi0+ZGlz cGxheS5nZXRfY2RjbGsgPSBmaXhlZF8yMDBtaHpfZ2V0X2NkY2xrOwotCWVsc2UgeyAvKiA4MzAg Ki8KLQkJV0FSTighSVNfSTgzMChkZXZfcHJpdiksICJVbmtub3duIHBsYXRmb3JtLiBBc3N1bWlu ZyAxMzMgTUh6IENEQ0xLXG4iKTsKLQkJZGV2X3ByaXYtPmRpc3BsYXkuZ2V0X2NkY2xrID0gZml4 ZWRfMTMzbWh6X2dldF9jZGNsazsKLQl9Ci0KIAlpZiAoSVNfR0VONShkZXZfcHJpdikpIHsKIAkJ ZGV2X3ByaXYtPmRpc3BsYXkuZmRpX2xpbmtfdHJhaW4gPSBpcm9ubGFrZV9mZGlfbGlua190cmFp bjsKIAl9IGVsc2UgaWYgKElTX0dFTjYoZGV2X3ByaXYpKSB7CkBAIC0xNjI0MywyOCArMTQ1OTYs NiBAQCB2b2lkIGludGVsX2luaXRfZGlzcGxheV9ob29rcyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYpCiAJCWRldl9wcml2LT5kaXNwbGF5LmZkaV9saW5rX3RyYWluID0gaHN3X2Zk aV9saW5rX3RyYWluOwogCX0KIAotCWlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYpKSB7Ci0JCWRl dl9wcml2LT5kaXNwbGF5Lm1vZGVzZXRfY29tbWl0X2NkY2xrID0KLQkJCWJyb2Fkd2VsbF9tb2Rl c2V0X2NvbW1pdF9jZGNsazsKLQkJZGV2X3ByaXYtPmRpc3BsYXkubW9kZXNldF9jYWxjX2NkY2xr ID0KLQkJCWJyb2Fkd2VsbF9tb2Rlc2V0X2NhbGNfY2RjbGs7Ci0JfSBlbHNlIGlmIChJU19WQUxM RVlWSUVXKGRldl9wcml2KSB8fCBJU19DSEVSUllWSUVXKGRldl9wcml2KSkgewotCQlkZXZfcHJp di0+ZGlzcGxheS5tb2Rlc2V0X2NvbW1pdF9jZGNsayA9Ci0JCQl2YWxsZXl2aWV3X21vZGVzZXRf Y29tbWl0X2NkY2xrOwotCQlkZXZfcHJpdi0+ZGlzcGxheS5tb2Rlc2V0X2NhbGNfY2RjbGsgPQot CQkJdmFsbGV5dmlld19tb2Rlc2V0X2NhbGNfY2RjbGs7Ci0JfSBlbHNlIGlmIChJU19HRU45X0xQ KGRldl9wcml2KSkgewotCQlkZXZfcHJpdi0+ZGlzcGxheS5tb2Rlc2V0X2NvbW1pdF9jZGNsayA9 Ci0JCQlieHRfbW9kZXNldF9jb21taXRfY2RjbGs7Ci0JCWRldl9wcml2LT5kaXNwbGF5Lm1vZGVz ZXRfY2FsY19jZGNsayA9Ci0JCQlieHRfbW9kZXNldF9jYWxjX2NkY2xrOwotCX0gZWxzZSBpZiAo SVNfR0VOOV9CQyhkZXZfcHJpdikpIHsKLQkJZGV2X3ByaXYtPmRpc3BsYXkubW9kZXNldF9jb21t aXRfY2RjbGsgPQotCQkJc2tsX21vZGVzZXRfY29tbWl0X2NkY2xrOwotCQlkZXZfcHJpdi0+ZGlz cGxheS5tb2Rlc2V0X2NhbGNfY2RjbGsgPQotCQkJc2tsX21vZGVzZXRfY2FsY19jZGNsazsKLQl9 Ci0KIAlpZiAoZGV2X3ByaXYtPmluZm8uZ2VuID49IDkpCiAJCWRldl9wcml2LT5kaXNwbGF5LnVw ZGF0ZV9jcnRjcyA9IHNrbF91cGRhdGVfY3J0Y3M7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9k cnYuaAppbmRleCBhNzNiNDRjMGUxYjUuLjFjZWFiYmU3MmJiMCAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaW50ZWxfZHJ2LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50 ZWxfZHJ2LmgKQEAgLTEyNDcsMTIgKzEyNDcsMTkgQEAgdm9pZCBpbnRlbF9hdWRpb19jb2RlY19k aXNhYmxlKHN0cnVjdCBpbnRlbF9lbmNvZGVyICplbmNvZGVyKTsKIHZvaWQgaTkxNV9hdWRpb19j b21wb25lbnRfaW5pdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogdm9pZCBp OTE1X2F1ZGlvX2NvbXBvbmVudF9jbGVhbnVwKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdik7CiAKKy8qIGludGVsX2NkY2xrLmMgKi8KK3ZvaWQgaW50ZWxfaW5pdF9jZGNsa19ob29r cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwordm9pZCBpbnRlbF91cGRhdGVf bWF4X2NkY2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7Cit2b2lkIGludGVs X3VwZGF0ZV9jZGNsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwordm9pZCBp bnRlbF91cGRhdGVfcmF3Y2xrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdik7CisK IC8qIGludGVsX2Rpc3BsYXkuYyAqLwogZW51bSB0cmFuc2NvZGVyIGludGVsX2NydGNfcGNoX3Ry YW5zY29kZXIoc3RydWN0IGludGVsX2NydGMgKmNydGMpOwotdm9pZCBza2xfc2V0X3ByZWZlcnJl ZF9jZGNsa192Y28oc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgdmNvKTsK IHZvaWQgaW50ZWxfdXBkYXRlX3Jhd2NsayhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3By aXYpOwogaW50IHZsdl9nZXRfY2NrX2Nsb2NrKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiwKIAkJICAgICAgY29uc3QgY2hhciAqbmFtZSwgdTMyIHJlZywgaW50IHJlZl9mcmVxKTsK K2ludCB2bHZfZ2V0X2Nja19jbG9ja19ocGxsKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiwKKwkJCSAgIGNvbnN0IGNoYXIgKm5hbWUsIHUzMiByZWcpOwogdm9pZCBscHRfZGlzYWJs ZV9wY2hfdHJhbnNjb2RlcihzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpOwogdm9p ZCBscHRfZGlzYWJsZV9pY2xraXAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KTsK IGV4dGVybiBjb25zdCBzdHJ1Y3QgZHJtX3BsYW5lX2Z1bmNzIGludGVsX3BsYW5lX2Z1bmNzOwot LSAKMi4xMC4yCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcK aHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK