From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Auld Subject: [PATCH 17/21] drm/i915/selftests: huge page tests Date: Fri, 6 Oct 2017 15:50:37 +0100 Message-ID: <20171006145041.21673-18-matthew.auld@intel.com> References: <20171006145041.21673-1-matthew.auld@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id DE6D86FAD2 for ; Fri, 6 Oct 2017 14:51:10 +0000 (UTC) In-Reply-To: <20171006145041.21673-1-matthew.auld@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 djI6IG1vY2sgdGVzdCBwYWdlIHN1cHBvcnQgY29uZmlndXJhdGlvbnMgYW5kIGFkZCBNSV9TVE9S RV9EV09SRCB0ZXN0Cgp2MzogcnVuIGFsbCBtb2NrYWJsZSBodWdlIHBhZ2UgdGVzdHMgb24gYWxs IHBsYXRmb3JtcyB2aWEgdGhlIG1vY2tfZGV2aWNlCgp2NDogYWRkIHBpbl91cGRhdGUgcmVncmVz c2lvbiB0ZXN0CiAgICB2YXJpb3VzIGltcHJvdmVtZW50cyBzdWdnZXN0ZWQgYnkgQ2hyaXMKCnY1 OiBmaXggaXNzdWVzIHJlcG9ydGVkIGJ5IGtidWlsZAogICAgdGVzdCBzaW5nbGUgc2cgc3Bhbm5p bmcgbXVsdGlwbGUgcGFnZSBzaXplcwogICAgZG9uJ3QgZXhwbG9kZSB3aGVuIHJ1bm5pbmcgdGhl IGxpdmUtdGVzdHMgdGhyb3VnaCB0aGUgYXBwZ3R0Cgp2NjogbG90cyBvZiBpbXByb3ZlbWVudHMg ZnJvbSBDaHJpcwoKdjc6IHJ1biBvbiBlYWNoIGVuZ2luZSBmb3IgaWd0X3dyaXRlX2h1Z2UKICAg IGFkZCBzaW1wbGUgdG1wZnMgZmFsbGJhY2sgdGVzdAoKdjg6IHNpemVfdCBpcyBiYWQKICAgIGRv bid0IGJyZWFrIHRoZSBpMzg2IGJ1aWxkCgpTaWduZWQtb2ZmLWJ5OiBNYXR0aGV3IEF1bGQgPG1h dHRoZXcuYXVsZEBpbnRlbC5jb20+CkNjOiBKb29uYXMgTGFodGluZW4gPGpvb25hcy5sYWh0aW5l bkBsaW51eC5pbnRlbC5jb20+CkNjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdpbHNvbi5j by51az4KUmV2aWV3ZWQtYnk6IENocmlzIFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVr PgotLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgICAgICAgICAgICAgICAgICAg IHwgICAgMSArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaCAgICAgICAg ICAgICB8ICAgIDIgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMu YyAgICAgICAgfCAxNzE1ICsrKysrKysrKysrKysrKysrKysrCiAuLi4vZ3B1L2RybS9pOTE1L3Nl bGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmggICB8ICAgIDEgKwogLi4uL2dwdS9kcm0vaTkx NS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oICAgfCAgICAxICsKIDUgZmlsZXMgY2hh bmdlZCwgMTcyMCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUv ZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmlu ZGV4IDY5NWNiMmEzOGM4OC4uZTU5ZmMzN2JmNTZlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMK QEAgLTU0MDgsNiArNTQwOCw3IEBAIGludCBpOTE1X2dlbV9vYmplY3RfYXR0YWNoX3BoeXMoc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgaW50IGFsaWduKQogI2luY2x1ZGUgInNlbGZ0 ZXN0cy9zY2F0dGVybGlzdC5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9tb2NrX2dlbV9kZXZpY2Uu YyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaHVnZV9nZW1fb2JqZWN0LmMiCisjaW5jbHVkZSAic2Vs ZnRlc3RzL2h1Z2VfcGFnZXMuYyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0 LmMiCiAjaW5jbHVkZSAic2VsZnRlc3RzL2k5MTVfZ2VtX2NvaGVyZW5jeS5jIgogI2VuZGlmCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaCBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oCmluZGV4IGU0ZTZkZDkzODg5ZC4uOTU2 YzkxMWMyY2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmpl Y3QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaApAQCAtMTk2 LDYgKzE5Niw4IEBAIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0IHsKIAkJCXVuc2lnbmVkIGlu dCBndHQ7CiAJCX0gcGFnZV9zaXplczsKIAorCQlJOTE1X1NFTEZURVNUX0RFQ0xBUkUodW5zaWdu ZWQgaW50IHBhZ2VfbWFzayk7CisKIAkJc3RydWN0IGk5MTVfZ2VtX29iamVjdF9wYWdlX2l0ZXIg ewogCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19wb3M7CiAJCQl1bnNpZ25lZCBpbnQgc2dfaWR4 OyAvKiBpbiBwYWdlcywgYnV0IDMyYml0IGVlayEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9odWdlX3BhZ2VzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9z ZWxmdGVzdHMvaHVnZV9wYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uYjg0OTU4ODJlNWIwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYwpAQCAtMCwwICsxLDE3MTUgQEAKKy8qCisgKiBDb3B5 cmlnaHQgwqkgMjAxNyBJbnRlbCBDb3Jwb3JhdGlvbgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVy ZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisg KiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxl cyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCBy ZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0 byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vu c2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0 IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywg c3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNv cHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUg bmV4dAorICogcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1 YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZQorICogU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRX QVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVY UFJFU1MgT1IKKyAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdB UlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFS IFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBUSEUg QVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFN QUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05U UkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBD T05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MK KyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2luY2x1ZGUgIi4uL2k5MTVfc2VsZnRl c3QuaCIKKworI2luY2x1ZGUgPGxpbnV4L3ByaW1lX251bWJlcnMuaD4KKworI2luY2x1ZGUgIm1v Y2tfZHJtLmgiCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGFnZV9zaXplc1tdID0gewor CUk5MTVfR1RUX1BBR0VfU0laRV8yTSwKKwlJOTE1X0dUVF9QQUdFX1NJWkVfNjRLLAorCUk5MTVf R1RUX1BBR0VfU0laRV80SywKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X2xhcmdlc3Rf cGFnZV9zaXplKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1LAorCQkJCQkgIHU2NCByZW0p Cit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwYWdlX3NpemVzKTsg KytpKSB7CisJCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBwYWdlX3NpemVzW2ldOworCisJCWlm IChIQVNfUEFHRV9TSVpFUyhpOTE1LCBwYWdlX3NpemUpICYmIHJlbSA+PSBwYWdlX3NpemUpCisJ CQlyZXR1cm4gcGFnZV9zaXplOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBo dWdlX3BhZ2VzX2ZyZWVfcGFnZXMoc3RydWN0IHNnX3RhYmxlICpzdCkKK3sKKwlzdHJ1Y3Qgc2Nh dHRlcmxpc3QgKnNnOworCisJZm9yIChzZyA9IHN0LT5zZ2w7IHNnOyBzZyA9IF9fc2dfbmV4dChz ZykpIHsKKwkJaWYgKHNnX3BhZ2Uoc2cpKQorCQkJX19mcmVlX3BhZ2VzKHNnX3BhZ2Uoc2cpLCBn ZXRfb3JkZXIoc2ctPmxlbmd0aCkpOworCX0KKworCXNnX2ZyZWVfdGFibGUoc3QpOworCWtmcmVl KHN0KTsKK30KKworc3RhdGljIGludCBnZXRfaHVnZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqKQoreworI2RlZmluZSBHRlAgKEdGUF9LRVJORUwgfCBfX0dGUF9OT1dBUk4g fCBfX0dGUF9OT1JFVFJZKQorCXVuc2lnbmVkIGludCBwYWdlX21hc2sgPSBvYmotPm1tLnBhZ2Vf bWFzazsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnN0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJ dW5zaWduZWQgaW50IHNnX21hc2s7CisJdTY0IHJlbTsKKworCXN0ID0ga21hbGxvYyhzaXplb2Yo KnN0KSwgR0ZQKTsKKwlpZiAoIXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChzZ19hbGxv Y190YWJsZShzdCwgb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCwgR0ZQKSkgeworCQlrZnJl ZShzdCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJlbSA9IG9iai0+YmFzZS5zaXplOwor CXNnID0gc3QtPnNnbDsKKwlzdC0+bmVudHMgPSAwOworCXNnX21hc2sgPSAwOworCisJLyoKKwkg KiBPdXIgZ29hbCBoZXJlIGlzIHNpbXBsZSwgd2Ugd2FudCB0byBncmVlZGlseSBmaWxsIHRoZSBv YmplY3QgZnJvbQorCSAqIGxhcmdlc3QgdG8gc21hbGxlc3QgcGFnZS1zaXplLCB3aGlsZSBlbnN1 cmluZyB0aGF0IHdlIHVzZSAqZXZlcnkqCisJICogcGFnZS1zaXplIGFzIHBlciB0aGUgZ2l2ZW4g cGFnZS1tYXNrLgorCSAqLworCWRvIHsKKwkJdW5zaWduZWQgaW50IGJpdCA9IGlsb2cyKHBhZ2Vf bWFzayk7CisJCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBCSVQoYml0KTsKKwkJaW50IG9yZGVy ID0gZ2V0X29yZGVyKHBhZ2Vfc2l6ZSk7CisKKwkJZG8geworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7 CisKKwkJCUdFTV9CVUdfT04ob3JkZXIgPj0gTUFYX09SREVSKTsKKwkJCXBhZ2UgPSBhbGxvY19w YWdlcyhHRlAgfCBfX0dGUF9aRVJPLCBvcmRlcik7CisJCQlpZiAoIXBhZ2UpCisJCQkJZ290byBl cnI7CisKKwkJCXNnX3NldF9wYWdlKHNnLCBwYWdlLCBwYWdlX3NpemUsIDApOworCQkJc2dfbWFz ayB8PSBwYWdlX3NpemU7CisJCQlzdC0+bmVudHMrKzsKKworCQkJcmVtIC09IHBhZ2Vfc2l6ZTsK KwkJCWlmICghcmVtKSB7CisJCQkJc2dfbWFya19lbmQoc2cpOworCQkJCWJyZWFrOworCQkJfQor CisJCQlzZyA9IF9fc2dfbmV4dChzZyk7CisJCX0gd2hpbGUgKChyZW0gLSAoKHBhZ2Vfc2l6ZS0x KSAmIHBhZ2VfbWFzaykpID49IHBhZ2Vfc2l6ZSk7CisKKwkJcGFnZV9tYXNrICY9IChwYWdlX3Np emUtMSk7CisJfSB3aGlsZSAocGFnZV9tYXNrKTsKKworCWlmIChpOTE1X2dlbV9ndHRfcHJlcGFy ZV9wYWdlcyhvYmosIHN0KSkKKwkJZ290byBlcnI7CisKKwlvYmotPm1tLm1hZHYgPSBJOTE1X01B RFZfRE9OVE5FRUQ7CisKKwlHRU1fQlVHX09OKHNnX21hc2sgIT0gb2JqLT5tbS5wYWdlX21hc2sp OworCV9faTkxNV9nZW1fb2JqZWN0X3NldF9wYWdlcyhvYmosIHN0LCBzZ19tYXNrKTsKKworCXJl dHVybiAwOworCitlcnI6CisJc2dfc2V0X3BhZ2Uoc2csIE5VTEwsIDAsIDApOworCXNnX21hcmtf ZW5kKHNnKTsKKwlodWdlX3BhZ2VzX2ZyZWVfcGFnZXMoc3QpOworCisJcmV0dXJuIC1FTk9NRU07 Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9odWdlX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmosCisJCQkgICBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQoreworCWk5MTVfZ2VtX2d0 dF9maW5pc2hfcGFnZXMob2JqLCBwYWdlcyk7CisJaHVnZV9wYWdlc19mcmVlX3BhZ2VzKHBhZ2Vz KTsKKworCW9iai0+bW0uZGlydHkgPSBmYWxzZTsKKwlvYmotPm1tLm1hZHYgPSBJOTE1X01BRFZf V0lMTE5FRUQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9v cHMgaHVnZV9wYWdlX29wcyA9IHsKKwkuZmxhZ3MgPSBJOTE1X0dFTV9PQkpFQ1RfSEFTX1NUUlVD VF9QQUdFIHwKKwkJIEk5MTVfR0VNX09CSkVDVF9JU19TSFJJTktBQkxFLAorCS5nZXRfcGFnZXMg PSBnZXRfaHVnZV9wYWdlcywKKwkucHV0X3BhZ2VzID0gcHV0X2h1Z2VfcGFnZXMsCit9OworCitz dGF0aWMgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgoraHVnZV9wYWdlc19vYmplY3Qoc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCisJCSAgdTY0IHNpemUsCisJCSAgdW5zaWduZWQg aW50IHBhZ2VfbWFzaykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJ R0VNX0JVR19PTighc2l6ZSk7CisJR0VNX0JVR19PTighSVNfQUxJR05FRChzaXplLCBCSVQoX19m ZnMocGFnZV9tYXNrKSkpKTsKKworCWlmIChzaXplID4+IFBBR0VfU0hJRlQgPiBJTlRfTUFYKQor CQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCisJaWYgKG92ZXJmbG93c190eXBlKHNpemUsIG9i ai0+YmFzZS5zaXplKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUUyQklHKTsKKworCW9iaiA9IGk5MTVf Z2VtX29iamVjdF9hbGxvYyhpOTE1KTsKKwlpZiAoIW9iaikKKwkJcmV0dXJuIEVSUl9QVFIoLUVO T01FTSk7CisKKwlkcm1fZ2VtX3ByaXZhdGVfb2JqZWN0X2luaXQoJmk5MTUtPmRybSwgJm9iai0+ YmFzZSwgc2l6ZSk7CisJaTkxNV9nZW1fb2JqZWN0X2luaXQob2JqLCAmaHVnZV9wYWdlX29wcyk7 CisKKwlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvYmot PmJhc2UucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvYmotPmNhY2hlX2xl dmVsID0gSTkxNV9DQUNIRV9OT05FOworCisJb2JqLT5tbS5wYWdlX21hc2sgPSBwYWdlX21hc2s7 CisKKwlyZXR1cm4gb2JqOworfQorCitzdGF0aWMgaW50IGZha2VfZ2V0X2h1Z2VfcGFnZXMoc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CisJY29uc3QgdTY0IG1heF9sZW4gPSBy b3VuZGRvd25fcG93X29mX3R3byhVSU5UX01BWCk7CisJc3RydWN0IHNnX3RhYmxlICpzdDsKKwlz dHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCBzZ19tYXNrOworCXU2NCByZW07 CisKKwlzdCA9IGttYWxsb2Moc2l6ZW9mKCpzdCksIEdGUCk7CisJaWYgKCFzdCkKKwkJcmV0dXJu IC1FTk9NRU07CisKKwlpZiAoc2dfYWxsb2NfdGFibGUoc3QsIG9iai0+YmFzZS5zaXplID4+IFBB R0VfU0hJRlQsIEdGUCkpIHsKKwkJa2ZyZWUoc3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisK KwkvKiBVc2Ugb3B0aW1hbCBwYWdlIHNpemVkIGNodW5rcyB0byBmaWxsIGluIHRoZSBzZyB0YWJs ZSAqLworCXJlbSA9IG9iai0+YmFzZS5zaXplOworCXNnID0gc3QtPnNnbDsKKwlzdC0+bmVudHMg PSAwOworCXNnX21hc2sgPSAwOworCWRvIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IGdl dF9sYXJnZXN0X3BhZ2Vfc2l6ZShpOTE1LCByZW0pOworCQl1bnNpZ25lZCBpbnQgbGVuID0gbWlu KHBhZ2Vfc2l6ZSAqIGRpdl91NjQocmVtLCBwYWdlX3NpemUpLAorCQkJCSAgICAgICBtYXhfbGVu KTsKKworCQlHRU1fQlVHX09OKCFwYWdlX3NpemUpOworCisJCXNnLT5vZmZzZXQgPSAwOworCQlz Zy0+bGVuZ3RoID0gbGVuOworCQlzZ19kbWFfbGVuKHNnKSA9IGxlbjsKKwkJc2dfZG1hX2FkZHJl c3Moc2cpID0gcGFnZV9zaXplOworCisJCXNnX21hc2sgfD0gbGVuOworCisJCXN0LT5uZW50cysr OworCisJCXJlbSAtPSBsZW47CisJCWlmICghcmVtKSB7CisJCQlzZ19tYXJrX2VuZChzZyk7CisJ CQlicmVhazsKKwkJfQorCisJCXNnID0gc2dfbmV4dChzZyk7CisJfSB3aGlsZSAoMSk7CisKKwlv YmotPm1tLm1hZHYgPSBJOTE1X01BRFZfRE9OVE5FRUQ7CisKKwlfX2k5MTVfZ2VtX29iamVjdF9z ZXRfcGFnZXMob2JqLCBzdCwgc2dfbWFzayk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBmYWtlX2dldF9odWdlX3BhZ2VzX3NpbmdsZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJh c2UuZGV2KTsKKwlzdHJ1Y3Qgc2dfdGFibGUgKnN0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7 CisJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZTsKKworCXN0ID0ga21hbGxvYyhzaXplb2YoKnN0KSwg R0ZQKTsKKwlpZiAoIXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChzZ19hbGxvY190YWJs ZShzdCwgMSwgR0ZQKSkgeworCQlrZnJlZShzdCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwor CXNnID0gc3QtPnNnbDsKKwlzdC0+bmVudHMgPSAxOworCisJcGFnZV9zaXplID0gZ2V0X2xhcmdl c3RfcGFnZV9zaXplKGk5MTUsIG9iai0+YmFzZS5zaXplKTsKKwlHRU1fQlVHX09OKCFwYWdlX3Np emUpOworCisJc2ctPm9mZnNldCA9IDA7CisJc2ctPmxlbmd0aCA9IG9iai0+YmFzZS5zaXplOwor CXNnX2RtYV9sZW4oc2cpID0gb2JqLT5iYXNlLnNpemU7CisJc2dfZG1hX2FkZHJlc3Moc2cpID0g cGFnZV9zaXplOworCisJb2JqLT5tbS5tYWR2ID0gSTkxNV9NQURWX0RPTlRORUVEOworCisJX19p OTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VzKG9iaiwgc3QsIHNnLT5sZW5ndGgpOworCisJcmV0dXJu IDA7CisjdW5kZWYgR0ZQCit9CisKK3N0YXRpYyB2b2lkIGZha2VfZnJlZV9odWdlX3BhZ2VzKHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosCisJCQkJIHN0cnVjdCBzZ190YWJsZSAqcGFn ZXMpCit7CisJc2dfZnJlZV90YWJsZShwYWdlcyk7CisJa2ZyZWUocGFnZXMpOworfQorCitzdGF0 aWMgdm9pZCBmYWtlX3B1dF9odWdlX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv YmosCisJCQkJc3RydWN0IHNnX3RhYmxlICpwYWdlcykKK3sKKwlmYWtlX2ZyZWVfaHVnZV9wYWdl cyhvYmosIHBhZ2VzKTsKKwlvYmotPm1tLmRpcnR5ID0gZmFsc2U7CisJb2JqLT5tbS5tYWR2ID0g STkxNV9NQURWX1dJTExORUVEOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3Rfb3BzIGZha2Vfb3BzID0geworCS5mbGFncyA9IEk5MTVfR0VNX09CSkVDVF9JU19T SFJJTktBQkxFLAorCS5nZXRfcGFnZXMgPSBmYWtlX2dldF9odWdlX3BhZ2VzLAorCS5wdXRfcGFn ZXMgPSBmYWtlX3B1dF9odWdlX3BhZ2VzLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0X29wcyBmYWtlX29wc19zaW5nbGUgPSB7CisJLmZsYWdzID0gSTkxNV9H RU1fT0JKRUNUX0lTX1NIUklOS0FCTEUsCisJLmdldF9wYWdlcyA9IGZha2VfZ2V0X2h1Z2VfcGFn ZXNfc2luZ2xlLAorCS5wdXRfcGFnZXMgPSBmYWtlX3B1dF9odWdlX3BhZ2VzLAorfTsKKworc3Rh dGljIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICoKK2Zha2VfaHVnZV9wYWdlc19vYmplY3Qo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsIHU2NCBzaXplLCBib29sIHNpbmdsZSkKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCisJR0VNX0JVR19PTighc2l6ZSk7 CisJR0VNX0JVR19PTighSVNfQUxJR05FRChzaXplLCBJOTE1X0dUVF9QQUdFX1NJWkUpKTsKKwor CWlmIChzaXplID4+IFBBR0VfU0hJRlQgPiBVSU5UX01BWCkKKwkJcmV0dXJuIEVSUl9QVFIoLUUy QklHKTsKKworCWlmIChvdmVyZmxvd3NfdHlwZShzaXplLCBvYmotPmJhc2Uuc2l6ZSkpCisJCXJl dHVybiBFUlJfUFRSKC1FMkJJRyk7CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfYWxsb2MoaTkx NSk7CisJaWYgKCFvYmopCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOworCisJZHJtX2dlbV9w cml2YXRlX29iamVjdF9pbml0KCZpOTE1LT5kcm0sICZvYmotPmJhc2UsIHNpemUpOworCisJaWYg KHNpbmdsZSkKKwkJaTkxNV9nZW1fb2JqZWN0X2luaXQob2JqLCAmZmFrZV9vcHNfc2luZ2xlKTsK KwllbHNlCisJCWk5MTVfZ2VtX29iamVjdF9pbml0KG9iaiwgJmZha2Vfb3BzKTsKKworCW9iai0+ YmFzZS53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01BSU5fQ1BVOworCW9iai0+YmFzZS5yZWFk X2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fQ1BVOworCW9iai0+Y2FjaGVfbGV2ZWwgPSBJOTE1 X0NBQ0hFX05PTkU7CisKKwlyZXR1cm4gb2JqOworfQorCitzdGF0aWMgaW50IGlndF9jaGVja19w YWdlX3NpemVzKHN0cnVjdCBpOTE1X3ZtYSAqdm1hKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1ID0gdG9faTkxNSh2bWEtPm9iai0+YmFzZS5kZXYpOworCXVuc2lnbmVkIGludCBz dXBwb3J0ZWQgPSBJTlRFTF9JTkZPKGk5MTUpLT5wYWdlX3NpemVzOworCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmogPSB2bWEtPm9iajsKKwlpbnQgZXJyID0gMDsKKworCWlmICghSEFT X1BBR0VfU0laRVMoaTkxNSwgdm1hLT5wYWdlX3NpemVzLnNnKSkgeworCQlwcl9lcnIoInVuc3Vw cG9ydGVkIHBhZ2Vfc2l6ZXMuc2c9JXUsIHN1cHBvcnRlZD0ldVxuIiwKKwkJICAgICAgIHZtYS0+ cGFnZV9zaXplcy5zZyAmIH5zdXBwb3J0ZWQsIHN1cHBvcnRlZCk7CisJCWVyciA9IC1FSU5WQUw7 CisJfQorCisJaWYgKCFIQVNfUEFHRV9TSVpFUyhpOTE1LCB2bWEtPnBhZ2Vfc2l6ZXMuZ3R0KSkg eworCQlwcl9lcnIoInVuc3VwcG9ydGVkIHBhZ2Vfc2l6ZXMuZ3R0PSV1LCBzdXBwb3J0ZWQ9JXVc biIsCisJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICYgfnN1cHBvcnRlZCwgc3VwcG9ydGVk KTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAodm1hLT5wYWdlX3NpemVzLnBoeXMgIT0g b2JqLT5tbS5wYWdlX3NpemVzLnBoeXMpIHsKKwkJcHJfZXJyKCJ2bWEtPnBhZ2Vfc2l6ZXMucGh5 cygldSkgIT0gb2JqLT5tbS5wYWdlX3NpemVzLnBoeXMoJXUpXG4iLAorCQkgICAgICAgdm1hLT5w YWdlX3NpemVzLnBoeXMsIG9iai0+bW0ucGFnZV9zaXplcy5waHlzKTsKKwkJZXJyID0gLUVJTlZB TDsKKwl9CisKKwlpZiAodm1hLT5wYWdlX3NpemVzLnNnICE9IG9iai0+bW0ucGFnZV9zaXplcy5z ZykgeworCQlwcl9lcnIoInZtYS0+cGFnZV9zaXplcy5zZygldSkgIT0gb2JqLT5tbS5wYWdlX3Np emVzLnNnKCV1KVxuIiwKKwkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5zZywgb2JqLT5tbS5wYWdl X3NpemVzLnNnKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9CisKKwlpZiAob2JqLT5tbS5wYWdlX3Np emVzLmd0dCkgeworCQlwcl9lcnIoIm9iai0+cGFnZV9zaXplcy5ndHQoJXUpIHNob3VsZCBuZXZl ciBiZSBzZXRcbiIsCisJCSAgICAgICBvYmotPm1tLnBhZ2Vfc2l6ZXMuZ3R0KTsKKwkJZXJyID0g LUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF9tb2NrX2V4 aGF1c3RfZGV2aWNlX3N1cHBvcnRlZF9wYWdlcyh2b2lkICphcmcpCit7CisJc3RydWN0IGk5MTVf aHdfcHBndHQgKnBwZ3R0ID0gYXJnOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0g cHBndHQtPmJhc2UuaTkxNTsKKwl1bnNpZ25lZCBpbnQgc2F2ZWRfbWFzayA9IElOVEVMX0lORk8o aTkxNSktPnBhZ2Vfc2l6ZXM7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlz dHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwlpbnQgaSwgaiwgc2luZ2xlOworCWludCBlcnI7CisKKwkv KgorCSAqIFNhbml0eSBjaGVjayBjcmVhdGluZyBvYmplY3RzIHdpdGggZXZlcnkgdmFsaWQgcGFn ZSBzdXBwb3J0CisJICogY29tYmluYXRpb24gZm9yIG91ciBtb2NrIGRldmljZS4KKwkgKi8KKwor CWZvciAoaSA9IDE7IGkgPCBCSVQoQVJSQVlfU0laRShwYWdlX3NpemVzKSk7IGkrKykgeworCQl1 bnNpZ25lZCBpbnQgY29tYmluYXRpb24gPSAwOworCisJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9T SVpFKHBhZ2Vfc2l6ZXMpOyBqKyspIHsKKwkJCWlmIChpICYgQklUKGopKQorCQkJCWNvbWJpbmF0 aW9uIHw9IHBhZ2Vfc2l6ZXNbal07CisJCX0KKworCQlta3dyaXRlX2RldmljZV9pbmZvKGk5MTUp LT5wYWdlX3NpemVzID0gY29tYmluYXRpb247CisKKwkJZm9yIChzaW5nbGUgPSAwOyBzaW5nbGUg PD0gMTsgKytzaW5nbGUpIHsKKwkJCW9iaiA9IGZha2VfaHVnZV9wYWdlc19vYmplY3QoaTkxNSwg Y29tYmluYXRpb24sICEhc2luZ2xlKTsKKwkJCWlmIChJU19FUlIob2JqKSkgeworCQkJCWVyciA9 IFBUUl9FUlIob2JqKTsKKwkJCQlnb3RvIG91dF9kZXZpY2U7CisJCQl9CisKKwkJCWlmIChvYmot PmJhc2Uuc2l6ZSAhPSBjb21iaW5hdGlvbikgeworCQkJCXByX2Vycigib2JqLT5iYXNlLnNpemU9 JXp1LCBleHBlY3RlZD0ldVxuIiwKKwkJCQkgICAgICAgb2JqLT5iYXNlLnNpemUsIGNvbWJpbmF0 aW9uKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0X3B1dDsKKwkJCX0KKworCQkJ dm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQkJaWYg KElTX0VSUih2bWEpKSB7CisJCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJCWdvdG8gb3V0X3B1 dDsKKwkJCX0KKworCQkJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgUElOX1VTRVIpOwor CQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF9jbG9zZTsKKworCQkJZXJyID0gaWd0X2NoZWNrX3Bh Z2Vfc2l6ZXModm1hKTsKKworCQkJaWYgKHZtYS0+cGFnZV9zaXplcy5zZyAhPSBjb21iaW5hdGlv bikgeworCQkJCXByX2VycigicGFnZV9zaXplcy5zZz0ldSwgZXhwZWN0ZWQ9JXVcbiIsCisJCQkJ ICAgICAgIHZtYS0+cGFnZV9zaXplcy5zZywgY29tYmluYXRpb24pOworCQkJCWVyciA9IC1FSU5W QUw7CisJCQl9CisKKwkJCWk5MTVfdm1hX3VucGluKHZtYSk7CisJCQlpOTE1X3ZtYV9jbG9zZSh2 bWEpOworCisJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwkJCWlmIChlcnIpCisJCQkJ Z290byBvdXRfZGV2aWNlOworCQl9CisJfQorCisJZ290byBvdXRfZGV2aWNlOworCitvdXRfY2xv c2U6CisJaTkxNV92bWFfY2xvc2Uodm1hKTsKK291dF9wdXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1 dChvYmopOworb3V0X2RldmljZToKKwlta3dyaXRlX2RldmljZV9pbmZvKGk5MTUpLT5wYWdlX3Np emVzID0gc2F2ZWRfbWFzazsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X21v Y2tfcHBndHRfbWlzYWxpZ25lZF9kbWEodm9pZCAqYXJnKQoreworCXN0cnVjdCBpOTE1X2h3X3Bw Z3R0ICpwcGd0dCA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHBwZ3R0 LT5iYXNlLmk5MTU7CisJdW5zaWduZWQgbG9uZyBzdXBwb3J0ZWQgPSBJTlRFTF9JTkZPKGk5MTUp LT5wYWdlX3NpemVzOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IGJp dDsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgZG1hIG1pc2FsaWdubWVudCBm b3IgaHVnZSBwYWdlcyAtLSB0aGUgZG1hIGFkZHJlc3NlcyB3ZQorCSAqIGluc2VydCBpbnRvIHRo ZSBwYWdpbmcgc3RydWN0dXJlcyBuZWVkIHRvIGFsd2F5cyByZXNwZWN0IHRoZSBwYWdlCisJICog c2l6ZSBhbGlnbm1lbnQuCisJICovCisKKwliaXQgPSBpbG9nMihJOTE1X0dUVF9QQUdFX1NJWkVf NjRLKTsKKworCWZvcl9lYWNoX3NldF9iaXRfZnJvbShiaXQsICZzdXBwb3J0ZWQsCisJCQkgICAg ICBpbG9nMihJOTE1X0dUVF9NQVhfUEFHRV9TSVpFKSArIDEpIHsKKwkJSUdUX1RJTUVPVVQoZW5k X3RpbWUpOworCQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplID0gQklUKGJpdCk7CisJCXVuc2lnbmVk IGludCBmbGFncyA9IFBJTl9VU0VSIHwgUElOX09GRlNFVF9GSVhFRDsKKwkJdW5zaWduZWQgaW50 IG9mZnNldDsKKwkJdW5zaWduZWQgaW50IHNpemUgPQorCQkJcm91bmRfdXAocGFnZV9zaXplLCBJ OTE1X0dUVF9QQUdFX1NJWkVfMk0pIDw8IDE7CisJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCisJ CW9iaiA9IGZha2VfaHVnZV9wYWdlc19vYmplY3QoaTkxNSwgc2l6ZSwgdHJ1ZSk7CisJCWlmIChJ U19FUlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJaWYgKG9iai0+YmFzZS5z aXplICE9IHNpemUpIHsKKwkJCXByX2Vycigib2JqLT5iYXNlLnNpemU9JXp1LCBleHBlY3RlZD0l dVxuIiwKKwkJCSAgICAgICBvYmotPmJhc2Uuc2l6ZSwgc2l6ZSk7CisJCQllcnIgPSAtRUlOVkFM OworCQkJZ290byBvdXRfcHV0OworCQl9CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9w YWdlcyhvYmopOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCS8qIEZvcmNlIHRo ZSBwYWdlIHNpemUgZm9yIHRoaXMgb2JqZWN0ICovCisJCW9iai0+bW0ucGFnZV9zaXplcy5zZyA9 IHBhZ2Vfc2l6ZTsKKworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFz ZSwgTlVMTCk7CisJCWlmIChJU19FUlIodm1hKSkgeworCQkJZXJyID0gUFRSX0VSUih2bWEpOwor CQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAw LCBmbGFncyk7CisJCWlmIChlcnIpIHsKKwkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQlnb3Rv IG91dF91bnBpbjsKKwkJfQorCisKKwkJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsK KworCQlpZiAodm1hLT5wYWdlX3NpemVzLmd0dCAhPSBwYWdlX3NpemUpIHsKKwkJCXByX2Vycigi cGFnZV9zaXplcy5ndHQ9JXUsIGV4cGVjdGVkICV1XG4iLAorCQkJICAgICAgIHZtYS0+cGFnZV9z aXplcy5ndHQsIHBhZ2Vfc2l6ZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisKKwkJaTkxNV92 bWFfdW5waW4odm1hKTsKKworCQlpZiAoZXJyKSB7CisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOwor CQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQkvKgorCQkgKiBUcnkgYWxsIHRoZSBvdGhlciB2 YWxpZCBvZmZzZXRzIHVudGlsIHRoZSBuZXh0CisJCSAqIGJvdW5kYXJ5IC0tIHNob3VsZCBhbHdh eXMgZmFsbCBiYWNrIHRvIHVzaW5nIDRLCisJCSAqIHBhZ2VzLgorCQkgKi8KKwkJZm9yIChvZmZz ZXQgPSA0MDk2OyBvZmZzZXQgPCBwYWdlX3NpemU7IG9mZnNldCArPSA0MDk2KSB7CisJCQllcnIg PSBpOTE1X3ZtYV91bmJpbmQodm1hKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlpOTE1X3ZtYV9jbG9z ZSh2bWEpOworCQkJCWdvdG8gb3V0X3VucGluOworCQkJfQorCisJCQllcnIgPSBpOTE1X3ZtYV9w aW4odm1hLCAwLCAwLCBmbGFncyB8IG9mZnNldCk7CisJCQlpZiAoZXJyKSB7CisJCQkJaTkxNV92 bWFfY2xvc2Uodm1hKTsKKwkJCQlnb3RvIG91dF91bnBpbjsKKwkJCX0KKworCQkJZXJyID0gaWd0 X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKworCQkJaWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0g STkxNV9HVFRfUEFHRV9TSVpFXzRLKSB7CisJCQkJcHJfZXJyKCJwYWdlX3NpemVzLmd0dD0ldSwg ZXhwZWN0ZWQgJWx1XG4iLAorCQkJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMuZ3R0LCBJOTE1X0dU VF9QQUdFX1NJWkVfNEspOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQl9CisKKwkJCWk5MTVfdm1h X3VucGluKHZtYSk7CisKKwkJCWlmIChlcnIpIHsKKwkJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOwor CQkJCWdvdG8gb3V0X3VucGluOworCQkJfQorCisJCQlpZiAoaWd0X3RpbWVvdXQoZW5kX3RpbWUs CisJCQkJCSIlcyB0aW1lZCBvdXQgYXQgb2Zmc2V0ICV4IHdpdGggcGFnZS1zaXplICV4XG4iLAor CQkJCQlfX2Z1bmNfXywgb2Zmc2V0LCBwYWdlX3NpemUpKQorCQkJCWJyZWFrOworCQl9CisKKwkJ aTkxNV92bWFfY2xvc2Uodm1hKTsKKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2Jq KTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCXJldHVybiAwOworCitvdXRf dW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXRfcHV0OgorCWk5 MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lk IGNsb3NlX29iamVjdF9saXN0KHN0cnVjdCBsaXN0X2hlYWQgKm9iamVjdHMsCisJCQkgICAgICBz dHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iaiwgKm9uOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9iaiwgb24sIG9iamVj dHMsIHN0X2xpbmspIHsKKwkJc3RydWN0IGk5MTVfdm1hICp2bWE7CisKKwkJdm1hID0gaTkxNV92 bWFfaW5zdGFuY2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQlpZiAoIUlTX0VSUih2bWEp KQorCQkJaTkxNV92bWFfY2xvc2Uodm1hKTsKKworCQlsaXN0X2RlbCgmb2JqLT5zdF9saW5rKTsK KwkJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9w dXQob2JqKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaWd0X21vY2tfcHBndHRfaHVnZV9maWxsKHZv aWQgKmFyZykKK3sKKwlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQgPSBhcmc7CisJc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBwcGd0dC0+YmFzZS5pOTE1OworCXVuc2lnbmVkIGxv bmcgbWF4X3BhZ2VzID0gcHBndHQtPmJhc2UudG90YWwgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25l ZCBsb25nIHBhZ2VfbnVtOworCWJvb2wgc2luZ2xlID0gZmFsc2U7CisJTElTVF9IRUFEKG9iamVj dHMpOworCUlHVF9USU1FT1VUKGVuZF90aW1lKTsKKwlpbnQgZXJyOworCisJZm9yX2VhY2hfcHJp bWVfbnVtYmVyX2Zyb20ocGFnZV9udW0sIDEsIG1heF9wYWdlcykgeworCQlzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqOworCQl1NjQgc2l6ZSA9IHBhZ2VfbnVtIDw8IFBBR0VfU0hJRlQ7 CisJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZ3R0ID0g MDsKKwkJaW50IGk7CisKKwkJb2JqID0gZmFrZV9odWdlX3BhZ2VzX29iamVjdChpOTE1LCBzaXpl LCBzaW5nbGUpOworCQlpZiAoSVNfRVJSKG9iaikpIHsKKwkJCWVyciA9IFBUUl9FUlIob2JqKTsK KwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG9iai0+YmFzZS5zaXplICE9IHNpemUpIHsKKwkJCXBy X2Vycigib2JqLT5iYXNlLnNpemU9JXpkLCBleHBlY3RlZD0lbGx1XG4iLAorCQkJICAgICAgIG9i ai0+YmFzZS5zaXplLCBzaXplKTsKKwkJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwkJCWVy ciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IGk5MTVfZ2VtX29iamVjdF9w aW5fcGFnZXMob2JqKTsKKwkJaWYgKGVycikgeworCQkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCQkJYnJlYWs7CisJCX0KKworCQlsaXN0X2FkZCgmb2JqLT5zdF9saW5rLCAmb2JqZWN0cyk7 CisKKwkJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOwor CQlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJCWJyZWFrOwor CQl9CisKKwkJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgUElOX1VTRVIpOworCQlpZiAo ZXJyKQorCQkJYnJlYWs7CisKKwkJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKwkJ aWYgKGVycikgeworCQkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJCWJyZWFrOworCQl9CisKKwkJ LyoKKwkJICogRmlndXJlIG91dCB0aGUgZXhwZWN0ZWQgZ3R0IHBhZ2Ugc2l6ZSBrbm93aW5nIHRo YXQgd2UgZ28gZnJvbQorCQkgKiBsYXJnZXN0IHRvIHNtYWxsZXN0IHBhZ2Ugc2l6ZSBzZyBjaHVu a3MsIGFuZCB0aGF0IHdlIGFsaWduIHRvCisJCSAqIHRoZSBsYXJnZXN0IHBhZ2Ugc2l6ZS4KKwkJ ICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhZ2Vfc2l6ZXMpOyArK2kpIHsKKwkJ CXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBwYWdlX3NpemVzW2ldOworCisJCQlpZiAoSEFTX1BB R0VfU0laRVMoaTkxNSwgcGFnZV9zaXplKSAmJgorCQkJICAgIHNpemUgPj0gcGFnZV9zaXplKSB7 CisJCQkJZXhwZWN0ZWRfZ3R0IHw9IHBhZ2Vfc2l6ZTsKKwkJCQlzaXplICY9IHBhZ2Vfc2l6ZS0x OworCQkJfQorCQl9CisKKwkJR0VNX0JVR19PTighZXhwZWN0ZWRfZ3R0KTsKKwkJR0VNX0JVR19P TihzaXplKTsKKworCQlpZiAoZXhwZWN0ZWRfZ3R0ICYgSTkxNV9HVFRfUEFHRV9TSVpFXzRLKQor CQkJZXhwZWN0ZWRfZ3R0ICY9IH5JOTE1X0dUVF9QQUdFX1NJWkVfNjRLOworCisJCWk5MTVfdm1h X3VucGluKHZtYSk7CisKKwkJaWYgKHZtYS0+cGFnZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0Vf U0laRV82NEspIHsKKwkJCWlmICghSVNfQUxJR05FRCh2bWEtPm5vZGUuc3RhcnQsCisJCQkJCUk5 MTVfR1RUX1BBR0VfU0laRV8yTSkpIHsKKwkJCQlwcl9lcnIoIm5vZGUuc3RhcnQoJWxseCkgbm90 IGFsaWduZWQgdG8gMk1cbiIsCisJCQkJICAgICAgIHZtYS0+bm9kZS5zdGFydCk7CisJCQkJZXJy ID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaWYgKCFJU19BTElHTkVEKHZtYS0+ bm9kZS5zaXplLAorCQkJCQlJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKSB7CisJCQkJcHJfZXJyKCJu b2RlLnNpemUoJWxseCkgbm90IGFsaWduZWQgdG8gMk1cbiIsCisJCQkJICAgICAgIHZtYS0+bm9k ZS5zaXplKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJ aWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gZXhwZWN0ZWRfZ3R0KSB7CisJCQlwcl9lcnIoImd0 dD0ldSwgZXhwZWN0ZWQ9JXUsIHNpemU9JXpkLCBzaW5nbGU9JXNcbiIsCisJCQkgICAgICAgdm1h LT5wYWdlX3NpemVzLmd0dCwgZXhwZWN0ZWRfZ3R0LAorCQkJICAgICAgIG9iai0+YmFzZS5zaXpl LCB5ZXNubyghIXNpbmdsZSkpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisK KwkJaWYgKGlndF90aW1lb3V0KGVuZF90aW1lLAorCQkJCSIlcyB0aW1lZCBvdXQgYXQgc2l6ZSAl emRcbiIsCisJCQkJX19mdW5jX18sIG9iai0+YmFzZS5zaXplKSkKKwkJCWJyZWFrOworCisJCXNp bmdsZSA9ICFzaW5nbGU7CisJfQorCisJY2xvc2Vfb2JqZWN0X2xpc3QoJm9iamVjdHMsIHBwZ3R0 KTsKKworCWlmIChlcnIgPT0gLUVOT01FTSB8fCBlcnIgPT0gLUVOT1NQQykKKwkJZXJyID0gMDsK KworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X21vY2tfcHBndHRfNjRLKHZvaWQg KmFyZykKK3sKKwlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQgPSBhcmc7CisJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBwcGd0dC0+YmFzZS5pOTE1OworCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmo7CisJY29uc3Qgc3RydWN0IG9iamVjdF9pbmZvIHsKKwkJdW5zaWdu ZWQgaW50IHNpemU7CisJCXVuc2lnbmVkIGludCBndHQ7CisJCXVuc2lnbmVkIGludCBvZmZzZXQ7 CisJfSBvYmplY3RzW10gPSB7CisJCS8qIENhc2VzIHdpdGggZm9yY2VkIHBhZGRpbmcvYWxpZ25t ZW50ICovCisJCXsKKwkJCS5zaXplID0gU1pfNjRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0Vf U0laRV82NEssCisJCQkub2Zmc2V0ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl82NEsg KyBTWl80SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNEssCisJCQkub2Zmc2V0ID0g MCwKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl82NEsgLSBTWl80SywKKwkJCS5ndHQgPSBJOTE1 X0dUVF9QQUdFX1NJWkVfNEssCisJCQkub2Zmc2V0ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUg PSBTWl8yTSwKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLLAorCQkJLm9mZnNldCA9 IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfMk0gLSBTWl80SywKKwkJCS5ndHQgPSBJOTE1 X0dUVF9QQUdFX1NJWkVfNEssCisJCQkub2Zmc2V0ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUg PSBTWl8yTSArIFNaXzRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEsgfCBJOTE1 X0dUVF9QQUdFX1NJWkVfNEssCisJCQkub2Zmc2V0ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUg PSBTWl8yTSArIFNaXzY0SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLLAorCQkJ Lm9mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfMk0gLSBTWl82NEssCisJCQku Z3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SywKKwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQkv KiBUcnkgd2l0aG91dCBhbnkgZm9yY2VkIHBhZGRpbmcvYWxpZ25tZW50ICovCisJCXsKKwkJCS5z aXplID0gU1pfNjRLLAorCQkJLm9mZnNldCA9IFNaXzJNLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BB R0VfU0laRV80SywKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl8xMjhLLAorCQkJLm9mZnNldCA9 IFNaXzJNIC0gU1pfNjRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV80SywKKwkJfSwK Kwl9OworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCWludCBpLCBzaW5nbGU7CisJaW50IGVycjsK KworCS8qCisJICogU2FuaXR5IGNoZWNrIHNvbWUgb2YgdGhlIHRyaWNraW5lc3Mgd2l0aCA2NEsg cGFnZXMgLS0gZWl0aGVyIHdlIGNhbgorCSAqIHNhZmVseSBtYXJrIHRoZSB3aG9sZSBwYWdlLXRh YmxlKDJNIGJsb2NrKSBhcyA2NEssIG9yIHdlIGhhdmUgdG8KKwkgKiBhbHdheXMgZmFsbGJhY2sg dG8gNEsuCisJICovCisKKwlpZiAoIUhBU19QQUdFX1NJWkVTKGk5MTUsIEk5MTVfR1RUX1BBR0Vf U0laRV82NEspKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9i amVjdHMpOyArK2kpIHsKKwkJdW5zaWduZWQgaW50IHNpemUgPSBvYmplY3RzW2ldLnNpemU7CisJ CXVuc2lnbmVkIGludCBleHBlY3RlZF9ndHQgPSBvYmplY3RzW2ldLmd0dDsKKwkJdW5zaWduZWQg aW50IG9mZnNldCA9IG9iamVjdHNbaV0ub2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQ SU5fVVNFUjsKKworCQlmb3IgKHNpbmdsZSA9IDA7IHNpbmdsZSA8PSAxOyBzaW5nbGUrKykgewor CQkJb2JqID0gZmFrZV9odWdlX3BhZ2VzX29iamVjdChpOTE1LCBzaXplLCAhIXNpbmdsZSk7CisJ CQlpZiAoSVNfRVJSKG9iaikpCisJCQkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCQkJZXJyID0g aTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91 dF9vYmplY3RfcHV0OworCisJCQkvKgorCQkJICogRGlzYWJsZSAyTSBwYWdlcyAtLSBXZSBvbmx5 IHdhbnQgdG8gdXNlIDY0Sy80SyBwYWdlcworCQkJICogZm9yIHRoaXMgdGVzdC4KKwkJCSAqLwor CQkJb2JqLT5tbS5wYWdlX3NpemVzLnNnICY9IH5JOTE1X0dUVF9QQUdFX1NJWkVfMk07CisKKwkJ CXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJCWlm IChJU19FUlIodm1hKSkgeworCQkJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJCQlnb3RvIG91dF9v YmplY3RfdW5waW47CisJCQl9CisKKwkJCWlmIChvZmZzZXQpCisJCQkJZmxhZ3MgfD0gUElOX09G RlNFVF9GSVhFRCB8IG9mZnNldDsKKworCQkJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwg ZmxhZ3MpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF92bWFfY2xvc2U7CisKKwkJCWVyciA9 IGlndF9jaGVja19wYWdlX3NpemVzKHZtYSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X3Zt YV91bnBpbjsKKworCQkJaWYgKCFvZmZzZXQgJiYgdm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9H VFRfUEFHRV9TSVpFXzY0SykgeworCQkJCWlmICghSVNfQUxJR05FRCh2bWEtPm5vZGUuc3RhcnQs CisJCQkJCQlJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKSB7CisJCQkJCXByX2Vycigibm9kZS5zdGFy dCglbGx4KSBub3QgYWxpZ25lZCB0byAyTVxuIiwKKwkJCQkJICAgICAgIHZtYS0+bm9kZS5zdGFy dCk7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWdvdG8gb3V0X3ZtYV91bnBpbjsKKwkJCQl9 CisKKwkJCQlpZiAoIUlTX0FMSUdORUQodm1hLT5ub2RlLnNpemUsCisJCQkJCQlJOTE1X0dUVF9Q QUdFX1NJWkVfMk0pKSB7CisJCQkJCXByX2Vycigibm9kZS5zaXplKCVsbHgpIG5vdCBhbGlnbmVk IHRvIDJNXG4iLAorCQkJCQkgICAgICAgdm1hLT5ub2RlLnNpemUpOworCQkJCQllcnIgPSAtRUlO VkFMOworCQkJCQlnb3RvIG91dF92bWFfdW5waW47CisJCQkJfQorCQkJfQorCisJCQlpZiAodm1h LT5wYWdlX3NpemVzLmd0dCAhPSBleHBlY3RlZF9ndHQpIHsKKwkJCQlwcl9lcnIoImd0dD0ldSwg ZXhwZWN0ZWQ9JXUsIGk9JWQsIHNpbmdsZT0lc1xuIiwKKwkJCQkgICAgICAgdm1hLT5wYWdlX3Np emVzLmd0dCwgZXhwZWN0ZWRfZ3R0LCBpLAorCQkJCSAgICAgICB5ZXNubyghIXNpbmdsZSkpOwor CQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXRfdm1hX3VucGluOworCQkJfQorCisJCQlp OTE1X3ZtYV91bnBpbih2bWEpOworCQkJaTkxNV92bWFfY2xvc2Uodm1hKTsKKworCQkJaTkxNV9n ZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7 CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3ZtYV91bnBpbjoKKwlpOTE1X3ZtYV91bnBp bih2bWEpOworb3V0X3ZtYV9jbG9zZToKKwlpOTE1X3ZtYV9jbG9zZSh2bWEpOworb3V0X29iamVj dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKK291dF9vYmplY3Rf cHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0 YXRpYyBzdHJ1Y3QgaTkxNV92bWEgKgorZ3B1X3dyaXRlX2R3KHN0cnVjdCBpOTE1X3ZtYSAqdm1h LCB1NjQgb2Zmc2V0LCB1MzIgdmFsKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1 ID0gdG9faTkxNSh2bWEtPm9iai0+YmFzZS5kZXYpOworCWNvbnN0IGludCBnZW4gPSBJTlRFTF9H RU4odm1hLT52bS0+aTkxNSk7CisJdW5zaWduZWQgaW50IGNvdW50ID0gdm1hLT5zaXplID4+IFBB R0VfU0hJRlQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaTkx NV92bWEgKmJhdGNoOworCXVuc2lnbmVkIGludCBzaXplOworCXUzMiAqY21kOworCWludCBuOwor CWludCBlcnI7CisKKwlzaXplID0gKDEgKyA0ICogY291bnQpICogc2l6ZW9mKHUzMik7CisJc2l6 ZSA9IHJvdW5kX3VwKHNpemUsIFBBR0VfU0laRSk7CisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2Ny ZWF0ZV9pbnRlcm5hbChpOTE1LCBzaXplKTsKKwlpZiAoSVNfRVJSKG9iaikpCisJCXJldHVybiBF UlJfQ0FTVChvYmopOworCisJY21kID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9tYXAob2JqLCBJOTE1 X01BUF9XQik7CisJaWYgKElTX0VSUihjbWQpKSB7CisJCWVyciA9IFBUUl9FUlIoY21kKTsKKwkJ Z290byBlcnI7CisJfQorCisJb2Zmc2V0ICs9IHZtYS0+bm9kZS5zdGFydDsKKworCWZvciAobiA9 IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCWlmIChnZW4gPj0gOCkgeworCQkJKmNtZCsrID0gTUlf U1RPUkVfRFdPUkRfSU1NX0dFTjQ7CisJCQkqY21kKysgPSBsb3dlcl8zMl9iaXRzKG9mZnNldCk7 CisJCQkqY21kKysgPSB1cHBlcl8zMl9iaXRzKG9mZnNldCk7CisJCQkqY21kKysgPSB2YWw7CisJ CX0gZWxzZSBpZiAoZ2VuID49IDQpIHsKKwkJCSpjbWQrKyA9IE1JX1NUT1JFX0RXT1JEX0lNTV9H RU40IHwKKwkJCQkoZ2VuIDwgNiA/IDEgPDwgMjIgOiAwKTsKKwkJCSpjbWQrKyA9IDA7CisJCQkq Y21kKysgPSBvZmZzZXQ7CisJCQkqY21kKysgPSB2YWw7CisJCX0gZWxzZSB7CisJCQkqY21kKysg PSBNSV9TVE9SRV9EV09SRF9JTU0gfCAxIDw8IDIyOworCQkJKmNtZCsrID0gb2Zmc2V0OworCQkJ KmNtZCsrID0gdmFsOworCQl9CisKKwkJb2Zmc2V0ICs9IFBBR0VfU0laRTsKKwl9CisKKwkqY21k ID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9tYXAob2Jq KTsKKworCWVyciA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbihvYmosIGZhbHNl KTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjsKKworCWJhdGNoID0gaTkxNV92bWFfaW5zdGFuY2Uo b2JqLCB2bWEtPnZtLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGJhdGNoKSkgeworCQllcnIgPSBQVFJf RVJSKGJhdGNoKTsKKwkJZ290byBlcnI7CisJfQorCisJZXJyID0gaTkxNV92bWFfcGluKGJhdGNo LCAwLCAwLCBQSU5fVVNFUik7CisJaWYgKGVycikKKwkJZ290byBlcnI7CisKKwlyZXR1cm4gYmF0 Y2g7CisKK2VycjoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gRVJSX1BU UihlcnIpOworfQorCitzdGF0aWMgaW50IGdwdV93cml0ZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwK KwkJICAgICBzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4LAorCQkgICAgIHN0cnVjdCBpbnRl bF9lbmdpbmVfY3MgKmVuZ2luZSwKKwkJICAgICB1MzIgZHdvcmQsCisJCSAgICAgdTMyIHZhbHVl KQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcnE7CisJc3RydWN0IGk5MTVfdm1h ICpiYXRjaDsKKwlpbnQgZmxhZ3MgPSAwOworCWludCBlcnI7CisKKwlHRU1fQlVHX09OKCFpbnRl bF9lbmdpbmVfY2FuX3N0b3JlX2R3b3JkKGVuZ2luZSkpOworCisJZXJyID0gaTkxNV9nZW1fb2Jq ZWN0X3NldF90b19ndHRfZG9tYWluKHZtYS0+b2JqLCB0cnVlKTsKKwlpZiAoZXJyKQorCQlyZXR1 cm4gZXJyOworCisJcnEgPSBpOTE1X2dlbV9yZXF1ZXN0X2FsbG9jKGVuZ2luZSwgY3R4KTsKKwlp ZiAoSVNfRVJSKHJxKSkKKwkJcmV0dXJuIFBUUl9FUlIocnEpOworCisJYmF0Y2ggPSBncHVfd3Jp dGVfZHcodm1hLCBkd29yZCAqIHNpemVvZih1MzIpLCB2YWx1ZSk7CisJaWYgKElTX0VSUihiYXRj aCkpIHsKKwkJZXJyID0gUFRSX0VSUihiYXRjaCk7CisJCWdvdG8gZXJyX3JlcXVlc3Q7CisJfQor CisJaTkxNV92bWFfbW92ZV90b19hY3RpdmUoYmF0Y2gsIHJxLCAwKTsKKwlpOTE1X2dlbV9vYmpl Y3Rfc2V0X2FjdGl2ZV9yZWZlcmVuY2UoYmF0Y2gtPm9iaik7CisJaTkxNV92bWFfdW5waW4oYmF0 Y2gpOworCWk5MTVfdm1hX2Nsb3NlKGJhdGNoKTsKKworCWVyciA9IHJxLT5lbmdpbmUtPmVtaXRf Zmx1c2gocnEsIEVNSVRfSU5WQUxJREFURSk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVxdWVz dDsKKworCWVyciA9IGk5MTVfc3dpdGNoX2NvbnRleHQocnEpOworCWlmIChlcnIpCisJCWdvdG8g ZXJyX3JlcXVlc3Q7CisKKwllcnIgPSBycS0+ZW5naW5lLT5lbWl0X2JiX3N0YXJ0KHJxLAorCQkJ CQliYXRjaC0+bm9kZS5zdGFydCwgYmF0Y2gtPm5vZGUuc2l6ZSwKKwkJCQkJZmxhZ3MpOworCWlm IChlcnIpCisJCWdvdG8gZXJyX3JlcXVlc3Q7CisKKwlpOTE1X3ZtYV9tb3ZlX3RvX2FjdGl2ZSh2 bWEsIHJxLCBFWEVDX09CSkVDVF9XUklURSk7CisKKwlyZXNlcnZhdGlvbl9vYmplY3RfbG9jayh2 bWEtPnJlc3YsIE5VTEwpOworCXJlc2VydmF0aW9uX29iamVjdF9hZGRfZXhjbF9mZW5jZSh2bWEt PnJlc3YsICZycS0+ZmVuY2UpOworCXJlc2VydmF0aW9uX29iamVjdF91bmxvY2sodm1hLT5yZXN2 KTsKKworZXJyX3JlcXVlc3Q6CisJX19pOTE1X2FkZF9yZXF1ZXN0KHJxLCBlcnIgPT0gMCk7CisK KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGNwdV9jaGVjayhzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqLCB1MzIgZHdvcmQsIHUzMiB2YWwpCit7CisJdW5zaWduZWQgaW50IG5l ZWRzX2ZsdXNoOworCXVuc2lnbmVkIGxvbmcgbjsKKwlpbnQgZXJyOworCisJZXJyID0gaTkxNV9n ZW1fb2JqX3ByZXBhcmVfc2htZW1fcmVhZChvYmosICZuZWVkc19mbHVzaCk7CisJaWYgKGVycikK KwkJcmV0dXJuIGVycjsKKworCWZvciAobiA9IDA7IG4gPCBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdF X1NISUZUOyArK24pIHsKKwkJdTMyICpwdHIgPSBrbWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3Rf Z2V0X3BhZ2Uob2JqLCBuKSk7CisKKwkJaWYgKG5lZWRzX2ZsdXNoICYgQ0xGTFVTSF9CRUZPUkUp CisJCQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHB0ciwgUEFHRV9TSVpFKTsKKworCQlpZiAocHRy W2R3b3JkXSAhPSB2YWwpIHsKKwkJCXByX2Vycigibj0lbHUgcHRyWyV1XT0ldSwgdmFsPSV1XG4i LAorCQkJICAgICAgIG4sIGR3b3JkLCBwdHJbZHdvcmRdLCB2YWwpOworCQkJa3VubWFwX2F0b21p YyhwdHIpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJa3VubWFwX2F0 b21pYyhwdHIpOworCX0KKworCWk5MTVfZ2VtX29ial9maW5pc2hfc2htZW1fYWNjZXNzKG9iaik7 CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF93cml0ZV9odWdlKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOworCXN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpj dHggPSBpOTE1LT5rZXJuZWxfY29udGV4dDsKKwlzdHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2 bSA9IGN0eC0+cHBndHQgPyAmY3R4LT5wcGd0dC0+YmFzZSA6ICZpOTE1LT5nZ3R0LmJhc2U7CisJ c3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwor CXVuc2lnbmVkIGludCBmbGFncyA9IFBJTl9VU0VSIHwgUElOX09GRlNFVF9GSVhFRDsKKwl1bnNp Z25lZCBpbnQgbWF4X3BhZ2Vfc2l6ZTsKKwl1bnNpZ25lZCBpbnQgaWQ7CisJdTY0IG1heDsKKwl1 NjQgbnVtOworCXU2NCBzaXplOworCWludCBlcnIgPSAwOworCisJR0VNX0JVR19PTighaTkxNV9n ZW1fb2JqZWN0X2hhc19waW5uZWRfcGFnZXMob2JqKSk7CisKKwlzaXplID0gb2JqLT5iYXNlLnNp emU7CisJaWYgKG9iai0+bW0ucGFnZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV82NEsp CisJCXNpemUgPSByb3VuZF91cChzaXplLCBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pOworCisJbWF4 X3BhZ2Vfc2l6ZSA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKG9iai0+bW0ucGFnZV9zaXplcy5zZyk7 CisJbWF4ID0gZGl2X3U2NCgodm0tPnRvdGFsIC0gc2l6ZSksIG1heF9wYWdlX3NpemUpOworCisJ dm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCB2bSwgTlVMTCk7CisJaWYgKElTX0VSUih2bWEp KQorCQlyZXR1cm4gUFRSX0VSUih2bWEpOworCisJZm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgaTkx NSwgaWQpIHsKKwkJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOworCisJCWlmICghaW50ZWxfZW5naW5l X2Nhbl9zdG9yZV9kd29yZChlbmdpbmUpKSB7CisJCQlwcl9pbmZvKCJzdG9yZS1kd29yZC1pbW0g bm90IHN1cHBvcnRlZCBvbiBlbmdpbmU9JXVcbiIsCisJCQkJaWQpOworCQkJY29udGludWU7CisJ CX0KKworCQkvKgorCQkgKiBUcnkgdmFyaW91cyBvZmZzZXRzIHVudGlsIHdlIHRpbWVvdXQgLS0g d2Ugd2FudCB0byBhdm9pZAorCQkgKiBpc3N1ZXMgaGlkZGVuIGJ5IGVmZmVjdGl2ZWx5IGFsd2F5 cyB1c2luZyBvZmZzZXQgPSAwLgorCQkgKi8KKwkJZm9yX2VhY2hfcHJpbWVfbnVtYmVyX2Zyb20o bnVtLCAwLCBtYXgpIHsKKwkJCXU2NCBvZmZzZXQgPSBudW0gKiBtYXhfcGFnZV9zaXplOworCQkJ dTMyIGR3b3JkOworCisJCQllcnIgPSBpOTE1X3ZtYV91bmJpbmQodm1hKTsKKwkJCWlmIChlcnIp CisJCQkJZ290byBvdXRfdm1hX2Nsb3NlOworCisJCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCBz aXplLCBtYXhfcGFnZV9zaXplLCBmbGFncyB8IG9mZnNldCk7CisJCQlpZiAoZXJyKSB7CisJCQkJ LyoKKwkJCQkgKiBUaGUgZ2d0dCBtYXkgaGF2ZSBzb21lIHBhZ2VzIHJlc2VydmVkIHNvCisJCQkJ ICogcmVmcmFpbiBmcm9tIGVycm9yaW5nIG91dC4KKwkJCQkgKi8KKwkJCQlpZiAoZXJyID09IC1F Tk9TUEMgJiYgaTkxNV9pc19nZ3R0KHZtKSkgeworCQkJCQllcnIgPSAwOworCQkJCQljb250aW51 ZTsKKwkJCQl9CisKKwkJCQlnb3RvIG91dF92bWFfY2xvc2U7CisJCQl9CisKKwkJCWVyciA9IGln dF9jaGVja19wYWdlX3NpemVzKHZtYSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X3ZtYV91 bnBpbjsKKworCQkJZHdvcmQgPSBvZmZzZXRfaW5fcGFnZShudW0pIC8gNDsKKworCQkJZXJyID0g Z3B1X3dyaXRlKHZtYSwgY3R4LCBlbmdpbmUsIGR3b3JkLCBudW0gKyAxKTsKKwkJCWlmIChlcnIp IHsKKwkJCQlwcl9lcnIoImdwdS13cml0ZSBmYWlsZWQgYXQgb2Zmc2V0PSVsbHgiLCBvZmZzZXQp OworCQkJCWdvdG8gb3V0X3ZtYV91bnBpbjsKKwkJCX0KKworCQkJZXJyID0gY3B1X2NoZWNrKG9i aiwgZHdvcmQsIG51bSArIDEpOworCQkJaWYgKGVycikgeworCQkJCXByX2VycigiY3B1LWNoZWNr IGZhaWxlZCBhdCBvZmZzZXQ9JWxseCIsIG9mZnNldCk7CisJCQkJZ290byBvdXRfdm1hX3VucGlu OworCQkJfQorCisJCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCisJCQlpZiAobnVtID4gMCAmJgor CQkJICAgIGlndF90aW1lb3V0KGVuZF90aW1lLAorCQkJCQkiJXMgdGltZWQgb3V0IG9uIGVuZ2lu ZT0ldSBhdCBvZmZzZXQ9JWxseCwgbWF4X3BhZ2Vfc2l6ZT0leFxuIiwKKwkJCQkJX19mdW5jX18s IGlkLCBvZmZzZXQsIG1heF9wYWdlX3NpemUpKQorCQkJCWJyZWFrOworCQl9CisJfQorCitvdXRf dm1hX3VucGluOgorCWlmIChpOTE1X3ZtYV9pc19waW5uZWQodm1hKSkKKwkJaTkxNV92bWFfdW5w aW4odm1hKTsKK291dF92bWFfY2xvc2U6CisJaTkxNV92bWFfY2xvc2Uodm1hKTsKKworCXJldHVy biBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X3BwZ3R0X2V4aGF1c3RfaHVnZSh2b2lkICphcmcp Cit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7CisJdW5zaWduZWQgbG9u ZyBzdXBwb3J0ZWQgPSBJTlRFTF9JTkZPKGk5MTUpLT5wYWdlX3NpemVzOworCXN0YXRpYyB1bnNp Z25lZCBpbnQgcGFnZXNbQVJSQVlfU0laRShwYWdlX3NpemVzKV07CisJc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iajsKKwl1bnNpZ25lZCBpbnQgc2l6ZV9tYXNrOworCXVuc2lnbmVkIGlu dCBwYWdlX21hc2s7CisJaW50IG4sIGk7CisJaW50IGVycjsKKworCS8qCisJICogU2FuaXR5IGNo ZWNrIGNyZWF0aW5nIG9iamVjdHMgd2l0aCBhIHZhcnlpbmcgbWl4IG9mIHBhZ2Ugc2l6ZXMgLS0K KwkgKiBlbnN1cmluZyB0aGF0IG91ciB3cml0ZXMgbGFuZHMgaW4gdGhlIHJpZ2h0IHBsYWNlLgor CSAqLworCisJbiA9IDA7CisJZm9yX2VhY2hfc2V0X2JpdChpLCAmc3VwcG9ydGVkLCBpbG9nMihJ OTE1X0dUVF9NQVhfUEFHRV9TSVpFKSArIDEpCisJCXBhZ2VzW24rK10gPSBCSVQoaSk7CisKKwlm b3IgKHNpemVfbWFzayA9IDI7IHNpemVfbWFzayA8IEJJVChuKTsgc2l6ZV9tYXNrKyspIHsKKwkJ dW5zaWduZWQgaW50IHNpemUgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJ CWlmIChzaXplX21hc2sgJiBCSVQoaSkpCisJCQkJc2l6ZSB8PSBwYWdlc1tpXTsKKwkJfQorCisJ CS8qCisJCSAqIEZvciBvdXIgcGFnZSBtYXNrIHdlIHdhbnQgdG8gZW51bWVyYXRlIGFsbCB0aGUg cGFnZS1zaXplCisJCSAqIGNvbWJpbmF0aW9ucyB3aGljaCB3aWxsIGZpdCBpbnRvIG91ciBjaG9z ZW4gb2JqZWN0IHNpemUuCisJCSAqLworCQlmb3IgKHBhZ2VfbWFzayA9IDI7IHBhZ2VfbWFzayA8 PSBzaXplX21hc2s7IHBhZ2VfbWFzaysrKSB7CisJCQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplcyA9 IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQlpZiAocGFnZV9tYXNrICYg QklUKGkpKQorCQkJCQlwYWdlX3NpemVzIHw9IHBhZ2VzW2ldOworCQkJfQorCisJCQkvKgorCQkJ ICogRW5zdXJlIHRoYXQgd2UgY2FuIGFjdHVhbGx5IGZpbGwgdGhlIGdpdmVuIG9iamVjdAorCQkJ ICogd2l0aCBvdXIgY2hvc2VuIHBhZ2UgbWFzay4KKwkJCSAqLworCQkJaWYgKCFJU19BTElHTkVE KHNpemUsIEJJVChfX2ZmcyhwYWdlX3NpemVzKSkpKQorCQkJCWNvbnRpbnVlOworCisJCQlvYmog PSBodWdlX3BhZ2VzX29iamVjdChpOTE1LCBzaXplLCBwYWdlX3NpemVzKTsKKwkJCWlmIChJU19F UlIob2JqKSkgeworCQkJCWVyciA9IFBUUl9FUlIob2JqKTsKKwkJCQlnb3RvIG91dF9kZXZpY2U7 CisJCQl9CisKKwkJCWVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKKwkJCWlm IChlcnIpIHsKKwkJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwkJCQlpZiAoZXJyID09 IC1FTk9NRU0pIHsKKwkJCQkJcHJfaW5mbygidW5hYmxlIHRvIGdldCBwYWdlcywgc2l6ZT0ldSwg cGFnZXM9JXVcbiIsCisJCQkJCQlzaXplLCBwYWdlX3NpemVzKTsKKwkJCQkJZXJyID0gMDsKKwkJ CQkJYnJlYWs7CisJCQkJfQorCisJCQkJcHJfZXJyKCJwaW5fcGFnZXMgZmFpbGVkLCBzaXplPSV1 LCBwYWdlcz0ldVxuIiwKKwkJCQkgICAgICAgc2l6ZV9tYXNrLCBwYWdlX21hc2spOworCisJCQkJ Z290byBvdXRfZGV2aWNlOworCQkJfQorCisJCQkvKiBGb3JjZSB0aGUgcGFnZS1zaXplIGZvciB0 aGUgZ3R0IGluc2VydGlvbiAqLworCQkJb2JqLT5tbS5wYWdlX3NpemVzLnNnID0gcGFnZV9zaXpl czsKKworCQkJZXJyID0gaWd0X3dyaXRlX2h1Z2Uob2JqKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlw cl9lcnIoImV4aGF1c3Qgd3JpdGUtaHVnZSBmYWlsZWQgd2l0aCBzaXplPSV1XG4iLAorCQkJCSAg ICAgICBzaXplKTsKKwkJCQlnb3RvIG91dF91bnBpbjsKKwkJCX0KKworCQkJaTkxNV9nZW1fb2Jq ZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJCX0K Kwl9CisKKwlnb3RvIG91dF9kZXZpY2U7CisKK291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3Rf dW5waW5fcGFnZXMob2JqKTsKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CitvdXRfZGV2aWNl OgorCW1rd3JpdGVfZGV2aWNlX2luZm8oaTkxNSktPnBhZ2Vfc2l6ZXMgPSBzdXBwb3J0ZWQ7CisK KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF9wcGd0dF9pbnRlcm5hbF9odWdlKHZv aWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQg c2l6ZXNbXSA9IHsKKwkJU1pfNjRLLAorCQlTWl8xMjhLLAorCQlTWl8yNTZLLAorCQlTWl81MTJL LAorCQlTWl8xTSwKKwkJU1pfMk0sCisJfTsKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJLyoKKwkg KiBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgSFcgdXNlcyBodWdlIHBhZ2VzIGNvcnJlY3RseSB0aHJv dWdoIGludGVybmFsCisJICogLS0gZW5zdXJlIHRoYXQgb3VyIHdyaXRlcyBsYW5kIGluIHRoZSBy aWdodCBwbGFjZS4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpemVzKTsg KytpKSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZXNbaV07CisKKwkJb2JqID0gaTkxNV9n ZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBzaXplKTsKKwkJaWYgKElTX0VSUihvYmop KQorCQkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGlu X3BhZ2VzKG9iaik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9wdXQ7CisKKwkJaWYgKG9iai0+ bW0ucGFnZV9zaXplcy5waHlzIDwgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgeworCQkJcHJfaW5m bygiaW50ZXJuYWwgdW5hYmxlIHRvIGFsbG9jYXRlIGh1Z2UtcGFnZShzKSB3aXRoIHNpemU9JXVc biIsCisJCQkJc2l6ZSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCWVyciA9IGlndF93 cml0ZV9odWdlKG9iaik7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiaW50ZXJuYWwgd3JpdGUt aHVnZSBmYWlsZWQgd2l0aCBzaXplPSV1XG4iLAorCQkJICAgICAgIHNpemUpOworCQkJZ290byBv dXRfdW5waW47CisJCX0KKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJ aTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCXJldHVybiAwOworCitvdXRfdW5waW46 CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXRfcHV0OgorCWk5MTVfZ2Vt X29iamVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9v bCBpZ3RfY2FuX2FsbG9jYXRlX3RocChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKK3sK KwlyZXR1cm4gaTkxNS0+bW0uZ2VtZnMgJiYgaGFzX3RyYW5zcGFyZW50X2h1Z2VwYWdlKCk7Cit9 CisKK3N0YXRpYyBpbnQgaWd0X3BwZ3R0X2dlbWZzX2h1Z2Uodm9pZCAqYXJnKQoreworCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gYXJnOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmo7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzaXplc1tdID0geworCQlTWl8y TSwKKwkJU1pfNE0sCisJCVNaXzhNLAorCQlTWl8xNk0sCisJCVNaXzMyTSwKKwl9OworCWludCBp OworCWludCBlcnI7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayB0aGF0IHRoZSBIVyB1c2VzIGh1 Z2UgcGFnZXMgY29ycmVjdGx5IHRocm91Z2ggZ2VtZnMgLS0KKwkgKiBlbnN1cmUgdGhhdCBvdXIg d3JpdGVzIGxhbmQgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSAqLworCisJaWYgKCFpZ3RfY2FuX2Fs bG9jYXRlX3RocChpOTE1KSkgeworCQlwcl9pbmZvKCJtaXNzaW5nIFRIUCBzdXBwb3J0LCBza2lw cGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KHNpemVzKTsgKytpKSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZXNbaV07CisKKwkJb2Jq ID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZShpOTE1LCBzaXplKTsKKwkJaWYgKElTX0VSUihvYmop KQorCQkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGlu X3BhZ2VzKG9iaik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9wdXQ7CisKKwkJaWYgKG9iai0+ bW0ucGFnZV9zaXplcy5waHlzIDwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSB7CisJCQlwcl9pbmZv KCJmaW5pc2hpbmcgdGVzdCBlYXJseSwgZ2VtZnMgdW5hYmxlIHRvIGFsbG9jYXRlIGh1Z2UtcGFn ZShzKSB3aXRoIHNpemU9JXVcbiIsCisJCQkJc2l6ZSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJ fQorCisJCWVyciA9IGlndF93cml0ZV9odWdlKG9iaik7CisJCWlmIChlcnIpIHsKKwkJCXByX2Vy cigiZ2VtZnMgd3JpdGUtaHVnZSBmYWlsZWQgd2l0aCBzaXplPSV1XG4iLAorCQkJICAgICAgIHNp emUpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5f cGFnZXMob2JqKTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCXJldHVybiAw OworCitvdXRfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXRf cHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0 YXRpYyBpbnQgaWd0X3BwZ3R0X3Bpbl91cGRhdGUodm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGFyZzsKKwl1bnNpZ25lZCBsb25nIHN1cHBvcnRlZCA9 IElOVEVMX0lORk8oZGV2X3ByaXYpLT5wYWdlX3NpemVzOworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0 ICpwcGd0dCA9IGRldl9wcml2LT5rZXJuZWxfY29udGV4dC0+cHBndHQ7CisJc3RydWN0IGRybV9p OTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwl1bnNpZ25lZCBp bnQgZmxhZ3MgPSBQSU5fVVNFUiB8IFBJTl9PRkZTRVRfRklYRUQ7CisJaW50IGZpcnN0LCBsYXN0 OworCWludCBlcnI7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSdzIG5vIGZ1bm55IGJ1c2lu ZXNzIHdoZW4gZG9pbmcgYSBQSU5fVVBEQVRFIC0tIGluIHRoZQorCSAqIHBhc3Qgd2UgaGFkIGEg c3VidGxlIGlzc3VlIHdpdGggYmVpbmcgYWJsZSB0byBpbmNvcnJlY3RseSBkbyBtdWx0aXBsZQor CSAqIGFsbG9jIHZhIHJhbmdlcyBvbiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBkb2luZyBhIFBJTl9V UERBVEUsIHdoaWNoCisJICogcmVzdWx0ZWQgaW4gc29tZSBwcmV0dHkgbmFzdHkgYnVncywgdGhv dWdoIG9ubHkgd2hlbiB1c2luZworCSAqIGh1Z2UtZ3R0LXBhZ2VzLgorCSAqLworCisJaWYgKCFV U0VTX0ZVTExfNDhCSVRfUFBHVFQoZGV2X3ByaXYpKSB7CisJCXByX2luZm8oIjQ4YiBQUEdUVCBu b3Qgc3VwcG9ydGVkLCBza2lwcGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCWZpcnN0ID0g aWxvZzIoSTkxNV9HVFRfUEFHRV9TSVpFXzY0Syk7CisJbGFzdCA9IGlsb2cyKEk5MTVfR1RUX1BB R0VfU0laRV8yTSk7CisKKwlmb3JfZWFjaF9zZXRfYml0X2Zyb20oZmlyc3QsICZzdXBwb3J0ZWQs IGxhc3QgKyAxKSB7CisJCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBCSVQoZmlyc3QpOworCisJ CW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoZGV2X3ByaXYsIHBhZ2Vfc2l6 ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJdm1h ID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQlpZiAoSVNf RVJSKHZtYSkpIHsKKwkJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJ fQorCisJCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIFNaXzJNLCAwLCBmbGFncyk7CisJCWlmIChl cnIpCisJCQlnb3RvIG91dF9jbG9zZTsKKworCQlpZiAodm1hLT5wYWdlX3NpemVzLnNnIDwgcGFn ZV9zaXplKSB7CisJCQlwcl9pbmZvKCJVbmFibGUgdG8gYWxsb2NhdGUgcGFnZS1zaXplICV4LCBm aW5pc2hpbmcgdGVzdCBlYXJseVxuIiwKKwkJCQlwYWdlX3NpemUpOworCQkJZ290byBvdXRfdW5w aW47CisJCX0KKworCQllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCQlpZiAoZXJy KQorCQkJZ290byBvdXRfdW5waW47CisKKwkJaWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gcGFn ZV9zaXplKSB7CisJCQlkbWFfYWRkcl90IGFkZHIgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X2RtYV9h ZGRyZXNzKG9iaiwgMCk7CisKKwkJCS8qCisJCQkgKiBUaGUgb25seSB2YWxpZCByZWFzb24gZm9y IHRoaXMgdG8gZXZlciBmYWlsIHdvdWxkIGJlCisJCQkgKiBpZiB0aGUgZG1hLW1hcHBlciBzY3Jl d2VkIHVzIG92ZXIgd2hlbiB3ZSBkaWQgdGhlCisJCQkgKiBkbWFfbWFwX3NnKCksIHNpbmNlIGl0 IGhhcyB0aGUgZmluYWwgc2F5IG92ZXIgdGhlIGRtYQorCQkJICogYWRkcmVzcy4KKwkJCSAqLwor CQkJaWYgKElTX0FMSUdORUQoYWRkciwgcGFnZV9zaXplKSkgeworCQkJCXByX2VycigicGFnZV9z aXplcy5ndHQ9JXUsIGV4cGVjdGVkPSV1XG4iLAorCQkJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMu Z3R0LCBwYWdlX3NpemUpOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCXBy X2luZm8oImRtYSBhZGRyZXNzIG1pc2FsaWduZWQsIGZpbmlzaGluZyB0ZXN0IGVhcmx5XG4iKTsK KwkJCX0KKworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQllcnIgPSBpOTE1X3ZtYV9iaW5k KHZtYSwgSTkxNV9DQUNIRV9OT05FLCBQSU5fVVBEQVRFKTsKKwkJaWYgKGVycikKKwkJCWdvdG8g b3V0X3VucGluOworCisJCWk5MTVfdm1hX3VucGluKHZtYSk7CisJCWk5MTVfdm1hX2Nsb3NlKHZt YSk7CisKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCW9iaiA9IGk5MTVfZ2Vt X29iamVjdF9jcmVhdGVfaW50ZXJuYWwoZGV2X3ByaXYsIFBBR0VfU0laRSk7CisJaWYgKElTX0VS UihvYmopKQorCQlyZXR1cm4gUFRSX0VSUihvYmopOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFu Y2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCWlmIChJU19FUlIodm1hKSkgeworCQllcnIg PSBQVFJfRVJSKHZtYSk7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKKwllcnIgPSBpOTE1X3ZtYV9w aW4odm1hLCAwLCAwLCBmbGFncyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisKKwkv KgorCSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgd2l0aCBzb21ldGhpbmcgbGlrZSB3aGVy ZSB0aGUgcGRlIGlzIHN0aWxsCisJICogcG9pbnRpbmcgdG8gdGhlIDJNIHBhZ2UsIGFuZCB0aGUg cHQgd2UganVzdCBmaWxsZWQtaW4gaXMgZGFuZ2xpbmcgLS0KKwkgKiB3ZSBjYW4gY2hlY2sgdGhp cyBieSB3cml0aW5nIHRvIHRoZSBmaXJzdCBwYWdlIHdoZXJlIGl0IHdvdWxkIHRoZW4KKwkgKiBs YW5kIGluIHRoZSBub3cgc3RhbGUgMk0gcGFnZS4KKwkgKi8KKworCWVyciA9IGdwdV93cml0ZSh2 bWEsIGRldl9wcml2LT5rZXJuZWxfY29udGV4dCwgZGV2X3ByaXYtPmVuZ2luZVtSQ1NdLAorCQkJ MCwgMHhkZWFkYmVhZik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5waW47CisKKwllcnIgPSBj cHVfY2hlY2sob2JqLCAwLCAweGRlYWRiZWFmKTsKKworb3V0X3VucGluOgorCWk5MTVfdm1hX3Vu cGluKHZtYSk7CitvdXRfY2xvc2U6CisJaTkxNV92bWFfY2xvc2Uodm1hKTsKK291dF9wdXQ6CisJ aTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlu dCBpZ3RfdG1wZnNfZmFsbGJhY2sodm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICppOTE1ID0gYXJnOworCXN0cnVjdCB2ZnNtb3VudCAqZ2VtZnMgPSBpOTE1LT5tbS5nZW1m czsKKwlzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4ID0gaTkxNS0+a2VybmVsX2NvbnRleHQ7 CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPSBjdHgtPnBwZ3R0ID8gJmN0eC0+cHBn dHQtPmJhc2UgOiAmaTkxNS0+Z2d0dC5iYXNlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJdTMyICp2YWRkcjsKKwlpbnQgZXJyID0g MDsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgYnVyc3QgaW50byBhIGJhbGwg b2YgZmxhbWVzIHVwb24gZmFsbGluZyBiYWNrCisJICogdG8gdG1wZnMsIHdoaWNoIHdlIHJlbHkg b24gaWYgb24gdGhlIG9mZi1jaGFuY2Ugd2UgZW5jb3V0ZXIgYSBmYWlsdXJlCisJICogd2hlbiBz ZXR0aW5nIHVwIGdlbWZzLgorCSAqLworCisJaTkxNS0+bW0uZ2VtZnMgPSBOVUxMOworCisJb2Jq ID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZShpOTE1LCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIo b2JqKSkgeworCQllcnIgPSBQVFJfRVJSKG9iaik7CisJCWdvdG8gb3V0X3Jlc3RvcmU7CisJfQor CisJdmFkZHIgPSBpOTE1X2dlbV9vYmplY3RfcGluX21hcChvYmosIEk5MTVfTUFQX1dCKTsKKwlp ZiAoSVNfRVJSKHZhZGRyKSkgeworCQllcnIgPSBQVFJfRVJSKHZhZGRyKTsKKwkJZ290byBvdXRf cHV0OworCX0KKwkqdmFkZHIgPSAweGRlYWRiZWFmOworCisJaTkxNV9nZW1fb2JqZWN0X3VucGlu X21hcChvYmopOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCB2bSwgTlVMTCk7CisJ aWYgKElTX0VSUih2bWEpKSB7CisJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJZ290byBvdXRfcHV0 OworCX0KKworCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIFBJTl9VU0VSKTsKKwlpZiAo ZXJyKQorCQlnb3RvIG91dF9jbG9zZTsKKworCWVyciA9IGlndF9jaGVja19wYWdlX3NpemVzKHZt YSk7CisKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X2Nsb3NlOgorCWk5MTVfdm1hX2Nsb3Nl KHZtYSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKK291dF9yZXN0b3Jl OgorCWk5MTUtPm1tLmdlbWZzID0gZ2VtZnM7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMg aW50IGlndF9zaHJpbmtfdGhwKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4ID0gaTkxNS0+a2Vy bmVsX2NvbnRleHQ7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPSBjdHgtPnBwZ3R0 ID8gJmN0eC0+cHBndHQtPmJhc2UgOiAmaTkxNS0+Z2d0dC5iYXNlOworCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJdW5zaWduZWQgaW50 IGZsYWdzID0gUElOX1VTRVI7CisJaW50IGVycjsKKworCS8qCisJICogU2FuaXR5IGNoZWNrIHNo cmlua2luZyBodWdlLXBhZ2VkIG9iamVjdCAtLSBtYWtlIHN1cmUgbm90aGluZyBibG93cworCSAq IHVwLgorCSAqLworCisJaWYgKCFpZ3RfY2FuX2FsbG9jYXRlX3RocChpOTE1KSkgeworCQlwcl9p bmZvKCJtaXNzaW5nIFRIUCBzdXBwb3J0LCBza2lwcGluZ1xuIik7CisJCXJldHVybiAwOworCX0K KworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGUoaTkxNSwgU1pfMk0pOworCWlmIChJU19F UlIob2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCXZtYSA9IGk5MTVfdm1hX2luc3Rh bmNlKG9iaiwgdm0sIE5VTEwpOworCWlmIChJU19FUlIodm1hKSkgeworCQllcnIgPSBQVFJfRVJS KHZtYSk7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKKwllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAw LCAwLCBmbGFncyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisKKwlpZiAob2JqLT5t bS5wYWdlX3NpemVzLnBoeXMgPCBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pIHsKKwkJcHJfaW5mbygi ZmFpbGVkIHRvIGFsbG9jYXRlIFRIUCwgZmluaXNoaW5nIHRlc3QgZWFybHlcbiIpOworCQlnb3Rv IG91dF91bnBpbjsKKwl9CisKKwllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCWlm IChlcnIpCisJCWdvdG8gb3V0X3VucGluOworCisJZXJyID0gZ3B1X3dyaXRlKHZtYSwgaTkxNS0+ a2VybmVsX2NvbnRleHQsIGk5MTUtPmVuZ2luZVtSQ1NdLCAwLAorCQkJMHhkZWFkYmVhZik7CisJ aWYgKGVycikKKwkJZ290byBvdXRfdW5waW47CisKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworCisJ LyoKKwkgKiBOb3cgdGhhdCB0aGUgcGFnZXMgYXJlICp1bnBpbm5lZCogc2hyaW5rLWFsbCBzaG91 bGQgaW52b2tlCisJICogc2htZW0gdG8gdHJ1bmNhdGUgb3VyIHBhZ2VzLgorCSAqLworCWk5MTVf Z2VtX3Nocmlua19hbGwoaTkxNSk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChvYmotPm1tLnBhZ2Vz KSkgeworCQlwcl9lcnIoInNocmluay1hbGwgZGlkbid0IHRydW5jYXRlIHRoZSBwYWdlc1xuIik7 CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmIChvYmotPm1t LnBhZ2Vfc2l6ZXMuc2cgfHwgb2JqLT5tbS5wYWdlX3NpemVzLnBoeXMpIHsKKwkJcHJfZXJyKCJy ZXNpZHVhbCBwYWdlLXNpemUgYml0cyBsZWZ0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290 byBvdXRfY2xvc2U7CisJfQorCisJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3Mp OworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJZXJyID0gY3B1X2NoZWNrKG9iaiwg MCwgMHhkZWFkYmVhZik7CisKK291dF91bnBpbjoKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0 X2Nsb3NlOgorCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVj dF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBpOTE1X2dlbV9odWdlX3BhZ2Vf bW9ja19zZWxmdGVzdHModm9pZCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVz dCB0ZXN0c1tdID0geworCQlTVUJURVNUKGlndF9tb2NrX2V4aGF1c3RfZGV2aWNlX3N1cHBvcnRl ZF9wYWdlcyksCisJCVNVQlRFU1QoaWd0X21vY2tfcHBndHRfbWlzYWxpZ25lZF9kbWEpLAorCQlT VUJURVNUKGlndF9tb2NrX3BwZ3R0X2h1Z2VfZmlsbCksCisJCVNVQlRFU1QoaWd0X21vY2tfcHBn dHRfNjRLKSwKKwl9OworCWludCBzYXZlZF9wcGd0dCA9IGk5MTVfbW9kcGFyYW1zLmVuYWJsZV9w cGd0dDsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IHBjaV9k ZXYgKnBkZXY7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0OworCWludCBlcnI7CisKKwlk ZXZfcHJpdiA9IG1vY2tfZ2VtX2RldmljZSgpOworCWlmICghZGV2X3ByaXYpCisJCXJldHVybiAt RU5PTUVNOworCisJLyogUHJldGVuZCB0byBiZSBhIGRldmljZSB3aGljaCBzdXBwb3J0cyB0aGUg NDhiIFBQR1RUICovCisJaTkxNV9tb2RwYXJhbXMuZW5hYmxlX3BwZ3R0ID0gMzsKKworCXBkZXYg PSBkZXZfcHJpdi0+ZHJtLnBkZXY7CisJZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmcGRl di0+ZGV2LCBETUFfQklUX01BU0soMzkpKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcm0u c3RydWN0X211dGV4KTsKKwlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGRldl9wcml2LCBFUlJf UFRSKC1FTk9ERVYpLCAibW9jayIpOworCWlmIChJU19FUlIocHBndHQpKSB7CisJCWVyciA9IFBU Ul9FUlIocHBndHQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKCFpOTE1X3ZtX2lz XzQ4Yml0KCZwcGd0dC0+YmFzZSkpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIDQ4YiBQ UEdUVFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCS8q IElmIHdlIHdlcmUgZXZlciBoaXQgdGhpcyB0aGVuIGl0J3MgdGltZSB0byBtb2NrIHRoZSA2NEsg c2NyYXRjaCAqLworCWlmICghaTkxNV92bV9oYXNfc2NyYXRjaF82NEsoJnBwZ3R0LT5iYXNlKSkg eworCQlwcl9lcnIoIlBQR1RUIG1pc3NpbmcgNjRLIHNjcmF0Y2ggcGFnZVxuIik7CisJCWVyciA9 IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWVyciA9IGk5MTVfc3VidGVzdHMo dGVzdHMsIHBwZ3R0KTsKKworb3V0X2Nsb3NlOgorCWk5MTVfcHBndHRfY2xvc2UoJnBwZ3R0LT5i YXNlKTsKKwlpOTE1X3BwZ3R0X3B1dChwcGd0dCk7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5s b2NrKCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7CisKKwlpOTE1X21vZHBhcmFtcy5lbmFi bGVfcHBndHQgPSBzYXZlZF9wcGd0dDsKKworCWRybV9kZXZfdW5yZWYoJmRldl9wcml2LT5kcm0p OworCisJcmV0dXJuIGVycjsKK30KKworaW50IGk5MTVfZ2VtX2h1Z2VfcGFnZV9saXZlX3NlbGZ0 ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RhdGljIGNvbnN0 IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKKwkJU1VCVEVTVChpZ3Rfc2hyaW5rX3Ro cCksCisJCVNVQlRFU1QoaWd0X3BwZ3R0X3Bpbl91cGRhdGUpLAorCQlTVUJURVNUKGlndF90bXBm c19mYWxsYmFjayksCisJCVNVQlRFU1QoaWd0X3BwZ3R0X2V4aGF1c3RfaHVnZSksCisJCVNVQlRF U1QoaWd0X3BwZ3R0X2dlbWZzX2h1Z2UpLAorCQlTVUJURVNUKGlndF9wcGd0dF9pbnRlcm5hbF9o dWdlKSwKKwl9OworCWludCBlcnI7CisKKwlpZiAoIVVTRVNfUFBHVFQoZGV2X3ByaXYpKSB7CisJ CXByX2luZm8oIlBQR1RUIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIGxpdmUtc2VsZnRlc3RzXG4i KTsKKwkJcmV0dXJuIDA7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRybS5zdHJ1Y3Rf bXV0ZXgpOworCWVyciA9IGk5MTVfc3VidGVzdHModGVzdHMsIGRldl9wcml2KTsKKwltdXRleF91 bmxvY2soJmRldl9wcml2LT5kcm0uc3RydWN0X211dGV4KTsKKworCXJldHVybiBlcnI7Cit9CmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0 ZXN0cy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVz dHMuaAppbmRleCAxOGIxNzRkODU1Y2EuLjY0YWNkN2VjY2M1YyAxMDA2NDQKLS0tIGEvZHJpdmVy cy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAorKysgYi9kcml2 ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCkBAIC0xNSw1 ICsxNSw2IEBAIHNlbGZ0ZXN0KG9iamVjdHMsIGk5MTVfZ2VtX29iamVjdF9saXZlX3NlbGZ0ZXN0 cykKIHNlbGZ0ZXN0KGRtYWJ1ZiwgaTkxNV9nZW1fZG1hYnVmX2xpdmVfc2VsZnRlc3RzKQogc2Vs ZnRlc3QoY29oZXJlbmN5LCBpOTE1X2dlbV9jb2hlcmVuY3lfbGl2ZV9zZWxmdGVzdHMpCiBzZWxm dGVzdChndHQsIGk5MTVfZ2VtX2d0dF9saXZlX3NlbGZ0ZXN0cykKK3NlbGZ0ZXN0KGh1Z2VwYWdl cywgaTkxNV9nZW1faHVnZV9wYWdlX2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoY29udGV4dHMs IGk5MTVfZ2VtX2NvbnRleHRfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChoYW5nY2hlY2ssIGlu dGVsX2hhbmdjaGVja19saXZlX3NlbGZ0ZXN0cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2Ry bS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3RzLmggYi9kcml2ZXJzL2dwdS9kcm0v aTkxNS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oCmluZGV4IGZjNzQ2ODc1MDFiYS4u OTk2MWI0NGY3NmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMv aTkxNV9tb2NrX3NlbGZ0ZXN0cy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0 cy9pOTE1X21vY2tfc2VsZnRlc3RzLmgKQEAgLTIxLDMgKzIxLDQgQEAgc2VsZnRlc3QoZG1hYnVm LCBpOTE1X2dlbV9kbWFidWZfbW9ja19zZWxmdGVzdHMpCiBzZWxmdGVzdCh2bWEsIGk5MTVfdm1h X21vY2tfc2VsZnRlc3RzKQogc2VsZnRlc3QoZXZpY3QsIGk5MTVfZ2VtX2V2aWN0X21vY2tfc2Vs ZnRlc3RzKQogc2VsZnRlc3QoZ3R0LCBpOTE1X2dlbV9ndHRfbW9ja19zZWxmdGVzdHMpCitzZWxm dGVzdChodWdlcGFnZXMsIGk5MTVfZ2VtX2h1Z2VfcGFnZV9tb2NrX3NlbGZ0ZXN0cykKLS0gCjIu MTMuNQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50 ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBz Oi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==