From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Auld Subject: [PATCH 16/21] drm/i915/selftests: huge page tests Date: Tue, 25 Jul 2017 20:21:28 +0100 Message-ID: <20170725192133.2012-17-matthew.auld@intel.com> References: <20170725192133.2012-1-matthew.auld@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by gabe.freedesktop.org (Postfix) with ESMTPS id 228E96E560 for ; Tue, 25 Jul 2017 19:22:37 +0000 (UTC) In-Reply-To: <20170725192133.2012-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 c2lvbiB0ZXN0CiAgICB2YXJpb3VzIGltcHJvdmVtZW50cyBzdWdnZXN0ZWQgYnkgQ2hyaXMKClNp Z25lZC1vZmYtYnk6IE1hdHRoZXcgQXVsZCA8bWF0dGhldy5hdWxkQGludGVsLmNvbT4KQ2M6IEpv b25hcyBMYWh0aW5lbiA8am9vbmFzLmxhaHRpbmVuQGxpbnV4LmludGVsLmNvbT4KQ2M6IENocmlz IFdpbHNvbiA8Y2hyaXNAY2hyaXMtd2lsc29uLmNvLnVrPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9p OTE1L2k5MTVfZ2VtLmMgICAgICAgICAgICAgICAgICAgIHwgICAgMSArCiBkcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdlcy5jICAgICAgICB8IDExNzAgKysrKysrKysrKysr KysrKysrKysKIC4uLi9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMu aCAgIHwgICAgMSArCiAuLi4vZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRl c3RzLmggICB8ICAgIDEgKwogNCBmaWxlcyBjaGFuZ2VkLCAxMTczIGluc2VydGlvbnMoKykKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdl cy5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZl cnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggYWVjZGYwZTMwOThkLi43NGFkMDA2Y2Fj MTUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtNTQwMCw2ICs1NDAwLDcgQEAgaTkxNV9n ZW1fb2JqZWN0X2dldF9kbWFfYWRkcmVzcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAogI2luY2x1ZGUgInNlbGZ0ZXN0cy9zY2F0dGVybGlzdC5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0 cy9tb2NrX2dlbV9kZXZpY2UuYyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaHVnZV9nZW1fb2JqZWN0 LmMiCisjaW5jbHVkZSAic2VsZnRlc3RzL2h1Z2VfcGFnZXMuYyIKICNpbmNsdWRlICJzZWxmdGVz dHMvaTkxNV9nZW1fb2JqZWN0LmMiCiAjaW5jbHVkZSAic2VsZnRlc3RzL2k5MTVfZ2VtX2NvaGVy ZW5jeS5jIgogI2VuZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVz dHMvaHVnZV9wYWdlcy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFn ZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmUwYjk1ZDM0Mjk2 YgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9odWdl X3BhZ2VzLmMKQEAgLTAsMCArMSwxMTcwIEBACisvKgorICogQ29weXJpZ2h0IMKpIDIwMTcgSW50 ZWwgQ29ycG9yYXRpb24KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVl IG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQorICogY29weSBvZiB0aGlzIHNv ZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUi KSwKKyAqIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1 ZGluZyB3aXRob3V0IGxpbWl0YXRpb24KKyAqIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2Rp ZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLAorICogYW5kL29yIHNl bGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20g dGhlCisgKiBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZv bGxvd2luZyBjb25kaXRpb25zOgorICoKKyAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFu ZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlIG5leHQKKyAqIHBhcmFncmFw aCkgc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9u cyBvZiB0aGUKKyAqIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAi QVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBM SUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNI QU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05J TkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogVEhFIEFVVEhPUlMgT1IgQ09QWVJJ R0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKKyAq IExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RI RVJXSVNFLCBBUklTSU5HCisgKiBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRI RSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTCisgKiBJTiBUSEUgU09GVFdB UkUuCisgKgorICovCisKKyNpbmNsdWRlICIuLi9pOTE1X3NlbGZ0ZXN0LmgiCisKKyNpbmNsdWRl IDxsaW51eC9wcmltZV9udW1iZXJzLmg+CisKKyNpbmNsdWRlICJtb2NrX2RybS5oIgorCitzdGF0 aWMgY29uc3QgdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZXNbXSA9IHsKKwlJOTE1X0dUVF9QQUdFX1NJ WkVfMUcsCisJSTkxNV9HVFRfUEFHRV9TSVpFXzJNLAorCUk5MTVfR1RUX1BBR0VfU0laRV82NEss CisJSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRf bGFyZ2VzdF9wYWdlX3NpemUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCisJCQkJCSAg c2l6ZV90IHJlbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBh Z2Vfc2l6ZXMpOyArK2kpIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZXNb aV07CisKKwkJaWYgKEhBU19QQUdFX1NJWkUoaTkxNSwgcGFnZV9zaXplKSAmJiByZW0gPj0gcGFn ZV9zaXplKQorCQkJcmV0dXJuIHBhZ2Vfc2l6ZTsKKwl9CisKKwlHRU1fQlVHX09OKDEpOworfQor CitzdGF0aWMgc3RydWN0IHNnX3RhYmxlICoKK2Zha2VfZ2V0X2h1Z2VfcGFnZXMoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJICAgIHVuc2lnbmVkIGludCAqc2dfbWFzaykKK3sK KyNkZWZpbmUgR0ZQIChHRlBfS0VSTkVMIHwgX19HRlBfTk9XQVJOIHwgX19HRlBfTk9SRVRSWSkK KwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7 CisJc2l6ZV90IG1heF9sZW4gPSByb3VuZGRvd25fcG93X29mX3R3byhVSU5UX01BWCk7CisJc3Ry dWN0IHNnX3RhYmxlICpzdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXNpemVfdCByZW07 CisKKwlzdCA9IGttYWxsb2Moc2l6ZW9mKCpzdCksIEdGUCk7CisJaWYgKCFzdCkKKwkJcmV0dXJu IEVSUl9QVFIoLUVOT01FTSk7CisKKwlpZiAoc2dfYWxsb2NfdGFibGUoc3QsIG9iai0+YmFzZS5z aXplID4+IFBBR0VfU0hJRlQsIEdGUCkpIHsKKwkJa2ZyZWUoc3QpOworCQlyZXR1cm4gRVJSX1BU UigtRU5PTUVNKTsKKwl9CisKKwkvKiBVc2Ugb3B0aW1hbCBwYWdlIHNpemVkIGNodW5rcyB0byBm aWxsIGluIHRoZSBzZyB0YWJsZSAqLworCXJlbSA9IG9iai0+YmFzZS5zaXplOworCXNnID0gc3Qt PnNnbDsKKwlzdC0+bmVudHMgPSAwOworCWRvIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9 IGdldF9sYXJnZXN0X3BhZ2Vfc2l6ZShpOTE1LCByZW0pOworCQl1bnNpZ25lZCBpbnQgbGVuID0g bWluKHBhZ2Vfc2l6ZSAqIChyZW0gLyBwYWdlX3NpemUpLCBtYXhfbGVuKTsKKworCQlzZy0+b2Zm c2V0ID0gMDsKKwkJc2ctPmxlbmd0aCA9IGxlbjsKKwkJc2dfZG1hX2xlbihzZykgPSBsZW47CisJ CXNnX2RtYV9hZGRyZXNzKHNnKSA9IHBhZ2Vfc2l6ZTsKKworCQkqc2dfbWFzayB8PSBsZW47CisK KwkJc3QtPm5lbnRzKys7CisKKwkJcmVtIC09IGxlbjsKKwkJaWYgKCFyZW0pIHsKKwkJCXNnX21h cmtfZW5kKHNnKTsKKwkJCWJyZWFrOworCQl9CisKKwkJc2cgPSBzZ19uZXh0KHNnKTsKKwl9IHdo aWxlICgxKTsKKworCW9iai0+bW0ubWFkdiA9IEk5MTVfTUFEVl9ET05UTkVFRDsKKworCXJldHVy biBzdDsKKyN1bmRlZiBHRlAKK30KKworc3RhdGljIHZvaWQgZmFrZV9mcmVlX2h1Z2VfcGFnZXMo c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgc3RydWN0IHNnX3RhYmxlICpw YWdlcykKK3sKKwlzZ19mcmVlX3RhYmxlKHBhZ2VzKTsKKwlrZnJlZShwYWdlcyk7Cit9CisKK3N0 YXRpYyB2b2lkIGZha2VfcHV0X2h1Z2VfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg Km9iaiwKKwkJCQlzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQoreworCWZha2VfZnJlZV9odWdlX3Bh Z2VzKG9iaiwgcGFnZXMpOworCW9iai0+bW0uZGlydHkgPSBmYWxzZTsKKwlvYmotPm1tLm1hZHYg PSBJOTE1X01BRFZfV0lMTE5FRUQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVf Z2VtX29iamVjdF9vcHMgZmFrZV9vcHMgPSB7CisJLmZsYWdzID0gSTkxNV9HRU1fT0JKRUNUX0lT X1NIUklOS0FCTEUsCisJLmdldF9wYWdlcyA9IGZha2VfZ2V0X2h1Z2VfcGFnZXMsCisJLnB1dF9w YWdlcyA9IGZha2VfcHV0X2h1Z2VfcGFnZXMsCit9OworCitzdGF0aWMgc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKgorZmFrZV9odWdlX3BhZ2VzX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqaTkxNSwgdTY0IHNpemUpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9i ajsKKworCUdFTV9CVUdfT04oIXNpemUpOworCUdFTV9CVUdfT04oIUlTX0FMSUdORUQoc2l6ZSwg STkxNV9HVFRfUEFHRV9TSVpFKSk7CisKKwlpZiAob3ZlcmZsb3dzX3R5cGUoc2l6ZSwgb2JqLT5i YXNlLnNpemUpKQorCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCisJb2JqID0gaTkxNV9nZW1f b2JqZWN0X2FsbG9jKGk5MTUpOworCWlmICghb2JqKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVN KTsKKworCWRybV9nZW1fcHJpdmF0ZV9vYmplY3RfaW5pdCgmaTkxNS0+ZHJtLCAmb2JqLT5iYXNl LCBzaXplKTsKKwlpOTE1X2dlbV9vYmplY3RfaW5pdChvYmosICZmYWtlX29wcyk7CisKKwlvYmot PmJhc2Uud3JpdGVfZG9tYWluID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvYmotPmJhc2UucmVh ZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlOX0NQVTsKKwlvYmotPmNhY2hlX2xldmVsID0gSTkx NV9DQUNIRV9OT05FOworCisJcmV0dXJuIG9iajsKK30KKworc3RhdGljIHZvaWQgY2xvc2Vfb2Jq ZWN0X2xpc3Qoc3RydWN0IGxpc3RfaGVhZCAqb2JqZWN0cywKKwkJCSAgICAgIHN0cnVjdCBpOTE1 X2h3X3BwZ3R0ICpwcGd0dCkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAq b247CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUob2JqLCBvbiwgb2JqZWN0cywgc3RfbGlu aykgeworCQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5j ZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCWlmICghSVNfRVJSKHZtYSkpCisJCQlpOTE1 X3ZtYV9jbG9zZSh2bWEpOworCisJCWxpc3RfZGVsKCZvYmotPnN0X2xpbmspOworCQlpOTE1X2dl bV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwor CX0KK30KKworc3RhdGljIGludCBpZ3RfbW9ja19wcGd0dF9odWdlX2ZpbGwodm9pZCAqYXJnKQor eworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSA9IHBwZ3R0LT5iYXNlLmk5MTU7CisJdW5zaWduZWQgbG9uZyBtYXhfcGFn ZXMgPSBwcGd0dC0+YmFzZS50b3RhbCA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgcGFn ZV9udW07CisJTElTVF9IRUFEKG9iamVjdHMpOworCUlHVF9USU1FT1VUKGVuZF90aW1lKTsKKwlp bnQgZXJyOworCisJZm9yX2VhY2hfcHJpbWVfbnVtYmVyX2Zyb20ocGFnZV9udW0sIDEsIG1heF9w YWdlcykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCQlzaXplX3Qgc2l6 ZSA9IHBhZ2VfbnVtIDw8IFBBR0VfU0hJRlQ7CisJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCQl1 bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZ3R0ID0gMDsKKwkJaW50IGk7CisKKwkJb2JqID0gZmFrZV9o dWdlX3BhZ2VzX29iamVjdChpOTE1LCBzaXplKTsKKwkJaWYgKElTX0VSUihvYmopKSB7CisJCQll cnIgPSBQVFJfRVJSKG9iaik7CisJCQlicmVhazsKKwkJfQorCisJCUdFTV9CVUdfT04ob2JqLT5i YXNlLnNpemUgIT0gc2l6ZSk7CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhv YmopOworCQlpZiAoZXJyKSB7CisJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJCQlicmVh azsKKwkJfQorCisJCWxpc3RfYWRkKCZvYmotPnN0X2xpbmssICZvYmplY3RzKTsKKworCQlHRU1f QlVHX09OKCFvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cpOworCisJCXZtYSA9IGk5MTVfdm1hX2luc3Rh bmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJaWYgKElTX0VSUih2bWEpKSB7CisJCQll cnIgPSBQVFJfRVJSKHZtYSk7CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IGk5MTVfdm1hX3Bp bih2bWEsIDAsIDAsIFBJTl9VU0VSKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCUdFTV9C VUdfT04ob2JqLT5tbS5wYWdlX3NpemVzLmd0dCk7CisJCUdFTV9CVUdfT04oIXZtYS0+cGFnZV9z aXplcy5zZyk7CisJCUdFTV9CVUdfT04oIXZtYS0+cGFnZV9zaXplcy5waHlzKTsKKworCQkvKiBG aWd1cmUgb3V0IHRoZSBleHBlY3RlZCBndHQgcGFnZSBzaXplIGtub3dpbmcgdGhhdCB3ZSBnbyBm cm9tCisJCSAqIGxhcmdlc3QgdG8gc21hbGxlc3QgcGFnZSBzaXplIHNnIGNodW5rcywgYW5kIHRo YXQgd2UgYWxpZ24gdG8KKwkJICogdGhlIGxhcmdlc3QgcGFnZSBzaXplLgorCQkgKi8KKwkJZm9y IChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGFnZV9zaXplcyk7ICsraSkgeworCQkJdW5zaWduZWQg aW50IHBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZXNbaV07CisKKwkJCWlmIChIQVNfUEFHRV9TSVpFKGk5 MTUsIHBhZ2Vfc2l6ZSkgJiYKKwkJCSAgICBzaXplID49IHBhZ2Vfc2l6ZSkgeworCQkJCWV4cGVj dGVkX2d0dCB8PSBwYWdlX3NpemU7CisJCQkJc2l6ZSAmPSBwYWdlX3NpemUtMTsKKwkJCX0KKwkJ fQorCisJCUdFTV9CVUdfT04oIWV4cGVjdGVkX2d0dCk7CisJCUdFTV9CVUdfT04oc2l6ZSk7CisK KwkJaWYgKGV4cGVjdGVkX2d0dCAmIEk5MTVfR1RUX1BBR0VfU0laRV80SykKKwkJCWV4cGVjdGVk X2d0dCAmPSB+STkxNV9HVFRfUEFHRV9TSVpFXzY0SzsKKworCQlHRU1fQlVHX09OKHZtYS0+cGFn ZV9zaXplcy5ndHQgIT0gZXhwZWN0ZWRfZ3R0KTsKKworCQlpZiAodm1hLT5wYWdlX3NpemVzLnNn ICYgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgeworCQkJR0VNX0JVR19PTighSVNfQUxJR05FRCh2 bWEtPm5vZGUuc3RhcnQsCisJCQkJCSAgICAgICBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKTsKKwkJ CUdFTV9CVUdfT04oIUlTX0FMSUdORUQodm1hLT5ub2RlLnNpemUsCisJCQkJCSAgICAgICBJOTE1 X0dUVF9QQUdFX1NJWkVfMk0pKTsKKwkJfQorCisJCWk5MTVfdm1hX3VucGluKHZtYSk7CisKKwkJ aWYgKGlndF90aW1lb3V0KGVuZF90aW1lLAorCQkJCSIlcyB0aW1lZCBvdXQgYXQgc2l6ZSAlbHhc biIsCisJCQkJX19mdW5jX18sIG9iai0+YmFzZS5zaXplKSkKKwkJCWJyZWFrOworCX0KKworCWNs b3NlX29iamVjdF9saXN0KCZvYmplY3RzLCBwcGd0dCk7CisKKwlpZiAoZXJyID09IC1FTk9NRU0g fHwgZXJyID09IC1FTk9TUEMpCisJCWVyciA9IDA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0 aWMgaW50IGlndF9tb2NrX3BwZ3R0X21pc2FsaWduZWRfZG1hKHZvaWQgKmFyZykKK3sKKwlzdHJ1 Y3QgaTkxNV9od19wcGd0dCAqcHBndHQgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUgPSBwcGd0dC0+YmFzZS5pOTE1OworCXVuc2lnbmVkIGxvbmcgc3VwcG9ydGVkID0gSU5U RUxfSU5GTyhpOTE1KS0+cGFnZV9zaXplX21hc2s7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iajsKKwlpbnQgZXJyOworCWludCBiaXQ7CisKKwkvKiBTYW5pdHkgY2hlY2sgZG1hIG1p c2FsaWdubWVudCBmb3IgaHVnZSBwYWdlcyAtLSB0aGUgZG1hIGFkZHJlc3NlcyB3ZQorCSAqIGlu c2VydCBpbnRvIHRoZSBwYWdpbmcgc3RydWN0dXJlcyBuZWVkIHRvIGFsd2F5cyByZXNwZWN0IHRo ZSBwYWdlCisJICogc2l6ZSBhbGlnbm1lbnQuCisJICovCisKKwliaXQgPSBpbG9nMihJOTE1X0dU VF9QQUdFX1NJWkVfNjRLKTsKKworCWZvcl9lYWNoX3NldF9iaXRfZnJvbShiaXQsICZzdXBwb3J0 ZWQsIEJJVFNfUEVSX0xPTkcpIHsKKwkJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOworCQl1bnNpZ25l ZCBpbnQgcGFnZV9zaXplID0gQklUKGJpdCk7CisJCXVuc2lnbmVkIGludCBmbGFncyA9IFBJTl9V U0VSIHwgUElOX09GRlNFVF9GSVhFRDsKKwkJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJCXVuc2ln bmVkIGludCBvZmZzZXQ7CisJCXVuc2lnbmVkIGludCBzaXplID0KKwkJCXJvdW5kX3VwKHBhZ2Vf c2l6ZSwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSA8PCAxOworCisJCW9iaiA9IGZha2VfaHVnZV9w YWdlc19vYmplY3QoaTkxNSwgc2l6ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJldHVybiBQ VFJfRVJSKG9iaik7CisKKwkJR0VNX0JVR19PTihvYmotPmJhc2Uuc2l6ZSAhPSBzaXplKTsKKwor CQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJCWlmIChlcnIpCisJCQln b3RvIG91dF9wdXQ7CisKKwkJR0VNX0JVR19PTighKG9iai0+bW0ucGFnZV9zaXplcy5zZyAmIHBh Z2Vfc2l6ZSkpOworCisJCS8qIEZvcmNlIHRoZSBwYWdlIHNpemUgZm9yIHRoaXMgb2JqZWN0ICov CisJCW9iai0+bW0ucGFnZV9zaXplcy5zZyA9IHBhZ2Vfc2l6ZTsKKworCQl2bWEgPSBpOTE1X3Zt YV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCWlmIChJU19FUlIodm1hKSkg eworCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQll cnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFncyk7CisJCWlmIChlcnIpIHsKKwkJCWk5 MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCUdFTV9CVUdf T04odm1hLT5wYWdlX3NpemVzLmd0dCAhPSBwYWdlX3NpemUpOworCisJCWk5MTVfdm1hX3VucGlu KHZtYSk7CisJCWVyciA9IGk5MTVfdm1hX3VuYmluZCh2bWEpOworCQlpZiAoZXJyKSB7CisJCQlp OTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQkvKiBUcnkg YWxsIHRoZSBvdGhlciB2YWxpZCBvZmZzZXRzIHVudGlsIHRoZSBuZXh0IGJvdW5kYXJ5IC0tCisJ CSAqIHNob3VsZCBhbHdheXMgZmFsbCBiYWNrIHRvIHVzaW5nIDRLIHBhZ2VzLgorCQkgKi8KKwkJ Zm9yIChvZmZzZXQgPSA0MDk2OyBvZmZzZXQgPCBwYWdlX3NpemU7IG9mZnNldCArPSA0MDk2KSB7 CisJCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFncyB8IG9mZnNldCk7CisJCQlp ZiAoZXJyKSB7CisJCQkJaTkxNV92bWFfY2xvc2Uodm1hKTsKKwkJCQlnb3RvIG91dF91bnBpbjsK KwkJCX0KKworCQkJR0VNX0JVR19PTih2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9CisJCQkJICAgSTkx NV9HVFRfUEFHRV9TSVpFXzRLKTsKKworCQkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJCWVyciA9 IGk5MTVfdm1hX3VuYmluZCh2bWEpOworCQkJaWYgKGVycikgeworCQkJCWk5MTVfdm1hX2Nsb3Nl KHZtYSk7CisJCQkJZ290byBvdXRfdW5waW47CisJCQl9CisKKwkJCWlmIChpZ3RfdGltZW91dChl bmRfdGltZSwKKwkJCQkJIiVzIHRpbWVkIG91dCBhdCBvZmZzZXQgJXggd2l0aCBwYWdlLXNpemUg JXhcbiIsCisJCQkJCV9fZnVuY19fLCBvZmZzZXQsIHBhZ2Vfc2l6ZSkpCisJCQkJYnJlYWs7CisJ CX0KKworCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCisJCWk5MTVfZ2VtX29iamVjdF91bnBpbl9w YWdlcyhvYmopOworCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJfQorCisJcmV0dXJuIDA7 CisKK291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKK291dF9w dXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJcmV0dXJuIGVycjsKK30KKworc3Rh dGljIGludCBpZ3RfbW9ja19wcGd0dF82NEsodm9pZCAqYXJnKQoreworCXN0cnVjdCBpOTE1X2h3 X3BwZ3R0ICpwcGd0dCA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHBw Z3R0LT5iYXNlLmk5MTU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwljb25z dCBzdHJ1Y3Qgb2JqZWN0X2luZm8geworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkJdW5zaWduZWQg aW50IGd0dDsKKwkJdW5zaWduZWQgaW50IG9mZnNldDsKKwl9IG9iamVjdHNbXSA9IHsKKwkJLyog Q2FzZXMgd2l0aCBmb3JjZWQgcGFkZGluZy9hbGlnbm1lbnQgKi8KKwkJeworCQkJLnNpemUgPSBT Wl82NEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SywKKwkJCS5vZmZzZXQgPSAw LAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzY0SyArIFNaXzRLLAorCQkJLmd0dCA9IEk5MTVf R1RUX1BBR0VfU0laRV80SywKKwkJCS5vZmZzZXQgPSAwLgorCQl9LAorCQl7CisJCQkuc2l6ZSA9 IFNaXzJNIC0gU1pfNEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQkJLm9m ZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfMk0gKyBTWl82NEssCisJCQkuZ3R0 ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SywKKwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJ CQkuc2l6ZSA9IFNaXzJNICsgU1pfNEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0 SyB8IEk5MTVfR1RUX1BBR0VfU0laRV80SywKKwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQkvKiBU cnkgd2l0aG91dCBhbnkgZm9yY2VkIHBhZGRpbmcvYWxpZ25tZW50ICovCisJCXsKKwkJCS5zaXpl ID0gU1pfNjRLLAorCQkJLm9mZnNldCA9IFNaXzJNLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0Vf U0laRV80SywKKwkJfSwKKwkJeworCQkJLnNpemUgPSBTWl8xMjhLLAorCQkJLm9mZnNldCA9IFNa XzJNIC0gU1pfNjRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV80SywKKwkJfSwKKwl9 OworCWludCBpOworCWludCBlcnI7CisKKwlpZiAoIUhBU19QQUdFX1NJWkUoaTkxNSwgSTkxNV9H VFRfUEFHRV9TSVpFXzY0SykpCisJCXJldHVybiAwOworCisJLyogU2FuaXR5IGNoZWNrIHNvbWUg b2YgdGhlIHRyaWNraW5lc3Mgd2l0aCA2NEsgcGFnZXMgLS0gZWl0aGVyIHdlIGNhbgorCSAqIHNh ZmVseSBtYXJrIHRoZSB3aG9sZSBwYWdlLXRhYmxlKDJNIGJsb2NrKSBhcyA2NEssIG9yIHdlIGhh dmUgdG8KKwkgKiBhbHdheXMgZmFsbGJhY2sgdG8gNEsuCisJICovCisKKwlmb3IgKGkgPSAwOyBp IDwgQVJSQVlfU0laRShvYmplY3RzKTsgKytpKSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gb2Jq ZWN0c1tpXS5zaXplOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZ3R0ID0gb2JqZWN0c1tpXS5n dHQ7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBvYmplY3RzW2ldLm9mZnNldDsKKwkJc3RydWN0 IGk5MTVfdm1hICp2bWE7CisJCWludCBmbGFncyA9IFBJTl9VU0VSOworCisJCW9iaiA9IGZha2Vf aHVnZV9wYWdlc19vYmplY3QoaTkxNSwgc2l6ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJl dHVybiBQVFJfRVJSKG9iaik7CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhv YmopOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCUdFTV9CVUdfT04oIW9iai0+ bW0ucGFnZV9zaXplcy5zZyk7CisKKwkJLyogRGlzYWJsZSAyTSBwYWdlcyAtLSBXZSBvbmx5IHdh bnQgdG8gdXNlIDY0Sy80SyBwYWdlcyBmb3IKKwkJICogdGhpcyB0ZXN0LgorCQkgKi8KKwkJb2Jq LT5tbS5wYWdlX3NpemVzLnNnICY9IH5JOTE1X0dUVF9QQUdFX1NJWkVfMk07CisKKwkJdm1hID0g aTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQlpZiAoSVNfRVJS KHZtYSkpIHsKKwkJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJCWdvdG8gb3V0X3VucGluOworCQl9 CisKKwkJaWYgKG9mZnNldCkKKwkJCWZsYWdzIHw9IFBJTl9PRkZTRVRfRklYRUQgfCBvZmZzZXQ7 CisKKwkJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOworCQlpZiAoZXJyKSB7 CisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQlH RU1fQlVHX09OKG9iai0+bW0ucGFnZV9zaXplcy5ndHQpOworCQlHRU1fQlVHX09OKCF2bWEtPnBh Z2Vfc2l6ZXMuc2cpOworCQlHRU1fQlVHX09OKCF2bWEtPnBhZ2Vfc2l6ZXMucGh5cyk7CisKKwkJ R0VNX0JVR19PTih2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9IGV4cGVjdGVkX2d0dCk7CisKKwkJaWYg KCFvZmZzZXQgJiYgdm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9HVFRfUEFHRV9TSVpFXzY0Sykg eworCQkJR0VNX0JVR19PTighSVNfQUxJR05FRCh2bWEtPm5vZGUuc3RhcnQsCisJCQkJCSAgICAg ICBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKTsKKwkJCUdFTV9CVUdfT04oIUlTX0FMSUdORUQodm1h LT5ub2RlLnNpemUsCisJCQkJCSAgICAgICBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKTsKKwkJfQor CisJCWk5MTVfdm1hX3VucGluKHZtYSk7CisJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisKKwkJaTkx NV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2Jq KTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBp bl9wYWdlcyhvYmopOworb3V0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwly ZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF9tb2NrX2V4aGF1c3RfZGV2aWNlX3N1cHBv cnRlZF9wYWdlcyh2b2lkICphcmcpCit7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0ID0g YXJnOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gcHBndHQtPmJhc2UuaTkxNTsK Kwl1bnNpZ25lZCBpbnQgc2F2ZWRfbWFzayA9IElOVEVMX0lORk8oaTkxNSktPnBhZ2Vfc2l6ZV9t YXNrOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IGksIGo7CisJaW50 IGVycjsKKworCS8qIFNhbml0eSBjaGVjayBjcmVhdGluZyBvYmplY3RzIHdpdGggZXZlcnkgdmFs aWQgcGFnZSBzdXBwb3J0CisJICogY29tYmluYXRpb24gZm9yIG91ciBtb2NrIGRldmljZS4KKwkg Ki8KKworCWZvciAoaSA9IDE7IGkgPCBCSVQoQVJSQVlfU0laRShwYWdlX3NpemVzKSk7IGkrKykg eworCQl1bnNpZ25lZCBpbnQgY29tYmluYXRpb24gPSAwOworCQlzdHJ1Y3QgaTkxNV92bWEgKnZt YTsKKworCQlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShwYWdlX3NpemVzKTsgaisrKSB7CisJ CQlpZiAoaSAmIEJJVChqKSkKKwkJCQljb21iaW5hdGlvbiB8PSBwYWdlX3NpemVzW2pdOworCQl9 CisKKwkJbWt3cml0ZV9kZXZpY2VfaW5mbyhpOTE1KS0+cGFnZV9zaXplX21hc2sgPSBjb21iaW5h dGlvbjsKKworCQlvYmogPSBmYWtlX2h1Z2VfcGFnZXNfb2JqZWN0KGk5MTUsIGNvbWJpbmF0aW9u KTsKKwkJaWYgKElTX0VSUihvYmopKSB7CisJCQllcnIgPSBQVFJfRVJSKG9iaik7CisJCQlnb3Rv IG91dF9kZXZpY2U7CisJCX0KKworCQlHRU1fQlVHX09OKG9iai0+YmFzZS5zaXplICE9IGNvbWJp bmF0aW9uKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJCWlm IChlcnIpCisJCQlnb3RvIG91dF9wdXQ7CisKKwkJR0VNX0JVR19PTihvYmotPm1tLnBhZ2Vfc2l6 ZXMuc2cgIT0gY29tYmluYXRpb24pOworCisJCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwg JnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJaWYgKElTX0VSUih2bWEpKSB7CisJCQllcnIgPSBQVFJf RVJSKHZtYSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCWVyciA9IGk5MTVfdm1hX3Bp bih2bWEsIDAsIDAsIFBJTl9VU0VSKTsKKwkJaWYgKGVycikgeworCQkJaTkxNV92bWFfY2xvc2Uo dm1hKTsKKwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJR0VNX0JVR19PTihvYmotPm1tLnBh Z2Vfc2l6ZXMuZ3R0KTsKKwkJR0VNX0JVR19PTighdm1hLT5wYWdlX3NpemVzLnNnKTsKKwkJR0VN X0JVR19PTighdm1hLT5wYWdlX3NpemVzLnBoeXMpOworCisJCUdFTV9CVUdfT04odm1hLT5wYWdl X3NpemVzLmd0dCAhPSBjb21iaW5hdGlvbik7CisKKwkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJ aTkxNV92bWFfY2xvc2Uodm1hKTsKKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2Jq KTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCWdvdG8gb3V0X2RldmljZTsK Kworb3V0X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworb3V0X3B1 dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CitvdXRfZGV2aWNlOgorCW1rd3JpdGVfZGV2 aWNlX2luZm8oaTkxNSktPnBhZ2Vfc2l6ZV9tYXNrID0gc2F2ZWRfbWFzazsKKworCXJldHVybiBl cnI7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTkxNV92bWEgKgorZ3B1X3dyaXRlX2R3KHN0cnVjdCBp OTE1X3ZtYSAqdm1hLCB1NjQgb2Zmc2V0LCB1MzIgdmFsKQoreworCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICppOTE1ID0gdG9faTkxNSh2bWEtPm9iai0+YmFzZS5kZXYpOworCWNvbnN0IGludCBn ZW4gPSBJTlRFTF9HRU4odm1hLT52bS0+aTkxNSk7CisJdW5zaWduZWQgaW50IGNvdW50ID0gdm1h LT5zaXplID4+IFBBR0VfU0hJRlQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsK KwlzdHJ1Y3QgaTkxNV92bWEgKmJhdGNoOworCXVuc2lnbmVkIGludCBzaXplOworCXUzMiAqY21k OworCWludCBuOworCWludCBlcnI7CisKKwlzaXplID0gMSArIDQgKiBjb3VudCAqIHNpemVvZih1 MzIpOworCXNpemUgPSByb3VuZF91cChzaXplLCBQQUdFX1NJWkUpOworCW9iaiA9IGk5MTVfZ2Vt X29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgc2l6ZSk7CisJaWYgKElTX0VSUihvYmopKQor CQlyZXR1cm4gRVJSX0NBU1Qob2JqKTsKKworCWNtZCA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFw KG9iaiwgSTkxNV9NQVBfV0IpOworCWlmIChJU19FUlIoY21kKSkgeworCQllcnIgPSBQVFJfRVJS KGNtZCk7CisJCWdvdG8gZXJyOworCX0KKworCW9mZnNldCArPSB2bWEtPm5vZGUuc3RhcnQ7CisK Kwlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQlpZiAoZ2VuID49IDgpIHsKKwkJCSpj bWQrKyA9IE1JX1NUT1JFX0RXT1JEX0lNTV9HRU40OworCQkJKmNtZCsrID0gbG93ZXJfMzJfYml0 cyhvZmZzZXQpOworCQkJKmNtZCsrID0gdXBwZXJfMzJfYml0cyhvZmZzZXQpOworCQkJKmNtZCsr ID0gdmFsOworCQl9IGVsc2UgaWYgKGdlbiA+PSA0KSB7CisJCQkqY21kKysgPSBNSV9TVE9SRV9E V09SRF9JTU1fR0VONCB8CisJCQkJKGdlbiA8IDYgPyAxIDw8IDIyIDogMCk7CisJCQkqY21kKysg PSAwOworCQkJKmNtZCsrID0gb2Zmc2V0OworCQkJKmNtZCsrID0gdmFsOworCQl9IGVsc2Ugewor CQkJKmNtZCsrID0gTUlfU1RPUkVfRFdPUkRfSU1NIHwgMSA8PCAyMjsKKwkJCSpjbWQrKyA9IG9m ZnNldDsKKwkJCSpjbWQrKyA9IHZhbDsKKwkJfQorCisJCW9mZnNldCArPSBQQUdFX1NJWkU7CisJ fQorCisJKmNtZCA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisKKwlpOTE1X2dlbV9vYmplY3RfdW5w aW5fbWFwKG9iaik7CisKKwllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4o b2JqLCBmYWxzZSk7CisJaWYgKGVycikKKwkJZ290byBlcnI7CisKKwliYXRjaCA9IGk5MTVfdm1h X2luc3RhbmNlKG9iaiwgdm1hLT52bSwgTlVMTCk7CisJaWYgKElTX0VSUihiYXRjaCkpIHsKKwkJ ZXJyID0gUFRSX0VSUihiYXRjaCk7CisJCWdvdG8gZXJyOworCX0KKworCWVyciA9IGk5MTVfdm1h X3BpbihiYXRjaCwgMCwgMCwgUElOX1VTRVIpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJ cmV0dXJuIGJhdGNoOworCitlcnI6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJcmV0 dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBncHVfd3JpdGUoc3RydWN0IGk5MTVf dm1hICp2bWEsCisJCSAgICAgc3RydWN0IGk5MTVfZ2VtX2NvbnRleHQgKmN0eCwKKwkJICAgICB1 MzIgZHdvcmQsCisJCSAgICAgdTMyIHZhbHVlKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1ID0gdG9faTkxNSh2bWEtPm9iai0+YmFzZS5kZXYpOworCXN0cnVjdCBkcm1faTkxNV9n ZW1fcmVxdWVzdCAqcnE7CisJc3RydWN0IGk5MTVfdm1hICpiYXRjaDsKKwlpbnQgZmxhZ3MgPSAw OworCWludCBlcnI7CisKKwllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3RvX2d0dF9kb21haW4o dm1hLT5vYmosIHRydWUpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlycSA9IGk5MTVf Z2VtX3JlcXVlc3RfYWxsb2MoaTkxNS0+ZW5naW5lW1JDU10sIGN0eCk7CisJaWYgKElTX0VSUihy cSkpCisJCXJldHVybiBQVFJfRVJSKHJxKTsKKworCWJhdGNoID0gZ3B1X3dyaXRlX2R3KHZtYSwg ZHdvcmQgKiBzaXplb2YodTMyKSwgdmFsdWUpOworCWlmIChJU19FUlIoYmF0Y2gpKSB7CisJCWVy ciA9IFBUUl9FUlIoYmF0Y2gpOworCQlnb3RvIGVycl9yZXF1ZXN0OworCX0KKworCWk5MTVfdm1h X21vdmVfdG9fYWN0aXZlKGJhdGNoLCBycSwgMCk7CisJaTkxNV9nZW1fb2JqZWN0X3NldF9hY3Rp dmVfcmVmZXJlbmNlKGJhdGNoLT5vYmopOworCWk5MTVfdm1hX3VucGluKGJhdGNoKTsKKwlpOTE1 X3ZtYV9jbG9zZShiYXRjaCk7CisKKwllcnIgPSBycS0+ZW5naW5lLT5lbWl0X2ZsdXNoKHJxLCBF TUlUX0lOVkFMSURBVEUpOworCWlmIChlcnIpCisJCWdvdG8gZXJyX3JlcXVlc3Q7CisKKwllcnIg PSBpOTE1X3N3aXRjaF9jb250ZXh0KHJxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZXF1ZXN0 OworCisJZXJyID0gcnEtPmVuZ2luZS0+ZW1pdF9iYl9zdGFydChycSwKKwkJCWJhdGNoLT5ub2Rl LnN0YXJ0LCBiYXRjaC0+bm9kZS5zaXplLAorCQkJZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8g ZXJyX3JlcXVlc3Q7CisKKwlpOTE1X3ZtYV9tb3ZlX3RvX2FjdGl2ZSh2bWEsIHJxLCAwKTsKKwor CXJlc2VydmF0aW9uX29iamVjdF9sb2NrKHZtYS0+cmVzdiwgTlVMTCk7CisJcmVzZXJ2YXRpb25f b2JqZWN0X2FkZF9leGNsX2ZlbmNlKHZtYS0+cmVzdiwgJnJxLT5mZW5jZSk7CisJcmVzZXJ2YXRp b25fb2JqZWN0X3VubG9jayh2bWEtPnJlc3YpOworCitlcnJfcmVxdWVzdDoKKwlfX2k5MTVfYWRk X3JlcXVlc3QocnEsIGVyciA9PSAwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQg dW5tYXBfbWFwcGluZyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXZvaWQg KnB0cjsKKwlpbnQgZXJyOworCisJZXJyID0gbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlKCZvYmot Pm1tLmxvY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlwdHIgPSBwYWdlX21hc2tf Yml0cyhvYmotPm1tLm1hcHBpbmcpOworCWlmIChwdHIpIHsKKwkJaWYgKGlzX3ZtYWxsb2NfYWRk cihwdHIpKQorCQkJdnVubWFwKHB0cik7CisJCWVsc2UKKwkJCWt1bm1hcChrbWFwX3RvX3BhZ2Uo cHRyKSk7CisKKwkJb2JqLT5tbS5tYXBwaW5nID0gTlVMTDsKKwl9CisKKwltdXRleF91bmxvY2so Jm9iai0+bW0ubG9jayk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBEV09SRFNfUEVSX1BB R0UgKFBBR0VfU0laRS9zaXplb2YodTMyKSkKKworc3RhdGljIGludCBjcHVfY2hlY2soc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgdTMyIGR3b3JkLCB1MzIgdmFsKQoreworCWVudW0g aTkxNV9tYXBfdHlwZSBsZXZlbDsKKwlpbnQgZXJyOworCisJZm9yIChsZXZlbCA9IEk5MTVfTUFQ X1dCOyBsZXZlbCA8PSBJOTE1X01BUF9XQzsgbGV2ZWwrKykgeworCQl1MzIgKm1hcCwgb2Zmc2V0 OworCisJCWlmIChsZXZlbCA9PSBJOTE1X01BUF9XQikKKwkJCWVyciA9IGk5MTVfZ2VtX29iamVj dF9zZXRfdG9fY3B1X2RvbWFpbihvYmosIGZhbHNlKTsKKwkJZWxzZQorCQkJZXJyID0gaTkxNV9n ZW1fb2JqZWN0X3NldF90b193Y19kb21haW4ob2JqLCBmYWxzZSk7CisJCWlmIChlcnIpCisJCQly ZXR1cm4gZXJyOworCisJCXVubWFwX21hcHBpbmcob2JqKTsKKwkJbWFwID0gaTkxNV9nZW1fb2Jq ZWN0X3Bpbl9tYXAob2JqLCBsZXZlbCk7CisJCWlmIChJU19FUlIobWFwKSkKKwkJCXJldHVybiBQ VFJfRVJSKG1hcCk7CisKKwkJZm9yIChvZmZzZXQgPSBkd29yZDsgb2Zmc2V0IDwgb2JqLT5iYXNl LnNpemUvc2l6ZW9mKHUzMik7CisJCSAgICAgb2Zmc2V0ICs9IERXT1JEU19QRVJfUEFHRSkgewor CQkJaWYgKG1hcFtvZmZzZXRdICE9IHZhbCkgeworCQkJCXByX2VycigibWFwWyV1XSA9ICV1LCBl eHBlY3RlZCAldVxuIiwKKwkJCQkgICAgICAgb2Zmc2V0LCBtYXBbb2Zmc2V0XSwgdmFsKTsKKwkJ CQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0X2Nsb3NlOworCQkJfQorCQl9CisKKwkJaTkx NV9nZW1fb2JqZWN0X3VucGluX21hcChvYmopOworCX0KKworCXJldHVybiAwOworCitvdXRfY2xv c2U6CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX21hcChvYmopOworCisJcmV0dXJuIGVycjsKK30K Kworc3RhdGljIGludCBpZ3Rfd3JpdGVfaHVnZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJh c2UuZGV2KTsKKwl1bnNpZ25lZCBsb25nIHN1cHBvcnRlZCA9IElOVEVMX0lORk8oaTkxNSktPnBh Z2Vfc2l6ZV9tYXNrOworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGk5MTUtPmtlcm5l bF9jb250ZXh0LT5wcGd0dDsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSU5fVVNFUiB8IFBJTl9P RkZTRVRfRklYRUQ7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJaW50IGJpdDsKKwlpbnQgZXJy OworCisJLyogU2FuaXR5IGNoZWNrIHRoYXQgdGhlIEhXIHVzZXMgaHVnZSBwYWdlcyBjb3JyZWN0 bHkgLS0gZW5zdXJlIHRoYXQKKwkgKiBvdXIgd3JpdGVzIGxhbmQgaW4gdGhlIHJpZ2h0IHBsYWNl CisJICovCisKKwlHRU1fQlVHX09OKG9iai0+YmFzZS5zaXplICE9IFNaXzJNKTsKKworCWVyciA9 IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJy OworCisJLyogV2Ugd2FudCB0byBydW4gdGhlIHRlc3QgZXZlbiBpZiB0aGUgcGxhdGZvcm0gZG9l c24ndCBzdXBwb3J0IGh1Z2UgZ3R0CisJICogcGFnZXMgLS0gb3VyIG9ubHkgcmVxdWlyZW1lbnQg aXMgdGhhdCB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYQorCSAqICJodWdlLXBhZ2UiLgorCSAq LworCWlmIChvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5cyA8IEk5MTVfR1RUX1BBR0VfU0laRV8yTSkg eworCQlwcl9pbmZvKCJVbmFibGUgdG8gYWxsb2NhdGUgaHVnZS1wYWdlLCBmaW5pc2hpbmcgdGVz dCBlYXJseVxuIik7CisJCWdvdG8gb3V0X3VucGluOworCX0KKworCXZtYSA9IGk5MTVfdm1hX2lu c3RhbmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJ ZXJyID0gUFRSX0VSUih2bWEpOworCQlnb3RvIG91dF91bnBpbjsKKwl9CisKKwlmb3JfZWFjaF9z ZXRfYml0KGJpdCwgJnN1cHBvcnRlZCwgaWxvZzIoSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSArIDEp IHsKKwkJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOworCQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplID0g QklUKGJpdCk7CisJCXUzMiBtYXggPSBwcGd0dC0+YmFzZS50b3RhbCAvIEk5MTVfR1RUX1BBR0Vf U0laRV8yTSAtIDE7CisJCXUzMiBudW07CisKKwkJLyogRm9yY2UgdGhlIHBhZ2Ugc2l6ZSAqLwor CQl2bWEtPnBhZ2Vfc2l6ZXMuc2cgPSBvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cgPSBwYWdlX3NpemU7 CisKKwkJLyogVHJ5IHZhcmlvdXMgb2Zmc2V0cyB1bnRpbCB3ZSB0aW1lb3V0IC0tIHdlIHdhbnQg dG8gYXZvaWQKKwkJICogaXNzdWVzIGhpZGRlbiBieSBlZmZlY3RpdmVseSBhbHdheXMgdXNpbmcg b2Zmc2V0ID0gMC4KKwkJICovCisJCWZvcl9lYWNoX3ByaW1lX251bWJlcl9mcm9tKG51bSwgMCwg bWF4KSB7CisJCQl1NjQgb2Zmc2V0ID0gbnVtICogSTkxNV9HVFRfUEFHRV9TSVpFXzJNOworCQkJ dTMyIGR3b3JkOworCisJCQllcnIgPSBpOTE1X3ZtYV91bmJpbmQodm1hKTsKKwkJCWlmIChlcnIp CisJCQkJZ290byBvdXRfY2xvc2U7CisKKwkJCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAs IGZsYWdzIHwgb2Zmc2V0KTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfY2xvc2U7CisKKwkJ CUdFTV9CVUdfT04ob2JqLT5tbS5wYWdlX3NpemVzLmd0dCk7CisJCQlHRU1fQlVHX09OKHZtYS0+ cGFnZV9zaXplcy5zZyAhPSBwYWdlX3NpemUpOworCQkJR0VNX0JVR19PTighdm1hLT5wYWdlX3Np emVzLnBoeXMpOworCisJCQlHRU1fQlVHX09OKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gcGFnZV9z aXplKTsKKworCQkJZm9yIChkd29yZCA9IDA7IGR3b3JkIDwgRFdPUkRTX1BFUl9QQUdFOyArK2R3 b3JkKSB7CisJCQkJZXJyID0gZ3B1X3dyaXRlKHZtYSwgaTkxNS0+a2VybmVsX2NvbnRleHQsCisJ CQkJCQlkd29yZCwgbnVtICsgMSk7CisJCQkJaWYgKGVycikgeworCQkJCQlwcl9lcnIoImdwdV93 cml0ZSBmYWlsZWQgd2l0aCBwYWdlLXNpemUgJXhcbiIsCisJCQkJCSAgICAgICBwYWdlX3NpemUp OworCQkJCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQkJCQlnb3RvIG91dF9jbG9zZTsKKwkJCQl9 CisKKwkJCQllcnIgPSBjcHVfY2hlY2sob2JqLCBkd29yZCwgbnVtICsgMSk7CisJCQkJaWYgKGVy cikgeworCQkJCQlwcl9lcnIoImNwdV9jaGVjayBmYWlsZWQgd2l0aCBwYWdlLXNpemUgJXhcbiIs CisJCQkJCSAgICAgICBwYWdlX3NpemUpOworCQkJCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQkJ CQlnb3RvIG91dF9jbG9zZTsKKwkJCQl9CisJCQl9CisKKwkJCWk5MTVfdm1hX3VucGluKHZtYSk7 CisKKwkJCWlmIChudW0gPiAwICYmCisJCQkgICAgaWd0X3RpbWVvdXQoZW5kX3RpbWUsCisJCQkJ CSIlcyB0aW1lZCBvdXQgYXQgb2Zmc2V0ICVsbHggd2l0aCBwcyAleFxuIiwKKwkJCQkJX19mdW5j X18sIG9mZnNldCwgcGFnZV9zaXplKSkKKwkJCQlicmVhazsKKwkJfQorCX0KKworb3V0X2Nsb3Nl OgorCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CitvdXRfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3Vu cGluX3BhZ2VzKG9iaik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF9wcGd0 dF93cml0ZV9odWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQg PSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBwcGd0dC0+YmFzZS5pOTE1 OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJaW50IGVycjsKKworCS8qIFRy eSB3aXRob3V0IHRocCAqLworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwo aTkxNSwgU1pfMk0pOworCWlmIChJU19FUlIob2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsK KworCWVyciA9IGlndF93cml0ZV9odWdlKG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCWlmIChlcnIpIHsKKwkJcHJfZXJyKCJ3cml0ZS1odWdlIGZhaWxlZCB3aXRoIGludGVybmFs IGFsbG9jYXRvclxuIik7CisJCXJldHVybiBlcnI7CisJfQorCisJaWYgKCFoYXNfdHJhbnNwYXJl bnRfaHVnZXBhZ2UoKSkgeworCQlwcl9pbmZvKCJ0aHAgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmdc biIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgd2l0aCB0aHAgdGhyb3VnaCBnZW1mcyAq LworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGUoaTkxNSwgU1pfMk0pOworCWlmIChJU19F UlIob2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCWVyciA9IGlndF93cml0ZV9odWdl KG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCWlmIChlcnIpCisJCXByX2Vycigi d3JpdGUtaHVnZSBmYWlsZWQgd2l0aCB0aHBcbiIpOworCisJcmV0dXJuIGVycjsKK30KKworc3Rh dGljIGludCBpZ3RfcHBndHRfcGluX3VwZGF0ZSh2b2lkICphcmcpCit7CisJc3RydWN0IGk5MTVf aHdfcHBndHQgKnBwZ3R0ID0gYXJnOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0g cHBndHQtPmJhc2UuaTkxNTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0 cnVjdCBpOTE1X3ZtYSAqdm1hOworCXVuc2lnbmVkIGludCBmbGFncyA9IFBJTl9VU0VSIHwgUElO X09GRlNFVF9GSVhFRDsKKwl1bnNpZ25lZCBpbnQgbmVlZHNfZmx1c2g7CisJdTMyICpwdHI7CisJ aW50IGVycjsKKworCS8qIE1ha2Ugc3VyZSB0aGVyZSdzIG5vIGZ1bm55IGJ1c2luZXNzIHdpdGgg ZG9pbmcgYSBQSU5fVVBEQVRFIC0tIGluIHRoZQorCSAqIHBhc3Qgd2UgaGFkIGEgc3VidGxlIGlz c3VlIHdpdGggYmVpbmcgYWJsZSB0byBpbmNvcnJlY3RseSBkbyBtdWx0aXBsZQorCSAqIGFsbG9j IHZhIHJhbmdlcyBvbiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBkb2luZyBhIFBJTl9VUERBVEUsIHdo aWNoCisJICogcmVzdWx0ZWQgaW4gc29tZSBwcmV0dHkgbmFzdHkgYnVncywgdGhvdWdoIG9ubHkg d2hlbiB1c2luZworCSAqIGh1Z2UtZ3R0LXBhZ2VzLgorCSAqLworCisJaWYgKCFIQVNfUEFHRV9T SVpFKGk5MTUsIEk5MTVfR1RUX1BBR0VfU0laRV8yTSkpIHsKKwkJcHJfaW5mbygiaHVnZS1ndHQt cGFnZXMgbm90IHN1cHBvcnRlZCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlw cGd0dCA9IGk5MTUtPmtlcm5lbF9jb250ZXh0LT5wcGd0dDsKKworCW9iaiA9IGk5MTVfZ2VtX29i amVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKTsKKwlpZiAo SVNfRVJSKG9iaikpCisJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwl2bWEgPSBpOTE1X3ZtYV9p bnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJaWYgKElTX0VSUih2bWEpKSB7CisJ CWVyciA9IFBUUl9FUlIodm1hKTsKKwkJZ290byBvdXRfY2xvc2U7CisJfQorCisJZXJyID0gaTkx NV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3Nl OworCisJaWYgKHZtYS0+cGFnZV9zaXplcy5zZyA8IEk5MTVfR1RUX1BBR0VfU0laRV8yTSkgewor CQlwcl9pbmZvKCJVbmFibGUgdG8gYWxsb2NhdGUgaHVnZS1wYWdlLCBmaW5pc2hpbmcgdGVzdCBl YXJseVxuIik7CisJCWdvdG8gb3V0X3VucGluOworCX0KKworCUdFTV9CVUdfT04odm1hLT5wYWdl X3NpemVzLmd0dCAhPSBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pOworCisJZXJyID0gaTkxNV92bWFf YmluZCh2bWEsIEk5MTVfQ0FDSEVfTk9ORSwgUElOX1VQREFURSk7CisJaWYgKGVycikKKwkJZ290 byBvdXRfY2xvc2U7CisKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworCWk5MTVfdm1hX2Nsb3NlKHZt YSk7CisKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlvYmogPSBpOTE1X2dlbV9vYmpl Y3RfY3JlYXRlX2ludGVybmFsKGk5MTUsIFBBR0VfU0laRSk7CisJaWYgKElTX0VSUihvYmopKQor CQlyZXR1cm4gUFRSX0VSUihvYmopOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAm cHBndHQtPmJhc2UsIE5VTEwpOworCWlmIChJU19FUlIodm1hKSkgeworCQllcnIgPSBQVFJfRVJS KHZtYSk7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKKwllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAw LCAwLCBmbGFncyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisKKwkvKiBNYWtlIHN1 cmUgdGhlIHBkZSBpc24ndCBzdGlsbCBwb2ludGluZyB0byB0aGUgMk0gcGFnZSwgYW5kIHRoYXQg dGhlCisJICogcHQgd2UganVzdCBmaWxsZWQtaW4gaXNuJ3QgZGFuZ2xpbmcgLS0gd2UgY2FuIGNo ZWNrIHRoaXMgYnkgd3JpdGluZworCSAqIHRvIHRoZSBmaXJzdCBwYWdlIHdoZXJlIGl0IHdvdWxk IHRoZW4gbGFuZCBpbiB0aGUgbm93IHN0YWxlIDJNIHBhZ2UuCisJICovCisKKwllcnIgPSBncHVf d3JpdGUodm1hLCBpOTE1LT5rZXJuZWxfY29udGV4dCwgMCwgMHhkZWFkYmVhZik7CisJaWYgKGVy cikKKwkJZ290byBvdXRfdW5waW47CisKKwllcnIgPSBpOTE1X2dlbV9vYmpfcHJlcGFyZV9zaG1l bV9yZWFkKG9iaiwgJm5lZWRzX2ZsdXNoKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF91bnBpbjsK KworCXB0ciA9IGttYXBfYXRvbWljKGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShvYmosIDApKTsK KwlpZiAobmVlZHNfZmx1c2ggJiBDTEZMVVNIX0JFRk9SRSkKKwkJZHJtX2NsZmx1c2hfdmlydF9y YW5nZShwdHIsIFBBR0VfU0laRSk7CisKKwlpZiAoKnB0ciAhPSAweGRlYWRiZWFmKSB7CisJCXBy X2VycigicHRyID0gJXgsIGV4cGVjdGVkICV4XG4iLCAqcHRyLCAweGRlYWRiZWFmKTsKKwkJZXJy ID0gLUVJTlZBTDsKKwl9CisKKwlrdW5tYXBfYXRvbWljKHB0cik7CisKKwlpOTE1X2dlbV9vYmpf ZmluaXNoX3NobWVtX2FjY2VzcyhvYmopOworCitvdXRfdW5waW46CisJaTkxNV92bWFfdW5waW4o dm1hKTsKK291dF9jbG9zZToKKwlpOTE1X3ZtYV9jbG9zZSh2bWEpOworb3V0X3B1dDoKKwlpOTE1 X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGln dF9wcGd0dF9nZW1mc19odWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaTkxNV9od19wcGd0dCAq cHBndHQgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBwcGd0dC0+YmFz ZS5pOTE1OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJY29uc3QgdW5zaWdu ZWQgaW50IG9iamVjdF9zaXplc1tdID0geworCQlJOTE1X0dUVF9QQUdFX1NJWkVfMk0sCisJCUk5 MTVfR1RUX1BBR0VfU0laRV8yTSArIEk5MTVfR1RUX1BBR0VfU0laRV80SywKKwl9OworCWludCBl cnI7CisJaW50IGk7CisKKwlpZiAoIWhhc190cmFuc3BhcmVudF9odWdlcGFnZSgpKSB7CisJCXBy X2luZm8oInRocCBub3Qgc3VwcG9ydGVkLCBza2lwcGluZ1xuIik7CisJCXJldHVybiAwOworCX0K KworCS8qIFNhbml0eSBjaGVjayBUSFAgdGhyb3VnaCBnZW1mcyAqLworCisJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUob2JqZWN0X3NpemVzKTsgKytpKSB7CisJCXVuc2lnbmVkIGludCBzaXpl ID0gb2JqZWN0X3NpemVzW2ldOworCQlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKworCQlvYmogPSBp OTE1X2dlbV9vYmplY3RfY3JlYXRlKGk5MTUsIHNpemUpOworCQlpZiAoSVNfRVJSKG9iaikpCisJ CQlyZXR1cm4gUFRSX0VSUihvYmopOworCisJCWVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFn ZXMob2JqKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X3B1dDsKKworCQlHRU1fQlVHX09OKCFv YmotPm1tLnBhZ2Vfc2l6ZXMuc2cpOworCisJCWlmIChvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5cyA8 IEk5MTVfR1RUX1BBR0VfU0laRV8yTSkgeworCQkJcHJfaW5mbygiVW5hYmxlIHRvIGFsbG9jYXRl IHRocCwgZmluaXNoaW5nIHRlc3QgZWFybHlcbiIpOworCQkJZ290byBvdXRfdW5waW47CisJCX0K KworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJ CWlmIChJU19FUlIodm1hKSkgeworCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJZ290byBvdXRf dW5waW47CisJCX0KKworCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBQSU5fVVNFUik7 CisJCWlmIChlcnIpIHsKKwkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQlnb3RvIG91dF91bnBp bjsKKwkJfQorCisJCUdFTV9CVUdfT04ob2JqLT5tbS5wYWdlX3NpemVzLmd0dCk7CisJCUdFTV9C VUdfT04oIXZtYS0+cGFnZV9zaXplcy5zZyk7CisJCUdFTV9CVUdfT04oIXZtYS0+cGFnZV9zaXpl cy5waHlzKTsKKworCQlpZiAodm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9HVFRfUEFHRV9TSVpF XzJNKSB7CisJCQlHRU1fQlVHX09OKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gc2l6ZSk7CisJCQlH RU1fQlVHX09OKCFJU19BTElHTkVEKHZtYS0+bm9kZS5zdGFydCwKKwkJCQkJICAgICAgIEk5MTVf R1RUX1BBR0VfU0laRV8yTSkpOworCQl9CisKKwkJaWYgKHZtYS0+cGFnZV9zaXplcy5zZyAmIEk5 MTVfR1RUX1BBR0VfU0laRV82NEspIHsKKwkJCUdFTV9CVUdfT04oIUlTX0FMSUdORUQodm1hLT5u b2RlLnNpemUsCisJCQkJCSAgICAgICBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKTsKKwkJfQorCisJ CWk5MTVfdm1hX3VucGluKHZtYSk7CisJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisKKwkJaTkxNV9n ZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsK Kwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBpbl9w YWdlcyhvYmopOworb3V0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1 cm4gZXJyOworfQorCitpbnQgaTkxNV9nZW1faHVnZV9wYWdlX21vY2tfc2VsZnRlc3RzKHZvaWQp Cit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKKwkJU1VC VEVTVChpZ3RfbW9ja19wcGd0dF9odWdlX2ZpbGwpLAorCQlTVUJURVNUKGlndF9tb2NrX3BwZ3R0 X21pc2FsaWduZWRfZG1hKSwKKwkJU1VCVEVTVChpZ3RfbW9ja19wcGd0dF82NEspLAorCQlTVUJU RVNUKGlndF9tb2NrX2V4aGF1c3RfZGV2aWNlX3N1cHBvcnRlZF9wYWdlcyksCisJfTsKKwlpbnQg c2F2ZWRfcHBndHQgPSBpOTE1LmVuYWJsZV9wcGd0dDsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXY7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0OworCWludCBlcnI7CisK KwlkZXZfcHJpdiA9IG1vY2tfZ2VtX2RldmljZSgpOworCWlmICghZGV2X3ByaXYpCisJCXJldHVy biAtRU5PTUVNOworCisJLyogUHJldGVuZCB0byBiZSBhIGRldmljZSB3aGljaCBzdXBwb3J0cyB0 aGUgNDhiIFBQR1RUICovCisJaTkxNS5lbmFibGVfcHBndHQgPSAzOworCisJbXV0ZXhfbG9jaygm ZGV2X3ByaXYtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCXBwZ3R0ID0gaTkxNV9wcGd0dF9jcmVhdGUo ZGV2X3ByaXYsIEVSUl9QVFIoLUVOT0RFViksICJtb2NrIik7CisJaWYgKElTX0VSUihwcGd0dCkp IHsKKwkJZXJyID0gUFRSX0VSUihwcGd0dCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwlH RU1fQlVHX09OKCFpOTE1X3ZtX2lzXzQ4Yml0KCZwcGd0dC0+YmFzZSkpOworCisJZXJyID0gaTkx NV9zdWJ0ZXN0cyh0ZXN0cywgcHBndHQpOworCisJaTkxNV9wcGd0dF9jbG9zZSgmcHBndHQtPmJh c2UpOworCWk5MTVfcHBndHRfcHV0KHBwZ3R0KTsKKworb3V0X3VubG9jazoKKwltdXRleF91bmxv Y2soJmRldl9wcml2LT5kcm0uc3RydWN0X211dGV4KTsKKworCWk5MTUuZW5hYmxlX3BwZ3R0ID0g c2F2ZWRfcHBndHQ7CisKKwlkcm1fZGV2X3VucmVmKCZkZXZfcHJpdi0+ZHJtKTsKKworCXJldHVy biBlcnI7Cit9CisKK2ludCBpOTE1X2dlbV9odWdlX3BhZ2VfbGl2ZV9zZWxmdGVzdHMoc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaTkx NV9zdWJ0ZXN0IHRlc3RzW10gPSB7CisJCVNVQlRFU1QoaWd0X3BwZ3R0X2dlbWZzX2h1Z2UpLAor CQlTVUJURVNUKGlndF9wcGd0dF9waW5fdXBkYXRlKSwKKwkJU1VCVEVTVChpZ3RfcHBndHRfd3Jp dGVfaHVnZSksCisJfTsKKwlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQ7CisJc3RydWN0IGRy bV9maWxlICpmaWxlOworCWludCBlcnI7CisKKwlpZiAoIVVTRVNfRlVMTF9QUEdUVChkZXZfcHJp dikpCisJCXJldHVybiAwOworCisJZmlsZSA9IG1vY2tfZmlsZShkZXZfcHJpdik7CisJaWYgKElT X0VSUihmaWxlKSkKKwkJcmV0dXJuIFBUUl9FUlIoZmlsZSk7CisKKwltdXRleF9sb2NrKCZkZXZf cHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7CisJcHBndHQgPSBpOTE1X3BwZ3R0X2NyZWF0ZShkZXZf cHJpdiwgZmlsZS0+ZHJpdmVyX3ByaXYsICJsaXZlIik7CisJaWYgKElTX0VSUihwcGd0dCkpIHsK KwkJZXJyID0gUFRSX0VSUihwcGd0dCk7CisJCWdvdG8gb3V0X3VubG9jazsKKwl9CisKKwllcnIg PSBpOTE1X3N1YnRlc3RzKHRlc3RzLCBwcGd0dCk7CisKKwlpOTE1X3BwZ3R0X2Nsb3NlKCZwcGd0 dC0+YmFzZSk7CisJaTkxNV9wcGd0dF9wdXQocHBndHQpOworCitvdXRfdW5sb2NrOgorCW11dGV4 X3VubG9jaygmZGV2X3ByaXYtPmRybS5zdHJ1Y3RfbXV0ZXgpOworCisJbW9ja19maWxlX2ZyZWUo ZGV2X3ByaXYsIGZpbGUpOworCisJcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMv Z3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmggYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCmluZGV4IDE4YjE3NGQ4 NTVjYS4uNjRhY2Q3ZWNjYzVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxm dGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3Nl bGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmgKQEAgLTE1LDUgKzE1LDYgQEAgc2VsZnRlc3Qo b2JqZWN0cywgaTkxNV9nZW1fb2JqZWN0X2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoZG1hYnVm LCBpOTE1X2dlbV9kbWFidWZfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChjb2hlcmVuY3ksIGk5 MTVfZ2VtX2NvaGVyZW5jeV9saXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGd0dCwgaTkxNV9nZW1f Z3R0X2xpdmVfc2VsZnRlc3RzKQorc2VsZnRlc3QoaHVnZXBhZ2VzLCBpOTE1X2dlbV9odWdlX3Bh Z2VfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChjb250ZXh0cywgaTkxNV9nZW1fY29udGV4dF9s aXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGhhbmdjaGVjaywgaW50ZWxfaGFuZ2NoZWNrX2xpdmVf c2VsZnRlc3RzKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5 MTVfbW9ja19zZWxmdGVzdHMuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1 X21vY2tfc2VsZnRlc3RzLmgKaW5kZXggZmM3NDY4NzUwMWJhLi45OTYxYjQ0Zjc2ZWQgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3Rz LmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbW9ja19zZWxmdGVz dHMuaApAQCAtMjEsMyArMjEsNCBAQCBzZWxmdGVzdChkbWFidWYsIGk5MTVfZ2VtX2RtYWJ1Zl9t b2NrX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KHZtYSwgaTkxNV92bWFfbW9ja19zZWxmdGVzdHMpCiBz ZWxmdGVzdChldmljdCwgaTkxNV9nZW1fZXZpY3RfbW9ja19zZWxmdGVzdHMpCiBzZWxmdGVzdChn dHQsIGk5MTVfZ2VtX2d0dF9tb2NrX3NlbGZ0ZXN0cykKK3NlbGZ0ZXN0KGh1Z2VwYWdlcywgaTkx NV9nZW1faHVnZV9wYWdlX21vY2tfc2VsZnRlc3RzKQotLSAKMi4xMy4zCgpfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0 CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3Rv cC5vcmcvbWFpbG1hbi9saXN0aW5mby9pbnRlbC1nZngK