From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller From: Nagarjuna Kristam Message-Id: <1546509899-5071-8-git-send-email-nkristam@nvidia.com> Date: Thu, 3 Jan 2019 15:34:58 +0530 To: balbi@kernel.org, gregkh@linuxfoundation.org, thierry.reding@gmail.com, jonathanh@nvidia.com Cc: linux-tegra@vger.kernel.org, linux-usb@vger.kernel.org, Nagarjuna Kristam List-ID: VGhpcyBwYXRjaCBhZGRzIFVEQyBkcml2ZXIgZm9yIHRlZ3JhIFhVU0IgMy4wIGRldmljZSBtb2Rl IGNvbnRyb2xsZXIuClhVU0IgZGV2aWNlIG1vZGUgY29udHJvbGxlciBzdXBwb3J0IFNTLCBIUyBh bmQgRlMgbW9kZXMKCkJhc2VkIG9uIHdvcmsgYnk6CiAgTWFyayBLdW8gPG1rdW9AbnZpZGlhLmNv bT4KICBBbmRyZXcgQnJlc3RpY2tlciA8YWJyZXN0aWNAY2hyb21pdW0ub3JnPgoKU2lnbmVkLW9m Zi1ieTogTmFnYXJqdW5hIEtyaXN0YW0gPG5rcmlzdGFtQG52aWRpYS5jb20+Ci0tLQogZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAgICAgfCAgIDExICsKIGRyaXZlcnMvdXNiL2dhZGdl dC91ZGMvTWFrZWZpbGUgICAgIHwgICAgMSArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3RlZ3Jh X3h1ZGMuYyB8IDM4MjEgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmls ZXMgY2hhbmdlZCwgMzgzMyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRjLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9n YWRnZXQvdWRjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKaW5kZXgg MGExNmNiZC4uMzE2NjVlNyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29u ZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwpAQCAtNDM5LDYgKzQzOSwx NyBAQCBjb25maWcgVVNCX0dBREdFVF9YSUxJTlgKIAkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1 bGUgY2FsbGVkICJ1ZGMteGlsaW54IiBhbmQgZm9yY2UgYWxsCiAJICBnYWRnZXQgZHJpdmVycyB0 byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAorY29uZmlnIFVTQl9URUdSQV9YVURDCisJ dHJpc3RhdGUgIk5WSURJQSBTdXBlcnNwZWVkIFVTQiAzLjAgRGV2aWNlIENvbnRyb2xsZXIiCisJ ZGVwZW5kcyBvbiBBUkNIX1RFR1JBCisJZGVmYXVsdCBuCisJaGVscAorCSBFbmFibGVzIFRFR1JB IFVTQiAzLjAgZGV2aWNlIG1vZGUgY29udHJvbGxlciBkcml2ZXIuCisKKwkgU2F5ICJ5IiB0byBs aW5rIHRoZSBkcml2ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxkIGEKKwkgZHluYW1pY2Fs bHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgInRlZ3JhX3h1ZGMiIGFuZCBmb3JjZSBhbGwKKwkgZ2Fk Z2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCisKIHNvdXJjZSAiZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIgogCiAjCmRpZmYgLS1naXQg YS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9NYWtlZmlsZQppbmRleCA4OTdmNjQ4Li4xYzU1Yzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZp bGUKQEAgLTI0LDYgKzI0LDcgQEAgb2JqLSQoQ09ORklHX1VTQl9CQ002M1hYX1VEQykJKz0gYmNt NjN4eF91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9GU0xfVVNCMikJKz0gZnNsX3VzYjJfdWRjLm8K IGZzbF91c2IyX3VkYy15CQkJOj0gZnNsX3VkY19jb3JlLm8KIGZzbF91c2IyX3VkYy0kKENPTkZJ R19BUkNIX01YQykJKz0gZnNsX214Y191ZGMubworb2JqLSQoQ09ORklHX1VTQl9URUdSQV9YVURD KQkrPSB0ZWdyYV94dWRjLm8KIG9iai0kKENPTkZJR19VU0JfTTY2NTkyKQkrPSBtNjY1OTItdWRj Lm8KIG9iai0kKENPTkZJR19VU0JfUjhBNjY1OTcpCSs9IHI4YTY2NTk3LXVkYy5vCiBvYmotJChD T05GSUdfVVNCX1JFTkVTQVNfVVNCMykJKz0gcmVuZXNhc191c2IzLm8KZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL2dhZGdldC91ZGMvdGVncmFfeHVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy90ZWdyYV94dWRjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2YzE4 ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvdGVncmFfeHVkYy5j CkBAIC0wLDAgKzEsMzgyMSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAr CisvKgorICogTlZJRElBIFhVU0IgZGV2aWNlIG1vZGUgY29udHJvbGxlcgorICoKKyAqIENvcHly aWdodCAoYykgMjAxMy0yMDE4LCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2Vy dmVkLgorICogQ29weXJpZ2h0IChjKSAyMDE1LCBHb29nbGUgSW5jLgorICovCisKKyNpbmNsdWRl IDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8 bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUg PGxpbnV4L2RtYXBvb2wuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KKyNpbmNsdWRlIDxs aW51eC9leHRjb24tcHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNp bmNsdWRlIDxsaW51eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxp bnV4L29mX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxs aW51eC9waHkvdGVncmEveHVzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgorI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRp bWUuaD4KKyNpbmNsdWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxs aW51eC9yZXNldC5oPgorI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KKyNpbmNsdWRlIDxsaW51 eC91c2IvY2g5Lmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxp bnV4L3dvcmtxdWV1ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3Fvcy5oPgorI2luY2x1ZGUgPHNv Yy90ZWdyYS9wbWMuaD4KKworLyogWFVTQl9ERVYgcmVnaXN0ZXJzICovCisjZGVmaW5lIFNQQVJB TSAweDAwMAorI2RlZmluZSAgU1BBUkFNX0VSU1RNQVhfU0hJRlQgMTYKKyNkZWZpbmUgIFNQQVJB TV9FUlNUTUFYX01BU0sgMHgxZgorI2RlZmluZSBEQiAweDAwNAorI2RlZmluZSAgREJfVEFSR0VU X1NISUZUIDgKKyNkZWZpbmUgIERCX1RBUkdFVF9NQVNLIDB4ZmYKKyNkZWZpbmUgIERCX1NUUkVB TUlEX1NISUZUIDE2CisjZGVmaW5lICBEQl9TVFJFQU1JRF9NQVNLIDB4ZmZmZgorI2RlZmluZSBF UlNUU1ogMHgwMDgKKyNkZWZpbmUgIEVSU1RTWl9FUlNUWFNaX1NISUZUKHgpICgoeCkgKiAxNikK KyNkZWZpbmUgIEVSU1RTWl9FUlNUWFNaX01BU0sgMHhmZmZmCisjZGVmaW5lIEVSU1RYQkFMTyh4 KSAoMHgwMTAgKyA4ICogKHgpKQorI2RlZmluZSBFUlNUWEJBSEkoeCkgKDB4MDE0ICsgOCAqICh4 KSkKKyNkZWZpbmUgRVJEUExPIDB4MDIwCisjZGVmaW5lICBFUkRQTE9fRUhCIEJJVCgzKQorI2Rl ZmluZSBFUkRQSEkgMHgwMjQKKyNkZWZpbmUgRVJFUExPIDB4MDI4CisjZGVmaW5lICBFUkVQTE9f RUNTIEJJVCgwKQorI2RlZmluZSAgRVJFUExPX1NFR0kgQklUKDEpCisjZGVmaW5lIEVSRVBISSAw eDAyYworI2RlZmluZSBDVFJMIDB4MDMwCisjZGVmaW5lICBDVFJMX1JVTiBCSVQoMCkKKyNkZWZp bmUgIENUUkxfTFNFIEJJVCgxKQorI2RlZmluZSAgQ1RSTF9JRSBCSVQoNCkKKyNkZWZpbmUgIENU UkxfU01JX0VWVCBCSVQoNSkKKyNkZWZpbmUgIENUUkxfU01JX0RTRSBCSVQoNikKKyNkZWZpbmUg IENUUkxfRVdFIEJJVCg3KQorI2RlZmluZSAgQ1RSTF9ERVZBRERSX1NISUZUIDI0CisjZGVmaW5l ICBDVFJMX0RFVkFERFJfTUFTSyAweDdmCisjZGVmaW5lICBDVFJMX0VOQUJMRSBCSVQoMzEpCisj ZGVmaW5lIFNUIDB4MDM0CisjZGVmaW5lICBTVF9SQyBCSVQoMCkKKyNkZWZpbmUgIFNUX0lQIEJJ VCg0KQorI2RlZmluZSBSVF9JTU9ECTB4MDM4CisjZGVmaW5lICBSVF9JTU9EX0lNT0RJX1NISUZU IDAKKyNkZWZpbmUgIFJUX0lNT0RfSU1PRElfTUFTSyAweGZmZmYKKyNkZWZpbmUgIFJUX0lNT0Rf SU1PRENfU0hJRlQgMTYKKyNkZWZpbmUgIFJUX0lNT0RfSU1PRENfTUFTSyAweGZmZmYKKyNkZWZp bmUgUE9SVFNDIDB4MDNjCisjZGVmaW5lICBQT1JUU0NfQ0NTIEJJVCgwKQorI2RlZmluZSAgUE9S VFNDX1BFRCBCSVQoMSkKKyNkZWZpbmUgIFBPUlRTQ19QUiBCSVQoNCkKKyNkZWZpbmUgIFBPUlRT Q19QTFNfU0hJRlQgNQorI2RlZmluZSAgUE9SVFNDX1BMU19NQVNLIDB4ZgorI2RlZmluZSAgUE9S VFNDX1BMU19VMCAweDAKKyNkZWZpbmUgIFBPUlRTQ19QTFNfVTIgMHgyCisjZGVmaW5lICBQT1JU U0NfUExTX1UzIDB4MworI2RlZmluZSAgUE9SVFNDX1BMU19ESVNBQkxFRCAweDQKKyNkZWZpbmUg IFBPUlRTQ19QTFNfUlhERVRFQ1QgMHg1CisjZGVmaW5lICBQT1JUU0NfUExTX0lOQUNUSVZFIDB4 NgorI2RlZmluZSAgUE9SVFNDX1BMU19SRVNVTUUgMHhmCisjZGVmaW5lICBQT1JUU0NfUFNfU0hJ RlQgMTAKKyNkZWZpbmUgIFBPUlRTQ19QU19NQVNLIDB4ZgorI2RlZmluZSAgUE9SVFNDX1BTX1VO REVGSU5FRCAweDAKKyNkZWZpbmUgIFBPUlRTQ19QU19GUyAweDEKKyNkZWZpbmUgIFBPUlRTQ19Q U19MUyAweDIKKyNkZWZpbmUgIFBPUlRTQ19QU19IUyAweDMKKyNkZWZpbmUgIFBPUlRTQ19QU19T UyAweDQKKyNkZWZpbmUgIFBPUlRTQ19MV1MgQklUKDE2KQorI2RlZmluZSAgUE9SVFNDX0NTQyBC SVQoMTcpCisjZGVmaW5lICBQT1JUU0NfV1JDIEJJVCgxOSkKKyNkZWZpbmUgIFBPUlRTQ19QUkMg QklUKDIxKQorI2RlZmluZSAgUE9SVFNDX1BMQyBCSVQoMjIpCisjZGVmaW5lICBQT1JUU0NfQ0VD IEJJVCgyMykKKyNkZWZpbmUgIFBPUlRTQ19XUFIgQklUKDMwKQorI2RlZmluZSAgUE9SVFNDX0NI QU5HRV9NQVNLIChQT1JUU0NfQ1NDIHwgUE9SVFNDX1dSQyB8IFBPUlRTQ19QUkMgfCBcCisJCQkg ICAgIFBPUlRTQ19QTEMgfCBQT1JUU0NfQ0VDKQorI2RlZmluZSBFQ1BMTyAweDA0MAorI2RlZmlu ZSBFQ1BISSAweDA0NAorI2RlZmluZSBNRklOREVYIDB4MDQ4CisjZGVmaW5lICBNRklOREVYX1VG UkFNRV9TSElGVCAwCisjZGVmaW5lICBNRklOREVYX1VGUkFNRV9NQVNLIDB4NworI2RlZmluZSAg TUZJTkRFWF9GUkFNRV9TSElGVCAzCisjZGVmaW5lICBNRklOREVYX0ZSQU1FX01BU0sgMHg3ZmYK KyNkZWZpbmUgUE9SVFBNIDB4MDRjCisjZGVmaW5lICBQT1JUUE1fTDFTX1NISUZUIDAKKyNkZWZp bmUgIFBPUlRQTV9MMVNfTUFTSyAweDMKKyNkZWZpbmUgIFBPUlRQTV9MMVNfRFJPUCAweDAKKyNk ZWZpbmUgIFBPUlRQTV9MMVNfQUNDRVBUIDB4MQorI2RlZmluZSAgUE9SVFBNX0wxU19OWUVUIDB4 MgorI2RlZmluZSAgUE9SVFBNX0wxU19TVEFMTCAweDMKKyNkZWZpbmUgIFBPUlRQTV9SV0UgQklU KDMpCisjZGVmaW5lICBQT1JUUE1fVTJUSU1FT1VUX1NISUZUIDgKKyNkZWZpbmUgIFBPUlRQTV9V MlRJTUVPVVRfTUFTSyAweGZmCisjZGVmaW5lICBQT1JUUE1fVTFUSU1FT1VUX1NISUZUIDE2Cisj ZGVmaW5lICBQT1JUUE1fVTFUSU1FT1VUX01BU0sgMHhmZgorI2RlZmluZSAgUE9SVFBNX0ZMQSBC SVQoMjQpCisjZGVmaW5lICBQT1JUUE1fVkJBIEJJVCgyNSkKKyNkZWZpbmUgIFBPUlRQTV9XT0Mg QklUKDI2KQorI2RlZmluZSAgUE9SVFBNX1dPRCBCSVQoMjcpCisjZGVmaW5lICBQT1JUUE1fVTFF IEJJVCgyOCkKKyNkZWZpbmUgIFBPUlRQTV9VMkUgQklUKDI5KQorI2RlZmluZSAgUE9SVFBNX0ZS V0UgQklUKDMwKQorI2RlZmluZSAgUE9SVFBNX1BOR19DWUEgQklUKDMxKQorI2RlZmluZSBFUF9I QUxUIDB4MDUwCisjZGVmaW5lIEVQX1BBVVNFIDB4MDU0CisjZGVmaW5lIEVQX1JFTE9BRCAweDA1 OAorI2RlZmluZSBFUF9TVENIRyAweDA1YworI2RlZmluZSBERVZOT1RJRl9MTyAweDA2NAorI2Rl ZmluZSAgREVWTk9USUZfTE9fVFJJRyBCSVQoMCkKKyNkZWZpbmUgIERFVk5PVElGX0xPX1RZUEVf U0hJRlQgNAorI2RlZmluZSAgREVWTk9USUZfTE9fVFlQRV9NQVNLIDB4ZgorI2RlZmluZSAgREVW Tk9USUZfTE9fVFlQRV9GVU5DVElPTl9XQUtFIDB4MQorI2RlZmluZSBERVZOT1RJRl9ISSAweDA2 OAorI2RlZmluZSBQT1JUSEFMVCAweDA2YworI2RlZmluZSAgUE9SVEhBTFRfSEFMVF9MVFNTTSBC SVQoMCkKKyNkZWZpbmUgIFBPUlRIQUxUX0hBTFRfUkVKRUNUIEJJVCgxKQorI2RlZmluZSAgUE9S VEhBTFRfU1RDSEdfUkVRIEJJVCgyMCkKKyNkZWZpbmUgIFBPUlRIQUxUX1NUQ0hHX0lOVFJfRU4g QklUKDI0KQorI2RlZmluZSBQT1JUX1RNCTB4MDcwCisjZGVmaW5lIEVQX1RIUkVBRF9BQ1RJVkUg MHgwNzQKKyNkZWZpbmUgRVBfU1RPUFBFRCAweDA3OAorI2RlZmluZSBIU0ZTUElfQ09VTlQwIDB4 MTAwCisjZGVmaW5lIEhTRlNQSV9DT1VOVDEzIDB4MTM0CisjZGVmaW5lICBIU0ZTUElfQ09VTlQx M19VMl9SRVNVTUVfS19EVVJBVElPTl9TSElGVCAwCisjZGVmaW5lICBIU0ZTUElfQ09VTlQxM19V Ml9SRVNVTUVfS19EVVJBVElPTl9NQVNLIDB4M2ZmZmZmZmYKKyNkZWZpbmUgQkxDRyAweDg0MAor I2RlZmluZSBTU1BYX0NPUkVfQ05UMCAweDYxMAorI2RlZmluZSAgU1NQWF9DT1JFX0NOVDBfUElO R19UQlVSU1RfU0hJRlQgMAorI2RlZmluZSAgU1NQWF9DT1JFX0NOVDBfUElOR19UQlVSU1RfTUFT SyAweGZmCisjZGVmaW5lIFNTUFhfQ09SRV9DTlQzMCAweDY4OAorI2RlZmluZSAgU1NQWF9DT1JF X0NOVDMwX0xNUElUUF9USU1FUl9TSElGVCAwCisjZGVmaW5lICBTU1BYX0NPUkVfQ05UMzBfTE1Q SVRQX1RJTUVSX01BU0sgMHhmZmZmZgorI2RlZmluZSBTU1BYX0NPUkVfQ05UMzIgMHg2OTAKKyNk ZWZpbmUgIFNTUFhfQ09SRV9DTlQzMl9QT0xMX1RCVVJTVF9NQVhfU0hJRlQgMAorI2RlZmluZSAg U1NQWF9DT1JFX0NOVDMyX1BPTExfVEJVUlNUX01BWF9NQVNLIDB4ZmYKKyNkZWZpbmUgU1NQWF9D T1JFX1BBRENUTDQgMHg3NTAKKyNkZWZpbmUgIFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9U SU1FT1VUX1UzX1NISUZUIDAKKyNkZWZpbmUgIFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9U SU1FT1VUX1UzX01BU0sgMHhmZmZmZgorI2RlZmluZSAgQkxDR19ERlBDSSBCSVQoMCkKKyNkZWZp bmUgIEJMQ0dfVUZQQ0kgQklUKDEpCisjZGVmaW5lICBCTENHX0ZFIEJJVCgyKQorI2RlZmluZSAg QkxDR19DT1JFUExMX1BXUkROIEJJVCg4KQorI2RlZmluZSAgQkxDR19JT1BMTF8wX1BXUkROIEJJ VCg5KQorI2RlZmluZSAgQkxDR19JT1BMTF8xX1BXUkROIEJJVCgxMCkKKyNkZWZpbmUgIEJMQ0df SU9QTExfMl9QV1JETiBCSVQoMTEpCisjZGVmaW5lICBCTENHX0FMTCAweDFmZgorI2RlZmluZSBD RkdfREVWX1NTUElfWEZFUiAweDg1OAorI2RlZmluZSAgQ0ZHX0RFVl9TU1BJX1hGRVJfQUNLVElN RU9VVF9TSElGVCAwCisjZGVmaW5lICBDRkdfREVWX1NTUElfWEZFUl9BQ0tUSU1FT1VUX01BU0sg MHhmZmZmZmZmZgorI2RlZmluZSBDRkdfREVWX0ZFIDB4ODVjCisjZGVmaW5lICBDRkdfREVWX0ZF X1BPUlRSRUdTRUxfU0hJRlQgMAorI2RlZmluZSAgQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX01BU0sg MHgzCisjZGVmaW5lICBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU1NfUEkgMQorI2RlZmluZSAgQ0ZH X0RFVl9GRV9QT1JUUkVHU0VMX0hTRlNfUEkgMgorI2RlZmluZSAgQ0ZHX0RFVl9GRV9JTkZJTklU RV9TU19SRVRSWSBCSVQoMjkpCisKKy8qIEZQQ0kgcmVnaXN0ZXJzICovCisjZGVmaW5lIFhVU0Jf REVWX0NGR18xIDB4MDA0CisjZGVmaW5lICBYVVNCX0RFVl9DRkdfMV9JT19TUEFDRV9FTiBCSVQo MCkKKyNkZWZpbmUgIFhVU0JfREVWX0NGR18xX01FTU9SWV9TUEFDRV9FTiBCSVQoMSkKKyNkZWZp bmUgIFhVU0JfREVWX0NGR18xX0JVU19NQVNURVJfRU4gQklUKDIpCisjZGVmaW5lIFhVU0JfREVW X0NGR180IDB4MDEwCisjZGVmaW5lICBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfU0hJRlQgMTUK KyNkZWZpbmUgIFhVU0JfREVWX0NGR180X0JBU0VfQUREUl9NQVNLIDB4MWZmZmYKKyNkZWZpbmUg WFVTQl9ERVZfQ0ZHXzUgMHgwMTQKKworLyogSVBGUyByZWdpc3RlcnMgKi8KKyNkZWZpbmUgWFVT Ql9ERVZfQ09ORklHVVJBVElPTl8wIDB4MTgwCisjZGVmaW5lICBYVVNCX0RFVl9DT05GSUdVUkFU SU9OXzBfRU5fRlBDSSBCSVQoMCkKKyNkZWZpbmUgWFVTQl9ERVZfSU5UUl9NQVNLXzAgMHgxODgK KyNkZWZpbmUgIFhVU0JfREVWX0lOVFJfTUFTS18wX0lQX0lOVF9NQVNLIEJJVCgxNikKKworLyog RGV2aWNlIElEICovCisjZGVmaW5lIFhVRENfREVWSUNFX0lEX1QyMTAgICAgIDB4MGZhZAorCisj ZGVmaW5lIFhVRENfSVNfVDIxMCh0KSBcCisJKHQtPnNvYyA/ICh0LT5zb2MtPmRldmljZV9pZCA9 PSBYVURDX0RFVklDRV9JRF9UMjEwKSA6IGZhbHNlKQorCitzdHJ1Y3QgdGVncmFfeHVkY19lcF9j b250ZXh0IHsKKwlfX2xlMzIgaW5mbzA7CisJX19sZTMyIGluZm8xOworCV9fbGUzMiBkZXFfbG87 CisJX19sZTMyIGRlcV9oaTsKKwlfX2xlMzIgdHhfaW5mbzsKKwlfX2xlMzIgcnN2ZFsxMV07Cit9 OworCisjZGVmaW5lIEVQX1NUQVRFX0RJU0FCTEVEIDAKKyNkZWZpbmUgRVBfU1RBVEVfUlVOTklO RyAxCisjZGVmaW5lIEVQX1NUQVRFX0hBTFRFRCAyCisjZGVmaW5lIEVQX1NUQVRFX1NUT1BQRUQg MworI2RlZmluZSBFUF9TVEFURV9FUlJPUiA0CisKKyNkZWZpbmUgRVBfVFlQRV9JTlZBTElEIDAK KyNkZWZpbmUgRVBfVFlQRV9JU09DSF9PVVQgMQorI2RlZmluZSBFUF9UWVBFX0JVTEtfT1VUIDIK KyNkZWZpbmUgRVBfVFlQRV9JTlRFUlJVUFRfT1VUIDMKKyNkZWZpbmUgRVBfVFlQRV9DT05UUk9M IDQKKyNkZWZpbmUgRVBfVFlQRV9JU0NPSF9JTiA1CisjZGVmaW5lIEVQX1RZUEVfQlVMS19JTiA2 CisjZGVmaW5lIEVQX1RZUEVfSU5URVJSVVBUX0lOIDcKKworI2RlZmluZSBCVUlMRF9FUF9DT05U RVhUX1JXKG5hbWUsIG1lbWJlciwgc2hpZnQsIG1hc2spCQkJXAorc3RhdGljIGlubGluZSB1MzIg ZXBfY3R4X3JlYWRfIyNuYW1lKHN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmN0eCkJXAor ewkJCQkJCQkJCVwKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KGN0eC0+bWVtYmVyKSA+PiBzaGlmdCkg JiBtYXNrOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCQlcCitlcF9j dHhfd3JpdGVfIyNuYW1lKHN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmN0eCwgdTMyIHZh bCkJCVwKK3sJCQkJCQkJCQlcCisJdTMyIHRtcDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXRtcCA9 IGxlMzJfdG9fY3B1KGN0eC0+bWVtYmVyKSAmIH4obWFzayA8PCBzaGlmdCk7CQlcCisJdG1wIHw9 ICh2YWwgJiBtYXNrKSA8PCBzaGlmdDsJCQkJCVwKKwljdHgtPm1lbWJlciA9IGNwdV90b19sZTMy KHRtcCk7CQkJCQlcCit9CisKK0JVSUxEX0VQX0NPTlRFWFRfUlcoc3RhdGUsIGluZm8wLCAwLCAw eDcpCitCVUlMRF9FUF9DT05URVhUX1JXKG11bHQsIGluZm8wLCA4LCAweDMpCitCVUlMRF9FUF9D T05URVhUX1JXKG1heF9wc3RyZWFtcywgaW5mbzAsIDEwLCAweDFmKQorQlVJTERfRVBfQ09OVEVY VF9SVyhsc2EsIGluZm8wLCAxNSwgMHgxKQorQlVJTERfRVBfQ09OVEVYVF9SVyhpbnRlcnZhbCwg aW5mbzAsIDE2LCAweGZmKQorQlVJTERfRVBfQ09OVEVYVF9SVyhjZXJyLCBpbmZvMSwgMSwgMHgz KQorQlVJTERfRVBfQ09OVEVYVF9SVyh0eXBlLCBpbmZvMSwgMywgMHg3KQorQlVJTERfRVBfQ09O VEVYVF9SVyhoaWQsIGluZm8xLCA3LCAweDEpCitCVUlMRF9FUF9DT05URVhUX1JXKG1heF9idXJz dF9zaXplLCBpbmZvMSwgOCwgMHhmZikKK0JVSUxEX0VQX0NPTlRFWFRfUlcobWF4X3BhY2tldF9z aXplLCBpbmZvMSwgMTYsIDB4ZmZmZikKK0JVSUxEX0VQX0NPTlRFWFRfUlcoZGNzLCBkZXFfbG8s IDAsIDB4MSkKK0JVSUxEX0VQX0NPTlRFWFRfUlcoZGVxX2xvLCBkZXFfbG8sIDQsIDB4ZmZmZmZm ZikKK0JVSUxEX0VQX0NPTlRFWFRfUlcoZGVxX2hpLCBkZXFfaGksIDAsIDB4ZmZmZmZmZmYpCitC VUlMRF9FUF9DT05URVhUX1JXKGF2Z190cmJfbGVuLCB0eF9pbmZvLCAwLCAweGZmZmYpCitCVUlM RF9FUF9DT05URVhUX1JXKG1heF9lc2l0X3BheWxvYWQsIHR4X2luZm8sIDE2LCAweGZmZmYpCitC VUlMRF9FUF9DT05URVhUX1JXKGVkdGxhLCByc3ZkWzBdLCAwLCAweGZmZmZmZikKK0JVSUxEX0VQ X0NPTlRFWFRfUlcoc2VxX251bSwgcnN2ZFswXSwgMjQsIDB4ZmYpCitCVUlMRF9FUF9DT05URVhU X1JXKHBhcnRpYWxfdGQsIHJzdmRbMF0sIDI1LCAweDEpCitCVUlMRF9FUF9DT05URVhUX1JXKGNl cnJjbnQsIHJzdmRbMV0sIDE4LCAweDMpCitCVUlMRF9FUF9DT05URVhUX1JXKGRhdGFfb2Zmc2V0 LCByc3ZkWzJdLCAwLCAweDFmZmZmKQorQlVJTERfRVBfQ09OVEVYVF9SVyhudW10cmJzLCByc3Zk WzJdLCAyMiwgMHgxZikKK0JVSUxEX0VQX0NPTlRFWFRfUlcoZGV2YWRkciwgcnN2ZFs2XSwgMCwg MHg3ZikKKworc3RhdGljIGlubGluZSB1NjQgZXBfY3R4X3JlYWRfZGVxX3B0cihzdHJ1Y3QgdGVn cmFfeHVkY19lcF9jb250ZXh0ICpjdHgpCit7CisJcmV0dXJuICgodTY0KWVwX2N0eF9yZWFkX2Rl cV9oaShjdHgpIDw8IDMyKSB8CisJCShlcF9jdHhfcmVhZF9kZXFfbG8oY3R4KSA8PCA0KTsKK30K Kworc3RhdGljIGlubGluZSB2b2lkCitlcF9jdHhfd3JpdGVfZGVxX3B0cihzdHJ1Y3QgdGVncmFf eHVkY19lcF9jb250ZXh0ICpjdHgsIHU2NCBhZGRyKQoreworCWVwX2N0eF93cml0ZV9kZXFfbG8o Y3R4LCBsb3dlcl8zMl9iaXRzKGFkZHIpID4+IDQpOworCWVwX2N0eF93cml0ZV9kZXFfaGkoY3R4 LCB1cHBlcl8zMl9iaXRzKGFkZHIpKTsKK30KKworc3RydWN0IHRlZ3JhX3h1ZGNfdHJiIHsKKwlf X2xlMzIgZGF0YV9sbzsKKwlfX2xlMzIgZGF0YV9oaTsKKwlfX2xlMzIgc3RhdHVzOworCV9fbGUz MiBjb250cm9sOworfTsKKworI2RlZmluZSBUUkJfVFlQRV9SU1ZEIDAKKyNkZWZpbmUgVFJCX1RZ UEVfTk9STUFMIDEKKyNkZWZpbmUgVFJCX1RZUEVfU0VUVVBfU1RBR0UgMgorI2RlZmluZSBUUkJf VFlQRV9EQVRBX1NUQUdFIDMKKyNkZWZpbmUgVFJCX1RZUEVfU1RBVFVTX1NUQUdFIDQKKyNkZWZp bmUgVFJCX1RZUEVfSVNPQ0ggNQorI2RlZmluZSBUUkJfVFlQRV9MSU5LIDYKKyNkZWZpbmUgVFJC X1RZUEVfVFJBTlNGRVJfRVZFTlQgMzIKKyNkZWZpbmUgVFJCX1RZUEVfUE9SVF9TVEFUVVNfQ0hB TkdFX0VWRU5UIDM0CisjZGVmaW5lIFRSQl9UWVBFX1NUUkVBTSA0OAorI2RlZmluZSBUUkJfVFlQ RV9TRVRVUF9QQUNLRVRfRVZFTlQgNjMKKworI2RlZmluZSBUUkJfQ01QTF9DT0RFX0lOVkFMSUQg MAorI2RlZmluZSBUUkJfQ01QTF9DT0RFX1NVQ0NFU1MgMQorI2RlZmluZSBUUkJfQ01QTF9DT0RF X0RBVEFfQlVGRkVSX0VSUiAyCisjZGVmaW5lIFRSQl9DTVBMX0NPREVfQkFCQkxFX0RFVEVDVEVE X0VSUiAzCisjZGVmaW5lIFRSQl9DTVBMX0NPREVfVVNCX1RSQU5TX0VSUiA0CisjZGVmaW5lIFRS Ql9DTVBMX0NPREVfVFJCX0VSUiA1CisjZGVmaW5lIFRSQl9DTVBMX0NPREVfU1RBTEwgNgorI2Rl ZmluZSBUUkJfQ01QTF9DT0RFX0lOVkFMSURfU1RSRUFNX1RZUEVfRVJSIDEwCisjZGVmaW5lIFRS Ql9DTVBMX0NPREVfU0hPUlRfUEFDS0VUIDEzCisjZGVmaW5lIFRSQl9DTVBMX0NPREVfUklOR19V TkRFUlJVTiAxNAorI2RlZmluZSBUUkJfQ01QTF9DT0RFX1JJTkdfT1ZFUlJVTiAxNQorI2RlZmlu ZSBUUkJfQ01QTF9DT0RFX0VWRU5UX1JJTkdfRlVMTF9FUlIgMjEKKyNkZWZpbmUgVFJCX0NNUExf Q09ERV9TVE9QUEVEIDI2CisjZGVmaW5lIFRSQl9DTVBMX0NPREVfSVNPQ0hfQlVGRkVSX09WRVJS VU4gMzEKKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9TVFJFQU1fTlVNUF9FUlJPUiAyMTkKKyNkZWZp bmUgVFJCX0NNUExfQ09ERV9QUklNRV9QSVBFX1JFQ0VJVkVEIDIyMAorI2RlZmluZSBUUkJfQ01Q TF9DT0RFX0hPU1RfUkVKRUNURUQgMjIxCisjZGVmaW5lIFRSQl9DTVBMX0NPREVfQ1RSTF9ESVJf RVJSIDIyMgorI2RlZmluZSBUUkJfQ01QTF9DT0RFX0NUUkxfU0VRTlVNX0VSUiAyMjMKKworI2Rl ZmluZSBCVUlMRF9UUkJfUlcobmFtZSwgbWVtYmVyLCBzaGlmdCwgbWFzaykJCQkJXAorc3RhdGlj IGlubGluZSB1MzIgdHJiX3JlYWRfIyNuYW1lKHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQkJ XAorewkJCQkJCQkJCVwKKwlyZXR1cm4gKGxlMzJfdG9fY3B1KHRyYi0+bWVtYmVyKSA+PiBzaGlm dCkgJiBtYXNrOwkJXAorfQkJCQkJCQkJCVwKK3N0YXRpYyBpbmxpbmUgdm9pZAkJCQkJCQlcCit0 cmJfd3JpdGVfIyNuYW1lKHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiLCB1MzIgdmFsKQkJCVwK K3sJCQkJCQkJCQlcCisJdTMyIHRtcDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXRtcCA9IGxlMzJf dG9fY3B1KHRyYi0+bWVtYmVyKSAmIH4obWFzayA8PCBzaGlmdCk7CQlcCisJdG1wIHw9ICh2YWwg JiBtYXNrKSA8PCBzaGlmdDsJCQkJCVwKKwl0cmItPm1lbWJlciA9IGNwdV90b19sZTMyKHRtcCk7 CQkJCQlcCit9CisKK0JVSUxEX1RSQl9SVyhkYXRhX2xvLCBkYXRhX2xvLCAwLCAweGZmZmZmZmZm KQorQlVJTERfVFJCX1JXKGRhdGFfaGksIGRhdGFfaGksIDAsIDB4ZmZmZmZmZmYpCitCVUlMRF9U UkJfUlcoc2VxX251bSwgc3RhdHVzLCAwLCAweGZmZmYpCitCVUlMRF9UUkJfUlcodHJhbnNmZXJf bGVuLCBzdGF0dXMsIDAsIDB4ZmZmZmZmKQorQlVJTERfVFJCX1JXKHRkX3NpemUsIHN0YXR1cywg MTcsIDB4MWYpCitCVUlMRF9UUkJfUlcoY21wbF9jb2RlLCBzdGF0dXMsIDI0LCAweGZmKQorQlVJ TERfVFJCX1JXKGN5Y2xlLCBjb250cm9sLCAwLCAweDEpCitCVUlMRF9UUkJfUlcodG9nZ2xlX2N5 Y2xlLCBjb250cm9sLCAxLCAweDEpCitCVUlMRF9UUkJfUlcoaXNwLCBjb250cm9sLCAyLCAweDEp CitCVUlMRF9UUkJfUlcoY2hhaW4sIGNvbnRyb2wsIDQsIDB4MSkKK0JVSUxEX1RSQl9SVyhpb2Ms IGNvbnRyb2wsIDUsIDB4MSkKK0JVSUxEX1RSQl9SVyh0eXBlLCBjb250cm9sLCAxMCwgMHgzZikK K0JVSUxEX1RSQl9SVyhzdHJlYW1faWQsIGNvbnRyb2wsIDE2LCAweGZmZmYpCitCVUlMRF9UUkJf UlcoZW5kcG9pbnRfaWQsIGNvbnRyb2wsIDE2LCAweDFmKQorQlVJTERfVFJCX1JXKHRsYnBjLCBj b250cm9sLCAxNiwgMHhmKQorQlVJTERfVFJCX1JXKGRhdGFfc3RhZ2VfZGlyLCBjb250cm9sLCAx NiwgMHgxKQorQlVJTERfVFJCX1JXKGZyYW1lX2lkLCBjb250cm9sLCAyMCwgMHg3ZmYpCitCVUlM RF9UUkJfUlcoc2lhLCBjb250cm9sLCAzMSwgMHgxKQorCitzdGF0aWMgaW5saW5lIHU2NCB0cmJf cmVhZF9kYXRhX3B0cihzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYikKK3sKKwlyZXR1cm4gKCh1 NjQpdHJiX3JlYWRfZGF0YV9oaSh0cmIpIDw8IDMyKSB8CisJCXRyYl9yZWFkX2RhdGFfbG8odHJi KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYl93cml0ZV9kYXRhX3B0cihzdHJ1Y3QgdGVn cmFfeHVkY190cmIgKnRyYiwgdTY0IGFkZHIpCit7CisJdHJiX3dyaXRlX2RhdGFfbG8odHJiLCBs b3dlcl8zMl9iaXRzKGFkZHIpKTsKKwl0cmJfd3JpdGVfZGF0YV9oaSh0cmIsIHVwcGVyXzMyX2Jp dHMoYWRkcikpOworfQorCitzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0IHsKKwlzdHJ1Y3QgdXNi X3JlcXVlc3QgdXNiX3JlcTsKKworCXNpemVfdCBidWZfcXVldWVkOworCXVuc2lnbmVkIGludCB0 cmJzX3F1ZXVlZDsKKwl1bnNpZ25lZCBpbnQgdHJic19uZWVkZWQ7CisJYm9vbCBuZWVkX3pscDsK KworCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZmlyc3RfdHJiOworCXN0cnVjdCB0ZWdyYV94dWRj X3RyYiAqbGFzdF90cmI7CisKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3Qg dGVncmFfeHVkY19lcCB7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7CisJc3RydWN0IHVzYl9l cCB1c2JfZXA7CisJdW5zaWduZWQgaW50IGluZGV4OworCWNoYXIgbmFtZVs4XTsKKworCXN0cnVj dCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmNvbnRleHQ7CisKKyNkZWZpbmUgWFVEQ19UUkFOU0ZF Ul9SSU5HX1NJWkUgNjQKKwlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYW5zZmVyX3Jpbmc7CisJ ZG1hX2FkZHJfdCB0cmFuc2Zlcl9yaW5nX3BoeXM7CisKKwl1bnNpZ25lZCBpbnQgZW5xX3B0cjsK Kwl1bnNpZ25lZCBpbnQgZGVxX3B0cjsKKwlib29sIHBjczsKKwlib29sIHJpbmdfZnVsbDsKKwli b29sIHN0cmVhbV9yZWplY3RlZDsKKworCXN0cnVjdCBsaXN0X2hlYWQgcXVldWU7CisJY29uc3Qg c3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjOworCWNvbnN0IHN0cnVjdCB1c2Jf c3NfZXBfY29tcF9kZXNjcmlwdG9yICpjb21wX2Rlc2M7Cit9OworCitzdHJ1Y3QgdGVncmFfeHVk Y19zZWxfdGltaW5nIHsKKwlfX3U4IHUxc2VsOworCV9fdTggdTFwZWw7CisJX19sZTE2IHUyc2Vs OworCV9fbGUxNiB1MnBlbDsKK307CisKK2VudW0gdGVncmFfeHVkY19zZXR1cF9zdGF0ZSB7CisJ V0FJVF9GT1JfU0VUVVAsCisJREFUQV9TVEFHRV9YRkVSLAorCURBVEFfU1RBR0VfUkVDViwKKwlT VEFUVVNfU1RBR0VfWEZFUiwKKwlTVEFUVVNfU1RBR0VfUkVDViwKK307CisKK3N0cnVjdCB0ZWdy YV94dWRjX3NldHVwX3BhY2tldCB7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCBjdHJsX3JlcTsK Kwl1bnNpZ25lZCBpbnQgc2VxX251bTsKK307CisKK3N0cnVjdCB0ZWdyYV94dWRjX3NhdmVfcmVn cyB7CisJdTMyIGN0cmw7CisJdTMyIHBvcnRwbTsKK307CisKK3N0cnVjdCB0ZWdyYV94dWRjIHsK KwlzdHJ1Y3QgZGV2aWNlICpkZXY7CisJY29uc3Qgc3RydWN0IHRlZ3JhX3h1ZGNfc29jX2RhdGEg KnNvYzsKKwlzdHJ1Y3QgdGVncmFfeHVzYl9wYWRjdGwgKnBhZGN0bDsKKworCXNwaW5sb2NrX3Qg bG9jazsKKworCXN0cnVjdCB1c2JfZ2FkZ2V0IGdhZGdldDsKKwlzdHJ1Y3QgdXNiX2dhZGdldF9k cml2ZXIgKmRyaXZlcjsKKworI2RlZmluZSBYVURDX05SX0VWRU5UX1JJTkdTIDIKKyNkZWZpbmUg WFVEQ19FVkVOVF9SSU5HX1NJWkUgNDA5NgorCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnRf cmluZ1tYVURDX05SX0VWRU5UX1JJTkdTXTsKKwlkbWFfYWRkcl90IGV2ZW50X3JpbmdfcGh5c1tY VURDX05SX0VWRU5UX1JJTkdTXTsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfcmluZ19pbmRleDsKKwl1 bnNpZ25lZCBpbnQgZXZlbnRfcmluZ19kZXFfcHRyOworCWJvb2wgY2NzOworCisjZGVmaW5lIFhV RENfTlJfRVBTIDMyCisJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgZXBbWFVEQ19OUl9FUFNdOworCXN0 cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmVwX2NvbnRleHQ7CisJZG1hX2FkZHJfdCBlcF9j b250ZXh0X3BoeXM7CisKKwlzdHJ1Y3QgZGV2aWNlICpnZW5wZF9kZXZfZGV2aWNlOworCXN0cnVj dCBkZXZpY2UgKmdlbnBkX2Rldl9zczsKKwlzdHJ1Y3QgZGV2aWNlX2xpbmsgKmdlbnBkX2RsX2Rl dmljZTsKKwlzdHJ1Y3QgZGV2aWNlX2xpbmsgKmdlbnBkX2RsX3NzOworCisJc3RydWN0IGRtYV9w b29sICp0cmFuc2Zlcl9yaW5nX3Bvb2w7CisKKwlib29sIHF1ZXVlZF9zZXR1cF9wYWNrZXQ7CisJ c3RydWN0IHRlZ3JhX3h1ZGNfc2V0dXBfcGFja2V0IHNldHVwX3BhY2tldDsKKwllbnVtIHRlZ3Jh X3h1ZGNfc2V0dXBfc3RhdGUgc2V0dXBfc3RhdGU7CisJdTE2IHNldHVwX3NlcV9udW07CisKKwl1 MTYgZGV2X2FkZHI7CisJdTE2IGlzb2NoX2RlbGF5OworCXN0cnVjdCB0ZWdyYV94dWRjX3NlbF90 aW1pbmcgc2VsX3RpbWluZzsKKwl1OCB0ZXN0X21vZGVfcGF0dGVybjsKKwl1MTYgc3RhdHVzX2J1 ZjsKKwlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICplcDBfcmVxOworCisJYm9vbCBwdWxsdXA7 CisKKwl1bnNpZ25lZCBpbnQgbnJfZW5hYmxlZF9lcHM7CisJdW5zaWduZWQgaW50IG5yX2lzb2No X2VwczsKKworCXVuc2lnbmVkIGludCBkZXZpY2Vfc3RhdGU7CisJdW5zaWduZWQgaW50IHJlc3Vt ZV9zdGF0ZTsKKworCWludCBpcnE7CisKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJcmVzb3VyY2Vf c2l6ZV90IHBoeXNfYmFzZTsKKwl2b2lkIF9faW9tZW0gKmlwZnM7CisJdm9pZCBfX2lvbWVtICpm cGNpOworCisJc3RydWN0IHJlZ3VsYXRvcl9idWxrX2RhdGEgKnN1cHBsaWVzOworCisJc3RydWN0 IGNsayAqKmNsa3M7CisJaW50IG51bV9jbGtzOworCWJvb2wgY2xrX2VuYWJsZWQ7CisKKwlib29s IGRldmljZV9tb2RlOworCXN0cnVjdCBleHRjb25fZGV2ICpkYXRhX3JvbGVfZXh0Y29uOworCXN0 cnVjdCBub3RpZmllcl9ibG9jayBkYXRhX3JvbGVfbmI7CisJc3RydWN0IHdvcmtfc3RydWN0IGRh dGFfcm9sZV93b3JrOworCisJc3RydWN0IHBoeSAqdXNiM19waHk7CisJc3RydWN0IHBoeSAqdXRt aV9waHk7CisKKwlzdHJ1Y3QgdGVncmFfeHVkY19zYXZlX3JlZ3Mgc2F2ZWRfcmVnczsKKwlib29s IHN1c3BlbmRlZDsKKwlib29sIHBvd2VyZ2F0ZWQ7CisKKwlzdHJ1Y3QgY29tcGxldGlvbiBkaXNj b25uZWN0X2NvbXBsZXRlOworCisJYm9vbCBzZWxmcG93ZXJlZDsKKworI2RlZmluZSBUT0dHTEVf VkJVU19XQUlUX01TIDEwMAorCXN0cnVjdCBkZWxheWVkX3dvcmsgcGxjX3Jlc2V0X3dvcms7CisJ Ym9vbCB3YWl0X2NzYzsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsgcG9ydF9yZXNldF93YXJfd29y azsKKwlib29sIHdhaXRfZm9yX3NlY19wcmM7Cit9OworCisjZGVmaW5lIFhVRENfVFJCX01BWF9C VUZGRVJfU0laRSA2NTUzNgorI2RlZmluZSBYVURDX01BWF9JU09DSF9FUFMgNAorI2RlZmluZSBY VURDX0lOVEVSUlVQVF9NT0RFUkFUSU9OX1VTIDAKKworc3RhdGljIHN0cnVjdCB1c2JfZW5kcG9p bnRfZGVzY3JpcHRvciB0ZWdyYV94dWRjX2VwMF9kZXNjID0geworCS5iTGVuZ3RoID0gVVNCX0RU X0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lOVCwKKwku YkVuZHBvaW50QWRkcmVzcyA9IDAsCisJLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lOVF9YRkVS X0NPTlRST0wsCisJLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoNjQpLAorfTsKKworc3Ry dWN0IHRlZ3JhX3h1ZGNfc29jX2RhdGEgeworCXUxNiBkZXZpY2VfaWQ7CisJY29uc3QgY2hhciAq IGNvbnN0ICpzdXBwbHlfbmFtZXM7CisJdW5zaWduZWQgaW50IG51bV9zdXBwbGllczsKKwlib29s IHUxX2VuYWJsZTsKKwlib29sIHUyX2VuYWJsZTsKKwlib29sIGxwbV9lbmFibGU7CisJYm9vbCBp bnZhbGlkX3NlcV9udW07CisJYm9vbCBwbHNfcXVpcms7CisJYm9vbCBwb3J0X3Jlc2V0X3F1aXJr OworfTsKKworc3RhdGljIGJvb2wgdTFfZW5hYmxlOworbW9kdWxlX3BhcmFtKHUxX2VuYWJsZSwg Ym9vbCwgMDY0NCk7CisKK3N0YXRpYyBib29sIHUyX2VuYWJsZTsKK21vZHVsZV9wYXJhbSh1Ml9l bmFibGUsIGJvb2wsIDA2NDQpOworCitzdGF0aWMgYm9vbCBscG1fZW5hYmxlOworbW9kdWxlX3Bh cmFtKGxwbV9lbmFibGUsIGJvb2wsIDA2NDQpOworCitzdGF0aWMgaW5saW5lIHUzMiBmcGNpX3Jl YWRsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1MzIgYWRkcikKK3sKKwlyZXR1cm4gcmVhZGwo eHVkYy0+ZnBjaSArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnBjaV93cml0ZWwo c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHUzMiB2YWwsIHUzMiBhZGRyKQoreworCXdyaXRlbCh2 YWwsIHh1ZGMtPmZwY2kgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB1MzIgaXBmc19yZWFk bChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdTMyIGFkZHIpCit7CisJcmV0dXJuIHJlYWRsKHh1 ZGMtPmlwZnMgKyBhZGRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGlwZnNfd3JpdGVsKHN0 cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1MzIgdmFsLCB1MzIgYWRkcikKK3sKKwl3cml0ZWwodmFs LCB4dWRjLT5pcGZzICsgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdTMyIHh1ZGNfcmVhZGwo c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHUzMiBhZGRyKQoreworCXJldHVybiByZWFkbCh4dWRj LT5iYXNlICsgYWRkcik7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4dWRjX3dyaXRlbChzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYywgdTMyIHZhbCwgdTMyIGFkZHIpCit7CisJd3JpdGVsKHZhbCwg eHVkYy0+YmFzZSArIGFkZHIpOworfQorCitzdGF0aWMgaW5saW5lIGludCB4dWRjX3JlYWRsX3Bv bGwoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHUzMiBhZGRyLCB1MzIgbWFzaywKKwkJCQkgIHUz MiB2YWwpCit7CisJdTMyIHJlZ3ZhbDsKKworCXJldHVybiByZWFkbF9wb2xsX3RpbWVvdXRfYXRv bWljKHh1ZGMtPmJhc2UgKyBhZGRyLCByZWd2YWwsCisJCQkJCSAocmVndmFsICYgbWFzaykgPT0g dmFsLCAxLCAxMDApOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdyYV94dWRjICp0b194 dWRjKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihn YWRnZXQsIHN0cnVjdCB0ZWdyYV94dWRjLCBnYWRnZXQpOworfQorCitzdGF0aWMgaW5saW5lIHN0 cnVjdCB0ZWdyYV94dWRjX2VwICp0b194dWRjX2VwKHN0cnVjdCB1c2JfZXAgKmVwKQoreworCXJl dHVybiBjb250YWluZXJfb2YoZXAsIHN0cnVjdCB0ZWdyYV94dWRjX2VwLCB1c2JfZXApOworfQor CitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnRvX3h1ZGNfcmVxKHN0 cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQoreworCXJldHVybiBjb250YWluZXJfb2YocmVxLCBzdHJ1 Y3QgdGVncmFfeHVkY19yZXF1ZXN0LCB1c2JfcmVxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lk IGR1bXBfdHJiKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCBjb25zdCBjaGFyICp0eXBlLAorCQkJ ICAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQoreworCWRldl9kYmcoeHVkYy0+ZGV2LAor CQkiJXM6ICVwLCBsbyA9ICUjeCwgaGkgPSAlI3gsIHN0YXR1cyA9ICUjeCwgY29udHJvbCA9ICUj eFxuIiwKKwkJdHlwZSwgdHJiLCB0cmItPmRhdGFfbG8sIHRyYi0+ZGF0YV9oaSwgdHJiLT5zdGF0 dXMsCisJCXRyYi0+Y29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZGV2aWNl X21vZGVfb24oc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKwlpbnQgZXJyOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsK KwlpZiAoeHVkYy0+ZGV2aWNlX21vZGUpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVk Yy0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm47CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo Jnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXBtX3J1bnRpbWVfZ2V0X3N5bmMoeHVkYy0+ZGV2KTsK KworCWVyciA9IHBoeV9wb3dlcl9vbih4dWRjLT51dG1pX3BoeSk7CisJaWYgKGVyciA8IDApCisJ CWRldl9lcnIoeHVkYy0+ZGV2LCAidXRtaSBwb3dlciBvbiBmYWlsZWQgJWRcbiIsIGVycik7CisJ ZXJyID0gcGh5X3Bvd2VyX29uKHh1ZGMtPnVzYjNfcGh5KTsKKwlpZiAoZXJyIDwgMCkKKwkJZGV2 X2Vycih4dWRjLT5kZXYsICJ1c2IzIHBoeSBwb3dlciBvbiBmYWlsZWQgJWRcbiIsIGVycik7CisK KwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCWRldl9pbmZvKHh1ZGMt PmRldiwgImRldmljZSBtb2RlIG9uXG4iKTsKKwl0ZWdyYV94dXNiX3BhZGN0bF9zZXRfdmJ1c19v dmVycmlkZSh4dWRjLT5wYWRjdGwpOworCisJeHVkYy0+ZGV2aWNlX21vZGUgPSB0cnVlOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwl0ZWdyYV9waHlfeHVz Yl91dG1pX3BhZF9wb3dlcl9vbih4dWRjLT51dG1pX3BoeSk7Cit9CisKK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfZGV2aWNlX21vZGVfb2ZmKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCWJv b2wgY29ubmVjdGVkID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcGxzLCB2 YWw7CisJaW50IGVycjsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7 CisJaWYgKCF4dWRjLT5kZXZpY2VfbW9kZSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisKKwlkZXZfaW5mbyh4dWRjLT5kZXYs ICJkZXZpY2UgbW9kZSBvZmZcbiIpOworCisJY29ubmVjdGVkID0gISEoeHVkY19yZWFkbCh4dWRj LCBQT1JUU0MpICYgUE9SVFNDX0NDUyk7CisJcmVpbml0X2NvbXBsZXRpb24oJnh1ZGMtPmRpc2Nv bm5lY3RfY29tcGxldGUpOworCisJdGVncmFfeHVzYl9wYWRjdGxfY2xlYXJfdmJ1c19vdmVycmlk ZSh4dWRjLT5wYWRjdGwpOworCisJcGxzID0gKHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSA+PiBQ T1JUU0NfUExTX1NISUZUKSAmCisJCVBPUlRTQ19QTFNfTUFTSzsKKworCS8qIERpcmVjdCBsaW5r IHRvIFUwIGlmIGRpc2Nvbm5lY3RlZCBpbiBSRVNVTUUgb3IgVTIuICovCisJaWYgKHh1ZGMtPnNv Yy0+cGxzX3F1aXJrICYmIHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIgJiYK KwkgICAgKHBscyA9PSBQT1JUU0NfUExTX1JFU1VNRSB8fCBwbHMgPT0gUE9SVFNDX1BMU19VMikp IHsKKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOworCQl2YWwgfD0gUE9SVFBNX0ZS V0U7CisJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKKworCQl2YWwgPSB4dWRjX3Jl YWRsKHh1ZGMsIFBPUlRTQyk7CisJCXZhbCAmPSB+KFBPUlRTQ19DSEFOR0VfTUFTSyB8CisJCQkg KFBPUlRTQ19QTFNfTUFTSyA8PCBQT1JUU0NfUExTX1NISUZUKSk7CisJCXZhbCB8PSBQT1JUU0Nf TFdTIHwgKFBPUlRTQ19QTFNfVTAgPDwgUE9SVFNDX1BMU19TSElGVCk7CisJCXh1ZGNfd3JpdGVs KHh1ZGMsIHZhbCwgUE9SVFNDKTsKKwl9CisKKwl4dWRjLT5kZXZpY2VfbW9kZSA9IGZhbHNlOwor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwl0ZWdyYV9waHlf eHVzYl91dG1pX3BhZF9wb3dlcl9kb3duKHh1ZGMtPnV0bWlfcGh5KTsKKworCS8qIFdhaXQgZm9y IGRpc2Nvbm5lY3QgZXZlbnQuICovCisJaWYgKGNvbm5lY3RlZCkKKwkJd2FpdF9mb3JfY29tcGxl dGlvbigmeHVkYy0+ZGlzY29ubmVjdF9jb21wbGV0ZSk7CisKKwkvKiBNYWtlIHN1cmUgaW50ZXJy dXB0IGhhbmRsZXIgaGFzIGNvbXBsZXRlZCBiZWZvcmUgcG93ZXJnYXRpbmcuICovCisJc3luY2hy b25pemVfaXJxKHh1ZGMtPmlycSk7CisJZXJyID0gcGh5X3Bvd2VyX29mZih4dWRjLT51dG1pX3Bo eSk7CisJaWYgKGVyciA8IDApCisJCWRldl9lcnIoeHVkYy0+ZGV2LCAidXRtaV9waHkgcG93ZXIg b2ZmIGZhaWxlZCAlZFxuIiwgZXJyKTsKKworCWVyciA9IHBoeV9wb3dlcl9vZmYoeHVkYy0+dXNi M19waHkpOworCWlmIChlcnIgPCAwKQorCQlkZXZfZXJyKHh1ZGMtPmRldiwgInVzYjNfcGh5IHBv d2VyIG9mZiBmYWlsZWQgJWRcbiIsIGVycik7CisKKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYp OworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3VwZGF0ZV9kYXRhX3JvbGUoc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMpCit7CisJaWYgKGV4dGNvbl9nZXRfc3RhdGUoeHVkYy0+ZGF0YV9yb2xl X2V4dGNvbiwgRVhUQ09OX1VTQikpCisJCXRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVfb24oeHVkYyk7 CisJZWxzZQorCQl0ZWdyYV94dWRjX2RldmljZV9tb2RlX29mZih4dWRjKTsKK30KKworc3RhdGlj IHZvaWQgdGVncmFfeHVkY19kYXRhX3JvbGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmsp Cit7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0 IHRlZ3JhX3h1ZGMsCisJCQkJCSAgICAgICBkYXRhX3JvbGVfd29yayk7CisKKwl0ZWdyYV94dWRj X3VwZGF0ZV9kYXRhX3JvbGUoeHVkYyk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19kYXRh X3JvbGVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJIHVuc2lnbmVk IGxvbmcgZXZlbnQsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9 IGNvbnRhaW5lcl9vZihuYiwgc3RydWN0IHRlZ3JhX3h1ZGMsCisJCQkJCSAgICAgICBkYXRhX3Jv bGVfbmIpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVk Yy0+bG9jaywgZmxhZ3MpOworCWlmICgheHVkYy0+c3VzcGVuZGVkKQorCQlzY2hlZHVsZV93b3Jr KCZ4dWRjLT5kYXRhX3JvbGVfd29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+ bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgdm9pZCB0 ZWdyYV94dWRjX3BsY19yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlz dHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwlzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHRlZ3JhX3h1 ZGMsCisJCQkJCSAgICAgICBwbGNfcmVzZXRfd29yayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK KworCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKHh1ZGMtPndh aXRfY3NjKSB7CisJCXUzMiBwbHMgPSAoeHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpID4+IFBPUlRT Q19QTFNfU0hJRlQpICYKKwkJCSAgUE9SVFNDX1BMU19NQVNLOworCQlpZiAocGxzID09IFBPUlRT Q19QTFNfSU5BQ1RJVkUpIHsKKwkJCWRldl9pbmZvKHh1ZGMtPmRldiwgIlBMUyA9IEluYWN0aXZl LiBUb2dnbGUgVkJVU1xuIik7CisJCQl0ZWdyYV94dXNiX3BhZGN0bF9jbGVhcl92YnVzX292ZXJy aWRlKHh1ZGMtPnBhZGN0bCk7CisJCQl0ZWdyYV94dXNiX3BhZGN0bF9zZXRfdmJ1c19vdmVycmlk ZSh4dWRjLT5wYWRjdGwpOworCQkJeHVkYy0+d2FpdF9jc2MgPSBmYWxzZTsKKwkJfQorCX0KKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2 b2lkIHRlZ3JhX3h1ZGNfcG9ydF9yZXNldF93YXJfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndv cmspCit7CisJc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmsgPSB0b19kZWxheWVkX3dvcmsod29y ayk7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPQorCQljb250YWluZXJfb2YoZHdvcmssIHN0 cnVjdCB0ZWdyYV94dWRjLCBwb3J0X3Jlc2V0X3dhcl93b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCXUzMiBwbHM7CisJaW50IHJldDsKKworCWRldl9pbmZvKHh1ZGMtPmRldiwgInBvcnRf cmVzZXRfd2FyX3dvcmtcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFn cyk7CisJaWYgKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24gJiYKKwkJZXh0Y29uX2dldF9zdGF0ZSh4 dWRjLT5kYXRhX3JvbGVfZXh0Y29uLCBFWFRDT05fVVNCKSAmJgorCQl4dWRjLT53YWl0X2Zvcl9z ZWNfcHJjKSB7CisJCXBscyA9ICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BM U19TSElGVCkgJgorCQkJUE9SVFNDX1BMU19NQVNLOworCQlkZXZfaW5mbyh4dWRjLT5kZXYsICJw bHMgPSAleFxuIiwgcGxzKTsKKworCQlpZiAocGxzID09IFBPUlRTQ19QTFNfRElTQUJMRUQpIHsK KwkJCWRldl9pbmZvKHh1ZGMtPmRldiwgInRvZ2dsZSB2YnVzXG4iKTsKKwkJCS8qIFBSQyBkb2Vz bid0IGNvbXBsZXRlIGluIDEwMG1zLCB0b2dnbGUgdGhlIHZidXMgKi8KKwkJCXJldCA9CisJCQl0 ZWdyYV9waHlfeHVzYl91dG1pX3BvcnRfcmVzZXRfcXVpcmsoeHVkYy0+dXRtaV9waHkpOworCQkJ aWYgKHJldCA9PSAxKQorCQkJCXh1ZGMtPndhaXRfZm9yX3NlY19wcmMgPSAwOworCQl9CisJfQor CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworfQorCitzdGF0 aWMgZG1hX2FkZHJfdCB0cmJfdmlydF90b19waHlzKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwK KwkJCQkgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYikKK3sKKwl1bnNpZ25lZCBpbnQgaW5k ZXg7CisJZG1hX2FkZHJfdCBwaHlzOworCisJaW5kZXggPSB0cmIgLSBlcC0+dHJhbnNmZXJfcmlu ZzsKKwlpZiAoV0FSTl9PTihpbmRleCA+PSBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSkpCisJCXJl dHVybiAwOworCXBoeXMgPSBlcC0+dHJhbnNmZXJfcmluZ19waHlzICsgaW5kZXggKiBzaXplb2Yo KnRyYik7CisKKwlyZXR1cm4gcGh5czsKK30KKworc3RhdGljIHN0cnVjdCB0ZWdyYV94dWRjX3Ry YiAqdHJiX3BoeXNfdG9fdmlydChzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCisJCQkJCSAgICAg ICBkbWFfYWRkcl90IGFkZHIpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmI7CisJdW5z aWduZWQgaW50IGluZGV4OworCisJaW5kZXggPSAoYWRkciAtIGVwLT50cmFuc2Zlcl9yaW5nX3Bo eXMpIC8gc2l6ZW9mKCp0cmIpOworCWlmIChXQVJOX09OKGluZGV4ID49IFhVRENfVFJBTlNGRVJf UklOR19TSVpFKSkKKwkJcmV0dXJuIE5VTEw7CisJdHJiID0gJmVwLT50cmFuc2Zlcl9yaW5nW2lu ZGV4XTsKKworCXJldHVybiB0cmI7Cit9CisKK3N0YXRpYyB2b2lkIGVwX3JlbG9hZChzdHJ1Y3Qg dGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50IGVwKQoreworCXh1ZGNfd3JpdGVsKHh1ZGMs IEJJVChlcCksIEVQX1JFTE9BRCk7CisJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQX1JFTE9BRCwg QklUKGVwKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGVwX3BhdXNlKHN0cnVjdCB0ZWdyYV94dWRj ICp4dWRjLCB1bnNpZ25lZCBpbnQgZXApCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHh1ZGNfcmVh ZGwoeHVkYywgRVBfUEFVU0UpOworCWlmICh2YWwgJiBCSVQoZXApKQorCQlyZXR1cm47CisJdmFs IHw9IEJJVChlcCk7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUF9QQVVTRSk7CisKKwl4dWRj X3JlYWRsX3BvbGwoeHVkYywgRVBfU1RDSEcsIEJJVChlcCksIEJJVChlcCkpOworCisJeHVkY193 cml0ZWwoeHVkYywgQklUKGVwKSwgRVBfU1RDSEcpOworfQorCitzdGF0aWMgdm9pZCBlcF91bnBh dXNlKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgZXApCit7CisJdTMyIHZh bDsKKworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBfUEFVU0UpOworCWlmICghKHZhbCAmIEJJ VChlcCkpKQorCQlyZXR1cm47CisJdmFsICY9IH5CSVQoZXApOworCXh1ZGNfd3JpdGVsKHh1ZGMs IHZhbCwgRVBfUEFVU0UpOworCisJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQX1NUQ0hHLCBCSVQo ZXApLCBCSVQoZXApKTsKKworCXh1ZGNfd3JpdGVsKHh1ZGMsIEJJVChlcCksIEVQX1NUQ0hHKTsK K30KKworc3RhdGljIHZvaWQgZXBfdW5wYXVzZV9hbGwoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMp Cit7CisJdTMyIHZhbDsKKworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBfUEFVU0UpOworCXh1 ZGNfd3JpdGVsKHh1ZGMsIDAsIEVQX1BBVVNFKTsKKworCXh1ZGNfcmVhZGxfcG9sbCh4dWRjLCBF UF9TVENIRywgdmFsLCB2YWwpOworCisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUF9TVENIRyk7 Cit9CisKK3N0YXRpYyB2b2lkIGVwX2hhbHQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHVuc2ln bmVkIGludCBlcCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBFUF9I QUxUKTsKKwlpZiAodmFsICYgQklUKGVwKSkKKwkJcmV0dXJuOworCXZhbCB8PSBCSVQoZXApOwor CXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVBfSEFMVCk7CisKKwl4dWRjX3JlYWRsX3BvbGwoeHVk YywgRVBfU1RDSEcsIEJJVChlcCksIEJJVChlcCkpOworCisJeHVkY193cml0ZWwoeHVkYywgQklU KGVwKSwgRVBfU1RDSEcpOworfQorCitzdGF0aWMgdm9pZCBlcF91bmhhbHQoc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBlcCkKK3sKKwl1MzIgdmFsOworCisJdmFsID0geHVk Y19yZWFkbCh4dWRjLCBFUF9IQUxUKTsKKwlpZiAoISh2YWwgJiBCSVQoZXApKSkKKwkJcmV0dXJu OworCXZhbCAmPSB+QklUKGVwKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVQX0hBTFQpOwor CisJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQX1NUQ0hHLCBCSVQoZXApLCBCSVQoZXApKTsKKwor CXh1ZGNfd3JpdGVsKHh1ZGMsIEJJVChlcCksIEVQX1NUQ0hHKTsKK30KKworc3RhdGljIHZvaWQg ZXBfdW5oYWx0X2FsbChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl1MzIgdmFsOworCisJ dmFsID0geHVkY19yZWFkbCh4dWRjLCBFUF9IQUxUKTsKKwlpZiAoIXZhbCkKKwkJcmV0dXJuOwor CXh1ZGNfd3JpdGVsKHh1ZGMsIDAsIEVQX0hBTFQpOworCisJeHVkY19yZWFkbF9wb2xsKHh1ZGMs IEVQX1NUQ0hHLCB2YWwsIHZhbCk7CisKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVQX1NUQ0hH KTsKK30KKworc3RhdGljIHZvaWQgZXBfd2FpdF9mb3Jfc3RvcHBlZChzdHJ1Y3QgdGVncmFfeHVk YyAqeHVkYywgdW5zaWduZWQgaW50IGVwKQoreworCXh1ZGNfcmVhZGxfcG9sbCh4dWRjLCBFUF9T VE9QUEVELCBCSVQoZXApLCBCSVQoZXApKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCBCSVQoZXApLCBF UF9TVE9QUEVEKTsKK30KKworc3RhdGljIHZvaWQgZXBfd2FpdF9mb3JfaW5hY3RpdmUoc3RydWN0 IHRlZ3JhX3h1ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBlcCkKK3sKKwl4dWRjX3JlYWRsX3BvbGwo eHVkYywgRVBfVEhSRUFEX0FDVElWRSwgQklUKGVwKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfcmVxX2RvbmUoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAorCQkJCXN0cnVjdCB0 ZWdyYV94dWRjX3JlcXVlc3QgKnJlcSwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgdGVncmFfeHVk YyAqeHVkYyA9IGVwLT54dWRjOworCisJZGV2X2RiZyh4dWRjLT5kZXYsICJjb21wbGV0aW5nIHJl cXVlc3QgJXAgb24gZXAgJXUgd2l0aCBzdGF0dXMgJWRcbiIsCisJCSByZXEsIGVwLT5pbmRleCwg c3RhdHVzKTsKKworCWlmIChsaWtlbHkocmVxLT51c2JfcmVxLnN0YXR1cyA9PSAtRUlOUFJPR1JF U1MpKQorCQlyZXEtPnVzYl9yZXEuc3RhdHVzID0gc3RhdHVzOworCisJbGlzdF9kZWxfaW5pdCgm cmVxLT5saXN0KTsKKworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGVwLT5kZXNjKSkg eworCQl1c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3QoJnh1ZGMtPmdhZGdldCwgJnJlcS0+dXNiX3Jl cSwKKwkJCQkJICh4dWRjLT5zZXR1cF9zdGF0ZSA9PQorCQkJCQkgIERBVEFfU1RBR0VfWEZFUikp OworCX0gZWxzZSB7CisJCXVzYl9nYWRnZXRfdW5tYXBfcmVxdWVzdCgmeHVkYy0+Z2FkZ2V0LCAm cmVxLT51c2JfcmVxLAorCQkJCQkgdXNiX2VuZHBvaW50X2Rpcl9pbihlcC0+ZGVzYykpOworCX0K KworCXNwaW5fdW5sb2NrKCZ4dWRjLT5sb2NrKTsKKwl1c2JfZ2FkZ2V0X2dpdmViYWNrX3JlcXVl c3QoJmVwLT51c2JfZXAsICZyZXEtPnVzYl9yZXEpOworCXNwaW5fbG9jaygmeHVkYy0+bG9jayk7 Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZXBfbnVrZShzdHJ1Y3QgdGVncmFfeHVkY19l cCAqZXAsIGludCBzdGF0dXMpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOwor CisJd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCXJlcSA9IGxpc3RfZmlyc3Rf ZW50cnkoJmVwLT5xdWV1ZSwgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCwKKwkJCQkgICAgICAg bGlzdCk7CisJCXRlZ3JhX3h1ZGNfcmVxX2RvbmUoZXAsIHJlcSwgc3RhdHVzKTsKKwl9Cit9CisK K3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBfYXZhaWxhYmxlX3RyYnMoc3RydWN0IHRlZ3JhX3h1ZGNf ZXAgKmVwKQoreworCWlmIChlcC0+cmluZ19mdWxsKQorCQlyZXR1cm4gMDsKKwlpZiAoZXAtPmRl cV9wdHIgPiBlcC0+ZW5xX3B0cikKKwkJcmV0dXJuIGVwLT5kZXFfcHRyIC0gZXAtPmVucV9wdHIg LSAxOworCXJldHVybiBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSAtIChlcC0+ZW5xX3B0ciAtIGVw LT5kZXFfcHRyKSAtIDI7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcXVldWVfb25lX3Ry YihzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCisJCQkJICAgICBzdHJ1Y3QgdGVncmFfeHVkY19y ZXF1ZXN0ICpyZXEsCisJCQkJICAgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYiwKKwkJCQkg ICAgIGJvb2wgaW9jKQoreworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZXAtPnh1ZGM7CisJ ZG1hX2FkZHJfdCBidWZfYWRkcjsKKwlzaXplX3QgbGVuOworCisJbGVuID0gbWluX3Qoc2l6ZV90 LCBYVURDX1RSQl9NQVhfQlVGRkVSX1NJWkUsIHJlcS0+dXNiX3JlcS5sZW5ndGggLQorCQkgICAg cmVxLT5idWZfcXVldWVkKTsKKwlpZiAobGVuID4gMCkKKwkJYnVmX2FkZHIgPSByZXEtPnVzYl9y ZXEuZG1hICsgcmVxLT5idWZfcXVldWVkOworCWVsc2UKKwkJYnVmX2FkZHIgPSAwOworCisJdHJi X3dyaXRlX2RhdGFfcHRyKHRyYiwgYnVmX2FkZHIpOworCisJdHJiX3dyaXRlX3RyYW5zZmVyX2xl bih0cmIsIGxlbik7CisJdHJiX3dyaXRlX3RkX3NpemUodHJiLCByZXEtPnRyYnNfbmVlZGVkIC0g cmVxLT50cmJzX3F1ZXVlZCAtIDEpOworCisJaWYgKHJlcS0+dHJic19xdWV1ZWQgPT0gcmVxLT50 cmJzX25lZWRlZCAtIDEgfHwKKwkJKHJlcS0+bmVlZF96bHAgJiYgcmVxLT50cmJzX3F1ZXVlZCA9 PSByZXEtPnRyYnNfbmVlZGVkIC0gMikpCisJCXRyYl93cml0ZV9jaGFpbih0cmIsIDApOworCWVs c2UKKwkJdHJiX3dyaXRlX2NoYWluKHRyYiwgMSk7CisJdHJiX3dyaXRlX2lvYyh0cmIsIGlvYyk7 CisKKwlpZiAodXNiX2VuZHBvaW50X2Rpcl9vdXQoZXAtPmRlc2MpIHx8CisJICAgICh1c2JfZW5k cG9pbnRfeGZlcl9jb250cm9sKGVwLT5kZXNjKSAmJgorCSAgICAgKHh1ZGMtPnNldHVwX3N0YXRl ID09IERBVEFfU1RBR0VfUkVDVikpKQorCQl0cmJfd3JpdGVfaXNwKHRyYiwgMSk7CisJZWxzZQor CQl0cmJfd3JpdGVfaXNwKHRyYiwgMCk7CisKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJv bChlcC0+ZGVzYykpIHsKKwkJaWYgKHh1ZGMtPnNldHVwX3N0YXRlID09IERBVEFfU1RBR0VfWEZF UiB8fAorCQkgICAgeHVkYy0+c2V0dXBfc3RhdGUgPT0gREFUQV9TVEFHRV9SRUNWKQorCQkJdHJi X3dyaXRlX3R5cGUodHJiLCBUUkJfVFlQRV9EQVRBX1NUQUdFKTsKKwkJZWxzZQorCQkJdHJiX3dy aXRlX3R5cGUodHJiLCBUUkJfVFlQRV9TVEFUVVNfU1RBR0UpOworCQlpZiAoeHVkYy0+c2V0dXBf c3RhdGUgPT0gREFUQV9TVEFHRV9YRkVSIHx8CisJCSAgICB4dWRjLT5zZXR1cF9zdGF0ZSA9PSBT VEFUVVNfU1RBR0VfWEZFUikKKwkJCXRyYl93cml0ZV9kYXRhX3N0YWdlX2Rpcih0cmIsIDEpOwor CQllbHNlCisJCQl0cmJfd3JpdGVfZGF0YV9zdGFnZV9kaXIodHJiLCAwKTsKKwl9IGVsc2UgaWYg KHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXAtPmRlc2MpKSB7CisJCXRyYl93cml0ZV90eXBlKHRy YiwgVFJCX1RZUEVfSVNPQ0gpOworCQl0cmJfd3JpdGVfc2lhKHRyYiwgMSk7CisJCXRyYl93cml0 ZV9mcmFtZV9pZCh0cmIsIDApOworCQl0cmJfd3JpdGVfdGxicGModHJiLCAwKTsKKwl9IGVsc2Ug aWYgKHVzYl9zc19tYXhfc3RyZWFtcyhlcC0+Y29tcF9kZXNjKSkgeworCQl0cmJfd3JpdGVfdHlw ZSh0cmIsIFRSQl9UWVBFX1NUUkVBTSk7CisJCXRyYl93cml0ZV9zdHJlYW1faWQodHJiLCByZXEt PnVzYl9yZXEuc3RyZWFtX2lkKTsKKwl9IGVsc2UgeworCQl0cmJfd3JpdGVfdHlwZSh0cmIsIFRS Ql9UWVBFX05PUk1BTCk7CisJCXRyYl93cml0ZV9zdHJlYW1faWQodHJiLCAwKTsKKwl9CisKKwl0 cmJfd3JpdGVfY3ljbGUodHJiLCBlcC0+cGNzKTsKKworCXJlcS0+dHJic19xdWV1ZWQrKzsKKwly ZXEtPmJ1Zl9xdWV1ZWQgKz0gbGVuOworCisJZHVtcF90cmIoeHVkYywgIlRSQU5TRkVSIiwgdHJi KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCB0ZWdyYV94dWRjX3F1ZXVlX3RyYnMoc3RydWN0 IHRlZ3JhX3h1ZGNfZXAgKmVwLAorCQkJCQkgIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJl cSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgY291bnQsIGF2YWlsYWJsZTsKKwlib29sIHdhaXRfdGQg PSBmYWxzZTsKKworCWF2YWlsYWJsZSA9IGVwX2F2YWlsYWJsZV90cmJzKGVwKTsKKwljb3VudCA9 IHJlcS0+dHJic19uZWVkZWQgLSByZXEtPnRyYnNfcXVldWVkOworCWlmIChhdmFpbGFibGUgPCBj b3VudCkgeworCQljb3VudCA9IGF2YWlsYWJsZTsKKwkJZXAtPnJpbmdfZnVsbCA9IHRydWU7CisJ fQorCisJLyoKKwkgKiBUbyBnZW5lcmF0ZSB6ZXJvLWxlbmd0aCBwYWNrZXQgb24gVVNCIGJ1cywg U1cgbmVlZHMgc2NoZWR1bGUgYQorCSAqIHN0YW5kYWxvbmUgemVyby1sZW5ndGggVEQuIEFjY29y ZGluZyB0byBIVydzIGJlaGF2aW9yLCBTVyBuZWVkcworCSAqIHRvIHNjaGVkdWxlIFREcyBpbiBk aWZmZXJlbnQgd2F5cyBmb3IgZGlmZmVyZW50IGVuZHBvaW50IHR5cGVzLgorCSAqCisJICogRm9y IGNvbnRyb2wgZW5kcG9pbnQ6CisJICogLSBEYXRhIHN0YWdlIFREIChJT0MgPSAxLCBDSCA9IDAp CisJICogLSBSaW5nIGRvb3JiZWxsIGFuZCB3YWl0IHRyYW5zZmVyIGV2ZW50CisJICogLSBEYXRh IHN0YWdlIFREIGZvciBaTFAgKElPQyA9IDEsIENIID0gMCkKKwkgKiAtIFJpbmcgZG9vcmJlbGwK KwkgKgorCSAqIEZvciBidWxrIGFuZCBpbnRlcnJ1cHQgZW5kcG9pbnRzOgorCSAqIC0gTm9ybWFs IHRyYW5zZmVyIFREIChJT0MgPSAwLCBDSCA9IDApCisJICogLSBOb3JtYWwgdHJhbnNmZXIgVEQg Zm9yIFpMUCAoSU9DID0gMSwgQ0ggPSAwKQorCSAqIC0gUmluZyBkb29yYmVsbAorCSAqLworCisJ aWYgKHJlcS0+bmVlZF96bHAgJiYgdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykg JiYgY291bnQgPiAxKQorCQl3YWl0X3RkID0gdHJ1ZTsKKworCWlmICghcmVxLT5maXJzdF90cmIp CisJCXJlcS0+Zmlyc3RfdHJiID0gJmVwLT50cmFuc2Zlcl9yaW5nW2VwLT5lbnFfcHRyXTsKKwor CWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAq dHJiID0gJmVwLT50cmFuc2Zlcl9yaW5nW2VwLT5lbnFfcHRyXTsKKwkJYm9vbCBpb2MgPSBmYWxz ZTsKKworCQlpZiAoKGkgPT0gY291bnQgLSAxKSB8fCAod2FpdF90ZCAmJiBpID09IGNvdW50IC0g MikpCisJCQlpb2MgPSB0cnVlOworCisJCXRlZ3JhX3h1ZGNfcXVldWVfb25lX3RyYihlcCwgcmVx LCB0cmIsIGlvYyk7CisJCXJlcS0+bGFzdF90cmIgPSB0cmI7CisKKwkJZXAtPmVucV9wdHIrKzsK KwkJaWYgKGVwLT5lbnFfcHRyID09IFhVRENfVFJBTlNGRVJfUklOR19TSVpFIC0gMSkgeworCQkJ dHJiID0gJmVwLT50cmFuc2Zlcl9yaW5nW2VwLT5lbnFfcHRyXTsKKwkJCXRyYl93cml0ZV9jeWNs ZSh0cmIsIGVwLT5wY3MpOworCQkJZXAtPnBjcyA9ICFlcC0+cGNzOworCQkJZXAtPmVucV9wdHIg PSAwOworCQl9CisKKwkJaWYgKGlvYykKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBjb3VudDsK K30KKworc3RhdGljIHZvaWQgdGVncmFfeHVkY19lcF9yaW5nX2Rvb3JiZWxsKHN0cnVjdCB0ZWdy YV94dWRjX2VwICplcCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOwor CXUzMiB2YWw7CisKKwlpZiAobGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkKKwkJcmV0dXJuOworCisJ dmFsID0gZXAtPmluZGV4IDw8IERCX1RBUkdFVF9TSElGVDsKKwlpZiAodXNiX2VuZHBvaW50X3hm ZXJfY29udHJvbChlcC0+ZGVzYykpIHsKKwkJdmFsIHw9IHh1ZGMtPnNldHVwX3NlcV9udW0gPDwg REJfU1RSRUFNSURfU0hJRlQ7CisJfSBlbHNlIGlmICh1c2Jfc3NfbWF4X3N0cmVhbXMoZXAtPmNv bXBfZGVzYykgPiAwKSB7CisJCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKKworCQkv KiBEb24ndCByaW5nIGRvb3JiZWxsIGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gcmVqZWN0ZWQuICov CisJCWlmIChlcC0+c3RyZWFtX3JlamVjdGVkKQorCQkJcmV0dXJuOworCQlyZXEgPSBsaXN0X2Zp cnN0X2VudHJ5KCZlcC0+cXVldWUsIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QsCisJCQkJICAg ICAgIGxpc3QpOworCQl2YWwgfD0gcmVxLT51c2JfcmVxLnN0cmVhbV9pZCA8PCBEQl9TVFJFQU1J RF9TSElGVDsKKwl9CisJZGV2X2RiZyh4dWRjLT5kZXYsICJyaW5nIGRvb3JiZWxsOiAlI3hcbiIs IHZhbCk7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBEQik7Cit9CisKK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfZXBfa2lja19xdWV1ZShzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXApCit7CisJc3Ry dWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOworCWJvb2wgdHJic19xdWV1ZWQgPSBmYWxzZTsK KworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmZXAtPnF1ZXVlLCBsaXN0KSB7CisJCWlmIChl cC0+cmluZ19mdWxsKQorCQkJYnJlYWs7CisJCWlmICh0ZWdyYV94dWRjX3F1ZXVlX3RyYnMoZXAs IHJlcSkgPiAwKQorCQkJdHJic19xdWV1ZWQgPSB0cnVlOworCX0KKworCWlmICh0cmJzX3F1ZXVl ZCkKKwkJdGVncmFfeHVkY19lcF9yaW5nX2Rvb3JiZWxsKGVwKTsKK30KKworc3RhdGljIGludAor X190ZWdyYV94dWRjX2VwX3F1ZXVlKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwgc3RydWN0IHRl Z3JhX3h1ZGNfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZXAt Pnh1ZGM7CisJaW50IGVycjsKKworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGVwLT5k ZXNjKSAmJiAhbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgeworCQlkZXZfZXJyKHh1ZGMtPmRldiwg ImNvbnRyb2wgZXAgaGFzIHBlbmRpbmcgdHJhbnNmZXJzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7 CisJfQorCisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZXAtPmRlc2MpKSB7CisJCWVy ciA9IHVzYl9nYWRnZXRfbWFwX3JlcXVlc3QoJnh1ZGMtPmdhZGdldCwgJnJlcS0+dXNiX3JlcSwK KwkJCQkJICAgICAoeHVkYy0+c2V0dXBfc3RhdGUgPT0KKwkJCQkJICAgICAgREFUQV9TVEFHRV9Y RkVSKSk7CisJfSBlbHNlIHsKKwkJZXJyID0gdXNiX2dhZGdldF9tYXBfcmVxdWVzdCgmeHVkYy0+ Z2FkZ2V0LCAmcmVxLT51c2JfcmVxLAorCQkJCQkgICAgIHVzYl9lbmRwb2ludF9kaXJfaW4oZXAt PmRlc2MpKTsKKwl9CisJaWYgKGVyciA8IDApIHsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWls ZWQgdG8gbWFwIHJlcXVlc3Q6ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKworCXJl cS0+Zmlyc3RfdHJiID0gTlVMTDsKKwlyZXEtPmxhc3RfdHJiID0gTlVMTDsKKwlyZXEtPmJ1Zl9x dWV1ZWQgPSAwOworCXJlcS0+dHJic19xdWV1ZWQgPSAwOworCXJlcS0+bmVlZF96bHAgPSBmYWxz ZTsKKwlyZXEtPnRyYnNfbmVlZGVkID0gRElWX1JPVU5EX1VQKHJlcS0+dXNiX3JlcS5sZW5ndGgs CisJCQkJCVhVRENfVFJCX01BWF9CVUZGRVJfU0laRSk7CisJaWYgKHJlcS0+dXNiX3JlcS5sZW5n dGggPT0gMCkKKwkJcmVxLT50cmJzX25lZWRlZCsrOworCWlmICghdXNiX2VuZHBvaW50X3hmZXJf aXNvYyhlcC0+ZGVzYykgJiYKKwkgICAgcmVxLT51c2JfcmVxLnplcm8gJiYgKHJlcS0+dXNiX3Jl cS5sZW5ndGggIT0gMCkgJiYKKwkgICAgKChyZXEtPnVzYl9yZXEubGVuZ3RoICUgZXAtPnVzYl9l cC5tYXhwYWNrZXQpID09IDApKSB7CisJCXJlcS0+dHJic19uZWVkZWQrKzsKKwkJcmVxLT5uZWVk X3pscCA9IHRydWU7CisJfQorCisJcmVxLT51c2JfcmVxLnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsK KwlyZXEtPnVzYl9yZXEuYWN0dWFsID0gMDsKKworCWxpc3RfYWRkX3RhaWwoJnJlcS0+bGlzdCwg JmVwLT5xdWV1ZSk7CisKKwl0ZWdyYV94dWRjX2VwX2tpY2tfcXVldWUoZXApOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQKK3RlZ3JhX3h1ZGNfZXBfcXVldWUoc3RydWN0IHVzYl9lcCAq dXNiX2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXEsCisJCSAgICBnZnBfdCBnZnApCit7 CisJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCB0ZWdyYV94dWRjX2Vw ICplcDsKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CWludCByZXQ7CisKKwlpZiAoIXVzYl9lcCB8fCAhdXNiX3JlcSkKKwkJcmV0dXJuIC1FSU5WQUw7 CisJZXAgPSB0b194dWRjX2VwKHVzYl9lcCk7CisJcmVxID0gdG9feHVkY19yZXEodXNiX3JlcSk7 CisJeHVkYyA9IGVwLT54dWRjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZs YWdzKTsKKwlpZiAoeHVkYy0+cG93ZXJnYXRlZCB8fCAhZXAtPmRlc2MpIHsKKwkJcmV0ID0gLUVT SFVURE9XTjsKKwkJZ290byB1bmxvY2s7CisJfQorCXJldCA9IF9fdGVncmFfeHVkY19lcF9xdWV1 ZShlcCwgcmVxKTsKK3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2Nr LCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzcXVlZXplX3RyYW5z ZmVyX3Jpbmcoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAorCQkJCSAgc3RydWN0IHRlZ3JhX3h1 ZGNfcmVxdWVzdCAqcmVxKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiID0gcmVxLT5m aXJzdF90cmI7CisJYm9vbCBwY3NfZW5xID0gdHJiX3JlYWRfY3ljbGUodHJiKTsKKwlib29sIHBj czsKKworCisJLyoKKwkgKiBDbGVhciBvdXQgYWxsIHRoZSBUUkJzIHBhcnQgb2Ygb3IgYWZ0ZXIg dGhlIGNhbmNlbGxlZCByZXF1ZXN0LAorCSAqIGFuZCBtdXN0IGNvcnJlY3QgdHJiIGN5Y2xlIGJp dCB0byB0aGUgbGFzdCB1bi1lbnF1ZXVlZCBzdGF0ZS4KKwkgKi8KKwl3aGlsZSAodHJiICE9ICZl cC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl0pIHsKKwkJcGNzID0gdHJiX3JlYWRfY3ljbGUo dHJiKTsKKwkJbWVtc2V0KHRyYiwgMCwgc2l6ZW9mKCp0cmIpKTsKKwkJdHJiX3dyaXRlX2N5Y2xl KHRyYiwgIXBjcyk7CisJCXRyYisrOworCisJCWlmICh0cmJfcmVhZF90eXBlKHRyYikgPT0gVFJC X1RZUEVfTElOSykKKwkJCXRyYiA9IGVwLT50cmFuc2Zlcl9yaW5nOworCX0KKworCS8qIFJlcXVl c3RzIHdpbGwgYmUgcmUtcXVldWVkIGF0IHRoZSBzdGFydCBvZiB0aGUgY2FuY2VsbGVkIHJlcXVl c3QuICovCisJZXAtPmVucV9wdHIgPSByZXEtPmZpcnN0X3RyYiAtIGVwLT50cmFuc2Zlcl9yaW5n OworCS8qCisJICogUmV0cmlldmUgdGhlIGNvcnJlY3QgY3ljbGUgYml0IHN0YXRlIGZyb20gdGhl IGZpcnN0IHRyYiBvZgorCSAqIHRoZSBjYW5jZWxsZWQgcmVxdWVzdC4KKwkgKi8KKwllcC0+cGNz ID0gcGNzX2VucTsKKwllcC0+cmluZ19mdWxsID0gZmFsc2U7CisJbGlzdF9mb3JfZWFjaF9lbnRy eV9jb250aW51ZShyZXEsICZlcC0+cXVldWUsIGxpc3QpIHsKKwkJcmVxLT51c2JfcmVxLnN0YXR1 cyA9IC1FSU5QUk9HUkVTUzsKKwkJcmVxLT51c2JfcmVxLmFjdHVhbCA9IDA7CisKKwkJcmVxLT5m aXJzdF90cmIgPSBOVUxMOworCQlyZXEtPmxhc3RfdHJiID0gTlVMTDsKKwkJcmVxLT5idWZfcXVl dWVkID0gMDsKKwkJcmVxLT50cmJzX3F1ZXVlZCA9IDA7CisJfQorfQorCisvKgorICogRGV0ZXJt aW5lIGlmIHRoZSBnaXZlbiBUUkIgaXMgaW4gdGhlIHJhbmdlIFtmaXJzdCB0cmIsIGxhc3QgdHJi XSBmb3IgdGhlCisgKiBnaXZlbiByZXF1ZXN0LgorICovCitzdGF0aWMgYm9vbCB0cmJfaW5fcmVx dWVzdChzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCisJCQkgICBzdHJ1Y3QgdGVncmFfeHVkY19y ZXF1ZXN0ICpyZXEsCisJCQkgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYikKK3sKKwlkZXZf ZGJnKGVwLT54dWRjLT5kZXYsICIlczogcmVxdWVzdCAlcCAtPiAlcDsgdHJiICVwXG4iLCBfX2Z1 bmNfXywKKwkJcmVxLT5maXJzdF90cmIsIHJlcS0+bGFzdF90cmIsIHRyYik7CisKKwlpZiAodHJi ID49IHJlcS0+Zmlyc3RfdHJiICYmICh0cmIgPD0gcmVxLT5sYXN0X3RyYiB8fAorCQkJCSAgICAg IHJlcS0+bGFzdF90cmIgPCByZXEtPmZpcnN0X3RyYikpCisJCXJldHVybiB0cnVlOworCWlmICh0 cmIgPCByZXEtPmZpcnN0X3RyYiAmJiB0cmIgPD0gcmVxLT5sYXN0X3RyYiAmJgorCSAgICByZXEt Pmxhc3RfdHJiIDwgcmVxLT5maXJzdF90cmIpCisJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxz ZTsKK30KKworLyoKKyAqIERldGVybWluZSBpZiB0aGUgZ2l2ZW4gVFJCIGlzIGluIHRoZSByYW5n ZSBbRVAgZW5xdWV1ZSBwb2ludGVyLCBmaXJzdCBUUkIpCisgKiBmb3IgdGhlIGdpdmVuIGVuZHBv aW50IGFuZCByZXF1ZXN0LgorICovCitzdGF0aWMgYm9vbCB0cmJfYmVmb3JlX3JlcXVlc3Qoc3Ry dWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAorCQkJICAgICAgIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVl c3QgKnJlcSwKKwkJCSAgICAgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYikKK3sKKwlzdHJ1 Y3QgdGVncmFfeHVkY190cmIgKmVucV90cmIgPSAmZXAtPnRyYW5zZmVyX3JpbmdbZXAtPmVucV9w dHJdOworCisJZGV2X2RiZyhlcC0+eHVkYy0+ZGV2LCAiJXM6IHJlcXVlc3QgJXAgLT4gJXA7IGVu cSBwdHI6ICVwOyB0cmIgJXBcbiIsCisJCV9fZnVuY19fLCByZXEtPmZpcnN0X3RyYiwgcmVxLT5s YXN0X3RyYiwgZW5xX3RyYiwgdHJiKTsKKworCWlmICh0cmIgPCByZXEtPmZpcnN0X3RyYiAmJiAo ZW5xX3RyYiA8PSB0cmIgfHwKKwkJCQkgICAgIHJlcS0+Zmlyc3RfdHJiIDwgZW5xX3RyYikpCisJ CXJldHVybiB0cnVlOworCWlmICh0cmIgPiByZXEtPmZpcnN0X3RyYiAmJiByZXEtPmZpcnN0X3Ry YiA8IGVucV90cmIgJiYgZW5xX3RyYiA8PSB0cmIpCisJCXJldHVybiB0cnVlOworCXJldHVybiBm YWxzZTsKK30KKworc3RhdGljIGludAorX190ZWdyYV94dWRjX2VwX2RlcXVldWUoc3RydWN0IHRl Z3JhX3h1ZGNfZXAgKmVwLAorCQkJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxKQorewor CXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZXAtPnh1ZGM7CisJc3RydWN0IHRlZ3JhX3h1ZGNf cmVxdWVzdCAqcjsKKwlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKmRlcV90cmI7CisJYm9vbCBidXN5 LCBraWNrX3F1ZXVlID0gZmFsc2U7CisJaW50IHJldCA9IDA7CisKKwkvKiBNYWtlIHN1cmUgdGhl IHJlcXVlc3QgaXMgYWN0dWFsbHkgcXVldWVkIHRvIHRoaXMgZW5kcG9pbnQuICovCisJbGlzdF9m b3JfZWFjaF9lbnRyeShyLCAmZXAtPnF1ZXVlLCBsaXN0KSB7CisJCWlmIChyID09IHJlcSkKKwkJ CWJyZWFrOworCX0KKwlpZiAociAhPSByZXEpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUmVx dWVzdCBoYXNuJ3QgYmVlbiBxdWV1ZWQgaW4gdGhlIHRyYW5zZmVyIHJpbmcgeWV0LiAqLworCWlm ICghcmVxLT50cmJzX3F1ZXVlZCkgeworCQl0ZWdyYV94dWRjX3JlcV9kb25lKGVwLCByZXEsIC1F Q09OTlJFU0VUKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSGFsdCBETUEgZm9yIHRoaXMgZW5k cGlvbnQuICovCisJaWYgKGVwX2N0eF9yZWFkX3N0YXRlKGVwLT5jb250ZXh0KSA9PSBFUF9TVEFU RV9SVU5OSU5HKSB7CisJCWVwX3BhdXNlKHh1ZGMsIGVwLT5pbmRleCk7CisJCWVwX3dhaXRfZm9y X2luYWN0aXZlKHh1ZGMsIGVwLT5pbmRleCk7CisJfQorCisJZGVxX3RyYiA9IHRyYl9waHlzX3Rv X3ZpcnQoZXAsIGVwX2N0eF9yZWFkX2RlcV9wdHIoZXAtPmNvbnRleHQpKTsKKwkvKiBJcyB0aGUg aGFyZHdhcmUgcHJvY2Vzc2luZyB0aGUgVFJCIGF0IHRoZSBkZXF1ZXVlIHBvaW50ZXI/ICovCisJ YnVzeSA9ICh0cmJfcmVhZF9jeWNsZShkZXFfdHJiKSA9PSBlcF9jdHhfcmVhZF9kY3MoZXAtPmNv bnRleHQpKTsKKworCWlmICh0cmJfaW5fcmVxdWVzdChlcCwgcmVxLCBkZXFfdHJiKSAmJiBidXN5 KSB7CisJCS8qCisJCSAqIFJlcXVlc3QgaGFzIGJlZW4gcGFydGlhbGx5IGNvbXBsZXRlZCBvciBp dCBoYXNuJ3QKKwkJICogc3RhcnRlZCBwcm9jZXNzaW5nIHlldC4KKwkJICovCisJCWRtYV9hZGRy X3QgZGVxX3B0cjsKKworCQlzcXVlZXplX3RyYW5zZmVyX3JpbmcoZXAsIHJlcSk7CisKKwkJcmVx LT51c2JfcmVxLmFjdHVhbCA9IGVwX2N0eF9yZWFkX2VkdGxhKGVwLT5jb250ZXh0KTsKKwkJdGVn cmFfeHVkY19yZXFfZG9uZShlcCwgcmVxLCAtRUNPTk5SRVNFVCk7CisJCWtpY2tfcXVldWUgPSB0 cnVlOworCisJCS8qIEVEVExBIGlzID4gMDogcmVxdWVzdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29t cGxldGVkICovCisJCWlmIChyZXEtPnVzYl9yZXEuYWN0dWFsID4gMCkgeworCQkJLyoKKwkJCSAq IEFib3J0IHRoZSBwZW5kaW5nIHRyYW5zZmVyIGFuZCB1cGRhdGUgdGhlIGRlcXVldWUKKwkJCSAq IHBvaW50ZXIKKwkJCSAqLworCQkJZXBfY3R4X3dyaXRlX2VkdGxhKGVwLT5jb250ZXh0LCAwKTsK KwkJCWVwX2N0eF93cml0ZV9wYXJ0aWFsX3RkKGVwLT5jb250ZXh0LCAwKTsKKwkJCWVwX2N0eF93 cml0ZV9kYXRhX29mZnNldChlcC0+Y29udGV4dCwgMCk7CisKKwkJCWRlcV9wdHIgPSB0cmJfdmly dF90b19waHlzKGVwLAorCQkJCQkmZXAtPnRyYW5zZmVyX3JpbmdbZXAtPmVucV9wdHJdKTsKKwkJ CWVwX2N0eF93cml0ZV9kZXFfcHRyKGVwLT5jb250ZXh0LCBkZXFfcHRyKTsKKwkJCWVwX2N0eF93 cml0ZV9kY3MoZXAtPmNvbnRleHQsIGVwLT5wY3MpOworCisJCQllcF9yZWxvYWQoeHVkYywgZXAt PmluZGV4KTsKKwkJfQorCX0gZWxzZSBpZiAodHJiX2JlZm9yZV9yZXF1ZXN0KGVwLCByZXEsIGRl cV90cmIpICYmIGJ1c3kpIHsKKwkJLyogUmVxdWVzdCBoYXNuJ3Qgc3RhcnRlZCBwcm9jZXNzaW5n IHlldC4gKi8KKwkJc3F1ZWV6ZV90cmFuc2Zlcl9yaW5nKGVwLCByZXEpOworCisJCXRlZ3JhX3h1 ZGNfcmVxX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOworCQlraWNrX3F1ZXVlID0gdHJ1ZTsK Kwl9IGVsc2UgeworCQkvKgorCQkgKiBSZXF1ZXN0IGhhcyBjb21wbGV0ZWQsIGJ1dCB3ZSBoYXZl bid0IHByb2Nlc3NlZCB0aGUKKwkJICogY29tcGxldGlvbiBldmVudCB5ZXQuCisJCSAqLworCQl0 ZWdyYV94dWRjX3JlcV9kb25lKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKKwkJcmV0ID0gLUVJTlZB TDsKKwl9CisKKwkvKiBSZXN1bWUgdGhlIGVuZHBvaW50LiAqLworCWVwX3VucGF1c2UoeHVkYywg ZXAtPmluZGV4KTsKKworCWlmIChraWNrX3F1ZXVlKQorCQl0ZWdyYV94dWRjX2VwX2tpY2tfcXVl dWUoZXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludAordGVncmFfeHVkY19lcF9k ZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVx KQoreworCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgdGVncmFfeHVk Y19lcCAqZXA7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKwlpbnQgcmV0OworCisJaWYgKCF1c2JfZXAgfHwgIXVzYl9yZXEpCisJCXJldHVybiAtRUlO VkFMOworCWVwID0gdG9feHVkY19lcCh1c2JfZXApOworCXJlcSA9IHRvX3h1ZGNfcmVxKHVzYl9y ZXEpOworCXh1ZGMgPSBlcC0+eHVkYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2Nr LCBmbGFncyk7CisJaWYgKHh1ZGMtPnBvd2VyZ2F0ZWQgfHwgIWVwLT5kZXNjKSB7CisJCXJldCA9 IC1FU0hVVERPV047CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQgPSBfX3RlZ3JhX3h1ZGNfZXBf ZGVxdWV1ZShlcCwgcmVxKTsKK3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4dWRj LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9fdGVncmFf eHVkY19lcF9zZXRfaGFsdChzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsIGJvb2wgaGFsdCkKK3sK KwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOworCisJaWYgKCFlcC0+ZGVzYykK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhlcC0+ZGVz YykpIHsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJjYW4ndCBoYWx0IGlzY29oIGVwXG4iKTsKKwkJ cmV0dXJuIC1FTk9UU1VQUDsKKwl9CisKKwlpZiAoISEoeHVkY19yZWFkbCh4dWRjLCBFUF9IQUxU KSAmIEJJVChlcC0+aW5kZXgpKSA9PSBoYWx0KSB7CisJCWRldl9kYmcoeHVkYy0+ZGV2LCAiZXAg JXUgYWxyZWFkeSAlc1xuIiwgZXAtPmluZGV4LAorCQkJaGFsdCA/ICJoYWx0ZWQiIDogIm5vdCBo YWx0ZWQiKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGhhbHQpIHsKKwkJZXBfaGFsdCh4dWRj LCBlcC0+aW5kZXgpOworCX0gZWxzZSB7CisJCWVwX2N0eF93cml0ZV9zdGF0ZShlcC0+Y29udGV4 dCwgRVBfU1RBVEVfRElTQUJMRUQpOworCisJCWVwX3JlbG9hZCh4dWRjLCBlcC0+aW5kZXgpOwor CisJCWVwX2N0eF93cml0ZV9zdGF0ZShlcC0+Y29udGV4dCwgRVBfU1RBVEVfUlVOTklORyk7CisJ CWVwX2N0eF93cml0ZV9zZXFfbnVtKGVwLT5jb250ZXh0LCAwKTsKKworCQllcF9yZWxvYWQoeHVk YywgZXAtPmluZGV4KTsKKwkJZXBfdW5wYXVzZSh4dWRjLCBlcC0+aW5kZXgpOworCQllcF91bmhh bHQoeHVkYywgZXAtPmluZGV4KTsKKworCQl0ZWdyYV94dWRjX2VwX3JpbmdfZG9vcmJlbGwoZXAp OworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXBfc2V0X2hh bHQoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IHRlZ3JhX3h1 ZGNfZXAgKmVwOworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjOworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisJaW50IHJldDsKKworCWlmICghdXNiX2VwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWVw ID0gdG9feHVkY19lcCh1c2JfZXApOworCXh1ZGMgPSBlcC0+eHVkYzsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKHh1ZGMtPnBvd2VyZ2F0ZWQpIHsKKwkJ cmV0ID0gLUVTSFVURE9XTjsKKwkJZ290byB1bmxvY2s7CisJfQorCWlmICh2YWx1ZSAmJiB1c2Jf ZW5kcG9pbnRfZGlyX2luKGVwLT5kZXNjKSAmJgorCSAgICAhbGlzdF9lbXB0eSgmZXAtPnF1ZXVl KSkgeworCQlkZXZfZXJyKHh1ZGMtPmRldiwgImNhbid0IGhhbHQgZXAgd2l0aCByZXF1ZXN0cyBw ZW5kaW5nXG4iKTsKKwkJcmV0ID0gLUVBR0FJTjsKKwkJZ290byB1bmxvY2s7CisJfQorCXJldCA9 IF9fdGVncmFfeHVkY19lcF9zZXRfaGFsdChlcCwgdmFsdWUpOwordW5sb2NrOgorCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisK K3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZXBfY29udGV4dF9zZXR1cChzdHJ1Y3QgdGVncmFfeHVk Y19lcCAqZXApCit7CisJY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNj ID0gZXAtPmRlc2M7CisJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKmNv bXBfZGVzYyA9IGVwLT5jb21wX2Rlc2M7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+ eHVkYzsKKwl1MTYgbWF4cGFja2V0LCBtYXhidXJzdCA9IDAsIGVzaXQgPSAwOworCXUzMiB2YWw7 CisKKwltYXhwYWNrZXQgPSB1c2JfZW5kcG9pbnRfbWF4cChkZXNjKSAmIDB4N2ZmOworCWlmICh4 dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB7CisJCWlmICghdXNiX2VuZHBv aW50X3hmZXJfY29udHJvbChkZXNjKSkKKwkJCW1heGJ1cnN0ID0gY29tcF9kZXNjLT5iTWF4QnVy c3Q7CisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZGVzYykgfHwgdXNiX2VuZHBvaW50X3hm ZXJfaXNvYyhkZXNjKSkKKwkJCWVzaXQgPSBsZTE2X3RvX2NwdShjb21wX2Rlc2MtPndCeXRlc1Bl ckludGVydmFsKTsKKwl9IGVsc2UgaWYgKCh4dWRjLT5nYWRnZXQuc3BlZWQgPCBVU0JfU1BFRURf U1VQRVIpICYmCisJCSAgICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZGVzYykgfHwKKwkJICAgIHVz Yl9lbmRwb2ludF94ZmVyX2lzb2MoZGVzYykpKSB7CisJCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQg PT0gVVNCX1NQRUVEX0hJR0gpIHsKKwkJCW1heGJ1cnN0ID0gKHVzYl9lbmRwb2ludF9tYXhwKGRl c2MpID4+IDExKSAmIDB4MzsKKwkJCWlmIChtYXhidXJzdCA9PSAweDMpIHsKKwkJCQlkZXZfd2Fy bih4dWRjLT5kZXYsCisJCQkJCSAiaW52YWxpZCBlbmRwb2ludCBtYXhidXJzdFxuIik7CisJCQkJ bWF4YnVyc3QgPSAweDI7CisJCQl9CisJCX0KKwkJZXNpdCA9IG1heHBhY2tldCAqIChtYXhidXJz dCArIDEpOworCX0KKworCW1lbXNldChlcC0+Y29udGV4dCwgMCwgc2l6ZW9mKCplcC0+Y29udGV4 dCkpOworCisJZXBfY3R4X3dyaXRlX3N0YXRlKGVwLT5jb250ZXh0LCBFUF9TVEFURV9SVU5OSU5H KTsKKwllcF9jdHhfd3JpdGVfaW50ZXJ2YWwoZXAtPmNvbnRleHQsIGRlc2MtPmJJbnRlcnZhbCk7 CisJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpIHsKKwkJaWYgKHVz Yl9lbmRwb2ludF94ZmVyX2lzb2MoZGVzYykpIHsKKwkJCWVwX2N0eF93cml0ZV9tdWx0KGVwLT5j b250ZXh0LAorCQkJCQkgIGNvbXBfZGVzYy0+Ym1BdHRyaWJ1dGVzICYgMHgzKTsKKwkJfQorCQlp ZiAodXNiX2VuZHBvaW50X3hmZXJfYnVsayhkZXNjKSkgeworCQkJZXBfY3R4X3dyaXRlX21heF9w c3RyZWFtcyhlcC0+Y29udGV4dCwKKwkJCQkJCSAgY29tcF9kZXNjLT5ibUF0dHJpYnV0ZXMgJgor CQkJCQkJICAweDFmKTsKKwkJCWVwX2N0eF93cml0ZV9sc2EoZXAtPmNvbnRleHQsIDEpOworCQl9 CisJfQorCisJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGRlc2MpICYmIHVzYl9lbmRw b2ludF9kaXJfb3V0KGRlc2MpKQorCQl2YWwgPSB1c2JfZW5kcG9pbnRfdHlwZShkZXNjKTsKKwll bHNlCisJCXZhbCA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2MpICsgRVBfVFlQRV9DT05UUk9MOwor CWVwX2N0eF93cml0ZV90eXBlKGVwLT5jb250ZXh0LCB2YWwpOworCWVwX2N0eF93cml0ZV9jZXJy KGVwLT5jb250ZXh0LCAweDMpOworCWVwX2N0eF93cml0ZV9tYXhfcGFja2V0X3NpemUoZXAtPmNv bnRleHQsIG1heHBhY2tldCk7CisJZXBfY3R4X3dyaXRlX21heF9idXJzdF9zaXplKGVwLT5jb250 ZXh0LCBtYXhidXJzdCk7CisKKwllcF9jdHhfd3JpdGVfZGVxX3B0cihlcC0+Y29udGV4dCwgZXAt PnRyYW5zZmVyX3JpbmdfcGh5cyk7CisJZXBfY3R4X3dyaXRlX2RjcyhlcC0+Y29udGV4dCwgZXAt PnBjcyk7CisKKwkvKiBTZWxlY3QgYSByZWFzb25hYmxlIGF2ZXJhZ2UgVFJCIGxlbmd0aCBiYXNl ZCBvbiBlbmRwb2ludCB0eXBlLiAqLworCXN3aXRjaCAodXNiX2VuZHBvaW50X3R5cGUoZGVzYykp IHsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0w6CisJCXZhbCA9IDg7CisJCWJyZWFr OworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQl2YWwgPSAxMDI0OworCQlicmVhazsK KwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9J U09DOgorCWRlZmF1bHQ6CisJCXZhbCA9IDMwNzI7CisJCWJyZWFrOworCX0KKwllcF9jdHhfd3Jp dGVfYXZnX3RyYl9sZW4oZXAtPmNvbnRleHQsIHZhbCk7CisJZXBfY3R4X3dyaXRlX21heF9lc2l0 X3BheWxvYWQoZXAtPmNvbnRleHQsIGVzaXQpOworCisJZXBfY3R4X3dyaXRlX2NlcnJjbnQoZXAt PmNvbnRleHQsIDB4Myk7Cit9CisKK3N0YXRpYyB2b2lkIHNldHVwX2xpbmtfdHJiKHN0cnVjdCB0 ZWdyYV94dWRjX2VwICplcCwKKwkJCSAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQorewor CXRyYl93cml0ZV9kYXRhX3B0cih0cmIsIGVwLT50cmFuc2Zlcl9yaW5nX3BoeXMpOworCXRyYl93 cml0ZV90eXBlKHRyYiwgVFJCX1RZUEVfTElOSyk7CisJdHJiX3dyaXRlX3RvZ2dsZV9jeWNsZSh0 cmIsIDEpOworfQorCitzdGF0aWMgaW50IF9fdGVncmFfeHVkY19lcF9kaXNhYmxlKHN0cnVjdCB0 ZWdyYV94dWRjX2VwICplcCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRj OworCisJaWYgKGVwX2N0eF9yZWFkX3N0YXRlKGVwLT5jb250ZXh0KSA9PSBFUF9TVEFURV9ESVNB QkxFRCkgeworCQlkZXZfZXJyKHh1ZGMtPmRldiwgImVuZHBvaW50ICV1IGFscmVhZHkgZGlzYWJs ZWRcbiIsCisJCQllcC0+aW5kZXgpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJZXBfY3R4X3dy aXRlX3N0YXRlKGVwLT5jb250ZXh0LCBFUF9TVEFURV9ESVNBQkxFRCk7CisKKwllcF9yZWxvYWQo eHVkYywgZXAtPmluZGV4KTsKKworCXRlZ3JhX3h1ZGNfZXBfbnVrZShlcCwgLUVTSFVURE9XTik7 CisKKwl4dWRjLT5ucl9lbmFibGVkX2Vwcy0tOworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29j KGVwLT5kZXNjKSkKKwkJeHVkYy0+bnJfaXNvY2hfZXBzLS07CisKKwllcC0+ZGVzYyA9IE5VTEw7 CisJZXAtPmNvbXBfZGVzYyA9IE5VTEw7CisKKwltZW1zZXQoZXAtPmNvbnRleHQsIDAsIHNpemVv ZigqZXAtPmNvbnRleHQpKTsKKworCWVwX3VucGF1c2UoeHVkYywgZXAtPmluZGV4KTsKKwllcF91 bmhhbHQoeHVkYywgZXAtPmluZGV4KTsKKwlpZiAoeHVkY19yZWFkbCh4dWRjLCBFUF9TVE9QUEVE KSAmIEJJVChlcC0+aW5kZXgpKQorCQl4dWRjX3dyaXRlbCh4dWRjLCBCSVQoZXAtPmluZGV4KSwg RVBfU1RPUFBFRCk7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgdGhlIGxhc3QgZW5kcG9pbnQgZGlz YWJsZWQgaW4gYSBkZS1jb25maWd1cmUgcmVxdWVzdCwKKwkgKiBzd2l0Y2ggYmFjayB0byBhZGRy ZXNzIHN0YXRlLgorCSAqLworCWlmICgoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9D T05GSUdVUkVEKSAmJgorCSAgICAoeHVkYy0+bnJfZW5hYmxlZF9lcHMgPT0gMSkpIHsKKwkJdTMy IHZhbDsKKworCQl4dWRjLT5kZXZpY2Vfc3RhdGUgPSBVU0JfU1RBVEVfQUREUkVTUzsKKwkJdXNi X2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ZGV2aWNlX3N0YXRlKTsKKwor CQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOworCQl2YWwgJj0gfkNUUkxfUlVOOworCQl4 dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENUUkwpOworCX0KKworCWRldl9pbmZvKHh1ZGMtPmRldiwg ImVwICV1IGRpc2FibGVkXG4iLCBlcC0+aW5kZXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgdGVncmFfeHVkY19lcF9kaXNhYmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCkKK3sKKwlz dHJ1Y3QgdGVncmFfeHVkY19lcCAqZXA7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKCF1c2JfZXApCisJCXJldHVybiAt RUlOVkFMOworCisJZXAgPSB0b194dWRjX2VwKHVzYl9lcCk7CisJeHVkYyA9IGVwLT54dWRjOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoeHVkYy0+cG93 ZXJnYXRlZCkgeworCQlyZXQgPSAtRVNIVVRET1dOOworCQlnb3RvIHVubG9jazsKKwl9CisJcmV0 ID0gX190ZWdyYV94dWRjX2VwX2Rpc2FibGUoZXApOwordW5sb2NrOgorCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRp YyBpbnQgX190ZWdyYV94dWRjX2VwX2VuYWJsZShzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCisJ CQkJICBjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3Ry dWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIg dmFsOworCisJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIgJiYKKwkJ IXVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZGVzYykgJiYgIWVwLT51c2JfZXAuY29tcF9kZXNj KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpc2FibGUgdGhlIEVQIGlmIGl0IGlzIG5vdCBk aXNhYmxlZCAqLworCWlmIChlcF9jdHhfcmVhZF9zdGF0ZShlcC0+Y29udGV4dCkgIT0gRVBfU1RB VEVfRElTQUJMRUQpCisJCV9fdGVncmFfeHVkY19lcF9kaXNhYmxlKGVwKTsKKworCWVwLT5kZXNj ID0gZGVzYzsKKwllcC0+Y29tcF9kZXNjID0gZXAtPnVzYl9lcC5jb21wX2Rlc2M7CisKKwlpZiAo dXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkgeworCQlpZiAoeHVkYy0+bnJfaXNvY2hfZXBz ID4gWFVEQ19NQVhfSVNPQ0hfRVBTKSB7CisJCQlkZXZfZXJyKHh1ZGMtPmRldiwgInRvbyBtYW55 IGlzb2NoIGVuZHBvaW50c1xuIik7CisJCQlyZXR1cm4gLUVCVVNZOworCQl9CisJCXh1ZGMtPm5y X2lzb2NoX2VwcysrOworCX0KKworCW1lbXNldChlcC0+dHJhbnNmZXJfcmluZywgMCwgWFVEQ19U UkFOU0ZFUl9SSU5HX1NJWkUgKgorCSAgICAgICBzaXplb2YoKmVwLT50cmFuc2Zlcl9yaW5nKSk7 CisJc2V0dXBfbGlua190cmIoZXAsICZlcC0+dHJhbnNmZXJfcmluZ1tYVURDX1RSQU5TRkVSX1JJ TkdfU0laRSAtIDFdKTsKKworCWVwLT5lbnFfcHRyID0gMDsKKwllcC0+ZGVxX3B0ciA9IDA7CisJ ZXAtPnBjcyA9IHRydWU7CisJZXAtPnJpbmdfZnVsbCA9IGZhbHNlOworCXh1ZGMtPm5yX2VuYWJs ZWRfZXBzKys7CisKKwl0ZWdyYV94dWRjX2VwX2NvbnRleHRfc2V0dXAoZXApOworCisJLyoKKwkg KiBObyBuZWVkIHRvIHJlbG9hZCBhbmQgdW4taGFsdCBFUDAuICBUaGlzIHdpbGwgYmUgZG9uZSBh dXRvbWF0aWNhbGx5CisJICogb25jZSBhIHZhbGlkIFNFVFVQIHBhY2tldCBpcyByZWNlaXZlZC4K KwkgKi8KKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChkZXNjKSkKKwkJZ290byBvdXQ7 CisKKwkvKgorCSAqIFRyYW5zaXRpb24gdG8gY29uZmlndXJlZCBzdGF0ZSBvbmNlIHRoZSBmaXJz dCBub24tY29udHJvbAorCSAqIGVuZHBvaW50IGlzIGVuYWJsZWQuCisJICovCisJaWYgKHh1ZGMt PmRldmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfQUREUkVTUykgeworCQl2YWwgPSB4dWRjX3JlYWRs KHh1ZGMsIENUUkwpOworCQl2YWwgfD0gQ1RSTF9SVU47CisJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZh bCwgQ1RSTCk7CisKKwkJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0NPTkZJR1VSRUQ7 CisJCXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0 ZSk7CisJfQorCisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZGVzYykpIHsKKwkJLyoKKwkJ ICogUGF1c2UgYWxsIGJ1bGsgZW5kcG9pbnRzIHdoZW4gZW5hYmxpbmcgYW4gaXNvY2ggZW5kcG9p bnQKKwkJICogdG8gZW5zdXJlIHRoZSBpc29jaCBlbmRwb2ludCBpcyBhbGxvY2F0ZWQgZW5vdWdo IGJhbmR3aWR0aC4KKwkJICovCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVw KTsgaSsrKSB7CisJCQlpZiAoeHVkYy0+ZXBbaV0uZGVzYyAmJgorCQkJICAgIHVzYl9lbmRwb2lu dF94ZmVyX2J1bGsoeHVkYy0+ZXBbaV0uZGVzYykpCisJCQkJZXBfcGF1c2UoeHVkYywgaSk7CisJ CX0KKwl9CisKKwllcF9yZWxvYWQoeHVkYywgZXAtPmluZGV4KTsKKwllcF91bnBhdXNlKHh1ZGMs IGVwLT5pbmRleCk7CisJZXBfdW5oYWx0KHh1ZGMsIGVwLT5pbmRleCk7CisKKwlpZiAodXNiX2Vu ZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkgeworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4 dWRjLT5lcCk7IGkrKykgeworCQkJaWYgKHh1ZGMtPmVwW2ldLmRlc2MgJiYKKwkJCSAgICB1c2Jf ZW5kcG9pbnRfeGZlcl9idWxrKHh1ZGMtPmVwW2ldLmRlc2MpKQorCQkJCWVwX3VucGF1c2UoeHVk YywgaSk7CisJCX0KKwl9CisKK291dDoKKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJlcCAldSAodHlw ZTogJWQsIGRpcjogJXMpIGVuYWJsZWRcbiIsIGVwLT5pbmRleCwKKwkJIHVzYl9lbmRwb2ludF90 eXBlKGVwLT5kZXNjKSwKKwkJIHVzYl9lbmRwb2ludF9kaXJfaW4oZXAtPmRlc2MpID8gImluIiA6 ICJvdXQiKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXBfZW5h YmxlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwKKwkJCQljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50 X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwOworCXN0cnVj dCB0ZWdyYV94dWRjICp4dWRjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKKwor CWlmICAoIXVzYl9lcCB8fCAhZGVzYyB8fCAoZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9E VF9FTkRQT0lOVCkpCisJCXJldHVybiAtRUlOVkFMOworCisJZXAgPSB0b194dWRjX2VwKHVzYl9l cCk7CisJeHVkYyA9IGVwLT54dWRjOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ss IGZsYWdzKTsKKwlpZiAoeHVkYy0+cG93ZXJnYXRlZCkgeworCQlyZXQgPSAtRVNIVVRET1dOOwor CQlnb3RvIHVubG9jazsKKwl9CisJcmV0ID0gX190ZWdyYV94dWRjX2VwX2VuYWJsZShlcCwgZGVz Yyk7Cit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3Mp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfcmVxdWVzdCAqCit0ZWdy YV94dWRjX2VwX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdXNiX2VwLCBnZnBfdCBnZnAp Cit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxOworCisJcmVxID0ga3phbGxvYyhz aXplb2YoKnJlcSksIGdmcCk7CisJaWYgKCFyZXEpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9M SVNUX0hFQUQoJnJlcS0+bGlzdCk7CisKKwlyZXR1cm4gJnJlcS0+dXNiX3JlcTsKK30KKworc3Rh dGljIHZvaWQgdGVncmFfeHVkY19lcF9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdXNiX2Vw LAorCQkJCSAgICAgICBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVzYl9yZXEpCit7CisJc3RydWN0IHRl Z3JhX3h1ZGNfcmVxdWVzdCAqcmVxID0gdG9feHVkY19yZXEodXNiX3JlcSk7CisKKwlrZnJlZShy ZXEpOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9lcF9vcHMgdGVncmFfeHVkY19lcF9vcHMgPSB7 CisJLmVuYWJsZSA9IHRlZ3JhX3h1ZGNfZXBfZW5hYmxlLAorCS5kaXNhYmxlID0gdGVncmFfeHVk Y19lcF9kaXNhYmxlLAorCS5hbGxvY19yZXF1ZXN0ID0gdGVncmFfeHVkY19lcF9hbGxvY19yZXF1 ZXN0LAorCS5mcmVlX3JlcXVlc3QgPSB0ZWdyYV94dWRjX2VwX2ZyZWVfcmVxdWVzdCwKKwkucXVl dWUgPSB0ZWdyYV94dWRjX2VwX3F1ZXVlLAorCS5kZXF1ZXVlID0gdGVncmFfeHVkY19lcF9kZXF1 ZXVlLAorCS5zZXRfaGFsdCA9IHRlZ3JhX3h1ZGNfZXBfc2V0X2hhbHQsCit9OworCitzdGF0aWMg aW50IHRlZ3JhX3h1ZGNfZXAwX2VuYWJsZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsCisJCQkJIGNv bnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlyZXR1cm4gLUVJ TlZBTDsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2VwMF9kaXNhYmxlKHN0cnVjdCB1c2Jf ZXAgKnVzYl9lcCkKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIHN0cnVjdCB1c2Jf ZXBfb3BzIHRlZ3JhX3h1ZGNfZXAwX29wcyA9IHsKKwkuZW5hYmxlID0gdGVncmFfeHVkY19lcDBf ZW5hYmxlLAorCS5kaXNhYmxlID0gdGVncmFfeHVkY19lcDBfZGlzYWJsZSwKKwkuYWxsb2NfcmVx dWVzdCA9IHRlZ3JhX3h1ZGNfZXBfYWxsb2NfcmVxdWVzdCwKKwkuZnJlZV9yZXF1ZXN0ID0gdGVn cmFfeHVkY19lcF9mcmVlX3JlcXVlc3QsCisJLnF1ZXVlID0gdGVncmFfeHVkY19lcF9xdWV1ZSwK KwkuZGVxdWV1ZSA9IHRlZ3JhX3h1ZGNfZXBfZGVxdWV1ZSwKKwkuc2V0X2hhbHQgPSB0ZWdyYV94 dWRjX2VwX3NldF9oYWx0LAorfTsKKworc3RhdGljIGludCB0ZWdyYV94dWRjX2dhZGdldF9nZXRf ZnJhbWUoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCWlmICh4dWRjLT5w b3dlcmdhdGVkKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8gdW5sb2NrOworCX0KKwly ZXQgPSAoeHVkY19yZWFkbCh4dWRjLCBNRklOREVYKSA+PiBNRklOREVYX0ZSQU1FX1NISUZUKSAm CisJCU1GSU5ERVhfRlJBTUVfTUFTSzsKK3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZ4dWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0 ZWdyYV94dWRjX3Jlc3VtZV9kZXZpY2Vfc3RhdGUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7 CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHZhbDsKKworCWVwX3VucGF1c2VfYWxsKHh1ZGMpOwor CisJLyogRGlyZWN0IGxpbmsgdG8gVTAuICovCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JU U0MpOworCWlmICgoKHZhbCA+PiBQT1JUU0NfUExTX1NISUZUKSAmIFBPUlRTQ19QTFNfTUFTSykg IT0gUE9SVFNDX1BMU19VMCkgeworCQl2YWwgJj0gfihQT1JUU0NfQ0hBTkdFX01BU0sgfAorCQkJ IChQT1JUU0NfUExTX01BU0sgPDwgUE9SVFNDX1BMU19TSElGVCkpOworCQl2YWwgfD0gUE9SVFND X0xXUyB8IChQT1JUU0NfUExTX1UwIDw8IFBPUlRTQ19QTFNfU0hJRlQpOworCQl4dWRjX3dyaXRl bCh4dWRjLCB2YWwsIFBPUlRTQyk7CisJfQorCisJaWYgKHh1ZGMtPmRldmljZV9zdGF0ZSA9PSBV U0JfU1RBVEVfU1VTUEVOREVEKSB7CisJCXh1ZGMtPmRldmljZV9zdGF0ZSA9IHh1ZGMtPnJlc3Vt ZV9zdGF0ZTsKKwkJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ZGV2 aWNlX3N0YXRlKTsKKwkJeHVkYy0+cmVzdW1lX3N0YXRlID0gMDsKKwl9CisKKwkvKgorCSAqIERv b3JiZWxscyBtYXkgYmUgZHJvcHBlZCBpZiB0aGV5IGFyZSBzZW50IHRvbyBzb29uICg8IH4yMDBu cykKKwkgKiBhZnRlciB1bnBhdXNpbmcgdGhlIGVuZHBvaW50LiAgV2FpdCBmb3IgNTAwbnMganVz dCB0byBiZSBzYWZlLgorCSAqLworCW5kZWxheSg1MDApOworCWZvciAoaSA9IDA7IGkgPCBBUlJB WV9TSVpFKHh1ZGMtPmVwKTsgaSsrKQorCQl0ZWdyYV94dWRjX2VwX3JpbmdfZG9vcmJlbGwoJnh1 ZGMtPmVwW2ldKTsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2dhZGdldF93YWtldXAoc3Ry dWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHRv X3h1ZGMoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCXUz MiB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCWlmICh4 dWRjLT5wb3dlcmdhdGVkKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8gdW5sb2NrOwor CX0KKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJZGV2X2RiZyh4dWRjLT5kZXYs ICIlczogUE9SVFBNPSUjeCwgc3BlZWQ9JXhcbiIsIF9fZnVuY19fLAorCQkJdmFsLCBnYWRnZXQt PnNwZWVkKTsKKwlpZiAoKCh4dWRjLT5nYWRnZXQuc3BlZWQgPD0gVVNCX1NQRUVEX0hJR0gpICYm CisJICAgICAodmFsICYgUE9SVFBNX1JXRSkpIHx8CisJICAgICgoeHVkYy0+Z2FkZ2V0LnNwZWVk ID09IFVTQl9TUEVFRF9TVVBFUikgJiYKKwkgICAgICh2YWwgJiBQT1JUUE1fRlJXRSkpKSB7CisJ CXRlZ3JhX3h1ZGNfcmVzdW1lX2RldmljZV9zdGF0ZSh4dWRjKTsKKworCQkvKiBTZW5kIERldmlj ZSBOb3RpZmljYXRpb24gcGFja2V0LiAqLworCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVT Ql9TUEVFRF9TVVBFUikgeworCQkJdmFsID0gKERFVk5PVElGX0xPX1RZUEVfRlVOQ1RJT05fV0FL RSA8PAorCQkJICAgICAgIERFVk5PVElGX0xPX1RZUEVfU0hJRlQpIHwgREVWTk9USUZfTE9fVFJJ RzsKKwkJCXh1ZGNfd3JpdGVsKHh1ZGMsIDAsIERFVk5PVElGX0hJKTsKKwkJCXh1ZGNfd3JpdGVs KHh1ZGMsIHZhbCwgREVWTk9USUZfTE8pOworCQl9CisJfQordW5sb2NrOgorCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0 YXRpYyBpbnQgdGVncmFfeHVkY19nYWRnZXRfcHVsbHVwKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRn ZXQsIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHRvX3h1ZGMoZ2Fk Z2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisKKwlwbV9ydW50aW1lX2dl dF9zeW5jKHh1ZGMtPmRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdz KTsKKwlpZiAoaXNfb24gIT0geHVkYy0+cHVsbHVwKSB7CisJCXZhbCA9IHh1ZGNfcmVhZGwoeHVk YywgQ1RSTCk7CisJCWlmIChpc19vbikKKwkJCXZhbCB8PSBDVFJMX0VOQUJMRTsKKwkJZWxzZQor CQkJdmFsICY9IH5DVFJMX0VOQUJMRTsKKwkJeHVkY193cml0ZWwoeHVkYywgdmFsLCBDVFJMKTsK Kwl9CisJeHVkYy0+cHVsbHVwID0gaXNfb247CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVk Yy0+bG9jaywgZmxhZ3MpOworCXBtX3J1bnRpbWVfcHV0KHh1ZGMtPmRldik7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2dhZGdldF9zdGFydChzdHJ1Y3QgdXNiX2dh ZGdldCAqZ2FkZ2V0LAorCQkJCSAgIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQor eworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gdG9feHVkYyhnYWRnZXQpOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKwlpbnQgcmV0OworCisJaWYgKCFkcml2ZXIpCisJCXJl dHVybiAtRUlOVkFMOworCisJZGV2X2RiZyh4dWRjLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOwor CisJcG1fcnVudGltZV9nZXRfc3luYyh4dWRjLT5kZXYpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKHh1ZGMtPmRyaXZlcikgeworCQlyZXQgPSAtRUJVU1k7 CisJCWdvdG8gdW5sb2NrOworCX0KKworCXh1ZGMtPnNldHVwX3N0YXRlID0gV0FJVF9GT1JfU0VU VVA7CisJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0RFRkFVTFQ7CisJdXNiX2dhZGdl dF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ZGV2aWNlX3N0YXRlKTsKKworCXJldCA9 IF9fdGVncmFfeHVkY19lcF9lbmFibGUoJnh1ZGMtPmVwWzBdLCAmdGVncmFfeHVkY19lcDBfZGVz Yyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gdW5sb2NrOworCisJdmFsID0geHVkY19yZWFkbCh4 dWRjLCBDVFJMKTsKKwl2YWwgfD0gQ1RSTF9JRSB8IENUUkxfTFNFOworCXh1ZGNfd3JpdGVsKHh1 ZGMsIHZhbCwgQ1RSTCk7CisKKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRIQUxUKTsKKwl2 YWwgfD0gUE9SVEhBTFRfU1RDSEdfSU5UUl9FTjsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBP UlRIQUxUKTsKKworCWlmICh4dWRjLT5wdWxsdXApIHsKKwkJdmFsID0geHVkY19yZWFkbCh4dWRj LCBDVFJMKTsKKwkJdmFsIHw9IENUUkxfRU5BQkxFOworCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWws IENUUkwpOworCX0KKworCXh1ZGMtPmRyaXZlciA9IGRyaXZlcjsKK3VubG9jazoKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJcG1fcnVudGltZV9wdXQoeHVk Yy0+ZGV2KTsKKwlkZXZfZGJnKHh1ZGMtPmRldiwgIiVzIGRvbmVcbiIsIF9fZnVuY19fKTsKKwly ZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZ2FkZ2V0X3N0b3Aoc3RydWN0 IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHRvX3h1 ZGMoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7CisKKwlwbV9ydW50 aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ss IGZsYWdzKTsKKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOworCXZhbCAmPSB+KENUUkxf SUUgfCBDVFJMX0VOQUJMRSk7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBDVFJMKTsKKworCV9f dGVncmFfeHVkY19lcF9kaXNhYmxlKCZ4dWRjLT5lcFswXSk7CisKKwl4dWRjLT5kcml2ZXIgPSBO VUxMOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlwbV9y dW50aW1lX3B1dCh4dWRjLT5kZXYpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVn cmFfeHVkY19zZXRfc2VsZnBvd2VyZWQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IGlz X29uKQoreworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gdG9feHVkYyhnYWRnZXQpOworCisJ ZGV2X2RiZyh4dWRjLT5kZXYsICIlczogJWRcbiIsIF9fZnVuY19fLCBpc19vbik7CisJeHVkYy0+ c2VsZnBvd2VyZWQgPSAhIWlzX29uOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qg dXNiX2dhZGdldF9vcHMgdGVncmFfeHVkY19nYWRnZXRfb3BzID0geworCS5nZXRfZnJhbWUgPSB0 ZWdyYV94dWRjX2dhZGdldF9nZXRfZnJhbWUsCisJLndha2V1cCA9IHRlZ3JhX3h1ZGNfZ2FkZ2V0 X3dha2V1cCwKKwkucHVsbHVwID0gdGVncmFfeHVkY19nYWRnZXRfcHVsbHVwLAorCS51ZGNfc3Rh cnQgPSB0ZWdyYV94dWRjX2dhZGdldF9zdGFydCwKKwkudWRjX3N0b3AgPSB0ZWdyYV94dWRjX2dh ZGdldF9zdG9wLAorCS5zZXRfc2VsZnBvd2VyZWQgPSB0ZWdyYV94dWRjX3NldF9zZWxmcG93ZXJl ZCwKK307CisKK3N0YXRpYyB2b2lkIG5vX29wX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBz dHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKK30KKworc3RhdGljIGludAordGVncmFfeHVkY19l cDBfcXVldWVfc3RhdHVzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAorCQl2b2lkICgqY21wbCko c3RydWN0IHVzYl9lcCAqLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKikpCit7CisJeHVkYy0+ZXAwX3Jl cS0+dXNiX3JlcS5idWYgPSBOVUxMOworCXh1ZGMtPmVwMF9yZXEtPnVzYl9yZXEuZG1hID0gMDsK Kwl4dWRjLT5lcDBfcmVxLT51c2JfcmVxLmxlbmd0aCA9IDA7CisJeHVkYy0+ZXAwX3JlcS0+dXNi X3JlcS5jb21wbGV0ZSA9IGNtcGw7CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5jb250ZXh0ID0g eHVkYzsKKworCXJldHVybiBfX3RlZ3JhX3h1ZGNfZXBfcXVldWUoJnh1ZGMtPmVwWzBdLCB4dWRj LT5lcDBfcmVxKTsKK30KKworc3RhdGljIGludAordGVncmFfeHVkY19lcDBfcXVldWVfZGF0YShz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdm9pZCAqYnVmLCBzaXplX3QgbGVuLAorCQl2b2lkICgq Y21wbCkoc3RydWN0IHVzYl9lcCAqLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKikpCit7CisJeHVkYy0+ ZXAwX3JlcS0+dXNiX3JlcS5idWYgPSBidWY7CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5sZW5n dGggPSBsZW47CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5jb21wbGV0ZSA9IGNtcGw7CisJeHVk Yy0+ZXAwX3JlcS0+dXNiX3JlcS5jb250ZXh0ID0geHVkYzsKKworCXJldHVybiBfX3RlZ3JhX3h1 ZGNfZXBfcXVldWUoJnh1ZGMtPmVwWzBdLCB4dWRjLT5lcDBfcmVxKTsKK30KKworc3RhdGljIHZv aWQgdGVncmFfeHVkY19lcDBfcmVxX2RvbmUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJ c3dpdGNoICh4dWRjLT5zZXR1cF9zdGF0ZSkgeworCWNhc2UgREFUQV9TVEFHRV9YRkVSOgorCQl4 dWRjLT5zZXR1cF9zdGF0ZSA9IFNUQVRVU19TVEFHRV9SRUNWOworCQl0ZWdyYV94dWRjX2VwMF9x dWV1ZV9zdGF0dXMoeHVkYywgbm9fb3BfY29tcGxldGUpOworCQlicmVhazsKKwljYXNlIERBVEFf U1RBR0VfUkVDVjoKKwkJeHVkYy0+c2V0dXBfc3RhdGUgPSBTVEFUVVNfU1RBR0VfWEZFUjsKKwkJ dGVncmFfeHVkY19lcDBfcXVldWVfc3RhdHVzKHh1ZGMsIG5vX29wX2NvbXBsZXRlKTsKKwkJYnJl YWs7CisJZGVmYXVsdDoKKwkJeHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKKwkJ YnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX2RlbGVnYXRlX3JlcShz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKKwkJCQkgICAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVz dCAqY3RybCkKK3sKKwlpbnQgcmV0OworCisJc3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOworCXJl dCA9IHh1ZGMtPmRyaXZlci0+c2V0dXAoJnh1ZGMtPmdhZGdldCwgY3RybCk7CisJc3Bpbl9sb2Nr KCZ4dWRjLT5sb2NrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mZWF0 dXJlX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkK K3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHJlcS0+Y29udGV4dDsKKworCWlmICh4dWRj LT50ZXN0X21vZGVfcGF0dGVybikgeworCQl4dWRjX3dyaXRlbCh4dWRjLCB4dWRjLT50ZXN0X21v ZGVfcGF0dGVybiwgUE9SVF9UTSk7CisJCXh1ZGMtPnRlc3RfbW9kZV9wYXR0ZXJuID0gMDsKKwl9 Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfc2V0X2ZlYXR1cmUoc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMsCisJCQkJICAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKK3sK Kwlib29sIHNldCA9IChjdHJsLT5iUmVxdWVzdCA9PSBVU0JfUkVRX1NFVF9GRUFUVVJFKTsKKwl1 MzIgZmVhdHVyZSA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisJdTMyIGluZGV4ID0gbGUx Nl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1MzIgdmFsLCBlcDsKKwlpbnQgcmV0OworCisJaWYg KGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJ c3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfUkVDSVBfTUFTSykgeworCWNhc2UgVVNC X1JFQ0lQX0RFVklDRToKKwkJc3dpdGNoIChmZWF0dXJlKSB7CisJCWNhc2UgVVNCX0RFVklDRV9S RU1PVEVfV0FLRVVQOgorCQkJaWYgKCh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NV UEVSKSB8fAorCQkJICAgICh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0RFRkFVTFQp KQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQ TSk7CisJCQlpZiAoc2V0KQorCQkJCXZhbCB8PSBQT1JUUE1fUldFOworCQkJZWxzZQorCQkJCXZh bCAmPSB+UE9SVFBNX1JXRTsKKwkJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKKwkJ CWJyZWFrOworCQljYXNlIFVTQl9ERVZJQ0VfVTFfRU5BQkxFOgorCQljYXNlIFVTQl9ERVZJQ0Vf VTJfRU5BQkxFOgorCQkJaWYgKCh4dWRjLT5kZXZpY2Vfc3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJ R1VSRUQpIHx8CisJCQkgICAgKHh1ZGMtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfU1VQRVIp KQorCQkJCXJldHVybiAtRUlOVkFMOworCisJCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQ TSk7CisJCQlpZiAoKGZlYXR1cmUgPT0gVVNCX0RFVklDRV9VMV9FTkFCTEUpICYmIHUxX2VuYWJs ZSkgeworCQkJCWlmIChzZXQpCisJCQkJCXZhbCB8PSBQT1JUUE1fVTFFOworCQkJCWVsc2UKKwkJ CQkJdmFsICY9IH5QT1JUUE1fVTFFOworCQkJfQorCQkJaWYgKChmZWF0dXJlID09IFVTQl9ERVZJ Q0VfVTJfRU5BQkxFKSAmJiB1Ml9lbmFibGUpIHsKKwkJCQlpZiAoc2V0KQorCQkJCQl2YWwgfD0g UE9SVFBNX1UyRTsKKwkJCQllbHNlCisJCQkJCXZhbCAmPSB+UE9SVFBNX1UyRTsKKwkJCX0KKwkJ CXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9E RVZJQ0VfVEVTVF9NT0RFOgorCQkJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURf SElHSCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICghc2V0KQorCQkJCXJldHVybiAtRUlO VkFMOworCisJCQl4dWRjLT50ZXN0X21vZGVfcGF0dGVybiA9IGluZGV4ID4+IDg7CisJCQlicmVh azsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJYnJlYWs7CisJY2Fz ZSBVU0JfUkVDSVBfSU5URVJGQUNFOgorCQlpZiAoeHVkYy0+ZGV2aWNlX3N0YXRlICE9IFVTQl9T VEFURV9DT05GSUdVUkVEKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJc3dpdGNoIChmZWF0dXJl KSB7CisJCWNhc2UgVVNCX0lOVFJGX0ZVTkNfU1VTUEVORDoKKwkJCWlmIChzZXQpIHsKKwkJCQl2 YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJCQkJaWYgKGluZGV4ICYgVVNCX0lOVFJG X0ZVTkNfU1VTUEVORF9SVykKKwkJCQkJdmFsIHw9IFBPUlRQTV9GUldFOworCQkJCWVsc2UKKwkJ CQkJdmFsICY9IH5QT1JUUE1fRlJXRTsKKwkJCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRQ TSk7CisJCQl9CisJCQlyZXR1cm4gdGVncmFfeHVkY19lcDBfZGVsZWdhdGVfcmVxKHh1ZGMsIGN0 cmwpOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKworCQlicmVhazsKKwlj YXNlIFVTQl9SRUNJUF9FTkRQT0lOVDoKKwkJZXAgPSAoaW5kZXggJiBVU0JfRU5EUE9JTlRfTlVN QkVSX01BU0spICogMiArCisJCQkoKGluZGV4ICYgVVNCX0RJUl9JTikgPyAxIDogMCk7CisKKwkJ aWYgKCh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0RFRkFVTFQpIHx8CisJCSAgICAo KHh1ZGMtPmRldmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfQUREUkVTUykgJiYKKwkJICAgICAoaW5k ZXggIT0gMCkpKQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJcmV0ID0gX190ZWdyYV94dWRjX2Vw X3NldF9oYWx0KCZ4dWRjLT5lcFtlcF0sIHNldCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJu IHJldDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0 dXJuIHRlZ3JhX3h1ZGNfZXAwX3F1ZXVlX3N0YXR1cyh4dWRjLCBzZXRfZmVhdHVyZV9jb21wbGV0 ZSk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfZ2V0X3N0YXR1cyhzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYywKKwkJCQkgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCit7 CisJc3RydWN0IHRlZ3JhX3h1ZGNfZXBfY29udGV4dCAqZXBfY3R4OworCXUzMiB2YWwsIGVwLCBp bmRleCA9IGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCk7CisJdTE2IHN0YXR1cyA9IDA7CisKKwlp ZiAoIShjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSkKKwkJcmV0dXJuIC1FSU5WQUw7 CisKKwlpZiAoKGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSkgIT0gMCkgfHwKKwkgICAgKGxlMTZf dG9fY3B1KGN0cmwtPndMZW5ndGgpICE9IDIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRj aCAoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1JFQ0lQX01BU0spIHsKKwljYXNlIFVTQl9SRUNJ UF9ERVZJQ0U6CisJCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFBNKTsKKworCQlpZiAoeHVk Yy0+c2VsZnBvd2VyZWQpCisJCQlzdGF0dXMgfD0gQklUKFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVE KTsKKworCQlpZiAoKHh1ZGMtPmdhZGdldC5zcGVlZCA8IFVTQl9TUEVFRF9TVVBFUikgJiYKKwkJ ICAgICh2YWwgJiBQT1JUUE1fUldFKSkKKwkJCXN0YXR1cyB8PSBCSVQoVVNCX0RFVklDRV9SRU1P VEVfV0FLRVVQKTsKKworCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBF UikgeworCQkJaWYgKHZhbCAmIFBPUlRQTV9VMUUpCisJCQkJc3RhdHVzIHw9IEJJVChVU0JfREVW X1NUQVRfVTFfRU5BQkxFRCk7CisJCQlpZiAodmFsICYgUE9SVFBNX1UyRSkKKwkJCQlzdGF0dXMg fD0gQklUKFVTQl9ERVZfU1RBVF9VMl9FTkFCTEVEKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFVT Ql9SRUNJUF9JTlRFUkZBQ0U6CisJCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVE X1NVUEVSKSB7CisJCQlzdGF0dXMgfD0gVVNCX0lOVFJGX1NUQVRfRlVOQ19SV19DQVA7CisJCQl2 YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJCQlpZiAodmFsICYgUE9SVFBNX0ZSV0Up CisJCQkJc3RhdHVzIHw9IFVTQl9JTlRSRl9TVEFUX0ZVTkNfUlc7CisJCX0KKwkJYnJlYWs7CisJ Y2FzZSBVU0JfUkVDSVBfRU5EUE9JTlQ6CisJCWVwID0gKGluZGV4ICYgVVNCX0VORFBPSU5UX05V TUJFUl9NQVNLKSAqIDIgKworCQkJKChpbmRleCAmIFVTQl9ESVJfSU4pID8gMSA6IDApOworCQll cF9jdHggPSAmeHVkYy0+ZXBfY29udGV4dFtlcF07CisKKwkJaWYgKCh4dWRjLT5kZXZpY2Vfc3Rh dGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpICYmCisJCSAgICAoKHh1ZGMtPmRldmljZV9zdGF0 ZSAhPSBVU0JfU1RBVEVfQUREUkVTUykgfHwgKGVwICE9IDApKSkKKwkJCXJldHVybiAtRUlOVkFM OworCisJCWlmIChlcF9jdHhfcmVhZF9zdGF0ZShlcF9jdHgpID09IEVQX1NUQVRFX0RJU0FCTEVE KQorCQkJcmV0dXJuIC1FSU5WQUw7CisKKwkJaWYgKHh1ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCkg JiBCSVQoZXApKQorCQkJc3RhdHVzIHw9IEJJVChVU0JfRU5EUE9JTlRfSEFMVCk7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXh1ZGMtPnN0YXR1c19idWYg PSBjcHVfdG9fbGUxNihzdGF0dXMpOworCXJldHVybiB0ZWdyYV94dWRjX2VwMF9xdWV1ZV9kYXRh KHh1ZGMsICZ4dWRjLT5zdGF0dXNfYnVmLAorCQkJCQkgc2l6ZW9mKHh1ZGMtPnN0YXR1c19idWYp LAorCQkJCQkgbm9fb3BfY29tcGxldGUpOworfQorCitzdGF0aWMgdm9pZCBzZXRfc2VsX2NvbXBs ZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKKwkvKiBO b3RoaW5nIHRvIGRvIHdpdGggU0VMIHZhbHVlcyAqLworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1 ZGNfZXAwX3NldF9zZWwoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCisJCQkJICBzdHJ1Y3QgdXNi X2N0cmxyZXF1ZXN0ICpjdHJsKQoreworCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gKFVTQl9E SVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSB8CisJCQkJICAgICBVU0JfVFlQRV9TVEFOREFSRCkp CisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHh1ZGMtPmRldmljZV9zdGF0ZSA9PSBVU0JfU1RB VEVfREVGQVVMVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGxlMTZfdG9fY3B1KGN0cmwt PndJbmRleCkgIT0gMCkgfHwKKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSkgIT0gMCkg fHwKKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpICE9IDYpKQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCXJldHVybiB0ZWdyYV94dWRjX2VwMF9xdWV1ZV9kYXRhKHh1ZGMsICZ4dWRjLT5z ZWxfdGltaW5nLAorCQkJCQkgc2l6ZW9mKHh1ZGMtPnNlbF90aW1pbmcpLAorCQkJCQkgc2V0X3Nl bF9jb21wbGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9pc29jaF9kZWxheV9jb21wbGV0ZShz dHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJLyogTm90aGlu ZyB0byBkbyB3aXRoIGlzb2NoIGRlbGF5ICovCit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19l cDBfc2V0X2lzb2NoX2RlbGF5KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAorCQkJCQkgIHN0cnVj dCB1c2JfY3RybHJlcXVlc3QgKmN0cmwpCit7CisJdTMyIGRlbGF5ID0gbGUxNl90b19jcHUoY3Ry bC0+d1ZhbHVlKTsKKworCWlmIChjdHJsLT5iUmVxdWVzdFR5cGUgIT0gKFVTQl9ESVJfT1VUIHwg VVNCX1JFQ0lQX0RFVklDRSB8CisJCQkJICAgVVNCX1RZUEVfU1RBTkRBUkQpKQorCQlyZXR1cm4g LUVJTlZBTDsKKworCWlmICgoZGVsYXkgPiA2NTUzNSkgfHwgKGxlMTZfdG9fY3B1KGN0cmwtPndJ bmRleCkgIT0gMCkgfHwKKwkgICAgKGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpICE9IDApKQor CQlyZXR1cm4gLUVJTlZBTDsKKworCXh1ZGMtPmlzb2NoX2RlbGF5ID0gZGVsYXk7CisKKwlyZXR1 cm4gdGVncmFfeHVkY19lcDBfcXVldWVfc3RhdHVzKHh1ZGMsIHNldF9pc29jaF9kZWxheV9jb21w bGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9hZGRyZXNzX2NvbXBsZXRlKHN0cnVjdCB1c2Jf ZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYyA9IHJlcS0+Y29udGV4dDsKKworCWlmICgoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9T VEFURV9ERUZBVUxUKSAmJgorCSAgICAoeHVkYy0+ZGV2X2FkZHIgIT0gMCkpIHsKKwkJeHVkYy0+ ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0FERFJFU1M7CisJCXVzYl9nYWRnZXRfc2V0X3N0YXRl KCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0ZSk7CisJfSBlbHNlIGlmICgoeHVkYy0+ ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9BRERSRVNTKSAmJgorCQkgICAoeHVkYy0+ZGV2X2Fk ZHIgPT0gMCkpIHsKKwkJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0RFRkFVTFQ7CisJ CXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0ZSk7 CisJfQorfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX3NldF9hZGRyZXNzKHN0cnVjdCB0 ZWdyYV94dWRjICp4dWRjLAorCQkJCSAgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwp Cit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwMCA9ICZ4dWRjLT5lcFswXTsKKwl1MzIgdmFs LCBhZGRyID0gbGUxNl90b19jcHUoY3RybC0+d1ZhbHVlKTsKKworCWlmIChjdHJsLT5iUmVxdWVz dFR5cGUgIT0gKFVTQl9ESVJfT1VUIHwgVVNCX1JFQ0lQX0RFVklDRSB8CisJCQkJICAgICBVU0Jf VFlQRV9TVEFOREFSRCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChhZGRyID4gMTI3KSB8 fCAobGUxNl90b19jcHUoY3RybC0+d0luZGV4KSAhPSAwKSB8fAorCSAgICAobGUxNl90b19jcHUo Y3RybC0+d0xlbmd0aCkgIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKHh1ZGMtPmRl dmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfQ09ORklHVVJFRCkKKwkJcmV0dXJuIC1FSU5WQUw7CisK KwlkZXZfZGJnKHh1ZGMtPmRldiwgInNldCBhZGRyZXNzOiAldVxuIiwgYWRkcik7CisKKwl4dWRj LT5kZXZfYWRkciA9IGFkZHI7CisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDVFJMKTsKKwl2YWwg Jj0gfihDVFJMX0RFVkFERFJfTUFTSyA8PCBDVFJMX0RFVkFERFJfU0hJRlQpOworCXZhbCB8PSBh ZGRyIDw8IENUUkxfREVWQUREUl9TSElGVDsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENUUkwp OworCisJZXBfY3R4X3dyaXRlX2RldmFkZHIoZXAwLT5jb250ZXh0LCBhZGRyKTsKKworCXJldHVy biB0ZWdyYV94dWRjX2VwMF9xdWV1ZV9zdGF0dXMoeHVkYywgc2V0X2FkZHJlc3NfY29tcGxldGUp OworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX3N0YW5kYXJkX3JlcShzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYywKKwkJCQkgICAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQor eworCWludCByZXQ7CisKKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0KSB7CisJY2FzZSBVU0JfUkVR X0dFVF9TVEFUVVM6CisJCWRldl9kYmcoeHVkYy0+ZGV2LCAiVVNCX1JFUV9HRVRfU1RBVFVTXG4i KTsKKwkJcmV0ID0gdGVncmFfeHVkY19lcDBfZ2V0X3N0YXR1cyh4dWRjLCBjdHJsKTsKKwkJYnJl YWs7CisJY2FzZSBVU0JfUkVRX1NFVF9BRERSRVNTOgorCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVT Ql9SRVFfU0VUX0FERFJFU1NcbiIpOworCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9zZXRfYWRkcmVz cyh4dWRjLCBjdHJsKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX1NFVF9TRUw6CisJCWRldl9k YmcoeHVkYy0+ZGV2LCAiVVNCX1JFUV9TRVRfU0VMXG4iKTsKKwkJcmV0ID0gdGVncmFfeHVkY19l cDBfc2V0X3NlbCh4dWRjLCBjdHJsKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX1NFVF9JU09D SF9ERUxBWToKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJVU0JfUkVRX1NFVF9JU09DSF9ERUxBWVxu Iik7CisJCXJldCA9IHRlZ3JhX3h1ZGNfZXAwX3NldF9pc29jaF9kZWxheSh4dWRjLCBjdHJsKTsK KwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJY2FzZSBVU0JfUkVRX1NF VF9GRUFUVVJFOgorCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVTQl9SRVFfQ0xFQVIvU0VUX0ZFQVRV UkVcbiIpOworCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9zZXRfZmVhdHVyZSh4dWRjLCBjdHJsKTsK KwkJYnJlYWs7CisJY2FzZSBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OOgorCQlkZXZfZGJnKHh1 ZGMtPmRldiwgIlVTQl9SRVFfU0VUX0NPTkZJR1VSQVRJT05cbiIpOworCQkvKgorCQkgKiBJbiB0 aGVvcnkgd2UgbmVlZCB0byBjbGVhciBSVU4gYml0IGJlZm9yZSBzdGF0dXMgc3RhZ2Ugb2YKKwkJ ICogZGVjb25maWcgcmVxdWVzdCBzZW50LCBidXQgdGhpcyBzZWVtcyB0byBiZSBjYXVzaW5nIHBy b2JsZW1zLgorCQkgKiBDbGVhciBSVU4gb25jZSBhbGwgZW5kcG9pbnRzIGFyZSBkaXNhYmxlZCBp bnN0ZWFkLgorCQkgKi8KKwlkZWZhdWx0OgorCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9kZWxlZ2F0 ZV9yZXEoeHVkYywgY3RybCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0 YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9zZXR1cF9wYWNrZXQoc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMsCisJCQkJCSAgICAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsLAor CQkJCQkgICAgICAgdTE2IHNlcV9udW0pCit7CisJaW50IHJldDsKKworCXh1ZGMtPnNldHVwX3Nl cV9udW0gPSBzZXFfbnVtOworCisJLyogRW5zdXJlIEVQMCBpcyB1bmhhbHRlZC4gKi8KKwllcF91 bmhhbHQoeHVkYywgMCk7CisKKwkvKgorCSAqIE9uIFRlZ3JhMjEwLCBzZXR1cCBwYWNrZXRzIHdp dGggc2VxdWVuY2UgbnVtYmVycyAweGZmZmUgb3IgMHhmZmZmCisJICogYXJlIGludmFsaWQuICBI YWx0IEVQMCB1bnRpbCB3ZSBnZXQgYSB2YWxpZCBwYWNrZXQuCisJICovCisJaWYgKHh1ZGMtPnNv Yy0+aW52YWxpZF9zZXFfbnVtICYmCisJICAgIChzZXFfbnVtID09IDB4ZmZmZSB8fCBzZXFfbnVt ID09IDB4ZmZmZikpIHsKKwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAiaW52YWxpZCBzZXF1ZW5jZSBu dW1iZXIgZGV0ZWN0ZWRcbiIpOworCQllcF9oYWx0KHh1ZGMsIDApOworCQlyZXR1cm47CisJfQor CisJaWYgKGN0cmwtPndMZW5ndGgpCisJCXh1ZGMtPnNldHVwX3N0YXRlID0gKGN0cmwtPmJSZXF1 ZXN0VHlwZSAmIFVTQl9ESVJfSU4pID8KKwkJCURBVEFfU1RBR0VfWEZFUiA6ICBEQVRBX1NUQUdF X1JFQ1Y7CisJZWxzZQorCQl4dWRjLT5zZXR1cF9zdGF0ZSA9IFNUQVRVU19TVEFHRV9YRkVSOwor CisJaWYgKChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9T VEFOREFSRCkKKwkJcmV0ID0gdGVncmFfeHVkY19lcDBfc3RhbmRhcmRfcmVxKHh1ZGMsIGN0cmwp OworCWVsc2UKKwkJcmV0ID0gdGVncmFfeHVkY19lcDBfZGVsZWdhdGVfcmVxKHh1ZGMsIGN0cmwp OworCisJaWYgKHJldCA8IDApIHsKKwkJZGV2X3dhcm4oeHVkYy0+ZGV2LCAic2V0dXAgcmVxdWVz dCBmYWlsZWQ6ICVkXG4iLCByZXQpOworCQl4dWRjLT5zZXR1cF9zdGF0ZSA9IFdBSVRfRk9SX1NF VFVQOworCQllcF9oYWx0KHh1ZGMsIDApOworCX0KK30KKworc3RhdGljIHZvaWQgdGVncmFfeHVk Y19oYW5kbGVfZXAwX2V2ZW50KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAorCQkJCQlzdHJ1Y3Qg dGVncmFfeHVkY190cmIgKmV2ZW50KQoreworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmN0cmwg PSAoc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqKWV2ZW50OworCXUxNiBzZXFfbnVtID0gdHJiX3Jl YWRfc2VxX251bShldmVudCk7CisKKwlpZiAoeHVkYy0+c2V0dXBfc3RhdGUgIT0gV0FJVF9GT1Jf U0VUVVApIHsKKwkJLyoKKwkJICogVGhlIGNvbnRyb2xsZXIgaXMgaW4gdGhlIHByb2Nlc3Mgb2Yg aGFuZGxpbmcgYW5vdGhlcgorCQkgKiBzZXR1cCByZXF1ZXN0LiAgUXVldWUgc3Vic2VxdWVudCBy ZXF1ZXN0cyBhbmQgaGFuZGxlCisJCSAqIHRoZSBsYXN0IG9uZSBvbmNlIHRoZSBjb250cm9sbGVy IHJlcG9ydHMgYSBzZXF1ZW5jZQorCQkgKiBudW1iZXIgZXJyb3IuCisJCSAqLworCQltZW1jcHko Jnh1ZGMtPnNldHVwX3BhY2tldC5jdHJsX3JlcSwgY3RybCwgc2l6ZW9mKCpjdHJsKSk7CisJCXh1 ZGMtPnNldHVwX3BhY2tldC5zZXFfbnVtID0gc2VxX251bTsKKwkJeHVkYy0+cXVldWVkX3NldHVw X3BhY2tldCA9IHRydWU7CisJfSBlbHNlIHsKKwkJdGVncmFfeHVkY19oYW5kbGVfZXAwX3NldHVw X3BhY2tldCh4dWRjLCBjdHJsLCBzZXFfbnVtKTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGVn cmFfeHVkY19yZXF1ZXN0ICoKK3RyYl90b19yZXF1ZXN0KHN0cnVjdCB0ZWdyYV94dWRjX2VwICpl cCwgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfcmVx dWVzdCAqcmVxOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShyZXEsICZlcC0+cXVldWUsIGxpc3Qp IHsKKwkJaWYgKCFyZXEtPnRyYnNfcXVldWVkKQorCQkJYnJlYWs7CisKKwkJaWYgKHRyYl9pbl9y ZXF1ZXN0KGVwLCByZXEsIHRyYikpCisJCQlyZXR1cm4gcmVxOworCX0KKworCXJldHVybiBOVUxM OworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2hhbmRsZV90cmFuc2Zlcl9jb21wbGV0aW9u KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAorCQkJCQkJICBzdHJ1Y3QgdGVncmFfeHVkY19lcCAq ZXAsCisJCQkJCQkgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnQpCit7CisJc3RydWN0IHRl Z3JhX3h1ZGNfcmVxdWVzdCAqcmVxOworCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiOworCWJv b2wgc2hvcnRfcGFja2V0OworCisJc2hvcnRfcGFja2V0ID0gKHRyYl9yZWFkX2NtcGxfY29kZShl dmVudCkgPT0KKwkJCVRSQl9DTVBMX0NPREVfU0hPUlRfUEFDS0VUKTsKKworCXRyYiA9IHRyYl9w aHlzX3RvX3ZpcnQoZXAsIHRyYl9yZWFkX2RhdGFfcHRyKGV2ZW50KSk7CisJcmVxID0gdHJiX3Rv X3JlcXVlc3QoZXAsIHRyYik7CisJLyoKKwkgKiBURHMgYXJlIGNvbXBsZXRlIG9uIHNob3J0IHBh Y2tldCBvciB3aGVuIHRoZSBjb21wbGV0ZWQgVFJCIGlzIHRoZQorCSAqIGxhc3QgVFJCIGluIHRo ZSBURCAodGhlIENIQUlOIGJpdCBpcyB1bnNldCkuCisJICovCisJaWYgKHJlcSAmJiAoc2hvcnRf cGFja2V0IHx8ICghdHJiX3JlYWRfY2hhaW4odHJiKSAmJgorCQkocmVxLT50cmJzX25lZWRlZCA9 PSByZXEtPnRyYnNfcXVldWVkKSkpKSB7CisJCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqbGFzdCA9 IHJlcS0+bGFzdF90cmI7CisJCXVuc2lnbmVkIGludCByZXNpZHVhbDsKKworCQlyZXNpZHVhbCA9 IHRyYl9yZWFkX3RyYW5zZmVyX2xlbihldmVudCk7CisJCXJlcS0+dXNiX3JlcS5hY3R1YWwgPSBy ZXEtPnVzYl9yZXEubGVuZ3RoIC0gcmVzaWR1YWw7CisKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJi eXRlcyB0cmFuc2ZlcnJlZCAldSAvICV1XG4iLAorCQkJcmVxLT51c2JfcmVxLmFjdHVhbCwgcmVx LT51c2JfcmVxLmxlbmd0aCk7CisKKwkJdGVncmFfeHVkY19yZXFfZG9uZShlcCwgcmVxLCAwKTsK KworCQlpZiAoZXAtPmRlc2MgJiYgdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykp CisJCQl0ZWdyYV94dWRjX2VwMF9yZXFfZG9uZSh4dWRjKTsKKworCQkvKgorCQkgKiBBZHZhbmNl IHRoZSBkZXF1ZXVlIHBvaW50ZXIgcGFzdCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IFRECisJCSAq IG9uIHNob3J0IHBhY2tldCBjb21wbGV0aW9uLgorCQkgKi8KKwkJaWYgKHNob3J0X3BhY2tldCkg eworCQkJZXAtPmRlcV9wdHIgPSAobGFzdCAtIGVwLT50cmFuc2Zlcl9yaW5nKSArIDE7CisJCQlp ZiAoZXAtPmRlcV9wdHIgPT0gWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgLSAxKQorCQkJCWVwLT5k ZXFfcHRyID0gMDsKKwkJfQorCX0gZWxzZSBpZiAoIXJlcSkgeworCQlkZXZfd2Fybih4dWRjLT5k ZXYsICJ0cmFuc2ZlciBldmVudCBvbiBkZXF1ZXVlZCByZXF1ZXN0XG4iKTsKKwl9CisKKwlpZiAo ZXAtPmRlc2MpCisJCXRlZ3JhX3h1ZGNfZXBfa2lja19xdWV1ZShlcCk7Cit9CisKK3N0YXRpYyB2 b2lkIHRlZ3JhX3h1ZGNfaGFuZGxlX3RyYW5zZmVyX2V2ZW50KHN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjLAorCQkJCQkgICAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnQpCit7CisJdW5zaWdu ZWQgaW50IGVwX2luZGV4ID0gdHJiX3JlYWRfZW5kcG9pbnRfaWQoZXZlbnQpOworCXN0cnVjdCB0 ZWdyYV94dWRjX2VwICplcCA9ICZ4dWRjLT5lcFtlcF9pbmRleF07CisJc3RydWN0IHRlZ3JhX3h1 ZGNfdHJiICp0cmI7CisJdTE2IGNvbXBfY29kZTsKKworCWlmIChlcF9jdHhfcmVhZF9zdGF0ZShl cC0+Y29udGV4dCkgPT0gRVBfU1RBVEVfRElTQUJMRUQpIHsKKwkJZGV2X3dhcm4oeHVkYy0+ZGV2 LCAidHJhbnNmZXIgZXZlbnQgb24gZGlzYWJsZWQgZXAgJXVcbiIsCisJCQkgZXBfaW5kZXgpOwor CQlyZXR1cm47CisJfQorCisJLyogVXBkYXRlIHRyYW5zZmVyIHJpbmcgZGVxdWV1ZSBwb2ludGVy LiAqLworCXRyYiA9IHRyYl9waHlzX3RvX3ZpcnQoZXAsIHRyYl9yZWFkX2RhdGFfcHRyKGV2ZW50 KSk7CisJZXAtPmRlcV9wdHIgPSAodHJiIC0gZXAtPnRyYW5zZmVyX3JpbmcpICsgMTsKKwlpZiAo ZXAtPmRlcV9wdHIgPT0gWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgLSAxKQorCQllcC0+ZGVxX3B0 ciA9IDA7CisJZXAtPnJpbmdfZnVsbCA9IGZhbHNlOworCisJY29tcF9jb2RlID0gdHJiX3JlYWRf Y21wbF9jb2RlKGV2ZW50KTsKKwlzd2l0Y2ggKGNvbXBfY29kZSkgeworCWNhc2UgVFJCX0NNUExf Q09ERV9TVUNDRVNTOgorCWNhc2UgVFJCX0NNUExfQ09ERV9TSE9SVF9QQUNLRVQ6CisJCXRlZ3Jh X3h1ZGNfaGFuZGxlX3RyYW5zZmVyX2NvbXBsZXRpb24oeHVkYywgZXAsIGV2ZW50KTsKKwkJYnJl YWs7CisJY2FzZSBUUkJfQ01QTF9DT0RFX0hPU1RfUkVKRUNURUQ6CisJCWRldl9pbmZvKHh1ZGMt PmRldiwgInN0cmVhbSByZWplY3RlZCBvbiBlcCAldVxuIiwgZXBfaW5kZXgpOworCisJCWVwLT5z dHJlYW1fcmVqZWN0ZWQgPSB0cnVlOworCQlicmVhazsKKwljYXNlIFRSQl9DTVBMX0NPREVfUFJJ TUVfUElQRV9SRUNFSVZFRDoKKwkJZGV2X2luZm8oeHVkYy0+ZGV2LCAicHJpbWUgcGlwZSByZWNl aXZlZCBvbiBlcCAldVxuIiwgZXBfaW5kZXgpOworCisJCWlmIChlcC0+c3RyZWFtX3JlamVjdGVk KSB7CisJCQllcC0+c3RyZWFtX3JlamVjdGVkID0gZmFsc2U7CisJCQkvKgorCQkJICogQW4gRVAg aXMgc3RvcHBlZCB3aGVuIGEgc3RyZWFtIGlzIHJlamVjdGVkLiAgV2FpdAorCQkJICogZm9yIHRo ZSBFUCB0byByZXBvcnQgdGhhdCBpdCBpcyBzdG9wcGVkIGFuZCB0aGVuCisJCQkgKiB1bi1zdG9w IGl0LgorCQkJICovCisJCQllcF93YWl0X2Zvcl9zdG9wcGVkKHh1ZGMsIGVwX2luZGV4KTsKKwkJ fQorCQl0ZWdyYV94dWRjX2VwX3JpbmdfZG9vcmJlbGwoZXApOworCQlicmVhazsKKwljYXNlIFRS Ql9DTVBMX0NPREVfQkFCQkxFX0RFVEVDVEVEX0VSUjoKKwkJLyoKKwkJICogV2FpdCBmb3IgdGhl IEVQIHRvIGJlIHN0b3BwZWQgc28gdGhlIGNvbnRyb2xsZXIgc3RvcHMKKwkJICogcHJvY2Vzc2lu ZyBkb29yYmVsbHMuCisJCSAqLworCQllcF93YWl0X2Zvcl9zdG9wcGVkKHh1ZGMsIGVwX2luZGV4 KTsKKwljYXNlIFRSQl9DTVBMX0NPREVfU1RSRUFNX05VTVBfRVJST1I6CisJY2FzZSBUUkJfQ01Q TF9DT0RFX0NUUkxfRElSX0VSUjoKKwljYXNlIFRSQl9DTVBMX0NPREVfSU5WQUxJRF9TVFJFQU1f VFlQRV9FUlI6CisJY2FzZSBUUkJfQ01QTF9DT0RFX1JJTkdfVU5ERVJSVU46CisJY2FzZSBUUkJf Q01QTF9DT0RFX1JJTkdfT1ZFUlJVTjoKKwljYXNlIFRSQl9DTVBMX0NPREVfSVNPQ0hfQlVGRkVS X09WRVJSVU46CisJY2FzZSBUUkJfQ01QTF9DT0RFX1VTQl9UUkFOU19FUlI6CisJY2FzZSBUUkJf Q01QTF9DT0RFX1RSQl9FUlI6CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAiY29tcGxldGlvbiBlcnJv ciAlI3ggb24gZXAgJXVcbiIsCisJCQljb21wX2NvZGUsIGVwX2luZGV4KTsKKworCQllcF9oYWx0 KHh1ZGMsIGVwX2luZGV4KTsKKwkJYnJlYWs7CisJY2FzZSBUUkJfQ01QTF9DT0RFX0NUUkxfU0VR TlVNX0VSUjoKKwkJZGV2X2luZm8oeHVkYy0+ZGV2LCAic2VxdWVuY2UgbnVtYmVyIGVycm9yXG4i KTsKKworCQkvKgorCQkgKiBLaWxsIGFueSBxdWV1ZWQgY29udHJvbCByZXF1ZXN0IGFuZCBza2lw IHRvIHRoZSBsYXN0CisJCSAqIHNldHVwIHBhY2tldCB3ZSByZWNlaXZlZC4KKwkJICovCisJCXRl Z3JhX3h1ZGNfZXBfbnVrZShlcCwgLUVJTlZBTCk7CisJCXh1ZGMtPnNldHVwX3N0YXRlID0gV0FJ VF9GT1JfU0VUVVA7CisJCWlmICgheHVkYy0+cXVldWVkX3NldHVwX3BhY2tldCkKKwkJCWJyZWFr OworCisJCXRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9zZXR1cF9wYWNrZXQoeHVkYywKKwkJCQkJCSAg ICZ4dWRjLT5zZXR1cF9wYWNrZXQuY3RybF9yZXEsCisJCQkJCQkgICB4dWRjLT5zZXR1cF9wYWNr ZXQuc2VxX251bSk7CisJCXh1ZGMtPnF1ZXVlZF9zZXR1cF9wYWNrZXQgPSBmYWxzZTsKKwkJYnJl YWs7CisJY2FzZSBUUkJfQ01QTF9DT0RFX1NUT1BQRUQ6CisJCWRldl9kYmcoeHVkYy0+ZGV2LCAi c3RvcCBjb21wbGV0aW9uIGNvZGUgb24gZXAgJXVcbiIsCisJCQllcF9pbmRleCk7CisKKwkJLyog RGlzY29ubmVjdGVkLiAqLworCQl0ZWdyYV94dWRjX2VwX251a2UoZXAsIC1FQ09OTlJFRlVTRUQp OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlkZXZfZGJnKHh1ZGMtPmRldiwgImNvbXBsZXRpb24g ZXZlbnQgJSN4IG9uIGVwICV1XG4iLAorCQkJY29tcF9jb2RlLCBlcF9pbmRleCk7CisJCWJyZWFr OworCX0KK30KKworc3RhdGljIHZvaWQgdGVncmFfeHVkY19yZXNldChzdHJ1Y3QgdGVncmFfeHVk YyAqeHVkYykKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAwID0gJnh1ZGMtPmVwWzBdOwor CWRtYV9hZGRyX3QgZGVxX3B0cjsKKwl1bnNpZ25lZCBpbnQgaTsKKworCXh1ZGMtPnNldHVwX3N0 YXRlID0gV0FJVF9GT1JfU0VUVVA7CisJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX0RF RkFVTFQ7CisJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVkYy0+ZGV2aWNl X3N0YXRlKTsKKworCWVwX3VucGF1c2VfYWxsKHh1ZGMpOworCisJZm9yIChpID0gMDsgaSA8IEFS UkFZX1NJWkUoeHVkYy0+ZXApOyBpKyspCisJCXRlZ3JhX3h1ZGNfZXBfbnVrZSgmeHVkYy0+ZXBb aV0sIC1FU0hVVERPV04pOworCisJLyoKKwkgKiBSZXNldCBzZXF1ZW5jZSBudW1iZXIgYW5kIGRl cXVldWUgcG9pbnRlciB0byBmbHVzaCB0aGUgdHJhbnNmZXIKKwkgKiByaW5nLgorCSAqLworCWVw MC0+ZGVxX3B0ciA9IGVwMC0+ZW5xX3B0cjsKKwllcDAtPnJpbmdfZnVsbCA9IGZhbHNlOworCisJ eHVkYy0+c2V0dXBfc2VxX251bSA9IDA7CisJeHVkYy0+cXVldWVkX3NldHVwX3BhY2tldCA9IGZh bHNlOworCisJZXBfY3R4X3dyaXRlX3NlcV9udW0oZXAwLT5jb250ZXh0LCB4dWRjLT5zZXR1cF9z ZXFfbnVtKTsKKworCWRlcV9wdHIgPSB0cmJfdmlydF90b19waHlzKGVwMCwgJmVwMC0+dHJhbnNm ZXJfcmluZ1tlcDAtPmRlcV9wdHJdKTsKKwllcF9jdHhfd3JpdGVfZGVxX3B0cihlcDAtPmNvbnRl eHQsIGRlcV9wdHIpOworCWVwX2N0eF93cml0ZV9kY3MoZXAwLT5jb250ZXh0LCBlcDAtPnBjcyk7 CisKKwllcF91bmhhbHRfYWxsKHh1ZGMpOworCWVwX3JlbG9hZCh4dWRjLCAwKTsKKwllcF91bnBh dXNlKHh1ZGMsIDApOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfY29ubmVjdChz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAwID0g Jnh1ZGMtPmVwWzBdOworCXUxNiBtYXhwYWNrZXQ7CisJdTMyIHZhbDsKKworCXZhbCA9ICh4dWRj X3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BTX1NISUZUKSAmIFBPUlRTQ19QU19NQVNL OworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBQT1JUU0NfUFNfTFM6CisJCXh1ZGMtPmdhZGdldC5z cGVlZCA9IFVTQl9TUEVFRF9MT1c7CisJCWJyZWFrOworCWNhc2UgUE9SVFNDX1BTX0ZTOgorCQl4 dWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKKwkJYnJlYWs7CisJY2FzZSBQT1JU U0NfUFNfSFM6CisJCXh1ZGMtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9ISUdIOworCQlicmVh azsKKwljYXNlIFBPUlRTQ19QU19TUzoKKwkJeHVkYy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVE X1NVUEVSOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl4dWRjLT5nYWRnZXQuc3BlZWQgPSBVU0Jf U1BFRURfVU5LTk9XTjsKKwkJYnJlYWs7CisJfQorCisJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNC X1NUQVRFX0RFRkFVTFQ7CisJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwgeHVk Yy0+ZGV2aWNlX3N0YXRlKTsKKworCXh1ZGMtPnNldHVwX3N0YXRlID0gV0FJVF9GT1JfU0VUVVA7 CisKKwlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikKKwkJbWF4cGFj a2V0ID0gNTEyOworCWVsc2UKKwkJbWF4cGFja2V0ID0gNjQ7CisJZXBfY3R4X3dyaXRlX21heF9w YWNrZXRfc2l6ZShlcDAtPmNvbnRleHQsIG1heHBhY2tldCk7CisJdGVncmFfeHVkY19lcDBfZGVz Yy53TWF4UGFja2V0U2l6ZSA9IGNwdV90b19sZTE2KG1heHBhY2tldCk7CisJdXNiX2VwX3NldF9t YXhwYWNrZXRfbGltaXQoJmVwMC0+dXNiX2VwLCBtYXhwYWNrZXQpOworCisJaWYgKCF1MV9lbmFi bGUpIHsKKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOworCQl2YWwgJj0gfihQT1JU UE1fVTFUSU1FT1VUX01BU0sgPDwgUE9SVFBNX1UxVElNRU9VVF9TSElGVCk7CisJCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKKwl9CisJaWYgKCF1Ml9lbmFibGUpIHsKKwkJdmFsID0g eHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOworCQl2YWwgJj0gfihQT1JUUE1fVTJUSU1FT1VUX01B U0sgPDwgUE9SVFBNX1UyVElNRU9VVF9TSElGVCk7CisJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwg UE9SVFBNKTsKKwl9CisJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA8PSBVU0JfU1BFRURfSElHSCkg eworCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJCXZhbCAmPSB+KFBPUlRQTV9M MVNfTUFTSyA8PCBQT1JUUE1fTDFTX1NISUZUKTsKKwkJaWYgKGxwbV9lbmFibGUpCisJCQl2YWwg fD0gUE9SVFBNX0wxU19BQ0NFUFQgPDwgUE9SVFBNX0wxU19TSElGVDsKKwkJZWxzZQorCQkJdmFs IHw9IFBPUlRQTV9MMVNfTllFVCA8PCBQT1JUUE1fTDFTX1NISUZUOworCQl4dWRjX3dyaXRlbCh4 dWRjLCB2YWwsIFBPUlRQTSk7CisJfQorCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTVCk7CisJ aWYgKHZhbCAmIFNUX1JDKQorCQl4dWRjX3dyaXRlbCh4dWRjLCBTVF9SQywgU1QpOworfQorCitz dGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfZGlzY29ubmVjdChzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYykKK3sKKwl0ZWdyYV94dWRjX3Jlc2V0KHh1ZGMpOworCWlmICh4dWRjLT5kcml2ZXIgJiYg eHVkYy0+ZHJpdmVyLT5kaXNjb25uZWN0KSB7CisJCXNwaW5fdW5sb2NrKCZ4dWRjLT5sb2NrKTsK KwkJeHVkYy0+ZHJpdmVyLT5kaXNjb25uZWN0KCZ4dWRjLT5nYWRnZXQpOworCQlzcGluX2xvY2so Jnh1ZGMtPmxvY2spOworCX0KKworCXh1ZGMtPmRldmljZV9zdGF0ZSA9IFVTQl9TVEFURV9OT1RB VFRBQ0hFRDsKKwl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZp Y2Vfc3RhdGUpOworCisJY29tcGxldGUoJnh1ZGMtPmRpc2Nvbm5lY3RfY29tcGxldGUpOworfQor CitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfcmVzZXQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMpCit7CisJdGVncmFfeHVkY19yZXNldCh4dWRjKTsKKwlpZiAoeHVkYy0+ZHJpdmVyKSB7CisJ CXNwaW5fdW5sb2NrKCZ4dWRjLT5sb2NrKTsKKwkJdXNiX2dhZGdldF91ZGNfcmVzZXQoJnh1ZGMt PmdhZGdldCwgeHVkYy0+ZHJpdmVyKTsKKwkJc3Bpbl9sb2NrKCZ4dWRjLT5sb2NrKTsKKwl9CisJ dGVncmFfeHVkY19wb3J0X2Nvbm5lY3QoeHVkYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1 ZGNfcG9ydF9zdXNwZW5kKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCWRldl9kYmcoeHVk Yy0+ZGV2LCAicG9ydCBzdXNwZW5kXG4iKTsKKwl4dWRjLT5yZXN1bWVfc3RhdGUgPSB4dWRjLT5k ZXZpY2Vfc3RhdGU7CisJeHVkYy0+ZGV2aWNlX3N0YXRlID0gVVNCX1NUQVRFX1NVU1BFTkRFRDsK Kwl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUp OworCWlmICh4dWRjLT5kcml2ZXItPnN1c3BlbmQpIHsKKwkJc3Bpbl91bmxvY2soJnh1ZGMtPmxv Y2spOworCQl4dWRjLT5kcml2ZXItPnN1c3BlbmQoJnh1ZGMtPmdhZGdldCk7CisJCXNwaW5fbG9j aygmeHVkYy0+bG9jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfcmVz dW1lKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCWRldl9kYmcoeHVkYy0+ZGV2LCAicG9y dCByZXN1bWVcbiIpOworCXRlZ3JhX3h1ZGNfcmVzdW1lX2RldmljZV9zdGF0ZSh4dWRjKTsKKwlp ZiAoeHVkYy0+ZHJpdmVyLT5yZXN1bWUpIHsKKwkJc3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOwor CQl4dWRjLT5kcml2ZXItPnJlc3VtZSgmeHVkYy0+Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZ4dWRj LT5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9wb3J0X2NoYW5nZShz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdTMyIGZsYWcpCit7CisJdTMyIHZhbDsKKworCXZhbCA9 IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKKwl2YWwgJj0gflBPUlRTQ19DSEFOR0VfTUFTSzsK Kwl2YWwgfD0gZmxhZzsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRTQyk7Cit9CisKK3N0 YXRpYyB2b2lkIF9fdGVncmFfeHVkY19oYW5kbGVfcG9ydF9zdGF0dXMoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMpCit7CisJdTMyIHBvcnRzYywgcG9ydGhhbHQ7CisKKwlwb3J0aGFsdCA9IHh1ZGNf cmVhZGwoeHVkYywgUE9SVEhBTFQpOworCWlmICgocG9ydGhhbHQgJiBQT1JUSEFMVF9TVENIR19S RVEpICYmCisJICAgIChwb3J0aGFsdCAmIFBPUlRIQUxUX0hBTFRfTFRTU00pKSB7CisJCWRldl9k YmcoeHVkYy0+ZGV2LCAiU1RDSEdfUkVRLCBQT1JUSEFMVCA9ICUjeFxuIiwgcG9ydGhhbHQpOwor CQlwb3J0aGFsdCAmPSB+UE9SVEhBTFRfSEFMVF9MVFNTTTsKKwkJeHVkY193cml0ZWwoeHVkYywg cG9ydGhhbHQsIFBPUlRIQUxUKTsKKwl9CisKKwlwb3J0c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBP UlRTQyk7CisJaWYgKChwb3J0c2MgJiBQT1JUU0NfUFJDKSAmJiAocG9ydHNjICYgUE9SVFNDX1BS KSkgeworCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlBSQywgUFIsIFBPUlRTQyA9ICUjeFxuIiwgcG9y dHNjKTsKKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX1BSQyB8IFBPUlRTQ19QRUQp OworI2RlZmluZSBUT0dHTEVfVkJVU19XQUlUX01TIDEwMAorCQlpZiAoeHVkYy0+c29jLT5wb3J0 X3Jlc2V0X3F1aXJrKSB7CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnh1ZGMtPnBvcnRfcmVz ZXRfd2FyX3dvcmssCisJCQkJbXNlY3NfdG9famlmZmllcyhUT0dHTEVfVkJVU19XQUlUX01TKSk7 CisJCQl4dWRjLT53YWl0X2Zvcl9zZWNfcHJjID0gMTsKKwkJfQorCX0KKworCWlmICgocG9ydHNj ICYgUE9SVFNDX1BSQykgJiYgIShwb3J0c2MgJiBQT1JUU0NfUFIpKSB7CisJCWRldl9kYmcoeHVk Yy0+ZGV2LCAiUFJDLCBOb3QgUFIsIFBPUlRTQyA9ICUjeFxuIiwgcG9ydHNjKTsKKwkJY2xlYXJf cG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX1BSQyB8IFBPUlRTQ19QRUQpOworCQl0ZWdyYV94dWRj X3BvcnRfcmVzZXQoeHVkYyk7CisJCWNhbmNlbF9kZWxheWVkX3dvcmsoJnh1ZGMtPnBvcnRfcmVz ZXRfd2FyX3dvcmspOworCQl4dWRjLT53YWl0X2Zvcl9zZWNfcHJjID0gMDsKKwl9CisKKwlwb3J0 c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7CisJaWYgKHBvcnRzYyAmIFBPUlRTQ19XUkMp IHsKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJXUkMsIFBPUlRTQyA9ICUjeFxuIiwgcG9ydHNjKTsK KwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX1dSQyB8IFBPUlRTQ19QRUQpOworCQlp ZiAoISh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgJiBQT1JUU0NfV1BSKSkKKwkJCXRlZ3JhX3h1 ZGNfcG9ydF9yZXNldCh4dWRjKTsKKwl9CisKKwlwb3J0c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBP UlRTQyk7CisJaWYgKHBvcnRzYyAmIFBPUlRTQ19DU0MpIHsKKwkJZGV2X2RiZyh4dWRjLT5kZXYs ICJDU0MsIFBPUlRTQyA9ICUjeFxuIiwgcG9ydHNjKTsKKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVk YywgUE9SVFNDX0NTQyk7CisJCWlmIChwb3J0c2MgJiBQT1JUU0NfQ0NTKQorCQkJdGVncmFfeHVk Y19wb3J0X2Nvbm5lY3QoeHVkYyk7CisJCWVsc2UKKwkJCXRlZ3JhX3h1ZGNfcG9ydF9kaXNjb25u ZWN0KHh1ZGMpOworCQlpZiAoeHVkYy0+d2FpdF9jc2MpIHsKKwkJCWNhbmNlbF9kZWxheWVkX3dv cmsoJnh1ZGMtPnBsY19yZXNldF93b3JrKTsKKwkJCXh1ZGMtPndhaXRfY3NjID0gZmFsc2U7CisJ CX0KKwl9CisKKwlwb3J0c2MgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQyk7CisJaWYgKHBvcnRz YyAmIFBPUlRTQ19QTEMpIHsKKwkJdTMyIHBscyA9IChwb3J0c2MgPj4gUE9SVFNDX1BMU19TSElG VCkgJiBQT1JUU0NfUExTX01BU0s7CisKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJQTEMsIFBPUlRT QyA9ICUjeFxuIiwgcG9ydHNjKTsKKwkJY2xlYXJfcG9ydF9jaGFuZ2UoeHVkYywgUE9SVFNDX1BM Qyk7CisJCXN3aXRjaCAocGxzKSB7CisJCWNhc2UgUE9SVFNDX1BMU19VMzoKKwkJCXRlZ3JhX3h1 ZGNfcG9ydF9zdXNwZW5kKHh1ZGMpOworCQkJYnJlYWs7CisJCWNhc2UgUE9SVFNDX1BMU19VMDoK KwkJCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQgPCBVU0JfU1BFRURfU1VQRVIpCisJCQkJdGVncmFf eHVkY19wb3J0X3Jlc3VtZSh4dWRjKTsKKwkJCWJyZWFrOworCQljYXNlIFBPUlRTQ19QTFNfUkVT VU1FOgorCQkJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpCisJCQkJ dGVncmFfeHVkY19wb3J0X3Jlc3VtZSh4dWRjKTsKKwkJCWJyZWFrOworCQljYXNlIFBPUlRTQ19Q TFNfSU5BQ1RJVkU6CisJCQlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJnh1ZGMtPnBsY19yZXNldF93 b3JrLAorCQkJCQltc2Vjc190b19qaWZmaWVzKFRPR0dMRV9WQlVTX1dBSVRfTVMpKTsKKwkJCXh1 ZGMtPndhaXRfY3NjID0gdHJ1ZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJ CX0KKwl9CisKKwlpZiAocG9ydHNjICYgUE9SVFNDX0NFQykgeworCQlkZXZfd2Fybih4dWRjLT5k ZXYsICJDRUMsIFBPUlRTQyA9ICUjeFxuIiwgcG9ydHNjKTsKKwkJY2xlYXJfcG9ydF9jaGFuZ2Uo eHVkYywgUE9SVFNDX0NFQyk7CisJfQorCisJZGV2X2RiZyh4dWRjLT5kZXYsICJQT1JUU0MgPSAl I3hcbiIsIHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3Jh X3h1ZGNfaGFuZGxlX3BvcnRfc3RhdHVzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXdo aWxlICgoeHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpICYgUE9SVFNDX0NIQU5HRV9NQVNLKSB8fAor CSAgICAgICAoeHVkY19yZWFkbCh4dWRjLCBQT1JUSEFMVCkgJiBQT1JUSEFMVF9TVENIR19SRVEp KQorCQlfX3RlZ3JhX3h1ZGNfaGFuZGxlX3BvcnRfc3RhdHVzKHh1ZGMpOworfQorCitzdGF0aWMg dm9pZCB0ZWdyYV94dWRjX2hhbmRsZV9ldmVudChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKKwkJ CQkgICAgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICpldmVudCkKK3sKKwl1MzIgdHlwZSA9IHRyYl9y ZWFkX3R5cGUoZXZlbnQpOworCisJZHVtcF90cmIoeHVkYywgIkVWRU5UIiwgZXZlbnQpOworCisJ c3dpdGNoICh0eXBlKSB7CisJY2FzZSBUUkJfVFlQRV9QT1JUX1NUQVRVU19DSEFOR0VfRVZFTlQ6 CisJCXRlZ3JhX3h1ZGNfaGFuZGxlX3BvcnRfc3RhdHVzKHh1ZGMpOworCQlicmVhazsKKwljYXNl IFRSQl9UWVBFX1RSQU5TRkVSX0VWRU5UOgorCQl0ZWdyYV94dWRjX2hhbmRsZV90cmFuc2Zlcl9l dmVudCh4dWRjLCBldmVudCk7CisJCWJyZWFrOworCWNhc2UgVFJCX1RZUEVfU0VUVVBfUEFDS0VU X0VWRU5UOgorCQl0ZWdyYV94dWRjX2hhbmRsZV9lcDBfZXZlbnQoeHVkYywgZXZlbnQpOworCQli cmVhazsKKwlkZWZhdWx0OgorCQlkZXZfaW5mbyh4dWRjLT5kZXYsICJVbnJlY29nbml6ZWQgVFJC IHR5cGUgPSAlI3hcbiIsIHR5cGUpOworCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfcHJvY2Vzc19ldmVudF9yaW5nKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQorewor CXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnQ7CisJZG1hX2FkZHJfdCBlcmRwOworCisJd2hp bGUgKHRydWUpIHsKKwkJZXZlbnQgPSB4dWRjLT5ldmVudF9yaW5nW3h1ZGMtPmV2ZW50X3Jpbmdf aW5kZXhdICsKKwkJCXh1ZGMtPmV2ZW50X3JpbmdfZGVxX3B0cjsKKworCQlpZiAodHJiX3JlYWRf Y3ljbGUoZXZlbnQpICE9IHh1ZGMtPmNjcykKKwkJCWJyZWFrOworCisJCXRlZ3JhX3h1ZGNfaGFu ZGxlX2V2ZW50KHh1ZGMsIGV2ZW50KTsKKworCQl4dWRjLT5ldmVudF9yaW5nX2RlcV9wdHIrKzsK KwkJaWYgKHh1ZGMtPmV2ZW50X3JpbmdfZGVxX3B0ciA9PSBYVURDX0VWRU5UX1JJTkdfU0laRSkg eworCQkJeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRyID0gMDsKKwkJCXh1ZGMtPmV2ZW50X3Jpbmdf aW5kZXgrKzsKKwkJfQorCQlpZiAoeHVkYy0+ZXZlbnRfcmluZ19pbmRleCA9PSBYVURDX05SX0VW RU5UX1JJTkdTKSB7CisJCQl4dWRjLT5ldmVudF9yaW5nX2luZGV4ID0gMDsKKwkJCXh1ZGMtPmNj cyA9ICF4dWRjLT5jY3M7CisJCX0KKwl9CisKKwllcmRwID0geHVkYy0+ZXZlbnRfcmluZ19waHlz W3h1ZGMtPmV2ZW50X3JpbmdfaW5kZXhdICsKKwkJeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRyICog c2l6ZW9mKCpldmVudCk7CisJeHVkY193cml0ZWwoeHVkYywgdXBwZXJfMzJfYml0cyhlcmRwKSwg RVJEUEhJKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCBsb3dlcl8zMl9iaXRzKGVyZHApIHwgRVJEUExP X0VIQiwgRVJEUExPKTsKK30KKworc3RhdGljIGlycXJldHVybl90IHRlZ3JhX3h1ZGNfaXJxKGlu dCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBkYXRhOwor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXZhbCA9IHh1ZGNfcmVhZGwoeHVk YywgU1QpOworCWlmICghKHZhbCAmIFNUX0lQKSkKKwkJcmV0dXJuIElSUV9OT05FOworCXh1ZGNf d3JpdGVsKHh1ZGMsIFNUX0lQLCBTVCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9j aywgZmxhZ3MpOworCXRlZ3JhX3h1ZGNfcHJvY2Vzc19ldmVudF9yaW5nKHh1ZGMpOworCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiBJUlFfSEFO RExFRDsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2FsbG9jX2VwKHN0cnVjdCB0ZWdyYV94 dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfZXAg KmVwID0gJnh1ZGMtPmVwW2luZGV4XTsKKworCWVwLT54dWRjID0geHVkYzsKKwllcC0+aW5kZXgg PSBpbmRleDsKKwllcC0+Y29udGV4dCA9ICZ4dWRjLT5lcF9jb250ZXh0W2luZGV4XTsKKwlJTklU X0xJU1RfSEVBRCgmZXAtPnF1ZXVlKTsKKworCS8qCisJICogRVAxIHdvdWxkIGJlIHRoZSBpbnB1 dCBlbmRwb2ludCBjb3JyZXNwb25kaW5nIHRvIEVQMCwgYnV0IHNpbmNlCisJICogRVAwIGlzIGJp LWRpcmVjdGlvbmFsLCBFUDEgaXMgdW51c2VkLgorCSAqLworCWlmIChpbmRleCA9PSAxKQorCQly ZXR1cm4gMDsKKworCWVwLT50cmFuc2Zlcl9yaW5nID0gZG1hX3Bvb2xfYWxsb2MoeHVkYy0+dHJh bnNmZXJfcmluZ19wb29sLAorCQkJCQkgICBHRlBfS0VSTkVMLAorCQkJCQkgICAmZXAtPnRyYW5z ZmVyX3JpbmdfcGh5cyk7CisJaWYgKCFlcC0+dHJhbnNmZXJfcmluZykKKwkJcmV0dXJuIC1FTk9N RU07CisKKwlpZiAoaW5kZXgpIHsKKwkJc25wcmludGYoZXAtPm5hbWUsIHNpemVvZihlcC0+bmFt ZSksICJlcCV1JXMiLCBpbmRleCAvIDIsCisJCQkgKGluZGV4ICUgMiA9PSAwKSA/ICJvdXQiIDog ImluIik7CisJCWVwLT51c2JfZXAubmFtZSA9IGVwLT5uYW1lOworCQl1c2JfZXBfc2V0X21heHBh Y2tldF9saW1pdCgmZXAtPnVzYl9lcCwgMTAyNCk7CisJCWVwLT51c2JfZXAubWF4X3N0cmVhbXMg PSAxNjsKKwkJZXAtPnVzYl9lcC5vcHMgPSAmdGVncmFfeHVkY19lcF9vcHM7CisJCWVwLT51c2Jf ZXAuY2Fwcy50eXBlX2J1bGsgPSB0cnVlOworCQllcC0+dXNiX2VwLmNhcHMudHlwZV9pbnQgPSB0 cnVlOworCQlpZiAoaW5kZXggJiAxKQorCQkJZXAtPnVzYl9lcC5jYXBzLmRpcl9pbiA9IHRydWU7 CisJCWVsc2UKKwkJCWVwLT51c2JfZXAuY2Fwcy5kaXJfb3V0ID0gdHJ1ZTsKKwkJbGlzdF9hZGRf dGFpbCgmZXAtPnVzYl9lcC5lcF9saXN0LCAmeHVkYy0+Z2FkZ2V0LmVwX2xpc3QpOworCX0gZWxz ZSB7CisJCXN0cmNweShlcC0+bmFtZSwgImVwMCIpOworCQllcC0+dXNiX2VwLm5hbWUgPSBlcC0+ bmFtZTsKKwkJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJmVwLT51c2JfZXAsIDY0KTsKKwkJ ZXAtPnVzYl9lcC5vcHMgPSAmdGVncmFfeHVkY19lcDBfb3BzOworCQllcC0+dXNiX2VwLmNhcHMu dHlwZV9jb250cm9sID0gdHJ1ZTsKKwkJZXAtPnVzYl9lcC5jYXBzLmRpcl9pbiA9IHRydWU7CisJ CWVwLT51c2JfZXAuY2Fwcy5kaXJfb3V0ID0gdHJ1ZTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgdGVncmFfeHVkY19mcmVlX2VwKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1 bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwID0gJnh1ZGMt PmVwW2luZGV4XTsKKworCS8qCisJICogRVAxIHdvdWxkIGJlIHRoZSBpbnB1dCBlbmRwb2ludCBj b3JyZXNwb25kaW5nIHRvIEVQMCwgYnV0IHNpbmNlCisJICogRVAwIGlzIGJpLWRpcmVjdGlvbmFs LCBFUDEgaXMgdW51c2VkLgorCSAqLworCWlmIChpbmRleCA9PSAxKQorCQlyZXR1cm47CisKKwlk bWFfcG9vbF9mcmVlKHh1ZGMtPnRyYW5zZmVyX3JpbmdfcG9vbCwgZXAtPnRyYW5zZmVyX3Jpbmcs CisJCSAgICAgIGVwLT50cmFuc2Zlcl9yaW5nX3BoeXMpOworfQorCitzdGF0aWMgaW50IHRlZ3Jh X3h1ZGNfYWxsb2NfZXBzKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXN0cnVjdCB1c2Jf cmVxdWVzdCAqcmVxOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwl4dWRjLT5lcF9j b250ZXh0ID0KKwkJZG1hX3phbGxvY19jb2hlcmVudCh4dWRjLT5kZXYsIFhVRENfTlJfRVBTICoK KwkJCQkgICAgc2l6ZW9mKCp4dWRjLT5lcF9jb250ZXh0KSwKKwkJCQkgICAgJnh1ZGMtPmVwX2Nv bnRleHRfcGh5cywgR0ZQX0tFUk5FTCk7CisJaWYgKCF4dWRjLT5lcF9jb250ZXh0KQorCQlyZXR1 cm4gLUVOT01FTTsKKworCXh1ZGMtPnRyYW5zZmVyX3JpbmdfcG9vbCA9CisJCWRtYW1fcG9vbF9j cmVhdGUoZGV2X25hbWUoeHVkYy0+ZGV2KSwgeHVkYy0+ZGV2LAorCQkJCSBYVURDX1RSQU5TRkVS X1JJTkdfU0laRSAqCisJCQkJIHNpemVvZihzdHJ1Y3QgdGVncmFfeHVkY190cmIpLAorCQkJCSBz aXplb2Yoc3RydWN0IHRlZ3JhX3h1ZGNfdHJiKSwgMCk7CisJaWYgKCF4dWRjLT50cmFuc2Zlcl9y aW5nX3Bvb2wpIHsKKwkJZXJyID0gLUVOT01FTTsKKwkJZ290byBmcmVlX2VwX2NvbnRleHQ7CisJ fQorCisJSU5JVF9MSVNUX0hFQUQoJnh1ZGMtPmdhZGdldC5lcF9saXN0KTsKKwlmb3IgKGkgPSAw OyBpIDwgQVJSQVlfU0laRSh4dWRjLT5lcCk7IGkrKykgeworCQllcnIgPSB0ZWdyYV94dWRjX2Fs bG9jX2VwKHh1ZGMsIGkpOworCQlpZiAoZXJyIDwgMCkKKwkJCWdvdG8gZnJlZV9lcHM7CisJfQor CisJcmVxID0gdGVncmFfeHVkY19lcF9hbGxvY19yZXF1ZXN0KCZ4dWRjLT5lcFswXS51c2JfZXAs IEdGUF9LRVJORUwpOworCWlmICghcmVxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZnJl ZV9lcHM7CisJfQorCXh1ZGMtPmVwMF9yZXEgPSB0b194dWRjX3JlcShyZXEpOworCisJcmV0dXJu IDA7CisKK2ZyZWVfZXBzOgorCWZvciAoOyBpID4gMDsgaS0tKQorCQl0ZWdyYV94dWRjX2ZyZWVf ZXAoeHVkYywgaSAtIDEpOworZnJlZV9lcF9jb250ZXh0OgorCWRtYV9mcmVlX2NvaGVyZW50KHh1 ZGMtPmRldiwgWFVEQ19OUl9FUFMgKiBzaXplb2YoKnh1ZGMtPmVwX2NvbnRleHQpLAorCQkJICB4 dWRjLT5lcF9jb250ZXh0LCB4dWRjLT5lcF9jb250ZXh0X3BoeXMpOworCXJldHVybiBlcnI7Cit9 CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaW5pdF9lcHMoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMpCit7CisJeHVkY193cml0ZWwoeHVkYywgbG93ZXJfMzJfYml0cyh4dWRjLT5lcF9jb250ZXh0 X3BoeXMpLCBFQ1BMTyk7CisJeHVkY193cml0ZWwoeHVkYywgdXBwZXJfMzJfYml0cyh4dWRjLT5l cF9jb250ZXh0X3BoeXMpLCBFQ1BISSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZnJl ZV9lcHMoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwl0 ZWdyYV94dWRjX2VwX2ZyZWVfcmVxdWVzdCgmeHVkYy0+ZXBbMF0udXNiX2VwLAorCQkJCSAgICZ4 dWRjLT5lcDBfcmVxLT51c2JfcmVxKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1 ZGMtPmVwKTsgaSsrKQorCQl0ZWdyYV94dWRjX2ZyZWVfZXAoeHVkYywgaSk7CisKKwlkbWFfZnJl ZV9jb2hlcmVudCh4dWRjLT5kZXYsIFhVRENfTlJfRVBTICogc2l6ZW9mKCp4dWRjLT5lcF9jb250 ZXh0KSwKKwkJCSAgeHVkYy0+ZXBfY29udGV4dCwgeHVkYy0+ZXBfY29udGV4dF9waHlzKTsKK30K Kworc3RhdGljIGludCB0ZWdyYV94dWRjX2FsbG9jX2V2ZW50X3Jpbmcoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlf U0laRSh4dWRjLT5ldmVudF9yaW5nKTsgaSsrKSB7CisJCXh1ZGMtPmV2ZW50X3JpbmdbaV0gPQor CQkJZG1hX2FsbG9jX2NvaGVyZW50KHh1ZGMtPmRldiwgWFVEQ19FVkVOVF9SSU5HX1NJWkUgKgor CQkJCQkgICBzaXplb2YoKnh1ZGMtPmV2ZW50X3JpbmdbaV0pLAorCQkJCQkgICAmeHVkYy0+ZXZl bnRfcmluZ19waHlzW2ldLAorCQkJCQkgICBHRlBfS0VSTkVMKTsKKwkJaWYgKCF4dWRjLT5ldmVu dF9yaW5nW2ldKQorCQkJZ290byBmcmVlX2RtYTsKKwl9CisKKwlyZXR1cm4gMDsKKworZnJlZV9k bWE6CisJZm9yICg7IGkgPiAwOyBpLS0pIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoeHVkYy0+ZGV2 LCBYVURDX0VWRU5UX1JJTkdfU0laRSAqCisJCQkJICBzaXplb2YoKnh1ZGMtPmV2ZW50X3Jpbmdb aSAtIDFdKSwKKwkJCQkgIHh1ZGMtPmV2ZW50X3JpbmdbaSAtIDFdLAorCQkJCSAgeHVkYy0+ZXZl bnRfcmluZ19waHlzW2kgLSAxXSk7CisJfQorCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMg dm9pZCB0ZWdyYV94dWRjX2luaXRfZXZlbnRfcmluZyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykK K3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1MzIgdmFsOworCisJdmFsID0geHVkY19yZWFkbCh4dWRj LCBTUEFSQU0pOworCXZhbCAmPSB+KFNQQVJBTV9FUlNUTUFYX01BU0sgPDwgU1BBUkFNX0VSU1RN QVhfU0hJRlQpOworCXZhbCB8PSBYVURDX05SX0VWRU5UX1JJTkdTIDw8IFNQQVJBTV9FUlNUTUFY X1NISUZUOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1BBUkFNKTsKKworCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmV2ZW50X3JpbmcpOyBpKyspIHsKKwkJbWVtc2V0KHh1ZGMt PmV2ZW50X3JpbmdbaV0sIDAsIFhVRENfRVZFTlRfUklOR19TSVpFICoKKwkJICAgICAgIHNpemVv ZigqeHVkYy0+ZXZlbnRfcmluZ1tpXSkpOworCisJCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVJT VFNaKTsKKwkJdmFsICY9IH4oRVJTVFNaX0VSU1RYU1pfTUFTSyA8PCBFUlNUU1pfRVJTVFhTWl9T SElGVChpKSk7CisJCXZhbCB8PSBYVURDX0VWRU5UX1JJTkdfU0laRSA8PCBFUlNUU1pfRVJTVFhT Wl9TSElGVChpKTsKKwkJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUlNUU1opOworCisJCXh1ZGNf d3JpdGVsKHh1ZGMsIGxvd2VyXzMyX2JpdHMoeHVkYy0+ZXZlbnRfcmluZ19waHlzW2ldKSwKKwkJ CSAgICBFUlNUWEJBTE8oaSkpOworCQl4dWRjX3dyaXRlbCh4dWRjLCB1cHBlcl8zMl9iaXRzKHh1 ZGMtPmV2ZW50X3JpbmdfcGh5c1tpXSksCisJCQkgICAgRVJTVFhCQUhJKGkpKTsKKwl9CisKKwl2 YWwgPSBsb3dlcl8zMl9iaXRzKHh1ZGMtPmV2ZW50X3JpbmdfcGh5c1swXSk7CisJeHVkY193cml0 ZWwoeHVkYywgdmFsLCBFUkRQTE8pOworCXZhbCB8PSBFUkVQTE9fRUNTOworCXh1ZGNfd3JpdGVs KHh1ZGMsIHZhbCwgRVJFUExPKTsKKworCXZhbCA9IHVwcGVyXzMyX2JpdHMoeHVkYy0+ZXZlbnRf cmluZ19waHlzWzBdKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVSRFBISSk7CisJeHVkY193 cml0ZWwoeHVkYywgdmFsLCBFUkVQSEkpOworCisJeHVkYy0+Y2NzID0gdHJ1ZTsKKwl4dWRjLT5l dmVudF9yaW5nX2luZGV4ID0gMDsKKwl4dWRjLT5ldmVudF9yaW5nX2RlcV9wdHIgPSAwOworfQor CitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2ZyZWVfZXZlbnRfcmluZyhzdHJ1Y3QgdGVncmFfeHVk YyAqeHVkYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKHh1ZGMtPmV2ZW50X3JpbmcpOyBpKyspIHsKKwkJZG1hX2ZyZWVfY29oZXJlbnQoeHVkYy0+ ZGV2LCBYVURDX0VWRU5UX1JJTkdfU0laRSAqCisJCQkJICBzaXplb2YoKnh1ZGMtPmV2ZW50X3Jp bmdbaV0pLAorCQkJCSAgeHVkYy0+ZXZlbnRfcmluZ1tpXSwKKwkJCQkgIHh1ZGMtPmV2ZW50X3Jp bmdfcGh5c1tpXSk7CisJfQorfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2ZwY2lfaXBmc19p bml0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXUzMiB2YWw7CisKKwlpZiAoWFVEQ19J U19UMjEwKHh1ZGMpKSB7CisJCXZhbCA9IGlwZnNfcmVhZGwoeHVkYywgWFVTQl9ERVZfQ09ORklH VVJBVElPTl8wKTsKKwkJdmFsIHw9IFhVU0JfREVWX0NPTkZJR1VSQVRJT05fMF9FTl9GUENJOwor CQlpcGZzX3dyaXRlbCh4dWRjLCB2YWwsIFhVU0JfREVWX0NPTkZJR1VSQVRJT05fMCk7CisJCXVk ZWxheSgxMCk7CisJfQorCisJLyogRW5hYmxlIGJ1cyBtYXN0ZXIgKi8KKwl2YWwgPSBYVVNCX0RF Vl9DRkdfMV9JT19TUEFDRV9FTiB8IFhVU0JfREVWX0NGR18xX01FTU9SWV9TUEFDRV9FTiB8CisJ CVhVU0JfREVWX0NGR18xX0JVU19NQVNURVJfRU47CisJZnBjaV93cml0ZWwoeHVkYywgdmFsLCBY VVNCX0RFVl9DRkdfMSk7CisKKwkvKiBQcm9ncmFtIEJBUjAgc3BhY2UgKi8KKwl2YWwgPSBmcGNp X3JlYWRsKHh1ZGMsIFhVU0JfREVWX0NGR180KTsKKwl2YWwgJj0gfihYVVNCX0RFVl9DRkdfNF9C QVNFX0FERFJfTUFTSyA8PAorCQkgWFVTQl9ERVZfQ0ZHXzRfQkFTRV9BRERSX1NISUZUKTsKKwl2 YWwgfD0geHVkYy0+cGh5c19iYXNlICYgKFhVU0JfREVWX0NGR180X0JBU0VfQUREUl9NQVNLIDw8 CisJCQkJICBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfU0hJRlQpOworCWZwY2lfd3JpdGVsKHh1 ZGMsIHZhbCwgWFVTQl9ERVZfQ0ZHXzQpOworCWZwY2lfd3JpdGVsKHh1ZGMsIHVwcGVyXzMyX2Jp dHMoeHVkYy0+cGh5c19iYXNlKSwgWFVTQl9ERVZfQ0ZHXzUpOworCXVzbGVlcF9yYW5nZSgxMDAs IDIwMCk7CisKKwlpZiAoWFVEQ19JU19UMjEwKHh1ZGMpKSB7CisJCS8qIEVuYWJsZSBpbnRlcnJ1 cHQgYXNzZXJ0aW9uICovCisJCXZhbCA9IGlwZnNfcmVhZGwoeHVkYywgWFVTQl9ERVZfSU5UUl9N QVNLXzApOworCQl2YWwgfD0gWFVTQl9ERVZfSU5UUl9NQVNLXzBfSVBfSU5UX01BU0s7CisJCWlw ZnNfd3JpdGVsKHh1ZGMsIHZhbCwgWFVTQl9ERVZfSU5UUl9NQVNLXzApOworCX0KK30KKworc3Rh dGljIHZvaWQgdGVncmFfeHVkY19kZXZpY2VfcGFyYW1zX2luaXQoc3RydWN0IHRlZ3JhX3h1ZGMg Knh1ZGMpCit7CisJdTMyIHZhbCwgaW1vZDsKKworCWlmIChYVURDX0lTX1QyMTAoeHVkYykpIHsK KwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBCTENHKTsKKwkJdmFsIHw9IEJMQ0dfQUxMOworCQl2 YWwgJj0gfihCTENHX0RGUENJIHwgQkxDR19VRlBDSSB8IEJMQ0dfRkUgfAorCQkJCUJMQ0dfQ09S RVBMTF9QV1JETik7CisJCXZhbCB8PSBCTENHX0lPUExMXzBfUFdSRE47CisJCXZhbCB8PSBCTENH X0lPUExMXzFfUFdSRE47CisJCXZhbCB8PSBCTENHX0lPUExMXzJfUFdSRE47CisJCXh1ZGNfd3Jp dGVsKHh1ZGMsIHZhbCwgQkxDRyk7CisJfQorCisJLyogU2V0IGEgcmVhc29uYWJsZSBVMyBleGl0 IHRpbWVyIHZhbHVlLiAqLworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1NQWF9DT1JFX1BBRENU TDQpOworCXZhbCAmPSB+KFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9USU1FT1VUX1UzX01B U0sgPDwKKwkJIFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9USU1FT1VUX1UzX1NISUZUKTsK Kwl2YWwgfD0gMHg1ZGMwIDw8IFNTUFhfQ09SRV9QQURDVEw0X1JYREFUX1ZMRF9USU1FT1VUX1Uz X1NISUZUOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1NQWF9DT1JFX1BBRENUTDQpOworCisJ LyogRGVmYXVsdCBwaW5nIExGUFMgdEJ1cnN0IGlzIHRvbyBsYXJnZS4gKi8KKwl2YWwgPSB4dWRj X3JlYWRsKHh1ZGMsIFNTUFhfQ09SRV9DTlQwKTsKKwl2YWwgJj0gfihTU1BYX0NPUkVfQ05UMF9Q SU5HX1RCVVJTVF9NQVNLIDw8CisJCSBTU1BYX0NPUkVfQ05UMF9QSU5HX1RCVVJTVF9TSElGVCk7 CisJdmFsIHw9IDB4YSA8PCBTU1BYX0NPUkVfQ05UMF9QSU5HX1RCVVJTVF9TSElGVDsKKwl4dWRj X3dyaXRlbCh4dWRjLCB2YWwsIFNTUFhfQ09SRV9DTlQwKTsKKworCS8qIERlZmF1bHQgdFBvcnRD b25maWd1cmF0aW9uIHRpbWVvdXQgaXMgdG9vIHNtYWxsLiAqLworCXZhbCA9IHh1ZGNfcmVhZGwo eHVkYywgU1NQWF9DT1JFX0NOVDMwKTsKKwl2YWwgJj0gfihTU1BYX0NPUkVfQ05UMzBfTE1QSVRQ X1RJTUVSX01BU0sgPDwKKwkJIFNTUFhfQ09SRV9DTlQzMF9MTVBJVFBfVElNRVJfU0hJRlQpOwor CXZhbCB8PSAweDk3OCA8PCBTU1BYX0NPUkVfQ05UMzBfTE1QSVRQX1RJTUVSX1NISUZUOworCXh1 ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1NQWF9DT1JFX0NOVDMwKTsKKworCWlmIChscG1fZW5hYmxl KSB7CisJCS8qIFNldCBMMSByZXN1bWUgZHVyYXRpb24gdG8gOTUgdXMuICovCisJCXZhbCA9IHh1 ZGNfcmVhZGwoeHVkYywgSFNGU1BJX0NPVU5UMTMpOworCQl2YWwgJj0gfihIU0ZTUElfQ09VTlQx M19VMl9SRVNVTUVfS19EVVJBVElPTl9NQVNLIDw8CisJCQkJSFNGU1BJX0NPVU5UMTNfVTJfUkVT VU1FX0tfRFVSQVRJT05fU0hJRlQpOworCQl2YWwgfD0gMHgyYzg4IDw8IEhTRlNQSV9DT1VOVDEz X1UyX1JFU1VNRV9LX0RVUkFUSU9OX1NISUZUOworCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEhT RlNQSV9DT1VOVDEzKTsKKwl9CisKKwkvKgorCSAqIENvbXBsaWFjbmUgc3VpdGUgYXBwZWFycyB0 byBiZSB2aW9sYXRpbmcgcG9sbGluZyBMRlBTIHRCdXJzdCBtYXgKKwkgKiBvZiAxLjR1cy4gIFNl bmQgMS40NXVzIGluc3RlYWQuCisJICovCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTU1BYX0NP UkVfQ05UMzIpOworCXZhbCAmPSB+KFNTUFhfQ09SRV9DTlQzMl9QT0xMX1RCVVJTVF9NQVhfTUFT SyA8PAorCQkgU1NQWF9DT1JFX0NOVDMyX1BPTExfVEJVUlNUX01BWF9TSElGVCk7CisJdmFsIHw9 IDB4YjAgPDwgU1NQWF9DT1JFX0NOVDMyX1BPTExfVEJVUlNUX01BWF9TSElGVDsKKwl4dWRjX3dy aXRlbCh4dWRjLCB2YWwsIFNTUFhfQ09SRV9DTlQzMik7CisKKwkvKiBEaXJlY3QgSFMvRlMgcG9y dCBpbnN0YW5jZSB0byBSeERldGVjdC4gKi8KKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENGR19E RVZfRkUpOworCXZhbCAmPSB+KENGR19ERVZfRkVfUE9SVFJFR1NFTF9NQVNLIDw8IENGR19ERVZf RkVfUE9SVFJFR1NFTF9TSElGVCk7CisJdmFsIHw9IENGR19ERVZfRkVfUE9SVFJFR1NFTF9IU0ZT X1BJIDw8IENGR19ERVZfRkVfUE9SVFJFR1NFTF9TSElGVDsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2 YWwsIENGR19ERVZfRkUpOworCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpOworCXZh bCAmPSB+KFBPUlRTQ19DSEFOR0VfTUFTSyB8IChQT1JUU0NfUExTX01BU0sgPDwgUE9SVFNDX1BM U19TSElGVCkpOworCXZhbCB8PSBQT1JUU0NfTFdTIHwgKFBPUlRTQ19QTFNfUlhERVRFQ1QgPDwg UE9SVFNDX1BMU19TSElGVCk7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBQT1JUU0MpOworCisJ LyogRGlyZWN0IFNTIHBvcnQgaW5zdGFuY2UgdG8gUnhEZXRlY3QuICovCisJdmFsID0geHVkY19y ZWFkbCh4dWRjLCBDRkdfREVWX0ZFKTsKKwl2YWwgJj0gfihDRkdfREVWX0ZFX1BPUlRSRUdTRUxf TUFTSyA8PCBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU0hJRlQpOworCXZhbCB8PSBDRkdfREVWX0ZF X1BPUlRSRUdTRUxfU1NfUEkgPDwgQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX1NISUZUOworCXh1ZGNf d3JpdGVsKHh1ZGMsIHZhbCwgQ0ZHX0RFVl9GRSk7CisKKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMs IFBPUlRTQyk7CisJdmFsICY9IH4oUE9SVFNDX0NIQU5HRV9NQVNLIHwgKFBPUlRTQ19QTFNfTUFT SyA8PCBQT1JUU0NfUExTX1NISUZUKSk7CisJdmFsIHw9IFBPUlRTQ19MV1MgfCAoUE9SVFNDX1BM U19SWERFVEVDVCA8PCBQT1JUU0NfUExTX1NISUZUKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWws IFBPUlRTQyk7CisKKwkvKiBSZXN0b3JlIHBvcnQgaW5zdGFuY2UuICovCisJdmFsID0geHVkY19y ZWFkbCh4dWRjLCBDRkdfREVWX0ZFKTsKKwl2YWwgJj0gfihDRkdfREVWX0ZFX1BPUlRSRUdTRUxf TUFTSyA8PCBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU0hJRlQpOworCXh1ZGNfd3JpdGVsKHh1ZGMs IHZhbCwgQ0ZHX0RFVl9GRSk7CisKKwkvKgorCSAqIEVuYWJsZSBJTkZJTklURV9TU19SRVRSWSB0 byBwcmV2ZW50IGRldmljZSBmcm9tIGVudGVyaW5nCisJICogRGlzYWJsZWQuRXJyb3Igd2hlbiBh dHRhY2hlZCB0byBidWdneSBTdXBlclNwZWVkIGh1YnMuCisJICovCisJdmFsID0geHVkY19yZWFk bCh4dWRjLCBDRkdfREVWX0ZFKTsKKwl2YWwgfD0gQ0ZHX0RFVl9GRV9JTkZJTklURV9TU19SRVRS WTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENGR19ERVZfRkUpOworCisJLyogU2V0IGludGVy cnVwdCBtb2RlcmF0aW9uLiAqLworCWltb2QgPSBYVURDX0lOVEVSUlVQVF9NT0RFUkFUSU9OX1VT ICogNDsKKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFJUX0lNT0QpOworCXZhbCAmPSB+KChSVF9J TU9EX0lNT0RJX01BU0sgPDwgUlRfSU1PRF9JTU9ESV9TSElGVCkgfAorCQkgKFJUX0lNT0RfSU1P RENfTUFTSyA8PCBSVF9JTU9EX0lNT0RDX1NISUZUKSk7CisJdmFsIHw9IChpbW9kIDw8IFJUX0lN T0RfSU1PRElfU0hJRlQpIHwgKGltb2QgPDwgUlRfSU1PRF9JTU9EQ19TSElGVCk7CisJeHVkY193 cml0ZWwoeHVkYywgdmFsLCBSVF9JTU9EKTsKKworCS8qIGluY3JlYXNlIFNTUEkgdHJhbnNhY3Rp b24gdGltZW91dCBmcm9tIDMydXMgdG8gNTEydXMgKi8KKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMs IENGR19ERVZfU1NQSV9YRkVSKTsKKwl2YWwgJj0gfihDRkdfREVWX1NTUElfWEZFUl9BQ0tUSU1F T1VUX01BU0sgPDwKKwkJQ0ZHX0RFVl9TU1BJX1hGRVJfQUNLVElNRU9VVF9TSElGVCk7CisJdmFs IHw9ICgweGYwMDAgJiBDRkdfREVWX1NTUElfWEZFUl9BQ0tUSU1FT1VUX01BU0spIDw8CisJCUNG R19ERVZfU1NQSV9YRkVSX0FDS1RJTUVPVVRfU0hJRlQ7CisJeHVkY193cml0ZWwoeHVkYywgdmFs LCBDRkdfREVWX1NTUElfWEZFUik7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19waHlfaW5p dChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwlpbnQgZXJyOworCisJZXJyID0gcGh5X2lu aXQoeHVkYy0+dXRtaV9waHkpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCWVyciA9 IHBoeV9pbml0KHh1ZGMtPnVzYjNfcGh5KTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byBleGl0X3V0 bWlfcGh5OworCXJldHVybiAwOworCitleGl0X3V0bWlfcGh5OgorCXBoeV9leGl0KHh1ZGMtPnV0 bWlfcGh5KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BoeV9l eGl0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXBoeV9leGl0KHh1ZGMtPnVzYjNfcGh5 KTsKKwlwaHlfZXhpdCh4dWRjLT51dG1pX3BoeSk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVk Y19jbGtfaW5pdChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwlzdHJ1Y3QgZGV2aWNlICpk ZXYgPSB4dWRjLT5kZXY7CisJaW50IHJldCA9IDA7CisJdW5zaWduZWQgaW50IGk7CisKKwl4dWRj LT5udW1fY2xrcyA9IG9mX2NvdW50X3BoYW5kbGVfd2l0aF9hcmdzKGRldi0+b2Zfbm9kZSwgImNs b2NrcyIsCisJCQkJCQkgICAgIiNjbG9jay1jZWxscyIpOworCWlmICh4dWRjLT5udW1fY2xrcyA8 PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXh1ZGMtPmNsa3MgPSBkZXZtX2tjYWxsb2MoZGV2 LCB4dWRjLT5udW1fY2xrcywgc2l6ZW9mKCp4dWRjLT5jbGtzKSwKKwkJCQkgIEdGUF9LRVJORUwp OworCWlmICgheHVkYy0+Y2xrcykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlmb3IgKGkgPSAwOyBp IDwgeHVkYy0+bnVtX2Nsa3M7IGkrKykgeworCQl4dWRjLT5jbGtzW2ldID0gb2ZfY2xrX2dldChk ZXYtPm9mX25vZGUsIGkpOworCQlpZiAoSVNfRVJSKHh1ZGMtPmNsa3NbaV0pKSB7CisJCQlyZXQg PSBQVFJfRVJSKHh1ZGMtPmNsa3NbaV0pOworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKworCXJl dHVybiAwOworCitlcnJvcjoKKwl3aGlsZSAoaS0tKQorCQljbGtfcHV0KHh1ZGMtPmNsa3NbaV0p OworCXh1ZGMtPm51bV9jbGtzID0gMDsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lk IHRlZ3JhX3h1ZGNfY2xrX2RlaW5pdChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl1bnNp Z25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB4dWRjLT5udW1fY2xrczsgaSsrKQorCQlj bGtfcHV0KHh1ZGMtPmNsa3NbaV0pOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfY2xrX2Vu YWJsZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlpbnQg cmV0ID0gMDsKKworCWlmICh4dWRjLT5jbGtfZW5hYmxlZCkKKwkJcmV0dXJuIDA7CisKKwlmb3Ig KGkgPSAwOyBpIDwgeHVkYy0+bnVtX2Nsa3M7IGkrKykgeworCQlyZXQgPSBjbGtfcHJlcGFyZV9l bmFibGUoeHVkYy0+Y2xrc1tpXSk7CisJCWlmIChyZXQpCisJCQlnb3RvIGVycm9yOworCX0KKwor CXh1ZGMtPmNsa19lbmFibGVkID0gdHJ1ZTsKKworCXJldHVybiAwOworCitlcnJvcjoKKwl3aGls ZSAoaS0tKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUoeHVkYy0+Y2xrc1tpXSk7CisKKwlyZXR1 cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2Nsa19kaXNhYmxlKHN0cnVjdCB0 ZWdyYV94dWRjICp4dWRjKQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKCF4dWRjLT5jbGtf ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gMDsgaSA8IHh1ZGMtPm51bV9jbGtzOyBp KyspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZSh4dWRjLT5jbGtzW2ldKTsKKworCXh1ZGMtPmNs a19lbmFibGVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVncmEy MTBfeHVkY19zdXBwbHlfbmFtZXNbXSA9IHsKKwkiaHZkZF91c2IiLAorCSJhdmRkaW9fdXNiIiwK KwkiYXZkZF9wbGxfdXRtaXAiLAorfTsKKworc3RhdGljIHN0cnVjdCB0ZWdyYV94dWRjX3NvY19k YXRhIHRlZ3JhMjEwX3h1ZGNfc29jX2RhdGEgPSB7CisJLmRldmljZV9pZCA9IFhVRENfREVWSUNF X0lEX1QyMTAsCisJLnN1cHBseV9uYW1lcyA9IHRlZ3JhMjEwX3h1ZGNfc3VwcGx5X25hbWVzLAor CS5udW1fc3VwcGxpZXMgPSBBUlJBWV9TSVpFKHRlZ3JhMjEwX3h1ZGNfc3VwcGx5X25hbWVzKSwK KwkudTFfZW5hYmxlID0gZmFsc2UsCisJLnUyX2VuYWJsZSA9IHRydWUsCisJLmxwbV9lbmFibGUg PSBmYWxzZSwKKwkuaW52YWxpZF9zZXFfbnVtID0gdHJ1ZSwKKwkucGxzX3F1aXJrID0gdHJ1ZSwK KwkucG9ydF9yZXNldF9xdWlyayA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCB0ZWdyYV94dWRjX29mX21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9 ICJudmlkaWEsdGVncmEyMTAteHVkYyIsCisJCS5kYXRhID0gJnRlZ3JhMjEwX3h1ZGNfc29jX2Rh dGEKKwl9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhX3h1ZGNfb2Zf bWF0Y2gpOworCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3Bvd2VyZG9tYWluX3JlbW92ZShzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwlpZiAoeHVkYy0+Z2VucGRfZGxfc3MpCisJCWRldmlj ZV9saW5rX2RlbCh4dWRjLT5nZW5wZF9kbF9zcyk7CisJaWYgKHh1ZGMtPmdlbnBkX2RsX2Rldmlj ZSkKKwkJZGV2aWNlX2xpbmtfZGVsKHh1ZGMtPmdlbnBkX2RsX2RldmljZSk7CisJaWYgKHh1ZGMt PmdlbnBkX2Rldl9zcykKKwkJZGV2X3BtX2RvbWFpbl9kZXRhY2goeHVkYy0+Z2VucGRfZGV2X3Nz LCB0cnVlKTsKKwlpZiAoeHVkYy0+Z2VucGRfZGV2X2RldmljZSkKKwkJZGV2X3BtX2RvbWFpbl9k ZXRhY2goeHVkYy0+Z2VucGRfZGV2X2RldmljZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdGVn cmFfeHVkY19wb3dlcmRvbWFpbl9pbml0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXN0 cnVjdCBkZXZpY2UgKmRldiA9IHh1ZGMtPmRldjsKKwlpbnQgZXJyOworCisJeHVkYy0+Z2VucGRf ZGV2X2RldmljZSA9IGRldl9wbV9kb21haW5fYXR0YWNoX2J5X25hbWUoZGV2LAorCQkJCQkJCQki eHVzYl9kZXZpY2UiKTsKKwlpZiAoSVNfRVJSKHh1ZGMtPmdlbnBkX2Rldl9kZXZpY2UpKSB7CisJ CWVyciA9IFBUUl9FUlIoeHVkYy0+Z2VucGRfZGV2X2RldmljZSk7CisJCWRldl9lcnIoZGV2LCAi ZmFpbGVkIHRvIGdldCBkZXZpY2UgcG0tZG9tYWluOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVy cjsKKwl9CisKKwl4dWRjLT5nZW5wZF9kZXZfc3MgPSBkZXZfcG1fZG9tYWluX2F0dGFjaF9ieV9u YW1lKGRldiwgInh1c2Jfc3MiKTsKKwlpZiAoSVNfRVJSKHh1ZGMtPmdlbnBkX2Rldl9zcykpIHsK KwkJZXJyID0gUFRSX0VSUih4dWRjLT5nZW5wZF9kZXZfc3MpOworCQlkZXZfZXJyKGRldiwgImZh aWxlZCB0byBnZXQgc3VwZXJzcGVlZCBwbS1kb21haW46ICVkXG4iLCBlcnIpOworCQlyZXR1cm4g ZXJyOworCX0KKworCXh1ZGMtPmdlbnBkX2RsX2RldmljZSA9IGRldmljZV9saW5rX2FkZChkZXYs IHh1ZGMtPmdlbnBkX2Rldl9kZXZpY2UsCisJCQkJCSAgICAgICBETF9GTEFHX1BNX1JVTlRJTUUg fAorCQkJCQkgICAgICAgRExfRkxBR19TVEFURUxFU1MpOworCWlmICgheHVkYy0+Z2VucGRfZGxf ZGV2aWNlKSB7CisJCWRldl9lcnIoZGV2LCAiYWRkaW5nIHVzYiBkZXZpY2UgZGV2aWNlIGxpbmsg ZmFpbGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXh1ZGMtPmdlbnBkX2RsX3Nz ID0gZGV2aWNlX2xpbmtfYWRkKGRldiwgeHVkYy0+Z2VucGRfZGV2X3NzLAorCQkJCQkgICAgIERM X0ZMQUdfUE1fUlVOVElNRSB8CisJCQkJCSAgICAgRExfRkxBR19TVEFURUxFU1MpOworCWlmICgh eHVkYy0+Z2VucGRfZGxfc3MpIHsKKwkJZGV2X2VycihkZXYsICJhZGRpbmcgc3VwZXJzcGVlZCBk ZXZpY2UgbGluayBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2 aWNlICpwZGV2KQoreworCWNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgKm1hdGNoOworCXN0cnVj dCB0ZWdyYV94dWRjICp4dWRjOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCXVuc2lnbmVkIGlu dCBpOworCWludCBlcnI7CisKKwl4dWRjID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVv ZigqeHVkYyksIEdGUF9BVE9NSUMpOworCWlmICgheHVkYykKKwkJcmV0dXJuIC1FTk9NRU07CisJ eHVkYy0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB4dWRj KTsKKworCW1hdGNoID0gb2ZfbWF0Y2hfZGV2aWNlKHRlZ3JhX3h1ZGNfb2ZfbWF0Y2gsICZwZGV2 LT5kZXYpOworCWlmICghbWF0Y2gpCisJCXJldHVybiAtRU5PREVWOworCXh1ZGMtPnNvYyA9IG1h dGNoLT5kYXRhOworCisJLyogc2V0IG1vZHVsZSBwYXJhbWV0ZXIgZGVmYXVsdCB2YWx1ZXMgZnJv bSBzb2MgZGF0YSAqLworCXUxX2VuYWJsZSA9IHh1ZGMtPnNvYy0+dTFfZW5hYmxlOworCXUyX2Vu YWJsZSA9IHh1ZGMtPnNvYy0+dTJfZW5hYmxlOworCWxwbV9lbmFibGUgPSB4dWRjLT5zb2MtPmxw bV9lbmFibGU7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJD RV9NRU0sIDApOworCWlmICghcmVzKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRv IGdldCBtZW0gcmVzb3VyY2UgMFxuIik7CisJCXJldHVybiAtRU5YSU87CisJfQorCXh1ZGMtPmJh c2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJS KHh1ZGMtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih4dWRjLT5iYXNlKTsKKwl4dWRjLT5waHlz X2Jhc2UgPSByZXMtPnN0YXJ0OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYs IElPUkVTT1VSQ0VfTUVNLCAxKTsKKwlpZiAoIXJlcykgeworCQlkZXZfZXJyKHh1ZGMtPmRldiwg ImZhaWxlZCB0byBnZXQgbWVtIHJlc291cmNlIDFcbiIpOworCQlyZXR1cm4gLUVOWElPOworCX0K Kwl4dWRjLT5mcGNpID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJ aWYgKElTX0VSUih4dWRjLT5mcGNpKSkKKwkJcmV0dXJuIFBUUl9FUlIoeHVkYy0+ZnBjaSk7CisK KwlpZiAoWFVEQ19JU19UMjEwKHh1ZGMpKSB7CisJCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJj ZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMik7CisJCWlmICghcmVzKSB7CisJCQlkZXZfZXJyKHh1 ZGMtPmRldiwgImZhaWxlZCB0byBnZXQgbWVtIHJlc291cmNlIDJcbiIpOworCQkJcmV0dXJuIC1F TlhJTzsKKwkJfQorCQl4dWRjLT5pcGZzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5k ZXYsIHJlcyk7CisJCWlmIChJU19FUlIoeHVkYy0+aXBmcykpCisJCQlyZXR1cm4gUFRSX0VSUih4 dWRjLT5pcGZzKTsKKwl9CisKKwl4dWRjLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDAp OworCWlmICh4dWRjLT5pcnEgPCAwKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRv IGdldCBpcnEgcmVzb3VyY2UgMDogJWRcbiIsCisJCQkJeHVkYy0+aXJxKTsKKwkJcmV0dXJuIHh1 ZGMtPmlycTsKKwl9CisJZXJyID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB4dWRjLT5p cnEsIHRlZ3JhX3h1ZGNfaXJxLCAwLAorCQkJICAgICAgIGRldl9uYW1lKCZwZGV2LT5kZXYpLCB4 dWRjKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKHh1ZGMtPmRldiwgImZhaWxlZCB0byBj bGFpbSBpcnEgJWRcbiIsIGVycik7CisJCXJldHVybiBlcnI7CisJfQorCisJZXJyID0gdGVncmFf eHVkY19jbGtfaW5pdCh4dWRjKTsKKwlpZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKHh1ZGMtPmRl diwgImZhaWxlZCB0byBpbml0IGNsb2NrcyAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9 CisKKwl4dWRjLT5zdXBwbGllcyA9IGRldm1fa2NhbGxvYygmcGRldi0+ZGV2LCB4dWRjLT5zb2Mt Pm51bV9zdXBwbGllcywKKwkJCQkgICAgICBzaXplb2YoKnh1ZGMtPnN1cHBsaWVzKSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCF4dWRjLT5zdXBwbGllcykKKwkJcmV0dXJuIC1FTk9NRU07CisJZm9yIChp ID0gMDsgaSA8IHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVzOyBpKyspCisJCXh1ZGMtPnN1cHBsaWVz W2ldLnN1cHBseSA9IHh1ZGMtPnNvYy0+c3VwcGx5X25hbWVzW2ldOworCWVyciA9IGRldm1fcmVn dWxhdG9yX2J1bGtfZ2V0KCZwZGV2LT5kZXYsIHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVzLAorCQkJ CSAgICAgIHh1ZGMtPnN1cHBsaWVzKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2 LCAiZmFpbGVkIHRvIHJlcXVlc3QgcmVndWxhdG9ycyAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVy cjsKKwl9CisKKwl4dWRjLT5wYWRjdGwgPSB0ZWdyYV94dXNiX3BhZGN0bF9nZXQoJnBkZXYtPmRl dik7CisJaWYgKElTX0VSUih4dWRjLT5wYWRjdGwpKQorCQlyZXR1cm4gUFRSX0VSUih4dWRjLT5w YWRjdGwpOworCisJZXJyID0gcmVndWxhdG9yX2J1bGtfZW5hYmxlKHh1ZGMtPnNvYy0+bnVtX3N1 cHBsaWVzLCB4dWRjLT5zdXBwbGllcyk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKHh1ZGMtPmRl diwgImZhaWxlZCB0byBlbmFibGUgcmVndWxhdG9ycyAlZFxuIiwgZXJyKTsKKwkJZ290byBwdXRf cGFkY3RsOworCX0KKworCXh1ZGMtPnVzYjNfcGh5ID0gZGV2bV9waHlfb3B0aW9uYWxfZ2V0KCZw ZGV2LT5kZXYsICJ1c2IzIik7CisJaWYgKElTX0VSUih4dWRjLT51c2IzX3BoeSkpIHsKKwkJZXJy ID0gUFRSX0VSUih4dWRjLT51c2IzX3BoeSk7CisJCWlmIChlcnIgPT0gLUVQUk9CRV9ERUZFUikK KwkJCWRldl9pbmZvKHh1ZGMtPmRldiwgInVzYjMgcGh5IGlzIG5vdCBhdmFpbGFibGUgeWV0XG4i KTsKKwkJZWxzZQorCQkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVzYjMgcGh5 ICVkXG4iLCBlcnIpOworCQlnb3RvIGRpc2FibGVfcmVndWxhdG9yOworCX0KKwl4dWRjLT51dG1p X3BoeSA9IGRldm1fcGh5X29wdGlvbmFsX2dldCgmcGRldi0+ZGV2LCAidXNiMiIpOworCWlmIChJ U19FUlIoeHVkYy0+dXRtaV9waHkpKSB7CisJCWVyciA9IFBUUl9FUlIoeHVkYy0+dXRtaV9waHkp OworCQlpZiAoZXJyID09IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfaW5mbyh4dWRjLT5kZXYsICJ1 c2IyIHBoeSBpcyBub3QgYXZhaWxhYmxlIHlldFxuIik7CisJCWVsc2UKKwkJCWRldl9lcnIoeHVk Yy0+ZGV2LCAiZmFpbGVkIHRvIGdldCB1c2IyIHBoeSAlZFxuIiwgZXJyKTsKKwkJZ290byBkaXNh YmxlX3JlZ3VsYXRvcjsKKwl9CisKKwl4dWRjLT5kYXRhX3JvbGVfZXh0Y29uID0gZXh0Y29uX2dl dF9lZGV2X2J5X3BoYW5kbGUoJnBkZXYtPmRldiwgMCk7CisJaWYgKElTX0VSUih4dWRjLT5kYXRh X3JvbGVfZXh0Y29uKSkgeworCQllcnIgPSBQVFJfRVJSKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24p OworCQlpZiAoZXJyICE9IC1FUFJPQkVfREVGRVIpCisJCQlkZXZfZXJyKHh1ZGMtPmRldiwKKwkJ CQkiZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUgZmFpbGVkICVkXG4iLAorCQkJCWVycik7CisJ CWRldl9lcnIoeHVkYy0+ZGV2LCAiZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUgZmFpbGVkICVk XG4iLAorCQkJCWVycik7CisJCWdvdG8gZGlzYWJsZV9yZWd1bGF0b3I7CisJfQorCisKKwllcnIg PSB0ZWdyYV94dWRjX3Bvd2VyZG9tYWluX2luaXQoeHVkYyk7CisJaWYgKGVycikKKwkJZ290byBw dXRfcG93ZXJkb21haW5zOworCisJZXJyID0gdGVncmFfeHVkY19waHlfaW5pdCh4dWRjKTsKKwlp ZiAoZXJyKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAicGh5IGluaXQgZmFpbGVkICVkXG4iLCBl cnIpOworCQlnb3RvIHB1dF9wb3dlcmRvbWFpbnM7CisJfQorCisJZXJyID0gdGVncmFfeHVkY19h bGxvY19ldmVudF9yaW5nKHh1ZGMpOworCWlmIChlcnIpCisJCWdvdG8gZGlzYWJsZV9waHk7CisK KwllcnIgPSB0ZWdyYV94dWRjX2FsbG9jX2Vwcyh4dWRjKTsKKwlpZiAoZXJyKQorCQlnb3RvIGZy ZWVfZXZlbnRfcmluZzsKKworCXNwaW5fbG9ja19pbml0KCZ4dWRjLT5sb2NrKTsKKwlpbml0X2Nv bXBsZXRpb24oJnh1ZGMtPmRpc2Nvbm5lY3RfY29tcGxldGUpOworCisJSU5JVF9XT1JLKCZ4dWRj LT5kYXRhX3JvbGVfd29yaywgdGVncmFfeHVkY19kYXRhX3JvbGVfd29yayk7CisJeHVkYy0+ZGF0 YV9yb2xlX25iLm5vdGlmaWVyX2NhbGwgPSB0ZWdyYV94dWRjX2RhdGFfcm9sZV9ub3RpZmllcjsK KwlleHRjb25fcmVnaXN0ZXJfbm90aWZpZXIoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbiwgRVhUQ09O X1VTQiwKKwkJCQkgJnh1ZGMtPmRhdGFfcm9sZV9uYik7CisKKwlJTklUX0RFTEFZRURfV09SSygm eHVkYy0+cGxjX3Jlc2V0X3dvcmssIHRlZ3JhX3h1ZGNfcGxjX3Jlc2V0X3dvcmspOworCisJSU5J VF9ERUxBWUVEX1dPUksoJnh1ZGMtPnBvcnRfcmVzZXRfd2FyX3dvcmssCisJCQkJdGVncmFfeHVk Y19wb3J0X3Jlc2V0X3dhcl93b3JrKTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKCZwZGV2LT5kZXYp OworCisJeHVkYy0+Z2FkZ2V0Lm9wcyA9ICZ0ZWdyYV94dWRjX2dhZGdldF9vcHM7CisJeHVkYy0+ Z2FkZ2V0LmVwMCA9ICZ4dWRjLT5lcFswXS51c2JfZXA7CisJeHVkYy0+Z2FkZ2V0Lm5hbWUgPSAi dGVncmEteHVkYyI7CisJeHVkYy0+Z2FkZ2V0Lm1heF9zcGVlZCA9IFVTQl9TUEVFRF9TVVBFUjsK KworCWVyciA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmcGRldi0+ZGV2LCAmeHVkYy0+Z2FkZ2V0KTsK KwlpZiAoZXJyKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImZhaWxlZCB0byB1c2JfYWRkX2dh ZGdldF91ZGNcbiIpOworCQlnb3RvIGZyZWVfZXBzOworCX0KKworCXRlZ3JhX3h1ZGNfdXBkYXRl X2RhdGFfcm9sZSh4dWRjKTsKKworCXJldHVybiAwOworCitmcmVlX2VwczoKKwl0ZWdyYV94dWRj X2ZyZWVfZXBzKHh1ZGMpOworZnJlZV9ldmVudF9yaW5nOgorCXRlZ3JhX3h1ZGNfZnJlZV9ldmVu dF9yaW5nKHh1ZGMpOworZGlzYWJsZV9waHk6CisJdGVncmFfeHVkY19waHlfZXhpdCh4dWRjKTsK K3B1dF9wb3dlcmRvbWFpbnM6CisJdGVncmFfeHVkY19wb3dlcmRvbWFpbl9yZW1vdmUoeHVkYyk7 CitkaXNhYmxlX3JlZ3VsYXRvcjoKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHh1ZGMtPnNvYy0+ bnVtX3N1cHBsaWVzLCB4dWRjLT5zdXBwbGllcyk7CitwdXRfcGFkY3RsOgorCXRlZ3JhX3h1c2Jf cGFkY3RsX3B1dCh4dWRjLT5wYWRjdGwpOworCXRlZ3JhX3h1ZGNfY2xrX2RlaW5pdCh4dWRjKTsK KworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19yZW1vdmUoc3RydWN0 IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHBs YXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCisJcG1fcnVudGltZV9nZXRfc3luYyh4dWRjLT5k ZXYpOworCisJY2FuY2VsX2RlbGF5ZWRfd29yaygmeHVkYy0+cGxjX3Jlc2V0X3dvcmspOworCWlm ICh4dWRjLT5kYXRhX3JvbGVfZXh0Y29uKSB7CisJCWV4dGNvbl91bnJlZ2lzdGVyX25vdGlmaWVy KHh1ZGMtPmRhdGFfcm9sZV9leHRjb24sIEVYVENPTl9VU0IsCisJCQkJJnh1ZGMtPmRhdGFfcm9s ZV9uYik7CisJCWNhbmNlbF93b3JrX3N5bmMoJnh1ZGMtPmRhdGFfcm9sZV93b3JrKTsKKwl9CisJ dXNiX2RlbF9nYWRnZXRfdWRjKCZ4dWRjLT5nYWRnZXQpOworCXRlZ3JhX3h1ZGNfZnJlZV9lcHMo eHVkYyk7CisJdGVncmFfeHVkY19mcmVlX2V2ZW50X3JpbmcoeHVkYyk7CisJdGVncmFfeHVkY19w b3dlcmRvbWFpbl9yZW1vdmUoeHVkYyk7CisKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHh1ZGMt PnNvYy0+bnVtX3N1cHBsaWVzLCB4dWRjLT5zdXBwbGllcyk7CisKKwlwaHlfcG93ZXJfb2ZmKHh1 ZGMtPnV0bWlfcGh5KTsKKwlwaHlfcG93ZXJfb2ZmKHh1ZGMtPnVzYjNfcGh5KTsKKwl0ZWdyYV94 dWRjX3BoeV9leGl0KHh1ZGMpOworCXBtX3J1bnRpbWVfZGlzYWJsZSh4dWRjLT5kZXYpOworCXBt X3J1bnRpbWVfcHV0KHh1ZGMtPmRldik7CisJdGVncmFfeHVkY19jbGtfZGVpbml0KHh1ZGMpOwor CisJdGVncmFfeHVzYl9wYWRjdGxfcHV0KHh1ZGMtPnBhZGN0bCk7CisKKwlyZXR1cm4gMDsKK30K KworI2lmIElTX0VOQUJMRUQoQ09ORklHX1BNX1NMRUVQKSB8fCBJU19FTkFCTEVEKENPTkZJR19Q TSkKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19wb3dlcmdhdGUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWRldl9pbmZvKHh1ZGMtPmRldiwgImVu dGVyaW5nIEVMUEdcbiIpOworCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7 CisJeHVkYy0+cG93ZXJnYXRlZCA9IHRydWU7CisJeHVkYy0+c2F2ZWRfcmVncy5jdHJsID0geHVk Y19yZWFkbCh4dWRjLCBDVFJMKTsKKwl4dWRjLT5zYXZlZF9yZWdzLnBvcnRwbSA9IHh1ZGNfcmVh ZGwoeHVkYywgUE9SVFBNKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCAwLCBDVFJMKTsKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisKKwl0ZWdyYV94dWRjX2Nsa19k aXNhYmxlKHh1ZGMpOworCXRlZ3JhX3Bvd2VyZ2F0ZV9wb3dlcl9vZmYoVEVHUkFfUE9XRVJHQVRF X1hVU0JBKTsKKwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVz LCB4dWRjLT5zdXBwbGllcyk7CisKKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJlbnRlcmluZyBFTFBH IGRvbmVcbiIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfdW5wb3dl cmdhdGUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsK KwlpbnQgZXJyOworCisJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZXhpdGluZyBFTFBHXG4iKTsKKwor CWVyciA9IHJlZ3VsYXRvcl9idWxrX2VuYWJsZSh4dWRjLT5zb2MtPm51bV9zdXBwbGllcywKKwkJ CXh1ZGMtPnN1cHBsaWVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCisJZXJy ID0gdGVncmFfeHVkY19jbGtfZW5hYmxlKHh1ZGMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4g ZXJyOworCisJdGVncmFfeHVkY19mcGNpX2lwZnNfaW5pdCh4dWRjKTsKKwl0ZWdyYV94dWRjX2Rl dmljZV9wYXJhbXNfaW5pdCh4dWRjKTsKKworCXRlZ3JhX3h1ZGNfaW5pdF9ldmVudF9yaW5nKHh1 ZGMpOworCXRlZ3JhX3h1ZGNfaW5pdF9lcHMoeHVkYyk7CisKKwl4dWRjX3dyaXRlbCh4dWRjLCB4 dWRjLT5zYXZlZF9yZWdzLnBvcnRwbSwgUE9SVFBNKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB4dWRj LT5zYXZlZF9yZWdzLmN0cmwsIENUUkwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxv Y2ssIGZsYWdzKTsKKwl4dWRjLT5wb3dlcmdhdGVkID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCisJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZXhp dGluZyBFTFBHIGRvbmVcbiIpOworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05G SUdfUE1fU0xFRVAKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19zdXNwZW5kKHN0cnVjdCBkZXZpY2Ug KmRldikKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYp OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9j aywgZmxhZ3MpOworCXh1ZGMtPnN1c3BlbmRlZCA9IHRydWU7CisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCisJaWYgKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24p CisJCWZsdXNoX3dvcmsoJnh1ZGMtPmRhdGFfcm9sZV93b3JrKTsKKworCS8qIEZvcmNpYmx5IGRp c2Nvbm5lY3QgYmVmb3JlIHBvd2VyZ2F0aW5nLiAqLworCXRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVf b2ZmKHh1ZGMpOworCisJaWYgKCFwbV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoZGV2KSkKKwkJ dGVncmFfeHVkY19wb3dlcmdhdGUoeHVkYyk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsK KworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcmVzdW1lKHN0cnVjdCBk ZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0 YShkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWVyciA9IHRlZ3Jh X3h1ZGNfdW5wb3dlcmdhdGUoeHVkYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisK KwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCXh1ZGMtPnN1c3BlbmRl ZCA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsK KworCXRlZ3JhX3h1ZGNfdXBkYXRlX2RhdGFfcm9sZSh4dWRjKTsKKworCXBtX3J1bnRpbWVfZW5h YmxlKGRldik7CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNCitz dGF0aWMgaW50IHRlZ3JhX3h1ZGNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikK K3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxh Z3MpOworCWlmIChXQVJOX09OKHh1ZGMtPmRldmljZV9tb2RlKSkgeworCQlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiB0ZWdy YV94dWRjX3Bvd2VyZ2F0ZSh4dWRjKTsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX3J1bnRp bWVfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVk YyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHRlZ3JhX3h1ZGNfdW5wb3dlcmdh dGUoeHVkYyk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZXZfcG1fb3BzIHRl Z3JhX3h1ZGNfcG1fb3BzID0geworCVNFVF9TWVNURU1fU0xFRVBfUE1fT1BTKHRlZ3JhX3h1ZGNf c3VzcGVuZCwgdGVncmFfeHVkY19yZXN1bWUpCisJU0VUX1JVTlRJTUVfUE1fT1BTKHRlZ3JhX3h1 ZGNfcnVudGltZV9zdXNwZW5kLAorCQkJICAgdGVncmFfeHVkY19ydW50aW1lX3Jlc3VtZSwgTlVM TCkKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHRlZ3JhX3h1ZGNfZHJpdmVy ID0geworCS5wcm9iZSA9IHRlZ3JhX3h1ZGNfcHJvYmUsCisJLnJlbW92ZSA9IHRlZ3JhX3h1ZGNf cmVtb3ZlLAorCS5kcml2ZXIgPSB7CisJCS5uYW1lID0gInRlZ3JhLXh1ZGMiLAorCQkucG0gPSAm dGVncmFfeHVkY19wbV9vcHMsCisJCS5vZl9tYXRjaF90YWJsZSA9IHRlZ3JhX3h1ZGNfb2ZfbWF0 Y2gsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKHRlZ3JhX3h1ZGNfZHJpdmVyKTsK KworTU9EVUxFX0RFU0NSSVBUSU9OKCJOVklESUEgVGVncmEgWFVTQiBEZXZpY2UgQ29udHJvbGxl ciIpOworTU9EVUxFX0FVVEhPUigiQW5kcmV3IEJyZXN0aWNrZXIgPGFicmVzdGljQGNocm9taXVt Lm9yZz4iKTsKK01PRFVMRV9BVVRIT1IoIkh1aSBGdSIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCB2 MiIpOwo=