From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH 2/3] drm/i915: Move common workaround code to intel_engine_cs Date: Wed, 15 Feb 2017 15:54:56 +0000 Message-ID: <20170215155456.7550-1-tvrtko.ursulin@linux.intel.com> References: <20170215141827.GD18048@nuc-i3427.alporthouse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wm0-x244.google.com (mail-wm0-x244.google.com [IPv6:2a00:1450:400c:c09::244]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3FF0B6E970 for ; Wed, 15 Feb 2017 15:55:10 +0000 (UTC) Received: by mail-wm0-x244.google.com with SMTP id c85so8895189wmi.1 for ; Wed, 15 Feb 2017 07:55:10 -0800 (PST) In-Reply-To: <20170215141827.GD18048@nuc-i3427.alporthouse.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 RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KCkl0IGlzIHVz ZWQgYnkgYWxsIHN1Ym1pc3Npb24gYmFja2VuZHMuCgpTaWduZWQtb2ZmLWJ5OiBUdnJ0a28gVXJz dWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgotLS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1 L2ludGVsX2VuZ2luZV9jcy5jICB8IDU1MCArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmluZ2J1ZmZlci5jIHwgNTUwIC0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAyIGZpbGVzIGNoYW5nZWQsIDU1MCBpbnNlcnRpb25z KCspLCA1NTAgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZW5naW5lX2NzLmMgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9lbmdpbmVfY3Mu YwppbmRleCA1MzhkODQ1ZDcyNTEuLmY3ZjZkY2ZlYTdiMCAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2k5MTUvaW50ZWxfZW5naW5lX2NzLmMKKysrIGIvZHJpdmVycy9ncHUvZHJtL2k5MTUv aW50ZWxfZW5naW5lX2NzLmMKQEAgLTUyNSw2ICs1MjUsNTU2IEBAIHZvaWQgaW50ZWxfZW5naW5l X2dldF9pbnN0ZG9uZShzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCiAJfQogfQogCitz dGF0aWMgaW50IHdhX2FkZChzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAg aTkxNV9yZWdfdCBhZGRyLAorCQkgIGNvbnN0IHUzMiBtYXNrLCBjb25zdCB1MzIgdmFsKQorewor CWNvbnN0IHUzMiBpZHggPSBkZXZfcHJpdi0+d29ya2Fyb3VuZHMuY291bnQ7CisKKwlpZiAoV0FS Tl9PTihpZHggPj0gSTkxNV9NQVhfV0FfUkVHUykpCisJCXJldHVybiAtRU5PU1BDOworCisJZGV2 X3ByaXYtPndvcmthcm91bmRzLnJlZ1tpZHhdLmFkZHIgPSBhZGRyOworCWRldl9wcml2LT53b3Jr YXJvdW5kcy5yZWdbaWR4XS52YWx1ZSA9IHZhbDsKKwlkZXZfcHJpdi0+d29ya2Fyb3VuZHMucmVn W2lkeF0ubWFzayA9IG1hc2s7CisKKwlkZXZfcHJpdi0+d29ya2Fyb3VuZHMuY291bnQrKzsKKwor CXJldHVybiAwOworfQorCisjZGVmaW5lIFdBX1JFRyhhZGRyLCBtYXNrLCB2YWwpIGRvIHsgXAor CQljb25zdCBpbnQgciA9IHdhX2FkZChkZXZfcHJpdiwgKGFkZHIpLCAobWFzayksICh2YWwpKTsg XAorCQlpZiAocikgXAorCQkJcmV0dXJuIHI7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIFdB X1NFVF9CSVRfTUFTS0VEKGFkZHIsIG1hc2spIFwKKwlXQV9SRUcoYWRkciwgKG1hc2spLCBfTUFT S0VEX0JJVF9FTkFCTEUobWFzaykpCisKKyNkZWZpbmUgV0FfQ0xSX0JJVF9NQVNLRUQoYWRkciwg bWFzaykgXAorCVdBX1JFRyhhZGRyLCAobWFzayksIF9NQVNLRURfQklUX0RJU0FCTEUobWFzaykp CisKKyNkZWZpbmUgV0FfU0VUX0ZJRUxEX01BU0tFRChhZGRyLCBtYXNrLCB2YWx1ZSkgXAorCVdB X1JFRyhhZGRyLCBtYXNrLCBfTUFTS0VEX0ZJRUxEKG1hc2ssIHZhbHVlKSkKKworI2RlZmluZSBX QV9TRVRfQklUKGFkZHIsIG1hc2spIFdBX1JFRyhhZGRyLCBtYXNrLCBJOTE1X1JFQUQoYWRkcikg fCAobWFzaykpCisjZGVmaW5lIFdBX0NMUl9CSVQoYWRkciwgbWFzaykgV0FfUkVHKGFkZHIsIG1h c2ssIEk5MTVfUkVBRChhZGRyKSAmIH4obWFzaykpCisKKyNkZWZpbmUgV0FfV1JJVEUoYWRkciwg dmFsKSBXQV9SRUcoYWRkciwgMHhmZmZmZmZmZiwgdmFsKQorCitzdGF0aWMgaW50IHdhX3Jpbmdf d2hpdGVsaXN0X3JlZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUsCisJCQkJIGk5MTVf cmVnX3QgcmVnKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2lu ZS0+aTkxNTsKKwlzdHJ1Y3QgaTkxNV93b3JrYXJvdW5kcyAqd2EgPSAmZGV2X3ByaXYtPndvcmth cm91bmRzOworCWNvbnN0IHVpbnQzMl90IGluZGV4ID0gd2EtPmh3X3doaXRlbGlzdF9jb3VudFtl bmdpbmUtPmlkXTsKKworCWlmIChXQVJOX09OKGluZGV4ID49IFJJTkdfTUFYX05PTlBSSVZfU0xP VFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVdBX1dSSVRFKFJJTkdfRk9SQ0VfVE9fTk9OUFJJ VihlbmdpbmUtPm1taW9fYmFzZSwgaW5kZXgpLAorCQkgaTkxNV9tbWlvX3JlZ19vZmZzZXQocmVn KSk7CisJd2EtPmh3X3doaXRlbGlzdF9jb3VudFtlbmdpbmUtPmlkXSsrOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgZ2VuOF9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdp bmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBl bmdpbmUtPmk5MTU7CisKKwlXQV9TRVRfQklUX01BU0tFRChJTlNUUE0sIElOU1RQTV9GT1JDRV9P UkRFUklORyk7CisKKwkvKiBXYURpc2FibGVBc3luY0ZsaXBQZXJmTW9kZTpiZHcsY2h2ICovCisJ V0FfU0VUX0JJVF9NQVNLRUQoTUlfTU9ERSwgQVNZTkNfRkxJUF9QRVJGX0RJU0FCTEUpOworCisJ LyogV2FEaXNhYmxlUGFydGlhbEluc3RTaG9vdGRvd246YmR3LGNodiAqLworCVdBX1NFVF9CSVRf TUFTS0VEKEdFTjhfUk9XX0NISUNLRU4sCisJCQkgIFBBUlRJQUxfSU5TVFJVQ1RJT05fU0hPT1RE T1dOX0RJU0FCTEUpOworCisJLyogVXNlIEZvcmNlIE5vbi1Db2hlcmVudCB3aGVuZXZlciBleGVj dXRpbmcgYSAzRCBjb250ZXh0LiBUaGlzIGlzIGEKKwkgKiB3b3JrYXJvdW5kIGZvciBmb3IgYSBw b3NzaWJsZSBoYW5nIGluIHRoZSB1bmxpa2VseSBldmVudCBhIFRMQgorCSAqIGludmFsaWRhdGlv biBvY2N1cnMgZHVyaW5nIGEgUFNEIGZsdXNoLgorCSAqLworCS8qIFdhRm9yY2VFbmFibGVOb25D b2hlcmVudDpiZHcsY2h2ICovCisJLyogV2FIZGNEaXNhYmxlRmV0Y2hXaGVuTWFza2VkOmJkdyxj aHYgKi8KKwlXQV9TRVRfQklUX01BU0tFRChIRENfQ0hJQ0tFTjAsCisJCQkgIEhEQ19ET05PVF9G RVRDSF9NRU1fV0hFTl9NQVNLRUQgfAorCQkJICBIRENfRk9SQ0VfTk9OX0NPSEVSRU5UKTsKKwor CS8qIEZyb20gdGhlIEhhc3dlbGwgUFJNLCBDb21tYW5kIFJlZmVyZW5jZTogUmVnaXN0ZXJzLCBD QUNIRV9NT0RFXzA6CisJICogIlRoZSBIaWVyYXJjaGljYWwgWiBSQVcgU3RhbGwgT3B0aW1pemF0 aW9uIGFsbG93cyBub24tb3ZlcmxhcHBpbmcKKwkgKiAgcG9seWdvbnMgaW4gdGhlIHNhbWUgOHg0 IHBpeGVsL3NhbXBsZSBhcmVhIHRvIGJlIHByb2Nlc3NlZCB3aXRob3V0CisJICogIHN0YWxsaW5n IHdhaXRpbmcgZm9yIHRoZSBlYXJsaWVyIG9uZXMgdG8gd3JpdGUgdG8gSGllcmFyY2hpY2FsIFoK KwkgKiAgYnVmZmVyLiIKKwkgKgorCSAqIFRoaXMgb3B0aW1pemF0aW9uIGlzIG9mZiBieSBkZWZh dWx0IGZvciBCRFcgYW5kIENIVjsgdHVybiBpdCBvbi4KKwkgKi8KKwlXQV9DTFJfQklUX01BU0tF RChDQUNIRV9NT0RFXzBfR0VONywgSElaX1JBV19TVEFMTF9PUFRfRElTQUJMRSk7CisKKwkvKiBX YTR4NFNUQ09wdGltaXphdGlvbkRpc2FibGU6YmR3LGNodiAqLworCVdBX1NFVF9CSVRfTUFTS0VE KENBQ0hFX01PREVfMSwgR0VOOF80eDRfU1RDX09QVElNSVpBVElPTl9ESVNBQkxFKTsKKworCS8q CisJICogQlNwZWMgcmVjb21tZW5kcyA4eDQgd2hlbiBNU0FBIGlzIHVzZWQsCisJICogaG93ZXZl ciBpbiBwcmFjdGljZSAxNng0IHNlZW1zIGZhc3Rlc3QuCisJICoKKwkgKiBOb3RlIHRoYXQgUFMv V00gdGhyZWFkIGNvdW50cyBkZXBlbmQgb24gdGhlIFdJWiBoYXNoaW5nCisJICogZGlzYWJsZSBi aXQsIHdoaWNoIHdlIGRvbid0IHRvdWNoIGhlcmUsIGJ1dCBpdCdzIGdvb2QKKwkgKiB0byBrZWVw IGluIG1pbmQgKHNlZSAzRFNUQVRFX1BTIGFuZCAzRFNUQVRFX1dNKS4KKwkgKi8KKwlXQV9TRVRf RklFTERfTUFTS0VEKEdFTjdfR1RfTU9ERSwKKwkJCSAgICBHRU42X1dJWl9IQVNISU5HX01BU0ss CisJCQkgICAgR0VONl9XSVpfSEFTSElOR18xNng0KTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGJkd19pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2lu ZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7 CisJaW50IHJldDsKKworCXJldCA9IGdlbjhfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOworCWlm IChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBXYURpc2FibGVUaHJlYWRTdGFsbERvcENsb2Nr R2F0aW5nOmJkdyAocHJlLXByb2R1Y3Rpb24pICovCisJV0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9S T1dfQ0hJQ0tFTiwgU1RBTExfRE9QX0dBVElOR19ESVNBQkxFKTsKKworCS8qIFdhRGlzYWJsZURv cENsb2NrR2F0aW5nOmJkdworCSAqCisJICogQWxzbyBzZWUgdGhlIHJlbGF0ZWQgVUNHVENMMSB3 cml0ZSBpbiBicm9hZHdlbGxfaW5pdF9jbG9ja19nYXRpbmcoKQorCSAqIHRvIGRpc2FibGUgRVVU QyBjbG9jayBnYXRpbmcuCisJICovCisJV0FfU0VUX0JJVF9NQVNLRUQoR0VON19ST1dfQ0hJQ0tF TjIsCisJCQkgIERPUF9DTE9DS19HQVRJTkdfRElTQUJMRSk7CisKKwlXQV9TRVRfQklUX01BU0tF RChIQUxGX1NMSUNFX0NISUNLRU4zLAorCQkJICBHRU44X1NBTVBMRVJfUE9XRVJfQllQQVNTX0RJ Uyk7CisKKwlXQV9TRVRfQklUX01BU0tFRChIRENfQ0hJQ0tFTjAsCisJCQkgIC8qIFdhRm9yY2VD b250ZXh0U2F2ZVJlc3RvcmVOb25Db2hlcmVudDpiZHcgKi8KKwkJCSAgSERDX0ZPUkNFX0NPTlRF WFRfU0FWRV9SRVNUT1JFX05PTl9DT0hFUkVOVCB8CisJCQkgIC8qIFdhRGlzYWJsZUZlbmNlRGVz dGluYXRpb25Ub1NMTTpiZHcgKHByZS1wcm9kKSAqLworCQkJICAoSVNfQkRXX0dUMyhkZXZfcHJp dikgPyBIRENfRkVOQ0VfREVTVF9TTE1fRElTQUJMRSA6IDApKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IGNodl9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUt Pmk5MTU7CisJaW50IHJldDsKKworCXJldCA9IGdlbjhfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUp OworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBXYURpc2FibGVUaHJlYWRTdGFsbERv cENsb2NrR2F0aW5nOmNodiAqLworCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjhfUk9XX0NISUNLRU4s IFNUQUxMX0RPUF9HQVRJTkdfRElTQUJMRSk7CisKKwkvKiBJbXByb3ZlIEhpWiB0aHJvdWdocHV0 IG9uIENIVi4gKi8KKwlXQV9TRVRfQklUX01BU0tFRChISVpfQ0hJQ0tFTiwgQ0hWX0haXzhYOF9N T0RFX0lOXzFYKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdlbjlfaW5pdF93b3Jr YXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0IGRybV9p OTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OworCWludCByZXQ7CisKKwkvKiBX YUNvbmV4dFN3aXRjaFdpdGhDb25jdXJyZW50VExCSW52YWxpZGF0ZTpza2wsYnh0LGtibCxnbGsg Ki8KKwlJOTE1X1dSSVRFKEdFTjlfQ1NGRV9DSElDS0VOMV9SQ1MsIF9NQVNLRURfQklUX0VOQUJM RShHRU45X1BSRUVNUFRfR1BHUFVfU1lOQ19TV0lUQ0hfRElTQUJMRSkpOworCisJLyogV2FFbmFi bGVMYnNTbGFSZXRyeVRpbWVyRGVjcmVtZW50OnNrbCxieHQsa2JsLGdsayAqLworCUk5MTVfV1JJ VEUoQkRXX1NDUkFUQ0gxLCBJOTE1X1JFQUQoQkRXX1NDUkFUQ0gxKSB8CisJCSAgIEdFTjlfTEJT X1NMQV9SRVRSWV9USU1FUl9ERUNSRU1FTlRfRU5BQkxFKTsKKworCS8qIFdhRGlzYWJsZUtpbGxM b2dpYzpieHQsc2tsLGtibCAqLworCUk5MTVfV1JJVEUoR0FNX0VDT0NISywgSTkxNV9SRUFEKEdB TV9FQ09DSEspIHwKKwkJICAgRUNPQ0hLX0RJU19UTEIpOworCisJLyogV2FDbGVhckZsb3dDb250 cm9sR3BncHVDb250ZXh0U2F2ZTpza2wsYnh0LGtibCxnbGsgKi8KKwkvKiBXYURpc2FibGVQYXJ0 aWFsSW5zdFNob290ZG93bjpza2wsYnh0LGtibCxnbGsgKi8KKwlXQV9TRVRfQklUX01BU0tFRChH RU44X1JPV19DSElDS0VOLAorCQkJICBGTE9XX0NPTlRST0xfRU5BQkxFIHwKKwkJCSAgUEFSVElB TF9JTlNUUlVDVElPTl9TSE9PVERPV05fRElTQUJMRSk7CisKKwkvKiBTeW5jaW5nIGRlcGVuZGVu Y2llcyBiZXR3ZWVuIGNhbWVyYSBhbmQgZ3JhcGhpY3M6c2tsLGJ4dCxrYmwgKi8KKwlXQV9TRVRf QklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4zLAorCQkJICBHRU45X0RJU0FCTEVfT0NMX09P Ql9TVVBQUkVTU19MT0dJQyk7CisKKwkvKiBXYURpc2FibGVEZ01pcnJvckZpeEluSGFsZlNsaWNl Q2hpY2tlbjU6Ynh0ICovCisJaWYgKElTX0JYVF9SRVZJRChkZXZfcHJpdiwgMCwgQlhUX1JFVklE X0ExKSkKKwkJV0FfQ0xSX0JJVF9NQVNLRUQoR0VOOV9IQUxGX1NMSUNFX0NISUNLRU41LAorCQkJ CSAgR0VOOV9ER19NSVJST1JfRklYX0VOQUJMRSk7CisKKwkvKiBXYVNldERpc2FibGVQaXhNYXNr Q2FtbWluZ0FuZFJod29JbkNvbW1vblNsaWNlQ2hpY2tlbjpieHQgKi8KKwlpZiAoSVNfQlhUX1JF VklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQTEpKSB7CisJCVdBX1NFVF9CSVRfTUFTS0VEKEdF TjdfQ09NTU9OX1NMSUNFX0NISUNLRU4xLAorCQkJCSAgR0VOOV9SSFdPX09QVElNSVpBVElPTl9E SVNBQkxFKTsKKwkJLyoKKwkJICogV0EgYWxzbyByZXF1aXJlcyBHRU45X1NMSUNFX0NPTU1PTl9F Q09fQ0hJQ0tFTjBbMTQ6MTRdIHRvIGJlIHNldAorCQkgKiBidXQgd2UgZG8gdGhhdCBpbiBwZXIg Y3R4IGJhdGNoYnVmZmVyIGFzIHRoZXJlIGlzIGFuIGlzc3VlCisJCSAqIHdpdGggdGhpcyByZWdp c3RlciBub3QgZ2V0dGluZyByZXN0b3JlZCBvbiBjdHggcmVzdG9yZQorCQkgKi8KKwl9CisKKwkv KiBXYUVuYWJsZVNhbXBsZXJHUEdQVVByZWVtcHRpb25TdXBwb3J0OnNrbCxieHQsa2JsICovCisJ V0FfU0VUX0JJVF9NQVNLRUQoR0VOOV9IQUxGX1NMSUNFX0NISUNLRU43LAorCQkJICBHRU45X0VO QUJMRV9HUEdQVV9QUkVFTVBUSU9OKTsKKworCS8qIFdhNHg0U1RDT3B0aW1pemF0aW9uRGlzYWJs ZTpza2wsYnh0LGtibCxnbGsgKi8KKwkvKiBXYURpc2FibGVQYXJ0aWFsUmVzb2x2ZUluVmM6c2ts LGJ4dCxrYmwgKi8KKwlXQV9TRVRfQklUX01BU0tFRChDQUNIRV9NT0RFXzEsIChHRU44XzR4NF9T VENfT1BUSU1JWkFUSU9OX0RJU0FCTEUgfAorCQkJCQkgR0VOOV9QQVJUSUFMX1JFU09MVkVfSU5f VkNfRElTQUJMRSkpOworCisJLyogV2FDY3NUbGJQcmVmZXRjaERpc2FibGU6c2tsLGJ4dCxrYmws Z2xrICovCisJV0FfQ0xSX0JJVF9NQVNLRUQoR0VOOV9IQUxGX1NMSUNFX0NISUNLRU41LAorCQkJ ICBHRU45X0NDU19UTEJfUFJFRkVUQ0hfRU5BQkxFKTsKKworCS8qIFdhRGlzYWJsZU1hc2tCYXNl ZENhbW1pbmdJblJDQzpieHQgKi8KKwlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAwLCBCWFRf UkVWSURfQTEpKQorCQlXQV9TRVRfQklUX01BU0tFRChTTElDRV9FQ09fQ0hJQ0tFTjAsCisJCQkJ ICBQSVhFTF9NQVNLX0NBTU1JTkdfRElTQUJMRSk7CisKKwkvKiBXYUZvcmNlQ29udGV4dFNhdmVS ZXN0b3JlTm9uQ29oZXJlbnQ6c2tsLGJ4dCxrYmwgKi8KKwlXQV9TRVRfQklUX01BU0tFRChIRENf Q0hJQ0tFTjAsCisJCQkgIEhEQ19GT1JDRV9DT05URVhUX1NBVkVfUkVTVE9SRV9OT05fQ09IRVJF TlQgfAorCQkJICBIRENfRk9SQ0VfQ1NSX05PTl9DT0hFUkVOVF9PVlJfRElTQUJMRSk7CisKKwkv KiBXYUZvcmNlRW5hYmxlTm9uQ29oZXJlbnQgYW5kIFdhRGlzYWJsZUhEQ0ludmFsaWRhdGlvbiBh cmUKKwkgKiBib3RoIHRpZWQgdG8gV2FGb3JjZUNvbnRleHRTYXZlUmVzdG9yZU5vbkNvaGVyZW50 CisJICogaW4gc29tZSBoc2RzIGZvciBza2wuIFdlIGtlZXAgdGhlIHRpZSBmb3IgYWxsIGdlbjku IFRoZQorCSAqIGRvY3VtZW50YXRpb24gaXMgYSBiaXQgaGF6eSBhbmQgc28gd2Ugd2FudCB0byBn ZXQgY29tbW9uIGJlaGF2aW91ciwKKwkgKiBldmVuIHRob3VnaCB0aGVyZSBpcyBubyBjbGVhciBl dmlkZW5jZSB3ZSB3b3VsZCBuZWVkIGJvdGggb24ga2JsL2J4dC4KKwkgKiBUaGlzIGFyZWEgaGFz IGJlZW4gc291cmNlIG9mIHN5c3RlbSBoYW5ncyBzbyB3ZSBwbGF5IGl0IHNhZmUKKwkgKiBhbmQg bWltaWMgdGhlIHNrbCByZWdhcmRsZXNzIG9mIHdoYXQgYnNwZWMgc2F5cy4KKwkgKgorCSAqIFVz ZSBGb3JjZSBOb24tQ29oZXJlbnQgd2hlbmV2ZXIgZXhlY3V0aW5nIGEgM0QgY29udGV4dC4gVGhp cworCSAqIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBwb3NzaWJsZSBoYW5nIGluIHRoZSB1bmxpa2Vs eSBldmVudAorCSAqIGEgVExCIGludmFsaWRhdGlvbiBvY2N1cnMgZHVyaW5nIGEgUFNEIGZsdXNo LgorCSAqLworCisJLyogV2FGb3JjZUVuYWJsZU5vbkNvaGVyZW50OnNrbCxieHQsa2JsICovCisJ V0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4wLAorCQkJICBIRENfRk9SQ0VfTk9OX0NPSEVS RU5UKTsKKworCS8qIFdhRGlzYWJsZUhEQ0ludmFsaWRhdGlvbjpza2wsYnh0LGtibCAqLworCUk5 MTVfV1JJVEUoR0FNX0VDT0NISywgSTkxNV9SRUFEKEdBTV9FQ09DSEspIHwKKwkJICAgQkRXX0RJ U0FCTEVfSERDX0lOVkFMSURBVElPTik7CisKKwkvKiBXYURpc2FibGVTYW1wbGVyUG93ZXJCeXBh c3NGb3JTT1BpbmdQb25nOnNrbCxieHQsa2JsICovCisJaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYp IHx8CisJICAgIElTX0tBQllMQUtFKGRldl9wcml2KSB8fAorCSAgICBJU19CWFRfUkVWSUQoZGV2 X3ByaXYsIDAsIEJYVF9SRVZJRF9CMCkpCisJCVdBX1NFVF9CSVRfTUFTS0VEKEhBTEZfU0xJQ0Vf Q0hJQ0tFTjMsCisJCQkJICBHRU44X1NBTVBMRVJfUE9XRVJfQllQQVNTX0RJUyk7CisKKwkvKiBX YURpc2FibGVTVFVuaXRQb3dlck9wdGltaXphdGlvbjpza2wsYnh0LGtibCxnbGsgKi8KKwlXQV9T RVRfQklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4yLCBHRU44X1NUX1BPX0RJU0FCTEUpOwor CisJLyogV2FPQ0xDb2hlcmVudExpbmVGbHVzaDpza2wsYnh0LGtibCAqLworCUk5MTVfV1JJVEUo R0VOOF9MM1NRQ1JFRzQsIChJOTE1X1JFQUQoR0VOOF9MM1NRQ1JFRzQpIHwKKwkJCQkgICAgR0VO OF9MUVNDX0ZMVVNIX0NPSEVSRU5UX0xJTkVTKSk7CisKKwkvKiBXYVZGRVN0YXRlQWZ0ZXJQaXBl Q29udHJvbHdpdGhNZWRpYVN0YXRlQ2xlYXI6c2tsLGJ4dCxnbGsgKi8KKwlyZXQgPSB3YV9yaW5n X3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU45X0NUWF9QUkVFTVBUX1JFRyk7CisJaWYgKHJldCkK KwkJcmV0dXJuIHJldDsKKworCS8qIFdhRW5hYmxlUHJlZW1wdGlvbkdyYW51bGFyaXR5Q29udHJv bEJ5VU1EOnNrbCxieHQsa2JsICovCisJcmV0PSB3YV9yaW5nX3doaXRlbGlzdF9yZWcoZW5naW5l LCBHRU44X0NTX0NISUNLRU4xKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FB bGxvd1VNRFRvTW9kaWZ5SERDQ2hpY2tlbjE6c2tsLGJ4dCxrYmwsZ2xrICovCisJcmV0ID0gd2Ff cmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOF9IRENfQ0hJQ0tFTjEpOworCWlmIChyZXQp CisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBza2xfdHVuZV9p el9oYXNoaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJt X2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisJdTggdmFsc1szXSA9IHsg MCwgMCwgMCB9OworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykg eworCQl1OCBzczsKKworCQkvKgorCQkgKiBPbmx5IGNvbnNpZGVyIHNsaWNlcyB3aGVyZSBvbmUs IGFuZCBvbmx5IG9uZSwgc3Vic2xpY2UgaGFzIDcKKwkJICogRVVzCisJCSAqLworCQlpZiAoIWlz X3Bvd2VyX29mXzIoSU5URUxfSU5GTyhkZXZfcHJpdiktPnNzZXUuc3Vic2xpY2VfN2V1W2ldKSkK KwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIHN1YnNsaWNlXzdldVtpXSAhPSAwIChiZWNhdXNl IG9mIHRoZSBjaGVjayBhYm92ZSkgYW5kCisJCSAqIHNzX21heCA9PSA0IChtYXhpbXVtIG51bWJl ciBvZiBzdWJzbGljZXMgcG9zc2libGUgcGVyIHNsaWNlKQorCQkgKgorCQkgKiAtPiAgICAwIDw9 IHNzIDw9IDM7CisJCSAqLworCQlzcyA9IGZmcyhJTlRFTF9JTkZPKGRldl9wcml2KS0+c3NldS5z dWJzbGljZV83ZXVbaV0pIC0gMTsKKwkJdmFsc1tpXSA9IDMgLSBzczsKKwl9CisKKwlpZiAodmFs c1swXSA9PSAwICYmIHZhbHNbMV0gPT0gMCAmJiB2YWxzWzJdID09IDApCisJCXJldHVybiAwOwor CisJLyogVHVuZSBJWiBoYXNoaW5nLiBTZWUgaW50ZWxfZGV2aWNlX2luZm9fcnVudGltZV9pbml0 KCkgKi8KKwlXQV9TRVRfRklFTERfTUFTS0VEKEdFTjdfR1RfTU9ERSwKKwkJCSAgICBHRU45X0la X0hBU0hJTkdfTUFTSygyKSB8CisJCQkgICAgR0VOOV9JWl9IQVNISU5HX01BU0soMSkgfAorCQkJ ICAgIEdFTjlfSVpfSEFTSElOR19NQVNLKDApLAorCQkJICAgIEdFTjlfSVpfSEFTSElORygyLCB2 YWxzWzJdKSB8CisJCQkgICAgR0VOOV9JWl9IQVNISU5HKDEsIHZhbHNbMV0pIHwKKwkJCSAgICBH RU45X0laX0hBU0hJTkcoMCwgdmFsc1swXSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBp bnQgc2tsX2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQor eworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKKwlp bnQgcmV0OworCisJcmV0ID0gZ2VuOV9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisJaWYgKHJl dCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQWN0dWFsIFdBIGlzIHRvIGRpc2FibGUgcGVy Y29udGV4dCBwcmVlbXB0aW9uIGdyYW51bGFyaXR5IGNvbnRyb2wKKwkgKiB1bnRpbCBEMCB3aGlj aCBpcyB0aGUgZGVmYXVsdCBjYXNlIHNvIHRoaXMgaXMgZXF1aXZhbGVudCB0bworCSAqICFXYURp c2FibGVQZXJDdHh0UHJlZW1wdGlvbkdyYW51bGFyaXR5Q29udHJvbDpza2wKKwkgKi8KKwlJOTE1 X1dSSVRFKEdFTjdfRkZfU0xJQ0VfQ1NfQ0hJQ0tFTjEsCisJCSAgIF9NQVNLRURfQklUX0VOQUJM RShHRU45X0ZGU0NfUEVSQ1RYX1BSRUVNUFRfQ1RSTCkpOworCisJLyogV2FFbmFibGVHYXBzVHN2 Q3JlZGl0Rml4OnNrbCAqLworCUk5MTVfV1JJVEUoR0VOOF9HQVJCQ05UTCwgKEk5MTVfUkVBRChH RU44X0dBUkJDTlRMKSB8CisJCQkJICAgR0VOOV9HQVBTX1RTVl9DUkVESVRfRElTQUJMRSkpOwor CisJLyogV2FEaXNhYmxlR2Fmc1VuaXRDbGtHYXRpbmc6c2tsICovCisJV0FfU0VUX0JJVChHRU43 X1VDR0NUTDQsIEdFTjhfRVVfR0FVTklUX0NMT0NLX0dBVEVfRElTQUJMRSk7CisKKwkvKiBXYUlu UGxhY2VEZWNvbXByZXNzaW9uSGFuZzpza2wgKi8KKwlpZiAoSVNfU0tMX1JFVklEKGRldl9wcml2 LCBTS0xfUkVWSURfSDAsIFJFVklEX0ZPUkVWRVIpKQorCQlXQV9TRVRfQklUKEdFTjlfR0FNVF9F Q09fUkVHX1JXX0lBLAorCQkJICAgR0FNVF9FQ09fRU5BQkxFX0lOX1BMQUNFX0RFQ09NUFJFU1Mp OworCisJLyogV2FEaXNhYmxlTFNRQ1JPUEVSRmZvck9DTDpza2wgKi8KKwlyZXQgPSB3YV9yaW5n X3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU44X0wzU1FDUkVHNCk7CisJaWYgKHJldCkKKwkJcmV0 dXJuIHJldDsKKworCXJldHVybiBza2xfdHVuZV9pel9oYXNoaW5nKGVuZ2luZSk7Cit9CisKK3N0 YXRpYyBpbnQgYnh0X2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5n aW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkx NTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2VuOV9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisJ aWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdhU3RvcmVNdWx0aXBsZVBURWVuYWJsZTpi eHQgKi8KKwkvKiBUaGlzIGlzIGEgcmVxdWlyZW1lbnQgYWNjb3JkaW5nIHRvIEhhcmR3YXJlIHNw ZWNpZmljYXRpb24gKi8KKwlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURf QTEpKQorCQlJOTE1X1dSSVRFKFRJTEVDVEwsIEk5MTVfUkVBRChUSUxFQ1RMKSB8IFRJTEVDVExf VExCUEYpOworCisJLyogV2FTZXRDbGNrR2F0aW5nRGlzYWJsZU1lZGlhOmJ4dCAqLworCWlmIChJ U19CWFRfUkVWSUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJRF9BMSkpIHsKKwkJSTkxNV9XUklURShH RU43X01JU0NDUENUTCwgKEk5MTVfUkVBRChHRU43X01JU0NDUENUTCkgJgorCQkJCQkgICAgfkdF TjhfRE9QX0NMT0NLX0dBVEVfTUVESUFfRU5BQkxFKSk7CisJfQorCisJLyogV2FEaXNhYmxlVGhy ZWFkU3RhbGxEb3BDbG9ja0dhdGluZzpieHQgKi8KKwlXQV9TRVRfQklUX01BU0tFRChHRU44X1JP V19DSElDS0VOLAorCQkJICBTVEFMTF9ET1BfR0FUSU5HX0RJU0FCTEUpOworCisJLyogV2FEaXNh YmxlUG9vbGVkRXVMb2FkQmFsYW5jaW5nRml4OmJ4dCAqLworCWlmIChJU19CWFRfUkVWSUQoZGV2 X3ByaXYsIEJYVF9SRVZJRF9CMCwgUkVWSURfRk9SRVZFUikpIHsKKwkJV0FfU0VUX0JJVF9NQVNL RUQoRkZfU0xJQ0VfQ1NfQ0hJQ0tFTjIsCisJCQkJICBHRU45X1BPT0xFRF9FVV9MT0FEX0JBTEFO Q0lOR19GSVhfRElTQUJMRSk7CisJfQorCisJLyogV2FEaXNhYmxlU2JlQ2FjaGVEaXNwYXRjaFBv cnRTaGFyaW5nOmJ4dCAqLworCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJ RF9CMCkpIHsKKwkJV0FfU0VUX0JJVF9NQVNLRUQoCisJCQlHRU43X0hBTEZfU0xJQ0VfQ0hJQ0tF TjEsCisJCQlHRU43X1NCRV9TU19DQUNIRV9ESVNQQVRDSF9QT1JUX1NIQVJJTkdfRElTQUJMRSk7 CisJfQorCisJLyogV2FEaXNhYmxlT2JqZWN0TGV2ZWxQcmVlbXB0aW9uRm9yVHJpZmFuT3JQb2x5 Z29uOmJ4dCAqLworCS8qIFdhRGlzYWJsZU9iamVjdExldmVsUHJlZW1wdGlvbkZvckluc3RhbmNl ZERyYXc6Ynh0ICovCisJLyogV2FEaXNhYmxlT2JqZWN0TGV2ZWxQcmVlbXRpb25Gb3JJbnN0YW5j ZUlkOmJ4dCAqLworCS8qIFdhRGlzYWJsZUxTUUNST1BFUkZmb3JPQ0w6Ynh0ICovCisJaWYgKElT X0JYVF9SRVZJRChkZXZfcHJpdiwgMCwgQlhUX1JFVklEX0ExKSkgeworCQlyZXQgPSB3YV9yaW5n X3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU45X0NTX0RFQlVHX01PREUxKTsKKwkJaWYgKHJldCkK KwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gd2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwg R0VOOF9MM1NRQ1JFRzQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBX YVByb2dyYW1MM1NxY1JlZzFEZWZhdWx0Rm9yUGVyZjpieHQgKi8KKwlpZiAoSVNfQlhUX1JFVklE KGRldl9wcml2LCBCWFRfUkVWSURfQjAsIFJFVklEX0ZPUkVWRVIpKQorCQlJOTE1X1dSSVRFKEdF TjhfTDNTUUNSRUcxLCBMM19HRU5FUkFMX1BSSU9fQ1JFRElUUyg2MikgfAorCQkJCQkgICBMM19I SUdIX1BSSU9fQ1JFRElUUygyKSk7CisKKwkvKiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RI V0J1ZzpieHQgKi8KKwlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCBCWFRfUkVWSURfQzAsIFJF VklEX0ZPUkVWRVIpKQorCQlXQV9TRVRfQklUX01BU0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIs CisJCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9CVUZfT1BUSU1JWkFUSU9OKTsKKworCS8q IFdhSW5QbGFjZURlY29tcHJlc3Npb25IYW5nOmJ4dCAqLworCWlmIChJU19CWFRfUkVWSUQoZGV2 X3ByaXYsIEJYVF9SRVZJRF9DMCwgUkVWSURfRk9SRVZFUikpCisJCVdBX1NFVF9CSVQoR0VOOV9H QU1UX0VDT19SRUdfUldfSUEsCisJCQkgICBHQU1UX0VDT19FTkFCTEVfSU5fUExBQ0VfREVDT01Q UkVTUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBrYmxfaW5pdF93b3JrYXJvdW5k cyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OworCWludCByZXQ7CisKKwlyZXQgPSBnZW45 X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJ LyogV2FFbmFibGVHYXBzVHN2Q3JlZGl0Rml4OmtibCAqLworCUk5MTVfV1JJVEUoR0VOOF9HQVJC Q05UTCwgKEk5MTVfUkVBRChHRU44X0dBUkJDTlRMKSB8CisJCQkJICAgR0VOOV9HQVBTX1RTVl9D UkVESVRfRElTQUJMRSkpOworCisJLyogV2FEaXNhYmxlRHluYW1pY0NyZWRpdFNoYXJpbmc6a2Js ICovCisJaWYgKElTX0tCTF9SRVZJRChkZXZfcHJpdiwgMCwgS0JMX1JFVklEX0IwKSkKKwkJV0Ff U0VUX0JJVChHQU1UX0NIS05fQklUX1JFRywKKwkJCSAgIEdBTVRfQ0hLTl9ESVNBQkxFX0RZTkFN SUNfQ1JFRElUX1NIQVJJTkcpOworCisJLyogV2FEaXNhYmxlRmVuY2VEZXN0aW5hdGlvblRvU0xN OmtibCAocHJlLXByb2QpICovCisJaWYgKElTX0tCTF9SRVZJRChkZXZfcHJpdiwgS0JMX1JFVklE X0EwLCBLQkxfUkVWSURfQTApKQorCQlXQV9TRVRfQklUX01BU0tFRChIRENfQ0hJQ0tFTjAsCisJ CQkJICBIRENfRkVOQ0VfREVTVF9TTE1fRElTQUJMRSk7CisKKwkvKiBXYVRvRW5hYmxlSHdGaXhG b3JQdXNoQ29uc3RIV0J1ZzprYmwgKi8KKwlpZiAoSVNfS0JMX1JFVklEKGRldl9wcml2LCBLQkxf UkVWSURfQzAsIFJFVklEX0ZPUkVWRVIpKQorCQlXQV9TRVRfQklUX01BU0tFRChDT01NT05fU0xJ Q0VfQ0hJQ0tFTjIsCisJCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9CVUZfT1BUSU1JWkFU SU9OKTsKKworCS8qIFdhRGlzYWJsZUdhZnNVbml0Q2xrR2F0aW5nOmtibCAqLworCVdBX1NFVF9C SVQoR0VON19VQ0dDVEw0LCBHRU44X0VVX0dBVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpOworCisJ LyogV2FEaXNhYmxlU2JlQ2FjaGVEaXNwYXRjaFBvcnRTaGFyaW5nOmtibCAqLworCVdBX1NFVF9C SVRfTUFTS0VEKAorCQlHRU43X0hBTEZfU0xJQ0VfQ0hJQ0tFTjEsCisJCUdFTjdfU0JFX1NTX0NB Q0hFX0RJU1BBVENIX1BPUlRfU0hBUklOR19ESVNBQkxFKTsKKworCS8qIFdhSW5QbGFjZURlY29t cHJlc3Npb25IYW5nOmtibCAqLworCVdBX1NFVF9CSVQoR0VOOV9HQU1UX0VDT19SRUdfUldfSUEs CisJCSAgIEdBTVRfRUNPX0VOQUJMRV9JTl9QTEFDRV9ERUNPTVBSRVNTKTsKKworCS8qIFdhRGlz YWJsZUxTUUNST1BFUkZmb3JPQ0w6a2JsICovCisJcmV0ID0gd2FfcmluZ193aGl0ZWxpc3RfcmVn KGVuZ2luZSwgR0VOOF9MM1NRQ1JFRzQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnbGtfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50 ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2ID0gZW5naW5lLT5pOTE1OworCWludCByZXQ7CisKKwlyZXQgPSBnZW45X2luaXRfd29ya2Fy b3VuZHMoZW5naW5lKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FUb0VuYWJs ZUh3Rml4Rm9yUHVzaENvbnN0SFdCdWc6Z2xrICovCisJV0FfU0VUX0JJVF9NQVNLRUQoQ09NTU9O X1NMSUNFX0NISUNLRU4yLAorCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9CVUZfT1BUSU1J WkFUSU9OKTsKKworCXJldHVybiAwOworfQorCitpbnQgaW5pdF93b3JrYXJvdW5kc19yaW5nKHN0 cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0 ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisKKwlXQVJOX09OKGVuZ2luZS0+aWQgIT0gUkNT KTsKKworCWRldl9wcml2LT53b3JrYXJvdW5kcy5jb3VudCA9IDA7CisJZGV2X3ByaXYtPndvcmth cm91bmRzLmh3X3doaXRlbGlzdF9jb3VudFtSQ1NdID0gMDsKKworCWlmIChJU19CUk9BRFdFTEwo ZGV2X3ByaXYpKQorCQlyZXR1cm4gYmR3X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKKworCWlm IChJU19DSEVSUllWSUVXKGRldl9wcml2KSkKKwkJcmV0dXJuIGNodl9pbml0X3dvcmthcm91bmRz KGVuZ2luZSk7CisKKwlpZiAoSVNfU0tZTEFLRShkZXZfcHJpdikpCisJCXJldHVybiBza2xfaW5p dF93b3JrYXJvdW5kcyhlbmdpbmUpOworCisJaWYgKElTX0JST1hUT04oZGV2X3ByaXYpKQorCQly ZXR1cm4gYnh0X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKKworCWlmIChJU19LQUJZTEFLRShk ZXZfcHJpdikpCisJCXJldHVybiBrYmxfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOworCisJaWYg KElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQorCQlyZXR1cm4gZ2xrX2luaXRfd29ya2Fyb3VuZHMo ZW5naW5lKTsKKworCXJldHVybiAwOworfQorCitpbnQgaW50ZWxfcmluZ193b3JrYXJvdW5kc19l bWl0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCBpOTE1X3dv cmthcm91bmRzICp3ID0gJnJlcS0+aTkxNS0+d29ya2Fyb3VuZHM7CisJdTMyICpjczsKKwlpbnQg cmV0LCBpOworCisJaWYgKHctPmNvdW50ID09IDApCisJCXJldHVybiAwOworCisJcmV0ID0gcmVx LT5lbmdpbmUtPmVtaXRfZmx1c2gocmVxLCBFTUlUX0JBUlJJRVIpOworCWlmIChyZXQpCisJCXJl dHVybiByZXQ7CisKKwljcyA9IGludGVsX3JpbmdfYmVnaW4ocmVxLCAody0+Y291bnQgKiAyICsg MikpOworCWlmIChJU19FUlIoY3MpKQorCQlyZXR1cm4gUFRSX0VSUihjcyk7CisKKwkqY3MrKyA9 IE1JX0xPQURfUkVHSVNURVJfSU1NKHctPmNvdW50KTsKKwlmb3IgKGkgPSAwOyBpIDwgdy0+Y291 bnQ7IGkrKykgeworCQkqY3MrKyA9IGk5MTVfbW1pb19yZWdfb2Zmc2V0KHctPnJlZ1tpXS5hZGRy KTsKKwkJKmNzKysgPSB3LT5yZWdbaV0udmFsdWU7CisJfQorCSpjcysrID0gTUlfTk9PUDsKKwor CWludGVsX3JpbmdfYWR2YW5jZShyZXEsIGNzKTsKKworCXJldCA9IHJlcS0+ZW5naW5lLT5lbWl0 X2ZsdXNoKHJlcSwgRU1JVF9CQVJSSUVSKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJ RFJNX0RFQlVHX0RSSVZFUigiTnVtYmVyIG9mIFdvcmthcm91bmRzIGVtaXR0ZWQ6ICVkXG4iLCB3 LT5jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0RSTV9J OTE1X1NFTEZURVNUKQogI2luY2x1ZGUgInNlbGZ0ZXN0cy9tb2NrX2VuZ2luZS5jIgogI2VuZGlm CmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMgYi9k cml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKaW5kZXggOGMxN2RiNzI0ODlm Li42MjlmZTY1ODRlNjEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX3Jp bmdidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMK QEAgLTY0NCw0MSArNjQ0LDYgQEAgc3RhdGljIHZvaWQgcmVzZXRfcmluZ19jb21tb24oc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAogCX0KIH0KIAotaW50IGludGVsX3Jpbmdfd29ya2Fy b3VuZHNfZW1pdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSkKLXsKLQlzdHJ1Y3Qg aTkxNV93b3JrYXJvdW5kcyAqdyA9ICZyZXEtPmk5MTUtPndvcmthcm91bmRzOwotCXUzMiAqY3M7 Ci0JaW50IHJldCwgaTsKLQotCWlmICh3LT5jb3VudCA9PSAwKQotCQlyZXR1cm4gMDsKLQotCXJl dCA9IHJlcS0+ZW5naW5lLT5lbWl0X2ZsdXNoKHJlcSwgRU1JVF9CQVJSSUVSKTsKLQlpZiAocmV0 KQotCQlyZXR1cm4gcmV0OwotCi0JY3MgPSBpbnRlbF9yaW5nX2JlZ2luKHJlcSwgKHctPmNvdW50 ICogMiArIDIpKTsKLQlpZiAoSVNfRVJSKGNzKSkKLQkJcmV0dXJuIFBUUl9FUlIoY3MpOwotCi0J KmNzKysgPSBNSV9MT0FEX1JFR0lTVEVSX0lNTSh3LT5jb3VudCk7Ci0JZm9yIChpID0gMDsgaSA8 IHctPmNvdW50OyBpKyspIHsKLQkJKmNzKysgPSBpOTE1X21taW9fcmVnX29mZnNldCh3LT5yZWdb aV0uYWRkcik7Ci0JCSpjcysrID0gdy0+cmVnW2ldLnZhbHVlOwotCX0KLQkqY3MrKyA9IE1JX05P T1A7Ci0KLQlpbnRlbF9yaW5nX2FkdmFuY2UocmVxLCBjcyk7Ci0KLQlyZXQgPSByZXEtPmVuZ2lu ZS0+ZW1pdF9mbHVzaChyZXEsIEVNSVRfQkFSUklFUik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJl dDsKLQotCURSTV9ERUJVR19EUklWRVIoIk51bWJlciBvZiBXb3JrYXJvdW5kcyBlbWl0dGVkOiAl ZFxuIiwgdy0+Y291bnQpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaW50ZWxfcmNz X2N0eF9pbml0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxKQogewogCWludCByZXQ7 CkBAIC02OTQsNTIxICs2NTksNiBAQCBzdGF0aWMgaW50IGludGVsX3Jjc19jdHhfaW5pdChzdHJ1 Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlu dCB3YV9hZGQoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LAotCQkgIGk5MTVfcmVn X3QgYWRkciwKLQkJICBjb25zdCB1MzIgbWFzaywgY29uc3QgdTMyIHZhbCkKLXsKLQljb25zdCB1 MzIgaWR4ID0gZGV2X3ByaXYtPndvcmthcm91bmRzLmNvdW50OwotCi0JaWYgKFdBUk5fT04oaWR4 ID49IEk5MTVfTUFYX1dBX1JFR1MpKQotCQlyZXR1cm4gLUVOT1NQQzsKLQotCWRldl9wcml2LT53 b3JrYXJvdW5kcy5yZWdbaWR4XS5hZGRyID0gYWRkcjsKLQlkZXZfcHJpdi0+d29ya2Fyb3VuZHMu cmVnW2lkeF0udmFsdWUgPSB2YWw7Ci0JZGV2X3ByaXYtPndvcmthcm91bmRzLnJlZ1tpZHhdLm1h c2sgPSBtYXNrOwotCi0JZGV2X3ByaXYtPndvcmthcm91bmRzLmNvdW50Kys7Ci0KLQlyZXR1cm4g MDsKLX0KLQotI2RlZmluZSBXQV9SRUcoYWRkciwgbWFzaywgdmFsKSBkbyB7IFwKLQkJY29uc3Qg aW50IHIgPSB3YV9hZGQoZGV2X3ByaXYsIChhZGRyKSwgKG1hc2spLCAodmFsKSk7IFwKLQkJaWYg KHIpIFwKLQkJCXJldHVybiByOyBcCi0JfSB3aGlsZSAoMCkKLQotI2RlZmluZSBXQV9TRVRfQklU X01BU0tFRChhZGRyLCBtYXNrKSBcCi0JV0FfUkVHKGFkZHIsIChtYXNrKSwgX01BU0tFRF9CSVRf RU5BQkxFKG1hc2spKQotCi0jZGVmaW5lIFdBX0NMUl9CSVRfTUFTS0VEKGFkZHIsIG1hc2spIFwK LQlXQV9SRUcoYWRkciwgKG1hc2spLCBfTUFTS0VEX0JJVF9ESVNBQkxFKG1hc2spKQotCi0jZGVm aW5lIFdBX1NFVF9GSUVMRF9NQVNLRUQoYWRkciwgbWFzaywgdmFsdWUpIFwKLQlXQV9SRUcoYWRk ciwgbWFzaywgX01BU0tFRF9GSUVMRChtYXNrLCB2YWx1ZSkpCi0KLSNkZWZpbmUgV0FfU0VUX0JJ VChhZGRyLCBtYXNrKSBXQV9SRUcoYWRkciwgbWFzaywgSTkxNV9SRUFEKGFkZHIpIHwgKG1hc2sp KQotI2RlZmluZSBXQV9DTFJfQklUKGFkZHIsIG1hc2spIFdBX1JFRyhhZGRyLCBtYXNrLCBJOTE1 X1JFQUQoYWRkcikgJiB+KG1hc2spKQotCi0jZGVmaW5lIFdBX1dSSVRFKGFkZHIsIHZhbCkgV0Ff UkVHKGFkZHIsIDB4ZmZmZmZmZmYsIHZhbCkKLQotc3RhdGljIGludCB3YV9yaW5nX3doaXRlbGlz dF9yZWcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lLAotCQkJCSBpOTE1X3JlZ190IHJl ZykKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7 Ci0Jc3RydWN0IGk5MTVfd29ya2Fyb3VuZHMgKndhID0gJmRldl9wcml2LT53b3JrYXJvdW5kczsK LQljb25zdCB1aW50MzJfdCBpbmRleCA9IHdhLT5od193aGl0ZWxpc3RfY291bnRbZW5naW5lLT5p ZF07Ci0KLQlpZiAoV0FSTl9PTihpbmRleCA+PSBSSU5HX01BWF9OT05QUklWX1NMT1RTKSkKLQkJ cmV0dXJuIC1FSU5WQUw7Ci0KLQlXQV9XUklURShSSU5HX0ZPUkNFX1RPX05PTlBSSVYoZW5naW5l LT5tbWlvX2Jhc2UsIGluZGV4KSwKLQkJIGk5MTVfbW1pb19yZWdfb2Zmc2V0KHJlZykpOwotCXdh LT5od193aGl0ZWxpc3RfY291bnRbZW5naW5lLT5pZF0rKzsKLQotCXJldHVybiAwOwotfQotCi1z dGF0aWMgaW50IGdlbjhfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpl bmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5p OTE1OwotCi0JV0FfU0VUX0JJVF9NQVNLRUQoSU5TVFBNLCBJTlNUUE1fRk9SQ0VfT1JERVJJTkcp OwotCi0JLyogV2FEaXNhYmxlQXN5bmNGbGlwUGVyZk1vZGU6YmR3LGNodiAqLwotCVdBX1NFVF9C SVRfTUFTS0VEKE1JX01PREUsIEFTWU5DX0ZMSVBfUEVSRl9ESVNBQkxFKTsKLQotCS8qIFdhRGlz YWJsZVBhcnRpYWxJbnN0U2hvb3Rkb3duOmJkdyxjaHYgKi8KLQlXQV9TRVRfQklUX01BU0tFRChH RU44X1JPV19DSElDS0VOLAotCQkJICBQQVJUSUFMX0lOU1RSVUNUSU9OX1NIT09URE9XTl9ESVNB QkxFKTsKLQotCS8qIFVzZSBGb3JjZSBOb24tQ29oZXJlbnQgd2hlbmV2ZXIgZXhlY3V0aW5nIGEg M0QgY29udGV4dC4gVGhpcyBpcyBhCi0JICogd29ya2Fyb3VuZCBmb3IgZm9yIGEgcG9zc2libGUg aGFuZyBpbiB0aGUgdW5saWtlbHkgZXZlbnQgYSBUTEIKLQkgKiBpbnZhbGlkYXRpb24gb2NjdXJz IGR1cmluZyBhIFBTRCBmbHVzaC4KLQkgKi8KLQkvKiBXYUZvcmNlRW5hYmxlTm9uQ29oZXJlbnQ6 YmR3LGNodiAqLwotCS8qIFdhSGRjRGlzYWJsZUZldGNoV2hlbk1hc2tlZDpiZHcsY2h2ICovCi0J V0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4wLAotCQkJICBIRENfRE9OT1RfRkVUQ0hfTUVN X1dIRU5fTUFTS0VEIHwKLQkJCSAgSERDX0ZPUkNFX05PTl9DT0hFUkVOVCk7Ci0KLQkvKiBGcm9t IHRoZSBIYXN3ZWxsIFBSTSwgQ29tbWFuZCBSZWZlcmVuY2U6IFJlZ2lzdGVycywgQ0FDSEVfTU9E RV8wOgotCSAqICJUaGUgSGllcmFyY2hpY2FsIFogUkFXIFN0YWxsIE9wdGltaXphdGlvbiBhbGxv d3Mgbm9uLW92ZXJsYXBwaW5nCi0JICogIHBvbHlnb25zIGluIHRoZSBzYW1lIDh4NCBwaXhlbC9z YW1wbGUgYXJlYSB0byBiZSBwcm9jZXNzZWQgd2l0aG91dAotCSAqICBzdGFsbGluZyB3YWl0aW5n IGZvciB0aGUgZWFybGllciBvbmVzIHRvIHdyaXRlIHRvIEhpZXJhcmNoaWNhbCBaCi0JICogIGJ1 ZmZlci4iCi0JICoKLQkgKiBUaGlzIG9wdGltaXphdGlvbiBpcyBvZmYgYnkgZGVmYXVsdCBmb3Ig QkRXIGFuZCBDSFY7IHR1cm4gaXQgb24uCi0JICovCi0JV0FfQ0xSX0JJVF9NQVNLRUQoQ0FDSEVf TU9ERV8wX0dFTjcsIEhJWl9SQVdfU1RBTExfT1BUX0RJU0FCTEUpOwotCi0JLyogV2E0eDRTVENP cHRpbWl6YXRpb25EaXNhYmxlOmJkdyxjaHYgKi8KLQlXQV9TRVRfQklUX01BU0tFRChDQUNIRV9N T0RFXzEsIEdFTjhfNHg0X1NUQ19PUFRJTUlaQVRJT05fRElTQUJMRSk7Ci0KLQkvKgotCSAqIEJT cGVjIHJlY29tbWVuZHMgOHg0IHdoZW4gTVNBQSBpcyB1c2VkLAotCSAqIGhvd2V2ZXIgaW4gcHJh Y3RpY2UgMTZ4NCBzZWVtcyBmYXN0ZXN0LgotCSAqCi0JICogTm90ZSB0aGF0IFBTL1dNIHRocmVh ZCBjb3VudHMgZGVwZW5kIG9uIHRoZSBXSVogaGFzaGluZwotCSAqIGRpc2FibGUgYml0LCB3aGlj aCB3ZSBkb24ndCB0b3VjaCBoZXJlLCBidXQgaXQncyBnb29kCi0JICogdG8ga2VlcCBpbiBtaW5k IChzZWUgM0RTVEFURV9QUyBhbmQgM0RTVEFURV9XTSkuCi0JICovCi0JV0FfU0VUX0ZJRUxEX01B U0tFRChHRU43X0dUX01PREUsCi0JCQkgICAgR0VONl9XSVpfSEFTSElOR19NQVNLLAotCQkJICAg IEdFTjZfV0laX0hBU0hJTkdfMTZ4NCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBi ZHdfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0J c3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OwotCWludCBy ZXQ7Ci0KLQlyZXQgPSBnZW44X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKLQlpZiAocmV0KQot CQlyZXR1cm4gcmV0OwotCi0JLyogV2FEaXNhYmxlVGhyZWFkU3RhbGxEb3BDbG9ja0dhdGluZzpi ZHcgKHByZS1wcm9kdWN0aW9uKSAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjhfUk9XX0NISUNL RU4sIFNUQUxMX0RPUF9HQVRJTkdfRElTQUJMRSk7Ci0KLQkvKiBXYURpc2FibGVEb3BDbG9ja0dh dGluZzpiZHcKLQkgKgotCSAqIEFsc28gc2VlIHRoZSByZWxhdGVkIFVDR1RDTDEgd3JpdGUgaW4g YnJvYWR3ZWxsX2luaXRfY2xvY2tfZ2F0aW5nKCkKLQkgKiB0byBkaXNhYmxlIEVVVEMgY2xvY2sg Z2F0aW5nLgotCSAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjdfUk9XX0NISUNLRU4yLAotCQkJ ICBET1BfQ0xPQ0tfR0FUSU5HX0RJU0FCTEUpOwotCi0JV0FfU0VUX0JJVF9NQVNLRUQoSEFMRl9T TElDRV9DSElDS0VOMywKLQkJCSAgR0VOOF9TQU1QTEVSX1BPV0VSX0JZUEFTU19ESVMpOwotCi0J V0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4wLAotCQkJICAvKiBXYUZvcmNlQ29udGV4dFNh dmVSZXN0b3JlTm9uQ29oZXJlbnQ6YmR3ICovCi0JCQkgIEhEQ19GT1JDRV9DT05URVhUX1NBVkVf UkVTVE9SRV9OT05fQ09IRVJFTlQgfAotCQkJICAvKiBXYURpc2FibGVGZW5jZURlc3RpbmF0aW9u VG9TTE06YmR3IChwcmUtcHJvZCkgKi8KLQkJCSAgKElTX0JEV19HVDMoZGV2X3ByaXYpID8gSERD X0ZFTkNFX0RFU1RfU0xNX0RJU0FCTEUgOiAwKSk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGlj IGludCBjaHZfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUp Ci17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1Owot CWludCByZXQ7Ci0KLQlyZXQgPSBnZW44X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKLQlpZiAo cmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogV2FEaXNhYmxlVGhyZWFkU3RhbGxEb3BDbG9ja0dh dGluZzpjaHYgKi8KLQlXQV9TRVRfQklUX01BU0tFRChHRU44X1JPV19DSElDS0VOLCBTVEFMTF9E T1BfR0FUSU5HX0RJU0FCTEUpOwotCi0JLyogSW1wcm92ZSBIaVogdGhyb3VnaHB1dCBvbiBDSFYu ICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoSElaX0NISUNLRU4sIENIVl9IWl84WDhfTU9ERV9JTl8x WCk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZW45X2luaXRfd29ya2Fyb3VuZHMo c3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2 YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQlpbnQgcmV0OwotCi0JLyogV2FDb25leHRT d2l0Y2hXaXRoQ29uY3VycmVudFRMQkludmFsaWRhdGU6c2tsLGJ4dCxrYmwsZ2xrICovCi0JSTkx NV9XUklURShHRU45X0NTRkVfQ0hJQ0tFTjFfUkNTLCBfTUFTS0VEX0JJVF9FTkFCTEUoR0VOOV9Q UkVFTVBUX0dQR1BVX1NZTkNfU1dJVENIX0RJU0FCTEUpKTsKLQotCS8qIFdhRW5hYmxlTGJzU2xh UmV0cnlUaW1lckRlY3JlbWVudDpza2wsYnh0LGtibCxnbGsgKi8KLQlJOTE1X1dSSVRFKEJEV19T Q1JBVENIMSwgSTkxNV9SRUFEKEJEV19TQ1JBVENIMSkgfAotCQkgICBHRU45X0xCU19TTEFfUkVU UllfVElNRVJfREVDUkVNRU5UX0VOQUJMRSk7Ci0KLQkvKiBXYURpc2FibGVLaWxsTG9naWM6Ynh0 LHNrbCxrYmwgKi8KLQlJOTE1X1dSSVRFKEdBTV9FQ09DSEssIEk5MTVfUkVBRChHQU1fRUNPQ0hL KSB8Ci0JCSAgIEVDT0NIS19ESVNfVExCKTsKLQotCS8qIFdhQ2xlYXJGbG93Q29udHJvbEdwZ3B1 Q29udGV4dFNhdmU6c2tsLGJ4dCxrYmwsZ2xrICovCi0JLyogV2FEaXNhYmxlUGFydGlhbEluc3RT aG9vdGRvd246c2tsLGJ4dCxrYmwsZ2xrICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9ST1df Q0hJQ0tFTiwKLQkJCSAgRkxPV19DT05UUk9MX0VOQUJMRSB8Ci0JCQkgIFBBUlRJQUxfSU5TVFJV Q1RJT05fU0hPT1RET1dOX0RJU0FCTEUpOwotCi0JLyogU3luY2luZyBkZXBlbmRlbmNpZXMgYmV0 d2VlbiBjYW1lcmEgYW5kIGdyYXBoaWNzOnNrbCxieHQsa2JsICovCi0JV0FfU0VUX0JJVF9NQVNL RUQoSEFMRl9TTElDRV9DSElDS0VOMywKLQkJCSAgR0VOOV9ESVNBQkxFX09DTF9PT0JfU1VQUFJF U1NfTE9HSUMpOwotCi0JLyogV2FEaXNhYmxlRGdNaXJyb3JGaXhJbkhhbGZTbGljZUNoaWNrZW41 OmJ4dCAqLwotCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJRF9BMSkpCi0J CVdBX0NMUl9CSVRfTUFTS0VEKEdFTjlfSEFMRl9TTElDRV9DSElDS0VONSwKLQkJCQkgIEdFTjlf REdfTUlSUk9SX0ZJWF9FTkFCTEUpOwotCi0JLyogV2FTZXREaXNhYmxlUGl4TWFza0NhbW1pbmdB bmRSaHdvSW5Db21tb25TbGljZUNoaWNrZW46Ynh0ICovCi0JaWYgKElTX0JYVF9SRVZJRChkZXZf cHJpdiwgMCwgQlhUX1JFVklEX0ExKSkgewotCQlXQV9TRVRfQklUX01BU0tFRChHRU43X0NPTU1P Tl9TTElDRV9DSElDS0VOMSwKLQkJCQkgIEdFTjlfUkhXT19PUFRJTUlaQVRJT05fRElTQUJMRSk7 Ci0JCS8qCi0JCSAqIFdBIGFsc28gcmVxdWlyZXMgR0VOOV9TTElDRV9DT01NT05fRUNPX0NISUNL RU4wWzE0OjE0XSB0byBiZSBzZXQKLQkJICogYnV0IHdlIGRvIHRoYXQgaW4gcGVyIGN0eCBiYXRj aGJ1ZmZlciBhcyB0aGVyZSBpcyBhbiBpc3N1ZQotCQkgKiB3aXRoIHRoaXMgcmVnaXN0ZXIgbm90 IGdldHRpbmcgcmVzdG9yZWQgb24gY3R4IHJlc3RvcmUKLQkJICovCi0JfQotCi0JLyogV2FFbmFi bGVTYW1wbGVyR1BHUFVQcmVlbXB0aW9uU3VwcG9ydDpza2wsYnh0LGtibCAqLwotCVdBX1NFVF9C SVRfTUFTS0VEKEdFTjlfSEFMRl9TTElDRV9DSElDS0VONywKLQkJCSAgR0VOOV9FTkFCTEVfR1BH UFVfUFJFRU1QVElPTik7Ci0KLQkvKiBXYTR4NFNUQ09wdGltaXphdGlvbkRpc2FibGU6c2tsLGJ4 dCxrYmwsZ2xrICovCi0JLyogV2FEaXNhYmxlUGFydGlhbFJlc29sdmVJblZjOnNrbCxieHQsa2Js ICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoQ0FDSEVfTU9ERV8xLCAoR0VOOF80eDRfU1RDX09QVElN SVpBVElPTl9ESVNBQkxFIHwKLQkJCQkJIEdFTjlfUEFSVElBTF9SRVNPTFZFX0lOX1ZDX0RJU0FC TEUpKTsKLQotCS8qIFdhQ2NzVGxiUHJlZmV0Y2hEaXNhYmxlOnNrbCxieHQsa2JsLGdsayAqLwot CVdBX0NMUl9CSVRfTUFTS0VEKEdFTjlfSEFMRl9TTElDRV9DSElDS0VONSwKLQkJCSAgR0VOOV9D Q1NfVExCX1BSRUZFVENIX0VOQUJMRSk7Ci0KLQkvKiBXYURpc2FibGVNYXNrQmFzZWRDYW1taW5n SW5SQ0M6Ynh0ICovCi0JaWYgKElTX0JYVF9SRVZJRChkZXZfcHJpdiwgMCwgQlhUX1JFVklEX0Ex KSkKLQkJV0FfU0VUX0JJVF9NQVNLRUQoU0xJQ0VfRUNPX0NISUNLRU4wLAotCQkJCSAgUElYRUxf TUFTS19DQU1NSU5HX0RJU0FCTEUpOwotCi0JLyogV2FGb3JjZUNvbnRleHRTYXZlUmVzdG9yZU5v bkNvaGVyZW50OnNrbCxieHQsa2JsICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4w LAotCQkJICBIRENfRk9SQ0VfQ09OVEVYVF9TQVZFX1JFU1RPUkVfTk9OX0NPSEVSRU5UIHwKLQkJ CSAgSERDX0ZPUkNFX0NTUl9OT05fQ09IRVJFTlRfT1ZSX0RJU0FCTEUpOwotCi0JLyogV2FGb3Jj ZUVuYWJsZU5vbkNvaGVyZW50IGFuZCBXYURpc2FibGVIRENJbnZhbGlkYXRpb24gYXJlCi0JICog Ym90aCB0aWVkIHRvIFdhRm9yY2VDb250ZXh0U2F2ZVJlc3RvcmVOb25Db2hlcmVudAotCSAqIGlu IHNvbWUgaHNkcyBmb3Igc2tsLiBXZSBrZWVwIHRoZSB0aWUgZm9yIGFsbCBnZW45LiBUaGUKLQkg KiBkb2N1bWVudGF0aW9uIGlzIGEgYml0IGhhenkgYW5kIHNvIHdlIHdhbnQgdG8gZ2V0IGNvbW1v biBiZWhhdmlvdXIsCi0JICogZXZlbiB0aG91Z2ggdGhlcmUgaXMgbm8gY2xlYXIgZXZpZGVuY2Ug d2Ugd291bGQgbmVlZCBib3RoIG9uIGtibC9ieHQuCi0JICogVGhpcyBhcmVhIGhhcyBiZWVuIHNv dXJjZSBvZiBzeXN0ZW0gaGFuZ3Mgc28gd2UgcGxheSBpdCBzYWZlCi0JICogYW5kIG1pbWljIHRo ZSBza2wgcmVnYXJkbGVzcyBvZiB3aGF0IGJzcGVjIHNheXMuCi0JICoKLQkgKiBVc2UgRm9yY2Ug Tm9uLUNvaGVyZW50IHdoZW5ldmVyIGV4ZWN1dGluZyBhIDNEIGNvbnRleHQuIFRoaXMKLQkgKiBp cyBhIHdvcmthcm91bmQgZm9yIGEgcG9zc2libGUgaGFuZyBpbiB0aGUgdW5saWtlbHkgZXZlbnQK LQkgKiBhIFRMQiBpbnZhbGlkYXRpb24gb2NjdXJzIGR1cmluZyBhIFBTRCBmbHVzaC4KLQkgKi8K LQotCS8qIFdhRm9yY2VFbmFibGVOb25Db2hlcmVudDpza2wsYnh0LGtibCAqLwotCVdBX1NFVF9C SVRfTUFTS0VEKEhEQ19DSElDS0VOMCwKLQkJCSAgSERDX0ZPUkNFX05PTl9DT0hFUkVOVCk7Ci0K LQkvKiBXYURpc2FibGVIRENJbnZhbGlkYXRpb246c2tsLGJ4dCxrYmwgKi8KLQlJOTE1X1dSSVRF KEdBTV9FQ09DSEssIEk5MTVfUkVBRChHQU1fRUNPQ0hLKSB8Ci0JCSAgIEJEV19ESVNBQkxFX0hE Q19JTlZBTElEQVRJT04pOwotCi0JLyogV2FEaXNhYmxlU2FtcGxlclBvd2VyQnlwYXNzRm9yU09Q aW5nUG9uZzpza2wsYnh0LGtibCAqLwotCWlmIChJU19TS1lMQUtFKGRldl9wcml2KSB8fAotCSAg ICBJU19LQUJZTEFLRShkZXZfcHJpdikgfHwKLQkgICAgSVNfQlhUX1JFVklEKGRldl9wcml2LCAw LCBCWFRfUkVWSURfQjApKQotCQlXQV9TRVRfQklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4z LAotCQkJCSAgR0VOOF9TQU1QTEVSX1BPV0VSX0JZUEFTU19ESVMpOwotCi0JLyogV2FEaXNhYmxl U1RVbml0UG93ZXJPcHRpbWl6YXRpb246c2tsLGJ4dCxrYmwsZ2xrICovCi0JV0FfU0VUX0JJVF9N QVNLRUQoSEFMRl9TTElDRV9DSElDS0VOMiwgR0VOOF9TVF9QT19ESVNBQkxFKTsKLQotCS8qIFdh T0NMQ29oZXJlbnRMaW5lRmx1c2g6c2tsLGJ4dCxrYmwgKi8KLQlJOTE1X1dSSVRFKEdFTjhfTDNT UUNSRUc0LCAoSTkxNV9SRUFEKEdFTjhfTDNTUUNSRUc0KSB8Ci0JCQkJICAgIEdFTjhfTFFTQ19G TFVTSF9DT0hFUkVOVF9MSU5FUykpOwotCi0JLyogV2FWRkVTdGF0ZUFmdGVyUGlwZUNvbnRyb2x3 aXRoTWVkaWFTdGF0ZUNsZWFyOnNrbCxieHQsZ2xrICovCi0JcmV0ID0gd2FfcmluZ193aGl0ZWxp c3RfcmVnKGVuZ2luZSwgR0VOOV9DVFhfUFJFRU1QVF9SRUcpOwotCWlmIChyZXQpCi0JCXJldHVy biByZXQ7Ci0KLQkvKiBXYUVuYWJsZVByZWVtcHRpb25HcmFudWxhcml0eUNvbnRyb2xCeVVNRDpz a2wsYnh0LGtibCAqLwotCXJldD0gd2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOF9D U19DSElDS0VOMSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdhQWxsb3dVTURU b01vZGlmeUhEQ0NoaWNrZW4xOnNrbCxieHQsa2JsLGdsayAqLwotCXJldCA9IHdhX3Jpbmdfd2hp dGVsaXN0X3JlZyhlbmdpbmUsIEdFTjhfSERDX0NISUNLRU4xKTsKLQlpZiAocmV0KQotCQlyZXR1 cm4gcmV0OwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgc2tsX3R1bmVfaXpfaGFzaGlu ZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3By aXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OwotCXU4IHZhbHNbM10gPSB7IDAsIDAsIDAg fTsKLQl1bnNpZ25lZCBpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJdTgg c3M7Ci0KLQkJLyoKLQkJICogT25seSBjb25zaWRlciBzbGljZXMgd2hlcmUgb25lLCBhbmQgb25s eSBvbmUsIHN1YnNsaWNlIGhhcyA3Ci0JCSAqIEVVcwotCQkgKi8KLQkJaWYgKCFpc19wb3dlcl9v Zl8yKElOVEVMX0lORk8oZGV2X3ByaXYpLT5zc2V1LnN1YnNsaWNlXzdldVtpXSkpCi0JCQljb250 aW51ZTsKLQotCQkvKgotCQkgKiBzdWJzbGljZV83ZXVbaV0gIT0gMCAoYmVjYXVzZSBvZiB0aGUg Y2hlY2sgYWJvdmUpIGFuZAotCQkgKiBzc19tYXggPT0gNCAobWF4aW11bSBudW1iZXIgb2Ygc3Vi c2xpY2VzIHBvc3NpYmxlIHBlciBzbGljZSkKLQkJICoKLQkJICogLT4gICAgMCA8PSBzcyA8PSAz OwotCQkgKi8KLQkJc3MgPSBmZnMoSU5URUxfSU5GTyhkZXZfcHJpdiktPnNzZXUuc3Vic2xpY2Vf N2V1W2ldKSAtIDE7Ci0JCXZhbHNbaV0gPSAzIC0gc3M7Ci0JfQotCi0JaWYgKHZhbHNbMF0gPT0g MCAmJiB2YWxzWzFdID09IDAgJiYgdmFsc1syXSA9PSAwKQotCQlyZXR1cm4gMDsKLQotCS8qIFR1 bmUgSVogaGFzaGluZy4gU2VlIGludGVsX2RldmljZV9pbmZvX3J1bnRpbWVfaW5pdCgpICovCi0J V0FfU0VUX0ZJRUxEX01BU0tFRChHRU43X0dUX01PREUsCi0JCQkgICAgR0VOOV9JWl9IQVNISU5H X01BU0soMikgfAotCQkJICAgIEdFTjlfSVpfSEFTSElOR19NQVNLKDEpIHwKLQkJCSAgICBHRU45 X0laX0hBU0hJTkdfTUFTSygwKSwKLQkJCSAgICBHRU45X0laX0hBU0hJTkcoMiwgdmFsc1syXSkg fAotCQkJICAgIEdFTjlfSVpfSEFTSElORygxLCB2YWxzWzFdKSB8Ci0JCQkgICAgR0VOOV9JWl9I QVNISU5HKDAsIHZhbHNbMF0pKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHNrbF9p bml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlzdHJ1 Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50IHJldDsK LQotCXJldCA9IGdlbjlfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwotCWlmIChyZXQpCi0JCXJl dHVybiByZXQ7Ci0KLQkvKgotCSAqIEFjdHVhbCBXQSBpcyB0byBkaXNhYmxlIHBlcmNvbnRleHQg cHJlZW1wdGlvbiBncmFudWxhcml0eSBjb250cm9sCi0JICogdW50aWwgRDAgd2hpY2ggaXMgdGhl IGRlZmF1bHQgY2FzZSBzbyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KLQkgKiAhV2FEaXNhYmxlUGVy Q3R4dFByZWVtcHRpb25HcmFudWxhcml0eUNvbnRyb2w6c2tsCi0JICovCi0JSTkxNV9XUklURShH RU43X0ZGX1NMSUNFX0NTX0NISUNLRU4xLAotCQkgICBfTUFTS0VEX0JJVF9FTkFCTEUoR0VOOV9G RlNDX1BFUkNUWF9QUkVFTVBUX0NUUkwpKTsKLQotCS8qIFdhRW5hYmxlR2Fwc1RzdkNyZWRpdEZp eDpza2wgKi8KLQlJOTE1X1dSSVRFKEdFTjhfR0FSQkNOVEwsIChJOTE1X1JFQUQoR0VOOF9HQVJC Q05UTCkgfAotCQkJCSAgIEdFTjlfR0FQU19UU1ZfQ1JFRElUX0RJU0FCTEUpKTsKLQotCS8qIFdh RGlzYWJsZUdhZnNVbml0Q2xrR2F0aW5nOnNrbCAqLwotCVdBX1NFVF9CSVQoR0VON19VQ0dDVEw0 LCBHRU44X0VVX0dBVU5JVF9DTE9DS19HQVRFX0RJU0FCTEUpOwotCi0JLyogV2FJblBsYWNlRGVj b21wcmVzc2lvbkhhbmc6c2tsICovCi0JaWYgKElTX1NLTF9SRVZJRChkZXZfcHJpdiwgU0tMX1JF VklEX0gwLCBSRVZJRF9GT1JFVkVSKSkKLQkJV0FfU0VUX0JJVChHRU45X0dBTVRfRUNPX1JFR19S V19JQSwKLQkJCSAgIEdBTVRfRUNPX0VOQUJMRV9JTl9QTEFDRV9ERUNPTVBSRVNTKTsKLQotCS8q IFdhRGlzYWJsZUxTUUNST1BFUkZmb3JPQ0w6c2tsICovCi0JcmV0ID0gd2FfcmluZ193aGl0ZWxp c3RfcmVnKGVuZ2luZSwgR0VOOF9MM1NRQ1JFRzQpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7 Ci0KLQlyZXR1cm4gc2tsX3R1bmVfaXpfaGFzaGluZyhlbmdpbmUpOwotfQotCi1zdGF0aWMgaW50 IGJ4dF9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsK LQlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50 IHJldDsKLQotCXJldCA9IGdlbjlfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwotCWlmIChyZXQp Ci0JCXJldHVybiByZXQ7Ci0KLQkvKiBXYVN0b3JlTXVsdGlwbGVQVEVlbmFibGU6Ynh0ICovCi0J LyogVGhpcyBpcyBhIHJlcXVpcmVtZW50IGFjY29yZGluZyB0byBIYXJkd2FyZSBzcGVjaWZpY2F0 aW9uICovCi0JaWYgKElTX0JYVF9SRVZJRChkZXZfcHJpdiwgMCwgQlhUX1JFVklEX0ExKSkKLQkJ STkxNV9XUklURShUSUxFQ1RMLCBJOTE1X1JFQUQoVElMRUNUTCkgfCBUSUxFQ1RMX1RMQlBGKTsK LQotCS8qIFdhU2V0Q2xja0dhdGluZ0Rpc2FibGVNZWRpYTpieHQgKi8KLQlpZiAoSVNfQlhUX1JF VklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQTEpKSB7Ci0JCUk5MTVfV1JJVEUoR0VON19NSVND Q1BDVEwsIChJOTE1X1JFQUQoR0VON19NSVNDQ1BDVEwpICYKLQkJCQkJICAgIH5HRU44X0RPUF9D TE9DS19HQVRFX01FRElBX0VOQUJMRSkpOwotCX0KLQotCS8qIFdhRGlzYWJsZVRocmVhZFN0YWxs RG9wQ2xvY2tHYXRpbmc6Ynh0ICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9ST1dfQ0hJQ0tF TiwKLQkJCSAgU1RBTExfRE9QX0dBVElOR19ESVNBQkxFKTsKLQotCS8qIFdhRGlzYWJsZVBvb2xl ZEV1TG9hZEJhbGFuY2luZ0ZpeDpieHQgKi8KLQlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCBC WFRfUkVWSURfQjAsIFJFVklEX0ZPUkVWRVIpKSB7Ci0JCVdBX1NFVF9CSVRfTUFTS0VEKEZGX1NM SUNFX0NTX0NISUNLRU4yLAotCQkJCSAgR0VOOV9QT09MRURfRVVfTE9BRF9CQUxBTkNJTkdfRklY X0RJU0FCTEUpOwotCX0KLQotCS8qIFdhRGlzYWJsZVNiZUNhY2hlRGlzcGF0Y2hQb3J0U2hhcmlu ZzpieHQgKi8KLQlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQjApKSB7 Ci0JCVdBX1NFVF9CSVRfTUFTS0VEKAotCQkJR0VON19IQUxGX1NMSUNFX0NISUNLRU4xLAotCQkJ R0VON19TQkVfU1NfQ0FDSEVfRElTUEFUQ0hfUE9SVF9TSEFSSU5HX0RJU0FCTEUpOwotCX0KLQot CS8qIFdhRGlzYWJsZU9iamVjdExldmVsUHJlZW1wdGlvbkZvclRyaWZhbk9yUG9seWdvbjpieHQg Ki8KLQkvKiBXYURpc2FibGVPYmplY3RMZXZlbFByZWVtcHRpb25Gb3JJbnN0YW5jZWREcmF3OmJ4 dCAqLwotCS8qIFdhRGlzYWJsZU9iamVjdExldmVsUHJlZW10aW9uRm9ySW5zdGFuY2VJZDpieHQg Ki8KLQkvKiBXYURpc2FibGVMU1FDUk9QRVJGZm9yT0NMOmJ4dCAqLwotCWlmIChJU19CWFRfUkVW SUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJRF9BMSkpIHsKLQkJcmV0ID0gd2FfcmluZ193aGl0ZWxp c3RfcmVnKGVuZ2luZSwgR0VOOV9DU19ERUJVR19NT0RFMSk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1 cm4gcmV0OwotCi0JCXJldCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUsIEdFTjhfTDNT UUNSRUc0KTsKLQkJaWYgKHJldCkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JLyogV2FQcm9ncmFt TDNTcWNSZWcxRGVmYXVsdEZvclBlcmY6Ynh0ICovCi0JaWYgKElTX0JYVF9SRVZJRChkZXZfcHJp diwgQlhUX1JFVklEX0IwLCBSRVZJRF9GT1JFVkVSKSkKLQkJSTkxNV9XUklURShHRU44X0wzU1FD UkVHMSwgTDNfR0VORVJBTF9QUklPX0NSRURJVFMoNjIpIHwKLQkJCQkJICAgTDNfSElHSF9QUklP X0NSRURJVFMoMikpOwotCi0JLyogV2FUb0VuYWJsZUh3Rml4Rm9yUHVzaENvbnN0SFdCdWc6Ynh0 ICovCi0JaWYgKElTX0JYVF9SRVZJRChkZXZfcHJpdiwgQlhUX1JFVklEX0MwLCBSRVZJRF9GT1JF VkVSKSkKLQkJV0FfU0VUX0JJVF9NQVNLRUQoQ09NTU9OX1NMSUNFX0NISUNLRU4yLAotCQkJCSAg R0VOOF9TQkVfRElTQUJMRV9SRVBMQVlfQlVGX09QVElNSVpBVElPTik7Ci0KLQkvKiBXYUluUGxh Y2VEZWNvbXByZXNzaW9uSGFuZzpieHQgKi8KLQlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCBC WFRfUkVWSURfQzAsIFJFVklEX0ZPUkVWRVIpKQotCQlXQV9TRVRfQklUKEdFTjlfR0FNVF9FQ09f UkVHX1JXX0lBLAotCQkJICAgR0FNVF9FQ09fRU5BQkxFX0lOX1BMQUNFX0RFQ09NUFJFU1MpOwot Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQga2JsX2luaXRfd29ya2Fyb3VuZHMoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ2VuOV9pbml0X3dv cmthcm91bmRzKGVuZ2luZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdhRW5h YmxlR2Fwc1RzdkNyZWRpdEZpeDprYmwgKi8KLQlJOTE1X1dSSVRFKEdFTjhfR0FSQkNOVEwsIChJ OTE1X1JFQUQoR0VOOF9HQVJCQ05UTCkgfAotCQkJCSAgIEdFTjlfR0FQU19UU1ZfQ1JFRElUX0RJ U0FCTEUpKTsKLQotCS8qIFdhRGlzYWJsZUR5bmFtaWNDcmVkaXRTaGFyaW5nOmtibCAqLwotCWlm IChJU19LQkxfUkVWSUQoZGV2X3ByaXYsIDAsIEtCTF9SRVZJRF9CMCkpCi0JCVdBX1NFVF9CSVQo R0FNVF9DSEtOX0JJVF9SRUcsCi0JCQkgICBHQU1UX0NIS05fRElTQUJMRV9EWU5BTUlDX0NSRURJ VF9TSEFSSU5HKTsKLQotCS8qIFdhRGlzYWJsZUZlbmNlRGVzdGluYXRpb25Ub1NMTTprYmwgKHBy ZS1wcm9kKSAqLwotCWlmIChJU19LQkxfUkVWSUQoZGV2X3ByaXYsIEtCTF9SRVZJRF9BMCwgS0JM X1JFVklEX0EwKSkKLQkJV0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4wLAotCQkJCSAgSERD X0ZFTkNFX0RFU1RfU0xNX0RJU0FCTEUpOwotCi0JLyogV2FUb0VuYWJsZUh3Rml4Rm9yUHVzaENv bnN0SFdCdWc6a2JsICovCi0JaWYgKElTX0tCTF9SRVZJRChkZXZfcHJpdiwgS0JMX1JFVklEX0Mw LCBSRVZJRF9GT1JFVkVSKSkKLQkJV0FfU0VUX0JJVF9NQVNLRUQoQ09NTU9OX1NMSUNFX0NISUNL RU4yLAotCQkJCSAgR0VOOF9TQkVfRElTQUJMRV9SRVBMQVlfQlVGX09QVElNSVpBVElPTik7Ci0K LQkvKiBXYURpc2FibGVHYWZzVW5pdENsa0dhdGluZzprYmwgKi8KLQlXQV9TRVRfQklUKEdFTjdf VUNHQ1RMNCwgR0VOOF9FVV9HQVVOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsKLQotCS8qIFdhRGlz YWJsZVNiZUNhY2hlRGlzcGF0Y2hQb3J0U2hhcmluZzprYmwgKi8KLQlXQV9TRVRfQklUX01BU0tF RCgKLQkJR0VON19IQUxGX1NMSUNFX0NISUNLRU4xLAotCQlHRU43X1NCRV9TU19DQUNIRV9ESVNQ QVRDSF9QT1JUX1NIQVJJTkdfRElTQUJMRSk7Ci0KLQkvKiBXYUluUGxhY2VEZWNvbXByZXNzaW9u SGFuZzprYmwgKi8KLQlXQV9TRVRfQklUKEdFTjlfR0FNVF9FQ09fUkVHX1JXX0lBLAotCQkgICBH QU1UX0VDT19FTkFCTEVfSU5fUExBQ0VfREVDT01QUkVTUyk7Ci0KLQkvKiBXYURpc2FibGVMU1FD Uk9QRVJGZm9yT0NMOmtibCAqLwotCXJldCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUs IEdFTjhfTDNTUUNSRUc0KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIDA7 Ci19Ci0KLXN0YXRpYyBpbnQgZ2xrX2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVu Z2luZS0+aTkxNTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ2VuOV9pbml0X3dvcmthcm91bmRzKGVu Z2luZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdhVG9FbmFibGVId0ZpeEZv clB1c2hDb25zdEhXQnVnOmdsayAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElDRV9D SElDS0VOMiwKLQkJCSAgR0VOOF9TQkVfRElTQUJMRV9SRVBMQVlfQlVGX09QVElNSVpBVElPTik7 Ci0KLQlyZXR1cm4gMDsKLX0KLQotaW50IGluaXRfd29ya2Fyb3VuZHNfcmluZyhzdHJ1Y3QgaW50 ZWxfZW5naW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2ID0gZW5naW5lLT5pOTE1OwotCi0JV0FSTl9PTihlbmdpbmUtPmlkICE9IFJDUyk7Ci0KLQlk ZXZfcHJpdi0+d29ya2Fyb3VuZHMuY291bnQgPSAwOwotCWRldl9wcml2LT53b3JrYXJvdW5kcy5o d193aGl0ZWxpc3RfY291bnRbUkNTXSA9IDA7Ci0KLQlpZiAoSVNfQlJPQURXRUxMKGRldl9wcml2 KSkKLQkJcmV0dXJuIGJkd19pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7Ci0KLQlpZiAoSVNfQ0hF UlJZVklFVyhkZXZfcHJpdikpCi0JCXJldHVybiBjaHZfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUp OwotCi0JaWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpKQotCQlyZXR1cm4gc2tsX2luaXRfd29ya2Fy b3VuZHMoZW5naW5lKTsKLQotCWlmIChJU19CUk9YVE9OKGRldl9wcml2KSkKLQkJcmV0dXJuIGJ4 dF9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7Ci0KLQlpZiAoSVNfS0FCWUxBS0UoZGV2X3ByaXYp KQotCQlyZXR1cm4ga2JsX2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKLQotCWlmIChJU19HRU1J TklMQUtFKGRldl9wcml2KSkKLQkJcmV0dXJuIGdsa19pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7 Ci0KLQlyZXR1cm4gMDsKLX0KLQogc3RhdGljIGludCBpbml0X3JlbmRlcl9yaW5nKHN0cnVjdCBp bnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKIHsKIAlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2 X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0tIAoyLjkuMwoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRlbC1nZnhA bGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3JnL21haWxt YW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==