From mboxrd@z Thu Jan 1 00:00:00 1970 From: Oscar Mateo Subject: [PATCH 1/5] drm/i915: Move a bunch of workaround-related code to its own file Date: Tue, 13 Feb 2018 11:13:28 -0800 Message-ID: <1518549212-34904-1-git-send-email-oscar.mateo@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by gabe.freedesktop.org (Postfix) with ESMTPS id 45CC56E28C for ; Tue, 13 Feb 2018 19:15:32 +0000 (UTC) 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 VGhpcyBoYXMgZ3Jvd24gdG8gYmUgYSBzaXphYmxlIGFtb3VudCBvZiBjb2RlLCBzbyBtb3ZlIGl0 IHRvCml0cyBvd24gZmlsZSBiZWZvcmUgd2UgdHJ5IHRvIHJlZmFjdG9yIGFueXRoaW5nLiBGb3Ig dGhlIG1vbWVudCwKd2UgYXJlIGxlYXZpbmcgYmVoaW5kIHRoZSBXQSBCQiBjb2RlIGFuZCB0aGUg V0FzIHRoYXQgZ2V0IGFwcGxpZWQKKGluY29ycmVjdGx5KSBpbiBpbml0X2Nsb2NrX2dhdGluZywg YnV0IHdlIHdpbGwgZGVhbCB3aXRoIGl0IGxhdGVyLgoKdjI6IFVzZSBpbnRlbF8gcHJlZml4IGZv ciBjb2RlIHRoYXQgZGVhbHMgd2l0aCB0aGUgaGFyZHdhcmUgKENocmlzKQp2MzogUmViYXNlZAp2 NDoKICAtIFJlYmFzZWQKICAtIE5ldyBsaWNlbnNlIGhlYWRlcgoKU2lnbmVkLW9mZi1ieTogT3Nj YXIgTWF0ZW8gPG9zY2FyLm1hdGVvQGludGVsLmNvbT4KQ2M6IENocmlzIFdpbHNvbiA8Y2hyaXNA Y2hyaXMtd2lsc29uLmNvLnVrPgpDYzogTWlrYSBLdW9wcGFsYSA8bWlrYS5rdW9wcGFsYUBsaW51 eC5pbnRlbC5jb20+Ci0tLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvTWFrZWZpbGUgICAgICAgICAg ICB8ICAgMyArLQogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZW5naW5lX2NzLmMgICB8IDYz NCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2lu dGVsX2xyYy5jICAgICAgICAgfCAgIDEgKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmlu Z2J1ZmZlci5jICB8ICAgMSArCiBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVy LmggIHwgICAzIC0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3dvcmthcm91bmRzLmMgfCA2 NDIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfd29ya2Fyb3VuZHMuaCB8ICAxMyArCiA3IGZpbGVzIGNoYW5nZWQsIDY1OSBpbnNlcnRp b25zKCspLCA2MzggZGVsZXRpb25zKC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfd29ya2Fyb3VuZHMuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv Z3B1L2RybS9pOTE1L2ludGVsX3dvcmthcm91bmRzLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9NYWtlZmlsZSBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCmluZGV4 IGY1NWNjMDIuLjQyNGYwOWQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2Vm aWxlCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L01ha2VmaWxlCkBAIC00Myw3ICs0Myw4IEBA IGk5MTUteSA6PSBpOTE1X2Rydi5vIFwKIAkgIGludGVsX2Nzci5vIFwKIAkgIGludGVsX2Rldmlj ZV9pbmZvLm8gXAogCSAgaW50ZWxfcG0ubyBcCi0JICBpbnRlbF9ydW50aW1lX3BtLm8KKwkgIGlu dGVsX3J1bnRpbWVfcG0ubyBcCisJICBpbnRlbF93b3JrYXJvdW5kcy5vCiAKIGk5MTUtJChDT05G SUdfQ09NUEFUKSAgICs9IGk5MTVfaW9jMzIubwogaTkxNS0kKENPTkZJR19ERUJVR19GUykgKz0g aTkxNV9kZWJ1Z2ZzLm8gaW50ZWxfcGlwZV9jcmMubwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUv ZHJtL2k5MTUvaW50ZWxfZW5naW5lX2NzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9l bmdpbmVfY3MuYwppbmRleCBmM2M1MTAwLi43M2ZiNDg4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9p bnRlbF9lbmdpbmVfY3MuYwpAQCAtODI1LDY0MCArODI1LDYgQEAgdm9pZCBpbnRlbF9lbmdpbmVf Z2V0X2luc3Rkb25lKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKIAl9CiB9CiAKLXN0 YXRpYyBpbnQgd2FfYWRkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiwKLQkJICBp OTE1X3JlZ190IGFkZHIsCi0JCSAgY29uc3QgdTMyIG1hc2ssIGNvbnN0IHUzMiB2YWwpCi17Ci0J Y29uc3QgdTMyIGlkeCA9IGRldl9wcml2LT53b3JrYXJvdW5kcy5jb3VudDsKLQotCWlmIChXQVJO X09OKGlkeCA+PSBJOTE1X01BWF9XQV9SRUdTKSkKLQkJcmV0dXJuIC1FTk9TUEM7Ci0KLQlkZXZf cHJpdi0+d29ya2Fyb3VuZHMucmVnW2lkeF0uYWRkciA9IGFkZHI7Ci0JZGV2X3ByaXYtPndvcmth cm91bmRzLnJlZ1tpZHhdLnZhbHVlID0gdmFsOwotCWRldl9wcml2LT53b3JrYXJvdW5kcy5yZWdb aWR4XS5tYXNrID0gbWFzazsKLQotCWRldl9wcml2LT53b3JrYXJvdW5kcy5jb3VudCsrOwotCi0J cmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgV0FfUkVHKGFkZHIsIG1hc2ssIHZhbCkgZG8geyBcCi0J CWNvbnN0IGludCByID0gd2FfYWRkKGRldl9wcml2LCAoYWRkciksIChtYXNrKSwgKHZhbCkpOyBc Ci0JCWlmIChyKSBcCi0JCQlyZXR1cm4gcjsgXAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgV0Ff U0VUX0JJVF9NQVNLRUQoYWRkciwgbWFzaykgXAotCVdBX1JFRyhhZGRyLCAobWFzayksIF9NQVNL RURfQklUX0VOQUJMRShtYXNrKSkKLQotI2RlZmluZSBXQV9DTFJfQklUX01BU0tFRChhZGRyLCBt YXNrKSBcCi0JV0FfUkVHKGFkZHIsIChtYXNrKSwgX01BU0tFRF9CSVRfRElTQUJMRShtYXNrKSkK LQotI2RlZmluZSBXQV9TRVRfRklFTERfTUFTS0VEKGFkZHIsIG1hc2ssIHZhbHVlKSBcCi0JV0Ff UkVHKGFkZHIsIG1hc2ssIF9NQVNLRURfRklFTEQobWFzaywgdmFsdWUpKQotCi1zdGF0aWMgaW50 IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCi0J CQkJIGk5MTVfcmVnX3QgcmVnKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp diA9IGVuZ2luZS0+aTkxNTsKLQlzdHJ1Y3QgaTkxNV93b3JrYXJvdW5kcyAqd2EgPSAmZGV2X3By aXYtPndvcmthcm91bmRzOwotCWNvbnN0IHVpbnQzMl90IGluZGV4ID0gd2EtPmh3X3doaXRlbGlz dF9jb3VudFtlbmdpbmUtPmlkXTsKLQotCWlmIChXQVJOX09OKGluZGV4ID49IFJJTkdfTUFYX05P TlBSSVZfU0xPVFMpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCUk5MTVfV1JJVEUoUklOR19GT1JD RV9UT19OT05QUklWKGVuZ2luZS0+bW1pb19iYXNlLCBpbmRleCksCi0JCSAgIGk5MTVfbW1pb19y ZWdfb2Zmc2V0KHJlZykpOwotCXdhLT5od193aGl0ZWxpc3RfY291bnRbZW5naW5lLT5pZF0rKzsK LQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdlbjhfaW5pdF93b3JrYXJvdW5kcyhzdHJ1 Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUg KmRldl9wcml2ID0gZW5naW5lLT5pOTE1OwotCi0JV0FfU0VUX0JJVF9NQVNLRUQoSU5TVFBNLCBJ TlNUUE1fRk9SQ0VfT1JERVJJTkcpOwotCi0JLyogV2FEaXNhYmxlQXN5bmNGbGlwUGVyZk1vZGU6 YmR3LGNodiAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKE1JX01PREUsIEFTWU5DX0ZMSVBfUEVSRl9E SVNBQkxFKTsKLQotCS8qIFdhRGlzYWJsZVBhcnRpYWxJbnN0U2hvb3Rkb3duOmJkdyxjaHYgKi8K LQlXQV9TRVRfQklUX01BU0tFRChHRU44X1JPV19DSElDS0VOLAotCQkJICBQQVJUSUFMX0lOU1RS VUNUSU9OX1NIT09URE9XTl9ESVNBQkxFKTsKLQotCS8qIFVzZSBGb3JjZSBOb24tQ29oZXJlbnQg d2hlbmV2ZXIgZXhlY3V0aW5nIGEgM0QgY29udGV4dC4gVGhpcyBpcyBhCi0JICogd29ya2Fyb3Vu ZCBmb3IgZm9yIGEgcG9zc2libGUgaGFuZyBpbiB0aGUgdW5saWtlbHkgZXZlbnQgYSBUTEIKLQkg KiBpbnZhbGlkYXRpb24gb2NjdXJzIGR1cmluZyBhIFBTRCBmbHVzaC4KLQkgKi8KLQkvKiBXYUZv cmNlRW5hYmxlTm9uQ29oZXJlbnQ6YmR3LGNodiAqLwotCS8qIFdhSGRjRGlzYWJsZUZldGNoV2hl bk1hc2tlZDpiZHcsY2h2ICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4wLAotCQkJ ICBIRENfRE9OT1RfRkVUQ0hfTUVNX1dIRU5fTUFTS0VEIHwKLQkJCSAgSERDX0ZPUkNFX05PTl9D T0hFUkVOVCk7Ci0KLQkvKiBGcm9tIHRoZSBIYXN3ZWxsIFBSTSwgQ29tbWFuZCBSZWZlcmVuY2U6 IFJlZ2lzdGVycywgQ0FDSEVfTU9ERV8wOgotCSAqICJUaGUgSGllcmFyY2hpY2FsIFogUkFXIFN0 YWxsIE9wdGltaXphdGlvbiBhbGxvd3Mgbm9uLW92ZXJsYXBwaW5nCi0JICogIHBvbHlnb25zIGlu IHRoZSBzYW1lIDh4NCBwaXhlbC9zYW1wbGUgYXJlYSB0byBiZSBwcm9jZXNzZWQgd2l0aG91dAot CSAqICBzdGFsbGluZyB3YWl0aW5nIGZvciB0aGUgZWFybGllciBvbmVzIHRvIHdyaXRlIHRvIEhp ZXJhcmNoaWNhbCBaCi0JICogIGJ1ZmZlci4iCi0JICoKLQkgKiBUaGlzIG9wdGltaXphdGlvbiBp cyBvZmYgYnkgZGVmYXVsdCBmb3IgQkRXIGFuZCBDSFY7IHR1cm4gaXQgb24uCi0JICovCi0JV0Ff Q0xSX0JJVF9NQVNLRUQoQ0FDSEVfTU9ERV8wX0dFTjcsIEhJWl9SQVdfU1RBTExfT1BUX0RJU0FC TEUpOwotCi0JLyogV2E0eDRTVENPcHRpbWl6YXRpb25EaXNhYmxlOmJkdyxjaHYgKi8KLQlXQV9T RVRfQklUX01BU0tFRChDQUNIRV9NT0RFXzEsIEdFTjhfNHg0X1NUQ19PUFRJTUlaQVRJT05fRElT QUJMRSk7Ci0KLQkvKgotCSAqIEJTcGVjIHJlY29tbWVuZHMgOHg0IHdoZW4gTVNBQSBpcyB1c2Vk LAotCSAqIGhvd2V2ZXIgaW4gcHJhY3RpY2UgMTZ4NCBzZWVtcyBmYXN0ZXN0LgotCSAqCi0JICog Tm90ZSB0aGF0IFBTL1dNIHRocmVhZCBjb3VudHMgZGVwZW5kIG9uIHRoZSBXSVogaGFzaGluZwot CSAqIGRpc2FibGUgYml0LCB3aGljaCB3ZSBkb24ndCB0b3VjaCBoZXJlLCBidXQgaXQncyBnb29k Ci0JICogdG8ga2VlcCBpbiBtaW5kIChzZWUgM0RTVEFURV9QUyBhbmQgM0RTVEFURV9XTSkuCi0J ICovCi0JV0FfU0VUX0ZJRUxEX01BU0tFRChHRU43X0dUX01PREUsCi0JCQkgICAgR0VONl9XSVpf SEFTSElOR19NQVNLLAotCQkJICAgIEdFTjZfV0laX0hBU0hJTkdfMTZ4NCk7Ci0KLQlyZXR1cm4g MDsKLX0KLQotc3RhdGljIGludCBiZHdfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0g ZW5naW5lLT5pOTE1OwotCWludCByZXQ7Ci0KLQlyZXQgPSBnZW44X2luaXRfd29ya2Fyb3VuZHMo ZW5naW5lKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogV2FEaXNhYmxlVGhyZWFk U3RhbGxEb3BDbG9ja0dhdGluZzpiZHcgKHByZS1wcm9kdWN0aW9uKSAqLwotCVdBX1NFVF9CSVRf TUFTS0VEKEdFTjhfUk9XX0NISUNLRU4sIFNUQUxMX0RPUF9HQVRJTkdfRElTQUJMRSk7Ci0KLQkv KiBXYURpc2FibGVEb3BDbG9ja0dhdGluZzpiZHcKLQkgKgotCSAqIEFsc28gc2VlIHRoZSByZWxh dGVkIFVDR1RDTDEgd3JpdGUgaW4gYnJvYWR3ZWxsX2luaXRfY2xvY2tfZ2F0aW5nKCkKLQkgKiB0 byBkaXNhYmxlIEVVVEMgY2xvY2sgZ2F0aW5nLgotCSAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEdF TjdfUk9XX0NISUNLRU4yLAotCQkJICBET1BfQ0xPQ0tfR0FUSU5HX0RJU0FCTEUpOwotCi0JV0Ff U0VUX0JJVF9NQVNLRUQoSEFMRl9TTElDRV9DSElDS0VOMywKLQkJCSAgR0VOOF9TQU1QTEVSX1BP V0VSX0JZUEFTU19ESVMpOwotCi0JV0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4wLAotCQkJ ICAvKiBXYUZvcmNlQ29udGV4dFNhdmVSZXN0b3JlTm9uQ29oZXJlbnQ6YmR3ICovCi0JCQkgIEhE Q19GT1JDRV9DT05URVhUX1NBVkVfUkVTVE9SRV9OT05fQ09IRVJFTlQgfAotCQkJICAvKiBXYURp c2FibGVGZW5jZURlc3RpbmF0aW9uVG9TTE06YmR3IChwcmUtcHJvZCkgKi8KLQkJCSAgKElTX0JE V19HVDMoZGV2X3ByaXYpID8gSERDX0ZFTkNFX0RFU1RfU0xNX0RJU0FCTEUgOiAwKSk7Ci0KLQly ZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBjaHZfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50 ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2ID0gZW5naW5lLT5pOTE1OwotCWludCByZXQ7Ci0KLQlyZXQgPSBnZW44X2luaXRfd29ya2Fy b3VuZHMoZW5naW5lKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogV2FEaXNhYmxl VGhyZWFkU3RhbGxEb3BDbG9ja0dhdGluZzpjaHYgKi8KLQlXQV9TRVRfQklUX01BU0tFRChHRU44 X1JPV19DSElDS0VOLCBTVEFMTF9ET1BfR0FUSU5HX0RJU0FCTEUpOwotCi0JLyogSW1wcm92ZSBI aVogdGhyb3VnaHB1dCBvbiBDSFYuICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoSElaX0NISUNLRU4s IENIVl9IWl84WDhfTU9ERV9JTl8xWCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBn ZW45X2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewot CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQlpbnQg cmV0OwotCi0JLyogV2FDb25leHRTd2l0Y2hXaXRoQ29uY3VycmVudFRMQkludmFsaWRhdGU6c2ts LGJ4dCxrYmwsZ2xrLGNmbCAqLwotCUk5MTVfV1JJVEUoR0VOOV9DU0ZFX0NISUNLRU4xX1JDUywg X01BU0tFRF9CSVRfRU5BQkxFKEdFTjlfUFJFRU1QVF9HUEdQVV9TWU5DX1NXSVRDSF9ESVNBQkxF KSk7Ci0KLQkvKiBXYUVuYWJsZUxic1NsYVJldHJ5VGltZXJEZWNyZW1lbnQ6c2tsLGJ4dCxrYmws Z2xrLGNmbCAqLwotCUk5MTVfV1JJVEUoQkRXX1NDUkFUQ0gxLCBJOTE1X1JFQUQoQkRXX1NDUkFU Q0gxKSB8Ci0JCSAgIEdFTjlfTEJTX1NMQV9SRVRSWV9USU1FUl9ERUNSRU1FTlRfRU5BQkxFKTsK LQotCS8qIFdhRGlzYWJsZUtpbGxMb2dpYzpieHQsc2tsLGtibCAqLwotCWlmICghSVNfQ09GRkVF TEFLRShkZXZfcHJpdikpCi0JCUk5MTVfV1JJVEUoR0FNX0VDT0NISywgSTkxNV9SRUFEKEdBTV9F Q09DSEspIHwKLQkJCSAgIEVDT0NIS19ESVNfVExCKTsKLQotCWlmIChIQVNfTExDKGRldl9wcml2 KSkgewotCQkvKiBXYUNvbXByZXNzZWRSZXNvdXJjZVNhbXBsZXJQYmVNZWRpYU5ld0hhc2hNb2Rl OnNrbCxrYmwKLQkJICoKLQkJICogTXVzdCBtYXRjaCBEaXNwbGF5IEVuZ2luZS4gU2VlCi0JCSAq IFdhQ29tcHJlc3NlZFJlc291cmNlRGlzcGxheU5ld0hhc2hNb2RlLgotCQkgKi8KLQkJV0FfU0VU X0JJVF9NQVNLRUQoQ09NTU9OX1NMSUNFX0NISUNLRU4yLAotCQkJCSAgR0VOOV9QQkVfQ09NUFJF U1NFRF9IQVNIX1NFTEVDVElPTik7Ci0JCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjlfSEFMRl9TTElD RV9DSElDS0VONywKLQkJCQkgIEdFTjlfU0FNUExFUl9IQVNIX0NPTVBSRVNTRURfUkVBRF9BRERS KTsKLQotCQlJOTE1X1dSSVRFKE1NQ0RfTUlTQ19DVFJMLAotCQkJICAgSTkxNV9SRUFEKE1NQ0Rf TUlTQ19DVFJMKSB8Ci0JCQkgICBNTUNEX1BDTEEgfAotCQkJICAgTU1DRF9IT1RTUE9UX0VOKTsK LQl9Ci0KLQkvKiBXYUNsZWFyRmxvd0NvbnRyb2xHcGdwdUNvbnRleHRTYXZlOnNrbCxieHQsa2Js LGdsayxjZmwgKi8KLQkvKiBXYURpc2FibGVQYXJ0aWFsSW5zdFNob290ZG93bjpza2wsYnh0LGti bCxnbGssY2ZsICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9ST1dfQ0hJQ0tFTiwKLQkJCSAg RkxPV19DT05UUk9MX0VOQUJMRSB8Ci0JCQkgIFBBUlRJQUxfSU5TVFJVQ1RJT05fU0hPT1RET1dO X0RJU0FCTEUpOwotCi0JLyogU3luY2luZyBkZXBlbmRlbmNpZXMgYmV0d2VlbiBjYW1lcmEgYW5k IGdyYXBoaWNzOnNrbCxieHQsa2JsICovCi0JaWYgKCFJU19DT0ZGRUVMQUtFKGRldl9wcml2KSkK LQkJV0FfU0VUX0JJVF9NQVNLRUQoSEFMRl9TTElDRV9DSElDS0VOMywKLQkJCQkgIEdFTjlfRElT QUJMRV9PQ0xfT09CX1NVUFBSRVNTX0xPR0lDKTsKLQotCS8qIFdhRW5hYmxlWVYxMkJ1Z0ZpeElu SGFsZlNsaWNlQ2hpY2tlbjc6c2tsLGJ4dCxrYmwsZ2xrLGNmbCAqLwotCS8qIFdhRW5hYmxlU2Ft cGxlckdQR1BVUHJlZW1wdGlvblN1cHBvcnQ6c2tsLGJ4dCxrYmwsY2ZsICovCi0JV0FfU0VUX0JJ VF9NQVNLRUQoR0VOOV9IQUxGX1NMSUNFX0NISUNLRU43LAotCQkJICBHRU45X0VOQUJMRV9ZVjEy X0JVR0ZJWCB8Ci0JCQkgIEdFTjlfRU5BQkxFX0dQR1BVX1BSRUVNUFRJT04pOwotCi0JLyogV2E0 eDRTVENPcHRpbWl6YXRpb25EaXNhYmxlOnNrbCxieHQsa2JsLGdsayxjZmwgKi8KLQkvKiBXYURp c2FibGVQYXJ0aWFsUmVzb2x2ZUluVmM6c2tsLGJ4dCxrYmwsY2ZsICovCi0JV0FfU0VUX0JJVF9N QVNLRUQoQ0FDSEVfTU9ERV8xLCAoR0VOOF80eDRfU1RDX09QVElNSVpBVElPTl9ESVNBQkxFIHwK LQkJCQkJIEdFTjlfUEFSVElBTF9SRVNPTFZFX0lOX1ZDX0RJU0FCTEUpKTsKLQotCS8qIFdhQ2Nz VGxiUHJlZmV0Y2hEaXNhYmxlOnNrbCxieHQsa2JsLGdsayxjZmwgKi8KLQlXQV9DTFJfQklUX01B U0tFRChHRU45X0hBTEZfU0xJQ0VfQ0hJQ0tFTjUsCi0JCQkgIEdFTjlfQ0NTX1RMQl9QUkVGRVRD SF9FTkFCTEUpOwotCi0JLyogV2FGb3JjZUNvbnRleHRTYXZlUmVzdG9yZU5vbkNvaGVyZW50OnNr bCxieHQsa2JsLGNmbCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEhEQ19DSElDS0VOMCwKLQkJCSAg SERDX0ZPUkNFX0NPTlRFWFRfU0FWRV9SRVNUT1JFX05PTl9DT0hFUkVOVCB8Ci0JCQkgIEhEQ19G T1JDRV9DU1JfTk9OX0NPSEVSRU5UX09WUl9ESVNBQkxFKTsKLQotCS8qIFdhRm9yY2VFbmFibGVO b25Db2hlcmVudCBhbmQgV2FEaXNhYmxlSERDSW52YWxpZGF0aW9uIGFyZQotCSAqIGJvdGggdGll ZCB0byBXYUZvcmNlQ29udGV4dFNhdmVSZXN0b3JlTm9uQ29oZXJlbnQKLQkgKiBpbiBzb21lIGhz ZHMgZm9yIHNrbC4gV2Uga2VlcCB0aGUgdGllIGZvciBhbGwgZ2VuOS4gVGhlCi0JICogZG9jdW1l bnRhdGlvbiBpcyBhIGJpdCBoYXp5IGFuZCBzbyB3ZSB3YW50IHRvIGdldCBjb21tb24gYmVoYXZp b3VyLAotCSAqIGV2ZW4gdGhvdWdoIHRoZXJlIGlzIG5vIGNsZWFyIGV2aWRlbmNlIHdlIHdvdWxk IG5lZWQgYm90aCBvbiBrYmwvYnh0LgotCSAqIFRoaXMgYXJlYSBoYXMgYmVlbiBzb3VyY2Ugb2Yg c3lzdGVtIGhhbmdzIHNvIHdlIHBsYXkgaXQgc2FmZQotCSAqIGFuZCBtaW1pYyB0aGUgc2tsIHJl Z2FyZGxlc3Mgb2Ygd2hhdCBic3BlYyBzYXlzLgotCSAqCi0JICogVXNlIEZvcmNlIE5vbi1Db2hl cmVudCB3aGVuZXZlciBleGVjdXRpbmcgYSAzRCBjb250ZXh0LiBUaGlzCi0JICogaXMgYSB3b3Jr YXJvdW5kIGZvciBhIHBvc3NpYmxlIGhhbmcgaW4gdGhlIHVubGlrZWx5IGV2ZW50Ci0JICogYSBU TEIgaW52YWxpZGF0aW9uIG9jY3VycyBkdXJpbmcgYSBQU0QgZmx1c2guCi0JICovCi0KLQkvKiBX YUZvcmNlRW5hYmxlTm9uQ29oZXJlbnQ6c2tsLGJ4dCxrYmwsY2ZsICovCi0JV0FfU0VUX0JJVF9N QVNLRUQoSERDX0NISUNLRU4wLAotCQkJICBIRENfRk9SQ0VfTk9OX0NPSEVSRU5UKTsKLQotCS8q IFdhRGlzYWJsZUhEQ0ludmFsaWRhdGlvbjpza2wsYnh0LGtibCxjZmwgKi8KLQlJOTE1X1dSSVRF KEdBTV9FQ09DSEssIEk5MTVfUkVBRChHQU1fRUNPQ0hLKSB8Ci0JCSAgIEJEV19ESVNBQkxFX0hE Q19JTlZBTElEQVRJT04pOwotCi0JLyogV2FEaXNhYmxlU2FtcGxlclBvd2VyQnlwYXNzRm9yU09Q aW5nUG9uZzpza2wsYnh0LGtibCxjZmwgKi8KLQlpZiAoSVNfU0tZTEFLRShkZXZfcHJpdikgfHwK LQkgICAgSVNfS0FCWUxBS0UoZGV2X3ByaXYpIHx8Ci0JICAgIElTX0NPRkZFRUxBS0UoZGV2X3By aXYpKQotCQlXQV9TRVRfQklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4zLAotCQkJCSAgR0VO OF9TQU1QTEVSX1BPV0VSX0JZUEFTU19ESVMpOwotCi0JLyogV2FEaXNhYmxlU1RVbml0UG93ZXJP cHRpbWl6YXRpb246c2tsLGJ4dCxrYmwsZ2xrLGNmbCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEhB TEZfU0xJQ0VfQ0hJQ0tFTjIsIEdFTjhfU1RfUE9fRElTQUJMRSk7Ci0KLQkvKiBXYVByb2dyYW1M M1NxY1JlZzFEZWZhdWx0Rm9yUGVyZjpieHQsZ2xrICovCi0JaWYgKElTX0dFTjlfTFAoZGV2X3By aXYpKSB7Ci0JCXUzMiB2YWwgPSBJOTE1X1JFQUQoR0VOOF9MM1NRQ1JFRzEpOwotCi0JCXZhbCAm PSB+TDNfUFJJT19DUkVESVRTX01BU0s7Ci0JCXZhbCB8PSBMM19HRU5FUkFMX1BSSU9fQ1JFRElU Uyg2MikgfCBMM19ISUdIX1BSSU9fQ1JFRElUUygyKTsKLQkJSTkxNV9XUklURShHRU44X0wzU1FD UkVHMSwgdmFsKTsKLQl9Ci0KLQkvKiBXYU9DTENvaGVyZW50TGluZUZsdXNoOnNrbCxieHQsa2Js LGNmbCAqLwotCUk5MTVfV1JJVEUoR0VOOF9MM1NRQ1JFRzQsIChJOTE1X1JFQUQoR0VOOF9MM1NR Q1JFRzQpIHwKLQkJCQkgICAgR0VOOF9MUVNDX0ZMVVNIX0NPSEVSRU5UX0xJTkVTKSk7Ci0KLQkv KgotCSAqIFN1cHBvcnRpbmcgcHJlZW1wdGlvbiB3aXRoIGZpbmUtZ3JhbnVsYXJpdHkgcmVxdWly ZXMgY2hhbmdlcyBpbiB0aGUKLQkgKiBiYXRjaCBidWZmZXIgcHJvZ3JhbW1pbmcuIFNpbmNlIHdl IGNhbid0IGJyZWFrIG9sZCB1c2Vyc3BhY2UsIHdlCi0JICogbmVlZCB0byBzZXQgb3VyIGRlZmF1 bHQgcHJlZW1wdGlvbiBsZXZlbCB0byBzYWZlIHZhbHVlLiBVc2Vyc3BhY2UgaXMKLQkgKiBzdGls bCBhYmxlIHRvIHVzZSBtb3JlIGZpbmUtZ3JhaW5lZCBwcmVlbXB0aW9uIGxldmVscywgc2luY2Ug aW4KLQkgKiBXYUVuYWJsZVByZWVtcHRpb25HcmFudWxhcml0eUNvbnRyb2xCeVVNRCB3ZSdyZSB3 aGl0ZWxpc3RpbmcgdGhlCi0JICogcGVyLWN0eCByZWdpc3Rlci4gQXMgc3VjaCwgV2FEaXNhYmxl ezNELEdQR1BVfU1pZENtZFByZWVtcHRpb24gYXJlCi0JICogbm90IHJlYWwgSFcgd29ya2Fyb3Vu ZHMsIGJ1dCBtZXJlbHkgYSB3YXkgdG8gc3RhcnQgdXNpbmcgcHJlZW1wdGlvbgotCSAqIHdoaWxl IG1haW50YWluaW5nIG9sZCBjb250cmFjdCB3aXRoIHVzZXJzcGFjZS4KLQkgKi8KLQotCS8qIFdh RGlzYWJsZTNETWlkQ21kUHJlZW1wdGlvbjpza2wsYnh0LGdsayxjZmwsW2NubF0gKi8KLQlXQV9D TFJfQklUX01BU0tFRChHRU44X0NTX0NISUNLRU4xLCBHRU45X1BSRUVNUFRfM0RfT0JKRUNUX0xF VkVMKTsKLQotCS8qIFdhRGlzYWJsZUdQR1BVTWlkQ21kUHJlZW1wdGlvbjpza2wsYnh0LGJsayxj ZmwsW2NubF0gKi8KLQlXQV9TRVRfRklFTERfTUFTS0VEKEdFTjhfQ1NfQ0hJQ0tFTjEsIEdFTjlf UFJFRU1QVF9HUEdQVV9MRVZFTF9NQVNLLAotCQkJICAgIEdFTjlfUFJFRU1QVF9HUEdQVV9DT01N QU5EX0xFVkVMKTsKLQotCS8qIFdhVkZFU3RhdGVBZnRlclBpcGVDb250cm9sd2l0aE1lZGlhU3Rh dGVDbGVhcjpza2wsYnh0LGdsayxjZmwgKi8KLQlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9yZWco ZW5naW5lLCBHRU45X0NUWF9QUkVFTVBUX1JFRyk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsK LQotCS8qIFdhRW5hYmxlUHJlZW1wdGlvbkdyYW51bGFyaXR5Q29udHJvbEJ5VU1EOnNrbCxieHQs a2JsLGNmbCxbY25sXSAqLwotCUk5MTVfV1JJVEUoR0VON19GRl9TTElDRV9DU19DSElDS0VOMSwK LQkJICAgX01BU0tFRF9CSVRfRU5BQkxFKEdFTjlfRkZTQ19QRVJDVFhfUFJFRU1QVF9DVFJMKSk7 Ci0JcmV0ID0gd2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOF9DU19DSElDS0VOMSk7 Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdhQWxsb3dVTURUb01vZGlmeUhEQ0No aWNrZW4xOnNrbCxieHQsa2JsLGdsayxjZmwgKi8KLQlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9y ZWcoZW5naW5lLCBHRU44X0hEQ19DSElDS0VOMSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsK LQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNrbF90dW5lX2l6X2hhc2hpbmcoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQl1OCB2YWxzWzNdID0geyAwLCAwLCAwIH07Ci0JdW5z aWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0JCXU4IHNzOwotCi0J CS8qCi0JCSAqIE9ubHkgY29uc2lkZXIgc2xpY2VzIHdoZXJlIG9uZSwgYW5kIG9ubHkgb25lLCBz dWJzbGljZSBoYXMgNwotCQkgKiBFVXMKLQkJICovCi0JCWlmICghaXNfcG93ZXJfb2ZfMihJTlRF TF9JTkZPKGRldl9wcml2KS0+c3NldS5zdWJzbGljZV83ZXVbaV0pKQotCQkJY29udGludWU7Ci0K LQkJLyoKLQkJICogc3Vic2xpY2VfN2V1W2ldICE9IDAgKGJlY2F1c2Ugb2YgdGhlIGNoZWNrIGFi b3ZlKSBhbmQKLQkJICogc3NfbWF4ID09IDQgKG1heGltdW0gbnVtYmVyIG9mIHN1YnNsaWNlcyBw b3NzaWJsZSBwZXIgc2xpY2UpCi0JCSAqCi0JCSAqIC0+ICAgIDAgPD0gc3MgPD0gMzsKLQkJICov Ci0JCXNzID0gZmZzKElOVEVMX0lORk8oZGV2X3ByaXYpLT5zc2V1LnN1YnNsaWNlXzdldVtpXSkg LSAxOwotCQl2YWxzW2ldID0gMyAtIHNzOwotCX0KLQotCWlmICh2YWxzWzBdID09IDAgJiYgdmFs c1sxXSA9PSAwICYmIHZhbHNbMl0gPT0gMCkKLQkJcmV0dXJuIDA7Ci0KLQkvKiBUdW5lIElaIGhh c2hpbmcuIFNlZSBpbnRlbF9kZXZpY2VfaW5mb19ydW50aW1lX2luaXQoKSAqLwotCVdBX1NFVF9G SUVMRF9NQVNLRUQoR0VON19HVF9NT0RFLAotCQkJICAgIEdFTjlfSVpfSEFTSElOR19NQVNLKDIp IHwKLQkJCSAgICBHRU45X0laX0hBU0hJTkdfTUFTSygxKSB8Ci0JCQkgICAgR0VOOV9JWl9IQVNI SU5HX01BU0soMCksCi0JCQkgICAgR0VOOV9JWl9IQVNISU5HKDIsIHZhbHNbMl0pIHwKLQkJCSAg ICBHRU45X0laX0hBU0hJTkcoMSwgdmFsc1sxXSkgfAotCQkJICAgIEdFTjlfSVpfSEFTSElORygw LCB2YWxzWzBdKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBza2xfaW5pdF93b3Jr YXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OwotCWludCByZXQ7Ci0KLQlyZXQg PSBnZW45X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0 OwotCi0JLyogV2FFbmFibGVHYXBzVHN2Q3JlZGl0Rml4OnNrbCAqLwotCUk5MTVfV1JJVEUoR0VO OF9HQVJCQ05UTCwgKEk5MTVfUkVBRChHRU44X0dBUkJDTlRMKSB8Ci0JCQkJICAgR0VOOV9HQVBT X1RTVl9DUkVESVRfRElTQUJMRSkpOwotCi0JLyogV2FEaXNhYmxlR2Fmc1VuaXRDbGtHYXRpbmc6 c2tsICovCi0JSTkxNV9XUklURShHRU43X1VDR0NUTDQsIChJOTE1X1JFQUQoR0VON19VQ0dDVEw0 KSB8Ci0JCQkJICBHRU44X0VVX0dBVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpKTsKLQotCS8qIFdh SW5QbGFjZURlY29tcHJlc3Npb25IYW5nOnNrbCAqLwotCWlmIChJU19TS0xfUkVWSUQoZGV2X3By aXYsIFNLTF9SRVZJRF9IMCwgUkVWSURfRk9SRVZFUikpCi0JCUk5MTVfV1JJVEUoR0VOOV9HQU1U X0VDT19SRUdfUldfSUEsCi0JCQkgICAoSTkxNV9SRUFEKEdFTjlfR0FNVF9FQ09fUkVHX1JXX0lB KSB8Ci0JCQkgICAgR0FNVF9FQ09fRU5BQkxFX0lOX1BMQUNFX0RFQ09NUFJFU1MpKTsKLQotCS8q IFdhRGlzYWJsZUxTUUNST1BFUkZmb3JPQ0w6c2tsICovCi0JcmV0ID0gd2FfcmluZ193aGl0ZWxp c3RfcmVnKGVuZ2luZSwgR0VOOF9MM1NRQ1JFRzQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7 Ci0KLQlyZXR1cm4gc2tsX3R1bmVfaXpfaGFzaGluZyhlbmdpbmUpOwotfQotCi1zdGF0aWMgaW50 IGJ4dF9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsK LQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50 IHJldDsKLQotCXJldCA9IGdlbjlfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwotCWlmIChyZXQp Ci0JCXJldHVybiByZXQ7Ci0KLQkvKiBXYURpc2FibGVUaHJlYWRTdGFsbERvcENsb2NrR2F0aW5n OmJ4dCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjhfUk9XX0NISUNLRU4sCi0JCQkgIFNUQUxM X0RPUF9HQVRJTkdfRElTQUJMRSk7Ci0KLQkvKiBXYURpc2FibGVQb29sZWRFdUxvYWRCYWxhbmNp bmdGaXg6Ynh0ICovCi0JSTkxNV9XUklURShGRl9TTElDRV9DU19DSElDS0VOMiwKLQkJICAgX01B U0tFRF9CSVRfRU5BQkxFKEdFTjlfUE9PTEVEX0VVX0xPQURfQkFMQU5DSU5HX0ZJWF9ESVNBQkxF KSk7Ci0KLQkvKiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzpieHQgKi8KLQlXQV9T RVRfQklUX01BU0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCi0JCQkgIEdFTjhfU0JFX0RJU0FC TEVfUkVQTEFZX0JVRl9PUFRJTUlaQVRJT04pOwotCi0JLyogV2FJblBsYWNlRGVjb21wcmVzc2lv bkhhbmc6Ynh0ICovCi0JSTkxNV9XUklURShHRU45X0dBTVRfRUNPX1JFR19SV19JQSwKLQkJICAg KEk5MTVfUkVBRChHRU45X0dBTVRfRUNPX1JFR19SV19JQSkgfAotCQkgICAgR0FNVF9FQ09fRU5B QkxFX0lOX1BMQUNFX0RFQ09NUFJFU1MpKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50 IGNubF9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsK LQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50 IHJldDsKLQotCS8qIFdhRGlzYWJsZUkybUN5Y2xlT25XUlBvcnQ6Y25sIChwcmUtcHJvZCkgKi8K LQlpZiAoSVNfQ05MX1JFVklEKGRldl9wcml2LCBDTkxfUkVWSURfQjAsIENOTF9SRVZJRF9CMCkp Ci0JCUk5MTVfV1JJVEUoR0FNVF9DSEtOX0JJVF9SRUcsCi0JCQkgICAoSTkxNV9SRUFEKEdBTVRf Q0hLTl9CSVRfUkVHKSB8Ci0JCQkgICAgR0FNVF9DSEtOX0RJU0FCTEVfSTJNX0NZQ0xFX09OX1dS X1BPUlQpKTsKLQotCS8qIFdhRm9yY2VDb250ZXh0U2F2ZVJlc3RvcmVOb25Db2hlcmVudDpjbmwg Ki8KLQlXQV9TRVRfQklUX01BU0tFRChDTkxfSERDX0NISUNLRU4wLAotCQkJICBIRENfRk9SQ0Vf Q09OVEVYVF9TQVZFX1JFU1RPUkVfTk9OX0NPSEVSRU5UKTsKLQotCS8qIFdhVGhyb3R0bGVFVVBl cmZUb0F2b2lkVERCYWNrUHJlc3N1cmU6Y25sKHByZS1wcm9kKSAqLwotCWlmIChJU19DTkxfUkVW SUQoZGV2X3ByaXYsIENOTF9SRVZJRF9CMCwgQ05MX1JFVklEX0IwKSkKLQkJV0FfU0VUX0JJVF9N QVNLRUQoR0VOOF9ST1dfQ0hJQ0tFTiwgVEhST1RUTEVfMTJfNSk7Ci0KLQkvKiBXYURpc2FibGVS ZXBsYXlCdWZmZXJCYW5rQXJiaXRyYXRpb25PcHRpbWl6YXRpb246Y25sICovCi0JV0FfU0VUX0JJ VF9NQVNLRUQoQ09NTU9OX1NMSUNFX0NISUNLRU4yLAotCQkJICBHRU44X1NCRV9ESVNBQkxFX1JF UExBWV9CVUZfT1BUSU1JWkFUSU9OKTsKLQotCS8qIFdhRGlzYWJsZUVuaGFuY2VkU0JFVmVydGV4 Q2FjaGluZzpjbmwgKHByZS1wcm9kKSAqLwotCWlmIChJU19DTkxfUkVWSUQoZGV2X3ByaXYsIDAs IENOTF9SRVZJRF9CMCkpCi0JCVdBX1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElDRV9DSElDS0VO MiwKLQkJCQkgIEdFTjhfQ1NDMl9TQkVfVlVFX0NBQ0hFX0NPTlNFUlZBVElWRSk7Ci0KLQkvKiBX YUluUGxhY2VEZWNvbXByZXNzaW9uSGFuZzpjbmwgKi8KLQlJOTE1X1dSSVRFKEdFTjlfR0FNVF9F Q09fUkVHX1JXX0lBLAotCQkgICAoSTkxNV9SRUFEKEdFTjlfR0FNVF9FQ09fUkVHX1JXX0lBKSB8 Ci0JCSAgICBHQU1UX0VDT19FTkFCTEVfSU5fUExBQ0VfREVDT01QUkVTUykpOwotCi0JLyogV2FQ dXNoQ29uc3RhbnREZXJlZmVyZW5jZUhvbGREaXNhYmxlOmNubCAqLwotCVdBX1NFVF9CSVRfTUFT S0VEKEdFTjdfUk9XX0NISUNLRU4yLCBQVVNIX0NPTlNUQU5UX0RFUkVGX0RJU0FCTEUpOwotCi0J LyogRnRyRW5hYmxlRmFzdEFuaXNvTDFCYW5raW5nRml4OiBjbmwgKi8KLQlXQV9TRVRfQklUX01B U0tFRChIQUxGX1NMSUNFX0NISUNLRU4zLCBDTkxfRkFTVF9BTklTT19MMV9CQU5LSU5HX0ZJWCk7 Ci0KLQkvKiBXYURpc2FibGUzRE1pZENtZFByZWVtcHRpb246Y25sICovCi0JV0FfQ0xSX0JJVF9N QVNLRUQoR0VOOF9DU19DSElDS0VOMSwgR0VOOV9QUkVFTVBUXzNEX09CSkVDVF9MRVZFTCk7Ci0K LQkvKiBXYURpc2FibGVHUEdQVU1pZENtZFByZWVtcHRpb246Y25sICovCi0JV0FfU0VUX0ZJRUxE X01BU0tFRChHRU44X0NTX0NISUNLRU4xLCBHRU45X1BSRUVNUFRfR1BHUFVfTEVWRUxfTUFTSywK LQkJCSAgICBHRU45X1BSRUVNUFRfR1BHUFVfQ09NTUFORF9MRVZFTCk7Ci0KLQkvKiBXYUVuYWJs ZVByZWVtcHRpb25HcmFudWxhcml0eUNvbnRyb2xCeVVNRDpjbmwgKi8KLQlJOTE1X1dSSVRFKEdF TjdfRkZfU0xJQ0VfQ1NfQ0hJQ0tFTjEsCi0JCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRU45X0ZG U0NfUEVSQ1RYX1BSRUVNUFRfQ1RSTCkpOwotCXJldD0gd2FfcmluZ193aGl0ZWxpc3RfcmVnKGVu Z2luZSwgR0VOOF9DU19DSElDS0VOMSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8q IFdhRGlzYWJsZUVhcmx5RU9UOmNubCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjhfUk9XX0NI SUNLRU4sIERJU0FCTEVfRUFSTFlfRU9UKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50 IGtibF9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsK LQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50 IHJldDsKLQotCXJldCA9IGdlbjlfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwotCWlmIChyZXQp Ci0JCXJldHVybiByZXQ7Ci0KLQkvKiBXYUVuYWJsZUdhcHNUc3ZDcmVkaXRGaXg6a2JsICovCi0J STkxNV9XUklURShHRU44X0dBUkJDTlRMLCAoSTkxNV9SRUFEKEdFTjhfR0FSQkNOVEwpIHwKLQkJ CQkgICBHRU45X0dBUFNfVFNWX0NSRURJVF9ESVNBQkxFKSk7Ci0KLQkvKiBXYURpc2FibGVEeW5h bWljQ3JlZGl0U2hhcmluZzprYmwgKi8KLQlpZiAoSVNfS0JMX1JFVklEKGRldl9wcml2LCAwLCBL QkxfUkVWSURfQjApKQotCQlJOTE1X1dSSVRFKEdBTVRfQ0hLTl9CSVRfUkVHLAotCQkJICAgKEk5 MTVfUkVBRChHQU1UX0NIS05fQklUX1JFRykgfAotCQkJICAgIEdBTVRfQ0hLTl9ESVNBQkxFX0RZ TkFNSUNfQ1JFRElUX1NIQVJJTkcpKTsKLQotCS8qIFdhRGlzYWJsZUZlbmNlRGVzdGluYXRpb25U b1NMTTprYmwgKHByZS1wcm9kKSAqLwotCWlmIChJU19LQkxfUkVWSUQoZGV2X3ByaXYsIEtCTF9S RVZJRF9BMCwgS0JMX1JFVklEX0EwKSkKLQkJV0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4w LAotCQkJCSAgSERDX0ZFTkNFX0RFU1RfU0xNX0RJU0FCTEUpOwotCi0JLyogV2FUb0VuYWJsZUh3 Rml4Rm9yUHVzaENvbnN0SFdCdWc6a2JsICovCi0JaWYgKElTX0tCTF9SRVZJRChkZXZfcHJpdiwg S0JMX1JFVklEX0MwLCBSRVZJRF9GT1JFVkVSKSkKLQkJV0FfU0VUX0JJVF9NQVNLRUQoQ09NTU9O X1NMSUNFX0NISUNLRU4yLAotCQkJCSAgR0VOOF9TQkVfRElTQUJMRV9SRVBMQVlfQlVGX09QVElN SVpBVElPTik7Ci0KLQkvKiBXYURpc2FibGVHYWZzVW5pdENsa0dhdGluZzprYmwgKi8KLQlJOTE1 X1dSSVRFKEdFTjdfVUNHQ1RMNCwgKEk5MTVfUkVBRChHRU43X1VDR0NUTDQpIHwKLQkJCQkgIEdF TjhfRVVfR0FVTklUX0NMT0NLX0dBVEVfRElTQUJMRSkpOwotCi0JLyogV2FEaXNhYmxlU2JlQ2Fj aGVEaXNwYXRjaFBvcnRTaGFyaW5nOmtibCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKAotCQlHRU43 X0hBTEZfU0xJQ0VfQ0hJQ0tFTjEsCi0JCUdFTjdfU0JFX1NTX0NBQ0hFX0RJU1BBVENIX1BPUlRf U0hBUklOR19ESVNBQkxFKTsKLQotCS8qIFdhSW5QbGFjZURlY29tcHJlc3Npb25IYW5nOmtibCAq LwotCUk5MTVfV1JJVEUoR0VOOV9HQU1UX0VDT19SRUdfUldfSUEsCi0JCSAgIChJOTE1X1JFQUQo R0VOOV9HQU1UX0VDT19SRUdfUldfSUEpIHwKLQkJICAgIEdBTVRfRUNPX0VOQUJMRV9JTl9QTEFD RV9ERUNPTVBSRVNTKSk7Ci0KLQkvKiBXYURpc2FibGVMU1FDUk9QRVJGZm9yT0NMOmtibCAqLwot CXJldCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUsIEdFTjhfTDNTUUNSRUc0KTsKLQlp ZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2xr X2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQlpbnQgcmV0 OwotCi0JcmV0ID0gZ2VuOV9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7Ci0JaWYgKHJldCkKLQkJ cmV0dXJuIHJldDsKLQotCS8qIFdBICMwODYyOiBVc2Vyc3BhY2UgaGFzIHRvIHNldCAiQmFycmll ciBNb2RlIiB0byBhdm9pZCBoYW5ncy4gKi8KLQlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9yZWco ZW5naW5lLCBHRU45X1NMSUNFX0NPTU1PTl9FQ09fQ0hJQ0tFTjEpOwotCWlmIChyZXQpCi0JCXJl dHVybiByZXQ7Ci0KLQkvKiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzpnbGsgKi8K LQlXQV9TRVRfQklUX01BU0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCi0JCQkgIEdFTjhfU0JF X0RJU0FCTEVfUkVQTEFZX0JVRl9PUFRJTUlaQVRJT04pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0 YXRpYyBpbnQgY2ZsX2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkx NTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ2VuOV9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7Ci0J aWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdhRW5hYmxlR2Fwc1RzdkNyZWRpdEZpeDpj ZmwgKi8KLQlJOTE1X1dSSVRFKEdFTjhfR0FSQkNOVEwsIChJOTE1X1JFQUQoR0VOOF9HQVJCQ05U TCkgfAotCQkJCSAgIEdFTjlfR0FQU19UU1ZfQ1JFRElUX0RJU0FCTEUpKTsKLQotCS8qIFdhVG9F bmFibGVId0ZpeEZvclB1c2hDb25zdEhXQnVnOmNmbCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKENP TU1PTl9TTElDRV9DSElDS0VOMiwKLQkJCSAgR0VOOF9TQkVfRElTQUJMRV9SRVBMQVlfQlVGX09Q VElNSVpBVElPTik7Ci0KLQkvKiBXYURpc2FibGVHYWZzVW5pdENsa0dhdGluZzpjZmwgKi8KLQlJ OTE1X1dSSVRFKEdFTjdfVUNHQ1RMNCwgKEk5MTVfUkVBRChHRU43X1VDR0NUTDQpIHwKLQkJCQkg IEdFTjhfRVVfR0FVTklUX0NMT0NLX0dBVEVfRElTQUJMRSkpOwotCi0JLyogV2FEaXNhYmxlU2Jl Q2FjaGVEaXNwYXRjaFBvcnRTaGFyaW5nOmNmbCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKAotCQlH RU43X0hBTEZfU0xJQ0VfQ0hJQ0tFTjEsCi0JCUdFTjdfU0JFX1NTX0NBQ0hFX0RJU1BBVENIX1BP UlRfU0hBUklOR19ESVNBQkxFKTsKLQotCS8qIFdhSW5QbGFjZURlY29tcHJlc3Npb25IYW5nOmNm bCAqLwotCUk5MTVfV1JJVEUoR0VOOV9HQU1UX0VDT19SRUdfUldfSUEsCi0JCSAgIChJOTE1X1JF QUQoR0VOOV9HQU1UX0VDT19SRUdfUldfSUEpIHwKLQkJICAgIEdBTVRfRUNPX0VOQUJMRV9JTl9Q TEFDRV9ERUNPTVBSRVNTKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGluaXRfd29ya2Fyb3Vu ZHNfcmluZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OwotCWludCBlcnI7Ci0KLQlpZiAo R0VNX1dBUk5fT04oZW5naW5lLT5pZCAhPSBSQ1MpKQotCQlyZXR1cm4gLUVJTlZBTDsKLQotCWRl dl9wcml2LT53b3JrYXJvdW5kcy5jb3VudCA9IDA7Ci0JZGV2X3ByaXYtPndvcmthcm91bmRzLmh3 X3doaXRlbGlzdF9jb3VudFtlbmdpbmUtPmlkXSA9IDA7Ci0KLQlpZiAoSVNfQlJPQURXRUxMKGRl dl9wcml2KSkKLQkJZXJyID0gYmR3X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKLQllbHNlIGlm IChJU19DSEVSUllWSUVXKGRldl9wcml2KSkKLQkJZXJyID0gY2h2X2luaXRfd29ya2Fyb3VuZHMo ZW5naW5lKTsKLQllbHNlIGlmIChJU19TS1lMQUtFKGRldl9wcml2KSkKLQkJZXJyID0gIHNrbF9p bml0X3dvcmthcm91bmRzKGVuZ2luZSk7Ci0JZWxzZSBpZiAoSVNfQlJPWFRPTihkZXZfcHJpdikp Ci0JCWVyciA9IGJ4dF9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7Ci0JZWxzZSBpZiAoSVNfS0FC WUxBS0UoZGV2X3ByaXYpKQotCQllcnIgPSBrYmxfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwot CWVsc2UgaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQotCQllcnIgPSAgZ2xrX2luaXRfd29y a2Fyb3VuZHMoZW5naW5lKTsKLQllbHNlIGlmIChJU19DT0ZGRUVMQUtFKGRldl9wcml2KSkKLQkJ ZXJyID0gY2ZsX2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKLQllbHNlIGlmIChJU19DQU5OT05M QUtFKGRldl9wcml2KSkKLQkJZXJyID0gY25sX2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKLQll bHNlCi0JCWVyciA9IDA7Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQotCURSTV9ERUJVR19E UklWRVIoIiVzOiBOdW1iZXIgb2YgY29udGV4dCBzcGVjaWZpYyB3L2E6ICVkXG4iLAotCQkJIGVu Z2luZS0+bmFtZSwgZGV2X3ByaXYtPndvcmthcm91bmRzLmNvdW50KTsKLQlyZXR1cm4gMDsKLX0K LQotaW50IGludGVsX3Jpbmdfd29ya2Fyb3VuZHNfZW1pdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3Jl cXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3QgaTkxNV93b3JrYXJvdW5kcyAqdyA9ICZyZXEtPmk5MTUt Pndvcmthcm91bmRzOwotCXUzMiAqY3M7Ci0JaW50IHJldCwgaTsKLQotCWlmICh3LT5jb3VudCA9 PSAwKQotCQlyZXR1cm4gMDsKLQotCXJldCA9IHJlcS0+ZW5naW5lLT5lbWl0X2ZsdXNoKHJlcSwg RU1JVF9CQVJSSUVSKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JY3MgPSBpbnRlbF9y aW5nX2JlZ2luKHJlcSwgKHctPmNvdW50ICogMiArIDIpKTsKLQlpZiAoSVNfRVJSKGNzKSkKLQkJ cmV0dXJuIFBUUl9FUlIoY3MpOwotCi0JKmNzKysgPSBNSV9MT0FEX1JFR0lTVEVSX0lNTSh3LT5j b3VudCk7Ci0JZm9yIChpID0gMDsgaSA8IHctPmNvdW50OyBpKyspIHsKLQkJKmNzKysgPSBpOTE1 X21taW9fcmVnX29mZnNldCh3LT5yZWdbaV0uYWRkcik7Ci0JCSpjcysrID0gdy0+cmVnW2ldLnZh bHVlOwotCX0KLQkqY3MrKyA9IE1JX05PT1A7Ci0KLQlpbnRlbF9yaW5nX2FkdmFuY2UocmVxLCBj cyk7Ci0KLQlyZXQgPSByZXEtPmVuZ2luZS0+ZW1pdF9mbHVzaChyZXEsIEVNSVRfQkFSUklFUik7 Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCiBzdGF0aWMgYm9v bCByaW5nX2lzX2lkbGUoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQogewogCXN0cnVj dCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKZGlmZiAtLWdpdCBh L2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2xyYy5jIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfbHJjLmMKaW5kZXggYzJjODM4MC4uNjJkZTYxMyAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfbHJjLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxf bHJjLmMKQEAgLTEzOSw2ICsxMzksNyBAQAogI2luY2x1ZGUgImk5MTVfZ2VtX3JlbmRlcl9zdGF0 ZS5oIgogI2luY2x1ZGUgImludGVsX2xyY19yZWcuaCIKICNpbmNsdWRlICJpbnRlbF9tb2NzLmgi CisjaW5jbHVkZSAiaW50ZWxfd29ya2Fyb3VuZHMuaCIKIAogI2RlZmluZSBSSU5HX0VYRUNMSVNU X1FGVUxMCQkoMSA8PCAweDIpCiAjZGVmaW5lIFJJTkdfRVhFQ0xJU1QxX1ZBTElECQkoMSA8PCAw eDMpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKaW5kZXggNTcxOGYzNy4u ZWM1ODBmNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZl ci5jCisrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuYwpAQCAtMzYs NiArMzYsNyBAQAogI2luY2x1ZGUgImk5MTVfZ2VtX3JlbmRlcl9zdGF0ZS5oIgogI2luY2x1ZGUg Imk5MTVfdHJhY2UuaCIKICNpbmNsdWRlICJpbnRlbF9kcnYuaCIKKyNpbmNsdWRlICJpbnRlbF93 b3JrYXJvdW5kcy5oIgogCiAvKiBSb3VnaCBlc3RpbWF0ZSBvZiB0aGUgdHlwaWNhbCByZXF1ZXN0 IHNpemUsIHBlcmZvcm1pbmcgYSBmbHVzaCwKICAqIHNldC1jb250ZXh0IGFuZCB0aGVuIGVtaXR0 aW5nIHRoZSBiYXRjaC4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Jp bmdidWZmZXIuaCBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3JpbmdidWZmZXIuaAppbmRl eCA1MTUyM2FkLi5iMjJiMmQ1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRl bF9yaW5nYnVmZmVyLmgKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZl ci5oCkBAIC04MzcsOSArODM3LDYgQEAgc3RhdGljIGlubGluZSB1MzIgaW50ZWxfZW5naW5lX2xh c3Rfc3VibWl0KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKIAlyZXR1cm4gUkVBRF9P TkNFKGVuZ2luZS0+dGltZWxpbmUtPnNlcW5vKTsKIH0KIAotaW50IGluaXRfd29ya2Fyb3VuZHNf cmluZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpOwotaW50IGludGVsX3Jpbmdfd29y a2Fyb3VuZHNfZW1pdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSk7Ci0KIHZvaWQg aW50ZWxfZW5naW5lX2dldF9pbnN0ZG9uZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUs CiAJCQkgICAgICAgc3RydWN0IGludGVsX2luc3Rkb25lICppbnN0ZG9uZSk7CiAKZGlmZiAtLWdp dCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3dvcmthcm91bmRzLmMgYi9kcml2ZXJzL2dw dS9kcm0vaTkxNS9pbnRlbF93b3JrYXJvdW5kcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4 IDAwMDAwMDAuLjU2YTExNTIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkx NS9pbnRlbF93b3JrYXJvdW5kcy5jCkBAIC0wLDAgKzEsNjQyIEBACisvKgorICogU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IE1JVAorICoKKyAqIENvcHlyaWdodCDCqSAyMDE0LTIwMTggSW50ZWwg Q29ycG9yYXRpb24KKyAqLworCisjaW5jbHVkZSAiaTkxNV9kcnYuaCIKKyNpbmNsdWRlICJpbnRl bF93b3JrYXJvdW5kcy5oIgorCitzdGF0aWMgaW50IHdhX2FkZChzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYsCisJCSAgaTkxNV9yZWdfdCBhZGRyLAorCQkgIGNvbnN0IHUzMiBtYXNr LCBjb25zdCB1MzIgdmFsKQoreworCWNvbnN0IHUzMiBpZHggPSBkZXZfcHJpdi0+d29ya2Fyb3Vu ZHMuY291bnQ7CisKKwlpZiAoV0FSTl9PTihpZHggPj0gSTkxNV9NQVhfV0FfUkVHUykpCisJCXJl dHVybiAtRU5PU1BDOworCisJZGV2X3ByaXYtPndvcmthcm91bmRzLnJlZ1tpZHhdLmFkZHIgPSBh ZGRyOworCWRldl9wcml2LT53b3JrYXJvdW5kcy5yZWdbaWR4XS52YWx1ZSA9IHZhbDsKKwlkZXZf cHJpdi0+d29ya2Fyb3VuZHMucmVnW2lkeF0ubWFzayA9IG1hc2s7CisKKwlkZXZfcHJpdi0+d29y a2Fyb3VuZHMuY291bnQrKzsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFdBX1JFRyhhZGRy LCBtYXNrLCB2YWwpIGRvIHsgXAorCQljb25zdCBpbnQgciA9IHdhX2FkZChkZXZfcHJpdiwgKGFk ZHIpLCAobWFzayksICh2YWwpKTsgXAorCQlpZiAocikgXAorCQkJcmV0dXJuIHI7IFwKKwl9IHdo aWxlICgwKQorCisjZGVmaW5lIFdBX1NFVF9CSVRfTUFTS0VEKGFkZHIsIG1hc2spIFwKKwlXQV9S RUcoYWRkciwgKG1hc2spLCBfTUFTS0VEX0JJVF9FTkFCTEUobWFzaykpCisKKyNkZWZpbmUgV0Ff Q0xSX0JJVF9NQVNLRUQoYWRkciwgbWFzaykgXAorCVdBX1JFRyhhZGRyLCAobWFzayksIF9NQVNL RURfQklUX0RJU0FCTEUobWFzaykpCisKKyNkZWZpbmUgV0FfU0VUX0ZJRUxEX01BU0tFRChhZGRy LCBtYXNrLCB2YWx1ZSkgXAorCVdBX1JFRyhhZGRyLCBtYXNrLCBfTUFTS0VEX0ZJRUxEKG1hc2ss IHZhbHVlKSkKKworc3RhdGljIGludCB3YV9yaW5nX3doaXRlbGlzdF9yZWcoc3RydWN0IGludGVs X2VuZ2luZV9jcyAqZW5naW5lLAorCQkJCSBpOTE1X3JlZ190IHJlZykKK3sKKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisJc3RydWN0IGk5MTVfd29y a2Fyb3VuZHMgKndhID0gJmRldl9wcml2LT53b3JrYXJvdW5kczsKKwljb25zdCB1aW50MzJfdCBp bmRleCA9IHdhLT5od193aGl0ZWxpc3RfY291bnRbZW5naW5lLT5pZF07CisKKwlpZiAoV0FSTl9P TihpbmRleCA+PSBSSU5HX01BWF9OT05QUklWX1NMT1RTKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisK KwlJOTE1X1dSSVRFKFJJTkdfRk9SQ0VfVE9fTk9OUFJJVihlbmdpbmUtPm1taW9fYmFzZSwgaW5k ZXgpLAorCQkgICBpOTE1X21taW9fcmVnX29mZnNldChyZWcpKTsKKwl3YS0+aHdfd2hpdGVsaXN0 X2NvdW50W2VuZ2luZS0+aWRdKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZW44 X2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0 cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKKworCVdBX1NF VF9CSVRfTUFTS0VEKElOU1RQTSwgSU5TVFBNX0ZPUkNFX09SREVSSU5HKTsKKworCS8qIFdhRGlz YWJsZUFzeW5jRmxpcFBlcmZNb2RlOmJkdyxjaHYgKi8KKwlXQV9TRVRfQklUX01BU0tFRChNSV9N T0RFLCBBU1lOQ19GTElQX1BFUkZfRElTQUJMRSk7CisKKwkvKiBXYURpc2FibGVQYXJ0aWFsSW5z dFNob290ZG93bjpiZHcsY2h2ICovCisJV0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9ST1dfQ0hJQ0tF TiwKKwkJCSAgUEFSVElBTF9JTlNUUlVDVElPTl9TSE9PVERPV05fRElTQUJMRSk7CisKKwkvKiBV c2UgRm9yY2UgTm9uLUNvaGVyZW50IHdoZW5ldmVyIGV4ZWN1dGluZyBhIDNEIGNvbnRleHQuIFRo aXMgaXMgYQorCSAqIHdvcmthcm91bmQgZm9yIGZvciBhIHBvc3NpYmxlIGhhbmcgaW4gdGhlIHVu bGlrZWx5IGV2ZW50IGEgVExCCisJICogaW52YWxpZGF0aW9uIG9jY3VycyBkdXJpbmcgYSBQU0Qg Zmx1c2guCisJICovCisJLyogV2FGb3JjZUVuYWJsZU5vbkNvaGVyZW50OmJkdyxjaHYgKi8KKwkv KiBXYUhkY0Rpc2FibGVGZXRjaFdoZW5NYXNrZWQ6YmR3LGNodiAqLworCVdBX1NFVF9CSVRfTUFT S0VEKEhEQ19DSElDS0VOMCwKKwkJCSAgSERDX0RPTk9UX0ZFVENIX01FTV9XSEVOX01BU0tFRCB8 CisJCQkgIEhEQ19GT1JDRV9OT05fQ09IRVJFTlQpOworCisJLyogRnJvbSB0aGUgSGFzd2VsbCBQ Uk0sIENvbW1hbmQgUmVmZXJlbmNlOiBSZWdpc3RlcnMsIENBQ0hFX01PREVfMDoKKwkgKiAiVGhl IEhpZXJhcmNoaWNhbCBaIFJBVyBTdGFsbCBPcHRpbWl6YXRpb24gYWxsb3dzIG5vbi1vdmVybGFw cGluZworCSAqICBwb2x5Z29ucyBpbiB0aGUgc2FtZSA4eDQgcGl4ZWwvc2FtcGxlIGFyZWEgdG8g YmUgcHJvY2Vzc2VkIHdpdGhvdXQKKwkgKiAgc3RhbGxpbmcgd2FpdGluZyBmb3IgdGhlIGVhcmxp ZXIgb25lcyB0byB3cml0ZSB0byBIaWVyYXJjaGljYWwgWgorCSAqICBidWZmZXIuIgorCSAqCisJ ICogVGhpcyBvcHRpbWl6YXRpb24gaXMgb2ZmIGJ5IGRlZmF1bHQgZm9yIEJEVyBhbmQgQ0hWOyB0 dXJuIGl0IG9uLgorCSAqLworCVdBX0NMUl9CSVRfTUFTS0VEKENBQ0hFX01PREVfMF9HRU43LCBI SVpfUkFXX1NUQUxMX09QVF9ESVNBQkxFKTsKKworCS8qIFdhNHg0U1RDT3B0aW1pemF0aW9uRGlz YWJsZTpiZHcsY2h2ICovCisJV0FfU0VUX0JJVF9NQVNLRUQoQ0FDSEVfTU9ERV8xLCBHRU44XzR4 NF9TVENfT1BUSU1JWkFUSU9OX0RJU0FCTEUpOworCisJLyoKKwkgKiBCU3BlYyByZWNvbW1lbmRz IDh4NCB3aGVuIE1TQUEgaXMgdXNlZCwKKwkgKiBob3dldmVyIGluIHByYWN0aWNlIDE2eDQgc2Vl bXMgZmFzdGVzdC4KKwkgKgorCSAqIE5vdGUgdGhhdCBQUy9XTSB0aHJlYWQgY291bnRzIGRlcGVu ZCBvbiB0aGUgV0laIGhhc2hpbmcKKwkgKiBkaXNhYmxlIGJpdCwgd2hpY2ggd2UgZG9uJ3QgdG91 Y2ggaGVyZSwgYnV0IGl0J3MgZ29vZAorCSAqIHRvIGtlZXAgaW4gbWluZCAoc2VlIDNEU1RBVEVf UFMgYW5kIDNEU1RBVEVfV00pLgorCSAqLworCVdBX1NFVF9GSUVMRF9NQVNLRUQoR0VON19HVF9N T0RFLAorCQkJICAgIEdFTjZfV0laX0hBU0hJTkdfTUFTSywKKwkJCSAgICBHRU42X1dJWl9IQVNI SU5HXzE2eDQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYmR3X2luaXRfd29ya2Fy b3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0cnVjdCBkcm1faTkx NV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKKwlpbnQgcmV0OworCisJcmV0ID0g Z2VuOF9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsK KworCS8qIFdhRGlzYWJsZVRocmVhZFN0YWxsRG9wQ2xvY2tHYXRpbmc6YmR3IChwcmUtcHJvZHVj dGlvbikgKi8KKwlXQV9TRVRfQklUX01BU0tFRChHRU44X1JPV19DSElDS0VOLCBTVEFMTF9ET1Bf R0FUSU5HX0RJU0FCTEUpOworCisJLyogV2FEaXNhYmxlRG9wQ2xvY2tHYXRpbmc6YmR3CisJICoK KwkgKiBBbHNvIHNlZSB0aGUgcmVsYXRlZCBVQ0dUQ0wxIHdyaXRlIGluIGJyb2Fkd2VsbF9pbml0 X2Nsb2NrX2dhdGluZygpCisJICogdG8gZGlzYWJsZSBFVVRDIGNsb2NrIGdhdGluZy4KKwkgKi8K KwlXQV9TRVRfQklUX01BU0tFRChHRU43X1JPV19DSElDS0VOMiwKKwkJCSAgRE9QX0NMT0NLX0dB VElOR19ESVNBQkxFKTsKKworCVdBX1NFVF9CSVRfTUFTS0VEKEhBTEZfU0xJQ0VfQ0hJQ0tFTjMs CisJCQkgIEdFTjhfU0FNUExFUl9QT1dFUl9CWVBBU1NfRElTKTsKKworCVdBX1NFVF9CSVRfTUFT S0VEKEhEQ19DSElDS0VOMCwKKwkJCSAgLyogV2FGb3JjZUNvbnRleHRTYXZlUmVzdG9yZU5vbkNv aGVyZW50OmJkdyAqLworCQkJICBIRENfRk9SQ0VfQ09OVEVYVF9TQVZFX1JFU1RPUkVfTk9OX0NP SEVSRU5UIHwKKwkJCSAgLyogV2FEaXNhYmxlRmVuY2VEZXN0aW5hdGlvblRvU0xNOmJkdyAocHJl LXByb2QpICovCisJCQkgIChJU19CRFdfR1QzKGRldl9wcml2KSA/IEhEQ19GRU5DRV9ERVNUX1NM TV9ESVNBQkxFIDogMCkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2h2X2luaXRf d29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0cnVjdCBk cm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKKwlpbnQgcmV0OworCisJ cmV0ID0gZ2VuOF9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCS8qIFdhRGlzYWJsZVRocmVhZFN0YWxsRG9wQ2xvY2tHYXRpbmc6Y2h2ICovCisJ V0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9ST1dfQ0hJQ0tFTiwgU1RBTExfRE9QX0dBVElOR19ESVNB QkxFKTsKKworCS8qIEltcHJvdmUgSGlaIHRocm91Z2hwdXQgb24gQ0hWLiAqLworCVdBX1NFVF9C SVRfTUFTS0VEKEhJWl9DSElDS0VOLCBDSFZfSFpfOFg4X01PREVfSU5fMVgpOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuOV9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9l bmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYg PSBlbmdpbmUtPmk5MTU7CisJaW50IHJldDsKKworCS8qIFdhQ29uZXh0U3dpdGNoV2l0aENvbmN1 cnJlbnRUTEJJbnZhbGlkYXRlOnNrbCxieHQsa2JsLGdsayxjZmwgKi8KKwlJOTE1X1dSSVRFKEdF TjlfQ1NGRV9DSElDS0VOMV9SQ1MsIF9NQVNLRURfQklUX0VOQUJMRShHRU45X1BSRUVNUFRfR1BH UFVfU1lOQ19TV0lUQ0hfRElTQUJMRSkpOworCisJLyogV2FFbmFibGVMYnNTbGFSZXRyeVRpbWVy RGVjcmVtZW50OnNrbCxieHQsa2JsLGdsayxjZmwgKi8KKwlJOTE1X1dSSVRFKEJEV19TQ1JBVENI MSwgSTkxNV9SRUFEKEJEV19TQ1JBVENIMSkgfAorCQkgICBHRU45X0xCU19TTEFfUkVUUllfVElN RVJfREVDUkVNRU5UX0VOQUJMRSk7CisKKwkvKiBXYURpc2FibGVLaWxsTG9naWM6Ynh0LHNrbCxr YmwgKi8KKwlpZiAoIUlTX0NPRkZFRUxBS0UoZGV2X3ByaXYpKQorCQlJOTE1X1dSSVRFKEdBTV9F Q09DSEssIEk5MTVfUkVBRChHQU1fRUNPQ0hLKSB8CisJCQkgICBFQ09DSEtfRElTX1RMQik7CisK KwlpZiAoSEFTX0xMQyhkZXZfcHJpdikpIHsKKwkJLyogV2FDb21wcmVzc2VkUmVzb3VyY2VTYW1w bGVyUGJlTWVkaWFOZXdIYXNoTW9kZTpza2wsa2JsCisJCSAqCisJCSAqIE11c3QgbWF0Y2ggRGlz cGxheSBFbmdpbmUuIFNlZQorCQkgKiBXYUNvbXByZXNzZWRSZXNvdXJjZURpc3BsYXlOZXdIYXNo TW9kZS4KKwkJICovCisJCVdBX1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElDRV9DSElDS0VOMiwK KwkJCQkgIEdFTjlfUEJFX0NPTVBSRVNTRURfSEFTSF9TRUxFQ1RJT04pOworCQlXQV9TRVRfQklU X01BU0tFRChHRU45X0hBTEZfU0xJQ0VfQ0hJQ0tFTjcsCisJCQkJICBHRU45X1NBTVBMRVJfSEFT SF9DT01QUkVTU0VEX1JFQURfQUREUik7CisKKwkJSTkxNV9XUklURShNTUNEX01JU0NfQ1RSTCwK KwkJCSAgIEk5MTVfUkVBRChNTUNEX01JU0NfQ1RSTCkgfAorCQkJICAgTU1DRF9QQ0xBIHwKKwkJ CSAgIE1NQ0RfSE9UU1BPVF9FTik7CisJfQorCisJLyogV2FDbGVhckZsb3dDb250cm9sR3BncHVD b250ZXh0U2F2ZTpza2wsYnh0LGtibCxnbGssY2ZsICovCisJLyogV2FEaXNhYmxlUGFydGlhbElu c3RTaG9vdGRvd246c2tsLGJ4dCxrYmwsZ2xrLGNmbCAqLworCVdBX1NFVF9CSVRfTUFTS0VEKEdF TjhfUk9XX0NISUNLRU4sCisJCQkgIEZMT1dfQ09OVFJPTF9FTkFCTEUgfAorCQkJICBQQVJUSUFM X0lOU1RSVUNUSU9OX1NIT09URE9XTl9ESVNBQkxFKTsKKworCS8qIFN5bmNpbmcgZGVwZW5kZW5j aWVzIGJldHdlZW4gY2FtZXJhIGFuZCBncmFwaGljczpza2wsYnh0LGtibCAqLworCWlmICghSVNf Q09GRkVFTEFLRShkZXZfcHJpdikpCisJCVdBX1NFVF9CSVRfTUFTS0VEKEhBTEZfU0xJQ0VfQ0hJ Q0tFTjMsCisJCQkJICBHRU45X0RJU0FCTEVfT0NMX09PQl9TVVBQUkVTU19MT0dJQyk7CisKKwkv KiBXYUVuYWJsZVlWMTJCdWdGaXhJbkhhbGZTbGljZUNoaWNrZW43OnNrbCxieHQsa2JsLGdsayxj ZmwgKi8KKwkvKiBXYUVuYWJsZVNhbXBsZXJHUEdQVVByZWVtcHRpb25TdXBwb3J0OnNrbCxieHQs a2JsLGNmbCAqLworCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjlfSEFMRl9TTElDRV9DSElDS0VONywK KwkJCSAgR0VOOV9FTkFCTEVfWVYxMl9CVUdGSVggfAorCQkJICBHRU45X0VOQUJMRV9HUEdQVV9Q UkVFTVBUSU9OKTsKKworCS8qIFdhNHg0U1RDT3B0aW1pemF0aW9uRGlzYWJsZTpza2wsYnh0LGti bCxnbGssY2ZsICovCisJLyogV2FEaXNhYmxlUGFydGlhbFJlc29sdmVJblZjOnNrbCxieHQsa2Js LGNmbCAqLworCVdBX1NFVF9CSVRfTUFTS0VEKENBQ0hFX01PREVfMSwgKEdFTjhfNHg0X1NUQ19P UFRJTUlaQVRJT05fRElTQUJMRSB8CisJCQkJCSBHRU45X1BBUlRJQUxfUkVTT0xWRV9JTl9WQ19E SVNBQkxFKSk7CisKKwkvKiBXYUNjc1RsYlByZWZldGNoRGlzYWJsZTpza2wsYnh0LGtibCxnbGss Y2ZsICovCisJV0FfQ0xSX0JJVF9NQVNLRUQoR0VOOV9IQUxGX1NMSUNFX0NISUNLRU41LAorCQkJ ICBHRU45X0NDU19UTEJfUFJFRkVUQ0hfRU5BQkxFKTsKKworCS8qIFdhRm9yY2VDb250ZXh0U2F2 ZVJlc3RvcmVOb25Db2hlcmVudDpza2wsYnh0LGtibCxjZmwgKi8KKwlXQV9TRVRfQklUX01BU0tF RChIRENfQ0hJQ0tFTjAsCisJCQkgIEhEQ19GT1JDRV9DT05URVhUX1NBVkVfUkVTVE9SRV9OT05f Q09IRVJFTlQgfAorCQkJICBIRENfRk9SQ0VfQ1NSX05PTl9DT0hFUkVOVF9PVlJfRElTQUJMRSk7 CisKKwkvKiBXYUZvcmNlRW5hYmxlTm9uQ29oZXJlbnQgYW5kIFdhRGlzYWJsZUhEQ0ludmFsaWRh dGlvbiBhcmUKKwkgKiBib3RoIHRpZWQgdG8gV2FGb3JjZUNvbnRleHRTYXZlUmVzdG9yZU5vbkNv aGVyZW50CisJICogaW4gc29tZSBoc2RzIGZvciBza2wuIFdlIGtlZXAgdGhlIHRpZSBmb3IgYWxs IGdlbjkuIFRoZQorCSAqIGRvY3VtZW50YXRpb24gaXMgYSBiaXQgaGF6eSBhbmQgc28gd2Ugd2Fu dCB0byBnZXQgY29tbW9uIGJlaGF2aW91ciwKKwkgKiBldmVuIHRob3VnaCB0aGVyZSBpcyBubyBj bGVhciBldmlkZW5jZSB3ZSB3b3VsZCBuZWVkIGJvdGggb24ga2JsL2J4dC4KKwkgKiBUaGlzIGFy ZWEgaGFzIGJlZW4gc291cmNlIG9mIHN5c3RlbSBoYW5ncyBzbyB3ZSBwbGF5IGl0IHNhZmUKKwkg KiBhbmQgbWltaWMgdGhlIHNrbCByZWdhcmRsZXNzIG9mIHdoYXQgYnNwZWMgc2F5cy4KKwkgKgor CSAqIFVzZSBGb3JjZSBOb24tQ29oZXJlbnQgd2hlbmV2ZXIgZXhlY3V0aW5nIGEgM0QgY29udGV4 dC4gVGhpcworCSAqIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBwb3NzaWJsZSBoYW5nIGluIHRoZSB1 bmxpa2VseSBldmVudAorCSAqIGEgVExCIGludmFsaWRhdGlvbiBvY2N1cnMgZHVyaW5nIGEgUFNE IGZsdXNoLgorCSAqLworCisJLyogV2FGb3JjZUVuYWJsZU5vbkNvaGVyZW50OnNrbCxieHQsa2Js LGNmbCAqLworCVdBX1NFVF9CSVRfTUFTS0VEKEhEQ19DSElDS0VOMCwKKwkJCSAgSERDX0ZPUkNF X05PTl9DT0hFUkVOVCk7CisKKwkvKiBXYURpc2FibGVIRENJbnZhbGlkYXRpb246c2tsLGJ4dCxr YmwsY2ZsICovCisJSTkxNV9XUklURShHQU1fRUNPQ0hLLCBJOTE1X1JFQUQoR0FNX0VDT0NISykg fAorCQkgICBCRFdfRElTQUJMRV9IRENfSU5WQUxJREFUSU9OKTsKKworCS8qIFdhRGlzYWJsZVNh bXBsZXJQb3dlckJ5cGFzc0ZvclNPUGluZ1Bvbmc6c2tsLGJ4dCxrYmwsY2ZsICovCisJaWYgKElT X1NLWUxBS0UoZGV2X3ByaXYpIHx8CisJICAgIElTX0tBQllMQUtFKGRldl9wcml2KSB8fAorCSAg ICBJU19DT0ZGRUVMQUtFKGRldl9wcml2KSkKKwkJV0FfU0VUX0JJVF9NQVNLRUQoSEFMRl9TTElD RV9DSElDS0VOMywKKwkJCQkgIEdFTjhfU0FNUExFUl9QT1dFUl9CWVBBU1NfRElTKTsKKworCS8q IFdhRGlzYWJsZVNUVW5pdFBvd2VyT3B0aW1pemF0aW9uOnNrbCxieHQsa2JsLGdsayxjZmwgKi8K KwlXQV9TRVRfQklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4yLCBHRU44X1NUX1BPX0RJU0FC TEUpOworCisJLyogV2FQcm9ncmFtTDNTcWNSZWcxRGVmYXVsdEZvclBlcmY6Ynh0LGdsayAqLwor CWlmIChJU19HRU45X0xQKGRldl9wcml2KSkgeworCQl1MzIgdmFsID0gSTkxNV9SRUFEKEdFTjhf TDNTUUNSRUcxKTsKKworCQl2YWwgJj0gfkwzX1BSSU9fQ1JFRElUU19NQVNLOworCQl2YWwgfD0g TDNfR0VORVJBTF9QUklPX0NSRURJVFMoNjIpIHwgTDNfSElHSF9QUklPX0NSRURJVFMoMik7CisJ CUk5MTVfV1JJVEUoR0VOOF9MM1NRQ1JFRzEsIHZhbCk7CisJfQorCisJLyogV2FPQ0xDb2hlcmVu dExpbmVGbHVzaDpza2wsYnh0LGtibCxjZmwgKi8KKwlJOTE1X1dSSVRFKEdFTjhfTDNTUUNSRUc0 LCAoSTkxNV9SRUFEKEdFTjhfTDNTUUNSRUc0KSB8CisJCQkJICAgIEdFTjhfTFFTQ19GTFVTSF9D T0hFUkVOVF9MSU5FUykpOworCisJLyoKKwkgKiBTdXBwb3J0aW5nIHByZWVtcHRpb24gd2l0aCBm aW5lLWdyYW51bGFyaXR5IHJlcXVpcmVzIGNoYW5nZXMgaW4gdGhlCisJICogYmF0Y2ggYnVmZmVy IHByb2dyYW1taW5nLiBTaW5jZSB3ZSBjYW4ndCBicmVhayBvbGQgdXNlcnNwYWNlLCB3ZQorCSAq IG5lZWQgdG8gc2V0IG91ciBkZWZhdWx0IHByZWVtcHRpb24gbGV2ZWwgdG8gc2FmZSB2YWx1ZS4g VXNlcnNwYWNlIGlzCisJICogc3RpbGwgYWJsZSB0byB1c2UgbW9yZSBmaW5lLWdyYWluZWQgcHJl ZW1wdGlvbiBsZXZlbHMsIHNpbmNlIGluCisJICogV2FFbmFibGVQcmVlbXB0aW9uR3JhbnVsYXJp dHlDb250cm9sQnlVTUQgd2UncmUgd2hpdGVsaXN0aW5nIHRoZQorCSAqIHBlci1jdHggcmVnaXN0 ZXIuIEFzIHN1Y2gsIFdhRGlzYWJsZXszRCxHUEdQVX1NaWRDbWRQcmVlbXB0aW9uIGFyZQorCSAq IG5vdCByZWFsIEhXIHdvcmthcm91bmRzLCBidXQgbWVyZWx5IGEgd2F5IHRvIHN0YXJ0IHVzaW5n IHByZWVtcHRpb24KKwkgKiB3aGlsZSBtYWludGFpbmluZyBvbGQgY29udHJhY3Qgd2l0aCB1c2Vy c3BhY2UuCisJICovCisKKwkvKiBXYURpc2FibGUzRE1pZENtZFByZWVtcHRpb246c2tsLGJ4dCxn bGssY2ZsLFtjbmxdICovCisJV0FfQ0xSX0JJVF9NQVNLRUQoR0VOOF9DU19DSElDS0VOMSwgR0VO OV9QUkVFTVBUXzNEX09CSkVDVF9MRVZFTCk7CisKKwkvKiBXYURpc2FibGVHUEdQVU1pZENtZFBy ZWVtcHRpb246c2tsLGJ4dCxibGssY2ZsLFtjbmxdICovCisJV0FfU0VUX0ZJRUxEX01BU0tFRChH RU44X0NTX0NISUNLRU4xLCBHRU45X1BSRUVNUFRfR1BHUFVfTEVWRUxfTUFTSywKKwkJCSAgICBH RU45X1BSRUVNUFRfR1BHUFVfQ09NTUFORF9MRVZFTCk7CisKKwkvKiBXYVZGRVN0YXRlQWZ0ZXJQ aXBlQ29udHJvbHdpdGhNZWRpYVN0YXRlQ2xlYXI6c2tsLGJ4dCxnbGssY2ZsICovCisJcmV0ID0g d2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOV9DVFhfUFJFRU1QVF9SRUcpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBXYUVuYWJsZVByZWVtcHRpb25HcmFudWxhcml0 eUNvbnRyb2xCeVVNRDpza2wsYnh0LGtibCxjZmwsW2NubF0gKi8KKwlJOTE1X1dSSVRFKEdFTjdf RkZfU0xJQ0VfQ1NfQ0hJQ0tFTjEsCisJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRU45X0ZGU0Nf UEVSQ1RYX1BSRUVNUFRfQ1RSTCkpOworCXJldCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdp bmUsIEdFTjhfQ1NfQ0hJQ0tFTjEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBX YUFsbG93VU1EVG9Nb2RpZnlIRENDaGlja2VuMTpza2wsYnh0LGtibCxnbGssY2ZsICovCisJcmV0 ID0gd2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOF9IRENfQ0hJQ0tFTjEpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBza2xf dHVuZV9pel9oYXNoaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisJdTggdmFsc1sz XSA9IHsgMCwgMCwgMCB9OworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IDM7 IGkrKykgeworCQl1OCBzczsKKworCQkvKgorCQkgKiBPbmx5IGNvbnNpZGVyIHNsaWNlcyB3aGVy ZSBvbmUsIGFuZCBvbmx5IG9uZSwgc3Vic2xpY2UgaGFzIDcKKwkJICogRVVzCisJCSAqLworCQlp ZiAoIWlzX3Bvd2VyX29mXzIoSU5URUxfSU5GTyhkZXZfcHJpdiktPnNzZXUuc3Vic2xpY2VfN2V1 W2ldKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIHN1YnNsaWNlXzdldVtpXSAhPSAwIChi ZWNhdXNlIG9mIHRoZSBjaGVjayBhYm92ZSkgYW5kCisJCSAqIHNzX21heCA9PSA0IChtYXhpbXVt IG51bWJlciBvZiBzdWJzbGljZXMgcG9zc2libGUgcGVyIHNsaWNlKQorCQkgKgorCQkgKiAtPiAg ICAwIDw9IHNzIDw9IDM7CisJCSAqLworCQlzcyA9IGZmcyhJTlRFTF9JTkZPKGRldl9wcml2KS0+ c3NldS5zdWJzbGljZV83ZXVbaV0pIC0gMTsKKwkJdmFsc1tpXSA9IDMgLSBzczsKKwl9CisKKwlp ZiAodmFsc1swXSA9PSAwICYmIHZhbHNbMV0gPT0gMCAmJiB2YWxzWzJdID09IDApCisJCXJldHVy biAwOworCisJLyogVHVuZSBJWiBoYXNoaW5nLiBTZWUgaW50ZWxfZGV2aWNlX2luZm9fcnVudGlt ZV9pbml0KCkgKi8KKwlXQV9TRVRfRklFTERfTUFTS0VEKEdFTjdfR1RfTU9ERSwKKwkJCSAgICBH RU45X0laX0hBU0hJTkdfTUFTSygyKSB8CisJCQkgICAgR0VOOV9JWl9IQVNISU5HX01BU0soMSkg fAorCQkJICAgIEdFTjlfSVpfSEFTSElOR19NQVNLKDApLAorCQkJICAgIEdFTjlfSVpfSEFTSElO RygyLCB2YWxzWzJdKSB8CisJCQkgICAgR0VOOV9JWl9IQVNISU5HKDEsIHZhbHNbMV0pIHwKKwkJ CSAgICBHRU45X0laX0hBU0hJTkcoMCwgdmFsc1swXSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgc2tsX2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkx NTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2VuOV9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdhRW5hYmxlR2Fwc1RzdkNyZWRpdEZpeDpz a2wgKi8KKwlJOTE1X1dSSVRFKEdFTjhfR0FSQkNOVEwsIChJOTE1X1JFQUQoR0VOOF9HQVJCQ05U TCkgfAorCQkJCSAgIEdFTjlfR0FQU19UU1ZfQ1JFRElUX0RJU0FCTEUpKTsKKworCS8qIFdhRGlz YWJsZUdhZnNVbml0Q2xrR2F0aW5nOnNrbCAqLworCUk5MTVfV1JJVEUoR0VON19VQ0dDVEw0LCAo STkxNV9SRUFEKEdFTjdfVUNHQ1RMNCkgfAorCQkJCSAgR0VOOF9FVV9HQVVOSVRfQ0xPQ0tfR0FU RV9ESVNBQkxFKSk7CisKKwkvKiBXYUluUGxhY2VEZWNvbXByZXNzaW9uSGFuZzpza2wgKi8KKwlp ZiAoSVNfU0tMX1JFVklEKGRldl9wcml2LCBTS0xfUkVWSURfSDAsIFJFVklEX0ZPUkVWRVIpKQor CQlJOTE1X1dSSVRFKEdFTjlfR0FNVF9FQ09fUkVHX1JXX0lBLAorCQkJICAgKEk5MTVfUkVBRChH RU45X0dBTVRfRUNPX1JFR19SV19JQSkgfAorCQkJICAgIEdBTVRfRUNPX0VOQUJMRV9JTl9QTEFD RV9ERUNPTVBSRVNTKSk7CisKKwkvKiBXYURpc2FibGVMU1FDUk9QRVJGZm9yT0NMOnNrbCAqLwor CXJldCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUsIEdFTjhfTDNTUUNSRUc0KTsKKwlp ZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIHNrbF90dW5lX2l6X2hhc2hpbmcoZW5n aW5lKTsKK30KKworc3RhdGljIGludCBieHRfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxf ZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gZW5naW5lLT5pOTE1OworCWludCByZXQ7CisKKwlyZXQgPSBnZW45X2luaXRfd29ya2Fyb3Vu ZHMoZW5naW5lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FEaXNhYmxlVGhy ZWFkU3RhbGxEb3BDbG9ja0dhdGluZzpieHQgKi8KKwlXQV9TRVRfQklUX01BU0tFRChHRU44X1JP V19DSElDS0VOLAorCQkJICBTVEFMTF9ET1BfR0FUSU5HX0RJU0FCTEUpOworCisJLyogV2FEaXNh YmxlUG9vbGVkRXVMb2FkQmFsYW5jaW5nRml4OmJ4dCAqLworCUk5MTVfV1JJVEUoRkZfU0xJQ0Vf Q1NfQ0hJQ0tFTjIsCisJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRU45X1BPT0xFRF9FVV9MT0FE X0JBTEFOQ0lOR19GSVhfRElTQUJMRSkpOworCisJLyogV2FUb0VuYWJsZUh3Rml4Rm9yUHVzaENv bnN0SFdCdWc6Ynh0ICovCisJV0FfU0VUX0JJVF9NQVNLRUQoQ09NTU9OX1NMSUNFX0NISUNLRU4y LAorCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9CVUZfT1BUSU1JWkFUSU9OKTsKKworCS8q IFdhSW5QbGFjZURlY29tcHJlc3Npb25IYW5nOmJ4dCAqLworCUk5MTVfV1JJVEUoR0VOOV9HQU1U X0VDT19SRUdfUldfSUEsCisJCSAgIChJOTE1X1JFQUQoR0VOOV9HQU1UX0VDT19SRUdfUldfSUEp IHwKKwkJICAgIEdBTVRfRUNPX0VOQUJMRV9JTl9QTEFDRV9ERUNPTVBSRVNTKSk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBjbmxfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxf ZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gZW5naW5lLT5pOTE1OworCWludCByZXQ7CisKKwkvKiBXYURpc2FibGVJMm1DeWNsZU9uV1JQ b3J0OmNubCAocHJlLXByb2QpICovCisJaWYgKElTX0NOTF9SRVZJRChkZXZfcHJpdiwgQ05MX1JF VklEX0IwLCBDTkxfUkVWSURfQjApKQorCQlJOTE1X1dSSVRFKEdBTVRfQ0hLTl9CSVRfUkVHLAor CQkJICAgKEk5MTVfUkVBRChHQU1UX0NIS05fQklUX1JFRykgfAorCQkJICAgIEdBTVRfQ0hLTl9E SVNBQkxFX0kyTV9DWUNMRV9PTl9XUl9QT1JUKSk7CisKKwkvKiBXYUZvcmNlQ29udGV4dFNhdmVS ZXN0b3JlTm9uQ29oZXJlbnQ6Y25sICovCisJV0FfU0VUX0JJVF9NQVNLRUQoQ05MX0hEQ19DSElD S0VOMCwKKwkJCSAgSERDX0ZPUkNFX0NPTlRFWFRfU0FWRV9SRVNUT1JFX05PTl9DT0hFUkVOVCk7 CisKKwkvKiBXYVRocm90dGxlRVVQZXJmVG9Bdm9pZFREQmFja1ByZXNzdXJlOmNubChwcmUtcHJv ZCkgKi8KKwlpZiAoSVNfQ05MX1JFVklEKGRldl9wcml2LCBDTkxfUkVWSURfQjAsIENOTF9SRVZJ RF9CMCkpCisJCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjhfUk9XX0NISUNLRU4sIFRIUk9UVExFXzEy XzUpOworCisJLyogV2FEaXNhYmxlUmVwbGF5QnVmZmVyQmFua0FyYml0cmF0aW9uT3B0aW1pemF0 aW9uOmNubCAqLworCVdBX1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElDRV9DSElDS0VOMiwKKwkJ CSAgR0VOOF9TQkVfRElTQUJMRV9SRVBMQVlfQlVGX09QVElNSVpBVElPTik7CisKKwkvKiBXYURp c2FibGVFbmhhbmNlZFNCRVZlcnRleENhY2hpbmc6Y25sIChwcmUtcHJvZCkgKi8KKwlpZiAoSVNf Q05MX1JFVklEKGRldl9wcml2LCAwLCBDTkxfUkVWSURfQjApKQorCQlXQV9TRVRfQklUX01BU0tF RChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCisJCQkJICBHRU44X0NTQzJfU0JFX1ZVRV9DQUNIRV9D T05TRVJWQVRJVkUpOworCisJLyogV2FJblBsYWNlRGVjb21wcmVzc2lvbkhhbmc6Y25sICovCisJ STkxNV9XUklURShHRU45X0dBTVRfRUNPX1JFR19SV19JQSwKKwkJICAgKEk5MTVfUkVBRChHRU45 X0dBTVRfRUNPX1JFR19SV19JQSkgfAorCQkgICAgR0FNVF9FQ09fRU5BQkxFX0lOX1BMQUNFX0RF Q09NUFJFU1MpKTsKKworCS8qIFdhUHVzaENvbnN0YW50RGVyZWZlcmVuY2VIb2xkRGlzYWJsZTpj bmwgKi8KKwlXQV9TRVRfQklUX01BU0tFRChHRU43X1JPV19DSElDS0VOMiwgUFVTSF9DT05TVEFO VF9ERVJFRl9ESVNBQkxFKTsKKworCS8qIEZ0ckVuYWJsZUZhc3RBbmlzb0wxQmFua2luZ0ZpeDog Y25sICovCisJV0FfU0VUX0JJVF9NQVNLRUQoSEFMRl9TTElDRV9DSElDS0VOMywgQ05MX0ZBU1Rf QU5JU09fTDFfQkFOS0lOR19GSVgpOworCisJLyogV2FEaXNhYmxlM0RNaWRDbWRQcmVlbXB0aW9u OmNubCAqLworCVdBX0NMUl9CSVRfTUFTS0VEKEdFTjhfQ1NfQ0hJQ0tFTjEsIEdFTjlfUFJFRU1Q VF8zRF9PQkpFQ1RfTEVWRUwpOworCisJLyogV2FEaXNhYmxlR1BHUFVNaWRDbWRQcmVlbXB0aW9u OmNubCAqLworCVdBX1NFVF9GSUVMRF9NQVNLRUQoR0VOOF9DU19DSElDS0VOMSwgR0VOOV9QUkVF TVBUX0dQR1BVX0xFVkVMX01BU0ssCisJCQkgICAgR0VOOV9QUkVFTVBUX0dQR1BVX0NPTU1BTkRf TEVWRUwpOworCisJLyogV2FFbmFibGVQcmVlbXB0aW9uR3JhbnVsYXJpdHlDb250cm9sQnlVTUQ6 Y25sICovCisJSTkxNV9XUklURShHRU43X0ZGX1NMSUNFX0NTX0NISUNLRU4xLAorCQkgICBfTUFT S0VEX0JJVF9FTkFCTEUoR0VOOV9GRlNDX1BFUkNUWF9QUkVFTVBUX0NUUkwpKTsKKwlyZXQ9IHdh X3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUsIEdFTjhfQ1NfQ0hJQ0tFTjEpOworCWlmIChyZXQp CisJCXJldHVybiByZXQ7CisKKwkvKiBXYURpc2FibGVFYXJseUVPVDpjbmwgKi8KKwlXQV9TRVRf QklUX01BU0tFRChHRU44X1JPV19DSElDS0VOLCBESVNBQkxFX0VBUkxZX0VPVCk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBrYmxfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxf ZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2 ID0gZW5naW5lLT5pOTE1OworCWludCByZXQ7CisKKwlyZXQgPSBnZW45X2luaXRfd29ya2Fyb3Vu ZHMoZW5naW5lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FFbmFibGVHYXBz VHN2Q3JlZGl0Rml4OmtibCAqLworCUk5MTVfV1JJVEUoR0VOOF9HQVJCQ05UTCwgKEk5MTVfUkVB RChHRU44X0dBUkJDTlRMKSB8CisJCQkJICAgR0VOOV9HQVBTX1RTVl9DUkVESVRfRElTQUJMRSkp OworCisJLyogV2FEaXNhYmxlRHluYW1pY0NyZWRpdFNoYXJpbmc6a2JsICovCisJaWYgKElTX0tC TF9SRVZJRChkZXZfcHJpdiwgMCwgS0JMX1JFVklEX0IwKSkKKwkJSTkxNV9XUklURShHQU1UX0NI S05fQklUX1JFRywKKwkJCSAgIChJOTE1X1JFQUQoR0FNVF9DSEtOX0JJVF9SRUcpIHwKKwkJCSAg ICBHQU1UX0NIS05fRElTQUJMRV9EWU5BTUlDX0NSRURJVF9TSEFSSU5HKSk7CisKKwkvKiBXYURp c2FibGVGZW5jZURlc3RpbmF0aW9uVG9TTE06a2JsIChwcmUtcHJvZCkgKi8KKwlpZiAoSVNfS0JM X1JFVklEKGRldl9wcml2LCBLQkxfUkVWSURfQTAsIEtCTF9SRVZJRF9BMCkpCisJCVdBX1NFVF9C SVRfTUFTS0VEKEhEQ19DSElDS0VOMCwKKwkJCQkgIEhEQ19GRU5DRV9ERVNUX1NMTV9ESVNBQkxF KTsKKworCS8qIFdhVG9FbmFibGVId0ZpeEZvclB1c2hDb25zdEhXQnVnOmtibCAqLworCWlmIChJ U19LQkxfUkVWSUQoZGV2X3ByaXYsIEtCTF9SRVZJRF9DMCwgUkVWSURfRk9SRVZFUikpCisJCVdB X1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElDRV9DSElDS0VOMiwKKwkJCQkgIEdFTjhfU0JFX0RJ U0FCTEVfUkVQTEFZX0JVRl9PUFRJTUlaQVRJT04pOworCisJLyogV2FEaXNhYmxlR2Fmc1VuaXRD bGtHYXRpbmc6a2JsICovCisJSTkxNV9XUklURShHRU43X1VDR0NUTDQsIChJOTE1X1JFQUQoR0VO N19VQ0dDVEw0KSB8CisJCQkJICBHRU44X0VVX0dBVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpKTsK KworCS8qIFdhRGlzYWJsZVNiZUNhY2hlRGlzcGF0Y2hQb3J0U2hhcmluZzprYmwgKi8KKwlXQV9T RVRfQklUX01BU0tFRCgKKwkJR0VON19IQUxGX1NMSUNFX0NISUNLRU4xLAorCQlHRU43X1NCRV9T U19DQUNIRV9ESVNQQVRDSF9QT1JUX1NIQVJJTkdfRElTQUJMRSk7CisKKwkvKiBXYUluUGxhY2VE ZWNvbXByZXNzaW9uSGFuZzprYmwgKi8KKwlJOTE1X1dSSVRFKEdFTjlfR0FNVF9FQ09fUkVHX1JX X0lBLAorCQkgICAoSTkxNV9SRUFEKEdFTjlfR0FNVF9FQ09fUkVHX1JXX0lBKSB8CisJCSAgICBH QU1UX0VDT19FTkFCTEVfSU5fUExBQ0VfREVDT01QUkVTUykpOworCisJLyogV2FEaXNhYmxlTFNR Q1JPUEVSRmZvck9DTDprYmwgKi8KKwlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9yZWcoZW5naW5l LCBHRU44X0wzU1FDUkVHNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGdsa19pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBl bmdpbmUtPmk5MTU7CisJaW50IHJldDsKKworCXJldCA9IGdlbjlfaW5pdF93b3JrYXJvdW5kcyhl bmdpbmUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBXQSAjMDg2MjogVXNlcnNw YWNlIGhhcyB0byBzZXQgIkJhcnJpZXIgTW9kZSIgdG8gYXZvaWQgaGFuZ3MuICovCisJcmV0ID0g d2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOV9TTElDRV9DT01NT05fRUNPX0NISUNL RU4xKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FUb0VuYWJsZUh3Rml4Rm9y UHVzaENvbnN0SFdCdWc6Z2xrICovCisJV0FfU0VUX0JJVF9NQVNLRUQoQ09NTU9OX1NMSUNFX0NI SUNLRU4yLAorCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9CVUZfT1BUSU1JWkFUSU9OKTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNmbF9pbml0X3dvcmthcm91bmRzKHN0cnVj dCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisJaW50IHJldDsKKworCXJldCA9IGdlbjlfaW5pdF93 b3JrYXJvdW5kcyhlbmdpbmUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBXYUVu YWJsZUdhcHNUc3ZDcmVkaXRGaXg6Y2ZsICovCisJSTkxNV9XUklURShHRU44X0dBUkJDTlRMLCAo STkxNV9SRUFEKEdFTjhfR0FSQkNOVEwpIHwKKwkJCQkgICBHRU45X0dBUFNfVFNWX0NSRURJVF9E SVNBQkxFKSk7CisKKwkvKiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzpjZmwgKi8K KwlXQV9TRVRfQklUX01BU0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCisJCQkgIEdFTjhfU0JF X0RJU0FCTEVfUkVQTEFZX0JVRl9PUFRJTUlaQVRJT04pOworCisJLyogV2FEaXNhYmxlR2Fmc1Vu aXRDbGtHYXRpbmc6Y2ZsICovCisJSTkxNV9XUklURShHRU43X1VDR0NUTDQsIChJOTE1X1JFQUQo R0VON19VQ0dDVEw0KSB8CisJCQkJICBHRU44X0VVX0dBVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUp KTsKKworCS8qIFdhRGlzYWJsZVNiZUNhY2hlRGlzcGF0Y2hQb3J0U2hhcmluZzpjZmwgKi8KKwlX QV9TRVRfQklUX01BU0tFRCgKKwkJR0VON19IQUxGX1NMSUNFX0NISUNLRU4xLAorCQlHRU43X1NC RV9TU19DQUNIRV9ESVNQQVRDSF9QT1JUX1NIQVJJTkdfRElTQUJMRSk7CisKKwkvKiBXYUluUGxh Y2VEZWNvbXByZXNzaW9uSGFuZzpjZmwgKi8KKwlJOTE1X1dSSVRFKEdFTjlfR0FNVF9FQ09fUkVH X1JXX0lBLAorCQkgICAoSTkxNV9SRUFEKEdFTjlfR0FNVF9FQ09fUkVHX1JXX0lBKSB8CisJCSAg ICBHQU1UX0VDT19FTkFCTEVfSU5fUExBQ0VfREVDT01QUkVTUykpOworCisJcmV0dXJuIDA7Cit9 CisKK2ludCBpbml0X3dvcmthcm91bmRzX3Jpbmcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkx NTsKKwlpbnQgZXJyOworCisJaWYgKEdFTV9XQVJOX09OKGVuZ2luZS0+aWQgIT0gUkNTKSkKKwkJ cmV0dXJuIC1FSU5WQUw7CisKKwlkZXZfcHJpdi0+d29ya2Fyb3VuZHMuY291bnQgPSAwOworCWRl dl9wcml2LT53b3JrYXJvdW5kcy5od193aGl0ZWxpc3RfY291bnRbZW5naW5lLT5pZF0gPSAwOwor CisJaWYgKElTX0JST0FEV0VMTChkZXZfcHJpdikpCisJCWVyciA9IGJkd19pbml0X3dvcmthcm91 bmRzKGVuZ2luZSk7CisJZWxzZSBpZiAoSVNfQ0hFUlJZVklFVyhkZXZfcHJpdikpCisJCWVyciA9 IGNodl9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisJZWxzZSBpZiAoSVNfU0tZTEFLRShkZXZf cHJpdikpCisJCWVyciA9ICBza2xfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOworCWVsc2UgaWYg KElTX0JST1hUT04oZGV2X3ByaXYpKQorCQllcnIgPSBieHRfaW5pdF93b3JrYXJvdW5kcyhlbmdp bmUpOworCWVsc2UgaWYgKElTX0tBQllMQUtFKGRldl9wcml2KSkKKwkJZXJyID0ga2JsX2luaXRf d29ya2Fyb3VuZHMoZW5naW5lKTsKKwllbHNlIGlmIChJU19HRU1JTklMQUtFKGRldl9wcml2KSkK KwkJZXJyID0gIGdsa19pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisJZWxzZSBpZiAoSVNfQ09G RkVFTEFLRShkZXZfcHJpdikpCisJCWVyciA9IGNmbF9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7 CisJZWxzZSBpZiAoSVNfQ0FOTk9OTEFLRShkZXZfcHJpdikpCisJCWVyciA9IGNubF9pbml0X3dv cmthcm91bmRzKGVuZ2luZSk7CisJZWxzZQorCQllcnIgPSAwOworCWlmIChlcnIpCisJCXJldHVy biBlcnI7CisKKwlEUk1fREVCVUdfRFJJVkVSKCIlczogTnVtYmVyIG9mIGNvbnRleHQgc3BlY2lm aWMgdy9hOiAlZFxuIiwKKwkJCSBlbmdpbmUtPm5hbWUsIGRldl9wcml2LT53b3JrYXJvdW5kcy5j b3VudCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBpbnRlbF9yaW5nX3dvcmthcm91bmRzX2VtaXQo c3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IGk5MTVfd29ya2Fy b3VuZHMgKncgPSAmcmVxLT5pOTE1LT53b3JrYXJvdW5kczsKKwl1MzIgKmNzOworCWludCByZXQs IGk7CisKKwlpZiAody0+Y291bnQgPT0gMCkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSByZXEtPmVu Z2luZS0+ZW1pdF9mbHVzaChyZXEsIEVNSVRfQkFSUklFUik7CisJaWYgKHJldCkKKwkJcmV0dXJu IHJldDsKKworCWNzID0gaW50ZWxfcmluZ19iZWdpbihyZXEsICh3LT5jb3VudCAqIDIgKyAyKSk7 CisJaWYgKElTX0VSUihjcykpCisJCXJldHVybiBQVFJfRVJSKGNzKTsKKworCSpjcysrID0gTUlf TE9BRF9SRUdJU1RFUl9JTU0ody0+Y291bnQpOworCWZvciAoaSA9IDA7IGkgPCB3LT5jb3VudDsg aSsrKSB7CisJCSpjcysrID0gaTkxNV9tbWlvX3JlZ19vZmZzZXQody0+cmVnW2ldLmFkZHIpOwor CQkqY3MrKyA9IHctPnJlZ1tpXS52YWx1ZTsKKwl9CisJKmNzKysgPSBNSV9OT09QOworCisJaW50 ZWxfcmluZ19hZHZhbmNlKHJlcSwgY3MpOworCisJcmV0ID0gcmVxLT5lbmdpbmUtPmVtaXRfZmx1 c2gocmVxLCBFTUlUX0JBUlJJRVIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1 cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3dvcmthcm91 bmRzLmggYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF93b3JrYXJvdW5kcy5oCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ODExNjUKLS0tIC9kZXYvbnVsbAorKysgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF93b3JrYXJvdW5kcy5oCkBAIC0wLDAgKzEsMTMgQEAK Ky8qCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUCisgKgorICogQ29weXJpZ2h0IMKp IDIwMTQtMjAxOCBJbnRlbCBDb3Jwb3JhdGlvbgorICovCisKKyNpZm5kZWYgX0k5MTVfV09SS0FS T1VORFNfSF8KKyNkZWZpbmUgX0k5MTVfV09SS0FST1VORFNfSF8KKworaW50IGluaXRfd29ya2Fy b3VuZHNfcmluZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpOworaW50IGludGVsX3Jp bmdfd29ya2Fyb3VuZHNfZW1pdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSk7CisK KyNlbmRpZgotLSAKMS45LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCkludGVsLWdmeCBtYWlsaW5nIGxpc3QKSW50ZWwtZ2Z4QGxpc3RzLmZyZWVkZXNr dG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2lu dGVsLWdmeAo=