From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Auld Subject: [PATCH 18/22] drm/i915/selftests: huge page tests Date: Mon, 25 Sep 2017 19:47:33 +0100 Message-ID: <20170925184737.8807-19-matthew.auld@intel.com> References: <20170925184737.8807-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 915B96E3CF for ; Mon, 25 Sep 2017 18:48:11 +0000 (UTC) In-Reply-To: <20170925184737.8807-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 IGFkZCBzaW1wbGUgdG1wZnMgZmFsbGJhY2sgdGVzdAoKU2lnbmVkLW9mZi1ieTogTWF0dGhldyBB dWxkIDxtYXR0aGV3LmF1bGRAaW50ZWwuY29tPgpDYzogSm9vbmFzIExhaHRpbmVuIDxqb29uYXMu bGFodGluZW5AbGludXguaW50ZWwuY29tPgpDYzogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13 aWxzb24uY28udWs+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyAgICAgICAg ICAgICAgICAgICAgfCAgICAxICsKIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVj dC5oICAgICAgICAgICAgIHwgICAgMiArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMv aHVnZV9wYWdlcy5jICAgICAgICB8IDE2ODcgKysrKysrKysrKysrKysrKysrKysKIC4uLi9ncHUv ZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaCAgIHwgICAgMSArCiAuLi4v Z3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3RzLmggICB8ICAgIDEgKwog NSBmaWxlcyBjaGFuZ2VkLCAxNjkyIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdlcy5jCgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtLmMKaW5kZXggMTFiMjg3ZDUzMzE1Li5lMDA4N2YxODBmMjYgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9nZW0uYwpAQCAtNTQxNyw2ICs1NDE3LDcgQEAgaW50IGk5MTVfZ2VtX29iamVjdF9hdHRh Y2hfcGh5cyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgYWxpZ24pCiAjaW5j bHVkZSAic2VsZnRlc3RzL3NjYXR0ZXJsaXN0LmMiCiAjaW5jbHVkZSAic2VsZnRlc3RzL21vY2tf Z2VtX2RldmljZS5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9odWdlX2dlbV9vYmplY3QuYyIKKyNp bmNsdWRlICJzZWxmdGVzdHMvaHVnZV9wYWdlcy5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9pOTE1 X2dlbV9vYmplY3QuYyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fY29oZXJlbmN5LmMi CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVj dC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fb2JqZWN0LmgKaW5kZXggZTRlNmRk OTM4ODlkLi45NTZjOTExYzJjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtX29iamVjdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVj dC5oCkBAIC0xOTYsNiArMTk2LDggQEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgewogCQkJ dW5zaWduZWQgaW50IGd0dDsKIAkJfSBwYWdlX3NpemVzOwogCisJCUk5MTVfU0VMRlRFU1RfREVD TEFSRSh1bnNpZ25lZCBpbnQgcGFnZV9tYXNrKTsKKwogCQlzdHJ1Y3QgaTkxNV9nZW1fb2JqZWN0 X3BhZ2VfaXRlciB7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3BvczsKIAkJCXVuc2lnbmVk IGludCBzZ19pZHg7IC8qIGluIHBhZ2VzLCBidXQgMzJiaXQgZWVrISAqLwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9odWdlX3BhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwLi5iMDQwMTAwMmY0NWYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdlcy5jCkBAIC0wLDAgKzEsMTY4NyBAQAor LyoKKyAqIENvcHlyaWdodCDCqSAyMDE3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlz c2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0 YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVu dGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2Fy ZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0 aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0 ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFu ZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVk IHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBU aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5j bHVkaW5nIHRoZSBuZXh0CisgKiBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBj b3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisg KiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBB TlkgS0lORCwgRVhQUkVTUyBPUgorICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRF RCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBB IFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hB TEwKKyAqIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5Z IENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNU SU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VU IE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhF UiBERUFMSU5HUworICogSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiLi4v aTkxNV9zZWxmdGVzdC5oIgorCisjaW5jbHVkZSA8bGludXgvcHJpbWVfbnVtYmVycy5oPgorCisj aW5jbHVkZSAibW9ja19kcm0uaCIKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwYWdlX3Np emVzW10gPSB7CisJSTkxNV9HVFRfUEFHRV9TSVpFXzJNLAorCUk5MTVfR1RUX1BBR0VfU0laRV82 NEssCisJSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBn ZXRfbGFyZ2VzdF9wYWdlX3NpemUoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCisJCQkJ CSAgc2l6ZV90IHJlbSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpF KHBhZ2Vfc2l6ZXMpOyArK2kpIHsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6 ZXNbaV07CisKKwkJaWYgKEhBU19QQUdFX1NJWkVTKGk5MTUsIHBhZ2Vfc2l6ZSkgJiYgcmVtID49 IHBhZ2Vfc2l6ZSkKKwkJCXJldHVybiBwYWdlX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyB2b2lkIGh1Z2VfcGFnZXNfZnJlZV9wYWdlcyhzdHJ1Y3Qgc2dfdGFibGUgKnN0KQor eworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisKKwlmb3IgKHNnID0gc3QtPnNnbDsgc2c7IHNn ID0gX19zZ19uZXh0KHNnKSkgeworCQlpZiAoc2dfcGFnZShzZykpCisJCQlfX2ZyZWVfcGFnZXMo c2dfcGFnZShzZyksIGdldF9vcmRlcihzZy0+bGVuZ3RoKSk7CisJfQorCisJc2dfZnJlZV90YWJs ZShzdCk7CisJa2ZyZWUoc3QpOworfQorCitzdGF0aWMgaW50IGdldF9odWdlX3BhZ2VzKHN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisjZGVmaW5lIEdGUCAoR0ZQX0tFUk5FTCB8 IF9fR0ZQX05PV0FSTiB8IF9fR0ZQX05PUkVUUlkpCisJdW5zaWduZWQgaW50IHBhZ2VfbWFzayA9 IG9iai0+bW0ucGFnZV9tYXNrOworCXN0cnVjdCBzZ190YWJsZSAqc3Q7CisJc3RydWN0IHNjYXR0 ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBpbnQgc2dfbWFzazsKKwl1NjQgcmVtOworCisJc3QgPSBr bWFsbG9jKHNpemVvZigqc3QpLCBHRlApOworCWlmICghc3QpCisJCXJldHVybiAtRU5PTUVNOwor CisJaWYgKHNnX2FsbG9jX3RhYmxlKHN0LCBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZULCBH RlApKSB7CisJCWtmcmVlKHN0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVtID0gb2Jq LT5iYXNlLnNpemU7CisJc2cgPSBzdC0+c2dsOworCXN0LT5uZW50cyA9IDA7CisJc2dfbWFzayA9 IDA7CisKKwkvKgorCSAqIE91ciBnb2FsIGhlcmUgaXMgc2ltcGxlLCB3ZSB3YW50IHRvIGdyZWVk aWx5IGZpbGwgdGhlIG9iamVjdCBmcm9tCisJICogbGFyZ2VzdCB0byBzbWFsbGVzdCBwYWdlLXNp emUsIHdoaWxlIGVuc3VyaW5nIHRoYXQgd2UgdXNlICpldmVyeSoKKwkgKiBwYWdlLXNpemUgYXMg cGVyIHRoZSBnaXZlbiBwYWdlLW1hc2suCisJICovCisJZG8geworCQl1bnNpZ25lZCBpbnQgYml0 ID0gaWxvZzIocGFnZV9tYXNrKTsKKwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IEJJVChiaXQp OworCQlpbnQgb3JkZXIgPSBnZXRfb3JkZXIocGFnZV9zaXplKTsKKworCQlkbyB7CisJCQlzdHJ1 Y3QgcGFnZSAqcGFnZTsKKworCQkJR0VNX0JVR19PTihvcmRlciA+PSBNQVhfT1JERVIpOworCQkJ cGFnZSA9IGFsbG9jX3BhZ2VzKEdGUCB8IF9fR0ZQX1pFUk8sIG9yZGVyKTsKKwkJCWlmICghcGFn ZSkKKwkJCQlnb3RvIGVycjsKKworCQkJc2dfc2V0X3BhZ2Uoc2csIHBhZ2UsIHBhZ2Vfc2l6ZSwg MCk7CisJCQlzZ19tYXNrIHw9IHBhZ2Vfc2l6ZTsKKwkJCXN0LT5uZW50cysrOworCisJCQlyZW0g LT0gcGFnZV9zaXplOworCQkJaWYgKCFyZW0pIHsKKwkJCQlzZ19tYXJrX2VuZChzZyk7CisJCQkJ YnJlYWs7CisJCQl9CisKKwkJCXNnID0gX19zZ19uZXh0KHNnKTsKKwkJfSB3aGlsZSAoKHJlbSAt ICgocGFnZV9zaXplLTEpICYgcGFnZV9tYXNrKSkgPj0gcGFnZV9zaXplKTsKKworCQlwYWdlX21h c2sgJj0gKHBhZ2Vfc2l6ZS0xKTsKKwl9IHdoaWxlIChwYWdlX21hc2spOworCisJaWYgKGk5MTVf Z2VtX2d0dF9wcmVwYXJlX3BhZ2VzKG9iaiwgc3QpKQorCQlnb3RvIGVycjsKKworCW9iai0+bW0u bWFkdiA9IEk5MTVfTUFEVl9ET05UTkVFRDsKKworCUdFTV9CVUdfT04oc2dfbWFzayAhPSBvYmot Pm1tLnBhZ2VfbWFzayk7CisJX19pOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VzKG9iaiwgc3QsIHNn X21hc2spOworCisJcmV0dXJuIDA7CisKK2VycjoKKwlzZ19zZXRfcGFnZShzZywgTlVMTCwgMCwg MCk7CisJc2dfbWFya19lbmQoc2cpOworCWh1Z2VfcGFnZXNfZnJlZV9wYWdlcyhzdCk7CisKKwly ZXR1cm4gLUVOT01FTTsKK30KKworc3RhdGljIHZvaWQgcHV0X2h1Z2VfcGFnZXMoc3RydWN0IGRy bV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCSAgIHN0cnVjdCBzZ190YWJsZSAqcGFnZXMpCit7 CisJaTkxNV9nZW1fZ3R0X2ZpbmlzaF9wYWdlcyhvYmosIHBhZ2VzKTsKKwlodWdlX3BhZ2VzX2Zy ZWVfcGFnZXMocGFnZXMpOworCisJb2JqLT5tbS5kaXJ0eSA9IGZhbHNlOworCW9iai0+bW0ubWFk diA9IEk5MTVfTUFEVl9XSUxMTkVFRDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0X29wcyBodWdlX3BhZ2Vfb3BzID0geworCS5mbGFncyA9IEk5MTVfR0VNX09C SkVDVF9IQVNfU1RSVUNUX1BBR0UgfAorCQkgSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklOS0FCTEUs CisJLmdldF9wYWdlcyA9IGdldF9odWdlX3BhZ2VzLAorCS5wdXRfcGFnZXMgPSBwdXRfaHVnZV9w YWdlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqCitodWdlX3Bh Z2VzX29iamVjdChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwKKwkJICB1NjQgc2l6ZSwK KwkJICB1bnNpZ25lZCBpbnQgcGFnZV9tYXNrKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2Jq ZWN0ICpvYmo7CisKKwlHRU1fQlVHX09OKCFzaXplKTsKKwlHRU1fQlVHX09OKCFJU19BTElHTkVE KHNpemUsIEJJVChfX2ZmcyhwYWdlX21hc2spKSkpOworCisJaWYgKHNpemUgPj4gUEFHRV9TSElG VCA+IElOVF9NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CisKKwlpZiAob3ZlcmZsb3dz X3R5cGUoc2l6ZSwgb2JqLT5iYXNlLnNpemUpKQorCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOwor CisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2FsbG9jKGk5MTUpOworCWlmICghb2JqKQorCQlyZXR1 cm4gRVJSX1BUUigtRU5PTUVNKTsKKworCWRybV9nZW1fcHJpdmF0ZV9vYmplY3RfaW5pdCgmaTkx NS0+ZHJtLCAmb2JqLT5iYXNlLCBzaXplKTsKKwlpOTE1X2dlbV9vYmplY3RfaW5pdChvYmosICZo dWdlX3BhZ2Vfb3BzKTsKKworCW9iai0+YmFzZS53cml0ZV9kb21haW4gPSBJOTE1X0dFTV9ET01B SU5fQ1BVOworCW9iai0+YmFzZS5yZWFkX2RvbWFpbnMgPSBJOTE1X0dFTV9ET01BSU5fQ1BVOwor CW9iai0+Y2FjaGVfbGV2ZWwgPSBJOTE1X0NBQ0hFX05PTkU7CisKKwlvYmotPm1tLnBhZ2VfbWFz ayA9IHBhZ2VfbWFzazsKKworCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyBpbnQgZmFrZV9nZXRf aHVnZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsKKwlzaXplX3Qg bWF4X2xlbiA9IHJvdW5kZG93bl9wb3dfb2ZfdHdvKFVJTlRfTUFYKTsKKwlzdHJ1Y3Qgc2dfdGFi bGUgKnN0OworCXN0cnVjdCBzY2F0dGVybGlzdCAqc2c7CisJdW5zaWduZWQgaW50IHNnX21hc2s7 CisJc2l6ZV90IHJlbTsKKworCXN0ID0ga21hbGxvYyhzaXplb2YoKnN0KSwgR0ZQKTsKKwlpZiAo IXN0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChzZ19hbGxvY190YWJsZShzdCwgb2JqLT5i YXNlLnNpemUgPj4gUEFHRV9TSElGVCwgR0ZQKSkgeworCQlrZnJlZShzdCk7CisJCXJldHVybiAt RU5PTUVNOworCX0KKworCS8qIFVzZSBvcHRpbWFsIHBhZ2Ugc2l6ZWQgY2h1bmtzIHRvIGZpbGwg aW4gdGhlIHNnIHRhYmxlICovCisJcmVtID0gb2JqLT5iYXNlLnNpemU7CisJc2cgPSBzdC0+c2ds OworCXN0LT5uZW50cyA9IDA7CisJc2dfbWFzayA9IDA7CisJZG8geworCQl1bnNpZ25lZCBpbnQg cGFnZV9zaXplID0gZ2V0X2xhcmdlc3RfcGFnZV9zaXplKGk5MTUsIHJlbSk7CisJCXVuc2lnbmVk IGludCBsZW4gPSBtaW4ocGFnZV9zaXplICogKHJlbSAvIHBhZ2Vfc2l6ZSksIG1heF9sZW4pOwor CisJCUdFTV9CVUdfT04oIXBhZ2Vfc2l6ZSk7CisKKwkJc2ctPm9mZnNldCA9IDA7CisJCXNnLT5s ZW5ndGggPSBsZW47CisJCXNnX2RtYV9sZW4oc2cpID0gbGVuOworCQlzZ19kbWFfYWRkcmVzcyhz ZykgPSBwYWdlX3NpemU7CisKKwkJc2dfbWFzayB8PSBsZW47CisKKwkJc3QtPm5lbnRzKys7CisK KwkJcmVtIC09IGxlbjsKKwkJaWYgKCFyZW0pIHsKKwkJCXNnX21hcmtfZW5kKHNnKTsKKwkJCWJy ZWFrOworCQl9CisKKwkJc2cgPSBzZ19uZXh0KHNnKTsKKwl9IHdoaWxlICgxKTsKKworCW9iai0+ bW0ubWFkdiA9IEk5MTVfTUFEVl9ET05UTkVFRDsKKworCV9faTkxNV9nZW1fb2JqZWN0X3NldF9w YWdlcyhvYmosIHN0LCBzZ19tYXNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZh a2VfZ2V0X2h1Z2VfcGFnZXNfc2luZ2xlKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmop Cit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KG9iai0+YmFzZS5k ZXYpOworCXN0cnVjdCBzZ190YWJsZSAqc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1 bnNpZ25lZCBpbnQgcGFnZV9zaXplOworCisJc3QgPSBrbWFsbG9jKHNpemVvZigqc3QpLCBHRlAp OworCWlmICghc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHNnX2FsbG9jX3RhYmxlKHN0 LCAxLCBHRlApKSB7CisJCWtmcmVlKHN0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJc2cg PSBzdC0+c2dsOworCXN0LT5uZW50cyA9IDE7CisKKwlwYWdlX3NpemUgPSBnZXRfbGFyZ2VzdF9w YWdlX3NpemUoaTkxNSwgb2JqLT5iYXNlLnNpemUpOworCUdFTV9CVUdfT04oIXBhZ2Vfc2l6ZSk7 CisKKwlzZy0+b2Zmc2V0ID0gMDsKKwlzZy0+bGVuZ3RoID0gb2JqLT5iYXNlLnNpemU7CisJc2df ZG1hX2xlbihzZykgPSBvYmotPmJhc2Uuc2l6ZTsKKwlzZ19kbWFfYWRkcmVzcyhzZykgPSBwYWdl X3NpemU7CisKKwlvYmotPm1tLm1hZHYgPSBJOTE1X01BRFZfRE9OVE5FRUQ7CisKKwlfX2k5MTVf Z2VtX29iamVjdF9zZXRfcGFnZXMob2JqLCBzdCwgc2ctPmxlbmd0aCk7CisKKwlyZXR1cm4gMDsK KyN1bmRlZiBHRlAKK30KKworc3RhdGljIHZvaWQgZmFrZV9mcmVlX2h1Z2VfcGFnZXMoc3RydWN0 IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwKKwkJCQkgc3RydWN0IHNnX3RhYmxlICpwYWdlcykK K3sKKwlzZ19mcmVlX3RhYmxlKHBhZ2VzKTsKKwlrZnJlZShwYWdlcyk7Cit9CisKK3N0YXRpYyB2 b2lkIGZha2VfcHV0X2h1Z2VfcGFnZXMoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwK KwkJCQlzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQoreworCWZha2VfZnJlZV9odWdlX3BhZ2VzKG9i aiwgcGFnZXMpOworCW9iai0+bW0uZGlydHkgPSBmYWxzZTsKKwlvYmotPm1tLm1hZHYgPSBJOTE1 X01BRFZfV0lMTE5FRUQ7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdF9vcHMgZmFrZV9vcHMgPSB7CisJLmZsYWdzID0gSTkxNV9HRU1fT0JKRUNUX0lTX1NIUklO S0FCTEUsCisJLmdldF9wYWdlcyA9IGZha2VfZ2V0X2h1Z2VfcGFnZXMsCisJLnB1dF9wYWdlcyA9 IGZha2VfcHV0X2h1Z2VfcGFnZXMsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3Rfb3BzIGZha2Vfb3BzX3NpbmdsZSA9IHsKKwkuZmxhZ3MgPSBJOTE1X0dFTV9P QkpFQ1RfSVNfU0hSSU5LQUJMRSwKKwkuZ2V0X3BhZ2VzID0gZmFrZV9nZXRfaHVnZV9wYWdlc19z aW5nbGUsCisJLnB1dF9wYWdlcyA9IGZha2VfcHV0X2h1Z2VfcGFnZXMsCit9OworCitzdGF0aWMg c3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKgorZmFrZV9odWdlX3BhZ2VzX29iamVjdChzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSwgdTY0IHNpemUsIGJvb2wgc2luZ2xlKQoreworCXN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisKKwlHRU1fQlVHX09OKCFzaXplKTsKKwlH RU1fQlVHX09OKCFJU19BTElHTkVEKHNpemUsIEk5MTVfR1RUX1BBR0VfU0laRSkpOworCisJaWYg KHNpemUgPj4gUEFHRV9TSElGVCA+IFVJTlRfTUFYKQorCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcp OworCisJaWYgKG92ZXJmbG93c190eXBlKHNpemUsIG9iai0+YmFzZS5zaXplKSkKKwkJcmV0dXJu IEVSUl9QVFIoLUUyQklHKTsKKworCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9hbGxvYyhpOTE1KTsK KwlpZiAoIW9iaikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwlkcm1fZ2VtX3ByaXZh dGVfb2JqZWN0X2luaXQoJmk5MTUtPmRybSwgJm9iai0+YmFzZSwgc2l6ZSk7CisKKwlpZiAoc2lu Z2xlKQorCQlpOTE1X2dlbV9vYmplY3RfaW5pdChvYmosICZmYWtlX29wc19zaW5nbGUpOworCWVs c2UKKwkJaTkxNV9nZW1fb2JqZWN0X2luaXQob2JqLCAmZmFrZV9vcHMpOworCisJb2JqLT5iYXNl LndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJb2JqLT5iYXNlLnJlYWRfZG9t YWlucyA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJb2JqLT5jYWNoZV9sZXZlbCA9IEk5MTVfQ0FD SEVfTk9ORTsKKworCXJldHVybiBvYmo7Cit9CisKK3N0YXRpYyBpbnQgaWd0X2NoZWNrX3BhZ2Vf c2l6ZXMoc3RydWN0IGk5MTVfdm1hICp2bWEpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg Kmk5MTUgPSB0b19pOTE1KHZtYS0+b2JqLT5iYXNlLmRldik7CisJdW5zaWduZWQgaW50IHN1cHBv cnRlZCA9IElOVEVMX0lORk8oaTkxNSktPnBhZ2Vfc2l6ZXM7CisJc3RydWN0IGRybV9pOTE1X2dl bV9vYmplY3QgKm9iaiA9IHZtYS0+b2JqOworCWludCBlcnIgPSAwOworCisJaWYgKCFIQVNfUEFH RV9TSVpFUyhpOTE1LCB2bWEtPnBhZ2Vfc2l6ZXMuc2cpKSB7CisJCXByX2VycigidW5zdXBwb3J0 ZWQgcGFnZV9zaXplcy5zZz0ldSwgc3VwcG9ydGVkPSV1XG4iLAorCQkgICAgICAgdm1hLT5wYWdl X3NpemVzLnNnICYgfnN1cHBvcnRlZCwgc3VwcG9ydGVkKTsKKwkJZXJyID0gLUVJTlZBTDsKKwl9 CisKKwlpZiAoIUhBU19QQUdFX1NJWkVTKGk5MTUsIHZtYS0+cGFnZV9zaXplcy5ndHQpKSB7CisJ CXByX2VycigidW5zdXBwb3J0ZWQgcGFnZV9zaXplcy5ndHQ9JXUsIHN1cHBvcnRlZD0ldVxuIiwK KwkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5ndHQgJiB+c3VwcG9ydGVkLCBzdXBwb3J0ZWQpOwor CQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmICh2bWEtPnBhZ2Vfc2l6ZXMucGh5cyAhPSBvYmot Pm1tLnBhZ2Vfc2l6ZXMucGh5cykgeworCQlwcl9lcnIoInZtYS0+cGFnZV9zaXplcy5waHlzKCV1 KSAhPSBvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5cygldSlcbiIsCisJCSAgICAgICB2bWEtPnBhZ2Vf c2l6ZXMucGh5cywgb2JqLT5tbS5wYWdlX3NpemVzLnBoeXMpOworCQllcnIgPSAtRUlOVkFMOwor CX0KKworCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuc2cgIT0gb2JqLT5tbS5wYWdlX3NpemVzLnNnKSB7 CisJCXByX2Vycigidm1hLT5wYWdlX3NpemVzLnNnKCV1KSAhPSBvYmotPm1tLnBhZ2Vfc2l6ZXMu c2coJXUpXG4iLAorCQkgICAgICAgdm1hLT5wYWdlX3NpemVzLnNnLCBvYmotPm1tLnBhZ2Vfc2l6 ZXMuc2cpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmIChvYmotPm1tLnBhZ2Vfc2l6ZXMu Z3R0KSB7CisJCXByX2Vycigib2JqLT5wYWdlX3NpemVzLmd0dCgldSkgc2hvdWxkIG5ldmVyIGJl IHNldFxuIiwKKwkJICAgICAgIG9iai0+bW0ucGFnZV9zaXplcy5ndHQpOworCQllcnIgPSAtRUlO VkFMOworCX0KKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X21vY2tfZXhoYXVz dF9kZXZpY2Vfc3VwcG9ydGVkX3BhZ2VzKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgaTkxNV9od19w cGd0dCAqcHBndHQgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBwcGd0 dC0+YmFzZS5pOTE1OworCXVuc2lnbmVkIGludCBzYXZlZF9tYXNrID0gSU5URUxfSU5GTyhpOTE1 KS0+cGFnZV9zaXplczsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0cnVj dCBpOTE1X3ZtYSAqdm1hOworCWludCBpLCBqLCBzaW5nbGU7CisJaW50IGVycjsKKworCS8qCisJ ICogU2FuaXR5IGNoZWNrIGNyZWF0aW5nIG9iamVjdHMgd2l0aCBldmVyeSB2YWxpZCBwYWdlIHN1 cHBvcnQKKwkgKiBjb21iaW5hdGlvbiBmb3Igb3VyIG1vY2sgZGV2aWNlLgorCSAqLworCisJZm9y IChpID0gMTsgaSA8IEJJVChBUlJBWV9TSVpFKHBhZ2Vfc2l6ZXMpKTsgaSsrKSB7CisJCXVuc2ln bmVkIGludCBjb21iaW5hdGlvbiA9IDA7CisKKwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUo cGFnZV9zaXplcyk7IGorKykgeworCQkJaWYgKGkgJiBCSVQoaikpCisJCQkJY29tYmluYXRpb24g fD0gcGFnZV9zaXplc1tqXTsKKwkJfQorCisJCW1rd3JpdGVfZGV2aWNlX2luZm8oaTkxNSktPnBh Z2Vfc2l6ZXMgPSBjb21iaW5hdGlvbjsKKworCQlmb3IgKHNpbmdsZSA9IDA7IHNpbmdsZSA8PSAx OyArK3NpbmdsZSkgeworCQkJb2JqID0gZmFrZV9odWdlX3BhZ2VzX29iamVjdChpOTE1LCBjb21i aW5hdGlvbiwgISFzaW5nbGUpOworCQkJaWYgKElTX0VSUihvYmopKSB7CisJCQkJZXJyID0gUFRS X0VSUihvYmopOworCQkJCWdvdG8gb3V0X2RldmljZTsKKwkJCX0KKworCQkJaWYgKG9iai0+YmFz ZS5zaXplICE9IGNvbWJpbmF0aW9uKSB7CisJCQkJcHJfZXJyKCJvYmotPmJhc2Uuc2l6ZT0lenUs IGV4cGVjdGVkPSV1XG4iLAorCQkJCSAgICAgICBvYmotPmJhc2Uuc2l6ZSwgY29tYmluYXRpb24p OworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJZ290byBvdXRfcHV0OworCQkJfQorCisJCQl2bWEg PSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCQlpZiAoSVNf RVJSKHZtYSkpIHsKKwkJCQllcnIgPSBQVFJfRVJSKHZtYSk7CisJCQkJZ290byBvdXRfcHV0Owor CQkJfQorCisJCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBQSU5fVVNFUik7CisJCQlp ZiAoZXJyKQorCQkJCWdvdG8gb3V0X2Nsb3NlOworCisJCQllcnIgPSBpZ3RfY2hlY2tfcGFnZV9z aXplcyh2bWEpOworCisJCQlpZiAodm1hLT5wYWdlX3NpemVzLnNnICE9IGNvbWJpbmF0aW9uKSB7 CisJCQkJcHJfZXJyKCJwYWdlX3NpemVzLnNnPSV1LCBleHBlY3RlZD0ldVxuIiwKKwkJCQkgICAg ICAgdm1hLT5wYWdlX3NpemVzLnNnLCBjb21iaW5hdGlvbik7CisJCQkJZXJyID0gLUVJTlZBTDsK KwkJCX0KKworCQkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7 CisKKwkJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCQkJaWYgKGVycikKKwkJCQlnb3Rv IG91dF9kZXZpY2U7CisJCX0KKwl9CisKKwlnb3RvIG91dF9kZXZpY2U7CisKK291dF9jbG9zZToK KwlpOTE1X3ZtYV9jbG9zZSh2bWEpOworb3V0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9i aik7CitvdXRfZGV2aWNlOgorCW1rd3JpdGVfZGV2aWNlX2luZm8oaTkxNSktPnBhZ2Vfc2l6ZXMg PSBzYXZlZF9tYXNrOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZ3RfbW9ja19w cGd0dF9taXNhbGlnbmVkX2RtYSh2b2lkICphcmcpCit7CisJc3RydWN0IGk5MTVfaHdfcHBndHQg KnBwZ3R0ID0gYXJnOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gcHBndHQtPmJh c2UuaTkxNTsKKwl1bnNpZ25lZCBsb25nIHN1cHBvcnRlZCA9IElOVEVMX0lORk8oaTkxNSktPnBh Z2Vfc2l6ZXM7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlpbnQgYml0Owor CWludCBlcnI7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayBkbWEgbWlzYWxpZ25tZW50IGZvciBo dWdlIHBhZ2VzIC0tIHRoZSBkbWEgYWRkcmVzc2VzIHdlCisJICogaW5zZXJ0IGludG8gdGhlIHBh Z2luZyBzdHJ1Y3R1cmVzIG5lZWQgdG8gYWx3YXlzIHJlc3BlY3QgdGhlIHBhZ2UKKwkgKiBzaXpl IGFsaWdubWVudC4KKwkgKi8KKworCWJpdCA9IGlsb2cyKEk5MTVfR1RUX1BBR0VfU0laRV82NEsp OworCisJZm9yX2VhY2hfc2V0X2JpdF9mcm9tKGJpdCwgJnN1cHBvcnRlZCwgQklUU19QRVJfTE9O RykgeworCQlJR1RfVElNRU9VVChlbmRfdGltZSk7CisJCXVuc2lnbmVkIGludCBwYWdlX3NpemUg PSBCSVQoYml0KTsKKwkJdW5zaWduZWQgaW50IGZsYWdzID0gUElOX1VTRVIgfCBQSU5fT0ZGU0VU X0ZJWEVEOworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgc2l6ZSA9CisJ CQlyb3VuZF91cChwYWdlX3NpemUsIEk5MTVfR1RUX1BBR0VfU0laRV8yTSkgPDwgMTsKKwkJc3Ry dWN0IGk5MTVfdm1hICp2bWE7CisKKwkJb2JqID0gZmFrZV9odWdlX3BhZ2VzX29iamVjdChpOTE1 LCBzaXplLCB0cnVlKTsKKwkJaWYgKElTX0VSUihvYmopKQorCQkJcmV0dXJuIFBUUl9FUlIob2Jq KTsKKworCQlpZiAob2JqLT5iYXNlLnNpemUgIT0gc2l6ZSkgeworCQkJcHJfZXJyKCJvYmotPmJh c2Uuc2l6ZT0lenUsIGV4cGVjdGVkPSV1XG4iLAorCQkJICAgICAgIG9iai0+YmFzZS5zaXplLCBz aXplKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQlnb3RvIG91dF9wdXQ7CisJCX0KKworCQllcnIg PSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91 dF9wdXQ7CisKKwkJLyogRm9yY2UgdGhlIHBhZ2Ugc2l6ZSBmb3IgdGhpcyBvYmplY3QgKi8KKwkJ b2JqLT5tbS5wYWdlX3NpemVzLnNnID0gcGFnZV9zaXplOworCisJCXZtYSA9IGk5MTVfdm1hX2lu c3RhbmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJaWYgKElTX0VSUih2bWEpKSB7CisJ CQllcnIgPSBQVFJfRVJSKHZtYSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCWVyciA9 IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIGZsYWdzKTsKKwkJaWYgKGVycikgeworCQkJaTkxNV92 bWFfY2xvc2Uodm1hKTsKKwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKworCQllcnIgPSBpZ3Rf Y2hlY2tfcGFnZV9zaXplcyh2bWEpOworCisJCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9IHBh Z2Vfc2l6ZSkgeworCQkJcHJfZXJyKCJwYWdlX3NpemVzLmd0dD0ldSwgZXhwZWN0ZWQgJXVcbiIs CisJCQkgICAgICAgdm1hLT5wYWdlX3NpemVzLmd0dCwgcGFnZV9zaXplKTsKKwkJCWVyciA9IC1F SU5WQUw7CisJCX0KKworCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCisJCWlmIChlcnIpIHsKKwkJ CWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCS8qCisJ CSAqIFRyeSBhbGwgdGhlIG90aGVyIHZhbGlkIG9mZnNldHMgdW50aWwgdGhlIG5leHQKKwkJICog Ym91bmRhcnkgLS0gc2hvdWxkIGFsd2F5cyBmYWxsIGJhY2sgdG8gdXNpbmcgNEsKKwkJICogcGFn ZXMuCisJCSAqLworCQlmb3IgKG9mZnNldCA9IDQwOTY7IG9mZnNldCA8IHBhZ2Vfc2l6ZTsgb2Zm c2V0ICs9IDQwOTYpIHsKKwkJCWVyciA9IGk5MTVfdm1hX3VuYmluZCh2bWEpOworCQkJaWYgKGVy cikgeworCQkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQkJZ290byBvdXRfdW5waW47CisJCQl9 CisKKwkJCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIGZsYWdzIHwgb2Zmc2V0KTsKKwkJ CWlmIChlcnIpIHsKKwkJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJCWdvdG8gb3V0X3VucGlu OworCQkJfQorCisJCQllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCisJCQlpZiAo dm1hLT5wYWdlX3NpemVzLmd0dCAhPSBJOTE1X0dUVF9QQUdFX1NJWkVfNEspIHsKKwkJCQlwcl9l cnIoInBhZ2Vfc2l6ZXMuZ3R0PSV1LCBleHBlY3RlZCAlbHVcbiIsCisJCQkJICAgICAgIHZtYS0+ cGFnZV9zaXplcy5ndHQsIEk5MTVfR1RUX1BBR0VfU0laRV80Syk7CisJCQkJZXJyID0gLUVJTlZB TDsKKwkJCX0KKworCQkJaTkxNV92bWFfdW5waW4odm1hKTsKKworCQkJaWYgKGVycikgeworCQkJ CWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQkJZ290byBvdXRfdW5waW47CisJCQl9CisKKwkJCWlm IChpZ3RfdGltZW91dChlbmRfdGltZSwKKwkJCQkJIiVzIHRpbWVkIG91dCBhdCBvZmZzZXQgJXgg d2l0aCBwYWdlLXNpemUgJXhcbiIsCisJCQkJCV9fZnVuY19fLCBvZmZzZXQsIHBhZ2Vfc2l6ZSkp CisJCQkJYnJlYWs7CisJCX0KKworCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCisJCWk5MTVfZ2Vt X29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJ fQorCisJcmV0dXJuIDA7CisKK291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFn ZXMob2JqKTsKK291dF9wdXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJcmV0dXJu IGVycjsKK30KKworc3RhdGljIHZvaWQgY2xvc2Vfb2JqZWN0X2xpc3Qoc3RydWN0IGxpc3RfaGVh ZCAqb2JqZWN0cywKKwkJCSAgICAgIHN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCkKK3sKKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCAqb247CisKKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5X3NhZmUob2JqLCBvbiwgb2JqZWN0cywgc3RfbGluaykgeworCQlzdHJ1Y3QgaTkxNV92bWEg KnZtYTsKKworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVM TCk7CisJCWlmICghSVNfRVJSKHZtYSkpCisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCisJCWxp c3RfZGVsKCZvYmotPnN0X2xpbmspOworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2Jq KTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KK30KKworc3RhdGljIGludCBpZ3Rf bW9ja19wcGd0dF9odWdlX2ZpbGwodm9pZCAqYXJnKQoreworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0 ICpwcGd0dCA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHBwZ3R0LT5i YXNlLmk5MTU7CisJdW5zaWduZWQgbG9uZyBtYXhfcGFnZXMgPSBwcGd0dC0+YmFzZS50b3RhbCA+ PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgcGFnZV9udW07CisJYm9vbCBzaW5nbGUgPSBm YWxzZTsKKwlMSVNUX0hFQUQob2JqZWN0cyk7CisJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOworCWlu dCBlcnI7CisKKwlmb3JfZWFjaF9wcmltZV9udW1iZXJfZnJvbShwYWdlX251bSwgMSwgbWF4X3Bh Z2VzKSB7CisJCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJCXNpemVfdCBzaXpl ID0gcGFnZV9udW0gPDwgUEFHRV9TSElGVDsKKwkJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJCXVu c2lnbmVkIGludCBleHBlY3RlZF9ndHQgPSAwOworCQlpbnQgaTsKKworCQlvYmogPSBmYWtlX2h1 Z2VfcGFnZXNfb2JqZWN0KGk5MTUsIHNpemUsIHNpbmdsZSk7CisJCWlmIChJU19FUlIob2JqKSkg eworCQkJZXJyID0gUFRSX0VSUihvYmopOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAob2JqLT5i YXNlLnNpemUgIT0gc2l6ZSkgeworCQkJcHJfZXJyKCJvYmotPmJhc2Uuc2l6ZT0lemQsIGV4cGVj dGVkPSV6ZFxuIiwKKwkJCSAgICAgICBvYmotPmJhc2Uuc2l6ZSwgc2l6ZSk7CisJCQlpOTE1X2dl bV9vYmplY3RfcHV0KG9iaik7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKwor CQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJCWlmIChlcnIpIHsKKwkJ CWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwkJCWJyZWFrOworCQl9CisKKwkJbGlzdF9hZGQo Jm9iai0+c3RfbGluaywgJm9iamVjdHMpOworCisJCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9i aiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwkJaWYgKElTX0VSUih2bWEpKSB7CisJCQllcnIgPSBQ VFJfRVJSKHZtYSk7CisJCQlicmVhazsKKwkJfQorCisJCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEs IDAsIDAsIFBJTl9VU0VSKTsKKwkJaWYgKGVycikKKwkJCWJyZWFrOworCisJCWVyciA9IGlndF9j aGVja19wYWdlX3NpemVzKHZtYSk7CisJCWlmIChlcnIpIHsKKwkJCWk5MTVfdm1hX3VucGluKHZt YSk7CisJCQlicmVhazsKKwkJfQorCisJCS8qCisJCSAqIEZpZ3VyZSBvdXQgdGhlIGV4cGVjdGVk IGd0dCBwYWdlIHNpemUga25vd2luZyB0aGF0IHdlIGdvIGZyb20KKwkJICogbGFyZ2VzdCB0byBz bWFsbGVzdCBwYWdlIHNpemUgc2cgY2h1bmtzLCBhbmQgdGhhdCB3ZSBhbGlnbiB0bworCQkgKiB0 aGUgbGFyZ2VzdCBwYWdlIHNpemUuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0la RShwYWdlX3NpemVzKTsgKytpKSB7CisJCQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplID0gcGFnZV9z aXplc1tpXTsKKworCQkJaWYgKEhBU19QQUdFX1NJWkVTKGk5MTUsIHBhZ2Vfc2l6ZSkgJiYKKwkJ CSAgICBzaXplID49IHBhZ2Vfc2l6ZSkgeworCQkJCWV4cGVjdGVkX2d0dCB8PSBwYWdlX3NpemU7 CisJCQkJc2l6ZSAmPSBwYWdlX3NpemUtMTsKKwkJCX0KKwkJfQorCisJCUdFTV9CVUdfT04oIWV4 cGVjdGVkX2d0dCk7CisJCUdFTV9CVUdfT04oc2l6ZSk7CisKKwkJaWYgKGV4cGVjdGVkX2d0dCAm IEk5MTVfR1RUX1BBR0VfU0laRV80SykKKwkJCWV4cGVjdGVkX2d0dCAmPSB+STkxNV9HVFRfUEFH RV9TSVpFXzY0SzsKKworCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCisJCWlmICh2bWEtPnBhZ2Vf c2l6ZXMuc2cgJiBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSB7CisJCQlpZiAoIUlTX0FMSUdORUQo dm1hLT5ub2RlLnN0YXJ0LAorCQkJCQlJOTE1X0dUVF9QQUdFX1NJWkVfMk0pKSB7CisJCQkJcHJf ZXJyKCJub2RlLnN0YXJ0KCVsbHgpIG5vdCBhbGlnbmVkIHRvIDJNXG4iLAorCQkJCSAgICAgICB2 bWEtPm5vZGUuc3RhcnQpOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisK KwkJCWlmICghSVNfQUxJR05FRCh2bWEtPm5vZGUuc2l6ZSwKKwkJCQkJSTkxNV9HVFRfUEFHRV9T SVpFXzJNKSkgeworCQkJCXByX2Vycigibm9kZS5zaXplKCVsbHgpIG5vdCBhbGlnbmVkIHRvIDJN XG4iLAorCQkJCSAgICAgICB2bWEtPm5vZGUuc2l6ZSk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJ CQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9IGV4cGVj dGVkX2d0dCkgeworCQkJcHJfZXJyKCJndHQ9JXUsIGV4cGVjdGVkPSV1LCBzaXplPSV6ZCwgc2lu Z2xlPSVzXG4iLAorCQkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5ndHQsIGV4cGVjdGVkX2d0dCwK KwkJCSAgICAgICBvYmotPmJhc2Uuc2l6ZSwgeWVzbm8oISFzaW5nbGUpKTsKKwkJCWVyciA9IC1F SU5WQUw7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChpZ3RfdGltZW91dChlbmRfdGltZSwKKwkJ CQkiJXMgdGltZWQgb3V0IGF0IHNpemUgJXpkXG4iLAorCQkJCV9fZnVuY19fLCBvYmotPmJhc2Uu c2l6ZSkpCisJCQlicmVhazsKKworCQlzaW5nbGUgPSAhc2luZ2xlOworCX0KKworCWNsb3NlX29i amVjdF9saXN0KCZvYmplY3RzLCBwcGd0dCk7CisKKwlpZiAoZXJyID09IC1FTk9NRU0gfHwgZXJy ID09IC1FTk9TUEMpCisJCWVyciA9IDA7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50 IGlndF9tb2NrX3BwZ3R0XzY0Syh2b2lkICphcmcpCit7CisJc3RydWN0IGk5MTVfaHdfcHBndHQg KnBwZ3R0ID0gYXJnOworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gcHBndHQtPmJh c2UuaTkxNTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCWNvbnN0IHN0cnVj dCBvYmplY3RfaW5mbyB7CisJCXVuc2lnbmVkIGludCBzaXplOworCQl1bnNpZ25lZCBpbnQgZ3R0 OworCQl1bnNpZ25lZCBpbnQgb2Zmc2V0OworCX0gb2JqZWN0c1tdID0geworCQkvKiBDYXNlcyB3 aXRoIGZvcmNlZCBwYWRkaW5nL2FsaWdubWVudCAqLworCQl7CisJCQkuc2l6ZSA9IFNaXzY0SywK KwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0s CisJCXsKKwkJCS5zaXplID0gU1pfNjRLICsgU1pfNEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFH RV9TSVpFXzRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfNjRL IC0gU1pfNEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQkJLm9mZnNldCA9 IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfMk0sCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFH RV9TSVpFXzY0SywKKwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzJN IC0gU1pfNEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQkJLm9mZnNldCA9 IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfMk0gKyBTWl80SywKKwkJCS5ndHQgPSBJOTE1 X0dUVF9QQUdFX1NJWkVfNjRLIHwgSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQkJLm9mZnNldCA9 IDAsCisJCX0sCisJCXsKKwkJCS5zaXplID0gU1pfMk0gKyBTWl82NEssCisJCQkuZ3R0ID0gSTkx NV9HVFRfUEFHRV9TSVpFXzY0SywKKwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6 ZSA9IFNaXzJNIC0gU1pfNjRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEssCisJ CQkub2Zmc2V0ID0gMCwKKwkJfSwKKwkJLyogVHJ5IHdpdGhvdXQgYW55IGZvcmNlZCBwYWRkaW5n L2FsaWdubWVudCAqLworCQl7CisJCQkuc2l6ZSA9IFNaXzY0SywKKwkJCS5vZmZzZXQgPSBTWl8y TSwKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdFX1NJWkVfNEssCisJCX0sCisJCXsKKwkJCS5zaXpl ID0gU1pfMTI4SywKKwkJCS5vZmZzZXQgPSBTWl8yTSAtIFNaXzY0SywKKwkJCS5ndHQgPSBJOTE1 X0dUVF9QQUdFX1NJWkVfNEssCisJCX0sCisJfTsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwlp bnQgaSwgc2luZ2xlOworCWludCBlcnI7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayBzb21lIG9m IHRoZSB0cmlja2luZXNzIHdpdGggNjRLIHBhZ2VzIC0tIGVpdGhlciB3ZSBjYW4KKwkgKiBzYWZl bHkgbWFyayB0aGUgd2hvbGUgcGFnZS10YWJsZSgyTSBibG9jaykgYXMgNjRLLCBvciB3ZSBoYXZl IHRvCisJICogYWx3YXlzIGZhbGxiYWNrIHRvIDRLLgorCSAqLworCisJaWYgKCFIQVNfUEFHRV9T SVpFUyhpOTE1LCBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSkKKwkJcmV0dXJuIDA7CisKKwlmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShvYmplY3RzKTsgKytpKSB7CisJCXVuc2lnbmVkIGludCBz aXplID0gb2JqZWN0c1tpXS5zaXplOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZ3R0ID0gb2Jq ZWN0c1tpXS5ndHQ7CisJCXVuc2lnbmVkIGludCBvZmZzZXQgPSBvYmplY3RzW2ldLm9mZnNldDsK KwkJdW5zaWduZWQgaW50IGZsYWdzID0gUElOX1VTRVI7CisKKwkJZm9yIChzaW5nbGUgPSAwOyBz aW5nbGUgPD0gMTsgc2luZ2xlKyspIHsKKwkJCW9iaiA9IGZha2VfaHVnZV9wYWdlc19vYmplY3Qo aTkxNSwgc2l6ZSwgISFzaW5nbGUpOworCQkJaWYgKElTX0VSUihvYmopKQorCQkJCXJldHVybiBQ VFJfRVJSKG9iaik7CisKKwkJCWVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsK KwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfb2JqZWN0X3B1dDsKKworCQkJLyoKKwkJCSAqIERp c2FibGUgMk0gcGFnZXMgLS0gV2Ugb25seSB3YW50IHRvIHVzZSA2NEsvNEsgcGFnZXMKKwkJCSAq IGZvciB0aGlzIHRlc3QuCisJCQkgKi8KKwkJCW9iai0+bW0ucGFnZV9zaXplcy5zZyAmPSB+STkx NV9HVFRfUEFHRV9TSVpFXzJNOworCisJCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZw cGd0dC0+YmFzZSwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJCQllcnIgPSBQVFJf RVJSKHZtYSk7CisJCQkJZ290byBvdXRfb2JqZWN0X3VucGluOworCQkJfQorCisJCQlpZiAob2Zm c2V0KQorCQkJCWZsYWdzIHw9IFBJTl9PRkZTRVRfRklYRUQgfCBvZmZzZXQ7CisKKwkJCWVyciA9 IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIGZsYWdzKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBv dXRfdm1hX2Nsb3NlOworCisJCQllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCQkJ aWYgKGVycikKKwkJCQlnb3RvIG91dF92bWFfdW5waW47CisKKwkJCWlmICghb2Zmc2V0ICYmIHZt YS0+cGFnZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV82NEspIHsKKwkJCQlpZiAoIUlT X0FMSUdORUQodm1hLT5ub2RlLnN0YXJ0LAorCQkJCQkJSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSkg eworCQkJCQlwcl9lcnIoIm5vZGUuc3RhcnQoJWxseCkgbm90IGFsaWduZWQgdG8gMk1cbiIsCisJ CQkJCSAgICAgICB2bWEtPm5vZGUuc3RhcnQpOworCQkJCQllcnIgPSAtRUlOVkFMOworCQkJCQln b3RvIG91dF92bWFfdW5waW47CisJCQkJfQorCisJCQkJaWYgKCFJU19BTElHTkVEKHZtYS0+bm9k ZS5zaXplLAorCQkJCQkJSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSkgeworCQkJCQlwcl9lcnIoIm5v ZGUuc2l6ZSglbGx4KSBub3QgYWxpZ25lZCB0byAyTVxuIiwKKwkJCQkJICAgICAgIHZtYS0+bm9k ZS5zaXplKTsKKwkJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQkJZ290byBvdXRfdm1hX3VucGluOwor CQkJCX0KKwkJCX0KKworCQkJaWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gZXhwZWN0ZWRfZ3R0 KSB7CisJCQkJcHJfZXJyKCJndHQ9JXUsIGV4cGVjdGVkPSV1LCBpPSVkLCBzaW5nbGU9JXNcbiIs CisJCQkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5ndHQsIGV4cGVjdGVkX2d0dCwgaSwKKwkJCQkg ICAgICAgeWVzbm8oISFzaW5nbGUpKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWdvdG8gb3V0 X3ZtYV91bnBpbjsKKwkJCX0KKworCQkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJCWk5MTVfdm1h X2Nsb3NlKHZtYSk7CisKKwkJCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCQkJ aTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK291dF92 bWFfdW5waW46CisJaTkxNV92bWFfdW5waW4odm1hKTsKK291dF92bWFfY2xvc2U6CisJaTkxNV92 bWFfY2xvc2Uodm1hKTsKK291dF9vYmplY3RfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGlu X3BhZ2VzKG9iaik7CitvdXRfb2JqZWN0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7 CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgc3RydWN0IGk5MTVfdm1hICoKK2dwdV93cml0 ZV9kdyhzdHJ1Y3QgaTkxNV92bWEgKnZtYSwgdTY0IG9mZnNldCwgdTMyIHZhbCkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUodm1hLT5vYmotPmJhc2UuZGV2KTsK Kwljb25zdCBpbnQgZ2VuID0gSU5URUxfR0VOKHZtYS0+dm0tPmk5MTUpOworCXVuc2lnbmVkIGlu dCBjb3VudCA9IHZtYS0+c2l6ZSA+PiBQQUdFX1NISUZUOworCXN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpvYmo7CisJc3RydWN0IGk5MTVfdm1hICpiYXRjaDsKKwl1bnNpZ25lZCBpbnQgc2l6 ZTsKKwl1MzIgKmNtZDsKKwlpbnQgbjsKKwlpbnQgZXJyOworCisJc2l6ZSA9ICgxICsgNCAqIGNv dW50KSAqIHNpemVvZih1MzIpOworCXNpemUgPSByb3VuZF91cChzaXplLCBQQUdFX1NJWkUpOwor CW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwgc2l6ZSk7CisJaWYg KElTX0VSUihvYmopKQorCQlyZXR1cm4gRVJSX0NBU1Qob2JqKTsKKworCWNtZCA9IGk5MTVfZ2Vt X29iamVjdF9waW5fbWFwKG9iaiwgSTkxNV9NQVBfV0IpOworCWlmIChJU19FUlIoY21kKSkgewor CQllcnIgPSBQVFJfRVJSKGNtZCk7CisJCWdvdG8gZXJyOworCX0KKworCW9mZnNldCArPSB2bWEt Pm5vZGUuc3RhcnQ7CisKKwlmb3IgKG4gPSAwOyBuIDwgY291bnQ7IG4rKykgeworCQlpZiAoZ2Vu ID49IDgpIHsKKwkJCSpjbWQrKyA9IE1JX1NUT1JFX0RXT1JEX0lNTV9HRU40OworCQkJKmNtZCsr ID0gbG93ZXJfMzJfYml0cyhvZmZzZXQpOworCQkJKmNtZCsrID0gdXBwZXJfMzJfYml0cyhvZmZz ZXQpOworCQkJKmNtZCsrID0gdmFsOworCQl9IGVsc2UgaWYgKGdlbiA+PSA0KSB7CisJCQkqY21k KysgPSBNSV9TVE9SRV9EV09SRF9JTU1fR0VONCB8CisJCQkJKGdlbiA8IDYgPyAxIDw8IDIyIDog MCk7CisJCQkqY21kKysgPSAwOworCQkJKmNtZCsrID0gb2Zmc2V0OworCQkJKmNtZCsrID0gdmFs OworCQl9IGVsc2UgeworCQkJKmNtZCsrID0gTUlfU1RPUkVfRFdPUkRfSU1NIHwgMSA8PCAyMjsK KwkJCSpjbWQrKyA9IG9mZnNldDsKKwkJCSpjbWQrKyA9IHZhbDsKKwkJfQorCisJCW9mZnNldCAr PSBQQUdFX1NJWkU7CisJfQorCisJKmNtZCA9IE1JX0JBVENIX0JVRkZFUl9FTkQ7CisKKwlpOTE1 X2dlbV9vYmplY3RfdW5waW5fbWFwKG9iaik7CisKKwllcnIgPSBpOTE1X2dlbV9vYmplY3Rfc2V0 X3RvX2d0dF9kb21haW4ob2JqLCBmYWxzZSk7CisJaWYgKGVycikKKwkJZ290byBlcnI7CisKKwli YXRjaCA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgdm1hLT52bSwgTlVMTCk7CisJaWYgKElTX0VS UihiYXRjaCkpIHsKKwkJZXJyID0gUFRSX0VSUihiYXRjaCk7CisJCWdvdG8gZXJyOworCX0KKwor CWVyciA9IGk5MTVfdm1hX3BpbihiYXRjaCwgMCwgMCwgUElOX1VTRVIpOworCWlmIChlcnIpCisJ CWdvdG8gZXJyOworCisJcmV0dXJuIGJhdGNoOworCitlcnI6CisJaTkxNV9nZW1fb2JqZWN0X3B1 dChvYmopOworCisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIGludCBncHVfd3Jp dGUoc3RydWN0IGk5MTVfdm1hICp2bWEsCisJCSAgICAgc3RydWN0IGk5MTVfZ2VtX2NvbnRleHQg KmN0eCwKKwkJICAgICBzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCSAgICAgdTMy IGR3b3JkLAorCQkgICAgIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVl c3QgKnJxOworCXN0cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7CisJaW50IGZsYWdzID0gMDsKKwlpbnQg ZXJyOworCisJR0VNX0JVR19PTighaW50ZWxfZW5naW5lX2Nhbl9zdG9yZV9kd29yZChlbmdpbmUp KTsKKworCWVyciA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbih2bWEtPm9iaiwg dHJ1ZSk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCXJxID0gaTkxNV9nZW1fcmVxdWVz dF9hbGxvYyhlbmdpbmUsIGN0eCk7CisJaWYgKElTX0VSUihycSkpCisJCXJldHVybiBQVFJfRVJS KHJxKTsKKworCWJhdGNoID0gZ3B1X3dyaXRlX2R3KHZtYSwgZHdvcmQgKiBzaXplb2YodTMyKSwg dmFsdWUpOworCWlmIChJU19FUlIoYmF0Y2gpKSB7CisJCWVyciA9IFBUUl9FUlIoYmF0Y2gpOwor CQlnb3RvIGVycl9yZXF1ZXN0OworCX0KKworCWk5MTVfdm1hX21vdmVfdG9fYWN0aXZlKGJhdGNo LCBycSwgMCk7CisJaTkxNV9nZW1fb2JqZWN0X3NldF9hY3RpdmVfcmVmZXJlbmNlKGJhdGNoLT5v YmopOworCWk5MTVfdm1hX3VucGluKGJhdGNoKTsKKwlpOTE1X3ZtYV9jbG9zZShiYXRjaCk7CisK KwllcnIgPSBycS0+ZW5naW5lLT5lbWl0X2ZsdXNoKHJxLCBFTUlUX0lOVkFMSURBVEUpOworCWlm IChlcnIpCisJCWdvdG8gZXJyX3JlcXVlc3Q7CisKKwllcnIgPSBpOTE1X3N3aXRjaF9jb250ZXh0 KHJxKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZXF1ZXN0OworCisJZXJyID0gcnEtPmVuZ2lu ZS0+ZW1pdF9iYl9zdGFydChycSwKKwkJCQkJYmF0Y2gtPm5vZGUuc3RhcnQsIGJhdGNoLT5ub2Rl LnNpemUsCisJCQkJCWZsYWdzKTsKKwlpZiAoZXJyKQorCQlnb3RvIGVycl9yZXF1ZXN0OworCisJ aTkxNV92bWFfbW92ZV90b19hY3RpdmUodm1hLCBycSwgRVhFQ19PQkpFQ1RfV1JJVEUpOworCisJ cmVzZXJ2YXRpb25fb2JqZWN0X2xvY2sodm1hLT5yZXN2LCBOVUxMKTsKKwlyZXNlcnZhdGlvbl9v YmplY3RfYWRkX2V4Y2xfZmVuY2Uodm1hLT5yZXN2LCAmcnEtPmZlbmNlKTsKKwlyZXNlcnZhdGlv bl9vYmplY3RfdW5sb2NrKHZtYS0+cmVzdik7CisKK2Vycl9yZXF1ZXN0OgorCV9faTkxNV9hZGRf cmVxdWVzdChycSwgZXJyID09IDApOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBj cHVfY2hlY2soc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgdTMyIGR3b3JkLCB1MzIg dmFsKQoreworCXVuc2lnbmVkIGludCBuZWVkc19mbHVzaDsKKwl1bnNpZ25lZCBsb25nIG47CisJ aW50IGVycjsKKworCWVyciA9IGk5MTVfZ2VtX29ial9wcmVwYXJlX3NobWVtX3JlYWQob2JqLCAm bmVlZHNfZmx1c2gpOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlmb3IgKG4gPSAwOyBu IDwgb2JqLT5iYXNlLnNpemUgPj4gUEFHRV9TSElGVDsgKytuKSB7CisJCXUzMiAqcHRyID0ga21h cF9hdG9taWMoaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlKG9iaiwgbikpOworCisJCWlmIChuZWVk c19mbHVzaCAmIENMRkxVU0hfQkVGT1JFKQorCQkJZHJtX2NsZmx1c2hfdmlydF9yYW5nZShwdHIs IFBBR0VfU0laRSk7CisKKwkJaWYgKHB0cltkd29yZF0gIT0gdmFsKSB7CisJCQlwcl9lcnIoIm49 JWx1IHB0clsldV09JXUsIHZhbD0ldVxuIiwKKwkJCSAgICAgICBuLCBkd29yZCwgcHRyW2R3b3Jk XSwgdmFsKTsKKwkJCWt1bm1hcF9hdG9taWMocHRyKTsKKwkJCWVyciA9IC1FSU5WQUw7CisJCQli cmVhazsKKwkJfQorCisJCWt1bm1hcF9hdG9taWMocHRyKTsKKwl9CisKKwlpOTE1X2dlbV9vYmpf ZmluaXNoX3NobWVtX2FjY2VzcyhvYmopOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlu dCBpZ3Rfd3JpdGVfaHVnZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqKQoreworCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0gdG9faTkxNShvYmotPmJhc2UuZGV2KTsKKwlz dHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4ID0gaTkxNS0+a2VybmVsX2NvbnRleHQ7CisJc3Ry dWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPSBjdHgtPnBwZ3R0ID8gJmN0eC0+cHBndHQtPmJh c2UgOiAmaTkxNS0+Z2d0dC5iYXNlOworCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCXVuc2lnbmVk IGludCBmbGFncyA9IFBJTl9VU0VSIHwgUElOX09GRlNFVF9GSVhFRDsKKwl1bnNpZ25lZCBpbnQg bWF4X3BhZ2Vfc2l6ZTsKKwlzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmU7CisJdW5zaWdu ZWQgaW50IGlkOworCXUzMiBtYXg7CisJdTMyIG51bTsKKwl1NjQgc2l6ZTsKKwlpbnQgZXJyID0g MDsKKworCUdFTV9CVUdfT04oIWk5MTVfZ2VtX29iamVjdF9oYXNfcGlubmVkX3BhZ2VzKG9iaikp OworCisJc2l6ZSA9IG9iai0+YmFzZS5zaXplOworCWlmIChvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cg JiBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKQorCQlzaXplID0gcm91bmRfdXAoc2l6ZSwgSTkxNV9H VFRfUEFHRV9TSVpFXzJNKTsKKworCW1heF9wYWdlX3NpemUgPSByb3VuZGRvd25fcG93X29mX3R3 byhvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cpOworCW1heCA9ICh2bS0+dG90YWwgLSBzaXplKSAvIG1h eF9wYWdlX3NpemU7CisKKwl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosIHZtLCBOVUxMKTsK KwlpZiAoSVNfRVJSKHZtYSkpCisJCXJldHVybiBQVFJfRVJSKHZtYSk7CisKKwlmb3JfZWFjaF9l bmdpbmUoZW5naW5lLCBpOTE1LCBpZCkgeworCQlJR1RfVElNRU9VVChlbmRfdGltZSk7CisKKwkJ aWYgKCFpbnRlbF9lbmdpbmVfY2FuX3N0b3JlX2R3b3JkKGVuZ2luZSkpIHsKKwkJCXByX2luZm8o InN0b3JlLWR3b3JkLWltbSBub3Qgc3VwcG9ydGVkIG9uIGVuZ2luZT0ldVxuIiwKKwkJCQlpZCk7 CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFRyeSB2YXJpb3VzIG9mZnNldHMgdW50 aWwgd2UgdGltZW91dCAtLSB3ZSB3YW50IHRvIGF2b2lkCisJCSAqIGlzc3VlcyBoaWRkZW4gYnkg ZWZmZWN0aXZlbHkgYWx3YXlzIHVzaW5nIG9mZnNldCA9IDAuCisJCSAqLworCQlmb3JfZWFjaF9w cmltZV9udW1iZXJfZnJvbShudW0sIDAsIG1heCkgeworCQkJdTY0IG9mZnNldCA9IG51bSAqIG1h eF9wYWdlX3NpemU7CisJCQl1MzIgZHdvcmQ7CisKKwkJCWVyciA9IGk5MTVfdm1hX3VuYmluZCh2 bWEpOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF92bWFfY2xvc2U7CisKKwkJCWVyciA9IGk5 MTVfdm1hX3Bpbih2bWEsIHNpemUsIG1heF9wYWdlX3NpemUsIGZsYWdzIHwgb2Zmc2V0KTsKKwkJ CWlmIChlcnIpIHsKKwkJCQkvKgorCQkJCSAqIFRoZSBnZ3R0IG1heSBoYXZlIHNvbWUgcGFnZXMg cmVzZXJ2ZWQgc28KKwkJCQkgKiByZWZyYWluIGZyb20gZXJyb3Jpbmcgb3V0LgorCQkJCSAqLwor CQkJCWlmIChlcnIgPT0gLUVOT1NQQyAmJiBpOTE1X2lzX2dndHQodm0pKQorCQkJCQljb250aW51 ZTsKKworCQkJCWdvdG8gb3V0X3ZtYV9jbG9zZTsKKwkJCX0KKworCQkJZXJyID0gaWd0X2NoZWNr X3BhZ2Vfc2l6ZXModm1hKTsKKwkJCWlmIChlcnIpCisJCQkJZ290byBvdXRfdm1hX3VucGluOwor CisJCQlkd29yZCA9IG9mZnNldF9pbl9wYWdlKG51bSkgLyA0OworCisJCQllcnIgPSBncHVfd3Jp dGUodm1hLCBjdHgsIGVuZ2luZSwgZHdvcmQsIG51bSArIDEpOworCQkJaWYgKGVycikgeworCQkJ CXByX2VycigiZ3B1LXdyaXRlIGZhaWxlZCBhdCBvZmZzZXQ9JWxseCIsIG9mZnNldCk7CisJCQkJ Z290byBvdXRfdm1hX3VucGluOworCQkJfQorCisJCQllcnIgPSBjcHVfY2hlY2sob2JqLCBkd29y ZCwgbnVtICsgMSk7CisJCQlpZiAoZXJyKSB7CisJCQkJcHJfZXJyKCJjcHUtY2hlY2sgZmFpbGVk IGF0IG9mZnNldD0lbGx4Iiwgb2Zmc2V0KTsKKwkJCQlnb3RvIG91dF92bWFfdW5waW47CisJCQl9 CisKKwkJCWk5MTVfdm1hX3VucGluKHZtYSk7CisKKwkJCWlmIChudW0gPiAwICYmCisJCQkgICAg aWd0X3RpbWVvdXQoZW5kX3RpbWUsCisJCQkJCSIlcyB0aW1lZCBvdXQgb24gZW5naW5lPSV1IGF0 IG9mZnNldD0lbGx4XG4iLAorCQkJCQlfX2Z1bmNfXywgaWQsIG9mZnNldCkpCisJCQkJYnJlYWs7 CisJCX0KKwl9CisKK291dF92bWFfdW5waW46CisJaWYgKGk5MTVfdm1hX2lzX3Bpbm5lZCh2bWEp KQorCQlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X3ZtYV9jbG9zZToKKwlpOTE1X3ZtYV9jbG9z ZSh2bWEpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZ3RfcHBndHRfZXhoYXVz dF9odWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFy ZzsKKwl1bnNpZ25lZCBsb25nIHN1cHBvcnRlZCA9IElOVEVMX0lORk8oaTkxNSktPnBhZ2Vfc2l6 ZXM7CisJc3RhdGljIHVuc2lnbmVkIGludCBwYWdlc1tBUlJBWV9TSVpFKHBhZ2Vfc2l6ZXMpXTsK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXVuc2lnbmVkIGludCBzaXplX21h c2s7CisJdW5zaWduZWQgaW50IHBhZ2VfbWFzazsKKwlpbnQgbiwgaTsKKwlpbnQgZXJyOworCisJ LyoKKwkgKiBTYW5pdHkgY2hlY2sgY3JlYXRpbmcgb2JqZWN0cyB3aXRoIGEgdmFyeWluZyBtaXgg b2YgcGFnZSBzaXplcyAtLQorCSAqIGVuc3VyaW5nIHRoYXQgb3VyIHdyaXRlcyBsYW5kcyBpbiB0 aGUgcmlnaHQgcGxhY2UuCisJICovCisKKwluID0gMDsKKwlmb3JfZWFjaF9zZXRfYml0KGksICZz dXBwb3J0ZWQsIEJJVFNfUEVSX0xPTkcpCisJCXBhZ2VzW24rK10gPSBCSVQoaSk7CisKKwlmb3Ig KHNpemVfbWFzayA9IDI7IHNpemVfbWFzayA8IEJJVChuKTsgc2l6ZV9tYXNrKyspIHsKKwkJdW5z aWduZWQgaW50IHNpemUgPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlm IChzaXplX21hc2sgJiBCSVQoaSkpCisJCQkJc2l6ZSB8PSBwYWdlc1tpXTsKKwkJfQorCisJCS8q CisJCSAqIEZvciBvdXIgcGFnZSBtYXNrIHdlIHdhbnQgdG8gZW51bWVyYXRlIGFsbCB0aGUgcGFn ZS1zaXplCisJCSAqIGNvbWJpbmF0aW9ucyB3aGljaCB3aWxsIGZpdCBpbnRvIG91ciBjaG9zZW4g b2JqZWN0IHNpemUuCisJCSAqLworCQlmb3IgKHBhZ2VfbWFzayA9IDI7IHBhZ2VfbWFzayA8PSBz aXplX21hc2s7IHBhZ2VfbWFzaysrKSB7CisJCQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplcyA9IDA7 CisKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCQlpZiAocGFnZV9tYXNrICYgQklU KGkpKQorCQkJCQlwYWdlX3NpemVzIHw9IHBhZ2VzW2ldOworCQkJfQorCisJCQkvKgorCQkJICog RW5zdXJlIHRoYXQgd2UgY2FuIGFjdHVhbGx5IGZpbGwgdGhlIGdpdmVuIG9iamVjdAorCQkJICog d2l0aCBvdXIgY2hvc2VuIHBhZ2UgbWFzay4KKwkJCSAqLworCQkJaWYgKCFJU19BTElHTkVEKHNp emUsIEJJVChfX2ZmcyhwYWdlX3NpemVzKSkpKQorCQkJCSAgY29udGludWU7CisKKwkJCW9iaiA9 IGh1Z2VfcGFnZXNfb2JqZWN0KGk5MTUsIHNpemUsIHBhZ2Vfc2l6ZXMpOworCQkJaWYgKElTX0VS UihvYmopKSB7CisJCQkJZXJyID0gUFRSX0VSUihvYmopOworCQkJCWdvdG8gb3V0X2RldmljZTsK KwkJCX0KKworCQkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOworCQkJaWYg KGVycikgeworCQkJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCQkJCWlmIChlcnIgPT0g LUVOT01FTSkgeworCQkJCQlwcl9pbmZvKCJ1bmFibGUgdG8gZ2V0IHBhZ2VzLCBzaXplPSV1LCBw YWdlcz0ldVxuIiwKKwkJCQkJCXNpemUsIHBhZ2Vfc2l6ZXMpOworCQkJCQllcnIgPSAwOworCQkJ CQlicmVhazsKKwkJCQl9CisKKwkJCQlwcl9lcnIoInBpbl9wYWdlcyBmYWlsZWQsIHNpemU9JXUs IHBhZ2VzPSV1XG4iLAorCQkJCSAgICAgICBzaXplX21hc2ssIHBhZ2VfbWFzayk7CisKKwkJCQln b3RvIG91dF9kZXZpY2U7CisJCQl9CisKKwkJCS8qIEZvcmNlIHRoZSBwYWdlLXNpemUgZm9yIHRo ZSBndHQgaW5zZXJ0aW9uICovCisJCQlvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5cyA9IG9iai0+bW0u cGFnZV9zaXplcy5zZyA9CisJCQkJcGFnZV9zaXplczsKKworCQkJZXJyID0gaWd0X3dyaXRlX2h1 Z2Uob2JqKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlwcl9lcnIoImV4aGF1c3Qgd3JpdGUtaHVnZSBm YWlsZWQgd2l0aCBzaXplPSV1XG4iLAorCQkJCSAgICAgICBzaXplKTsKKwkJCQlnb3RvIG91dF91 bnBpbjsKKwkJCX0KKworCQkJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCQlp OTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJCX0KKwl9CisKKwlnb3RvIG91dF9kZXZpY2U7CisK K291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwlpOTE1X2dl bV9vYmplY3RfcHV0KG9iaik7CitvdXRfZGV2aWNlOgorCW1rd3JpdGVfZGV2aWNlX2luZm8oaTkx NSktPnBhZ2Vfc2l6ZXMgPSBzdXBwb3J0ZWQ7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMg aW50IGlndF9wcGd0dF9pbnRlcm5hbF9odWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq OworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZXNbXSA9IHsKKwkJU1pfNjRLLAorCQlT Wl8xMjhLLAorCQlTWl8yNTZLLAorCQlTWl81MTJLLAorCQlTWl8xTSwKKwkJU1pfMk0sCisJfTsK KwlpbnQgaTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBTYW5pdHkgY2hlY2sgdGhhdCB0aGUgSFcg dXNlcyBodWdlIHBhZ2VzIGNvcnJlY3RseSB0aHJvdWdoIGludGVybmFsCisJICogLS0gZW5zdXJl IHRoYXQgb3VyIHdyaXRlcyBsYW5kIGluIHRoZSByaWdodCBwbGFjZS4KKwkgKi8KKworCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpemVzKTsgKytpKSB7CisJCXVuc2lnbmVkIGludCBzaXpl ID0gc2l6ZXNbaV07CisKKwkJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChp OTE1LCBzaXplKTsKKwkJaWYgKElTX0VSUihvYmopKQorCQkJcmV0dXJuIFBUUl9FUlIob2JqKTsK KworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJCWlmIChlcnIpCisJ CQlnb3RvIG91dF9wdXQ7CisKKwkJaWYgKG9iai0+bW0ucGFnZV9zaXplcy5waHlzIDwgSTkxNV9H VFRfUEFHRV9TSVpFXzY0SykgeworCQkJcHJfaW5mbygiaW50ZXJuYWwgdW5hYmxlIHRvIGFsbG9j YXRlIGh1Z2UtcGFnZShzKSB3aXRoIHNpemU9JXVcbiIsCisJCQkJc2l6ZSk7CisJCQlnb3RvIG91 dF91bnBpbjsKKwkJfQorCisJCWVyciA9IGlndF93cml0ZV9odWdlKG9iaik7CisJCWlmIChlcnIp IHsKKwkJCXByX2VycigiaW50ZXJuYWwgd3JpdGUtaHVnZSBmYWlsZWQgd2l0aCBzaXplPSV1XG4i LAorCQkJICAgICAgIHNpemUpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQlpOTE1X2dl bV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwor CX0KKworCXJldHVybiAwOworCitvdXRfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3Bh Z2VzKG9iaik7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJldHVy biBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpZ3RfY2FuX2FsbG9jYXRlX3RocChzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwlyZXR1cm4gaTkxNS0+bW0uZ2VtZnMgJiYg aGFzX3RyYW5zcGFyZW50X2h1Z2VwYWdlKCk7Cit9CisKK3N0YXRpYyBpbnQgaWd0X3BwZ3R0X2dl bWZzX2h1Z2Uodm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICppOTE1ID0g YXJnOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJc3RhdGljIGNvbnN0IHVu c2lnbmVkIGludCBzaXplc1tdID0geworCQlTWl8yTSwKKwkJU1pfNE0sCisJCVNaXzhNLAorCQlT Wl8xNk0sCisJCVNaXzMyTSwKKwl9OworCWludCBpOworCWludCBlcnI7CisKKwkvKgorCSAqIFNh bml0eSBjaGVjayB0aGF0IHRoZSBIVyB1c2VzIGh1Z2UgcGFnZXMgY29ycmVjdGx5IHRocm91Z2gg Z2VtZnMgLS0KKwkgKiBlbnN1cmUgdGhhdCBvdXIgd3JpdGVzIGxhbmQgaW4gdGhlIHJpZ2h0IHBs YWNlLgorCSAqLworCisJaWYgKCFpZ3RfY2FuX2FsbG9jYXRlX3RocChpOTE1KSkgeworCQlwcl9p bmZvKCJtaXNzaW5nIFRIUCBzdXBwb3J0LCBza2lwcGluZ1xuIik7CisJCXJldHVybiAwOworCX0K KworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpemVzKTsgKytpKSB7CisJCXVuc2lnbmVk IGludCBzaXplID0gc2l6ZXNbaV07CisKKwkJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZShp OTE1LCBzaXplKTsKKwkJaWYgKElTX0VSUihvYmopKQorCQkJcmV0dXJuIFBUUl9FUlIob2JqKTsK KworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2VzKG9iaik7CisJCWlmIChlcnIpCisJ CQlnb3RvIG91dF9wdXQ7CisKKwkJaWYgKG9iai0+bW0ucGFnZV9zaXplcy5waHlzIDwgSTkxNV9H VFRfUEFHRV9TSVpFXzJNKSB7CisJCQlwcl9pbmZvKCJmaW5pc2hpbmcgdGVzdCBlYXJseSwgZ2Vt ZnMgdW5hYmxlIHRvIGFsbG9jYXRlIGh1Z2UtcGFnZShzKSB3aXRoIHNpemU9JXVcbiIsCisJCQkJ c2l6ZSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCWVyciA9IGlndF93cml0ZV9odWdl KG9iaik7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiZ2VtZnMgd3JpdGUtaHVnZSBmYWlsZWQg d2l0aCBzaXplPSV1XG4iLAorCQkJICAgICAgIHNpemUpOworCQkJZ290byBvdXRfdW5waW47CisJ CX0KKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJaTkxNV9nZW1fb2Jq ZWN0X3B1dChvYmopOworCX0KKworCXJldHVybiAwOworCitvdXRfdW5waW46CisJaTkxNV9nZW1f b2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQo b2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X3BwZ3R0X3Bpbl91cGRh dGUodm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGFy ZzsKKwl1bnNpZ25lZCBsb25nIHN1cHBvcnRlZCA9IElOVEVMX0lORk8oZGV2X3ByaXYpLT5wYWdl X3NpemVzOworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGRldl9wcml2LT5rZXJuZWxf Y29udGV4dC0+cHBndHQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1 Y3QgaTkxNV92bWEgKnZtYTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSU5fVVNFUiB8IFBJTl9P RkZTRVRfRklYRUQ7CisJaW50IGZpcnN0LCBsYXN0OworCWludCBlcnI7CisKKwkvKgorCSAqIE1h a2Ugc3VyZSB0aGVyZSdzIG5vIGZ1bm55IGJ1c2luZXNzIHdoZW4gZG9pbmcgYSBQSU5fVVBEQVRF IC0tIGluIHRoZQorCSAqIHBhc3Qgd2UgaGFkIGEgc3VidGxlIGlzc3VlIHdpdGggYmVpbmcgYWJs ZSB0byBpbmNvcnJlY3RseSBkbyBtdWx0aXBsZQorCSAqIGFsbG9jIHZhIHJhbmdlcyBvbiB0aGUg c2FtZSBvYmplY3Qgd2hlbiBkb2luZyBhIFBJTl9VUERBVEUsIHdoaWNoCisJICogcmVzdWx0ZWQg aW4gc29tZSBwcmV0dHkgbmFzdHkgYnVncywgdGhvdWdoIG9ubHkgd2hlbiB1c2luZworCSAqIGh1 Z2UtZ3R0LXBhZ2VzLgorCSAqLworCisJaWYgKCFVU0VTX0ZVTExfNDhCSVRfUFBHVFQoZGV2X3By aXYpKSB7CisJCXByX2luZm8oIjQ4YiBQUEdUVCBub3Qgc3VwcG9ydGVkLCBza2lwcGluZ1xuIik7 CisJCXJldHVybiAwOworCX0KKworCWZpcnN0ID0gaWxvZzIoSTkxNV9HVFRfUEFHRV9TSVpFXzY0 Syk7CisJbGFzdCA9IGlsb2cyKEk5MTVfR1RUX1BBR0VfU0laRV8yTSk7CisKKwlmb3JfZWFjaF9z ZXRfYml0X2Zyb20oZmlyc3QsICZzdXBwb3J0ZWQsIGxhc3QgKyAxKSB7CisJCXVuc2lnbmVkIGlu dCBwYWdlX3NpemUgPSBCSVQoZmlyc3QpOworCisJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVh dGVfaW50ZXJuYWwoZGV2X3ByaXYsIHBhZ2Vfc2l6ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJ CXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAm cHBndHQtPmJhc2UsIE5VTEwpOworCQlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJCWVyciA9IFBUUl9F UlIodm1hKTsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJfQorCisJCWVyciA9IGk5MTVfdm1hX3Bpbih2 bWEsIFNaXzJNLCAwLCBmbGFncyk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9jbG9zZTsKKwor CQlpZiAodm1hLT5wYWdlX3NpemVzLnNnIDwgcGFnZV9zaXplKSB7CisJCQlwcl9pbmZvKCJVbmFi bGUgdG8gYWxsb2NhdGUgcGFnZS1zaXplICV4LCBmaW5pc2hpbmcgdGVzdCBlYXJseVxuIiwKKwkJ CQlwYWdlX3NpemUpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQlpZiAoaWd0X2NoZWNr X3BhZ2Vfc2l6ZXModm1hKSkKKwkJCWdvdG8gb3V0X3VucGluOworCisJCWlmICh2bWEtPnBhZ2Vf c2l6ZXMuZ3R0ICE9IHBhZ2Vfc2l6ZSkgeworCQkJZG1hX2FkZHJfdCBhZGRyID0gaTkxNV9nZW1f b2JqZWN0X2dldF9kbWFfYWRkcmVzcyhvYmosIDApOworCisJCQkvKgorCQkJICogVGhlIG9ubHkg dmFsaWQgcmVhc29uIGZvciB0aGlzIHRvIGV2ZXIgZmFpbCB3b3VsZCBiZQorCQkJICogaWYgdGhl IGRtYS1tYXBwZXIgc2NyZXdlZCB1cyBvdmVyIHdoZW4gd2UgZGlkIHRoZQorCQkJICogZG1hX21h cF9zZygpLCBzaW5jZSBpdCBoYXMgdGhlIGZpbmFsIHNheSBvdmVyIHRoZSBkbWEKKwkJCSAqIGFk ZHJlc3MuCisJCQkgKi8KKwkJCWlmIChJU19BTElHTkVEKGFkZHIsIHBhZ2Vfc2l6ZSkpIHsKKwkJ CQlwcl9lcnIoInBhZ2Vfc2l6ZXMuZ3R0PSV1LCBleHBlY3RlZD0ldVxuIiwKKwkJCQkgICAgICAg dm1hLT5wYWdlX3NpemVzLmd0dCwgcGFnZV9zaXplKTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJ fSBlbHNlIHsKKwkJCQlwcl9pbmZvKCJkbWEgYWRkcmVzcyBtaXNhbGlnbmVkLCBmaW5pc2hpbmcg dGVzdCBlYXJseVxuIik7CisJCQl9CisKKwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJZXJy ID0gaTkxNV92bWFfYmluZCh2bWEsIEk5MTVfQ0FDSEVfTk9ORSwgUElOX1VQREFURSk7CisJCWlm IChlcnIpCisJCQlnb3RvIG91dF91bnBpbjsKKworCQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQlp OTE1X3ZtYV9jbG9zZSh2bWEpOworCisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9CisK KwlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGRldl9wcml2LCBQQUdFX1NJ WkUpOworCWlmIChJU19FUlIob2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCXZtYSA9 IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJnBwZ3R0LT5iYXNlLCBOVUxMKTsKKwlpZiAoSVNfRVJS KHZtYSkpIHsKKwkJZXJyID0gUFRSX0VSUih2bWEpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJ ZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8g b3V0X2Nsb3NlOworCisJLyoKKwkgKiBNYWtlIHN1cmUgd2UgZG9uJ3QgZW5kIHVwIHdpdGggc29t ZXRoaW5nIGxpa2Ugd2hlcmUgdGhlIHBkZSBpcyBzdGlsbAorCSAqIHBvaW50aW5nIHRvIHRoZSAy TSBwYWdlLCBhbmQgdGhlIHB0IHdlIGp1c3QgZmlsbGVkLWluIGlzIGRhbmdsaW5nIC0tCisJICog d2UgY2FuIGNoZWNrIHRoaXMgYnkgd3JpdGluZyB0byB0aGUgZmlyc3QgcGFnZSB3aGVyZSBpdCB3 b3VsZCB0aGVuCisJICogbGFuZCBpbiB0aGUgbm93IHN0YWxlIDJNIHBhZ2UuCisJICovCisKKwll cnIgPSBncHVfd3JpdGUodm1hLCBkZXZfcHJpdi0+a2VybmVsX2NvbnRleHQsIGRldl9wcml2LT5l bmdpbmVbUkNTXSwKKwkJCTAsIDB4ZGVhZGJlYWYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X3Vu cGluOworCisJZXJyID0gY3B1X2NoZWNrKG9iaiwgMCwgMHhkZWFkYmVhZik7CisKK291dF91bnBp bjoKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X2Nsb3NlOgorCWk5MTVfdm1hX2Nsb3NlKHZt YSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7 Cit9CisKK3N0YXRpYyBpbnQgaWd0X3RtcGZzX2ZhbGxiYWNrKHZvaWQgKmFyZykKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3QgdmZzbW91bnQgKmdlbWZz ID0gaTkxNS0+bW0uZ2VtZnM7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlp bnQgZXJyID0gMDsKKworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgYnVyc3QgaW50 byBhIGJhbGwgb2YgZmxhbWVzIHVwb24gZmFsbGluZyBiYWNrCisJICogdG8gdG1wZnMsIHdoaWNo IHdlIHJlbHkgb24gaWYgb24gdGhlIG9mZi1jaGFuY2Ugd2UgZW5jb3V0ZXIgYSBmYWlsdXJlCisJ ICogd2hlbiBzZXR0aW5nIHVwIGdlbWZzLgorCSAqLworCisJaTkxNS0+bW0uZ2VtZnMgPSBOVUxM OworCisJb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZShpOTE1LCBQQUdFX1NJWkUpOworCWlm IChJU19FUlIob2JqKSkgeworCQllcnIgPSBQVFJfRVJSKG9iaik7CisJCWdvdG8gb3V0X3Jlc3Rv cmU7CisJfQorCisJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOworCWlmIChl cnIpCisJCWdvdG8gb3V0X3B1dDsKKworCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmop Oworb3V0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CitvdXRfcmVzdG9yZToKKwlp OTE1LT5tbS5nZW1mcyA9IGdlbWZzOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBp Z3Rfc2hyaW5rX3RocCh2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5 MTUgPSBhcmc7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0ID0gaTkxNS0+a2VybmVsX2Nv bnRleHQtPnBwZ3R0OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0 IGk5MTVfdm1hICp2bWE7CisJdW5zaWduZWQgaW50IGZsYWdzID0gUElOX1VTRVIgfCBQSU5fT0ZG U0VUX0ZJWEVEOworCWludCBlcnI7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayBzaHJpbmtpbmcg aHVnZS1wYWdlZCBvYmplY3QgLS0gbWFrZSBzdXJlIG5vdGhpbmcgYmxvd3MKKwkgKiB1cC4KKwkg Ki8KKworCWlmICghaWd0X2Nhbl9hbGxvY2F0ZV90aHAoaTkxNSkpIHsKKwkJcHJfaW5mbygibWlz c2luZyBUSFAgc3VwcG9ydCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlvYmog PSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlKGk5MTUsIFNaXzJNKTsKKwlpZiAoSVNfRVJSKG9iaikp CisJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmos ICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJaWYgKElTX0VSUih2bWEpKSB7CisJCWVyciA9IFBUUl9F UlIodm1hKTsKKwkJZ290byBvdXRfcHV0OworCX0KKworCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEs IDAsIDAsIGZsYWdzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91dF9jbG9zZTsKKworCWlmICghUGFn ZVRyYW5zSHVnZShpOTE1X2dlbV9vYmplY3RfZ2V0X3BhZ2Uob2JqLCAwKSkpIHsKKwkJcHJfaW5m bygiZmFpbGVkIHRvIGFsbG9jYXRlIFRIUCwgZmluaXNoaW5nIHRlc3QgZWFybHlcbiIpOworCQln b3RvIG91dF91bnBpbjsKKwl9CisKKwllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOwor CWlmIChlcnIpCisJCWdvdG8gb3V0X3VucGluOworCisJZXJyID0gZ3B1X3dyaXRlKHZtYSwgaTkx NS0+a2VybmVsX2NvbnRleHQsIGk5MTUtPmVuZ2luZVtSQ1NdLCAwLAorCQkJMHhkZWFkYmVhZik7 CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5waW47CisKKwlpOTE1X3ZtYV91bnBpbih2bWEpOwor CisJLyoKKwkgKiBOb3cgdGhhdCB0aGUgcGFnZXMgYXJlICp1bnBpbm5lZCogc2hyaW5rLWFsbCBz aG91bGQgaW52b2tlCisJICogc2htZW0gdG8gdHJ1bmNhdGUgb3VyIHBhZ2VzLgorCSAqLworCWk5 MTVfZ2VtX3Nocmlua19hbGwoaTkxNSk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChvYmotPm1tLnBh Z2VzKSkgeworCQlwcl9lcnIoInNocmluay1hbGwgZGlkbid0IHRydW5jYXRlIHRoZSBwYWdlc1xu Iik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmIChvYmot Pm1tLnBhZ2Vfc2l6ZXMuc2cgfHwgb2JqLT5tbS5wYWdlX3NpemVzLnBoeXMpIHsKKwkJcHJfZXJy KCJyZXNpZHVhbCBwYWdlLXNpemUgYml0cyBsZWZ0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJ Z290byBvdXRfY2xvc2U7CisJfQorCisJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxh Z3MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJZXJyID0gY3B1X2NoZWNrKG9i aiwgMCwgMHhkZWFkYmVhZik7CisKK291dF91bnBpbjoKKwlpOTE1X3ZtYV91bnBpbih2bWEpOwor b3V0X2Nsb3NlOgorCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29i amVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBpOTE1X2dlbV9odWdlX3Bh Z2VfbW9ja19zZWxmdGVzdHModm9pZCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3Vi dGVzdCB0ZXN0c1tdID0geworCQlTVUJURVNUKGlndF9tb2NrX2V4aGF1c3RfZGV2aWNlX3N1cHBv cnRlZF9wYWdlcyksCisJCVNVQlRFU1QoaWd0X21vY2tfcHBndHRfbWlzYWxpZ25lZF9kbWEpLAor CQlTVUJURVNUKGlndF9tb2NrX3BwZ3R0X2h1Z2VfZmlsbCksCisJCVNVQlRFU1QoaWd0X21vY2tf cHBndHRfNjRLKSwKKwl9OworCWludCBzYXZlZF9wcGd0dCA9IGk5MTVfbW9kcGFyYW1zLmVuYWJs ZV9wcGd0dDsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IHBj aV9kZXYgKnBkZXY7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0OworCWludCBlcnI7CisK KwlkZXZfcHJpdiA9IG1vY2tfZ2VtX2RldmljZSgpOworCWlmICghZGV2X3ByaXYpCisJCXJldHVy biAtRU5PTUVNOworCisJLyogUHJldGVuZCB0byBiZSBhIGRldmljZSB3aGljaCBzdXBwb3J0cyB0 aGUgNDhiIFBQR1RUICovCisJaTkxNV9tb2RwYXJhbXMuZW5hYmxlX3BwZ3R0ID0gMzsKKworCXBk ZXYgPSBkZXZfcHJpdi0+ZHJtLnBkZXY7CisJZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgm cGRldi0+ZGV2LCBETUFfQklUX01BU0soMzkpKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5k cm0uc3RydWN0X211dGV4KTsKKwlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGRldl9wcml2LCBF UlJfUFRSKC1FTk9ERVYpLCAibW9jayIpOworCWlmIChJU19FUlIocHBndHQpKSB7CisJCWVyciA9 IFBUUl9FUlIocHBndHQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKCFpOTE1X3Zt X2lzXzQ4Yml0KCZwcGd0dC0+YmFzZSkpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIDQ4 YiBQUEdUVFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKwor CS8qIElmIHdlIHdlcmUgZXZlciBoaXQgdGhpcyB0aGVuIGl0J3MgdGltZSB0byBtb2NrIHRoZSA2 NEsgc2NyYXRjaCAqLworCWlmICghaTkxNV92bV9oYXNfc2NyYXRjaF82NEsoJnBwZ3R0LT5iYXNl KSkgeworCQlwcl9lcnIoIlBQR1RUIG1pc3NpbmcgNjRLIHNjcmF0Y2ggcGFnZVxuIik7CisJCWVy ciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWVyciA9IGk5MTVfc3VidGVz dHModGVzdHMsIHBwZ3R0KTsKKworb3V0X2Nsb3NlOgorCWk5MTVfcHBndHRfY2xvc2UoJnBwZ3R0 LT5iYXNlKTsKKwlpOTE1X3BwZ3R0X3B1dChwcGd0dCk7CisKK291dF91bmxvY2s6CisJbXV0ZXhf dW5sb2NrKCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7CisKKwlpOTE1X21vZHBhcmFtcy5l bmFibGVfcHBndHQgPSBzYXZlZF9wcGd0dDsKKworCWRybV9kZXZfdW5yZWYoJmRldl9wcml2LT5k cm0pOworCisJcmV0dXJuIGVycjsKK30KKworaW50IGk5MTVfZ2VtX2h1Z2VfcGFnZV9saXZlX3Nl bGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RhdGljIGNv bnN0IHN0cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKKwkJU1VCVEVTVChpZ3RfcHBndHRf Z2VtZnNfaHVnZSksCisJCVNVQlRFU1QoaWd0X3BwZ3R0X2ludGVybmFsX2h1Z2UpLAorCQlTVUJU RVNUKGlndF9wcGd0dF9leGhhdXN0X2h1Z2UpLAorCQlTVUJURVNUKGlndF9wcGd0dF9waW5fdXBk YXRlKSwKKwkJU1VCVEVTVChpZ3RfdG1wZnNfZmFsbGJhY2spLAorCQlTVUJURVNUKGlndF9zaHJp bmtfdGhwKSwKKwl9OworCWludCBlcnI7CisKKwlpZiAoIVVTRVNfUFBHVFQoZGV2X3ByaXYpKSB7 CisJCXByX2luZm8oIlBQR1RUIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIGxpdmUtc2VsZnRlc3Rz XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRybS5zdHJ1 Y3RfbXV0ZXgpOworCWVyciA9IGk5MTVfc3VidGVzdHModGVzdHMsIGRldl9wcml2KTsKKwltdXRl eF91bmxvY2soJmRldl9wcml2LT5kcm0uc3RydWN0X211dGV4KTsKKworCXJldHVybiBlcnI7Cit9 CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3Nl bGZ0ZXN0cy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxm dGVzdHMuaAppbmRleCAxOGIxNzRkODU1Y2EuLjY0YWNkN2VjY2M1YyAxMDA2NDQKLS0tIGEvZHJp dmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAorKysgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCkBAIC0x NSw1ICsxNSw2IEBAIHNlbGZ0ZXN0KG9iamVjdHMsIGk5MTVfZ2VtX29iamVjdF9saXZlX3NlbGZ0 ZXN0cykKIHNlbGZ0ZXN0KGRtYWJ1ZiwgaTkxNV9nZW1fZG1hYnVmX2xpdmVfc2VsZnRlc3RzKQog c2VsZnRlc3QoY29oZXJlbmN5LCBpOTE1X2dlbV9jb2hlcmVuY3lfbGl2ZV9zZWxmdGVzdHMpCiBz ZWxmdGVzdChndHQsIGk5MTVfZ2VtX2d0dF9saXZlX3NlbGZ0ZXN0cykKK3NlbGZ0ZXN0KGh1Z2Vw YWdlcywgaTkxNV9nZW1faHVnZV9wYWdlX2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoY29udGV4 dHMsIGk5MTVfZ2VtX2NvbnRleHRfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChoYW5nY2hlY2ss IGludGVsX2hhbmdjaGVja19saXZlX3NlbGZ0ZXN0cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3RzLmggYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oCmluZGV4IGZjNzQ2ODc1MDFi YS4uOTk2MWI0NGY3NmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVz dHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0 ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3RzLmgKQEAgLTIxLDMgKzIxLDQgQEAgc2VsZnRlc3QoZG1h YnVmLCBpOTE1X2dlbV9kbWFidWZfbW9ja19zZWxmdGVzdHMpCiBzZWxmdGVzdCh2bWEsIGk5MTVf dm1hX21vY2tfc2VsZnRlc3RzKQogc2VsZnRlc3QoZXZpY3QsIGk5MTVfZ2VtX2V2aWN0X21vY2tf c2VsZnRlc3RzKQogc2VsZnRlc3QoZ3R0LCBpOTE1X2dlbV9ndHRfbW9ja19zZWxmdGVzdHMpCitz ZWxmdGVzdChodWdlcGFnZXMsIGk5MTVfZ2VtX2h1Z2VfcGFnZV9tb2NrX3NlbGZ0ZXN0cykKLS0g CjIuMTMuNQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K SW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0 dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==