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: [V2,7/8] usb: gadget: Add UDC driver for tegra XUSB device mode controller From: Nagarjuna Kristam Message-Id: <1552302716-18554-8-git-send-email-nkristam@nvidia.com> Date: Mon, 11 Mar 2019 16:41:55 +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 cy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAgICAgfCAgIDEwICsKIGRyaXZlcnMvdXNiL2dhZGdl dC91ZGMvTWFrZWZpbGUgICAgIHwgICAgMSArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL3RlZ3Jh X3h1ZGMuYyB8IDM3MDIgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysKIDMgZmls ZXMgY2hhbmdlZCwgMzcxMyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRjLmMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9n YWRnZXQvdWRjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKaW5kZXgg MGExNmNiZC4uZjZmNDY5YyAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29u ZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwpAQCAtNDM5LDYgKzQzOSwx NiBAQCBjb25maWcgVVNCX0dBREdFVF9YSUxJTlgKIAkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1 bGUgY2FsbGVkICJ1ZGMteGlsaW54IiBhbmQgZm9yY2UgYWxsCiAJICBnYWRnZXQgZHJpdmVycyB0 byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAorY29uZmlnIFVTQl9URUdSQV9YVURDCisJ dHJpc3RhdGUgIk5WSURJQSBTdXBlcnNwZWVkIFVTQiAzLjAgRGV2aWNlIENvbnRyb2xsZXIiCisJ ZGVwZW5kcyBvbiBBUkNIX1RFR1JBCisJaGVscAorCSBFbmFibGVzIFRFR1JBIFVTQiAzLjAgZGV2 aWNlIG1vZGUgY29udHJvbGxlciBkcml2ZXIuCisKKwkgU2F5ICJ5IiB0byBsaW5rIHRoZSBkcml2 ZXIgc3RhdGljYWxseSwgb3IgIm0iIHRvIGJ1aWxkIGEKKwkgZHluYW1pY2FsbHkgbGlua2VkIG1v ZHVsZSBjYWxsZWQgInRlZ3JhX3h1ZGMiIGFuZCBmb3JjZSBhbGwKKwkgZ2FkZ2V0IGRyaXZlcnMg dG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQuCisKIHNvdXJjZSAiZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIgogCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQpp bmRleCA4OTdmNjQ4Li4xYzU1Yzk2IDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRj L01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUKQEAgLTI0LDYg KzI0LDcgQEAgb2JqLSQoQ09ORklHX1VTQl9CQ002M1hYX1VEQykJKz0gYmNtNjN4eF91ZGMubwog b2JqLSQoQ09ORklHX1VTQl9GU0xfVVNCMikJKz0gZnNsX3VzYjJfdWRjLm8KIGZzbF91c2IyX3Vk Yy15CQkJOj0gZnNsX3VkY19jb3JlLm8KIGZzbF91c2IyX3VkYy0kKENPTkZJR19BUkNIX01YQykJ Kz0gZnNsX214Y191ZGMubworb2JqLSQoQ09ORklHX1VTQl9URUdSQV9YVURDKQkrPSB0ZWdyYV94 dWRjLm8KIG9iai0kKENPTkZJR19VU0JfTTY2NTkyKQkrPSBtNjY1OTItdWRjLm8KIG9iai0kKENP TkZJR19VU0JfUjhBNjY1OTcpCSs9IHI4YTY2NTk3LXVkYy5vCiBvYmotJChDT05GSUdfVVNCX1JF TkVTQVNfVVNCMykJKz0gcmVuZXNhc191c2IzLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dh ZGdldC91ZGMvdGVncmFfeHVkYy5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy90ZWdyYV94dWRj LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBiZWRhMAotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvdGVncmFfeHVkYy5jCkBAIC0wLDAgKzEs MzcwMiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICogTlZJ RElBIFhVU0IgZGV2aWNlIG1vZGUgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoYykgMjAx My0yMDE5LCBOVklESUEgQ09SUE9SQVRJT04uICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29w eXJpZ2h0IChjKSAyMDE1LCBHb29nbGUgSW5jLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9jbGsu aD4KKyNpbmNsdWRlIDxsaW51eC9jb21wbGV0aW9uLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXku aD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYXBv b2wuaD4KKyNpbmNsdWRlIDxsaW51eC9leHRjb24uaD4KKyNpbmNsdWRlIDxsaW51eC9leHRjb24t cHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51 eC9pb3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9t b2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2Rldmlj ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BoeS9waHkuaD4KKyNpbmNsdWRlIDxsaW51eC9waHkvdGVn cmEveHVzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX2RvbWFpbi5oPgorI2luY2x1ZGUgPGxpbnV4 L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BtX3J1bnRpbWUuaD4KKyNpbmNs dWRlIDxsaW51eC9yZWd1bGF0b3IvY29uc3VtZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9yZXNldC5o PgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jaDkuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0 Lmg+CisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisKKy8qIFhVU0JfREVWIHJlZ2lzdGVy cyAqLworI2RlZmluZSBTUEFSQU0gMHgwMDAKKyNkZWZpbmUgIFNQQVJBTV9FUlNUTUFYX1NISUZU IDE2CisjZGVmaW5lICBTUEFSQU1fRVJTVE1BWF9NQVNLIDB4MWYKKyNkZWZpbmUgREIgMHgwMDQK KyNkZWZpbmUgIERCX1RBUkdFVF9TSElGVCA4CisjZGVmaW5lICBEQl9UQVJHRVRfTUFTSyAweGZm CisjZGVmaW5lICBEQl9TVFJFQU1JRF9TSElGVCAxNgorI2RlZmluZSAgREJfU1RSRUFNSURfTUFT SyAweGZmZmYKKyNkZWZpbmUgRVJTVFNaIDB4MDA4CisjZGVmaW5lICBFUlNUU1pfRVJTVFhTWl9T SElGVCh4KSAoKHgpICogMTYpCisjZGVmaW5lICBFUlNUU1pfRVJTVFhTWl9NQVNLIDB4ZmZmZgor I2RlZmluZSBFUlNUWEJBTE8oeCkgKDB4MDEwICsgOCAqICh4KSkKKyNkZWZpbmUgRVJTVFhCQUhJ KHgpICgweDAxNCArIDggKiAoeCkpCisjZGVmaW5lIEVSRFBMTyAweDAyMAorI2RlZmluZSAgRVJE UExPX0VIQiBCSVQoMykKKyNkZWZpbmUgRVJEUEhJIDB4MDI0CisjZGVmaW5lIEVSRVBMTyAweDAy OAorI2RlZmluZSAgRVJFUExPX0VDUyBCSVQoMCkKKyNkZWZpbmUgIEVSRVBMT19TRUdJIEJJVCgx KQorI2RlZmluZSBFUkVQSEkgMHgwMmMKKyNkZWZpbmUgQ1RSTCAweDAzMAorI2RlZmluZSAgQ1RS TF9SVU4gQklUKDApCisjZGVmaW5lICBDVFJMX0xTRSBCSVQoMSkKKyNkZWZpbmUgIENUUkxfSUUg QklUKDQpCisjZGVmaW5lICBDVFJMX1NNSV9FVlQgQklUKDUpCisjZGVmaW5lICBDVFJMX1NNSV9E U0UgQklUKDYpCisjZGVmaW5lICBDVFJMX0VXRSBCSVQoNykKKyNkZWZpbmUgIENUUkxfREVWQURE Ul9TSElGVCAyNAorI2RlZmluZSAgQ1RSTF9ERVZBRERSX01BU0sgMHg3ZgorI2RlZmluZSAgQ1RS TF9FTkFCTEUgQklUKDMxKQorI2RlZmluZSBTVCAweDAzNAorI2RlZmluZSAgU1RfUkMgQklUKDAp CisjZGVmaW5lICBTVF9JUCBCSVQoNCkKKyNkZWZpbmUgUlRfSU1PRAkweDAzOAorI2RlZmluZSAg UlRfSU1PRF9JTU9ESV9TSElGVCAwCisjZGVmaW5lICBSVF9JTU9EX0lNT0RJX01BU0sgMHhmZmZm CisjZGVmaW5lICBSVF9JTU9EX0lNT0RDX1NISUZUIDE2CisjZGVmaW5lICBSVF9JTU9EX0lNT0RD X01BU0sgMHhmZmZmCisjZGVmaW5lIFBPUlRTQyAweDAzYworI2RlZmluZSAgUE9SVFNDX0NDUyBC SVQoMCkKKyNkZWZpbmUgIFBPUlRTQ19QRUQgQklUKDEpCisjZGVmaW5lICBQT1JUU0NfUFIgQklU KDQpCisjZGVmaW5lICBQT1JUU0NfUExTX1NISUZUIDUKKyNkZWZpbmUgIFBPUlRTQ19QTFNfTUFT SyAweGYKKyNkZWZpbmUgIFBPUlRTQ19QTFNfVTAgMHgwCisjZGVmaW5lICBQT1JUU0NfUExTX1Uy IDB4MgorI2RlZmluZSAgUE9SVFNDX1BMU19VMyAweDMKKyNkZWZpbmUgIFBPUlRTQ19QTFNfRElT QUJMRUQgMHg0CisjZGVmaW5lICBQT1JUU0NfUExTX1JYREVURUNUIDB4NQorI2RlZmluZSAgUE9S VFNDX1BMU19JTkFDVElWRSAweDYKKyNkZWZpbmUgIFBPUlRTQ19QTFNfUkVTVU1FIDB4ZgorI2Rl ZmluZSAgUE9SVFNDX1BTX1NISUZUIDEwCisjZGVmaW5lICBQT1JUU0NfUFNfTUFTSyAweGYKKyNk ZWZpbmUgIFBPUlRTQ19QU19VTkRFRklORUQgMHgwCisjZGVmaW5lICBQT1JUU0NfUFNfRlMgMHgx CisjZGVmaW5lICBQT1JUU0NfUFNfTFMgMHgyCisjZGVmaW5lICBQT1JUU0NfUFNfSFMgMHgzCisj ZGVmaW5lICBQT1JUU0NfUFNfU1MgMHg0CisjZGVmaW5lICBQT1JUU0NfTFdTIEJJVCgxNikKKyNk ZWZpbmUgIFBPUlRTQ19DU0MgQklUKDE3KQorI2RlZmluZSAgUE9SVFNDX1dSQyBCSVQoMTkpCisj ZGVmaW5lICBQT1JUU0NfUFJDIEJJVCgyMSkKKyNkZWZpbmUgIFBPUlRTQ19QTEMgQklUKDIyKQor I2RlZmluZSAgUE9SVFNDX0NFQyBCSVQoMjMpCisjZGVmaW5lICBQT1JUU0NfV1BSIEJJVCgzMCkK KyNkZWZpbmUgIFBPUlRTQ19DSEFOR0VfTUFTSyAoUE9SVFNDX0NTQyB8IFBPUlRTQ19XUkMgfCBQ T1JUU0NfUFJDIHwgXAorCQkJICAgICBQT1JUU0NfUExDIHwgUE9SVFNDX0NFQykKKyNkZWZpbmUg RUNQTE8gMHgwNDAKKyNkZWZpbmUgRUNQSEkgMHgwNDQKKyNkZWZpbmUgTUZJTkRFWCAweDA0OAor I2RlZmluZSAgTUZJTkRFWF9VRlJBTUVfU0hJRlQgMAorI2RlZmluZSAgTUZJTkRFWF9VRlJBTUVf TUFTSyAweDcKKyNkZWZpbmUgIE1GSU5ERVhfRlJBTUVfU0hJRlQgMworI2RlZmluZSAgTUZJTkRF WF9GUkFNRV9NQVNLIDB4N2ZmCisjZGVmaW5lIFBPUlRQTSAweDA0YworI2RlZmluZSAgUE9SVFBN X0wxU19TSElGVCAwCisjZGVmaW5lICBQT1JUUE1fTDFTX01BU0sgMHgzCisjZGVmaW5lICBQT1JU UE1fTDFTX0RST1AgMHgwCisjZGVmaW5lICBQT1JUUE1fTDFTX0FDQ0VQVCAweDEKKyNkZWZpbmUg IFBPUlRQTV9MMVNfTllFVCAweDIKKyNkZWZpbmUgIFBPUlRQTV9MMVNfU1RBTEwgMHgzCisjZGVm aW5lICBQT1JUUE1fUldFIEJJVCgzKQorI2RlZmluZSAgUE9SVFBNX1UyVElNRU9VVF9TSElGVCA4 CisjZGVmaW5lICBQT1JUUE1fVTJUSU1FT1VUX01BU0sgMHhmZgorI2RlZmluZSAgUE9SVFBNX1Ux VElNRU9VVF9TSElGVCAxNgorI2RlZmluZSAgUE9SVFBNX1UxVElNRU9VVF9NQVNLIDB4ZmYKKyNk ZWZpbmUgIFBPUlRQTV9GTEEgQklUKDI0KQorI2RlZmluZSAgUE9SVFBNX1ZCQSBCSVQoMjUpCisj ZGVmaW5lICBQT1JUUE1fV09DIEJJVCgyNikKKyNkZWZpbmUgIFBPUlRQTV9XT0QgQklUKDI3KQor I2RlZmluZSAgUE9SVFBNX1UxRSBCSVQoMjgpCisjZGVmaW5lICBQT1JUUE1fVTJFIEJJVCgyOSkK KyNkZWZpbmUgIFBPUlRQTV9GUldFIEJJVCgzMCkKKyNkZWZpbmUgIFBPUlRQTV9QTkdfQ1lBIEJJ VCgzMSkKKyNkZWZpbmUgRVBfSEFMVCAweDA1MAorI2RlZmluZSBFUF9QQVVTRSAweDA1NAorI2Rl ZmluZSBFUF9SRUxPQUQgMHgwNTgKKyNkZWZpbmUgRVBfU1RDSEcgMHgwNWMKKyNkZWZpbmUgREVW Tk9USUZfTE8gMHgwNjQKKyNkZWZpbmUgIERFVk5PVElGX0xPX1RSSUcgQklUKDApCisjZGVmaW5l ICBERVZOT1RJRl9MT19UWVBFX1NISUZUIDQKKyNkZWZpbmUgIERFVk5PVElGX0xPX1RZUEVfTUFT SyAweGYKKyNkZWZpbmUgIERFVk5PVElGX0xPX1RZUEVfRlVOQ1RJT05fV0FLRSAweDEKKyNkZWZp bmUgREVWTk9USUZfSEkgMHgwNjgKKyNkZWZpbmUgUE9SVEhBTFQgMHgwNmMKKyNkZWZpbmUgIFBP UlRIQUxUX0hBTFRfTFRTU00gQklUKDApCisjZGVmaW5lICBQT1JUSEFMVF9IQUxUX1JFSkVDVCBC SVQoMSkKKyNkZWZpbmUgIFBPUlRIQUxUX1NUQ0hHX1JFUSBCSVQoMjApCisjZGVmaW5lICBQT1JU SEFMVF9TVENIR19JTlRSX0VOIEJJVCgyNCkKKyNkZWZpbmUgUE9SVF9UTQkweDA3MAorI2RlZmlu ZSBFUF9USFJFQURfQUNUSVZFIDB4MDc0CisjZGVmaW5lIEVQX1NUT1BQRUQgMHgwNzgKKyNkZWZp bmUgSFNGU1BJX0NPVU5UMCAweDEwMAorI2RlZmluZSBIU0ZTUElfQ09VTlQxMyAweDEzNAorI2Rl ZmluZSAgSFNGU1BJX0NPVU5UMTNfVTJfUkVTVU1FX0tfRFVSQVRJT05fU0hJRlQgMAorI2RlZmlu ZSAgSFNGU1BJX0NPVU5UMTNfVTJfUkVTVU1FX0tfRFVSQVRJT05fTUFTSyAweDNmZmZmZmZmCisj ZGVmaW5lIEJMQ0cgMHg4NDAKKyNkZWZpbmUgU1NQWF9DT1JFX0NOVDAgMHg2MTAKKyNkZWZpbmUg IFNTUFhfQ09SRV9DTlQwX1BJTkdfVEJVUlNUX1NISUZUIDAKKyNkZWZpbmUgIFNTUFhfQ09SRV9D TlQwX1BJTkdfVEJVUlNUX01BU0sgMHhmZgorI2RlZmluZSBTU1BYX0NPUkVfQ05UMzAgMHg2ODgK KyNkZWZpbmUgIFNTUFhfQ09SRV9DTlQzMF9MTVBJVFBfVElNRVJfU0hJRlQgMAorI2RlZmluZSAg U1NQWF9DT1JFX0NOVDMwX0xNUElUUF9USU1FUl9NQVNLIDB4ZmZmZmYKKyNkZWZpbmUgU1NQWF9D T1JFX0NOVDMyIDB4NjkwCisjZGVmaW5lICBTU1BYX0NPUkVfQ05UMzJfUE9MTF9UQlVSU1RfTUFY X1NISUZUIDAKKyNkZWZpbmUgIFNTUFhfQ09SRV9DTlQzMl9QT0xMX1RCVVJTVF9NQVhfTUFTSyAw eGZmCisjZGVmaW5lIFNTUFhfQ09SRV9QQURDVEw0IDB4NzUwCisjZGVmaW5lICBTU1BYX0NPUkVf UEFEQ1RMNF9SWERBVF9WTERfVElNRU9VVF9VM19TSElGVCAwCisjZGVmaW5lICBTU1BYX0NPUkVf UEFEQ1RMNF9SWERBVF9WTERfVElNRU9VVF9VM19NQVNLIDB4ZmZmZmYKKyNkZWZpbmUgIEJMQ0df REZQQ0kgQklUKDApCisjZGVmaW5lICBCTENHX1VGUENJIEJJVCgxKQorI2RlZmluZSAgQkxDR19G RSBCSVQoMikKKyNkZWZpbmUgIEJMQ0dfQ09SRVBMTF9QV1JETiBCSVQoOCkKKyNkZWZpbmUgIEJM Q0dfSU9QTExfMF9QV1JETiBCSVQoOSkKKyNkZWZpbmUgIEJMQ0dfSU9QTExfMV9QV1JETiBCSVQo MTApCisjZGVmaW5lICBCTENHX0lPUExMXzJfUFdSRE4gQklUKDExKQorI2RlZmluZSAgQkxDR19B TEwgMHgxZmYKKyNkZWZpbmUgQ0ZHX0RFVl9TU1BJX1hGRVIgMHg4NTgKKyNkZWZpbmUgIENGR19E RVZfU1NQSV9YRkVSX0FDS1RJTUVPVVRfU0hJRlQgMAorI2RlZmluZSAgQ0ZHX0RFVl9TU1BJX1hG RVJfQUNLVElNRU9VVF9NQVNLIDB4ZmZmZmZmZmYKKyNkZWZpbmUgQ0ZHX0RFVl9GRSAweDg1Ywor I2RlZmluZSAgQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX1NISUZUIDAKKyNkZWZpbmUgIENGR19ERVZf RkVfUE9SVFJFR1NFTF9NQVNLIDB4MworI2RlZmluZSAgQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX1NT X1BJIDEKKyNkZWZpbmUgIENGR19ERVZfRkVfUE9SVFJFR1NFTF9IU0ZTX1BJIDIKKyNkZWZpbmUg IENGR19ERVZfRkVfSU5GSU5JVEVfU1NfUkVUUlkgQklUKDI5KQorCisvKiBGUENJIHJlZ2lzdGVy cyAqLworI2RlZmluZSBYVVNCX0RFVl9DRkdfMSAweDAwNAorI2RlZmluZSAgWFVTQl9ERVZfQ0ZH XzFfSU9fU1BBQ0VfRU4gQklUKDApCisjZGVmaW5lICBYVVNCX0RFVl9DRkdfMV9NRU1PUllfU1BB Q0VfRU4gQklUKDEpCisjZGVmaW5lICBYVVNCX0RFVl9DRkdfMV9CVVNfTUFTVEVSX0VOIEJJVCgy KQorI2RlZmluZSBYVVNCX0RFVl9DRkdfNCAweDAxMAorI2RlZmluZSAgWFVTQl9ERVZfQ0ZHXzRf QkFTRV9BRERSX1NISUZUIDE1CisjZGVmaW5lICBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfTUFT SyAweDFmZmZmCisjZGVmaW5lIFhVU0JfREVWX0NGR181IDB4MDE0CisKKy8qIElQRlMgcmVnaXN0 ZXJzICovCisjZGVmaW5lIFhVU0JfREVWX0NPTkZJR1VSQVRJT05fMCAweDE4MAorI2RlZmluZSAg WFVTQl9ERVZfQ09ORklHVVJBVElPTl8wX0VOX0ZQQ0kgQklUKDApCisjZGVmaW5lIFhVU0JfREVW X0lOVFJfTUFTS18wIDB4MTg4CisjZGVmaW5lICBYVVNCX0RFVl9JTlRSX01BU0tfMF9JUF9JTlRf TUFTSyBCSVQoMTYpCisKK3N0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgeworCV9fbGUzMiBp bmZvMDsKKwlfX2xlMzIgaW5mbzE7CisJX19sZTMyIGRlcV9sbzsKKwlfX2xlMzIgZGVxX2hpOwor CV9fbGUzMiB0eF9pbmZvOworCV9fbGUzMiByc3ZkWzExXTsKK307CisKKyNkZWZpbmUgRVBfU1RB VEVfRElTQUJMRUQgMAorI2RlZmluZSBFUF9TVEFURV9SVU5OSU5HIDEKKyNkZWZpbmUgRVBfU1RB VEVfSEFMVEVEIDIKKyNkZWZpbmUgRVBfU1RBVEVfU1RPUFBFRCAzCisjZGVmaW5lIEVQX1NUQVRF X0VSUk9SIDQKKworI2RlZmluZSBFUF9UWVBFX0lOVkFMSUQgMAorI2RlZmluZSBFUF9UWVBFX0lT T0NIX09VVCAxCisjZGVmaW5lIEVQX1RZUEVfQlVMS19PVVQgMgorI2RlZmluZSBFUF9UWVBFX0lO VEVSUlVQVF9PVVQgMworI2RlZmluZSBFUF9UWVBFX0NPTlRST0wgNAorI2RlZmluZSBFUF9UWVBF X0lTQ09IX0lOIDUKKyNkZWZpbmUgRVBfVFlQRV9CVUxLX0lOIDYKKyNkZWZpbmUgRVBfVFlQRV9J TlRFUlJVUFRfSU4gNworCisjZGVmaW5lIEJVSUxEX0VQX0NPTlRFWFRfUlcobmFtZSwgbWVtYmVy LCBzaGlmdCwgbWFzaykJCQlcCitzdGF0aWMgaW5saW5lIHUzMiBlcF9jdHhfcmVhZF8jI25hbWUo c3RydWN0IHRlZ3JhX3h1ZGNfZXBfY29udGV4dCAqY3R4KQlcCit7CQkJCQkJCQkJXAorCXJldHVy biAobGUzMl90b19jcHUoY3R4LT5tZW1iZXIpID4+IHNoaWZ0KSAmIG1hc2s7CQlcCit9CQkJCQkJ CQkJXAorc3RhdGljIGlubGluZSB2b2lkCQkJCQkJCVwKK2VwX2N0eF93cml0ZV8jI25hbWUoc3Ry dWN0IHRlZ3JhX3h1ZGNfZXBfY29udGV4dCAqY3R4LCB1MzIgdmFsKQkJXAorewkJCQkJCQkJCVwK Kwl1MzIgdG1wOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdG1wID0gbGUzMl90b19jcHUoY3R4LT5t ZW1iZXIpICYgfihtYXNrIDw8IHNoaWZ0KTsJCVwKKwl0bXAgfD0gKHZhbCAmIG1hc2spIDw8IHNo aWZ0OwkJCQkJXAorCWN0eC0+bWVtYmVyID0gY3B1X3RvX2xlMzIodG1wKTsJCQkJCVwKK30KKwor QlVJTERfRVBfQ09OVEVYVF9SVyhzdGF0ZSwgaW5mbzAsIDAsIDB4NykKK0JVSUxEX0VQX0NPTlRF WFRfUlcobXVsdCwgaW5mbzAsIDgsIDB4MykKK0JVSUxEX0VQX0NPTlRFWFRfUlcobWF4X3BzdHJl YW1zLCBpbmZvMCwgMTAsIDB4MWYpCitCVUlMRF9FUF9DT05URVhUX1JXKGxzYSwgaW5mbzAsIDE1 LCAweDEpCitCVUlMRF9FUF9DT05URVhUX1JXKGludGVydmFsLCBpbmZvMCwgMTYsIDB4ZmYpCitC VUlMRF9FUF9DT05URVhUX1JXKGNlcnIsIGluZm8xLCAxLCAweDMpCitCVUlMRF9FUF9DT05URVhU X1JXKHR5cGUsIGluZm8xLCAzLCAweDcpCitCVUlMRF9FUF9DT05URVhUX1JXKGhpZCwgaW5mbzEs IDcsIDB4MSkKK0JVSUxEX0VQX0NPTlRFWFRfUlcobWF4X2J1cnN0X3NpemUsIGluZm8xLCA4LCAw eGZmKQorQlVJTERfRVBfQ09OVEVYVF9SVyhtYXhfcGFja2V0X3NpemUsIGluZm8xLCAxNiwgMHhm ZmZmKQorQlVJTERfRVBfQ09OVEVYVF9SVyhkY3MsIGRlcV9sbywgMCwgMHgxKQorQlVJTERfRVBf Q09OVEVYVF9SVyhkZXFfbG8sIGRlcV9sbywgNCwgMHhmZmZmZmZmKQorQlVJTERfRVBfQ09OVEVY VF9SVyhkZXFfaGksIGRlcV9oaSwgMCwgMHhmZmZmZmZmZikKK0JVSUxEX0VQX0NPTlRFWFRfUlco YXZnX3RyYl9sZW4sIHR4X2luZm8sIDAsIDB4ZmZmZikKK0JVSUxEX0VQX0NPTlRFWFRfUlcobWF4 X2VzaXRfcGF5bG9hZCwgdHhfaW5mbywgMTYsIDB4ZmZmZikKK0JVSUxEX0VQX0NPTlRFWFRfUlco ZWR0bGEsIHJzdmRbMF0sIDAsIDB4ZmZmZmZmKQorQlVJTERfRVBfQ09OVEVYVF9SVyhzZXFfbnVt LCByc3ZkWzBdLCAyNCwgMHhmZikKK0JVSUxEX0VQX0NPTlRFWFRfUlcocGFydGlhbF90ZCwgcnN2 ZFswXSwgMjUsIDB4MSkKK0JVSUxEX0VQX0NPTlRFWFRfUlcoY2VycmNudCwgcnN2ZFsxXSwgMTgs IDB4MykKK0JVSUxEX0VQX0NPTlRFWFRfUlcoZGF0YV9vZmZzZXQsIHJzdmRbMl0sIDAsIDB4MWZm ZmYpCitCVUlMRF9FUF9DT05URVhUX1JXKG51bXRyYnMsIHJzdmRbMl0sIDIyLCAweDFmKQorQlVJ TERfRVBfQ09OVEVYVF9SVyhkZXZhZGRyLCByc3ZkWzZdLCAwLCAweDdmKQorCitzdGF0aWMgaW5s aW5lIHU2NCBlcF9jdHhfcmVhZF9kZXFfcHRyKHN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQg KmN0eCkKK3sKKwlyZXR1cm4gKCh1NjQpZXBfY3R4X3JlYWRfZGVxX2hpKGN0eCkgPDwgMzIpIHwK KwkJKGVwX2N0eF9yZWFkX2RlcV9sbyhjdHgpIDw8IDQpOworfQorCitzdGF0aWMgaW5saW5lIHZv aWQKK2VwX2N0eF93cml0ZV9kZXFfcHRyKHN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmN0 eCwgdTY0IGFkZHIpCit7CisJZXBfY3R4X3dyaXRlX2RlcV9sbyhjdHgsIGxvd2VyXzMyX2JpdHMo YWRkcikgPj4gNCk7CisJZXBfY3R4X3dyaXRlX2RlcV9oaShjdHgsIHVwcGVyXzMyX2JpdHMoYWRk cikpOworfQorCitzdHJ1Y3QgdGVncmFfeHVkY190cmIgeworCV9fbGUzMiBkYXRhX2xvOworCV9f bGUzMiBkYXRhX2hpOworCV9fbGUzMiBzdGF0dXM7CisJX19sZTMyIGNvbnRyb2w7Cit9OworCisj ZGVmaW5lIFRSQl9UWVBFX1JTVkQgMAorI2RlZmluZSBUUkJfVFlQRV9OT1JNQUwgMQorI2RlZmlu ZSBUUkJfVFlQRV9TRVRVUF9TVEFHRSAyCisjZGVmaW5lIFRSQl9UWVBFX0RBVEFfU1RBR0UgMwor I2RlZmluZSBUUkJfVFlQRV9TVEFUVVNfU1RBR0UgNAorI2RlZmluZSBUUkJfVFlQRV9JU09DSCA1 CisjZGVmaW5lIFRSQl9UWVBFX0xJTksgNgorI2RlZmluZSBUUkJfVFlQRV9UUkFOU0ZFUl9FVkVO VCAzMgorI2RlZmluZSBUUkJfVFlQRV9QT1JUX1NUQVRVU19DSEFOR0VfRVZFTlQgMzQKKyNkZWZp bmUgVFJCX1RZUEVfU1RSRUFNIDQ4CisjZGVmaW5lIFRSQl9UWVBFX1NFVFVQX1BBQ0tFVF9FVkVO VCA2MworCisjZGVmaW5lIFRSQl9DTVBMX0NPREVfSU5WQUxJRCAwCisjZGVmaW5lIFRSQl9DTVBM X0NPREVfU1VDQ0VTUyAxCisjZGVmaW5lIFRSQl9DTVBMX0NPREVfREFUQV9CVUZGRVJfRVJSIDIK KyNkZWZpbmUgVFJCX0NNUExfQ09ERV9CQUJCTEVfREVURUNURURfRVJSIDMKKyNkZWZpbmUgVFJC X0NNUExfQ09ERV9VU0JfVFJBTlNfRVJSIDQKKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9UUkJfRVJS IDUKKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9TVEFMTCA2CisjZGVmaW5lIFRSQl9DTVBMX0NPREVf SU5WQUxJRF9TVFJFQU1fVFlQRV9FUlIgMTAKKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9TSE9SVF9Q QUNLRVQgMTMKKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9SSU5HX1VOREVSUlVOIDE0CisjZGVmaW5l IFRSQl9DTVBMX0NPREVfUklOR19PVkVSUlVOIDE1CisjZGVmaW5lIFRSQl9DTVBMX0NPREVfRVZF TlRfUklOR19GVUxMX0VSUiAyMQorI2RlZmluZSBUUkJfQ01QTF9DT0RFX1NUT1BQRUQgMjYKKyNk ZWZpbmUgVFJCX0NNUExfQ09ERV9JU09DSF9CVUZGRVJfT1ZFUlJVTiAzMQorI2RlZmluZSBUUkJf Q01QTF9DT0RFX1NUUkVBTV9OVU1QX0VSUk9SIDIxOQorI2RlZmluZSBUUkJfQ01QTF9DT0RFX1BS SU1FX1BJUEVfUkVDRUlWRUQgMjIwCisjZGVmaW5lIFRSQl9DTVBMX0NPREVfSE9TVF9SRUpFQ1RF RCAyMjEKKyNkZWZpbmUgVFJCX0NNUExfQ09ERV9DVFJMX0RJUl9FUlIgMjIyCisjZGVmaW5lIFRS Ql9DTVBMX0NPREVfQ1RSTF9TRVFOVU1fRVJSIDIyMworCisjZGVmaW5lIEJVSUxEX1RSQl9SVyhu YW1lLCBtZW1iZXIsIHNoaWZ0LCBtYXNrKQkJCQlcCitzdGF0aWMgaW5saW5lIHUzMiB0cmJfcmVh ZF8jI25hbWUoc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIpCQlcCit7CQkJCQkJCQkJXAorCXJl dHVybiAobGUzMl90b19jcHUodHJiLT5tZW1iZXIpID4+IHNoaWZ0KSAmIG1hc2s7CQlcCit9CQkJ CQkJCQkJXAorc3RhdGljIGlubGluZSB2b2lkCQkJCQkJCVwKK3RyYl93cml0ZV8jI25hbWUoc3Ry dWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIsIHUzMiB2YWwpCQkJXAorewkJCQkJCQkJCVwKKwl1MzIg dG1wOwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdG1wID0gbGUzMl90b19jcHUodHJiLT5tZW1iZXIp ICYgfihtYXNrIDw8IHNoaWZ0KTsJCVwKKwl0bXAgfD0gKHZhbCAmIG1hc2spIDw8IHNoaWZ0OwkJ CQkJXAorCXRyYi0+bWVtYmVyID0gY3B1X3RvX2xlMzIodG1wKTsJCQkJCVwKK30KKworQlVJTERf VFJCX1JXKGRhdGFfbG8sIGRhdGFfbG8sIDAsIDB4ZmZmZmZmZmYpCitCVUlMRF9UUkJfUlcoZGF0 YV9oaSwgZGF0YV9oaSwgMCwgMHhmZmZmZmZmZikKK0JVSUxEX1RSQl9SVyhzZXFfbnVtLCBzdGF0 dXMsIDAsIDB4ZmZmZikKK0JVSUxEX1RSQl9SVyh0cmFuc2Zlcl9sZW4sIHN0YXR1cywgMCwgMHhm ZmZmZmYpCitCVUlMRF9UUkJfUlcodGRfc2l6ZSwgc3RhdHVzLCAxNywgMHgxZikKK0JVSUxEX1RS Ql9SVyhjbXBsX2NvZGUsIHN0YXR1cywgMjQsIDB4ZmYpCitCVUlMRF9UUkJfUlcoY3ljbGUsIGNv bnRyb2wsIDAsIDB4MSkKK0JVSUxEX1RSQl9SVyh0b2dnbGVfY3ljbGUsIGNvbnRyb2wsIDEsIDB4 MSkKK0JVSUxEX1RSQl9SVyhpc3AsIGNvbnRyb2wsIDIsIDB4MSkKK0JVSUxEX1RSQl9SVyhjaGFp biwgY29udHJvbCwgNCwgMHgxKQorQlVJTERfVFJCX1JXKGlvYywgY29udHJvbCwgNSwgMHgxKQor QlVJTERfVFJCX1JXKHR5cGUsIGNvbnRyb2wsIDEwLCAweDNmKQorQlVJTERfVFJCX1JXKHN0cmVh bV9pZCwgY29udHJvbCwgMTYsIDB4ZmZmZikKK0JVSUxEX1RSQl9SVyhlbmRwb2ludF9pZCwgY29u dHJvbCwgMTYsIDB4MWYpCitCVUlMRF9UUkJfUlcodGxicGMsIGNvbnRyb2wsIDE2LCAweGYpCitC VUlMRF9UUkJfUlcoZGF0YV9zdGFnZV9kaXIsIGNvbnRyb2wsIDE2LCAweDEpCitCVUlMRF9UUkJf UlcoZnJhbWVfaWQsIGNvbnRyb2wsIDIwLCAweDdmZikKK0JVSUxEX1RSQl9SVyhzaWEsIGNvbnRy b2wsIDMxLCAweDEpCisKK3N0YXRpYyBpbmxpbmUgdTY0IHRyYl9yZWFkX2RhdGFfcHRyKHN0cnVj dCB0ZWdyYV94dWRjX3RyYiAqdHJiKQoreworCXJldHVybiAoKHU2NCl0cmJfcmVhZF9kYXRhX2hp KHRyYikgPDwgMzIpIHwKKwkJdHJiX3JlYWRfZGF0YV9sbyh0cmIpOworfQorCitzdGF0aWMgaW5s aW5lIHZvaWQgdHJiX3dyaXRlX2RhdGFfcHRyKHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiLCB1 NjQgYWRkcikKK3sKKwl0cmJfd3JpdGVfZGF0YV9sbyh0cmIsIGxvd2VyXzMyX2JpdHMoYWRkcikp OworCXRyYl93cml0ZV9kYXRhX2hpKHRyYiwgdXBwZXJfMzJfYml0cyhhZGRyKSk7Cit9CisKK3N0 cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgeworCXN0cnVjdCB1c2JfcmVxdWVzdCB1c2JfcmVxOwor CisJc2l6ZV90IGJ1Zl9xdWV1ZWQ7CisJdW5zaWduZWQgaW50IHRyYnNfcXVldWVkOworCXVuc2ln bmVkIGludCB0cmJzX25lZWRlZDsKKwlib29sIG5lZWRfemxwOworCisJc3RydWN0IHRlZ3JhX3h1 ZGNfdHJiICpmaXJzdF90cmI7CisJc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICpsYXN0X3RyYjsKKwor CXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKK307CisKK3N0cnVjdCB0ZWdyYV94dWRjX2VwIHsKKwlz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYzsKKwlzdHJ1Y3QgdXNiX2VwIHVzYl9lcDsKKwl1bnNpZ25l ZCBpbnQgaW5kZXg7CisJY2hhciBuYW1lWzhdOworCisJc3RydWN0IHRlZ3JhX3h1ZGNfZXBfY29u dGV4dCAqY29udGV4dDsKKworI2RlZmluZSBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSA2NAorCXN0 cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJhbnNmZXJfcmluZzsKKwlkbWFfYWRkcl90IHRyYW5zZmVy X3JpbmdfcGh5czsKKworCXVuc2lnbmVkIGludCBlbnFfcHRyOworCXVuc2lnbmVkIGludCBkZXFf cHRyOworCWJvb2wgcGNzOworCWJvb2wgcmluZ19mdWxsOworCWJvb2wgc3RyZWFtX3JlamVjdGVk OworCisJc3RydWN0IGxpc3RfaGVhZCBxdWV1ZTsKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50 X2Rlc2NyaXB0b3IgKmRlc2M7CisJY29uc3Qgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0 b3IgKmNvbXBfZGVzYzsKK307CisKK3N0cnVjdCB0ZWdyYV94dWRjX3NlbF90aW1pbmcgeworCV9f dTggdTFzZWw7CisJX191OCB1MXBlbDsKKwlfX2xlMTYgdTJzZWw7CisJX19sZTE2IHUycGVsOwor fTsKKworZW51bSB0ZWdyYV94dWRjX3NldHVwX3N0YXRlIHsKKwlXQUlUX0ZPUl9TRVRVUCwKKwlE QVRBX1NUQUdFX1hGRVIsCisJREFUQV9TVEFHRV9SRUNWLAorCVNUQVRVU19TVEFHRV9YRkVSLAor CVNUQVRVU19TVEFHRV9SRUNWLAorfTsKKworc3RydWN0IHRlZ3JhX3h1ZGNfc2V0dXBfcGFja2V0 IHsKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGN0cmxfcmVxOworCXVuc2lnbmVkIGludCBzZXFf bnVtOworfTsKKworc3RydWN0IHRlZ3JhX3h1ZGNfc2F2ZV9yZWdzIHsKKwl1MzIgY3RybDsKKwl1 MzIgcG9ydHBtOworfTsKKworc3RydWN0IHRlZ3JhX3h1ZGMgeworCXN0cnVjdCBkZXZpY2UgKmRl djsKKwljb25zdCBzdHJ1Y3QgdGVncmFfeHVkY19zb2MgKnNvYzsKKwlzdHJ1Y3QgdGVncmFfeHVz Yl9wYWRjdGwgKnBhZGN0bDsKKworCXNwaW5sb2NrX3QgbG9jazsKKworCXN0cnVjdCB1c2JfZ2Fk Z2V0IGdhZGdldDsKKwlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcjsKKworI2RlZmlu ZSBYVURDX05SX0VWRU5UX1JJTkdTIDIKKyNkZWZpbmUgWFVEQ19FVkVOVF9SSU5HX1NJWkUgNDA5 NgorCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZXZlbnRfcmluZ1tYVURDX05SX0VWRU5UX1JJTkdT XTsKKwlkbWFfYWRkcl90IGV2ZW50X3JpbmdfcGh5c1tYVURDX05SX0VWRU5UX1JJTkdTXTsKKwl1 bnNpZ25lZCBpbnQgZXZlbnRfcmluZ19pbmRleDsKKwl1bnNpZ25lZCBpbnQgZXZlbnRfcmluZ19k ZXFfcHRyOworCWJvb2wgY2NzOworCisjZGVmaW5lIFhVRENfTlJfRVBTIDMyCisJc3RydWN0IHRl Z3JhX3h1ZGNfZXAgZXBbWFVEQ19OUl9FUFNdOworCXN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRl eHQgKmVwX2NvbnRleHQ7CisJZG1hX2FkZHJfdCBlcF9jb250ZXh0X3BoeXM7CisKKwlzdHJ1Y3Qg ZGV2aWNlICpnZW5wZF9kZXZfZGV2aWNlOworCXN0cnVjdCBkZXZpY2UgKmdlbnBkX2Rldl9zczsK KwlzdHJ1Y3QgZGV2aWNlX2xpbmsgKmdlbnBkX2RsX2RldmljZTsKKwlzdHJ1Y3QgZGV2aWNlX2xp bmsgKmdlbnBkX2RsX3NzOworCisJc3RydWN0IGRtYV9wb29sICp0cmFuc2Zlcl9yaW5nX3Bvb2w7 CisKKwlib29sIHF1ZXVlZF9zZXR1cF9wYWNrZXQ7CisJc3RydWN0IHRlZ3JhX3h1ZGNfc2V0dXBf cGFja2V0IHNldHVwX3BhY2tldDsKKwllbnVtIHRlZ3JhX3h1ZGNfc2V0dXBfc3RhdGUgc2V0dXBf c3RhdGU7CisJdTE2IHNldHVwX3NlcV9udW07CisKKwl1MTYgZGV2X2FkZHI7CisJdTE2IGlzb2No X2RlbGF5OworCXN0cnVjdCB0ZWdyYV94dWRjX3NlbF90aW1pbmcgc2VsX3RpbWluZzsKKwl1OCB0 ZXN0X21vZGVfcGF0dGVybjsKKwl1MTYgc3RhdHVzX2J1ZjsKKwlzdHJ1Y3QgdGVncmFfeHVkY19y ZXF1ZXN0ICplcDBfcmVxOworCisJYm9vbCBwdWxsdXA7CisKKwl1bnNpZ25lZCBpbnQgbnJfZW5h YmxlZF9lcHM7CisJdW5zaWduZWQgaW50IG5yX2lzb2NoX2VwczsKKworCXVuc2lnbmVkIGludCBk ZXZpY2Vfc3RhdGU7CisJdW5zaWduZWQgaW50IHJlc3VtZV9zdGF0ZTsKKworCWludCBpcnE7CisK Kwl2b2lkIF9faW9tZW0gKmJhc2U7CisJcmVzb3VyY2Vfc2l6ZV90IHBoeXNfYmFzZTsKKwl2b2lk IF9faW9tZW0gKmlwZnM7CisJdm9pZCBfX2lvbWVtICpmcGNpOworCisJc3RydWN0IHJlZ3VsYXRv cl9idWxrX2RhdGEgKnN1cHBsaWVzOworCisJc3RydWN0IGNsa19idWxrX2RhdGEgKmNsa3M7CisK Kwlib29sIGRldmljZV9tb2RlOworCXN0cnVjdCBleHRjb25fZGV2ICpkYXRhX3JvbGVfZXh0Y29u OworCXN0cnVjdCBub3RpZmllcl9ibG9jayBkYXRhX3JvbGVfbmI7CisJc3RydWN0IHdvcmtfc3Ry dWN0IGRhdGFfcm9sZV93b3JrOworCisJc3RydWN0IHBoeSAqdXNiM19waHk7CisJc3RydWN0IHBo eSAqdXRtaV9waHk7CisKKwlzdHJ1Y3QgdGVncmFfeHVkY19zYXZlX3JlZ3Mgc2F2ZWRfcmVnczsK Kwlib29sIHN1c3BlbmRlZDsKKwlib29sIHBvd2VyZ2F0ZWQ7CisKKwlzdHJ1Y3QgY29tcGxldGlv biBkaXNjb25uZWN0X2NvbXBsZXRlOworCisJYm9vbCBzZWxmcG93ZXJlZDsKKworI2RlZmluZSBU T0dHTEVfVkJVU19XQUlUX01TIDEwMAorCXN0cnVjdCBkZWxheWVkX3dvcmsgcGxjX3Jlc2V0X3dv cms7CisJYm9vbCB3YWl0X2NzYzsKKworCXN0cnVjdCBkZWxheWVkX3dvcmsgcG9ydF9yZXNldF93 YXJfd29yazsKKwlib29sIHdhaXRfZm9yX3NlY19wcmM7Cit9OworCisjZGVmaW5lIFhVRENfVFJC X01BWF9CVUZGRVJfU0laRSA2NTUzNgorI2RlZmluZSBYVURDX01BWF9JU09DSF9FUFMgNAorI2Rl ZmluZSBYVURDX0lOVEVSUlVQVF9NT0RFUkFUSU9OX1VTIDAKKworc3RhdGljIHN0cnVjdCB1c2Jf ZW5kcG9pbnRfZGVzY3JpcHRvciB0ZWdyYV94dWRjX2VwMF9kZXNjID0geworCS5iTGVuZ3RoID0g VVNCX0RUX0VORFBPSU5UX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZSA9IFVTQl9EVF9FTkRQT0lO VCwKKwkuYkVuZHBvaW50QWRkcmVzcyA9IDAsCisJLmJtQXR0cmlidXRlcyA9IFVTQl9FTkRQT0lO VF9YRkVSX0NPTlRST0wsCisJLndNYXhQYWNrZXRTaXplID0gY3B1X3RvX2xlMTYoNjQpLAorfTsK Kworc3RydWN0IHRlZ3JhX3h1ZGNfc29jIHsKKwljb25zdCBjaGFyICogY29uc3QgKnN1cHBseV9u YW1lczsKKwl1bnNpZ25lZCBpbnQgbnVtX3N1cHBsaWVzOworCWNvbnN0IGNoYXIgKiBjb25zdCAq Y2xvY2tfbmFtZXM7CisJdW5zaWduZWQgaW50IG51bV9jbGtzOworCWJvb2wgdTFfZW5hYmxlOwor CWJvb2wgdTJfZW5hYmxlOworCWJvb2wgbHBtX2VuYWJsZTsKKwlib29sIGludmFsaWRfc2VxX251 bTsKKwlib29sIHBsc19xdWlyazsKKwlib29sIHBvcnRfcmVzZXRfcXVpcms7CisJYm9vbCBoYXNf aXBmczsKK307CisKK3N0YXRpYyBpbmxpbmUgdTMyIGZwY2lfcmVhZGwoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBvZmZzZXQpCit7CisJcmV0dXJuIHJlYWRsKHh1ZGMtPmZw Y2kgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnBjaV93cml0ZWwoc3RydWN0 IHRlZ3JhX3h1ZGMgKnh1ZGMsIHUzMiB2YWwsCisJCQkgICAgICAgdW5zaWduZWQgaW50IG9mZnNl dCkKK3sKKwl3cml0ZWwodmFsLCB4dWRjLT5mcGNpICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlu bGluZSB1MzIgaXBmc19yZWFkbChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50 IG9mZnNldCkKK3sKKwlyZXR1cm4gcmVhZGwoeHVkYy0+aXBmcyArIG9mZnNldCk7Cit9CisKK3N0 YXRpYyBpbmxpbmUgdm9pZCBpcGZzX3dyaXRlbChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdTMy IHZhbCwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXdyaXRlbCh2YWwsIHh1 ZGMtPmlwZnMgKyBvZmZzZXQpOworfQorCitzdGF0aWMgaW5saW5lIHUzMiB4dWRjX3JlYWRsKHN0 cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgb2Zmc2V0KQoreworCXJldHVybiBy ZWFkbCh4dWRjLT5iYXNlICsgb2Zmc2V0KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHh1ZGNf d3JpdGVsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1MzIgdmFsLAorCQkJICAgICAgIHVuc2ln bmVkIGludCBvZmZzZXQpCit7CisJd3JpdGVsKHZhbCwgeHVkYy0+YmFzZSArIG9mZnNldCk7Cit9 CisKK3N0YXRpYyBpbmxpbmUgaW50IHh1ZGNfcmVhZGxfcG9sbChzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYywKKwkJCQkgIHVuc2lnbmVkIGludCBvZmZzZXQsIHUzMiBtYXNrLCB1MzIgdmFsKQorewor CXUzMiByZWd2YWw7CisKKwlyZXR1cm4gcmVhZGxfcG9sbF90aW1lb3V0X2F0b21pYyh4dWRjLT5i YXNlICsgb2Zmc2V0LCByZWd2YWwsCisJCQkJCSAocmVndmFsICYgbWFzaykgPT0gdmFsLCAxLCAx MDApOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdyYV94dWRjICp0b194dWRjKHN0cnVj dCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJcmV0dXJuIGNvbnRhaW5lcl9vZihnYWRnZXQsIHN0 cnVjdCB0ZWdyYV94dWRjLCBnYWRnZXQpOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCB0ZWdy YV94dWRjX2VwICp0b194dWRjX2VwKHN0cnVjdCB1c2JfZXAgKmVwKQoreworCXJldHVybiBjb250 YWluZXJfb2YoZXAsIHN0cnVjdCB0ZWdyYV94dWRjX2VwLCB1c2JfZXApOworfQorCitzdGF0aWMg aW5saW5lIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnRvX3h1ZGNfcmVxKHN0cnVjdCB1c2Jf cmVxdWVzdCAqcmVxKQoreworCXJldHVybiBjb250YWluZXJfb2YocmVxLCBzdHJ1Y3QgdGVncmFf eHVkY19yZXF1ZXN0LCB1c2JfcmVxKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGR1bXBfdHJi KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCBjb25zdCBjaGFyICp0eXBlLAorCQkJICAgIHN0cnVj dCB0ZWdyYV94dWRjX3RyYiAqdHJiKQoreworCWRldl9kYmcoeHVkYy0+ZGV2LAorCQkiJXM6ICVw LCBsbyA9ICUjeCwgaGkgPSAlI3gsIHN0YXR1cyA9ICUjeCwgY29udHJvbCA9ICUjeFxuIiwKKwkJ dHlwZSwgdHJiLCB0cmItPmRhdGFfbG8sIHRyYi0+ZGF0YV9oaSwgdHJiLT5zdGF0dXMsCisJCXRy Yi0+Y29udHJvbCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVfb24o c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJaW50IGVycjsKKworCWlmICh4dWRjLT5kZXZp Y2VfbW9kZSkKKwkJcmV0dXJuOworCisJcG1fcnVudGltZV9nZXRfc3luYyh4dWRjLT5kZXYpOwor CisJZXJyID0gcGh5X3Bvd2VyX29uKHh1ZGMtPnV0bWlfcGh5KTsKKwlpZiAoZXJyIDwgMCkKKwkJ ZGV2X2Vycih4dWRjLT5kZXYsICJ1dG1pIHBvd2VyIG9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwll cnIgPSBwaHlfcG93ZXJfb24oeHVkYy0+dXNiM19waHkpOworCWlmIChlcnIgPCAwKQorCQlkZXZf ZXJyKHh1ZGMtPmRldiwgInVzYjMgcGh5IHBvd2VyIG9uIGZhaWxlZCAlZFxuIiwgZXJyKTsKKwor CWRldl9kYmcoeHVkYy0+ZGV2LCAiZGV2aWNlIG1vZGUgb25cbiIpOworCXRlZ3JhX3h1c2JfcGFk Y3RsX3NldF92YnVzX292ZXJyaWRlKHh1ZGMtPnBhZGN0bCwgdHJ1ZSk7CisKKwl4dWRjLT5kZXZp Y2VfbW9kZSA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVf b2ZmKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCWJvb2wgY29ubmVjdGVkID0gZmFsc2U7 CisJdTMyIHBscywgdmFsOworCWludCBlcnI7CisKKwlpZiAoIXh1ZGMtPmRldmljZV9tb2RlKQor CQlyZXR1cm47CisKKwlkZXZfZGJnKHh1ZGMtPmRldiwgImRldmljZSBtb2RlIG9mZlxuIik7CisK Kwljb25uZWN0ZWQgPSAhISh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgJiBQT1JUU0NfQ0NTKTsK KwlyZWluaXRfY29tcGxldGlvbigmeHVkYy0+ZGlzY29ubmVjdF9jb21wbGV0ZSk7CisKKwl0ZWdy YV94dXNiX3BhZGN0bF9zZXRfdmJ1c19vdmVycmlkZSh4dWRjLT5wYWRjdGwsIGZhbHNlKTsKKwor CXBscyA9ICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BMU19TSElGVCkgJgor CQlQT1JUU0NfUExTX01BU0s7CisKKwkvKiBEaXJlY3QgbGluayB0byBVMCBpZiBkaXNjb25uZWN0 ZWQgaW4gUkVTVU1FIG9yIFUyLiAqLworCWlmICh4dWRjLT5zb2MtPnBsc19xdWlyayAmJiB4dWRj LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSICYmCisJICAgIChwbHMgPT0gUE9SVFND X1BMU19SRVNVTUUgfHwgcGxzID09IFBPUlRTQ19QTFNfVTIpKSB7CisJCXZhbCA9IHh1ZGNfcmVh ZGwoeHVkYywgUE9SVFBNKTsKKwkJdmFsIHw9IFBPUlRQTV9GUldFOworCQl4dWRjX3dyaXRlbCh4 dWRjLCB2YWwsIFBPUlRQTSk7CisKKwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpOwor CQl2YWwgJj0gfihQT1JUU0NfQ0hBTkdFX01BU0sgfAorCQkJIChQT1JUU0NfUExTX01BU0sgPDwg UE9SVFNDX1BMU19TSElGVCkpOworCQl2YWwgfD0gUE9SVFNDX0xXUyB8IChQT1JUU0NfUExTX1Uw IDw8IFBPUlRTQ19QTFNfU0hJRlQpOworCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRTQyk7 CisJfQorCisJeHVkYy0+ZGV2aWNlX21vZGUgPSBmYWxzZTsKKworCS8qIFdhaXQgZm9yIGRpc2Nv bm5lY3QgZXZlbnQuICovCisJaWYgKGNvbm5lY3RlZCkKKwkJd2FpdF9mb3JfY29tcGxldGlvbigm eHVkYy0+ZGlzY29ubmVjdF9jb21wbGV0ZSk7CisKKwkvKiBNYWtlIHN1cmUgaW50ZXJydXB0IGhh bmRsZXIgaGFzIGNvbXBsZXRlZCBiZWZvcmUgcG93ZXJnYXRpbmcuICovCisJc3luY2hyb25pemVf aXJxKHh1ZGMtPmlycSk7CisJZXJyID0gcGh5X3Bvd2VyX29mZih4dWRjLT51dG1pX3BoeSk7CisJ aWYgKGVyciA8IDApCisJCWRldl9lcnIoeHVkYy0+ZGV2LCAidXRtaV9waHkgcG93ZXIgb2ZmIGZh aWxlZCAlZFxuIiwgZXJyKTsKKworCWVyciA9IHBoeV9wb3dlcl9vZmYoeHVkYy0+dXNiM19waHkp OworCWlmIChlcnIgPCAwKQorCQlkZXZfZXJyKHh1ZGMtPmRldiwgInVzYjNfcGh5IHBvd2VyIG9m ZiBmYWlsZWQgJWRcbiIsIGVycik7CisKKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYpOworfQor CitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3VwZGF0ZV9kYXRhX3JvbGUoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMpCit7CisJaWYgKGV4dGNvbl9nZXRfc3RhdGUoeHVkYy0+ZGF0YV9yb2xlX2V4dGNv biwgRVhUQ09OX1VTQikpCisJCXRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVfb24oeHVkYyk7CisJZWxz ZQorCQl0ZWdyYV94dWRjX2RldmljZV9tb2RlX29mZih4dWRjKTsKK30KKworc3RhdGljIHZvaWQg dGVncmFfeHVkY19kYXRhX3JvbGVfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJ c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBjb250YWluZXJfb2Yod29yaywgc3RydWN0IHRlZ3Jh X3h1ZGMsCisJCQkJCSAgICAgICBkYXRhX3JvbGVfd29yayk7CisKKwl0ZWdyYV94dWRjX3VwZGF0 ZV9kYXRhX3JvbGUoeHVkYyk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19kYXRhX3JvbGVf bm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKKwkJCQkJIHVuc2lnbmVkIGxvbmcg ZXZlbnQsIHZvaWQgKnVudXNlZCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGNvbnRh aW5lcl9vZihuYiwgc3RydWN0IHRlZ3JhX3h1ZGMsCisJCQkJCSAgICAgICBkYXRhX3JvbGVfbmIp OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9j aywgZmxhZ3MpOworCWlmICgheHVkYy0+c3VzcGVuZGVkKQorCQlzY2hlZHVsZV93b3JrKCZ4dWRj LT5kYXRhX3JvbGVfd29yayk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywg ZmxhZ3MpOworCisJcmV0dXJuIE5PVElGWV9ET05FOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94 dWRjX3BsY19yZXNldF93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qg ZGVsYXllZF93b3JrICpkd29yayA9IHRvX2RlbGF5ZWRfd29yayh3b3JrKTsKKwlzdHJ1Y3QgdGVn cmFfeHVkYyAqeHVkYyA9IGNvbnRhaW5lcl9vZihkd29yaywgc3RydWN0IHRlZ3JhX3h1ZGMsCisJ CQkJCSAgICAgICBwbGNfcmVzZXRfd29yayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNw aW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKHh1ZGMtPndhaXRfY3Nj KSB7CisJCXUzMiBwbHMgPSAoeHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpID4+IFBPUlRTQ19QTFNf U0hJRlQpICYKKwkJCSAgUE9SVFNDX1BMU19NQVNLOworCQlpZiAocGxzID09IFBPUlRTQ19QTFNf SU5BQ1RJVkUpIHsKKwkJCWRldl9pbmZvKHh1ZGMtPmRldiwgIlBMUyA9IEluYWN0aXZlLiBUb2dn bGUgVkJVU1xuIik7CisJCQl0ZWdyYV94dXNiX3BhZGN0bF9zZXRfdmJ1c19vdmVycmlkZSh4dWRj LT5wYWRjdGwsCisJCQkJCQkJICAgICAgZmFsc2UpOworCQkJdGVncmFfeHVzYl9wYWRjdGxfc2V0 X3ZidXNfb3ZlcnJpZGUoeHVkYy0+cGFkY3RsLCB0cnVlKTsKKwkJCXh1ZGMtPndhaXRfY3NjID0g ZmFsc2U7CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxh Z3MpOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BvcnRfcmVzZXRfd2FyX3dvcmsoc3Ry dWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrID0g dG9fZGVsYXllZF93b3JrKHdvcmspOworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0KKwkJY29u dGFpbmVyX29mKGR3b3JrLCBzdHJ1Y3QgdGVncmFfeHVkYywgcG9ydF9yZXNldF93YXJfd29yayk7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgcGxzOworCWludCByZXQ7CisJaW50IGV4dGNv bl9zdGF0ZSA9IGV4dGNvbl9nZXRfc3RhdGUoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbiwgRVhUQ09O X1VTQik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCWlmICh4 dWRjLT5kYXRhX3JvbGVfZXh0Y29uICYmIGV4dGNvbl9zdGF0ZSAmJiB4dWRjLT53YWl0X2Zvcl9z ZWNfcHJjKSB7CisJCXBscyA9ICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgPj4gUE9SVFNDX1BM U19TSElGVCkgJgorCQkJUE9SVFNDX1BMU19NQVNLOworCQlkZXZfZGJnKHh1ZGMtPmRldiwgInBs cyA9ICV4XG4iLCBwbHMpOworCisJCWlmIChwbHMgPT0gUE9SVFNDX1BMU19ESVNBQkxFRCkgewor CQkJZGV2X2RiZyh4dWRjLT5kZXYsICJ0b2dnbGUgdmJ1c1xuIik7CisJCQkvKiBQUkMgZG9lc24n dCBjb21wbGV0ZSBpbiAxMDBtcywgdG9nZ2xlIHRoZSB2YnVzICovCisJCQlyZXQgPQorCQkJdGVn cmFfcGh5X3h1c2JfdXRtaV9wb3J0X3Jlc2V0KHh1ZGMtPnV0bWlfcGh5KTsKKwkJCWlmIChyZXQg PT0gMSkKKwkJCQl4dWRjLT53YWl0X2Zvcl9zZWNfcHJjID0gMDsKKwkJfQorCX0KKworCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIGRtYV9h ZGRyX3QgdHJiX3ZpcnRfdG9fcGh5cyhzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsCisJCQkJICAg c3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIpCit7CisJdW5zaWduZWQgaW50IGluZGV4OworCWRt YV9hZGRyX3QgcGh5czsKKworCWluZGV4ID0gdHJiIC0gZXAtPnRyYW5zZmVyX3Jpbmc7CisJaWYg KFdBUk5fT04oaW5kZXggPj0gWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUpKQorCQlyZXR1cm4gMDsK KwlwaHlzID0gZXAtPnRyYW5zZmVyX3JpbmdfcGh5cyArIGluZGV4ICogc2l6ZW9mKCp0cmIpOwor CisJcmV0dXJuIHBoeXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYl9w aHlzX3RvX3ZpcnQoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAorCQkJCQkgICAgICAgZG1hX2Fk ZHJfdCBhZGRyKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiOworCXVuc2lnbmVkIGlu dCBpbmRleDsKKworCWluZGV4ID0gKGFkZHIgLSBlcC0+dHJhbnNmZXJfcmluZ19waHlzKSAvIHNp emVvZigqdHJiKTsKKwlpZiAoV0FSTl9PTihpbmRleCA+PSBYVURDX1RSQU5TRkVSX1JJTkdfU0la RSkpCisJCXJldHVybiBOVUxMOworCXRyYiA9ICZlcC0+dHJhbnNmZXJfcmluZ1tpbmRleF07CisK KwlyZXR1cm4gdHJiOworfQorCitzdGF0aWMgdm9pZCBlcF9yZWxvYWQoc3RydWN0IHRlZ3JhX3h1 ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBlcCkKK3sKKwl4dWRjX3dyaXRlbCh4dWRjLCBCSVQoZXAp LCBFUF9SRUxPQUQpOworCXh1ZGNfcmVhZGxfcG9sbCh4dWRjLCBFUF9SRUxPQUQsIEJJVChlcCks IDApOworfQorCitzdGF0aWMgdm9pZCBlcF9wYXVzZShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywg dW5zaWduZWQgaW50IGVwKQoreworCXUzMiB2YWw7CisKKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMs IEVQX1BBVVNFKTsKKwlpZiAodmFsICYgQklUKGVwKSkKKwkJcmV0dXJuOworCXZhbCB8PSBCSVQo ZXApOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVBfUEFVU0UpOworCisJeHVkY19yZWFkbF9w b2xsKHh1ZGMsIEVQX1NUQ0hHLCBCSVQoZXApLCBCSVQoZXApKTsKKworCXh1ZGNfd3JpdGVsKHh1 ZGMsIEJJVChlcCksIEVQX1NUQ0hHKTsKK30KKworc3RhdGljIHZvaWQgZXBfdW5wYXVzZShzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYywgdW5zaWduZWQgaW50IGVwKQoreworCXUzMiB2YWw7CisKKwl2 YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNFKTsKKwlpZiAoISh2YWwgJiBCSVQoZXApKSkK KwkJcmV0dXJuOworCXZhbCAmPSB+QklUKGVwKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVQ X1BBVVNFKTsKKworCXh1ZGNfcmVhZGxfcG9sbCh4dWRjLCBFUF9TVENIRywgQklUKGVwKSwgQklU KGVwKSk7CisKKwl4dWRjX3dyaXRlbCh4dWRjLCBCSVQoZXApLCBFUF9TVENIRyk7Cit9CisKK3N0 YXRpYyB2b2lkIGVwX3VucGF1c2VfYWxsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXUz MiB2YWw7CisKKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEVQX1BBVVNFKTsKKwl4dWRjX3dyaXRl bCh4dWRjLCAwLCBFUF9QQVVTRSk7CisKKwl4dWRjX3JlYWRsX3BvbGwoeHVkYywgRVBfU1RDSEcs IHZhbCwgdmFsKTsKKworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgRVBfU1RDSEcpOworfQorCitz dGF0aWMgdm9pZCBlcF9oYWx0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQg ZXApCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCk7CisJ aWYgKHZhbCAmIEJJVChlcCkpCisJCXJldHVybjsKKwl2YWwgfD0gQklUKGVwKTsKKwl4dWRjX3dy aXRlbCh4dWRjLCB2YWwsIEVQX0hBTFQpOworCisJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQX1NU Q0hHLCBCSVQoZXApLCBCSVQoZXApKTsKKworCXh1ZGNfd3JpdGVsKHh1ZGMsIEJJVChlcCksIEVQ X1NUQ0hHKTsKK30KKworc3RhdGljIHZvaWQgZXBfdW5oYWx0KHN0cnVjdCB0ZWdyYV94dWRjICp4 dWRjLCB1bnNpZ25lZCBpbnQgZXApCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHh1ZGNfcmVhZGwo eHVkYywgRVBfSEFMVCk7CisJaWYgKCEodmFsICYgQklUKGVwKSkpCisJCXJldHVybjsKKwl2YWwg Jj0gfkJJVChlcCk7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUF9IQUxUKTsKKworCXh1ZGNf cmVhZGxfcG9sbCh4dWRjLCBFUF9TVENIRywgQklUKGVwKSwgQklUKGVwKSk7CisKKwl4dWRjX3dy aXRlbCh4dWRjLCBCSVQoZXApLCBFUF9TVENIRyk7Cit9CisKK3N0YXRpYyB2b2lkIGVwX3VuaGFs dF9hbGwoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJdTMyIHZhbDsKKworCXZhbCA9IHh1 ZGNfcmVhZGwoeHVkYywgRVBfSEFMVCk7CisJaWYgKCF2YWwpCisJCXJldHVybjsKKwl4dWRjX3dy aXRlbCh4dWRjLCAwLCBFUF9IQUxUKTsKKworCXh1ZGNfcmVhZGxfcG9sbCh4dWRjLCBFUF9TVENI RywgdmFsLCB2YWwpOworCisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUF9TVENIRyk7Cit9CisK K3N0YXRpYyB2b2lkIGVwX3dhaXRfZm9yX3N0b3BwZWQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMs IHVuc2lnbmVkIGludCBlcCkKK3sKKwl4dWRjX3JlYWRsX3BvbGwoeHVkYywgRVBfU1RPUFBFRCwg QklUKGVwKSwgQklUKGVwKSk7CisJeHVkY193cml0ZWwoeHVkYywgQklUKGVwKSwgRVBfU1RPUFBF RCk7Cit9CisKK3N0YXRpYyB2b2lkIGVwX3dhaXRfZm9yX2luYWN0aXZlKHN0cnVjdCB0ZWdyYV94 dWRjICp4dWRjLCB1bnNpZ25lZCBpbnQgZXApCit7CisJeHVkY19yZWFkbF9wb2xsKHh1ZGMsIEVQ X1RIUkVBRF9BQ1RJVkUsIEJJVChlcCksIDApOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRj X3JlcV9kb25lKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwKKwkJCQlzdHJ1Y3QgdGVncmFfeHVk Y19yZXF1ZXN0ICpyZXEsIGludCBzdGF0dXMpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMg PSBlcC0+eHVkYzsKKworCWRldl9kYmcoeHVkYy0+ZGV2LCAiY29tcGxldGluZyByZXF1ZXN0ICVw IG9uIEVQICV1IHdpdGggc3RhdHVzICVkXG4iLAorCQkgcmVxLCBlcC0+aW5kZXgsIHN0YXR1cyk7 CisKKwlpZiAobGlrZWx5KHJlcS0+dXNiX3JlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKKwkJ cmVxLT51c2JfcmVxLnN0YXR1cyA9IHN0YXR1czsKKworCWxpc3RfZGVsX2luaXQoJnJlcS0+bGlz dCk7CisKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykpIHsKKwkJdXNi X2dhZGdldF91bm1hcF9yZXF1ZXN0KCZ4dWRjLT5nYWRnZXQsICZyZXEtPnVzYl9yZXEsCisJCQkJ CSAoeHVkYy0+c2V0dXBfc3RhdGUgPT0KKwkJCQkJICBEQVRBX1NUQUdFX1hGRVIpKTsKKwl9IGVs c2UgeworCQl1c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3QoJnh1ZGMtPmdhZGdldCwgJnJlcS0+dXNi X3JlcSwKKwkJCQkJIHVzYl9lbmRwb2ludF9kaXJfaW4oZXAtPmRlc2MpKTsKKwl9CisKKwlzcGlu X3VubG9jaygmeHVkYy0+bG9jayk7CisJdXNiX2dhZGdldF9naXZlYmFja19yZXF1ZXN0KCZlcC0+ dXNiX2VwLCAmcmVxLT51c2JfcmVxKTsKKwlzcGluX2xvY2soJnh1ZGMtPmxvY2spOworfQorCitz dGF0aWMgdm9pZCB0ZWdyYV94dWRjX2VwX251a2Uoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLCBp bnQgc3RhdHVzKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKKworCXdoaWxl ICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgeworCQlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZl cC0+cXVldWUsIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QsCisJCQkJICAgICAgIGxpc3QpOwor CQl0ZWdyYV94dWRjX3JlcV9kb25lKGVwLCByZXEsIHN0YXR1cyk7CisJfQorfQorCitzdGF0aWMg dW5zaWduZWQgaW50IGVwX2F2YWlsYWJsZV90cmJzKHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCkK K3sKKwlpZiAoZXAtPnJpbmdfZnVsbCkKKwkJcmV0dXJuIDA7CisJaWYgKGVwLT5kZXFfcHRyID4g ZXAtPmVucV9wdHIpCisJCXJldHVybiBlcC0+ZGVxX3B0ciAtIGVwLT5lbnFfcHRyIC0gMTsKKwly ZXR1cm4gWFVEQ19UUkFOU0ZFUl9SSU5HX1NJWkUgLSAoZXAtPmVucV9wdHIgLSBlcC0+ZGVxX3B0 cikgLSAyOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3F1ZXVlX29uZV90cmIoc3RydWN0 IHRlZ3JhX3h1ZGNfZXAgKmVwLAorCQkJCSAgICAgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAq cmVxLAorCQkJCSAgICAgc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICp0cmIsCisJCQkJICAgICBib29s IGlvYykKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOworCWRtYV9hZGRy X3QgYnVmX2FkZHI7CisJc2l6ZV90IGxlbjsKKworCWxlbiA9IG1pbl90KHNpemVfdCwgWFVEQ19U UkJfTUFYX0JVRkZFUl9TSVpFLCByZXEtPnVzYl9yZXEubGVuZ3RoIC0KKwkJICAgIHJlcS0+YnVm X3F1ZXVlZCk7CisJaWYgKGxlbiA+IDApCisJCWJ1Zl9hZGRyID0gcmVxLT51c2JfcmVxLmRtYSAr IHJlcS0+YnVmX3F1ZXVlZDsKKwllbHNlCisJCWJ1Zl9hZGRyID0gMDsKKworCXRyYl93cml0ZV9k YXRhX3B0cih0cmIsIGJ1Zl9hZGRyKTsKKworCXRyYl93cml0ZV90cmFuc2Zlcl9sZW4odHJiLCBs ZW4pOworCXRyYl93cml0ZV90ZF9zaXplKHRyYiwgcmVxLT50cmJzX25lZWRlZCAtIHJlcS0+dHJi c19xdWV1ZWQgLSAxKTsKKworCWlmIChyZXEtPnRyYnNfcXVldWVkID09IHJlcS0+dHJic19uZWVk ZWQgLSAxIHx8CisJCShyZXEtPm5lZWRfemxwICYmIHJlcS0+dHJic19xdWV1ZWQgPT0gcmVxLT50 cmJzX25lZWRlZCAtIDIpKQorCQl0cmJfd3JpdGVfY2hhaW4odHJiLCAwKTsKKwllbHNlCisJCXRy Yl93cml0ZV9jaGFpbih0cmIsIDEpOworCXRyYl93cml0ZV9pb2ModHJiLCBpb2MpOworCisJaWYg KHVzYl9lbmRwb2ludF9kaXJfb3V0KGVwLT5kZXNjKSB8fAorCSAgICAodXNiX2VuZHBvaW50X3hm ZXJfY29udHJvbChlcC0+ZGVzYykgJiYKKwkgICAgICh4dWRjLT5zZXR1cF9zdGF0ZSA9PSBEQVRB X1NUQUdFX1JFQ1YpKSkKKwkJdHJiX3dyaXRlX2lzcCh0cmIsIDEpOworCWVsc2UKKwkJdHJiX3dy aXRlX2lzcCh0cmIsIDApOworCisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZXAtPmRl c2MpKSB7CisJCWlmICh4dWRjLT5zZXR1cF9zdGF0ZSA9PSBEQVRBX1NUQUdFX1hGRVIgfHwKKwkJ ICAgIHh1ZGMtPnNldHVwX3N0YXRlID09IERBVEFfU1RBR0VfUkVDVikKKwkJCXRyYl93cml0ZV90 eXBlKHRyYiwgVFJCX1RZUEVfREFUQV9TVEFHRSk7CisJCWVsc2UKKwkJCXRyYl93cml0ZV90eXBl KHRyYiwgVFJCX1RZUEVfU1RBVFVTX1NUQUdFKTsKKwkJaWYgKHh1ZGMtPnNldHVwX3N0YXRlID09 IERBVEFfU1RBR0VfWEZFUiB8fAorCQkgICAgeHVkYy0+c2V0dXBfc3RhdGUgPT0gU1RBVFVTX1NU QUdFX1hGRVIpCisJCQl0cmJfd3JpdGVfZGF0YV9zdGFnZV9kaXIodHJiLCAxKTsKKwkJZWxzZQor CQkJdHJiX3dyaXRlX2RhdGFfc3RhZ2VfZGlyKHRyYiwgMCk7CisJfSBlbHNlIGlmICh1c2JfZW5k cG9pbnRfeGZlcl9pc29jKGVwLT5kZXNjKSkgeworCQl0cmJfd3JpdGVfdHlwZSh0cmIsIFRSQl9U WVBFX0lTT0NIKTsKKwkJdHJiX3dyaXRlX3NpYSh0cmIsIDEpOworCQl0cmJfd3JpdGVfZnJhbWVf aWQodHJiLCAwKTsKKwkJdHJiX3dyaXRlX3RsYnBjKHRyYiwgMCk7CisJfSBlbHNlIGlmICh1c2Jf c3NfbWF4X3N0cmVhbXMoZXAtPmNvbXBfZGVzYykpIHsKKwkJdHJiX3dyaXRlX3R5cGUodHJiLCBU UkJfVFlQRV9TVFJFQU0pOworCQl0cmJfd3JpdGVfc3RyZWFtX2lkKHRyYiwgcmVxLT51c2JfcmVx LnN0cmVhbV9pZCk7CisJfSBlbHNlIHsKKwkJdHJiX3dyaXRlX3R5cGUodHJiLCBUUkJfVFlQRV9O T1JNQUwpOworCQl0cmJfd3JpdGVfc3RyZWFtX2lkKHRyYiwgMCk7CisJfQorCisJdHJiX3dyaXRl X2N5Y2xlKHRyYiwgZXAtPnBjcyk7CisKKwlyZXEtPnRyYnNfcXVldWVkKys7CisJcmVxLT5idWZf cXVldWVkICs9IGxlbjsKKworCWR1bXBfdHJiKHh1ZGMsICJUUkFOU0ZFUiIsIHRyYik7Cit9CisK K3N0YXRpYyB1bnNpZ25lZCBpbnQgdGVncmFfeHVkY19xdWV1ZV90cmJzKHN0cnVjdCB0ZWdyYV94 dWRjX2VwICplcCwKKwkJCQkJICBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXEpCit7CisJ dW5zaWduZWQgaW50IGksIGNvdW50LCBhdmFpbGFibGU7CisJYm9vbCB3YWl0X3RkID0gZmFsc2U7 CisKKwlhdmFpbGFibGUgPSBlcF9hdmFpbGFibGVfdHJicyhlcCk7CisJY291bnQgPSByZXEtPnRy YnNfbmVlZGVkIC0gcmVxLT50cmJzX3F1ZXVlZDsKKwlpZiAoYXZhaWxhYmxlIDwgY291bnQpIHsK KwkJY291bnQgPSBhdmFpbGFibGU7CisJCWVwLT5yaW5nX2Z1bGwgPSB0cnVlOworCX0KKworCS8q CisJICogVG8gZ2VuZXJhdGUgemVyby1sZW5ndGggcGFja2V0IG9uIFVTQiBidXMsIFNXIG5lZWRz IHNjaGVkdWxlIGEKKwkgKiBzdGFuZGFsb25lIHplcm8tbGVuZ3RoIFRELiBBY2NvcmRpbmcgdG8g SFcncyBiZWhhdmlvciwgU1cgbmVlZHMKKwkgKiB0byBzY2hlZHVsZSBURHMgaW4gZGlmZmVyZW50 IHdheXMgZm9yIGRpZmZlcmVudCBlbmRwb2ludCB0eXBlcy4KKwkgKgorCSAqIEZvciBjb250cm9s IGVuZHBvaW50OgorCSAqIC0gRGF0YSBzdGFnZSBURCAoSU9DID0gMSwgQ0ggPSAwKQorCSAqIC0g UmluZyBkb29yYmVsbCBhbmQgd2FpdCB0cmFuc2ZlciBldmVudAorCSAqIC0gRGF0YSBzdGFnZSBU RCBmb3IgWkxQIChJT0MgPSAxLCBDSCA9IDApCisJICogLSBSaW5nIGRvb3JiZWxsCisJICoKKwkg KiBGb3IgYnVsayBhbmQgaW50ZXJydXB0IGVuZHBvaW50czoKKwkgKiAtIE5vcm1hbCB0cmFuc2Zl ciBURCAoSU9DID0gMCwgQ0ggPSAwKQorCSAqIC0gTm9ybWFsIHRyYW5zZmVyIFREIGZvciBaTFAg KElPQyA9IDEsIENIID0gMCkKKwkgKiAtIFJpbmcgZG9vcmJlbGwKKwkgKi8KKworCWlmIChyZXEt Pm5lZWRfemxwICYmIHVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2woZXAtPmRlc2MpICYmIGNvdW50 ID4gMSkKKwkJd2FpdF90ZCA9IHRydWU7CisKKwlpZiAoIXJlcS0+Zmlyc3RfdHJiKQorCQlyZXEt PmZpcnN0X3RyYiA9ICZlcC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07CisKKwlmb3IgKGkg PSAwOyBpIDwgY291bnQ7IGkrKykgeworCQlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYiA9ICZl cC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07CisJCWJvb2wgaW9jID0gZmFsc2U7CisKKwkJ aWYgKChpID09IGNvdW50IC0gMSkgfHwgKHdhaXRfdGQgJiYgaSA9PSBjb3VudCAtIDIpKQorCQkJ aW9jID0gdHJ1ZTsKKworCQl0ZWdyYV94dWRjX3F1ZXVlX29uZV90cmIoZXAsIHJlcSwgdHJiLCBp b2MpOworCQlyZXEtPmxhc3RfdHJiID0gdHJiOworCisJCWVwLT5lbnFfcHRyKys7CisJCWlmIChl cC0+ZW5xX3B0ciA9PSBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSAtIDEpIHsKKwkJCXRyYiA9ICZl cC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07CisJCQl0cmJfd3JpdGVfY3ljbGUodHJiLCBl cC0+cGNzKTsKKwkJCWVwLT5wY3MgPSAhZXAtPnBjczsKKwkJCWVwLT5lbnFfcHRyID0gMDsKKwkJ fQorCisJCWlmIChpb2MpCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0 YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZXBfcmluZ19kb29yYmVsbChzdHJ1Y3QgdGVncmFfeHVkY19l cCAqZXApCit7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKKwl1MzIgdmFs OworCisJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCisJCXJldHVybjsKKworCXZhbCA9IGVw LT5pbmRleCA8PCBEQl9UQVJHRVRfU0hJRlQ7CisJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2NvbnRy b2woZXAtPmRlc2MpKSB7CisJCXZhbCB8PSB4dWRjLT5zZXR1cF9zZXFfbnVtIDw8IERCX1NUUkVB TUlEX1NISUZUOworCX0gZWxzZSBpZiAodXNiX3NzX21heF9zdHJlYW1zKGVwLT5jb21wX2Rlc2Mp ID4gMCkgeworCQlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXE7CisKKwkJLyogRG9uJ3Qg cmluZyBkb29yYmVsbCBpZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlamVjdGVkLiAqLworCQlpZiAo ZXAtPnN0cmVhbV9yZWplY3RlZCkKKwkJCXJldHVybjsKKwkJcmVxID0gbGlzdF9maXJzdF9lbnRy eSgmZXAtPnF1ZXVlLCBzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0LAorCQkJCSAgICAgICBsaXN0 KTsKKwkJdmFsIHw9IHJlcS0+dXNiX3JlcS5zdHJlYW1faWQgPDwgREJfU1RSRUFNSURfU0hJRlQ7 CisJfQorCWRldl9kYmcoeHVkYy0+ZGV2LCAicmluZyBkb29yYmVsbDogJSN4XG4iLCB2YWwpOwor CXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgREIpOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRj X2VwX2tpY2tfcXVldWUoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwKQoreworCXN0cnVjdCB0ZWdy YV94dWRjX3JlcXVlc3QgKnJlcTsKKwlib29sIHRyYnNfcXVldWVkID0gZmFsc2U7CisKKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJmVwLT5xdWV1ZSwgbGlzdCkgeworCQlpZiAoZXAtPnJpbmdf ZnVsbCkKKwkJCWJyZWFrOworCQlpZiAodGVncmFfeHVkY19xdWV1ZV90cmJzKGVwLCByZXEpID4g MCkKKwkJCXRyYnNfcXVldWVkID0gdHJ1ZTsKKwl9CisKKwlpZiAodHJic19xdWV1ZWQpCisJCXRl Z3JhX3h1ZGNfZXBfcmluZ19kb29yYmVsbChlcCk7Cit9CisKK3N0YXRpYyBpbnQKK19fdGVncmFf eHVkY19lcF9xdWV1ZShzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAsIHN0cnVjdCB0ZWdyYV94dWRj X3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOwor CWludCBlcnI7CisKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChlcC0+ZGVzYykgJiYg IWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJjb250cm9s IEVQIGhhcyBwZW5kaW5nIHRyYW5zZmVyc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwor CWlmICh1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGVwLT5kZXNjKSkgeworCQllcnIgPSB1c2Jf Z2FkZ2V0X21hcF9yZXF1ZXN0KCZ4dWRjLT5nYWRnZXQsICZyZXEtPnVzYl9yZXEsCisJCQkJCSAg ICAgKHh1ZGMtPnNldHVwX3N0YXRlID09CisJCQkJCSAgICAgIERBVEFfU1RBR0VfWEZFUikpOwor CX0gZWxzZSB7CisJCWVyciA9IHVzYl9nYWRnZXRfbWFwX3JlcXVlc3QoJnh1ZGMtPmdhZGdldCwg JnJlcS0+dXNiX3JlcSwKKwkJCQkJICAgICB1c2JfZW5kcG9pbnRfZGlyX2luKGVwLT5kZXNjKSk7 CisJfQorCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIG1h cCByZXF1ZXN0OiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXEtPmZpcnN0 X3RyYiA9IE5VTEw7CisJcmVxLT5sYXN0X3RyYiA9IE5VTEw7CisJcmVxLT5idWZfcXVldWVkID0g MDsKKwlyZXEtPnRyYnNfcXVldWVkID0gMDsKKwlyZXEtPm5lZWRfemxwID0gZmFsc2U7CisJcmVx LT50cmJzX25lZWRlZCA9IERJVl9ST1VORF9VUChyZXEtPnVzYl9yZXEubGVuZ3RoLAorCQkJCQlY VURDX1RSQl9NQVhfQlVGRkVSX1NJWkUpOworCWlmIChyZXEtPnVzYl9yZXEubGVuZ3RoID09IDAp CisJCXJlcS0+dHJic19uZWVkZWQrKzsKKwlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2lzb2MoZXAt PmRlc2MpICYmCisJICAgIHJlcS0+dXNiX3JlcS56ZXJvICYmIChyZXEtPnVzYl9yZXEubGVuZ3Ro ICE9IDApICYmCisJICAgICgocmVxLT51c2JfcmVxLmxlbmd0aCAlIGVwLT51c2JfZXAubWF4cGFj a2V0KSA9PSAwKSkgeworCQlyZXEtPnRyYnNfbmVlZGVkKys7CisJCXJlcS0+bmVlZF96bHAgPSB0 cnVlOworCX0KKworCXJlcS0+dXNiX3JlcS5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJcmVxLT51 c2JfcmVxLmFjdHVhbCA9IDA7CisKKwlsaXN0X2FkZF90YWlsKCZyZXEtPmxpc3QsICZlcC0+cXVl dWUpOworCisJdGVncmFfeHVkY19lcF9raWNrX3F1ZXVlKGVwKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50Cit0ZWdyYV94dWRjX2VwX3F1ZXVlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwg c3RydWN0IHVzYl9yZXF1ZXN0ICp1c2JfcmVxLAorCQkgICAgZ2ZwX3QgZ2ZwKQoreworCXN0cnVj dCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXA7CisJ c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0 OworCisJaWYgKCF1c2JfZXAgfHwgIXVzYl9yZXEpCisJCXJldHVybiAtRUlOVkFMOworCWVwID0g dG9feHVkY19lcCh1c2JfZXApOworCXJlcSA9IHRvX3h1ZGNfcmVxKHVzYl9yZXEpOworCXh1ZGMg PSBlcC0+eHVkYzsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJ aWYgKHh1ZGMtPnBvd2VyZ2F0ZWQgfHwgIWVwLT5kZXNjKSB7CisJCXJldCA9IC1FU0hVVERPV047 CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQgPSBfX3RlZ3JhX3h1ZGNfZXBfcXVldWUoZXAsIHJl cSk7Cit1bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3Mp OworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgc3F1ZWV6ZV90cmFuc2Zlcl9yaW5n KHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCwKKwkJCQkgIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVl c3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkY190cmIgKnRyYiA9IHJlcS0+Zmlyc3RfdHJi OworCWJvb2wgcGNzX2VucSA9IHRyYl9yZWFkX2N5Y2xlKHRyYik7CisJYm9vbCBwY3M7CisKKwkv KgorCSAqIENsZWFyIG91dCBhbGwgdGhlIFRSQnMgcGFydCBvZiBvciBhZnRlciB0aGUgY2FuY2Vs bGVkIHJlcXVlc3QsCisJICogYW5kIG11c3QgY29ycmVjdCB0cmIgY3ljbGUgYml0IHRvIHRoZSBs YXN0IHVuLWVucXVldWVkIHN0YXRlLgorCSAqLworCXdoaWxlICh0cmIgIT0gJmVwLT50cmFuc2Zl cl9yaW5nW2VwLT5lbnFfcHRyXSkgeworCQlwY3MgPSB0cmJfcmVhZF9jeWNsZSh0cmIpOworCQlt ZW1zZXQodHJiLCAwLCBzaXplb2YoKnRyYikpOworCQl0cmJfd3JpdGVfY3ljbGUodHJiLCAhcGNz KTsKKwkJdHJiKys7CisKKwkJaWYgKHRyYl9yZWFkX3R5cGUodHJiKSA9PSBUUkJfVFlQRV9MSU5L KQorCQkJdHJiID0gZXAtPnRyYW5zZmVyX3Jpbmc7CisJfQorCisJLyogUmVxdWVzdHMgd2lsbCBi ZSByZS1xdWV1ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBjYW5jZWxsZWQgcmVxdWVzdC4gKi8KKwll cC0+ZW5xX3B0ciA9IHJlcS0+Zmlyc3RfdHJiIC0gZXAtPnRyYW5zZmVyX3Jpbmc7CisJLyoKKwkg KiBSZXRyaWV2ZSB0aGUgY29ycmVjdCBjeWNsZSBiaXQgc3RhdGUgZnJvbSB0aGUgZmlyc3QgdHJi IG9mCisJICogdGhlIGNhbmNlbGxlZCByZXF1ZXN0LgorCSAqLworCWVwLT5wY3MgPSBwY3NfZW5x OworCWVwLT5yaW5nX2Z1bGwgPSBmYWxzZTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVl KHJlcSwgJmVwLT5xdWV1ZSwgbGlzdCkgeworCQlyZXEtPnVzYl9yZXEuc3RhdHVzID0gLUVJTlBS T0dSRVNTOworCQlyZXEtPnVzYl9yZXEuYWN0dWFsID0gMDsKKworCQlyZXEtPmZpcnN0X3RyYiA9 IE5VTEw7CisJCXJlcS0+bGFzdF90cmIgPSBOVUxMOworCQlyZXEtPmJ1Zl9xdWV1ZWQgPSAwOwor CQlyZXEtPnRyYnNfcXVldWVkID0gMDsKKwl9Cit9CisKKy8qCisgKiBEZXRlcm1pbmUgaWYgdGhl IGdpdmVuIFRSQiBpcyBpbiB0aGUgcmFuZ2UgW2ZpcnN0IHRyYiwgbGFzdCB0cmJdIGZvciB0aGUK KyAqIGdpdmVuIHJlcXVlc3QuCisgKi8KK3N0YXRpYyBib29sIHRyYl9pbl9yZXF1ZXN0KHN0cnVj dCB0ZWdyYV94dWRjX2VwICplcCwKKwkJCSAgIHN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJl cSwKKwkJCSAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQoreworCWRldl9kYmcoZXAtPnh1 ZGMtPmRldiwgIiVzOiByZXF1ZXN0ICVwIC0+ICVwOyB0cmIgJXBcbiIsIF9fZnVuY19fLAorCQly ZXEtPmZpcnN0X3RyYiwgcmVxLT5sYXN0X3RyYiwgdHJiKTsKKworCWlmICh0cmIgPj0gcmVxLT5m aXJzdF90cmIgJiYgKHRyYiA8PSByZXEtPmxhc3RfdHJiIHx8CisJCQkJICAgICAgcmVxLT5sYXN0 X3RyYiA8IHJlcS0+Zmlyc3RfdHJiKSkKKwkJcmV0dXJuIHRydWU7CisJaWYgKHRyYiA8IHJlcS0+ Zmlyc3RfdHJiICYmIHRyYiA8PSByZXEtPmxhc3RfdHJiICYmCisJICAgIHJlcS0+bGFzdF90cmIg PCByZXEtPmZpcnN0X3RyYikKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCisv KgorICogRGV0ZXJtaW5lIGlmIHRoZSBnaXZlbiBUUkIgaXMgaW4gdGhlIHJhbmdlIFtFUCBlbnF1 ZXVlIHBvaW50ZXIsIGZpcnN0IFRSQikKKyAqIGZvciB0aGUgZ2l2ZW4gZW5kcG9pbnQgYW5kIHJl cXVlc3QuCisgKi8KK3N0YXRpYyBib29sIHRyYl9iZWZvcmVfcmVxdWVzdChzdHJ1Y3QgdGVncmFf eHVkY19lcCAqZXAsCisJCQkgICAgICAgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqcmVxLAor CQkJICAgICAgIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQoreworCXN0cnVjdCB0ZWdyYV94 dWRjX3RyYiAqZW5xX3RyYiA9ICZlcC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl07CisKKwlk ZXZfZGJnKGVwLT54dWRjLT5kZXYsICIlczogcmVxdWVzdCAlcCAtPiAlcDsgZW5xIHB0cjogJXA7 IHRyYiAlcFxuIiwKKwkJX19mdW5jX18sIHJlcS0+Zmlyc3RfdHJiLCByZXEtPmxhc3RfdHJiLCBl bnFfdHJiLCB0cmIpOworCisJaWYgKHRyYiA8IHJlcS0+Zmlyc3RfdHJiICYmIChlbnFfdHJiIDw9 IHRyYiB8fAorCQkJCSAgICAgcmVxLT5maXJzdF90cmIgPCBlbnFfdHJiKSkKKwkJcmV0dXJuIHRy dWU7CisJaWYgKHRyYiA+IHJlcS0+Zmlyc3RfdHJiICYmIHJlcS0+Zmlyc3RfdHJiIDwgZW5xX3Ry YiAmJiBlbnFfdHJiIDw9IHRyYikKKwkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQor CitzdGF0aWMgaW50CitfX3RlZ3JhX3h1ZGNfZXBfZGVxdWV1ZShzdHJ1Y3QgdGVncmFfeHVkY19l cCAqZXAsCisJCQlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMgPSBlcC0+eHVkYzsKKwlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpy OworCXN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqZGVxX3RyYjsKKwlib29sIGJ1c3ksIGtpY2tfcXVl dWUgPSBmYWxzZTsKKwlpbnQgcmV0ID0gMDsKKworCS8qIE1ha2Ugc3VyZSB0aGUgcmVxdWVzdCBp cyBhY3R1YWxseSBxdWV1ZWQgdG8gdGhpcyBlbmRwb2ludC4gKi8KKwlsaXN0X2Zvcl9lYWNoX2Vu dHJ5KHIsICZlcC0+cXVldWUsIGxpc3QpIHsKKwkJaWYgKHIgPT0gcmVxKQorCQkJYnJlYWs7CisJ fQorCWlmIChyICE9IHJlcSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBSZXF1ZXN0IGhhc24n dCBiZWVuIHF1ZXVlZCBpbiB0aGUgdHJhbnNmZXIgcmluZyB5ZXQuICovCisJaWYgKCFyZXEtPnRy YnNfcXVldWVkKSB7CisJCXRlZ3JhX3h1ZGNfcmVxX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQp OworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBIYWx0IERNQSBmb3IgdGhpcyBlbmRwaW9udC4gKi8K KwlpZiAoZXBfY3R4X3JlYWRfc3RhdGUoZXAtPmNvbnRleHQpID09IEVQX1NUQVRFX1JVTk5JTkcp IHsKKwkJZXBfcGF1c2UoeHVkYywgZXAtPmluZGV4KTsKKwkJZXBfd2FpdF9mb3JfaW5hY3RpdmUo eHVkYywgZXAtPmluZGV4KTsKKwl9CisKKwlkZXFfdHJiID0gdHJiX3BoeXNfdG9fdmlydChlcCwg ZXBfY3R4X3JlYWRfZGVxX3B0cihlcC0+Y29udGV4dCkpOworCS8qIElzIHRoZSBoYXJkd2FyZSBw cm9jZXNzaW5nIHRoZSBUUkIgYXQgdGhlIGRlcXVldWUgcG9pbnRlcj8gKi8KKwlidXN5ID0gKHRy Yl9yZWFkX2N5Y2xlKGRlcV90cmIpID09IGVwX2N0eF9yZWFkX2RjcyhlcC0+Y29udGV4dCkpOwor CisJaWYgKHRyYl9pbl9yZXF1ZXN0KGVwLCByZXEsIGRlcV90cmIpICYmIGJ1c3kpIHsKKwkJLyoK KwkJICogUmVxdWVzdCBoYXMgYmVlbiBwYXJ0aWFsbHkgY29tcGxldGVkIG9yIGl0IGhhc24ndAor CQkgKiBzdGFydGVkIHByb2Nlc3NpbmcgeWV0LgorCQkgKi8KKwkJZG1hX2FkZHJfdCBkZXFfcHRy OworCisJCXNxdWVlemVfdHJhbnNmZXJfcmluZyhlcCwgcmVxKTsKKworCQlyZXEtPnVzYl9yZXEu YWN0dWFsID0gZXBfY3R4X3JlYWRfZWR0bGEoZXAtPmNvbnRleHQpOworCQl0ZWdyYV94dWRjX3Jl cV9kb25lKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKKwkJa2lja19xdWV1ZSA9IHRydWU7CisKKwkJ LyogRURUTEEgaXMgPiAwOiByZXF1ZXN0IGhhcyBiZWVuIHBhcnRpYWxseSBjb21wbGV0ZWQgKi8K KwkJaWYgKHJlcS0+dXNiX3JlcS5hY3R1YWwgPiAwKSB7CisJCQkvKgorCQkJICogQWJvcnQgdGhl IHBlbmRpbmcgdHJhbnNmZXIgYW5kIHVwZGF0ZSB0aGUgZGVxdWV1ZQorCQkJICogcG9pbnRlcgor CQkJICovCisJCQllcF9jdHhfd3JpdGVfZWR0bGEoZXAtPmNvbnRleHQsIDApOworCQkJZXBfY3R4 X3dyaXRlX3BhcnRpYWxfdGQoZXAtPmNvbnRleHQsIDApOworCQkJZXBfY3R4X3dyaXRlX2RhdGFf b2Zmc2V0KGVwLT5jb250ZXh0LCAwKTsKKworCQkJZGVxX3B0ciA9IHRyYl92aXJ0X3RvX3BoeXMo ZXAsCisJCQkJCSZlcC0+dHJhbnNmZXJfcmluZ1tlcC0+ZW5xX3B0cl0pOworCQkJaWYgKGRtYV9t YXBwaW5nX2Vycm9yKHh1ZGMtPmRldiwgZGVxX3B0cikpCisJCQkJcmV0ID0gLUVJTlZBTDsKKwkJ CWVsc2UgeworCQkJCWVwX2N0eF93cml0ZV9kZXFfcHRyKGVwLT5jb250ZXh0LCBkZXFfcHRyKTsK KwkJCQllcF9jdHhfd3JpdGVfZGNzKGVwLT5jb250ZXh0LCBlcC0+cGNzKTsKKwkJCQllcF9yZWxv YWQoeHVkYywgZXAtPmluZGV4KTsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAodHJiX2JlZm9yZV9y ZXF1ZXN0KGVwLCByZXEsIGRlcV90cmIpICYmIGJ1c3kpIHsKKwkJLyogUmVxdWVzdCBoYXNuJ3Qg c3RhcnRlZCBwcm9jZXNzaW5nIHlldC4gKi8KKwkJc3F1ZWV6ZV90cmFuc2Zlcl9yaW5nKGVwLCBy ZXEpOworCisJCXRlZ3JhX3h1ZGNfcmVxX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOworCQlr aWNrX3F1ZXVlID0gdHJ1ZTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBSZXF1ZXN0IGhhcyBjb21w bGV0ZWQsIGJ1dCB3ZSBoYXZlbid0IHByb2Nlc3NlZCB0aGUKKwkJICogY29tcGxldGlvbiBldmVu dCB5ZXQuCisJCSAqLworCQl0ZWdyYV94dWRjX3JlcV9kb25lKGVwLCByZXEsIC1FQ09OTlJFU0VU KTsKKwkJcmV0ID0gLUVJTlZBTDsKKwl9CisKKwkvKiBSZXN1bWUgdGhlIGVuZHBvaW50LiAqLwor CWVwX3VucGF1c2UoeHVkYywgZXAtPmluZGV4KTsKKworCWlmIChraWNrX3F1ZXVlKQorCQl0ZWdy YV94dWRjX2VwX2tpY2tfcXVldWUoZXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGlu dAordGVncmFfeHVkY19lcF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAgKnVzYl9lcCwgc3RydWN0IHVz Yl9yZXF1ZXN0ICp1c2JfcmVxKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsK KwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXA7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKCF1c2JfZXAgfHwgIXVzYl9y ZXEpCisJCXJldHVybiAtRUlOVkFMOworCWVwID0gdG9feHVkY19lcCh1c2JfZXApOworCXJlcSA9 IHRvX3h1ZGNfcmVxKHVzYl9yZXEpOworCXh1ZGMgPSBlcC0+eHVkYzsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJaWYgKHh1ZGMtPnBvd2VyZ2F0ZWQgfHwgIWVw LT5kZXNjKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQg PSBfX3RlZ3JhX3h1ZGNfZXBfZGVxdWV1ZShlcCwgcmVxKTsKK3VubG9jazoKKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitz dGF0aWMgaW50IF9fdGVncmFfeHVkY19lcF9zZXRfaGFsdChzdHJ1Y3QgdGVncmFfeHVkY19lcCAq ZXAsIGJvb2wgaGFsdCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOwor CisJaWYgKCFlcC0+ZGVzYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodXNiX2VuZHBvaW50 X3hmZXJfaXNvYyhlcC0+ZGVzYykpIHsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJjYW4ndCBoYWx0 IGlzb2MgRVBcbiIpOworCQlyZXR1cm4gLUVOT1RTVVBQOworCX0KKworCWlmICghISh4dWRjX3Jl YWRsKHh1ZGMsIEVQX0hBTFQpICYgQklUKGVwLT5pbmRleCkpID09IGhhbHQpIHsKKwkJZGV2X2Ri Zyh4dWRjLT5kZXYsICJFUCAldSBhbHJlYWR5ICVzXG4iLCBlcC0+aW5kZXgsCisJCQloYWx0ID8g ImhhbHRlZCIgOiAibm90IGhhbHRlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaGFsdCkg eworCQllcF9oYWx0KHh1ZGMsIGVwLT5pbmRleCk7CisJfSBlbHNlIHsKKwkJZXBfY3R4X3dyaXRl X3N0YXRlKGVwLT5jb250ZXh0LCBFUF9TVEFURV9ESVNBQkxFRCk7CisKKwkJZXBfcmVsb2FkKHh1 ZGMsIGVwLT5pbmRleCk7CisKKwkJZXBfY3R4X3dyaXRlX3N0YXRlKGVwLT5jb250ZXh0LCBFUF9T VEFURV9SVU5OSU5HKTsKKwkJZXBfY3R4X3dyaXRlX3NlcV9udW0oZXAtPmNvbnRleHQsIDApOwor CisJCWVwX3JlbG9hZCh4dWRjLCBlcC0+aW5kZXgpOworCQllcF91bnBhdXNlKHh1ZGMsIGVwLT5p bmRleCk7CisJCWVwX3VuaGFsdCh4dWRjLCBlcC0+aW5kZXgpOworCisJCXRlZ3JhX3h1ZGNfZXBf cmluZ19kb29yYmVsbChlcCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVn cmFfeHVkY19lcF9zZXRfaGFsdChzdHJ1Y3QgdXNiX2VwICp1c2JfZXAsIGludCB2YWx1ZSkKK3sK KwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXA7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmV0OworCisJaWYgKCF1c2JfZXApCisJCXJldHVy biAtRUlOVkFMOworCisJZXAgPSB0b194dWRjX2VwKHVzYl9lcCk7CisJeHVkYyA9IGVwLT54dWRj OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoeHVkYy0+ cG93ZXJnYXRlZCkgeworCQlyZXQgPSAtRVNIVVRET1dOOworCQlnb3RvIHVubG9jazsKKwl9CisJ aWYgKHZhbHVlICYmIHVzYl9lbmRwb2ludF9kaXJfaW4oZXAtPmRlc2MpICYmCisJICAgICFsaXN0 X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAiY2FuJ3QgaGFsdCBF UCB3aXRoIHJlcXVlc3RzIHBlbmRpbmdcbiIpOworCQlyZXQgPSAtRUFHQUlOOworCQlnb3RvIHVu bG9jazsKKwl9CisJcmV0ID0gX190ZWdyYV94dWRjX2VwX3NldF9oYWx0KGVwLCB2YWx1ZSk7Cit1 bmxvY2s6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCisJ cmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfeHVkY19lcF9jb250ZXh0X3NldHVw KHN0cnVjdCB0ZWdyYV94dWRjX2VwICplcCkKK3sKKwljb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50 X2Rlc2NyaXB0b3IgKmRlc2MgPSBlcC0+ZGVzYzsKKwljb25zdCBzdHJ1Y3QgdXNiX3NzX2VwX2Nv bXBfZGVzY3JpcHRvciAqY29tcF9kZXNjID0gZXAtPmNvbXBfZGVzYzsKKwlzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYyA9IGVwLT54dWRjOworCXUxNiBtYXhwYWNrZXQsIG1heGJ1cnN0ID0gMCwgZXNp dCA9IDA7CisJdTMyIHZhbDsKKworCW1heHBhY2tldCA9IHVzYl9lbmRwb2ludF9tYXhwKGRlc2Mp ICYgMHg3ZmY7CisJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfU1VQRVIpIHsK KwkJaWYgKCF1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGRlc2MpKQorCQkJbWF4YnVyc3QgPSBj b21wX2Rlc2MtPmJNYXhCdXJzdDsKKwkJaWYgKHVzYl9lbmRwb2ludF94ZmVyX2ludChkZXNjKSB8 fCB1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlc2MpKQorCQkJZXNpdCA9IGxlMTZfdG9fY3B1KGNv bXBfZGVzYy0+d0J5dGVzUGVySW50ZXJ2YWwpOworCX0gZWxzZSBpZiAoKHh1ZGMtPmdhZGdldC5z cGVlZCA8IFVTQl9TUEVFRF9TVVBFUikgJiYKKwkJICAgKHVzYl9lbmRwb2ludF94ZmVyX2ludChk ZXNjKSB8fAorCQkgICAgdXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkpIHsKKwkJaWYgKHh1 ZGMtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkgeworCQkJbWF4YnVyc3QgPSAodXNi X2VuZHBvaW50X21heHAoZGVzYykgPj4gMTEpICYgMHgzOworCQkJaWYgKG1heGJ1cnN0ID09IDB4 MykgeworCQkJCWRldl93YXJuKHh1ZGMtPmRldiwKKwkJCQkJICJpbnZhbGlkIGVuZHBvaW50IG1h eGJ1cnN0XG4iKTsKKwkJCQltYXhidXJzdCA9IDB4MjsKKwkJCX0KKwkJfQorCQllc2l0ID0gbWF4 cGFja2V0ICogKG1heGJ1cnN0ICsgMSk7CisJfQorCisJbWVtc2V0KGVwLT5jb250ZXh0LCAwLCBz aXplb2YoKmVwLT5jb250ZXh0KSk7CisKKwllcF9jdHhfd3JpdGVfc3RhdGUoZXAtPmNvbnRleHQs IEVQX1NUQVRFX1JVTk5JTkcpOworCWVwX2N0eF93cml0ZV9pbnRlcnZhbChlcC0+Y29udGV4dCwg ZGVzYy0+YkludGVydmFsKTsKKwlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9T VVBFUikgeworCQlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhkZXNjKSkgeworCQkJZXBfY3R4 X3dyaXRlX211bHQoZXAtPmNvbnRleHQsCisJCQkJCSAgY29tcF9kZXNjLT5ibUF0dHJpYnV0ZXMg JiAweDMpOworCQl9CisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9idWxrKGRlc2MpKSB7CisJCQll cF9jdHhfd3JpdGVfbWF4X3BzdHJlYW1zKGVwLT5jb250ZXh0LAorCQkJCQkJICBjb21wX2Rlc2Mt PmJtQXR0cmlidXRlcyAmCisJCQkJCQkgIDB4MWYpOworCQkJZXBfY3R4X3dyaXRlX2xzYShlcC0+ Y29udGV4dCwgMSk7CisJCX0KKwl9CisKKwlpZiAoIXVzYl9lbmRwb2ludF94ZmVyX2NvbnRyb2wo ZGVzYykgJiYgdXNiX2VuZHBvaW50X2Rpcl9vdXQoZGVzYykpCisJCXZhbCA9IHVzYl9lbmRwb2lu dF90eXBlKGRlc2MpOworCWVsc2UKKwkJdmFsID0gdXNiX2VuZHBvaW50X3R5cGUoZGVzYykgKyBF UF9UWVBFX0NPTlRST0w7CisJZXBfY3R4X3dyaXRlX3R5cGUoZXAtPmNvbnRleHQsIHZhbCk7CisJ ZXBfY3R4X3dyaXRlX2NlcnIoZXAtPmNvbnRleHQsIDB4Myk7CisJZXBfY3R4X3dyaXRlX21heF9w YWNrZXRfc2l6ZShlcC0+Y29udGV4dCwgbWF4cGFja2V0KTsKKwllcF9jdHhfd3JpdGVfbWF4X2J1 cnN0X3NpemUoZXAtPmNvbnRleHQsIG1heGJ1cnN0KTsKKworCWVwX2N0eF93cml0ZV9kZXFfcHRy KGVwLT5jb250ZXh0LCBlcC0+dHJhbnNmZXJfcmluZ19waHlzKTsKKwllcF9jdHhfd3JpdGVfZGNz KGVwLT5jb250ZXh0LCBlcC0+cGNzKTsKKworCS8qIFNlbGVjdCBhIHJlYXNvbmFibGUgYXZlcmFn ZSBUUkIgbGVuZ3RoIGJhc2VkIG9uIGVuZHBvaW50IHR5cGUuICovCisJc3dpdGNoICh1c2JfZW5k cG9pbnRfdHlwZShkZXNjKSkgeworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTDoKKwkJ dmFsID0gODsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCXZhbCA9 IDEwMjQ7CisJCWJyZWFrOworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKKwljYXNlIFVT Ql9FTkRQT0lOVF9YRkVSX0lTT0M6CisJZGVmYXVsdDoKKwkJdmFsID0gMzA3MjsKKwkJYnJlYWs7 CisJfQorCWVwX2N0eF93cml0ZV9hdmdfdHJiX2xlbihlcC0+Y29udGV4dCwgdmFsKTsKKwllcF9j dHhfd3JpdGVfbWF4X2VzaXRfcGF5bG9hZChlcC0+Y29udGV4dCwgZXNpdCk7CisKKwllcF9jdHhf d3JpdGVfY2VycmNudChlcC0+Y29udGV4dCwgMHgzKTsKK30KKworc3RhdGljIHZvaWQgc2V0dXBf bGlua190cmIoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwLAorCQkJICAgc3RydWN0IHRlZ3JhX3h1 ZGNfdHJiICp0cmIpCit7CisJdHJiX3dyaXRlX2RhdGFfcHRyKHRyYiwgZXAtPnRyYW5zZmVyX3Jp bmdfcGh5cyk7CisJdHJiX3dyaXRlX3R5cGUodHJiLCBUUkJfVFlQRV9MSU5LKTsKKwl0cmJfd3Jp dGVfdG9nZ2xlX2N5Y2xlKHRyYiwgMSk7Cit9CisKK3N0YXRpYyBpbnQgX190ZWdyYV94dWRjX2Vw X2Rpc2FibGUoc3RydWN0IHRlZ3JhX3h1ZGNfZXAgKmVwKQoreworCXN0cnVjdCB0ZWdyYV94dWRj ICp4dWRjID0gZXAtPnh1ZGM7CisKKwlpZiAoZXBfY3R4X3JlYWRfc3RhdGUoZXAtPmNvbnRleHQp ID09IEVQX1NUQVRFX0RJU0FCTEVEKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZW5kcG9pbnQg JXUgYWxyZWFkeSBkaXNhYmxlZFxuIiwKKwkJCWVwLT5pbmRleCk7CisJCXJldHVybiAtRUlOVkFM OworCX0KKwllcF9jdHhfd3JpdGVfc3RhdGUoZXAtPmNvbnRleHQsIEVQX1NUQVRFX0RJU0FCTEVE KTsKKworCWVwX3JlbG9hZCh4dWRjLCBlcC0+aW5kZXgpOworCisJdGVncmFfeHVkY19lcF9udWtl KGVwLCAtRVNIVVRET1dOKTsKKworCXh1ZGMtPm5yX2VuYWJsZWRfZXBzLS07CisJaWYgKHVzYl9l bmRwb2ludF94ZmVyX2lzb2MoZXAtPmRlc2MpKQorCQl4dWRjLT5ucl9pc29jaF9lcHMtLTsKKwor CWVwLT5kZXNjID0gTlVMTDsKKwllcC0+Y29tcF9kZXNjID0gTlVMTDsKKworCW1lbXNldChlcC0+ Y29udGV4dCwgMCwgc2l6ZW9mKCplcC0+Y29udGV4dCkpOworCisJZXBfdW5wYXVzZSh4dWRjLCBl cC0+aW5kZXgpOworCWVwX3VuaGFsdCh4dWRjLCBlcC0+aW5kZXgpOworCWlmICh4dWRjX3JlYWRs KHh1ZGMsIEVQX1NUT1BQRUQpICYgQklUKGVwLT5pbmRleCkpCisJCXh1ZGNfd3JpdGVsKHh1ZGMs IEJJVChlcC0+aW5kZXgpLCBFUF9TVE9QUEVEKTsKKworCS8qCisJICogSWYgdGhpcyBpcyB0aGUg bGFzdCBlbmRwb2ludCBkaXNhYmxlZCBpbiBhIGRlLWNvbmZpZ3VyZSByZXF1ZXN0LAorCSAqIHN3 aXRjaCBiYWNrIHRvIGFkZHJlc3Mgc3RhdGUuCisJICovCisJaWYgKCh4dWRjLT5kZXZpY2Vfc3Rh dGUgPT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpICYmCisJICAgICh4dWRjLT5ucl9lbmFibGVkX2Vw cyA9PSAxKSkgeworCQl1MzIgdmFsOworCisJCXh1ZGMtPmRldmljZV9zdGF0ZSA9IFVTQl9TVEFU RV9BRERSRVNTOworCQl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5k ZXZpY2Vfc3RhdGUpOworCisJCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ1RSTCk7CisJCXZhbCAm PSB+Q1RSTF9SVU47CisJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQ1RSTCk7CisJfQorCisJZGV2 X2luZm8oeHVkYy0+ZGV2LCAiZXAgJXUgZGlzYWJsZWRcbiIsIGVwLT5pbmRleCk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2VwX2Rpc2FibGUoc3RydWN0IHVzYl9l cCAqdXNiX2VwKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX2VwICplcDsKKwlzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQ7CisKKwlpZiAoIXVz Yl9lcCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcCA9IHRvX3h1ZGNfZXAodXNiX2VwKTsKKwl4 dWRjID0gZXAtPnh1ZGM7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3Mp OworCWlmICh4dWRjLT5wb3dlcmdhdGVkKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8g dW5sb2NrOworCX0KKwlyZXQgPSBfX3RlZ3JhX3h1ZGNfZXBfZGlzYWJsZShlcCk7Cit1bmxvY2s6 CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJu IHJldDsKK30KKworc3RhdGljIGludCBfX3RlZ3JhX3h1ZGNfZXBfZW5hYmxlKHN0cnVjdCB0ZWdy YV94dWRjX2VwICplcCwKKwkJCQkgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRv ciAqZGVzYykKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGVwLT54dWRjOworCXVuc2ln bmVkIGludCBpOworCXUzMiB2YWw7CisKKwlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9T UEVFRF9TVVBFUiAmJgorCQkhdXNiX2VuZHBvaW50X3hmZXJfY29udHJvbChkZXNjKSAmJiAhZXAt PnVzYl9lcC5jb21wX2Rlc2MpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRGlzYWJsZSB0aGUg RVAgaWYgaXQgaXMgbm90IGRpc2FibGVkICovCisJaWYgKGVwX2N0eF9yZWFkX3N0YXRlKGVwLT5j b250ZXh0KSAhPSBFUF9TVEFURV9ESVNBQkxFRCkKKwkJX190ZWdyYV94dWRjX2VwX2Rpc2FibGUo ZXApOworCisJZXAtPmRlc2MgPSBkZXNjOworCWVwLT5jb21wX2Rlc2MgPSBlcC0+dXNiX2VwLmNv bXBfZGVzYzsKKworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlc2MpKSB7CisJCWlmICh4 dWRjLT5ucl9pc29jaF9lcHMgPiBYVURDX01BWF9JU09DSF9FUFMpIHsKKwkJCWRldl9lcnIoeHVk Yy0+ZGV2LCAidG9vIG1hbnkgaXNvY2ggZW5kcG9pbnRzXG4iKTsKKwkJCXJldHVybiAtRUJVU1k7 CisJCX0KKwkJeHVkYy0+bnJfaXNvY2hfZXBzKys7CisJfQorCisJbWVtc2V0KGVwLT50cmFuc2Zl cl9yaW5nLCAwLCBYVURDX1RSQU5TRkVSX1JJTkdfU0laRSAqCisJICAgICAgIHNpemVvZigqZXAt PnRyYW5zZmVyX3JpbmcpKTsKKwlzZXR1cF9saW5rX3RyYihlcCwgJmVwLT50cmFuc2Zlcl9yaW5n W1hVRENfVFJBTlNGRVJfUklOR19TSVpFIC0gMV0pOworCisJZXAtPmVucV9wdHIgPSAwOworCWVw LT5kZXFfcHRyID0gMDsKKwllcC0+cGNzID0gdHJ1ZTsKKwllcC0+cmluZ19mdWxsID0gZmFsc2U7 CisJeHVkYy0+bnJfZW5hYmxlZF9lcHMrKzsKKworCXRlZ3JhX3h1ZGNfZXBfY29udGV4dF9zZXR1 cChlcCk7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gcmVsb2FkIGFuZCB1bi1oYWx0IEVQMC4gIFRo aXMgd2lsbCBiZSBkb25lIGF1dG9tYXRpY2FsbHkKKwkgKiBvbmNlIGEgdmFsaWQgU0VUVVAgcGFj a2V0IGlzIHJlY2VpdmVkLgorCSAqLworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9jb250cm9sKGRl c2MpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogVHJhbnNpdGlvbiB0byBjb25maWd1cmVkIHN0 YXRlIG9uY2UgdGhlIGZpcnN0IG5vbi1jb250cm9sCisJICogZW5kcG9pbnQgaXMgZW5hYmxlZC4K KwkgKi8KKwlpZiAoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9BRERSRVNTKSB7CisJ CXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ1RSTCk7CisJCXZhbCB8PSBDVFJMX1JVTjsKKwkJeHVk Y193cml0ZWwoeHVkYywgdmFsLCBDVFJMKTsKKworCQl4dWRjLT5kZXZpY2Vfc3RhdGUgPSBVU0Jf U1RBVEVfQ09ORklHVVJFRDsKKwkJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdhZGdldCwg eHVkYy0+ZGV2aWNlX3N0YXRlKTsKKwl9CisKKwlpZiAodXNiX2VuZHBvaW50X3hmZXJfaXNvYyhk ZXNjKSkgeworCQkvKgorCQkgKiBQYXVzZSBhbGwgYnVsayBlbmRwb2ludHMgd2hlbiBlbmFibGlu ZyBhbiBpc29jaCBlbmRwb2ludAorCQkgKiB0byBlbnN1cmUgdGhlIGlzb2NoIGVuZHBvaW50IGlz IGFsbG9jYXRlZCBlbm91Z2ggYmFuZHdpZHRoLgorCQkgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFS UkFZX1NJWkUoeHVkYy0+ZXApOyBpKyspIHsKKwkJCWlmICh4dWRjLT5lcFtpXS5kZXNjICYmCisJ CQkgICAgdXNiX2VuZHBvaW50X3hmZXJfYnVsayh4dWRjLT5lcFtpXS5kZXNjKSkKKwkJCQllcF9w YXVzZSh4dWRjLCBpKTsKKwkJfQorCX0KKworCWVwX3JlbG9hZCh4dWRjLCBlcC0+aW5kZXgpOwor CWVwX3VucGF1c2UoeHVkYywgZXAtPmluZGV4KTsKKwllcF91bmhhbHQoeHVkYywgZXAtPmluZGV4 KTsKKworCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pc29jKGRlc2MpKSB7CisJCWZvciAoaSA9IDA7 IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsrKSB7CisJCQlpZiAoeHVkYy0+ZXBbaV0uZGVz YyAmJgorCQkJICAgIHVzYl9lbmRwb2ludF94ZmVyX2J1bGsoeHVkYy0+ZXBbaV0uZGVzYykpCisJ CQkJZXBfdW5wYXVzZSh4dWRjLCBpKTsKKwkJfQorCX0KKworb3V0OgorCWRldl9pbmZvKHh1ZGMt PmRldiwgIkVQICV1ICh0eXBlOiAlZCwgZGlyOiAlcykgZW5hYmxlZFxuIiwgZXAtPmluZGV4LAor CQkgdXNiX2VuZHBvaW50X3R5cGUoZXAtPmRlc2MpLAorCQkgdXNiX2VuZHBvaW50X2Rpcl9pbihl cC0+ZGVzYykgPyAiaW4iIDogIm91dCIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQg dGVncmFfeHVkY19lcF9lbmFibGUoc3RydWN0IHVzYl9lcCAqdXNiX2VwLAorCQkJCWNvbnN0IHN0 cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlzdHJ1Y3QgdGVncmFfeHVk Y19lcCAqZXA7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGM7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKwlpbnQgcmV0OworCisJaWYgICghdXNiX2VwIHx8ICFkZXNjIHx8IChkZXNjLT5iRGVzY3Jp cHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcCA9 IHRvX3h1ZGNfZXAodXNiX2VwKTsKKwl4dWRjID0gZXAtPnh1ZGM7CisKKwlzcGluX2xvY2tfaXJx c2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCWlmICh4dWRjLT5wb3dlcmdhdGVkKSB7CisJCXJl dCA9IC1FU0hVVERPV047CisJCWdvdG8gdW5sb2NrOworCX0KKwlyZXQgPSBfX3RlZ3JhX3h1ZGNf ZXBfZW5hYmxlKGVwLCBkZXNjKTsKK3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4 dWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHVz Yl9yZXF1ZXN0ICoKK3RlZ3JhX3h1ZGNfZXBfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1 c2JfZXAsIGdmcF90IGdmcCkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXE7CisK KwlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgZ2ZwKTsKKwlpZiAoIXJlcSkKKwkJcmV0dXJu IE5VTEw7CisKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5saXN0KTsKKworCXJldHVybiAmcmVxLT51 c2JfcmVxOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2VwX2ZyZWVfcmVxdWVzdChzdHJ1 Y3QgdXNiX2VwICp1c2JfZXAsCisJCQkJICAgICAgIHN0cnVjdCB1c2JfcmVxdWVzdCAqdXNiX3Jl cSkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkY19yZXF1ZXN0ICpyZXEgPSB0b194dWRjX3JlcSh1c2Jf cmVxKTsKKworCWtmcmVlKHJlcSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VwX29wcyB0ZWdy YV94dWRjX2VwX29wcyA9IHsKKwkuZW5hYmxlID0gdGVncmFfeHVkY19lcF9lbmFibGUsCisJLmRp c2FibGUgPSB0ZWdyYV94dWRjX2VwX2Rpc2FibGUsCisJLmFsbG9jX3JlcXVlc3QgPSB0ZWdyYV94 dWRjX2VwX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdCA9IHRlZ3JhX3h1ZGNfZXBfZnJl ZV9yZXF1ZXN0LAorCS5xdWV1ZSA9IHRlZ3JhX3h1ZGNfZXBfcXVldWUsCisJLmRlcXVldWUgPSB0 ZWdyYV94dWRjX2VwX2RlcXVldWUsCisJLnNldF9oYWx0ID0gdGVncmFfeHVkY19lcF9zZXRfaGFs dCwKK307CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfZW5hYmxlKHN0cnVjdCB1c2JfZXAg KnVzYl9lcCwKKwkJCQkgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNj KQoreworCXJldHVybiAtRUJVU1k7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19lcDBfZGlz YWJsZShzdHJ1Y3QgdXNiX2VwICp1c2JfZXApCit7CisJcmV0dXJuIC1FQlVTWTsKK30KKworc3Rh dGljIHN0cnVjdCB1c2JfZXBfb3BzIHRlZ3JhX3h1ZGNfZXAwX29wcyA9IHsKKwkuZW5hYmxlID0g dGVncmFfeHVkY19lcDBfZW5hYmxlLAorCS5kaXNhYmxlID0gdGVncmFfeHVkY19lcDBfZGlzYWJs ZSwKKwkuYWxsb2NfcmVxdWVzdCA9IHRlZ3JhX3h1ZGNfZXBfYWxsb2NfcmVxdWVzdCwKKwkuZnJl ZV9yZXF1ZXN0ID0gdGVncmFfeHVkY19lcF9mcmVlX3JlcXVlc3QsCisJLnF1ZXVlID0gdGVncmFf eHVkY19lcF9xdWV1ZSwKKwkuZGVxdWV1ZSA9IHRlZ3JhX3h1ZGNfZXBfZGVxdWV1ZSwKKwkuc2V0 X2hhbHQgPSB0ZWdyYV94dWRjX2VwX3NldF9oYWx0LAorfTsKKworc3RhdGljIGludCB0ZWdyYV94 dWRjX2dhZGdldF9nZXRfZnJhbWUoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1 Y3QgdGVncmFfeHVkYyAqeHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCWludCByZXQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3Mp OworCWlmICh4dWRjLT5wb3dlcmdhdGVkKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJCWdvdG8g dW5sb2NrOworCX0KKwlyZXQgPSAoeHVkY19yZWFkbCh4dWRjLCBNRklOREVYKSA+PiBNRklOREVY X0ZSQU1FX1NISUZUKSAmCisJCU1GSU5ERVhfRlJBTUVfTUFTSzsKK3VubG9jazoKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQor CitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3Jlc3VtZV9kZXZpY2Vfc3RhdGUoc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdTMyIHZhbDsKKworCWVwX3VucGF1 c2VfYWxsKHh1ZGMpOworCisJLyogRGlyZWN0IGxpbmsgdG8gVTAuICovCisJdmFsID0geHVkY19y ZWFkbCh4dWRjLCBQT1JUU0MpOworCWlmICgoKHZhbCA+PiBQT1JUU0NfUExTX1NISUZUKSAmIFBP UlRTQ19QTFNfTUFTSykgIT0gUE9SVFNDX1BMU19VMCkgeworCQl2YWwgJj0gfihQT1JUU0NfQ0hB TkdFX01BU0sgfAorCQkJIChQT1JUU0NfUExTX01BU0sgPDwgUE9SVFNDX1BMU19TSElGVCkpOwor CQl2YWwgfD0gUE9SVFNDX0xXUyB8IChQT1JUU0NfUExTX1UwIDw8IFBPUlRTQ19QTFNfU0hJRlQp OworCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRTQyk7CisJfQorCisJaWYgKHh1ZGMtPmRl dmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfU1VTUEVOREVEKSB7CisJCXh1ZGMtPmRldmljZV9zdGF0 ZSA9IHh1ZGMtPnJlc3VtZV9zdGF0ZTsKKwkJdXNiX2dhZGdldF9zZXRfc3RhdGUoJnh1ZGMtPmdh ZGdldCwgeHVkYy0+ZGV2aWNlX3N0YXRlKTsKKwkJeHVkYy0+cmVzdW1lX3N0YXRlID0gMDsKKwl9 CisKKwkvKgorCSAqIERvb3JiZWxscyBtYXkgYmUgZHJvcHBlZCBpZiB0aGV5IGFyZSBzZW50IHRv byBzb29uICg8IH4yMDBucykKKwkgKiBhZnRlciB1bnBhdXNpbmcgdGhlIGVuZHBvaW50LiAgV2Fp dCBmb3IgNTAwbnMganVzdCB0byBiZSBzYWZlLgorCSAqLworCW5kZWxheSg1MDApOworCWZvciAo aSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsrKQorCQl0ZWdyYV94dWRjX2VwX3Jp bmdfZG9vcmJlbGwoJnh1ZGMtPmVwW2ldKTsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2dh ZGdldF93YWtldXAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlu dCByZXQgPSAwOworCXUzMiB2YWw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywg ZmxhZ3MpOworCWlmICh4dWRjLT5wb3dlcmdhdGVkKSB7CisJCXJldCA9IC1FU0hVVERPV047CisJ CWdvdG8gdW5sb2NrOworCX0KKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJZGV2 X2RiZyh4dWRjLT5kZXYsICIlczogUE9SVFBNPSUjeCwgc3BlZWQ9JXhcbiIsIF9fZnVuY19fLAor CQkJdmFsLCBnYWRnZXQtPnNwZWVkKTsKKwlpZiAoKCh4dWRjLT5nYWRnZXQuc3BlZWQgPD0gVVNC X1NQRUVEX0hJR0gpICYmCisJICAgICAodmFsICYgUE9SVFBNX1JXRSkpIHx8CisJICAgICgoeHVk Yy0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikgJiYKKwkgICAgICh2YWwgJiBQT1JU UE1fRlJXRSkpKSB7CisJCXRlZ3JhX3h1ZGNfcmVzdW1lX2RldmljZV9zdGF0ZSh4dWRjKTsKKwor CQkvKiBTZW5kIERldmljZSBOb3RpZmljYXRpb24gcGFja2V0LiAqLworCQlpZiAoeHVkYy0+Z2Fk Z2V0LnNwZWVkID09IFVTQl9TUEVFRF9TVVBFUikgeworCQkJdmFsID0gKERFVk5PVElGX0xPX1RZ UEVfRlVOQ1RJT05fV0FLRSA8PAorCQkJICAgICAgIERFVk5PVElGX0xPX1RZUEVfU0hJRlQpIHwg REVWTk9USUZfTE9fVFJJRzsKKwkJCXh1ZGNfd3JpdGVsKHh1ZGMsIDAsIERFVk5PVElGX0hJKTsK KwkJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgREVWTk9USUZfTE8pOworCQl9CisJfQordW5sb2Nr OgorCWRldl9kYmcoeHVkYy0+ZGV2LCAiJXM6IHJldCB2YWx1ZSBpcyAlZCIsIF9fZnVuY19fLCBy ZXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXJl dHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19nYWRnZXRfcHVsbHVwKHN0cnVj dCB1c2JfZ2FkZ2V0ICpnYWRnZXQsIGludCBpc19vbikKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAq eHVkYyA9IHRvX3h1ZGMoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiB2YWw7 CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1ZGMtPmRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUo Jnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAoaXNfb24gIT0geHVkYy0+cHVsbHVwKSB7CisJCXZh bCA9IHh1ZGNfcmVhZGwoeHVkYywgQ1RSTCk7CisJCWlmIChpc19vbikKKwkJCXZhbCB8PSBDVFJM X0VOQUJMRTsKKwkJZWxzZQorCQkJdmFsICY9IH5DVFJMX0VOQUJMRTsKKwkJeHVkY193cml0ZWwo eHVkYywgdmFsLCBDVFJMKTsKKwl9CisJeHVkYy0+cHVsbHVwID0gaXNfb247CisJZGV2X2RiZyh4 dWRjLT5kZXYsICIlczogcHVsbHVwOiVkIiwgX19mdW5jX18sIGlzX29uKTsKKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJcG1fcnVudGltZV9wdXQoeHVkYy0+ ZGV2KTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZ2FkZ2V0X3N0 YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCisJCQkJICAgc3RydWN0IHVzYl9nYWRnZXRf ZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMgPSB0b194dWRjKGdh ZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOworCWludCByZXQ7CisKKwlp ZiAoIWRyaXZlcikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1 ZGMtPmRldik7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlpZiAo eHVkYy0+ZHJpdmVyKSB7CisJCXJldCA9IC1FQlVTWTsKKwkJZ290byB1bmxvY2s7CisJfQorCisJ eHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKKwl4dWRjLT5kZXZpY2Vfc3RhdGUg PSBVU0JfU1RBVEVfREVGQVVMVDsKKwl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0 LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOworCisJcmV0ID0gX190ZWdyYV94dWRjX2VwX2VuYWJsZSgm eHVkYy0+ZXBbMF0sICZ0ZWdyYV94dWRjX2VwMF9kZXNjKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290 byB1bmxvY2s7CisKKwl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOworCXZhbCB8PSBDVFJM X0lFIHwgQ1RSTF9MU0U7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBDVFJMKTsKKworCXZhbCA9 IHh1ZGNfcmVhZGwoeHVkYywgUE9SVEhBTFQpOworCXZhbCB8PSBQT1JUSEFMVF9TVENIR19JTlRS X0VOOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVEhBTFQpOworCisJaWYgKHh1ZGMtPnB1 bGx1cCkgeworCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIENUUkwpOworCQl2YWwgfD0gQ1RSTF9F TkFCTEU7CisJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQ1RSTCk7CisJfQorCisJeHVkYy0+ZHJp dmVyID0gZHJpdmVyOwordW5sb2NrOgorCWRldl9kYmcoeHVkYy0+ZGV2LCAiJXM6IHJldCB2YWx1 ZSBpcyAlZCIsIF9fZnVuY19fLCByZXQpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMt PmxvY2ssIGZsYWdzKTsKKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYpOworCXJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19nYWRnZXRfc3RvcChzdHJ1Y3QgdXNiX2dhZGdl dCAqZ2FkZ2V0KQoreworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gdG9feHVkYyhnYWRnZXQp OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIHZhbDsKKworCXBtX3J1bnRpbWVfZ2V0X3N5 bmMoeHVkYy0+ZGV2KTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOwor CXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ1RSTCk7CisJdmFsICY9IH4oQ1RSTF9JRSB8IENUUkxf RU5BQkxFKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENUUkwpOworCisJX190ZWdyYV94dWRj X2VwX2Rpc2FibGUoJnh1ZGMtPmVwWzBdKTsKKworCXh1ZGMtPmRyaXZlciA9IE5VTEw7CisJZGV2 X2RiZyh4dWRjLT5kZXYsICJHYWRnZXQgc3RvcHBlZCIpOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwlwbV9ydW50aW1lX3B1dCh4dWRjLT5kZXYpOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19zZXRfc2VsZnBvd2VyZWQoc3Ry dWN0IHVzYl9nYWRnZXQgKmdhZGdldCwgaW50IGlzX29uKQoreworCXN0cnVjdCB0ZWdyYV94dWRj ICp4dWRjID0gdG9feHVkYyhnYWRnZXQpOworCisJZGV2X2RiZyh4dWRjLT5kZXYsICIlczogJWRc biIsIF9fZnVuY19fLCBpc19vbik7CisJeHVkYy0+c2VsZnBvd2VyZWQgPSAhIWlzX29uOworCisJ cmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2dhZGdldF9vcHMgdGVncmFfeHVkY19n YWRnZXRfb3BzID0geworCS5nZXRfZnJhbWUgPSB0ZWdyYV94dWRjX2dhZGdldF9nZXRfZnJhbWUs CisJLndha2V1cCA9IHRlZ3JhX3h1ZGNfZ2FkZ2V0X3dha2V1cCwKKwkucHVsbHVwID0gdGVncmFf eHVkY19nYWRnZXRfcHVsbHVwLAorCS51ZGNfc3RhcnQgPSB0ZWdyYV94dWRjX2dhZGdldF9zdGFy dCwKKwkudWRjX3N0b3AgPSB0ZWdyYV94dWRjX2dhZGdldF9zdG9wLAorCS5zZXRfc2VsZnBvd2Vy ZWQgPSB0ZWdyYV94dWRjX3NldF9zZWxmcG93ZXJlZCwKK307CisKK3N0YXRpYyB2b2lkIG5vX29w X2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAgKmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sK K30KKworc3RhdGljIGludAordGVncmFfeHVkY19lcDBfcXVldWVfc3RhdHVzKHN0cnVjdCB0ZWdy YV94dWRjICp4dWRjLAorCQl2b2lkICgqY21wbCkoc3RydWN0IHVzYl9lcCAqLCBzdHJ1Y3QgdXNi X3JlcXVlc3QgKikpCit7CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5idWYgPSBOVUxMOworCXh1 ZGMtPmVwMF9yZXEtPnVzYl9yZXEuZG1hID0gMDsKKwl4dWRjLT5lcDBfcmVxLT51c2JfcmVxLmxl bmd0aCA9IDA7CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5jb21wbGV0ZSA9IGNtcGw7CisJeHVk Yy0+ZXAwX3JlcS0+dXNiX3JlcS5jb250ZXh0ID0geHVkYzsKKworCXJldHVybiBfX3RlZ3JhX3h1 ZGNfZXBfcXVldWUoJnh1ZGMtPmVwWzBdLCB4dWRjLT5lcDBfcmVxKTsKK30KKworc3RhdGljIGlu dAordGVncmFfeHVkY19lcDBfcXVldWVfZGF0YShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywgdm9p ZCAqYnVmLCBzaXplX3QgbGVuLAorCQl2b2lkICgqY21wbCkoc3RydWN0IHVzYl9lcCAqLCBzdHJ1 Y3QgdXNiX3JlcXVlc3QgKikpCit7CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5idWYgPSBidWY7 CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5sZW5ndGggPSBsZW47CisJeHVkYy0+ZXAwX3JlcS0+ dXNiX3JlcS5jb21wbGV0ZSA9IGNtcGw7CisJeHVkYy0+ZXAwX3JlcS0+dXNiX3JlcS5jb250ZXh0 ID0geHVkYzsKKworCXJldHVybiBfX3RlZ3JhX3h1ZGNfZXBfcXVldWUoJnh1ZGMtPmVwWzBdLCB4 dWRjLT5lcDBfcmVxKTsKK30KKworc3RhdGljIHZvaWQgdGVncmFfeHVkY19lcDBfcmVxX2RvbmUo c3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJc3dpdGNoICh4dWRjLT5zZXR1cF9zdGF0ZSkg eworCWNhc2UgREFUQV9TVEFHRV9YRkVSOgorCQl4dWRjLT5zZXR1cF9zdGF0ZSA9IFNUQVRVU19T VEFHRV9SRUNWOworCQl0ZWdyYV94dWRjX2VwMF9xdWV1ZV9zdGF0dXMoeHVkYywgbm9fb3BfY29t cGxldGUpOworCQlicmVhazsKKwljYXNlIERBVEFfU1RBR0VfUkVDVjoKKwkJeHVkYy0+c2V0dXBf c3RhdGUgPSBTVEFUVVNfU1RBR0VfWEZFUjsKKwkJdGVncmFfeHVkY19lcDBfcXVldWVfc3RhdHVz KHh1ZGMsIG5vX29wX2NvbXBsZXRlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJeHVkYy0+c2V0 dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50 IHRlZ3JhX3h1ZGNfZXAwX2RlbGVnYXRlX3JlcShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKKwkJ CQkgICAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKK3sKKwlpbnQgcmV0OworCisJ c3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOworCXJldCA9IHh1ZGMtPmRyaXZlci0+c2V0dXAoJnh1 ZGMtPmdhZGdldCwgY3RybCk7CisJc3Bpbl9sb2NrKCZ4dWRjLT5sb2NrKTsKKworCXJldHVybiBy ZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNldF9mZWF0dXJlX2NvbXBsZXRlKHN0cnVjdCB1c2JfZXAg KmVwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgdGVncmFfeHVkYyAqeHVk YyA9IHJlcS0+Y29udGV4dDsKKworCWlmICh4dWRjLT50ZXN0X21vZGVfcGF0dGVybikgeworCQl4 dWRjX3dyaXRlbCh4dWRjLCB4dWRjLT50ZXN0X21vZGVfcGF0dGVybiwgUE9SVF9UTSk7CisJCXh1 ZGMtPnRlc3RfbW9kZV9wYXR0ZXJuID0gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVk Y19lcDBfc2V0X2ZlYXR1cmUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCisJCQkJICAgICAgc3Ry dWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKK3sKKwlib29sIHNldCA9IChjdHJsLT5iUmVxdWVz dCA9PSBVU0JfUkVRX1NFVF9GRUFUVVJFKTsKKwl1MzIgZmVhdHVyZSA9IGxlMTZfdG9fY3B1KGN0 cmwtPndWYWx1ZSk7CisJdTMyIGluZGV4ID0gbGUxNl90b19jcHUoY3RybC0+d0luZGV4KTsKKwl1 MzIgdmFsLCBlcDsKKwlpbnQgcmV0OworCisJaWYgKGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgp ICE9IDApCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChjdHJsLT5iUmVxdWVzdFR5cGUg JiBVU0JfUkVDSVBfTUFTSykgeworCWNhc2UgVVNCX1JFQ0lQX0RFVklDRToKKwkJc3dpdGNoIChm ZWF0dXJlKSB7CisJCWNhc2UgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOgorCQkJaWYgKCh4dWRj LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKSB8fAorCQkJICAgICh4dWRjLT5kZXZp Y2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0RFRkFVTFQpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJ CQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJCQlpZiAoc2V0KQorCQkJCXZhbCB8 PSBQT1JUUE1fUldFOworCQkJZWxzZQorCQkJCXZhbCAmPSB+UE9SVFBNX1JXRTsKKwkJCXh1ZGNf d3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKKwkJCWJyZWFrOworCQljYXNlIFVTQl9ERVZJQ0Vf VTFfRU5BQkxFOgorCQljYXNlIFVTQl9ERVZJQ0VfVTJfRU5BQkxFOgorCQkJaWYgKCh4dWRjLT5k ZXZpY2Vfc3RhdGUgIT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpIHx8CisJCQkgICAgKHh1ZGMtPmdh ZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfU1VQRVIpKQorCQkJCXJldHVybiAtRUlOVkFMOworCisJ CQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJCQlpZiAoKGZlYXR1cmUgPT0gVVNC X0RFVklDRV9VMV9FTkFCTEUpICYmCisJCQkgICAgIHh1ZGMtPnNvYy0+dTFfZW5hYmxlKSB7CisJ CQkJaWYgKHNldCkKKwkJCQkJdmFsIHw9IFBPUlRQTV9VMUU7CisJCQkJZWxzZQorCQkJCQl2YWwg Jj0gflBPUlRQTV9VMUU7CisJCQl9CisJCQlpZiAoKGZlYXR1cmUgPT0gVVNCX0RFVklDRV9VMl9F TkFCTEUpICYmCisJCQkgICAgIHh1ZGMtPnNvYy0+dTJfZW5hYmxlKSB7CisJCQkJaWYgKHNldCkK KwkJCQkJdmFsIHw9IFBPUlRQTV9VMkU7CisJCQkJZWxzZQorCQkJCQl2YWwgJj0gflBPUlRQTV9V MkU7CisJCQl9CisJCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIFBPUlRQTSk7CisJCQlicmVhazsK KwkJY2FzZSBVU0JfREVWSUNFX1RFU1RfTU9ERToKKwkJCWlmICh4dWRjLT5nYWRnZXQuc3BlZWQg IT0gVVNCX1NQRUVEX0hJR0gpCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlpZiAoIXNldCkKKwkJ CQlyZXR1cm4gLUVJTlZBTDsKKworCQkJeHVkYy0+dGVzdF9tb2RlX3BhdHRlcm4gPSBpbmRleCA+ PiA4OworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJ CWJyZWFrOworCWNhc2UgVVNCX1JFQ0lQX0lOVEVSRkFDRToKKwkJaWYgKHh1ZGMtPmRldmljZV9z dGF0ZSAhPSBVU0JfU1RBVEVfQ09ORklHVVJFRCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXN3 aXRjaCAoZmVhdHVyZSkgeworCQljYXNlIFVTQl9JTlRSRl9GVU5DX1NVU1BFTkQ6CisJCQlpZiAo c2V0KSB7CisJCQkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOworCQkJCWlmIChpbmRl eCAmIFVTQl9JTlRSRl9GVU5DX1NVU1BFTkRfUlcpCisJCQkJCXZhbCB8PSBQT1JUUE1fRlJXRTsK KwkJCQllbHNlCisJCQkJCXZhbCAmPSB+UE9SVFBNX0ZSV0U7CisJCQkJeHVkY193cml0ZWwoeHVk YywgdmFsLCBQT1JUUE0pOworCQkJfQorCQkJcmV0dXJuIHRlZ3JhX3h1ZGNfZXAwX2RlbGVnYXRl X3JlcSh4dWRjLCBjdHJsKTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisK KwkJYnJlYWs7CisJY2FzZSBVU0JfUkVDSVBfRU5EUE9JTlQ6CisJCWVwID0gKGluZGV4ICYgVVNC X0VORFBPSU5UX05VTUJFUl9NQVNLKSAqIDIgKworCQkJKChpbmRleCAmIFVTQl9ESVJfSU4pID8g MSA6IDApOworCisJCWlmICgoeHVkYy0+ZGV2aWNlX3N0YXRlID09IFVTQl9TVEFURV9ERUZBVUxU KSB8fAorCQkgICAgKCh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0FERFJFU1MpICYm CisJCSAgICAgKGluZGV4ICE9IDApKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXJldCA9IF9f dGVncmFfeHVkY19lcF9zZXRfaGFsdCgmeHVkYy0+ZXBbZXBdLCBzZXQpOworCQlpZiAocmV0IDwg MCkKKwkJCXJldHVybiByZXQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFM OworCX0KKworCXJldHVybiB0ZWdyYV94dWRjX2VwMF9xdWV1ZV9zdGF0dXMoeHVkYywgc2V0X2Zl YXR1cmVfY29tcGxldGUpOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfZXAwX2dldF9zdGF0 dXMoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCisJCQkJICAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1 ZXN0ICpjdHJsKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX2VwX2NvbnRleHQgKmVwX2N0eDsKKwl1 MzIgdmFsLCBlcCwgaW5kZXggPSBsZTE2X3RvX2NwdShjdHJsLT53SW5kZXgpOworCXUxNiBzdGF0 dXMgPSAwOworCisJaWYgKCEoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikpCisJCXJl dHVybiAtRUlOVkFMOworCisJaWYgKChsZTE2X3RvX2NwdShjdHJsLT53VmFsdWUpICE9IDApIHx8 CisJICAgIChsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKSAhPSAyKSkKKwkJcmV0dXJuIC1FSU5W QUw7CisKKwlzd2l0Y2ggKGN0cmwtPmJSZXF1ZXN0VHlwZSAmIFVTQl9SRUNJUF9NQVNLKSB7CisJ Y2FzZSBVU0JfUkVDSVBfREVWSUNFOgorCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7 CisKKwkJaWYgKHh1ZGMtPnNlbGZwb3dlcmVkKQorCQkJc3RhdHVzIHw9IEJJVChVU0JfREVWSUNF X1NFTEZfUE9XRVJFRCk7CisKKwkJaWYgKCh4dWRjLT5nYWRnZXQuc3BlZWQgPCBVU0JfU1BFRURf U1VQRVIpICYmCisJCSAgICAodmFsICYgUE9SVFBNX1JXRSkpCisJCQlzdGF0dXMgfD0gQklUKFVT Ql9ERVZJQ0VfUkVNT1RFX1dBS0VVUCk7CisKKwkJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA9PSBV U0JfU1BFRURfU1VQRVIpIHsKKwkJCWlmICh2YWwgJiBQT1JUUE1fVTFFKQorCQkJCXN0YXR1cyB8 PSBCSVQoVVNCX0RFVl9TVEFUX1UxX0VOQUJMRUQpOworCQkJaWYgKHZhbCAmIFBPUlRQTV9VMkUp CisJCQkJc3RhdHVzIHw9IEJJVChVU0JfREVWX1NUQVRfVTJfRU5BQkxFRCk7CisJCX0KKwkJYnJl YWs7CisJY2FzZSBVU0JfUkVDSVBfSU5URVJGQUNFOgorCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVk ID09IFVTQl9TUEVFRF9TVVBFUikgeworCQkJc3RhdHVzIHw9IFVTQl9JTlRSRl9TVEFUX0ZVTkNf UldfQ0FQOworCQkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOworCQkJaWYgKHZhbCAm IFBPUlRQTV9GUldFKQorCQkJCXN0YXR1cyB8PSBVU0JfSU5UUkZfU1RBVF9GVU5DX1JXOworCQl9 CisJCWJyZWFrOworCWNhc2UgVVNCX1JFQ0lQX0VORFBPSU5UOgorCQllcCA9IChpbmRleCAmIFVT Ql9FTkRQT0lOVF9OVU1CRVJfTUFTSykgKiAyICsKKwkJCSgoaW5kZXggJiBVU0JfRElSX0lOKSA/ IDEgOiAwKTsKKwkJZXBfY3R4ID0gJnh1ZGMtPmVwX2NvbnRleHRbZXBdOworCisJCWlmICgoeHVk Yy0+ZGV2aWNlX3N0YXRlICE9IFVTQl9TVEFURV9DT05GSUdVUkVEKSAmJgorCQkgICAgKCh4dWRj LT5kZXZpY2Vfc3RhdGUgIT0gVVNCX1NUQVRFX0FERFJFU1MpIHx8IChlcCAhPSAwKSkpCisJCQly ZXR1cm4gLUVJTlZBTDsKKworCQlpZiAoZXBfY3R4X3JlYWRfc3RhdGUoZXBfY3R4KSA9PSBFUF9T VEFURV9ESVNBQkxFRCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCWlmICh4dWRjX3JlYWRsKHh1 ZGMsIEVQX0hBTFQpICYgQklUKGVwKSkKKwkJCXN0YXR1cyB8PSBCSVQoVVNCX0VORFBPSU5UX0hB TFQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwl4dWRj LT5zdGF0dXNfYnVmID0gY3B1X3RvX2xlMTYoc3RhdHVzKTsKKwlyZXR1cm4gdGVncmFfeHVkY19l cDBfcXVldWVfZGF0YSh4dWRjLCAmeHVkYy0+c3RhdHVzX2J1ZiwKKwkJCQkJIHNpemVvZih4dWRj LT5zdGF0dXNfYnVmKSwKKwkJCQkJIG5vX29wX2NvbXBsZXRlKTsKK30KKworc3RhdGljIHZvaWQg c2V0X3NlbF9jb21wbGV0ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpy ZXEpCit7CisJLyogTm90aGluZyB0byBkbyB3aXRoIFNFTCB2YWx1ZXMgKi8KK30KKworc3RhdGlj IGludCB0ZWdyYV94dWRjX2VwMF9zZXRfc2VsKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAorCQkJ CSAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3RybCkKK3sKKwlpZiAoY3RybC0+YlJlcXVlc3RU eXBlICE9IChVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UgfAorCQkJCSAgICAgVVNCX1RZ UEVfU1RBTkRBUkQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh4dWRjLT5kZXZpY2Vfc3Rh dGUgPT0gVVNCX1NUQVRFX0RFRkFVTFQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKChsZTE2 X3RvX2NwdShjdHJsLT53SW5kZXgpICE9IDApIHx8CisJICAgIChsZTE2X3RvX2NwdShjdHJsLT53 VmFsdWUpICE9IDApIHx8CisJICAgIChsZTE2X3RvX2NwdShjdHJsLT53TGVuZ3RoKSAhPSA2KSkK KwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXR1cm4gdGVncmFfeHVkY19lcDBfcXVldWVfZGF0YSh4 dWRjLCAmeHVkYy0+c2VsX3RpbWluZywKKwkJCQkJIHNpemVvZih4dWRjLT5zZWxfdGltaW5nKSwK KwkJCQkJIHNldF9zZWxfY29tcGxldGUpOworfQorCitzdGF0aWMgdm9pZCBzZXRfaXNvY2hfZGVs YXlfY29tcGxldGUoc3RydWN0IHVzYl9lcCAqZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxKQor eworCS8qIE5vdGhpbmcgdG8gZG8gd2l0aCBpc29jaCBkZWxheSAqLworfQorCitzdGF0aWMgaW50 IHRlZ3JhX3h1ZGNfZXAwX3NldF9pc29jaF9kZWxheShzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywK KwkJCQkJICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjdHJsKQoreworCXUzMiBkZWxheSA9IGxl MTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisKKwlpZiAoY3RybC0+YlJlcXVlc3RUeXBlICE9IChV U0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UgfAorCQkJCSAgIFVTQl9UWVBFX1NUQU5EQVJE KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoKGRlbGF5ID4gNjU1MzUpIHx8IChsZTE2X3Rv X2NwdShjdHJsLT53SW5kZXgpICE9IDApIHx8CisJICAgIChsZTE2X3RvX2NwdShjdHJsLT53TGVu Z3RoKSAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl4dWRjLT5pc29jaF9kZWxheSA9IGRl bGF5OworCisJcmV0dXJuIHRlZ3JhX3h1ZGNfZXAwX3F1ZXVlX3N0YXR1cyh4dWRjLCBzZXRfaXNv Y2hfZGVsYXlfY29tcGxldGUpOworfQorCitzdGF0aWMgdm9pZCBzZXRfYWRkcmVzc19jb21wbGV0 ZShzdHJ1Y3QgdXNiX2VwICplcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0 IHRlZ3JhX3h1ZGMgKnh1ZGMgPSByZXEtPmNvbnRleHQ7CisKKwlpZiAoKHh1ZGMtPmRldmljZV9z dGF0ZSA9PSBVU0JfU1RBVEVfREVGQVVMVCkgJiYKKwkgICAgKHh1ZGMtPmRldl9hZGRyICE9IDAp KSB7CisJCXh1ZGMtPmRldmljZV9zdGF0ZSA9IFVTQl9TVEFURV9BRERSRVNTOworCQl1c2JfZ2Fk Z2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOworCX0gZWxz ZSBpZiAoKHh1ZGMtPmRldmljZV9zdGF0ZSA9PSBVU0JfU1RBVEVfQUREUkVTUykgJiYKKwkJICAg KHh1ZGMtPmRldl9hZGRyID09IDApKSB7CisJCXh1ZGMtPmRldmljZV9zdGF0ZSA9IFVTQl9TVEFU RV9ERUZBVUxUOworCQl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5k ZXZpY2Vfc3RhdGUpOworCX0KK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2VwMF9zZXRfYWRk cmVzcyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKKwkJCQkgICAgICBzdHJ1Y3QgdXNiX2N0cmxy ZXF1ZXN0ICpjdHJsKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX2VwICplcDAgPSAmeHVkYy0+ZXBb MF07CisJdTMyIHZhbCwgYWRkciA9IGxlMTZfdG9fY3B1KGN0cmwtPndWYWx1ZSk7CisKKwlpZiAo Y3RybC0+YlJlcXVlc3RUeXBlICE9IChVU0JfRElSX09VVCB8IFVTQl9SRUNJUF9ERVZJQ0UgfAor CQkJCSAgICAgVVNCX1RZUEVfU1RBTkRBUkQpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICgo YWRkciA+IDEyNykgfHwgKGxlMTZfdG9fY3B1KGN0cmwtPndJbmRleCkgIT0gMCkgfHwKKwkgICAg KGxlMTZfdG9fY3B1KGN0cmwtPndMZW5ndGgpICE9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKwor CWlmICh4dWRjLT5kZXZpY2Vfc3RhdGUgPT0gVVNCX1NUQVRFX0NPTkZJR1VSRUQpCisJCXJldHVy biAtRUlOVkFMOworCisJZGV2X2RiZyh4dWRjLT5kZXYsICJzZXQgYWRkcmVzczogJXVcbiIsIGFk ZHIpOworCisJeHVkYy0+ZGV2X2FkZHIgPSBhZGRyOworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywg Q1RSTCk7CisJdmFsICY9IH4oQ1RSTF9ERVZBRERSX01BU0sgPDwgQ1RSTF9ERVZBRERSX1NISUZU KTsKKwl2YWwgfD0gYWRkciA8PCBDVFJMX0RFVkFERFJfU0hJRlQ7CisJeHVkY193cml0ZWwoeHVk YywgdmFsLCBDVFJMKTsKKworCWVwX2N0eF93cml0ZV9kZXZhZGRyKGVwMC0+Y29udGV4dCwgYWRk cik7CisKKwlyZXR1cm4gdGVncmFfeHVkY19lcDBfcXVldWVfc3RhdHVzKHh1ZGMsIHNldF9hZGRy ZXNzX2NvbXBsZXRlKTsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX2VwMF9zdGFuZGFyZF9y ZXEoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsCisJCQkJICAgICAgc3RydWN0IHVzYl9jdHJscmVx dWVzdCAqY3RybCkKK3sKKwlpbnQgcmV0OworCisJc3dpdGNoIChjdHJsLT5iUmVxdWVzdCkgewor CWNhc2UgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVTQl9SRVFf R0VUX1NUQVRVU1xuIik7CisJCXJldCA9IHRlZ3JhX3h1ZGNfZXAwX2dldF9zdGF0dXMoeHVkYywg Y3RybCk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9TRVRfQUREUkVTUzoKKwkJZGV2X2RiZyh4 dWRjLT5kZXYsICJVU0JfUkVRX1NFVF9BRERSRVNTXG4iKTsKKwkJcmV0ID0gdGVncmFfeHVkY19l cDBfc2V0X2FkZHJlc3MoeHVkYywgY3RybCk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9TRVRf U0VMOgorCQlkZXZfZGJnKHh1ZGMtPmRldiwgIlVTQl9SRVFfU0VUX1NFTFxuIik7CisJCXJldCA9 IHRlZ3JhX3h1ZGNfZXAwX3NldF9zZWwoeHVkYywgY3RybCk7CisJCWJyZWFrOworCWNhc2UgVVNC X1JFUV9TRVRfSVNPQ0hfREVMQVk6CisJCWRldl9kYmcoeHVkYy0+ZGV2LCAiVVNCX1JFUV9TRVRf SVNPQ0hfREVMQVlcbiIpOworCQlyZXQgPSB0ZWdyYV94dWRjX2VwMF9zZXRfaXNvY2hfZGVsYXko eHVkYywgY3RybCk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCWNh c2UgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJVU0JfUkVRX0NM RUFSL1NFVF9GRUFUVVJFXG4iKTsKKwkJcmV0ID0gdGVncmFfeHVkY19lcDBfc2V0X2ZlYXR1cmUo eHVkYywgY3RybCk7CisJCWJyZWFrOworCWNhc2UgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjoK KwkJZGV2X2RiZyh4dWRjLT5kZXYsICJVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OXG4iKTsKKwkJ LyoKKwkJICogSW4gdGhlb3J5IHdlIG5lZWQgdG8gY2xlYXIgUlVOIGJpdCBiZWZvcmUgc3RhdHVz IHN0YWdlIG9mCisJCSAqIGRlY29uZmlnIHJlcXVlc3Qgc2VudCwgYnV0IHRoaXMgc2VlbXMgdG8g YmUgY2F1c2luZyBwcm9ibGVtcy4KKwkJICogQ2xlYXIgUlVOIG9uY2UgYWxsIGVuZHBvaW50cyBh cmUgZGlzYWJsZWQgaW5zdGVhZC4KKwkJICovCisJZGVmYXVsdDoKKwkJcmV0ID0gdGVncmFfeHVk Y19lcDBfZGVsZWdhdGVfcmVxKHh1ZGMsIGN0cmwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4g cmV0OworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2hhbmRsZV9lcDBfc2V0dXBfcGFja2V0 KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLAorCQkJCQkgICAgICAgc3RydWN0IHVzYl9jdHJscmVx dWVzdCAqY3RybCwKKwkJCQkJICAgICAgIHUxNiBzZXFfbnVtKQoreworCWludCByZXQ7CisKKwl4 dWRjLT5zZXR1cF9zZXFfbnVtID0gc2VxX251bTsKKworCS8qIEVuc3VyZSBFUDAgaXMgdW5oYWx0 ZWQuICovCisJZXBfdW5oYWx0KHh1ZGMsIDApOworCisJLyoKKwkgKiBPbiBUZWdyYTIxMCwgc2V0 dXAgcGFja2V0cyB3aXRoIHNlcXVlbmNlIG51bWJlcnMgMHhmZmZlIG9yIDB4ZmZmZgorCSAqIGFy ZSBpbnZhbGlkLiAgSGFsdCBFUDAgdW50aWwgd2UgZ2V0IGEgdmFsaWQgcGFja2V0LgorCSAqLwor CWlmICh4dWRjLT5zb2MtPmludmFsaWRfc2VxX251bSAmJgorCSAgICAoc2VxX251bSA9PSAweGZm ZmUgfHwgc2VxX251bSA9PSAweGZmZmYpKSB7CisJCWRldl93YXJuKHh1ZGMtPmRldiwgImludmFs aWQgc2VxdWVuY2UgbnVtYmVyIGRldGVjdGVkXG4iKTsKKwkJZXBfaGFsdCh4dWRjLCAwKTsKKwkJ cmV0dXJuOworCX0KKworCWlmIChjdHJsLT53TGVuZ3RoKQorCQl4dWRjLT5zZXR1cF9zdGF0ZSA9 IChjdHJsLT5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA/CisJCQlEQVRBX1NUQUdFX1hGRVIg OiAgREFUQV9TVEFHRV9SRUNWOworCWVsc2UKKwkJeHVkYy0+c2V0dXBfc3RhdGUgPSBTVEFUVVNf U1RBR0VfWEZFUjsKKworCWlmICgoY3RybC0+YlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykg PT0gVVNCX1RZUEVfU1RBTkRBUkQpCisJCXJldCA9IHRlZ3JhX3h1ZGNfZXAwX3N0YW5kYXJkX3Jl cSh4dWRjLCBjdHJsKTsKKwllbHNlCisJCXJldCA9IHRlZ3JhX3h1ZGNfZXAwX2RlbGVnYXRlX3Jl cSh4dWRjLCBjdHJsKTsKKworCWlmIChyZXQgPCAwKSB7CisJCWRldl93YXJuKHh1ZGMtPmRldiwg InNldHVwIHJlcXVlc3QgZmFpbGVkOiAlZFxuIiwgcmV0KTsKKwkJeHVkYy0+c2V0dXBfc3RhdGUg PSBXQUlUX0ZPUl9TRVRVUDsKKwkJZXBfaGFsdCh4dWRjLCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2 b2lkIHRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9ldmVudChzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywK KwkJCQkJc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICpldmVudCkKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxy ZXF1ZXN0ICpjdHJsID0gKHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKilldmVudDsKKwl1MTYgc2Vx X251bSA9IHRyYl9yZWFkX3NlcV9udW0oZXZlbnQpOworCisJaWYgKHh1ZGMtPnNldHVwX3N0YXRl ICE9IFdBSVRfRk9SX1NFVFVQKSB7CisJCS8qCisJCSAqIFRoZSBjb250cm9sbGVyIGlzIGluIHRo ZSBwcm9jZXNzIG9mIGhhbmRsaW5nIGFub3RoZXIKKwkJICogc2V0dXAgcmVxdWVzdC4gIFF1ZXVl IHN1YnNlcXVlbnQgcmVxdWVzdHMgYW5kIGhhbmRsZQorCQkgKiB0aGUgbGFzdCBvbmUgb25jZSB0 aGUgY29udHJvbGxlciByZXBvcnRzIGEgc2VxdWVuY2UKKwkJICogbnVtYmVyIGVycm9yLgorCQkg Ki8KKwkJbWVtY3B5KCZ4dWRjLT5zZXR1cF9wYWNrZXQuY3RybF9yZXEsIGN0cmwsIHNpemVvZigq Y3RybCkpOworCQl4dWRjLT5zZXR1cF9wYWNrZXQuc2VxX251bSA9IHNlcV9udW07CisJCXh1ZGMt PnF1ZXVlZF9zZXR1cF9wYWNrZXQgPSB0cnVlOworCX0gZWxzZSB7CisJCXRlZ3JhX3h1ZGNfaGFu ZGxlX2VwMF9zZXR1cF9wYWNrZXQoeHVkYywgY3RybCwgc2VxX251bSk7CisJfQorfQorCitzdGF0 aWMgc3RydWN0IHRlZ3JhX3h1ZGNfcmVxdWVzdCAqCit0cmJfdG9fcmVxdWVzdChzdHJ1Y3QgdGVn cmFfeHVkY19lcCAqZXAsIHN0cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiKQoreworCXN0cnVjdCB0 ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocmVxLCAmZXAt PnF1ZXVlLCBsaXN0KSB7CisJCWlmICghcmVxLT50cmJzX3F1ZXVlZCkKKwkJCWJyZWFrOworCisJ CWlmICh0cmJfaW5fcmVxdWVzdChlcCwgcmVxLCB0cmIpKQorCQkJcmV0dXJuIHJlcTsKKwl9CisK KwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgdGVncmFfeHVkY19oYW5kbGVfdHJhbnNm ZXJfY29tcGxldGlvbihzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYywKKwkJCQkJCSAgc3RydWN0IHRl Z3JhX3h1ZGNfZXAgKmVwLAorCQkJCQkJICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKmV2ZW50KQor eworCXN0cnVjdCB0ZWdyYV94dWRjX3JlcXVlc3QgKnJlcTsKKwlzdHJ1Y3QgdGVncmFfeHVkY190 cmIgKnRyYjsKKwlib29sIHNob3J0X3BhY2tldDsKKworCXNob3J0X3BhY2tldCA9ICh0cmJfcmVh ZF9jbXBsX2NvZGUoZXZlbnQpID09CisJCQlUUkJfQ01QTF9DT0RFX1NIT1JUX1BBQ0tFVCk7CisK Kwl0cmIgPSB0cmJfcGh5c190b192aXJ0KGVwLCB0cmJfcmVhZF9kYXRhX3B0cihldmVudCkpOwor CXJlcSA9IHRyYl90b19yZXF1ZXN0KGVwLCB0cmIpOworCS8qCisJICogVERzIGFyZSBjb21wbGV0 ZSBvbiBzaG9ydCBwYWNrZXQgb3Igd2hlbiB0aGUgY29tcGxldGVkIFRSQiBpcyB0aGUKKwkgKiBs YXN0IFRSQiBpbiB0aGUgVEQgKHRoZSBDSEFJTiBiaXQgaXMgdW5zZXQpLgorCSAqLworCWlmIChy ZXEgJiYgKHNob3J0X3BhY2tldCB8fCAoIXRyYl9yZWFkX2NoYWluKHRyYikgJiYKKwkJKHJlcS0+ dHJic19uZWVkZWQgPT0gcmVxLT50cmJzX3F1ZXVlZCkpKSkgeworCQlzdHJ1Y3QgdGVncmFfeHVk Y190cmIgKmxhc3QgPSByZXEtPmxhc3RfdHJiOworCQl1bnNpZ25lZCBpbnQgcmVzaWR1YWw7CisK KwkJcmVzaWR1YWwgPSB0cmJfcmVhZF90cmFuc2Zlcl9sZW4oZXZlbnQpOworCQlyZXEtPnVzYl9y ZXEuYWN0dWFsID0gcmVxLT51c2JfcmVxLmxlbmd0aCAtIHJlc2lkdWFsOworCisJCWRldl9kYmco eHVkYy0+ZGV2LCAiYnl0ZXMgdHJhbnNmZXJyZWQgJXUgLyAldVxuIiwKKwkJCXJlcS0+dXNiX3Jl cS5hY3R1YWwsIHJlcS0+dXNiX3JlcS5sZW5ndGgpOworCisJCXRlZ3JhX3h1ZGNfcmVxX2RvbmUo ZXAsIHJlcSwgMCk7CisKKwkJaWYgKGVwLT5kZXNjICYmIHVzYl9lbmRwb2ludF94ZmVyX2NvbnRy b2woZXAtPmRlc2MpKQorCQkJdGVncmFfeHVkY19lcDBfcmVxX2RvbmUoeHVkYyk7CisKKwkJLyoK KwkJICogQWR2YW5jZSB0aGUgZGVxdWV1ZSBwb2ludGVyIHBhc3QgdGhlIGVuZCBvZiB0aGUgY3Vy cmVudCBURAorCQkgKiBvbiBzaG9ydCBwYWNrZXQgY29tcGxldGlvbi4KKwkJICovCisJCWlmIChz aG9ydF9wYWNrZXQpIHsKKwkJCWVwLT5kZXFfcHRyID0gKGxhc3QgLSBlcC0+dHJhbnNmZXJfcmlu ZykgKyAxOworCQkJaWYgKGVwLT5kZXFfcHRyID09IFhVRENfVFJBTlNGRVJfUklOR19TSVpFIC0g MSkKKwkJCQllcC0+ZGVxX3B0ciA9IDA7CisJCX0KKwl9IGVsc2UgaWYgKCFyZXEpIHsKKwkJZGV2 X3dhcm4oeHVkYy0+ZGV2LCAidHJhbnNmZXIgZXZlbnQgb24gZGVxdWV1ZWQgcmVxdWVzdFxuIik7 CisJfQorCisJaWYgKGVwLT5kZXNjKQorCQl0ZWdyYV94dWRjX2VwX2tpY2tfcXVldWUoZXApOwor fQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2hhbmRsZV90cmFuc2Zlcl9ldmVudChzdHJ1Y3Qg dGVncmFfeHVkYyAqeHVkYywKKwkJCQkJICAgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKmV2ZW50 KQoreworCXVuc2lnbmVkIGludCBlcF9pbmRleCA9IHRyYl9yZWFkX2VuZHBvaW50X2lkKGV2ZW50 KTsKKwlzdHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAgPSAmeHVkYy0+ZXBbZXBfaW5kZXhdOworCXN0 cnVjdCB0ZWdyYV94dWRjX3RyYiAqdHJiOworCXUxNiBjb21wX2NvZGU7CisKKwlpZiAoZXBfY3R4 X3JlYWRfc3RhdGUoZXAtPmNvbnRleHQpID09IEVQX1NUQVRFX0RJU0FCTEVEKSB7CisJCWRldl93 YXJuKHh1ZGMtPmRldiwgInRyYW5zZmVyIGV2ZW50IG9uIGRpc2FibGVkIEVQICV1XG4iLAorCQkJ IGVwX2luZGV4KTsKKwkJcmV0dXJuOworCX0KKworCS8qIFVwZGF0ZSB0cmFuc2ZlciByaW5nIGRl cXVldWUgcG9pbnRlci4gKi8KKwl0cmIgPSB0cmJfcGh5c190b192aXJ0KGVwLCB0cmJfcmVhZF9k YXRhX3B0cihldmVudCkpOworCWNvbXBfY29kZSA9IHRyYl9yZWFkX2NtcGxfY29kZShldmVudCk7 CisJaWYgKGNvbXBfY29kZSAhPSBUUkJfQ01QTF9DT0RFX0JBQkJMRV9ERVRFQ1RFRF9FUlIpIHsK KwkJZXAtPmRlcV9wdHIgPSAodHJiIC0gZXAtPnRyYW5zZmVyX3JpbmcpICsgMTsKKwkJaWYgKGVw LT5kZXFfcHRyID09IFhVRENfVFJBTlNGRVJfUklOR19TSVpFIC0gMSkKKwkJCWVwLT5kZXFfcHRy ID0gMDsKKwkJZXAtPnJpbmdfZnVsbCA9IGZhbHNlOworCX0KKworCXN3aXRjaCAoY29tcF9jb2Rl KSB7CisJY2FzZSBUUkJfQ01QTF9DT0RFX1NVQ0NFU1M6CisJY2FzZSBUUkJfQ01QTF9DT0RFX1NI T1JUX1BBQ0tFVDoKKwkJdGVncmFfeHVkY19oYW5kbGVfdHJhbnNmZXJfY29tcGxldGlvbih4dWRj LCBlcCwgZXZlbnQpOworCQlicmVhazsKKwljYXNlIFRSQl9DTVBMX0NPREVfSE9TVF9SRUpFQ1RF RDoKKwkJZGV2X2luZm8oeHVkYy0+ZGV2LCAic3RyZWFtIHJlamVjdGVkIG9uIEVQICV1XG4iLCBl cF9pbmRleCk7CisKKwkJZXAtPnN0cmVhbV9yZWplY3RlZCA9IHRydWU7CisJCWJyZWFrOworCWNh c2UgVFJCX0NNUExfQ09ERV9QUklNRV9QSVBFX1JFQ0VJVkVEOgorCQlkZXZfaW5mbyh4dWRjLT5k ZXYsICJwcmltZSBwaXBlIHJlY2VpdmVkIG9uIEVQICV1XG4iLCBlcF9pbmRleCk7CisKKwkJaWYg KGVwLT5zdHJlYW1fcmVqZWN0ZWQpIHsKKwkJCWVwLT5zdHJlYW1fcmVqZWN0ZWQgPSBmYWxzZTsK KwkJCS8qCisJCQkgKiBBbiBFUCBpcyBzdG9wcGVkIHdoZW4gYSBzdHJlYW0gaXMgcmVqZWN0ZWQu ICBXYWl0CisJCQkgKiBmb3IgdGhlIEVQIHRvIHJlcG9ydCB0aGF0IGl0IGlzIHN0b3BwZWQgYW5k IHRoZW4KKwkJCSAqIHVuLXN0b3AgaXQuCisJCQkgKi8KKwkJCWVwX3dhaXRfZm9yX3N0b3BwZWQo eHVkYywgZXBfaW5kZXgpOworCQl9CisJCXRlZ3JhX3h1ZGNfZXBfcmluZ19kb29yYmVsbChlcCk7 CisJCWJyZWFrOworCWNhc2UgVFJCX0NNUExfQ09ERV9CQUJCTEVfREVURUNURURfRVJSOgorCQkv KgorCQkgKiBXYWl0IGZvciB0aGUgRVAgdG8gYmUgc3RvcHBlZCBzbyB0aGUgY29udHJvbGxlciBz dG9wcworCQkgKiBwcm9jZXNzaW5nIGRvb3JiZWxscy4KKwkJICovCisJCWVwX3dhaXRfZm9yX3N0 b3BwZWQoeHVkYywgZXBfaW5kZXgpOworCQllcC0+ZW5xX3B0ciA9IGVwLT5kZXFfcHRyOworCQl0 ZWdyYV94dWRjX2VwX251a2UoZXAsIC1FSU8pOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2Ug VFJCX0NNUExfQ09ERV9TVFJFQU1fTlVNUF9FUlJPUjoKKwljYXNlIFRSQl9DTVBMX0NPREVfQ1RS TF9ESVJfRVJSOgorCWNhc2UgVFJCX0NNUExfQ09ERV9JTlZBTElEX1NUUkVBTV9UWVBFX0VSUjoK KwljYXNlIFRSQl9DTVBMX0NPREVfUklOR19VTkRFUlJVTjoKKwljYXNlIFRSQl9DTVBMX0NPREVf UklOR19PVkVSUlVOOgorCWNhc2UgVFJCX0NNUExfQ09ERV9JU09DSF9CVUZGRVJfT1ZFUlJVTjoK KwljYXNlIFRSQl9DTVBMX0NPREVfVVNCX1RSQU5TX0VSUjoKKwljYXNlIFRSQl9DTVBMX0NPREVf VFJCX0VSUjoKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJjb21wbGV0aW9uIGVycm9yICUjeCBvbiBF UCAldVxuIiwKKwkJCWNvbXBfY29kZSwgZXBfaW5kZXgpOworCisJCWVwX2hhbHQoeHVkYywgZXBf aW5kZXgpOworCQlicmVhazsKKwljYXNlIFRSQl9DTVBMX0NPREVfQ1RSTF9TRVFOVU1fRVJSOgor CQlkZXZfaW5mbyh4dWRjLT5kZXYsICJzZXF1ZW5jZSBudW1iZXIgZXJyb3JcbiIpOworCisJCS8q CisJCSAqIEtpbGwgYW55IHF1ZXVlZCBjb250cm9sIHJlcXVlc3QgYW5kIHNraXAgdG8gdGhlIGxh c3QKKwkJICogc2V0dXAgcGFja2V0IHdlIHJlY2VpdmVkLgorCQkgKi8KKwkJdGVncmFfeHVkY19l cF9udWtlKGVwLCAtRUlOVkFMKTsKKwkJeHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRV UDsKKwkJaWYgKCF4dWRjLT5xdWV1ZWRfc2V0dXBfcGFja2V0KQorCQkJYnJlYWs7CisKKwkJdGVn cmFfeHVkY19oYW5kbGVfZXAwX3NldHVwX3BhY2tldCh4dWRjLAorCQkJCQkJICAgJnh1ZGMtPnNl dHVwX3BhY2tldC5jdHJsX3JlcSwKKwkJCQkJCSAgIHh1ZGMtPnNldHVwX3BhY2tldC5zZXFfbnVt KTsKKwkJeHVkYy0+cXVldWVkX3NldHVwX3BhY2tldCA9IGZhbHNlOworCQlicmVhazsKKwljYXNl IFRSQl9DTVBMX0NPREVfU1RPUFBFRDoKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJzdG9wIGNvbXBs ZXRpb24gY29kZSBvbiBFUCAldVxuIiwKKwkJCWVwX2luZGV4KTsKKworCQkvKiBEaXNjb25uZWN0 ZWQuICovCisJCXRlZ3JhX3h1ZGNfZXBfbnVrZShlcCwgLUVDT05OUkVGVVNFRCk7CisJCWJyZWFr OworCWRlZmF1bHQ6CisJCWRldl9kYmcoeHVkYy0+ZGV2LCAiY29tcGxldGlvbiBldmVudCAlI3gg b24gRVAgJXVcbiIsCisJCQljb21wX2NvZGUsIGVwX2luZGV4KTsKKwkJYnJlYWs7CisJfQorfQor CitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3Jlc2V0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQor eworCXN0cnVjdCB0ZWdyYV94dWRjX2VwICplcDAgPSAmeHVkYy0+ZXBbMF07CisJZG1hX2FkZHJf dCBkZXFfcHRyOworCXVuc2lnbmVkIGludCBpOworCisJeHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlU X0ZPUl9TRVRVUDsKKwl4dWRjLT5kZXZpY2Vfc3RhdGUgPSBVU0JfU1RBVEVfREVGQVVMVDsKKwl1 c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3RhdGUpOwor CisJZXBfdW5wYXVzZV9hbGwoeHVkYyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4 dWRjLT5lcCk7IGkrKykKKwkJdGVncmFfeHVkY19lcF9udWtlKCZ4dWRjLT5lcFtpXSwgLUVTSFVU RE9XTik7CisKKwkvKgorCSAqIFJlc2V0IHNlcXVlbmNlIG51bWJlciBhbmQgZGVxdWV1ZSBwb2lu dGVyIHRvIGZsdXNoIHRoZSB0cmFuc2ZlcgorCSAqIHJpbmcuCisJICovCisJZXAwLT5kZXFfcHRy ID0gZXAwLT5lbnFfcHRyOworCWVwMC0+cmluZ19mdWxsID0gZmFsc2U7CisKKwl4dWRjLT5zZXR1 cF9zZXFfbnVtID0gMDsKKwl4dWRjLT5xdWV1ZWRfc2V0dXBfcGFja2V0ID0gZmFsc2U7CisKKwll cF9jdHhfd3JpdGVfc2VxX251bShlcDAtPmNvbnRleHQsIHh1ZGMtPnNldHVwX3NlcV9udW0pOwor CisJZGVxX3B0ciA9IHRyYl92aXJ0X3RvX3BoeXMoZXAwLCAmZXAwLT50cmFuc2Zlcl9yaW5nW2Vw MC0+ZGVxX3B0cl0pOworCWlmICghZG1hX21hcHBpbmdfZXJyb3IoeHVkYy0+ZGV2LCBkZXFfcHRy KSkgeworCQllcF9jdHhfd3JpdGVfZGVxX3B0cihlcDAtPmNvbnRleHQsIGRlcV9wdHIpOworCQll cF9jdHhfd3JpdGVfZGNzKGVwMC0+Y29udGV4dCwgZXAwLT5wY3MpOworCX0KKworCWVwX3VuaGFs dF9hbGwoeHVkYyk7CisJZXBfcmVsb2FkKHh1ZGMsIDApOworCWVwX3VucGF1c2UoeHVkYywgMCk7 Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcG9ydF9jb25uZWN0KHN0cnVjdCB0ZWdyYV94 dWRjICp4dWRjKQoreworCXN0cnVjdCB0ZWdyYV94dWRjX2VwICplcDAgPSAmeHVkYy0+ZXBbMF07 CisJdTE2IG1heHBhY2tldDsKKwl1MzIgdmFsOworCisJdmFsID0gKHh1ZGNfcmVhZGwoeHVkYywg UE9SVFNDKSA+PiBQT1JUU0NfUFNfU0hJRlQpICYgUE9SVFNDX1BTX01BU0s7CisJc3dpdGNoICh2 YWwpIHsKKwljYXNlIFBPUlRTQ19QU19MUzoKKwkJeHVkYy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQ RUVEX0xPVzsKKwkJYnJlYWs7CisJY2FzZSBQT1JUU0NfUFNfRlM6CisJCXh1ZGMtPmdhZGdldC5z cGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCQlicmVhazsKKwljYXNlIFBPUlRTQ19QU19IUzoKKwkJ eHVkYy0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX0hJR0g7CisJCWJyZWFrOworCWNhc2UgUE9S VFNDX1BTX1NTOgorCQl4dWRjLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfU1VQRVI7CisJCWJy ZWFrOworCWRlZmF1bHQ6CisJCXh1ZGMtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dO OworCQlicmVhazsKKwl9CisKKwl4dWRjLT5kZXZpY2Vfc3RhdGUgPSBVU0JfU1RBVEVfREVGQVVM VDsKKwl1c2JfZ2FkZ2V0X3NldF9zdGF0ZSgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kZXZpY2Vfc3Rh dGUpOworCisJeHVkYy0+c2V0dXBfc3RhdGUgPSBXQUlUX0ZPUl9TRVRVUDsKKworCWlmICh4dWRj LT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1NVUEVSKQorCQltYXhwYWNrZXQgPSA1MTI7CisJ ZWxzZQorCQltYXhwYWNrZXQgPSA2NDsKKwllcF9jdHhfd3JpdGVfbWF4X3BhY2tldF9zaXplKGVw MC0+Y29udGV4dCwgbWF4cGFja2V0KTsKKwl0ZWdyYV94dWRjX2VwMF9kZXNjLndNYXhQYWNrZXRT aXplID0gY3B1X3RvX2xlMTYobWF4cGFja2V0KTsKKwl1c2JfZXBfc2V0X21heHBhY2tldF9saW1p dCgmZXAwLT51c2JfZXAsIG1heHBhY2tldCk7CisKKwlpZiAoIXh1ZGMtPnNvYy0+dTFfZW5hYmxl KSB7CisJCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFBNKTsKKwkJdmFsICY9IH4oUE9SVFBN X1UxVElNRU9VVF9NQVNLIDw8IFBPUlRQTV9VMVRJTUVPVVRfU0hJRlQpOworCQl4dWRjX3dyaXRl bCh4dWRjLCB2YWwsIFBPUlRQTSk7CisJfQorCWlmICgheHVkYy0+c29jLT51Ml9lbmFibGUpIHsK KwkJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUUE0pOworCQl2YWwgJj0gfihQT1JUUE1fVTJU SU1FT1VUX01BU0sgPDwgUE9SVFBNX1UyVElNRU9VVF9TSElGVCk7CisJCXh1ZGNfd3JpdGVsKHh1 ZGMsIHZhbCwgUE9SVFBNKTsKKwl9CisJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA8PSBVU0JfU1BF RURfSElHSCkgeworCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJCXZhbCAmPSB+ KFBPUlRQTV9MMVNfTUFTSyA8PCBQT1JUUE1fTDFTX1NISUZUKTsKKwkJaWYgKHh1ZGMtPnNvYy0+ bHBtX2VuYWJsZSkKKwkJCXZhbCB8PSBQT1JUUE1fTDFTX0FDQ0VQVCA8PCBQT1JUUE1fTDFTX1NI SUZUOworCQllbHNlCisJCQl2YWwgfD0gUE9SVFBNX0wxU19OWUVUIDw8IFBPUlRQTV9MMVNfU0hJ RlQ7CisJCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFBNKTsKKwl9CisKKwl2YWwgPSB4dWRj X3JlYWRsKHh1ZGMsIFNUKTsKKwlpZiAodmFsICYgU1RfUkMpCisJCXh1ZGNfd3JpdGVsKHh1ZGMs IFNUX1JDLCBTVCk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcG9ydF9kaXNjb25uZWN0 KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXRlZ3JhX3h1ZGNfcmVzZXQoeHVkYyk7CisJ aWYgKHh1ZGMtPmRyaXZlciAmJiB4dWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QpIHsKKwkJc3Bpbl91 bmxvY2soJnh1ZGMtPmxvY2spOworCQl4dWRjLT5kcml2ZXItPmRpc2Nvbm5lY3QoJnh1ZGMtPmdh ZGdldCk7CisJCXNwaW5fbG9jaygmeHVkYy0+bG9jayk7CisJfQorCisJeHVkYy0+ZGV2aWNlX3N0 YXRlID0gVVNCX1NUQVRFX05PVEFUVEFDSEVEOworCXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRj LT5nYWRnZXQsIHh1ZGMtPmRldmljZV9zdGF0ZSk7CisKKwljb21wbGV0ZSgmeHVkYy0+ZGlzY29u bmVjdF9jb21wbGV0ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfcG9ydF9yZXNldChz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl0ZWdyYV94dWRjX3Jlc2V0KHh1ZGMpOworCWlm ICh4dWRjLT5kcml2ZXIpIHsKKwkJc3Bpbl91bmxvY2soJnh1ZGMtPmxvY2spOworCQl1c2JfZ2Fk Z2V0X3VkY19yZXNldCgmeHVkYy0+Z2FkZ2V0LCB4dWRjLT5kcml2ZXIpOworCQlzcGluX2xvY2so Jnh1ZGMtPmxvY2spOworCX0KKwl0ZWdyYV94dWRjX3BvcnRfY29ubmVjdCh4dWRjKTsKK30KKwor c3RhdGljIHZvaWQgdGVncmFfeHVkY19wb3J0X3N1c3BlbmQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMpCit7CisJZGV2X2RiZyh4dWRjLT5kZXYsICJwb3J0IHN1c3BlbmRcbiIpOworCXh1ZGMtPnJl c3VtZV9zdGF0ZSA9IHh1ZGMtPmRldmljZV9zdGF0ZTsKKwl4dWRjLT5kZXZpY2Vfc3RhdGUgPSBV U0JfU1RBVEVfU1VTUEVOREVEOworCXVzYl9nYWRnZXRfc2V0X3N0YXRlKCZ4dWRjLT5nYWRnZXQs IHh1ZGMtPmRldmljZV9zdGF0ZSk7CisJaWYgKHh1ZGMtPmRyaXZlci0+c3VzcGVuZCkgeworCQlz cGluX3VubG9jaygmeHVkYy0+bG9jayk7CisJCXh1ZGMtPmRyaXZlci0+c3VzcGVuZCgmeHVkYy0+ Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZ4dWRjLT5sb2NrKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lk IHRlZ3JhX3h1ZGNfcG9ydF9yZXN1bWUoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJZGV2 X2RiZyh4dWRjLT5kZXYsICJwb3J0IHJlc3VtZVxuIik7CisJdGVncmFfeHVkY19yZXN1bWVfZGV2 aWNlX3N0YXRlKHh1ZGMpOworCWlmICh4dWRjLT5kcml2ZXItPnJlc3VtZSkgeworCQlzcGluX3Vu bG9jaygmeHVkYy0+bG9jayk7CisJCXh1ZGMtPmRyaXZlci0+cmVzdW1lKCZ4dWRjLT5nYWRnZXQp OworCQlzcGluX2xvY2soJnh1ZGMtPmxvY2spOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lk IGNsZWFyX3BvcnRfY2hhbmdlKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjLCB1MzIgZmxhZykKK3sK Kwl1MzIgdmFsOworCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpOworCXZhbCAmPSB+ UE9SVFNDX0NIQU5HRV9NQVNLOworCXZhbCB8PSBmbGFnOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZh bCwgUE9SVFNDKTsKK30KKworc3RhdGljIHZvaWQgX190ZWdyYV94dWRjX2hhbmRsZV9wb3J0X3N0 YXR1cyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl1MzIgcG9ydHNjLCBwb3J0aGFsdDsK KworCXBvcnRoYWx0ID0geHVkY19yZWFkbCh4dWRjLCBQT1JUSEFMVCk7CisJaWYgKChwb3J0aGFs dCAmIFBPUlRIQUxUX1NUQ0hHX1JFUSkgJiYKKwkgICAgKHBvcnRoYWx0ICYgUE9SVEhBTFRfSEFM VF9MVFNTTSkpIHsKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJTVENIR19SRVEsIFBPUlRIQUxUID0g JSN4XG4iLCBwb3J0aGFsdCk7CisJCXBvcnRoYWx0ICY9IH5QT1JUSEFMVF9IQUxUX0xUU1NNOwor CQl4dWRjX3dyaXRlbCh4dWRjLCBwb3J0aGFsdCwgUE9SVEhBTFQpOworCX0KKworCXBvcnRzYyA9 IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKKwlpZiAoKHBvcnRzYyAmIFBPUlRTQ19QUkMpICYm IChwb3J0c2MgJiBQT1JUU0NfUFIpKSB7CisJCWRldl9kYmcoeHVkYy0+ZGV2LCAiUFJDLCBQUiwg UE9SVFNDID0gJSN4XG4iLCBwb3J0c2MpOworCQljbGVhcl9wb3J0X2NoYW5nZSh4dWRjLCBQT1JU U0NfUFJDIHwgUE9SVFNDX1BFRCk7CisjZGVmaW5lIFRPR0dMRV9WQlVTX1dBSVRfTVMgMTAwCisJ CWlmICh4dWRjLT5zb2MtPnBvcnRfcmVzZXRfcXVpcmspIHsKKwkJCXNjaGVkdWxlX2RlbGF5ZWRf d29yaygmeHVkYy0+cG9ydF9yZXNldF93YXJfd29yaywKKwkJCQltc2Vjc190b19qaWZmaWVzKFRP R0dMRV9WQlVTX1dBSVRfTVMpKTsKKwkJCXh1ZGMtPndhaXRfZm9yX3NlY19wcmMgPSAxOworCQl9 CisJfQorCisJaWYgKChwb3J0c2MgJiBQT1JUU0NfUFJDKSAmJiAhKHBvcnRzYyAmIFBPUlRTQ19Q UikpIHsKKwkJZGV2X2RiZyh4dWRjLT5kZXYsICJQUkMsIE5vdCBQUiwgUE9SVFNDID0gJSN4XG4i LCBwb3J0c2MpOworCQljbGVhcl9wb3J0X2NoYW5nZSh4dWRjLCBQT1JUU0NfUFJDIHwgUE9SVFND X1BFRCk7CisJCXRlZ3JhX3h1ZGNfcG9ydF9yZXNldCh4dWRjKTsKKwkJY2FuY2VsX2RlbGF5ZWRf d29yaygmeHVkYy0+cG9ydF9yZXNldF93YXJfd29yayk7CisJCXh1ZGMtPndhaXRfZm9yX3NlY19w cmMgPSAwOworCX0KKworCXBvcnRzYyA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKKwlpZiAo cG9ydHNjICYgUE9SVFNDX1dSQykgeworCQlkZXZfZGJnKHh1ZGMtPmRldiwgIldSQywgUE9SVFND ID0gJSN4XG4iLCBwb3J0c2MpOworCQljbGVhcl9wb3J0X2NoYW5nZSh4dWRjLCBQT1JUU0NfV1JD IHwgUE9SVFNDX1BFRCk7CisJCWlmICghKHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKSAmIFBPUlRT Q19XUFIpKQorCQkJdGVncmFfeHVkY19wb3J0X3Jlc2V0KHh1ZGMpOworCX0KKworCXBvcnRzYyA9 IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKKwlpZiAocG9ydHNjICYgUE9SVFNDX0NTQykgewor CQlkZXZfZGJnKHh1ZGMtPmRldiwgIkNTQywgUE9SVFNDID0gJSN4XG4iLCBwb3J0c2MpOworCQlj bGVhcl9wb3J0X2NoYW5nZSh4dWRjLCBQT1JUU0NfQ1NDKTsKKwkJaWYgKHBvcnRzYyAmIFBPUlRT Q19DQ1MpCisJCQl0ZWdyYV94dWRjX3BvcnRfY29ubmVjdCh4dWRjKTsKKwkJZWxzZQorCQkJdGVn cmFfeHVkY19wb3J0X2Rpc2Nvbm5lY3QoeHVkYyk7CisJCWlmICh4dWRjLT53YWl0X2NzYykgewor CQkJY2FuY2VsX2RlbGF5ZWRfd29yaygmeHVkYy0+cGxjX3Jlc2V0X3dvcmspOworCQkJeHVkYy0+ d2FpdF9jc2MgPSBmYWxzZTsKKwkJfQorCX0KKworCXBvcnRzYyA9IHh1ZGNfcmVhZGwoeHVkYywg UE9SVFNDKTsKKwlpZiAocG9ydHNjICYgUE9SVFNDX1BMQykgeworCQl1MzIgcGxzID0gKHBvcnRz YyA+PiBQT1JUU0NfUExTX1NISUZUKSAmIFBPUlRTQ19QTFNfTUFTSzsKKworCQlkZXZfZGJnKHh1 ZGMtPmRldiwgIlBMQywgUE9SVFNDID0gJSN4XG4iLCBwb3J0c2MpOworCQljbGVhcl9wb3J0X2No YW5nZSh4dWRjLCBQT1JUU0NfUExDKTsKKwkJc3dpdGNoIChwbHMpIHsKKwkJY2FzZSBQT1JUU0Nf UExTX1UzOgorCQkJdGVncmFfeHVkY19wb3J0X3N1c3BlbmQoeHVkYyk7CisJCQlicmVhazsKKwkJ Y2FzZSBQT1JUU0NfUExTX1UwOgorCQkJaWYgKHh1ZGMtPmdhZGdldC5zcGVlZCA8IFVTQl9TUEVF RF9TVVBFUikKKwkJCQl0ZWdyYV94dWRjX3BvcnRfcmVzdW1lKHh1ZGMpOworCQkJYnJlYWs7CisJ CWNhc2UgUE9SVFNDX1BMU19SRVNVTUU6CisJCQlpZiAoeHVkYy0+Z2FkZ2V0LnNwZWVkID09IFVT Ql9TUEVFRF9TVVBFUikKKwkJCQl0ZWdyYV94dWRjX3BvcnRfcmVzdW1lKHh1ZGMpOworCQkJYnJl YWs7CisJCWNhc2UgUE9SVFNDX1BMU19JTkFDVElWRToKKwkJCXNjaGVkdWxlX2RlbGF5ZWRfd29y aygmeHVkYy0+cGxjX3Jlc2V0X3dvcmssCisJCQkJCW1zZWNzX3RvX2ppZmZpZXMoVE9HR0xFX1ZC VVNfV0FJVF9NUykpOworCQkJeHVkYy0+d2FpdF9jc2MgPSB0cnVlOworCQkJYnJlYWs7CisJCWRl ZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChwb3J0c2MgJiBQT1JUU0NfQ0VDKSB7 CisJCWRldl93YXJuKHh1ZGMtPmRldiwgIkNFQywgUE9SVFNDID0gJSN4XG4iLCBwb3J0c2MpOwor CQljbGVhcl9wb3J0X2NoYW5nZSh4dWRjLCBQT1JUU0NfQ0VDKTsKKwl9CisKKwlkZXZfZGJnKHh1 ZGMtPmRldiwgIlBPUlRTQyA9ICUjeFxuIiwgeHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpKTsKK30K Kworc3RhdGljIHZvaWQgdGVncmFfeHVkY19oYW5kbGVfcG9ydF9zdGF0dXMoc3RydWN0IHRlZ3Jh X3h1ZGMgKnh1ZGMpCit7CisJd2hpbGUgKCh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRTQykgJiBQT1JU U0NfQ0hBTkdFX01BU0spIHx8CisJICAgICAgICh4dWRjX3JlYWRsKHh1ZGMsIFBPUlRIQUxUKSAm IFBPUlRIQUxUX1NUQ0hHX1JFUSkpCisJCV9fdGVncmFfeHVkY19oYW5kbGVfcG9ydF9zdGF0dXMo eHVkYyk7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaGFuZGxlX2V2ZW50KHN0cnVjdCB0 ZWdyYV94dWRjICp4dWRjLAorCQkJCSAgICBzdHJ1Y3QgdGVncmFfeHVkY190cmIgKmV2ZW50KQor eworCXUzMiB0eXBlID0gdHJiX3JlYWRfdHlwZShldmVudCk7CisKKwlkdW1wX3RyYih4dWRjLCAi RVZFTlQiLCBldmVudCk7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFRSQl9UWVBFX1BPUlRf U1RBVFVTX0NIQU5HRV9FVkVOVDoKKwkJdGVncmFfeHVkY19oYW5kbGVfcG9ydF9zdGF0dXMoeHVk Yyk7CisJCWJyZWFrOworCWNhc2UgVFJCX1RZUEVfVFJBTlNGRVJfRVZFTlQ6CisJCXRlZ3JhX3h1 ZGNfaGFuZGxlX3RyYW5zZmVyX2V2ZW50KHh1ZGMsIGV2ZW50KTsKKwkJYnJlYWs7CisJY2FzZSBU UkJfVFlQRV9TRVRVUF9QQUNLRVRfRVZFTlQ6CisJCXRlZ3JhX3h1ZGNfaGFuZGxlX2VwMF9ldmVu dCh4dWRjLCBldmVudCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9pbmZvKHh1ZGMtPmRl diwgIlVucmVjb2duaXplZCBUUkIgdHlwZSA9ICUjeFxuIiwgdHlwZSk7CisJCWJyZWFrOworCX0K K30KKworc3RhdGljIHZvaWQgdGVncmFfeHVkY19wcm9jZXNzX2V2ZW50X3Jpbmcoc3RydWN0IHRl Z3JhX3h1ZGMgKnh1ZGMpCit7CisJc3RydWN0IHRlZ3JhX3h1ZGNfdHJiICpldmVudDsKKwlkbWFf YWRkcl90IGVyZHA7CisKKwl3aGlsZSAodHJ1ZSkgeworCQlldmVudCA9IHh1ZGMtPmV2ZW50X3Jp bmdbeHVkYy0+ZXZlbnRfcmluZ19pbmRleF0gKworCQkJeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRy OworCisJCWlmICh0cmJfcmVhZF9jeWNsZShldmVudCkgIT0geHVkYy0+Y2NzKQorCQkJYnJlYWs7 CisKKwkJdGVncmFfeHVkY19oYW5kbGVfZXZlbnQoeHVkYywgZXZlbnQpOworCisJCXh1ZGMtPmV2 ZW50X3JpbmdfZGVxX3B0cisrOworCQlpZiAoeHVkYy0+ZXZlbnRfcmluZ19kZXFfcHRyID09IFhV RENfRVZFTlRfUklOR19TSVpFKSB7CisJCQl4dWRjLT5ldmVudF9yaW5nX2RlcV9wdHIgPSAwOwor CQkJeHVkYy0+ZXZlbnRfcmluZ19pbmRleCsrOworCQl9CisJCWlmICh4dWRjLT5ldmVudF9yaW5n X2luZGV4ID09IFhVRENfTlJfRVZFTlRfUklOR1MpIHsKKwkJCXh1ZGMtPmV2ZW50X3JpbmdfaW5k ZXggPSAwOworCQkJeHVkYy0+Y2NzID0gIXh1ZGMtPmNjczsKKwkJfQorCX0KKworCWVyZHAgPSB4 dWRjLT5ldmVudF9yaW5nX3BoeXNbeHVkYy0+ZXZlbnRfcmluZ19pbmRleF0gKworCQl4dWRjLT5l dmVudF9yaW5nX2RlcV9wdHIgKiBzaXplb2YoKmV2ZW50KTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB1 cHBlcl8zMl9iaXRzKGVyZHApLCBFUkRQSEkpOworCXh1ZGNfd3JpdGVsKHh1ZGMsIGxvd2VyXzMy X2JpdHMoZXJkcCkgfCBFUkRQTE9fRUhCLCBFUkRQTE8pOworfQorCitzdGF0aWMgaXJxcmV0dXJu X3QgdGVncmFfeHVkY19pcnEoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYyA9IGRhdGE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgdmFsOworCisJ dmFsID0geHVkY19yZWFkbCh4dWRjLCBTVCk7CisJaWYgKCEodmFsICYgU1RfSVApKQorCQlyZXR1 cm4gSVJRX05PTkU7CisJeHVkY193cml0ZWwoeHVkYywgU1RfSVAsIFNUKTsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZ4dWRjLT5sb2NrLCBmbGFncyk7CisJdGVncmFfeHVkY19wcm9jZXNzX2V2ZW50 X3JpbmcoeHVkYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywgZmxhZ3Mp OworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfYWxs b2NfZXAoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlz dHJ1Y3QgdGVncmFfeHVkY19lcCAqZXAgPSAmeHVkYy0+ZXBbaW5kZXhdOworCisJZXAtPnh1ZGMg PSB4dWRjOworCWVwLT5pbmRleCA9IGluZGV4OworCWVwLT5jb250ZXh0ID0gJnh1ZGMtPmVwX2Nv bnRleHRbaW5kZXhdOworCUlOSVRfTElTVF9IRUFEKCZlcC0+cXVldWUpOworCisJLyoKKwkgKiBF UDEgd291bGQgYmUgdGhlIGlucHV0IGVuZHBvaW50IGNvcnJlc3BvbmRpbmcgdG8gRVAwLCBidXQg c2luY2UKKwkgKiBFUDAgaXMgYmktZGlyZWN0aW9uYWwsIEVQMSBpcyB1bnVzZWQuCisJICovCisJ aWYgKGluZGV4ID09IDEpCisJCXJldHVybiAwOworCisJZXAtPnRyYW5zZmVyX3JpbmcgPSBkbWFf cG9vbF9hbGxvYyh4dWRjLT50cmFuc2Zlcl9yaW5nX3Bvb2wsCisJCQkJCSAgIEdGUF9LRVJORUws CisJCQkJCSAgICZlcC0+dHJhbnNmZXJfcmluZ19waHlzKTsKKwlpZiAoIWVwLT50cmFuc2Zlcl9y aW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmIChpbmRleCkgeworCQlzbnByaW50ZihlcC0+ bmFtZSwgc2l6ZW9mKGVwLT5uYW1lKSwgImVwJXUlcyIsIGluZGV4IC8gMiwKKwkJCSAoaW5kZXgg JSAyID09IDApID8gIm91dCIgOiAiaW4iKTsKKwkJZXAtPnVzYl9lcC5uYW1lID0gZXAtPm5hbWU7 CisJCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZlcC0+dXNiX2VwLCAxMDI0KTsKKwkJZXAt PnVzYl9lcC5tYXhfc3RyZWFtcyA9IDE2OworCQllcC0+dXNiX2VwLm9wcyA9ICZ0ZWdyYV94dWRj X2VwX29wczsKKwkJZXAtPnVzYl9lcC5jYXBzLnR5cGVfYnVsayA9IHRydWU7CisJCWVwLT51c2Jf ZXAuY2Fwcy50eXBlX2ludCA9IHRydWU7CisJCWlmIChpbmRleCAmIDEpCisJCQllcC0+dXNiX2Vw LmNhcHMuZGlyX2luID0gdHJ1ZTsKKwkJZWxzZQorCQkJZXAtPnVzYl9lcC5jYXBzLmRpcl9vdXQg PSB0cnVlOworCQlsaXN0X2FkZF90YWlsKCZlcC0+dXNiX2VwLmVwX2xpc3QsICZ4dWRjLT5nYWRn ZXQuZXBfbGlzdCk7CisJfSBlbHNlIHsKKwkJc3RyY3B5KGVwLT5uYW1lLCAiZXAwIik7CisJCWVw LT51c2JfZXAubmFtZSA9IGVwLT5uYW1lOworCQl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgm ZXAtPnVzYl9lcCwgNjQpOworCQllcC0+dXNiX2VwLm9wcyA9ICZ0ZWdyYV94dWRjX2VwMF9vcHM7 CisJCWVwLT51c2JfZXAuY2Fwcy50eXBlX2NvbnRyb2wgPSB0cnVlOworCQllcC0+dXNiX2VwLmNh cHMuZGlyX2luID0gdHJ1ZTsKKwkJZXAtPnVzYl9lcC5jYXBzLmRpcl9vdXQgPSB0cnVlOworCX0K KworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX2ZyZWVfZXAoc3RydWN0 IHRlZ3JhX3h1ZGMgKnh1ZGMsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgdGVncmFf eHVkY19lcCAqZXAgPSAmeHVkYy0+ZXBbaW5kZXhdOworCisJLyoKKwkgKiBFUDEgd291bGQgYmUg dGhlIGlucHV0IGVuZHBvaW50IGNvcnJlc3BvbmRpbmcgdG8gRVAwLCBidXQgc2luY2UKKwkgKiBF UDAgaXMgYmktZGlyZWN0aW9uYWwsIEVQMSBpcyB1bnVzZWQuCisJICovCisJaWYgKGluZGV4ID09 IDEpCisJCXJldHVybjsKKworCWRtYV9wb29sX2ZyZWUoeHVkYy0+dHJhbnNmZXJfcmluZ19wb29s LCBlcC0+dHJhbnNmZXJfcmluZywKKwkJICAgICAgZXAtPnRyYW5zZmVyX3JpbmdfcGh5cyk7Cit9 CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19hbGxvY19lcHMoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMpCit7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXE7CisJdW5zaWduZWQgaW50IGk7CisJaW50 IGVycjsKKworCXh1ZGMtPmVwX2NvbnRleHQgPQorCQlkbWFfemFsbG9jX2NvaGVyZW50KHh1ZGMt PmRldiwgWFVEQ19OUl9FUFMgKgorCQkJCSAgICBzaXplb2YoKnh1ZGMtPmVwX2NvbnRleHQpLAor CQkJCSAgICAmeHVkYy0+ZXBfY29udGV4dF9waHlzLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXh1ZGMt PmVwX2NvbnRleHQpCisJCXJldHVybiAtRU5PTUVNOworCisJeHVkYy0+dHJhbnNmZXJfcmluZ19w b29sID0KKwkJZG1hbV9wb29sX2NyZWF0ZShkZXZfbmFtZSh4dWRjLT5kZXYpLCB4dWRjLT5kZXYs CisJCQkJIFhVRENfVFJBTlNGRVJfUklOR19TSVpFICoKKwkJCQkgc2l6ZW9mKHN0cnVjdCB0ZWdy YV94dWRjX3RyYiksCisJCQkJIHNpemVvZihzdHJ1Y3QgdGVncmFfeHVkY190cmIpLCAwKTsKKwlp ZiAoIXh1ZGMtPnRyYW5zZmVyX3JpbmdfcG9vbCkgeworCQllcnIgPSAtRU5PTUVNOworCQlnb3Rv IGZyZWVfZXBfY29udGV4dDsKKwl9CisKKwlJTklUX0xJU1RfSEVBRCgmeHVkYy0+Z2FkZ2V0LmVw X2xpc3QpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmVwKTsgaSsrKSB7CisJ CWVyciA9IHRlZ3JhX3h1ZGNfYWxsb2NfZXAoeHVkYywgaSk7CisJCWlmIChlcnIgPCAwKQorCQkJ Z290byBmcmVlX2VwczsKKwl9CisKKwlyZXEgPSB0ZWdyYV94dWRjX2VwX2FsbG9jX3JlcXVlc3Qo Jnh1ZGMtPmVwWzBdLnVzYl9lcCwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXEpIHsKKwkJZXJyID0g LUVOT01FTTsKKwkJZ290byBmcmVlX2VwczsKKwl9CisJeHVkYy0+ZXAwX3JlcSA9IHRvX3h1ZGNf cmVxKHJlcSk7CisKKwlyZXR1cm4gMDsKKworZnJlZV9lcHM6CisJZm9yICg7IGkgPiAwOyBpLS0p CisJCXRlZ3JhX3h1ZGNfZnJlZV9lcCh4dWRjLCBpIC0gMSk7CitmcmVlX2VwX2NvbnRleHQ6CisJ ZG1hX2ZyZWVfY29oZXJlbnQoeHVkYy0+ZGV2LCBYVURDX05SX0VQUyAqIHNpemVvZigqeHVkYy0+ ZXBfY29udGV4dCksCisJCQkgIHh1ZGMtPmVwX2NvbnRleHQsIHh1ZGMtPmVwX2NvbnRleHRfcGh5 cyk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIHZvaWQgdGVncmFfeHVkY19pbml0X2Vwcyhz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl4dWRjX3dyaXRlbCh4dWRjLCBsb3dlcl8zMl9i aXRzKHh1ZGMtPmVwX2NvbnRleHRfcGh5cyksIEVDUExPKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB1 cHBlcl8zMl9iaXRzKHh1ZGMtPmVwX2NvbnRleHRfcGh5cyksIEVDUEhJKTsKK30KKworc3RhdGlj IHZvaWQgdGVncmFfeHVkY19mcmVlX2VwcyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl1 bnNpZ25lZCBpbnQgaTsKKworCXRlZ3JhX3h1ZGNfZXBfZnJlZV9yZXF1ZXN0KCZ4dWRjLT5lcFsw XS51c2JfZXAsCisJCQkJICAgJnh1ZGMtPmVwMF9yZXEtPnVzYl9yZXEpOworCisJZm9yIChpID0g MDsgaSA8IEFSUkFZX1NJWkUoeHVkYy0+ZXApOyBpKyspCisJCXRlZ3JhX3h1ZGNfZnJlZV9lcCh4 dWRjLCBpKTsKKworCWRtYV9mcmVlX2NvaGVyZW50KHh1ZGMtPmRldiwgWFVEQ19OUl9FUFMgKiBz aXplb2YoKnh1ZGMtPmVwX2NvbnRleHQpLAorCQkJICB4dWRjLT5lcF9jb250ZXh0LCB4dWRjLT5l cF9jb250ZXh0X3BoeXMpOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfYWxsb2NfZXZlbnRf cmluZyhzdHJ1Y3QgdGVncmFfeHVkYyAqeHVkYykKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZv ciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHh1ZGMtPmV2ZW50X3JpbmcpOyBpKyspIHsKKwkJeHVk Yy0+ZXZlbnRfcmluZ1tpXSA9CisJCQlkbWFfYWxsb2NfY29oZXJlbnQoeHVkYy0+ZGV2LCBYVURD X0VWRU5UX1JJTkdfU0laRSAqCisJCQkJCSAgIHNpemVvZigqeHVkYy0+ZXZlbnRfcmluZ1tpXSks CisJCQkJCSAgICZ4dWRjLT5ldmVudF9yaW5nX3BoeXNbaV0sCisJCQkJCSAgIEdGUF9LRVJORUwp OworCQlpZiAoIXh1ZGMtPmV2ZW50X3JpbmdbaV0pCisJCQlnb3RvIGZyZWVfZG1hOworCX0KKwor CXJldHVybiAwOworCitmcmVlX2RtYToKKwlmb3IgKDsgaSA+IDA7IGktLSkgeworCQlkbWFfZnJl ZV9jb2hlcmVudCh4dWRjLT5kZXYsIFhVRENfRVZFTlRfUklOR19TSVpFICoKKwkJCQkgIHNpemVv ZigqeHVkYy0+ZXZlbnRfcmluZ1tpIC0gMV0pLAorCQkJCSAgeHVkYy0+ZXZlbnRfcmluZ1tpIC0g MV0sCisJCQkJICB4dWRjLT5ldmVudF9yaW5nX3BoeXNbaSAtIDFdKTsKKwl9CisJcmV0dXJuIC1F Tk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfaW5pdF9ldmVudF9yaW5nKHN0cnVj dCB0ZWdyYV94dWRjICp4dWRjKQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiB2YWw7CisKKwl2 YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIFNQQVJBTSk7CisJdmFsICY9IH4oU1BBUkFNX0VSU1RNQVhf TUFTSyA8PCBTUEFSQU1fRVJTVE1BWF9TSElGVCk7CisJdmFsIHw9IFhVRENfTlJfRVZFTlRfUklO R1MgPDwgU1BBUkFNX0VSU1RNQVhfU0hJRlQ7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBTUEFS QU0pOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVkYy0+ZXZlbnRfcmluZyk7IGkr KykgeworCQltZW1zZXQoeHVkYy0+ZXZlbnRfcmluZ1tpXSwgMCwgWFVEQ19FVkVOVF9SSU5HX1NJ WkUgKgorCQkgICAgICAgc2l6ZW9mKCp4dWRjLT5ldmVudF9yaW5nW2ldKSk7CisKKwkJdmFsID0g eHVkY19yZWFkbCh4dWRjLCBFUlNUU1opOworCQl2YWwgJj0gfihFUlNUU1pfRVJTVFhTWl9NQVNL IDw8IEVSU1RTWl9FUlNUWFNaX1NISUZUKGkpKTsKKwkJdmFsIHw9IFhVRENfRVZFTlRfUklOR19T SVpFIDw8IEVSU1RTWl9FUlNUWFNaX1NISUZUKGkpOworCQl4dWRjX3dyaXRlbCh4dWRjLCB2YWws IEVSU1RTWik7CisKKwkJeHVkY193cml0ZWwoeHVkYywgbG93ZXJfMzJfYml0cyh4dWRjLT5ldmVu dF9yaW5nX3BoeXNbaV0pLAorCQkJICAgIEVSU1RYQkFMTyhpKSk7CisJCXh1ZGNfd3JpdGVsKHh1 ZGMsIHVwcGVyXzMyX2JpdHMoeHVkYy0+ZXZlbnRfcmluZ19waHlzW2ldKSwKKwkJCSAgICBFUlNU WEJBSEkoaSkpOworCX0KKworCXZhbCA9IGxvd2VyXzMyX2JpdHMoeHVkYy0+ZXZlbnRfcmluZ19w aHlzWzBdKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVSRFBMTyk7CisJdmFsIHw9IEVSRVBM T19FQ1M7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBFUkVQTE8pOworCisJdmFsID0gdXBwZXJf MzJfYml0cyh4dWRjLT5ldmVudF9yaW5nX3BoeXNbMF0pOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZh bCwgRVJEUEhJKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIEVSRVBISSk7CisKKwl4dWRjLT5j Y3MgPSB0cnVlOworCXh1ZGMtPmV2ZW50X3JpbmdfaW5kZXggPSAwOworCXh1ZGMtPmV2ZW50X3Jp bmdfZGVxX3B0ciA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZnJlZV9ldmVudF9y aW5nKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9y IChpID0gMDsgaSA8IEFSUkFZX1NJWkUoeHVkYy0+ZXZlbnRfcmluZyk7IGkrKykgeworCQlkbWFf ZnJlZV9jb2hlcmVudCh4dWRjLT5kZXYsIFhVRENfRVZFTlRfUklOR19TSVpFICoKKwkJCQkgIHNp emVvZigqeHVkYy0+ZXZlbnRfcmluZ1tpXSksCisJCQkJICB4dWRjLT5ldmVudF9yaW5nW2ldLAor CQkJCSAgeHVkYy0+ZXZlbnRfcmluZ19waHlzW2ldKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRl Z3JhX3h1ZGNfZnBjaV9pcGZzX2luaXQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1ZGMpCit7CisJdTMy IHZhbDsKKworCWlmICh4dWRjLT5zb2MtPmhhc19pcGZzKSB7CisJCXZhbCA9IGlwZnNfcmVhZGwo eHVkYywgWFVTQl9ERVZfQ09ORklHVVJBVElPTl8wKTsKKwkJdmFsIHw9IFhVU0JfREVWX0NPTkZJ R1VSQVRJT05fMF9FTl9GUENJOworCQlpcGZzX3dyaXRlbCh4dWRjLCB2YWwsIFhVU0JfREVWX0NP TkZJR1VSQVRJT05fMCk7CisJCXVkZWxheSgxMCk7CisJfQorCisJLyogRW5hYmxlIGJ1cyBtYXN0 ZXIgKi8KKwl2YWwgPSBYVVNCX0RFVl9DRkdfMV9JT19TUEFDRV9FTiB8IFhVU0JfREVWX0NGR18x X01FTU9SWV9TUEFDRV9FTiB8CisJCVhVU0JfREVWX0NGR18xX0JVU19NQVNURVJfRU47CisJZnBj aV93cml0ZWwoeHVkYywgdmFsLCBYVVNCX0RFVl9DRkdfMSk7CisKKwkvKiBQcm9ncmFtIEJBUjAg c3BhY2UgKi8KKwl2YWwgPSBmcGNpX3JlYWRsKHh1ZGMsIFhVU0JfREVWX0NGR180KTsKKwl2YWwg Jj0gfihYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfTUFTSyA8PAorCQkgWFVTQl9ERVZfQ0ZHXzRf QkFTRV9BRERSX1NISUZUKTsKKwl2YWwgfD0geHVkYy0+cGh5c19iYXNlICYgKFhVU0JfREVWX0NG R180X0JBU0VfQUREUl9NQVNLIDw8CisJCQkJICBYVVNCX0RFVl9DRkdfNF9CQVNFX0FERFJfU0hJ RlQpOworCWZwY2lfd3JpdGVsKHh1ZGMsIHZhbCwgWFVTQl9ERVZfQ0ZHXzQpOworCWZwY2lfd3Jp dGVsKHh1ZGMsIHVwcGVyXzMyX2JpdHMoeHVkYy0+cGh5c19iYXNlKSwgWFVTQl9ERVZfQ0ZHXzUp OworCXVzbGVlcF9yYW5nZSgxMDAsIDIwMCk7CisKKwlpZiAoeHVkYy0+c29jLT5oYXNfaXBmcykg eworCQkvKiBFbmFibGUgaW50ZXJydXB0IGFzc2VydGlvbiAqLworCQl2YWwgPSBpcGZzX3JlYWRs KHh1ZGMsIFhVU0JfREVWX0lOVFJfTUFTS18wKTsKKwkJdmFsIHw9IFhVU0JfREVWX0lOVFJfTUFT S18wX0lQX0lOVF9NQVNLOworCQlpcGZzX3dyaXRlbCh4dWRjLCB2YWwsIFhVU0JfREVWX0lOVFJf TUFTS18wKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRlZ3JhX3h1ZGNfZGV2aWNlX3BhcmFtc19p bml0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXUzMiB2YWwsIGltb2Q7CisKKwlpZiAo eHVkYy0+c29jLT5oYXNfaXBmcykgeworCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEJMQ0cpOwor CQl2YWwgfD0gQkxDR19BTEw7CisJCXZhbCAmPSB+KEJMQ0dfREZQQ0kgfCBCTENHX1VGUENJIHwg QkxDR19GRSB8CisJCQkJQkxDR19DT1JFUExMX1BXUkROKTsKKwkJdmFsIHw9IEJMQ0dfSU9QTExf MF9QV1JETjsKKwkJdmFsIHw9IEJMQ0dfSU9QTExfMV9QV1JETjsKKwkJdmFsIHw9IEJMQ0dfSU9Q TExfMl9QV1JETjsKKwkJeHVkY193cml0ZWwoeHVkYywgdmFsLCBCTENHKTsKKwl9CisKKwkvKiBT ZXQgYSByZWFzb25hYmxlIFUzIGV4aXQgdGltZXIgdmFsdWUuICovCisJdmFsID0geHVkY19yZWFk bCh4dWRjLCBTU1BYX0NPUkVfUEFEQ1RMNCk7CisJdmFsICY9IH4oU1NQWF9DT1JFX1BBRENUTDRf UlhEQVRfVkxEX1RJTUVPVVRfVTNfTUFTSyA8PAorCQkgU1NQWF9DT1JFX1BBRENUTDRfUlhEQVRf VkxEX1RJTUVPVVRfVTNfU0hJRlQpOworCXZhbCB8PSAweDVkYzAgPDwgU1NQWF9DT1JFX1BBRENU TDRfUlhEQVRfVkxEX1RJTUVPVVRfVTNfU0hJRlQ7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBT U1BYX0NPUkVfUEFEQ1RMNCk7CisKKwkvKiBEZWZhdWx0IHBpbmcgTEZQUyB0QnVyc3QgaXMgdG9v IGxhcmdlLiAqLworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1NQWF9DT1JFX0NOVDApOworCXZh bCAmPSB+KFNTUFhfQ09SRV9DTlQwX1BJTkdfVEJVUlNUX01BU0sgPDwKKwkJIFNTUFhfQ09SRV9D TlQwX1BJTkdfVEJVUlNUX1NISUZUKTsKKwl2YWwgfD0gMHhhIDw8IFNTUFhfQ09SRV9DTlQwX1BJ TkdfVEJVUlNUX1NISUZUOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgU1NQWF9DT1JFX0NOVDAp OworCisJLyogRGVmYXVsdCB0UG9ydENvbmZpZ3VyYXRpb24gdGltZW91dCBpcyB0b28gc21hbGwu ICovCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBTU1BYX0NPUkVfQ05UMzApOworCXZhbCAmPSB+ KFNTUFhfQ09SRV9DTlQzMF9MTVBJVFBfVElNRVJfTUFTSyA8PAorCQkgU1NQWF9DT1JFX0NOVDMw X0xNUElUUF9USU1FUl9TSElGVCk7CisJdmFsIHw9IDB4OTc4IDw8IFNTUFhfQ09SRV9DTlQzMF9M TVBJVFBfVElNRVJfU0hJRlQ7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBTU1BYX0NPUkVfQ05U MzApOworCisJaWYgKHh1ZGMtPnNvYy0+bHBtX2VuYWJsZSkgeworCQkvKiBTZXQgTDEgcmVzdW1l IGR1cmF0aW9uIHRvIDk1IHVzLiAqLworCQl2YWwgPSB4dWRjX3JlYWRsKHh1ZGMsIEhTRlNQSV9D T1VOVDEzKTsKKwkJdmFsICY9IH4oSFNGU1BJX0NPVU5UMTNfVTJfUkVTVU1FX0tfRFVSQVRJT05f TUFTSyA8PAorCQkJCUhTRlNQSV9DT1VOVDEzX1UyX1JFU1VNRV9LX0RVUkFUSU9OX1NISUZUKTsK KwkJdmFsIHw9IDB4MmM4OCA8PCBIU0ZTUElfQ09VTlQxM19VMl9SRVNVTUVfS19EVVJBVElPTl9T SElGVDsKKwkJeHVkY193cml0ZWwoeHVkYywgdmFsLCBIU0ZTUElfQ09VTlQxMyk7CisJfQorCisJ LyoKKwkgKiBDb21wbGlhY25lIHN1aXRlIGFwcGVhcnMgdG8gYmUgdmlvbGF0aW5nIHBvbGxpbmcg TEZQUyB0QnVyc3QgbWF4CisJICogb2YgMS40dXMuICBTZW5kIDEuNDV1cyBpbnN0ZWFkLgorCSAq LworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgU1NQWF9DT1JFX0NOVDMyKTsKKwl2YWwgJj0gfihT U1BYX0NPUkVfQ05UMzJfUE9MTF9UQlVSU1RfTUFYX01BU0sgPDwKKwkJIFNTUFhfQ09SRV9DTlQz Ml9QT0xMX1RCVVJTVF9NQVhfU0hJRlQpOworCXZhbCB8PSAweGIwIDw8IFNTUFhfQ09SRV9DTlQz Ml9QT0xMX1RCVVJTVF9NQVhfU0hJRlQ7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBTU1BYX0NP UkVfQ05UMzIpOworCisJLyogRGlyZWN0IEhTL0ZTIHBvcnQgaW5zdGFuY2UgdG8gUnhEZXRlY3Qu ICovCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDRkdfREVWX0ZFKTsKKwl2YWwgJj0gfihDRkdf REVWX0ZFX1BPUlRSRUdTRUxfTUFTSyA8PCBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfU0hJRlQpOwor CXZhbCB8PSBDRkdfREVWX0ZFX1BPUlRSRUdTRUxfSFNGU19QSSA8PCBDRkdfREVWX0ZFX1BPUlRS RUdTRUxfU0hJRlQ7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBDRkdfREVWX0ZFKTsKKworCXZh bCA9IHh1ZGNfcmVhZGwoeHVkYywgUE9SVFNDKTsKKwl2YWwgJj0gfihQT1JUU0NfQ0hBTkdFX01B U0sgfCAoUE9SVFNDX1BMU19NQVNLIDw8IFBPUlRTQ19QTFNfU0hJRlQpKTsKKwl2YWwgfD0gUE9S VFNDX0xXUyB8IChQT1JUU0NfUExTX1JYREVURUNUIDw8IFBPUlRTQ19QTFNfU0hJRlQpOworCXh1 ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUE9SVFNDKTsKKworCS8qIERpcmVjdCBTUyBwb3J0IGluc3Rh bmNlIHRvIFJ4RGV0ZWN0LiAqLworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ0ZHX0RFVl9GRSk7 CisJdmFsICY9IH4oQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX01BU0sgPDwgQ0ZHX0RFVl9GRV9QT1JU UkVHU0VMX1NISUZUKTsKKwl2YWwgfD0gQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX1NTX1BJIDw8IENG R19ERVZfRkVfUE9SVFJFR1NFTF9TSElGVDsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENGR19E RVZfRkUpOworCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBQT1JUU0MpOworCXZhbCAmPSB+KFBP UlRTQ19DSEFOR0VfTUFTSyB8IChQT1JUU0NfUExTX01BU0sgPDwgUE9SVFNDX1BMU19TSElGVCkp OworCXZhbCB8PSBQT1JUU0NfTFdTIHwgKFBPUlRTQ19QTFNfUlhERVRFQ1QgPDwgUE9SVFNDX1BM U19TSElGVCk7CisJeHVkY193cml0ZWwoeHVkYywgdmFsLCBQT1JUU0MpOworCisJLyogUmVzdG9y ZSBwb3J0IGluc3RhbmNlLiAqLworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ0ZHX0RFVl9GRSk7 CisJdmFsICY9IH4oQ0ZHX0RFVl9GRV9QT1JUUkVHU0VMX01BU0sgPDwgQ0ZHX0RFVl9GRV9QT1JU UkVHU0VMX1NISUZUKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB2YWwsIENGR19ERVZfRkUpOworCisJ LyoKKwkgKiBFbmFibGUgSU5GSU5JVEVfU1NfUkVUUlkgdG8gcHJldmVudCBkZXZpY2UgZnJvbSBl bnRlcmluZworCSAqIERpc2FibGVkLkVycm9yIHdoZW4gYXR0YWNoZWQgdG8gYnVnZ3kgU3VwZXJT cGVlZCBodWJzLgorCSAqLworCXZhbCA9IHh1ZGNfcmVhZGwoeHVkYywgQ0ZHX0RFVl9GRSk7CisJ dmFsIHw9IENGR19ERVZfRkVfSU5GSU5JVEVfU1NfUkVUUlk7CisJeHVkY193cml0ZWwoeHVkYywg dmFsLCBDRkdfREVWX0ZFKTsKKworCS8qIFNldCBpbnRlcnJ1cHQgbW9kZXJhdGlvbi4gKi8KKwlp bW9kID0gWFVEQ19JTlRFUlJVUFRfTU9ERVJBVElPTl9VUyAqIDQ7CisJdmFsID0geHVkY19yZWFk bCh4dWRjLCBSVF9JTU9EKTsKKwl2YWwgJj0gfigoUlRfSU1PRF9JTU9ESV9NQVNLIDw8IFJUX0lN T0RfSU1PRElfU0hJRlQpIHwKKwkJIChSVF9JTU9EX0lNT0RDX01BU0sgPDwgUlRfSU1PRF9JTU9E Q19TSElGVCkpOworCXZhbCB8PSAoaW1vZCA8PCBSVF9JTU9EX0lNT0RJX1NISUZUKSB8IChpbW9k IDw8IFJUX0lNT0RfSU1PRENfU0hJRlQpOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgUlRfSU1P RCk7CisKKwkvKiBpbmNyZWFzZSBTU1BJIHRyYW5zYWN0aW9uIHRpbWVvdXQgZnJvbSAzMnVzIHRv IDUxMnVzICovCisJdmFsID0geHVkY19yZWFkbCh4dWRjLCBDRkdfREVWX1NTUElfWEZFUik7CisJ dmFsICY9IH4oQ0ZHX0RFVl9TU1BJX1hGRVJfQUNLVElNRU9VVF9NQVNLIDw8CisJCUNGR19ERVZf U1NQSV9YRkVSX0FDS1RJTUVPVVRfU0hJRlQpOworCXZhbCB8PSAoMHhmMDAwICYgQ0ZHX0RFVl9T U1BJX1hGRVJfQUNLVElNRU9VVF9NQVNLKSA8PAorCQlDRkdfREVWX1NTUElfWEZFUl9BQ0tUSU1F T1VUX1NISUZUOworCXh1ZGNfd3JpdGVsKHh1ZGMsIHZhbCwgQ0ZHX0RFVl9TU1BJX1hGRVIpOwor fQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcGh5X2luaXQoc3RydWN0IHRlZ3JhX3h1ZGMgKnh1 ZGMpCit7CisJaW50IGVycjsKKworCWVyciA9IHBoeV9pbml0KHh1ZGMtPnV0bWlfcGh5KTsKKwlp ZiAoZXJyIDwgMCkgeworCQlkZXZfZXJyKHh1ZGMtPmRldiwgInV0bWkgcGh5IGluaXQgZmFpbGVk OiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisJZXJyID0gcGh5X2luaXQoeHVkYy0+ dXNiM19waHkpOworCWlmIChlcnIgPCAwKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAidXNiMyBw aHkgaW5pdCBmYWlsZWQ6ICVkXG4iLCBlcnIpOworCQlnb3RvIGV4aXRfdXRtaV9waHk7CisJfQor CXJldHVybiAwOworCitleGl0X3V0bWlfcGh5OgorCXBoeV9leGl0KHh1ZGMtPnV0bWlfcGh5KTsK KwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3BoeV9leGl0KHN0cnVj dCB0ZWdyYV94dWRjICp4dWRjKQoreworCXBoeV9leGl0KHh1ZGMtPnVzYjNfcGh5KTsKKwlwaHlf ZXhpdCh4dWRjLT51dG1pX3BoeSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdGVn cmEyMTBfeHVkY19zdXBwbHlfbmFtZXNbXSA9IHsKKwkiaHZkZC11c2IiLAorCSJhdmRkaW8tdXNi IiwKKwkiYXZkZC1wbGwtdXRtaXAiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0 ZWdyYTIxMF94dWRjX2Nsb2NrX25hbWVzW10gPSB7CisJInh1c2JfZGV2aWNlIiwKKwkieHVzYl9z cyIsCisJInh1c2Jfc3Nfc3JjIiwKKwkieHVzYl9oc19zcmMiLAorCSJ4dXNiX2ZzX3NyYyIsCit9 OworCitzdGF0aWMgc3RydWN0IHRlZ3JhX3h1ZGNfc29jIHRlZ3JhMjEwX3h1ZGNfc29jX2RhdGEg PSB7CisJLnN1cHBseV9uYW1lcyA9IHRlZ3JhMjEwX3h1ZGNfc3VwcGx5X25hbWVzLAorCS5udW1f c3VwcGxpZXMgPSBBUlJBWV9TSVpFKHRlZ3JhMjEwX3h1ZGNfc3VwcGx5X25hbWVzKSwKKwkuY2xv Y2tfbmFtZXMgPSB0ZWdyYTIxMF94dWRjX2Nsb2NrX25hbWVzLAorCS5udW1fY2xrcyA9IEFSUkFZ X1NJWkUodGVncmEyMTBfeHVkY19jbG9ja19uYW1lcyksCisJLnUxX2VuYWJsZSA9IGZhbHNlLAor CS51Ml9lbmFibGUgPSB0cnVlLAorCS5scG1fZW5hYmxlID0gZmFsc2UsCisJLmludmFsaWRfc2Vx X251bSA9IHRydWUsCisJLnBsc19xdWlyayA9IHRydWUsCisJLnBvcnRfcmVzZXRfcXVpcmsgPSB0 cnVlLAorCS5oYXNfaXBmcyA9IHRydWUsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2Rl dmljZV9pZCB0ZWdyYV94dWRjX29mX21hdGNoW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJu dmlkaWEsdGVncmEyMTAteHVkYyIsCisJCS5kYXRhID0gJnRlZ3JhMjEwX3h1ZGNfc29jX2RhdGEK Kwl9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIHRlZ3JhX3h1ZGNfb2ZfbWF0 Y2gpOworCitzdGF0aWMgdm9pZCB0ZWdyYV94dWRjX3Bvd2VyZG9tYWluX3JlbW92ZShzdHJ1Y3Qg dGVncmFfeHVkYyAqeHVkYykKK3sKKwlpZiAoeHVkYy0+Z2VucGRfZGxfc3MpCisJCWRldmljZV9s aW5rX2RlbCh4dWRjLT5nZW5wZF9kbF9zcyk7CisJaWYgKHh1ZGMtPmdlbnBkX2RsX2RldmljZSkK KwkJZGV2aWNlX2xpbmtfZGVsKHh1ZGMtPmdlbnBkX2RsX2RldmljZSk7CisJaWYgKHh1ZGMtPmdl bnBkX2Rldl9zcykKKwkJZGV2X3BtX2RvbWFpbl9kZXRhY2goeHVkYy0+Z2VucGRfZGV2X3NzLCB0 cnVlKTsKKwlpZiAoeHVkYy0+Z2VucGRfZGV2X2RldmljZSkKKwkJZGV2X3BtX2RvbWFpbl9kZXRh Y2goeHVkYy0+Z2VucGRfZGV2X2RldmljZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgdGVncmFf eHVkY19wb3dlcmRvbWFpbl9pbml0KHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXN0cnVj dCBkZXZpY2UgKmRldiA9IHh1ZGMtPmRldjsKKwlpbnQgZXJyOworCisJeHVkYy0+Z2VucGRfZGV2 X2RldmljZSA9IGRldl9wbV9kb21haW5fYXR0YWNoX2J5X25hbWUoZGV2LAorCQkJCQkJCQkieHVz Yl9kZXZpY2UiKTsKKwlpZiAoSVNfRVJSKHh1ZGMtPmdlbnBkX2Rldl9kZXZpY2UpKSB7CisJCWVy ciA9IFBUUl9FUlIoeHVkYy0+Z2VucGRfZGV2X2RldmljZSk7CisJCWRldl9lcnIoZGV2LCAiZmFp bGVkIHRvIGdldCBkZXZpY2UgcG0tZG9tYWluOiAlZFxuIiwgZXJyKTsKKwkJcmV0dXJuIGVycjsK Kwl9CisKKwl4dWRjLT5nZW5wZF9kZXZfc3MgPSBkZXZfcG1fZG9tYWluX2F0dGFjaF9ieV9uYW1l KGRldiwgInh1c2Jfc3MiKTsKKwlpZiAoSVNfRVJSKHh1ZGMtPmdlbnBkX2Rldl9zcykpIHsKKwkJ ZXJyID0gUFRSX0VSUih4dWRjLT5nZW5wZF9kZXZfc3MpOworCQlkZXZfZXJyKGRldiwgImZhaWxl ZCB0byBnZXQgc3VwZXJzcGVlZCBwbS1kb21haW46ICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJy OworCX0KKworCXh1ZGMtPmdlbnBkX2RsX2RldmljZSA9IGRldmljZV9saW5rX2FkZChkZXYsIHh1 ZGMtPmdlbnBkX2Rldl9kZXZpY2UsCisJCQkJCSAgICAgICBETF9GTEFHX1BNX1JVTlRJTUUgfAor CQkJCQkgICAgICAgRExfRkxBR19TVEFURUxFU1MpOworCWlmICgheHVkYy0+Z2VucGRfZGxfZGV2 aWNlKSB7CisJCWRldl9lcnIoZGV2LCAiYWRkaW5nIHVzYiBkZXZpY2UgZGV2aWNlIGxpbmsgZmFp bGVkIVxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCXh1ZGMtPmdlbnBkX2RsX3NzID0g ZGV2aWNlX2xpbmtfYWRkKGRldiwgeHVkYy0+Z2VucGRfZGV2X3NzLAorCQkJCQkgICAgIERMX0ZM QUdfUE1fUlVOVElNRSB8CisJCQkJCSAgICAgRExfRkxBR19TVEFURUxFU1MpOworCWlmICgheHVk Yy0+Z2VucGRfZGxfc3MpIHsKKwkJZGV2X2VycihkZXYsICJhZGRpbmcgc3VwZXJzcGVlZCBkZXZp Y2UgbGluayBmYWlsZWQhXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgdGVncmFfeHVkY19wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2KQoreworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjOworCXN0cnVjdCByZXNvdXJjZSAq cmVzOworCXVuc2lnbmVkIGludCBpOworCWludCBlcnI7CisKKwl4dWRjID0gZGV2bV9remFsbG9j KCZwZGV2LT5kZXYsIHNpemVvZigqeHVkYyksIEdGUF9BVE9NSUMpOworCWlmICgheHVkYykKKwkJ cmV0dXJuIC1FTk9NRU07CisJeHVkYy0+ZGV2ID0gJnBkZXYtPmRldjsKKwlwbGF0Zm9ybV9zZXRf ZHJ2ZGF0YShwZGV2LCB4dWRjKTsKKworCXh1ZGMtPnNvYyA9IG9mX2RldmljZV9nZXRfbWF0Y2hf ZGF0YSgmcGRldi0+ZGV2KTsKKwlpZiAoIXh1ZGMtPnNvYykKKwkJcmV0dXJuIC1FTk9ERVY7CisK KwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOwor CXh1ZGMtPmJhc2UgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlp ZiAoSVNfRVJSKHh1ZGMtPmJhc2UpKQorCQlyZXR1cm4gUFRSX0VSUih4dWRjLT5iYXNlKTsKKwl4 dWRjLT5waHlzX2Jhc2UgPSByZXMtPnN0YXJ0OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAxKTsKKwl4dWRjLT5mcGNpID0gZGV2bV9pb3JlbWFw X3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUih4dWRjLT5mcGNpKSkKKwkJ cmV0dXJuIFBUUl9FUlIoeHVkYy0+ZnBjaSk7CisKKwlpZiAoeHVkYy0+c29jLT5oYXNfaXBmcykg eworCQlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDIp OworCQl4dWRjLT5pcGZzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7 CisJCWlmIChJU19FUlIoeHVkYy0+aXBmcykpCisJCQlyZXR1cm4gUFRSX0VSUih4dWRjLT5pcGZz KTsKKwl9CisKKwl4dWRjLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOworCWlmICh4 dWRjLT5pcnEgPCAwKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAiZmFpbGVkIHRvIGdldCBJUlE6 ICVkXG4iLAorCQkJCXh1ZGMtPmlycSk7CisJCXJldHVybiB4dWRjLT5pcnE7CisJfQorCWVyciA9 IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgeHVkYy0+aXJxLCB0ZWdyYV94dWRjX2lycSwg MCwKKwkJCSAgICAgICBkZXZfbmFtZSgmcGRldi0+ZGV2KSwgeHVkYyk7CisJaWYgKGVyciA8IDAp IHsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gY2xhaW0gSVJRIyV1OiAlZFxuIiwg eHVkYy0+aXJxLAorCQkJZXJyKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwl4dWRjLT5jbGtzID0g ZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHh1ZGMtPnNvYy0+bnVtX2Nsa3MsCisJCQkJICAgICAg c2l6ZW9mKCp4dWRjLT5jbGtzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF4dWRjLT5jbGtzKQorCQly ZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAwOyBpIDwgeHVkYy0+c29jLT5udW1fY2xrczsgaSsr KQorCQl4dWRjLT5jbGtzW2ldLmlkID0geHVkYy0+c29jLT5jbG9ja19uYW1lc1tpXTsKKwllcnIg PSBkZXZtX2Nsa19idWxrX2dldCgmcGRldi0+ZGV2LCB4dWRjLT5zb2MtPm51bV9jbGtzLAorCQkJ CSAgICAgIHh1ZGMtPmNsa3MpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJm YWlsZWQgdG8gcmVxdWVzdCBjbGtzICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOworCX0KKwor CXh1ZGMtPnN1cHBsaWVzID0gZGV2bV9rY2FsbG9jKCZwZGV2LT5kZXYsIHh1ZGMtPnNvYy0+bnVt X3N1cHBsaWVzLAorCQkJCSAgICAgIHNpemVvZigqeHVkYy0+c3VwcGxpZXMpLCBHRlBfS0VSTkVM KTsKKwlpZiAoIXh1ZGMtPnN1cHBsaWVzKQorCQlyZXR1cm4gLUVOT01FTTsKKwlmb3IgKGkgPSAw OyBpIDwgeHVkYy0+c29jLT5udW1fc3VwcGxpZXM7IGkrKykKKwkJeHVkYy0+c3VwcGxpZXNbaV0u c3VwcGx5ID0geHVkYy0+c29jLT5zdXBwbHlfbmFtZXNbaV07CisJZXJyID0gZGV2bV9yZWd1bGF0 b3JfYnVsa19nZXQoJnBkZXYtPmRldiwgeHVkYy0+c29jLT5udW1fc3VwcGxpZXMsCisJCQkJICAg ICAgeHVkYy0+c3VwcGxpZXMpOworCWlmIChlcnIpIHsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJm YWlsZWQgdG8gcmVxdWVzdCByZWd1bGF0b3JzICVkXG4iLCBlcnIpOworCQlyZXR1cm4gZXJyOwor CX0KKworCXh1ZGMtPnBhZGN0bCA9IHRlZ3JhX3h1c2JfcGFkY3RsX2dldCgmcGRldi0+ZGV2KTsK KwlpZiAoSVNfRVJSKHh1ZGMtPnBhZGN0bCkpCisJCXJldHVybiBQVFJfRVJSKHh1ZGMtPnBhZGN0 bCk7CisKKwllcnIgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoeHVkYy0+c29jLT5udW1fc3VwcGxp ZXMsIHh1ZGMtPnN1cHBsaWVzKTsKKwlpZiAoZXJyKSB7CisJCWRldl9lcnIoeHVkYy0+ZGV2LCAi ZmFpbGVkIHRvIGVuYWJsZSByZWd1bGF0b3JzICVkXG4iLCBlcnIpOworCQlnb3RvIHB1dF9wYWRj dGw7CisJfQorCisJeHVkYy0+dXNiM19waHkgPSBkZXZtX3BoeV9vcHRpb25hbF9nZXQoJnBkZXYt PmRldiwgInVzYjMiKTsKKwlpZiAoSVNfRVJSKHh1ZGMtPnVzYjNfcGh5KSkgeworCQllcnIgPSBQ VFJfRVJSKHh1ZGMtPnVzYjNfcGh5KTsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8g Z2V0IHVzYjMgcGh5OiAlZFxuIiwgZXJyKTsKKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcjsKKwl9 CisJeHVkYy0+dXRtaV9waHkgPSBkZXZtX3BoeV9vcHRpb25hbF9nZXQoJnBkZXYtPmRldiwgInVz YjIiKTsKKwlpZiAoSVNfRVJSKHh1ZGMtPnV0bWlfcGh5KSkgeworCQllcnIgPSBQVFJfRVJSKHh1 ZGMtPnV0bWlfcGh5KTsKKwkJZGV2X2Vycih4dWRjLT5kZXYsICJmYWlsZWQgdG8gZ2V0IHVzYjIg cGh5OiAlZFxuIiwgZXJyKTsKKwkJZ290byBkaXNhYmxlX3JlZ3VsYXRvcjsKKwl9CisKKwl4dWRj LT5kYXRhX3JvbGVfZXh0Y29uID0gZXh0Y29uX2dldF9lZGV2X2J5X3BoYW5kbGUoJnBkZXYtPmRl diwgMCk7CisJaWYgKElTX0VSUih4dWRjLT5kYXRhX3JvbGVfZXh0Y29uKSkgeworCQllcnIgPSBQ VFJfRVJSKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pOworCQlkZXZfZXJyKHh1ZGMtPmRldiwgImV4 dGNvbl9nZXRfZWRldl9ieV9waGFuZGxlIGZhaWxlZCAlZFxuIiwKKwkJCQllcnIpOworCQlnb3Rv IGRpc2FibGVfcmVndWxhdG9yOworCX0KKworCWVyciA9IHRlZ3JhX3h1ZGNfcG93ZXJkb21haW5f aW5pdCh4dWRjKTsKKwlpZiAoZXJyKQorCQlnb3RvIHB1dF9wb3dlcmRvbWFpbnM7CisKKwllcnIg PSB0ZWdyYV94dWRjX3BoeV9pbml0KHh1ZGMpOworCWlmIChlcnIpCisJCWdvdG8gcHV0X3Bvd2Vy ZG9tYWluczsKKworCWVyciA9IHRlZ3JhX3h1ZGNfYWxsb2NfZXZlbnRfcmluZyh4dWRjKTsKKwlp ZiAoZXJyKQorCQlnb3RvIGRpc2FibGVfcGh5OworCisJZXJyID0gdGVncmFfeHVkY19hbGxvY19l cHMoeHVkYyk7CisJaWYgKGVycikKKwkJZ290byBmcmVlX2V2ZW50X3Jpbmc7CisKKwlzcGluX2xv Y2tfaW5pdCgmeHVkYy0+bG9jayk7CisJaW5pdF9jb21wbGV0aW9uKCZ4dWRjLT5kaXNjb25uZWN0 X2NvbXBsZXRlKTsKKworCUlOSVRfV09SSygmeHVkYy0+ZGF0YV9yb2xlX3dvcmssIHRlZ3JhX3h1 ZGNfZGF0YV9yb2xlX3dvcmspOworCXh1ZGMtPmRhdGFfcm9sZV9uYi5ub3RpZmllcl9jYWxsID0g dGVncmFfeHVkY19kYXRhX3JvbGVfbm90aWZpZXI7CisJZXh0Y29uX3JlZ2lzdGVyX25vdGlmaWVy KHh1ZGMtPmRhdGFfcm9sZV9leHRjb24sIEVYVENPTl9VU0IsCisJCQkJICZ4dWRjLT5kYXRhX3Jv bGVfbmIpOworCisJSU5JVF9ERUxBWUVEX1dPUksoJnh1ZGMtPnBsY19yZXNldF93b3JrLCB0ZWdy YV94dWRjX3BsY19yZXNldF93b3JrKTsKKworCUlOSVRfREVMQVlFRF9XT1JLKCZ4dWRjLT5wb3J0 X3Jlc2V0X3dhcl93b3JrLAorCQkJCXRlZ3JhX3h1ZGNfcG9ydF9yZXNldF93YXJfd29yayk7CisK KwlwbV9ydW50aW1lX2VuYWJsZSgmcGRldi0+ZGV2KTsKKworCXh1ZGMtPmdhZGdldC5vcHMgPSAm dGVncmFfeHVkY19nYWRnZXRfb3BzOworCXh1ZGMtPmdhZGdldC5lcDAgPSAmeHVkYy0+ZXBbMF0u dXNiX2VwOworCXh1ZGMtPmdhZGdldC5uYW1lID0gInRlZ3JhLXh1ZGMiOworCXh1ZGMtPmdhZGdl dC5tYXhfc3BlZWQgPSBVU0JfU1BFRURfU1VQRVI7CisKKwllcnIgPSB1c2JfYWRkX2dhZGdldF91 ZGMoJnBkZXYtPmRldiwgJnh1ZGMtPmdhZGdldCk7CisJaWYgKGVycikgeworCQlkZXZfZXJyKCZw ZGV2LT5kZXYsICJmYWlsZWQgdG8gYWRkIFVTQiBnYWRnZXQ6ICVkXG4iLCBlcnIpOworCQlnb3Rv IGZyZWVfZXBzOworCX0KKworCXRlZ3JhX3h1ZGNfdXBkYXRlX2RhdGFfcm9sZSh4dWRjKTsKKwor CXJldHVybiAwOworCitmcmVlX2VwczoKKwl0ZWdyYV94dWRjX2ZyZWVfZXBzKHh1ZGMpOworZnJl ZV9ldmVudF9yaW5nOgorCXRlZ3JhX3h1ZGNfZnJlZV9ldmVudF9yaW5nKHh1ZGMpOworZGlzYWJs ZV9waHk6CisJdGVncmFfeHVkY19waHlfZXhpdCh4dWRjKTsKK3B1dF9wb3dlcmRvbWFpbnM6CisJ dGVncmFfeHVkY19wb3dlcmRvbWFpbl9yZW1vdmUoeHVkYyk7CitkaXNhYmxlX3JlZ3VsYXRvcjoK KwlyZWd1bGF0b3JfYnVsa19kaXNhYmxlKHh1ZGMtPnNvYy0+bnVtX3N1cHBsaWVzLCB4dWRjLT5z dXBwbGllcyk7CitwdXRfcGFkY3RsOgorCXRlZ3JhX3h1c2JfcGFkY3RsX3B1dCh4dWRjLT5wYWRj dGwpOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCB0ZWdyYV94dWRjX3JlbW92ZShz dHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRj ID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlwbV9ydW50aW1lX2dldF9zeW5jKHh1 ZGMtPmRldik7CisKKwljYW5jZWxfZGVsYXllZF93b3JrKCZ4dWRjLT5wbGNfcmVzZXRfd29yayk7 CisJaWYgKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pIHsKKwkJZXh0Y29uX3VucmVnaXN0ZXJfbm90 aWZpZXIoeHVkYy0+ZGF0YV9yb2xlX2V4dGNvbiwgRVhUQ09OX1VTQiwKKwkJCQkmeHVkYy0+ZGF0 YV9yb2xlX25iKTsKKwkJY2FuY2VsX3dvcmtfc3luYygmeHVkYy0+ZGF0YV9yb2xlX3dvcmspOwor CX0KKwl1c2JfZGVsX2dhZGdldF91ZGMoJnh1ZGMtPmdhZGdldCk7CisJdGVncmFfeHVkY19mcmVl X2Vwcyh4dWRjKTsKKwl0ZWdyYV94dWRjX2ZyZWVfZXZlbnRfcmluZyh4dWRjKTsKKwl0ZWdyYV94 dWRjX3Bvd2VyZG9tYWluX3JlbW92ZSh4dWRjKTsKKworCXJlZ3VsYXRvcl9idWxrX2Rpc2FibGUo eHVkYy0+c29jLT5udW1fc3VwcGxpZXMsIHh1ZGMtPnN1cHBsaWVzKTsKKworCXBoeV9wb3dlcl9v ZmYoeHVkYy0+dXRtaV9waHkpOworCXBoeV9wb3dlcl9vZmYoeHVkYy0+dXNiM19waHkpOworCXRl Z3JhX3h1ZGNfcGh5X2V4aXQoeHVkYyk7CisJcG1fcnVudGltZV9kaXNhYmxlKHh1ZGMtPmRldik7 CisJcG1fcnVudGltZV9wdXQoeHVkYy0+ZGV2KTsKKworCXRlZ3JhX3h1c2JfcGFkY3RsX3B1dCh4 dWRjLT5wYWRjdGwpOworCisJcmV0dXJuIDA7Cit9CisKKyNpZiBJU19FTkFCTEVEKENPTkZJR19Q TV9TTEVFUCkgfHwgSVNfRU5BQkxFRChDT05GSUdfUE0pCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNf cG93ZXJnYXRlKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisKKwlkZXZfaW5mbyh4dWRjLT5kZXYsICJlbnRlcmluZyBFTFBHXG4iKTsKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCXh1ZGMtPnBvd2VyZ2F0ZWQgPSB0cnVl OworCXh1ZGMtPnNhdmVkX3JlZ3MuY3RybCA9IHh1ZGNfcmVhZGwoeHVkYywgQ1RSTCk7CisJeHVk Yy0+c2F2ZWRfcmVncy5wb3J0cG0gPSB4dWRjX3JlYWRsKHh1ZGMsIFBPUlRQTSk7CisJeHVkY193 cml0ZWwoeHVkYywgMCwgQ1RSTCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9j aywgZmxhZ3MpOworCisJY2xrX2J1bGtfZGlzYWJsZV91bnByZXBhcmUoeHVkYy0+c29jLT5udW1f Y2xrcywgeHVkYy0+Y2xrcyk7CisJcmVndWxhdG9yX2J1bGtfZGlzYWJsZSh4dWRjLT5zb2MtPm51 bV9zdXBwbGllcywgeHVkYy0+c3VwcGxpZXMpOworCisJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZW50 ZXJpbmcgRUxQRyBkb25lXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB0ZWdyYV94 dWRjX3VucG93ZXJnYXRlKHN0cnVjdCB0ZWdyYV94dWRjICp4dWRjKQoreworCXVuc2lnbmVkIGxv bmcgZmxhZ3M7CisJaW50IGVycjsKKworCWRldl9pbmZvKHh1ZGMtPmRldiwgImV4aXRpbmcgRUxQ R1xuIik7CisKKwllcnIgPSByZWd1bGF0b3JfYnVsa19lbmFibGUoeHVkYy0+c29jLT5udW1fc3Vw cGxpZXMsCisJCQl4dWRjLT5zdXBwbGllcyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7 CisKKworCWVyciA9IGNsa19idWxrX3ByZXBhcmVfZW5hYmxlKHh1ZGMtPnNvYy0+bnVtX2Nsa3Ms IHh1ZGMtPmNsa3MpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJdGVncmFfeHVk Y19mcGNpX2lwZnNfaW5pdCh4dWRjKTsKKwl0ZWdyYV94dWRjX2RldmljZV9wYXJhbXNfaW5pdCh4 dWRjKTsKKworCXRlZ3JhX3h1ZGNfaW5pdF9ldmVudF9yaW5nKHh1ZGMpOworCXRlZ3JhX3h1ZGNf aW5pdF9lcHMoeHVkYyk7CisKKwl4dWRjX3dyaXRlbCh4dWRjLCB4dWRjLT5zYXZlZF9yZWdzLnBv cnRwbSwgUE9SVFBNKTsKKwl4dWRjX3dyaXRlbCh4dWRjLCB4dWRjLT5zYXZlZF9yZWdzLmN0cmws IENUUkwpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKwl4dWRj LT5wb3dlcmdhdGVkID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9j aywgZmxhZ3MpOworCisJZGV2X2luZm8oeHVkYy0+ZGV2LCAiZXhpdGluZyBFTFBHIGRvbmVcbiIp OworCXJldHVybiAwOworfQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfUE1fU0xFRVAKK3N0YXRp YyBpbnQgdGVncmFfeHVkY19zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3Qg dGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCXh1ZGMt PnN1c3BlbmRlZCA9IHRydWU7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHVkYy0+bG9jaywg ZmxhZ3MpOworCisJaWYgKHh1ZGMtPmRhdGFfcm9sZV9leHRjb24pCisJCWZsdXNoX3dvcmsoJnh1 ZGMtPmRhdGFfcm9sZV93b3JrKTsKKworCS8qIEZvcmNpYmx5IGRpc2Nvbm5lY3QgYmVmb3JlIHBv d2VyZ2F0aW5nLiAqLworCXRlZ3JhX3h1ZGNfZGV2aWNlX21vZGVfb2ZmKHh1ZGMpOworCisJaWYg KCFwbV9ydW50aW1lX3N0YXR1c19zdXNwZW5kZWQoZGV2KSkKKwkJdGVncmFfeHVkY19wb3dlcmdh dGUoeHVkYyk7CisKKwlwbV9ydW50aW1lX2Rpc2FibGUoZGV2KTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlz dHJ1Y3QgdGVncmFfeHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJaW50IGVycjsKKworCWVyciA9IHRlZ3JhX3h1ZGNfdW5wb3dlcmdhdGUo eHVkYyk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlzcGluX2xvY2tfaXJxc2F2 ZSgmeHVkYy0+bG9jaywgZmxhZ3MpOworCXh1ZGMtPnN1c3BlbmRlZCA9IGZhbHNlOworCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnh1ZGMtPmxvY2ssIGZsYWdzKTsKKworCXRlZ3JhX3h1ZGNfdXBk YXRlX2RhdGFfcm9sZSh4dWRjKTsKKworCXBtX3J1bnRpbWVfZW5hYmxlKGRldik7CisKKwlyZXR1 cm4gMDsKK30KKyNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BNCitzdGF0aWMgaW50IHRlZ3JhX3h1 ZGNfcnVudGltZV9zdXNwZW5kKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGVncmFf eHVkYyAqeHVkYyA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOworCisJcmV0dXJuIHRlZ3JhX3h1ZGNf cG93ZXJnYXRlKHh1ZGMpOworfQorCitzdGF0aWMgaW50IHRlZ3JhX3h1ZGNfcnVudGltZV9yZXN1 bWUoc3RydWN0IGRldmljZSAqZGV2KQoreworCXN0cnVjdCB0ZWdyYV94dWRjICp4dWRjID0gZGV2 X2dldF9kcnZkYXRhKGRldik7CisKKwlyZXR1cm4gdGVncmFfeHVkY191bnBvd2VyZ2F0ZSh4dWRj KTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IGRldl9wbV9vcHMgdGVncmFfeHVk Y19wbV9vcHMgPSB7CisJU0VUX1NZU1RFTV9TTEVFUF9QTV9PUFModGVncmFfeHVkY19zdXNwZW5k LCB0ZWdyYV94dWRjX3Jlc3VtZSkKKwlTRVRfUlVOVElNRV9QTV9PUFModGVncmFfeHVkY19ydW50 aW1lX3N1c3BlbmQsCisJCQkgICB0ZWdyYV94dWRjX3J1bnRpbWVfcmVzdW1lLCBOVUxMKQorfTsK Kworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgdGVncmFfeHVkY19kcml2ZXIgPSB7CisJ LnByb2JlID0gdGVncmFfeHVkY19wcm9iZSwKKwkucmVtb3ZlID0gdGVncmFfeHVkY19yZW1vdmUs CisJLmRyaXZlciA9IHsKKwkJLm5hbWUgPSAidGVncmEteHVkYyIsCisJCS5wbSA9ICZ0ZWdyYV94 dWRjX3BtX29wcywKKwkJLm9mX21hdGNoX3RhYmxlID0gdGVncmFfeHVkY19vZl9tYXRjaCwKKwl9 LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIodGVncmFfeHVkY19kcml2ZXIpOworCitNT0RV TEVfREVTQ1JJUFRJT04oIk5WSURJQSBUZWdyYSBYVVNCIERldmljZSBDb250cm9sbGVyIik7CitN T0RVTEVfQVVUSE9SKCJBbmRyZXcgQnJlc3RpY2tlciA8YWJyZXN0aWNAY2hyb21pdW0ub3JnPiIp OworTU9EVUxFX0FVVEhPUigiSHVpIEZ1Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==