From mboxrd@z Thu Jan 1 00:00:00 1970 From: Matthew Auld Subject: [PATCH 17/21] drm/i915/selftests: huge page tests Date: Fri, 22 Sep 2017 18:32:48 +0100 Message-ID: <20170922173252.10137-18-matthew.auld@intel.com> References: <20170922173252.10137-1-matthew.auld@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by gabe.freedesktop.org (Postfix) with ESMTPS id A901C6EA6E for ; Fri, 22 Sep 2017 17:34:10 +0000 (UTC) In-Reply-To: <20170922173252.10137-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 ZnJvbSBDaHJpcwoKU2lnbmVkLW9mZi1ieTogTWF0dGhldyBBdWxkIDxtYXR0aGV3LmF1bGRAaW50 ZWwuY29tPgpDYzogSm9vbmFzIExhaHRpbmVuIDxqb29uYXMubGFodGluZW5AbGludXguaW50ZWwu Y29tPgpDYzogQ2hyaXMgV2lsc29uIDxjaHJpc0BjaHJpcy13aWxzb24uY28udWs+Ci0tLQogZHJp dmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYyAgICAgICAgICAgICAgICAgICAgfCAgICAxICsK IGRyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oICAgICAgICAgICAgIHwgICAg MiArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaHVnZV9wYWdlcy5jICAgICAgICB8 IDE2MzYgKysrKysrKysrKysrKysrKysrKysKIC4uLi9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5 MTVfbGl2ZV9zZWxmdGVzdHMuaCAgIHwgICAgMSArCiAuLi4vZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0 cy9pOTE1X21vY2tfc2VsZnRlc3RzLmggICB8ICAgIDEgKwogNSBmaWxlcyBjaGFuZ2VkLCAxNjQx IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL2dwdS9kcm0vaTkxNS9z ZWxmdGVzdHMvaHVnZV9wYWdlcy5jCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aTkxNV9nZW0uYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtLmMKaW5kZXggMmZhYjcw YWQxNjllLi43NTBjMDQwMDIzMDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5 MTVfZ2VtLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaTkxNV9nZW0uYwpAQCAtNTQxOSw2 ICs1NDE5LDcgQEAgaW50IGk5MTVfZ2VtX29iamVjdF9hdHRhY2hfcGh5cyhzdHJ1Y3QgZHJtX2k5 MTVfZ2VtX29iamVjdCAqb2JqLCBpbnQgYWxpZ24pCiAjaW5jbHVkZSAic2VsZnRlc3RzL3NjYXR0 ZXJsaXN0LmMiCiAjaW5jbHVkZSAic2VsZnRlc3RzL21vY2tfZ2VtX2RldmljZS5jIgogI2luY2x1 ZGUgInNlbGZ0ZXN0cy9odWdlX2dlbV9vYmplY3QuYyIKKyNpbmNsdWRlICJzZWxmdGVzdHMvaHVn ZV9wYWdlcy5jIgogI2luY2x1ZGUgInNlbGZ0ZXN0cy9pOTE1X2dlbV9vYmplY3QuYyIKICNpbmNs dWRlICJzZWxmdGVzdHMvaTkxNV9nZW1fY29oZXJlbmN5LmMiCiAjZW5kaWYKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oIGIvZHJpdmVycy9ncHUvZHJt L2k5MTUvaTkxNV9nZW1fb2JqZWN0LmgKaW5kZXggZTRlNmRkOTM4ODlkLi45NTZjOTExYzJjYmYg MTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oCisrKyBi L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfZ2VtX29iamVjdC5oCkBAIC0xOTYsNiArMTk2LDgg QEAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgewogCQkJdW5zaWduZWQgaW50IGd0dDsKIAkJ fSBwYWdlX3NpemVzOwogCisJCUk5MTVfU0VMRlRFU1RfREVDTEFSRSh1bnNpZ25lZCBpbnQgcGFn ZV9tYXNrKTsKKwogCQlzdHJ1Y3QgaTkxNV9nZW1fb2JqZWN0X3BhZ2VfaXRlciB7CiAJCQlzdHJ1 Y3Qgc2NhdHRlcmxpc3QgKnNnX3BvczsKIAkJCXVuc2lnbmVkIGludCBzZ19pZHg7IC8qIGluIHBh Z2VzLCBidXQgMzJiaXQgZWVrISAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv c2VsZnRlc3RzL2h1Z2VfcGFnZXMuYyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9o dWdlX3BhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44ZTY3 MDQwNWExZjkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9zZWxmdGVz dHMvaHVnZV9wYWdlcy5jCkBAIC0wLDAgKzEsMTYzNiBAQAorLyoKKyAqIENvcHlyaWdodCDCqSAy MDE3IEludGVsIENvcnBvcmF0aW9uCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRl ZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2Yg dGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNv ZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9u LCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29w eSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFu ZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0 byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRv IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5v dGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSAoaW5jbHVkaW5nIHRoZSBuZXh0CisgKiBw YXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwg cG9ydGlvbnMgb2YgdGhlCisgKiBTb2Z0d2FyZS4KKyAqCisgKiBUSEUgU09GVFdBUkUgSVMgUFJP VklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgor ICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBP RiBNRVJDSEFOVEFCSUxJVFksCisgKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBB TkQgTk9OSU5GUklOR0VNRU5ULiAgSU4gTk8gRVZFTlQgU0hBTEwKKyAqIFRIRSBBVVRIT1JTIE9S IENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9U SEVSCisgKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JU IE9SIE9USEVSV0lTRSwgQVJJU0lORworICogRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04g V0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUworICogSU4gVEhF IFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSAiLi4vaTkxNV9zZWxmdGVzdC5oIgorCisj aW5jbHVkZSA8bGludXgvcHJpbWVfbnVtYmVycy5oPgorCisjaW5jbHVkZSAibW9ja19kcm0uaCIK Kworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBwYWdlX3NpemVzW10gPSB7CisJSTkxNV9HVFRf UEFHRV9TSVpFXzJNLAorCUk5MTVfR1RUX1BBR0VfU0laRV82NEssCisJSTkxNV9HVFRfUEFHRV9T SVpFXzRLLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbGFyZ2VzdF9wYWdlX3NpemUo c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUsCisJCQkJCSAgc2l6ZV90IHJlbSkKK3sKKwlp bnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBhZ2Vfc2l6ZXMpOyArK2kpIHsK KwkJdW5zaWduZWQgaW50IHBhZ2Vfc2l6ZSA9IHBhZ2Vfc2l6ZXNbaV07CisKKwkJaWYgKEhBU19Q QUdFX1NJWkVTKGk5MTUsIHBhZ2Vfc2l6ZSkgJiYgcmVtID49IHBhZ2Vfc2l6ZSkKKwkJCXJldHVy biBwYWdlX3NpemU7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGh1Z2VfcGFn ZXNfZnJlZV9wYWdlcyhzdHJ1Y3Qgc2dfdGFibGUgKnN0KQoreworCXN0cnVjdCBzY2F0dGVybGlz dCAqc2c7CisKKwlmb3IgKHNnID0gc3QtPnNnbDsgc2c7IHNnID0gX19zZ19uZXh0KHNnKSkgewor CQlpZiAoc2dfcGFnZShzZykpCisJCQlfX2ZyZWVfcGFnZXMoc2dfcGFnZShzZyksIGdldF9vcmRl cihzZy0+bGVuZ3RoKSk7CisJfQorCisJc2dfZnJlZV90YWJsZShzdCk7CisJa2ZyZWUoc3QpOwor fQorCitzdGF0aWMgaW50IGdldF9odWdlX3BhZ2VzKHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0 ICpvYmopCit7CisjZGVmaW5lIEdGUCAoR0ZQX0tFUk5FTCB8IF9fR0ZQX05PV0FSTiB8IF9fR0ZQ X05PUkVUUlkpCisJdW5zaWduZWQgaW50IHBhZ2VfbWFzayA9IG9iai0+bW0ucGFnZV9tYXNrOwor CXN0cnVjdCBzZ190YWJsZSAqc3Q7CisJc3RydWN0IHNjYXR0ZXJsaXN0ICpzZzsKKwl1bnNpZ25l ZCBpbnQgc2dfbWFzazsKKwl1NjQgcmVtOworCisJc3QgPSBrbWFsbG9jKHNpemVvZigqc3QpLCBH RlApOworCWlmICghc3QpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKHNnX2FsbG9jX3RhYmxl KHN0LCBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZULCBHRlApKSB7CisJCWtmcmVlKHN0KTsK KwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJcmVtID0gb2JqLT5iYXNlLnNpemU7CisJc2cgPSBz dC0+c2dsOworCXN0LT5uZW50cyA9IDA7CisJc2dfbWFzayA9IDA7CisKKwkvKiBPdXIgZ29hbCBo ZXJlIGlzIHNpbXBsZSwgd2Ugd2FudCB0byBncmVlZGlseSBmaWxsIHRoZSBvYmplY3QgZnJvbQor CSAqIGxhcmdlc3QgdG8gc21hbGxlc3QgcGFnZS1zaXplLCB3aGlsZSBlbnN1cmluZyB0aGF0IHdl IHVzZSAqZXZlcnkqCisJICogcGFnZS1zaXplIGFzIHBlciB0aGUgZ2l2ZW4gcGFnZS1tYXNrLgor CSAqLworCWRvIHsKKwkJdW5zaWduZWQgaW50IGJpdCA9IGlsb2cyKHBhZ2VfbWFzayk7CisJCXVu c2lnbmVkIGludCBwYWdlX3NpemUgPSBCSVQoYml0KTsKKwkJaW50IG9yZGVyID0gZ2V0X29yZGVy KHBhZ2Vfc2l6ZSk7CisKKwkJZG8geworCQkJc3RydWN0IHBhZ2UgKnBhZ2U7CisKKwkJCUdFTV9C VUdfT04ob3JkZXIgPj0gTUFYX09SREVSKTsKKwkJCXBhZ2UgPSBhbGxvY19wYWdlcyhHRlAgfCBf X0dGUF9aRVJPLCBvcmRlcik7CisJCQlpZiAoIXBhZ2UpCisJCQkJZ290byBlcnI7CisKKwkJCXNn X3NldF9wYWdlKHNnLCBwYWdlLCBwYWdlX3NpemUsIDApOworCQkJc2dfbWFzayB8PSBwYWdlX3Np emU7CisJCQlzdC0+bmVudHMrKzsKKworCQkJcmVtIC09IHBhZ2Vfc2l6ZTsKKwkJCWlmICghcmVt KSB7CisJCQkJc2dfbWFya19lbmQoc2cpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlzZyA9IF9f c2dfbmV4dChzZyk7CisKKwkJfSB3aGlsZSAoKHJlbSAtICgocGFnZV9zaXplLTEpICYgcGFnZV9t YXNrKSkgPj0gcGFnZV9zaXplKTsKKworCQlwYWdlX21hc2sgJj0gKHBhZ2Vfc2l6ZS0xKTsKKwor CX0gd2hpbGUgKHBhZ2VfbWFzayk7CisKKwlpZiAoaTkxNV9nZW1fZ3R0X3ByZXBhcmVfcGFnZXMo b2JqLCBzdCkpCisJCWdvdG8gZXJyOworCisJb2JqLT5tbS5tYWR2ID0gSTkxNV9NQURWX0RPTlRO RUVEOworCisJR0VNX0JVR19PTihzZ19tYXNrICE9IG9iai0+bW0ucGFnZV9tYXNrKTsKKwlfX2k5 MTVfZ2VtX29iamVjdF9zZXRfcGFnZXMob2JqLCBzdCwgc2dfbWFzayk7CisKKwlyZXR1cm4gMDsK KworZXJyOgorCXNnX3NldF9wYWdlKHNnLCBOVUxMLCAwLCAwKTsKKwlzZ19tYXJrX2VuZChzZyk7 CisJaHVnZV9wYWdlc19mcmVlX3BhZ2VzKHN0KTsKKworCXJldHVybiAtRU5PTUVNOworfQorCitz dGF0aWMgdm9pZCBwdXRfaHVnZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2Jq LAorCQkJICAgc3RydWN0IHNnX3RhYmxlICpwYWdlcykKK3sKKwlpOTE1X2dlbV9ndHRfZmluaXNo X3BhZ2VzKG9iaiwgcGFnZXMpOworCWh1Z2VfcGFnZXNfZnJlZV9wYWdlcyhwYWdlcyk7CisKKwlv YmotPm1tLmRpcnR5ID0gZmFsc2U7CisJb2JqLT5tbS5tYWR2ID0gSTkxNV9NQURWX1dJTExORUVE OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Rfb3BzIGh1Z2Vf cGFnZV9vcHMgPSB7CisJLmZsYWdzID0gSTkxNV9HRU1fT0JKRUNUX0hBU19TVFJVQ1RfUEFHRSB8 CisJCSBJOTE1X0dFTV9PQkpFQ1RfSVNfU0hSSU5LQUJMRSwKKwkuZ2V0X3BhZ2VzID0gZ2V0X2h1 Z2VfcGFnZXMsCisJLnB1dF9wYWdlcyA9IHB1dF9odWdlX3BhZ2VzLAorfTsKKworc3RhdGljIHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICoKK2h1Z2VfcGFnZXNfb2JqZWN0KHN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICppOTE1LAorCQkgIHU2NCBzaXplLAorCQkgIHVuc2lnbmVkIGludCBwYWdl X21hc2spCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKworCUdFTV9CVUdf T04oIXNpemUpOworCUdFTV9CVUdfT04oIUlTX0FMSUdORUQoc2l6ZSwgQklUKF9fZmZzKHBhZ2Vf bWFzaykpKSk7CisKKwlpZiAoc2l6ZSA+PiBQQUdFX1NISUZUID4gSU5UX01BWCkKKwkJcmV0dXJu IEVSUl9QVFIoLUUyQklHKTsKKworCWlmIChvdmVyZmxvd3NfdHlwZShzaXplLCBvYmotPmJhc2Uu c2l6ZSkpCisJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CisKKwlvYmogPSBpOTE1X2dlbV9vYmpl Y3RfYWxsb2MoaTkxNSk7CisJaWYgKCFvYmopCisJCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwor CisJZHJtX2dlbV9wcml2YXRlX29iamVjdF9pbml0KCZpOTE1LT5kcm0sICZvYmotPmJhc2UsIHNp emUpOworCWk5MTVfZ2VtX29iamVjdF9pbml0KG9iaiwgJmh1Z2VfcGFnZV9vcHMpOworCisJb2Jq LT5iYXNlLndyaXRlX2RvbWFpbiA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJb2JqLT5iYXNlLnJl YWRfZG9tYWlucyA9IEk5MTVfR0VNX0RPTUFJTl9DUFU7CisJb2JqLT5jYWNoZV9sZXZlbCA9IEk5 MTVfQ0FDSEVfTk9ORTsKKworCW9iai0+bW0ucGFnZV9tYXNrID0gcGFnZV9tYXNrOworCisJcmV0 dXJuIG9iajsKK30KKworc3RhdGljIGludCBmYWtlX2dldF9odWdlX3BhZ2VzKHN0cnVjdCBkcm1f aTkxNV9nZW1fb2JqZWN0ICpvYmopCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUg PSB0b19pOTE1KG9iai0+YmFzZS5kZXYpOworCXNpemVfdCBtYXhfbGVuID0gcm91bmRkb3duX3Bv d19vZl90d28oVUlOVF9NQVgpOworCXN0cnVjdCBzZ190YWJsZSAqc3Q7CisJc3RydWN0IHNjYXR0 ZXJsaXN0ICpzZzsKKwl1bnNpZ25lZCBpbnQgc2dfbWFzazsKKwlzaXplX3QgcmVtOworCisJc3Qg PSBrbWFsbG9jKHNpemVvZigqc3QpLCBHRlApOworCWlmICghc3QpCisJCXJldHVybiAtRU5PTUVN OworCisJaWYgKHNnX2FsbG9jX3RhYmxlKHN0LCBvYmotPmJhc2Uuc2l6ZSA+PiBQQUdFX1NISUZU LCBHRlApKSB7CisJCWtmcmVlKHN0KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJLyogVXNl IG9wdGltYWwgcGFnZSBzaXplZCBjaHVua3MgdG8gZmlsbCBpbiB0aGUgc2cgdGFibGUgKi8KKwly ZW0gPSBvYmotPmJhc2Uuc2l6ZTsKKwlzZyA9IHN0LT5zZ2w7CisJc3QtPm5lbnRzID0gMDsKKwlz Z19tYXNrID0gMDsKKwlkbyB7CisJCXVuc2lnbmVkIGludCBwYWdlX3NpemUgPSBnZXRfbGFyZ2Vz dF9wYWdlX3NpemUoaTkxNSwgcmVtKTsKKwkJdW5zaWduZWQgaW50IGxlbiA9IG1pbihwYWdlX3Np emUgKiAocmVtIC8gcGFnZV9zaXplKSwgbWF4X2xlbik7CisKKwkJR0VNX0JVR19PTighcGFnZV9z aXplKTsKKworCQlzZy0+b2Zmc2V0ID0gMDsKKwkJc2ctPmxlbmd0aCA9IGxlbjsKKwkJc2dfZG1h X2xlbihzZykgPSBsZW47CisJCXNnX2RtYV9hZGRyZXNzKHNnKSA9IHBhZ2Vfc2l6ZTsKKworCQlz Z19tYXNrIHw9IGxlbjsKKworCQlzdC0+bmVudHMrKzsKKworCQlyZW0gLT0gbGVuOworCQlpZiAo IXJlbSkgeworCQkJc2dfbWFya19lbmQoc2cpOworCQkJYnJlYWs7CisJCX0KKworCQlzZyA9IHNn X25leHQoc2cpOworCX0gd2hpbGUgKDEpOworCisJb2JqLT5tbS5tYWR2ID0gSTkxNV9NQURWX0RP TlRORUVEOworCisJX19pOTE1X2dlbV9vYmplY3Rfc2V0X3BhZ2VzKG9iaiwgc3QsIHNnX21hc2sp OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZmFrZV9nZXRfaHVnZV9wYWdlc19zaW5n bGUoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CisJc3RydWN0IHNnX3RhYmxl ICpzdDsKKwlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOworCXVuc2lnbmVkIGludCBwYWdlX3NpemU7 CisKKwlzdCA9IGttYWxsb2Moc2l6ZW9mKCpzdCksIEdGUCk7CisJaWYgKCFzdCkKKwkJcmV0dXJu IC1FTk9NRU07CisKKwlpZiAoc2dfYWxsb2NfdGFibGUoc3QsIDEsIEdGUCkpIHsKKwkJa2ZyZWUo c3QpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlzZyA9IHN0LT5zZ2w7CisJc3QtPm5lbnRz ID0gMTsKKworCXBhZ2Vfc2l6ZSA9IGdldF9sYXJnZXN0X3BhZ2Vfc2l6ZShpOTE1LCBvYmotPmJh c2Uuc2l6ZSk7CisJR0VNX0JVR19PTighcGFnZV9zaXplKTsKKworCXNnLT5vZmZzZXQgPSAwOwor CXNnLT5sZW5ndGggPSBvYmotPmJhc2Uuc2l6ZTsKKwlzZ19kbWFfbGVuKHNnKSA9IG9iai0+YmFz ZS5zaXplOworCXNnX2RtYV9hZGRyZXNzKHNnKSA9IHBhZ2Vfc2l6ZTsKKworCW9iai0+bW0ubWFk diA9IEk5MTVfTUFEVl9ET05UTkVFRDsKKworCV9faTkxNV9nZW1fb2JqZWN0X3NldF9wYWdlcyhv YmosIHN0LCBzZy0+bGVuZ3RoKTsKKworCXJldHVybiAwOworI3VuZGVmIEdGUAorfQorCitzdGF0 aWMgdm9pZCBmYWtlX2ZyZWVfaHVnZV9wYWdlcyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqLAorCQkJCSBzdHJ1Y3Qgc2dfdGFibGUgKnBhZ2VzKQoreworCXNnX2ZyZWVfdGFibGUocGFn ZXMpOworCWtmcmVlKHBhZ2VzKTsKK30KKworc3RhdGljIHZvaWQgZmFrZV9wdXRfaHVnZV9wYWdl cyhzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAorCQkJCXN0cnVjdCBzZ190YWJsZSAq cGFnZXMpCit7CisJZmFrZV9mcmVlX2h1Z2VfcGFnZXMob2JqLCBwYWdlcyk7CisJb2JqLT5tbS5k aXJ0eSA9IGZhbHNlOworCW9iai0+bW0ubWFkdiA9IEk5MTVfTUFEVl9XSUxMTkVFRDsKK30KKwor c3RhdGljIGNvbnN0IHN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0X29wcyBmYWtlX29wcyA9IHsK KwkuZmxhZ3MgPSBJOTE1X0dFTV9PQkpFQ1RfSVNfU0hSSU5LQUJMRSwKKwkuZ2V0X3BhZ2VzID0g ZmFrZV9nZXRfaHVnZV9wYWdlcywKKwkucHV0X3BhZ2VzID0gZmFrZV9wdXRfaHVnZV9wYWdlcywK K307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdF9vcHMgZmFrZV9v cHNfc2luZ2xlID0geworCS5mbGFncyA9IEk5MTVfR0VNX09CSkVDVF9JU19TSFJJTktBQkxFLAor CS5nZXRfcGFnZXMgPSBmYWtlX2dldF9odWdlX3BhZ2VzX3NpbmdsZSwKKwkucHV0X3BhZ2VzID0g ZmFrZV9wdXRfaHVnZV9wYWdlcywKK307CisKK3N0YXRpYyBzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29i amVjdCAqCitmYWtlX2h1Z2VfcGFnZXNfb2JqZWN0KHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpp OTE1LCB1NjQgc2l6ZSwgYm9vbCBzaW5nbGUpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmpl Y3QgKm9iajsKKworCUdFTV9CVUdfT04oIXNpemUpOworCUdFTV9CVUdfT04oIUlTX0FMSUdORUQo c2l6ZSwgSTkxNV9HVFRfUEFHRV9TSVpFKSk7CisKKwlpZiAoc2l6ZSA+PiBQQUdFX1NISUZUID4g VUlOVF9NQVgpCisJCXJldHVybiBFUlJfUFRSKC1FMkJJRyk7CisKKwlpZiAob3ZlcmZsb3dzX3R5 cGUoc2l6ZSwgb2JqLT5iYXNlLnNpemUpKQorCQlyZXR1cm4gRVJSX1BUUigtRTJCSUcpOworCisJ b2JqID0gaTkxNV9nZW1fb2JqZWN0X2FsbG9jKGk5MTUpOworCWlmICghb2JqKQorCQlyZXR1cm4g RVJSX1BUUigtRU5PTUVNKTsKKworCWRybV9nZW1fcHJpdmF0ZV9vYmplY3RfaW5pdCgmaTkxNS0+ ZHJtLCAmb2JqLT5iYXNlLCBzaXplKTsKKworCWlmIChzaW5nbGUpCisJCWk5MTVfZ2VtX29iamVj dF9pbml0KG9iaiwgJmZha2Vfb3BzX3NpbmdsZSk7CisJZWxzZQorCQlpOTE1X2dlbV9vYmplY3Rf aW5pdChvYmosICZmYWtlX29wcyk7CisKKwlvYmotPmJhc2Uud3JpdGVfZG9tYWluID0gSTkxNV9H RU1fRE9NQUlOX0NQVTsKKwlvYmotPmJhc2UucmVhZF9kb21haW5zID0gSTkxNV9HRU1fRE9NQUlO X0NQVTsKKwlvYmotPmNhY2hlX2xldmVsID0gSTkxNV9DQUNIRV9OT05FOworCisJcmV0dXJuIG9i ajsKK30KKworc3RhdGljIGludCBpZ3RfY2hlY2tfcGFnZV9zaXplcyhzdHJ1Y3QgaTkxNV92bWEg KnZtYSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUodm1hLT5v YmotPmJhc2UuZGV2KTsKKwl1bnNpZ25lZCBpbnQgc3VwcG9ydGVkID0gSU5URUxfSU5GTyhpOTE1 KS0+cGFnZV9zaXplczsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0gdm1hLT5v Ymo7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIUhBU19QQUdFX1NJWkVTKGk5MTUsIHZtYS0+cGFn ZV9zaXplcy5zZykpIHsKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBwYWdlX3NpemVzLnNnPSV1LCBz dXBwb3J0ZWQ9JXVcbiIsCisJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMuc2cgJiB+c3VwcG9ydGVk LCBzdXBwb3J0ZWQpOworCQllcnIgPSAtRUlOVkFMOworCX0KKworCWlmICghSEFTX1BBR0VfU0la RVMoaTkxNSwgdm1hLT5wYWdlX3NpemVzLmd0dCkpIHsKKwkJcHJfZXJyKCJ1bnN1cHBvcnRlZCBw YWdlX3NpemVzLmd0dD0ldSwgc3VwcG9ydGVkPSV1XG4iLAorCQkgICAgICAgdm1hLT5wYWdlX3Np emVzLmd0dCAmIH5zdXBwb3J0ZWQsIHN1cHBvcnRlZCk7CisJCWVyciA9IC1FSU5WQUw7CisJfQor CisJaWYgKHZtYS0+cGFnZV9zaXplcy5waHlzICE9IG9iai0+bW0ucGFnZV9zaXplcy5waHlzKSB7 CisJCXByX2Vycigidm1hLT5wYWdlX3NpemVzLnBoeXMoJXUpICE9IG9iai0+bW0ucGFnZV9zaXpl cy5waHlzKCV1KVxuIiwKKwkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5waHlzLCBvYmotPm1tLnBh Z2Vfc2l6ZXMucGh5cyk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJaWYgKHZtYS0+cGFnZV9z aXplcy5zZyAhPSBvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cpIHsKKwkJcHJfZXJyKCJ2bWEtPnBhZ2Vf c2l6ZXMuc2coJXUpICE9IG9iai0+bW0ucGFnZV9zaXplcy5zZygldSlcbiIsCisJCSAgICAgICB2 bWEtPnBhZ2Vfc2l6ZXMuc2csIG9iai0+bW0ucGFnZV9zaXplcy5zZyk7CisJCWVyciA9IC1FSU5W QUw7CisJfQorCisJaWYgKG9iai0+bW0ucGFnZV9zaXplcy5ndHQpIHsKKwkJcHJfZXJyKCJvYmot PnBhZ2Vfc2l6ZXMuZ3R0KCV1KSBzaG91bGQgbmV2ZXIgYmUgc2V0XG4iLAorCQkgICAgICAgb2Jq LT5tbS5wYWdlX3NpemVzLmd0dCk7CisJCWVyciA9IC1FSU5WQUw7CisJfQorCisJcmV0dXJuIGVy cjsKK30KKworc3RhdGljIGludCBpZ3RfbW9ja19leGhhdXN0X2RldmljZV9zdXBwb3J0ZWRfcGFn ZXModm9pZCAqYXJnKQoreworCXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGFyZzsKKwlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHBwZ3R0LT5iYXNlLmk5MTU7CisJdW5zaWdu ZWQgaW50IHNhdmVkX21hc2sgPSBJTlRFTF9JTkZPKGk5MTUpLT5wYWdlX3NpemVzOworCXN0cnVj dCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJaW50 IGksIGosIHNpbmdsZTsKKwlpbnQgZXJyOworCisJLyogU2FuaXR5IGNoZWNrIGNyZWF0aW5nIG9i amVjdHMgd2l0aCBldmVyeSB2YWxpZCBwYWdlIHN1cHBvcnQKKwkgKiBjb21iaW5hdGlvbiBmb3Ig b3VyIG1vY2sgZGV2aWNlLgorCSAqLworCisJZm9yIChpID0gMTsgaSA8IEJJVChBUlJBWV9TSVpF KHBhZ2Vfc2l6ZXMpKTsgaSsrKSB7CisJCXVuc2lnbmVkIGludCBjb21iaW5hdGlvbiA9IDA7CisK KwkJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUocGFnZV9zaXplcyk7IGorKykgeworCQkJaWYg KGkgJiBCSVQoaikpCisJCQkJY29tYmluYXRpb24gfD0gcGFnZV9zaXplc1tqXTsKKwkJfQorCisJ CW1rd3JpdGVfZGV2aWNlX2luZm8oaTkxNSktPnBhZ2Vfc2l6ZXMgPSBjb21iaW5hdGlvbjsKKwor CQlmb3IgKHNpbmdsZSA9IDA7IHNpbmdsZSA8PSAxOyArK3NpbmdsZSkgeworCQkJb2JqID0gZmFr ZV9odWdlX3BhZ2VzX29iamVjdChpOTE1LCBjb21iaW5hdGlvbiwgISFzaW5nbGUpOworCQkJaWYg KElTX0VSUihvYmopKSB7CisJCQkJZXJyID0gUFRSX0VSUihvYmopOworCQkJCWdvdG8gb3V0X2Rl dmljZTsKKwkJCX0KKworCQkJaWYgKG9iai0+YmFzZS5zaXplICE9IGNvbWJpbmF0aW9uKSB7CisJ CQkJcHJfZXJyKCJvYmotPmJhc2Uuc2l6ZT0lenUsIGV4cGVjdGVkPSV1XG4iLAorCQkJCSAgICAg ICBvYmotPmJhc2Uuc2l6ZSwgY29tYmluYXRpb24pOworCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJ Z290byBvdXRfcHV0OworCQkJfQorCisJCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZw cGd0dC0+YmFzZSwgTlVMTCk7CisJCQlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJCQllcnIgPSBQVFJf RVJSKHZtYSk7CisJCQkJZ290byBvdXRfcHV0OworCQkJfQorCisJCQllcnIgPSBpOTE1X3ZtYV9w aW4odm1hLCAwLCAwLCBQSU5fVVNFUik7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8gb3V0X2Nsb3Nl OworCisJCQllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCisJCQlpZiAodm1hLT5w YWdlX3NpemVzLnNnICE9IGNvbWJpbmF0aW9uKSB7CisJCQkJcHJfZXJyKCJwYWdlX3NpemVzLnNn PSV1LCBleHBlY3RlZD0ldVxuIiwKKwkJCQkgICAgICAgdm1hLT5wYWdlX3NpemVzLnNnLCBjb21i aW5hdGlvbik7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCX0KKworCQkJaTkxNV92bWFfdW5waW4o dm1hKTsKKwkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisKKwkJCWk5MTVfZ2VtX29iamVjdF9wdXQo b2JqKTsKKworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF9kZXZpY2U7CisJCX0KKwl9CisKKwln b3RvIG91dF9kZXZpY2U7CisKK291dF9jbG9zZToKKwlpOTE1X3ZtYV9jbG9zZSh2bWEpOworb3V0 X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CitvdXRfZGV2aWNlOgorCW1rd3JpdGVf ZGV2aWNlX2luZm8oaTkxNSktPnBhZ2Vfc2l6ZXMgPSBzYXZlZF9tYXNrOworCisJcmV0dXJuIGVy cjsKK30KKworc3RhdGljIGludCBpZ3RfbW9ja19wcGd0dF9taXNhbGlnbmVkX2RtYSh2b2lkICph cmcpCit7CisJc3RydWN0IGk5MTVfaHdfcHBndHQgKnBwZ3R0ID0gYXJnOworCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICppOTE1ID0gcHBndHQtPmJhc2UuaTkxNTsKKwl1bnNpZ25lZCBsb25nIHN1 cHBvcnRlZCA9IElOVEVMX0lORk8oaTkxNSktPnBhZ2Vfc2l6ZXM7CisJc3RydWN0IGRybV9pOTE1 X2dlbV9vYmplY3QgKm9iajsKKwlpbnQgYml0OworCWludCBlcnI7CisKKwkvKiBTYW5pdHkgY2hl Y2sgZG1hIG1pc2FsaWdubWVudCBmb3IgaHVnZSBwYWdlcyAtLSB0aGUgZG1hIGFkZHJlc3NlcyB3 ZQorCSAqIGluc2VydCBpbnRvIHRoZSBwYWdpbmcgc3RydWN0dXJlcyBuZWVkIHRvIGFsd2F5cyBy ZXNwZWN0IHRoZSBwYWdlCisJICogc2l6ZSBhbGlnbm1lbnQuCisJICovCisKKwliaXQgPSBpbG9n MihJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKTsKKworCWZvcl9lYWNoX3NldF9iaXRfZnJvbShiaXQs ICZzdXBwb3J0ZWQsIEJJVFNfUEVSX0xPTkcpIHsKKwkJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOwor CQl1bnNpZ25lZCBpbnQgcGFnZV9zaXplID0gQklUKGJpdCk7CisJCXVuc2lnbmVkIGludCBmbGFn cyA9IFBJTl9VU0VSIHwgUElOX09GRlNFVF9GSVhFRDsKKwkJdW5zaWduZWQgaW50IG9mZnNldDsK KwkJdW5zaWduZWQgaW50IHNpemUgPQorCQkJcm91bmRfdXAocGFnZV9zaXplLCBJOTE1X0dUVF9Q QUdFX1NJWkVfMk0pIDw8IDE7CisJCXN0cnVjdCBpOTE1X3ZtYSAqdm1hOworCisJCW9iaiA9IGZh a2VfaHVnZV9wYWdlc19vYmplY3QoaTkxNSwgc2l6ZSwgdHJ1ZSk7CisJCWlmIChJU19FUlIob2Jq KSkKKwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJaWYgKG9iai0+YmFzZS5zaXplICE9IHNp emUpIHsKKwkJCXByX2Vycigib2JqLT5iYXNlLnNpemU9JXp1LCBleHBlY3RlZD0ldVxuIiwKKwkJ CSAgICAgICBvYmotPmJhc2Uuc2l6ZSwgc2l6ZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQkJZ290 byBvdXRfcHV0OworCQl9CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmop OworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCS8qIEZvcmNlIHRoZSBwYWdlIHNp emUgZm9yIHRoaXMgb2JqZWN0ICovCisJCW9iai0+bW0ucGFnZV9zaXplcy5zZyA9IHBhZ2Vfc2l6 ZTsKKworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7 CisJCWlmIChJU19FUlIodm1hKSkgeworCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJZ290byBv dXRfdW5waW47CisJCX0KKworCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFncyk7 CisJCWlmIChlcnIpIHsKKwkJCWk5MTVfdm1hX2Nsb3NlKHZtYSk7CisJCQlnb3RvIG91dF91bnBp bjsKKwkJfQorCisKKwkJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKworCQlpZiAo dm1hLT5wYWdlX3NpemVzLmd0dCAhPSBwYWdlX3NpemUpIHsKKwkJCXByX2VycigicGFnZV9zaXpl cy5ndHQ9JXUsIGV4cGVjdGVkICV1XG4iLAorCQkJICAgICAgIHZtYS0+cGFnZV9zaXplcy5ndHQs IHBhZ2Vfc2l6ZSk7CisJCQllcnIgPSAtRUlOVkFMOworCQl9CisKKwkJaTkxNV92bWFfdW5waW4o dm1hKTsKKworCQlpZiAoZXJyKSB7CisJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJZ290byBv dXRfdW5waW47CisJCX0KKworCQkvKiBUcnkgYWxsIHRoZSBvdGhlciB2YWxpZCBvZmZzZXRzIHVu dGlsIHRoZSBuZXh0CisJCSAqIGJvdW5kYXJ5IC0tIHNob3VsZCBhbHdheXMgZmFsbCBiYWNrIHRv IHVzaW5nIDRLCisJCSAqIHBhZ2VzLgorCQkgKi8KKwkJZm9yIChvZmZzZXQgPSA0MDk2OyBvZmZz ZXQgPCBwYWdlX3NpemU7IG9mZnNldCArPSA0MDk2KSB7CisJCQllcnIgPSBpOTE1X3ZtYV91bmJp bmQodm1hKTsKKwkJCWlmIChlcnIpIHsKKwkJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJCWdv dG8gb3V0X3VucGluOworCQkJfQorCisJCQllcnIgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBm bGFncyB8IG9mZnNldCk7CisJCQlpZiAoZXJyKSB7CisJCQkJaTkxNV92bWFfY2xvc2Uodm1hKTsK KwkJCQlnb3RvIG91dF91bnBpbjsKKwkJCX0KKworCQkJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6 ZXModm1hKTsKKworCQkJaWYgKHZtYS0+cGFnZV9zaXplcy5ndHQgIT0gSTkxNV9HVFRfUEFHRV9T SVpFXzRLKSB7CisJCQkJcHJfZXJyKCJwYWdlX3NpemVzLmd0dD0ldSwgZXhwZWN0ZWQgJWx1XG4i LAorCQkJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMuZ3R0LCBJOTE1X0dUVF9QQUdFX1NJWkVfNEsp OworCQkJCWVyciA9IC1FSU5WQUw7CisJCQl9CisKKwkJCWk5MTVfdm1hX3VucGluKHZtYSk7CisK KwkJCWlmIChlcnIpIHsKKwkJCQlpOTE1X3ZtYV9jbG9zZSh2bWEpOworCQkJCWdvdG8gb3V0X3Vu cGluOworCQkJfQorCisJCQlpZiAoaWd0X3RpbWVvdXQoZW5kX3RpbWUsCisJCQkJCSIlcyB0aW1l ZCBvdXQgYXQgb2Zmc2V0ICV4IHdpdGggcGFnZS1zaXplICV4XG4iLAorCQkJCQlfX2Z1bmNfXywg b2Zmc2V0LCBwYWdlX3NpemUpKQorCQkJCWJyZWFrOworCQl9CisKKwkJaTkxNV92bWFfY2xvc2Uo dm1hKTsKKworCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJaTkxNV9nZW1f b2JqZWN0X3B1dChvYmopOworCX0KKworCXJldHVybiAwOworCitvdXRfdW5waW46CisJaTkxNV9n ZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9w dXQob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIGNsb3NlX29iamVjdF9s aXN0KHN0cnVjdCBsaXN0X2hlYWQgKm9iamVjdHMsCisJCQkgICAgICBzdHJ1Y3QgaTkxNV9od19w cGd0dCAqcHBndHQpCit7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaiwgKm9uOwor CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG9iaiwgb24sIG9iamVjdHMsIHN0X2xpbmspIHsK KwkJc3RydWN0IGk5MTVfdm1hICp2bWE7CisKKwkJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2Jq LCAmcHBndHQtPmJhc2UsIE5VTEwpOworCQlpZiAoIUlTX0VSUih2bWEpKQorCQkJaTkxNV92bWFf Y2xvc2Uodm1hKTsKKworCQlsaXN0X2RlbCgmb2JqLT5zdF9saW5rKTsKKwkJaTkxNV9nZW1fb2Jq ZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9Cit9 CisKK3N0YXRpYyBpbnQgaWd0X21vY2tfcHBndHRfaHVnZV9maWxsKHZvaWQgKmFyZykKK3sKKwlz dHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQgPSBhcmc7CisJc3RydWN0IGRybV9pOTE1X3ByaXZh dGUgKmk5MTUgPSBwcGd0dC0+YmFzZS5pOTE1OworCXVuc2lnbmVkIGxvbmcgbWF4X3BhZ2VzID0g cHBndHQtPmJhc2UudG90YWwgPj4gUEFHRV9TSElGVDsKKwl1bnNpZ25lZCBsb25nIHBhZ2VfbnVt OworCWJvb2wgc2luZ2xlID0gZmFsc2U7CisJTElTVF9IRUFEKG9iamVjdHMpOworCUlHVF9USU1F T1VUKGVuZF90aW1lKTsKKwlpbnQgZXJyOworCisJZm9yX2VhY2hfcHJpbWVfbnVtYmVyX2Zyb20o cGFnZV9udW0sIDEsIG1heF9wYWdlcykgeworCQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAq b2JqOworCQlzaXplX3Qgc2l6ZSA9IHBhZ2VfbnVtIDw8IFBBR0VfU0hJRlQ7CisJCXN0cnVjdCBp OTE1X3ZtYSAqdm1hOworCQl1bnNpZ25lZCBpbnQgZXhwZWN0ZWRfZ3R0ID0gMDsKKwkJaW50IGk7 CisKKwkJb2JqID0gZmFrZV9odWdlX3BhZ2VzX29iamVjdChpOTE1LCBzaXplLCBzaW5nbGUpOwor CQlpZiAoSVNfRVJSKG9iaikpIHsKKwkJCWVyciA9IFBUUl9FUlIob2JqKTsKKwkJCWJyZWFrOwor CQl9CisKKwkJaWYgKG9iai0+YmFzZS5zaXplICE9IHNpemUpIHsKKwkJCXByX2Vycigib2JqLT5i YXNlLnNpemU9JXpkLCBleHBlY3RlZD0lemRcbiIsCisJCQkgICAgICAgb2JqLT5iYXNlLnNpemUs IHNpemUpOworCQkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCQkJZXJyID0gLUVJTlZBTDsK KwkJCWJyZWFrOworCQl9CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmop OworCQlpZiAoZXJyKSB7CisJCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJCQlicmVhazsK KwkJfQorCisJCWxpc3RfYWRkKCZvYmotPnN0X2xpbmssICZvYmplY3RzKTsKKworCQl2bWEgPSBp OTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCWlmIChJU19FUlIo dm1hKSkgeworCQkJZXJyID0gUFRSX0VSUih2bWEpOworCQkJYnJlYWs7CisJCX0KKworCQllcnIg PSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBQSU5fVVNFUik7CisJCWlmIChlcnIpCisJCQlicmVh azsKKworCQllcnIgPSBpZ3RfY2hlY2tfcGFnZV9zaXplcyh2bWEpOworCQlpZiAoZXJyKSB7CisJ CQlpOTE1X3ZtYV91bnBpbih2bWEpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBGaWd1cmUgb3V0 IHRoZSBleHBlY3RlZCBndHQgcGFnZSBzaXplIGtub3dpbmcgdGhhdCB3ZSBnbyBmcm9tCisJCSAq IGxhcmdlc3QgdG8gc21hbGxlc3QgcGFnZSBzaXplIHNnIGNodW5rcywgYW5kIHRoYXQgd2UgYWxp Z24gdG8KKwkJICogdGhlIGxhcmdlc3QgcGFnZSBzaXplLgorCQkgKi8KKwkJZm9yIChpID0gMDsg aSA8IEFSUkFZX1NJWkUocGFnZV9zaXplcyk7ICsraSkgeworCQkJdW5zaWduZWQgaW50IHBhZ2Vf c2l6ZSA9IHBhZ2Vfc2l6ZXNbaV07CisKKwkJCWlmIChIQVNfUEFHRV9TSVpFUyhpOTE1LCBwYWdl X3NpemUpICYmCisJCQkgICAgc2l6ZSA+PSBwYWdlX3NpemUpIHsKKwkJCQlleHBlY3RlZF9ndHQg fD0gcGFnZV9zaXplOworCQkJCXNpemUgJj0gcGFnZV9zaXplLTE7CisJCQl9CisJCX0KKworCQlH RU1fQlVHX09OKCFleHBlY3RlZF9ndHQpOworCQlHRU1fQlVHX09OKHNpemUpOworCisJCWlmIChl eHBlY3RlZF9ndHQgJiBJOTE1X0dUVF9QQUdFX1NJWkVfNEspCisJCQlleHBlY3RlZF9ndHQgJj0g fkk5MTVfR1RUX1BBR0VfU0laRV82NEs7CisKKwkJaTkxNV92bWFfdW5waW4odm1hKTsKKworCQlp ZiAodm1hLT5wYWdlX3NpemVzLnNnICYgSTkxNV9HVFRfUEFHRV9TSVpFXzY0SykgeworCQkJaWYg KCFJU19BTElHTkVEKHZtYS0+bm9kZS5zdGFydCwKKwkJCQkJSTkxNV9HVFRfUEFHRV9TSVpFXzJN KSkgeworCQkJCXByX2Vycigibm9kZS5zdGFydCglbGx4KSBub3QgYWxpZ25lZCB0byAyTVxuIiwK KwkJCQkgICAgICAgdm1hLT5ub2RlLnN0YXJ0KTsKKwkJCQllcnIgPSAtRUlOVkFMOworCQkJCWJy ZWFrOworCQkJfQorCisJCQlpZiAoIUlTX0FMSUdORUQodm1hLT5ub2RlLnNpemUsCisJCQkJCUk5 MTVfR1RUX1BBR0VfU0laRV8yTSkpIHsKKwkJCQlwcl9lcnIoIm5vZGUuc2l6ZSglbGx4KSBub3Qg YWxpZ25lZCB0byAyTVxuIiwKKwkJCQkgICAgICAgdm1hLT5ub2RlLnNpemUpOworCQkJCWVyciA9 IC1FSU5WQUw7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAodm1hLT5wYWdlX3NpemVz Lmd0dCAhPSBleHBlY3RlZF9ndHQpIHsKKwkJCXByX2VycigiZ3R0PSV1LCBleHBlY3RlZD0ldSwg c2l6ZT0lemQsIHNpbmdsZT0lc1xuIiwKKwkJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMuZ3R0LCBl eHBlY3RlZF9ndHQsCisJCQkgICAgICAgb2JqLT5iYXNlLnNpemUsIHllc25vKCEhc2luZ2xlKSk7 CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaWd0X3RpbWVvdXQo ZW5kX3RpbWUsCisJCQkJIiVzIHRpbWVkIG91dCBhdCBzaXplICV6ZFxuIiwKKwkJCQlfX2Z1bmNf Xywgb2JqLT5iYXNlLnNpemUpKQorCQkJYnJlYWs7CisKKwkJc2luZ2xlID0gIXNpbmdsZTsKKwl9 CisKKwljbG9zZV9vYmplY3RfbGlzdCgmb2JqZWN0cywgcHBndHQpOworCisJaWYgKGVyciA9PSAt RU5PTUVNIHx8IGVyciA9PSAtRU5PU1BDKQorCQllcnIgPSAwOworCisJcmV0dXJuIGVycjsKK30K Kworc3RhdGljIGludCBpZ3RfbW9ja19wcGd0dF82NEsodm9pZCAqYXJnKQoreworCXN0cnVjdCBp OTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGFyZzsKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkx NSA9IHBwZ3R0LT5iYXNlLmk5MTU7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsK Kwljb25zdCBzdHJ1Y3Qgb2JqZWN0X2luZm8geworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKwkJdW5z aWduZWQgaW50IGd0dDsKKwkJdW5zaWduZWQgaW50IG9mZnNldDsKKwl9IG9iamVjdHNbXSA9IHsK KwkJLyogQ2FzZXMgd2l0aCBmb3JjZWQgcGFkZGluZy9hbGlnbm1lbnQgKi8KKwkJeworCQkJLnNp emUgPSBTWl82NEssCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SywKKwkJCS5vZmZz ZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzY0SyArIFNaXzRLLAorCQkJLmd0dCA9 IEk5MTVfR1RUX1BBR0VfU0laRV80SywKKwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQku c2l6ZSA9IFNaXzY0SyAtIFNaXzRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV80SywK KwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzJNLAorCQkJLmd0dCA9 IEk5MTVfR1RUX1BBR0VfU0laRV82NEssCisJCQkub2Zmc2V0ID0gMCwKKwkJfSwKKwkJeworCQkJ LnNpemUgPSBTWl8yTSAtIFNaXzRLLAorCQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV80SywK KwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzJNICsgU1pfNEssCisJ CQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzY0SyB8IEk5MTVfR1RUX1BBR0VfU0laRV80SywK KwkJCS5vZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuc2l6ZSA9IFNaXzJNICsgU1pfNjRLLAor CQkJLmd0dCA9IEk5MTVfR1RUX1BBR0VfU0laRV82NEssCisJCQkub2Zmc2V0ID0gMCwKKwkJfSwK KwkJeworCQkJLnNpemUgPSBTWl8yTSAtIFNaXzY0SywKKwkJCS5ndHQgPSBJOTE1X0dUVF9QQUdF X1NJWkVfNjRLLAorCQkJLm9mZnNldCA9IDAsCisJCX0sCisJCS8qIFRyeSB3aXRob3V0IGFueSBm b3JjZWQgcGFkZGluZy9hbGlnbm1lbnQgKi8KKwkJeworCQkJLnNpemUgPSBTWl82NEssCisJCQku b2Zmc2V0ID0gU1pfMk0sCisJCQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQl9LAor CQl7CisJCQkuc2l6ZSA9IFNaXzEyOEssCisJCQkub2Zmc2V0ID0gU1pfMk0gLSBTWl82NEssCisJ CQkuZ3R0ID0gSTkxNV9HVFRfUEFHRV9TSVpFXzRLLAorCQl9LAorCX07CisJc3RydWN0IGk5MTVf dm1hICp2bWE7CisJaW50IGksIHNpbmdsZTsKKwlpbnQgZXJyOworCisJLyogU2FuaXR5IGNoZWNr IHNvbWUgb2YgdGhlIHRyaWNraW5lc3Mgd2l0aCA2NEsgcGFnZXMgLS0gZWl0aGVyIHdlIGNhbgor CSAqIHNhZmVseSBtYXJrIHRoZSB3aG9sZSBwYWdlLXRhYmxlKDJNIGJsb2NrKSBhcyA2NEssIG9y IHdlIGhhdmUgdG8KKwkgKiBhbHdheXMgZmFsbGJhY2sgdG8gNEsuCisJICovCisKKwlpZiAoIUhB U19QQUdFX1NJWkVTKGk5MTUsIEk5MTVfR1RUX1BBR0VfU0laRV82NEspKQorCQlyZXR1cm4gMDsK KworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9iamVjdHMpOyArK2kpIHsKKwkJdW5zaWdu ZWQgaW50IHNpemUgPSBvYmplY3RzW2ldLnNpemU7CisJCXVuc2lnbmVkIGludCBleHBlY3RlZF9n dHQgPSBvYmplY3RzW2ldLmd0dDsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IG9iamVjdHNbaV0u b2Zmc2V0OworCQl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSU5fVVNFUjsKKworCQlmb3IgKHNpbmds ZSA9IDA7IHNpbmdsZSA8PSAxOyBzaW5nbGUrKykgeworCQkJb2JqID0gZmFrZV9odWdlX3BhZ2Vz X29iamVjdChpOTE1LCBzaXplLCAhIXNpbmdsZSk7CisJCQlpZiAoSVNfRVJSKG9iaikpCisJCQkJ cmV0dXJuIFBUUl9FUlIob2JqKTsKKworCQkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdl cyhvYmopOworCQkJaWYgKGVycikKKwkJCQlnb3RvIG91dF9vYmplY3RfcHV0OworCisJCQkvKiBE aXNhYmxlIDJNIHBhZ2VzIC0tIFdlIG9ubHkgd2FudCB0byB1c2UgNjRLLzRLIHBhZ2VzCisJCQkg KiBmb3IgdGhpcyB0ZXN0LgorCQkJICovCisJCQlvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cgJj0gfkk5 MTVfR1RUX1BBR0VfU0laRV8yTTsKKworCQkJdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAm cHBndHQtPmJhc2UsIE5VTEwpOworCQkJaWYgKElTX0VSUih2bWEpKSB7CisJCQkJZXJyID0gUFRS X0VSUih2bWEpOworCQkJCWdvdG8gb3V0X29iamVjdF91bnBpbjsKKwkJCX0KKworCQkJaWYgKG9m ZnNldCkKKwkJCQlmbGFncyB8PSBQSU5fT0ZGU0VUX0ZJWEVEIHwgb2Zmc2V0OworCisJCQllcnIg PSBpOTE1X3ZtYV9waW4odm1hLCAwLCAwLCBmbGFncyk7CisJCQlpZiAoZXJyKQorCQkJCWdvdG8g b3V0X3ZtYV9jbG9zZTsKKworCQkJZXJyID0gaWd0X2NoZWNrX3BhZ2Vfc2l6ZXModm1hKTsKKwkJ CWlmIChlcnIpCisJCQkJZ290byBvdXRfdm1hX3VucGluOworCisJCQlpZiAoIW9mZnNldCAmJiB2 bWEtPnBhZ2Vfc2l6ZXMuc2cgJiBJOTE1X0dUVF9QQUdFX1NJWkVfNjRLKSB7CisJCQkJaWYgKCFJ U19BTElHTkVEKHZtYS0+bm9kZS5zdGFydCwKKwkJCQkJCUk5MTVfR1RUX1BBR0VfU0laRV8yTSkp IHsKKwkJCQkJcHJfZXJyKCJub2RlLnN0YXJ0KCVsbHgpIG5vdCBhbGlnbmVkIHRvIDJNXG4iLAor CQkJCQkgICAgICAgdm1hLT5ub2RlLnN0YXJ0KTsKKwkJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQkJ Z290byBvdXRfdm1hX3VucGluOworCQkJCX0KKworCQkJCWlmICghSVNfQUxJR05FRCh2bWEtPm5v ZGUuc2l6ZSwKKwkJCQkJCUk5MTVfR1RUX1BBR0VfU0laRV8yTSkpIHsKKwkJCQkJcHJfZXJyKCJu b2RlLnNpemUoJWxseCkgbm90IGFsaWduZWQgdG8gMk1cbiIsCisJCQkJCSAgICAgICB2bWEtPm5v ZGUuc2l6ZSk7CisJCQkJCWVyciA9IC1FSU5WQUw7CisJCQkJCWdvdG8gb3V0X3ZtYV91bnBpbjsK KwkJCQl9CisJCQl9CisKKwkJCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuZ3R0ICE9IGV4cGVjdGVkX2d0 dCkgeworCQkJCXByX2VycigiZ3R0PSV1LCBleHBlY3RlZD0ldSwgaT0lZCwgc2luZ2xlPSVzXG4i LAorCQkJCSAgICAgICB2bWEtPnBhZ2Vfc2l6ZXMuZ3R0LCBleHBlY3RlZF9ndHQsIGksCisJCQkJ ICAgICAgIHllc25vKCEhc2luZ2xlKSk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCQlnb3RvIG91 dF92bWFfdW5waW47CisJCQl9CisKKwkJCWk5MTVfdm1hX3VucGluKHZtYSk7CisJCQlpOTE1X3Zt YV9jbG9zZSh2bWEpOworCisJCQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMob2JqKTsKKwkJ CWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwkJfQorCX0KKworCXJldHVybiAwOworCitvdXRf dm1hX3VucGluOgorCWk5MTVfdm1hX3VucGluKHZtYSk7CitvdXRfdm1hX2Nsb3NlOgorCWk5MTVf dm1hX2Nsb3NlKHZtYSk7CitvdXRfb2JqZWN0X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBp bl9wYWdlcyhvYmopOworb3V0X29iamVjdF9wdXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmop OworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHN0cnVjdCBpOTE1X3ZtYSAqCitncHVfd3Jp dGVfZHcoc3RydWN0IGk5MTVfdm1hICp2bWEsIHU2NCBvZmZzZXQsIHUzMiB2YWwpCit7CisJc3Ry dWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSB0b19pOTE1KHZtYS0+b2JqLT5iYXNlLmRldik7 CisJY29uc3QgaW50IGdlbiA9IElOVEVMX0dFTih2bWEtPnZtLT5pOTE1KTsKKwl1bnNpZ25lZCBp bnQgY291bnQgPSB2bWEtPnNpemUgPj4gUEFHRV9TSElGVDsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X29iamVjdCAqb2JqOworCXN0cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7CisJdW5zaWduZWQgaW50IHNp emU7CisJdTMyICpjbWQ7CisJaW50IG47CisJaW50IGVycjsKKworCXNpemUgPSAoMSArIDQgKiBj b3VudCkgKiBzaXplb2YodTMyKTsKKwlzaXplID0gcm91bmRfdXAoc2l6ZSwgUEFHRV9TSVpFKTsK KwlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlX2ludGVybmFsKGk5MTUsIHNpemUpOworCWlm IChJU19FUlIob2JqKSkKKwkJcmV0dXJuIEVSUl9DQVNUKG9iaik7CisKKwljbWQgPSBpOTE1X2dl bV9vYmplY3RfcGluX21hcChvYmosIEk5MTVfTUFQX1dCKTsKKwlpZiAoSVNfRVJSKGNtZCkpIHsK KwkJZXJyID0gUFRSX0VSUihjbWQpOworCQlnb3RvIGVycjsKKwl9CisKKwlvZmZzZXQgKz0gdm1h LT5ub2RlLnN0YXJ0OworCisJZm9yIChuID0gMDsgbiA8IGNvdW50OyBuKyspIHsKKwkJaWYgKGdl biA+PSA4KSB7CisJCQkqY21kKysgPSBNSV9TVE9SRV9EV09SRF9JTU1fR0VONDsKKwkJCSpjbWQr KyA9IGxvd2VyXzMyX2JpdHMob2Zmc2V0KTsKKwkJCSpjbWQrKyA9IHVwcGVyXzMyX2JpdHMob2Zm c2V0KTsKKwkJCSpjbWQrKyA9IHZhbDsKKwkJfSBlbHNlIGlmIChnZW4gPj0gNCkgeworCQkJKmNt ZCsrID0gTUlfU1RPUkVfRFdPUkRfSU1NX0dFTjQgfAorCQkJCShnZW4gPCA2ID8gMSA8PCAyMiA6 IDApOworCQkJKmNtZCsrID0gMDsKKwkJCSpjbWQrKyA9IG9mZnNldDsKKwkJCSpjbWQrKyA9IHZh bDsKKwkJfSBlbHNlIHsKKwkJCSpjbWQrKyA9IE1JX1NUT1JFX0RXT1JEX0lNTSB8IDEgPDwgMjI7 CisJCQkqY21kKysgPSBvZmZzZXQ7CisJCQkqY21kKysgPSB2YWw7CisJCX0KKworCQlvZmZzZXQg Kz0gUEFHRV9TSVpFOworCX0KKworCSpjbWQgPSBNSV9CQVRDSF9CVUZGRVJfRU5EOworCisJaTkx NV9nZW1fb2JqZWN0X3VucGluX21hcChvYmopOworCisJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Nl dF90b19ndHRfZG9tYWluKG9iaiwgZmFsc2UpOworCWlmIChlcnIpCisJCWdvdG8gZXJyOworCisJ YmF0Y2ggPSBpOTE1X3ZtYV9pbnN0YW5jZShvYmosIHZtYS0+dm0sIE5VTEwpOworCWlmIChJU19F UlIoYmF0Y2gpKSB7CisJCWVyciA9IFBUUl9FUlIoYmF0Y2gpOworCQlnb3RvIGVycjsKKwl9CisK KwllcnIgPSBpOTE1X3ZtYV9waW4oYmF0Y2gsIDAsIDAsIFBJTl9VU0VSKTsKKwlpZiAoZXJyKQor CQlnb3RvIGVycjsKKworCXJldHVybiBiYXRjaDsKKworZXJyOgorCWk5MTVfZ2VtX29iamVjdF9w dXQob2JqKTsKKworCXJldHVybiBFUlJfUFRSKGVycik7Cit9CisKK3N0YXRpYyBpbnQgZ3B1X3dy aXRlKHN0cnVjdCBpOTE1X3ZtYSAqdm1hLAorCQkgICAgIHN0cnVjdCBpOTE1X2dlbV9jb250ZXh0 ICpjdHgsCisJCSAgICAgdTMyIGR3b3JkLAorCQkgICAgIHUzMiB2YWx1ZSkKK3sKKwlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUodm1hLT5vYmotPmJhc2UuZGV2KTsKKwlz dHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJxOworCXN0cnVjdCBpOTE1X3ZtYSAqYmF0Y2g7 CisJaW50IGZsYWdzID0gMDsKKwlpbnQgZXJyOworCisJR0VNX0JVR19PTighaW50ZWxfZW5naW5l X2Nhbl9zdG9yZV9kd29yZChpOTE1LT5lbmdpbmVbUkNTXSkpOworCisJZXJyID0gaTkxNV9nZW1f b2JqZWN0X3NldF90b19ndHRfZG9tYWluKHZtYS0+b2JqLCB0cnVlKTsKKwlpZiAoZXJyKQorCQly ZXR1cm4gZXJyOworCisJcnEgPSBpOTE1X2dlbV9yZXF1ZXN0X2FsbG9jKGk5MTUtPmVuZ2luZVtS Q1NdLCBjdHgpOworCWlmIChJU19FUlIocnEpKQorCQlyZXR1cm4gUFRSX0VSUihycSk7CisKKwli YXRjaCA9IGdwdV93cml0ZV9kdyh2bWEsIGR3b3JkICogc2l6ZW9mKHUzMiksIHZhbHVlKTsKKwlp ZiAoSVNfRVJSKGJhdGNoKSkgeworCQllcnIgPSBQVFJfRVJSKGJhdGNoKTsKKwkJZ290byBlcnJf cmVxdWVzdDsKKwl9CisKKwlpOTE1X3ZtYV9tb3ZlX3RvX2FjdGl2ZShiYXRjaCwgcnEsIDApOwor CWk5MTVfZ2VtX29iamVjdF9zZXRfYWN0aXZlX3JlZmVyZW5jZShiYXRjaC0+b2JqKTsKKwlpOTE1 X3ZtYV91bnBpbihiYXRjaCk7CisJaTkxNV92bWFfY2xvc2UoYmF0Y2gpOworCisJZXJyID0gcnEt PmVuZ2luZS0+ZW1pdF9mbHVzaChycSwgRU1JVF9JTlZBTElEQVRFKTsKKwlpZiAoZXJyKQorCQln b3RvIGVycl9yZXF1ZXN0OworCisJZXJyID0gaTkxNV9zd2l0Y2hfY29udGV4dChycSk7CisJaWYg KGVycikKKwkJZ290byBlcnJfcmVxdWVzdDsKKworCWVyciA9IHJxLT5lbmdpbmUtPmVtaXRfYmJf c3RhcnQocnEsCisJCQkJCWJhdGNoLT5ub2RlLnN0YXJ0LCBiYXRjaC0+bm9kZS5zaXplLAorCQkJ CQlmbGFncyk7CisJaWYgKGVycikKKwkJZ290byBlcnJfcmVxdWVzdDsKKworCWk5MTVfdm1hX21v dmVfdG9fYWN0aXZlKHZtYSwgcnEsIEVYRUNfT0JKRUNUX1dSSVRFKTsKKworCXJlc2VydmF0aW9u X29iamVjdF9sb2NrKHZtYS0+cmVzdiwgTlVMTCk7CisJcmVzZXJ2YXRpb25fb2JqZWN0X2FkZF9l eGNsX2ZlbmNlKHZtYS0+cmVzdiwgJnJxLT5mZW5jZSk7CisJcmVzZXJ2YXRpb25fb2JqZWN0X3Vu bG9jayh2bWEtPnJlc3YpOworCitlcnJfcmVxdWVzdDoKKwlfX2k5MTVfYWRkX3JlcXVlc3QocnEs IGVyciA9PSAwKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgY3B1X2NoZWNrKHN0 cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmosIHUzMiBkd29yZCwgdTMyIHZhbCkKK3sKKwl1 bnNpZ25lZCBpbnQgbmVlZHNfZmx1c2g7CisJdW5zaWduZWQgbG9uZyBuOworCWludCBlcnI7CisK KwllcnIgPSBpOTE1X2dlbV9vYmpfcHJlcGFyZV9zaG1lbV9yZWFkKG9iaiwgJm5lZWRzX2ZsdXNo KTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChuID0gMDsgbiA8IG9iai0+YmFz ZS5zaXplID4+IFBBR0VfU0hJRlQ7ICsrbikgeworCQl1MzIgKnB0ciA9IGttYXBfYXRvbWljKGk5 MTVfZ2VtX29iamVjdF9nZXRfcGFnZShvYmosIG4pKTsKKworCQlpZiAobmVlZHNfZmx1c2ggJiBD TEZMVVNIX0JFRk9SRSkKKwkJCWRybV9jbGZsdXNoX3ZpcnRfcmFuZ2UocHRyLCBQQUdFX1NJWkUp OworCisJCWlmIChwdHJbZHdvcmRdICE9IHZhbCkgeworCQkJcHJfZXJyKCJuPSVsdSBwdHJbJXVd PSV1LCB2YWw9JXVcbiIsCisJCQkgICAgICAgbiwgZHdvcmQsIHB0cltkd29yZF0sIHZhbCk7CisJ CQlrdW5tYXBfYXRvbWljKHB0cik7CisJCQllcnIgPSAtRUlOVkFMOworCQkJYnJlYWs7CisJCX0K KworCQlrdW5tYXBfYXRvbWljKHB0cik7CisJfQorCisJaTkxNV9nZW1fb2JqX2ZpbmlzaF9zaG1l bV9hY2Nlc3Mob2JqKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWd0X3dyaXRl X2h1Z2Uoc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iaikKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqaTkxNSA9IHRvX2k5MTUob2JqLT5iYXNlLmRldik7CisJc3RydWN0IGk5MTVf Z2VtX2NvbnRleHQgKmN0eCA9IGk5MTUtPmtlcm5lbF9jb250ZXh0OworCXN0cnVjdCBpOTE1X2Fk ZHJlc3Nfc3BhY2UgKnZtID0gY3R4LT5wcGd0dCA/ICZjdHgtPnBwZ3R0LT5iYXNlIDogJmk5MTUt PmdndHQuYmFzZTsKKwlzdHJ1Y3QgaTkxNV92bWEgKnZtYTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3Mg PSBQSU5fVVNFUiB8IFBJTl9PRkZTRVRfRklYRUQ7CisJdW5zaWduZWQgaW50IG1heF9wYWdlX3Np emU7CisJSUdUX1RJTUVPVVQoZW5kX3RpbWUpOworCXUzMiBtYXg7CisJdTMyIG51bTsKKwl1NjQg c2l6ZTsKKwlpbnQgZXJyOworCisJR0VNX0JVR19PTighaTkxNV9nZW1fb2JqZWN0X2hhc19waW5u ZWRfcGFnZXMob2JqKSk7CisKKwlzaXplID0gb2JqLT5iYXNlLnNpemU7CisJaWYgKG9iai0+bW0u cGFnZV9zaXplcy5zZyAmIEk5MTVfR1RUX1BBR0VfU0laRV82NEspCisJCXNpemUgPSByb3VuZF91 cChzaXplLCBJOTE1X0dUVF9QQUdFX1NJWkVfMk0pOworCisJbWF4X3BhZ2Vfc2l6ZSA9IHJvdW5k ZG93bl9wb3dfb2ZfdHdvKG9iai0+bW0ucGFnZV9zaXplcy5zZyk7CisJbWF4ID0gKHZtLT50b3Rh bCAtIHNpemUpIC8gbWF4X3BhZ2Vfc2l6ZTsKKworCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9i aiwgdm0sIE5VTEwpOworCWlmIChJU19FUlIodm1hKSkKKwkJcmV0dXJuIFBUUl9FUlIodm1hKTsK KworCS8qIFRyeSB2YXJpb3VzIG9mZnNldHMgdW50aWwgd2UgdGltZW91dCAtLSB3ZSB3YW50IHRv IGF2b2lkCisJICogaXNzdWVzIGhpZGRlbiBieSBlZmZlY3RpdmVseSBhbHdheXMgdXNpbmcgb2Zm c2V0ID0gMC4KKwkgKi8KKwlmb3JfZWFjaF9wcmltZV9udW1iZXJfZnJvbShudW0sIDAsIG1heCkg eworCQl1NjQgb2Zmc2V0ID0gbnVtICogbWF4X3BhZ2Vfc2l6ZTsKKwkJdTMyIGR3b3JkOworCisJ CWVyciA9IGk5MTVfdm1hX3VuYmluZCh2bWEpOworCQlpZiAoZXJyKQorCQkJZ290byBvdXRfdm1h X2Nsb3NlOworCisJCWVyciA9IGk5MTVfdm1hX3Bpbih2bWEsIHNpemUsIG1heF9wYWdlX3NpemUs IGZsYWdzIHwgb2Zmc2V0KTsKKwkJaWYgKGVycikgeworCQkJLyogVGhlIGdndHQgbWF5IGhhdmUg c29tZSBwYWdlcyByZXNlcnZlZCBzbworCQkJICogcmVmcmFpbiBmcm9tIGVycm9yaW5nIG91dC4K KwkJCSAqLworCQkJaWYgKGVyciA9PSAtRU5PU1BDICYmIGk5MTVfaXNfZ2d0dCh2bSkpCisJCQkJ Y29udGludWU7CisKKwkJCWdvdG8gb3V0X3ZtYV9jbG9zZTsKKwkJfQorCisJCWVyciA9IGlndF9j aGVja19wYWdlX3NpemVzKHZtYSk7CisJCWlmIChlcnIpCisJCQlnb3RvIG91dF92bWFfdW5waW47 CisKKwkJZHdvcmQgPSBvZmZzZXRfaW5fcGFnZShudW0pIC8gNDsKKworCQllcnIgPSBncHVfd3Jp dGUodm1hLCBjdHgsIGR3b3JkLCBudW0gKyAxKTsKKwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJn cHUtd3JpdGUgZmFpbGVkIGF0IG9mZnNldD0lbGx4Iiwgb2Zmc2V0KTsKKwkJCWdvdG8gb3V0X3Zt YV91bnBpbjsKKwkJfQorCisJCWVyciA9IGNwdV9jaGVjayhvYmosIGR3b3JkLCBudW0gKyAxKTsK KwkJaWYgKGVycikgeworCQkJcHJfZXJyKCJjcHUtY2hlY2sgZmFpbGVkIGF0IG9mZnNldD0lbGx4 Iiwgb2Zmc2V0KTsKKwkJCWdvdG8gb3V0X3ZtYV91bnBpbjsKKwkJfQorCisJCWk5MTVfdm1hX3Vu cGluKHZtYSk7CisKKwkJaWYgKG51bSA+IDAgJiYKKwkJICAgIGlndF90aW1lb3V0KGVuZF90aW1l LAorCQkJCSIlcyB0aW1lZCBvdXQgYXQgb2Zmc2V0PSVsbHhcbiIsCisJCQkJX19mdW5jX18sIG9m ZnNldCkpCisJCQlicmVhazsKKwl9CisKK291dF92bWFfdW5waW46CisJaWYgKGk5MTVfdm1hX2lz X3Bpbm5lZCh2bWEpKQorCQlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X3ZtYV9jbG9zZToKKwlp OTE1X3ZtYV9jbG9zZSh2bWEpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZ3Rf cHBndHRfZXhoYXVzdF9odWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqaTkxNSA9IGFyZzsKKwl1bnNpZ25lZCBsb25nIHN1cHBvcnRlZCA9IElOVEVMX0lORk8oaTkx NSktPnBhZ2Vfc2l6ZXM7CisJc3RhdGljIHVuc2lnbmVkIGludCBwYWdlc1tBUlJBWV9TSVpFKHBh Z2Vfc2l6ZXMpXTsKKwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXVuc2lnbmVk IGludCBzaXplX21hc2s7CisJdW5zaWduZWQgaW50IHBhZ2VfbWFzazsKKwlpbnQgbiwgaTsKKwlp bnQgZXJyOworCisJLyogU2FuaXR5IGNoZWNrIGNyZWF0aW5nIG9iamVjdHMgd2l0aCBhIHZhcnlp bmcgbWl4IG9mIHBhZ2Ugc2l6ZXMgLS0KKwkgKiBlbnN1cmluZyB0aGF0IG91ciB3cml0ZXMgbGFu ZHMgaW4gdGhlIHJpZ2h0IHBsYWNlLgorCSAqLworCisJaWYgKCFpbnRlbF9lbmdpbmVfY2FuX3N0 b3JlX2R3b3JkKGk5MTUtPmVuZ2luZVtSQ1NdKSkgeworCQlwcl9pbmZvKCJzdG9yZS1kd29yZC1p bW0gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwluID0g MDsKKwlmb3JfZWFjaF9zZXRfYml0KGksICZzdXBwb3J0ZWQsIEJJVFNfUEVSX0xPTkcpCisJCXBh Z2VzW24rK10gPSBCSVQoaSk7CisKKwlmb3IgKHNpemVfbWFzayA9IDI7IHNpemVfbWFzayA8IEJJ VChuKTsgc2l6ZV9tYXNrKyspIHsKKwkJdW5zaWduZWQgaW50IHNpemUgPSAwOworCisJCWZvciAo aSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJCWlmIChzaXplX21hc2sgJiBCSVQoaSkpCisJCQkJc2l6 ZSB8PSBwYWdlc1tpXTsKKwkJfQorCisJCS8qIEZvciBvdXIgcGFnZSBtYXNrIHdlIHdhbnQgdG8g ZW51bWVyYXRlIGFsbCB0aGUgcGFnZS1zaXplCisJCSAqIGNvbWJpbmF0aW9ucyB3aGljaCB3aWxs IGZpdCBpbnRvIG91ciBjaG9zZW4gb2JqZWN0IHNpemUuCisJCSAqLworCQlmb3IgKHBhZ2VfbWFz ayA9IDI7IHBhZ2VfbWFzayA8PSBzaXplX21hc2s7IHBhZ2VfbWFzaysrKSB7CisJCQl1bnNpZ25l ZCBpbnQgcGFnZV9zaXplcyA9IDA7CisKKwkJCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJ CQlpZiAocGFnZV9tYXNrICYgQklUKGkpKQorCQkJCQlwYWdlX3NpemVzIHw9IHBhZ2VzW2ldOwor CQkJfQorCisJCQkvKiBFbnN1cmUgdGhhdCB3ZSBjYW4gYWN0dWFsbHkgZmlsbCB0aGUgZ2l2ZW4g b2JqZWN0CisJCQkgKiB3aXRoIG91ciBjaG9zZW4gcGFnZSBtYXNrLgorCQkJICovCisJCQlpZiAo IUlTX0FMSUdORUQoc2l6ZSwgQklUKF9fZmZzKHBhZ2Vfc2l6ZXMpKSkpCisJCQkJICBjb250aW51 ZTsKKworCQkJb2JqID0gaHVnZV9wYWdlc19vYmplY3QoaTkxNSwgc2l6ZSwgcGFnZV9zaXplcyk7 CisJCQlpZiAoSVNfRVJSKG9iaikpIHsKKwkJCQllcnIgPSBQVFJfRVJSKG9iaik7CisJCQkJZ290 byBvdXRfZGV2aWNlOworCQkJfQorCisJCQllcnIgPSBpOTE1X2dlbV9vYmplY3RfcGluX3BhZ2Vz KG9iaik7CisJCQlpZiAoZXJyKSB7CisJCQkJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOworCisJ CQkJaWYgKGVyciA9PSAtRU5PTUVNIHx8IGVyciA9PSAtRU5PTUVNKSB7CisJCQkJCXByX2luZm8o InVuYWJsZSB0byBnZXQgcGFnZXMsIHNpemU9JXUsIHBhZ2VzPSV1XG4iLAorCQkJCQkJc2l6ZSwg cGFnZV9zaXplcyk7CisJCQkJCWVyciA9IDA7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJCXBy X2VycigicGluX3BhZ2VzIGZhaWxlZCwgc2l6ZT0ldSwgcGFnZXM9JXVcbiIsCisJCQkJICAgICAg IHNpemVfbWFzaywgcGFnZV9tYXNrKTsKKworCQkJCWdvdG8gb3V0X2RldmljZTsKKwkJCX0KKwor CQkJb2JqLT5tbS5wYWdlX3NpemVzLnBoeXMgPSBvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cgPQorCQkJ CXBhZ2Vfc2l6ZXM7CisKKwkJCWVyciA9IGlndF93cml0ZV9odWdlKG9iaik7CisJCQlpZiAoZXJy KSB7CisJCQkJcHJfZXJyKCJleGhhdXN0IHdyaXRlLWh1Z2UgZmFpbGVkIHdpdGggc2l6ZT0ldVxu IiwKKwkJCQkgICAgICAgc2l6ZSk7CisJCQkJZ290byBvdXRfdW5waW47CisJCQl9CisKKwkJCWk5 MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworCQkJaTkxNV9nZW1fb2JqZWN0X3B1dChv YmopOworCQl9CisJfQorCisJZ290byBvdXRfZGV2aWNlOworCitvdXRfdW5waW46CisJaTkxNV9n ZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJaTkxNV9nZW1fb2JqZWN0X3B1dChvYmopOwor b3V0X2RldmljZToKKwlta3dyaXRlX2RldmljZV9pbmZvKGk5MTUpLT5wYWdlX3NpemVzID0gc3Vw cG9ydGVkOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZ3RfcHBndHRfaW50ZXJu YWxfaHVnZSh2b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmk5MTUgPSBh cmc7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdGF0aWMgY29uc3QgdW5z aWduZWQgaW50IHNpemVzW10gPSB7CisJCVNaXzY0SywKKwkJU1pfMTI4SywKKwkJU1pfMjU2SywK KwkJU1pfNTEySywKKwkJU1pfMU0sCisJCVNaXzJNLAorCX07CisJaW50IGk7CisJaW50IGVycjsK KworCS8qIFNhbml0eSBjaGVjayB0aGF0IHRoZSBIVyB1c2VzIGh1Z2UgcGFnZXMgY29ycmVjdGx5 IHRocm91Z2ggaW50ZXJuYWwKKwkgKiAtLSBlbnN1cmUgdGhhdCBvdXIgd3JpdGVzIGxhbmQgaW4g dGhlIHJpZ2h0IHBsYWNlLgorCSAqLworCisJaWYgKCFpbnRlbF9lbmdpbmVfY2FuX3N0b3JlX2R3 b3JkKGk5MTUtPmVuZ2luZVtSQ1NdKSkgeworCQlwcl9pbmZvKCJzdG9yZS1kd29yZC1pbW0gbm90 IHN1cHBvcnRlZCwgc2tpcHBpbmdcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAw OyBpIDwgQVJSQVlfU0laRShzaXplcyk7ICsraSkgeworCQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNp emVzW2ldOworCisJCW9iaiA9IGk5MTVfZ2VtX29iamVjdF9jcmVhdGVfaW50ZXJuYWwoaTkxNSwg c2l6ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwkJ ZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOworCQlpZiAoZXJyKQorCQkJZ290 byBvdXRfcHV0OworCisJCWlmIChvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5cyA8IEk5MTVfR1RUX1BB R0VfU0laRV82NEspIHsKKwkJCXByX2luZm8oImludGVybmFsIHVuYWJsZSB0byBhbGxvY2F0ZSBo dWdlLXBhZ2Uocykgd2l0aCBzaXplPSV1XG4iLAorCQkJCXNpemUpOworCQkJZ290byBvdXRfdW5w aW47CisJCX0KKworCQllcnIgPSBpZ3Rfd3JpdGVfaHVnZShvYmopOworCQlpZiAoZXJyKSB7CisJ CQlwcl9lcnIoImludGVybmFsIHdyaXRlLWh1Z2UgZmFpbGVkIHdpdGggc2l6ZT0ldVxuIiwKKwkJ CSAgICAgICBzaXplKTsKKwkJCWdvdG8gb3V0X3VucGluOworCQl9CisKKwkJaTkxNV9nZW1fb2Jq ZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9CisK KwlyZXR1cm4gMDsKKworb3V0X3VucGluOgorCWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhv YmopOworb3V0X3B1dDoKKwlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gZXJy OworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgaWd0X2Nhbl9hbGxvY2F0ZV90aHAoc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmk5MTUpCit7CisJcmV0dXJuIGk5MTUtPm1tLmdlbWZzICYmIGhhc190 cmFuc3BhcmVudF9odWdlcGFnZSgpOworfQorCitzdGF0aWMgaW50IGlndF9wcGd0dF9nZW1mc19o dWdlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqaTkxNSA9IGFyZzsK KwlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOworCXN0YXRpYyBjb25zdCB1bnNpZ25l ZCBpbnQgc2l6ZXNbXSA9IHsKKwkJU1pfMk0sCisJCVNaXzRNLAorCQlTWl84TSwKKwkJU1pfMTZN LAorCQlTWl8zMk0sCisJfTsKKwlpbnQgaTsKKwlpbnQgZXJyOworCisJLyogU2FuaXR5IGNoZWNr IHRoYXQgdGhlIEhXIHVzZXMgaHVnZSBwYWdlcyBjb3JyZWN0bHkgdGhyb3VnaCBnZW1mcyAtLQor CSAqIGVuc3VyZSB0aGF0IG91ciB3cml0ZXMgbGFuZCBpbiB0aGUgcmlnaHQgcGxhY2UuCisJICov CisKKwlpZiAoIWlndF9jYW5fYWxsb2NhdGVfdGhwKGk5MTUpKSB7CisJCXByX2luZm8oIm1pc3Np bmcgVEhQIHN1cHBvcnQsIHNraXBwaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKCFp bnRlbF9lbmdpbmVfY2FuX3N0b3JlX2R3b3JkKGk5MTUtPmVuZ2luZVtSQ1NdKSkgeworCQlwcl9p bmZvKCJzdG9yZS1kd29yZC1pbW0gbm90IHN1cHBvcnRlZCwgc2tpcHBpbmdcbiIpOworCQlyZXR1 cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzaXplcyk7ICsraSkgewor CQl1bnNpZ25lZCBpbnQgc2l6ZSA9IHNpemVzW2ldOworCisJCW9iaiA9IGk5MTVfZ2VtX29iamVj dF9jcmVhdGUoaTkxNSwgc2l6ZSk7CisJCWlmIChJU19FUlIob2JqKSkKKwkJCXJldHVybiBQVFJf RVJSKG9iaik7CisKKwkJZXJyID0gaTkxNV9nZW1fb2JqZWN0X3Bpbl9wYWdlcyhvYmopOworCQlp ZiAoZXJyKQorCQkJZ290byBvdXRfcHV0OworCisJCWlmIChvYmotPm1tLnBhZ2Vfc2l6ZXMucGh5 cyA8IEk5MTVfR1RUX1BBR0VfU0laRV8yTSkgeworCQkJcHJfaW5mbygiZmluaXNoaW5nIHRlc3Qg ZWFybHksIGdlbWZzIHVuYWJsZSB0byBhbGxvY2F0ZSBodWdlLXBhZ2Uocykgd2l0aCBzaXplPSV1 XG4iLAorCQkJCXNpemUpOworCQkJZ290byBvdXRfdW5waW47CisJCX0KKworCQllcnIgPSBpZ3Rf d3JpdGVfaHVnZShvYmopOworCQlpZiAoZXJyKSB7CisJCQlwcl9lcnIoImdlbWZzIHdyaXRlLWh1 Z2UgZmFpbGVkIHdpdGggc2l6ZT0ldVxuIiwKKwkJCSAgICAgICBzaXplKTsKKwkJCWdvdG8gb3V0 X3VucGluOworCQl9CisKKwkJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKG9iaik7CisJCWk5 MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKwl9CisKKwlyZXR1cm4gMDsKKworb3V0X3VucGluOgor CWk5MTVfZ2VtX29iamVjdF91bnBpbl9wYWdlcyhvYmopOworb3V0X3B1dDoKKwlpOTE1X2dlbV9v YmplY3RfcHV0KG9iaik7CisKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgaW50IGlndF9wcGd0 dF9waW5fdXBkYXRlKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYgPSBhcmc7CisJdW5zaWduZWQgbG9uZyBzdXBwb3J0ZWQgPSBJTlRFTF9JTkZPKGRldl9w cml2KS0+cGFnZV9zaXplczsKKwlzdHJ1Y3QgaTkxNV9od19wcGd0dCAqcHBndHQgPSBkZXZfcHJp di0+a2VybmVsX2NvbnRleHQtPnBwZ3R0OworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpv Ymo7CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisJdW5zaWduZWQgaW50IGZsYWdzID0gUElOX1VT RVIgfCBQSU5fT0ZGU0VUX0ZJWEVEOworCWludCBmaXJzdCwgbGFzdDsKKwlpbnQgZXJyOworCisJ LyogTWFrZSBzdXJlIHRoZXJlJ3Mgbm8gZnVubnkgYnVzaW5lc3Mgd2hlbiBkb2luZyBhIFBJTl9V UERBVEUgLS0gaW4gdGhlCisJICogcGFzdCB3ZSBoYWQgYSBzdWJ0bGUgaXNzdWUgd2l0aCBiZWlu ZyBhYmxlIHRvIGluY29ycmVjdGx5IGRvIG11bHRpcGxlCisJICogYWxsb2MgdmEgcmFuZ2VzIG9u IHRoZSBzYW1lIG9iamVjdCB3aGVuIGRvaW5nIGEgUElOX1VQREFURSwgd2hpY2gKKwkgKiByZXN1 bHRlZCBpbiBzb21lIHByZXR0eSBuYXN0eSBidWdzLCB0aG91Z2ggb25seSB3aGVuIHVzaW5nCisJ ICogaHVnZS1ndHQtcGFnZXMuCisJICovCisKKwlpZiAoIVVTRVNfRlVMTF80OEJJVF9QUEdUVChk ZXZfcHJpdikpIHsKKwkJcHJfaW5mbygiNDhiIFBQR1RUIG5vdCBzdXBwb3J0ZWQsIHNraXBwaW5n XG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJZmlyc3QgPSBpbG9nMihJOTE1X0dUVF9QQUdFX1NJ WkVfNjRLKTsKKwlsYXN0ID0gaWxvZzIoSTkxNV9HVFRfUEFHRV9TSVpFXzJNKTsKKworCWZvcl9l YWNoX3NldF9iaXRfZnJvbShmaXJzdCwgJnN1cHBvcnRlZCwgbGFzdCArIDEpIHsKKwkJdW5zaWdu ZWQgaW50IHBhZ2Vfc2l6ZSA9IEJJVChmaXJzdCk7CisKKwkJb2JqID0gaTkxNV9nZW1fb2JqZWN0 X2NyZWF0ZV9pbnRlcm5hbChkZXZfcHJpdiwgcGFnZV9zaXplKTsKKwkJaWYgKElTX0VSUihvYmop KQorCQkJcmV0dXJuIFBUUl9FUlIob2JqKTsKKworCQl2bWEgPSBpOTE1X3ZtYV9pbnN0YW5jZShv YmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJCWlmIChJU19FUlIodm1hKSkgeworCQkJZXJyID0g UFRSX0VSUih2bWEpOworCQkJZ290byBvdXRfcHV0OworCQl9CisKKwkJZXJyID0gaTkxNV92bWFf cGluKHZtYSwgU1pfMk0sIDAsIGZsYWdzKTsKKwkJaWYgKGVycikKKwkJCWdvdG8gb3V0X2Nsb3Nl OworCisJCWlmICh2bWEtPnBhZ2Vfc2l6ZXMuc2cgPCBwYWdlX3NpemUpIHsKKwkJCXByX2luZm8o IlVuYWJsZSB0byBhbGxvY2F0ZSBwYWdlLXNpemUgJXgsIGZpbmlzaGluZyB0ZXN0IGVhcmx5XG4i LAorCQkJCXBhZ2Vfc2l6ZSk7CisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCWlmIChpZ3Rf Y2hlY2tfcGFnZV9zaXplcyh2bWEpKQorCQkJZ290byBvdXRfdW5waW47CisKKwkJaWYgKHZtYS0+ cGFnZV9zaXplcy5ndHQgIT0gcGFnZV9zaXplKSB7CisJCQlkbWFfYWRkcl90IGFkZHIgPSBpOTE1 X2dlbV9vYmplY3RfZ2V0X2RtYV9hZGRyZXNzKG9iaiwgMCk7CisKKwkJCS8qIFRoZSBvbmx5IHZh bGlkIHJlYXNvbiBmb3IgdGhpcyB0byBldmVyIGZhaWwgd291bGQgYmUKKwkJCSAqIGlmIHRoZSBk bWEtbWFwcGVyIHNjcmV3ZWQgdXMgb3ZlciB3aGVuIHdlIGRpZCB0aGUKKwkJCSAqIGRtYV9tYXBf c2coKSwgc2luY2UgaXQgaGFzIHRoZSBmaW5hbCBzYXkgb3ZlciB0aGUgZG1hCisJCQkgKiBhZGRy ZXNzLgorCQkJICovCisJCQlpZiAoSVNfQUxJR05FRChhZGRyLCBwYWdlX3NpemUpKSB7CisJCQkJ cHJfZXJyKCJwYWdlX3NpemVzLmd0dD0ldSwgZXhwZWN0ZWQ9JXVcbiIsCisJCQkJICAgICAgIHZt YS0+cGFnZV9zaXplcy5ndHQsIHBhZ2Vfc2l6ZSk7CisJCQkJZXJyID0gLUVJTlZBTDsKKwkJCX0g ZWxzZSB7CisJCQkJcHJfaW5mbygiZG1hIGFkZHJlc3MgbWlzYWxpZ25lZCwgZmluaXNoaW5nIHRl c3QgZWFybHlcbiIpOworCQkJfQorCisJCQlnb3RvIG91dF91bnBpbjsKKwkJfQorCisJCWVyciA9 IGk5MTVfdm1hX2JpbmQodm1hLCBJOTE1X0NBQ0hFX05PTkUsIFBJTl9VUERBVEUpOworCQlpZiAo ZXJyKQorCQkJZ290byBvdXRfdW5waW47CisKKwkJaTkxNV92bWFfdW5waW4odm1hKTsKKwkJaTkx NV92bWFfY2xvc2Uodm1hKTsKKworCQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7CisJfQorCisJ b2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9pbnRlcm5hbChkZXZfcHJpdiwgUEFHRV9TSVpF KTsKKwlpZiAoSVNfRVJSKG9iaikpCisJCXJldHVybiBQVFJfRVJSKG9iaik7CisKKwl2bWEgPSBp OTE1X3ZtYV9pbnN0YW5jZShvYmosICZwcGd0dC0+YmFzZSwgTlVMTCk7CisJaWYgKElTX0VSUih2 bWEpKSB7CisJCWVyciA9IFBUUl9FUlIodm1hKTsKKwkJZ290byBvdXRfcHV0OworCX0KKworCWVy ciA9IGk5MTVfdm1hX3Bpbih2bWEsIDAsIDAsIGZsYWdzKTsKKwlpZiAoZXJyKQorCQlnb3RvIG91 dF9jbG9zZTsKKworCS8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgd2l0aCBzb21ldGhpbmcg bGlrZSB3aGVyZSB0aGUgcGRlIGlzIHN0aWxsCisJICogcG9pbnRpbmcgdG8gdGhlIDJNIHBhZ2Us IGFuZCB0aGUgcHQgd2UganVzdCBmaWxsZWQtaW4gaXMgZGFuZ2xpbmcgLS0KKwkgKiB3ZSBjYW4g Y2hlY2sgdGhpcyBieSB3cml0aW5nIHRvIHRoZSBmaXJzdCBwYWdlIHdoZXJlIGl0IHdvdWxkIHRo ZW4KKwkgKiBsYW5kIGluIHRoZSBub3cgc3RhbGUgMk0gcGFnZS4KKwkgKi8KKworCWVyciA9IGdw dV93cml0ZSh2bWEsIGRldl9wcml2LT5rZXJuZWxfY29udGV4dCwgMCwgMHhkZWFkYmVhZik7CisJ aWYgKGVycikKKwkJZ290byBvdXRfdW5waW47CisKKwllcnIgPSBjcHVfY2hlY2sob2JqLCAwLCAw eGRlYWRiZWFmKTsKKworb3V0X3VucGluOgorCWk5MTVfdm1hX3VucGluKHZtYSk7CitvdXRfY2xv c2U6CisJaTkxNV92bWFfY2xvc2Uodm1hKTsKK291dF9wdXQ6CisJaTkxNV9nZW1fb2JqZWN0X3B1 dChvYmopOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBpZ3Rfc2hyaW5rX3RocCh2 b2lkICphcmcpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gYXJnOwor CXN0cnVjdCBpOTE1X2h3X3BwZ3R0ICpwcGd0dCA9IGRldl9wcml2LT5rZXJuZWxfY29udGV4dC0+ cHBndHQ7CisJc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3QgKm9iajsKKwlzdHJ1Y3QgaTkxNV92 bWEgKnZtYTsKKwl1bnNpZ25lZCBpbnQgZmxhZ3MgPSBQSU5fVVNFUiB8IFBJTl9PRkZTRVRfRklY RUQ7CisJaW50IGVycjsKKworCS8qIFNhbml0eSBjaGVjayBzaHJpbmtpbmcgaHVnZS1wYWdlZCBv YmplY3QgLS0gbWFrZSBzdXJlIG5vdGhpbmcgYmxvd3MKKwkgKiB1cC4KKwkgKi8KKworCWlmICgh aWd0X2Nhbl9hbGxvY2F0ZV90aHAoZGV2X3ByaXYpKSB7CisJCXByX2luZm8oIm1pc3NpbmcgVEhQ IHN1cHBvcnQsIHNraXBwaW5nXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJb2JqID0gaTkxNV9n ZW1fb2JqZWN0X2NyZWF0ZShkZXZfcHJpdiwgU1pfMk0pOworCWlmIChJU19FUlIob2JqKSkKKwkJ cmV0dXJuIFBUUl9FUlIob2JqKTsKKworCXZtYSA9IGk5MTVfdm1hX2luc3RhbmNlKG9iaiwgJnBw Z3R0LT5iYXNlLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtYSkpIHsKKwkJZXJyID0gUFRSX0VSUih2 bWEpOworCQlnb3RvIG91dF9wdXQ7CisJfQorCisJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwg MCwgZmxhZ3MpOworCWlmIChlcnIpCisJCWdvdG8gb3V0X2Nsb3NlOworCisJaWYgKCFQYWdlVHJh bnNIdWdlKGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShvYmosIDApKSkgeworCQlwcl9pbmZvKCJm YWlsZWQgdG8gYWxsb2NhdGUgVEhQLCBmaW5pc2hpbmcgdGVzdCBlYXJseVxuIik7CisJCWdvdG8g b3V0X3VucGluOworCX0KKworCWVyciA9IGlndF9jaGVja19wYWdlX3NpemVzKHZtYSk7CisJaWYg KGVycikKKwkJZ290byBvdXRfdW5waW47CisKKwllcnIgPSBncHVfd3JpdGUodm1hLCBkZXZfcHJp di0+a2VybmVsX2NvbnRleHQsIDAsIDB4ZGVhZGJlYWYpOworCWlmIChlcnIpCisJCWdvdG8gb3V0 X3VucGluOworCisJaTkxNV92bWFfdW5waW4odm1hKTsKKworCS8qIE5vdyB0aGF0IHRoZSBwYWdl cyBhcmUgKnVucGlubmVkKiBzaHJpbmstYWxsIHNob3VsZCBpbnZva2UKKwkgKiBzaG1lbSB0byB0 cnVuY2F0ZSBvbiBvdXIgcGFnZXMuCisJICovCisJaTkxNV9nZW1fc2hyaW5rX2FsbChkZXZfcHJp dik7CisJaWYgKCFJU19FUlJfT1JfTlVMTChvYmotPm1tLnBhZ2VzKSkgeworCQlwcl9lcnIoInNo cmluay1hbGwgZGlkbid0IHRydW5jYXRlIHRoZSBwYWdlc1xuIik7CisJCWVyciA9IC1FSU5WQUw7 CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCWlmIChvYmotPm1tLnBhZ2Vfc2l6ZXMuc2cgfHwg b2JqLT5tbS5wYWdlX3NpemVzLnBoeXMpIHsKKwkJcHJfZXJyKCJyZXNpZHVhbCBwYWdlLXNpemUg Yml0cyBsZWZ0XG4iKTsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXRfY2xvc2U7CisJfQor CisJZXJyID0gaTkxNV92bWFfcGluKHZtYSwgMCwgMCwgZmxhZ3MpOworCWlmIChlcnIpCisJCWdv dG8gb3V0X2Nsb3NlOworCisJZXJyID0gY3B1X2NoZWNrKG9iaiwgMCwgMHhkZWFkYmVhZik7CisK K291dF91bnBpbjoKKwlpOTE1X3ZtYV91bnBpbih2bWEpOworb3V0X2Nsb3NlOgorCWk5MTVfdm1h X2Nsb3NlKHZtYSk7CitvdXRfcHV0OgorCWk5MTVfZ2VtX29iamVjdF9wdXQob2JqKTsKKworCXJl dHVybiBlcnI7Cit9CisKK2ludCBpOTE1X2dlbV9odWdlX3BhZ2VfbW9ja19zZWxmdGVzdHModm9p ZCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGk5MTVfc3VidGVzdCB0ZXN0c1tdID0geworCQlT VUJURVNUKGlndF9tb2NrX2V4aGF1c3RfZGV2aWNlX3N1cHBvcnRlZF9wYWdlcyksCisJCVNVQlRF U1QoaWd0X21vY2tfcHBndHRfbWlzYWxpZ25lZF9kbWEpLAorCQlTVUJURVNUKGlndF9tb2NrX3Bw Z3R0X2h1Z2VfZmlsbCksCisJCVNVQlRFU1QoaWd0X21vY2tfcHBndHRfNjRLKSwKKwl9OworCWlu dCBzYXZlZF9wcGd0dCA9IGk5MTVfbW9kcGFyYW1zLmVuYWJsZV9wcGd0dDsKKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXY7CisJc3RydWN0IHBjaV9kZXYgKnBkZXY7CisJc3RydWN0 IGk5MTVfaHdfcHBndHQgKnBwZ3R0OworCWludCBlcnI7CisKKwlkZXZfcHJpdiA9IG1vY2tfZ2Vt X2RldmljZSgpOworCWlmICghZGV2X3ByaXYpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogUHJl dGVuZCB0byBiZSBhIGRldmljZSB3aGljaCBzdXBwb3J0cyB0aGUgNDhiIFBQR1RUICovCisJaTkx NV9tb2RwYXJhbXMuZW5hYmxlX3BwZ3R0ID0gMzsKKworCXBkZXYgPSBkZXZfcHJpdi0+ZHJtLnBk ZXY7CisJZG1hX2NvZXJjZV9tYXNrX2FuZF9jb2hlcmVudCgmcGRldi0+ZGV2LCBETUFfQklUX01B U0soMzkpKTsKKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcm0uc3RydWN0X211dGV4KTsKKwlw cGd0dCA9IGk5MTVfcHBndHRfY3JlYXRlKGRldl9wcml2LCBFUlJfUFRSKC1FTk9ERVYpLCAibW9j ayIpOworCWlmIChJU19FUlIocHBndHQpKSB7CisJCWVyciA9IFBUUl9FUlIocHBndHQpOworCQln b3RvIG91dF91bmxvY2s7CisJfQorCisJaWYgKCFpOTE1X3ZtX2lzXzQ4Yml0KCZwcGd0dC0+YmFz ZSkpIHsKKwkJcHJfZXJyKCJmYWlsZWQgdG8gY3JlYXRlIDQ4YiBQUEdUVFxuIik7CisJCWVyciA9 IC1FSU5WQUw7CisJCWdvdG8gb3V0X2Nsb3NlOworCX0KKworCS8qIElmIHdlIHdlcmUgZXZlciBo aXQgdGhpcyB0aGVuIGl0J3MgdGltZSB0byBtb2NrIHRoZSA2NEsgc2NyYXRjaCAqLworCWlmICgh aTkxNV92bV9oYXNfc2NyYXRjaF82NEsoJnBwZ3R0LT5iYXNlKSkgeworCQlwcl9lcnIoIlBQR1RU IG1pc3NpbmcgNjRLIHNjcmF0Y2ggcGFnZVxuIik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8g b3V0X2Nsb3NlOworCX0KKworCWVyciA9IGk5MTVfc3VidGVzdHModGVzdHMsIHBwZ3R0KTsKKwor b3V0X2Nsb3NlOgorCWk5MTVfcHBndHRfY2xvc2UoJnBwZ3R0LT5iYXNlKTsKKwlpOTE1X3BwZ3R0 X3B1dChwcGd0dCk7CisKK291dF91bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHJt LnN0cnVjdF9tdXRleCk7CisKKwlpOTE1X21vZHBhcmFtcy5lbmFibGVfcHBndHQgPSBzYXZlZF9w cGd0dDsKKworCWRybV9kZXZfdW5yZWYoJmRldl9wcml2LT5kcm0pOworCisJcmV0dXJuIGVycjsK K30KKworaW50IGk5MTVfZ2VtX2h1Z2VfcGFnZV9saXZlX3NlbGZ0ZXN0cyhzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBpOTE1X3N1YnRl c3QgdGVzdHNbXSA9IHsKKwkJU1VCVEVTVChpZ3RfcHBndHRfZ2VtZnNfaHVnZSksCisJCVNVQlRF U1QoaWd0X3BwZ3R0X2ludGVybmFsX2h1Z2UpLAorCQlTVUJURVNUKGlndF9wcGd0dF9leGhhdXN0 X2h1Z2UpLAorCQlTVUJURVNUKGlndF9wcGd0dF9waW5fdXBkYXRlKSwKKwkJU1VCVEVTVChpZ3Rf c2hyaW5rX3RocCksCisJfTsKKwlpbnQgZXJyOworCisJaWYgKCFVU0VTX1BQR1RUKGRldl9wcml2 KSkgeworCQlwcl9pbmZvKCJQUEdUVCBub3Qgc3VwcG9ydGVkLCBza2lwcGluZyBsaXZlLXNlbGZ0 ZXN0c1xuIik7CisJCXJldHVybiAwOworCX0KKworCW11dGV4X2xvY2soJmRldl9wcml2LT5kcm0u c3RydWN0X211dGV4KTsKKwllcnIgPSBpOTE1X3N1YnRlc3RzKHRlc3RzLCBkZXZfcHJpdik7CisJ bXV0ZXhfdW5sb2NrKCZkZXZfcHJpdi0+ZHJtLnN0cnVjdF9tdXRleCk7CisKKwlyZXR1cm4gZXJy OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2 ZV9zZWxmdGVzdHMuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVf c2VsZnRlc3RzLmgKaW5kZXggMThiMTc0ZDg1NWNhLi42NGFjZDdlY2NjNWMgMTAwNjQ0Ci0tLSBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L3NlbGZ0ZXN0cy9pOTE1X2xpdmVfc2VsZnRlc3RzLmgKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbGl2ZV9zZWxmdGVzdHMuaApA QCAtMTUsNSArMTUsNiBAQCBzZWxmdGVzdChvYmplY3RzLCBpOTE1X2dlbV9vYmplY3RfbGl2ZV9z ZWxmdGVzdHMpCiBzZWxmdGVzdChkbWFidWYsIGk5MTVfZ2VtX2RtYWJ1Zl9saXZlX3NlbGZ0ZXN0 cykKIHNlbGZ0ZXN0KGNvaGVyZW5jeSwgaTkxNV9nZW1fY29oZXJlbmN5X2xpdmVfc2VsZnRlc3Rz KQogc2VsZnRlc3QoZ3R0LCBpOTE1X2dlbV9ndHRfbGl2ZV9zZWxmdGVzdHMpCitzZWxmdGVzdCho dWdlcGFnZXMsIGk5MTVfZ2VtX2h1Z2VfcGFnZV9saXZlX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGNv bnRleHRzLCBpOTE1X2dlbV9jb250ZXh0X2xpdmVfc2VsZnRlc3RzKQogc2VsZnRlc3QoaGFuZ2No ZWNrLCBpbnRlbF9oYW5nY2hlY2tfbGl2ZV9zZWxmdGVzdHMpCmRpZmYgLS1naXQgYS9kcml2ZXJz L2dwdS9kcm0vaTkxNS9zZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oIGIvZHJpdmVycy9n cHUvZHJtL2k5MTUvc2VsZnRlc3RzL2k5MTVfbW9ja19zZWxmdGVzdHMuaAppbmRleCBmYzc0Njg3 NTAxYmEuLjk5NjFiNDRmNzZlZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvc2Vs ZnRlc3RzL2k5MTVfbW9ja19zZWxmdGVzdHMuaAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9z ZWxmdGVzdHMvaTkxNV9tb2NrX3NlbGZ0ZXN0cy5oCkBAIC0yMSwzICsyMSw0IEBAIHNlbGZ0ZXN0 KGRtYWJ1ZiwgaTkxNV9nZW1fZG1hYnVmX21vY2tfc2VsZnRlc3RzKQogc2VsZnRlc3Qodm1hLCBp OTE1X3ZtYV9tb2NrX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGV2aWN0LCBpOTE1X2dlbV9ldmljdF9t b2NrX3NlbGZ0ZXN0cykKIHNlbGZ0ZXN0KGd0dCwgaTkxNV9nZW1fZ3R0X21vY2tfc2VsZnRlc3Rz KQorc2VsZnRlc3QoaHVnZXBhZ2VzLCBpOTE1X2dlbV9odWdlX3BhZ2VfbW9ja19zZWxmdGVzdHMp Ci0tIAoyLjEzLjUKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNrdG9wLm9y ZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdm eAo=