From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tvrtko Ursulin Subject: [PATCH 2/3] drm/i915: Move common engine and ring code into intel_engine_cs Date: Wed, 15 Feb 2017 14:05:52 +0000 Message-ID: <20170215140553.28751-3-tvrtko.ursulin@linux.intel.com> References: <20170215140553.28751-1-tvrtko.ursulin@linux.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail-wr0-x241.google.com (mail-wr0-x241.google.com [IPv6:2a00:1450:400c:c0c::241]) by gabe.freedesktop.org (Postfix) with ESMTPS id 8ED9B6E927 for ; Wed, 15 Feb 2017 14:06:22 +0000 (UTC) Received: by mail-wr0-x241.google.com with SMTP id k90so31245520wrc.3 for ; Wed, 15 Feb 2017 06:06:22 -0800 (PST) In-Reply-To: <20170215140553.28751-1-tvrtko.ursulin@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org RnJvbTogVHZydGtvIFVyc3VsaW4gPHR2cnRrby51cnN1bGluQGludGVsLmNvbT4KClRoaXMgbGVh dmVzIHRoZSByaW5nYnVmZiBzdWJtaXNzaW9uIGNvZGUgaW4gaW50ZWxfcmluZ2J1ZmZlci5jCgpT aWduZWQtb2ZmLWJ5OiBUdnJ0a28gVXJzdWxpbiA8dHZydGtvLnVyc3VsaW5AaW50ZWwuY29tPgot LS0KIGRyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVsX2VuZ2luZV9jcy5jICB8IDgzNCArKysrKysr KysrKysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfcmlu Z2J1ZmZlci5jIHwgODM0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAyIGZpbGVz IGNoYW5nZWQsIDgzNCBpbnNlcnRpb25zKCspLCA4MzQgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZW5naW5lX2NzLmMgYi9kcml2ZXJzL2dwdS9k cm0vaTkxNS9pbnRlbF9lbmdpbmVfY3MuYwppbmRleCA1MzhkODQ1ZDcyNTEuLmFmYWVkYzNhZGMy ZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZW5naW5lX2NzLmMKKysr IGIvZHJpdmVycy9ncHUvZHJtL2k5MTUvaW50ZWxfZW5naW5lX2NzLmMKQEAgLTUyNSw2ICs1MjUs ODQwIEBAIHZvaWQgaW50ZWxfZW5naW5lX2dldF9pbnN0ZG9uZShzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUsCiAJfQogfQogCitzdGF0aWMgaW50IHdhX2FkZChzdHJ1Y3QgZHJtX2k5MTVf cHJpdmF0ZSAqZGV2X3ByaXYsCisJCSAgaTkxNV9yZWdfdCBhZGRyLAorCQkgIGNvbnN0IHUzMiBt YXNrLCBjb25zdCB1MzIgdmFsKQoreworCWNvbnN0IHUzMiBpZHggPSBkZXZfcHJpdi0+d29ya2Fy b3VuZHMuY291bnQ7CisKKwlpZiAoV0FSTl9PTihpZHggPj0gSTkxNV9NQVhfV0FfUkVHUykpCisJ CXJldHVybiAtRU5PU1BDOworCisJZGV2X3ByaXYtPndvcmthcm91bmRzLnJlZ1tpZHhdLmFkZHIg PSBhZGRyOworCWRldl9wcml2LT53b3JrYXJvdW5kcy5yZWdbaWR4XS52YWx1ZSA9IHZhbDsKKwlk ZXZfcHJpdi0+d29ya2Fyb3VuZHMucmVnW2lkeF0ubWFzayA9IG1hc2s7CisKKwlkZXZfcHJpdi0+ d29ya2Fyb3VuZHMuY291bnQrKzsKKworCXJldHVybiAwOworfQorCisjZGVmaW5lIFdBX1JFRyhh ZGRyLCBtYXNrLCB2YWwpIGRvIHsgXAorCQljb25zdCBpbnQgciA9IHdhX2FkZChkZXZfcHJpdiwg KGFkZHIpLCAobWFzayksICh2YWwpKTsgXAorCQlpZiAocikgXAorCQkJcmV0dXJuIHI7IFwKKwl9 IHdoaWxlICgwKQorCisjZGVmaW5lIFdBX1NFVF9CSVRfTUFTS0VEKGFkZHIsIG1hc2spIFwKKwlX QV9SRUcoYWRkciwgKG1hc2spLCBfTUFTS0VEX0JJVF9FTkFCTEUobWFzaykpCisKKyNkZWZpbmUg V0FfQ0xSX0JJVF9NQVNLRUQoYWRkciwgbWFzaykgXAorCVdBX1JFRyhhZGRyLCAobWFzayksIF9N QVNLRURfQklUX0RJU0FCTEUobWFzaykpCisKKyNkZWZpbmUgV0FfU0VUX0ZJRUxEX01BU0tFRChh ZGRyLCBtYXNrLCB2YWx1ZSkgXAorCVdBX1JFRyhhZGRyLCBtYXNrLCBfTUFTS0VEX0ZJRUxEKG1h c2ssIHZhbHVlKSkKKworI2RlZmluZSBXQV9TRVRfQklUKGFkZHIsIG1hc2spIFdBX1JFRyhhZGRy LCBtYXNrLCBJOTE1X1JFQUQoYWRkcikgfCAobWFzaykpCisjZGVmaW5lIFdBX0NMUl9CSVQoYWRk ciwgbWFzaykgV0FfUkVHKGFkZHIsIG1hc2ssIEk5MTVfUkVBRChhZGRyKSAmIH4obWFzaykpCisK KyNkZWZpbmUgV0FfV1JJVEUoYWRkciwgdmFsKSBXQV9SRUcoYWRkciwgMHhmZmZmZmZmZiwgdmFs KQorCitzdGF0aWMgaW50IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhzdHJ1Y3QgaW50ZWxfZW5naW5l X2NzICplbmdpbmUsCisJCQkJIGk5MTVfcmVnX3QgcmVnKQoreworCXN0cnVjdCBkcm1faTkxNV9w cml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKKwlzdHJ1Y3QgaTkxNV93b3JrYXJvdW5k cyAqd2EgPSAmZGV2X3ByaXYtPndvcmthcm91bmRzOworCWNvbnN0IHVpbnQzMl90IGluZGV4ID0g d2EtPmh3X3doaXRlbGlzdF9jb3VudFtlbmdpbmUtPmlkXTsKKworCWlmIChXQVJOX09OKGluZGV4 ID49IFJJTkdfTUFYX05PTlBSSVZfU0xPVFMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVdBX1dS SVRFKFJJTkdfRk9SQ0VfVE9fTk9OUFJJVihlbmdpbmUtPm1taW9fYmFzZSwgaW5kZXgpLAorCQkg aTkxNV9tbWlvX3JlZ19vZmZzZXQocmVnKSk7CisJd2EtPmh3X3doaXRlbGlzdF9jb3VudFtlbmdp bmUtPmlkXSsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ2VuOF9pbml0X3dvcmth cm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5 MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisKKwlXQV9TRVRfQklUX01BU0tF RChJTlNUUE0sIElOU1RQTV9GT1JDRV9PUkRFUklORyk7CisKKwkvKiBXYURpc2FibGVBc3luY0Zs aXBQZXJmTW9kZTpiZHcsY2h2ICovCisJV0FfU0VUX0JJVF9NQVNLRUQoTUlfTU9ERSwgQVNZTkNf RkxJUF9QRVJGX0RJU0FCTEUpOworCisJLyogV2FEaXNhYmxlUGFydGlhbEluc3RTaG9vdGRvd246 YmR3LGNodiAqLworCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjhfUk9XX0NISUNLRU4sCisJCQkgIFBB UlRJQUxfSU5TVFJVQ1RJT05fU0hPT1RET1dOX0RJU0FCTEUpOworCisJLyogVXNlIEZvcmNlIE5v bi1Db2hlcmVudCB3aGVuZXZlciBleGVjdXRpbmcgYSAzRCBjb250ZXh0LiBUaGlzIGlzIGEKKwkg KiB3b3JrYXJvdW5kIGZvciBmb3IgYSBwb3NzaWJsZSBoYW5nIGluIHRoZSB1bmxpa2VseSBldmVu dCBhIFRMQgorCSAqIGludmFsaWRhdGlvbiBvY2N1cnMgZHVyaW5nIGEgUFNEIGZsdXNoLgorCSAq LworCS8qIFdhRm9yY2VFbmFibGVOb25Db2hlcmVudDpiZHcsY2h2ICovCisJLyogV2FIZGNEaXNh YmxlRmV0Y2hXaGVuTWFza2VkOmJkdyxjaHYgKi8KKwlXQV9TRVRfQklUX01BU0tFRChIRENfQ0hJ Q0tFTjAsCisJCQkgIEhEQ19ET05PVF9GRVRDSF9NRU1fV0hFTl9NQVNLRUQgfAorCQkJICBIRENf Rk9SQ0VfTk9OX0NPSEVSRU5UKTsKKworCS8qIEZyb20gdGhlIEhhc3dlbGwgUFJNLCBDb21tYW5k IFJlZmVyZW5jZTogUmVnaXN0ZXJzLCBDQUNIRV9NT0RFXzA6CisJICogIlRoZSBIaWVyYXJjaGlj YWwgWiBSQVcgU3RhbGwgT3B0aW1pemF0aW9uIGFsbG93cyBub24tb3ZlcmxhcHBpbmcKKwkgKiAg cG9seWdvbnMgaW4gdGhlIHNhbWUgOHg0IHBpeGVsL3NhbXBsZSBhcmVhIHRvIGJlIHByb2Nlc3Nl ZCB3aXRob3V0CisJICogIHN0YWxsaW5nIHdhaXRpbmcgZm9yIHRoZSBlYXJsaWVyIG9uZXMgdG8g d3JpdGUgdG8gSGllcmFyY2hpY2FsIFoKKwkgKiAgYnVmZmVyLiIKKwkgKgorCSAqIFRoaXMgb3B0 aW1pemF0aW9uIGlzIG9mZiBieSBkZWZhdWx0IGZvciBCRFcgYW5kIENIVjsgdHVybiBpdCBvbi4K KwkgKi8KKwlXQV9DTFJfQklUX01BU0tFRChDQUNIRV9NT0RFXzBfR0VONywgSElaX1JBV19TVEFM TF9PUFRfRElTQUJMRSk7CisKKwkvKiBXYTR4NFNUQ09wdGltaXphdGlvbkRpc2FibGU6YmR3LGNo diAqLworCVdBX1NFVF9CSVRfTUFTS0VEKENBQ0hFX01PREVfMSwgR0VOOF80eDRfU1RDX09QVElN SVpBVElPTl9ESVNBQkxFKTsKKworCS8qCisJICogQlNwZWMgcmVjb21tZW5kcyA4eDQgd2hlbiBN U0FBIGlzIHVzZWQsCisJICogaG93ZXZlciBpbiBwcmFjdGljZSAxNng0IHNlZW1zIGZhc3Rlc3Qu CisJICoKKwkgKiBOb3RlIHRoYXQgUFMvV00gdGhyZWFkIGNvdW50cyBkZXBlbmQgb24gdGhlIFdJ WiBoYXNoaW5nCisJICogZGlzYWJsZSBiaXQsIHdoaWNoIHdlIGRvbid0IHRvdWNoIGhlcmUsIGJ1 dCBpdCdzIGdvb2QKKwkgKiB0byBrZWVwIGluIG1pbmQgKHNlZSAzRFNUQVRFX1BTIGFuZCAzRFNU QVRFX1dNKS4KKwkgKi8KKwlXQV9TRVRfRklFTERfTUFTS0VEKEdFTjdfR1RfTU9ERSwKKwkJCSAg ICBHRU42X1dJWl9IQVNISU5HX01BU0ssCisJCQkgICAgR0VONl9XSVpfSEFTSElOR18xNng0KTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJkd19pbml0X3dvcmthcm91bmRzKHN0cnVj dCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisJaW50IHJldDsKKworCXJldCA9IGdlbjhfaW5pdF93 b3JrYXJvdW5kcyhlbmdpbmUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkvKiBXYURp c2FibGVUaHJlYWRTdGFsbERvcENsb2NrR2F0aW5nOmJkdyAocHJlLXByb2R1Y3Rpb24pICovCisJ V0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9ST1dfQ0hJQ0tFTiwgU1RBTExfRE9QX0dBVElOR19ESVNB QkxFKTsKKworCS8qIFdhRGlzYWJsZURvcENsb2NrR2F0aW5nOmJkdworCSAqCisJICogQWxzbyBz ZWUgdGhlIHJlbGF0ZWQgVUNHVENMMSB3cml0ZSBpbiBicm9hZHdlbGxfaW5pdF9jbG9ja19nYXRp bmcoKQorCSAqIHRvIGRpc2FibGUgRVVUQyBjbG9jayBnYXRpbmcuCisJICovCisJV0FfU0VUX0JJ VF9NQVNLRUQoR0VON19ST1dfQ0hJQ0tFTjIsCisJCQkgIERPUF9DTE9DS19HQVRJTkdfRElTQUJM RSk7CisKKwlXQV9TRVRfQklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4zLAorCQkJICBHRU44 X1NBTVBMRVJfUE9XRVJfQllQQVNTX0RJUyk7CisKKwlXQV9TRVRfQklUX01BU0tFRChIRENfQ0hJ Q0tFTjAsCisJCQkgIC8qIFdhRm9yY2VDb250ZXh0U2F2ZVJlc3RvcmVOb25Db2hlcmVudDpiZHcg Ki8KKwkJCSAgSERDX0ZPUkNFX0NPTlRFWFRfU0FWRV9SRVNUT1JFX05PTl9DT0hFUkVOVCB8CisJ CQkgIC8qIFdhRGlzYWJsZUZlbmNlRGVzdGluYXRpb25Ub1NMTTpiZHcgKHByZS1wcm9kKSAqLwor CQkJICAoSVNfQkRXX0dUMyhkZXZfcHJpdikgPyBIRENfRkVOQ0VfREVTVF9TTE1fRElTQUJMRSA6 IDApKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNodl9pbml0X3dvcmthcm91bmRz KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisJaW50IHJldDsKKworCXJldCA9IGdlbjhf aW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwkv KiBXYURpc2FibGVUaHJlYWRTdGFsbERvcENsb2NrR2F0aW5nOmNodiAqLworCVdBX1NFVF9CSVRf TUFTS0VEKEdFTjhfUk9XX0NISUNLRU4sIFNUQUxMX0RPUF9HQVRJTkdfRElTQUJMRSk7CisKKwkv KiBJbXByb3ZlIEhpWiB0aHJvdWdocHV0IG9uIENIVi4gKi8KKwlXQV9TRVRfQklUX01BU0tFRChI SVpfQ0hJQ0tFTiwgQ0hWX0haXzhYOF9NT0RFX0lOXzFYKTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgaW50IGdlbjlfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICpl bmdpbmUpCit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5p OTE1OworCWludCByZXQ7CisKKwkvKiBXYUNvbmV4dFN3aXRjaFdpdGhDb25jdXJyZW50VExCSW52 YWxpZGF0ZTpza2wsYnh0LGtibCxnbGsgKi8KKwlJOTE1X1dSSVRFKEdFTjlfQ1NGRV9DSElDS0VO MV9SQ1MsIF9NQVNLRURfQklUX0VOQUJMRShHRU45X1BSRUVNUFRfR1BHUFVfU1lOQ19TV0lUQ0hf RElTQUJMRSkpOworCisJLyogV2FFbmFibGVMYnNTbGFSZXRyeVRpbWVyRGVjcmVtZW50OnNrbCxi eHQsa2JsLGdsayAqLworCUk5MTVfV1JJVEUoQkRXX1NDUkFUQ0gxLCBJOTE1X1JFQUQoQkRXX1ND UkFUQ0gxKSB8CisJCSAgIEdFTjlfTEJTX1NMQV9SRVRSWV9USU1FUl9ERUNSRU1FTlRfRU5BQkxF KTsKKworCS8qIFdhRGlzYWJsZUtpbGxMb2dpYzpieHQsc2tsLGtibCAqLworCUk5MTVfV1JJVEUo R0FNX0VDT0NISywgSTkxNV9SRUFEKEdBTV9FQ09DSEspIHwKKwkJICAgRUNPQ0hLX0RJU19UTEIp OworCisJLyogV2FDbGVhckZsb3dDb250cm9sR3BncHVDb250ZXh0U2F2ZTpza2wsYnh0LGtibCxn bGsgKi8KKwkvKiBXYURpc2FibGVQYXJ0aWFsSW5zdFNob290ZG93bjpza2wsYnh0LGtibCxnbGsg Ki8KKwlXQV9TRVRfQklUX01BU0tFRChHRU44X1JPV19DSElDS0VOLAorCQkJICBGTE9XX0NPTlRS T0xfRU5BQkxFIHwKKwkJCSAgUEFSVElBTF9JTlNUUlVDVElPTl9TSE9PVERPV05fRElTQUJMRSk7 CisKKwkvKiBTeW5jaW5nIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGNhbWVyYSBhbmQgZ3JhcGhpY3M6 c2tsLGJ4dCxrYmwgKi8KKwlXQV9TRVRfQklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4zLAor CQkJICBHRU45X0RJU0FCTEVfT0NMX09PQl9TVVBQUkVTU19MT0dJQyk7CisKKwkvKiBXYURpc2Fi bGVEZ01pcnJvckZpeEluSGFsZlNsaWNlQ2hpY2tlbjU6Ynh0ICovCisJaWYgKElTX0JYVF9SRVZJ RChkZXZfcHJpdiwgMCwgQlhUX1JFVklEX0ExKSkKKwkJV0FfQ0xSX0JJVF9NQVNLRUQoR0VOOV9I QUxGX1NMSUNFX0NISUNLRU41LAorCQkJCSAgR0VOOV9ER19NSVJST1JfRklYX0VOQUJMRSk7CisK KwkvKiBXYVNldERpc2FibGVQaXhNYXNrQ2FtbWluZ0FuZFJod29JbkNvbW1vblNsaWNlQ2hpY2tl bjpieHQgKi8KKwlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQTEpKSB7 CisJCVdBX1NFVF9CSVRfTUFTS0VEKEdFTjdfQ09NTU9OX1NMSUNFX0NISUNLRU4xLAorCQkJCSAg R0VOOV9SSFdPX09QVElNSVpBVElPTl9ESVNBQkxFKTsKKwkJLyoKKwkJICogV0EgYWxzbyByZXF1 aXJlcyBHRU45X1NMSUNFX0NPTU1PTl9FQ09fQ0hJQ0tFTjBbMTQ6MTRdIHRvIGJlIHNldAorCQkg KiBidXQgd2UgZG8gdGhhdCBpbiBwZXIgY3R4IGJhdGNoYnVmZmVyIGFzIHRoZXJlIGlzIGFuIGlz c3VlCisJCSAqIHdpdGggdGhpcyByZWdpc3RlciBub3QgZ2V0dGluZyByZXN0b3JlZCBvbiBjdHgg cmVzdG9yZQorCQkgKi8KKwl9CisKKwkvKiBXYUVuYWJsZVNhbXBsZXJHUEdQVVByZWVtcHRpb25T dXBwb3J0OnNrbCxieHQsa2JsICovCisJV0FfU0VUX0JJVF9NQVNLRUQoR0VOOV9IQUxGX1NMSUNF X0NISUNLRU43LAorCQkJICBHRU45X0VOQUJMRV9HUEdQVV9QUkVFTVBUSU9OKTsKKworCS8qIFdh NHg0U1RDT3B0aW1pemF0aW9uRGlzYWJsZTpza2wsYnh0LGtibCxnbGsgKi8KKwkvKiBXYURpc2Fi bGVQYXJ0aWFsUmVzb2x2ZUluVmM6c2tsLGJ4dCxrYmwgKi8KKwlXQV9TRVRfQklUX01BU0tFRChD QUNIRV9NT0RFXzEsIChHRU44XzR4NF9TVENfT1BUSU1JWkFUSU9OX0RJU0FCTEUgfAorCQkJCQkg R0VOOV9QQVJUSUFMX1JFU09MVkVfSU5fVkNfRElTQUJMRSkpOworCisJLyogV2FDY3NUbGJQcmVm ZXRjaERpc2FibGU6c2tsLGJ4dCxrYmwsZ2xrICovCisJV0FfQ0xSX0JJVF9NQVNLRUQoR0VOOV9I QUxGX1NMSUNFX0NISUNLRU41LAorCQkJICBHRU45X0NDU19UTEJfUFJFRkVUQ0hfRU5BQkxFKTsK KworCS8qIFdhRGlzYWJsZU1hc2tCYXNlZENhbW1pbmdJblJDQzpieHQgKi8KKwlpZiAoSVNfQlhU X1JFVklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQTEpKQorCQlXQV9TRVRfQklUX01BU0tFRChT TElDRV9FQ09fQ0hJQ0tFTjAsCisJCQkJICBQSVhFTF9NQVNLX0NBTU1JTkdfRElTQUJMRSk7CisK KwkvKiBXYUZvcmNlQ29udGV4dFNhdmVSZXN0b3JlTm9uQ29oZXJlbnQ6c2tsLGJ4dCxrYmwgKi8K KwlXQV9TRVRfQklUX01BU0tFRChIRENfQ0hJQ0tFTjAsCisJCQkgIEhEQ19GT1JDRV9DT05URVhU X1NBVkVfUkVTVE9SRV9OT05fQ09IRVJFTlQgfAorCQkJICBIRENfRk9SQ0VfQ1NSX05PTl9DT0hF UkVOVF9PVlJfRElTQUJMRSk7CisKKwkvKiBXYUZvcmNlRW5hYmxlTm9uQ29oZXJlbnQgYW5kIFdh RGlzYWJsZUhEQ0ludmFsaWRhdGlvbiBhcmUKKwkgKiBib3RoIHRpZWQgdG8gV2FGb3JjZUNvbnRl eHRTYXZlUmVzdG9yZU5vbkNvaGVyZW50CisJICogaW4gc29tZSBoc2RzIGZvciBza2wuIFdlIGtl ZXAgdGhlIHRpZSBmb3IgYWxsIGdlbjkuIFRoZQorCSAqIGRvY3VtZW50YXRpb24gaXMgYSBiaXQg aGF6eSBhbmQgc28gd2Ugd2FudCB0byBnZXQgY29tbW9uIGJlaGF2aW91ciwKKwkgKiBldmVuIHRo b3VnaCB0aGVyZSBpcyBubyBjbGVhciBldmlkZW5jZSB3ZSB3b3VsZCBuZWVkIGJvdGggb24ga2Js L2J4dC4KKwkgKiBUaGlzIGFyZWEgaGFzIGJlZW4gc291cmNlIG9mIHN5c3RlbSBoYW5ncyBzbyB3 ZSBwbGF5IGl0IHNhZmUKKwkgKiBhbmQgbWltaWMgdGhlIHNrbCByZWdhcmRsZXNzIG9mIHdoYXQg YnNwZWMgc2F5cy4KKwkgKgorCSAqIFVzZSBGb3JjZSBOb24tQ29oZXJlbnQgd2hlbmV2ZXIgZXhl Y3V0aW5nIGEgM0QgY29udGV4dC4gVGhpcworCSAqIGlzIGEgd29ya2Fyb3VuZCBmb3IgYSBwb3Nz aWJsZSBoYW5nIGluIHRoZSB1bmxpa2VseSBldmVudAorCSAqIGEgVExCIGludmFsaWRhdGlvbiBv Y2N1cnMgZHVyaW5nIGEgUFNEIGZsdXNoLgorCSAqLworCisJLyogV2FGb3JjZUVuYWJsZU5vbkNv aGVyZW50OnNrbCxieHQsa2JsICovCisJV0FfU0VUX0JJVF9NQVNLRUQoSERDX0NISUNLRU4wLAor CQkJICBIRENfRk9SQ0VfTk9OX0NPSEVSRU5UKTsKKworCS8qIFdhRGlzYWJsZUhEQ0ludmFsaWRh dGlvbjpza2wsYnh0LGtibCAqLworCUk5MTVfV1JJVEUoR0FNX0VDT0NISywgSTkxNV9SRUFEKEdB TV9FQ09DSEspIHwKKwkJICAgQkRXX0RJU0FCTEVfSERDX0lOVkFMSURBVElPTik7CisKKwkvKiBX YURpc2FibGVTYW1wbGVyUG93ZXJCeXBhc3NGb3JTT1BpbmdQb25nOnNrbCxieHQsa2JsICovCisJ aWYgKElTX1NLWUxBS0UoZGV2X3ByaXYpIHx8CisJICAgIElTX0tBQllMQUtFKGRldl9wcml2KSB8 fAorCSAgICBJU19CWFRfUkVWSUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJRF9CMCkpCisJCVdBX1NF VF9CSVRfTUFTS0VEKEhBTEZfU0xJQ0VfQ0hJQ0tFTjMsCisJCQkJICBHRU44X1NBTVBMRVJfUE9X RVJfQllQQVNTX0RJUyk7CisKKwkvKiBXYURpc2FibGVTVFVuaXRQb3dlck9wdGltaXphdGlvbjpz a2wsYnh0LGtibCxnbGsgKi8KKwlXQV9TRVRfQklUX01BU0tFRChIQUxGX1NMSUNFX0NISUNLRU4y LCBHRU44X1NUX1BPX0RJU0FCTEUpOworCisJLyogV2FPQ0xDb2hlcmVudExpbmVGbHVzaDpza2ws Ynh0LGtibCAqLworCUk5MTVfV1JJVEUoR0VOOF9MM1NRQ1JFRzQsIChJOTE1X1JFQUQoR0VOOF9M M1NRQ1JFRzQpIHwKKwkJCQkgICAgR0VOOF9MUVNDX0ZMVVNIX0NPSEVSRU5UX0xJTkVTKSk7CisK KwkvKiBXYVZGRVN0YXRlQWZ0ZXJQaXBlQ29udHJvbHdpdGhNZWRpYVN0YXRlQ2xlYXI6c2tsLGJ4 dCxnbGsgKi8KKwlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU45X0NUWF9Q UkVFTVBUX1JFRyk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdhRW5hYmxlUHJl ZW1wdGlvbkdyYW51bGFyaXR5Q29udHJvbEJ5VU1EOnNrbCxieHQsa2JsICovCisJcmV0PSB3YV9y aW5nX3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU44X0NTX0NISUNLRU4xKTsKKwlpZiAocmV0KQor CQlyZXR1cm4gcmV0OworCisJLyogV2FBbGxvd1VNRFRvTW9kaWZ5SERDQ2hpY2tlbjE6c2tsLGJ4 dCxrYmwsZ2xrICovCisJcmV0ID0gd2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOF9I RENfQ0hJQ0tFTjEpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBza2xfdHVuZV9pel9oYXNoaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3Mg KmVuZ2luZSkKK3sKKwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUt Pmk5MTU7CisJdTggdmFsc1szXSA9IHsgMCwgMCwgMCB9OworCXVuc2lnbmVkIGludCBpOworCisJ Zm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQl1OCBzczsKKworCQkvKgorCQkgKiBPbmx5IGNv bnNpZGVyIHNsaWNlcyB3aGVyZSBvbmUsIGFuZCBvbmx5IG9uZSwgc3Vic2xpY2UgaGFzIDcKKwkJ ICogRVVzCisJCSAqLworCQlpZiAoIWlzX3Bvd2VyX29mXzIoSU5URUxfSU5GTyhkZXZfcHJpdikt PnNzZXUuc3Vic2xpY2VfN2V1W2ldKSkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIHN1YnNs aWNlXzdldVtpXSAhPSAwIChiZWNhdXNlIG9mIHRoZSBjaGVjayBhYm92ZSkgYW5kCisJCSAqIHNz X21heCA9PSA0IChtYXhpbXVtIG51bWJlciBvZiBzdWJzbGljZXMgcG9zc2libGUgcGVyIHNsaWNl KQorCQkgKgorCQkgKiAtPiAgICAwIDw9IHNzIDw9IDM7CisJCSAqLworCQlzcyA9IGZmcyhJTlRF TF9JTkZPKGRldl9wcml2KS0+c3NldS5zdWJzbGljZV83ZXVbaV0pIC0gMTsKKwkJdmFsc1tpXSA9 IDMgLSBzczsKKwl9CisKKwlpZiAodmFsc1swXSA9PSAwICYmIHZhbHNbMV0gPT0gMCAmJiB2YWxz WzJdID09IDApCisJCXJldHVybiAwOworCisJLyogVHVuZSBJWiBoYXNoaW5nLiBTZWUgaW50ZWxf ZGV2aWNlX2luZm9fcnVudGltZV9pbml0KCkgKi8KKwlXQV9TRVRfRklFTERfTUFTS0VEKEdFTjdf R1RfTU9ERSwKKwkJCSAgICBHRU45X0laX0hBU0hJTkdfTUFTSygyKSB8CisJCQkgICAgR0VOOV9J Wl9IQVNISU5HX01BU0soMSkgfAorCQkJICAgIEdFTjlfSVpfSEFTSElOR19NQVNLKDApLAorCQkJ ICAgIEdFTjlfSVpfSEFTSElORygyLCB2YWxzWzJdKSB8CisJCQkgICAgR0VOOV9JWl9IQVNISU5H KDEsIHZhbHNbMV0pIHwKKwkJCSAgICBHRU45X0laX0hBU0hJTkcoMCwgdmFsc1swXSkpOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2tsX2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGlu dGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiA9IGVuZ2luZS0+aTkxNTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2VuOV9pbml0X3dvcmth cm91bmRzKGVuZ2luZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qCisJICogQWN0 dWFsIFdBIGlzIHRvIGRpc2FibGUgcGVyY29udGV4dCBwcmVlbXB0aW9uIGdyYW51bGFyaXR5IGNv bnRyb2wKKwkgKiB1bnRpbCBEMCB3aGljaCBpcyB0aGUgZGVmYXVsdCBjYXNlIHNvIHRoaXMgaXMg ZXF1aXZhbGVudCB0bworCSAqICFXYURpc2FibGVQZXJDdHh0UHJlZW1wdGlvbkdyYW51bGFyaXR5 Q29udHJvbDpza2wKKwkgKi8KKwlJOTE1X1dSSVRFKEdFTjdfRkZfU0xJQ0VfQ1NfQ0hJQ0tFTjEs CisJCSAgIF9NQVNLRURfQklUX0VOQUJMRShHRU45X0ZGU0NfUEVSQ1RYX1BSRUVNUFRfQ1RSTCkp OworCisJLyogV2FFbmFibGVHYXBzVHN2Q3JlZGl0Rml4OnNrbCAqLworCUk5MTVfV1JJVEUoR0VO OF9HQVJCQ05UTCwgKEk5MTVfUkVBRChHRU44X0dBUkJDTlRMKSB8CisJCQkJICAgR0VOOV9HQVBT X1RTVl9DUkVESVRfRElTQUJMRSkpOworCisJLyogV2FEaXNhYmxlR2Fmc1VuaXRDbGtHYXRpbmc6 c2tsICovCisJV0FfU0VUX0JJVChHRU43X1VDR0NUTDQsIEdFTjhfRVVfR0FVTklUX0NMT0NLX0dB VEVfRElTQUJMRSk7CisKKwkvKiBXYUluUGxhY2VEZWNvbXByZXNzaW9uSGFuZzpza2wgKi8KKwlp ZiAoSVNfU0tMX1JFVklEKGRldl9wcml2LCBTS0xfUkVWSURfSDAsIFJFVklEX0ZPUkVWRVIpKQor CQlXQV9TRVRfQklUKEdFTjlfR0FNVF9FQ09fUkVHX1JXX0lBLAorCQkJICAgR0FNVF9FQ09fRU5B QkxFX0lOX1BMQUNFX0RFQ09NUFJFU1MpOworCisJLyogV2FEaXNhYmxlTFNRQ1JPUEVSRmZvck9D TDpza2wgKi8KKwlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU44X0wzU1FD UkVHNCk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCXJldHVybiBza2xfdHVuZV9pel9o YXNoaW5nKGVuZ2luZSk7Cit9CisKK3N0YXRpYyBpbnQgYnh0X2luaXRfd29ya2Fyb3VuZHMoc3Ry dWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQoreworCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKKwlpbnQgcmV0OworCisJcmV0ID0gZ2VuOV9pbml0 X3dvcmthcm91bmRzKGVuZ2luZSk7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKworCS8qIFdh U3RvcmVNdWx0aXBsZVBURWVuYWJsZTpieHQgKi8KKwkvKiBUaGlzIGlzIGEgcmVxdWlyZW1lbnQg YWNjb3JkaW5nIHRvIEhhcmR3YXJlIHNwZWNpZmljYXRpb24gKi8KKwlpZiAoSVNfQlhUX1JFVklE KGRldl9wcml2LCAwLCBCWFRfUkVWSURfQTEpKQorCQlJOTE1X1dSSVRFKFRJTEVDVEwsIEk5MTVf UkVBRChUSUxFQ1RMKSB8IFRJTEVDVExfVExCUEYpOworCisJLyogV2FTZXRDbGNrR2F0aW5nRGlz YWJsZU1lZGlhOmJ4dCAqLworCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJ RF9BMSkpIHsKKwkJSTkxNV9XUklURShHRU43X01JU0NDUENUTCwgKEk5MTVfUkVBRChHRU43X01J U0NDUENUTCkgJgorCQkJCQkgICAgfkdFTjhfRE9QX0NMT0NLX0dBVEVfTUVESUFfRU5BQkxFKSk7 CisJfQorCisJLyogV2FEaXNhYmxlVGhyZWFkU3RhbGxEb3BDbG9ja0dhdGluZzpieHQgKi8KKwlX QV9TRVRfQklUX01BU0tFRChHRU44X1JPV19DSElDS0VOLAorCQkJICBTVEFMTF9ET1BfR0FUSU5H X0RJU0FCTEUpOworCisJLyogV2FEaXNhYmxlUG9vbGVkRXVMb2FkQmFsYW5jaW5nRml4OmJ4dCAq LworCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIEJYVF9SRVZJRF9CMCwgUkVWSURfRk9SRVZF UikpIHsKKwkJV0FfU0VUX0JJVF9NQVNLRUQoRkZfU0xJQ0VfQ1NfQ0hJQ0tFTjIsCisJCQkJICBH RU45X1BPT0xFRF9FVV9MT0FEX0JBTEFOQ0lOR19GSVhfRElTQUJMRSk7CisJfQorCisJLyogV2FE aXNhYmxlU2JlQ2FjaGVEaXNwYXRjaFBvcnRTaGFyaW5nOmJ4dCAqLworCWlmIChJU19CWFRfUkVW SUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJRF9CMCkpIHsKKwkJV0FfU0VUX0JJVF9NQVNLRUQoCisJ CQlHRU43X0hBTEZfU0xJQ0VfQ0hJQ0tFTjEsCisJCQlHRU43X1NCRV9TU19DQUNIRV9ESVNQQVRD SF9QT1JUX1NIQVJJTkdfRElTQUJMRSk7CisJfQorCisJLyogV2FEaXNhYmxlT2JqZWN0TGV2ZWxQ cmVlbXB0aW9uRm9yVHJpZmFuT3JQb2x5Z29uOmJ4dCAqLworCS8qIFdhRGlzYWJsZU9iamVjdExl dmVsUHJlZW1wdGlvbkZvckluc3RhbmNlZERyYXc6Ynh0ICovCisJLyogV2FEaXNhYmxlT2JqZWN0 TGV2ZWxQcmVlbXRpb25Gb3JJbnN0YW5jZUlkOmJ4dCAqLworCS8qIFdhRGlzYWJsZUxTUUNST1BF UkZmb3JPQ0w6Ynh0ICovCisJaWYgKElTX0JYVF9SRVZJRChkZXZfcHJpdiwgMCwgQlhUX1JFVklE X0ExKSkgeworCQlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU45X0NTX0RF QlVHX01PREUxKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJcmV0ID0gd2Ffcmlu Z193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOF9MM1NRQ1JFRzQpOworCQlpZiAocmV0KQorCQkJ cmV0dXJuIHJldDsKKwl9CisKKwkvKiBXYVByb2dyYW1MM1NxY1JlZzFEZWZhdWx0Rm9yUGVyZjpi eHQgKi8KKwlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCBCWFRfUkVWSURfQjAsIFJFVklEX0ZP UkVWRVIpKQorCQlJOTE1X1dSSVRFKEdFTjhfTDNTUUNSRUcxLCBMM19HRU5FUkFMX1BSSU9fQ1JF RElUUyg2MikgfAorCQkJCQkgICBMM19ISUdIX1BSSU9fQ1JFRElUUygyKSk7CisKKwkvKiBXYVRv RW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzpieHQgKi8KKwlpZiAoSVNfQlhUX1JFVklEKGRl dl9wcml2LCBCWFRfUkVWSURfQzAsIFJFVklEX0ZPUkVWRVIpKQorCQlXQV9TRVRfQklUX01BU0tF RChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCisJCQkJICBHRU44X1NCRV9ESVNBQkxFX1JFUExBWV9C VUZfT1BUSU1JWkFUSU9OKTsKKworCS8qIFdhSW5QbGFjZURlY29tcHJlc3Npb25IYW5nOmJ4dCAq LworCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIEJYVF9SRVZJRF9DMCwgUkVWSURfRk9SRVZF UikpCisJCVdBX1NFVF9CSVQoR0VOOV9HQU1UX0VDT19SRUdfUldfSUEsCisJCQkgICBHQU1UX0VD T19FTkFCTEVfSU5fUExBQ0VfREVDT01QUkVTUyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBrYmxfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUp Cit7CisJc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1Owor CWludCByZXQ7CisKKwlyZXQgPSBnZW45X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJLyogV2FFbmFibGVHYXBzVHN2Q3JlZGl0Rml4OmtibCAq LworCUk5MTVfV1JJVEUoR0VOOF9HQVJCQ05UTCwgKEk5MTVfUkVBRChHRU44X0dBUkJDTlRMKSB8 CisJCQkJICAgR0VOOV9HQVBTX1RTVl9DUkVESVRfRElTQUJMRSkpOworCisJLyogV2FEaXNhYmxl RHluYW1pY0NyZWRpdFNoYXJpbmc6a2JsICovCisJaWYgKElTX0tCTF9SRVZJRChkZXZfcHJpdiwg MCwgS0JMX1JFVklEX0IwKSkKKwkJV0FfU0VUX0JJVChHQU1UX0NIS05fQklUX1JFRywKKwkJCSAg IEdBTVRfQ0hLTl9ESVNBQkxFX0RZTkFNSUNfQ1JFRElUX1NIQVJJTkcpOworCisJLyogV2FEaXNh YmxlRmVuY2VEZXN0aW5hdGlvblRvU0xNOmtibCAocHJlLXByb2QpICovCisJaWYgKElTX0tCTF9S RVZJRChkZXZfcHJpdiwgS0JMX1JFVklEX0EwLCBLQkxfUkVWSURfQTApKQorCQlXQV9TRVRfQklU X01BU0tFRChIRENfQ0hJQ0tFTjAsCisJCQkJICBIRENfRkVOQ0VfREVTVF9TTE1fRElTQUJMRSk7 CisKKwkvKiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzprYmwgKi8KKwlpZiAoSVNf S0JMX1JFVklEKGRldl9wcml2LCBLQkxfUkVWSURfQzAsIFJFVklEX0ZPUkVWRVIpKQorCQlXQV9T RVRfQklUX01BU0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCisJCQkJICBHRU44X1NCRV9ESVNB QkxFX1JFUExBWV9CVUZfT1BUSU1JWkFUSU9OKTsKKworCS8qIFdhRGlzYWJsZUdhZnNVbml0Q2xr R2F0aW5nOmtibCAqLworCVdBX1NFVF9CSVQoR0VON19VQ0dDVEw0LCBHRU44X0VVX0dBVU5JVF9D TE9DS19HQVRFX0RJU0FCTEUpOworCisJLyogV2FEaXNhYmxlU2JlQ2FjaGVEaXNwYXRjaFBvcnRT aGFyaW5nOmtibCAqLworCVdBX1NFVF9CSVRfTUFTS0VEKAorCQlHRU43X0hBTEZfU0xJQ0VfQ0hJ Q0tFTjEsCisJCUdFTjdfU0JFX1NTX0NBQ0hFX0RJU1BBVENIX1BPUlRfU0hBUklOR19ESVNBQkxF KTsKKworCS8qIFdhSW5QbGFjZURlY29tcHJlc3Npb25IYW5nOmtibCAqLworCVdBX1NFVF9CSVQo R0VOOV9HQU1UX0VDT19SRUdfUldfSUEsCisJCSAgIEdBTVRfRUNPX0VOQUJMRV9JTl9QTEFDRV9E RUNPTVBSRVNTKTsKKworCS8qIFdhRGlzYWJsZUxTUUNST1BFUkZmb3JPQ0w6a2JsICovCisJcmV0 ID0gd2FfcmluZ193aGl0ZWxpc3RfcmVnKGVuZ2luZSwgR0VOOF9MM1NRQ1JFRzQpOworCWlmIChy ZXQpCisJCXJldHVybiByZXQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnbGtfaW5p dF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCit7CisJc3RydWN0 IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OworCWludCByZXQ7CisK KwlyZXQgPSBnZW45X2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKKwlpZiAocmV0KQorCQlyZXR1 cm4gcmV0OworCisJLyogV2FUb0VuYWJsZUh3Rml4Rm9yUHVzaENvbnN0SFdCdWc6Z2xrICovCisJ V0FfU0VUX0JJVF9NQVNLRUQoQ09NTU9OX1NMSUNFX0NISUNLRU4yLAorCQkJICBHRU44X1NCRV9E SVNBQkxFX1JFUExBWV9CVUZfT1BUSU1JWkFUSU9OKTsKKworCXJldHVybiAwOworfQorCitpbnQg aW5pdF93b3JrYXJvdW5kc19yaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKK3sK KwlzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7CisKKwlX QVJOX09OKGVuZ2luZS0+aWQgIT0gUkNTKTsKKworCWRldl9wcml2LT53b3JrYXJvdW5kcy5jb3Vu dCA9IDA7CisJZGV2X3ByaXYtPndvcmthcm91bmRzLmh3X3doaXRlbGlzdF9jb3VudFtSQ1NdID0g MDsKKworCWlmIChJU19CUk9BRFdFTEwoZGV2X3ByaXYpKQorCQlyZXR1cm4gYmR3X2luaXRfd29y a2Fyb3VuZHMoZW5naW5lKTsKKworCWlmIChJU19DSEVSUllWSUVXKGRldl9wcml2KSkKKwkJcmV0 dXJuIGNodl9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7CisKKwlpZiAoSVNfU0tZTEFLRShkZXZf cHJpdikpCisJCXJldHVybiBza2xfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOworCisJaWYgKElT X0JST1hUT04oZGV2X3ByaXYpKQorCQlyZXR1cm4gYnh0X2luaXRfd29ya2Fyb3VuZHMoZW5naW5l KTsKKworCWlmIChJU19LQUJZTEFLRShkZXZfcHJpdikpCisJCXJldHVybiBrYmxfaW5pdF93b3Jr YXJvdW5kcyhlbmdpbmUpOworCisJaWYgKElTX0dFTUlOSUxBS0UoZGV2X3ByaXYpKQorCQlyZXR1 cm4gZ2xrX2luaXRfd29ya2Fyb3VuZHMoZW5naW5lKTsKKworCXJldHVybiAwOworfQorCitpbnQg aW50ZWxfcmluZ193b3JrYXJvdW5kc19lbWl0KHN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAq cmVxKQoreworCXN0cnVjdCBpOTE1X3dvcmthcm91bmRzICp3ID0gJnJlcS0+aTkxNS0+d29ya2Fy b3VuZHM7CisJdTMyICpjczsKKwlpbnQgcmV0LCBpOworCisJaWYgKHctPmNvdW50ID09IDApCisJ CXJldHVybiAwOworCisJcmV0ID0gcmVxLT5lbmdpbmUtPmVtaXRfZmx1c2gocmVxLCBFTUlUX0JB UlJJRVIpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwljcyA9IGludGVsX3JpbmdfYmVn aW4ocmVxLCAody0+Y291bnQgKiAyICsgMikpOworCWlmIChJU19FUlIoY3MpKQorCQlyZXR1cm4g UFRSX0VSUihjcyk7CisKKwkqY3MrKyA9IE1JX0xPQURfUkVHSVNURVJfSU1NKHctPmNvdW50KTsK Kwlmb3IgKGkgPSAwOyBpIDwgdy0+Y291bnQ7IGkrKykgeworCQkqY3MrKyA9IGk5MTVfbW1pb19y ZWdfb2Zmc2V0KHctPnJlZ1tpXS5hZGRyKTsKKwkJKmNzKysgPSB3LT5yZWdbaV0udmFsdWU7CisJ fQorCSpjcysrID0gTUlfTk9PUDsKKworCWludGVsX3JpbmdfYWR2YW5jZShyZXEsIGNzKTsKKwor CXJldCA9IHJlcS0+ZW5naW5lLT5lbWl0X2ZsdXNoKHJlcSwgRU1JVF9CQVJSSUVSKTsKKwlpZiAo cmV0KQorCQlyZXR1cm4gcmV0OworCisJRFJNX0RFQlVHX0RSSVZFUigiTnVtYmVyIG9mIFdvcmth cm91bmRzIGVtaXR0ZWQ6ICVkXG4iLCB3LT5jb3VudCk7CisKKwlyZXR1cm4gMDsKK30KKworaW50 IGludGVsX3JpbmdfcGluKHN0cnVjdCBpbnRlbF9yaW5nICpyaW5nLCB1bnNpZ25lZCBpbnQgb2Zm c2V0X2JpYXMpCit7CisJdW5zaWduZWQgaW50IGZsYWdzOworCWVudW0gaTkxNV9tYXBfdHlwZSBt YXA7CisJc3RydWN0IGk5MTVfdm1hICp2bWEgPSByaW5nLT52bWE7CisJdm9pZCAqYWRkcjsKKwlp bnQgcmV0OworCisJR0VNX0JVR19PTihyaW5nLT52YWRkcik7CisKKwltYXAgPSBIQVNfTExDKHJp bmctPmVuZ2luZS0+aTkxNSkgPyBJOTE1X01BUF9XQiA6IEk5MTVfTUFQX1dDOworCisJZmxhZ3Mg PSBQSU5fR0xPQkFMOworCWlmIChvZmZzZXRfYmlhcykKKwkJZmxhZ3MgfD0gUElOX09GRlNFVF9C SUFTIHwgb2Zmc2V0X2JpYXM7CisJaWYgKHZtYS0+b2JqLT5zdG9sZW4pCisJCWZsYWdzIHw9IFBJ Tl9NQVBQQUJMRTsKKworCWlmICghKHZtYS0+ZmxhZ3MgJiBJOTE1X1ZNQV9HTE9CQUxfQklORCkp IHsKKwkJaWYgKGZsYWdzICYgUElOX01BUFBBQkxFIHx8IG1hcCA9PSBJOTE1X01BUF9XQykKKwkJ CXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fZ3R0X2RvbWFpbih2bWEtPm9iaiwgdHJ1ZSk7 CisJCWVsc2UKKwkJCXJldCA9IGk5MTVfZ2VtX29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbih2bWEt Pm9iaiwgdHJ1ZSk7CisJCWlmICh1bmxpa2VseShyZXQpKQorCQkJcmV0dXJuIHJldDsKKwl9CisK KwlyZXQgPSBpOTE1X3ZtYV9waW4odm1hLCAwLCBQQUdFX1NJWkUsIGZsYWdzKTsKKwlpZiAodW5s aWtlbHkocmV0KSkKKwkJcmV0dXJuIHJldDsKKworCWlmIChpOTE1X3ZtYV9pc19tYXBfYW5kX2Zl bmNlYWJsZSh2bWEpKQorCQlhZGRyID0gKHZvaWQgX19mb3JjZSAqKWk5MTVfdm1hX3Bpbl9pb21h cCh2bWEpOworCWVsc2UKKwkJYWRkciA9IGk5MTVfZ2VtX29iamVjdF9waW5fbWFwKHZtYS0+b2Jq LCBtYXApOworCWlmIChJU19FUlIoYWRkcikpCisJCWdvdG8gZXJyOworCisJcmluZy0+dmFkZHIg PSBhZGRyOworCXJldHVybiAwOworCitlcnI6CisJaTkxNV92bWFfdW5waW4odm1hKTsKKwlyZXR1 cm4gUFRSX0VSUihhZGRyKTsKK30KKwordm9pZCBpbnRlbF9yaW5nX3VucGluKHN0cnVjdCBpbnRl bF9yaW5nICpyaW5nKQoreworCUdFTV9CVUdfT04oIXJpbmctPnZtYSk7CisJR0VNX0JVR19PTigh cmluZy0+dmFkZHIpOworCisJaWYgKGk5MTVfdm1hX2lzX21hcF9hbmRfZmVuY2VhYmxlKHJpbmct PnZtYSkpCisJCWk5MTVfdm1hX3VucGluX2lvbWFwKHJpbmctPnZtYSk7CisJZWxzZQorCQlpOTE1 X2dlbV9vYmplY3RfdW5waW5fbWFwKHJpbmctPnZtYS0+b2JqKTsKKwlyaW5nLT52YWRkciA9IE5V TEw7CisKKwlpOTE1X3ZtYV91bnBpbihyaW5nLT52bWEpOworfQorCitzdGF0aWMgc3RydWN0IGk5 MTVfdm1hICoKK2ludGVsX3JpbmdfY3JlYXRlX3ZtYShzdHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAq ZGV2X3ByaXYsIGludCBzaXplKQoreworCXN0cnVjdCBkcm1faTkxNV9nZW1fb2JqZWN0ICpvYmo7 CisJc3RydWN0IGk5MTVfdm1hICp2bWE7CisKKwlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRl X3N0b2xlbihkZXZfcHJpdiwgc2l6ZSk7CisJaWYgKCFvYmopCisJCW9iaiA9IGk5MTVfZ2VtX29i amVjdF9jcmVhdGUoZGV2X3ByaXYsIHNpemUpOworCWlmIChJU19FUlIob2JqKSkKKwkJcmV0dXJu IEVSUl9DQVNUKG9iaik7CisKKwkvKiBtYXJrIHJpbmcgYnVmZmVycyBhcyByZWFkLW9ubHkgZnJv bSBHUFUgc2lkZSBieSBkZWZhdWx0ICovCisJb2JqLT5ndF9ybyA9IDE7CisKKwl2bWEgPSBpOTE1 X3ZtYV9pbnN0YW5jZShvYmosICZkZXZfcHJpdi0+Z2d0dC5iYXNlLCBOVUxMKTsKKwlpZiAoSVNf RVJSKHZtYSkpCisJCWdvdG8gZXJyOworCisJcmV0dXJuIHZtYTsKKworZXJyOgorCWk5MTVfZ2Vt X29iamVjdF9wdXQob2JqKTsKKwlyZXR1cm4gdm1hOworfQorCitzdHJ1Y3QgaW50ZWxfcmluZyAq CitpbnRlbF9lbmdpbmVfY3JlYXRlX3Jpbmcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5l LCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3QgaW50ZWxfcmluZyAqcmluZzsKKwlzdHJ1Y3QgaTkxNV92 bWEgKnZtYTsKKworCUdFTV9CVUdfT04oIWlzX3Bvd2VyX29mXzIoc2l6ZSkpOworCUdFTV9CVUdf T04oUklOR19DVExfU0laRShzaXplKSAmIH5SSU5HX05SX1BBR0VTKTsKKworCXJpbmcgPSBremFs bG9jKHNpemVvZigqcmluZyksIEdGUF9LRVJORUwpOworCWlmICghcmluZykKKwkJcmV0dXJuIEVS Ul9QVFIoLUVOT01FTSk7CisKKwlyaW5nLT5lbmdpbmUgPSBlbmdpbmU7CisKKwlJTklUX0xJU1Rf SEVBRCgmcmluZy0+cmVxdWVzdF9saXN0KTsKKworCXJpbmctPnNpemUgPSBzaXplOworCS8qIFdv cmthcm91bmQgYW4gZXJyYXR1bSBvbiB0aGUgaTgzMCB3aGljaCBjYXVzZXMgYSBoYW5nIGlmCisJ ICogdGhlIFRBSUwgcG9pbnRlciBwb2ludHMgdG8gd2l0aGluIHRoZSBsYXN0IDIgY2FjaGVsaW5l cworCSAqIG9mIHRoZSBidWZmZXIuCisJICovCisJcmluZy0+ZWZmZWN0aXZlX3NpemUgPSBzaXpl OworCWlmIChJU19JODMwKGVuZ2luZS0+aTkxNSkgfHwgSVNfSTg0NUcoZW5naW5lLT5pOTE1KSkK KwkJcmluZy0+ZWZmZWN0aXZlX3NpemUgLT0gMiAqIENBQ0hFTElORV9CWVRFUzsKKworCXJpbmct Pmxhc3RfcmV0aXJlZF9oZWFkID0gLTE7CisJaW50ZWxfcmluZ191cGRhdGVfc3BhY2UocmluZyk7 CisKKwl2bWEgPSBpbnRlbF9yaW5nX2NyZWF0ZV92bWEoZW5naW5lLT5pOTE1LCBzaXplKTsKKwlp ZiAoSVNfRVJSKHZtYSkpIHsKKwkJa2ZyZWUocmluZyk7CisJCXJldHVybiBFUlJfQ0FTVCh2bWEp OworCX0KKwlyaW5nLT52bWEgPSB2bWE7CisKKwlyZXR1cm4gcmluZzsKK30KKwordm9pZAoraW50 ZWxfcmluZ19mcmVlKHN0cnVjdCBpbnRlbF9yaW5nICpyaW5nKQoreworCXN0cnVjdCBkcm1faTkx NV9nZW1fb2JqZWN0ICpvYmogPSByaW5nLT52bWEtPm9iajsKKworCWk5MTVfdm1hX2Nsb3NlKHJp bmctPnZtYSk7CisJX19pOTE1X2dlbV9vYmplY3RfcmVsZWFzZV91bmxlc3NfYWN0aXZlKG9iaik7 CisKKwlrZnJlZShyaW5nKTsKK30KKworc3RhdGljIGludCBfX2ludGVsX3Jpbmdfc3BhY2UoaW50 IGhlYWQsIGludCB0YWlsLCBpbnQgc2l6ZSkKK3sKKwlpbnQgc3BhY2UgPSBoZWFkIC0gdGFpbDsK KwlpZiAoc3BhY2UgPD0gMCkKKwkJc3BhY2UgKz0gc2l6ZTsKKwlyZXR1cm4gc3BhY2UgLSBJOTE1 X1JJTkdfRlJFRV9TUEFDRTsKK30KKworc3RhdGljIGludCB3YWl0X2Zvcl9zcGFjZShzdHJ1Y3Qg ZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSwgaW50IGJ5dGVzKQoreworCXN0cnVjdCBpbnRlbF9y aW5nICpyaW5nID0gcmVxLT5yaW5nOworCXN0cnVjdCBkcm1faTkxNV9nZW1fcmVxdWVzdCAqdGFy Z2V0OworCWxvbmcgdGltZW91dDsKKworCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJnJlcS0+aTkxNS0+ ZHJtLnN0cnVjdF9tdXRleCk7CisKKwlpbnRlbF9yaW5nX3VwZGF0ZV9zcGFjZShyaW5nKTsKKwlp ZiAocmluZy0+c3BhY2UgPj0gYnl0ZXMpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBTcGFjZSBp cyByZXNlcnZlZCBpbiB0aGUgcmluZ2J1ZmZlciBmb3IgZmluYWxpc2luZyB0aGUgcmVxdWVzdCwK KwkgKiBhcyB0aGF0IGNhbm5vdCBiZSBhbGxvd2VkIHRvIGZhaWwuIER1cmluZyByZXF1ZXN0IGZp bmFsaXNhdGlvbiwKKwkgKiByZXNlcnZlZF9zcGFjZSBpcyBzZXQgdG8gMCB0byBzdG9wIHRoZSBv dmVyYWxsb2NhdGlvbiBhbmQgdGhlCisJICogYXNzdW1wdGlvbiBpcyB0aGF0IHRoZW4gd2UgbmV2 ZXIgbmVlZCB0byB3YWl0ICh3aGljaCBoYXMgdGhlCisJICogcmlzayBvZiBmYWlsaW5nIHdpdGgg RUlOVFIpLgorCSAqCisJICogU2VlIGFsc28gaTkxNV9nZW1fcmVxdWVzdF9hbGxvYygpIGFuZCBp OTE1X2FkZF9yZXF1ZXN0KCkuCisJICovCisJR0VNX0JVR19PTighcmVxLT5yZXNlcnZlZF9zcGFj ZSk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdldCwgJnJpbmctPnJlcXVlc3RfbGlzdCwg cmluZ19saW5rKSB7CisJCXVuc2lnbmVkIHNwYWNlOworCisJCS8qIFdvdWxkIGNvbXBsZXRpb24g b2YgdGhpcyByZXF1ZXN0IGZyZWUgZW5vdWdoIHNwYWNlPyAqLworCQlzcGFjZSA9IF9faW50ZWxf cmluZ19zcGFjZSh0YXJnZXQtPnBvc3RmaXgsIHJpbmctPnRhaWwsCisJCQkJCSAgIHJpbmctPnNp emUpOworCQlpZiAoc3BhY2UgPj0gYnl0ZXMpCisJCQlicmVhazsKKwl9CisKKwlpZiAoV0FSTl9P TigmdGFyZ2V0LT5yaW5nX2xpbmsgPT0gJnJpbmctPnJlcXVlc3RfbGlzdCkpCisJCXJldHVybiAt RU5PU1BDOworCisJdGltZW91dCA9IGk5MTVfd2FpdF9yZXF1ZXN0KHRhcmdldCwKKwkJCQkgICAg STkxNV9XQUlUX0lOVEVSUlVQVElCTEUgfCBJOTE1X1dBSVRfTE9DS0VELAorCQkJCSAgICBNQVhf U0NIRURVTEVfVElNRU9VVCk7CisJaWYgKHRpbWVvdXQgPCAwKQorCQlyZXR1cm4gdGltZW91dDsK KworCWk5MTVfZ2VtX3JlcXVlc3RfcmV0aXJlX3VwdG8odGFyZ2V0KTsKKworCWludGVsX3Jpbmdf dXBkYXRlX3NwYWNlKHJpbmcpOworCUdFTV9CVUdfT04ocmluZy0+c3BhY2UgPCBieXRlcyk7CisJ cmV0dXJuIDA7Cit9CisKK3UzMiAqaW50ZWxfcmluZ19iZWdpbihzdHJ1Y3QgZHJtX2k5MTVfZ2Vt X3JlcXVlc3QgKnJlcSwgaW50IG51bV9kd29yZHMpCit7CisJc3RydWN0IGludGVsX3JpbmcgKnJp bmcgPSByZXEtPnJpbmc7CisJaW50IHJlbWFpbl9hY3R1YWwgPSByaW5nLT5zaXplIC0gcmluZy0+ dGFpbDsKKwlpbnQgcmVtYWluX3VzYWJsZSA9IHJpbmctPmVmZmVjdGl2ZV9zaXplIC0gcmluZy0+ dGFpbDsKKwlpbnQgYnl0ZXMgPSBudW1fZHdvcmRzICogc2l6ZW9mKHUzMik7CisJaW50IHRvdGFs X2J5dGVzLCB3YWl0X2J5dGVzOworCWJvb2wgbmVlZF93cmFwID0gZmFsc2U7CisJdTMyICpjczsK KworCXRvdGFsX2J5dGVzID0gYnl0ZXMgKyByZXEtPnJlc2VydmVkX3NwYWNlOworCisJaWYgKHVu bGlrZWx5KGJ5dGVzID4gcmVtYWluX3VzYWJsZSkpIHsKKwkJLyoKKwkJICogTm90IGVub3VnaCBz cGFjZSBmb3IgdGhlIGJhc2ljIHJlcXVlc3QuIFNvIG5lZWQgdG8gZmx1c2gKKwkJICogb3V0IHRo ZSByZW1haW5kZXIgYW5kIHRoZW4gd2FpdCBmb3IgYmFzZSArIHJlc2VydmVkLgorCQkgKi8KKwkJ d2FpdF9ieXRlcyA9IHJlbWFpbl9hY3R1YWwgKyB0b3RhbF9ieXRlczsKKwkJbmVlZF93cmFwID0g dHJ1ZTsKKwl9IGVsc2UgaWYgKHVubGlrZWx5KHRvdGFsX2J5dGVzID4gcmVtYWluX3VzYWJsZSkp IHsKKwkJLyoKKwkJICogVGhlIGJhc2UgcmVxdWVzdCB3aWxsIGZpdCBidXQgdGhlIHJlc2VydmVk IHNwYWNlCisJCSAqIGZhbGxzIG9mZiB0aGUgZW5kLiBTbyB3ZSBkb24ndCBuZWVkIGFuIGltbWVk aWF0ZSB3cmFwCisJCSAqIGFuZCBvbmx5IG5lZWQgdG8gZWZmZWN0aXZlbHkgd2FpdCBmb3IgdGhl IHJlc2VydmVkCisJCSAqIHNpemUgc3BhY2UgZnJvbSB0aGUgc3RhcnQgb2YgcmluZ2J1ZmZlci4K KwkJICovCisJCXdhaXRfYnl0ZXMgPSByZW1haW5fYWN0dWFsICsgcmVxLT5yZXNlcnZlZF9zcGFj ZTsKKwl9IGVsc2UgeworCQkvKiBObyB3cmFwcGluZyByZXF1aXJlZCwganVzdCB3YWl0aW5nLiAq LworCQl3YWl0X2J5dGVzID0gdG90YWxfYnl0ZXM7CisJfQorCisJaWYgKHdhaXRfYnl0ZXMgPiBy aW5nLT5zcGFjZSkgeworCQlpbnQgcmV0ID0gd2FpdF9mb3Jfc3BhY2UocmVxLCB3YWl0X2J5dGVz KTsKKwkJaWYgKHVubGlrZWx5KHJldCkpCisJCQlyZXR1cm4gRVJSX1BUUihyZXQpOworCX0KKwor CWlmICh1bmxpa2VseShuZWVkX3dyYXApKSB7CisJCUdFTV9CVUdfT04ocmVtYWluX2FjdHVhbCA+ IHJpbmctPnNwYWNlKTsKKwkJR0VNX0JVR19PTihyaW5nLT50YWlsICsgcmVtYWluX2FjdHVhbCA+ IHJpbmctPnNpemUpOworCisJCS8qIEZpbGwgdGhlIHRhaWwgd2l0aCBNSV9OT09QICovCisJCW1l bXNldChyaW5nLT52YWRkciArIHJpbmctPnRhaWwsIDAsIHJlbWFpbl9hY3R1YWwpOworCQlyaW5n LT50YWlsID0gMDsKKwkJcmluZy0+c3BhY2UgLT0gcmVtYWluX2FjdHVhbDsKKwl9CisKKwlHRU1f QlVHX09OKHJpbmctPnRhaWwgPiByaW5nLT5zaXplIC0gYnl0ZXMpOworCWNzID0gcmluZy0+dmFk ZHIgKyByaW5nLT50YWlsOworCXJpbmctPnRhaWwgKz0gYnl0ZXM7CisJcmluZy0+c3BhY2UgLT0g Ynl0ZXM7CisJR0VNX0JVR19PTihyaW5nLT5zcGFjZSA8IDApOworCisJcmV0dXJuIGNzOworfQor Cit2b2lkIGludGVsX3JpbmdfdXBkYXRlX3NwYWNlKHN0cnVjdCBpbnRlbF9yaW5nICpyaW5nKQor eworCWlmIChyaW5nLT5sYXN0X3JldGlyZWRfaGVhZCAhPSAtMSkgeworCQlyaW5nLT5oZWFkID0g cmluZy0+bGFzdF9yZXRpcmVkX2hlYWQ7CisJCXJpbmctPmxhc3RfcmV0aXJlZF9oZWFkID0gLTE7 CisJfQorCisJcmluZy0+c3BhY2UgPSBfX2ludGVsX3Jpbmdfc3BhY2UocmluZy0+aGVhZCAmIEhF QURfQUREUiwKKwkJCQkJIHJpbmctPnRhaWwsIHJpbmctPnNpemUpOworfQorCisvKiBBbGlnbiB0 aGUgcmluZyB0YWlsIHRvIGEgY2FjaGVsaW5lIGJvdW5kYXJ5ICovCitpbnQgaW50ZWxfcmluZ19j YWNoZWxpbmVfYWxpZ24oc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXEpCit7CisJaW50 IG51bV9kd29yZHMgPQorCQkocmVxLT5yaW5nLT50YWlsICYgKENBQ0hFTElORV9CWVRFUyAtIDEp KSAvIHNpemVvZih1aW50MzJfdCk7CisJdTMyICpjczsKKworCWlmIChudW1fZHdvcmRzID09IDAp CisJCXJldHVybiAwOworCisJbnVtX2R3b3JkcyA9IENBQ0hFTElORV9CWVRFUyAvIHNpemVvZih1 aW50MzJfdCkgLSBudW1fZHdvcmRzOworCWNzID0gaW50ZWxfcmluZ19iZWdpbihyZXEsIG51bV9k d29yZHMpOworCWlmIChJU19FUlIoY3MpKQorCQlyZXR1cm4gUFRSX0VSUihjcyk7CisKKwl3aGls ZSAobnVtX2R3b3Jkcy0tKQorCQkqY3MrKyA9IE1JX05PT1A7CisKKwlpbnRlbF9yaW5nX2FkdmFu Y2UocmVxLCBjcyk7CisKKwlyZXR1cm4gMDsKK30KKwogI2lmIElTX0VOQUJMRUQoQ09ORklHX0RS TV9JOTE1X1NFTEZURVNUKQogI2luY2x1ZGUgInNlbGZ0ZXN0cy9tb2NrX2VuZ2luZS5jIgogI2Vu ZGlmCmRpZmYgLS1naXQgYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMg Yi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVyLmMKaW5kZXggOGMxN2RiNzI0 ODlmLi5hOGZmNTkwM2JiOTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2ludGVs X3JpbmdidWZmZXIuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pbnRlbF9yaW5nYnVmZmVy LmMKQEAgLTM5LDI1ICszOSw2IEBACiAgKi8KICNkZWZpbmUgTEVHQUNZX1JFUVVFU1RfU0laRSAy MDAKIAotc3RhdGljIGludCBfX2ludGVsX3Jpbmdfc3BhY2UoaW50IGhlYWQsIGludCB0YWlsLCBp bnQgc2l6ZSkKLXsKLQlpbnQgc3BhY2UgPSBoZWFkIC0gdGFpbDsKLQlpZiAoc3BhY2UgPD0gMCkK LQkJc3BhY2UgKz0gc2l6ZTsKLQlyZXR1cm4gc3BhY2UgLSBJOTE1X1JJTkdfRlJFRV9TUEFDRTsK LX0KLQotdm9pZCBpbnRlbF9yaW5nX3VwZGF0ZV9zcGFjZShzdHJ1Y3QgaW50ZWxfcmluZyAqcmlu ZykKLXsKLQlpZiAocmluZy0+bGFzdF9yZXRpcmVkX2hlYWQgIT0gLTEpIHsKLQkJcmluZy0+aGVh ZCA9IHJpbmctPmxhc3RfcmV0aXJlZF9oZWFkOwotCQlyaW5nLT5sYXN0X3JldGlyZWRfaGVhZCA9 IC0xOwotCX0KLQotCXJpbmctPnNwYWNlID0gX19pbnRlbF9yaW5nX3NwYWNlKHJpbmctPmhlYWQg JiBIRUFEX0FERFIsCi0JCQkJCSByaW5nLT50YWlsLCByaW5nLT5zaXplKTsKLX0KLQogc3RhdGlj IGludAogZ2VuMl9yZW5kZXJfcmluZ19mbHVzaChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3Qg KnJlcSwgdTMyIG1vZGUpCiB7CkBAIC02NDQsNDEgKzYyNSw2IEBAIHN0YXRpYyB2b2lkIHJlc2V0 X3JpbmdfY29tbW9uKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwKIAl9CiB9CiAKLWlu dCBpbnRlbF9yaW5nX3dvcmthcm91bmRzX2VtaXQoc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0 ICpyZXEpCi17Ci0Jc3RydWN0IGk5MTVfd29ya2Fyb3VuZHMgKncgPSAmcmVxLT5pOTE1LT53b3Jr YXJvdW5kczsKLQl1MzIgKmNzOwotCWludCByZXQsIGk7Ci0KLQlpZiAody0+Y291bnQgPT0gMCkK LQkJcmV0dXJuIDA7Ci0KLQlyZXQgPSByZXEtPmVuZ2luZS0+ZW1pdF9mbHVzaChyZXEsIEVNSVRf QkFSUklFUik7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCWNzID0gaW50ZWxfcmluZ19i ZWdpbihyZXEsICh3LT5jb3VudCAqIDIgKyAyKSk7Ci0JaWYgKElTX0VSUihjcykpCi0JCXJldHVy biBQVFJfRVJSKGNzKTsKLQotCSpjcysrID0gTUlfTE9BRF9SRUdJU1RFUl9JTU0ody0+Y291bnQp OwotCWZvciAoaSA9IDA7IGkgPCB3LT5jb3VudDsgaSsrKSB7Ci0JCSpjcysrID0gaTkxNV9tbWlv X3JlZ19vZmZzZXQody0+cmVnW2ldLmFkZHIpOwotCQkqY3MrKyA9IHctPnJlZ1tpXS52YWx1ZTsK LQl9Ci0JKmNzKysgPSBNSV9OT09QOwotCi0JaW50ZWxfcmluZ19hZHZhbmNlKHJlcSwgY3MpOwot Ci0JcmV0ID0gcmVxLT5lbmdpbmUtPmVtaXRfZmx1c2gocmVxLCBFTUlUX0JBUlJJRVIpOwotCWlm IChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQlEUk1fREVCVUdfRFJJVkVSKCJOdW1iZXIgb2YgV29y a2Fyb3VuZHMgZW1pdHRlZDogJWRcbiIsIHctPmNvdW50KTsKLQotCXJldHVybiAwOwotfQotCiBz dGF0aWMgaW50IGludGVsX3Jjc19jdHhfaW5pdChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3Qg KnJlcSkKIHsKIAlpbnQgcmV0OwpAQCAtNjk0LDUyMSArNjQwLDYgQEAgc3RhdGljIGludCBpbnRl bF9yY3NfY3R4X2luaXQoc3RydWN0IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXEpCiAJcmV0dXJu IDA7CiB9CiAKLXN0YXRpYyBpbnQgd2FfYWRkKHN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZf cHJpdiwKLQkJICBpOTE1X3JlZ190IGFkZHIsCi0JCSAgY29uc3QgdTMyIG1hc2ssIGNvbnN0IHUz MiB2YWwpCi17Ci0JY29uc3QgdTMyIGlkeCA9IGRldl9wcml2LT53b3JrYXJvdW5kcy5jb3VudDsK LQotCWlmIChXQVJOX09OKGlkeCA+PSBJOTE1X01BWF9XQV9SRUdTKSkKLQkJcmV0dXJuIC1FTk9T UEM7Ci0KLQlkZXZfcHJpdi0+d29ya2Fyb3VuZHMucmVnW2lkeF0uYWRkciA9IGFkZHI7Ci0JZGV2 X3ByaXYtPndvcmthcm91bmRzLnJlZ1tpZHhdLnZhbHVlID0gdmFsOwotCWRldl9wcml2LT53b3Jr YXJvdW5kcy5yZWdbaWR4XS5tYXNrID0gbWFzazsKLQotCWRldl9wcml2LT53b3JrYXJvdW5kcy5j b3VudCsrOwotCi0JcmV0dXJuIDA7Ci19Ci0KLSNkZWZpbmUgV0FfUkVHKGFkZHIsIG1hc2ssIHZh bCkgZG8geyBcCi0JCWNvbnN0IGludCByID0gd2FfYWRkKGRldl9wcml2LCAoYWRkciksIChtYXNr KSwgKHZhbCkpOyBcCi0JCWlmIChyKSBcCi0JCQlyZXR1cm4gcjsgXAotCX0gd2hpbGUgKDApCi0K LSNkZWZpbmUgV0FfU0VUX0JJVF9NQVNLRUQoYWRkciwgbWFzaykgXAotCVdBX1JFRyhhZGRyLCAo bWFzayksIF9NQVNLRURfQklUX0VOQUJMRShtYXNrKSkKLQotI2RlZmluZSBXQV9DTFJfQklUX01B U0tFRChhZGRyLCBtYXNrKSBcCi0JV0FfUkVHKGFkZHIsIChtYXNrKSwgX01BU0tFRF9CSVRfRElT QUJMRShtYXNrKSkKLQotI2RlZmluZSBXQV9TRVRfRklFTERfTUFTS0VEKGFkZHIsIG1hc2ssIHZh bHVlKSBcCi0JV0FfUkVHKGFkZHIsIG1hc2ssIF9NQVNLRURfRklFTEQobWFzaywgdmFsdWUpKQot Ci0jZGVmaW5lIFdBX1NFVF9CSVQoYWRkciwgbWFzaykgV0FfUkVHKGFkZHIsIG1hc2ssIEk5MTVf UkVBRChhZGRyKSB8IChtYXNrKSkKLSNkZWZpbmUgV0FfQ0xSX0JJVChhZGRyLCBtYXNrKSBXQV9S RUcoYWRkciwgbWFzaywgSTkxNV9SRUFEKGFkZHIpICYgfihtYXNrKSkKLQotI2RlZmluZSBXQV9X UklURShhZGRyLCB2YWwpIFdBX1JFRyhhZGRyLCAweGZmZmZmZmZmLCB2YWwpCi0KLXN0YXRpYyBp bnQgd2FfcmluZ193aGl0ZWxpc3RfcmVnKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwK LQkJCQkgaTkxNV9yZWdfdCByZWcpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9w cml2ID0gZW5naW5lLT5pOTE1OwotCXN0cnVjdCBpOTE1X3dvcmthcm91bmRzICp3YSA9ICZkZXZf cHJpdi0+d29ya2Fyb3VuZHM7Ci0JY29uc3QgdWludDMyX3QgaW5kZXggPSB3YS0+aHdfd2hpdGVs aXN0X2NvdW50W2VuZ2luZS0+aWRdOwotCi0JaWYgKFdBUk5fT04oaW5kZXggPj0gUklOR19NQVhf Tk9OUFJJVl9TTE9UUykpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JV0FfV1JJVEUoUklOR19GT1JD RV9UT19OT05QUklWKGVuZ2luZS0+bW1pb19iYXNlLCBpbmRleCksCi0JCSBpOTE1X21taW9fcmVn X29mZnNldChyZWcpKTsKLQl3YS0+aHdfd2hpdGVsaXN0X2NvdW50W2VuZ2luZS0+aWRdKys7Ci0K LQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBnZW44X2luaXRfd29ya2Fyb3VuZHMoc3RydWN0 IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpk ZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQotCVdBX1NFVF9CSVRfTUFTS0VEKElOU1RQTSwgSU5T VFBNX0ZPUkNFX09SREVSSU5HKTsKLQotCS8qIFdhRGlzYWJsZUFzeW5jRmxpcFBlcmZNb2RlOmJk dyxjaHYgKi8KLQlXQV9TRVRfQklUX01BU0tFRChNSV9NT0RFLCBBU1lOQ19GTElQX1BFUkZfRElT QUJMRSk7Ci0KLQkvKiBXYURpc2FibGVQYXJ0aWFsSW5zdFNob290ZG93bjpiZHcsY2h2ICovCi0J V0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9ST1dfQ0hJQ0tFTiwKLQkJCSAgUEFSVElBTF9JTlNUUlVD VElPTl9TSE9PVERPV05fRElTQUJMRSk7Ci0KLQkvKiBVc2UgRm9yY2UgTm9uLUNvaGVyZW50IHdo ZW5ldmVyIGV4ZWN1dGluZyBhIDNEIGNvbnRleHQuIFRoaXMgaXMgYQotCSAqIHdvcmthcm91bmQg Zm9yIGZvciBhIHBvc3NpYmxlIGhhbmcgaW4gdGhlIHVubGlrZWx5IGV2ZW50IGEgVExCCi0JICog aW52YWxpZGF0aW9uIG9jY3VycyBkdXJpbmcgYSBQU0QgZmx1c2guCi0JICovCi0JLyogV2FGb3Jj ZUVuYWJsZU5vbkNvaGVyZW50OmJkdyxjaHYgKi8KLQkvKiBXYUhkY0Rpc2FibGVGZXRjaFdoZW5N YXNrZWQ6YmR3LGNodiAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEhEQ19DSElDS0VOMCwKLQkJCSAg SERDX0RPTk9UX0ZFVENIX01FTV9XSEVOX01BU0tFRCB8Ci0JCQkgIEhEQ19GT1JDRV9OT05fQ09I RVJFTlQpOwotCi0JLyogRnJvbSB0aGUgSGFzd2VsbCBQUk0sIENvbW1hbmQgUmVmZXJlbmNlOiBS ZWdpc3RlcnMsIENBQ0hFX01PREVfMDoKLQkgKiAiVGhlIEhpZXJhcmNoaWNhbCBaIFJBVyBTdGFs bCBPcHRpbWl6YXRpb24gYWxsb3dzIG5vbi1vdmVybGFwcGluZwotCSAqICBwb2x5Z29ucyBpbiB0 aGUgc2FtZSA4eDQgcGl4ZWwvc2FtcGxlIGFyZWEgdG8gYmUgcHJvY2Vzc2VkIHdpdGhvdXQKLQkg KiAgc3RhbGxpbmcgd2FpdGluZyBmb3IgdGhlIGVhcmxpZXIgb25lcyB0byB3cml0ZSB0byBIaWVy YXJjaGljYWwgWgotCSAqICBidWZmZXIuIgotCSAqCi0JICogVGhpcyBvcHRpbWl6YXRpb24gaXMg b2ZmIGJ5IGRlZmF1bHQgZm9yIEJEVyBhbmQgQ0hWOyB0dXJuIGl0IG9uLgotCSAqLwotCVdBX0NM Ul9CSVRfTUFTS0VEKENBQ0hFX01PREVfMF9HRU43LCBISVpfUkFXX1NUQUxMX09QVF9ESVNBQkxF KTsKLQotCS8qIFdhNHg0U1RDT3B0aW1pemF0aW9uRGlzYWJsZTpiZHcsY2h2ICovCi0JV0FfU0VU X0JJVF9NQVNLRUQoQ0FDSEVfTU9ERV8xLCBHRU44XzR4NF9TVENfT1BUSU1JWkFUSU9OX0RJU0FC TEUpOwotCi0JLyoKLQkgKiBCU3BlYyByZWNvbW1lbmRzIDh4NCB3aGVuIE1TQUEgaXMgdXNlZCwK LQkgKiBob3dldmVyIGluIHByYWN0aWNlIDE2eDQgc2VlbXMgZmFzdGVzdC4KLQkgKgotCSAqIE5v dGUgdGhhdCBQUy9XTSB0aHJlYWQgY291bnRzIGRlcGVuZCBvbiB0aGUgV0laIGhhc2hpbmcKLQkg KiBkaXNhYmxlIGJpdCwgd2hpY2ggd2UgZG9uJ3QgdG91Y2ggaGVyZSwgYnV0IGl0J3MgZ29vZAot CSAqIHRvIGtlZXAgaW4gbWluZCAoc2VlIDNEU1RBVEVfUFMgYW5kIDNEU1RBVEVfV00pLgotCSAq LwotCVdBX1NFVF9GSUVMRF9NQVNLRUQoR0VON19HVF9NT0RFLAotCQkJICAgIEdFTjZfV0laX0hB U0hJTkdfTUFTSywKLQkJCSAgICBHRU42X1dJWl9IQVNISU5HXzE2eDQpOwotCi0JcmV0dXJuIDA7 Ci19Ci0KLXN0YXRpYyBpbnQgYmR3X2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVsX2VuZ2lu ZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVu Z2luZS0+aTkxNTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ2VuOF9pbml0X3dvcmthcm91bmRzKGVu Z2luZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdhRGlzYWJsZVRocmVhZFN0 YWxsRG9wQ2xvY2tHYXRpbmc6YmR3IChwcmUtcHJvZHVjdGlvbikgKi8KLQlXQV9TRVRfQklUX01B U0tFRChHRU44X1JPV19DSElDS0VOLCBTVEFMTF9ET1BfR0FUSU5HX0RJU0FCTEUpOwotCi0JLyog V2FEaXNhYmxlRG9wQ2xvY2tHYXRpbmc6YmR3Ci0JICoKLQkgKiBBbHNvIHNlZSB0aGUgcmVsYXRl ZCBVQ0dUQ0wxIHdyaXRlIGluIGJyb2Fkd2VsbF9pbml0X2Nsb2NrX2dhdGluZygpCi0JICogdG8g ZGlzYWJsZSBFVVRDIGNsb2NrIGdhdGluZy4KLQkgKi8KLQlXQV9TRVRfQklUX01BU0tFRChHRU43 X1JPV19DSElDS0VOMiwKLQkJCSAgRE9QX0NMT0NLX0dBVElOR19ESVNBQkxFKTsKLQotCVdBX1NF VF9CSVRfTUFTS0VEKEhBTEZfU0xJQ0VfQ0hJQ0tFTjMsCi0JCQkgIEdFTjhfU0FNUExFUl9QT1dF Ul9CWVBBU1NfRElTKTsKLQotCVdBX1NFVF9CSVRfTUFTS0VEKEhEQ19DSElDS0VOMCwKLQkJCSAg LyogV2FGb3JjZUNvbnRleHRTYXZlUmVzdG9yZU5vbkNvaGVyZW50OmJkdyAqLwotCQkJICBIRENf Rk9SQ0VfQ09OVEVYVF9TQVZFX1JFU1RPUkVfTk9OX0NPSEVSRU5UIHwKLQkJCSAgLyogV2FEaXNh YmxlRmVuY2VEZXN0aW5hdGlvblRvU0xNOmJkdyAocHJlLXByb2QpICovCi0JCQkgIChJU19CRFdf R1QzKGRldl9wcml2KSA/IEhEQ19GRU5DRV9ERVNUX1NMTV9ESVNBQkxFIDogMCkpOwotCi0JcmV0 dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgY2h2X2luaXRfd29ya2Fyb3VuZHMoc3RydWN0IGludGVs X2VuZ2luZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJp diA9IGVuZ2luZS0+aTkxNTsKLQlpbnQgcmV0OwotCi0JcmV0ID0gZ2VuOF9pbml0X3dvcmthcm91 bmRzKGVuZ2luZSk7Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCS8qIFdhRGlzYWJsZVRo cmVhZFN0YWxsRG9wQ2xvY2tHYXRpbmc6Y2h2ICovCi0JV0FfU0VUX0JJVF9NQVNLRUQoR0VOOF9S T1dfQ0hJQ0tFTiwgU1RBTExfRE9QX0dBVElOR19ESVNBQkxFKTsKLQotCS8qIEltcHJvdmUgSGla IHRocm91Z2hwdXQgb24gQ0hWLiAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEhJWl9DSElDS0VOLCBD SFZfSFpfOFg4X01PREVfSU5fMVgpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZ2Vu OV9pbml0X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlz dHJ1Y3QgZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50IHJl dDsKLQotCS8qIFdhQ29uZXh0U3dpdGNoV2l0aENvbmN1cnJlbnRUTEJJbnZhbGlkYXRlOnNrbCxi eHQsa2JsLGdsayAqLwotCUk5MTVfV1JJVEUoR0VOOV9DU0ZFX0NISUNLRU4xX1JDUywgX01BU0tF RF9CSVRfRU5BQkxFKEdFTjlfUFJFRU1QVF9HUEdQVV9TWU5DX1NXSVRDSF9ESVNBQkxFKSk7Ci0K LQkvKiBXYUVuYWJsZUxic1NsYVJldHJ5VGltZXJEZWNyZW1lbnQ6c2tsLGJ4dCxrYmwsZ2xrICov Ci0JSTkxNV9XUklURShCRFdfU0NSQVRDSDEsIEk5MTVfUkVBRChCRFdfU0NSQVRDSDEpIHwKLQkJ ICAgR0VOOV9MQlNfU0xBX1JFVFJZX1RJTUVSX0RFQ1JFTUVOVF9FTkFCTEUpOwotCi0JLyogV2FE aXNhYmxlS2lsbExvZ2ljOmJ4dCxza2wsa2JsICovCi0JSTkxNV9XUklURShHQU1fRUNPQ0hLLCBJ OTE1X1JFQUQoR0FNX0VDT0NISykgfAotCQkgICBFQ09DSEtfRElTX1RMQik7Ci0KLQkvKiBXYUNs ZWFyRmxvd0NvbnRyb2xHcGdwdUNvbnRleHRTYXZlOnNrbCxieHQsa2JsLGdsayAqLwotCS8qIFdh RGlzYWJsZVBhcnRpYWxJbnN0U2hvb3Rkb3duOnNrbCxieHQsa2JsLGdsayAqLwotCVdBX1NFVF9C SVRfTUFTS0VEKEdFTjhfUk9XX0NISUNLRU4sCi0JCQkgIEZMT1dfQ09OVFJPTF9FTkFCTEUgfAot CQkJICBQQVJUSUFMX0lOU1RSVUNUSU9OX1NIT09URE9XTl9ESVNBQkxFKTsKLQotCS8qIFN5bmNp bmcgZGVwZW5kZW5jaWVzIGJldHdlZW4gY2FtZXJhIGFuZCBncmFwaGljczpza2wsYnh0LGtibCAq LwotCVdBX1NFVF9CSVRfTUFTS0VEKEhBTEZfU0xJQ0VfQ0hJQ0tFTjMsCi0JCQkgIEdFTjlfRElT QUJMRV9PQ0xfT09CX1NVUFBSRVNTX0xPR0lDKTsKLQotCS8qIFdhRGlzYWJsZURnTWlycm9yRml4 SW5IYWxmU2xpY2VDaGlja2VuNTpieHQgKi8KLQlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAw LCBCWFRfUkVWSURfQTEpKQotCQlXQV9DTFJfQklUX01BU0tFRChHRU45X0hBTEZfU0xJQ0VfQ0hJ Q0tFTjUsCi0JCQkJICBHRU45X0RHX01JUlJPUl9GSVhfRU5BQkxFKTsKLQotCS8qIFdhU2V0RGlz YWJsZVBpeE1hc2tDYW1taW5nQW5kUmh3b0luQ29tbW9uU2xpY2VDaGlja2VuOmJ4dCAqLwotCWlm IChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIDAsIEJYVF9SRVZJRF9BMSkpIHsKLQkJV0FfU0VUX0JJ VF9NQVNLRUQoR0VON19DT01NT05fU0xJQ0VfQ0hJQ0tFTjEsCi0JCQkJICBHRU45X1JIV09fT1BU SU1JWkFUSU9OX0RJU0FCTEUpOwotCQkvKgotCQkgKiBXQSBhbHNvIHJlcXVpcmVzIEdFTjlfU0xJ Q0VfQ09NTU9OX0VDT19DSElDS0VOMFsxNDoxNF0gdG8gYmUgc2V0Ci0JCSAqIGJ1dCB3ZSBkbyB0 aGF0IGluIHBlciBjdHggYmF0Y2hidWZmZXIgYXMgdGhlcmUgaXMgYW4gaXNzdWUKLQkJICogd2l0 aCB0aGlzIHJlZ2lzdGVyIG5vdCBnZXR0aW5nIHJlc3RvcmVkIG9uIGN0eCByZXN0b3JlCi0JCSAq LwotCX0KLQotCS8qIFdhRW5hYmxlU2FtcGxlckdQR1BVUHJlZW1wdGlvblN1cHBvcnQ6c2tsLGJ4 dCxrYmwgKi8KLQlXQV9TRVRfQklUX01BU0tFRChHRU45X0hBTEZfU0xJQ0VfQ0hJQ0tFTjcsCi0J CQkgIEdFTjlfRU5BQkxFX0dQR1BVX1BSRUVNUFRJT04pOwotCi0JLyogV2E0eDRTVENPcHRpbWl6 YXRpb25EaXNhYmxlOnNrbCxieHQsa2JsLGdsayAqLwotCS8qIFdhRGlzYWJsZVBhcnRpYWxSZXNv bHZlSW5WYzpza2wsYnh0LGtibCAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKENBQ0hFX01PREVfMSwg KEdFTjhfNHg0X1NUQ19PUFRJTUlaQVRJT05fRElTQUJMRSB8Ci0JCQkJCSBHRU45X1BBUlRJQUxf UkVTT0xWRV9JTl9WQ19ESVNBQkxFKSk7Ci0KLQkvKiBXYUNjc1RsYlByZWZldGNoRGlzYWJsZTpz a2wsYnh0LGtibCxnbGsgKi8KLQlXQV9DTFJfQklUX01BU0tFRChHRU45X0hBTEZfU0xJQ0VfQ0hJ Q0tFTjUsCi0JCQkgIEdFTjlfQ0NTX1RMQl9QUkVGRVRDSF9FTkFCTEUpOwotCi0JLyogV2FEaXNh YmxlTWFza0Jhc2VkQ2FtbWluZ0luUkNDOmJ4dCAqLwotCWlmIChJU19CWFRfUkVWSUQoZGV2X3By aXYsIDAsIEJYVF9SRVZJRF9BMSkpCi0JCVdBX1NFVF9CSVRfTUFTS0VEKFNMSUNFX0VDT19DSElD S0VOMCwKLQkJCQkgIFBJWEVMX01BU0tfQ0FNTUlOR19ESVNBQkxFKTsKLQotCS8qIFdhRm9yY2VD b250ZXh0U2F2ZVJlc3RvcmVOb25Db2hlcmVudDpza2wsYnh0LGtibCAqLwotCVdBX1NFVF9CSVRf TUFTS0VEKEhEQ19DSElDS0VOMCwKLQkJCSAgSERDX0ZPUkNFX0NPTlRFWFRfU0FWRV9SRVNUT1JF X05PTl9DT0hFUkVOVCB8Ci0JCQkgIEhEQ19GT1JDRV9DU1JfTk9OX0NPSEVSRU5UX09WUl9ESVNB QkxFKTsKLQotCS8qIFdhRm9yY2VFbmFibGVOb25Db2hlcmVudCBhbmQgV2FEaXNhYmxlSERDSW52 YWxpZGF0aW9uIGFyZQotCSAqIGJvdGggdGllZCB0byBXYUZvcmNlQ29udGV4dFNhdmVSZXN0b3Jl Tm9uQ29oZXJlbnQKLQkgKiBpbiBzb21lIGhzZHMgZm9yIHNrbC4gV2Uga2VlcCB0aGUgdGllIGZv ciBhbGwgZ2VuOS4gVGhlCi0JICogZG9jdW1lbnRhdGlvbiBpcyBhIGJpdCBoYXp5IGFuZCBzbyB3 ZSB3YW50IHRvIGdldCBjb21tb24gYmVoYXZpb3VyLAotCSAqIGV2ZW4gdGhvdWdoIHRoZXJlIGlz IG5vIGNsZWFyIGV2aWRlbmNlIHdlIHdvdWxkIG5lZWQgYm90aCBvbiBrYmwvYnh0LgotCSAqIFRo aXMgYXJlYSBoYXMgYmVlbiBzb3VyY2Ugb2Ygc3lzdGVtIGhhbmdzIHNvIHdlIHBsYXkgaXQgc2Fm ZQotCSAqIGFuZCBtaW1pYyB0aGUgc2tsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBic3BlYyBzYXlzLgot CSAqCi0JICogVXNlIEZvcmNlIE5vbi1Db2hlcmVudCB3aGVuZXZlciBleGVjdXRpbmcgYSAzRCBj b250ZXh0LiBUaGlzCi0JICogaXMgYSB3b3JrYXJvdW5kIGZvciBhIHBvc3NpYmxlIGhhbmcgaW4g dGhlIHVubGlrZWx5IGV2ZW50Ci0JICogYSBUTEIgaW52YWxpZGF0aW9uIG9jY3VycyBkdXJpbmcg YSBQU0QgZmx1c2guCi0JICovCi0KLQkvKiBXYUZvcmNlRW5hYmxlTm9uQ29oZXJlbnQ6c2tsLGJ4 dCxrYmwgKi8KLQlXQV9TRVRfQklUX01BU0tFRChIRENfQ0hJQ0tFTjAsCi0JCQkgIEhEQ19GT1JD RV9OT05fQ09IRVJFTlQpOwotCi0JLyogV2FEaXNhYmxlSERDSW52YWxpZGF0aW9uOnNrbCxieHQs a2JsICovCi0JSTkxNV9XUklURShHQU1fRUNPQ0hLLCBJOTE1X1JFQUQoR0FNX0VDT0NISykgfAot CQkgICBCRFdfRElTQUJMRV9IRENfSU5WQUxJREFUSU9OKTsKLQotCS8qIFdhRGlzYWJsZVNhbXBs ZXJQb3dlckJ5cGFzc0ZvclNPUGluZ1Bvbmc6c2tsLGJ4dCxrYmwgKi8KLQlpZiAoSVNfU0tZTEFL RShkZXZfcHJpdikgfHwKLQkgICAgSVNfS0FCWUxBS0UoZGV2X3ByaXYpIHx8Ci0JICAgIElTX0JY VF9SRVZJRChkZXZfcHJpdiwgMCwgQlhUX1JFVklEX0IwKSkKLQkJV0FfU0VUX0JJVF9NQVNLRUQo SEFMRl9TTElDRV9DSElDS0VOMywKLQkJCQkgIEdFTjhfU0FNUExFUl9QT1dFUl9CWVBBU1NfRElT KTsKLQotCS8qIFdhRGlzYWJsZVNUVW5pdFBvd2VyT3B0aW1pemF0aW9uOnNrbCxieHQsa2JsLGds ayAqLwotCVdBX1NFVF9CSVRfTUFTS0VEKEhBTEZfU0xJQ0VfQ0hJQ0tFTjIsIEdFTjhfU1RfUE9f RElTQUJMRSk7Ci0KLQkvKiBXYU9DTENvaGVyZW50TGluZUZsdXNoOnNrbCxieHQsa2JsICovCi0J STkxNV9XUklURShHRU44X0wzU1FDUkVHNCwgKEk5MTVfUkVBRChHRU44X0wzU1FDUkVHNCkgfAot CQkJCSAgICBHRU44X0xRU0NfRkxVU0hfQ09IRVJFTlRfTElORVMpKTsKLQotCS8qIFdhVkZFU3Rh dGVBZnRlclBpcGVDb250cm9sd2l0aE1lZGlhU3RhdGVDbGVhcjpza2wsYnh0LGdsayAqLwotCXJl dCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUsIEdFTjlfQ1RYX1BSRUVNUFRfUkVHKTsK LQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogV2FFbmFibGVQcmVlbXB0aW9uR3JhbnVs YXJpdHlDb250cm9sQnlVTUQ6c2tsLGJ4dCxrYmwgKi8KLQlyZXQ9IHdhX3Jpbmdfd2hpdGVsaXN0 X3JlZyhlbmdpbmUsIEdFTjhfQ1NfQ0hJQ0tFTjEpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7 Ci0KLQkvKiBXYUFsbG93VU1EVG9Nb2RpZnlIRENDaGlja2VuMTpza2wsYnh0LGtibCxnbGsgKi8K LQlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9yZWcoZW5naW5lLCBHRU44X0hEQ19DSElDS0VOMSk7 Ci0JaWYgKHJldCkKLQkJcmV0dXJuIHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50 IHNrbF90dW5lX2l6X2hhc2hpbmcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewot CXN0cnVjdCBkcm1faTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQl1OCB2 YWxzWzNdID0geyAwLCAwLCAwIH07Ci0JdW5zaWduZWQgaW50IGk7Ci0KLQlmb3IgKGkgPSAwOyBp IDwgMzsgaSsrKSB7Ci0JCXU4IHNzOwotCi0JCS8qCi0JCSAqIE9ubHkgY29uc2lkZXIgc2xpY2Vz IHdoZXJlIG9uZSwgYW5kIG9ubHkgb25lLCBzdWJzbGljZSBoYXMgNwotCQkgKiBFVXMKLQkJICov Ci0JCWlmICghaXNfcG93ZXJfb2ZfMihJTlRFTF9JTkZPKGRldl9wcml2KS0+c3NldS5zdWJzbGlj ZV83ZXVbaV0pKQotCQkJY29udGludWU7Ci0KLQkJLyoKLQkJICogc3Vic2xpY2VfN2V1W2ldICE9 IDAgKGJlY2F1c2Ugb2YgdGhlIGNoZWNrIGFib3ZlKSBhbmQKLQkJICogc3NfbWF4ID09IDQgKG1h eGltdW0gbnVtYmVyIG9mIHN1YnNsaWNlcyBwb3NzaWJsZSBwZXIgc2xpY2UpCi0JCSAqCi0JCSAq IC0+ICAgIDAgPD0gc3MgPD0gMzsKLQkJICovCi0JCXNzID0gZmZzKElOVEVMX0lORk8oZGV2X3By aXYpLT5zc2V1LnN1YnNsaWNlXzdldVtpXSkgLSAxOwotCQl2YWxzW2ldID0gMyAtIHNzOwotCX0K LQotCWlmICh2YWxzWzBdID09IDAgJiYgdmFsc1sxXSA9PSAwICYmIHZhbHNbMl0gPT0gMCkKLQkJ cmV0dXJuIDA7Ci0KLQkvKiBUdW5lIElaIGhhc2hpbmcuIFNlZSBpbnRlbF9kZXZpY2VfaW5mb19y dW50aW1lX2luaXQoKSAqLwotCVdBX1NFVF9GSUVMRF9NQVNLRUQoR0VON19HVF9NT0RFLAotCQkJ ICAgIEdFTjlfSVpfSEFTSElOR19NQVNLKDIpIHwKLQkJCSAgICBHRU45X0laX0hBU0hJTkdfTUFT SygxKSB8Ci0JCQkgICAgR0VOOV9JWl9IQVNISU5HX01BU0soMCksCi0JCQkgICAgR0VOOV9JWl9I QVNISU5HKDIsIHZhbHNbMl0pIHwKLQkJCSAgICBHRU45X0laX0hBU0hJTkcoMSwgdmFsc1sxXSkg fAotCQkJICAgIEdFTjlfSVpfSEFTSElORygwLCB2YWxzWzBdKSk7Ci0KLQlyZXR1cm4gMDsKLX0K LQotc3RhdGljIGludCBza2xfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2Nz ICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5l LT5pOTE1OwotCWludCByZXQ7Ci0KLQlyZXQgPSBnZW45X2luaXRfd29ya2Fyb3VuZHMoZW5naW5l KTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyoKLQkgKiBBY3R1YWwgV0EgaXMgdG8g ZGlzYWJsZSBwZXJjb250ZXh0IHByZWVtcHRpb24gZ3JhbnVsYXJpdHkgY29udHJvbAotCSAqIHVu dGlsIEQwIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGNhc2Ugc28gdGhpcyBpcyBlcXVpdmFsZW50IHRv Ci0JICogIVdhRGlzYWJsZVBlckN0eHRQcmVlbXB0aW9uR3JhbnVsYXJpdHlDb250cm9sOnNrbAot CSAqLwotCUk5MTVfV1JJVEUoR0VON19GRl9TTElDRV9DU19DSElDS0VOMSwKLQkJICAgX01BU0tF RF9CSVRfRU5BQkxFKEdFTjlfRkZTQ19QRVJDVFhfUFJFRU1QVF9DVFJMKSk7Ci0KLQkvKiBXYUVu YWJsZUdhcHNUc3ZDcmVkaXRGaXg6c2tsICovCi0JSTkxNV9XUklURShHRU44X0dBUkJDTlRMLCAo STkxNV9SRUFEKEdFTjhfR0FSQkNOVEwpIHwKLQkJCQkgICBHRU45X0dBUFNfVFNWX0NSRURJVF9E SVNBQkxFKSk7Ci0KLQkvKiBXYURpc2FibGVHYWZzVW5pdENsa0dhdGluZzpza2wgKi8KLQlXQV9T RVRfQklUKEdFTjdfVUNHQ1RMNCwgR0VOOF9FVV9HQVVOSVRfQ0xPQ0tfR0FURV9ESVNBQkxFKTsK LQotCS8qIFdhSW5QbGFjZURlY29tcHJlc3Npb25IYW5nOnNrbCAqLwotCWlmIChJU19TS0xfUkVW SUQoZGV2X3ByaXYsIFNLTF9SRVZJRF9IMCwgUkVWSURfRk9SRVZFUikpCi0JCVdBX1NFVF9CSVQo R0VOOV9HQU1UX0VDT19SRUdfUldfSUEsCi0JCQkgICBHQU1UX0VDT19FTkFCTEVfSU5fUExBQ0Vf REVDT01QUkVTUyk7Ci0KLQkvKiBXYURpc2FibGVMU1FDUk9QRVJGZm9yT0NMOnNrbCAqLwotCXJl dCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUsIEdFTjhfTDNTUUNSRUc0KTsKLQlpZiAo cmV0KQotCQlyZXR1cm4gcmV0OwotCi0JcmV0dXJuIHNrbF90dW5lX2l6X2hhc2hpbmcoZW5naW5l KTsKLX0KLQotc3RhdGljIGludCBieHRfaW5pdF93b3JrYXJvdW5kcyhzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpCi17Ci0Jc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0g ZW5naW5lLT5pOTE1OwotCWludCByZXQ7Ci0KLQlyZXQgPSBnZW45X2luaXRfd29ya2Fyb3VuZHMo ZW5naW5lKTsKLQlpZiAocmV0KQotCQlyZXR1cm4gcmV0OwotCi0JLyogV2FTdG9yZU11bHRpcGxl UFRFZW5hYmxlOmJ4dCAqLwotCS8qIFRoaXMgaXMgYSByZXF1aXJlbWVudCBhY2NvcmRpbmcgdG8g SGFyZHdhcmUgc3BlY2lmaWNhdGlvbiAqLwotCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIDAs IEJYVF9SRVZJRF9BMSkpCi0JCUk5MTVfV1JJVEUoVElMRUNUTCwgSTkxNV9SRUFEKFRJTEVDVEwp IHwgVElMRUNUTF9UTEJQRik7Ci0KLQkvKiBXYVNldENsY2tHYXRpbmdEaXNhYmxlTWVkaWE6Ynh0 ICovCi0JaWYgKElTX0JYVF9SRVZJRChkZXZfcHJpdiwgMCwgQlhUX1JFVklEX0ExKSkgewotCQlJ OTE1X1dSSVRFKEdFTjdfTUlTQ0NQQ1RMLCAoSTkxNV9SRUFEKEdFTjdfTUlTQ0NQQ1RMKSAmCi0J CQkJCSAgICB+R0VOOF9ET1BfQ0xPQ0tfR0FURV9NRURJQV9FTkFCTEUpKTsKLQl9Ci0KLQkvKiBX YURpc2FibGVUaHJlYWRTdGFsbERvcENsb2NrR2F0aW5nOmJ4dCAqLwotCVdBX1NFVF9CSVRfTUFT S0VEKEdFTjhfUk9XX0NISUNLRU4sCi0JCQkgIFNUQUxMX0RPUF9HQVRJTkdfRElTQUJMRSk7Ci0K LQkvKiBXYURpc2FibGVQb29sZWRFdUxvYWRCYWxhbmNpbmdGaXg6Ynh0ICovCi0JaWYgKElTX0JY VF9SRVZJRChkZXZfcHJpdiwgQlhUX1JFVklEX0IwLCBSRVZJRF9GT1JFVkVSKSkgewotCQlXQV9T RVRfQklUX01BU0tFRChGRl9TTElDRV9DU19DSElDS0VOMiwKLQkJCQkgIEdFTjlfUE9PTEVEX0VV X0xPQURfQkFMQU5DSU5HX0ZJWF9ESVNBQkxFKTsKLQl9Ci0KLQkvKiBXYURpc2FibGVTYmVDYWNo ZURpc3BhdGNoUG9ydFNoYXJpbmc6Ynh0ICovCi0JaWYgKElTX0JYVF9SRVZJRChkZXZfcHJpdiwg MCwgQlhUX1JFVklEX0IwKSkgewotCQlXQV9TRVRfQklUX01BU0tFRCgKLQkJCUdFTjdfSEFMRl9T TElDRV9DSElDS0VOMSwKLQkJCUdFTjdfU0JFX1NTX0NBQ0hFX0RJU1BBVENIX1BPUlRfU0hBUklO R19ESVNBQkxFKTsKLQl9Ci0KLQkvKiBXYURpc2FibGVPYmplY3RMZXZlbFByZWVtcHRpb25Gb3JU cmlmYW5PclBvbHlnb246Ynh0ICovCi0JLyogV2FEaXNhYmxlT2JqZWN0TGV2ZWxQcmVlbXB0aW9u Rm9ySW5zdGFuY2VkRHJhdzpieHQgKi8KLQkvKiBXYURpc2FibGVPYmplY3RMZXZlbFByZWVtdGlv bkZvckluc3RhbmNlSWQ6Ynh0ICovCi0JLyogV2FEaXNhYmxlTFNRQ1JPUEVSRmZvck9DTDpieHQg Ki8KLQlpZiAoSVNfQlhUX1JFVklEKGRldl9wcml2LCAwLCBCWFRfUkVWSURfQTEpKSB7Ci0JCXJl dCA9IHdhX3Jpbmdfd2hpdGVsaXN0X3JlZyhlbmdpbmUsIEdFTjlfQ1NfREVCVUdfTU9ERTEpOwot CQlpZiAocmV0KQotCQkJcmV0dXJuIHJldDsKLQotCQlyZXQgPSB3YV9yaW5nX3doaXRlbGlzdF9y ZWcoZW5naW5lLCBHRU44X0wzU1FDUkVHNCk7Ci0JCWlmIChyZXQpCi0JCQlyZXR1cm4gcmV0Owot CX0KLQotCS8qIFdhUHJvZ3JhbUwzU3FjUmVnMURlZmF1bHRGb3JQZXJmOmJ4dCAqLwotCWlmIChJ U19CWFRfUkVWSUQoZGV2X3ByaXYsIEJYVF9SRVZJRF9CMCwgUkVWSURfRk9SRVZFUikpCi0JCUk5 MTVfV1JJVEUoR0VOOF9MM1NRQ1JFRzEsIEwzX0dFTkVSQUxfUFJJT19DUkVESVRTKDYyKSB8Ci0J CQkJCSAgIEwzX0hJR0hfUFJJT19DUkVESVRTKDIpKTsKLQotCS8qIFdhVG9FbmFibGVId0ZpeEZv clB1c2hDb25zdEhXQnVnOmJ4dCAqLwotCWlmIChJU19CWFRfUkVWSUQoZGV2X3ByaXYsIEJYVF9S RVZJRF9DMCwgUkVWSURfRk9SRVZFUikpCi0JCVdBX1NFVF9CSVRfTUFTS0VEKENPTU1PTl9TTElD RV9DSElDS0VOMiwKLQkJCQkgIEdFTjhfU0JFX0RJU0FCTEVfUkVQTEFZX0JVRl9PUFRJTUlaQVRJ T04pOwotCi0JLyogV2FJblBsYWNlRGVjb21wcmVzc2lvbkhhbmc6Ynh0ICovCi0JaWYgKElTX0JY VF9SRVZJRChkZXZfcHJpdiwgQlhUX1JFVklEX0MwLCBSRVZJRF9GT1JFVkVSKSkKLQkJV0FfU0VU X0JJVChHRU45X0dBTVRfRUNPX1JFR19SV19JQSwKLQkJCSAgIEdBTVRfRUNPX0VOQUJMRV9JTl9Q TEFDRV9ERUNPTVBSRVNTKTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGtibF9pbml0 X3dvcmthcm91bmRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlzdHJ1Y3Qg ZHJtX2k5MTVfcHJpdmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50IHJldDsKLQot CXJldCA9IGdlbjlfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwotCWlmIChyZXQpCi0JCXJldHVy biByZXQ7Ci0KLQkvKiBXYUVuYWJsZUdhcHNUc3ZDcmVkaXRGaXg6a2JsICovCi0JSTkxNV9XUklU RShHRU44X0dBUkJDTlRMLCAoSTkxNV9SRUFEKEdFTjhfR0FSQkNOVEwpIHwKLQkJCQkgICBHRU45 X0dBUFNfVFNWX0NSRURJVF9ESVNBQkxFKSk7Ci0KLQkvKiBXYURpc2FibGVEeW5hbWljQ3JlZGl0 U2hhcmluZzprYmwgKi8KLQlpZiAoSVNfS0JMX1JFVklEKGRldl9wcml2LCAwLCBLQkxfUkVWSURf QjApKQotCQlXQV9TRVRfQklUKEdBTVRfQ0hLTl9CSVRfUkVHLAotCQkJICAgR0FNVF9DSEtOX0RJ U0FCTEVfRFlOQU1JQ19DUkVESVRfU0hBUklORyk7Ci0KLQkvKiBXYURpc2FibGVGZW5jZURlc3Rp bmF0aW9uVG9TTE06a2JsIChwcmUtcHJvZCkgKi8KLQlpZiAoSVNfS0JMX1JFVklEKGRldl9wcml2 LCBLQkxfUkVWSURfQTAsIEtCTF9SRVZJRF9BMCkpCi0JCVdBX1NFVF9CSVRfTUFTS0VEKEhEQ19D SElDS0VOMCwKLQkJCQkgIEhEQ19GRU5DRV9ERVNUX1NMTV9ESVNBQkxFKTsKLQotCS8qIFdhVG9F bmFibGVId0ZpeEZvclB1c2hDb25zdEhXQnVnOmtibCAqLwotCWlmIChJU19LQkxfUkVWSUQoZGV2 X3ByaXYsIEtCTF9SRVZJRF9DMCwgUkVWSURfRk9SRVZFUikpCi0JCVdBX1NFVF9CSVRfTUFTS0VE KENPTU1PTl9TTElDRV9DSElDS0VOMiwKLQkJCQkgIEdFTjhfU0JFX0RJU0FCTEVfUkVQTEFZX0JV Rl9PUFRJTUlaQVRJT04pOwotCi0JLyogV2FEaXNhYmxlR2Fmc1VuaXRDbGtHYXRpbmc6a2JsICov Ci0JV0FfU0VUX0JJVChHRU43X1VDR0NUTDQsIEdFTjhfRVVfR0FVTklUX0NMT0NLX0dBVEVfRElT QUJMRSk7Ci0KLQkvKiBXYURpc2FibGVTYmVDYWNoZURpc3BhdGNoUG9ydFNoYXJpbmc6a2JsICov Ci0JV0FfU0VUX0JJVF9NQVNLRUQoCi0JCUdFTjdfSEFMRl9TTElDRV9DSElDS0VOMSwKLQkJR0VO N19TQkVfU1NfQ0FDSEVfRElTUEFUQ0hfUE9SVF9TSEFSSU5HX0RJU0FCTEUpOwotCi0JLyogV2FJ blBsYWNlRGVjb21wcmVzc2lvbkhhbmc6a2JsICovCi0JV0FfU0VUX0JJVChHRU45X0dBTVRfRUNP X1JFR19SV19JQSwKLQkJICAgR0FNVF9FQ09fRU5BQkxFX0lOX1BMQUNFX0RFQ09NUFJFU1MpOwot Ci0JLyogV2FEaXNhYmxlTFNRQ1JPUEVSRmZvck9DTDprYmwgKi8KLQlyZXQgPSB3YV9yaW5nX3do aXRlbGlzdF9yZWcoZW5naW5lLCBHRU44X0wzU1FDUkVHNCk7Ci0JaWYgKHJldCkKLQkJcmV0dXJu IHJldDsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGdsa19pbml0X3dvcmthcm91bmRz KHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSkKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfcHJp dmF0ZSAqZGV2X3ByaXYgPSBlbmdpbmUtPmk5MTU7Ci0JaW50IHJldDsKLQotCXJldCA9IGdlbjlf aW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwotCWlmIChyZXQpCi0JCXJldHVybiByZXQ7Ci0KLQkv KiBXYVRvRW5hYmxlSHdGaXhGb3JQdXNoQ29uc3RIV0J1ZzpnbGsgKi8KLQlXQV9TRVRfQklUX01B U0tFRChDT01NT05fU0xJQ0VfQ0hJQ0tFTjIsCi0JCQkgIEdFTjhfU0JFX0RJU0FCTEVfUkVQTEFZ X0JVRl9PUFRJTUlaQVRJT04pOwotCi0JcmV0dXJuIDA7Ci19Ci0KLWludCBpbml0X3dvcmthcm91 bmRzX3Jpbmcoc3RydWN0IGludGVsX2VuZ2luZV9jcyAqZW5naW5lKQotewotCXN0cnVjdCBkcm1f aTkxNV9wcml2YXRlICpkZXZfcHJpdiA9IGVuZ2luZS0+aTkxNTsKLQotCVdBUk5fT04oZW5naW5l LT5pZCAhPSBSQ1MpOwotCi0JZGV2X3ByaXYtPndvcmthcm91bmRzLmNvdW50ID0gMDsKLQlkZXZf cHJpdi0+d29ya2Fyb3VuZHMuaHdfd2hpdGVsaXN0X2NvdW50W1JDU10gPSAwOwotCi0JaWYgKElT X0JST0FEV0VMTChkZXZfcHJpdikpCi0JCXJldHVybiBiZHdfaW5pdF93b3JrYXJvdW5kcyhlbmdp bmUpOwotCi0JaWYgKElTX0NIRVJSWVZJRVcoZGV2X3ByaXYpKQotCQlyZXR1cm4gY2h2X2luaXRf d29ya2Fyb3VuZHMoZW5naW5lKTsKLQotCWlmIChJU19TS1lMQUtFKGRldl9wcml2KSkKLQkJcmV0 dXJuIHNrbF9pbml0X3dvcmthcm91bmRzKGVuZ2luZSk7Ci0KLQlpZiAoSVNfQlJPWFRPTihkZXZf cHJpdikpCi0JCXJldHVybiBieHRfaW5pdF93b3JrYXJvdW5kcyhlbmdpbmUpOwotCi0JaWYgKElT X0tBQllMQUtFKGRldl9wcml2KSkKLQkJcmV0dXJuIGtibF9pbml0X3dvcmthcm91bmRzKGVuZ2lu ZSk7Ci0KLQlpZiAoSVNfR0VNSU5JTEFLRShkZXZfcHJpdikpCi0JCXJldHVybiBnbGtfaW5pdF93 b3JrYXJvdW5kcyhlbmdpbmUpOwotCi0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgaW5pdF9y ZW5kZXJfcmluZyhzdHJ1Y3QgaW50ZWxfZW5naW5lX2NzICplbmdpbmUpCiB7CiAJc3RydWN0IGRy bV9pOTE1X3ByaXZhdGUgKmRldl9wcml2ID0gZW5naW5lLT5pOTE1OwpAQCAtMTg0MiwxNDIgKzEy NzMsNiBAQCBzdGF0aWMgaW50IGluaXRfcGh5c19zdGF0dXNfcGFnZShzdHJ1Y3QgaW50ZWxfZW5n aW5lX2NzICplbmdpbmUpCiAJcmV0dXJuIDA7CiB9CiAKLWludCBpbnRlbF9yaW5nX3BpbihzdHJ1 Y3QgaW50ZWxfcmluZyAqcmluZywgdW5zaWduZWQgaW50IG9mZnNldF9iaWFzKQotewotCXVuc2ln bmVkIGludCBmbGFnczsKLQllbnVtIGk5MTVfbWFwX3R5cGUgbWFwOwotCXN0cnVjdCBpOTE1X3Zt YSAqdm1hID0gcmluZy0+dm1hOwotCXZvaWQgKmFkZHI7Ci0JaW50IHJldDsKLQotCUdFTV9CVUdf T04ocmluZy0+dmFkZHIpOwotCi0JbWFwID0gSEFTX0xMQyhyaW5nLT5lbmdpbmUtPmk5MTUpID8g STkxNV9NQVBfV0IgOiBJOTE1X01BUF9XQzsKLQotCWZsYWdzID0gUElOX0dMT0JBTDsKLQlpZiAo b2Zmc2V0X2JpYXMpCi0JCWZsYWdzIHw9IFBJTl9PRkZTRVRfQklBUyB8IG9mZnNldF9iaWFzOwot CWlmICh2bWEtPm9iai0+c3RvbGVuKQotCQlmbGFncyB8PSBQSU5fTUFQUEFCTEU7Ci0KLQlpZiAo ISh2bWEtPmZsYWdzICYgSTkxNV9WTUFfR0xPQkFMX0JJTkQpKSB7Ci0JCWlmIChmbGFncyAmIFBJ Tl9NQVBQQUJMRSB8fCBtYXAgPT0gSTkxNV9NQVBfV0MpCi0JCQlyZXQgPSBpOTE1X2dlbV9vYmpl Y3Rfc2V0X3RvX2d0dF9kb21haW4odm1hLT5vYmosIHRydWUpOwotCQllbHNlCi0JCQlyZXQgPSBp OTE1X2dlbV9vYmplY3Rfc2V0X3RvX2NwdV9kb21haW4odm1hLT5vYmosIHRydWUpOwotCQlpZiAo dW5saWtlbHkocmV0KSkKLQkJCXJldHVybiByZXQ7Ci0JfQotCi0JcmV0ID0gaTkxNV92bWFfcGlu KHZtYSwgMCwgUEFHRV9TSVpFLCBmbGFncyk7Ci0JaWYgKHVubGlrZWx5KHJldCkpCi0JCXJldHVy biByZXQ7Ci0KLQlpZiAoaTkxNV92bWFfaXNfbWFwX2FuZF9mZW5jZWFibGUodm1hKSkKLQkJYWRk ciA9ICh2b2lkIF9fZm9yY2UgKilpOTE1X3ZtYV9waW5faW9tYXAodm1hKTsKLQllbHNlCi0JCWFk ZHIgPSBpOTE1X2dlbV9vYmplY3RfcGluX21hcCh2bWEtPm9iaiwgbWFwKTsKLQlpZiAoSVNfRVJS KGFkZHIpKQotCQlnb3RvIGVycjsKLQotCXJpbmctPnZhZGRyID0gYWRkcjsKLQlyZXR1cm4gMDsK LQotZXJyOgotCWk5MTVfdm1hX3VucGluKHZtYSk7Ci0JcmV0dXJuIFBUUl9FUlIoYWRkcik7Ci19 Ci0KLXZvaWQgaW50ZWxfcmluZ191bnBpbihzdHJ1Y3QgaW50ZWxfcmluZyAqcmluZykKLXsKLQlH RU1fQlVHX09OKCFyaW5nLT52bWEpOwotCUdFTV9CVUdfT04oIXJpbmctPnZhZGRyKTsKLQotCWlm IChpOTE1X3ZtYV9pc19tYXBfYW5kX2ZlbmNlYWJsZShyaW5nLT52bWEpKQotCQlpOTE1X3ZtYV91 bnBpbl9pb21hcChyaW5nLT52bWEpOwotCWVsc2UKLQkJaTkxNV9nZW1fb2JqZWN0X3VucGluX21h cChyaW5nLT52bWEtPm9iaik7Ci0JcmluZy0+dmFkZHIgPSBOVUxMOwotCi0JaTkxNV92bWFfdW5w aW4ocmluZy0+dm1hKTsKLX0KLQotc3RhdGljIHN0cnVjdCBpOTE1X3ZtYSAqCi1pbnRlbF9yaW5n X2NyZWF0ZV92bWEoc3RydWN0IGRybV9pOTE1X3ByaXZhdGUgKmRldl9wcml2LCBpbnQgc2l6ZSkK LXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqOwotCXN0cnVjdCBpOTE1X3ZtYSAq dm1hOwotCi0Jb2JqID0gaTkxNV9nZW1fb2JqZWN0X2NyZWF0ZV9zdG9sZW4oZGV2X3ByaXYsIHNp emUpOwotCWlmICghb2JqKQotCQlvYmogPSBpOTE1X2dlbV9vYmplY3RfY3JlYXRlKGRldl9wcml2 LCBzaXplKTsKLQlpZiAoSVNfRVJSKG9iaikpCi0JCXJldHVybiBFUlJfQ0FTVChvYmopOwotCi0J LyogbWFyayByaW5nIGJ1ZmZlcnMgYXMgcmVhZC1vbmx5IGZyb20gR1BVIHNpZGUgYnkgZGVmYXVs dCAqLwotCW9iai0+Z3Rfcm8gPSAxOwotCi0Jdm1hID0gaTkxNV92bWFfaW5zdGFuY2Uob2JqLCAm ZGV2X3ByaXYtPmdndHQuYmFzZSwgTlVMTCk7Ci0JaWYgKElTX0VSUih2bWEpKQotCQlnb3RvIGVy cjsKLQotCXJldHVybiB2bWE7Ci0KLWVycjoKLQlpOTE1X2dlbV9vYmplY3RfcHV0KG9iaik7Ci0J cmV0dXJuIHZtYTsKLX0KLQotc3RydWN0IGludGVsX3JpbmcgKgotaW50ZWxfZW5naW5lX2NyZWF0 ZV9yaW5nKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKmVuZ2luZSwgaW50IHNpemUpCi17Ci0Jc3Ry dWN0IGludGVsX3JpbmcgKnJpbmc7Ci0Jc3RydWN0IGk5MTVfdm1hICp2bWE7Ci0KLQlHRU1fQlVH X09OKCFpc19wb3dlcl9vZl8yKHNpemUpKTsKLQlHRU1fQlVHX09OKFJJTkdfQ1RMX1NJWkUoc2l6 ZSkgJiB+UklOR19OUl9QQUdFUyk7Ci0KLQlyaW5nID0ga3phbGxvYyhzaXplb2YoKnJpbmcpLCBH RlBfS0VSTkVMKTsKLQlpZiAoIXJpbmcpCi0JCXJldHVybiBFUlJfUFRSKC1FTk9NRU0pOwotCi0J cmluZy0+ZW5naW5lID0gZW5naW5lOwotCi0JSU5JVF9MSVNUX0hFQUQoJnJpbmctPnJlcXVlc3Rf bGlzdCk7Ci0KLQlyaW5nLT5zaXplID0gc2l6ZTsKLQkvKiBXb3JrYXJvdW5kIGFuIGVycmF0dW0g b24gdGhlIGk4MzAgd2hpY2ggY2F1c2VzIGEgaGFuZyBpZgotCSAqIHRoZSBUQUlMIHBvaW50ZXIg cG9pbnRzIHRvIHdpdGhpbiB0aGUgbGFzdCAyIGNhY2hlbGluZXMKLQkgKiBvZiB0aGUgYnVmZmVy LgotCSAqLwotCXJpbmctPmVmZmVjdGl2ZV9zaXplID0gc2l6ZTsKLQlpZiAoSVNfSTgzMChlbmdp bmUtPmk5MTUpIHx8IElTX0k4NDVHKGVuZ2luZS0+aTkxNSkpCi0JCXJpbmctPmVmZmVjdGl2ZV9z aXplIC09IDIgKiBDQUNIRUxJTkVfQllURVM7Ci0KLQlyaW5nLT5sYXN0X3JldGlyZWRfaGVhZCA9 IC0xOwotCWludGVsX3JpbmdfdXBkYXRlX3NwYWNlKHJpbmcpOwotCi0Jdm1hID0gaW50ZWxfcmlu Z19jcmVhdGVfdm1hKGVuZ2luZS0+aTkxNSwgc2l6ZSk7Ci0JaWYgKElTX0VSUih2bWEpKSB7Ci0J CWtmcmVlKHJpbmcpOwotCQlyZXR1cm4gRVJSX0NBU1Qodm1hKTsKLQl9Ci0JcmluZy0+dm1hID0g dm1hOwotCi0JcmV0dXJuIHJpbmc7Ci19Ci0KLXZvaWQKLWludGVsX3JpbmdfZnJlZShzdHJ1Y3Qg aW50ZWxfcmluZyAqcmluZykKLXsKLQlzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqID0g cmluZy0+dm1hLT5vYmo7Ci0KLQlpOTE1X3ZtYV9jbG9zZShyaW5nLT52bWEpOwotCV9faTkxNV9n ZW1fb2JqZWN0X3JlbGVhc2VfdW5sZXNzX2FjdGl2ZShvYmopOwotCi0Ja2ZyZWUocmluZyk7Ci19 Ci0KIHN0YXRpYyBpbnQgY29udGV4dF9waW4oc3RydWN0IGk5MTVfZ2VtX2NvbnRleHQgKmN0eCkK IHsKIAlzdHJ1Y3QgaTkxNV92bWEgKnZtYSA9IGN0eC0+ZW5naW5lW1JDU10uc3RhdGU7CkBAIC0y MTYwLDEzNSArMTQ1NSw2IEBAIHN0YXRpYyBpbnQgcmluZ19yZXF1ZXN0X2FsbG9jKHN0cnVjdCBk cm1faTkxNV9nZW1fcmVxdWVzdCAqcmVxdWVzdCkKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGlu dCB3YWl0X2Zvcl9zcGFjZShzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSwgaW50IGJ5 dGVzKQotewotCXN0cnVjdCBpbnRlbF9yaW5nICpyaW5nID0gcmVxLT5yaW5nOwotCXN0cnVjdCBk cm1faTkxNV9nZW1fcmVxdWVzdCAqdGFyZ2V0OwotCWxvbmcgdGltZW91dDsKLQotCWxvY2tkZXBf YXNzZXJ0X2hlbGQoJnJlcS0+aTkxNS0+ZHJtLnN0cnVjdF9tdXRleCk7Ci0KLQlpbnRlbF9yaW5n X3VwZGF0ZV9zcGFjZShyaW5nKTsKLQlpZiAocmluZy0+c3BhY2UgPj0gYnl0ZXMpCi0JCXJldHVy biAwOwotCi0JLyoKLQkgKiBTcGFjZSBpcyByZXNlcnZlZCBpbiB0aGUgcmluZ2J1ZmZlciBmb3Ig ZmluYWxpc2luZyB0aGUgcmVxdWVzdCwKLQkgKiBhcyB0aGF0IGNhbm5vdCBiZSBhbGxvd2VkIHRv IGZhaWwuIER1cmluZyByZXF1ZXN0IGZpbmFsaXNhdGlvbiwKLQkgKiByZXNlcnZlZF9zcGFjZSBp cyBzZXQgdG8gMCB0byBzdG9wIHRoZSBvdmVyYWxsb2NhdGlvbiBhbmQgdGhlCi0JICogYXNzdW1w dGlvbiBpcyB0aGF0IHRoZW4gd2UgbmV2ZXIgbmVlZCB0byB3YWl0ICh3aGljaCBoYXMgdGhlCi0J ICogcmlzayBvZiBmYWlsaW5nIHdpdGggRUlOVFIpLgotCSAqCi0JICogU2VlIGFsc28gaTkxNV9n ZW1fcmVxdWVzdF9hbGxvYygpIGFuZCBpOTE1X2FkZF9yZXF1ZXN0KCkuCi0JICovCi0JR0VNX0JV R19PTighcmVxLT5yZXNlcnZlZF9zcGFjZSk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhcmdl dCwgJnJpbmctPnJlcXVlc3RfbGlzdCwgcmluZ19saW5rKSB7Ci0JCXVuc2lnbmVkIHNwYWNlOwot Ci0JCS8qIFdvdWxkIGNvbXBsZXRpb24gb2YgdGhpcyByZXF1ZXN0IGZyZWUgZW5vdWdoIHNwYWNl PyAqLwotCQlzcGFjZSA9IF9faW50ZWxfcmluZ19zcGFjZSh0YXJnZXQtPnBvc3RmaXgsIHJpbmct PnRhaWwsCi0JCQkJCSAgIHJpbmctPnNpemUpOwotCQlpZiAoc3BhY2UgPj0gYnl0ZXMpCi0JCQli cmVhazsKLQl9Ci0KLQlpZiAoV0FSTl9PTigmdGFyZ2V0LT5yaW5nX2xpbmsgPT0gJnJpbmctPnJl cXVlc3RfbGlzdCkpCi0JCXJldHVybiAtRU5PU1BDOwotCi0JdGltZW91dCA9IGk5MTVfd2FpdF9y ZXF1ZXN0KHRhcmdldCwKLQkJCQkgICAgSTkxNV9XQUlUX0lOVEVSUlVQVElCTEUgfCBJOTE1X1dB SVRfTE9DS0VELAotCQkJCSAgICBNQVhfU0NIRURVTEVfVElNRU9VVCk7Ci0JaWYgKHRpbWVvdXQg PCAwKQotCQlyZXR1cm4gdGltZW91dDsKLQotCWk5MTVfZ2VtX3JlcXVlc3RfcmV0aXJlX3VwdG8o dGFyZ2V0KTsKLQotCWludGVsX3JpbmdfdXBkYXRlX3NwYWNlKHJpbmcpOwotCUdFTV9CVUdfT04o cmluZy0+c3BhY2UgPCBieXRlcyk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXUzMiAqaW50ZWxfcmluZ19i ZWdpbihzdHJ1Y3QgZHJtX2k5MTVfZ2VtX3JlcXVlc3QgKnJlcSwgaW50IG51bV9kd29yZHMpCi17 Ci0Jc3RydWN0IGludGVsX3JpbmcgKnJpbmcgPSByZXEtPnJpbmc7Ci0JaW50IHJlbWFpbl9hY3R1 YWwgPSByaW5nLT5zaXplIC0gcmluZy0+dGFpbDsKLQlpbnQgcmVtYWluX3VzYWJsZSA9IHJpbmct PmVmZmVjdGl2ZV9zaXplIC0gcmluZy0+dGFpbDsKLQlpbnQgYnl0ZXMgPSBudW1fZHdvcmRzICog c2l6ZW9mKHUzMik7Ci0JaW50IHRvdGFsX2J5dGVzLCB3YWl0X2J5dGVzOwotCWJvb2wgbmVlZF93 cmFwID0gZmFsc2U7Ci0JdTMyICpjczsKLQotCXRvdGFsX2J5dGVzID0gYnl0ZXMgKyByZXEtPnJl c2VydmVkX3NwYWNlOwotCi0JaWYgKHVubGlrZWx5KGJ5dGVzID4gcmVtYWluX3VzYWJsZSkpIHsK LQkJLyoKLQkJICogTm90IGVub3VnaCBzcGFjZSBmb3IgdGhlIGJhc2ljIHJlcXVlc3QuIFNvIG5l ZWQgdG8gZmx1c2gKLQkJICogb3V0IHRoZSByZW1haW5kZXIgYW5kIHRoZW4gd2FpdCBmb3IgYmFz ZSArIHJlc2VydmVkLgotCQkgKi8KLQkJd2FpdF9ieXRlcyA9IHJlbWFpbl9hY3R1YWwgKyB0b3Rh bF9ieXRlczsKLQkJbmVlZF93cmFwID0gdHJ1ZTsKLQl9IGVsc2UgaWYgKHVubGlrZWx5KHRvdGFs X2J5dGVzID4gcmVtYWluX3VzYWJsZSkpIHsKLQkJLyoKLQkJICogVGhlIGJhc2UgcmVxdWVzdCB3 aWxsIGZpdCBidXQgdGhlIHJlc2VydmVkIHNwYWNlCi0JCSAqIGZhbGxzIG9mZiB0aGUgZW5kLiBT byB3ZSBkb24ndCBuZWVkIGFuIGltbWVkaWF0ZSB3cmFwCi0JCSAqIGFuZCBvbmx5IG5lZWQgdG8g ZWZmZWN0aXZlbHkgd2FpdCBmb3IgdGhlIHJlc2VydmVkCi0JCSAqIHNpemUgc3BhY2UgZnJvbSB0 aGUgc3RhcnQgb2YgcmluZ2J1ZmZlci4KLQkJICovCi0JCXdhaXRfYnl0ZXMgPSByZW1haW5fYWN0 dWFsICsgcmVxLT5yZXNlcnZlZF9zcGFjZTsKLQl9IGVsc2UgewotCQkvKiBObyB3cmFwcGluZyBy ZXF1aXJlZCwganVzdCB3YWl0aW5nLiAqLwotCQl3YWl0X2J5dGVzID0gdG90YWxfYnl0ZXM7Ci0J fQotCi0JaWYgKHdhaXRfYnl0ZXMgPiByaW5nLT5zcGFjZSkgewotCQlpbnQgcmV0ID0gd2FpdF9m b3Jfc3BhY2UocmVxLCB3YWl0X2J5dGVzKTsKLQkJaWYgKHVubGlrZWx5KHJldCkpCi0JCQlyZXR1 cm4gRVJSX1BUUihyZXQpOwotCX0KLQotCWlmICh1bmxpa2VseShuZWVkX3dyYXApKSB7Ci0JCUdF TV9CVUdfT04ocmVtYWluX2FjdHVhbCA+IHJpbmctPnNwYWNlKTsKLQkJR0VNX0JVR19PTihyaW5n LT50YWlsICsgcmVtYWluX2FjdHVhbCA+IHJpbmctPnNpemUpOwotCi0JCS8qIEZpbGwgdGhlIHRh aWwgd2l0aCBNSV9OT09QICovCi0JCW1lbXNldChyaW5nLT52YWRkciArIHJpbmctPnRhaWwsIDAs IHJlbWFpbl9hY3R1YWwpOwotCQlyaW5nLT50YWlsID0gMDsKLQkJcmluZy0+c3BhY2UgLT0gcmVt YWluX2FjdHVhbDsKLQl9Ci0KLQlHRU1fQlVHX09OKHJpbmctPnRhaWwgPiByaW5nLT5zaXplIC0g Ynl0ZXMpOwotCWNzID0gcmluZy0+dmFkZHIgKyByaW5nLT50YWlsOwotCXJpbmctPnRhaWwgKz0g Ynl0ZXM7Ci0JcmluZy0+c3BhY2UgLT0gYnl0ZXM7Ci0JR0VNX0JVR19PTihyaW5nLT5zcGFjZSA8 IDApOwotCi0JcmV0dXJuIGNzOwotfQotCi0vKiBBbGlnbiB0aGUgcmluZyB0YWlsIHRvIGEgY2Fj aGVsaW5lIGJvdW5kYXJ5ICovCi1pbnQgaW50ZWxfcmluZ19jYWNoZWxpbmVfYWxpZ24oc3RydWN0 IGRybV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXEpCi17Ci0JaW50IG51bV9kd29yZHMgPQotCQkocmVx LT5yaW5nLT50YWlsICYgKENBQ0hFTElORV9CWVRFUyAtIDEpKSAvIHNpemVvZih1aW50MzJfdCk7 Ci0JdTMyICpjczsKLQotCWlmIChudW1fZHdvcmRzID09IDApCi0JCXJldHVybiAwOwotCi0JbnVt X2R3b3JkcyA9IENBQ0hFTElORV9CWVRFUyAvIHNpemVvZih1aW50MzJfdCkgLSBudW1fZHdvcmRz OwotCWNzID0gaW50ZWxfcmluZ19iZWdpbihyZXEsIG51bV9kd29yZHMpOwotCWlmIChJU19FUlIo Y3MpKQotCQlyZXR1cm4gUFRSX0VSUihjcyk7Ci0KLQl3aGlsZSAobnVtX2R3b3Jkcy0tKQotCQkq Y3MrKyA9IE1JX05PT1A7Ci0KLQlpbnRlbF9yaW5nX2FkdmFuY2UocmVxLCBjcyk7Ci0KLQlyZXR1 cm4gMDsKLX0KLQogc3RhdGljIHZvaWQgZ2VuNl9ic2Rfc3VibWl0X3JlcXVlc3Qoc3RydWN0IGRy bV9pOTE1X2dlbV9yZXF1ZXN0ICpyZXF1ZXN0KQogewogCXN0cnVjdCBkcm1faTkxNV9wcml2YXRl ICpkZXZfcHJpdiA9IHJlcXVlc3QtPmk5MTU7Ci0tIAoyLjkuMwoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KSW50ZWwtZ2Z4IG1haWxpbmcgbGlzdApJbnRl bC1nZnhAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMuZnJlZWRlc2t0b3Aub3Jn L21haWxtYW4vbGlzdGluZm8vaW50ZWwtZ2Z4Cg==