From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Auld Subject: [PATCH 17/21] drm/i915/selftests: huge page tests Date: Thu, 5 Oct 2017 16:19:11 +0100 Message-ID: <20171005151915.11151-18-matthew.auld@intel.com> References: <20171005151915.11151-1-matthew.auld@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id 1EB786E83D for ; Thu, 5 Oct 2017 15:19:49 +0000 (UTC) In-Reply-To: <20171005151915.11151-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 YyAgICAgICAgfCAxNzEyICsrKysrKysrKysrKysrKysrKysrCiAuLi4vZ3B1L2RybS9pOTE1L3Nl bGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmggICB8ICAgIDEgKwogLi4uL2dwdS9kcm0vaTkx NS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oICAgfCAgICAxICsKIDUgZmlsZXMgY2hh bmdlZCwgMTcxNyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUv ZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYwoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCmlu ZGV4IGZiM2IzNDEwZTk1NC4uZTYzOTM1YmE4ZjdlIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMK QEAgLTU0MDgsNiArNTQwOCw3IEBAIGludCBpOTE1X2dlbV9vYmplY3RfYXR0YWNoX3BoeXMoc3Ry dWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgaW50IGFsaWduKQogI2luY2x1ZGUgInNlbGZ0 ZXN0cy9zY2F0dGVybGlzdC5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9tb2NrX2dlbV9kZXZpY2Uu YyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaHVnZV9nZW1fb2JqZWN0LmMiCisjaW5jbHVkZSAic2Vs ZnRlc3RzL2h1Z2VfcGFnZXMuYyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fb2JqZWN0 LmMiCiAjaW5jbHVkZSAic2VsZnRlc3RzL2k5MTVfZ2VtX2NvaGVyZW5jeS5jIgogI2VuZGlmCmRp ZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaCBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oCmluZGV4IGU0ZTZkZDkzODg5ZC4uOTU2 YzkxMWMyY2JmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmpl Y3QuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbV9vYmplY3QuaApAQCAtMTk2 LDYgKzE5Niw4IEBAIHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0IHsKIAkJCXVuc2lnbmVkIGlu dCBndHQ7CiAJCX0gcGFnZV9zaXplczsKIAorCQlJOTE1X1NFTEZURVNUX0RFQ0xBUkUodW5zaWdu ZWQgaW50IHBhZ2VfbWFzayk7CisKIAkJc3RydWN0IGk5MTVfZ2VtX29iamVjdF9wYWdlX2l0ZXIg ewogCQkJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ19wb3M7CiAJCQl1bnNpZ25lZCBpbnQgc2dfaWR4 OyAvKiBpbiBwYWdlcywgYnV0IDMyYml0IGVlayEgKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9odWdlX3BhZ2VzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9z ZWxmdGVzdHMvaHVnZV9wYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uODgwMmQyN2I1NWViCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5 MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYwpAQCAtMCwwICsxLDE3MTIgQEAKKy8qCisgKiBDb3B5 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 NjRLKTsKKworCWZvcl9lYWNoX3NldF9iaXRfZnJvbShiaXQsICZzdXBwb3J0ZWQsIEJJVFNfUEVS X0xPTkcpIHsKKwkJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOworCQl1bnNpZ25lZCBpbnQgcGFnZV9z aXplID0gQklUKGJpdCk7CisJCXVuc2lnbmVkIGludCBmbGFncyA9IFBJTl9VU0VSIHwgUElOX09G RlNFVF9GSVhFRDsKKwkJdW5zaWduZWQgaW50IG9mZnNldDsKKwkJdW5zaWduZWQgaW50IHNpemUg PQorCQkJcm91bmRfdXAocGFnZV9zaXplLCBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pIDw8IDE7CisJ CXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCisJCW9iaiA9IGZha2VfaHVnZV9wYWdlc19vYmplY3Qo aTkxNSwgc2l6ZSwgdHJ1ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJS KG9iaik7CisKKwkJaWYgKG9iai0+YmFzZS5zaXplICE9IHNpemUpIHsKKwkJCXByX2Vycigib2Jq LT5iYXNlLnNpemU9JXp1LCBleHBlY3RlZD0ldVxuIiwKKwkJCSAgICAgICBvYmotPmJhc2Uuc2l6 ZSwgc2l6ZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290byBvdXRfcHV0OworCQl9CisKKwkJ ZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOworCQlpZiAoZXJyKQorCQkJZ290 byBvdXRfcHV0OworCisJCS8qIEZvcmNlIHRoZSBwYWdlIHNpemUgZm9yIHRoaXMgb2JqZWN0ICov CisJCW9iai0+bW0ucGFnZV9zaXplcy5zZyA9IHBhZ2Vfc2l6ZTsKKworCQl2bWEgPSBpOTE1X3Zt YV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCWlmIChJU19FUlIodm1hKSkg eworCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQll cnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFncyk7CisJCWlmIChlcnIpIHsKKwkJCWk5 MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisKKwkJZXJyID0g aWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKworCQlpZiAodm1hLT5wYWdlX3NpemVzLmd0dCAh PSBwYWdlX3NpemUpIHsKKwkJCXByX2VycigicGFnZV9zaXplcy5ndHQ9JXUsIGV4cGVjdGVkICV1 XG4iLAorCQkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5ndHQsIHBhZ2Vfc2l6ZSk7CisJCQllcnIg PSAtRUlOVkFMOworCQl9CisKKwkJaTkxNV92bWFfdW5waW4odm1hKTsKKworCQlpZiAoZXJyKSB7 CisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQkv KgorCQkgKiBUcnkgYWxsIHRoZSBvdGhlciB2YWxpZCBvZmZzZXRzIHVudGlsIHRoZSBuZXh0CisJ CSAqIGJvdW5kYXJ5IC0tIHNob3VsZCBhbHdheXMgZmFsbCBiYWNrIHRvIHVzaW5nIDRLCisJCSAq IHBhZ2VzLgorCQkgKi8KKwkJZm9yIChvZmZzZXQgPSA0MDk2OyBvZmZzZXQgPCBwYWdlX3NpemU7 IG9mZnNldCArPSA0MDk2KSB7CisJCQllcnIgPSBpOTE1X3ZtYV91bmJpbmQodm1hKTsKKwkJCWlm IChlcnIpIHsKKwkJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJCWdvdG8gb3V0X3VucGluOwor CQkJfQorCisJCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFncyB8IG9mZnNldCk7 CisJCQlpZiAoZXJyKSB7CisJCQkJaTkxNV92bWFfY2xvc2Uodm1hKTsKKwkJCQlnb3RvIG91dF91 bnBpbjsKKwkJCX0KKworCQkJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKworCQkJ aWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLKSB7CisJCQkJ cHJfZXJyKCJwYWdlX3NpemVzLmd0dD0ldSwgZXhwZWN0ZWQgJWx1XG4iLAorCQkJCSAgICAgICB2 bWEtPnBhZ2Vfc2l6ZXMuZ3R0LCBJOTE1X0dUVF9QQUdFX1NJWkVfNEspOworCQkJCWVyciA9IC1F SU5WQUw7CisJCQl9CisKKwkJCWk5MTVfdm1hX3VucGluKHZtYSk7CisKKwkJCWlmIChlcnIpIHsK KwkJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJCWdvdG8gb3V0X3VucGluOworCQkJfQorCisJ CQlpZiAoaWd0X3RpbWVvdXQoZW5kX3RpbWUsCisJCQkJCSIlcyB0aW1lZCBvdXQgYXQgb2Zmc2V0 ICV4IHdpdGggcGFnZS1zaXplICV4XG4iLAorCQkJCQlfX2Z1bmNfXywgb2Zmc2V0LCBwYWdlX3Np emUpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaTkxNV92bWFfY2xvc2Uodm1hKTsKKworCQlpOTE1 X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCX0KKworCXJldHVybiAwOworCitvdXRfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGlu X3BhZ2VzKG9iaik7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJl dHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX29iamVjdF9saXN0KHN0cnVjdCBsaXN0 X2hlYWQgKm9iamVjdHMsCisJCQkgICAgICBzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQpCit7 CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm9uOworCisJbGlzdF9mb3JfZWFj aF9lbnRyeV9zYWZlKG9iaiwgb24sIG9iamVjdHMsIHN0X2xpbmspIHsKKwkJc3RydWN0IGk5MTVf dm1hICp2bWE7CisKKwkJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmcHBndHQtPmJhc2Us IE5VTEwpOworCQlpZiAoIUlTX0VSUih2bWEpKQorCQkJaTkxNV92bWFfY2xvc2Uodm1hKTsKKwor CQlsaXN0X2RlbCgmb2JqLT5zdF9saW5rKTsKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2Vz KG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQg aWd0X21vY2tfcHBndHRfaHVnZV9maWxsKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaTkxNV9od19w cGd0dCAqcHBndHQgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBwcGd0 dC0+YmFzZS5pOTE1OworCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzID0gcHBndHQtPmJhc2UudG90 YWwgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VfbnVtOworCWJvb2wgc2luZ2xl ID0gZmFsc2U7CisJTElTVF9IRUFEKG9iamVjdHMpOworCUlHVF9USU1FT1VUKGVuZF90aW1lKTsK KwlpbnQgZXJyOworCisJZm9yX2VhY2hfcHJpbWVfbnVtYmVyX2Zyb20ocGFnZV9udW0sIDEsIG1h eF9wYWdlcykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCQl1NjQgc2l6 ZSA9IHBhZ2VfbnVtIDw8IFBBR0VfU0hJRlQ7CisJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCQl1 bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZ3R0ID0gMDsKKwkJaW50IGk7CisKKwkJb2JqID0gZmFrZV9o dWdlX3BhZ2VzX29iamVjdChpOTE1LCBzaXplLCBzaW5nbGUpOworCQlpZiAoSVNfRVJSKG9iaikp IHsKKwkJCWVyciA9IFBUUl9FUlIob2JqKTsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG9iai0+ YmFzZS5zaXplICE9IHNpemUpIHsKKwkJCXByX2Vycigib2JqLT5iYXNlLnNpemU9JXpkLCBleHBl Y3RlZD0lbGx1XG4iLAorCQkJICAgICAgIG9iai0+YmFzZS5zaXplLCBzaXplKTsKKwkJCWk5MTVf Z2VtX29iamVjdF9wdXQob2JqKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlicmVhazsKKwkJfQor CisJCWVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKKwkJaWYgKGVycikgewor CQkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCQkJYnJlYWs7CisJCX0KKworCQlsaXN0X2Fk ZCgmb2JqLT5zdF9saW5rLCAmb2JqZWN0cyk7CisKKwkJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uo b2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJCWVyciA9 IFBUUl9FUlIodm1hKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gaTkxNV92bWFfcGluKHZt YSwgMCwgMCwgUElOX1VTRVIpOworCQlpZiAoZXJyKQorCQkJYnJlYWs7CisKKwkJZXJyID0gaWd0 X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKwkJaWYgKGVycikgeworCQkJaTkxNV92bWFfdW5waW4o dm1hKTsKKwkJCWJyZWFrOworCQl9CisKKwkJLyoKKwkJICogRmlndXJlIG91dCB0aGUgZXhwZWN0 ZWQgZ3R0IHBhZ2Ugc2l6ZSBrbm93aW5nIHRoYXQgd2UgZ28gZnJvbQorCQkgKiBsYXJnZXN0IHRv IHNtYWxsZXN0IHBhZ2Ugc2l6ZSBzZyBjaHVua3MsIGFuZCB0aGF0IHdlIGFsaWduIHRvCisJCSAq IHRoZSBsYXJnZXN0IHBhZ2Ugc2l6ZS4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKHBhZ2Vfc2l6ZXMpOyArK2kpIHsKKwkJCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBwYWdl X3NpemVzW2ldOworCisJCQlpZiAoSEFTX1BBR0VfU0laRVMoaTkxNSwgcGFnZV9zaXplKSAmJgor CQkJICAgIHNpemUgPj0gcGFnZV9zaXplKSB7CisJCQkJZXhwZWN0ZWRfZ3R0IHw9IHBhZ2Vfc2l6 ZTsKKwkJCQlzaXplICY9IHBhZ2Vfc2l6ZS0xOworCQkJfQorCQl9CisKKwkJR0VNX0JVR19PTigh ZXhwZWN0ZWRfZ3R0KTsKKwkJR0VNX0JVR19PTihzaXplKTsKKworCQlpZiAoZXhwZWN0ZWRfZ3R0 ICYgSTkxNV9HVFRfUEFHRV9TSVpFXzRLKQorCQkJZXhwZWN0ZWRfZ3R0ICY9IH5JOTE1X0dUVF9Q QUdFX1NJWkVfNjRLOworCisJCWk5MTVfdm1hX3VucGluKHZtYSk7CisKKwkJaWYgKHZtYS0+cGFn ZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV82NEspIHsKKwkJCWlmICghSVNfQUxJR05F RCh2bWEtPm5vZGUuc3RhcnQsCisJCQkJCUk5MTVfR1RUX1BBR0VfU0laRV8yTSkpIHsKKwkJCQlw cl9lcnIoIm5vZGUuc3RhcnQoJWxseCkgbm90IGFsaWduZWQgdG8gMk1cbiIsCisJCQkJICAgICAg IHZtYS0+bm9kZS5zdGFydCk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlicmVhazsKKwkJCX0K KworCQkJaWYgKCFJU19BTElHTkVEKHZtYS0+bm9kZS5zaXplLAorCQkJCQlJOTE1X0dUVF9QQUdF X1NJWkVfMk0pKSB7CisJCQkJcHJfZXJyKCJub2RlLnNpemUoJWxseCkgbm90IGFsaWduZWQgdG8g Mk1cbiIsCisJCQkJICAgICAgIHZtYS0+bm9kZS5zaXplKTsKKwkJCQllcnIgPSAtRUlOVkFMOwor CQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gZXhw ZWN0ZWRfZ3R0KSB7CisJCQlwcl9lcnIoImd0dD0ldSwgZXhwZWN0ZWQ9JXUsIHNpemU9JXpkLCBz aW5nbGU9JXNcbiIsCisJCQkgICAgICAgdm1hLT5wYWdlX3NpemVzLmd0dCwgZXhwZWN0ZWRfZ3R0 LAorCQkJICAgICAgIG9iai0+YmFzZS5zaXplLCB5ZXNubyghIXNpbmdsZSkpOworCQkJZXJyID0g LUVJTlZBTDsKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGlndF90aW1lb3V0KGVuZF90aW1lLAor CQkJCSIlcyB0aW1lZCBvdXQgYXQgc2l6ZSAlemRcbiIsCisJCQkJX19mdW5jX18sIG9iai0+YmFz ZS5zaXplKSkKKwkJCWJyZWFrOworCisJCXNpbmdsZSA9ICFzaW5nbGU7CisJfQorCisJY2xvc2Vf b2JqZWN0X2xpc3QoJm9iamVjdHMsIHBwZ3R0KTsKKworCWlmIChlcnIgPT0gLUVOT01FTSB8fCBl cnIgPT0gLUVOT1NQQykKKwkJZXJyID0gMDsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBp bnQgaWd0X21vY2tfcHBndHRfNjRLKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaTkxNV9od19wcGd0 dCAqcHBndHQgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBwcGd0dC0+ YmFzZS5pOTE1OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJY29uc3Qgc3Ry dWN0IG9iamVjdF9pbmZvIHsKKwkJdW5zaWduZWQgaW50IHNpemU7CisJCXVuc2lnbmVkIGludCBn dHQ7CisJCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJfSBvYmplY3RzW10gPSB7CisJCS8qIENhc2Vz IHdpdGggZm9yY2VkIHBhZGRpbmcvYWxpZ25tZW50ICovCisJCXsKKwkJCS5zaXplID0gU1pfNjRL LAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEssCisJCQkub2Zmc2V0ID0gMCwKKwkJ fSwKKwkJeworCQkJLnNpemUgPSBTWl82NEsgKyBTWl80SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9Q QUdFX1NJWkVfNEssCisJCQkub2Zmc2V0ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl82 NEsgLSBTWl80SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNEssCisJCQkub2Zmc2V0 ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl8yTSwKKwkJCS5ndHQgPSBJOTE1X0dUVF9Q QUdFX1NJWkVfNjRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pf Mk0gLSBTWl80SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNEssCisJCQkub2Zmc2V0 ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl8yTSArIFNaXzRLLAorCQkJLmd0dCA9IEk5 MTVfR1RUX1BBR0VfU0laRV82NEsgfCBJOTE1X0dUVF9QQUdFX1NJWkVfNEssCisJCQkub2Zmc2V0 ID0gMCwKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl8yTSArIFNaXzY0SywKKwkJCS5ndHQgPSBJ OTE1X0dUVF9QQUdFX1NJWkVfNjRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5z aXplID0gU1pfMk0gLSBTWl82NEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SywK KwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQkvKiBUcnkgd2l0aG91dCBhbnkgZm9yY2VkIHBhZGRp bmcvYWxpZ25tZW50ICovCisJCXsKKwkJCS5zaXplID0gU1pfNjRLLAorCQkJLm9mZnNldCA9IFNa XzJNLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV80SywKKwkJfSwKKwkJeworCQkJLnNp emUgPSBTWl8xMjhLLAorCQkJLm9mZnNldCA9IFNaXzJNIC0gU1pfNjRLLAorCQkJLmd0dCA9IEk5 MTVfR1RUX1BBR0VfU0laRV80SywKKwkJfSwKKwl9OworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOwor CWludCBpLCBzaW5nbGU7CisJaW50IGVycjsKKworCS8qCisJICogU2FuaXR5IGNoZWNrIHNvbWUg b2YgdGhlIHRyaWNraW5lc3Mgd2l0aCA2NEsgcGFnZXMgLS0gZWl0aGVyIHdlIGNhbgorCSAqIHNh ZmVseSBtYXJrIHRoZSB3aG9sZSBwYWdlLXRhYmxlKDJNIGJsb2NrKSBhcyA2NEssIG9yIHdlIGhh dmUgdG8KKwkgKiBhbHdheXMgZmFsbGJhY2sgdG8gNEsuCisJICovCisKKwlpZiAoIUhBU19QQUdF X1NJWkVTKGk5MTUsIEk5MTVfR1RUX1BBR0VfU0laRV82NEspKQorCQlyZXR1cm4gMDsKKworCWZv ciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9iamVjdHMpOyArK2kpIHsKKwkJdW5zaWduZWQgaW50 IHNpemUgPSBvYmplY3RzW2ldLnNpemU7CisJCXVuc2lnbmVkIGludCBleHBlY3RlZF9ndHQgPSBv YmplY3RzW2ldLmd0dDsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IG9iamVjdHNbaV0ub2Zmc2V0 OworCQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSU5fVVNFUjsKKworCQlmb3IgKHNpbmdsZSA9IDA7 IHNpbmdsZSA8PSAxOyBzaW5nbGUrKykgeworCQkJb2JqID0gZmFrZV9odWdlX3BhZ2VzX29iamVj dChpOTE1LCBzaXplLCAhIXNpbmdsZSk7CisJCQlpZiAoSVNfRVJSKG9iaikpCisJCQkJcmV0dXJu IFBUUl9FUlIob2JqKTsKKworCQkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmop OworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF9vYmplY3RfcHV0OworCisJCQkvKgorCQkJICog RGlzYWJsZSAyTSBwYWdlcyAtLSBXZSBvbmx5IHdhbnQgdG8gdXNlIDY0Sy80SyBwYWdlcworCQkJ ICogZm9yIHRoaXMgdGVzdC4KKwkJCSAqLworCQkJb2JqLT5tbS5wYWdlX3NpemVzLnNnICY9IH5J OTE1X0dUVF9QQUdFX1NJWkVfMk07CisKKwkJCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwg JnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJCWlmIChJU19FUlIodm1hKSkgeworCQkJCWVyciA9IFBU Ul9FUlIodm1hKTsKKwkJCQlnb3RvIG91dF9vYmplY3RfdW5waW47CisJCQl9CisKKwkJCWlmIChv ZmZzZXQpCisJCQkJZmxhZ3MgfD0gUElOX09GRlNFVF9GSVhFRCB8IG9mZnNldDsKKworCQkJZXJy ID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOworCQkJaWYgKGVycikKKwkJCQlnb3Rv IG91dF92bWFfY2xvc2U7CisKKwkJCWVyciA9IGlndF9jaGVja19wYWdlX3NpemVzKHZtYSk7CisJ CQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X3ZtYV91bnBpbjsKKworCQkJaWYgKCFvZmZzZXQgJiYg dm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgeworCQkJCWlmICgh SVNfQUxJR05FRCh2bWEtPm5vZGUuc3RhcnQsCisJCQkJCQlJOTE1X0dUVF9QQUdFX1NJWkVfMk0p KSB7CisJCQkJCXByX2Vycigibm9kZS5zdGFydCglbGx4KSBub3QgYWxpZ25lZCB0byAyTVxuIiwK KwkJCQkJICAgICAgIHZtYS0+bm9kZS5zdGFydCk7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJ CWdvdG8gb3V0X3ZtYV91bnBpbjsKKwkJCQl9CisKKwkJCQlpZiAoIUlTX0FMSUdORUQodm1hLT5u b2RlLnNpemUsCisJCQkJCQlJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKSB7CisJCQkJCXByX2Vycigi bm9kZS5zaXplKCVsbHgpIG5vdCBhbGlnbmVkIHRvIDJNXG4iLAorCQkJCQkgICAgICAgdm1hLT5u b2RlLnNpemUpOworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQlnb3RvIG91dF92bWFfdW5waW47 CisJCQkJfQorCQkJfQorCisJCQlpZiAodm1hLT5wYWdlX3NpemVzLmd0dCAhPSBleHBlY3RlZF9n dHQpIHsKKwkJCQlwcl9lcnIoImd0dD0ldSwgZXhwZWN0ZWQ9JXUsIGk9JWQsIHNpbmdsZT0lc1xu IiwKKwkJCQkgICAgICAgdm1hLT5wYWdlX3NpemVzLmd0dCwgZXhwZWN0ZWRfZ3R0LCBpLAorCQkJ CSAgICAgICB5ZXNubyghIXNpbmdsZSkpOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBv dXRfdm1hX3VucGluOworCQkJfQorCisJCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQkJaTkxNV92 bWFfY2xvc2Uodm1hKTsKKworCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJ CQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKKworb3V0 X3ZtYV91bnBpbjoKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X3ZtYV9jbG9zZToKKwlpOTE1 X3ZtYV9jbG9zZSh2bWEpOworb3V0X29iamVjdF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5w aW5fcGFnZXMob2JqKTsKK291dF9vYmplY3RfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2Jq KTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTkxNV92bWEgKgorZ3B1X3dy aXRlX2R3KHN0cnVjdCBpOTE1X3ZtYSAqdm1hLCB1NjQgb2Zmc2V0LCB1MzIgdmFsKQoreworCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNSh2bWEtPm9iai0+YmFzZS5kZXYp OworCWNvbnN0IGludCBnZW4gPSBJTlRFTF9HRU4odm1hLT52bS0+aTkxNSk7CisJdW5zaWduZWQg aW50IGNvdW50ID0gdm1hLT5zaXplID4+IFBBR0VfU0hJRlQ7CisJc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaTkxNV92bWEgKmJhdGNoOworCXVuc2lnbmVkIGludCBz aXplOworCXUzMiAqY21kOworCWludCBuOworCWludCBlcnI7CisKKwlzaXplID0gKDEgKyA0ICog Y291bnQpICogc2l6ZW9mKHUzMik7CisJc2l6ZSA9IHJvdW5kX3VwKHNpemUsIFBBR0VfU0laRSk7 CisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBzaXplKTsKKwlp ZiAoSVNfRVJSKG9iaikpCisJCXJldHVybiBFUlJfQ0FTVChvYmopOworCisJY21kID0gaTkxNV9n ZW1fb2JqZWN0X3Bpbl9tYXAob2JqLCBJOTE1X01BUF9XQik7CisJaWYgKElTX0VSUihjbWQpKSB7 CisJCWVyciA9IFBUUl9FUlIoY21kKTsKKwkJZ290byBlcnI7CisJfQorCisJb2Zmc2V0ICs9IHZt YS0+bm9kZS5zdGFydDsKKworCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCWlmIChn ZW4gPj0gOCkgeworCQkJKmNtZCsrID0gTUlfU1RPUkVfRFdPUkRfSU1NX0dFTjQ7CisJCQkqY21k KysgPSBsb3dlcl8zMl9iaXRzKG9mZnNldCk7CisJCQkqY21kKysgPSB1cHBlcl8zMl9iaXRzKG9m ZnNldCk7CisJCQkqY21kKysgPSB2YWw7CisJCX0gZWxzZSBpZiAoZ2VuID49IDQpIHsKKwkJCSpj bWQrKyA9IE1JX1NUT1JFX0RXT1JEX0lNTV9HRU40IHwKKwkJCQkoZ2VuIDwgNiA/IDEgPDwgMjIg OiAwKTsKKwkJCSpjbWQrKyA9IDA7CisJCQkqY21kKysgPSBvZmZzZXQ7CisJCQkqY21kKysgPSB2 YWw7CisJCX0gZWxzZSB7CisJCQkqY21kKysgPSBNSV9TVE9SRV9EV09SRF9JTU0gfCAxIDw8IDIy OworCQkJKmNtZCsrID0gb2Zmc2V0OworCQkJKmNtZCsrID0gdmFsOworCQl9CisKKwkJb2Zmc2V0 ICs9IFBBR0VfU0laRTsKKwl9CisKKwkqY21kID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKworCWk5 MTVfZ2VtX29iamVjdF91bnBpbl9tYXAob2JqKTsKKworCWVyciA9IGk5MTVfZ2VtX29iamVjdF9z ZXRfdG9fZ3R0X2RvbWFpbihvYmosIGZhbHNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjsKKwor CWJhdGNoID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCB2bWEtPnZtLCBOVUxMKTsKKwlpZiAoSVNf RVJSKGJhdGNoKSkgeworCQllcnIgPSBQVFJfRVJSKGJhdGNoKTsKKwkJZ290byBlcnI7CisJfQor CisJZXJyID0gaTkxNV92bWFfcGluKGJhdGNoLCAwLCAwLCBQSU5fVVNFUik7CisJaWYgKGVycikK KwkJZ290byBlcnI7CisKKwlyZXR1cm4gYmF0Y2g7CisKK2VycjoKKwlpOTE1X2dlbV9vYmplY3Rf cHV0KG9iaik7CisKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IGdwdV93 cml0ZShzdHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJICAgICBzdHJ1Y3QgaTkxNV9nZW1fY29udGV4 dCAqY3R4LAorCQkgICAgIHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKKwkJICAgICB1 MzIgZHdvcmQsCisJCSAgICAgdTMyIHZhbHVlKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVx dWVzdCAqcnE7CisJc3RydWN0IGk5MTVfdm1hICpiYXRjaDsKKwlpbnQgZmxhZ3MgPSAwOworCWlu dCBlcnI7CisKKwlHRU1fQlVHX09OKCFpbnRlbF9lbmdpbmVfY2FuX3N0b3JlX2R3b3JkKGVuZ2lu ZSkpOworCisJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19ndHRfZG9tYWluKHZtYS0+b2Jq LCB0cnVlKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJcnEgPSBpOTE1X2dlbV9yZXF1 ZXN0X2FsbG9jKGVuZ2luZSwgY3R4KTsKKwlpZiAoSVNfRVJSKHJxKSkKKwkJcmV0dXJuIFBUUl9F UlIocnEpOworCisJYmF0Y2ggPSBncHVfd3JpdGVfZHcodm1hLCBkd29yZCAqIHNpemVvZih1MzIp LCB2YWx1ZSk7CisJaWYgKElTX0VSUihiYXRjaCkpIHsKKwkJZXJyID0gUFRSX0VSUihiYXRjaCk7 CisJCWdvdG8gZXJyX3JlcXVlc3Q7CisJfQorCisJaTkxNV92bWFfbW92ZV90b19hY3RpdmUoYmF0 Y2gsIHJxLCAwKTsKKwlpOTE1X2dlbV9vYmplY3Rfc2V0X2FjdGl2ZV9yZWZlcmVuY2UoYmF0Y2gt Pm9iaik7CisJaTkxNV92bWFfdW5waW4oYmF0Y2gpOworCWk5MTVfdm1hX2Nsb3NlKGJhdGNoKTsK KworCWVyciA9IHJxLT5lbmdpbmUtPmVtaXRfZmx1c2gocnEsIEVNSVRfSU5WQUxJREFURSk7CisJ aWYgKGVycikKKwkJZ290byBlcnJfcmVxdWVzdDsKKworCWVyciA9IGk5MTVfc3dpdGNoX2NvbnRl eHQocnEpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcXVlc3Q7CisKKwllcnIgPSBycS0+ZW5n aW5lLT5lbWl0X2JiX3N0YXJ0KHJxLAorCQkJCQliYXRjaC0+bm9kZS5zdGFydCwgYmF0Y2gtPm5v ZGUuc2l6ZSwKKwkJCQkJZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcXVlc3Q7CisK KwlpOTE1X3ZtYV9tb3ZlX3RvX2FjdGl2ZSh2bWEsIHJxLCBFWEVDX09CSkVDVF9XUklURSk7CisK KwlyZXNlcnZhdGlvbl9vYmplY3RfbG9jayh2bWEtPnJlc3YsIE5VTEwpOworCXJlc2VydmF0aW9u X29iamVjdF9hZGRfZXhjbF9mZW5jZSh2bWEtPnJlc3YsICZycS0+ZmVuY2UpOworCXJlc2VydmF0 aW9uX29iamVjdF91bmxvY2sodm1hLT5yZXN2KTsKKworZXJyX3JlcXVlc3Q6CisJX19pOTE1X2Fk ZF9yZXF1ZXN0KHJxLCBlcnIgPT0gMCk7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50 IGNwdV9jaGVjayhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1MzIgZHdvcmQsIHUz MiB2YWwpCit7CisJdW5zaWduZWQgaW50IG5lZWRzX2ZsdXNoOworCXVuc2lnbmVkIGxvbmcgbjsK KwlpbnQgZXJyOworCisJZXJyID0gaTkxNV9nZW1fb2JqX3ByZXBhcmVfc2htZW1fcmVhZChvYmos ICZuZWVkc19mbHVzaCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWZvciAobiA9IDA7 IG4gPCBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZUOyArK24pIHsKKwkJdTMyICpwdHIgPSBr bWFwX2F0b21pYyhpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2Uob2JqLCBuKSk7CisKKwkJaWYgKG5l ZWRzX2ZsdXNoICYgQ0xGTFVTSF9CRUZPUkUpCisJCQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHB0 ciwgUEFHRV9TSVpFKTsKKworCQlpZiAocHRyW2R3b3JkXSAhPSB2YWwpIHsKKwkJCXByX2Vycigi bj0lbHUgcHRyWyV1XT0ldSwgdmFsPSV1XG4iLAorCQkJICAgICAgIG4sIGR3b3JkLCBwdHJbZHdv cmRdLCB2YWwpOworCQkJa3VubWFwX2F0b21pYyhwdHIpOworCQkJZXJyID0gLUVJTlZBTDsKKwkJ CWJyZWFrOworCQl9CisKKwkJa3VubWFwX2F0b21pYyhwdHIpOworCX0KKworCWk5MTVfZ2VtX29i al9maW5pc2hfc2htZW1fYWNjZXNzKG9iaik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMg aW50IGlndF93cml0ZV9odWdlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwor CXN0cnVjdCBpOTE1X2dlbV9jb250ZXh0ICpjdHggPSBpOTE1LT5rZXJuZWxfY29udGV4dDsKKwlz dHJ1Y3QgaTkxNV9hZGRyZXNzX3NwYWNlICp2bSA9IGN0eC0+cHBndHQgPyAmY3R4LT5wcGd0dC0+ YmFzZSA6ICZpOTE1LT5nZ3R0LmJhc2U7CisJc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l OworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXVuc2lnbmVkIGludCBmbGFncyA9IFBJTl9VU0VS IHwgUElOX09GRlNFVF9GSVhFRDsKKwl1bnNpZ25lZCBpbnQgbWF4X3BhZ2Vfc2l6ZTsKKwl1bnNp Z25lZCBpbnQgaWQ7CisJdTY0IG1heDsKKwl1NjQgbnVtOworCXU2NCBzaXplOworCWludCBlcnIg PSAwOworCisJR0VNX0JVR19PTighaTkxNV9nZW1fb2JqZWN0X2hhc19waW5uZWRfcGFnZXMob2Jq KSk7CisKKwlzaXplID0gb2JqLT5iYXNlLnNpemU7CisJaWYgKG9iai0+bW0ucGFnZV9zaXplcy5z ZyAmIEk5MTVfR1RUX1BBR0VfU0laRV82NEspCisJCXNpemUgPSByb3VuZF91cChzaXplLCBJOTE1 X0dUVF9QQUdFX1NJWkVfMk0pOworCisJbWF4X3BhZ2Vfc2l6ZSA9IHJvdW5kZG93bl9wb3dfb2Zf dHdvKG9iai0+bW0ucGFnZV9zaXplcy5zZyk7CisJbWF4ID0gZGl2X3U2NCgodm0tPnRvdGFsIC0g c2l6ZSksIG1heF9wYWdlX3NpemUpOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCB2 bSwgTlVMTCk7CisJaWYgKElTX0VSUih2bWEpKQorCQlyZXR1cm4gUFRSX0VSUih2bWEpOworCisJ Zm9yX2VhY2hfZW5naW5lKGVuZ2luZSwgaTkxNSwgaWQpIHsKKwkJSUdUX1RJTUVPVVQoZW5kX3Rp bWUpOworCisJCWlmICghaW50ZWxfZW5naW5lX2Nhbl9zdG9yZV9kd29yZChlbmdpbmUpKSB7CisJ CQlwcl9pbmZvKCJzdG9yZS1kd29yZC1pbW0gbm90IHN1cHBvcnRlZCBvbiBlbmdpbmU9JXVcbiIs CisJCQkJaWQpOworCQkJY29udGludWU7CisJCX0KKworCQkvKgorCQkgKiBUcnkgdmFyaW91cyBv ZmZzZXRzIHVudGlsIHdlIHRpbWVvdXQgLS0gd2Ugd2FudCB0byBhdm9pZAorCQkgKiBpc3N1ZXMg aGlkZGVuIGJ5IGVmZmVjdGl2ZWx5IGFsd2F5cyB1c2luZyBvZmZzZXQgPSAwLgorCQkgKi8KKwkJ Zm9yX2VhY2hfcHJpbWVfbnVtYmVyX2Zyb20obnVtLCAwLCBtYXgpIHsKKwkJCXU2NCBvZmZzZXQg PSBudW0gKiBtYXhfcGFnZV9zaXplOworCQkJdTMyIGR3b3JkOworCisJCQllcnIgPSBpOTE1X3Zt YV91bmJpbmQodm1hKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfdm1hX2Nsb3NlOworCisJ CQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCBzaXplLCBtYXhfcGFnZV9zaXplLCBmbGFncyB8IG9m ZnNldCk7CisJCQlpZiAoZXJyKSB7CisJCQkJLyoKKwkJCQkgKiBUaGUgZ2d0dCBtYXkgaGF2ZSBz b21lIHBhZ2VzIHJlc2VydmVkIHNvCisJCQkJICogcmVmcmFpbiBmcm9tIGVycm9yaW5nIG91dC4K KwkJCQkgKi8KKwkJCQlpZiAoZXJyID09IC1FTk9TUEMgJiYgaTkxNV9pc19nZ3R0KHZtKSkKKwkJ CQkJY29udGludWU7CisKKwkJCQlnb3RvIG91dF92bWFfY2xvc2U7CisJCQl9CisKKwkJCWVyciA9 IGlndF9jaGVja19wYWdlX3NpemVzKHZtYSk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X3Zt YV91bnBpbjsKKworCQkJZHdvcmQgPSBvZmZzZXRfaW5fcGFnZShudW0pIC8gNDsKKworCQkJZXJy ID0gZ3B1X3dyaXRlKHZtYSwgY3R4LCBlbmdpbmUsIGR3b3JkLCBudW0gKyAxKTsKKwkJCWlmIChl cnIpIHsKKwkJCQlwcl9lcnIoImdwdS13cml0ZSBmYWlsZWQgYXQgb2Zmc2V0PSVsbHgiLCBvZmZz ZXQpOworCQkJCWdvdG8gb3V0X3ZtYV91bnBpbjsKKwkJCX0KKworCQkJZXJyID0gY3B1X2NoZWNr KG9iaiwgZHdvcmQsIG51bSArIDEpOworCQkJaWYgKGVycikgeworCQkJCXByX2VycigiY3B1LWNo ZWNrIGZhaWxlZCBhdCBvZmZzZXQ9JWxseCIsIG9mZnNldCk7CisJCQkJZ290byBvdXRfdm1hX3Vu cGluOworCQkJfQorCisJCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCisJCQlpZiAobnVtID4gMCAm JgorCQkJICAgIGlndF90aW1lb3V0KGVuZF90aW1lLAorCQkJCQkiJXMgdGltZWQgb3V0IG9uIGVu Z2luZT0ldSBhdCBvZmZzZXQ9JWxseFxuIiwKKwkJCQkJX19mdW5jX18sIGlkLCBvZmZzZXQpKQor CQkJCWJyZWFrOworCQl9CisJfQorCitvdXRfdm1hX3VucGluOgorCWlmIChpOTE1X3ZtYV9pc19w aW5uZWQodm1hKSkKKwkJaTkxNV92bWFfdW5waW4odm1hKTsKK291dF92bWFfY2xvc2U6CisJaTkx NV92bWFfY2xvc2Uodm1hKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X3Bw Z3R0X2V4aGF1c3RfaHVnZSh2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUgPSBhcmc7CisJdW5zaWduZWQgbG9uZyBzdXBwb3J0ZWQgPSBJTlRFTF9JTkZPKGk5MTUp LT5wYWdlX3NpemVzOworCXN0YXRpYyB1bnNpZ25lZCBpbnQgcGFnZXNbQVJSQVlfU0laRShwYWdl X3NpemVzKV07CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwl1bnNpZ25lZCBp bnQgc2l6ZV9tYXNrOworCXVuc2lnbmVkIGludCBwYWdlX21hc2s7CisJaW50IG4sIGk7CisJaW50 IGVycjsKKworCS8qCisJICogU2FuaXR5IGNoZWNrIGNyZWF0aW5nIG9iamVjdHMgd2l0aCBhIHZh cnlpbmcgbWl4IG9mIHBhZ2Ugc2l6ZXMgLS0KKwkgKiBlbnN1cmluZyB0aGF0IG91ciB3cml0ZXMg bGFuZHMgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSAqLworCisJbiA9IDA7CisJZm9yX2VhY2hfc2V0 X2JpdChpLCAmc3VwcG9ydGVkLCBCSVRTX1BFUl9MT05HKQorCQlwYWdlc1tuKytdID0gQklUKGkp OworCisJZm9yIChzaXplX21hc2sgPSAyOyBzaXplX21hc2sgPCBCSVQobik7IHNpemVfbWFzaysr KSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gMDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsr KSB7CisJCQlpZiAoc2l6ZV9tYXNrICYgQklUKGkpKQorCQkJCXNpemUgfD0gcGFnZXNbaV07CisJ CX0KKworCQkvKgorCQkgKiBGb3Igb3VyIHBhZ2UgbWFzayB3ZSB3YW50IHRvIGVudW1lcmF0ZSBh bGwgdGhlIHBhZ2Utc2l6ZQorCQkgKiBjb21iaW5hdGlvbnMgd2hpY2ggd2lsbCBmaXQgaW50byBv dXIgY2hvc2VuIG9iamVjdCBzaXplLgorCQkgKi8KKwkJZm9yIChwYWdlX21hc2sgPSAyOyBwYWdl X21hc2sgPD0gc2l6ZV9tYXNrOyBwYWdlX21hc2srKykgeworCQkJdW5zaWduZWQgaW50IHBhZ2Vf c2l6ZXMgPSAwOworCisJCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisJCQkJaWYgKHBhZ2Vf bWFzayAmIEJJVChpKSkKKwkJCQkJcGFnZV9zaXplcyB8PSBwYWdlc1tpXTsKKwkJCX0KKworCQkJ LyoKKwkJCSAqIEVuc3VyZSB0aGF0IHdlIGNhbiBhY3R1YWxseSBmaWxsIHRoZSBnaXZlbiBvYmpl Y3QKKwkJCSAqIHdpdGggb3VyIGNob3NlbiBwYWdlIG1hc2suCisJCQkgKi8KKwkJCWlmICghSVNf QUxJR05FRChzaXplLCBCSVQoX19mZnMocGFnZV9zaXplcykpKSkKKwkJCQljb250aW51ZTsKKwor CQkJb2JqID0gaHVnZV9wYWdlc19vYmplY3QoaTkxNSwgc2l6ZSwgcGFnZV9zaXplcyk7CisJCQlp ZiAoSVNfRVJSKG9iaikpIHsKKwkJCQllcnIgPSBQVFJfRVJSKG9iaik7CisJCQkJZ290byBvdXRf ZGV2aWNlOworCQkJfQorCisJCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7 CisJCQlpZiAoZXJyKSB7CisJCQkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJCQkJaWYg KGVyciA9PSAtRU5PTUVNKSB7CisJCQkJCXByX2luZm8oInVuYWJsZSB0byBnZXQgcGFnZXMsIHNp emU9JXUsIHBhZ2VzPSV1XG4iLAorCQkJCQkJc2l6ZSwgcGFnZV9zaXplcyk7CisJCQkJCWVyciA9 IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXByX2VycigicGluX3BhZ2VzIGZhaWxlZCwg c2l6ZT0ldSwgcGFnZXM9JXVcbiIsCisJCQkJICAgICAgIHNpemVfbWFzaywgcGFnZV9tYXNrKTsK KworCQkJCWdvdG8gb3V0X2RldmljZTsKKwkJCX0KKworCQkJLyogRm9yY2UgdGhlIHBhZ2Utc2l6 ZSBmb3IgdGhlIGd0dCBpbnNlcnRpb24gKi8KKwkJCW9iai0+bW0ucGFnZV9zaXplcy5zZyA9IHBh Z2Vfc2l6ZXM7CisKKwkJCWVyciA9IGlndF93cml0ZV9odWdlKG9iaik7CisJCQlpZiAoZXJyKSB7 CisJCQkJcHJfZXJyKCJleGhhdXN0IHdyaXRlLWh1Z2UgZmFpbGVkIHdpdGggc2l6ZT0ldVxuIiwK KwkJCQkgICAgICAgc2l6ZSk7CisJCQkJZ290byBvdXRfdW5waW47CisJCQl9CisKKwkJCWk5MTVf Z2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCQkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCQl9CisJfQorCisJZ290byBvdXRfZGV2aWNlOworCitvdXRfdW5waW46CisJaTkxNV9nZW1f b2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworb3V0 X2RldmljZToKKwlta3dyaXRlX2RldmljZV9pbmZvKGk5MTUpLT5wYWdlX3NpemVzID0gc3VwcG9y dGVkOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZ3RfcHBndHRfaW50ZXJuYWxf aHVnZSh2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7 CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdGF0aWMgY29uc3QgdW5zaWdu ZWQgaW50IHNpemVzW10gPSB7CisJCVNaXzY0SywKKwkJU1pfMTI4SywKKwkJU1pfMjU2SywKKwkJ U1pfNTEySywKKwkJU1pfMU0sCisJCVNaXzJNLAorCX07CisJaW50IGk7CisJaW50IGVycjsKKwor CS8qCisJICogU2FuaXR5IGNoZWNrIHRoYXQgdGhlIEhXIHVzZXMgaHVnZSBwYWdlcyBjb3JyZWN0 bHkgdGhyb3VnaCBpbnRlcm5hbAorCSAqIC0tIGVuc3VyZSB0aGF0IG91ciB3cml0ZXMgbGFuZCBp biB0aGUgcmlnaHQgcGxhY2UuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShz aXplcyk7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVzW2ldOworCisJCW9iaiA9 IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgc2l6ZSk7CisJCWlmIChJU19F UlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJZXJyID0gaTkxNV9nZW1fb2Jq ZWN0X3Bpbl9wYWdlcyhvYmopOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCWlm IChvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5cyA8IEk5MTVfR1RUX1BBR0VfU0laRV82NEspIHsKKwkJ CXByX2luZm8oImludGVybmFsIHVuYWJsZSB0byBhbGxvY2F0ZSBodWdlLXBhZ2Uocykgd2l0aCBz aXplPSV1XG4iLAorCQkJCXNpemUpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQllcnIg PSBpZ3Rfd3JpdGVfaHVnZShvYmopOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoImludGVybmFs IHdyaXRlLWh1Z2UgZmFpbGVkIHdpdGggc2l6ZT0ldVxuIiwKKwkJCSAgICAgICBzaXplKTsKKwkJ CWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9i aik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0 X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworb3V0X3B1dDoKKwlp OTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW5s aW5lIGJvb2wgaWd0X2Nhbl9hbGxvY2F0ZV90aHAoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUpCit7CisJcmV0dXJuIGk5MTUtPm1tLmdlbWZzICYmIGhhc190cmFuc3BhcmVudF9odWdlcGFn ZSgpOworfQorCitzdGF0aWMgaW50IGlndF9wcGd0dF9nZW1mc19odWdlKHZvaWQgKmFyZykKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdCAqb2JqOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZXNbXSA9IHsK KwkJU1pfMk0sCisJCVNaXzRNLAorCQlTWl84TSwKKwkJU1pfMTZNLAorCQlTWl8zMk0sCisJfTsK KwlpbnQgaTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgSFcg dXNlcyBodWdlIHBhZ2VzIGNvcnJlY3RseSB0aHJvdWdoIGdlbWZzIC0tCisJICogZW5zdXJlIHRo YXQgb3VyIHdyaXRlcyBsYW5kIGluIHRoZSByaWdodCBwbGFjZS4KKwkgKi8KKworCWlmICghaWd0 X2Nhbl9hbGxvY2F0ZV90aHAoaTkxNSkpIHsKKwkJcHJfaW5mbygibWlzc2luZyBUSFAgc3VwcG9y dCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJS QVlfU0laRShzaXplcyk7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVzW2ldOwor CisJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGUoaTkxNSwgc2l6ZSk7CisJCWlmIChJU19F UlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJZXJyID0gaTkxNV9nZW1fb2Jq ZWN0X3Bpbl9wYWdlcyhvYmopOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCWlm IChvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5cyA8IEk5MTVfR1RUX1BBR0VfU0laRV8yTSkgeworCQkJ cHJfaW5mbygiZmluaXNoaW5nIHRlc3QgZWFybHksIGdlbWZzIHVuYWJsZSB0byBhbGxvY2F0ZSBo dWdlLXBhZ2Uocykgd2l0aCBzaXplPSV1XG4iLAorCQkJCXNpemUpOworCQkJZ290byBvdXRfdW5w aW47CisJCX0KKworCQllcnIgPSBpZ3Rfd3JpdGVfaHVnZShvYmopOworCQlpZiAoZXJyKSB7CisJ CQlwcl9lcnIoImdlbWZzIHdyaXRlLWh1Z2UgZmFpbGVkIHdpdGggc2l6ZT0ldVxuIiwKKwkJCSAg ICAgICBzaXplKTsKKwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJaTkxNV9nZW1fb2JqZWN0 X3VucGluX3BhZ2VzKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9CisKKwly ZXR1cm4gMDsKKworb3V0X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmop Oworb3V0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gZXJyOwor fQorCitzdGF0aWMgaW50IGlndF9wcGd0dF9waW5fdXBkYXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBhcmc7CisJdW5zaWduZWQgbG9uZyBzdXBw b3J0ZWQgPSBJTlRFTF9JTkZPKGRldl9wcml2KS0+cGFnZV9zaXplczsKKwlzdHJ1Y3QgaTkxNV9o d19wcGd0dCAqcHBndHQgPSBkZXZfcHJpdi0+a2VybmVsX2NvbnRleHQtPnBwZ3R0OworCXN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJdW5z aWduZWQgaW50IGZsYWdzID0gUElOX1VTRVIgfCBQSU5fT0ZGU0VUX0ZJWEVEOworCWludCBmaXJz dCwgbGFzdDsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBNYWtlIHN1cmUgdGhlcmUncyBubyBmdW5u eSBidXNpbmVzcyB3aGVuIGRvaW5nIGEgUElOX1VQREFURSAtLSBpbiB0aGUKKwkgKiBwYXN0IHdl IGhhZCBhIHN1YnRsZSBpc3N1ZSB3aXRoIGJlaW5nIGFibGUgdG8gaW5jb3JyZWN0bHkgZG8gbXVs dGlwbGUKKwkgKiBhbGxvYyB2YSByYW5nZXMgb24gdGhlIHNhbWUgb2JqZWN0IHdoZW4gZG9pbmcg YSBQSU5fVVBEQVRFLCB3aGljaAorCSAqIHJlc3VsdGVkIGluIHNvbWUgcHJldHR5IG5hc3R5IGJ1 Z3MsIHRob3VnaCBvbmx5IHdoZW4gdXNpbmcKKwkgKiBodWdlLWd0dC1wYWdlcy4KKwkgKi8KKwor CWlmICghVVNFU19GVUxMXzQ4QklUX1BQR1RUKGRldl9wcml2KSkgeworCQlwcl9pbmZvKCI0OGIg UFBHVFQgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlm aXJzdCA9IGlsb2cyKEk5MTVfR1RUX1BBR0VfU0laRV82NEspOworCWxhc3QgPSBpbG9nMihJOTE1 X0dUVF9QQUdFX1NJWkVfMk0pOworCisJZm9yX2VhY2hfc2V0X2JpdF9mcm9tKGZpcnN0LCAmc3Vw cG9ydGVkLCBsYXN0ICsgMSkgeworCQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplID0gQklUKGZpcnN0 KTsKKworCQlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGRldl9wcml2LCBw YWdlX3NpemUpOworCQlpZiAoSVNfRVJSKG9iaikpCisJCQlyZXR1cm4gUFRSX0VSUihvYmopOwor CisJCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJ aWYgKElTX0VSUih2bWEpKSB7CisJCQllcnIgPSBQVFJfRVJSKHZtYSk7CisJCQlnb3RvIG91dF9w dXQ7CisJCX0KKworCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCBTWl8yTSwgMCwgZmxhZ3MpOwor CQlpZiAoZXJyKQorCQkJZ290byBvdXRfY2xvc2U7CisKKwkJaWYgKHZtYS0+cGFnZV9zaXplcy5z ZyA8IHBhZ2Vfc2l6ZSkgeworCQkJcHJfaW5mbygiVW5hYmxlIHRvIGFsbG9jYXRlIHBhZ2Utc2l6 ZSAleCwgZmluaXNoaW5nIHRlc3QgZWFybHlcbiIsCisJCQkJcGFnZV9zaXplKTsKKwkJCWdvdG8g b3V0X3VucGluOworCQl9CisKKwkJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKwkJ aWYgKGVycikKKwkJCWdvdG8gb3V0X3VucGluOworCisJCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuZ3R0 ICE9IHBhZ2Vfc2l6ZSkgeworCQkJZG1hX2FkZHJfdCBhZGRyID0gaTkxNV9nZW1fb2JqZWN0X2dl dF9kbWFfYWRkcmVzcyhvYmosIDApOworCisJCQkvKgorCQkJICogVGhlIG9ubHkgdmFsaWQgcmVh c29uIGZvciB0aGlzIHRvIGV2ZXIgZmFpbCB3b3VsZCBiZQorCQkJICogaWYgdGhlIGRtYS1tYXBw ZXIgc2NyZXdlZCB1cyBvdmVyIHdoZW4gd2UgZGlkIHRoZQorCQkJICogZG1hX21hcF9zZygpLCBz aW5jZSBpdCBoYXMgdGhlIGZpbmFsIHNheSBvdmVyIHRoZSBkbWEKKwkJCSAqIGFkZHJlc3MuCisJ CQkgKi8KKwkJCWlmIChJU19BTElHTkVEKGFkZHIsIHBhZ2Vfc2l6ZSkpIHsKKwkJCQlwcl9lcnIo InBhZ2Vfc2l6ZXMuZ3R0PSV1LCBleHBlY3RlZD0ldVxuIiwKKwkJCQkgICAgICAgdm1hLT5wYWdl X3NpemVzLmd0dCwgcGFnZV9zaXplKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJfSBlbHNlIHsK KwkJCQlwcl9pbmZvKCJkbWEgYWRkcmVzcyBtaXNhbGlnbmVkLCBmaW5pc2hpbmcgdGVzdCBlYXJs eVxuIik7CisJCQl9CisKKwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJZXJyID0gaTkxNV92 bWFfYmluZCh2bWEsIEk5MTVfQ0FDSEVfTk9ORSwgUElOX1VQREFURSk7CisJCWlmIChlcnIpCisJ CQlnb3RvIG91dF91bnBpbjsKKworCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQlpOTE1X3ZtYV9j bG9zZSh2bWEpOworCisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9CisKKwlvYmogPSBp OTE1X2dlbV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGRldl9wcml2LCBQQUdFX1NJWkUpOworCWlm IChJU19FUlIob2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCXZtYSA9IGk5MTVfdm1h X2luc3RhbmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsK KwkJZXJyID0gUFRSX0VSUih2bWEpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJZXJyID0gaTkx NV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3Nl OworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZW5kIHVwIHdpdGggc29tZXRoaW5nIGxp a2Ugd2hlcmUgdGhlIHBkZSBpcyBzdGlsbAorCSAqIHBvaW50aW5nIHRvIHRoZSAyTSBwYWdlLCBh bmQgdGhlIHB0IHdlIGp1c3QgZmlsbGVkLWluIGlzIGRhbmdsaW5nIC0tCisJICogd2UgY2FuIGNo ZWNrIHRoaXMgYnkgd3JpdGluZyB0byB0aGUgZmlyc3QgcGFnZSB3aGVyZSBpdCB3b3VsZCB0aGVu CisJICogbGFuZCBpbiB0aGUgbm93IHN0YWxlIDJNIHBhZ2UuCisJICovCisKKwllcnIgPSBncHVf d3JpdGUodm1hLCBkZXZfcHJpdi0+a2VybmVsX2NvbnRleHQsIGRldl9wcml2LT5lbmdpbmVbUkNT XSwKKwkJCTAsIDB4ZGVhZGJlYWYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucGluOworCisJ ZXJyID0gY3B1X2NoZWNrKG9iaiwgMCwgMHhkZWFkYmVhZik7CisKK291dF91bnBpbjoKKwlpOTE1 X3ZtYV91bnBpbih2bWEpOworb3V0X2Nsb3NlOgorCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CitvdXRf cHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0 YXRpYyBpbnQgaWd0X3RtcGZzX2ZhbGxiYWNrKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgdmZzbW91bnQgKmdlbWZzID0gaTkxNS0+ bW0uZ2VtZnM7CisJc3RydWN0IGk5MTVfZ2VtX2NvbnRleHQgKmN0eCA9IGk5MTUtPmtlcm5lbF9j b250ZXh0OworCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0gY3R4LT5wcGd0dCA/ICZj dHgtPnBwZ3R0LT5iYXNlIDogJmk5MTUtPmdndHQuYmFzZTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXUzMiAqdmFkZHI7CisJaW50 IGVyciA9IDA7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGJ1cnN0IGludG8g YSBiYWxsIG9mIGZsYW1lcyB1cG9uIGZhbGxpbmcgYmFjaworCSAqIHRvIHRtcGZzLCB3aGljaCB3 ZSByZWx5IG9uIGlmIG9uIHRoZSBvZmYtY2hhbmNlIHdlIGVuY291dGVyIGEgZmFpbHVyZQorCSAq IHdoZW4gc2V0dGluZyB1cCBnZW1mcy4KKwkgKi8KKworCWk5MTUtPm1tLmdlbWZzID0gTlVMTDsK KworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGUoaTkxNSwgUEFHRV9TSVpFKTsKKwlpZiAo SVNfRVJSKG9iaikpIHsKKwkJZXJyID0gUFRSX0VSUihvYmopOworCQlnb3RvIG91dF9yZXN0b3Jl OworCX0KKworCXZhZGRyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9tYXAob2JqLCBJOTE1X01BUF9X Qik7CisJaWYgKElTX0VSUih2YWRkcikpIHsKKwkJZXJyID0gUFRSX0VSUih2YWRkcik7CisJCWdv dG8gb3V0X3B1dDsKKwl9CisJKnZhZGRyID0gMHhkZWFkYmVhZjsKKworCWk5MTVfZ2VtX29iamVj dF91bnBpbl9tYXAob2JqKTsKKworCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgdm0sIE5V TEwpOworCWlmIChJU19FUlIodm1hKSkgeworCQllcnIgPSBQVFJfRVJSKHZtYSk7CisJCWdvdG8g b3V0X3B1dDsKKwl9CisKKwllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBQSU5fVVNFUik7 CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisKKwllcnIgPSBpZ3RfY2hlY2tfcGFnZV9z aXplcyh2bWEpOworCisJaTkxNV92bWFfdW5waW4odm1hKTsKK291dF9jbG9zZToKKwlpOTE1X3Zt YV9jbG9zZSh2bWEpOworb3V0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CitvdXRf cmVzdG9yZToKKwlpOTE1LT5tbS5nZW1mcyA9IGdlbWZzOworCisJcmV0dXJuIGVycjsKK30KKwor c3RhdGljIGludCBpZ3Rfc2hyaW5rX3RocCh2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1 X3ByaXZhdGUgKmk5MTUgPSBhcmc7CisJc3RydWN0IGk5MTVfZ2VtX2NvbnRleHQgKmN0eCA9IGk5 MTUtPmtlcm5lbF9jb250ZXh0OworCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3BhY2UgKnZtID0gY3R4 LT5wcGd0dCA/ICZjdHgtPnBwZ3R0LT5iYXNlIDogJmk5MTUtPmdndHQuYmFzZTsKKwlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXVuc2ln bmVkIGludCBmbGFncyA9IFBJTl9VU0VSOworCWludCBlcnI7CisKKwkvKgorCSAqIFNhbml0eSBj aGVjayBzaHJpbmtpbmcgaHVnZS1wYWdlZCBvYmplY3QgLS0gbWFrZSBzdXJlIG5vdGhpbmcgYmxv d3MKKwkgKiB1cC4KKwkgKi8KKworCWlmICghaWd0X2Nhbl9hbGxvY2F0ZV90aHAoaTkxNSkpIHsK KwkJcHJfaW5mbygibWlzc2luZyBUSFAgc3VwcG9ydCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4g MDsKKwl9CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlKGk5MTUsIFNaXzJNKTsKKwlp ZiAoSVNfRVJSKG9iaikpCisJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwl2bWEgPSBpOTE1X3Zt YV9pbnN0YW5jZShvYmosIHZtLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJZXJyID0g UFRSX0VSUih2bWEpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJZXJyID0gaTkxNV92bWFfcGlu KHZtYSwgMCwgMCwgZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJaWYg KG9iai0+bW0ucGFnZV9zaXplcy5waHlzIDwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSB7CisJCXBy X2luZm8oImZhaWxlZCB0byBhbGxvY2F0ZSBUSFAsIGZpbmlzaGluZyB0ZXN0IGVhcmx5XG4iKTsK KwkJZ290byBvdXRfdW5waW47CisJfQorCisJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1h KTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnBpbjsKKworCWVyciA9IGdwdV93cml0ZSh2bWEs IGk5MTUtPmtlcm5lbF9jb250ZXh0LCBpOTE1LT5lbmdpbmVbUkNTXSwgMCwKKwkJCTB4ZGVhZGJl YWYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucGluOworCisJaTkxNV92bWFfdW5waW4odm1h KTsKKworCS8qCisJICogTm93IHRoYXQgdGhlIHBhZ2VzIGFyZSAqdW5waW5uZWQqIHNocmluay1h bGwgc2hvdWxkIGludm9rZQorCSAqIHNobWVtIHRvIHRydW5jYXRlIG91ciBwYWdlcy4KKwkgKi8K KwlpOTE1X2dlbV9zaHJpbmtfYWxsKGk5MTUpOworCWlmICghSVNfRVJSX09SX05VTEwob2JqLT5t bS5wYWdlcykpIHsKKwkJcHJfZXJyKCJzaHJpbmstYWxsIGRpZG4ndCB0cnVuY2F0ZSB0aGUgcGFn ZXNcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwlpZiAo b2JqLT5tbS5wYWdlX3NpemVzLnNnIHx8IG9iai0+bW0ucGFnZV9zaXplcy5waHlzKSB7CisJCXBy X2VycigicmVzaWR1YWwgcGFnZS1zaXplIGJpdHMgbGVmdFxuIik7CisJCWVyciA9IC1FSU5WQUw7 CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAs IGZsYWdzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jbG9zZTsKKworCWVyciA9IGNwdV9jaGVj ayhvYmosIDAsIDB4ZGVhZGJlYWYpOworCitvdXRfdW5waW46CisJaTkxNV92bWFfdW5waW4odm1h KTsKK291dF9jbG9zZToKKwlpOTE1X3ZtYV9jbG9zZSh2bWEpOworb3V0X3B1dDoKKwlpOTE1X2dl bV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaTkxNV9nZW1faHVn ZV9wYWdlX21vY2tfc2VsZnRlc3RzKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpOTE1 X3N1YnRlc3QgdGVzdHNbXSA9IHsKKwkJU1VCVEVTVChpZ3RfbW9ja19leGhhdXN0X2RldmljZV9z dXBwb3J0ZWRfcGFnZXMpLAorCQlTVUJURVNUKGlndF9tb2NrX3BwZ3R0X21pc2FsaWduZWRfZG1h KSwKKwkJU1VCVEVTVChpZ3RfbW9ja19wcGd0dF9odWdlX2ZpbGwpLAorCQlTVUJURVNUKGlndF9t b2NrX3BwZ3R0XzY0SyksCisJfTsKKwlpbnQgc2F2ZWRfcHBndHQgPSBpOTE1X21vZHBhcmFtcy5l bmFibGVfcHBndHQ7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OworCXN0cnVj dCBwY2lfZGV2ICpwZGV2OworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dDsKKwlpbnQgZXJy OworCisJZGV2X3ByaXYgPSBtb2NrX2dlbV9kZXZpY2UoKTsKKwlpZiAoIWRldl9wcml2KQorCQly ZXR1cm4gLUVOT01FTTsKKworCS8qIFByZXRlbmQgdG8gYmUgYSBkZXZpY2Ugd2hpY2ggc3VwcG9y dHMgdGhlIDQ4YiBQUEdUVCAqLworCWk5MTVfbW9kcGFyYW1zLmVuYWJsZV9wcGd0dCA9IDM7CisK KwlwZGV2ID0gZGV2X3ByaXYtPmRybS5wZGV2OworCWRtYV9jb2VyY2VfbWFza19hbmRfY29oZXJl bnQoJnBkZXYtPmRldiwgRE1BX0JJVF9NQVNLKDM5KSk7CisKKwltdXRleF9sb2NrKCZkZXZfcHJp di0+ZHJtLnN0cnVjdF9tdXRleCk7CisJcHBndHQgPSBpOTE1X3BwZ3R0X2NyZWF0ZShkZXZfcHJp diwgRVJSX1BUUigtRU5PREVWKSwgIm1vY2siKTsKKwlpZiAoSVNfRVJSKHBwZ3R0KSkgeworCQll cnIgPSBQVFJfRVJSKHBwZ3R0KTsKKwkJZ290byBvdXRfdW5sb2NrOworCX0KKworCWlmICghaTkx NV92bV9pc180OGJpdCgmcHBndHQtPmJhc2UpKSB7CisJCXByX2VycigiZmFpbGVkIHRvIGNyZWF0 ZSA0OGIgUFBHVFRcbiIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbG9zZTsKKwl9 CisKKwkvKiBJZiB3ZSB3ZXJlIGV2ZXIgaGl0IHRoaXMgdGhlbiBpdCdzIHRpbWUgdG8gbW9jayB0 aGUgNjRLIHNjcmF0Y2ggKi8KKwlpZiAoIWk5MTVfdm1faGFzX3NjcmF0Y2hfNjRLKCZwcGd0dC0+ YmFzZSkpIHsKKwkJcHJfZXJyKCJQUEdUVCBtaXNzaW5nIDY0SyBzY3JhdGNoIHBhZ2VcbiIpOwor CQllcnIgPSAtRUlOVkFMOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwllcnIgPSBpOTE1X3N1 YnRlc3RzKHRlc3RzLCBwcGd0dCk7CisKK291dF9jbG9zZToKKwlpOTE1X3BwZ3R0X2Nsb3NlKCZw cGd0dC0+YmFzZSk7CisJaTkxNV9wcGd0dF9wdXQocHBndHQpOworCitvdXRfdW5sb2NrOgorCW11 dGV4X3VubG9jaygmZGV2X3ByaXYtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCisJaTkxNV9tb2RwYXJh bXMuZW5hYmxlX3BwZ3R0ID0gc2F2ZWRfcHBndHQ7CisKKwlkcm1fZGV2X3VucmVmKCZkZXZfcHJp di0+ZHJtKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBpOTE1X2dlbV9odWdlX3BhZ2VfbGl2 ZV9zZWxmdGVzdHMoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0YXRp YyBjb25zdCBzdHJ1Y3QgaTkxNV9zdWJ0ZXN0IHRlc3RzW10gPSB7CisJCVNVQlRFU1QoaWd0X3No cmlua190aHApLAorCQlTVUJURVNUKGlndF9wcGd0dF9waW5fdXBkYXRlKSwKKwkJU1VCVEVTVChp Z3RfdG1wZnNfZmFsbGJhY2spLAorCQlTVUJURVNUKGlndF9wcGd0dF9leGhhdXN0X2h1Z2UpLAor CQlTVUJURVNUKGlndF9wcGd0dF9nZW1mc19odWdlKSwKKwkJU1VCVEVTVChpZ3RfcHBndHRfaW50 ZXJuYWxfaHVnZSksCisJfTsKKwlpbnQgZXJyOworCisJaWYgKCFVU0VTX1BQR1RUKGRldl9wcml2 KSkgeworCQlwcl9pbmZvKCJQUEdUVCBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyBsaXZlLXNlbGZ0 ZXN0c1xuIik7CisJCXJldHVybiAwOworCX0KKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcm0u c3RydWN0X211dGV4KTsKKwllcnIgPSBpOTE1X3N1YnRlc3RzKHRlc3RzLCBkZXZfcHJpdik7CisJ bXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gZXJy OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2 ZV9zZWxmdGVzdHMuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVf c2VsZnRlc3RzLmgKaW5kZXggMThiMTc0ZDg1NWNhLi42NGFjZDdlY2NjNWMgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmgKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaApA QCAtMTUsNSArMTUsNiBAQCBzZWxmdGVzdChvYmplY3RzLCBpOTE1X2dlbV9vYmplY3RfbGl2ZV9z ZWxmdGVzdHMpCiBzZWxmdGVzdChkbWFidWYsIGk5MTVfZ2VtX2RtYWJ1Zl9saXZlX3NlbGZ0ZXN0 cykKIHNlbGZ0ZXN0KGNvaGVyZW5jeSwgaTkxNV9nZW1fY29oZXJlbmN5X2xpdmVfc2VsZnRlc3Rz KQogc2VsZnRlc3QoZ3R0LCBpOTE1X2dlbV9ndHRfbGl2ZV9zZWxmdGVzdHMpCitzZWxmdGVzdCho dWdlcGFnZXMsIGk5MTVfZ2VtX2h1Z2VfcGFnZV9saXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGNv bnRleHRzLCBpOTE1X2dlbV9jb250ZXh0X2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoaGFuZ2No ZWNrLCBpbnRlbF9oYW5nY2hlY2tfbGl2ZV9zZWxmdGVzdHMpCmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbW9ja19zZWxmdGVzdHMuaAppbmRleCBmYzc0Njg3 NTAxYmEuLjk5NjFiNDRmNzZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2Vs ZnRlc3RzL2k5MTVfbW9ja19zZWxmdGVzdHMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9z ZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oCkBAIC0yMSwzICsyMSw0IEBAIHNlbGZ0ZXN0 KGRtYWJ1ZiwgaTkxNV9nZW1fZG1hYnVmX21vY2tfc2VsZnRlc3RzKQogc2VsZnRlc3Qodm1hLCBp OTE1X3ZtYV9tb2NrX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGV2aWN0LCBpOTE1X2dlbV9ldmljdF9t b2NrX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGd0dCwgaTkxNV9nZW1fZ3R0X21vY2tfc2VsZnRlc3Rz KQorc2VsZnRlc3QoaHVnZXBhZ2VzLCBpOTE1X2dlbV9odWdlX3BhZ2VfbW9ja19zZWxmdGVzdHMp Ci0tIAoyLjEzLjUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdm eAo=