From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Auld Subject: [PATCH 18/23] drm/i915/selftests: huge page tests Date: Mon, 21 Aug 2017 19:34:58 +0100 Message-ID: <20170821183503.12246-19-matthew.auld@intel.com> References: <20170821183503.12246-1-matthew.auld@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9E7646E2C7 for ; Mon, 21 Aug 2017 18:35:41 +0000 (UTC) In-Reply-To: <20170821183503.12246-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 IGxpdmUtdGVzdHMgdGhyb3VnaCB0aGUgYXBwZ3R0CgpTaWduZWQtb2ZmLWJ5OiBNYXR0aGV3IEF1 bGQgPG1hdHRoZXcuYXVsZEBpbnRlbC5jb20+CkNjOiBKb29uYXMgTGFodGluZW4gPGpvb25hcy5s YWh0aW5lbkBsaW51eC5pbnRlbC5jb20+CkNjOiBDaHJpcyBXaWxzb24gPGNocmlzQGNocmlzLXdp bHNvbi5jby51az4KLS0tCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jICAgICAgICAg ICAgICAgICAgICB8ICAgIDEgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2Vf cGFnZXMuYyAgICAgICAgfCAxMzEwICsrKysrKysrKysrKysrKysrKysrCiAuLi4vZ3B1L2RybS9p OTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmggICB8ICAgIDEgKwogLi4uL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oICAgfCAgICAxICsKIDQgZmls ZXMgY2hhbmdlZCwgMTMxMyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYwoKZGlmZiAtLWdpdCBhL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2dl bS5jCmluZGV4IDEyYzM2NWM2OWVkZi4uZWIyYzhkOTdkNDQxIDEwMDY0NAotLS0gYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9pOTE1X2dlbS5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVf Z2VtLmMKQEAgLTU0NDMsNiArNTQ0Myw3IEBAIGludCBpOTE1X2dlbV9vYmplY3RfYXR0YWNoX3Bo eXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgaW50IGFsaWduKQogI2luY2x1ZGUg InNlbGZ0ZXN0cy9zY2F0dGVybGlzdC5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9tb2NrX2dlbV9k ZXZpY2UuYyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaHVnZV9nZW1fb2JqZWN0LmMiCisjaW5jbHVk ZSAic2VsZnRlc3RzL2h1Z2VfcGFnZXMuYyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1f b2JqZWN0LmMiCiAjaW5jbHVkZSAic2VsZnRlc3RzL2k5MTVfZ2VtX2NvaGVyZW5jeS5jIgogI2Vu ZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdl cy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmUzOWQwOWUxYjQyNAotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9odWdlX3BhZ2VzLmMKQEAg LTAsMCArMSwxMzEwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTcgSW50ZWwgQ29ycG9yYXRp b24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwg dG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBh c3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwKKyAqIHRvIGRl YWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0 IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBw dWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNlbGwgY29waWVzIG9m IHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlCisgKiBTb2Z0 d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25k aXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1p c3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFwaCkgc2hhbGwgYmUg aW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUKKyAq IFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRI T1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJ TkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwK KyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQu ICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMg QkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAqIExJQUJJTElUWSwg V0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklT SU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBP UiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdBUkUuCisgKgorICov CisKKyNpbmNsdWRlICIuLi9pOTE1X3NlbGZ0ZXN0LmgiCisKKyNpbmNsdWRlIDxsaW51eC9wcmlt ZV9udW1iZXJzLmg+CisKKyNpbmNsdWRlICJtb2NrX2RybS5oIgorCitzdGF0aWMgY29uc3QgdW5z aWduZWQgaW50IHBhZ2Vfc2l6ZXNbXSA9IHsKKwlJOTE1X0dUVF9QQUdFX1NJWkVfMUcsCisJSTkx NV9HVFRfUEFHRV9TSVpFXzJNLAorCUk5MTVfR1RUX1BBR0VfU0laRV82NEssCisJSTkxNV9HVFRf UEFHRV9TSVpFXzRLLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbGFyZ2VzdF9wYWdl X3NpemUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCisJCQkJCSAgc2l6ZV90IHJlbSkK K3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhZ2Vfc2l6ZXMpOyAr K2kpIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZXNbaV07CisKKwkJaWYg KEhBU19QQUdFX1NJWkUoaTkxNSwgcGFnZV9zaXplKSAmJiByZW0gPj0gcGFnZV9zaXplKQorCQkJ cmV0dXJuIHBhZ2Vfc2l6ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmYWtl X2dldF9odWdlX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisjZGVm aW5lIEdGUCAoR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpCisJc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOworCXNp emVfdCBtYXhfbGVuID0gcm91bmRkb3duX3Bvd19vZl90d28oVUlOVF9NQVgpOworCXN0cnVjdCBz Z190YWJsZSAqc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBpbnQgc2df bWFzayA9IDA7CisJc2l6ZV90IHJlbTsKKworCXN0ID0ga21hbGxvYyhzaXplb2YoKnN0KSwgR0ZQ KTsKKwlpZiAoIXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChzZ19hbGxvY190YWJsZShz dCwgb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVCwgR0ZQKSkgeworCQlrZnJlZShzdCk7CisJ CXJldHVybiAtRU5PTUVNOworCX0KKworCS8qIFVzZSBvcHRpbWFsIHBhZ2Ugc2l6ZWQgY2h1bmtz IHRvIGZpbGwgaW4gdGhlIHNnIHRhYmxlICovCisJcmVtID0gb2JqLT5iYXNlLnNpemU7CisJc2cg PSBzdC0+c2dsOworCXN0LT5uZW50cyA9IDA7CisJZG8geworCQl1bnNpZ25lZCBpbnQgcGFnZV9z aXplID0gZ2V0X2xhcmdlc3RfcGFnZV9zaXplKGk5MTUsIHJlbSk7CisJCXVuc2lnbmVkIGludCBs ZW4gPSBtaW4ocGFnZV9zaXplICogKHJlbSAvIHBhZ2Vfc2l6ZSksIG1heF9sZW4pOworCisJCUdF TV9CVUdfT04oIXBhZ2Vfc2l6ZSk7CisKKwkJc2ctPm9mZnNldCA9IDA7CisJCXNnLT5sZW5ndGgg PSBsZW47CisJCXNnX2RtYV9sZW4oc2cpID0gbGVuOworCQlzZ19kbWFfYWRkcmVzcyhzZykgPSBw YWdlX3NpemU7CisKKwkJc2dfbWFzayB8PSBsZW47CisKKwkJc3QtPm5lbnRzKys7CisKKwkJcmVt IC09IGxlbjsKKwkJaWYgKCFyZW0pIHsKKwkJCXNnX21hcmtfZW5kKHNnKTsKKwkJCWJyZWFrOwor CQl9CisKKwkJc2cgPSBzZ19uZXh0KHNnKTsKKwl9IHdoaWxlICgxKTsKKworCW9iai0+bW0ubWFk diA9IEk5MTVfTUFEVl9ET05UTkVFRDsKKworCV9faTkxNV9nZW1fb2JqZWN0X3NldF9wYWdlcyhv YmosIHN0LCBzZ19tYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZha2VfZ2V0 X2h1Z2VfcGFnZXNfc2luZ2xlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOwor CXN0cnVjdCBzZ190YWJsZSAqc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25l ZCBpbnQgcGFnZV9zaXplOworCisJc3QgPSBrbWFsbG9jKHNpemVvZigqc3QpLCBHRlApOworCWlm ICghc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHNnX2FsbG9jX3RhYmxlKHN0LCAxLCBH RlApKSB7CisJCWtmcmVlKHN0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2cgPSBzdC0+ c2dsOworCXN0LT5uZW50cyA9IDE7CisKKwlwYWdlX3NpemUgPSBnZXRfbGFyZ2VzdF9wYWdlX3Np emUoaTkxNSwgb2JqLT5iYXNlLnNpemUpOworCisJR0VNX0JVR19PTighcGFnZV9zaXplKTsKKwor CXNnLT5vZmZzZXQgPSAwOworCXNnLT5sZW5ndGggPSBvYmotPmJhc2Uuc2l6ZTsKKwlzZ19kbWFf bGVuKHNnKSA9IG9iai0+YmFzZS5zaXplOworCXNnX2RtYV9hZGRyZXNzKHNnKSA9IHBhZ2Vfc2l6 ZTsKKworCW9iai0+bW0ubWFkdiA9IEk5MTVfTUFEVl9ET05UTkVFRDsKKworCV9faTkxNV9nZW1f b2JqZWN0X3NldF9wYWdlcyhvYmosIHN0LCBzZy0+bGVuZ3RoKTsKKworCXJldHVybiAwOworI3Vu ZGVmIEdGUAorfQorCitzdGF0aWMgdm9pZCBmYWtlX2ZyZWVfaHVnZV9wYWdlcyhzdHJ1Y3QgZHJt X2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCSBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQorewor CXNnX2ZyZWVfdGFibGUocGFnZXMpOworCWtmcmVlKHBhZ2VzKTsKK30KKworc3RhdGljIHZvaWQg ZmFrZV9wdXRfaHVnZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJ CXN0cnVjdCBzZ190YWJsZSAqcGFnZXMpCit7CisJZmFrZV9mcmVlX2h1Z2VfcGFnZXMob2JqLCBw YWdlcyk7CisJb2JqLT5tbS5kaXJ0eSA9IGZhbHNlOworCW9iai0+bW0ubWFkdiA9IEk5MTVfTUFE Vl9XSUxMTkVFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 X29wcyBmYWtlX29wcyA9IHsKKwkuZmxhZ3MgPSBJOTE1X0dFTV9PQkpFQ1RfSVNfU0hSSU5LQUJM RSwKKwkuZ2V0X3BhZ2VzID0gZmFrZV9nZXRfaHVnZV9wYWdlcywKKwkucHV0X3BhZ2VzID0gZmFr ZV9wdXRfaHVnZV9wYWdlcywKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdF9vcHMgZmFrZV9vcHNfc2luZ2xlID0geworCS5mbGFncyA9IEk5MTVfR0VNX09CSkVD VF9JU19TSFJJTktBQkxFLAorCS5nZXRfcGFnZXMgPSBmYWtlX2dldF9odWdlX3BhZ2VzX3Npbmds ZSwKKwkucHV0X3BhZ2VzID0gZmFrZV9wdXRfaHVnZV9wYWdlcywKK307CisKK3N0YXRpYyBzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCitmYWtlX2h1Z2VfcGFnZXNfb2JqZWN0KHN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1LCB1NjQgc2l6ZSwgYm9vbCBzaW5nbGUpCit7CisJc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKworCUdFTV9CVUdfT04oIXNpemUpOworCUdFTV9C VUdfT04oIUlTX0FMSUdORUQoc2l6ZSwgSTkxNV9HVFRfUEFHRV9TSVpFKSk7CisKKwlpZiAoc2l6 ZSA+PiBQQUdFX1NISUZUID4gVUlOVF9NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CisK KwlpZiAob3ZlcmZsb3dzX3R5cGUoc2l6ZSwgb2JqLT5iYXNlLnNpemUpKQorCQlyZXR1cm4gRVJS X1BUUigtRTJCSUcpOworCisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2FsbG9jKGk5MTUpOworCWlm ICghb2JqKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWRybV9nZW1fcHJpdmF0ZV9v YmplY3RfaW5pdCgmaTkxNS0+ZHJtLCAmb2JqLT5iYXNlLCBzaXplKTsKKworCWlmIChzaW5nbGUp CisJCWk5MTVfZ2VtX29iamVjdF9pbml0KG9iaiwgJmZha2Vfb3BzX3NpbmdsZSk7CisJZWxzZQor CQlpOTE1X2dlbV9vYmplY3RfaW5pdChvYmosICZmYWtlX29wcyk7CisKKwlvYmotPmJhc2Uud3Jp dGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvYmotPmJhc2UucmVhZF9kb21haW5z ID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvYmotPmNhY2hlX2xldmVsID0gSTkxNV9DQUNIRV9O T05FOworCisJcmV0dXJuIG9iajsKK30KKworc3RhdGljIGludCBpZ3RfbW9ja19leGhhdXN0X2Rl dmljZV9zdXBwb3J0ZWRfcGFnZXModm9pZCAqYXJnKQoreworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0 ICpwcGd0dCA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHBwZ3R0LT5i YXNlLmk5MTU7CisJdW5zaWduZWQgaW50IHNhdmVkX21hc2sgPSBJTlRFTF9JTkZPKGk5MTUpLT5w YWdlX3NpemVfbWFzazsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWludCBp LCBqLCBzaW5nbGU7CisJaW50IGVycjsKKworCS8qIFNhbml0eSBjaGVjayBjcmVhdGluZyBvYmpl Y3RzIHdpdGggZXZlcnkgdmFsaWQgcGFnZSBzdXBwb3J0CisJICogY29tYmluYXRpb24gZm9yIG91 ciBtb2NrIGRldmljZS4KKwkgKi8KKworCWZvciAoaSA9IDE7IGkgPCBCSVQoQVJSQVlfU0laRShw YWdlX3NpemVzKSk7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgY29tYmluYXRpb24gPSAwOworCQlz dHJ1Y3QgaTkxNV92bWEgKnZtYTsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShwYWdl X3NpemVzKTsgaisrKSB7CisJCQlpZiAoaSAmIEJJVChqKSkKKwkJCQljb21iaW5hdGlvbiB8PSBw YWdlX3NpemVzW2pdOworCQl9CisKKwkJbWt3cml0ZV9kZXZpY2VfaW5mbyhpOTE1KS0+cGFnZV9z aXplX21hc2sgPSBjb21iaW5hdGlvbjsKKworCQlmb3IgKHNpbmdsZSA9IDA7IHNpbmdsZSA8PSAx OyArK3NpbmdsZSkgeworCQkJb2JqID0gZmFrZV9odWdlX3BhZ2VzX29iamVjdChpOTE1LCBjb21i aW5hdGlvbiwgISFzaW5nbGUpOworCQkJaWYgKElTX0VSUihvYmopKSB7CisJCQkJZXJyID0gUFRS X0VSUihvYmopOworCQkJCWdvdG8gb3V0X2RldmljZTsKKwkJCX0KKworCQkJR0VNX0JVR19PTihv YmotPmJhc2Uuc2l6ZSAhPSBjb21iaW5hdGlvbik7CisKKwkJCWVyciA9IGk5MTVfZ2VtX29iamVj dF9waW5fcGFnZXMob2JqKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfcHV0OworCisJCQlH RU1fQlVHX09OKG9iai0+bW0ucGFnZV9zaXplcy5zZyAhPSBjb21iaW5hdGlvbik7CisKKwkJCXZt YSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJCWlmIChJ U19FUlIodm1hKSkgeworCQkJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJCQlnb3RvIG91dF91bnBp bjsKKwkJCX0KKworCQkJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgUElOX1VTRVIpOwor CQkJaWYgKGVycikgeworCQkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQkJZ290byBvdXRfdW5w aW47CisJCQl9CisKKwkJCUdFTV9CVUdfT04ob2JqLT5tbS5wYWdlX3NpemVzLmd0dCk7CisJCQlH RU1fQlVHX09OKCF2bWEtPnBhZ2Vfc2l6ZXMuc2cpOworCQkJR0VNX0JVR19PTighdm1hLT5wYWdl X3NpemVzLnBoeXMpOworCisJCQlHRU1fQlVHX09OKHZtYS0+cGFnZV9zaXplcy5ndHQgJiB+Y29t YmluYXRpb24pOworCisJCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQkJaTkxNV92bWFfY2xvc2Uo dm1hKTsKKworCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCQlpOTE1X2dl bV9vYmplY3RfcHV0KG9iaik7CisJCX0KKwl9CisKKwlnb3RvIG91dF9kZXZpY2U7CisKK291dF91 bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKK291dF9wdXQ6CisJaTkx NV9nZW1fb2JqZWN0X3B1dChvYmopOworb3V0X2RldmljZToKKwlta3dyaXRlX2RldmljZV9pbmZv KGk5MTUpLT5wYWdlX3NpemVfbWFzayA9IHNhdmVkX21hc2s7CisKKwlyZXR1cm4gZXJyOworfQor CitzdGF0aWMgaW50IGlndF9tb2NrX3BwZ3R0X21pc2FsaWduZWRfZG1hKHZvaWQgKmFyZykKK3sK KwlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmk5MTUgPSBwcGd0dC0+YmFzZS5pOTE1OworCXVuc2lnbmVkIGxvbmcgc3VwcG9ydGVk ID0gSU5URUxfSU5GTyhpOTE1KS0+cGFnZV9zaXplX21hc2s7CisJc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iajsKKwlpbnQgYml0OworCWludCBlcnI7CisKKwkvKiBTYW5pdHkgY2hlY2sg ZG1hIG1pc2FsaWdubWVudCBmb3IgaHVnZSBwYWdlcyAtLSB0aGUgZG1hIGFkZHJlc3NlcyB3ZQor CSAqIGluc2VydCBpbnRvIHRoZSBwYWdpbmcgc3RydWN0dXJlcyBuZWVkIHRvIGFsd2F5cyByZXNw ZWN0IHRoZSBwYWdlCisJICogc2l6ZSBhbGlnbm1lbnQuCisJICovCisKKwliaXQgPSBpbG9nMihJ OTE1X0dUVF9QQUdFX1NJWkVfNjRLKTsKKworCWZvcl9lYWNoX3NldF9iaXRfZnJvbShiaXQsICZz dXBwb3J0ZWQsIEJJVFNfUEVSX0xPTkcpIHsKKwkJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOworCQl1 bnNpZ25lZCBpbnQgcGFnZV9zaXplID0gQklUKGJpdCk7CisJCXVuc2lnbmVkIGludCBmbGFncyA9 IFBJTl9VU0VSIHwgUElOX09GRlNFVF9GSVhFRDsKKwkJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJ CXVuc2lnbmVkIGludCBvZmZzZXQ7CisJCXVuc2lnbmVkIGludCBzaXplID0KKwkJCXJvdW5kX3Vw KHBhZ2Vfc2l6ZSwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSA8PCAxOworCisJCW9iaiA9IGZha2Vf aHVnZV9wYWdlc19vYmplY3QoaTkxNSwgc2l6ZSwgdHJ1ZSk7CisJCWlmIChJU19FUlIob2JqKSkK KwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJR0VNX0JVR19PTihvYmotPmJhc2Uuc2l6ZSAh PSBzaXplKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJCWlm IChlcnIpCisJCQlnb3RvIG91dF9wdXQ7CisKKwkJR0VNX0JVR19PTighKG9iai0+bW0ucGFnZV9z aXplcy5zZyAmIHBhZ2Vfc2l6ZSkpOworCisJCS8qIEZvcmNlIHRoZSBwYWdlIHNpemUgZm9yIHRo aXMgb2JqZWN0ICovCisJCW9iai0+bW0ucGFnZV9zaXplcy5zZyA9IHBhZ2Vfc2l6ZTsKKworCQl2 bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCWlmIChJ U19FUlIodm1hKSkgeworCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJZ290byBvdXRfdW5waW47 CisJCX0KKworCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFncyk7CisJCWlmIChl cnIpIHsKKwkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQor CisJCUdFTV9CVUdfT04odm1hLT5wYWdlX3NpemVzLmd0dCAhPSBwYWdlX3NpemUpOworCisJCWk5 MTVfdm1hX3VucGluKHZtYSk7CisJCWVyciA9IGk5MTVfdm1hX3VuYmluZCh2bWEpOworCQlpZiAo ZXJyKSB7CisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJZ290byBvdXRfdW5waW47CisJCX0K KworCQkvKiBUcnkgYWxsIHRoZSBvdGhlciB2YWxpZCBvZmZzZXRzIHVudGlsIHRoZSBuZXh0CisJ CSAqIGJvdW5kYXJ5IC0tIHNob3VsZCBhbHdheXMgZmFsbCBiYWNrIHRvIHVzaW5nIDRLCisJCSAq IHBhZ2VzLgorCQkgKi8KKwkJZm9yIChvZmZzZXQgPSA0MDk2OyBvZmZzZXQgPCBwYWdlX3NpemU7 IG9mZnNldCArPSA0MDk2KSB7CisJCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFn cyB8IG9mZnNldCk7CisJCQlpZiAoZXJyKSB7CisJCQkJaTkxNV92bWFfY2xvc2Uodm1hKTsKKwkJ CQlnb3RvIG91dF91bnBpbjsKKwkJCX0KKworCQkJR0VNX0JVR19PTih2bWEtPnBhZ2Vfc2l6ZXMu Z3R0ICE9CisJCQkJICAgSTkxNV9HVFRfUEFHRV9TSVpFXzRLKTsKKworCQkJaTkxNV92bWFfdW5w aW4odm1hKTsKKwkJCWVyciA9IGk5MTVfdm1hX3VuYmluZCh2bWEpOworCQkJaWYgKGVycikgewor CQkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQkJZ290byBvdXRfdW5waW47CisJCQl9CisKKwkJ CWlmIChpZ3RfdGltZW91dChlbmRfdGltZSwKKwkJCQkJIiVzIHRpbWVkIG91dCBhdCBvZmZzZXQg JXggd2l0aCBwYWdlLXNpemUgJXhcbiIsCisJCQkJCV9fZnVuY19fLCBvZmZzZXQsIHBhZ2Vfc2l6 ZSkpCisJCQkJYnJlYWs7CisJCX0KKworCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCisJCWk5MTVf Z2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7 CisJfQorCisJcmV0dXJuIDA7CisKK291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5f cGFnZXMob2JqKTsKK291dF9wdXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJcmV0 dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgY2xvc2Vfb2JqZWN0X2xpc3Qoc3RydWN0IGxpc3Rf aGVhZCAqb2JqZWN0cywKKwkJCSAgICAgIHN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCkKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqb247CisKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5X3NhZmUob2JqLCBvbiwgb2JqZWN0cywgc3RfbGluaykgeworCQlzdHJ1Y3QgaTkxNV92 bWEgKnZtYTsKKworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwg TlVMTCk7CisJCWlmICghSVNfRVJSKHZtYSkpCisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCisJ CWxpc3RfZGVsKCZvYmotPnN0X2xpbmspOworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMo b2JqKTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KK30KKworc3RhdGljIGludCBp Z3RfbW9ja19wcGd0dF9odWdlX2ZpbGwodm9pZCAqYXJnKQoreworCXN0cnVjdCBpOTE1X2h3X3Bw Z3R0ICpwcGd0dCA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHBwZ3R0 LT5iYXNlLmk5MTU7CisJdW5zaWduZWQgbG9uZyBtYXhfcGFnZXMgPSBwcGd0dC0+YmFzZS50b3Rh bCA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgcGFnZV9udW07CisJYm9vbCBzaW5nbGUg PSBmYWxzZTsKKwlMSVNUX0hFQUQob2JqZWN0cyk7CisJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOwor CWludCBlcnI7CisKKwlmb3JfZWFjaF9wcmltZV9udW1iZXJfZnJvbShwYWdlX251bSwgMSwgbWF4 X3BhZ2VzKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJCXNpemVfdCBz aXplID0gcGFnZV9udW0gPDwgUEFHRV9TSElGVDsKKwkJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJ CXVuc2lnbmVkIGludCBleHBlY3RlZF9ndHQgPSAwOworCQlpbnQgaTsKKworCQlvYmogPSBmYWtl X2h1Z2VfcGFnZXNfb2JqZWN0KGk5MTUsIHNpemUsIHNpbmdsZSk7CisJCWlmIChJU19FUlIob2Jq KSkgeworCQkJZXJyID0gUFRSX0VSUihvYmopOworCQkJYnJlYWs7CisJCX0KKworCQlHRU1fQlVH X09OKG9iai0+YmFzZS5zaXplICE9IHNpemUpOworCisJCWVyciA9IGk5MTVfZ2VtX29iamVjdF9w aW5fcGFnZXMob2JqKTsKKwkJaWYgKGVycikgeworCQkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCQkJYnJlYWs7CisJCX0KKworCQlsaXN0X2FkZCgmb2JqLT5zdF9saW5rLCAmb2JqZWN0cyk7 CisKKwkJR0VNX0JVR19PTighb2JqLT5tbS5wYWdlX3NpemVzLnNnKTsKKworCQl2bWEgPSBpOTE1 X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCWlmIChJU19FUlIodm1h KSkgeworCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJYnJlYWs7CisJCX0KKworCQllcnIgPSBp OTE1X3ZtYV9waW4odm1hLCAwLCAwLCBQSU5fVVNFUik7CisJCWlmIChlcnIpCisJCQlicmVhazsK KworCQlHRU1fQlVHX09OKG9iai0+bW0ucGFnZV9zaXplcy5ndHQpOworCQlHRU1fQlVHX09OKCF2 bWEtPnBhZ2Vfc2l6ZXMuc2cpOworCQlHRU1fQlVHX09OKCF2bWEtPnBhZ2Vfc2l6ZXMucGh5cyk7 CisKKwkJLyogRmlndXJlIG91dCB0aGUgZXhwZWN0ZWQgZ3R0IHBhZ2Ugc2l6ZSBrbm93aW5nIHRo YXQgd2UgZ28gZnJvbQorCQkgKiBsYXJnZXN0IHRvIHNtYWxsZXN0IHBhZ2Ugc2l6ZSBzZyBjaHVu a3MsIGFuZCB0aGF0IHdlIGFsaWduIHRvCisJCSAqIHRoZSBsYXJnZXN0IHBhZ2Ugc2l6ZS4KKwkJ ICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhZ2Vfc2l6ZXMpOyArK2kpIHsKKwkJ CXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBwYWdlX3NpemVzW2ldOworCisJCQlpZiAoSEFTX1BB R0VfU0laRShpOTE1LCBwYWdlX3NpemUpICYmCisJCQkgICAgc2l6ZSA+PSBwYWdlX3NpemUpIHsK KwkJCQlleHBlY3RlZF9ndHQgfD0gcGFnZV9zaXplOworCQkJCXNpemUgJj0gcGFnZV9zaXplLTE7 CisJCQl9CisJCX0KKworCQlHRU1fQlVHX09OKCFleHBlY3RlZF9ndHQpOworCQlHRU1fQlVHX09O KHNpemUpOworCisJCWlmIChleHBlY3RlZF9ndHQgJiBJOTE1X0dUVF9QQUdFX1NJWkVfNEspCisJ CQlleHBlY3RlZF9ndHQgJj0gfkk5MTVfR1RUX1BBR0VfU0laRV82NEs7CisKKwkJaWYgKHZtYS0+ cGFnZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV82NEspIHsKKwkJCUdFTV9CVUdfT04o IUlTX0FMSUdORUQodm1hLT5ub2RlLnN0YXJ0LAorCQkJCQkgICAgICAgSTkxNV9HVFRfUEFHRV9T SVpFXzJNKSk7CisJCQlHRU1fQlVHX09OKCFJU19BTElHTkVEKHZtYS0+bm9kZS5zaXplLAorCQkJ CQkgICAgICAgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSk7CisJCX0KKworCQlpOTE1X3ZtYV91bnBp bih2bWEpOworCisJCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9IGV4cGVjdGVkX2d0dCkgewor CQkJcHJfZXJyKCJndHQ9JXUsIGV4cGVjdGVkPSV1LCBzaXplPSV6ZCwgc2luZ2xlPSVzXG4iLAor CQkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5ndHQsIGV4cGVjdGVkX2d0dCwKKwkJCSAgICAgICBv YmotPmJhc2Uuc2l6ZSwgeWVzbm8oISFzaW5nbGUpKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQli cmVhazsKKwkJfQorCisJCWlmIChpZ3RfdGltZW91dChlbmRfdGltZSwKKwkJCQkiJXMgdGltZWQg b3V0IGF0IHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCBvYmotPmJhc2Uuc2l6ZSkpCisJCQli cmVhazsKKworCQlzaW5nbGUgPSAhc2luZ2xlOworCX0KKworCWNsb3NlX29iamVjdF9saXN0KCZv YmplY3RzLCBwcGd0dCk7CisKKwlpZiAoZXJyID09IC1FTk9NRU0gfHwgZXJyID09IC1FTk9TUEMp CisJCWVyciA9IDA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF9tb2NrX3Bw Z3R0XzY0Syh2b2lkICphcmcpCit7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0ID0gYXJn OworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gcHBndHQtPmJhc2UuaTkxNTsKKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWNvbnN0IHN0cnVjdCBvYmplY3RfaW5m byB7CisJCXVuc2lnbmVkIGludCBzaXplOworCQl1bnNpZ25lZCBpbnQgZ3R0OworCQl1bnNpZ25l ZCBpbnQgb2Zmc2V0OworCX0gb2JqZWN0c1tdID0geworCQkvKiBDYXNlcyB3aXRoIGZvcmNlZCBw YWRkaW5nL2FsaWdubWVudCAqLworCQl7CisJCQkuc2l6ZSA9IFNaXzY0SywKKwkJCS5ndHQgPSBJ OTE1X0dUVF9QQUdFX1NJWkVfNjRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5z aXplID0gU1pfNjRLICsgU1pfNEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAor CQkJLm9mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfNjRLIC0gU1pfNEssCisJ CQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJ CXsKKwkJCS5zaXplID0gU1pfMk0sCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SywK KwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzJNIC0gU1pfNEssCisJ CQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJ CXsKKwkJCS5zaXplID0gU1pfMk0gKyBTWl80SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJ WkVfNjRLIHwgSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJ CXsKKwkJCS5zaXplID0gU1pfMk0gKyBTWl82NEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9T SVpFXzY0SywKKwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzJNIC0g U1pfNjRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEssCisJCQkub2Zmc2V0ID0g MCwKKwkJfSwKKwkJLyogVHJ5IHdpdGhvdXQgYW55IGZvcmNlZCBwYWRkaW5nL2FsaWdubWVudCAq LworCQl7CisJCQkuc2l6ZSA9IFNaXzY0SywKKwkJCS5vZmZzZXQgPSBTWl8yTSwKKwkJCS5ndHQg PSBJOTE1X0dUVF9QQUdFX1NJWkVfNEssCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfMTI4SywK KwkJCS5vZmZzZXQgPSBTWl8yTSAtIFNaXzY0SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJ WkVfNEssCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwlpbnQgaSwgc2luZ2xl OworCWludCBlcnI7CisKKwkvKiBTYW5pdHkgY2hlY2sgc29tZSBvZiB0aGUgdHJpY2tpbmVzcyB3 aXRoIDY0SyBwYWdlcyAtLSBlaXRoZXIgd2UgY2FuCisJICogc2FmZWx5IG1hcmsgdGhlIHdob2xl IHBhZ2UtdGFibGUoMk0gYmxvY2spIGFzIDY0Sywgb3Igd2UgaGF2ZSB0bworCSAqIGFsd2F5cyBm YWxsYmFjayB0byA0Sy4KKwkgKi8KKworCWlmICghSEFTX1BBR0VfU0laRShpOTE1LCBJOTE1X0dU VF9QQUdFX1NJWkVfNjRLKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRShvYmplY3RzKTsgKytpKSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gb2JqZWN0c1tpXS5z aXplOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZ3R0ID0gb2JqZWN0c1tpXS5ndHQ7CisJCXVu c2lnbmVkIGludCBvZmZzZXQgPSBvYmplY3RzW2ldLm9mZnNldDsKKwkJdW5zaWduZWQgaW50IGZs YWdzID0gUElOX1VTRVI7CisKKwkJZm9yIChzaW5nbGUgPSAwOyBzaW5nbGUgPD0gMTsgc2luZ2xl KyspIHsKKwkJCW9iaiA9IGZha2VfaHVnZV9wYWdlc19vYmplY3QoaTkxNSwgc2l6ZSwgISFzaW5n bGUpOworCQkJaWYgKElTX0VSUihvYmopKQorCQkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJ CWVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKKwkJCWlmIChlcnIpCisJCQkJ Z290byBvdXRfcHV0OworCisJCQlHRU1fQlVHX09OKCFvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cpOwor CisJCQkvKiBEaXNhYmxlIDJNIHBhZ2VzIC0tIFdlIG9ubHkgd2FudCB0byB1c2UgNjRLLzRLIHBh Z2VzCisJCQkgKiBmb3IgdGhpcyB0ZXN0LgorCQkJICovCisJCQlvYmotPm1tLnBhZ2Vfc2l6ZXMu c2cgJj0gfkk5MTVfR1RUX1BBR0VfU0laRV8yTTsKKworCQkJdm1hID0gaTkxNV92bWFfaW5zdGFu Y2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQkJaWYgKElTX0VSUih2bWEpKSB7CisJCQkJ ZXJyID0gUFRSX0VSUih2bWEpOworCQkJCWdvdG8gb3V0X3VucGluOworCQkJfQorCisJCQlpZiAo b2Zmc2V0KQorCQkJCWZsYWdzIHw9IFBJTl9PRkZTRVRfRklYRUQgfCBvZmZzZXQ7CisKKwkJCWVy ciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIGZsYWdzKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlp OTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJCWdvdG8gb3V0X3VucGluOworCQkJfQorCisJCQlHRU1f QlVHX09OKG9iai0+bW0ucGFnZV9zaXplcy5ndHQpOworCQkJR0VNX0JVR19PTighdm1hLT5wYWdl X3NpemVzLnNnKTsKKwkJCUdFTV9CVUdfT04oIXZtYS0+cGFnZV9zaXplcy5waHlzKTsKKworCQkJ aWYgKCFvZmZzZXQgJiYgdm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9HVFRfUEFHRV9TSVpFXzY0 SykgeworCQkJCUdFTV9CVUdfT04oIUlTX0FMSUdORUQodm1hLT5ub2RlLnN0YXJ0LAorCQkJCQkJ CUk5MTVfR1RUX1BBR0VfU0laRV8yTSkpOworCQkJCUdFTV9CVUdfT04oIUlTX0FMSUdORUQodm1h LT5ub2RlLnNpemUsCisJCQkJCQkJSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSk7CisJCQl9CisKKwkJ CWlmICh2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9IGV4cGVjdGVkX2d0dCkgeworCQkJCXByX2Vycigi Z3R0PSV1LCBleHBlY3RlZD0ldSwgaT0lZCwgc2luZ2xlPSVzXG4iLAorCQkJCSAgICAgICB2bWEt PnBhZ2Vfc2l6ZXMuZ3R0LCBleHBlY3RlZF9ndHQsIGksCisJCQkJICAgICAgIHllc25vKCEhc2lu Z2xlKSk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91dF92bWE7CisJCQl9CisKKwkJ CWk5MTVfdm1hX3VucGluKHZtYSk7CisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCisJCQlpOTE1 X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJCWk5MTVfZ2VtX29iamVjdF9wdXQob2Jq KTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitvdXRfdm1hOgorCWk5MTVfdm1hX3VucGluKHZt YSk7CisJaTkxNV92bWFfY2xvc2Uodm1hKTsKK291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3Rf dW5waW5fcGFnZXMob2JqKTsKK291dF9wdXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwor CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBpOTE1X3ZtYSAqCitncHVfd3JpdGVf ZHcoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBvZmZzZXQsIHUzMiB2YWwpCit7CisJc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KHZtYS0+b2JqLT5iYXNlLmRldik7CisJ Y29uc3QgaW50IGdlbiA9IElOVEVMX0dFTih2bWEtPnZtLT5pOTE1KTsKKwl1bnNpZ25lZCBpbnQg Y291bnQgPSB2bWEtPnNpemUgPj4gUEFHRV9TSElGVDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqb2JqOworCXN0cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7CisJdW5zaWduZWQgaW50IHNpemU7 CisJdTMyICpjbWQ7CisJaW50IG47CisJaW50IGVycjsKKworCXNpemUgPSAxICsgNCAqIGNvdW50 ICogc2l6ZW9mKHUzMik7CisJc2l6ZSA9IHJvdW5kX3VwKHNpemUsIFBBR0VfU0laRSk7CisJb2Jq ID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBzaXplKTsKKwlpZiAoSVNf RVJSKG9iaikpCisJCXJldHVybiBFUlJfQ0FTVChvYmopOworCisJY21kID0gaTkxNV9nZW1fb2Jq ZWN0X3Bpbl9tYXAob2JqLCBJOTE1X01BUF9XQik7CisJaWYgKElTX0VSUihjbWQpKSB7CisJCWVy ciA9IFBUUl9FUlIoY21kKTsKKwkJZ290byBlcnI7CisJfQorCisJb2Zmc2V0ICs9IHZtYS0+bm9k ZS5zdGFydDsKKworCWZvciAobiA9IDA7IG4gPCBjb3VudDsgbisrKSB7CisJCWlmIChnZW4gPj0g OCkgeworCQkJKmNtZCsrID0gTUlfU1RPUkVfRFdPUkRfSU1NX0dFTjQ7CisJCQkqY21kKysgPSBs b3dlcl8zMl9iaXRzKG9mZnNldCk7CisJCQkqY21kKysgPSB1cHBlcl8zMl9iaXRzKG9mZnNldCk7 CisJCQkqY21kKysgPSB2YWw7CisJCX0gZWxzZSBpZiAoZ2VuID49IDQpIHsKKwkJCSpjbWQrKyA9 IE1JX1NUT1JFX0RXT1JEX0lNTV9HRU40IHwKKwkJCQkoZ2VuIDwgNiA/IDEgPDwgMjIgOiAwKTsK KwkJCSpjbWQrKyA9IDA7CisJCQkqY21kKysgPSBvZmZzZXQ7CisJCQkqY21kKysgPSB2YWw7CisJ CX0gZWxzZSB7CisJCQkqY21kKysgPSBNSV9TVE9SRV9EV09SRF9JTU0gfCAxIDw8IDIyOworCQkJ KmNtZCsrID0gb2Zmc2V0OworCQkJKmNtZCsrID0gdmFsOworCQl9CisKKwkJb2Zmc2V0ICs9IFBB R0VfU0laRTsKKwl9CisKKwkqY21kID0gTUlfQkFUQ0hfQlVGRkVSX0VORDsKKworCWk5MTVfZ2Vt X29iamVjdF91bnBpbl9tYXAob2JqKTsKKworCWVyciA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9f Z3R0X2RvbWFpbihvYmosIGZhbHNlKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycjsKKworCWJhdGNo ID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCB2bWEtPnZtLCBOVUxMKTsKKwlpZiAoSVNfRVJSKGJh dGNoKSkgeworCQllcnIgPSBQVFJfRVJSKGJhdGNoKTsKKwkJZ290byBlcnI7CisJfQorCisJZXJy ID0gaTkxNV92bWFfcGluKGJhdGNoLCAwLCAwLCBQSU5fVVNFUik7CisJaWYgKGVycikKKwkJZ290 byBlcnI7CisKKwlyZXR1cm4gYmF0Y2g7CisKK2VycjoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9i aik7CisKKwlyZXR1cm4gRVJSX1BUUihlcnIpOworfQorCitzdGF0aWMgaW50IGdwdV93cml0ZShz dHJ1Y3QgaTkxNV92bWEgKnZtYSwKKwkJICAgICBzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4 LAorCQkgICAgIHUzMiBkd29yZCwKKwkJICAgICB1MzIgdmFsdWUpCit7CisJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KHZtYS0+b2JqLT5iYXNlLmRldik7CisJc3RydWN0 IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpycTsKKwlzdHJ1Y3QgaTkxNV92bWEgKmJhdGNoOworCWlu dCBmbGFncyA9IDA7CisJaW50IGVycjsKKworCUdFTV9CVUdfT04oIWludGVsX2VuZ2luZV9jYW5f c3RvcmVfZHdvcmQoaTkxNS0+ZW5naW5lW1JDU10pKTsKKworCWVyciA9IGk5MTVfZ2VtX29iamVj dF9zZXRfdG9fZ3R0X2RvbWFpbih2bWEtPm9iaiwgdHJ1ZSk7CisJaWYgKGVycikKKwkJcmV0dXJu IGVycjsKKworCXJxID0gaTkxNV9nZW1fcmVxdWVzdF9hbGxvYyhpOTE1LT5lbmdpbmVbUkNTXSwg Y3R4KTsKKwlpZiAoSVNfRVJSKHJxKSkKKwkJcmV0dXJuIFBUUl9FUlIocnEpOworCisJYmF0Y2gg PSBncHVfd3JpdGVfZHcodm1hLCBkd29yZCAqIHNpemVvZih1MzIpLCB2YWx1ZSk7CisJaWYgKElT X0VSUihiYXRjaCkpIHsKKwkJZXJyID0gUFRSX0VSUihiYXRjaCk7CisJCWdvdG8gZXJyX3JlcXVl c3Q7CisJfQorCisJaTkxNV92bWFfbW92ZV90b19hY3RpdmUoYmF0Y2gsIHJxLCAwKTsKKwlpOTE1 X2dlbV9vYmplY3Rfc2V0X2FjdGl2ZV9yZWZlcmVuY2UoYmF0Y2gtPm9iaik7CisJaTkxNV92bWFf dW5waW4oYmF0Y2gpOworCWk5MTVfdm1hX2Nsb3NlKGJhdGNoKTsKKworCWVyciA9IHJxLT5lbmdp bmUtPmVtaXRfZmx1c2gocnEsIEVNSVRfSU5WQUxJREFURSk7CisJaWYgKGVycikKKwkJZ290byBl cnJfcmVxdWVzdDsKKworCWVyciA9IGk5MTVfc3dpdGNoX2NvbnRleHQocnEpOworCWlmIChlcnIp CisJCWdvdG8gZXJyX3JlcXVlc3Q7CisKKwllcnIgPSBycS0+ZW5naW5lLT5lbWl0X2JiX3N0YXJ0 KHJxLAorCQkJYmF0Y2gtPm5vZGUuc3RhcnQsIGJhdGNoLT5ub2RlLnNpemUsCisJCQlmbGFncyk7 CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVxdWVzdDsKKworCWk5MTVfdm1hX21vdmVfdG9fYWN0 aXZlKHZtYSwgcnEsIDApOworCisJcmVzZXJ2YXRpb25fb2JqZWN0X2xvY2sodm1hLT5yZXN2LCBO VUxMKTsKKwlyZXNlcnZhdGlvbl9vYmplY3RfYWRkX2V4Y2xfZmVuY2Uodm1hLT5yZXN2LCAmcnEt PmZlbmNlKTsKKwlyZXNlcnZhdGlvbl9vYmplY3RfdW5sb2NrKHZtYS0+cmVzdik7CisKK2Vycl9y ZXF1ZXN0OgorCV9faTkxNV9hZGRfcmVxdWVzdChycSwgZXJyID09IDApOworCisJcmV0dXJuIGVy cjsKK30KKworc3RhdGljIGludCB1bm1hcF9tYXBwaW5nKHN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmopCit7CisJdm9pZCAqcHRyOworCWludCBlcnI7CisKKwllcnIgPSBtdXRleF9sb2Nr X2ludGVycnVwdGlibGUoJm9iai0+bW0ubG9jayk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsK KworCXB0ciA9IHBhZ2VfbWFza19iaXRzKG9iai0+bW0ubWFwcGluZyk7CisJaWYgKHB0cikgewor CQlpZiAoaXNfdm1hbGxvY19hZGRyKHB0cikpCisJCQl2dW5tYXAocHRyKTsKKwkJZWxzZQorCQkJ a3VubWFwKGttYXBfdG9fcGFnZShwdHIpKTsKKworCQlvYmotPm1tLm1hcHBpbmcgPSBOVUxMOwor CX0KKworCW11dGV4X3VubG9jaygmb2JqLT5tbS5sb2NrKTsKKworCXJldHVybiAwOworfQorCisj ZGVmaW5lIERXT1JEU19QRVJfUEFHRSAoUEFHRV9TSVpFL3NpemVvZih1MzIpKQorCitzdGF0aWMg aW50IGNwdV9jaGVjayhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCB1MzIgZHdvcmQs IHUzMiB2YWwpCit7CisJZW51bSBpOTE1X21hcF90eXBlIGxldmVsOworCWludCBlcnI7CisKKwlm b3IgKGxldmVsID0gSTkxNV9NQVBfV0I7IGxldmVsIDw9IEk5MTVfTUFQX1dDOyBsZXZlbCsrKSB7 CisJCXUzMiAqbWFwLCBvZmZzZXQ7CisKKwkJaWYgKGxldmVsID09IEk5MTVfTUFQX1dCKQorCQkJ ZXJyID0gaTkxNV9nZW1fb2JqZWN0X3NldF90b19jcHVfZG9tYWluKG9iaiwgZmFsc2UpOworCQll bHNlCisJCQllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX3djX2RvbWFpbihvYmosIGZhbHNl KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBlcnI7CisKKwkJdW5tYXBfbWFwcGluZyhvYmopOwor CQltYXAgPSBpOTE1X2dlbV9vYmplY3RfcGluX21hcChvYmosIGxldmVsKTsKKwkJaWYgKElTX0VS UihtYXApKQorCQkJcmV0dXJuIFBUUl9FUlIobWFwKTsKKworCQlmb3IgKG9mZnNldCA9IGR3b3Jk OyBvZmZzZXQgPCBvYmotPmJhc2Uuc2l6ZS9zaXplb2YodTMyKTsKKwkJICAgICBvZmZzZXQgKz0g RFdPUkRTX1BFUl9QQUdFKSB7CisJCQlpZiAobWFwW29mZnNldF0gIT0gdmFsKSB7CisJCQkJcHJf ZXJyKCJtYXBbJXVdID0gJXUsIGV4cGVjdGVkICV1XG4iLAorCQkJCSAgICAgICBvZmZzZXQsIG1h cFtvZmZzZXRdLCB2YWwpOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXRfY2xvc2U7 CisJCQl9CisJCX0KKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKG9iaik7CisJfQorCisJ cmV0dXJuIDA7CisKK291dF9jbG9zZToKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fbWFwKG9iaik7 CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF93cml0ZV9odWdlKHN0cnVjdCBk cm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUgPSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOworCXVuc2lnbmVkIGxvbmcgc3VwcG9ydGVkID0g SU5URUxfSU5GTyhpOTE1KS0+cGFnZV9zaXplX21hc2s7CisJc3RydWN0IGk5MTVfZ2VtX2NvbnRl eHQgKmN0eCA9IGk5MTUtPmtlcm5lbF9jb250ZXh0OworCXN0cnVjdCBpOTE1X2FkZHJlc3Nfc3Bh Y2UgKnZtID0gY3R4LT5wcGd0dCA/ICZjdHgtPnBwZ3R0LT5iYXNlIDogJmk5MTUtPmdndHQuYmFz ZTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSU5fVVNFUiB8IFBJTl9PRkZTRVRfRklYRUQ7CisJ c3RydWN0IGk5MTVfdm1hICp2bWE7CisJaW50IGJpdCwgbGFzdDsKKwlpbnQgZXJyOworCisJR0VN X0JVR19PTihvYmotPmJhc2Uuc2l6ZSAhPSBTWl8yTSk7CisKKwllcnIgPSBpOTE1X2dlbV9vYmpl Y3RfcGluX3BhZ2VzKG9iaik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qIFdlIHdh bnQgdG8gcnVuIHRoZSB0ZXN0IGV2ZW4gaWYgdGhlIHBsYXRmb3JtIGRvZXNuJ3Qgc3VwcG9ydCBo dWdlIGd0dAorCSAqIHBhZ2VzIC0tIG91ciBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgd2Ugd2Vy ZSBhYmxlIHRvIGFsbG9jYXRlIGEKKwkgKiAiaHVnZS1wYWdlIi4KKwkgKi8KKwlpZiAob2JqLT5t bS5wYWdlX3NpemVzLnBoeXMgPCBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pIHsKKwkJcHJfaW5mbygi VW5hYmxlIHRvIGFsbG9jYXRlIGh1Z2UtcGFnZSwgZmluaXNoaW5nIHRlc3QgZWFybHlcbiIpOwor CQlnb3RvIG91dF91bnBpbjsKKwl9CisKKwl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosIHZt LCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJZXJyID0gUFRSX0VSUih2bWEpOworCQln b3RvIG91dF91bnBpbjsKKwl9CisKKwlsYXN0ID0gaWxvZzIoSTkxNV9HVFRfUEFHRV9TSVpFXzJN KTsKKworCWZvcl9lYWNoX3NldF9iaXQoYml0LCAmc3VwcG9ydGVkLCBsYXN0ICsgMSkgeworCQlJ R1RfVElNRU9VVChlbmRfdGltZSk7CisJCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBCSVQoYml0 KTsKKwkJdTMyIG1heCA9IHZtLT50b3RhbCAvIEk5MTVfR1RUX1BBR0VfU0laRV8yTSAtIDE7CisJ CXUzMiBudW07CisKKwkJLyogRm9yY2UgdGhlIHBhZ2Ugc2l6ZSAqLworCQl2bWEtPnBhZ2Vfc2l6 ZXMuc2cgPSBvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cgPSBwYWdlX3NpemU7CisKKwkJLyogVHJ5IHZh cmlvdXMgb2Zmc2V0cyB1bnRpbCB3ZSB0aW1lb3V0IC0tIHdlIHdhbnQgdG8gYXZvaWQKKwkJICog aXNzdWVzIGhpZGRlbiBieSBlZmZlY3RpdmVseSBhbHdheXMgdXNpbmcgb2Zmc2V0ID0gMC4KKwkJ ICovCisJCWZvcl9lYWNoX3ByaW1lX251bWJlcl9mcm9tKG51bSwgMCwgbWF4KSB7CisJCQl1NjQg b2Zmc2V0ID0gbnVtICogSTkxNV9HVFRfUEFHRV9TSVpFXzJNOworCQkJdTMyIGR3b3JkOworCisJ CQllcnIgPSBpOTE1X3ZtYV91bmJpbmQodm1hKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRf Y2xvc2U7CisKKwkJCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIGZsYWdzIHwgb2Zmc2V0 KTsKKwkJCWlmIChlcnIpIHsKKwkJCQkvKiBUaGUgZ2d0dCBtYXkgaGF2ZSBzb21lIHBhZ2VzIHJl c2VydmVkIHNvCisJCQkJICogcmVmcmFpbiBmcm9tIGVycm9yaW5nIG91dC4KKwkJCQkgKi8KKwkJ CQlpZiAoZXJyID09IC1FTk9TUEMgJiYgaTkxNV9pc19nZ3R0KHZtKSkKKwkJCQkJY29udGludWU7 CisKKwkJCQlnb3RvIG91dF9jbG9zZTsKKwkJCX0KKworCQkJR0VNX0JVR19PTihvYmotPm1tLnBh Z2Vfc2l6ZXMuZ3R0KTsKKwkJCUdFTV9CVUdfT04odm1hLT5wYWdlX3NpemVzLnNnICE9IHBhZ2Vf c2l6ZSk7CisJCQlHRU1fQlVHX09OKCF2bWEtPnBhZ2Vfc2l6ZXMucGh5cyk7CisKKwkJCWlmICh2 bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9IHBhZ2Vfc2l6ZSkgeworCQkJCWRtYV9hZGRyX3QgYWRkciA9 CisJCQkJCWk5MTVfZ2VtX29iamVjdF9nZXRfZG1hX2FkZHJlc3Mob2JqLCAwKTsKKworCQkJCS8q IFRoZSBvbmx5IHZhbGlkIHJlYXNvbiBmb3IgdGhpcyB0byBldmVyIGZhaWwKKwkJCQkgKiB3b3Vs ZCBiZSBpZiB0aGUgZG1hLW1hcHBlciBzY3Jld2VkIHVzIG92ZXIKKwkJCQkgKiB3aGVuIHdlIGRp ZCB0aGUgZG1hX21hcF9zZygpLCBzaW5jZSBpdCBoYXMKKwkJCQkgKiB0aGUgZmluYWwgc2F5IG92 ZXIgdGhlIGRtYSBhZGRyZXNzLgorCQkJCSAqLworCQkJCUdFTV9CVUdfT04oSVNfQUxJR05FRChh ZGRyLAorCQkJCQkJICAgICAgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSk7CisKKwkJCQlwcl9pbmZv KCJkbWEgYWRkcmVzcyBtaXNhbGlnbmVkLCBob2JibGluZyBvblxuIik7CisJCQl9CisKKwkJCWZv ciAoZHdvcmQgPSAwOyBkd29yZCA8IERXT1JEU19QRVJfUEFHRTsgKytkd29yZCkgeworCQkJCWVy ciA9IGdwdV93cml0ZSh2bWEsIGN0eCwgZHdvcmQsIG51bSArIDEpOworCQkJCWlmIChlcnIpIHsK KwkJCQkJcHJfZXJyKCJncHVfd3JpdGUgZmFpbGVkIHdpdGggcGFnZS1zaXplICV4XG4iLAorCQkJ CQkgICAgICAgcGFnZV9zaXplKTsKKwkJCQkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJCQkJZ290 byBvdXRfY2xvc2U7CisJCQkJfQorCisJCQkJZXJyID0gY3B1X2NoZWNrKG9iaiwgZHdvcmQsIG51 bSArIDEpOworCQkJCWlmIChlcnIpIHsKKwkJCQkJcHJfZXJyKCJjcHVfY2hlY2sgZmFpbGVkIHdp dGggcGFnZS1zaXplICV4XG4iLAorCQkJCQkgICAgICAgcGFnZV9zaXplKTsKKwkJCQkJaTkxNV92 bWFfdW5waW4odm1hKTsKKwkJCQkJZ290byBvdXRfY2xvc2U7CisJCQkJfQorCQkJfQorCisJCQlp OTE1X3ZtYV91bnBpbih2bWEpOworCisJCQlpZiAobnVtID4gMCAmJgorCQkJICAgIGlndF90aW1l b3V0KGVuZF90aW1lLAorCQkJCQkiJXMgdGltZWQgb3V0IGF0IG9mZnNldCAlbGx4IHdpdGggcHMg JXhcbiIsCisJCQkJCV9fZnVuY19fLCBvZmZzZXQsIHBhZ2Vfc2l6ZSkpCisJCQkJYnJlYWs7CisJ CX0KKwl9CisKK291dF9jbG9zZToKKwlpOTE1X3ZtYV9jbG9zZSh2bWEpOworb3V0X3VucGluOgor CWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCisJcmV0dXJuIGVycjsKK30KKwor c3RhdGljIGludCBpZ3RfcHBndHRfd3JpdGVfaHVnZSh2b2lkICphcmcpCit7CisJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iajsKKwlpbnQgZXJyOworCisJLyogU2FuaXR5IGNoZWNrIHRoYXQgdGhlIEhXIHVzZXMgaHVn ZSBwYWdlcyBjb3JyZWN0bHkgLS0gZW5zdXJlIHRoYXQKKwkgKiBvdXIgd3JpdGVzIGxhbmQgaW4g dGhlIHJpZ2h0IHBsYWNlCisJICovCisKKwlpZiAoIWludGVsX2VuZ2luZV9jYW5fc3RvcmVfZHdv cmQoaTkxNS0+ZW5naW5lW1JDU10pKSB7CisJCXByX2luZm8oInN0b3JlLWR3b3JkLWltbSBub3Qg c3VwcG9ydGVkLCBza2lwcGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFRyeSB3aXRo b3V0IHRocCAqLworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwg U1pfMk0pOworCWlmIChJU19FUlIob2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCWVy ciA9IGlndF93cml0ZV9odWdlKG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCWlm IChlcnIpIHsKKwkJcHJfZXJyKCJ3cml0ZS1odWdlIGZhaWxlZCB3aXRoIGludGVybmFsIGFsbG9j YXRvclxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFoYXNfdHJhbnNwYXJlbnRfaHVn ZXBhZ2UoKSkgeworCQlwcl9pbmZvKCJ0aHAgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmdcbiIpOwor CQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgd2l0aCB0aHAgdGhyb3VnaCBnZW1mcyAqLworCW9i aiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGUoaTkxNSwgU1pfMk0pOworCWlmIChJU19FUlIob2Jq KSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCWVyciA9IGlndF93cml0ZV9odWdlKG9iaik7 CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCWlmIChlcnIpCisJCXByX2Vycigid3JpdGUt aHVnZSBmYWlsZWQgd2l0aCB0aHBcbiIpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlu dCBpZ3RfcHBndHRfcGluX3VwZGF0ZSh2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2ID0gYXJnOworCXVuc2lnbmVkIGxvbmcgc3VwcG9ydGVkID0gSU5URUxf SU5GTyhkZXZfcHJpdiktPnBhZ2Vfc2l6ZV9tYXNrOworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpw cGd0dCA9IGRldl9wcml2LT5rZXJuZWxfY29udGV4dC0+cHBndHQ7CisJc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwl1bnNpZ25lZCBpbnQg ZmxhZ3MgPSBQSU5fVVNFUiB8IFBJTl9PRkZTRVRfRklYRUQ7CisJdW5zaWduZWQgaW50IG5lZWRz X2ZsdXNoOworCWludCBiaXQsIGxhc3Q7CisJdTMyICpwdHI7CisJaW50IGVycjsKKworCS8qIE1h a2Ugc3VyZSB0aGVyZSdzIG5vIGZ1bm55IGJ1c2luZXNzIHdoZW4gZG9pbmcgYSBQSU5fVVBEQVRF IC0tIGluIHRoZQorCSAqIHBhc3Qgd2UgaGFkIGEgc3VidGxlIGlzc3VlIHdpdGggYmVpbmcgYWJs ZSB0byBpbmNvcnJlY3RseSBkbyBtdWx0aXBsZQorCSAqIGFsbG9jIHZhIHJhbmdlcyBvbiB0aGUg c2FtZSBvYmplY3Qgd2hlbiBkb2luZyBhIFBJTl9VUERBVEUsIHdoaWNoCisJICogcmVzdWx0ZWQg aW4gc29tZSBwcmV0dHkgbmFzdHkgYnVncywgdGhvdWdoIG9ubHkgd2hlbiB1c2luZworCSAqIGh1 Z2UtZ3R0LXBhZ2VzLgorCSAqLworCisJaWYgKCFVU0VTX0ZVTExfNDhCSVRfUFBHVFQoZGV2X3By aXYpKSB7CisJCXByX2luZm8oIjQ4YiBQUEdUVCBub3Qgc3VwcG9ydGVkLCBza2lwcGluZ1xuIik7 CisJCXJldHVybiAwOworCX0KKworCWJpdCA9IGlsb2cyKEk5MTVfR1RUX1BBR0VfU0laRV82NEsp OworCWxhc3QgPSBpbG9nMihJOTE1X0dUVF9QQUdFX1NJWkVfMk0pOworCisJZm9yX2VhY2hfc2V0 X2JpdF9mcm9tKGJpdCwgJnN1cHBvcnRlZCwgbGFzdCArIDEpIHsKKwkJdW5zaWduZWQgaW50IHBh Z2Vfc2l6ZSA9IEJJVChiaXQpOworCisJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50 ZXJuYWwoZGV2X3ByaXYsIFNaXzJNKTsKKwkJaWYgKElTX0VSUihvYmopKQorCQkJcmV0dXJuIFBU Ul9FUlIob2JqKTsKKworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFz ZSwgTlVMTCk7CisJCWlmIChJU19FUlIodm1hKSkgeworCQkJZXJyID0gUFRSX0VSUih2bWEpOwor CQkJZ290byBvdXRfcHV0OworCQl9CisKKwkJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwg ZmxhZ3MpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfY2xvc2U7CisKKwkJaWYgKHZtYS0+cGFn ZV9zaXplcy5zZyA8IHBhZ2Vfc2l6ZSkgeworCQkJcHJfaW5mbygiVW5hYmxlIHRvIGFsbG9jYXRl IHBhZ2Utc2l6ZSAleCwgZmluaXNoaW5nIHRlc3QgZWFybHlcbiIsCisJCQkJcGFnZV9zaXplKTsK KwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJaWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0g cGFnZV9zaXplKSB7CisJCQlkbWFfYWRkcl90IGFkZHIgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X2Rt YV9hZGRyZXNzKG9iaiwgMCk7CisKKwkJCS8qIFRoZSBvbmx5IHZhbGlkIHJlYXNvbiBmb3IgdGhp cyB0byBldmVyIGZhaWwgd291bGQgYmUKKwkJCSAqIGlmIHRoZSBkbWEtbWFwcGVyIHNjcmV3ZWQg dXMgb3ZlciB3aGVuIHdlIGRpZCB0aGUKKwkJCSAqIGRtYV9tYXBfc2coKSwgc2luY2UgaXQgaGFz IHRoZSBmaW5hbCBzYXkgb3ZlciB0aGUgZG1hCisJCQkgKiBhZGRyZXNzLgorCQkJICovCisJCQlH RU1fQlVHX09OKElTX0FMSUdORUQoYWRkciwgcGFnZV9zaXplKSk7CisKKwkJCXByX2luZm8oImRt YSBhZGRyZXNzIG1pc2FsaWduZWQsIGZpbmlzaGluZyB0ZXN0IGVhcmx5XG4iKTsKKwkJCWdvdG8g b3V0X3VucGluOworCQl9CisKKwkJZXJyID0gaTkxNV92bWFfYmluZCh2bWEsIEk5MTVfQ0FDSEVf Tk9ORSwgUElOX1VQREFURSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF91bnBpbjsKKworCQlp OTE1X3ZtYV91bnBpbih2bWEpOworCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCisJCWk5MTVfZ2Vt X29iamVjdF9wdXQob2JqKTsKKwl9CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2lu dGVybmFsKGRldl9wcml2LCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIob2JqKSkKKwkJcmV0dXJu IFBUUl9FUlIob2JqKTsKKworCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJnBwZ3R0LT5i YXNlLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJZXJyID0gUFRSX0VSUih2bWEpOwor CQlnb3RvIG91dF9wdXQ7CisJfQorCisJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxh Z3MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJLyogTWFrZSBzdXJlIHdlIGRv bid0IGVuZCB1cCB3aXRoIHNvbWV0aGluZyBsaWtlIHdoZXJlIHRoZSBwZGUgaXMgc3RpbGwKKwkg KiBwb2ludGluZyB0byB0aGUgMk0gcGFnZSwgYW5kIHRoZSBwdCB3ZSBqdXN0IGZpbGxlZC1pbiBp cyBkYW5nbGluZyAtLQorCSAqIHdlIGNhbiBjaGVjayB0aGlzIGJ5IHdyaXRpbmcgdG8gdGhlIGZp cnN0IHBhZ2Ugd2hlcmUgaXQgd291bGQgdGhlbgorCSAqIGxhbmQgaW4gdGhlIG5vdyBzdGFsZSAy TSBwYWdlLgorCSAqLworCisJZXJyID0gZ3B1X3dyaXRlKHZtYSwgZGV2X3ByaXYtPmtlcm5lbF9j b250ZXh0LCAwLCAweGRlYWRiZWFmKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnBpbjsKKwor CWVyciA9IGk5MTVfZ2VtX29ial9wcmVwYXJlX3NobWVtX3JlYWQob2JqLCAmbmVlZHNfZmx1c2gp OworCWlmIChlcnIpCisJCWdvdG8gb3V0X3VucGluOworCisJcHRyID0ga21hcF9hdG9taWMoaTkx NV9nZW1fb2JqZWN0X2dldF9wYWdlKG9iaiwgMCkpOworCWlmIChuZWVkc19mbHVzaCAmIENMRkxV U0hfQkVGT1JFKQorCQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHB0ciwgUEFHRV9TSVpFKTsKKwor CWlmICgqcHRyICE9IDB4ZGVhZGJlYWYpIHsKKwkJcHJfZXJyKCJwdHIgPSAleCwgZXhwZWN0ZWQg JXhcbiIsICpwdHIsIDB4ZGVhZGJlYWYpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCWt1bm1h cF9hdG9taWMocHRyKTsKKworCWk5MTVfZ2VtX29ial9maW5pc2hfc2htZW1fYWNjZXNzKG9iaik7 CisKK291dF91bnBpbjoKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X2Nsb3NlOgorCWk5MTVf dm1hX2Nsb3NlKHZtYSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwor CXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X3BwZ3R0X2dlbWZzX2h1Z2Uodm9pZCAq YXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gYXJnOworCXN0cnVjdCBp OTE1X2dlbV9jb250ZXh0ICpjdHggPSBpOTE1LT5rZXJuZWxfY29udGV4dDsKKwlzdHJ1Y3QgaTkx NV9hZGRyZXNzX3NwYWNlICp2bSA9IGN0eC0+cHBndHQgPyAmY3R4LT5wcGd0dC0+YmFzZSA6ICZp OTE1LT5nZ3R0LmJhc2U7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwljb25z dCB1bnNpZ25lZCBpbnQgb2JqZWN0X3NpemVzW10gPSB7CisJCUk5MTVfR1RUX1BBR0VfU0laRV8y TSwKKwkJSTkxNV9HVFRfUEFHRV9TSVpFXzJNICsgSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCX07 CisJdW5zaWduZWQgaW50IGZsYWdzID0gUElOX1VTRVI7CisJaW50IGVycjsKKwlpbnQgaTsKKwor CS8qIFNhbml0eSBjaGVjayBUSFAgdGhyb3VnaCBnZW1mcyAqLworCisJaWYgKCFoYXNfdHJhbnNw YXJlbnRfaHVnZXBhZ2UoKSkgeworCQlwcl9pbmZvKCJ0aHAgbm90IHN1cHBvcnRlZCwgc2tpcHBp bmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShv YmplY3Rfc2l6ZXMpOyArK2kpIHsKKwkJdW5zaWduZWQgaW50IHNpemUgPSBvYmplY3Rfc2l6ZXNb aV07CisJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCisJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9j cmVhdGUoaTkxNSwgc2l6ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJS KG9iaik7CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOworCQlpZiAo ZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCUdFTV9CVUdfT04oIW9iai0+bW0ucGFnZV9zaXpl cy5zZyk7CisKKwkJaWYgKG9iai0+bW0ucGFnZV9zaXplcy5waHlzIDwgSTkxNV9HVFRfUEFHRV9T SVpFXzJNKSB7CisJCQlwcl9pbmZvKCJVbmFibGUgdG8gYWxsb2NhdGUgdGhwLCBmaW5pc2hpbmcg dGVzdCBlYXJseVxuIik7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCXZtYSA9IGk5MTVf dm1hX2luc3RhbmNlKG9iaiwgdm0sIE5VTEwpOworCQlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJCWVy ciA9IFBUUl9FUlIodm1hKTsKKwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJZXJyID0gaTkx NV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOworCQlpZiAoZXJyKSB7CisJCQlpOTE1X3ZtYV9j bG9zZSh2bWEpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQlHRU1fQlVHX09OKG9iai0+ bW0ucGFnZV9zaXplcy5ndHQpOworCQlHRU1fQlVHX09OKCF2bWEtPnBhZ2Vfc2l6ZXMuc2cpOwor CQlHRU1fQlVHX09OKCF2bWEtPnBhZ2Vfc2l6ZXMucGh5cyk7CisKKwkJaWYgKHZtYS0+cGFnZV9z aXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV8yTSkgeworCQkJaWYgKHZtYS0+cGFnZV9zaXpl cy5ndHQgIT0gc2l6ZSkgeworCQkJCWRtYV9hZGRyX3QgYWRkciA9CisJCQkJCWk5MTVfZ2VtX29i amVjdF9nZXRfZG1hX2FkZHJlc3Mob2JqLCAwKTsKKworCQkJCS8qIFRoZSBvbmx5IHZhbGlkIHJl YXNvbiBmb3IgdGhpcyB0byBldmVyIGZhaWwKKwkJCQkgKiB3b3VsZCBiZSBpZiB0aGUgZG1hLW1h cHBlciBzY3Jld2VkIHVzIG92ZXIKKwkJCQkgKiB3aGVuIHdlIGRpZCB0aGUgZG1hX21hcF9zZygp LCBzaW5jZSBpdCBoYXMKKwkJCQkgKiB0aGUgZmluYWwgc2F5IG92ZXIgdGhlIGRtYSBhZGRyZXNz LgorCQkJCSAqLworCQkJCUdFTV9CVUdfT04oSVNfQUxJR05FRChhZGRyLAorCQkJCQkJICAgICAg STkxNV9HVFRfUEFHRV9TSVpFXzJNKSk7CisJCQkJcHJfaW5mbygiZG1hIGFkZHJlc3MgdW5hbGln bmVkXG4iKTsKKwkJCX0KKworCQkJR0VNX0JVR19PTighSVNfQUxJR05FRCh2bWEtPm5vZGUuc3Rh cnQsCisJCQkJCSAgICAgICBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKTsKKwkJfQorCisJCWlmICh2 bWEtPnBhZ2Vfc2l6ZXMuc2cgJiBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSB7CisJCQlHRU1fQlVH X09OKCFJU19BTElHTkVEKHZtYS0+bm9kZS5zaXplLAorCQkJCQkgICAgICAgSTkxNV9HVFRfUEFH RV9TSVpFXzJNKSk7CisJCX0KKworCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQlpOTE1X3ZtYV9j bG9zZSh2bWEpOworCisJCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCQlpOTE1 X2dlbV9vYmplY3RfcHV0KG9iaik7CisJfQorCisJcmV0dXJuIDA7CisKK291dF91bnBpbjoKKwlp OTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKK291dF9wdXQ6CisJaTkxNV9nZW1fb2Jq ZWN0X3B1dChvYmopOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGk5MTVfZ2VtX2h1Z2VfcGFn ZV9tb2NrX3NlbGZ0ZXN0cyh2b2lkKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTkxNV9zdWJ0 ZXN0IHRlc3RzW10gPSB7CisJCVNVQlRFU1QoaWd0X21vY2tfZXhoYXVzdF9kZXZpY2Vfc3VwcG9y dGVkX3BhZ2VzKSwKKwkJU1VCVEVTVChpZ3RfbW9ja19wcGd0dF9taXNhbGlnbmVkX2RtYSksCisJ CVNVQlRFU1QoaWd0X21vY2tfcHBndHRfaHVnZV9maWxsKSwKKwkJU1VCVEVTVChpZ3RfbW9ja19w cGd0dF82NEspLAorCX07CisJaW50IHNhdmVkX3BwZ3R0ID0gaTkxNS5lbmFibGVfcHBndHQ7CisJ c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2OworCXN0cnVjdCBwY2lfZGV2ICpwZGV2 OworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dDsKKwlpbnQgZXJyOworCisJZGV2X3ByaXYg PSBtb2NrX2dlbV9kZXZpY2UoKTsKKwlpZiAoIWRldl9wcml2KQorCQlyZXR1cm4gLUVOT01FTTsK KworCS8qIFByZXRlbmQgdG8gYmUgYSBkZXZpY2Ugd2hpY2ggc3VwcG9ydHMgdGhlIDQ4YiBQUEdU VCAqLworCWk5MTUuZW5hYmxlX3BwZ3R0ID0gMzsKKworCXBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBk ZXY7CisJZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ZGV2LCBETUFfQklUX01B U0soMzkpKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcm0uc3RydWN0X211dGV4KTsKKwlw cGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGRldl9wcml2LCBFUlJfUFRSKC1FTk9ERVYpLCAibW9j ayIpOworCWlmIChJU19FUlIocHBndHQpKSB7CisJCWVyciA9IFBUUl9FUlIocHBndHQpOworCQln b3RvIG91dF91bmxvY2s7CisJfQorCisJR0VNX0JVR19PTighaTkxNV92bV9pc180OGJpdCgmcHBn dHQtPmJhc2UpKTsKKworCWVyciA9IGk5MTVfc3VidGVzdHModGVzdHMsIHBwZ3R0KTsKKworCWk5 MTVfcHBndHRfY2xvc2UoJnBwZ3R0LT5iYXNlKTsKKwlpOTE1X3BwZ3R0X3B1dChwcGd0dCk7CisK K291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7 CisKKwlpOTE1LmVuYWJsZV9wcGd0dCA9IHNhdmVkX3BwZ3R0OworCisJZHJtX2Rldl91bnJlZigm ZGV2X3ByaXYtPmRybSk7CisKKwlyZXR1cm4gZXJyOworfQorCitpbnQgaTkxNV9nZW1faHVnZV9w YWdlX2xpdmVfc2VsZnRlc3RzKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdikKK3sK KwlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVzdCB0ZXN0c1tdID0geworCQlTVUJURVNU KGlndF9wcGd0dF9nZW1mc19odWdlKSwKKwkJU1VCVEVTVChpZ3RfcHBndHRfcGluX3VwZGF0ZSks CisJCVNVQlRFU1QoaWd0X3BwZ3R0X3dyaXRlX2h1Z2UpLAorCX07CisJaW50IGVycjsKKworCWlm ICghVVNFU19QUEdUVChkZXZfcHJpdikpIHsKKwkJcHJfaW5mbygiUFBHVFQgbm90IHN1cHBvcnRl ZCwgc2tpcHBpbmcgbGl2ZS1zZWxmdGVzdHNcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwltdXRl eF9sb2NrKCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7CisJZXJyID0gaTkxNV9zdWJ0ZXN0 cyh0ZXN0cywgZGV2X3ByaXYpOworCW11dGV4X3VubG9jaygmZGV2X3ByaXYtPmRybS5zdHJ1Y3Rf bXV0ZXgpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCmluZGV4IDE4YjE3NGQ4NTVjYS4uNjRh Y2Q3ZWNjYzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkx NV9saXZlX3NlbGZ0ZXN0cy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9p OTE1X2xpdmVfc2VsZnRlc3RzLmgKQEAgLTE1LDUgKzE1LDYgQEAgc2VsZnRlc3Qob2JqZWN0cywg aTkxNV9nZW1fb2JqZWN0X2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoZG1hYnVmLCBpOTE1X2dl bV9kbWFidWZfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChjb2hlcmVuY3ksIGk5MTVfZ2VtX2Nv aGVyZW5jeV9saXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGd0dCwgaTkxNV9nZW1fZ3R0X2xpdmVf c2VsZnRlc3RzKQorc2VsZnRlc3QoaHVnZXBhZ2VzLCBpOTE1X2dlbV9odWdlX3BhZ2VfbGl2ZV9z ZWxmdGVzdHMpCiBzZWxmdGVzdChjb250ZXh0cywgaTkxNV9nZW1fY29udGV4dF9saXZlX3NlbGZ0 ZXN0cykKIHNlbGZ0ZXN0KGhhbmdjaGVjaywgaW50ZWxfaGFuZ2NoZWNrX2xpdmVfc2VsZnRlc3Rz KQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbW9ja19z ZWxmdGVzdHMuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2Vs ZnRlc3RzLmgKaW5kZXggZmM3NDY4NzUwMWJhLi45OTYxYjQ0Zjc2ZWQgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3RzLmgKKysrIGIv ZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbW9ja19zZWxmdGVzdHMuaApAQCAt MjEsMyArMjEsNCBAQCBzZWxmdGVzdChkbWFidWYsIGk5MTVfZ2VtX2RtYWJ1Zl9tb2NrX3NlbGZ0 ZXN0cykKIHNlbGZ0ZXN0KHZtYSwgaTkxNV92bWFfbW9ja19zZWxmdGVzdHMpCiBzZWxmdGVzdChl dmljdCwgaTkxNV9nZW1fZXZpY3RfbW9ja19zZWxmdGVzdHMpCiBzZWxmdGVzdChndHQsIGk5MTVf Z2VtX2d0dF9tb2NrX3NlbGZ0ZXN0cykKK3NlbGZ0ZXN0KGh1Z2VwYWdlcywgaTkxNV9nZW1faHVn ZV9wYWdlX21vY2tfc2VsZnRlc3RzKQotLSAKMi4xMy41CgpfX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdm eEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFp bG1hbi9saXN0aW5mby9pbnRlbC1nZngK