From: Matthew Auld Subject: [PATCH 17/21] drm/i915/selftests: huge page tests Date: Fri, 29 Sep 2017 17:10:28 +0100 Message-ID: <20170929161032.24394-18-matthew.auld@intel.com> References: <20170929161032.24394-1-matthew.auld@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by gabe.freedesktop.org (Postfix) with ESMTPS id CA5806EC1C for ; Fri, 29 Sep 2017 16:11:05 +0000 (UTC) In-Reply-To: <20170929161032.24394-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 aHVnZV9wYWdlcy5jICAgICAgICB8IDE3MTEgKysrKysrKysrKysrKysrKysrKysKIC4uLi9ncHUv ZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaCAgIHwgICAgMSArCiAuLi4v Z3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3RzLmggICB8ICAgIDEgKwog NSBmaWxlcyBjaGFuZ2VkLCAxNzE2IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdlcy5jCgpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtLmMKaW5kZXggMWU0ZjJiM2MzM2FiLi43NjlhOTRlNjY2ZTYgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9nZW0uYwpAQCAtNTQwNiw2ICs1NDA2LDcgQEAgaW50IGk5MTVfZ2VtX29iamVjdF9hdHRh Y2hfcGh5cyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgYWxpZ24pCiAjaW5j bHVkZSAic2VsZnRlc3RzL3NjYXR0ZXJsaXN0LmMiCiAjaW5jbHVkZSAic2VsZnRlc3RzL21vY2tf Z2VtX2RldmljZS5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9odWdlX2dlbV9vYmplY3QuYyIKKyNp bmNsdWRlICJzZWxmdGVzdHMvaHVnZV9wYWdlcy5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9pOTE1 X2dlbV9vYmplY3QuYyIKICNpbmNsdWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fY29oZXJlbmN5LmMi CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVj dC5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW1fb2JqZWN0LmgKaW5kZXggZTRlNmRk OTM4ODlkLi45NTZjOTExYzJjYmYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtX29iamVjdC5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVj dC5oCkBAIC0xOTYsNiArMTk2LDggQEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgewogCQkJ dW5zaWduZWQgaW50IGd0dDsKIAkJfSBwYWdlX3NpemVzOwogCisJCUk5MTVfU0VMRlRFU1RfREVD TEFSRSh1bnNpZ25lZCBpbnQgcGFnZV9tYXNrKTsKKwogCQlzdHJ1Y3QgaTkxNV9nZW1fb2JqZWN0 X3BhZ2VfaXRlciB7CiAJCQlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnX3BvczsKIAkJCXVuc2lnbmVk IGludCBzZ19pZHg7IC8qIGluIHBhZ2VzLCBidXQgMzJiaXQgZWVrISAqLwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2h1Z2VfcGFnZXMuYyBiL2RyaXZlcnMvZ3B1 L2RybS9pOTE1L3NlbGZ0ZXN0cy9odWdlX3BhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwLi41NDNiNjMyYzNmYjYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdlcy5jCkBAIC0wLDAgKzEsMTcxMSBAQAor 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 emUsIEJJVChfX2ZmcyhwYWdlX3NpemVzKSkpKQorCQkJCWNvbnRpbnVlOworCisJCQlvYmogPSBo dWdlX3BhZ2VzX29iamVjdChpOTE1LCBzaXplLCBwYWdlX3NpemVzKTsKKwkJCWlmIChJU19FUlIo b2JqKSkgeworCQkJCWVyciA9IFBUUl9FUlIob2JqKTsKKwkJCQlnb3RvIG91dF9kZXZpY2U7CisJ CQl9CisKKwkJCWVyciA9IGk5MTVfZ2VtX29iamVjdF9waW5fcGFnZXMob2JqKTsKKwkJCWlmIChl cnIpIHsKKwkJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwkJCQlpZiAoZXJyID09IC1F Tk9NRU0pIHsKKwkJCQkJcHJfaW5mbygidW5hYmxlIHRvIGdldCBwYWdlcywgc2l6ZT0ldSwgcGFn ZXM9JXVcbiIsCisJCQkJCQlzaXplLCBwYWdlX3NpemVzKTsKKwkJCQkJZXJyID0gMDsKKwkJCQkJ YnJlYWs7CisJCQkJfQorCisJCQkJcHJfZXJyKCJwaW5fcGFnZXMgZmFpbGVkLCBzaXplPSV1LCBw YWdlcz0ldVxuIiwKKwkJCQkgICAgICAgc2l6ZV9tYXNrLCBwYWdlX21hc2spOworCisJCQkJZ290 byBvdXRfZGV2aWNlOworCQkJfQorCisJCQkvKiBGb3JjZSB0aGUgcGFnZS1zaXplIGZvciB0aGUg Z3R0IGluc2VydGlvbiAqLworCQkJb2JqLT5tbS5wYWdlX3NpemVzLnNnID0gcGFnZV9zaXplczsK KworCQkJZXJyID0gaWd0X3dyaXRlX2h1Z2Uob2JqKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlwcl9l cnIoImV4aGF1c3Qgd3JpdGUtaHVnZSBmYWlsZWQgd2l0aCBzaXplPSV1XG4iLAorCQkJCSAgICAg ICBzaXplKTsKKwkJCQlnb3RvIG91dF91bnBpbjsKKwkJCX0KKworCQkJaTkxNV9nZW1fb2JqZWN0 X3VucGluX3BhZ2VzKG9iaik7CisJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJCX0KKwl9 CisKKwlnb3RvIG91dF9kZXZpY2U7CisKK291dF91bnBpbjoKKwlpOTE1X2dlbV9vYmplY3RfdW5w aW5fcGFnZXMob2JqKTsKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CitvdXRfZGV2aWNlOgor CW1rd3JpdGVfZGV2aWNlX2luZm8oaTkxNSktPnBhZ2Vfc2l6ZXMgPSBzdXBwb3J0ZWQ7CisKKwly ZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF9wcGd0dF9pbnRlcm5hbF9odWdlKHZvaWQg KmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsKKwlzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgc2l6 ZXNbXSA9IHsKKwkJU1pfNjRLLAorCQlTWl8xMjhLLAorCQlTWl8yNTZLLAorCQlTWl81MTJLLAor CQlTWl8xTSwKKwkJU1pfMk0sCisJfTsKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBT YW5pdHkgY2hlY2sgdGhhdCB0aGUgSFcgdXNlcyBodWdlIHBhZ2VzIGNvcnJlY3RseSB0aHJvdWdo IGludGVybmFsCisJICogLS0gZW5zdXJlIHRoYXQgb3VyIHdyaXRlcyBsYW5kIGluIHRoZSByaWdo dCBwbGFjZS4KKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpemVzKTsgKytp KSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZXNbaV07CisKKwkJb2JqID0gaTkxNV9nZW1f b2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChpOTE1LCBzaXplKTsKKwkJaWYgKElTX0VSUihvYmopKQor CQkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3Bh Z2VzKG9iaik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9wdXQ7CisKKwkJaWYgKG9iai0+bW0u cGFnZV9zaXplcy5waHlzIDwgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgeworCQkJcHJfaW5mbygi aW50ZXJuYWwgdW5hYmxlIHRvIGFsbG9jYXRlIGh1Z2UtcGFnZShzKSB3aXRoIHNpemU9JXVcbiIs CisJCQkJc2l6ZSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCWVyciA9IGlndF93cml0 ZV9odWdlKG9iaik7CisJCWlmIChlcnIpIHsKKwkJCXByX2VycigiaW50ZXJuYWwgd3JpdGUtaHVn ZSBmYWlsZWQgd2l0aCBzaXplPSV1XG4iLAorCQkJICAgICAgIHNpemUpOworCQkJZ290byBvdXRf dW5waW47CisJCX0KKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJaTkx NV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCXJldHVybiAwOworCitvdXRfdW5waW46CisJ aTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29i amVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBp Z3RfY2FuX2FsbG9jYXRlX3RocChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSkKK3sKKwly ZXR1cm4gaTkxNS0+bW0uZ2VtZnMgJiYgaGFzX3RyYW5zcGFyZW50X2h1Z2VwYWdlKCk7Cit9CisK K3N0YXRpYyBpbnQgaWd0X3BwZ3R0X2dlbWZzX2h1Z2Uodm9pZCAqYXJnKQoreworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICppOTE1ID0gYXJnOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmo7CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBzaXplc1tdID0geworCQlTWl8yTSwK KwkJU1pfNE0sCisJCVNaXzhNLAorCQlTWl8xNk0sCisJCVNaXzMyTSwKKwl9OworCWludCBpOwor CWludCBlcnI7CisKKwkvKgorCSAqIFNhbml0eSBjaGVjayB0aGF0IHRoZSBIVyB1c2VzIGh1Z2Ug cGFnZXMgY29ycmVjdGx5IHRocm91Z2ggZ2VtZnMgLS0KKwkgKiBlbnN1cmUgdGhhdCBvdXIgd3Jp dGVzIGxhbmQgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSAqLworCisJaWYgKCFpZ3RfY2FuX2FsbG9j YXRlX3RocChpOTE1KSkgeworCQlwcl9pbmZvKCJtaXNzaW5nIFRIUCBzdXBwb3J0LCBza2lwcGlu Z1xuIik7CisJCXJldHVybiAwOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNp emVzKTsgKytpKSB7CisJCXVuc2lnbmVkIGludCBzaXplID0gc2l6ZXNbaV07CisKKwkJb2JqID0g aTkxNV9nZW1fb2JqZWN0X2NyZWF0ZShpOTE1LCBzaXplKTsKKwkJaWYgKElTX0VSUihvYmopKQor CQkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3Bh Z2VzKG9iaik7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF9wdXQ7CisKKwkJaWYgKG9iai0+bW0u cGFnZV9zaXplcy5waHlzIDwgSTkxNV9HVFRfUEFHRV9TSVpFXzJNKSB7CisJCQlwcl9pbmZvKCJm aW5pc2hpbmcgdGVzdCBlYXJseSwgZ2VtZnMgdW5hYmxlIHRvIGFsbG9jYXRlIGh1Z2UtcGFnZShz KSB3aXRoIHNpemU9JXVcbiIsCisJCQkJc2l6ZSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQor CisJCWVyciA9IGlndF93cml0ZV9odWdlKG9iaik7CisJCWlmIChlcnIpIHsKKwkJCXByX2Vycigi Z2VtZnMgd3JpdGUtaHVnZSBmYWlsZWQgd2l0aCBzaXplPSV1XG4iLAorCQkJICAgICAgIHNpemUp OworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFn ZXMob2JqKTsKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCXJldHVybiAwOwor CitvdXRfdW5waW46CisJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXRfcHV0 OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBpbnQgaWd0X3BwZ3R0X3Bpbl91cGRhdGUodm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IGFyZzsKKwl1bnNpZ25lZCBsb25nIHN1cHBvcnRlZCA9IElO VEVMX0lORk8oZGV2X3ByaXYpLT5wYWdlX3NpemVzOworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpw cGd0dCA9IGRldl9wcml2LT5rZXJuZWxfY29udGV4dC0+cHBndHQ7CisJc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwl1bnNpZ25lZCBpbnQg ZmxhZ3MgPSBQSU5fVVNFUiB8IFBJTl9PRkZTRVRfRklYRUQ7CisJaW50IGZpcnN0LCBsYXN0Owor CWludCBlcnI7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGVyZSdzIG5vIGZ1bm55IGJ1c2luZXNz IHdoZW4gZG9pbmcgYSBQSU5fVVBEQVRFIC0tIGluIHRoZQorCSAqIHBhc3Qgd2UgaGFkIGEgc3Vi dGxlIGlzc3VlIHdpdGggYmVpbmcgYWJsZSB0byBpbmNvcnJlY3RseSBkbyBtdWx0aXBsZQorCSAq IGFsbG9jIHZhIHJhbmdlcyBvbiB0aGUgc2FtZSBvYmplY3Qgd2hlbiBkb2luZyBhIFBJTl9VUERB VEUsIHdoaWNoCisJICogcmVzdWx0ZWQgaW4gc29tZSBwcmV0dHkgbmFzdHkgYnVncywgdGhvdWdo IG9ubHkgd2hlbiB1c2luZworCSAqIGh1Z2UtZ3R0LXBhZ2VzLgorCSAqLworCisJaWYgKCFVU0VT X0ZVTExfNDhCSVRfUFBHVFQoZGV2X3ByaXYpKSB7CisJCXByX2luZm8oIjQ4YiBQUEdUVCBub3Qg c3VwcG9ydGVkLCBza2lwcGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKworCWZpcnN0ID0gaWxv ZzIoSTkxNV9HVFRfUEFHRV9TSVpFXzY0Syk7CisJbGFzdCA9IGlsb2cyKEk5MTVfR1RUX1BBR0Vf U0laRV8yTSk7CisKKwlmb3JfZWFjaF9zZXRfYml0X2Zyb20oZmlyc3QsICZzdXBwb3J0ZWQsIGxh c3QgKyAxKSB7CisJCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBCSVQoZmlyc3QpOworCisJCW9i aiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoZGV2X3ByaXYsIHBhZ2Vfc2l6ZSk7 CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJdm1hID0g aTkxNV92bWFfaW5zdGFuY2Uob2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQlpZiAoSVNfRVJS KHZtYSkpIHsKKwkJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJCWdvdG8gb3V0X3B1dDsKKwkJfQor CisJCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIFNaXzJNLCAwLCBmbGFncyk7CisJCWlmIChlcnIp CisJCQlnb3RvIG91dF9jbG9zZTsKKworCQlpZiAodm1hLT5wYWdlX3NpemVzLnNnIDwgcGFnZV9z aXplKSB7CisJCQlwcl9pbmZvKCJVbmFibGUgdG8gYWxsb2NhdGUgcGFnZS1zaXplICV4LCBmaW5p c2hpbmcgdGVzdCBlYXJseVxuIiwKKwkJCQlwYWdlX3NpemUpOworCQkJZ290byBvdXRfdW5waW47 CisJCX0KKworCQllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCQlpZiAoZXJyKQor CQkJZ290byBvdXRfdW5waW47CisKKwkJaWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gcGFnZV9z aXplKSB7CisJCQlkbWFfYWRkcl90IGFkZHIgPSBpOTE1X2dlbV9vYmplY3RfZ2V0X2RtYV9hZGRy ZXNzKG9iaiwgMCk7CisKKwkJCS8qCisJCQkgKiBUaGUgb25seSB2YWxpZCByZWFzb24gZm9yIHRo aXMgdG8gZXZlciBmYWlsIHdvdWxkIGJlCisJCQkgKiBpZiB0aGUgZG1hLW1hcHBlciBzY3Jld2Vk IHVzIG92ZXIgd2hlbiB3ZSBkaWQgdGhlCisJCQkgKiBkbWFfbWFwX3NnKCksIHNpbmNlIGl0IGhh cyB0aGUgZmluYWwgc2F5IG92ZXIgdGhlIGRtYQorCQkJICogYWRkcmVzcy4KKwkJCSAqLworCQkJ aWYgKElTX0FMSUdORUQoYWRkciwgcGFnZV9zaXplKSkgeworCQkJCXByX2VycigicGFnZV9zaXpl cy5ndHQ9JXUsIGV4cGVjdGVkPSV1XG4iLAorCQkJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMuZ3R0 LCBwYWdlX3NpemUpOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQl9IGVsc2UgeworCQkJCXByX2lu Zm8oImRtYSBhZGRyZXNzIG1pc2FsaWduZWQsIGZpbmlzaGluZyB0ZXN0IGVhcmx5XG4iKTsKKwkJ CX0KKworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQllcnIgPSBpOTE1X3ZtYV9iaW5kKHZt YSwgSTkxNV9DQUNIRV9OT05FLCBQSU5fVVBEQVRFKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0 X3VucGluOworCisJCWk5MTVfdm1hX3VucGluKHZtYSk7CisJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7 CisKKwkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCX0KKworCW9iaiA9IGk5MTVfZ2VtX29i amVjdF9jcmVhdGVfaW50ZXJuYWwoZGV2X3ByaXYsIFBBR0VfU0laRSk7CisJaWYgKElTX0VSUihv YmopKQorCQlyZXR1cm4gUFRSX0VSUihvYmopOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uo b2JqLCAmcHBndHQtPmJhc2UsIE5VTEwpOworCWlmIChJU19FUlIodm1hKSkgeworCQllcnIgPSBQ VFJfRVJSKHZtYSk7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKKwllcnIgPSBpOTE1X3ZtYV9waW4o dm1hLCAwLCAwLCBmbGFncyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisKKwkvKgor CSAqIE1ha2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgd2l0aCBzb21ldGhpbmcgbGlrZSB3aGVyZSB0 aGUgcGRlIGlzIHN0aWxsCisJICogcG9pbnRpbmcgdG8gdGhlIDJNIHBhZ2UsIGFuZCB0aGUgcHQg d2UganVzdCBmaWxsZWQtaW4gaXMgZGFuZ2xpbmcgLS0KKwkgKiB3ZSBjYW4gY2hlY2sgdGhpcyBi eSB3cml0aW5nIHRvIHRoZSBmaXJzdCBwYWdlIHdoZXJlIGl0IHdvdWxkIHRoZW4KKwkgKiBsYW5k IGluIHRoZSBub3cgc3RhbGUgMk0gcGFnZS4KKwkgKi8KKworCWVyciA9IGdwdV93cml0ZSh2bWEs IGRldl9wcml2LT5rZXJuZWxfY29udGV4dCwgZGV2X3ByaXYtPmVuZ2luZVtSQ1NdLAorCQkJMCwg MHhkZWFkYmVhZik7CisJaWYgKGVycikKKwkJZ290byBvdXRfdW5waW47CisKKwllcnIgPSBjcHVf Y2hlY2sob2JqLCAwLCAweGRlYWRiZWFmKTsKKworb3V0X3VucGluOgorCWk5MTVfdm1hX3VucGlu KHZtYSk7CitvdXRfY2xvc2U6CisJaTkxNV92bWFfY2xvc2Uodm1hKTsKK291dF9wdXQ6CisJaTkx NV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBp Z3RfdG1wZnNfZmFsbGJhY2sodm9pZCAqYXJnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICppOTE1ID0gYXJnOworCXN0cnVjdCB2ZnNtb3VudCAqZ2VtZnMgPSBpOTE1LT5tbS5nZW1mczsK KwlzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4ID0gaTkxNS0+a2VybmVsX2NvbnRleHQ7CisJ c3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPSBjdHgtPnBwZ3R0ID8gJmN0eC0+cHBndHQt PmJhc2UgOiAmaTkxNS0+Z2d0dC5iYXNlOworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv Ymo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJdTMyICp2YWRkcjsKKwlpbnQgZXJyID0gMDsK KworCS8qCisJICogTWFrZSBzdXJlIHRoYXQgd2UgZG9uJ3QgYnVyc3QgaW50byBhIGJhbGwgb2Yg ZmxhbWVzIHVwb24gZmFsbGluZyBiYWNrCisJICogdG8gdG1wZnMsIHdoaWNoIHdlIHJlbHkgb24g aWYgb24gdGhlIG9mZi1jaGFuY2Ugd2UgZW5jb3V0ZXIgYSBmYWlsdXJlCisJICogd2hlbiBzZXR0 aW5nIHVwIGdlbWZzLgorCSAqLworCisJaTkxNS0+bW0uZ2VtZnMgPSBOVUxMOworCisJb2JqID0g aTkxNV9nZW1fb2JqZWN0X2NyZWF0ZShpOTE1LCBQQUdFX1NJWkUpOworCWlmIChJU19FUlIob2Jq KSkgeworCQllcnIgPSBQVFJfRVJSKG9iaik7CisJCWdvdG8gb3V0X3Jlc3RvcmU7CisJfQorCisJ dmFkZHIgPSBpOTE1X2dlbV9vYmplY3RfcGluX21hcChvYmosIEk5MTVfTUFQX1dCKTsKKwlpZiAo SVNfRVJSKHZhZGRyKSkgeworCQllcnIgPSBQVFJfRVJSKHZhZGRyKTsKKwkJZ290byBvdXRfcHV0 OworCX0KKwkqdmFkZHIgPSAweGRlYWRiZWFmOworCisJaTkxNV9nZW1fb2JqZWN0X3VucGluX21h cChvYmopOworCisJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCB2bSwgTlVMTCk7CisJaWYg KElTX0VSUih2bWEpKSB7CisJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJZ290byBvdXRfcHV0Owor CX0KKworCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIFBJTl9VU0VSKTsKKwlpZiAoZXJy KQorCQlnb3RvIG91dF9jbG9zZTsKKworCWVyciA9IGlndF9jaGVja19wYWdlX3NpemVzKHZtYSk7 CisKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X2Nsb3NlOgorCWk5MTVfdm1hX2Nsb3NlKHZt YSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKK291dF9yZXN0b3JlOgor CWk5MTUtPm1tLmdlbWZzID0gZ2VtZnM7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50 IGlndF9zaHJpbmtfdGhwKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq aTkxNSA9IGFyZzsKKwlzdHJ1Y3QgaTkxNV9nZW1fY29udGV4dCAqY3R4ID0gaTkxNS0+a2VybmVs X2NvbnRleHQ7CisJc3RydWN0IGk5MTVfYWRkcmVzc19zcGFjZSAqdm0gPSBjdHgtPnBwZ3R0ID8g JmN0eC0+cHBndHQtPmJhc2UgOiAmaTkxNS0+Z2d0dC5iYXNlOworCXN0cnVjdCBkcm1faTkxNV9n ZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJdW5zaWduZWQgaW50IGZs YWdzID0gUElOX1VTRVI7CisJaW50IGVycjsKKworCS8qCisJICogU2FuaXR5IGNoZWNrIHNocmlu a2luZyBodWdlLXBhZ2VkIG9iamVjdCAtLSBtYWtlIHN1cmUgbm90aGluZyBibG93cworCSAqIHVw LgorCSAqLworCisJaWYgKCFpZ3RfY2FuX2FsbG9jYXRlX3RocChpOTE1KSkgeworCQlwcl9pbmZv KCJtaXNzaW5nIFRIUCBzdXBwb3J0LCBza2lwcGluZ1xuIik7CisJCXJldHVybiAwOworCX0KKwor CW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGUoaTkxNSwgU1pfMk0pOworCWlmIChJU19FUlIo b2JqKSkKKwkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNl KG9iaiwgdm0sIE5VTEwpOworCWlmIChJU19FUlIodm1hKSkgeworCQllcnIgPSBQVFJfRVJSKHZt YSk7CisJCWdvdG8gb3V0X3B1dDsKKwl9CisKKwllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAw LCBmbGFncyk7CisJaWYgKGVycikKKwkJZ290byBvdXRfY2xvc2U7CisKKwlpZiAob2JqLT5tbS5w YWdlX3NpemVzLnBoeXMgPCBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pIHsKKwkJcHJfaW5mbygiZmFp bGVkIHRvIGFsbG9jYXRlIFRIUCwgZmluaXNoaW5nIHRlc3QgZWFybHlcbiIpOworCQlnb3RvIG91 dF91bnBpbjsKKwl9CisKKwllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCWlmIChl cnIpCisJCWdvdG8gb3V0X3VucGluOworCisJZXJyID0gZ3B1X3dyaXRlKHZtYSwgaTkxNS0+a2Vy bmVsX2NvbnRleHQsIGk5MTUtPmVuZ2luZVtSQ1NdLCAwLAorCQkJMHhkZWFkYmVhZik7CisJaWYg KGVycikKKwkJZ290byBvdXRfdW5waW47CisKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworCisJLyoK KwkgKiBOb3cgdGhhdCB0aGUgcGFnZXMgYXJlICp1bnBpbm5lZCogc2hyaW5rLWFsbCBzaG91bGQg aW52b2tlCisJICogc2htZW0gdG8gdHJ1bmNhdGUgb3VyIHBhZ2VzLgorCSAqLworCWk5MTVfZ2Vt X3Nocmlua19hbGwoaTkxNSk7CisJaWYgKCFJU19FUlJfT1JfTlVMTChvYmotPm1tLnBhZ2VzKSkg eworCQlwcl9lcnIoInNocmluay1hbGwgZGlkbid0IHRydW5jYXRlIHRoZSBwYWdlc1xuIik7CisJ CWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmIChvYmotPm1tLnBh Z2Vfc2l6ZXMuc2cgfHwgb2JqLT5tbS5wYWdlX3NpemVzLnBoeXMpIHsKKwkJcHJfZXJyKCJyZXNp ZHVhbCBwYWdlLXNpemUgYml0cyBsZWZ0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBv dXRfY2xvc2U7CisJfQorCisJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOwor CWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJZXJyID0gY3B1X2NoZWNrKG9iaiwgMCwg MHhkZWFkYmVhZik7CisKK291dF91bnBpbjoKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X2Ns b3NlOgorCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9w dXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBpOTE1X2dlbV9odWdlX3BhZ2VfbW9j a19zZWxmdGVzdHModm9pZCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVzdCB0 ZXN0c1tdID0geworCQlTVUJURVNUKGlndF9tb2NrX2V4aGF1c3RfZGV2aWNlX3N1cHBvcnRlZF9w YWdlcyksCisJCVNVQlRFU1QoaWd0X21vY2tfcHBndHRfbWlzYWxpZ25lZF9kbWEpLAorCQlTVUJU RVNUKGlndF9tb2NrX3BwZ3R0X2h1Z2VfZmlsbCksCisJCVNVQlRFU1QoaWd0X21vY2tfcHBndHRf NjRLKSwKKwl9OworCWludCBzYXZlZF9wcGd0dCA9IGk5MTVfbW9kcGFyYW1zLmVuYWJsZV9wcGd0 dDsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IHBjaV9kZXYg KnBkZXY7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0OworCWludCBlcnI7CisKKwlkZXZf cHJpdiA9IG1vY2tfZ2VtX2RldmljZSgpOworCWlmICghZGV2X3ByaXYpCisJCXJldHVybiAtRU5P TUVNOworCisJLyogUHJldGVuZCB0byBiZSBhIGRldmljZSB3aGljaCBzdXBwb3J0cyB0aGUgNDhi IFBQR1RUICovCisJaTkxNV9tb2RwYXJhbXMuZW5hYmxlX3BwZ3R0ID0gMzsKKworCXBkZXYgPSBk ZXZfcHJpdi0+ZHJtLnBkZXY7CisJZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ ZGV2LCBETUFfQklUX01BU0soMzkpKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcm0uc3Ry dWN0X211dGV4KTsKKwlwcGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGRldl9wcml2LCBFUlJfUFRS KC1FTk9ERVYpLCAibW9jayIpOworCWlmIChJU19FUlIocHBndHQpKSB7CisJCWVyciA9IFBUUl9F UlIocHBndHQpOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKCFpOTE1X3ZtX2lzXzQ4 Yml0KCZwcGd0dC0+YmFzZSkpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIDQ4YiBQUEdU VFxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCS8qIElm IHdlIHdlcmUgZXZlciBoaXQgdGhpcyB0aGVuIGl0J3MgdGltZSB0byBtb2NrIHRoZSA2NEsgc2Ny YXRjaCAqLworCWlmICghaTkxNV92bV9oYXNfc2NyYXRjaF82NEsoJnBwZ3R0LT5iYXNlKSkgewor CQlwcl9lcnIoIlBQR1RUIG1pc3NpbmcgNjRLIHNjcmF0Y2ggcGFnZVxuIik7CisJCWVyciA9IC1F SU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWVyciA9IGk5MTVfc3VidGVzdHModGVz dHMsIHBwZ3R0KTsKKworb3V0X2Nsb3NlOgorCWk5MTVfcHBndHRfY2xvc2UoJnBwZ3R0LT5iYXNl KTsKKwlpOTE1X3BwZ3R0X3B1dChwcGd0dCk7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2Nr KCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7CisKKwlpOTE1X21vZHBhcmFtcy5lbmFibGVf cHBndHQgPSBzYXZlZF9wcGd0dDsKKworCWRybV9kZXZfdW5yZWYoJmRldl9wcml2LT5kcm0pOwor CisJcmV0dXJuIGVycjsKK30KKworaW50IGk5MTVfZ2VtX2h1Z2VfcGFnZV9saXZlX3NlbGZ0ZXN0 cyhzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RhdGljIGNvbnN0IHN0 cnVjdCBpOTE1X3N1YnRlc3QgdGVzdHNbXSA9IHsKKwkJU1VCVEVTVChpZ3RfcHBndHRfZ2VtZnNf aHVnZSksCisJCVNVQlRFU1QoaWd0X3BwZ3R0X2ludGVybmFsX2h1Z2UpLAorCQlTVUJURVNUKGln dF9wcGd0dF9leGhhdXN0X2h1Z2UpLAorCQlTVUJURVNUKGlndF9wcGd0dF9waW5fdXBkYXRlKSwK KwkJU1VCVEVTVChpZ3RfdG1wZnNfZmFsbGJhY2spLAorCQlTVUJURVNUKGlndF9zaHJpbmtfdGhw KSwKKwl9OworCWludCBlcnI7CisKKwlpZiAoIVVTRVNfUFBHVFQoZGV2X3ByaXYpKSB7CisJCXBy X2luZm8oIlBQR1RUIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5nIGxpdmUtc2VsZnRlc3RzXG4iKTsK KwkJcmV0dXJuIDA7CisJfQorCisJbXV0ZXhfbG9jaygmZGV2X3ByaXYtPmRybS5zdHJ1Y3RfbXV0 ZXgpOworCWVyciA9IGk5MTVfc3VidGVzdHModGVzdHMsIGRldl9wcml2KTsKKwltdXRleF91bmxv Y2soJmRldl9wcml2LT5kcm0uc3RydWN0X211dGV4KTsKKworCXJldHVybiBlcnI7Cit9CmRpZmYg LS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0 cy5oIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMu aAppbmRleCAxOGIxNzRkODU1Y2EuLjY0YWNkN2VjY2M1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaAorKysgYi9kcml2ZXJz L2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9saXZlX3NlbGZ0ZXN0cy5oCkBAIC0xNSw1ICsx NSw2IEBAIHNlbGZ0ZXN0KG9iamVjdHMsIGk5MTVfZ2VtX29iamVjdF9saXZlX3NlbGZ0ZXN0cykK IHNlbGZ0ZXN0KGRtYWJ1ZiwgaTkxNV9nZW1fZG1hYnVmX2xpdmVfc2VsZnRlc3RzKQogc2VsZnRl c3QoY29oZXJlbmN5LCBpOTE1X2dlbV9jb2hlcmVuY3lfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVz dChndHQsIGk5MTVfZ2VtX2d0dF9saXZlX3NlbGZ0ZXN0cykKK3NlbGZ0ZXN0KGh1Z2VwYWdlcywg aTkxNV9nZW1faHVnZV9wYWdlX2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoY29udGV4dHMsIGk5 MTVfZ2VtX2NvbnRleHRfbGl2ZV9zZWxmdGVzdHMpCiBzZWxmdGVzdChoYW5nY2hlY2ssIGludGVs X2hhbmdjaGVja19saXZlX3NlbGZ0ZXN0cykKZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9p OTE1L3NlbGZ0ZXN0cy9pOTE1X21vY2tfc2VsZnRlc3RzLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oCmluZGV4IGZjNzQ2ODc1MDFiYS4uOTk2 MWI0NGY3NmVkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkx NV9tb2NrX3NlbGZ0ZXN0cy5oCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9p OTE1X21vY2tfc2VsZnRlc3RzLmgKQEAgLTIxLDMgKzIxLDQgQEAgc2VsZnRlc3QoZG1hYnVmLCBp OTE1X2dlbV9kbWFidWZfbW9ja19zZWxmdGVzdHMpCiBzZWxmdGVzdCh2bWEsIGk5MTVfdm1hX21v Y2tfc2VsZnRlc3RzKQogc2VsZnRlc3QoZXZpY3QsIGk5MTVfZ2VtX2V2aWN0X21vY2tfc2VsZnRl c3RzKQogc2VsZnRlc3QoZ3R0LCBpOTE1X2dlbV9ndHRfbW9ja19zZWxmdGVzdHMpCitzZWxmdGVz dChodWdlcGFnZXMsIGk5MTVfZ2VtX2h1Z2VfcGFnZV9tb2NrX3NlbGZ0ZXN0cykKLS0gCjIuMTMu NQoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwt Z2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8v bGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==