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: Driver for MaxLinear/Exar USB (UART) Serial adapters. From: Patong Yang Message-Id: <20180404070634.nhspvmxcjwfgjkcv@advantechmxl-desktop> Date: Wed, 4 Apr 2018 00:06:34 -0700 To: johan@kernel.org Cc: gregkh@linuxfoundation.org, pyang@maxlinear.com, linux-usb@vger.kernel.org List-ID: VGhlIGRyaXZlciBpcyBiYXNlZCBvbiB0aGUgQ0RDLUFDTSBkcml2ZXIuIEluIGFkZGl0aW9uIHRv IHN1cHBvcnRpbmcgCnRoZSBmZWF0dXJlcyBvZiB0aGUgTWF4TGluZWFyL0V4YXIgVVNCIFVBUlQg ZGV2aWNlcywgdGhlIGRyaXZlciBhbHNvIApoYXMgc3VwcG9ydCBmb3IgMiBvdGhlciBmdW5jdGlv bnMgcGVyIGN1c3RvbWVyIHJlcXVpcmVtZW50czoKCi0gU3BlY2lmaWMgZW50cmllcyBhcmUgY2hl Y2tlZCBpbiB0aGUgQklPUyB0byBkZXRlY3QgaWYgdGhlIGJvYXJkIGlzIGEKICAiQ2FyYWNhbGxh IiBib2FyZCBiZWZvcmUgZW5hYmxpbmcgc3BlY2lmaWMgbW9kZXMgaW4gdGhlIE1heExpbmVhci9F eGFyCiAgVVNCIFVBUlRzLiAgVGhlIHNtYmlvcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSBleGFtcGxl IGF0OgogIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3NtYmlvcy8KCi0gV2hlbiBz cGVjaWZpYyBJT0NUTHMgYXJlIGNhbGxlZCBieSBhIHVzZXItc3BhY2UgYXBwbGljYXRpb24sIGEg CiAgcG9ydF9jb25maWcgZmlsZSBpcyBjcmVhdGVkIGZvciB0aGUgL2Rldi90dHlYUlVTQiBkZXZp Y2UgYXQgYQogIHNwZWNpZmljIFVTQiB0cmVlIGxvY2F0aW9uLCBhbmQgc29tZSBjb25maWd1cmF0 aW9uIGRhdGEgaXMgc3RvcmVkLiAKICBUaGUgZHJpdmVyIGNoZWNrcyBmb3IgdGhlIHBvcnRfY29u ZmlnIGZpbGUgd2hlbiB0aGUgZHJpdmVyIGlzIGxvYWRlZAogIGZvciBlYWNoIHBvcnQgYW5kIGxv YWRzIHRoZSBjb25maWd1cmF0aW9uIHNldHRpbmdzIGlmIHRoZXJlIGlzIGEKICBwb3J0X2NvbmZp ZyBmaWxlIGZvciB0aGUgVVNCIHRyZWUgbG9jYXRpb24uCgpTaWduZWQtb2ZmLWJ5OiBQYXRvbmcg WWFuZyA8cGF0b25nLm14bEBnbWFpbC5jb20+Ci0tLQogZHJpdmVycy91c2Ivc2VyaWFsL3hydXNi X3NlcmlhbC5jIHwgMzI4NSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBk cml2ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmggfCAgNDQ4ICsrKysrCiAyIGZpbGVzIGNo YW5nZWQsIDM3MzMgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNi L3NlcmlhbC94cnVzYl9zZXJpYWwuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL3Nl cmlhbC94cnVzYl9zZXJpYWwuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL3NlcmlhbC94cnVz Yl9zZXJpYWwuYyBiL2RyaXZlcnMvdXNiL3NlcmlhbC94cnVzYl9zZXJpYWwuYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjE2YTViY2ZmOTEwMwotLS0gL2Rldi9udWxs CisrKyBiL2RyaXZlcnMvdXNiL3NlcmlhbC94cnVzYl9zZXJpYWwuYwpAQCAtMCwwICsxLDMyODUg QEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIHhydXNiX3Nl cmlhbC5jCisgKgorICogQ29weXJpZ2h0IChjKSAyMDE4IFBhdG9uZyBZYW5nIDxwYXRvbmcubXhs QGdtYWlsLmNvbT4KKyAqCisgKiBVU0IgU2VyaWFsIERyaXZlciBiYXNlZCBvbiB0aGUgY2RjLWFj bS5jIGRyaXZlciBmb3IgdGhlCisgKiBNYXhMaW5lYXIvRXhhciBVU0IgVUFSVHMvU2VyaWFsIGFk YXB0ZXJzCisgKi8KKworCisjdW5kZWYgREVCVUcKKyN1bmRlZiBWRVJCT1NFX0RFQlVHCisKKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC9zaWduYWwuaD4K KyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNs dWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvdHR5Lmg+CisjaW5jbHVkZSA8bGlu dXgvbG9nMi5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcmlhbC5oPgorI2luY2x1ZGUgPGxpbnV4L3R0 eV9kcml2ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC90dHlfZmxpcC5oPgorI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvdWFj Y2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9jZGMu aD4KKyNpbmNsdWRlIDxsaW51eC9kbWkuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+Cisj aW5jbHVkZSA8YXNtL3VuYWxpZ25lZC5oPgorI2luY2x1ZGUgPGxpbnV4L2lkci5oPgorI2luY2x1 ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGFz bS9pby5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4K KworI2luY2x1ZGUgImxpbnV4L3ZlcnNpb24uaCIKKyNpbmNsdWRlICJ4cnVzYl9zZXJpYWwuaCIK KworI2RlZmluZSBEUklWRVJfQVVUSE9SICJQYXRvbmcgWWFuZyA8cGF0b25nLm14bEBnbWFpbC5j b20+IgorI2RlZmluZSBEUklWRVJfREVTQyAiTWF4TGluZWFyL0V4YXIgVVNCIFVBUlQgKHNlcmlh bCBwb3J0KSBkcml2ZXIiCisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2RyaXZlciB4cnVzYl9kcml2ZXI7 CitzdGF0aWMgc3RydWN0IHR0eV9kcml2ZXIgKnhydXNiX3R0eV9kcml2ZXI7CitzdGF0aWMgc3Ry dWN0IHhydXNiICp4cnVzYl90YWJsZVtYUlVTQl9UVFlfTUlOT1JTXTsKK3N0YXRpYyBzdHJ1Y3Qg ZmlsZSAqcG9ydF9wYXJhbV9maWxlWzMyXTsKK3N0YXRpYyBzdHJ1Y3QgcmVnX2FkZHJfbWFwIHhy MjI4MHhfcmVnX21hcDsKK3N0YXRpYyBzdHJ1Y3QgcmVnX2FkZHJfbWFwIHhyMjFiMTQxMV9yZWdf bWFwOworc3RhdGljIHN0cnVjdCByZWdfYWRkcl9tYXAgeHIyMXYxNDF4X3JlZ19tYXA7CitzdGF0 aWMgc3RydWN0IHJlZ19hZGRyX21hcCB4cjIxYjE0MnhfcmVnX21hcDsKKworc3RhdGljIERFRklO RV9NVVRFWCh4cnVzYl90YWJsZV9sb2NrKTsKKworLyoKKyAqIFNNQklPUyBjb2RlIHNuaXBwZXRz IGJlbG93IGJvcnJvd2VkIGZyb20KKyAqIGh0dHBzOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3Rz L3NtYmlvcy8KKyAqCisgKiBDaGVja2luZyBTTUJJT1MgdmFsdWVzIHRvIGRldGVybWluZSBpZiB0 aGlzIGlzIENhcmFjYWxsYSBib2FyZAorICogd2hlcmUgbW9kZXMgYXJlIHByb2dyYW1tZWQgaW4g dGhlIEJJT1MKKyAqCisgKi8KKwordW5zaWduZWQgY2hhciBzbWJpb3NfY2hlY2tfZW50cnlfcG9p bnQgKHZvaWQgKmFkZHIpCit7CisJdW5zaWduZWQgY2hhciAqaTsKKwl1bnNpZ25lZCBjaGFyIGNo ZWNrc3VtID0gMDsKKwl1bnNpZ25lZCBjaGFyIGxlbmd0aDsKKworCWxlbmd0aCA9ICgoc3RydWN0 IHNtYmlvc19lbnRyeV9wb2ludF9zdHJ1Y3QgKikgYWRkciktPgorCQllbnRyeV9wb2ludF9sZW5n dGg7CisJLyogY2FsY3VsYXRlIGNoZWNrc3VtIGZvciBlbnRyeSBwb2ludCBzdHJ1Y3R1cmUgKHNo b3VsZCBiZSAwKSAqLworCWZvciAoaSA9ICh1bnNpZ25lZCBjaGFyICopIGFkZHI7CisJCWkgPCAo dW5zaWduZWQgY2hhciAqKSBhZGRyICsgbGVuZ3RoOyBpKyspCisJCWNoZWNrc3VtICs9ICppOwor CXJldHVybiBjaGVja3N1bTsKK30KKworc3RydWN0IHNtYmlvc19lbnRyeV9wb2ludF9zdHJ1Y3Qg KnNtYmlvc19maW5kX2VudHJ5X3BvaW50ICh2b2lkICpiYXNlKQoreworCXN0cnVjdCBzbWJpb3Nf ZW50cnlfcG9pbnRfc3RydWN0ICplbnRyeV9wb2ludCA9IDA7CisJdW5zaWduZWQgaW50ICp0ZW1w OworCisJLyogc2VhcmNoIGZvciB0aGUgbWFnaWMgZHdvcmQgb24gcGFyYWdyYXBoIGJvdW5kYXJp ZXMgKi8KKwlmb3IgKHRlbXAgPSBiYXNlOworCQkhZW50cnlfcG9pbnQgJiYgdGVtcCA8ICh1bnNp Z25lZCBpbnQgKikgYmFzZSArIEJJT1NfTUFQX0xFTkdUSDsKKwkJdGVtcCArPSA0KSB7CisKKwkJ aWYgKCp0ZW1wID09IFNNQklPU19NQUdJQ19EV09SRCkgeworCQkJLyogY2hlY2sgaWYgZW50cnkg cG9pbnQgdmFsaWQgKGJ1aWxkIGNoZWNrc3VtKSAqLworCQkJaWYgKCEoc21iaW9zX2NoZWNrX2Vu dHJ5X3BvaW50ICh0ZW1wKSkpIHsKKwkJCQllbnRyeV9wb2ludCA9IChzdHJ1Y3QKKwkJCQkJc21i aW9zX2VudHJ5X3BvaW50X3N0cnVjdCAqKSB0ZW1wOworCisJCQkJLy8gZml4IGRpc3BsYXkgb2Yg QmlvcyB2ZXJzaW9uIHN0cmluZworCQkJCS8vIFNNQmlvcyB2ZXJzaW9uIGlzIGtub3duIGFzIDIu MSwgMi4yLAorCQkJCS8vIDIuMyBhbmQgMi4zLjEsIG5ldmVyIGFzIDIuMDEgKEpCKQorCQkJCVNN X0JJT1NfREVCVUcoIlNNLUJJT1MgViVkLiVkIGVudHJ5IHBvaW50ICIsCisJCQkJCWVudHJ5X3Bv aW50LT5tYWpvcl92ZXJzaW9uLAorCQkJCQllbnRyeV9wb2ludC0+bWlub3JfdmVyc2lvbik7CisJ CQkJU01fQklPU19ERUJVRygiZm91bmQgYXQgMHgleFxuIiwKKwkJCQkJKHVuc2lnbmVkIGludCkg dGVtcCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGVudHJ5X3BvaW50OworfQorCitpbnQgc21i aW9zX2NoZWNrX2NhcmFjYWxsYV9jb25maWcodW5zaWduZWQgY2hhciAqY29uZmlnMCwKKwl1bnNp Z25lZCBjaGFyICpjb25maWcxKQoreworCisJaW50IGk7CisJaW50IHJlc3VsdCA9IC0xOworCXVu c2lnbmVkIGNoYXIgKnA7CisKKwlzbWJpb3NfYmFzZSA9IGlvcmVtYXAoQklPU19TVEFSVF9BRERS RVNTLCBCSU9TX01BUF9MRU5HVEgpOworCisJaWYgKCFzbWJpb3NfYmFzZSkgeworCQlTTV9CSU9T X0RFQlVHKCJpb3JlbWFwKCkgZm9yIGVudHJ5IHBvaW50IGZhaWxlZFxuIik7CisJCXJlc3VsdCA9 IC1FTlhJTzsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlzbWJpb3NfZW50cnlfcG9pbnQgPSBz bWJpb3NfZmluZF9lbnRyeV9wb2ludCAoc21iaW9zX2Jhc2UpOworCWlmICghc21iaW9zX2VudHJ5 X3BvaW50KSB7CisJCVNNX0JJT1NfREVCVUcoIlNNLUJJT1MgZW50cnkgcG9pbnQgbm90IGZvdW5k XG4iKTsKKwkJaW91bm1hcChzbWJpb3NfYmFzZSk7CisJCXJlc3VsdCA9IC1FTlhJTzsKKwkJcmV0 dXJuIHJlc3VsdDsKKwl9CisJLyoKKwkgKglmb3IgU00tQklPUzoKKwkgKgljaGVjayBpZiBQb2lu dGVyIHRvIERNSSBzdHJ1Y3R1cmVzIGV4aXN0LgorCSAqCWludGVybWVkaWF0ZV9zdHJpbmcgKF9E TUlfKSBpcyBub3QgJ1wwJyB0ZXJtaW5hdGVkLAorCSAqCXNvIHN0cm5jbXAoKSB3aXRoIHNpemVv ZihETUlfU1RSSU5HKSAtIDEgaXMgbmVlZGVkLgorCSAqLworCWlmIChzbWJpb3NfZW50cnlfcG9p bnQpIHsKKwkJaWYgKHN0cm5jbXAoKGNoYXIgKikgJihzbWJpb3NfZW50cnlfcG9pbnQtPmludGVy bWVkaWF0ZV9zdHJpbmcpLAorCQkJRE1JX1NUUklORywgc2l6ZW9mKERNSV9TVFJJTkcpIC0gMSkp CisJCQlTTV9CSU9TX0RFQlVHKCJQb2ludGVyIHRvIERNSSBzdHJ1Y3Qgbm90IGZvdW5kIVxuIik7 CisJfQorCisJLyoKKwkgKgltYXAgdGhlIFNNLUJJT1Mgc3RydWN0dXJlcyBwaHlzaWNhbCBhZGRy ZXNzIHJhbmdlLgorCSAqCXRoZSAncmVhbCcgc21iaW9zX3N0cnVjdHVyZXNfYmFzZSBjb250YWlu cyB0aGUgc3RhcnRpbmcKKwkgKglhZGRyZXNzLCB3aGVyZSB0aGUgaW5zdGFuY2VzIG9mIGRtaSBz dHJ1Y3R1cmVzIGFyZSBsb2NhdGVkLgorCSAqLworCWlmIChzbWJpb3NfZW50cnlfcG9pbnQpCXsK KwkJc21iaW9zX3N0cnVjdHVyZXNfYmFzZSA9CisJCQlpb3JlbWFwKHNtYmlvc19lbnRyeV9wb2lu dC0+c3RydWN0X3RhYmxlX2FkZHJlc3MsCisJCQkodW5zaWduZWQgbG9uZylzbWJpb3NfZW50cnlf cG9pbnQtPnN0cnVjdF90YWJsZV9sZW5ndGgpOworCQlpZiAoIShzbWJpb3Nfc3RydWN0dXJlc19i YXNlKSkgeworCQkJU01fQklPU19ERUJVRygiaW9yZW1hcCgpIGZvciBzdHJ1Y3QgdGFibGUgZmFp bGVkXG4iKTsKKwkJCWlvdW5tYXAoc21iaW9zX2Jhc2UpOworCQkJcmVzdWx0ID0gLUVOWElPOwor CQlyZXR1cm4gcmVzdWx0OworCQl9CisJfQorCVNNX0JJT1NfREVCVUcoInNtYmlvc19zdHJ1Y3R1 cmVzX2Jhc2UgdG8gMHglcCBsZW5ndGggJWQgIiwKKwkJCXNtYmlvc19zdHJ1Y3R1cmVzX2Jhc2Us CisJCQlzbWJpb3NfZW50cnlfcG9pbnQtPnN0cnVjdF90YWJsZV9sZW5ndGgpOworCVNNX0JJT1Nf REVCVUcoIiBub19vZl9zdHJ1Y3R1cmVzOiVkXG4iLAorCQkJc21iaW9zX2VudHJ5X3BvaW50LT5u b19vZl9zdHJ1Y3R1cmVzKTsKKworCXAgPSAodW5zaWduZWQgY2hhciAqKXNtYmlvc19zdHJ1Y3R1 cmVzX2Jhc2U7CisJZm9yIChpID0gMDsgaSA8IHNtYmlvc19lbnRyeV9wb2ludC0+c3RydWN0X3Rh YmxlX2xlbmd0aDsgaSsrKSB7CisJCWlmICgocFtpXSA9PSAweGMwKSAmJiAocFtpKzFdID09IDB4 MDYpKSB7CisJCQlTTV9CSU9TX0RFQlVHKCJGb3VuZCAweGMwIGF0IG9mZnNldDolZCAweCUwMngg MHglMDJ4ICIsCisJCQkJaSwgcFtpXSwgcFtpKzFdKTsKKwkJCVNNX0JJT1NfREVCVUcoIjB4JTAy eCAweCUwMnggMHglMDJ4IDB4JTAyeFxuXHQiLAorCQkJCXBbaSsyXSwgcFtpKzNdLCBwW2krNF0s IHBbaSs1XSk7CisJCSpjb25maWcwID0gcFtpKzRdOworCQkqY29uZmlnMSA9IHBbaSs1XTsKKwkJ cmVzdWx0ID0gMDsKKwkJYnJlYWs7CisJCX0KKwl9CisJaW91bm1hcChzbWJpb3Nfc3RydWN0dXJl c19iYXNlKTsKKwlpb3VubWFwKHNtYmlvc19iYXNlKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisv KgorICogTG9vayB1cCBhbiBYUlVTQiBzdHJ1Y3R1cmUgYnkgaW5kZXguIElmIGZvdW5kIGFuZCBu b3QgZGlzY29ubmVjdGVkLAorICogaW5jcmVtZW50IGl0cyByZWZjb3VudCBhbmQgcmV0dXJuIGl0 IHdpdGggaXRzIG11dGV4IGhlbGQuCisgKi8KKworc3RhdGljIHN0cnVjdCB4cnVzYiAqeHJ1c2Jf Z2V0X2J5X2luZGV4KHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNi OworCisJbXV0ZXhfbG9jaygmeHJ1c2JfdGFibGVfbG9jayk7CisJeHJ1c2IgPSB4cnVzYl90YWJs ZVtpbmRleF07CisJaWYgKHhydXNiKSB7CisJCW11dGV4X2xvY2soJnhydXNiLT5tdXRleCk7CisJ CWlmICh4cnVzYi0+ZGlzY29ubmVjdGVkKSB7CisJCQltdXRleF91bmxvY2soJnhydXNiLT5tdXRl eCk7CisJCQl4cnVzYiA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQl0dHlfcG9ydF9nZXQoJnhydXNi LT5wb3J0KTsKKwkJCW11dGV4X3VubG9jaygmeHJ1c2ItPm11dGV4KTsKKwkJfQorCX0KKwltdXRl eF91bmxvY2soJnhydXNiX3RhYmxlX2xvY2spOworCXJldHVybiB4cnVzYjsKK30KKworLyoKKyAq IFRyeSB0byBmaW5kIGFuIGF2YWlsYWJsZSBtaW5vciBudW1iZXIgYW5kIGlmIGZvdW5kLCBhc3Nv Y2lhdGUgaXQgd2l0aAorICogJ3hydXNiJy4KKyAqLworc3RhdGljIGludCB4cnVzYl9hbGxvY19t aW5vcihzdHJ1Y3QgeHJ1c2IgKnhydXNiKQoreworCWludCBtaW5vcjsKKworCW11dGV4X2xvY2so JnhydXNiX3RhYmxlX2xvY2spOworCWZvciAobWlub3IgPSAwOyBtaW5vciA8IFhSVVNCX1RUWV9N SU5PUlM7IG1pbm9yKyspIHsKKwkJaWYgKCF4cnVzYl90YWJsZVttaW5vcl0pIHsKKwkJCXhydXNi X3RhYmxlW21pbm9yXSA9IHhydXNiOworCQkJYnJlYWs7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2Nr KCZ4cnVzYl90YWJsZV9sb2NrKTsKKworCXJldHVybiBtaW5vcjsKK30KKworLyogUmVsZWFzZSB0 aGUgbWlub3IgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCAneHJ1c2InLiAgKi8KK3N0YXRpYyB2b2lk IHhydXNiX3JlbGVhc2VfbWlub3Ioc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwltdXRleF9sb2Nr KCZ4cnVzYl90YWJsZV9sb2NrKTsKKwl4cnVzYl90YWJsZVt4cnVzYi0+bWlub3JdID0gTlVMTDsK KwltdXRleF91bmxvY2soJnhydXNiX3RhYmxlX2xvY2spOworfQorCisvKgorICogRnVuY3Rpb25z IGZvciBYUlVTQiBjb250cm9sIG1lc3NhZ2VzLgorICovCisKK3N0YXRpYyBpbnQgeHJ1c2JfY3Ry bF9tc2coc3RydWN0IHhydXNiICp4cnVzYiwKKwkJaW50IHJlcXVlc3QsIGludCB2YWx1ZSwJdm9p ZCAqYnVmLCBpbnQgbGVuKQoreworCWludCBydiA9IHVzYl9jb250cm9sX21zZyh4cnVzYi0+ZGV2 LAorCQl1c2Jfc25kY3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCisJCXJlcXVlc3QsCisJCVVTQl9S VF9YUlVTQiwKKwkJdmFsdWUsCisJCXhydXNiLT5jb250cm9sLT5hbHRzZXR0aW5nWzBdLmRlc2Mu YkludGVyZmFjZU51bWJlciwKKwkJYnVmLAorCQlsZW4sCisJCTUwMDApOworCWRldl9kYmcoJnhy dXNiLT5jb250cm9sLT5kZXYsCisJCSIlcyAtIHJxIDB4JTAyeCwgdmFsICUjeCwgbGVuICUjeCwg cmVzdWx0ICVkXG4iLAorCQlfX2Z1bmNfXywgcmVxdWVzdCwgdmFsdWUsIGxlbiwgcnYpOworCXJl dHVybiBydiA8IDAgPyBydiA6IDA7Cit9CisKK2ludCB4cnVzYl9zZXRfcmVnKHN0cnVjdCB4cnVz YiAqeHJ1c2IsIGludCByZWdudW0sIGludCB2YWx1ZSkKK3sKKwlpbnQgcmVzdWx0OworCWludCBj aGFubmVsID0gMDsKKwlpbnQgWFIyMjgweGFkZHIgPSBYUjIyODB4X0ZVTkNfTUdSX09GRlNFVCAr IHJlZ251bTsKKworCWlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweGZmZjApID09IDB4MTQw MCkgeworCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coeHJ1c2ItPmRldiwJCS8vIHVzYiBkZXZp Y2UKKwkJCXVzYl9zbmRjdHJscGlwZSh4cnVzYi0+ZGV2LCAwKSwJCS8vIGVuZHBvaW50IHBpcGUK KwkJCVhSVVNCX1NFVF9YUjIyODBYLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfT1VUIHwgVVNC X1RZUEVfVkVORE9SLAkJLy8gcmVxdWVzdF90eXBlCisJCQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3Qg dmFsdWUKKwkJCVhSMjI4MHhhZGRyLAkJCQkvLyBpbmRleAorCQkJTlVMTCwJCQkJCS8vIGRhdGEK KwkJCTAsCQkJCQkvLyBzaXplCisJCQk1MDAwKTsJCQkJCS8vIHRpbWVvdXQKKwl9IGVsc2UgaWYg KCh4cnVzYi0+RGV2aWNlUHJvZHVjdCAmIDB4ZmZmMCkgPT0gMHgxNDIwKSB7CisJCWNoYW5uZWwg PSAoeHJ1c2ItPmNoYW5uZWwgLSA0KSoyOworCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coeHJ1 c2ItPmRldiwJCS8vIHVzYiBkZXZpY2UKKwkJCXVzYl9zbmRjdHJscGlwZSh4cnVzYi0+ZGV2LCAw KSwJCS8vIGVuZHBvaW50IHBpcGUKKwkJCVhSVVNCX1NFVF9YUjIxQjE0MlgsCQkJLy8gcmVxdWVz dAorCQkJVVNCX0RJUl9PVVQgfCBVU0JfVFlQRV9WRU5ET1IgfCAxLAkvLyByZXF1ZXN0X3R5cGUK KwkJCXZhbHVlLAkJCQkJLy8gcmVxdWVzdCB2YWx1ZQorCQkJcmVnbnVtIHwgKGNoYW5uZWwgPDwg OCksCQkvLyBpbmRleAorCQkJTlVMTCwJCQkJCS8vIGRhdGEKKwkJCTAsCQkJCQkvLyBzaXplCisJ CQk1MDAwKTsJCQkJCS8vIHRpbWVvdXQKKwl9IGVsc2UgaWYgKHhydXNiLT5EZXZpY2VQcm9kdWN0 ID09IDB4MTQxMSkgeworCQlyZXN1bHQgPSB1c2JfY29udHJvbF9tc2coeHJ1c2ItPmRldiwJLy8g dXNiIGRldmljZQorCQkJdXNiX3NuZGN0cmxwaXBlKHhydXNiLT5kZXYsIDApLAkvLyBlbmRwb2lu dCBwaXBlCisJCQlYUlVTQl9TRVRfWFIyMUIxNDExLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJf T1VUIHwgVVNCX1RZUEVfVkVORE9SLAkJLy8gcmVxdWVzdF90eXBlCisJCQl2YWx1ZSwJCQkJCS8v IHJlcXVlc3QgdmFsdWUKKwkJCXJlZ251bSwJCQkJCS8vIGluZGV4CisJCQlOVUxMLAkJCQkJLy8g ZGF0YQorCQkJMCwJCQkJCS8vIHNpemUKKwkJCTUwMDApOwkJCQkJLy8gdGltZW91dAorCX0gZWxz ZSBpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHhmZmYwKSA9PSAweDE0MTApIHsKKwkJaWYg KHhydXNiLT5jaGFubmVsKQorCQkJY2hhbm5lbCA9IHhydXNiLT5jaGFubmVsIC0gMTsKKwkJcmVz dWx0ID0gdXNiX2NvbnRyb2xfbXNnKHhydXNiLT5kZXYsCS8vIHVzYiBkZXZpY2UKKwkJCXVzYl9z bmRjdHJscGlwZSh4cnVzYi0+ZGV2LCAwKSwJLy8gZW5kcG9pbnQgcGlwZQorCQkJWFJVU0JfU0VU X1hSMjFWMTQxWCwJCQkvLyByZXF1ZXN0CisJCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRP UiwJCS8vIHJlcXVlc3RfdHlwZQorCQkJdmFsdWUsCQkJCQkvLyByZXF1ZXN0IHZhbHVlCisJCQly ZWdudW0gfCAoY2hhbm5lbCA8PCA4KSwJCS8vIGluZGV4CisJCQlOVUxMLAkJCQkJLy8gZGF0YQor CQkJMCwJCQkJCS8vIHNpemUKKwkJCTUwMDApOwkJCQkJLy8gdGltZW91dAorCX0gZWxzZQorCQly ZXN1bHQgPSAtMTsKKworCWlmIChyZXN1bHQgPCAwKQorCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJv bC0+ZGV2LAorCQkJIiVzIEVycm9yOiVkXG4iLCBfX2Z1bmNfXywgcmVzdWx0KTsKKworCXJldHVy biByZXN1bHQ7Cit9CisKKy8qIFdyaXRlIHRvIFVBUlQgQmxvY2sgcmVnaXN0ZXJzIGluIFhSMjFW MTQxeCAqLworaW50IHhydXNiX3NldF9ibG9ja19yZWcoc3RydWN0IHhydXNiICp4cnVzYiwgaW50 IGJsb2NrLCBpbnQgcmVnbnVtLCBpbnQgdmFsdWUpCit7CisJaW50IHJlc3VsdDsKKworCXJlc3Vs dCA9IHVzYl9jb250cm9sX21zZyh4cnVzYi0+ZGV2LAkJLy8gdXNiIGRldmljZQorCQl1c2Jfc25k Y3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCQkvLyBlbmRwb2ludCBwaXBlCisJCVhSVVNCX1NFVF9Y UjIxVjE0MVgsCQkJLy8gcmVxdWVzdAorCQlVU0JfRElSX09VVCB8IFVTQl9UWVBFX1ZFTkRPUiwJ CS8vIHJlcXVlc3RfdHlwZQorCQl2YWx1ZSwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJcmVnbnVt IHwgKGJsb2NrIDw8IDgpLAkJCS8vIGluZGV4CisJCU5VTEwsCQkJCQkvLyBkYXRhCisJCTAsCQkJ CQkvLyBzaXplCisJCTUwMDApOwkJCQkJLy8gdGltZW91dAorCisJaWYgKHJlc3VsdCA8IDApCisJ CWRldl9lcnIoJnhydXNiLT5jb250cm9sLT5kZXYsICIlcyBFcnJvcjolZFxuIiwKKwkJCV9fZnVu Y19fLCByZXN1bHQpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IHhydXNiX2dldF9yZWco c3RydWN0IHhydXNiICp4cnVzYiwgaW50IHJlZ251bSwgc2hvcnQgKnZhbHVlKQoreworCWludCBy ZXN1bHQ7CisJaW50IGNoYW5uZWwgPSAwOworCWludCBYUjIyODB4YWRkciA9IFhSMjI4MHhfRlVO Q19NR1JfT0ZGU0VUICsgcmVnbnVtOworCXZvaWQgKmRtYWRhdGEgPSBrbWFsbG9jKDIsIEdGUF9L RVJORUwpOworCisJaWYgKCFkbWFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICgoeHJ1 c2ItPkRldmljZVByb2R1Y3QgJiAweGZmZjApID09IDB4MTQwMCkgeworCQlyZXN1bHQgPSB1c2Jf Y29udHJvbF9tc2coeHJ1c2ItPmRldiwJLy8gdXNiIGRldmljZQorCQkJdXNiX3JjdmN0cmxwaXBl KHhydXNiLT5kZXYsIDApLAkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVTQl9HRVRfWFIyMjgwWCwJ CQkvLyByZXF1ZXN0CisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SLAkJLy8gcmVxdWVz dF90eXBlCisJCQkwLAkJCQkJLy8gcmVxdWVzdCB2YWx1ZQorCQkJWFIyMjgweGFkZHIsCQkJCS8v IGluZGV4CisJCQlkbWFkYXRhLAkJCQkvLyBkYXRhCisJCQkyLAkJCQkJLy8gc2l6ZQorCQkJNTAw MCk7CQkJCQkvLyB0aW1lb3V0CisJCW1lbWNweSh2YWx1ZSwgZG1hZGF0YSwgMik7CisJfSBlbHNl IGlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweGZmZjApID09IDB4MTQyMCkgeworCQljaGFu bmVsID0gKHhydXNiLT5jaGFubmVsIC0gNCkqMjsKKwkJcmVzdWx0ID0gdXNiX2NvbnRyb2xfbXNn KHhydXNiLT5kZXYsCS8vIHVzYiBkZXZpY2UKKwkJCXVzYl9yY3ZjdHJscGlwZSh4cnVzYi0+ZGV2 LCAwKSwJLy8gZW5kcG9pbnQgcGlwZQorCQkJWFJVU0JfR0VUX1hSMjFCMTQyWCwJCQkvLyByZXF1 ZXN0CisJCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVORE9SIHwgMSwJLy8gcmVxdWVzdF90eXBl CisJCQkwLAkJCQkJLy8gcmVxdWVzdCB2YWx1ZQorCQkJcmVnbnVtIHwgKGNoYW5uZWwgPDwgOCks CQkvLyBpbmRleAorCQkJZG1hZGF0YSwJCQkJLy8gZGF0YQorCQkJMiwJCQkJCS8vIHNpemUKKwkJ CTUwMDApOwkJCQkJLy8gdGltZW91dAorCQkJbWVtY3B5KHZhbHVlLCBkbWFkYXRhLCAyKTsKKwl9 IGVsc2UgaWYgKHhydXNiLT5EZXZpY2VQcm9kdWN0ID09IDB4MTQxMSkgeworCQlyZXN1bHQgPSB1 c2JfY29udHJvbF9tc2coeHJ1c2ItPmRldiwJLy8gdXNiIGRldmljZQorCQkJdXNiX3JjdmN0cmxw aXBlKHhydXNiLT5kZXYsIDApLAkvLyBlbmRwb2ludCBwaXBlCisJCQlYUlVTQl9HRVRfWFIyMUIx NDExLAkJCS8vIHJlcXVlc3QKKwkJCVVTQl9ESVJfSU4gfCBVU0JfVFlQRV9WRU5ET1IsCQkvLyBy ZXF1ZXN0X3R5cGUKKwkJCTAsCQkJCQkvLyByZXF1ZXN0IHZhbHVlCisJCQlyZWdudW0sCQkJCQkv LyBpbmRleAorCQkJZG1hZGF0YSwJCQkJLy8gZGF0YQorCQkJMiwJCQkJCS8vIHNpemUKKwkJCTUw MDApOwkJCQkJLy8gdGltZW91dAorCQkJbWVtY3B5KHZhbHVlLCBkbWFkYXRhLCAyKTsKKwl9IGVs c2UgaWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVjdCAmIDB4ZmZmMCkgPT0gMHgxNDEwKSB7CisJCWlm ICh4cnVzYi0+Y2hhbm5lbCkKKwkJCWNoYW5uZWwgPSB4cnVzYi0+Y2hhbm5lbCAtIDE7CisJCXJl c3VsdCA9IHVzYl9jb250cm9sX21zZyh4cnVzYi0+ZGV2LAkvLyB1c2IgZGV2aWNlCisJCQl1c2Jf cmN2Y3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCS8vIGVuZHBvaW50IHBpcGUKKwkJCVhSVVNCX0dF VF9YUjIxVjE0MVgsCQkJLy8gcmVxdWVzdAorCQkJVVNCX0RJUl9JTiB8IFVTQl9UWVBFX1ZFTkRP UiwJCS8vIHJlcXVlc3RfdHlwZQorCQkJMCwJCQkJCS8vIHJlcXVlc3QgdmFsdWUKKwkJCXJlZ251 bSB8IChjaGFubmVsIDw8IDgpLAkJLy8gaW5kZXgKKwkJCWRtYWRhdGEsCQkJCS8vIGRhdGEKKwkJ CTEsCQkJCQkvLyBzaXplCisJCQk1MDAwKTsJCQkJCS8vIHRpbWVvdXQKKwkJCW1lbWNweSh2YWx1 ZSwgZG1hZGF0YSwgMSk7CisJfSBlbHNlCisJCXJlc3VsdCA9IC0xOworCisJaWYgKHJlc3VsdCA8 IDApIHsKKwkJZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCSIlcyBjaGFubmVsOiVk IFJlZyAweCV4CUVycm9yOiVkXG4iLAorCQkJX19mdW5jX18sIGNoYW5uZWwsIHJlZ251bSwgcmVz dWx0KTsKKwl9CisJa2ZyZWUoZG1hZGF0YSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworLyogUmVh ZCBmcm9tIFVBUlQgQmxvY2sgcmVnaXN0ZXJzIGluIFhSMjFWMTQxeCAqLworaW50IHhydXNiX2dl dF9ibG9ja19yZWcoc3RydWN0IHhydXNiICp4cnVzYiwgaW50IGJsb2NrLAorCWludCByZWdudW0s IHNob3J0ICp2YWx1ZSkKK3sKKwlpbnQgcmVzdWx0OworCXZvaWQgKmRtYWRhdGEgPSBrbWFsbG9j KDIsIEdGUF9LRVJORUwpOworCisJaWYgKCFkbWFkYXRhKQorCQlyZXR1cm4gLUVOT01FTTsKKwor CXJlc3VsdCA9IHVzYl9jb250cm9sX21zZyh4cnVzYi0+ZGV2LAkJLy8gdXNiIGRldmljZQorCQl1 c2JfcmN2Y3RybHBpcGUoeHJ1c2ItPmRldiwgMCksCQkvLyBlbmRwb2ludCBwaXBlCisJCVhSVVNC X0dFVF9YUjIxVjE0MVgsCQkJLy8gcmVxdWVzdAorCQlVU0JfRElSX0lOIHwgVVNCX1RZUEVfVkVO RE9SLAkJLy8gcmVxdWVzdF90eXBlCisJCTAsCQkJCQkvLyByZXF1ZXN0IHZhbHVlCisJCXJlZ251 bSB8IChibG9jayA8PCA4KSwJCQkvLyBpbmRleAorCQlkbWFkYXRhLAkJCQkvLyBkYXRhCisJCTEs CQkJCQkvLyBzaXplCisJCTUwMDApOwkJCQkJLy8gdGltZW91dAorCW1lbWNweSh2YWx1ZSwgZG1h ZGF0YSwgMSk7CisKKwlpZiAocmVzdWx0IDwgMCkgeworCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJv bC0+ZGV2LCAiJXMgRXJyb3I6JWRcbiIsCisJCQlfX2Z1bmNfXywgcmVzdWx0KTsKKwl9CisJa2Zy ZWUoZG1hZGF0YSk7CisJcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGNoZWNrX3BvcnRwYXJhbWZp bGUoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwljaGFyIGZpbGVuYW1lWzI1Nl07CisJaW50IGxl dmVsX251bSwgcG9ydF9udW0sIGNoYW5uZWxfbnVtLCBjb25maWdfbnVtOworCisJbWVtc2V0KGZp bGVuYW1lLCAwLCBzaXplb2YoZmlsZW5hbWUpKTsKKworCWxldmVsX251bSA9IHhydXNiLT5kZXYt PmxldmVsOworCXBvcnRfbnVtID0geHJ1c2ItPmRldi0+cG9ydG51bTsKKwljaGFubmVsX251bSA9 IHhydXNiLT5jaGFubmVsICUgNDsKKworCS8vIGNvbmZpZ19udW0gaXMgYSB1bmlxdWUgbnVtYmVy IGlkZW50aWZ5aW5nIFVTQiBsZXZlbCwgVVNCIHBvcnQKKwkvLyBhbmQgVUFSVC9zZXJpYWwgcG9y dCBjaGFubmVsLiBEcml2ZXIgYXNzdW1lcyB0aGF0IGRldmljZXMgYXJlCisJLy8gcGx1Z2dlZCBp bnRvIGEgc2luZ2xlIFVTQiBodWIgYXQgZWFjaCBsZXZlbC4KKwljb25maWdfbnVtID0gKGxldmVs X251bSAqIDEwMCkgKyAocG9ydF9udW0gKiAxMCkgKyBjaGFubmVsX251bTsKKworCXNwcmludGYo ZmlsZW5hbWUsICIvZXRjL3BvcnRfY29uZmlnJWQiLCBjb25maWdfbnVtKTsKKworCXBvcnRfcGFy YW1fZmlsZVtjb25maWdfbnVtXSA9CisJCWZpbHBfb3BlbihmaWxlbmFtZSwgT19SRFdSIHwgT19M QVJHRUZJTEUsIDA2MDApOworCWlmIChJU19FUlIocG9ydF9wYXJhbV9maWxlW2NvbmZpZ19udW1d KSkgeworCQl4cnVzYi0+aGF2ZV90eGN2cl9jb25maWcgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJ ZmlscF9jbG9zZShwb3J0X3BhcmFtX2ZpbGVbY29uZmlnX251bV0sIE5VTEwpOworCXhydXNiLT5o YXZlX3R4Y3ZyX2NvbmZpZyA9IDE7CisJcmV0dXJuIDE7Cit9CisKK2ludCBsb2FkX3BvcnRwYXJh bWZpbGUoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgbGVuZ3RoOworCWxvZmZfdCBvZmZz ZXQgPSAwOworCW1tX3NlZ21lbnRfdCBvbGRfZnM7CisJY2hhciBmaWxlbmFtZVsyNTZdOworCWlu dCBsZXZlbF9udW0sIHBvcnRfbnVtLCBjaGFubmVsX251bSwgY29uZmlnX251bTsKKworCW1lbXNl dChmaWxlbmFtZSwgMCwgc2l6ZW9mKGZpbGVuYW1lKSk7CisKKwlsZXZlbF9udW0gPSB4cnVzYi0+ ZGV2LT5sZXZlbDsKKwlwb3J0X251bSA9IHhydXNiLT5kZXYtPnBvcnRudW07CisJY2hhbm5lbF9u dW0gPSB4cnVzYi0+Y2hhbm5lbCAlIDQ7CisKKwkvLyBjb25maWdfbnVtIGlzIGEgdW5pcXVlIG51 bWJlciBpZGVudGlmeWluZyBVU0IgbGV2ZWwsIFVTQiBwb3J0CisJLy8gYW5kIFVBUlQvc2VyaWFs IHBvcnQgY2hhbm5lbC4gRHJpdmVyIGFzc3VtZXMgdGhhdCBkZXZpY2VzIGFyZQorCS8vIHBsdWdn ZWQgaW50byBhIHNpbmdsZSBVU0IgaHViIGF0IGVhY2ggbGV2ZWwuCisJY29uZmlnX251bSA9IChs ZXZlbF9udW0gKiAxMDApICsgKHBvcnRfbnVtICogMTApICsgY2hhbm5lbF9udW07CisKKwlzcHJp bnRmKGZpbGVuYW1lLCAiL2V0Yy9wb3J0X2NvbmZpZyVkIiwgY29uZmlnX251bSk7CisKKwlwb3J0 X3BhcmFtX2ZpbGVbY29uZmlnX251bV0gPQorCQlmaWxwX29wZW4oZmlsZW5hbWUsIE9fUkRXUiB8 IE9fTEFSR0VGSUxFLCAwNjAwKTsKKwlpZiAoSVNfRVJSKHBvcnRfcGFyYW1fZmlsZVtjb25maWdf bnVtXSkpIHsKKwkJZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwgImZpbHBfb3BlbiBmYWls ZWRcbiIpOworCQlyZXR1cm4gUFRSX0VSUihwb3J0X3BhcmFtX2ZpbGVbY29uZmlnX251bV0pOwor CX0KKwlvbGRfZnMgPSBnZXRfZnMoKTsKKwlzZXRfZnMoS0VSTkVMX0RTKTsKKwlsZW5ndGggPSB2 ZnNfcmVhZChwb3J0X3BhcmFtX2ZpbGVbY29uZmlnX251bV0sCisJCShjaGFyICopICYoeHJ1c2It PnBvcnRfc2V0dGluZyksCisJCXNpemVvZihzdHJ1Y3QgeHJ1c2Jfc2V0dGluZyksCisJCSZvZmZz ZXQpOworCS8vZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwgInZmc19yZWFkIDolZFxuIiwg bGVuZ3RoKTsKKwlzZXRfZnMob2xkX2ZzKTsKKwlmaWxwX2Nsb3NlKHBvcnRfcGFyYW1fZmlsZVtj b25maWdfbnVtXSwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB1cGRhdGVfcG9ydHBhcmFt ZmlsZShzdHJ1Y3QgeHJ1c2IgKnhydXNiKQoreworCWludCBsZW5ndGg7CisJbG9mZl90IG9mZnNl dCA9IDA7CisJbW1fc2VnbWVudF90IG9sZF9mczsKKwljaGFyIGZpbGVuYW1lWzI1Nl07CisJaW50 IGxldmVsX251bSwgcG9ydF9udW0sIGNoYW5uZWxfbnVtLCBjb25maWdfbnVtOworCisJbWVtc2V0 KGZpbGVuYW1lLCAwLCBzaXplb2YoZmlsZW5hbWUpKTsKKworCWxldmVsX251bSA9IHhydXNiLT5k ZXYtPmxldmVsOworCXBvcnRfbnVtID0geHJ1c2ItPmRldi0+cG9ydG51bTsKKwljaGFubmVsX251 bSA9IHhydXNiLT5jaGFubmVsICUgNDsKKworCS8vIGNvbmZpZ19udW0gaXMgYSB1bmlxdWUgbnVt YmVyIGlkZW50aWZ5aW5nIFVTQiBsZXZlbCwgVVNCIHBvcnQKKwkvLyBhbmQgVUFSVC9zZXJpYWwg cG9ydCBjaGFubmVsLiBEcml2ZXIgYXNzdW1lcyB0aGF0IGRldmljZXMgYXJlCisJLy8gcGx1Z2dl ZCBpbnRvIGEgc2luZ2xlIFVTQiBodWIgYXQgZWFjaCBsZXZlbC4KKwljb25maWdfbnVtID0gKGxl dmVsX251bSAqIDEwMCkgKyAocG9ydF9udW0gKiAxMCkgKyBjaGFubmVsX251bTsKKworCXNwcmlu dGYoZmlsZW5hbWUsICIvZXRjL3BvcnRfY29uZmlnJWQiLCBjb25maWdfbnVtKTsKKwlwb3J0X3Bh cmFtX2ZpbGVbY29uZmlnX251bV0gPQorCQlmaWxwX29wZW4oZmlsZW5hbWUsIE9fQ1JFQVQgfCBP X1JEV1IgfCBPX0xBUkdFRklMRSwgMDYwMCk7CisJaWYgKElTX0VSUihwb3J0X3BhcmFtX2ZpbGVb Y29uZmlnX251bV0pKSB7CisJCWRldl9lcnIoJnhydXNiLT5jb250cm9sLT5kZXYsICJmaWxwX29w ZW4gZmFpbGVkXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIocG9ydF9wYXJhbV9maWxlW2NvbmZpZ19u dW1dKTsKKwl9CisJb2xkX2ZzID0gZ2V0X2ZzKCk7CisJc2V0X2ZzKEtFUk5FTF9EUyk7CisJbGVu Z3RoID0gdmZzX3dyaXRlKHBvcnRfcGFyYW1fZmlsZVtjb25maWdfbnVtXSwKKwkJKGNoYXIgKikg Jih4cnVzYi0+cG9ydF9zZXR0aW5nKSwKKwkJc2l6ZW9mKHN0cnVjdCB4cnVzYl9zZXR0aW5nKSwK KwkJJm9mZnNldCk7CisJaWYgKGxlbmd0aCAhPSBzaXplb2Yoc3RydWN0IHhydXNiX3NldHRpbmcp KSB7CisJCWRldl9lcnIoJnhydXNiLT5jb250cm9sLT5kZXYsICJ2ZnNfd3JpdGUgZmFpbGVkIDol ZFxuIiwgbGVuZ3RoKTsKKwkJc2V0X2ZzKG9sZF9mcyk7CisJCWZpbHBfY2xvc2UocG9ydF9wYXJh bV9maWxlW2NvbmZpZ19udW1dLCBOVUxMKTsKKwkJcmV0dXJuIC0xOworCX0KKwkvL2Rldl9lcnIo JnhydXNiLT5jb250cm9sLT5kZXYsICJzdWNjZXNzZnVsIHZmc193cml0ZSA6JWRcbiIsIGxlbmd0 aCk7CisJc2V0X2ZzKG9sZF9mcyk7CisJZmlscF9jbG9zZShwb3J0X3BhcmFtX2ZpbGVbY29uZmln X251bV0sIE5VTEwpOworCXhydXNiLT5oYXZlX3R4Y3ZyX2NvbmZpZyA9IDE7CisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgc2V0X3R4Y3ZyX21vZGUoc3RydWN0IHhydXNiICp4cnVzYiwgdW5z aWduZWQgaW50IG1vZGUpCit7CisJdW5zaWduZWQgc2hvcnQgdG1wX3ZhbHVlOworCWludCBydjsK Kwl1bnNpZ25lZCBpbnQgbW9kZTFfbWFzaywgbW9kZTBfbWFzazsKKworCW1vZGUxX21hc2sgPSAo MTw8KHhydXNiLT5wb3J0X3NldHRpbmcudHhjdnJfbW9kZTFfcGluKSk7CisJbW9kZTBfbWFzayA9 ICgxPDwoeHJ1c2ItPnBvcnRfc2V0dGluZy50eGN2cl9tb2RlMF9waW4pKTsKKwl0bXBfdmFsdWUg PSAwOworCisJZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwgIkNoICVkOiAiLCAoeHJ1c2It PmNoYW5uZWwgJSA0KSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIDA6CisJCWRldl9lcnIo JnhydXNiLT5jb250cm9sLT5kZXYsICJUcmFuc2NlaXZlciBNb2RlID0gTE9PUEJBQ0tcbiIpOwor CQl0bXBfdmFsdWUgJj0gfm1vZGUwX21hc2s7CisJCXRtcF92YWx1ZSAmPSB+bW9kZTFfbWFzazsK KwkJYnJlYWs7CisJY2FzZSAxOgorCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiVHJh bnNjZWl2ZXIgTW9kZSA9IFJTMjMyXG4iKTsKKwkJdG1wX3ZhbHVlIHw9IG1vZGUwX21hc2s7CisJ CXRtcF92YWx1ZSAmPSB+bW9kZTFfbWFzazsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlkZXZfZXJy KCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJIlRyYW5zY2VpdmVyIE1vZGUgPSBSUzQ4NSBIYWxm LUR1cGxleFxuIik7CisJCXRtcF92YWx1ZSAmPSB+bW9kZTBfbWFzazsKKwkJdG1wX3ZhbHVlIHw9 IG1vZGUxX21hc2s7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJZGV2X2VycigmeHJ1c2ItPmNvbnRy b2wtPmRldiwKKwkJCSJUcmFuc2NlaXZlciBNb2RlID0gUlM0ODUvUlM0MjIgRnVsbC1EdXBsZXhc biIpOworCQl0bXBfdmFsdWUgfD0gbW9kZTBfbWFzazsKKwkJdG1wX3ZhbHVlIHw9IG1vZGUxX21h c2s7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWRldl9lcnIoJnhydXNiLT5jb250cm9sLT5kZXYs CisJCQkiSW52YWxpZCBQYXJhbWV0ZXIuIE5vIG1vZGUgY2hhbmdlLlxuIik7CisJCWJyZWFrOwor CX0KKworCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlv X3NldCwKKwkJCShpbnQpdG1wX3ZhbHVlKTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gLUVGQVVM VDsKKworCXRtcF92YWx1ZSA9IH50bXBfdmFsdWU7CisJdG1wX3ZhbHVlICY9IChtb2RlMV9tYXNr IHwgbW9kZTBfbWFzayk7CisJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21h cC51YXJ0X2dwaW9fY2xyLAorCQkJKGludCl0bXBfdmFsdWUpOworCWlmIChydiA8IDApCisJCXJl dHVybiAtRUZBVUxUOworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCBzZXRfcnM0ODVfcGlu KHN0cnVjdCB4cnVzYiAqeHJ1c2IsIHVuc2lnbmVkIGludCBvcHRpb24pCit7CisJc2hvcnQgcmVn X3ZhbHVlOworCWludCBydjsKKworCXJ2ID0geHJ1c2JfZ2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJl Z19tYXAudWFydF9ncGlvX21vZGUsICZyZWdfdmFsdWUpOworCWlmIChydiA8IDApCisJCXJldHVy biAtRUZBVUxUOworCisJLy9kZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAic2V0X3JzNDg1 X3BpbiBvcHRpb24gPSAlZFxuIiwgb3B0aW9uKTsKKworCXN3aXRjaCAob3B0aW9uKSB7CisJY2Fz ZSAwOgkvLyBkaXNhYmxlIFJTNDg1IHBpbgorCQlyZWdfdmFsdWUgJj0gKEdQSU85X1JYVCB8IEdQ SU84X1RYVCk7CisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFy dF9ncGlvX21vZGUsCisJCQkJKGludClyZWdfdmFsdWUpOworCQlpZiAocnYgPCAwKQorCQkJcmV0 dXJuIC1FRkFVTFQ7CisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAu dWFydF9mbG93LAorCQkJVUFSVF9GTE9XX01PREVfTk9ORSk7CisJCWlmIChydiA8IDApCisJCQly ZXR1cm4gLUVGQVVMVDsKKwkJYnJlYWs7CisJY2FzZSA1OiAvLyBlbmFibGUgR1BJTzUvUlRTIGFz IGFjdGl2ZS1oaWdoIFJTLTQ4NSBjb250cm9sIG91dHB1dAorCQlyZWdfdmFsdWUgPSBVQVJUX0dQ SU9fTU9ERV9ESVJfUlRTX0hJOworCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5y ZWdfbWFwLnVhcnRfZ3Bpb19tb2RlLAorCQkJCShpbnQpcmVnX3ZhbHVlKTsKKwkJaWYgKHJ2IDwg MCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNi LT5yZWdfbWFwLnVhcnRfZmxvdywKKwkJCVVBUlRfRkxPV19NT0RFX05PTkUpOworCQlpZiAocnYg PCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgNzogLy8gRW5hYmxlIEdQ SU83L1hFTiBhcyBhY3RpdmUtaGlnaCBSUy00ODUgY29udHJvbCBvdXRwdXQKKwkJcmVnX3ZhbHVl ID0gVUFSVF9HUElPX01PREVfRElSX1hFTl9ISTsKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNi LCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwKKwkJCQkoaW50KXJlZ192YWx1ZSk7CisJ CWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhy dXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2Zsb3csCisJCQlVQVJUX0ZMT1dfTU9ERV9OT05FKTsK KwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsKKwlkZWZhdWx0OiAv LyBJbnZhbGlkIG9wdGlvbgorCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisKKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBzZXRfdHhjdnJfdGVybV9tb2RlKHN0cnVjdCB4cnVzYiAqeHJ1c2IsIHVu c2lnbmVkIGludCBvcHRpb24pCit7CisJdW5zaWduZWQgaW50IHRlcm1fbWFzazsKKwlpbnQgcnY7 CisKKwl0ZXJtX21hc2sgPSAgKDE8PCh4cnVzYi0+cG9ydF9zZXR0aW5nLnR4Y3ZyX3Rlcm1fcGlu KSk7CisKKwlpZiAob3B0aW9uKSB7IC8vU2V0IEdQSU8gcGluIEhpZ2gKKwkJcnYgPSB4cnVzYl9z ZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fc2V0LAorCQkJCXRlcm1fbWFz ayk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9IGVsc2UgeyAvL1NldCBH UElPIHBpbiBMb3cKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51 YXJ0X2dwaW9fY2xyLAorCQkJCXRlcm1fbWFzayk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4g LUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW50IHNldF90eGN2cl9zbGV3X21v ZGUoc3RydWN0IHhydXNiICp4cnVzYiwgdW5zaWduZWQgaW50IG9wdGlvbikKK3sKKwlpbnQgcnY7 CisJdW5zaWduZWQgaW50IHNsZXdfbWFzazsKKworCXNsZXdfbWFzayA9ICAoMTw8KHhydXNiLT5w b3J0X3NldHRpbmcudHhjdnJfc2xld19waW4pKTsKKwlpZiAob3B0aW9uKSB7IC8vU2xldyBwaW4g aXMgaGlnaAorCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRf Z3Bpb19zZXQsCisJCQlzbGV3X21hc2spOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFV TFQ7CisJfSBlbHNlIHsgLy8gU2xldyBwaW4gaXMgbG93CisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4 cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX2NsciwKKwkJCXNsZXdfbWFzayk7CisJCWlm IChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBp bml0X3BvcnRwYXJhbShzdHJ1Y3QgeHJ1c2IgKnhydXNiKQoreworCWludCBydjsKKworCWlmICh4 cnVzYi0+cG9ydF9zZXR0aW5nLnR4Y3ZyX21vZGUgPCAyKQorCQlydiA9IHNldF9yczQ4NV9waW4o eHJ1c2IsIDApOworCWVsc2UKKwkJcnYgPSBzZXRfcnM0ODVfcGluKHhydXNiLCB4cnVzYi0+cG9y dF9zZXR0aW5nLnR4Y3ZyX2Rpcl9waW4pOworCWlmIChydiA8IDApCisJCXJldHVybiAtRUZBVUxU OworCisJcnYgPSBzZXRfdHhjdnJfbW9kZSh4cnVzYiwgeHJ1c2ItPnBvcnRfc2V0dGluZy50eGN2 cl9tb2RlKTsKKwlpZiAocnYgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJ2ID0gc2V0X3R4 Y3ZyX3Rlcm1fbW9kZSh4cnVzYiwKKwkJCXhydXNiLT5wb3J0X3NldHRpbmcudGVybV9tb2RlKTsK KwlpZiAocnYgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJ2ID0gc2V0X3R4Y3ZyX3NsZXdf bW9kZSh4cnVzYiwgeHJ1c2ItPnBvcnRfc2V0dGluZy5zbGV3X21vZGUpOworCWlmIChydiA8IDAp CisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJ2OworfQorCitpbnQgeHJ1c2JfZ3Bpb19k aXJfb3V0KHN0cnVjdCB4cnVzYiAqeHJ1c2IsIGludCBncGlvX21hc2spCit7CisJaW50IHJ2ID0g MDsKKwlzaG9ydCByZWdfdmFsdWU7CisKKwlydiA9IHhydXNiX2dldF9yZWcoeHJ1c2IsIHhydXNi LT5yZWdfbWFwLnVhcnRfZ3Bpb19kaXIsICZyZWdfdmFsdWUpOworCWlmIChydiA8IDApCisJCXJl dHVybiAtRUZBVUxUOworCisJcmVnX3ZhbHVlIHw9IGdwaW9fbWFzazsKKworCXJ2ID0geHJ1c2Jf c2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX2RpciwgcmVnX3ZhbHVlKTsK KwlpZiAocnYgPCAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBydjsKK30KKworaW50 IHhydXNiX2dwaW9fZGlyX2luKHN0cnVjdCB4cnVzYiAqeHJ1c2IsIGludCBncGlvX21hc2spCit7 CisJaW50IHJ2ID0gMDsKKwlzaG9ydCByZWdfdmFsdWU7CisKKwlydiA9IHhydXNiX2dldF9yZWco eHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19kaXIsICZyZWdfdmFsdWUpOworCWlmIChy diA8IDApCisJCXJldHVybiAtRUZBVUxUOworCisJZ3Bpb19tYXNrID0gfmdwaW9fbWFzazsKKwly ZWdfdmFsdWUgJj0gZ3Bpb19tYXNrOworCisJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVz Yi0+cmVnX21hcC51YXJ0X2dwaW9fZGlyLCByZWdfdmFsdWUpOworCWlmIChydiA8IDApCisJCXJl dHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJ2OworfQorCitzdHJ1Y3QgeHIyMXYxNDF4X2JhdWRf cmF0ZSB7CisJdW5zaWduZWQgaW50IHR4OworCXVuc2lnbmVkIGludCByeDA7CisJdW5zaWduZWQg aW50IHJ4MTsgfTsKKworc3RhdGljIHN0cnVjdCB4cjIxdjE0MXhfYmF1ZF9yYXRlIHhyMjF2MTQx eF9iYXVkX3JhdGVzW10gPSB7CisJeyAweDAwMCwgMHgwMDAsIDB4MDAwIH0sCisJeyAweDAwMCwg MHgwMDAsIDB4MDAwIH0sCisJeyAweDEwMCwgMHgwMDAsIDB4MTAwIH0sCisJeyAweDAyMCwgMHg0 MDAsIDB4MDIwIH0sCisJeyAweDAxMCwgMHgxMDAsIDB4MDEwIH0sCisJeyAweDIwOCwgMHgwNDAs IDB4MjA4IH0sCisJeyAweDEwNCwgMHg4MjAsIDB4MTA4IH0sCisJeyAweDg0NCwgMHgyMTAsIDB4 ODg0IH0sCisJeyAweDQ0NCwgMHgxMTAsIDB4NDQ0IH0sCisJeyAweDEyMiwgMHg4ODgsIDB4MjI0 IH0sCisJeyAweDkxMiwgMHg0NDgsIDB4OTI0IH0sCisJeyAweDQ5MiwgMHgyNDgsIDB4NDkyIH0s CisJeyAweDI1MiwgMHg5MjgsIDB4MjkyIH0sCisJeyAwWDk0QSwgMFg0QTQsIDBYQTUyIH0sCisJ eyAwWDUyQSwgMFhBQTQsIDBYNTRBIH0sCisJeyAwWEFBQSwgMHg5NTQsIDBYNEFBIH0sCisJeyAw WEFBQSwgMHg1NTQsIDBYQUFBIH0sCisJeyAweDU1NSwgMFhBRDQsIDBYNUFBIH0sCisJeyAwWEI1 NSwgMFhBQjQsIDBYNTVBIH0sCisJeyAwWDZCNSwgMFg1QUMsIDBYQjU2IH0sCisJeyAwWDVCNSwg MFhENkMsIDBYNkQ2IH0sCisJeyAwWEI2RCwgMFhCNkEsIDBYREI2IH0sCisJeyAwWDc2RCwgMFg2 REEsIDBYQkI2IH0sCisJeyAwWEVERCwgMFhEREEsIDBYNzZFIH0sCisJeyAwWERERCwgMFhCQkEs IDBYRUVFIH0sCisJeyAwWDdCQiwgMFhGN0EsIDBYRERFIH0sCisJeyAwWEY3QiwgMFhFRjYsIDBY N0RFIH0sCisJeyAwWERGNywgMFhCRjYsIDBYRjdFIH0sCisJeyAwWDdGNywgMFhGRUUsIDBYRUZF IH0sCisJeyAwWEZERiwgMFhGQkUsIDBYN0ZFIH0sCisJeyAwWEY3RiwgMFhFRkUsIDBYRkZFIH0s CisJeyAwWEZGRiwgMFhGRkUsIDBYRkZEIH0sCit9OworCisKK3N0YXRpYyBpbnQgeHIyMXYxNDF4 X3NldF9iYXVkX3JhdGUoc3RydWN0IHhydXNiICp4cnVzYiwJdW5zaWduZWQgaW50IHJhdGUpCit7 CisJdW5zaWduZWQgaW50IGRpdmlzb3IgPSA0ODAwMDAwMCAvIHJhdGU7CisJdW5zaWduZWQgaW50 IGkgPSAoKDMyICogNDgwMDAwMDApIC8gcmF0ZSkgJiAweDFmOworCXVuc2lnbmVkIGludCB0eF9t YXNrID0geHIyMXYxNDF4X2JhdWRfcmF0ZXNbaV0udHg7CisJdW5zaWduZWQgaW50IHJ4X21hc2sg PSAoZGl2aXNvciAmIDEpID8KKwkJeHIyMXYxNDF4X2JhdWRfcmF0ZXNbaV0ucngxIDoKKwkJeHIy MXYxNDF4X2JhdWRfcmF0ZXNbaV0ucngwOworCisJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIyMVYx NDFYX0NMT0NLX0RJVklTT1JfMCwgKGRpdmlzb3IgPj4gIDApICYgMHhmZik7CisJeHJ1c2Jfc2V0 X3JlZyh4cnVzYiwgWFIyMVYxNDFYX0NMT0NLX0RJVklTT1JfMSwgKGRpdmlzb3IgPj4gIDgpICYg MHhmZik7CisJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIyMVYxNDFYX0NMT0NLX0RJVklTT1JfMiwg KGRpdmlzb3IgPj4gMTYpICYgMHhmZik7CisJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIyMVYxNDFY X1RYX0NMT0NLX01BU0tfMCwJKHR4X21hc2sgPj4gIDApICYgMHhmZik7CisJeHJ1c2Jfc2V0X3Jl Zyh4cnVzYiwgWFIyMVYxNDFYX1RYX0NMT0NLX01BU0tfMSwgKHR4X21hc2sgPj4gIDgpICYgMHhm Zik7CisJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIyMVYxNDFYX1JYX0NMT0NLX01BU0tfMCwgKHJ4 X21hc2sgPj4gIDApICYgMHhmZik7CisJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIyMVYxNDFYX1JY X0NMT0NLX01BU0tfMSwgKHJ4X21hc2sgPj4gIDgpICYgMHhmZik7CisKKwlyZXR1cm4gMDsKK30K KworLyogZGV2aWNlcyBhcmVuJ3QgcmVxdWlyZWQgdG8gc3VwcG9ydCB0aGVzZSByZXF1ZXN0cy4K KyAqIHRoZSBjZGMgeHJ1c2IgZGVzY3JpcHRvciB0ZWxscyB3aGV0aGVyIHRoZXkgZG8uLi4KKyAq LworaW50IHhydXNiX3NldF9jb250cm9sKHN0cnVjdCB4cnVzYiAqeHJ1c2IsIHVuc2lnbmVkIGlu dCBjb250cm9sKQoreworCWludCBydiA9IDA7CisKKwkvLyBVc2UgY3VzdG9tIHZlbmRvciByZXF1 ZXN0IGZvciBYUjIxVjE0MTAvMTIvMTQKKwlpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHgx NDExKSA9PSAweDE0MTApIHsKKwkJaWYgKGNvbnRyb2wgJiBYUlVTQl9DVFJMX0RUUikKKwkJCXhy dXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19jbHIsCisJCQkJR1BJ TzNfRFRSKTsKKwkJZWxzZQorCQkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAu dWFydF9ncGlvX3NldCwKKwkJCQlHUElPM19EVFIpOworCisJCWlmIChjb250cm9sICYgWFJVU0Jf Q1RSTF9SVFMpCisJCQl4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dw aW9fY2xyLAorCQkJCUdQSU81X1JUUyk7CisJCWVsc2UKKwkJCXhydXNiX3NldF9yZWcoeHJ1c2Is IHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19zZXQsCisJCQkJR1BJTzVfUlRTKTsKKwl9CisJLy8g VXNlIENEQyBjb21tYW5kIGZvciBYUjIxQjE0eHggYW5kIFhSMjI4MHgKKwllbHNlCisJCXJ2ID0g eHJ1c2JfY3RybF9tc2coeHJ1c2IsCisJCQlVU0JfQ0RDX1JFUV9TRVRfQ09OVFJPTF9MSU5FX1NU QVRFLAorCQkJY29udHJvbCwKKwkJCU5VTEwsCisJCQkwKTsKKworCXJldHVybiBydjsKK30KKwor aW50IHhydXNiX3NldF9saW5lKHN0cnVjdCB4cnVzYiAqeHJ1c2IsCXN0cnVjdCB1c2JfY2RjX2xp bmVfY29kaW5nICpsaW5lKQoreworCWludCBydiA9IDA7CisJdW5zaWduZWQgaW50IGRhdGFfc2l6 ZSwgZGF0YV9wYXJpdHksIGRhdGFfc3RvcCwgZm9ybWF0OworCisJLy8gVXNlIGN1c3RvbSB2ZW5k b3IgcmVxdWVzdCBmb3IgWFIyMVYxNDEwLzEyLzE0CisJaWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVj dCAmIDB4MTQxMSkgPT0gMHgxNDEwKSB7CisJCXhyMjF2MTQxeF9zZXRfYmF1ZF9yYXRlKHhydXNi LCBsaW5lLT5kd0RURVJhdGUpOworCQlkYXRhX3NpemUgPSBsaW5lLT5iRGF0YUJpdHM7CisJCWRh dGFfcGFyaXR5ID0gbGluZS0+YlBhcml0eVR5cGU7CisJCWRhdGFfc3RvcCA9IGxpbmUtPmJDaGFy Rm9ybWF0OworCQlmb3JtYXQgPSBkYXRhX3NpemUgfCAoZGF0YV9wYXJpdHkgPDwgNCkgfCAoZGF0 YV9zdG9wIDw8IDcpOworCQl4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0 X2Zvcm1hdCwgZm9ybWF0KTsKKwl9CisJLy8gVXNlIENEQyBjb21tYW5kIGZvciBYUjIxQjE0eHgg YW5kIFhSMjI4MHgKKwllbHNlCisJCXJ2ID0geHJ1c2JfY3RybF9tc2coeHJ1c2IsCisJCQlVU0Jf Q0RDX1JFUV9TRVRfTElORV9DT0RJTkcsCisJCQkwLAorCQkJbGluZSwKKwkJCXNpemVvZiAqKGxp bmUpKTsKKworCXJldHVybiBydjsKK30KKworaW50IHhydXNiX3NldF9mbG93X21vZGUoc3RydWN0 IHhydXNiICp4cnVzYiwKKwkJc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwgdW5zaWduZWQgaW50IGNm bGFnKQoreworCXVuc2lnbmVkIGludCBmbG93OworCXVuc2lnbmVkIGludCBncGlvX21vZGU7CisJ c2hvcnQgZ3Bpb19tb2RlX3JlZzsKKworCXhydXNiX2dldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdf bWFwLnVhcnRfZ3Bpb19tb2RlLCAmZ3Bpb19tb2RlX3JlZyk7CisJZ3Bpb19tb2RlID0gZ3Bpb19t b2RlX3JlZzsKKwlpZiAoY2ZsYWcgJiBDUlRTQ1RTKSB7CisJCWZsb3cgPSBVQVJUX0ZMT1dfTU9E RV9IVzsKKwkJZ3Bpb19tb2RlIHw9IFVBUlRfR1BJT19NT0RFX1NFTF9SVFNfQ1RTOworCX0gZWxz ZSBpZiAoSV9JWE9GRih0dHkpIHx8IElfSVhPTih0dHkpKSB7CisJCXVuc2lnbmVkIGNoYXIgc3Rh cnRfY2hhciA9IFNUQVJUX0NIQVIodHR5KTsKKwkJdW5zaWduZWQgY2hhciBzdG9wX2NoYXIgPSBT VE9QX0NIQVIodHR5KTsKKworCQlmbG93ID0gVUFSVF9GTE9XX01PREVfU1c7CisJCWdwaW9fbW9k ZSB8PSBVQVJUX0dQSU9fTU9ERV9TRUxfR1BJTzsKKworCQl4cnVzYl9zZXRfcmVnKHhydXNiLCB4 cnVzYi0+cmVnX21hcC51YXJ0X3hvbl9jaGFyLCBzdGFydF9jaGFyKTsKKwkJeHJ1c2Jfc2V0X3Jl Zyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF94b2ZmX2NoYXIsIHN0b3BfY2hhcik7CisJfSBl bHNlIHsKKwkJZmxvdyA9IFVBUlRfRkxPV19NT0RFX05PTkU7CisJCWdwaW9fbW9kZSB8PSBVQVJU X0dQSU9fTU9ERV9TRUxfR1BJTzsKKwl9CisKKwkvLyBNb2RlIGNvbmZpZ3VyZWQgaW4gQklPUyBm b3IgQ2FyYWNhbGxhCisJLy8gRG8gbm90aGluZyBmb3Igc2V0X2Zsb3dfbW9kZQorCWlmICh4cnVz Yi0+Zm91bmRfc21iaW9zX2NhcmFjYWxsYV9jb25maWcpCisJCXJldHVybiAwOworCisJLy8gSWYg bW9kZSBjb25maWd1cmVkIGFzIFJTNDg1IG9yIFJTNDIyIGJ5IGFwcGxpY2F0aW9uCisJLy8gYW5k IHN0b3JlZCBpbiAvZXRjL3BvcnRfY29uZmlnIGZpbGUKKwlpZiAoeHJ1c2ItPmhhdmVfdHhjdnJf Y29uZmlnKSB7CisJCXhydXNiX2dwaW9fZGlyX291dCh4cnVzYiwKKwkJCUdQSU85X1JYVCB8IEdQ SU84X1RYVCB8IEdQSU83X1hFTiB8IEdQSU82X0NMSyk7CisJCWdwaW9fbW9kZSAmPSAweDAwRkY7 IC8vIGRpc2FibGUgVFhUIGFuZCBSWFQKKwl9CisJaWYgKHhydXNiLT5wb3J0X3NldHRpbmcudHhj dnJfbW9kZSA8IDIpIHsKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFy dF9mbG93LCBmbG93KTsKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFy dF9ncGlvX21vZGUsIGdwaW9fbW9kZSk7CisJfQorCXJldHVybiAwOworfQorCitpbnQgeHJ1c2Jf c2VuZF9icmVhayhzdHJ1Y3QgeHJ1c2IgKnhydXNiLCBpbnQgc3RhdGUpCit7CisJaW50IHJ2ID0g MDsKKworCS8vIFVzZSBjdXN0b20gdmVuZG9yIHJlcXVlc3QgZm9yIFhSMjFWMTQxMC8xMi8xNAor CWlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweDE0MTEpID09IDB4MTQxMCkgeworCQlpZiAo c3RhdGUpCisJCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQkJeHJ1c2ItPnJlZ19tYXAu dWFydF90eF9icmVhaywKKwkJCQkweGZmZmYpOworCQllbHNlCisJCQlydiA9IHhydXNiX3NldF9y ZWcoeHJ1c2IsCisJCQkJeHJ1c2ItPnJlZ19tYXAudWFydF90eF9icmVhaywKKwkJCQkwKTsKKwl9 CisJLy8gVXNlIENEQyBjb21tYW5kIGZvciBYUjIxQjE0eHggYW5kIFhSMjI4MHgKKwllbHNlCisJ CXJ2ID0geHJ1c2JfY3RybF9tc2coeHJ1c2IsCisJCQlVU0JfQ0RDX1JFUV9TRU5EX0JSRUFLLAor CQkJc3RhdGUsCisJCQlOVUxMLAorCQkJMCk7CisKKwlyZXR1cm4gcnY7Cit9CisKK2ludCB4cnVz Yl9lbmFibGUoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgcnYgPSAwOworCWludCBjaGFu bmVsID0geHJ1c2ItPmNoYW5uZWw7CisKKwlpZiAoY2hhbm5lbCkKKwkJY2hhbm5lbC0tOworCisJ aWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVjdCAmIDB4MTQxMSkgPT0gMHgxNDEwKSB7CisJCXJ2ID0g eHJ1c2Jfc2V0X2Jsb2NrX3JlZyh4cnVzYiwKKwkJCVhSMjFWMTQxeF9VUk1fUkVHX0JMT0NLLAor CQkJWFIyMVYxNDF4X1VSTV9GSUZPX0VOQUJMRV9SRUcgKyBjaGFubmVsLAorCQkJWFIyMVYxNDF4 X1VSTV9FTkFCTEVfVFhfRklGTyk7CisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCXhy dXNiLT5yZWdfbWFwLnVhcnRfZW5hYmxlLAorCQkJVUFSVF9FTkFCTEVfVFggfCBVQVJUX0VOQUJM RV9SWCk7CisJCXJ2ID0geHJ1c2Jfc2V0X2Jsb2NrX3JlZyh4cnVzYiwKKwkJCVhSMjFWMTQxeF9V Uk1fUkVHX0JMT0NLLAorCQkJWFIyMVYxNDF4X1VSTV9GSUZPX0VOQUJMRV9SRUcgKyBjaGFubmVs LAorCQkJWFIyMVYxNDF4X1VSTV9FTkFCTEVfVFhfRklGTyB8CisJCQlYUjIxVjE0MXhfVVJNX0VO QUJMRV9SWF9GSUZPKTsKKwl9IGVsc2UKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJ eHJ1c2ItPnJlZ19tYXAudWFydF9lbmFibGUsCisJCQlVQVJUX0VOQUJMRV9UWCB8IFVBUlRfRU5B QkxFX1JYKTsKKworCXJldHVybiBydjsKK30KKworaW50IHhydXNiX2Rpc2FibGUoc3RydWN0IHhy dXNiICp4cnVzYikKK3sKKwlpbnQgcnYgPSAwOworCWludCBjaGFubmVsID0geHJ1c2ItPmNoYW5u ZWw7CisKKwlpZiAoY2hhbm5lbCkKKwkJY2hhbm5lbC0tOworCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4 cnVzYiwgeHJ1c2ItPnJlZ19tYXAudWFydF9lbmFibGUsIDApOworCisJaWYgKCh4cnVzYi0+RGV2 aWNlUHJvZHVjdCAmIDB4MTQxMSkgPT0gMHgxNDEwKSB7CisJCXJ2ID0geHJ1c2Jfc2V0X2Jsb2Nr X3JlZyh4cnVzYiwKKwkJCVhSMjFWMTQxeF9VUk1fUkVHX0JMT0NLLAorCQkJWFIyMVYxNDF4X1VS TV9GSUZPX0VOQUJMRV9SRUcgKyBjaGFubmVsLCAwKTsKKwl9CisKKwlyZXR1cm4gcnY7Cit9CisK K2ludCB4cnVzYl9maWZvX3Jlc2V0KHN0cnVjdCB4cnVzYiAqeHJ1c2IpCit7CisJaW50IHJ2ID0g MDsKKwlpbnQgY2hhbm5lbCA9IHhydXNiLT5jaGFubmVsOworCisJaWYgKGNoYW5uZWwpCisJCWNo YW5uZWwtLTsKKwlpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHgxNDExKSA9PSAweDE0MTAp IHsKKwkJcnYgPSB4cnVzYl9zZXRfYmxvY2tfcmVnKHhydXNiLAorCQkJWFIyMVYxNDF4X1VSTV9S RUdfQkxPQ0ssCisJCQlYUjIxVjE0MXhfVVJNX1JYX0ZJRk9fUkVTRVQgKyBjaGFubmVsLAorCQkJ MHhmZik7CisJCXJ2IHw9IHhydXNiX3NldF9ibG9ja19yZWcoeHJ1c2IsCisJCQlYUjIxVjE0MXhf VVJNX1JFR19CTE9DSywKKwkJCVhSMjFWMTQxeF9VUk1fVFhfRklGT19SRVNFVCArIGNoYW5uZWws CisJCQkweGZmKTsKKwl9IGVsc2UKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJeHJ1 c2ItPnJlZ19tYXAudWFydF9lbmFibGUsCisJCQlVQVJUX0VOQUJMRV9UWCB8IFVBUlRfRU5BQkxF X1JYKTsKKworCXJldHVybiBydjsKK30KKworaW50IHhydXNiX3NldF9sb29wYmFjayhzdHJ1Y3Qg eHJ1c2IgKnhydXNiLCBpbnQgY2hhbm5lbCkKK3sKKwlpbnQgcnYgPSAwOworCisJeHJ1c2JfZGlz YWJsZSh4cnVzYik7CisKKwlpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHgxNDExKSA9PSAw eDE0MTApIHsKKwkJc3dpdGNoIChjaGFubmVsKSB7CisJCWNhc2UgMDoKKwkJCXJ2ID0geHJ1c2Jf c2V0X3JlZyh4cnVzYiwKKwkJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2xvb3BiYWNrLAorCQkJCVhS MjFWMTQxeF9MT09QX0VOQUJMRV9BKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlydiA9IHhy dXNiX3NldF9yZWcoeHJ1c2IsCisJCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9sb29wYmFjaywKKwkJ CQlYUjIxVjE0MXhfTE9PUF9FTkFCTEVfQik7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJcnYg PSB4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJCXhydXNiLT5yZWdfbWFwLnVhcnRfbG9vcGJhY2ss CisJCQkJWFIyMVYxNDF4X0xPT1BfRU5BQkxFX0MpOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJ CXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2xvb3Bi YWNrLAorCQkJCVhSMjFWMTQxeF9MT09QX0VOQUJMRV9EKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0 OgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLAor CQkJeHJ1c2ItPnJlZ19tYXAudWFydF9sb29wYmFjaywKKwkJCUxPT1BfRU5BQkxFKTsKKworCXhy dXNiX2VuYWJsZSh4cnVzYik7CisJcmV0dXJuIHJ2OworfQorCitpbnQgeHJ1c2Jfc2V0X3dpZGVf bW9kZShzdHJ1Y3QgeHJ1c2IgKnhydXNiLCBpbnQgd2lkZV9tb2RlKQoreworCWludCBydiA9IDA7 CisJaW50IGNoYW5uZWwgPSB4cnVzYi0+Y2hhbm5lbDsKKworCXhydXNiX2Rpc2FibGUoeHJ1c2Ip OworCisJaWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVjdCAmIDB4RkZGMCkgPT0gMHgxNDAwKSB7CisJ CXhydXNiX3NldF9yZWcoeHJ1c2IsIFhSMjI4MFhfVFhfV0lERV9NT0RFX1JFRywgd2lkZV9tb2Rl KTsKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIyMjgwWF9SWF9XSURFX01PREVfUkVHLCB3aWRl X21vZGUpOworCX0gZWxzZSBpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHhGRkYwKSA9PSAw eDE0MjApIHsKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgWFIyMUIxNDJYX1RYX1dJREVfTU9ERV9S RUcsIHdpZGVfbW9kZSk7CisJCXhydXNiX3NldF9yZWcoeHJ1c2IsIFhSMjFCMTQyWF9SWF9XSURF X01PREVfUkVHLCB3aWRlX21vZGUpOworCX0gZWxzZSBpZiAoeHJ1c2ItPkRldmljZVByb2R1Y3Qg PT0gMHgxNDExKSB7CisJCXhydXNiX3NldF9yZWcoeHJ1c2IsIFhSMjFCMTQxMV9XSURFX01PREVf UkVHLCB3aWRlX21vZGUpOworCX0gZWxzZSBpZiAoKHhydXNiLT5EZXZpY2VQcm9kdWN0ICYgMHhG RkYwKSA9PSAweDE0MTApIHsKKwkJaWYgKGNoYW5uZWwpCisJCQljaGFubmVsLS07CisJCXhydXNi X3NldF9ibG9ja19yZWcoeHJ1c2IsCisJCQlYUjIxVjE0MXhfVUFSVF9DVVNUT01fQkxPQ0ssCisJ CQljaGFubmVsKjggKyBYUjIxVjE0MVhfV0lERV9NT0RFX1JFRywKKwkJCXdpZGVfbW9kZSk7CisJ fQorCisJeHJ1c2JfZW5hYmxlKHhydXNiKTsKKwlyZXR1cm4gcnY7Cit9CisKK2ludCB4cnVzYl9k aXNhYmxlX3R4dF9yeHQoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgcnYgPSAwOworCXNo b3J0IHJlZ192YWx1ZTsKKworCXJ2ID0geHJ1c2JfZ2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19t YXAudWFydF9ncGlvX21vZGUsICZyZWdfdmFsdWUpOworCWlmIChydiA8IDApCisJCXJldHVybiAt RUZBVUxUOworCisJcmVnX3ZhbHVlICY9IDB4RkY7CisKKwlydiA9IHhydXNiX3NldF9yZWcoeHJ1 c2IsIHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19tb2RlLCByZWdfdmFsdWUpOworCWlmIChydiA8 IDApCisJCXJldHVybiAtRUZBVUxUOworCisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHhy dXNiX3Rpb2NtZ2V0KHN0cnVjdCB4cnVzYiAqeHJ1c2IpCisKK3sKKwlzaG9ydCBkYXRhOworCWlu dCByZXN1bHQ7CisKKwlyZXN1bHQgPSB4cnVzYl9nZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21h cC51YXJ0X2dwaW9fc3RhdHVzLCAmZGF0YSk7CisKKwlpZiAocmVzdWx0KQorCQlyZXR1cm4gKChk YXRhICYgMHg4KSA/IDAgOiBUSU9DTV9EVFIpIHwKKwkJCSgoZGF0YSAmIDB4MjApID8gMCA6IFRJ T0NNX1JUUykgfAorCQkJKChkYXRhICYgMHg0KSA/IDAgOiBUSU9DTV9EU1IpIHwKKwkJCSgoZGF0 YSAmIDB4MSkgPyAwIDogVElPQ01fUkkpIHwKKwkJCSgoZGF0YSAmIDB4MikgPyAwIDogVElPQ01f Q0QpIHwKKwkJCSgoZGF0YSAmIDB4MTApID8gMCA6IFRJT0NNX0NUUyk7CisJZWxzZQorCQlyZXR1 cm4gLUVGQVVMVDsKK30KKworc3RhdGljIGludCB4cnVzYl90aW9jbXNldChzdHJ1Y3QgeHJ1c2Ig KnhydXNiLAorCQl1bnNpZ25lZCBpbnQgc2V0LCB1bnNpZ25lZCBpbnQgY2xlYXIpCit7CisKKwl1 bnNpZ25lZCBpbnQgbmV3Y3RybCA9IDA7CisKKwluZXdjdHJsID0geHJ1c2ItPmN0cmxvdXQ7CisJ c2V0ID0gKHNldCAmIFRJT0NNX0RUUiA/IFhSVVNCX0NUUkxfRFRSIDogMCkgfAorCQkoc2V0ICYg VElPQ01fUlRTID8gWFJVU0JfQ1RSTF9SVFMgOiAwKTsKKwljbGVhciA9IChjbGVhciAmIFRJT0NN X0RUUiA/IFhSVVNCX0NUUkxfRFRSIDogMCkgfAorCQkoY2xlYXIgJiBUSU9DTV9SVFMgPyBYUlVT Ql9DVFJMX1JUUyA6IDApOworCW5ld2N0cmwgPSAobmV3Y3RybCAmIH5jbGVhcikgfCBzZXQ7CisK KwlpZiAoeHJ1c2ItPmN0cmxvdXQgPT0gbmV3Y3RybCkKKwkJcmV0dXJuIDA7CisKKwl4cnVzYi0+ Y3RybG91dCA9IG5ld2N0cmw7CisKKwlpZiAobmV3Y3RybCAmIFhSVVNCX0NUUkxfRFRSKQorCQl4 cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX2NsciwKKwkJ CUdQSU8zX0RUUik7CisJZWxzZQorCQl4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJl Z19tYXAudWFydF9ncGlvX3NldCwKKwkJCUdQSU8zX0RUUik7CisKKwlpZiAobmV3Y3RybCAmIFhS VVNCX0NUUkxfUlRTKQorCQl4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAu dWFydF9ncGlvX2NsciwKKwkJCUdQSU81X1JUUyk7CisJZWxzZQorCQl4cnVzYl9zZXRfcmVnKHhy dXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX3NldCwKKwkJCUdQSU81X1JUUyk7CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW5pdF94cjIyODB4X3JlZ19tYXAodm9pZCkK K3sKKwl4cjIyODB4X3JlZ19tYXAudWFydF9lbmFibGUgPSAweDQwOworCXhyMjI4MHhfcmVnX21h cC51YXJ0X2Zsb3cgPSAweDQ2OworCXhyMjI4MHhfcmVnX21hcC51YXJ0X3hvbl9jaGFyID0gMHg0 NzsKKwl4cjIyODB4X3JlZ19tYXAudWFydF94b2ZmX2NoYXIgPSAweDQ4OworCXhyMjI4MHhfcmVn X21hcC51YXJ0X3R4X2JyZWFrID0gMHg0YTsKKwl4cjIyODB4X3JlZ19tYXAudWFydF9yczQ4NV9k ZWxheSA9IDB4NGI7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRfZ3Bpb19tb2RlID0gMHg0YzsKKwl4 cjIyODB4X3JlZ19tYXAudWFydF9ncGlvX2RpciA9IDB4NGQ7CisJeHIyMjgweF9yZWdfbWFwLnVh cnRfZ3Bpb19zZXQgPSAweDRlOworCXhyMjI4MHhfcmVnX21hcC51YXJ0X2dwaW9fY2xyID0gMHg0 ZjsKKwl4cjIyODB4X3JlZ19tYXAudWFydF9ncGlvX3N0YXR1cyA9IDB4NTA7CisJeHIyMjgweF9y ZWdfbWFwLnVhcnRfZ3Bpb19pbnRfbWFzayA9IDB4NTE7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRf Y3VzdG9taXplZF9pbnQgPSAweDUyOworCXhyMjI4MHhfcmVnX21hcC51YXJ0X2dwaW9fcHVsbF91 cF9lbmFibGUgPSAweDU0OworCXhyMjI4MHhfcmVnX21hcC51YXJ0X2dwaW9fcHVsbF9kb3duX2Vu YWJsZSA9IDB4NTU7CisJeHIyMjgweF9yZWdfbWFwLnVhcnRfbG9vcGJhY2sgPSAweDU2OworCXhy MjI4MHhfcmVnX21hcC51YXJ0X2xvd19sYXRlbmN5ID0gMHg2NjsKKwl4cjIyODB4X3JlZ19tYXAu dWFydF9jdXN0b21fZHJpdmVyID0gMHg4MTsKK30KKworc3RhdGljIHZvaWQgaW5pdF94cjIxYjE0 MTFfcmVnX21hcCh2b2lkKQoreworCXhyMjFiMTQxMV9yZWdfbWFwLnVhcnRfZW5hYmxlID0gMHhj MDA7CisJeHIyMWIxNDExX3JlZ19tYXAudWFydF9mbG93ID0gMHhjMDY7CisJeHIyMWIxNDExX3Jl Z19tYXAudWFydF94b25fY2hhciA9IDB4YzA3OworCXhyMjFiMTQxMV9yZWdfbWFwLnVhcnRfeG9m Zl9jaGFyID0gMHhjMDg7CisJeHIyMWIxNDExX3JlZ19tYXAudWFydF90eF9icmVhayA9IDB4YzBh OworCXhyMjFiMTQxMV9yZWdfbWFwLnVhcnRfZ3Bpb19tb2RlID0gMHhjMGM7CisJeHIyMWIxNDEx X3JlZ19tYXAudWFydF9ncGlvX2RpciA9IDB4YzBkOworCXhyMjFiMTQxMV9yZWdfbWFwLnVhcnRf Z3Bpb19zZXQgPSAweGMwZTsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0X2dwaW9fY2xyID0gMHhj MGY7CisJeHIyMWIxNDExX3JlZ19tYXAudWFydF9ncGlvX3N0YXR1cyA9IDB4YzEwOworCXhyMjFi MTQxMV9yZWdfbWFwLnVhcnRfZ3Bpb19pbnRfbWFzayA9IDB4YzExOworCXhyMjFiMTQxMV9yZWdf bWFwLnVhcnRfY3VzdG9taXplZF9pbnQgPSAweGMxMjsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0 X2dwaW9fcHVsbF91cF9lbmFibGUgPSAweGMxNDsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0X2dw aW9fcHVsbF9kb3duX2VuYWJsZSA9IDB4YzE1OworCXhyMjFiMTQxMV9yZWdfbWFwLnVhcnRfbG9v cGJhY2sgPSAweGMxNjsKKwl4cjIxYjE0MTFfcmVnX21hcC51YXJ0X2xvd19sYXRlbmN5ID0gMHhj YzI7CisJeHIyMWIxNDExX3JlZ19tYXAudWFydF9jdXN0b21fZHJpdmVyID0gMHgyMGQ7Cit9CisK K3N0YXRpYyB2b2lkIGluaXRfeHIyMXYxNDF4X3JlZ19tYXAodm9pZCkKK3sKKwl4cjIxdjE0MXhf cmVnX21hcC51YXJ0X2VuYWJsZSA9IDB4MDM7CisJeHIyMXYxNDF4X3JlZ19tYXAudWFydF9mb3Jt YXQgPSAweDBiOworCXhyMjF2MTQxeF9yZWdfbWFwLnVhcnRfZmxvdyA9IDB4MGM7CisJeHIyMXYx NDF4X3JlZ19tYXAudWFydF94b25fY2hhciA9IDB4MTA7CisJeHIyMXYxNDF4X3JlZ19tYXAudWFy dF94b2ZmX2NoYXIgPSAweDExOworCXhyMjF2MTQxeF9yZWdfbWFwLnVhcnRfbG9vcGJhY2sgPSAw eDEyOworCXhyMjF2MTQxeF9yZWdfbWFwLnVhcnRfdHhfYnJlYWsgPSAweDE0OworCXhyMjF2MTQx eF9yZWdfbWFwLnVhcnRfcnM0ODVfZGVsYXkgPSAweDE1OworCXhyMjF2MTQxeF9yZWdfbWFwLnVh cnRfZ3Bpb19tb2RlID0gMHgxYTsKKwl4cjIxdjE0MXhfcmVnX21hcC51YXJ0X2dwaW9fZGlyID0g MHgxYjsKKwl4cjIxdjE0MXhfcmVnX21hcC51YXJ0X2dwaW9faW50X21hc2sgPSAweDFjOworCXhy MjF2MTQxeF9yZWdfbWFwLnVhcnRfZ3Bpb19zZXQgPSAweDFkOworCXhyMjF2MTQxeF9yZWdfbWFw LnVhcnRfZ3Bpb19jbHIgPSAweDFlOworCXhyMjF2MTQxeF9yZWdfbWFwLnVhcnRfZ3Bpb19zdGF0 dXMgPSAweDFmOworfQorCitzdGF0aWMgdm9pZCBpbml0X3hyMjFiMTQyeF9yZWdfbWFwKHZvaWQp Cit7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF9lbmFibGUgPSAweDAwOworCXhyMjFiMTQyeF9y ZWdfbWFwLnVhcnRfZmxvdyA9IDB4MDY7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF94b25fY2hh ciA9IDB4MDc7CisJeHIyMWIxNDJ4X3JlZ19tYXAudWFydF94b2ZmX2NoYXIgPSAweDA4OworCXhy MjFiMTQyeF9yZWdfbWFwLnVhcnRfdHhfYnJlYWsgPSAweDBhOworCXhyMjFiMTQyeF9yZWdfbWFw LnVhcnRfcnM0ODVfZGVsYXkgPSAweDBiOworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRfZ3Bpb19t b2RlID0gMHgwYzsKKwl4cjIxYjE0MnhfcmVnX21hcC51YXJ0X2dwaW9fZGlyID0gMHgwZDsKKwl4 cjIxYjE0MnhfcmVnX21hcC51YXJ0X2dwaW9fc2V0ID0gMHgwZTsKKwl4cjIxYjE0MnhfcmVnX21h cC51YXJ0X2dwaW9fY2xyID0gMHgwZjsKKwl4cjIxYjE0MnhfcmVnX21hcC51YXJ0X2dwaW9fc3Rh dHVzID0gMHgxMDsKKwl4cjIxYjE0MnhfcmVnX21hcC51YXJ0X2dwaW9faW50X21hc2sgPSAweDEx OworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRfY3VzdG9taXplZF9pbnQgPSAweDEyOworCXhyMjFi MTQyeF9yZWdfbWFwLnVhcnRfZ3Bpb19vcGVuX2RyYWluID0gMHgxMzsKKwl4cjIxYjE0MnhfcmVn X21hcC51YXJ0X2dwaW9fcHVsbF91cF9lbmFibGUgPSAweDE0OworCXhyMjFiMTQyeF9yZWdfbWFw LnVhcnRfZ3Bpb19wdWxsX2Rvd25fZW5hYmxlID0gMHgxNTsKKwl4cjIxYjE0MnhfcmVnX21hcC51 YXJ0X2xvb3BiYWNrID0gMHgxNjsKKwl4cjIxYjE0MnhfcmVnX21hcC51YXJ0X2N1c3RvbV9kcml2 ZXIgPSAweDYwOworCXhyMjFiMTQyeF9yZWdfbWFwLnVhcnRfbG93X2xhdGVuY3kgPSAweDQ2Owor fQorCitpbnQgeHJ1c2JfcmVnX2luaXQoc3RydWN0IHhydXNiICp4cnVzYikKK3sKKwlpbnQgcnYg PSAwLCBncGlvX21vZGUgPSAwOworCXVuc2lnbmVkIGNoYXIgY2gxX2NhcmFjYWxsYV9jb25maWcg PSAweGZmOworCXVuc2lnbmVkIGNoYXIgY2gyX2NhcmFjYWxsYV9jb25maWcgPSAweGZmOworCisJ aW5pdF94cjIyODB4X3JlZ19tYXAoKTsKKwlpbml0X3hyMjFiMTQyeF9yZWdfbWFwKCk7CisJaW5p dF94cjIxYjE0MTFfcmVnX21hcCgpOworCWluaXRfeHIyMXYxNDF4X3JlZ19tYXAoKTsKKworCWlm ICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweGZmZjApID09IDB4MTQwMCkKKwkJbWVtY3B5KCYo eHJ1c2ItPnJlZ19tYXApLCAmeHIyMjgweF9yZWdfbWFwLAorCQkJc2l6ZW9mKHN0cnVjdCByZWdf YWRkcl9tYXApKTsKKwllbHNlIGlmICgoeHJ1c2ItPkRldmljZVByb2R1Y3QgJiAweEZGRjApID09 IDB4MTQyMCkKKwkJbWVtY3B5KCYoeHJ1c2ItPnJlZ19tYXApLCAmeHIyMWIxNDJ4X3JlZ19tYXAs CisJCQlzaXplb2Yoc3RydWN0IHJlZ19hZGRyX21hcCkpOworCWVsc2UgaWYgKHhydXNiLT5EZXZp Y2VQcm9kdWN0ID09IDB4MTQxMSkKKwkJbWVtY3B5KCYoeHJ1c2ItPnJlZ19tYXApLCAmeHIyMWIx NDExX3JlZ19tYXAsCisJCQlzaXplb2Yoc3RydWN0IHJlZ19hZGRyX21hcCkpOworCWVsc2UgaWYg KCh4cnVzYi0+RGV2aWNlUHJvZHVjdCAmIDB4ZmZmMCkgPT0gMHgxNDEwKQorCQltZW1jcHkoJih4 cnVzYi0+cmVnX21hcCksICZ4cjIxdjE0MXhfcmVnX21hcCwKKwkJCXNpemVvZihzdHJ1Y3QgcmVn X2FkZHJfbWFwKSk7CisJZWxzZQorCQlydiA9IC0xOworCisJaWYgKHhydXNiLT5yZWdfbWFwLnVh cnRfY3VzdG9tX2RyaXZlcikKKwkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwgeHJ1c2ItPnJlZ19tYXAu dWFydF9jdXN0b21fZHJpdmVyLCAxKTsKKworCS8vIEVuYWJsZSBUWFQgYW5kIFJYVCBmdW5jdGlv biBmb3IgWFIyMUIxNDIwLzIyLzI0CisJaWYgKCh4cnVzYi0+RGV2aWNlUHJvZHVjdCAmIDB4ZmZm MCkgPT0gMHgxNDIwKQorCQlncGlvX21vZGUgfD0gKEdQSU85X1JYVCB8IEdQSU84X1RYVCk7CisK Kwl4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwgZ3Bp b19tb2RlKTsKKworCS8vIEVuYWJsZSBSVFMgYW5kIERUUiBhcyBvdXRwdXRzIGFuZCBoaWdoIChk ZS1hc3NlcnRlZCkKKwl4cnVzYl9zZXRfcmVnKHhydXNiLCB4cnVzYi0+cmVnX21hcC51YXJ0X2dw aW9fZGlyLAorCQlHUElPNV9SVFMgfCBHUElPM19EVFIpOworCXhydXNiX3NldF9yZWcoeHJ1c2Is IHhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19zZXQsCisJCUdQSU81X1JUUyB8IEdQSU8zX0RUUik7 CisKKwkvLyBDaGVjayBmb3IgQ2FyYWNhbGxhIGJvYXJkIHVzaW5nIFhSMjFWMTQxMiAoMi1jaCkK Kwl4cnVzYi0+Zm91bmRfc21iaW9zX2NhcmFjYWxsYV9jb25maWcgPSAwOworCWlmIChzbWJpb3Nf Y2hlY2tfY2FyYWNhbGxhX2NvbmZpZygmY2gxX2NhcmFjYWxsYV9jb25maWcsCisJCSZjaDJfY2Fy YWNhbGxhX2NvbmZpZykgPT0gMCkgeworCQlpZiAoeHJ1c2ItPmNoYW5uZWwgPT0gMSkgeworCQkJ eHJ1c2ItPmZvdW5kX3NtYmlvc19jYXJhY2FsbGFfY29uZmlnID0gMTsKKwkJCXhydXNiLT5jaGFu bmVsX2NvbmZpZyA9CWNoMV9jYXJhY2FsbGFfY29uZmlnOworCQkJc3dpdGNoIChjaDFfY2FyYWNh bGxhX2NvbmZpZykgeworCQkJY2FzZSAxOiAvLyBSUy0yMzIgTW9kZQorCQkJCXhydXNiX3NldF9y ZWcoeHJ1c2IsCisJCQkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19tb2RlLCAwKTsKKwkJCQli cmVhazsKKwkJCWNhc2UgMjogLy8gUlMtNDg1IEhhbGYtRHVwbGV4LCBhY3RpdmUgaGlnaCBSVFMK KwkJCQl4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9f bW9kZSwKKwkJCQkJVUFSVF9HUElPX01PREVfRElSX1JUU19ISSk7CisJCQkJeHJ1c2Jfc2V0X3Jl Zyh4cnVzYiwKKwkJCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9mbG93LCAwKTsKKwkJCQlicmVhazsK KwkJCWNhc2UgMzogLy8gUlMtNDg1LzQyMiBGdWxsLUR1cGxleCwgYWN0aXZlIGhpZ2ggUlRTCisJ CQkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX21v ZGUsCisJCQkJCVVBUlRfR1BJT19NT0RFX0RJUl9SVFNfSEkpOworCQkJCXhydXNiX3NldF9yZWco eHJ1c2IsCisJCQkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZmxvdywgMCk7CisJCQkJYnJlYWs7CisJ CQlkZWZhdWx0OiAvLyBObyBDYXJhY2FsbGEgQklPUyBzZXR0aW5nIGZvdW5kCisJCQkJeHJ1c2It PmZvdW5kX3NtYmlvc19jYXJhY2FsbGFfY29uZmlnID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJ fSBlbHNlIGlmICh4cnVzYi0+Y2hhbm5lbCA9PSAyKSB7CisJCQl4cnVzYi0+Zm91bmRfc21iaW9z X2NhcmFjYWxsYV9jb25maWcgPSAxOworCQkJeHJ1c2ItPmNoYW5uZWxfY29uZmlnID0gY2gyX2Nh cmFjYWxsYV9jb25maWc7CisJCQlzd2l0Y2ggKGNoMl9jYXJhY2FsbGFfY29uZmlnKSB7CisJCQlj YXNlIDE6IC8vIFJTLTIzMiBNb2RlCisJCQkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCQkJeHJ1 c2ItPnJlZ19tYXAudWFydF9ncGlvX21vZGUsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAyOiAv LyBSUy00ODUgSGFsZi1EdXBsZXgsIGFjdGl2ZSBoaWdoIFJUUworCQkJCXhydXNiX3NldF9yZWco eHJ1c2IsCisJCQkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19tb2RlLAorCQkJCQlVQVJUX0dQ SU9fTU9ERV9ESVJfUlRTX0hJKTsKKwkJCQl4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJCQl4cnVz Yi0+cmVnX21hcC51YXJ0X2Zsb3csIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvLyBSUy00 ODUvNDIyIEZ1bGwtRHVwbGV4LCBhY3RpdmUgaGlnaCBSVFMKKwkJCQl4cnVzYl9zZXRfcmVnKHhy dXNiLAorCQkJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwKKwkJCQkJVUFSVF9HUElP X01PREVfRElSX1JUU19ISSk7CisJCQkJeHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCQkJeHJ1c2It PnJlZ19tYXAudWFydF9mbG93LCAwKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6IC8vIE5vIENh cmFjYWxsYSBCSU9TIHNldHRpbmcgZm91bmQKKwkJCQl4cnVzYi0+Zm91bmRfc21iaW9zX2NhcmFj YWxsYV9jb25maWcgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmICh4cnVzYi0+ Zm91bmRfc21iaW9zX2NhcmFjYWxsYV9jb25maWcpCisJCXJldHVybiBydjsKKworCS8vIENoZWNr IGZvciBwcmV2aW91c2x5IHNhdmVkIHBvcnRfY29uZmlnIGZpbGVzIGluIC9ldGMvCisJLy8gZm9y IGRlc2lnbnMgdXNpbmcgWFIyMUIxNDJ4IHVzaW5nIEdQSU85LTYgZm9yIHRyYW5zY2VpdmVyIGNv bnRyb2wKKwlpZiAoY2hlY2tfcG9ydHBhcmFtZmlsZSh4cnVzYikpIHsKKwkJeHJ1c2JfZ3Bpb19k aXJfb3V0KHhydXNiLAorCQkJR1BJTzlfUlhUIHwgR1BJTzhfVFhUIHwgR1BJTzdfWEVOIHwgR1BJ TzZfQ0xLKTsKKwkJbG9hZF9wb3J0cGFyYW1maWxlKHhydXNiKTsKKwkJaW5pdF9wb3J0cGFyYW0o eHJ1c2IpOworCX0KKwlyZXR1cm4gcnY7Cit9CisKKy8qCisgKiBXcml0ZSBidWZmZXIgbWFuYWdl bWVudC4KKyAqIEFsbCBvZiB0aGVzZSBhc3N1bWUgcHJvcGVyIGxvY2tzIHRha2VuIGJ5IHRoZSBj YWxsZXIuCisgKi8KKworc3RhdGljIGludCB4cnVzYl93Yl9hbGxvYyhzdHJ1Y3QgeHJ1c2IgKnhy dXNiKQoreworCWludCBpLCB3Ym47CisJc3RydWN0IHhydXNiX3diICp3YjsKKworCXdibiA9IDA7 CisJaSA9IDA7CisJZm9yICg7OykgeworCQl3YiA9ICZ4cnVzYi0+d2Jbd2JuXTsKKwkJaWYgKCF3 Yi0+dXNlKSB7CisJCQl3Yi0+dXNlID0gMTsKKwkJCXJldHVybiB3Ym47CisJCX0KKwkJd2JuID0g KHdibiArIDEpICUgWFJVU0JfTlc7CisJCWlmICgrK2kgPj0gWFJVU0JfTlcpCisJCQlyZXR1cm4g LTE7CisJfQorfQorCitzdGF0aWMgaW50IHhydXNiX3diX2lzX2F2YWlsKHN0cnVjdCB4cnVzYiAq eHJ1c2IpCit7CisJaW50IGksIG47CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW4gPSBYUlVT Ql9OVzsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHJ1c2ItPndyaXRlX2xvY2ssIGZsYWdzKTsKKwlm b3IgKGkgPSAwOyBpIDwgWFJVU0JfTlc7IGkrKykKKwkJbiAtPSB4cnVzYi0+d2JbaV0udXNlOwor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnhydXNiLT53cml0ZV9sb2NrLCBmbGFncyk7CisJcmV0 dXJuIG47Cit9CisKKy8qCisgKiBGaW5pc2ggd3JpdGUuIENhbGxlciBtdXN0IGhvbGQgeHJ1c2It PndyaXRlX2xvY2sKKyAqLworc3RhdGljIHZvaWQgeHJ1c2Jfd3JpdGVfZG9uZShzdHJ1Y3QgeHJ1 c2IgKnhydXNiLAorCQlzdHJ1Y3QgeHJ1c2Jfd2IgKndiKQoreworCXdiLT51c2UgPSAwOworCXhy dXNiLT50cmFuc21pdHRpbmctLTsKKwl1c2JfYXV0b3BtX3B1dF9pbnRlcmZhY2VfYXN5bmMoeHJ1 c2ItPmNvbnRyb2wpOworfQorCisvKgorICogUG9rZSB3cml0ZS4KKyAqCisgKiB0aGUgY2FsbGVy IGlzIHJlc3BvbnNpYmxlIGZvciBsb2NraW5nCisgKi8KKworc3RhdGljIGludCB4cnVzYl9zdGFy dF93YihzdHJ1Y3QgeHJ1c2IgKnhydXNiLCBzdHJ1Y3QgeHJ1c2Jfd2IgKndiKQoreworCWludCBy YzsKKworCXhydXNiLT50cmFuc21pdHRpbmcrKzsKKworCXdiLT51cmItPnRyYW5zZmVyX2J1ZmZl ciA9IHdiLT5idWY7CisJd2ItPnVyYi0+dHJhbnNmZXJfZG1hID0gd2ItPmRtYWg7CisJd2ItPnVy Yi0+dHJhbnNmZXJfYnVmZmVyX2xlbmd0aCA9IHdiLT5sZW47CisJd2ItPnVyYi0+ZGV2ID0geHJ1 c2ItPmRldjsKKworCXJjID0gdXNiX3N1Ym1pdF91cmIod2ItPnVyYiwgR0ZQX0FUT01JQyk7CisJ aWYgKHJjIDwgMCkgeworCQlkZXZfZXJyKCZ4cnVzYi0+ZGF0YS0+ZGV2LAorCQkJIiVzIC0gdXNi X3N1Ym1pdF91cmIod3JpdGUgYnVsaykgZmFpbGVkOiAlZFxuIiwKKwkJCV9fZnVuY19fLCByYyk7 CisJCXhydXNiX3dyaXRlX2RvbmUoeHJ1c2IsIHdiKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisv KgorICogYXR0cmlidXRlcyBleHBvcnRlZCB0aHJvdWdoIHN5c2ZzCisgKi8KKworc3RhdGljIHNz aXplX3QgYm1DYXBhYmlsaXRpZXNfc2hvdworKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRl dmljZV9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKK3sKKwlzdHJ1Y3QgdXNiX2ludGVyZmFj ZSAqaW50ZiA9IHRvX3VzYl9pbnRlcmZhY2UoZGV2KTsKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0g dXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHJ1 c2ItPmN0cmxfY2Fwcyk7Cit9CitzdGF0aWMgREVWSUNFX0FUVFJfUk8oYm1DYXBhYmlsaXRpZXMp OworCisvKgorICogSW50ZXJydXB0IGhhbmRsZXJzIGZvciB2YXJpb3VzIFhSVVNCIGRldmljZSBy ZXNwb25zZXMKKyAqLworCisvKiBjb250cm9sIGludGVyZmFjZSByZXBvcnRzIHN0YXR1cyBjaGFu Z2VzIHdpdGggImludGVycnVwdCIgdHJhbnNmZXJzICovCitzdGF0aWMgdm9pZCB4cnVzYl9jdHJs X2lycShzdHJ1Y3QgdXJiICp1cmIpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHVyYi0+Y29u dGV4dDsKKwlzdHJ1Y3QgdXNiX2NkY19ub3RpZmljYXRpb24gKmRyID0gdXJiLT50cmFuc2Zlcl9i dWZmZXI7CisKKwl1bnNpZ25lZCBjaGFyICpkYXRhOworCWludCBuZXdjdHJsOworCWludCBydjsK KwlpbnQgc3RhdHVzID0gdXJiLT5zdGF0dXM7CisJaW50IGk7CisJdW5zaWduZWQgY2hhciAqcDsK KworCXN3aXRjaCAoc3RhdHVzKSB7CisJY2FzZSAwOgorCQlwID0gKHVuc2lnbmVkIGNoYXIgKiko dXJiLT50cmFuc2Zlcl9idWZmZXIpOworCQlmb3IgKGkgPSAwOyBpIDwgdXJiLT5hY3R1YWxfbGVu Z3RoOyBpKyspCisJCQlkZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiMHglMDJ4XG4iLCBw W2ldKTsKKwkJLyogc3VjY2VzcyAqLworCQlicmVhazsKKwljYXNlIC1FQ09OTlJFU0VUOgorCWNh c2UgLUVOT0VOVDoKKwljYXNlIC1FU0hVVERPV046CisJCS8qIHRoaXMgdXJiIGlzIHRlcm1pbmF0 ZWQsIGNsZWFuIHVwICovCisJCWRldl9kYmcoJnhydXNiLT5jb250cm9sLT5kZXYsCisJCQkiJXMg LSB1cmIgc2h1dHRpbmcgZG93biB3aXRoIHN0YXR1czogJWRcbiIsIF9fZnVuY19fLAorCQkJc3Rh dHVzKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWRldl9kYmcoJnhydXNiLT5jb250cm9sLT5k ZXYsCisJCQkiJXMgLSBub256ZXJvIHVyYiBzdGF0dXMgcmVjZWl2ZWQ6ICVkXG4iLAorCQkJX19m dW5jX18sIHN0YXR1cyk7CisJCWdvdG8gZXhpdDsKKwl9CisKKwl1c2JfbWFya19sYXN0X2J1c3ko eHJ1c2ItPmRldik7CisKKwlkYXRhID0gKHVuc2lnbmVkIGNoYXIgKikoZHIgKyAxKTsKKwlzd2l0 Y2ggKGRyLT5iTm90aWZpY2F0aW9uVHlwZSkgeworCWNhc2UgVVNCX0NEQ19OT1RJRllfTkVUV09S S19DT05ORUNUSU9OOgorCQlkZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiJXMgLSBuZXR3 b3JrIGNvbm5lY3Rpb246ICVkXG4iLAorCQkJX19mdW5jX18sIGRyLT53VmFsdWUpOworCQlicmVh azsKKworCWNhc2UgVVNCX0NEQ19OT1RJRllfU0VSSUFMX1NUQVRFOgorCisJCW5ld2N0cmwgPSBn ZXRfdW5hbGlnbmVkX2xlMTYoZGF0YSk7CisJCWlmICgheHJ1c2ItPmNsb2NhbCAmJgorCQkJKHhy dXNiLT5jdHJsaW4gJiB+bmV3Y3RybCAmIFhSVVNCX0NUUkxfRENEKSkgeworCisJCQlkZXZfZGJn KCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJCSIlcyAtIGNhbGxpbmcgaGFuZ3VwXG4iLAorCQkJ CV9fZnVuY19fKTsKKwkJCXR0eV9wb3J0X3R0eV9oYW5ndXAoJnhydXNiLT5wb3J0LCBmYWxzZSk7 CisJCX0KKworCQl4cnVzYi0+Y3RybGluID0gbmV3Y3RybDsKKwkJYnJlYWs7CisKKwlkZWZhdWx0 OgorCQlkZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJIiVzIC0gdW5rbm93biBub3Rp ZmljYXRpb24gJWQgcmVjZWl2ZWQ6IGluZGV4ICVkICIsCisJCQlfX2Z1bmNfXywgZHItPmJOb3Rp ZmljYXRpb25UeXBlLCBkci0+d0luZGV4KTsKKwkJZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRl diwgImxlbiAlZCBkYXRhMCAlZCBkYXRhMSAlZFxuIiwKKwkJCWRyLT53TGVuZ3RoLCBkYXRhWzBd LCBkYXRhWzFdKTsKKwkJYnJlYWs7CisJfQorZXhpdDoKKwlydiA9IHVzYl9zdWJtaXRfdXJiKHVy YiwgR0ZQX0FUT01JQyk7CisJaWYgKHJ2KQorCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2 LAorCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIgZmFpbGVkOiAlZFxuIiwgX19mdW5jX18sIHJ2KTsK K30KKworc3RhdGljIGludCB4cnVzYl9zdWJtaXRfcmVhZF91cmIoc3RydWN0IHhydXNiICp4cnVz YiwKKwkJaW50IGluZGV4LCBnZnBfdCBtZW1fZmxhZ3MpCit7CisJaW50IHJlczsKKworCWlmICgh dGVzdF9hbmRfY2xlYXJfYml0KGluZGV4LCAmeHJ1c2ItPnJlYWRfdXJic19mcmVlKSkKKwkJcmV0 dXJuIDA7CisKKwkvL2Rldl92ZGJnKCZ4cnVzYi0+ZGF0YS0+ZGV2LCAiJXMgLSB1cmIgJWRcbiIs IF9fZnVuY19fLCBpbmRleCk7CisKKwlyZXMgPSB1c2Jfc3VibWl0X3VyYih4cnVzYi0+cmVhZF91 cmJzW2luZGV4XSwgbWVtX2ZsYWdzKTsKKwlpZiAocmVzKSB7CisJCWlmIChyZXMgIT0gLUVQRVJN KSB7CisJCQlkZXZfZXJyKCZ4cnVzYi0+ZGF0YS0+ZGV2LAorCQkJCQkiJXMgLSB1c2Jfc3VibWl0 X3VyYiBmYWlsZWQ6ICVkXG4iLAorCQkJCQlfX2Z1bmNfXywgcmVzKTsKKwkJfQorCQlzZXRfYml0 KGluZGV4LCAmeHJ1c2ItPnJlYWRfdXJic19mcmVlKTsKKwkJcmV0dXJuIHJlczsKKwl9CisKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4cnVzYl9zdWJtaXRfcmVhZF91cmJzKHN0cnVjdCB4 cnVzYiAqeHJ1c2IsCisJCWdmcF90IG1lbV9mbGFncykKK3sKKwlpbnQgcmVzOworCWludCBpOwor CisJZm9yIChpID0gMDsgaSA8IHhydXNiLT5yeF9idWZsaW1pdDsgKytpKSB7CisJCXJlcyA9IHhy dXNiX3N1Ym1pdF9yZWFkX3VyYih4cnVzYiwgaSwgbWVtX2ZsYWdzKTsKKwkJaWYgKHJlcykKKwkJ CXJldHVybiByZXM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHhydXNiX3By b2Nlc3NfcmVhZF91cmIoc3RydWN0IHhydXNiICp4cnVzYiwJc3RydWN0IHVyYiAqdXJiKQorewor CWludCB3aWRlX21vZGUgPSB4cnVzYi0+d2lkZV9tb2RlOworCWludCBoYXZlX2V4dHJhX2J5dGU7 CisJaW50IGxlbmd0aDsKKworCWlmICghdXJiLT5hY3R1YWxfbGVuZ3RoKQorCQlyZXR1cm47CisK KwlpZiAod2lkZV9tb2RlKSB7CisJCWNoYXIgKmRwID0gdXJiLT50cmFuc2Zlcl9idWZmZXI7CisJ CWludCBpLCBjaCwgY2hfZmxhZ3M7CisKKwkJbGVuZ3RoID0gdXJiLT5hY3R1YWxfbGVuZ3RoOwor CQlsZW5ndGggPSBsZW5ndGggKyAoeHJ1c2ItPmhhdmVfZXh0cmFfYnl0ZSA/IDEgOiAwKTsKKwkJ aGF2ZV9leHRyYV9ieXRlID0gKHdpZGVfbW9kZSAmJiAobGVuZ3RoICYgMSkpOworCQlsZW5ndGgg PSAod2lkZV9tb2RlKSA/IChsZW5ndGggLyAyKSA6IGxlbmd0aDsKKwkJZm9yIChpID0gMDsgaSA8 IGxlbmd0aDsgKytpKSB7CisJCQljaGFyIHR0eV9mbGFnOworCisJCQlpZiAoaSA9PSAwKSB7CisJ CQkJaWYgKHhydXNiLT5oYXZlX2V4dHJhX2J5dGUpCisJCQkJCWNoID0geHJ1c2ItPmV4dHJhX2J5 dGU7CisJCQkJZWxzZQorCQkJCQljaCA9ICpkcCsrOworCQkJfSBlbHNlCisJCQkJY2ggPSAqZHAr KzsKKworCQkJY2hfZmxhZ3MgPSAqZHArKzsKKwkJCWlmIChjaF9mbGFncyAmIFdJREVfTU9ERV9Q QVJJVFkpCisJCQkJdHR5X2ZsYWcgPSBUVFlfUEFSSVRZOworCQkJZWxzZSBpZiAoY2hfZmxhZ3Mg JiBXSURFX01PREVfQlJFQUspCisJCQkJdHR5X2ZsYWcgPSBUVFlfQlJFQUs7CisJCQllbHNlIGlm IChjaF9mbGFncyAmIFdJREVfTU9ERV9GUkFNRSkKKwkJCQl0dHlfZmxhZyA9IFRUWV9GUkFNRTsK KwkJCWVsc2UgaWYgKGNoX2ZsYWdzICYgV0lERV9NT0RFX09WRVJSVU4pCisJCQkJdHR5X2ZsYWcg PSBUVFlfT1ZFUlJVTjsKKwkJCWVsc2UKKwkJCQl0dHlfZmxhZyA9IFRUWV9OT1JNQUw7CisKKwkJ CXR0eV9pbnNlcnRfZmxpcF9jaGFyKCZ4cnVzYi0+cG9ydCwKKwkJCQljaCwgdHR5X2ZsYWcpOwor CQkJdHR5X2ZsaXBfYnVmZmVyX3B1c2goJnhydXNiLT5wb3J0KTsKKwkJfQorCX0gZWxzZSB7CisJ CXR0eV9pbnNlcnRfZmxpcF9zdHJpbmcoJnhydXNiLT5wb3J0LAorCQkJdXJiLT50cmFuc2Zlcl9i dWZmZXIsIHVyYi0+YWN0dWFsX2xlbmd0aCk7CisJCXR0eV9mbGlwX2J1ZmZlcl9wdXNoKCZ4cnVz Yi0+cG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZCB4cnVzYl9yZWFkX2J1bGtfY2FsbGJhY2so c3RydWN0IHVyYiAqdXJiKQoreworCXN0cnVjdCB4cnVzYl9yYiAqcmIgPSB1cmItPmNvbnRleHQ7 CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHJiLT5pbnN0YW5jZTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCisJc2V0X2JpdChyYi0+aW5kZXgsICZ4cnVzYi0+cmVhZF91cmJzX2ZyZWUpOworCisJ aWYgKCF4cnVzYi0+ZGV2KSB7CisJCWRldl9kYmcoJnhydXNiLT5kYXRhLT5kZXYsCisJCQkiJXMg LSBkaXNjb25uZWN0ZWRcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuOworCX0KKwl1c2JfbWFya19s YXN0X2J1c3koeHJ1c2ItPmRldik7CisKKwlpZiAodXJiLT5zdGF0dXMpIHsKKwkJZGV2X2RiZygm eHJ1c2ItPmRhdGEtPmRldiwKKwkJCSIlcyAtIG5vbi16ZXJvIHVyYiBzdGF0dXM6ICVkXG4iLAor CQkJX19mdW5jX18sIHVyYi0+c3RhdHVzKTsKKwkJcmV0dXJuOworCX0KKwl4cnVzYl9wcm9jZXNz X3JlYWRfdXJiKHhydXNiLCB1cmIpOworCisJLyogdGhyb3R0bGUgZGV2aWNlIGlmIHJlcXVlc3Rl ZCBieSB0dHkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHJ1c2ItPnJlYWRfbG9jaywgZmxhZ3Mp OworCXhydXNiLT50aHJvdHRsZWQgPSB4cnVzYi0+dGhyb3R0bGVfcmVxOworCWlmICgheHJ1c2It PnRocm90dGxlZCAmJiAheHJ1c2ItPnN1c3BfY291bnQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmeHJ1c2ItPnJlYWRfbG9jaywgZmxhZ3MpOworCQl4cnVzYl9zdWJtaXRfcmVhZF91cmIo eHJ1c2IsCisJCQlyYi0+aW5kZXgsIEdGUF9BVE9NSUMpOworCX0gZWxzZSB7CisJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnhydXNiLT5yZWFkX2xvY2ssIGZsYWdzKTsKKwl9Cit9CisKKy8qIGRh dGEgaW50ZXJmYWNlIHdyb3RlIHRob3NlIG91dGdvaW5nIGJ5dGVzICovCitzdGF0aWMgdm9pZCB4 cnVzYl93cml0ZV9idWxrKHN0cnVjdCB1cmIgKnVyYikKK3sKKwlzdHJ1Y3QgeHJ1c2Jfd2IgKndi ID0gdXJiLT5jb250ZXh0OworCXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB3Yi0+aW5zdGFuY2U7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ4cnVzYi0+d3JpdGVf bG9jaywgZmxhZ3MpOworCXhydXNiX3dyaXRlX2RvbmUoeHJ1c2IsIHdiKTsKKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZ4cnVzYi0+d3JpdGVfbG9jaywgZmxhZ3MpOworCXNjaGVkdWxlX3dvcmso JnhydXNiLT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgeHJ1c2Jfc29mdGludChzdHJ1Y3Qgd29y a19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IGNvbnRhaW5lcl9vZih3 b3JrLCBzdHJ1Y3QgeHJ1c2IsIHdvcmspOworCisJdHR5X3BvcnRfdHR5X3dha2V1cCgmeHJ1c2It PnBvcnQpOworfQorCisvKgorICogVFRZIGhhbmRsZXJzCisgKi8KKworc3RhdGljIGludCB4cnVz Yl90dHlfaW5zdGFsbChzdHJ1Y3QgdHR5X2RyaXZlciAqZHJpdmVyLAorCQlzdHJ1Y3QgdHR5X3N0 cnVjdCAqdHR5KQoreworCXN0cnVjdCB4cnVzYiAqeHJ1c2I7CisJaW50IHJ2OworCisJZGV2X2Ri Zyh0dHktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKwl4cnVzYiA9IHhydXNiX2dldF9ieV9p bmRleCh0dHktPmluZGV4KTsKKwlpZiAoIXhydXNiKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXJ2 ID0gdHR5X3N0YW5kYXJkX2luc3RhbGwoZHJpdmVyLCB0dHkpOworCWlmIChydikKKwkJZ290byBl cnJvcl9pbml0X3Rlcm1pb3M7CisKKwl0dHktPmRyaXZlcl9kYXRhID0geHJ1c2I7CisKKwlyZXR1 cm4gMDsKKworZXJyb3JfaW5pdF90ZXJtaW9zOgorCXR0eV9wb3J0X3B1dCgmeHJ1c2ItPnBvcnQp OworCXJldHVybiBydjsKK30KKworc3RhdGljIGludCB4cnVzYl90dHlfb3BlbihzdHJ1Y3QgdHR5 X3N0cnVjdCAqdHR5LCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNi ID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlpbnQgcmVzdWx0OworCisJcmVzdWx0ID0geHJ1c2JfZmlm b19yZXNldCh4cnVzYik7CisJZGV2X2RiZyh0dHktPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisK KwlyZXR1cm4gdHR5X3BvcnRfb3BlbigmeHJ1c2ItPnBvcnQsIHR0eSwgZmlscCk7Cit9CisKK3N0 YXRpYyBpbnQgeHJ1c2JfcG9ydF9hY3RpdmF0ZShzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQsIHN0cnVj dCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IGNvbnRhaW5lcl9v Zihwb3J0LCBzdHJ1Y3QgeHJ1c2IsIHBvcnQpOworCWludCBydiA9IC1FTk9ERVY7CisKKwlkZXZf ZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCW11dGV4X2xv Y2soJnhydXNiLT5tdXRleCk7CisJaWYgKHhydXNiLT5kaXNjb25uZWN0ZWQpCisJCWdvdG8gZGlz Y29ubmVjdGVkOworCisJcnYgPSB1c2JfYXV0b3BtX2dldF9pbnRlcmZhY2UoeHJ1c2ItPmNvbnRy b2wpOworCWlmIChydikKKwkJZ290byBlcnJvcl9nZXRfaW50ZXJmYWNlOworCisJLyoKKwkgKiBG SVhNRTogV2h5IGRvIHdlIG5lZWQgdGhpcz8gQWxsb2NhdGluZyA2NEsgb2YgcGh5c2ljYWxseSBj b250aWd1b3VzCisJICogbWVtb3J5IGlzIHJlYWxseSBuYXN0eS4uLgorCSAqLworCXNldF9iaXQo VFRZX05PX1dSSVRFX1NQTElULCAmdHR5LT5mbGFncyk7CisJeHJ1c2ItPmNvbnRyb2wtPm5lZWRz X3JlbW90ZV93YWtldXAgPSAxOworCisJeHJ1c2ItPmN0cmx1cmItPmRldiA9IHhydXNiLT5kZXY7 CisJaWYgKHVzYl9zdWJtaXRfdXJiKHhydXNiLT5jdHJsdXJiLCBHRlBfS0VSTkVMKSkgeworCQlk ZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJIiVzIC0gdXNiX3N1Ym1pdF91cmIoY3Ry bCBpcnEpIGZhaWxlZFxuIiwgX19mdW5jX18pOworCQlnb3RvIGVycm9yX3N1Ym1pdF91cmI7CisJ fQorCisJeHJ1c2ItPmN0cmxvdXQgPSBYUlVTQl9DVFJMX0RUUiB8CisJCVhSVVNCX0NUUkxfUlRT OworCWlmICh4cnVzYl9zZXRfY29udHJvbCh4cnVzYiwgeHJ1c2ItPmN0cmxvdXQpIDwgMAorCQkm JiAoeHJ1c2ItPmN0cmxfY2FwcyAmIFVTQl9DRENfQ0FQX0xJTkUpKQorCQlnb3RvIGVycm9yX3Nl dF9jb250cm9sOworCisJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlKHhydXNiLT5jb250cm9sKTsK KworCS8qCisJICogVW50aHJvdHRsZSBkZXZpY2UgaW4gY2FzZSB0aGUgVFRZIHdhcyBjbG9zZWQg d2hpbGUgdGhyb3R0bGVkLgorCSAqLworCXNwaW5fbG9ja19pcnEoJnhydXNiLT5yZWFkX2xvY2sp OworCXhydXNiLT50aHJvdHRsZWQgPSAwOworCXhydXNiLT50aHJvdHRsZV9yZXEgPSAwOworCXNw aW5fdW5sb2NrX2lycSgmeHJ1c2ItPnJlYWRfbG9jayk7CisKKwlpZiAoeHJ1c2Jfc3VibWl0X3Jl YWRfdXJicyh4cnVzYiwgR0ZQX0tFUk5FTCkpCisJCWdvdG8gZXJyb3Jfc3VibWl0X3JlYWRfdXJi czsKKworCW11dGV4X3VubG9jaygmeHJ1c2ItPm11dGV4KTsKKworCXJldHVybiAwOworCitlcnJv cl9zdWJtaXRfcmVhZF91cmJzOgorCXhydXNiLT5jdHJsb3V0ID0gMDsKKwl4cnVzYl9zZXRfY29u dHJvbCh4cnVzYiwgeHJ1c2ItPmN0cmxvdXQpOworZXJyb3Jfc2V0X2NvbnRyb2w6CisJdXNiX2tp bGxfdXJiKHhydXNiLT5jdHJsdXJiKTsKK2Vycm9yX3N1Ym1pdF91cmI6CisJdXNiX2F1dG9wbV9w dXRfaW50ZXJmYWNlKHhydXNiLT5jb250cm9sKTsKK2Vycm9yX2dldF9pbnRlcmZhY2U6CitkaXNj b25uZWN0ZWQ6CisJbXV0ZXhfdW5sb2NrKCZ4cnVzYi0+bXV0ZXgpOworCXJldHVybiBydjsKK30K Kworc3RhdGljIHZvaWQgeHJ1c2JfcG9ydF9kZXN0cnVjdChzdHJ1Y3QgdHR5X3BvcnQgKnBvcnQp Cit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IGNvbnRhaW5lcl9vZihwb3J0LCBzdHJ1Y3QgeHJ1 c2IsIHBvcnQpOworCisJLy9kZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9f ZnVuY19fKTsKKworCXhydXNiX3JlbGVhc2VfbWlub3IoeHJ1c2IpOworCXVzYl9wdXRfaW50Zih4 cnVzYi0+Y29udHJvbCk7CisJa2ZyZWUoeHJ1c2IpOworfQorCitzdGF0aWMgdm9pZCB4cnVzYl9w b3J0X3NodXRkb3duKHN0cnVjdCB0dHlfcG9ydCAqcG9ydCkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhy dXNiID0gY29udGFpbmVyX29mKHBvcnQsIHN0cnVjdCB4cnVzYiwgcG9ydCk7CisJaW50IGk7CisK KwkvL2Rldl9kYmcoJnhydXNiLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCisJ bXV0ZXhfbG9jaygmeHJ1c2ItPm11dGV4KTsKKwlpZiAoIXhydXNiLT5kaXNjb25uZWN0ZWQpIHsK KwkJdXNiX2F1dG9wbV9nZXRfaW50ZXJmYWNlKHhydXNiLT5jb250cm9sKTsKKwkJeHJ1c2Jfc2V0 X2NvbnRyb2woeHJ1c2IsCisJCQl4cnVzYi0+Y3RybG91dCA9IDApOworCQl1c2Jfa2lsbF91cmIo eHJ1c2ItPmN0cmx1cmIpOworCQlmb3IgKGkgPSAwOyBpIDwgWFJVU0JfTlc7IGkrKykKKwkJCXVz Yl9raWxsX3VyYih4cnVzYi0+d2JbaV0udXJiKTsKKwkJZm9yIChpID0gMDsgaSA8IHhydXNiLT5y eF9idWZsaW1pdDsgaSsrKQorCQkJdXNiX2tpbGxfdXJiKHhydXNiLT5yZWFkX3VyYnNbaV0pOwor CQl4cnVzYi0+Y29udHJvbC0+bmVlZHNfcmVtb3RlX3dha2V1cCA9IDA7CisJCXVzYl9hdXRvcG1f cHV0X2ludGVyZmFjZSh4cnVzYi0+Y29udHJvbCk7CisJfQorCW11dGV4X3VubG9jaygmeHJ1c2It Pm11dGV4KTsKK30KKworc3RhdGljIHZvaWQgeHJ1c2JfdHR5X2NsZWFudXAoc3RydWN0IHR0eV9z dHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsK KwkvL2Rldl9kYmcoJnhydXNiLT5jb250cm9sLT5kZXYsICIlc1xuIiwgX19mdW5jX18pOworCXR0 eV9wb3J0X3B1dCgmeHJ1c2ItPnBvcnQpOworfQorCitzdGF0aWMgdm9pZCB4cnVzYl90dHlfaGFu Z3VwKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHR0 eS0+ZHJpdmVyX2RhdGE7CisJLy9kZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiJXNcbiIs IF9fZnVuY19fKTsKKwl0dHlfcG9ydF9oYW5ndXAoJnhydXNiLT5wb3J0KTsKK30KKworc3RhdGlj IHZvaWQgeHJ1c2JfdHR5X2Nsb3NlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHksIHN0cnVjdCBmaWxl ICpmaWxwKQoreworCXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB0dHktPmRyaXZlcl9kYXRhOworCS8v ZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRldiwgIiVzXG4iLCBfX2Z1bmNfXyk7CisJdHR5X3Bv cnRfY2xvc2UoJnhydXNiLT5wb3J0LCB0dHksIGZpbHApOworfQorCitzdGF0aWMgaW50IHhydXNi X3R0eV93cml0ZShzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQljb25zdCB1bnNpZ25lZCBjaGFy ICpidWYsIGludCBjb3VudCkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJf ZGF0YTsKKwlpbnQgc3RhdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCB3Ym47CisJc3Ry dWN0IHhydXNiX3diICp3YjsKKworCWlmICghY291bnQpCisJCXJldHVybiAwOworCisJLy9kZXZf dmRiZygmeHJ1c2ItPmRhdGEtPmRldiwgIiVzIC0gY291bnQgJWRcbiIsIF9fZnVuY19fLCBjb3Vu dCk7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmeHJ1c2ItPndyaXRlX2xvY2ssIGZsYWdzKTsKKwl3 Ym4gPSB4cnVzYl93Yl9hbGxvYyh4cnVzYik7CisJaWYgKHdibiA8IDApIHsKKwkJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmeHJ1c2ItPndyaXRlX2xvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisJ fQorCXdiID0gJnhydXNiLT53Ylt3Ym5dOworCisJaWYgKCF4cnVzYi0+ZGV2KSB7CisJCXdiLT51 c2UgPSAwOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4cnVzYi0+d3JpdGVfbG9jaywgZmxh Z3MpOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisKKwljb3VudCA9IChjb3VudCA+IHhydXNiLT53 cml0ZXNpemUpID8geHJ1c2ItPndyaXRlc2l6ZSA6IGNvdW50OworCS8vZGV2X3ZkYmcoJnhydXNi LT5kYXRhLT5kZXYsICIlcyAtIHdyaXRlICVkXG4iLCBfX2Z1bmNfXywgY291bnQpOworCW1lbWNw eSh3Yi0+YnVmLCBidWYsIGNvdW50KTsKKwl3Yi0+bGVuID0gY291bnQ7CisKKwl1c2JfYXV0b3Bt X2dldF9pbnRlcmZhY2VfYXN5bmMoeHJ1c2ItPmNvbnRyb2wpOworCWlmICh4cnVzYi0+c3VzcF9j b3VudCkgeworCQlpZiAoIXhydXNiLT5kZWxheWVkX3diKQorCQkJeHJ1c2ItPmRlbGF5ZWRfd2Ig PSB3YjsKKwkJZWxzZQorCQkJdXNiX2F1dG9wbV9wdXRfaW50ZXJmYWNlX2FzeW5jKHhydXNiLT5j b250cm9sKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmeHJ1c2ItPndyaXRlX2xvY2ssIGZs YWdzKTsKKwkJcmV0dXJuIGNvdW50OwkvKiBBIHdoaXRlIGxpZSAqLworCX0KKwl1c2JfbWFya19s YXN0X2J1c3koeHJ1c2ItPmRldik7CisKKwlzdGF0ID0geHJ1c2Jfc3RhcnRfd2IoeHJ1c2IsIHdi KTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ4cnVzYi0+d3JpdGVfbG9jaywgZmxhZ3MpOwor CisJaWYgKHN0YXQgPCAwKQorCQlyZXR1cm4gc3RhdDsKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0 YXRpYyBpbnQgeHJ1c2JfdHR5X3dyaXRlX3Jvb20oc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sK KwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsKKwkvKgorCSAqIERvIG5v dCBsZXQgdGhlIGxpbmUgZGlzY2lwbGluZSB0byBrbm93IHRoYXQgd2UgaGF2ZSBhIHJlc2VydmUs CisJICogb3IgaXQgbWlnaHQgZ2V0IHRvbyBlbnRodXNpYXN0aWMuCisJICovCisJcmV0dXJuIHhy dXNiX3diX2lzX2F2YWlsKHhydXNiKSA/CisJCXhydXNiLT53cml0ZXNpemUgOiAwOworfQorCitz dGF0aWMgaW50IHhydXNiX3R0eV9jaGFyc19pbl9idWZmZXIoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0 eSkKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsKKwkvKgorCSAq IGlmIHRoZSBkZXZpY2Ugd2FzIHVucGx1Z2dlZCB0aGVuIGFueSByZW1haW5pbmcgY2hhcmFjdGVy cyBmZWxsIG91dAorCSAqIG9mIHRoZSBjb25uZWN0b3IgOykKKwkgKi8KKwlpZiAoeHJ1c2ItPmRp c2Nvbm5lY3RlZCkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBUaGlzIGlzIGluYWNjdXJhdGUgKG92 ZXJjb3VudHMpLCBidXQgaXQgd29ya3MuCisJICovCisJcmV0dXJuIChYUlVTQl9OVyAtIHhydXNi X3diX2lzX2F2YWlsKHhydXNiKSkgKgorCQl4cnVzYi0+d3JpdGVzaXplOworfQorCitzdGF0aWMg dm9pZCB4cnVzYl90dHlfdGhyb3R0bGUoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzdHJ1 Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsKKworCXNwaW5fbG9ja19pcnEoJnhy dXNiLT5yZWFkX2xvY2spOworCXhydXNiLT50aHJvdHRsZV9yZXEgPSAxOworCXNwaW5fdW5sb2Nr X2lycSgmeHJ1c2ItPnJlYWRfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIHhydXNiX3R0eV91bnRo cm90dGxlKHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9 IHR0eS0+ZHJpdmVyX2RhdGE7CisJdW5zaWduZWQgaW50IHdhc190aHJvdHRsZWQ7CisKKwlzcGlu X2xvY2tfaXJxKCZ4cnVzYi0+cmVhZF9sb2NrKTsKKwl3YXNfdGhyb3R0bGVkID0geHJ1c2ItPnRo cm90dGxlZDsKKwl4cnVzYi0+dGhyb3R0bGVkID0gMDsKKwl4cnVzYi0+dGhyb3R0bGVfcmVxID0g MDsKKwlzcGluX3VubG9ja19pcnEoJnhydXNiLT5yZWFkX2xvY2spOworCisJaWYgKHdhc190aHJv dHRsZWQpCisJCXhydXNiX3N1Ym1pdF9yZWFkX3VyYnMoeHJ1c2IsIEdGUF9LRVJORUwpOworfQor CitzdGF0aWMgaW50IHhydXNiX3R0eV9icmVha19jdGwoc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSwg aW50IHN0YXRlKQoreworCXN0cnVjdCB4cnVzYiAqeHJ1c2IgPSB0dHktPmRyaXZlcl9kYXRhOwor CWludCBydjsKKworCXJ2ID0geHJ1c2Jfc2VuZF9icmVhayh4cnVzYiwgc3RhdGUgPyAweGZmZmYg OiAwKTsKKwlpZiAocnYgPCAwKQorCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiJXMg LSBzZW5kIGJyZWFrIGZhaWxlZFxuIiwKKwkJCV9fZnVuY19fKTsKKwlyZXR1cm4gcnY7Cit9CisK K3N0YXRpYyBpbnQgeHJ1c2JfdHR5X3Rpb2NtZ2V0KHN0cnVjdCB0dHlfc3RydWN0ICp0dHkpCit7 CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHR0eS0+ZHJpdmVyX2RhdGE7CisKKwlyZXR1cm4geHJ1 c2JfdGlvY21nZXQoeHJ1c2IpOworfQorCitzdGF0aWMgaW50IHhydXNiX3R0eV90aW9jbXNldChz dHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LAorCQkJICAgIHVuc2lnbmVkIGludCBzZXQsIHVuc2lnbmVk IGludCBjbGVhcikKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsK KworCXJldHVybiB4cnVzYl90aW9jbXNldCh4cnVzYiwgc2V0LCBjbGVhcik7Cit9CisKK3N0YXRp YyBpbnQgZ2V0X3NlcmlhbF9pbmZvKHN0cnVjdCB4cnVzYiAqeHJ1c2IsCisJCXN0cnVjdCBzZXJp YWxfc3RydWN0IF9fdXNlciAqaW5mbykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCB0bXA7CisK KwlpZiAoIWluZm8pCisJCXJldHVybiAtRUlOVkFMOworCisJbWVtc2V0KCZ0bXAsIDAsIHNpemVv Zih0bXApKTsKKwl0bXAuZmxhZ3MgPSBBU1lOQ19MT1dfTEFURU5DWTsKKwl0bXAueG1pdF9maWZv X3NpemUgPSB4cnVzYi0+d3JpdGVzaXplOworCXRtcC5iYXVkX2Jhc2UgPSBsZTMyX3RvX2NwdSh4 cnVzYi0+bGluZS5kd0RURVJhdGUpOworCXRtcC5jbG9zZV9kZWxheQk9IHhydXNiLT5wb3J0LmNs b3NlX2RlbGF5IC8gMTA7CisJdG1wLmNsb3Npbmdfd2FpdCA9IHhydXNiLT5wb3J0LmNsb3Npbmdf d2FpdCA9PQorCQlBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSA/IEFTWU5DX0NMT1NJTkdfV0FJVF9O T05FIDoKKwkJeHJ1c2ItPnBvcnQuY2xvc2luZ193YWl0IC8gMTA7CisKKwlpZiAoY29weV90b191 c2VyKGluZm8sICZ0bXAsIHNpemVvZih0bXApKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJZWxzZQor CQlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzZXRfc2VyaWFsX2luZm8oc3RydWN0IHhydXNi ICp4cnVzYiwKKwkJc3RydWN0IHNlcmlhbF9zdHJ1Y3QgX191c2VyICpuZXdpbmZvKQoreworCXN0 cnVjdCBzZXJpYWxfc3RydWN0IG5ld19zZXJpYWw7CisJdW5zaWduZWQgaW50IGNsb3Npbmdfd2Fp dCwgY2xvc2VfZGVsYXk7CisJaW50IHJ2ID0gMDsKKworCWlmIChjb3B5X2Zyb21fdXNlcigmbmV3 X3NlcmlhbCwgbmV3aW5mbywgc2l6ZW9mKG5ld19zZXJpYWwpKSkKKwkJcmV0dXJuIC1FRkFVTFQ7 CisKKwljbG9zZV9kZWxheSA9IG5ld19zZXJpYWwuY2xvc2VfZGVsYXkgKiAxMDsKKwljbG9zaW5n X3dhaXQgPSBuZXdfc2VyaWFsLmNsb3Npbmdfd2FpdCA9PSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9O RSA/CisJCQlBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSA6IG5ld19zZXJpYWwuY2xvc2luZ193YWl0 ICogMTA7CisKKwltdXRleF9sb2NrKCZ4cnVzYi0+cG9ydC5tdXRleCk7CisKKwlpZiAoIWNhcGFi bGUoQ0FQX1NZU19BRE1JTikpIHsKKwkJaWYgKChjbG9zZV9kZWxheSAhPSB4cnVzYi0+cG9ydC5j bG9zZV9kZWxheSkgfHwKKwkJICAgIChjbG9zaW5nX3dhaXQgIT0geHJ1c2ItPnBvcnQuY2xvc2lu Z193YWl0KSkKKwkJCXJ2ID0gLUVQRVJNOworCQllbHNlCisJCQlydiA9IC1FT1BOT1RTVVBQOwor CX0gZWxzZSB7CisJCXhydXNiLT5wb3J0LmNsb3NlX2RlbGF5ICA9IGNsb3NlX2RlbGF5OworCQl4 cnVzYi0+cG9ydC5jbG9zaW5nX3dhaXQgPSBjbG9zaW5nX3dhaXQ7CisJfQorCisJbXV0ZXhfdW5s b2NrKCZ4cnVzYi0+cG9ydC5tdXRleCk7CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHhy dXNiX3R0eV9pb2N0bChzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5LCB1bnNpZ25lZCBpbnQgY21kLAor CQl1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2 ZXJfZGF0YTsKKwlpbnQgcnYgPSAtRU5PSU9DVExDTUQ7CisJdW5zaWduZWQgaW50ICBjaGFubmVs LCBwYXJhbV9ydzsKKwlpbnQgYmF1ZF9yYXRlID0gMDsKKwlzdHJ1Y3QgdXNiX2NkY19saW5lX2Nv ZGluZyBuZXdsaW5lOworCXNob3J0IHJlZ192YWx1ZTsKKworCWNoYW5uZWwgPSB4cnVzYi0+Y2hh bm5lbDsKKwlzd2l0Y2ggKGNtZCkgeworCWNhc2UgVElPQ0dTRVJJQUw6IC8qIGdldHMgc2VyaWFs IHBvcnQgZGF0YSAqLworCQlydiA9IGdldF9zZXJpYWxfaW5mbyh4cnVzYiwKKwkJCShzdHJ1Y3Qg c2VyaWFsX3N0cnVjdCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBUSU9DU1NFUklB TDoKKwkJcnYgPSBzZXRfc2VyaWFsX2luZm8oeHJ1c2IsCisJCQkoc3RydWN0IHNlcmlhbF9zdHJ1 Y3QgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCWNhc2UgWFJVU0JfU0VUX0JBVUQ6CisJCWlm IChnZXRfdXNlcihiYXVkX3JhdGUsIChpbnQgX191c2VyICopYXJnKSkgeworCQkJZGV2X2RiZygm eHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCQkiZ2V0X3VzZXIgZXJyb3JcbiIpOworCQkJcmV0dXJu IC1FRkFVTFQ7CisJCX0KKwkJeHJ1c2ItPmxpbmUuZHdEVEVSYXRlID0gYmF1ZF9yYXRlOworCQlt ZW1jcHkoJm5ld2xpbmUsICYoeHJ1c2ItPmxpbmUpLAorCQkJc2l6ZW9mKHN0cnVjdCB1c2JfY2Rj X2xpbmVfY29kaW5nKSk7CisJCXhydXNiX2Rpc2FibGUoeHJ1c2IpOworCQlydiA9IHhydXNiX3Nl dF9saW5lKHhydXNiLCAmbmV3bGluZSk7CisJCXhydXNiX2VuYWJsZSh4cnVzYik7CisJCWJyZWFr OworCWNhc2UgWFJVU0JfTE9PUEJBQ0s6CisJCXJ2ID0geHJ1c2Jfc2V0X2xvb3BiYWNrKHhydXNi LCBjaGFubmVsKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlicmVhazsK KwljYXNlIFhSVVNCX1NFVF9HUElPX01PREU6CisJCWlmIChnZXRfdXNlcihwYXJhbV9ydywgKGlu dCBfX3VzZXIgKilhcmcpKSB7CisJCQlkZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJ CSJnZXRfdXNlciBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlydiA9IHhy dXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwgcGFy YW1fcncpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJ2ID0gMDsKKwkJ YnJlYWs7CisJY2FzZSBYUlVTQl9HRVRfR1BJT19NT0RFOgorCQlydiA9IHhydXNiX2dldF9yZWco eHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwgJnJlZ192YWx1ZSk7CisJ CWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJaWYgKHB1dF91c2VyKHJlZ192YWx1 ZSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2 LAorCQkJCSJwdXRfdXNlciBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQly diA9IDA7CisJCWJyZWFrOworCWNhc2UgWFJVU0JfU0VUX0dQSU9fRElSOgorCQlpZiAoZ2V0X3Vz ZXIocGFyYW1fcncsIChpbnQgX191c2VyICopYXJnKSkgeworCQkJZGV2X2RiZygmeHJ1c2ItPmNv bnRyb2wtPmRldiwKKwkJCQkiZ2V0X3VzZXIgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7 CisJCX0KKworCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51 YXJ0X2dwaW9fZGlyLAorCQkJKGludClwYXJhbV9ydyk7CisJCWlmIChydiA8IDApCisJCQlyZXR1 cm4gLUVGQVVMVDsKKwkJcnYgPSAwOworCQlicmVhazsKKwljYXNlIFhSVVNCX0dFVF9HUElPX0RJ UjoKKwkJcnYgPSB4cnVzYl9nZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9n cGlvX2RpciwKKwkJCSZyZWdfdmFsdWUpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFV TFQ7CisJCWlmIChwdXRfdXNlcihyZWdfdmFsdWUsIChpbnQgX191c2VyICopYXJnKSkgeworCQkJ ZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCQkicHV0X3VzZXIgZXJyb3JcbiIpOwor CQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcnYgPSAwOworCQlicmVhazsKKwljYXNlIFhSVVNC X1NFVF9HUElPX1NUQVRFOgorCQlpZiAoZ2V0X3VzZXIocGFyYW1fcncsIChpbnQgX191c2VyICop YXJnKSkgeworCQkJZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCQkiZ2V0X3VzZXIg ZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlydiA9IHhydXNiX3NldF9y ZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fc2V0LAorCQkJKGludClwYXJh bV9ydyk7CisKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlydiA9IDA7CisJ CWJyZWFrOworCWNhc2UgWFJVU0JfQ0xFQVJfR1BJT19TVEFURToKKwkJaWYgKGdldF91c2VyKHBh cmFtX3J3LCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCWRldl9kYmcoJnhydXNiLT5jb250cm9s LT5kZXYsCisJCQkJImdldF91c2VyIGVycm9yXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9 CisKKwkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9n cGlvX2NsciwKKwkJCShpbnQpcGFyYW1fcncpOworCisJCWlmIChydiA8IDApCisJCQlyZXR1cm4g LUVGQVVMVDsKKwkJcnYgPSAwOworCQlicmVhazsKKwljYXNlIFhSVVNCX0dFVF9HUElPX1NUQVRF OgorCQlydiA9IHhydXNiX2dldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dw aW9fc3RhdHVzLAorCQkJJnJlZ192YWx1ZSk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVG QVVMVDsKKwkJaWYgKHB1dF91c2VyKHJlZ192YWx1ZSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJ CQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJCSJwdXRfdXNlciBlcnJvclxuIik7 CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCQlydiA9IDA7CisJCWJyZWFrOworCWNhc2UgWFJV U0JfU0VUX0dQSU9fSU5UX01BU0s6CisJCWlmIChnZXRfdXNlcihwYXJhbV9ydywgKGludCBfX3Vz ZXIgKilhcmcpKSB7CisJCQlkZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJCSJnZXRf dXNlciBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJ2ID0geHJ1c2Jf c2V0X3JlZyh4cnVzYiwKKwkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19pbnRfbWFzaywKKwkJ CShpbnQpcGFyYW1fcncpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJ2 ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYUlVTQl9HRVRfR1BJT19JTlRfTUFTSzoKKwkJcnYgPSB4 cnVzYl9nZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX2ludF9tYXNr LAorCQkJJnJlZ192YWx1ZSk7CisJCWlmIChwdXRfdXNlcihyZWdfdmFsdWUsIChpbnQgX191c2Vy ICopYXJnKSkgeworCQkJZGV2X2VycigmeHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCQkicHV0X3Vz ZXIgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcnYgPSAwOworCQlicmVh azsKKwljYXNlIFhSVVNCX1NFVF9HUElPX1BVTExfVVA6CisJCWlmIChnZXRfdXNlcihwYXJhbV9y dywgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlkZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2 LAorCQkJCSJnZXRfdXNlciBlcnJvclxuIik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJ CXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVzYiwKKwkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19w dWxsX3VwX2VuYWJsZSwKKwkJCShpbnQpcGFyYW1fcncpOworCQlpZiAocnYgPCAwKQorCQkJcmV0 dXJuIC1FRkFVTFQ7CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYUlVTQl9HRVRfR1BJT19Q VUxMX1VQOgorCQlydiA9IHhydXNiX2dldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51 YXJ0X2dwaW9fcHVsbF91cF9lbmFibGUsCisJCQkmcmVnX3ZhbHVlKTsKKwkJaWYgKHB1dF91c2Vy KHJlZ192YWx1ZSwgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlkZXZfZXJyKCZ4cnVzYi0+Y29u dHJvbC0+ZGV2LAorCQkJCSJDYW5ub3QgcHV0IHVzZXIgcmVzdWx0XG4iKTsKKwkJCXJldHVybiAt RUZBVUxUOworCQl9CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYUlVTQl9TRVRfR1BJT19Q VUxMX0RPV046CisJCWlmIChnZXRfdXNlcihwYXJhbV9ydywgKGludCBfX3VzZXIgKilhcmcpKSB7 CisJCQlkZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJCSJnZXRfdXNlciBlcnJvclxu Iik7CisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJfQorCisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVz YiwKKwkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bpb19wdWxsX2Rvd25fZW5hYmxlLAorCQkJKGlu dClwYXJhbV9ydyk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcnYgPSAw OworCQlicmVhazsKKwljYXNlIFhSVVNCX0dFVF9HUElPX1BVTExfRE9XTjoKKwkJcnYgPSB4cnVz Yl9nZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX3B1bGxfZG93bl9l bmFibGUsCisJCQkmcmVnX3ZhbHVlKTsKKwkJaWYgKHB1dF91c2VyKHJlZ192YWx1ZSwgKGludCBf X3VzZXIgKilhcmcpKSB7CisJCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LAorCQkJCSJD YW5ub3QgcHV0IHVzZXIgcmVzdWx0XG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCXJ2 ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYUlVTQl9TRVRfR1BJT19PUEVOX0RSQUlOOgorCQlpZiAo Z2V0X3VzZXIocGFyYW1fcncsIChpbnQgX191c2VyICopYXJnKSkgeworCQkJZGV2X2RiZygmeHJ1 c2ItPmNvbnRyb2wtPmRldiwKKwkJCQkiZ2V0X3VzZXIgZXJyb3JcbiIpOworCQkJcmV0dXJuIC1F RkFVTFQ7CisJCX0KKworCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVn X21hcC51YXJ0X2dwaW9fb3Blbl9kcmFpbiwKKwkJCShpbnQpcGFyYW1fcncpOworCQlpZiAocnYg PCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYUlVT Ql9HRVRfR1BJT19PUEVOX0RSQUlOOgorCQlydiA9IHhydXNiX2dldF9yZWcoeHJ1c2IsCisJCQl4 cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fb3Blbl9kcmFpbiwKKwkJCSZyZWdfdmFsdWUpOworCQlp ZiAocHV0X3VzZXIocmVnX3ZhbHVlLCAoaW50IF9fdXNlciAqKWFyZykpIHsKKwkJCWRldl9lcnIo JnhydXNiLT5jb250cm9sLT5kZXYsCisJCQkJIkNhbm5vdCBwdXQgdXNlciByZXN1bHRcbiIpOwor CQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcnYgPSAwOworCQlicmVhazsKKworCWNhc2UgWFJV U0JfV0lERV9NT0RFOgorCQlpZiAoZ2V0X3VzZXIocGFyYW1fcncsIChpbnQgX191c2VyICopYXJn KSkgeworCQkJZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCQkiZ2V0X3VzZXIgZXJy b3JcbiIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKHBhcmFtX3J3KQorCQkJeHJ1 c2ItPndpZGVfbW9kZSA9IDE7IC8vIGVuYWJsZSB3aWRlIG1vZGUKKwkJZWxzZQorCQkJeHJ1c2It PndpZGVfbW9kZSA9IDA7IC8vIGRpc2FibGUgd2lkZSBtb2RlCisJCXJ2ID0geHJ1c2Jfc2V0X3dp ZGVfbW9kZSh4cnVzYiwKKwkJCXhydXNiLT53aWRlX21vZGUpOworCQlpZiAocnYgPCAwKQorCQkJ cmV0dXJuIC1FRkFVTFQ7CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYUlVTQl9MT1dfTEFU RU5DWV9NT0RFOgorCQlpZiAoZ2V0X3VzZXIocGFyYW1fcncsIChpbnQgX191c2VyICopYXJnKSkg eworCQkJZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRldiwKKwkJCQkiZ2V0X3VzZXIgZXJyb3Jc biIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJaWYgKHBhcmFtX3J3KSB7CisJCQkvLyBl bmFibGUgbG93IGxhdGVuY3kgbW9kZQorCQkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJ CXhydXNiLT5yZWdfbWFwLnVhcnRfbG93X2xhdGVuY3ksIDEpOworCQkJaWYgKHJ2IDwgMCkKKwkJ CQlyZXR1cm4gLUVGQVVMVDsKKworCQl9IGVsc2UgeworCQkJLy8gZGlzYWJsZSBsb3cgbGF0ZW5j eSBtb2RlCisJCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQkJeHJ1c2ItPnJlZ19tYXAu dWFydF9sb3dfbGF0ZW5jeSwgMCk7CisJCQlpZiAocnYgPCAwKQorCQkJCXJldHVybiAtRUZBVUxU OworCQl9CisJCXhydXNiLT5wb3J0X3NldHRpbmcubG93X2xhdGVuY3lfbW9kZSA9IHBhcmFtX3J3 OworCQlydiA9IDA7CisJCWJyZWFrOworCWNhc2UgWFJVU0JfR0VUX1RYQ1ZSX01PREU6CisJCWlm ICh4cnVzYi0+aGF2ZV90eGN2cl9jb25maWcpIHsKKwkJCWlmIChjb3B5X3RvX3VzZXIoKHZvaWQg X191c2VyICopYXJnLAorCQkJCSh2b2lkICopJih4cnVzYi0+cG9ydF9zZXR0aW5nKSwKKwkJCQlz aXplb2Yoc3RydWN0IHhydXNiX3NldHRpbmcpKSkgeworCQkJCXJldHVybiAtRUZBVUxUOworCQkJ fQorCQkJcnYgPSAwOworCQl9CisJCWJyZWFrOworCWNhc2UgWFJVU0JfU0VUX1RYQ1ZSX01PREU6 CisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSYoeHJ1c2ItPnBvcnRfc2V0dGluZyksCisJ CQkodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgeHJ1c2Jfc2V0dGluZykpKQorCQkJ cmV0dXJuIC1FRkFVTFQ7CisKKwkJcnYgPSB4cnVzYl9kaXNhYmxlX3R4dF9yeHQoeHJ1c2IpOwor CQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLy8gRW5hYmxlIEdQSU9zIDkt NiBhcyBvdXRwdXRzCisJCXJ2ID0geHJ1c2JfZ3Bpb19kaXJfb3V0KHhydXNiLCAweDNjMCk7CisJ CWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlydiA9IHNldF90eGN2cl9tb2Rl KHhydXNiLAorCQkJeHJ1c2ItPnBvcnRfc2V0dGluZy50eGN2cl9tb2RlKTsKKwkJaWYgKHJ2IDwg MCkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJ2ID0gdXBkYXRlX3BvcnRwYXJhbWZpbGUoeHJ1 c2IpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJ2ID0gMDsKKwkJYnJl YWs7CisJY2FzZSBYUlVTQl9TRVRfVEVSTV9NT0RFOgorCQlpZiAoY29weV9mcm9tX3VzZXIoKHZv aWQgKikmKHhydXNiLT5wb3J0X3NldHRpbmcpLAorCQkJKHZvaWQgX191c2VyICopYXJnLCBzaXpl b2Yoc3RydWN0IHhydXNiX3NldHRpbmcpKSkKKwkJCXJldHVybiAtRUZBVUxUOworCisJCXJ2ID0g eHJ1c2JfZGlzYWJsZV90eHRfcnh0KHhydXNiKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAt RUZBVUxUOworCisJCS8vIEVuYWJsZSBHUElPcyA5LTYgYXMgb3V0cHV0cworCQlydiA9IHhydXNi X2dwaW9fZGlyX291dCh4cnVzYiwgMHgzYzApOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1F RkFVTFQ7CisKKwkJcnYgPSBzZXRfdHhjdnJfdGVybV9tb2RlKHhydXNiLAorCQkJeHJ1c2ItPnBv cnRfc2V0dGluZy50ZXJtX21vZGUpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7 CisKKwkJcnYgPSB1cGRhdGVfcG9ydHBhcmFtZmlsZSh4cnVzYik7CisJCWlmIChydiA8IDApCisJ CQlyZXR1cm4gLUVGQVVMVDsKKwkJcnYgPSAwOworCQlicmVhazsKKwljYXNlIFhSVVNCX1NFVF9T TEVXX01PREU6CisJCWlmIChjb3B5X2Zyb21fdXNlcigodm9pZCAqKSYoeHJ1c2ItPnBvcnRfc2V0 dGluZyksCisJCQkodm9pZCBfX3VzZXIgKilhcmcsIHNpemVvZihzdHJ1Y3QgeHJ1c2Jfc2V0dGlu ZykpKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJcnYgPSB4cnVzYl9kaXNhYmxlX3R4dF9yeHQo eHJ1c2IpOworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisKKwkJLy8gRW5hYmxl IEdQSU9zIDktNiBhcyBvdXRwdXRzCisJCXJ2ID0geHJ1c2JfZ3Bpb19kaXJfb3V0KHhydXNiLCAw eDNjMCk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlydiA9IHNldF90 eGN2cl9zbGV3X21vZGUoeHJ1c2IsCisJCQl4cnVzYi0+cG9ydF9zZXR0aW5nLnNsZXdfbW9kZSk7 CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlydiA9IHVwZGF0ZV9wb3J0 cGFyYW1maWxlKHhydXNiKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQly diA9IDA7CisJCWJyZWFrOworCWNhc2UgWFJVU0JfU0VUX1JTNDg1X1BJTjoKKwkJaWYgKGNvcHlf ZnJvbV91c2VyKCh2b2lkICopJih4cnVzYi0+cG9ydF9zZXR0aW5nKSwKKwkJCSh2b2lkIF9fdXNl ciAqKWFyZywgc2l6ZW9mKHN0cnVjdCB4cnVzYl9zZXR0aW5nKSkpCisJCQlyZXR1cm4gLUVGQVVM VDsKKworCQlpZiAoeHJ1c2ItPnBvcnRfc2V0dGluZy50eGN2cl9tb2RlIDwgMikKKwkJCXJ2ID0g c2V0X3JzNDg1X3Bpbih4cnVzYiwgMCk7CisJCWVsc2UKKwkJCXJ2ID0gc2V0X3JzNDg1X3Bpbih4 cnVzYiwKKwkJCQl4cnVzYi0+cG9ydF9zZXR0aW5nLnR4Y3ZyX2Rpcl9waW4pOworCisJCWlmIChy diA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKworCQlydiA9IHVwZGF0ZV9wb3J0cGFyYW1maWxl KHhydXNiKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlydiA9IDA7CisJ CWJyZWFrOworCWNhc2UgWFJVU0JfRU5BQkxFX1JTNDg1X0xPVzoKKwkJcnYgPSB4cnVzYl9nZXRf cmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX21vZGUsICZyZWdfdmFsdWUp OworCQlpZiAocnYgPCAwKQorCQkJcmV0dXJuIC1FRkFVTFQ7CisJCXJlZ192YWx1ZSAmPSAweDNm NzsgLy8gYml0LTMgPSAwIGZvciBhY3RpdmUgbG93CisJCXJ2ID0geHJ1c2Jfc2V0X3JlZyh4cnVz YiwgeHJ1c2ItPnJlZ19tYXAudWFydF9ncGlvX21vZGUsCisJCQkoaW50KXJlZ192YWx1ZSk7CisJ CWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcnYgPSAwOworCQlicmVhazsKKwlj YXNlIFhSVVNCX1JTNDg1X0RFTEFZOgorCQlpZiAoZ2V0X3VzZXIocGFyYW1fcncsIChpbnQgX191 c2VyICopYXJnKSkgeworCQkJZGV2X2RiZygmeHJ1c2ItPmNvbnRyb2wtPmRldiwgImdldF91c2Vy IGVycm9yXG4iKTsKKwkJCXJldHVybiAtRUZBVUxUOworCQl9CisJCWlmIChwYXJhbV9ydykgewor CQkJcnYgPSB4cnVzYl9zZXRfcmVnKHhydXNiLAorCQkJCXhydXNiLT5yZWdfbWFwLnVhcnRfcnM0 ODVfZGVsYXksIDE1KTsKKwkJCWlmIChydiA8IDApCisJCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0g ZWxzZSB7CisJCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQkJeHJ1c2ItPnJlZ19tYXAu dWFydF9yczQ4NV9kZWxheSwgMCk7CisJCQlpZiAocnYgPCAwKQorCQkJCXJldHVybiAtRUZBVUxU OworCQl9CisJCXJ2ID0gMDsKKwkJYnJlYWs7CisJY2FzZSBYUlVTQl9FTkFCTEVfRFRSRFNSX0ZM T1c6CisJCWlmIChnZXRfdXNlcihwYXJhbV9ydywgKGludCBfX3VzZXIgKilhcmcpKSB7CisJCQlk ZXZfZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiZ2V0X3VzZXIgZXJyb3JcbiIpOworCQkJcmV0 dXJuIC1FRkFVTFQ7CisJCX0KKwkJLy8gVmFsdWUgPSBSZWFkIEdQSU9fTU9ERSByZWdpc3RlciAm IDB4MzAwOworCQkvLyBHUElPX01PREUgPSBWYWx1ZSB8IDB4MDI7CisJCS8vIEZMT1cgPSAweDE7 CisJCXJ2ID0geHJ1c2JfZ2V0X3JlZyh4cnVzYiwKKwkJCXhydXNiLT5yZWdfbWFwLnVhcnRfZ3Bp b19tb2RlLCAmcmVnX3ZhbHVlKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOwor CQlyZWdfdmFsdWUgJj0gMHgzMDA7CisJCXJlZ192YWx1ZSB8PSAweDAyOworCQlydiA9IHhydXNi X3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwKKwkJCShp bnQpcmVnX3ZhbHVlKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJldHVybiAtRUZBVUxUOworCQlydiA9 IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2Zsb3csCisJCQlV QVJUX0ZMT1dfTU9ERV9IVyk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJ cnYgPSAwOworCQlicmVhazsKKwljYXNlIFhSVVNCX0RJU0FCTEVfRkxPV19DT05UUk9MOgorCQlp ZiAoZ2V0X3VzZXIocGFyYW1fcncsIChpbnQgX191c2VyICopYXJnKSkgeworCQkJZGV2X2RiZygm eHJ1c2ItPmNvbnRyb2wtPmRldiwgImdldF91c2VyIGVycm9yXG4iKTsKKwkJCXJldHVybiAtRUZB VUxUOworCQl9CisJCS8vCVZhbHVlID0gUmVhZCBHUElPX01PREUgcmVnaXN0ZXIgJiAweDMwMDsK KwkJLy8JR1BJT19NT0RFID0gVmFsdWU7CisJCS8vCUZMT1cgPSAweDAwOworCQlydiA9IHhydXNi X2dldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51YXJ0X2dwaW9fbW9kZSwgJnJlZ192 YWx1ZSk7CisJCWlmIChydiA8IDApCisJCQlyZXR1cm4gLUVGQVVMVDsKKwkJcmVnX3ZhbHVlICY9 IDB4MzAwOworCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsCisJCQl4cnVzYi0+cmVnX21hcC51 YXJ0X2dwaW9fbW9kZSwKKwkJCShpbnQpcmVnX3ZhbHVlKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCXJl dHVybiAtRUZBVUxUOworCQlydiA9IHhydXNiX3NldF9yZWcoeHJ1c2IsIHhydXNiLT5yZWdfbWFw LnVhcnRfZmxvdywKKwkJCVVBUlRfRkxPV19NT0RFX05PTkUpOworCQlpZiAocnYgPCAwKQorCQkJ cmV0dXJuIC1FRkFVTFQ7CisJCWJyZWFrOworCWNhc2UgWFJVU0JfR0VUX0ZMT1dfQ09OVFJPTDoK KwkJcnYgPSB4cnVzYl9nZXRfcmVnKHhydXNiLAorCQkJeHJ1c2ItPnJlZ19tYXAudWFydF9mbG93 LCAmcmVnX3ZhbHVlKTsKKwkJaWYgKHB1dF91c2VyKHJlZ192YWx1ZSwgKGludCBfX3VzZXIgKilh cmcpKSB7CisJCQlkZXZfZXJyKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAicHV0X3VzZXIgZXJyb3Jc biIpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKwkJcnYgPSAwOworCQlicmVhazsKKwl9CisJ cmV0dXJuIHJ2OworfQorCitzdGF0aWMgdm9pZCB4cnVzYl90dHlfc2V0X3Rlcm1pb3Moc3RydWN0 IHR0eV9zdHJ1Y3QgKnR0eSwKKwkJc3RydWN0IGt0ZXJtaW9zICp0ZXJtaW9zX29sZCkKK3sKKwlz dHJ1Y3QgeHJ1c2IgKnhydXNiID0gdHR5LT5kcml2ZXJfZGF0YTsKKwlzdHJ1Y3Qga3Rlcm1pb3Mg KnRlcm1pb3MgPSAmdHR5LT50ZXJtaW9zOworCXVuc2lnbmVkIGludCAgIGNmbGFnID0gdGVybWlv cy0+Y19jZmxhZzsKKwlzdHJ1Y3QgdXNiX2NkY19saW5lX2NvZGluZyBuZXdsaW5lOworCWludCBu ZXdjdHJsID0geHJ1c2ItPmN0cmxvdXQ7CisKKwl4cnVzYl9kaXNhYmxlKHhydXNiKTsKKwluZXds aW5lLmR3RFRFUmF0ZSA9IGNwdV90b19sZTMyKHR0eV9nZXRfYmF1ZF9yYXRlKHR0eSkpOworCW5l d2xpbmUuYkNoYXJGb3JtYXQgPSB0ZXJtaW9zLT5jX2NmbGFnICYgQ1NUT1BCID8gMSA6IDA7CisJ bmV3bGluZS5iUGFyaXR5VHlwZSA9IHRlcm1pb3MtPmNfY2ZsYWcgJiBQQVJFTkIgPworCQkJCSh0 ZXJtaW9zLT5jX2NmbGFnICYgUEFST0REID8gMSA6IDIpICsKKwkJCQkodGVybWlvcy0+Y19jZmxh ZyAmIENNU1BBUiA/IDIgOiAwKSA6IDA7CisJeHJ1c2ItPndpZGVfbW9kZSA9IDA7CisJc3dpdGNo ICh0ZXJtaW9zLT5jX2NmbGFnICYgQ1NJWkUpIHsKKwljYXNlIENTNTovKnVzaW5nIENTNSByZXBs YWNlIG9mIHRoZSA5IGJpdCBkYXRhIG1vZGUqLworCQluZXdsaW5lLmJEYXRhQml0cyA9IDk7CisJ CXhydXNiLT53aWRlX21vZGUgPSAxOworCQlicmVhazsKKwljYXNlIENTNjoKKwkJbmV3bGluZS5i RGF0YUJpdHMgPSA2OworCQlicmVhazsKKwljYXNlIENTNzoKKwkJbmV3bGluZS5iRGF0YUJpdHMg PSA3OworCQlicmVhazsKKwljYXNlIENTODoKKwlkZWZhdWx0OgorCQluZXdsaW5lLmJEYXRhQml0 cyA9IDg7CisJCWJyZWFrOworCX0KKwkvKiBGSVhNRTogTmVlZHMgdG8gY2xlYXIgdW5zdXBwb3J0 ZWQgYml0cyBpbiB0aGUgdGVybWlvcyAqLworCXhydXNiLT5jbG9jYWwgPSAoKHRlcm1pb3MtPmNf Y2ZsYWcgJiBDTE9DQUwpICE9IDApOworCisJaWYgKCFuZXdsaW5lLmR3RFRFUmF0ZSkgeworCQlu ZXdsaW5lLmR3RFRFUmF0ZSA9IHhydXNiLT5saW5lLmR3RFRFUmF0ZTsKKwkJbmV3Y3RybCAmPSB+ WFJVU0JfQ1RSTF9EVFI7CisJfSBlbHNlCisJCW5ld2N0cmwgfD0gIFhSVVNCX0NUUkxfRFRSOwor CisJaWYgKG5ld2N0cmwgIT0geHJ1c2ItPmN0cmxvdXQpCisJCXhydXNiX3NldF9jb250cm9sKHhy dXNiLAorCQkJeHJ1c2ItPmN0cmxvdXQgPSBuZXdjdHJsKTsKKworCXhydXNiX3NldF9mbG93X21v ZGUoeHJ1c2IsIHR0eSwgY2ZsYWcpOworCWlmICh4cnVzYi0+d2lkZV9tb2RlKQorCQl4cnVzYl9z ZXRfd2lkZV9tb2RlKHhydXNiLCAxKTsKKwllbHNlIGlmICgheHJ1c2ItPndpZGVfbW9kZSkKKwkJ eHJ1c2Jfc2V0X3dpZGVfbW9kZSh4cnVzYiwgMCk7CisKKwlpZiAobWVtY21wKCZ4cnVzYi0+bGlu ZSwgJm5ld2xpbmUsIHNpemVvZihuZXdsaW5lKSkpIHsKKwkJbWVtY3B5KCZ4cnVzYi0+bGluZSwg Jm5ld2xpbmUsIHNpemVvZihuZXdsaW5lKSk7CisJCXhydXNiX3NldF9saW5lKHhydXNiLCAmeHJ1 c2ItPmxpbmUpOworCX0KKwl4cnVzYl9lbmFibGUoeHJ1c2IpOworfQorCitzdGF0aWMgY29uc3Qg c3RydWN0IHR0eV9wb3J0X29wZXJhdGlvbnMgeHJ1c2JfcG9ydF9vcHMgPSB7CisJLnNodXRkb3du ID0geHJ1c2JfcG9ydF9zaHV0ZG93biwKKwkuYWN0aXZhdGUgPSB4cnVzYl9wb3J0X2FjdGl2YXRl LAorCS5kZXN0cnVjdCA9IHhydXNiX3BvcnRfZGVzdHJ1Y3QsCit9OworCisvKgorICogVVNCIHBy b2JlIGFuZCBkaXNjb25uZWN0IHJvdXRpbmVzLgorICovCisKKy8qIExpdHRsZSBoZWxwZXJzOiB3 cml0ZS9yZWFkIGJ1ZmZlcnMgZnJlZSAqLworc3RhdGljIHZvaWQgeHJ1c2Jfd3JpdGVfYnVmZmVy c19mcmVlKHN0cnVjdCB4cnVzYiAqeHJ1c2IpCit7CisJaW50IGk7CisJc3RydWN0IHhydXNiX3di ICp3YjsKKworCWZvciAod2IgPSAmeHJ1c2ItPndiWzBdLCBpID0gMDsgaSA8IFhSVVNCX05XOyBp KyssIHdiKyspCisJCXVzYl9mcmVlX2NvaGVyZW50KHhydXNiLT5kZXYsCisJCQl4cnVzYi0+d3Jp dGVzaXplLCB3Yi0+YnVmLCB3Yi0+ZG1haCk7Cit9CisKK3N0YXRpYyB2b2lkIHhydXNiX3JlYWRf YnVmZmVyc19mcmVlKHN0cnVjdCB4cnVzYiAqeHJ1c2IpCit7CisJaW50IGk7CisKKwlmb3IgKGkg PSAwOyBpIDwgeHJ1c2ItPnJ4X2J1ZmxpbWl0OyBpKyspCisJCXVzYl9mcmVlX2NvaGVyZW50KHhy dXNiLT5kZXYsIHhydXNiLT5yZWFkc2l6ZSwKKwkJCSAgeHJ1c2ItPnJlYWRfYnVmZmVyc1tpXS5i YXNlLAorCQkJICB4cnVzYi0+cmVhZF9idWZmZXJzW2ldLmRtYSk7Cit9CisKKy8qIExpdHRsZSBo ZWxwZXI6IHdyaXRlIGJ1ZmZlcnMgYWxsb2NhdGUgKi8KK3N0YXRpYyBpbnQgeHJ1c2Jfd3JpdGVf YnVmZmVyc19hbGxvYyhzdHJ1Y3QgeHJ1c2IgKnhydXNiKQoreworCWludCBpOworCXN0cnVjdCB4 cnVzYl93YiAqd2I7CisKKwlmb3IgKHdiID0gJnhydXNiLT53YlswXSwgaSA9IDA7IGkgPCBYUlVT Ql9OVzsgaSsrLCB3YisrKSB7CisJCXdiLT5idWYgPSB1c2JfYWxsb2NfY29oZXJlbnQoeHJ1c2It PmRldiwKKwkJCXhydXNiLT53cml0ZXNpemUsIEdGUF9LRVJORUwsCisJCQkmd2ItPmRtYWgpOwor CQlpZiAoIXdiLT5idWYpIHsKKwkJCXdoaWxlIChpICE9IDApIHsKKwkJCQktLWk7CisJCQkJLS13 YjsKKwkJCQl1c2JfZnJlZV9jb2hlcmVudCh4cnVzYi0+ZGV2LAorCQkJCQl4cnVzYi0+d3JpdGVz aXplLAorCQkJCQl3Yi0+YnVmLCB3Yi0+ZG1haCk7CisJCQl9CisJCQlyZXR1cm4gLUVOT01FTTsK KwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4cnVzYl9wcm9iZShzdHJ1Y3Qg dXNiX2ludGVyZmFjZSAqaW50ZiwKKwkJICAgICBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCAq aWQpCit7CisJc3RydWN0IHVzYl9jZGNfdW5pb25fZGVzYyAqdW5pb25faGVhZGVyID0gTlVMTDsK Kwl1bnNpZ25lZCBjaGFyICpidWZmZXIgPSBpbnRmLT5hbHRzZXR0aW5nLT5leHRyYTsKKwlpbnQg YnVmbGVuID0gaW50Zi0+YWx0c2V0dGluZy0+ZXh0cmFsZW47CisJc3RydWN0IHVzYl9pbnRlcmZh Y2UgKmNvbnRyb2xfaW50ZXJmYWNlOworCXN0cnVjdCB1c2JfaW50ZXJmYWNlICpkYXRhX2ludGVy ZmFjZTsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmVwY3RybCA9IE5VTEw7CisJ c3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcHJlYWQgPSBOVUxMOworCXN0cnVjdCB1 c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZXB3cml0ZSA9IE5VTEw7CisJc3RydWN0IHVzYl9kZXZp Y2UgKnVzYl9kZXYgPSBpbnRlcmZhY2VfdG9fdXNiZGV2KGludGYpOworCXN0cnVjdCB4cnVzYiAq eHJ1c2I7CisJaW50IG1pbm9yOworCWludCBjdHJsc2l6ZSwgcmVhZHNpemU7CisJdTggKmJ1ZjsK Kwl1OCBhY19tYW5hZ2VtZW50X2Z1bmN0aW9uID0gMDsKKwl1OCBjYWxsX21hbmFnZW1lbnRfZnVu Y3Rpb24gPSAwOworCWludCBjYWxsX2ludGVyZmFjZV9udW0gPSAtMTsKKwlpbnQgZGF0YV9pbnRl cmZhY2VfbnVtID0gLTE7CisJdW5zaWduZWQgbG9uZyBxdWlya3M7CisJaW50IG51bV9yeF9idWY7 CisJaW50IGk7CisJaW50IGNvbWJpbmVkX2ludGVyZmFjZXMgPSAwOworCXN0cnVjdCBkZXZpY2Ug KnR0eV9kZXY7CisJaW50IHJ2ID0gLUVOT01FTTsKKworCS8qIG5vcm1hbCBxdWlya3MgKi8KKwlx dWlya3MgPSAodW5zaWduZWQgbG9uZylpZC0+ZHJpdmVyX2luZm87CisKKwlpZiAocXVpcmtzID09 IElHTk9SRV9ERVZJQ0UpCisJCXJldHVybiAtRU5PREVWOworCisJbnVtX3J4X2J1ZiA9IChxdWly a3MgPT0gU0lOR0xFX1JYX1VSQikgPyAxIDogWFJVU0JfTlI7CisKKwkvKiBoYW5kbGUgcXVpcmtz IGRlYWRseSB0byBub3JtYWwgcHJvYmluZyovCisJaWYgKHF1aXJrcyA9PSBOT19VTklPTl9OT1JN QUwpIHsKKwkJZGF0YV9pbnRlcmZhY2UgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwgMSk7CisJ CWNvbnRyb2xfaW50ZXJmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHVzYl9kZXYsIDApOworCQlnb3Rv IHNraXBfbm9ybWFsX3Byb2JlOworCX0KKworCS8qIG5vcm1hbCBwcm9iaW5nKi8KKwlpZiAoIWJ1 ZmZlcikgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJXZWlyZCBkZXNjcmlwdG9yIHJlZmVyZW5j ZXNcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIWJ1ZmxlbikgeworCQlpZiAo aW50Zi0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50ICYmCisJCQkJaW50Zi0+Y3VyX2FsdHNldHRp bmctPmVuZHBvaW50LT5leHRyYWxlbiAmJgorCQkJCWludGYtPmN1cl9hbHRzZXR0aW5nLT5lbmRw b2ludC0+ZXh0cmEpIHsKKwkJCWRldl9kYmcoJmludGYtPmRldiwKKwkJCQkiU2Vla2luZyBleHRy YSBkZXNjcmlwdG9ycyBvbiBlbmRwb2ludFxuIik7CisJCQlidWZsZW4gPSBpbnRmLT5jdXJfYWx0 c2V0dGluZy0+ZW5kcG9pbnQtPmV4dHJhbGVuOworCQkJYnVmZmVyID0gaW50Zi0+Y3VyX2FsdHNl dHRpbmctPmVuZHBvaW50LT5leHRyYTsKKwkJfSBlbHNlIHsKKwkJCWRldl9lcnIoJmludGYtPmRl diwKKwkJCQkiWmVybyBsZW5ndGggZGVzY3JpcHRvciByZWZlcmVuY2VzXG4iKTsKKwkJCXJldHVy biAtRUlOVkFMOworCQl9CisJfQorCisJd2hpbGUgKGJ1ZmxlbiA+IDApIHsKKwkJaWYgKGJ1ZmZl clsxXSAhPSBVU0JfRFRfQ1NfSU5URVJGQUNFKSB7CisJCQlkZXZfZXJyKCZpbnRmLT5kZXYsICJz a2lwcGluZyBnYXJiYWdlXG4iKTsKKwkJCWdvdG8gbmV4dF9kZXNjOworCQl9CisKKwkJc3dpdGNo IChidWZmZXJbMl0pIHsKKwkJY2FzZSBVU0JfQ0RDX1VOSU9OX1RZUEU6IC8qIHdlJ3ZlIGZvdW5k IGl0ICovCisJCQlpZiAodW5pb25faGVhZGVyKSB7CisJCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAi PiAxICB1bmlvbiBkZXNjcmlwdG9yIik7CisJCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAic2tpcHBp bmcgLi4uXG4iKTsKKwkJCQlnb3RvIG5leHRfZGVzYzsKKwkJCX0KKwkJCXVuaW9uX2hlYWRlciA9 IChzdHJ1Y3QgdXNiX2NkY191bmlvbl9kZXNjICopYnVmZmVyOworCQkJYnJlYWs7CisJCWNhc2Ug VVNCX0NEQ19IRUFERVJfVFlQRTogLyogbWF5YmUgY2hlY2sgdmVyc2lvbiAqLworCQkJYnJlYWs7 IC8qIGZvciBub3cgd2UgaWdub3JlIGl0ICovCisJCWNhc2UgVVNCX0NEQ19BQ01fVFlQRToKKwkJ CWFjX21hbmFnZW1lbnRfZnVuY3Rpb24gPSBidWZmZXJbM107CisJCQlicmVhazsKKwkJY2FzZSBV U0JfQ0RDX0NBTExfTUFOQUdFTUVOVF9UWVBFOgorCQkJY2FsbF9tYW5hZ2VtZW50X2Z1bmN0aW9u ID0gYnVmZmVyWzNdOworCQkJY2FsbF9pbnRlcmZhY2VfbnVtID0gYnVmZmVyWzRdOworCQkJLy9p ZiAoKHF1aXJrcyAmIE5PVF9BX01PREVNKSA9PSAwICYmCisJCQkvLwkoY2FsbF9tYW5hZ2VtZW50 X2Z1bmN0aW9uICYgMykgIT0gMykKKwkJCS8vCWRldl9lcnIoJmludGYtPmRldiwgIlRoaXMgZGV2 aWNlIGNhbm5vdAorCQkJLy8JCWRvIGNhbGxzIG9uIGl0cyBvd24uIEl0IGlzCisJCQkvLwkJbm90 IGEgbW9kZW0uXG4iKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogdGhlcmUgYXJlIExP VFMgbW9yZSBDREMgZGVzY3JpcHRvcnMgdGhhdAorCQkJICogY291bGQgbGVnaXRpbWF0ZWx5IGJl IGZvdW5kIGhlcmUuCisJCQkgKi8KKwkJCWRldl9kYmcoJmludGYtPmRldiwgIklnbm9yaW5nIGRl c2NyaXB0b3I6ICIpOworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAidHlwZSAlMDJ4LCBsZW5ndGgg JWRcbiIsCisJCQkJYnVmZmVyWzJdLCBidWZmZXJbMF0pOworCQkJYnJlYWs7CisJCX0KK25leHRf ZGVzYzoKKwkJYnVmbGVuIC09IGJ1ZmZlclswXTsKKwkJYnVmZmVyICs9IGJ1ZmZlclswXTsKKwl9 CisKKwlpZiAoIXVuaW9uX2hlYWRlcikgeworCQlpZiAoY2FsbF9pbnRlcmZhY2VfbnVtID4gMCkg eworCQkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiTm8gdW5pb24gZGVzY3JpcHRvciwgdXNpbmciKTsK KwkJCWRldl9kYmcoJmludGYtPmRldiwgIiBjYWxsIG1hbmFnZW1lbnQgZGVzY3JpcHRvclxuIik7 CisJCQkvKiBxdWlya3MgZm9yIERyb2lkcyBNdUluIExDRCAqLworCQkJaWYgKHF1aXJrcyAmIE5P X0RBVEFfSU5URVJGQUNFKQorCQkJCWRhdGFfaW50ZXJmYWNlID0gdXNiX2lmbnVtX3RvX2lmKHVz Yl9kZXYsIDApOworCQkJZWxzZQorCQkJCWRhdGFfaW50ZXJmYWNlID0gdXNiX2lmbnVtX3RvX2lm KHVzYl9kZXYsCisJCQkJCShkYXRhX2ludGVyZmFjZV9udW0gPQorCQkJCQkJY2FsbF9pbnRlcmZh Y2VfbnVtKSk7CisJCQljb250cm9sX2ludGVyZmFjZSA9IGludGY7CisJCX0gZWxzZSB7CisJCQlp ZiAoaW50Zi0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51bUVuZHBvaW50cyAhPSAzKSB7CisJCQkJ ZGV2X2RiZygmaW50Zi0+ZGV2LCAiTm8gdW5pb24gZGVzY3JpcHRvciwiKTsKKwkJCQlkZXZfZGJn KCZpbnRmLT5kZXYsICJnaXZpbmcgdXBcbiIpOworCQkJCXJldHVybiAtRU5PREVWOworCQkJfSBl bHNlIHsKKwkJCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiTm8gdW5pb24gZGVzY3JpcHRvciwgIik7 CisJCQkJZGV2X3dhcm4oJmludGYtPmRldiwgInRlc3RpbmcgZm9yIGNhc3RyYXRlZCBkZXZpY2Vc biIpOworCQkJCWNvbWJpbmVkX2ludGVyZmFjZXMgPSAxOworCQkJCWNvbnRyb2xfaW50ZXJmYWNl ID0gZGF0YV9pbnRlcmZhY2UgPSBpbnRmOworCQkJCWdvdG8gbG9va19mb3JfY29sbGFwc2VkX2lu dGVyZmFjZTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWNvbnRyb2xfaW50ZXJmYWNlID0gdXNi X2lmbnVtX3RvX2lmKHVzYl9kZXYsCisJCQl1bmlvbl9oZWFkZXItPmJNYXN0ZXJJbnRlcmZhY2Uw KTsKKwkJZGF0YV9pbnRlcmZhY2UgPSB1c2JfaWZudW1fdG9faWYodXNiX2RldiwKKwkJCShkYXRh X2ludGVyZmFjZV9udW0gPSB1bmlvbl9oZWFkZXItPmJTbGF2ZUludGVyZmFjZTApKTsKKwkJaWYg KCFjb250cm9sX2ludGVyZmFjZSB8fCAhZGF0YV9pbnRlcmZhY2UpIHsKKwkJCWRldl9kYmcoJmlu dGYtPmRldiwgIm5vIGludGVyZmFjZXNcbiIpOworCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KKwl9 CisKKwlpZiAoZGF0YV9pbnRlcmZhY2VfbnVtICE9IGNhbGxfaW50ZXJmYWNlX251bSkgeworCQlk ZXZfZGJnKCZpbnRmLT5kZXYsICJTZXBhcmF0ZSBjYWxsIGNvbnRyb2wgaW50ZXJmYWNlLiAiKTsK KwkJZGV2X2RiZygmaW50Zi0+ZGV2LCAiVGhhdCBpcyBub3QgZnVsbHkgc3VwcG9ydGVkLlxuIik7 CisJfQorCisJaWYgKGNvbnRyb2xfaW50ZXJmYWNlID09IGRhdGFfaW50ZXJmYWNlKSB7CisJCS8q IHNvbWUgYnJva2VuIGRldmljZXMgZGVzaWduZWQgZm9yIHdpbmRvd3Mgd29yayB0aGlzIHdheSAq LworCQlkZXZfd2FybigmaW50Zi0+ZGV2LCAiQ29udHJvbCBhbmQgZGF0YSBpbnRlcmZhY2VzIik7 CisJCWRldl93YXJuKCZpbnRmLT5kZXYsICJhcmUgbm90IHNlcGFyYXRlZCFcbiIpOworCQljb21i aW5lZF9pbnRlcmZhY2VzID0gMTsKKwkJLyogYSBwb3B1bGFyIG90aGVyIE9TIGRvZXNuJ3QgdXNl IGl0ICovCisJCXF1aXJrcyB8PSBOT19DQVBfTElORTsKKwkJaWYgKGRhdGFfaW50ZXJmYWNlLT5j dXJfYWx0c2V0dGluZy0+ZGVzYy5iTnVtRW5kcG9pbnRzICE9IDMpIHsKKwkJCWRldl9lcnIoJmlu dGYtPmRldiwgIlRoaXMgbmVlZHMgZXhhY3RseSAzIGVuZHBvaW50c1xuIik7CisJCQlyZXR1cm4g LUVJTlZBTDsKKwkJfQorbG9va19mb3JfY29sbGFwc2VkX2ludGVyZmFjZToKKwkJZm9yIChpID0g MDsgaSA8IDM7IGkrKykgeworCQkJc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICplcDsK KworCQkJZXAgPSAmZGF0YV9pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFtpXS5k ZXNjOworCisJCQlpZiAodXNiX2VuZHBvaW50X2lzX2ludF9pbihlcCkpCisJCQkJZXBjdHJsID0g ZXA7CisJCQllbHNlIGlmICh1c2JfZW5kcG9pbnRfaXNfYnVsa19vdXQoZXApKQorCQkJCWVwd3Jp dGUgPSBlcDsKKwkJCWVsc2UgaWYgKHVzYl9lbmRwb2ludF9pc19idWxrX2luKGVwKSkKKwkJCQll cHJlYWQgPSBlcDsKKwkJCWVsc2UKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoIWVw Y3RybCB8fCAhZXByZWFkIHx8ICFlcHdyaXRlKQorCQkJcmV0dXJuIC1FTk9ERVY7CisJCWVsc2UK KwkJCWdvdG8gbWFkZV9jb21wcmVzc2VkX3Byb2JlOworCX0KKworc2tpcF9ub3JtYWxfcHJvYmU6 CisKKwkvKndvcmthcm91bmQgZm9yIHN3aXRjaGVkIGludGVyZmFjZXMgKi8KKwlpZiAoZGF0YV9p bnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5kZXNjLmJJbnRlcmZhY2VDbGFzcworCQkJCQkJIT0g Q0RDX0RBVEFfSU5URVJGQUNFX1RZUEUpIHsKKwkJaWYgKGNvbnRyb2xfaW50ZXJmYWNlLT5jdXJf YWx0c2V0dGluZy0+ZGVzYy5iSW50ZXJmYWNlQ2xhc3MKKwkJCQkJCT09IENEQ19EQVRBX0lOVEVS RkFDRV9UWVBFKSB7CisJCQlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqdDsKKworCQkJZGV2X2RiZygm aW50Zi0+ZGV2LAorCQkJCSJZb3VyIGRldmljZSBoYXMgc3dpdGNoZWQgaW50ZXJmYWNlcy5cbiIp OworCQkJdCA9IGNvbnRyb2xfaW50ZXJmYWNlOworCQkJY29udHJvbF9pbnRlcmZhY2UgPSBkYXRh X2ludGVyZmFjZTsKKwkJCWRhdGFfaW50ZXJmYWNlID0gdDsKKwkJfSBlbHNlIHsKKwkJCXJldHVy biAtRUlOVkFMOworCQl9CisJfQorCisJLyogQWNjZXB0IHByb2JlIHJlcXVlc3RzIG9ubHkgZm9y IHRoZSBjb250cm9sIGludGVyZmFjZSAqLworCWlmICghY29tYmluZWRfaW50ZXJmYWNlcyAmJiBp bnRmICE9IGNvbnRyb2xfaW50ZXJmYWNlKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCWlmICghY29t YmluZWRfaW50ZXJmYWNlcyAmJiB1c2JfaW50ZXJmYWNlX2NsYWltZWQoZGF0YV9pbnRlcmZhY2Up KSB7CisJCS8qIHZhbGlkIGluIHRoaXMgY29udGV4dCAqLworCQlkZXZfZGJnKCZpbnRmLT5kZXYs ICJUaGUgZGF0YSBpbnRlcmZhY2UgaXNuJ3QgYXZhaWxhYmxlXG4iKTsKKwkJcmV0dXJuIC1FQlVT WTsKKwl9CisKKworCWlmIChkYXRhX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmRlc2MuYk51 bUVuZHBvaW50cyA8IDIgfHwKKwkgICAgY29udHJvbF9pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5n LT5kZXNjLmJOdW1FbmRwb2ludHMgPT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwllcGN0cmwg PSAmY29udHJvbF9pbnRlcmZhY2UtPmN1cl9hbHRzZXR0aW5nLT5lbmRwb2ludFswXS5kZXNjOwor CWVwcmVhZCA9ICZkYXRhX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50WzBdLmRl c2M7CisJZXB3cml0ZSA9ICZkYXRhX2ludGVyZmFjZS0+Y3VyX2FsdHNldHRpbmctPmVuZHBvaW50 WzFdLmRlc2M7CisKKworCS8qIHdvcmthcm91bmQgZm9yIHN3aXRjaGVkIGVuZHBvaW50cyAqLwor CWlmICghdXNiX2VuZHBvaW50X2Rpcl9pbihlcHJlYWQpKSB7CisJCS8qIGRlc2NyaXB0b3JzIGFy ZSBzd2FwcGVkICovCisJCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqdDsKKworCQlk ZXZfZGJnKCZpbnRmLT5kZXYsCisJCQkiVGhlIGRhdGEgaW50ZXJmYWNlIGhhcyBzd2l0Y2hlZCBl bmRwb2ludHNcbiIpOworCQl0ID0gZXByZWFkOworCQllcHJlYWQgPSBlcHdyaXRlOworCQllcHdy aXRlID0gdDsKKwl9CittYWRlX2NvbXByZXNzZWRfcHJvYmU6CisJZGV2X2RiZygmaW50Zi0+ZGV2 LCAiaW50ZXJmYWNlcyBhcmUgdmFsaWRcbiIpOworCisJeHJ1c2IgPSBremFsbG9jKHNpemVvZihz dHJ1Y3QgeHJ1c2IpLCBHRlBfS0VSTkVMKTsKKwlpZiAoeHJ1c2IgPT0gTlVMTCkgeworCQlkZXZf ZXJyKCZpbnRmLT5kZXYsICJvdXQgb2YgbWVtb3J5ICh4cnVzYiBremFsbG9jKVxuIik7CisJCWdv dG8gYWxsb2NfZmFpbDsKKwl9CisKKwltaW5vciA9IHhydXNiX2FsbG9jX21pbm9yKHhydXNiKTsK KwlpZiAobWlub3IgPT0gWFJVU0JfVFRZX01JTk9SUykgeworCQlkZXZfZXJyKCZpbnRmLT5kZXYs ICJubyBtb3JlIGZyZWUgeHJ1c2IgZGV2aWNlc1xuIik7CisJCWtmcmVlKHhydXNiKTsKKwkJcmV0 dXJuIC1FTk9ERVY7CisJfQorCisJY3RybHNpemUgPSB1c2JfZW5kcG9pbnRfbWF4cChlcGN0cmwp OworCXJlYWRzaXplID0gdXNiX2VuZHBvaW50X21heHAoZXByZWFkKSAqCisJCQkJKHF1aXJrcyA9 PSBTSU5HTEVfUlhfVVJCID8gMSA6IDIpOworCXhydXNiLT5jb21iaW5lZF9pbnRlcmZhY2VzID0g Y29tYmluZWRfaW50ZXJmYWNlczsKKwl4cnVzYi0+d3JpdGVzaXplID0gdXNiX2VuZHBvaW50X21h eHAoZXB3cml0ZSkgKiAyMDsKKwl4cnVzYi0+Y29udHJvbCA9IGNvbnRyb2xfaW50ZXJmYWNlOwor CXhydXNiLT5kYXRhID0gZGF0YV9pbnRlcmZhY2U7CisJeHJ1c2ItPm1pbm9yID0gbWlub3I7CisJ eHJ1c2ItPmRldiA9IHVzYl9kZXY7CisJeHJ1c2ItPmN0cmxfY2FwcyA9IGFjX21hbmFnZW1lbnRf ZnVuY3Rpb247CisJaWYgKHF1aXJrcyAmIE5PX0NBUF9MSU5FKQorCQl4cnVzYi0+Y3RybF9jYXBz ICY9IH5VU0JfQ0RDX0NBUF9MSU5FOworCXhydXNiLT5jdHJsc2l6ZSA9IGN0cmxzaXplOworCXhy dXNiLT5yZWFkc2l6ZSA9IHJlYWRzaXplOworCXhydXNiLT5yeF9idWZsaW1pdCA9IG51bV9yeF9i dWY7CisJSU5JVF9XT1JLKCZ4cnVzYi0+d29yaywgeHJ1c2Jfc29mdGludCk7CisJc3Bpbl9sb2Nr X2luaXQoJnhydXNiLT53cml0ZV9sb2NrKTsKKwlzcGluX2xvY2tfaW5pdCgmeHJ1c2ItPnJlYWRf bG9jayk7CisJbXV0ZXhfaW5pdCgmeHJ1c2ItPm11dGV4KTsKKwl4cnVzYi0+cnhfZW5kcG9pbnQg PSB1c2JfcmN2YnVsa3BpcGUodXNiX2RldiwgZXByZWFkLT5iRW5kcG9pbnRBZGRyZXNzKTsKKwl4 cnVzYi0+aXNfaW50X2VwID0gdXNiX2VuZHBvaW50X3hmZXJfaW50KGVwcmVhZCk7CisJaWYgKHhy dXNiLT5pc19pbnRfZXApCisJCXhydXNiLT5iSW50ZXJ2YWwgPSBlcHJlYWQtPmJJbnRlcnZhbDsK Kwl0dHlfcG9ydF9pbml0KCZ4cnVzYi0+cG9ydCk7CisJeHJ1c2ItPnBvcnQub3BzID0gJnhydXNi X3BvcnRfb3BzOworCXhydXNiLT5EZXZpY2VWZW5kb3IgPSBpZC0+aWRWZW5kb3I7CisJeHJ1c2It PkRldmljZVByb2R1Y3QgPSBpZC0+aWRQcm9kdWN0OworCisJeHJ1c2ItPmNoYW5uZWwgPSBlcHdy aXRlLT5iRW5kcG9pbnRBZGRyZXNzOworCS8vZGV2X2VycigmaW50Zi0+ZGV2LCAiZXB3cml0ZS0+ YkVuZHBvaW50QWRkcmVzcyA9JWRcbiIsCisJLy8JZXB3cml0ZS0+YkVuZHBvaW50QWRkcmVzcyk7 CisKKwlidWYgPSB1c2JfYWxsb2NfY29oZXJlbnQodXNiX2RldiwgY3RybHNpemUsIEdGUF9LRVJO RUwsCisJCSZ4cnVzYi0+Y3RybF9kbWEpOworCWlmICghYnVmKSB7CisJCWRldl9lcnIoJmludGYt PmRldiwgIm91dCBvZiBtZW1vcnkgKGN0cmwgYnVmZmVyIGFsbG9jKVxuIik7CisJCWdvdG8gYWxs b2NfZmFpbDI7CisJfQorCXhydXNiLT5jdHJsX2J1ZmZlciA9IGJ1ZjsKKworCWlmICh4cnVzYl93 cml0ZV9idWZmZXJzX2FsbG9jKHhydXNiKSA8IDApIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAi b3V0IG9mIG1lbW9yeSAod3JpdGUgYnVmZmVyIGFsbG9jKVxuIik7CisJCWdvdG8gYWxsb2NfZmFp bDQ7CisJfQorCisJeHJ1c2ItPmN0cmx1cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwp OworCWlmICgheHJ1c2ItPmN0cmx1cmIpIHsKKwkJZGV2X2VycigmaW50Zi0+ZGV2LCAib3V0IG9m IG1lbW9yeSAoY3RybHVyYiBrbWFsbG9jKVxuIik7CisJCWdvdG8gYWxsb2NfZmFpbDU7CisJfQor CWZvciAoaSA9IDA7IGkgPCBudW1fcnhfYnVmOyBpKyspIHsKKwkJc3RydWN0IHhydXNiX3JiICpy YiA9ICYoeHJ1c2ItPnJlYWRfYnVmZmVyc1tpXSk7CisJCXN0cnVjdCB1cmIgKnVyYjsKKworCQly Yi0+YmFzZSA9IHVzYl9hbGxvY19jb2hlcmVudCh4cnVzYi0+ZGV2LCByZWFkc2l6ZSwgR0ZQX0tF Uk5FTCwKKwkJCQkJCQkJJnJiLT5kbWEpOworCQlpZiAoIXJiLT5iYXNlKSB7CisJCQlkZXZfZXJy KCZpbnRmLT5kZXYsICJvdXQgb2YgbWVtb3J5ICIpOworCQkJZGV2X2VycigmaW50Zi0+ZGV2LCAi KHJlYWQgYnVmcyB1c2JfYWxsb2NfY29oZXJlbnQpXG4iKTsKKwkJCWdvdG8gYWxsb2NfZmFpbDY7 CisJCX0KKwkJcmItPmluZGV4ID0gaTsKKwkJcmItPmluc3RhbmNlID0geHJ1c2I7CisKKwkJdXJi ID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF1cmIpIHsKKwkJCWRldl9l cnIoJmludGYtPmRldiwgIm91dCBvZiBtZW1vcnkgIik7CisJCQlkZXZfZXJyKCZpbnRmLT5kZXYs ICIocmVhZCBidWZzIHVzYl9hbGxvY191cmIpXG4iKTsKKwkJCWdvdG8gYWxsb2NfZmFpbDY7CisJ CX0KKwkJdXJiLT50cmFuc2Zlcl9mbGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJ dXJiLT50cmFuc2Zlcl9kbWEgPSByYi0+ZG1hOworCQlpZiAoeHJ1c2ItPmlzX2ludF9lcCkgewor CQkJdXNiX2ZpbGxfaW50X3VyYih1cmIsIHhydXNiLT5kZXYsCisJCQkJCSB4cnVzYi0+cnhfZW5k cG9pbnQsCisJCQkJCSByYi0+YmFzZSwKKwkJCQkJIHhydXNiLT5yZWFkc2l6ZSwKKwkJCQkJIHhy dXNiX3JlYWRfYnVsa19jYWxsYmFjaywgcmIsCisJCQkJCSB4cnVzYi0+YkludGVydmFsKTsKKwkJ fSBlbHNlIHsKKwkJCXVzYl9maWxsX2J1bGtfdXJiKHVyYiwgeHJ1c2ItPmRldiwKKwkJCQkJICB4 cnVzYi0+cnhfZW5kcG9pbnQsCisJCQkJCSAgcmItPmJhc2UsCisJCQkJCSAgeHJ1c2ItPnJlYWRz aXplLAorCQkJCQkgIHhydXNiX3JlYWRfYnVsa19jYWxsYmFjaywgcmIpOworCQl9CisKKwkJeHJ1 c2ItPnJlYWRfdXJic1tpXSA9IHVyYjsKKwkJX19zZXRfYml0KGksICZ4cnVzYi0+cmVhZF91cmJz X2ZyZWUpOworCX0KKwlmb3IgKGkgPSAwOyBpIDwgWFJVU0JfTlc7IGkrKykgeworCQlzdHJ1Y3Qg eHJ1c2Jfd2IgKnNuZCA9ICYoeHJ1c2ItPndiW2ldKTsKKworCQlzbmQtPnVyYiA9IHVzYl9hbGxv Y191cmIoMCwgR0ZQX0tFUk5FTCk7CisJCWlmIChzbmQtPnVyYiA9PSBOVUxMKSB7CisJCQlkZXZf ZXJyKCZpbnRmLT5kZXYsICJvdXQgb2YgbWVtb3J5ICIpOworCQkJZGV2X2VycigmaW50Zi0+ZGV2 LCAiKHdyaXRlIHVyYnMgdXNiX2FsbG9jX3VyYilcbiIpOworCQkJZ290byBhbGxvY19mYWlsNzsK KwkJfQorCisJCWlmICh1c2JfZW5kcG9pbnRfeGZlcl9pbnQoZXB3cml0ZSkpCisJCQl1c2JfZmls bF9pbnRfdXJiKHNuZC0+dXJiLAorCQkJCXVzYl9kZXYsCisJCQkJdXNiX3NuZGludHBpcGUodXNi X2RldiwKKwkJCQkJZXB3cml0ZS0+YkVuZHBvaW50QWRkcmVzcyksCisJCQkJTlVMTCwKKwkJCQl4 cnVzYi0+d3JpdGVzaXplLAorCQkJCXhydXNiX3dyaXRlX2J1bGssCisJCQkJc25kLAorCQkJCWVw d3JpdGUtPmJJbnRlcnZhbCk7CisJCWVsc2UKKwkJCXVzYl9maWxsX2J1bGtfdXJiKHNuZC0+dXJi LAorCQkJCXVzYl9kZXYsCisJCQkJdXNiX3NuZGJ1bGtwaXBlKHVzYl9kZXYsCisJCQkJCWVwd3Jp dGUtPmJFbmRwb2ludEFkZHJlc3MpLAorCQkJCU5VTEwsCisJCQkJeHJ1c2ItPndyaXRlc2l6ZSwK KwkJCQl4cnVzYl93cml0ZV9idWxrLAorCQkJCXNuZCk7CisJCXNuZC0+dXJiLT50cmFuc2Zlcl9m bGFncyB8PSBVUkJfTk9fVFJBTlNGRVJfRE1BX01BUDsKKwkJc25kLT5pbnN0YW5jZSA9IHhydXNi OworCX0KKworCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgeHJ1c2IpOworCisJaSA9IGRldmljZV9j cmVhdGVfZmlsZSgmaW50Zi0+ZGV2LCAmZGV2X2F0dHJfYm1DYXBhYmlsaXRpZXMpOworCWlmIChp IDwgMCkKKwkJZ290byBhbGxvY19mYWlsNzsKKworCXVzYl9maWxsX2ludF91cmIoeHJ1c2ItPmN0 cmx1cmIsIHVzYl9kZXYsCisJCQkgdXNiX3JjdmludHBpcGUodXNiX2RldiwgZXBjdHJsLT5iRW5k cG9pbnRBZGRyZXNzKSwKKwkJCSB4cnVzYi0+Y3RybF9idWZmZXIsIGN0cmxzaXplLCB4cnVzYl9j dHJsX2lycSwgeHJ1c2IsCisJCQkgLyogd29ya3MgYXJvdW5kIGJ1Z2d5IGRldmljZXMgKi8KKwkJ CSBlcGN0cmwtPmJJbnRlcnZhbCA/IGVwY3RybC0+YkludGVydmFsIDogMHhmZik7CisJeHJ1c2It PmN0cmx1cmItPnRyYW5zZmVyX2ZsYWdzIHw9IFVSQl9OT19UUkFOU0ZFUl9ETUFfTUFQOworCXhy dXNiLT5jdHJsdXJiLT50cmFuc2Zlcl9kbWEgPSB4cnVzYi0+Y3RybF9kbWE7CisKKwkvL2Rldl9p bmZvKCZpbnRmLT5kZXYsICJ0dHlYUlVTQiVkOiBVU0IgWFJVU0IgZGV2aWNlXG4iLCBtaW5vcik7 CisKKwl4cnVzYl9yZWdfaW5pdCh4cnVzYik7CisKKwl4cnVzYl9zZXRfY29udHJvbCh4cnVzYiwg eHJ1c2ItPmN0cmxvdXQpOworCisJeHJ1c2ItPmxpbmUuZHdEVEVSYXRlID0gY3B1X3RvX2xlMzIo OTYwMCk7CisJeHJ1c2ItPmxpbmUuYkRhdGFCaXRzID0gODsKKwl4cnVzYl9zZXRfbGluZSh4cnVz YiwgJnhydXNiLT5saW5lKTsKKworCXVzYl9kcml2ZXJfY2xhaW1faW50ZXJmYWNlKCZ4cnVzYl9k cml2ZXIsIGRhdGFfaW50ZXJmYWNlLCB4cnVzYik7CisJdXNiX3NldF9pbnRmZGF0YShkYXRhX2lu dGVyZmFjZSwgeHJ1c2IpOworCisJdXNiX2dldF9pbnRmKGNvbnRyb2xfaW50ZXJmYWNlKTsKKwor CXR0eV9kZXYgPSB0dHlfcG9ydF9yZWdpc3Rlcl9kZXZpY2UoJnhydXNiLT5wb3J0LAorCQl4cnVz Yl90dHlfZHJpdmVyLCBtaW5vciwgJmNvbnRyb2xfaW50ZXJmYWNlLT5kZXYpOworCisJaWYgKElT X0VSUih0dHlfZGV2KSkgeworCQlydiA9IFBUUl9FUlIodHR5X2Rldik7CisJCWdvdG8gYWxsb2Nf ZmFpbDg7CisJfQorCisJcmV0dXJuIDA7CisKK2FsbG9jX2ZhaWw4OgorCWRldmljZV9yZW1vdmVf ZmlsZSgmeHJ1c2ItPmNvbnRyb2wtPmRldiwgJmRldl9hdHRyX2JtQ2FwYWJpbGl0aWVzKTsKK2Fs bG9jX2ZhaWw3OgorCXVzYl9zZXRfaW50ZmRhdGEoaW50ZiwgTlVMTCk7CisJZm9yIChpID0gMDsg aSA8IFhSVVNCX05XOyBpKyspCisJCXVzYl9mcmVlX3VyYih4cnVzYi0+d2JbaV0udXJiKTsKK2Fs bG9jX2ZhaWw2OgorCWZvciAoaSA9IDA7IGkgPCBudW1fcnhfYnVmOyBpKyspCisJCXVzYl9mcmVl X3VyYih4cnVzYi0+cmVhZF91cmJzW2ldKTsKKwl4cnVzYl9yZWFkX2J1ZmZlcnNfZnJlZSh4cnVz Yik7CisJdXNiX2ZyZWVfdXJiKHhydXNiLT5jdHJsdXJiKTsKK2FsbG9jX2ZhaWw1OgorCXhydXNi X3dyaXRlX2J1ZmZlcnNfZnJlZSh4cnVzYik7CithbGxvY19mYWlsNDoKKwl1c2JfZnJlZV9jb2hl cmVudCh1c2JfZGV2LCBjdHJsc2l6ZSwKKwkJeHJ1c2ItPmN0cmxfYnVmZmVyLCB4cnVzYi0+Y3Ry bF9kbWEpOworYWxsb2NfZmFpbDI6CisJeHJ1c2JfcmVsZWFzZV9taW5vcih4cnVzYik7CisJa2Zy ZWUoeHJ1c2IpOworYWxsb2NfZmFpbDoKKwlyZXR1cm4gcnY7Cit9CisKK3N0YXRpYyB2b2lkIHN0 b3BfZGF0YV90cmFmZmljKHN0cnVjdCB4cnVzYiAqeHJ1c2IpCit7CisJaW50IGk7CisKKwlkZXZf ZGJnKCZ4cnVzYi0+Y29udHJvbC0+ZGV2LCAiJXNcbiIsIF9fZnVuY19fKTsKKworCXVzYl9raWxs X3VyYih4cnVzYi0+Y3RybHVyYik7CisJZm9yIChpID0gMDsgaSA8IFhSVVNCX05XOyBpKyspCisJ CXVzYl9raWxsX3VyYih4cnVzYi0+d2JbaV0udXJiKTsKKwlmb3IgKGkgPSAwOyBpIDwgeHJ1c2It PnJ4X2J1ZmxpbWl0OyBpKyspCisJCXVzYl9raWxsX3VyYih4cnVzYi0+cmVhZF91cmJzW2ldKTsK KworCWNhbmNlbF93b3JrX3N5bmMoJnhydXNiLT53b3JrKTsKK30KKworc3RhdGljIHZvaWQgeHJ1 c2JfZGlzY29ubmVjdChzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgeHJ1 c2IgKnhydXNiID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlzdHJ1Y3QgdHR5X3N0cnVjdCAq dHR5OworCisJLyogc2libGluZyBpbnRlcmZhY2UgaXMgYWxyZWFkeSBjbGVhbmluZyB1cCAqLwor CWlmICgheHJ1c2IpCisJCXJldHVybjsKKworCW11dGV4X2xvY2soJnhydXNiLT5tdXRleCk7CisJ eHJ1c2ItPmRpc2Nvbm5lY3RlZCA9IHRydWU7CisKKwlkZXZpY2VfcmVtb3ZlX2ZpbGUoJnhydXNi LT5jb250cm9sLT5kZXYsCisJCSZkZXZfYXR0cl9ibUNhcGFiaWxpdGllcyk7CisJdXNiX3NldF9p bnRmZGF0YSh4cnVzYi0+Y29udHJvbCwgTlVMTCk7CisJdXNiX3NldF9pbnRmZGF0YSh4cnVzYi0+ ZGF0YSwgTlVMTCk7CisJbXV0ZXhfdW5sb2NrKCZ4cnVzYi0+bXV0ZXgpOworCisJdHR5ID0gdHR5 X3BvcnRfdHR5X2dldCgmeHJ1c2ItPnBvcnQpOworCWlmICh0dHkpIHsKKwkJdHR5X3ZoYW5ndXAo dHR5KTsKKwkJdHR5X2tyZWZfcHV0KHR0eSk7CisJfQorCisJc3RvcF9kYXRhX3RyYWZmaWMoeHJ1 c2IpOworCisJdHR5X3VucmVnaXN0ZXJfZGV2aWNlKHhydXNiX3R0eV9kcml2ZXIsIHhydXNiLT5t aW5vcik7CisKKwl4cnVzYl93cml0ZV9idWZmZXJzX2ZyZWUoeHJ1c2IpOworCXVzYl9mcmVlX2Nv aGVyZW50KHhydXNiLT5kZXYsIHhydXNiLT5jdHJsc2l6ZSwKKwkJeHJ1c2ItPmN0cmxfYnVmZmVy LCB4cnVzYi0+Y3RybF9kbWEpOworCXhydXNiX3JlYWRfYnVmZmVyc19mcmVlKHhydXNiKTsKKwor CWlmICgheHJ1c2ItPmNvbWJpbmVkX2ludGVyZmFjZXMpCisJCXVzYl9kcml2ZXJfcmVsZWFzZV9p bnRlcmZhY2UoJnhydXNiX2RyaXZlciwKKwkJCWludGYgPT0geHJ1c2ItPmNvbnRyb2wgPworCQkJ eHJ1c2ItPmRhdGEgOiB4cnVzYi0+Y29udHJvbCk7CisKKwl0dHlfcG9ydF9wdXQoJnhydXNiLT5w b3J0KTsKK30KKworI2lmZGVmIENPTkZJR19QTQorc3RhdGljIGludCB4cnVzYl9zdXNwZW5kKHN0 cnVjdCB1c2JfaW50ZXJmYWNlICppbnRmLCBwbV9tZXNzYWdlX3QgbWVzc2FnZSkKK3sKKwlzdHJ1 Y3QgeHJ1c2IgKnhydXNiID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKwlpbnQgY250OworCisJ aWYgKFBNU0dfSVNfQVVUTyhtZXNzYWdlKSkgeworCQlpbnQgYjsKKworCQlzcGluX2xvY2tfaXJx KCZ4cnVzYi0+d3JpdGVfbG9jayk7CisJCWIgPSB4cnVzYi0+dHJhbnNtaXR0aW5nOworCQlzcGlu X3VubG9ja19pcnEoJnhydXNiLT53cml0ZV9sb2NrKTsKKwkJaWYgKGIpCisJCQlyZXR1cm4gLUVC VVNZOworCX0KKworCXNwaW5fbG9ja19pcnEoJnhydXNiLT5yZWFkX2xvY2spOworCXNwaW5fbG9j aygmeHJ1c2ItPndyaXRlX2xvY2spOworCWNudCA9IHhydXNiLT5zdXNwX2NvdW50Kys7CisJc3Bp bl91bmxvY2soJnhydXNiLT53cml0ZV9sb2NrKTsKKwlzcGluX3VubG9ja19pcnEoJnhydXNiLT5y ZWFkX2xvY2spOworCisJaWYgKGNudCkKKwkJcmV0dXJuIDA7CisKKwlpZiAodGVzdF9iaXQoQVNZ TkNCX0lOSVRJQUxJWkVELCAmeHJ1c2ItPnBvcnQuZmxhZ3MpKQorCQlzdG9wX2RhdGFfdHJhZmZp Yyh4cnVzYik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCB4cnVzYl9yZXN1bWUoc3Ry dWN0IHVzYl9pbnRlcmZhY2UgKmludGYpCit7CisJc3RydWN0IHhydXNiICp4cnVzYiA9IHVzYl9n ZXRfaW50ZmRhdGEoaW50Zik7CisJc3RydWN0IHhydXNiX3diICp3YjsKKwlpbnQgcnYgPSAwOwor CWludCBjbnQ7CisKKwl4cnVzYl9yZWdfaW5pdCh4cnVzYik7CisKKwlzcGluX2xvY2tfaXJxKCZ4 cnVzYi0+cmVhZF9sb2NrKTsKKwl4cnVzYi0+c3VzcF9jb3VudCAtPSAxOworCWNudCA9IHhydXNi LT5zdXNwX2NvdW50OworCXNwaW5fdW5sb2NrX2lycSgmeHJ1c2ItPnJlYWRfbG9jayk7CisKKwlp ZiAoY250KQorCQlyZXR1cm4gMDsKKworCWlmICh0ZXN0X2JpdChBU1lOQ0JfSU5JVElBTElaRUQs ICZ4cnVzYi0+cG9ydC5mbGFncykpIHsKKwkJcnYgPSB1c2Jfc3VibWl0X3VyYih4cnVzYi0+Y3Ry bHVyYiwgR0ZQX05PSU8pOworCisJCXNwaW5fbG9ja19pcnEoJnhydXNiLT53cml0ZV9sb2NrKTsK KwkJaWYgKHhydXNiLT5kZWxheWVkX3diKSB7CisJCQl3YiA9IHhydXNiLT5kZWxheWVkX3diOwor CQkJeHJ1c2ItPmRlbGF5ZWRfd2IgPSBOVUxMOworCQkJc3Bpbl91bmxvY2tfaXJxKCZ4cnVzYi0+ d3JpdGVfbG9jayk7CisJCQl4cnVzYl9zdGFydF93Yih4cnVzYiwgd2IpOworCQl9IGVsc2Ugewor CQkJc3Bpbl91bmxvY2tfaXJxKCZ4cnVzYi0+d3JpdGVfbG9jayk7CisJCX0KKworCQkvKgorCQkg KiBkZWxheWVkIGVycm9yIGNoZWNraW5nIGJlY2F1c2Ugd2UgbXVzdAorCQkgKiBkbyB0aGUgd3Jp dGUgcGF0aCBhdCBhbGwgY29zdAorCQkgKi8KKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gZXJyX291 dDsKKworCQlydiA9IHhydXNiX3N1Ym1pdF9yZWFkX3VyYnMoeHJ1c2IsIEdGUF9OT0lPKTsKKwl9 CisKK2Vycl9vdXQ6CisJcmV0dXJuIHJ2OworfQorCitzdGF0aWMgaW50IHhydXNiX3Jlc2V0X3Jl c3VtZShzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqaW50ZikKK3sKKwlzdHJ1Y3QgeHJ1c2IgKnhydXNi ID0gdXNiX2dldF9pbnRmZGF0YShpbnRmKTsKKworCWlmICh0ZXN0X2JpdChBU1lOQ0JfSU5JVElB TElaRUQsICZ4cnVzYi0+cG9ydC5mbGFncykpCisJCXR0eV9wb3J0X3R0eV9oYW5ndXAoJnhydXNi LT5wb3J0LCBmYWxzZSk7CisJcmV0dXJuIHhydXNiX3Jlc3VtZShpbnRmKTsKK30KKworI2VuZGlm IC8qIENPTkZJR19QTSAqLworCisvKgorICogVVNCIGRyaXZlciBzdHJ1Y3R1cmUuCisgKi8KK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9pZCB4cnVzYl9pZHNbXSA9IHsKKwl7IFVTQl9E RVZJQ0UoMHgwNGUyLCAweDE0MTApfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGUyLCAweDE0MTEpfSwK Kwl7IFVTQl9ERVZJQ0UoMHgwNGUyLCAweDE0MTIpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGUyLCAw eDE0MTQpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGUyLCAweDE0MjApfSwKKwl7IFVTQl9ERVZJQ0Uo MHgwNGUyLCAweDE0MjIpfSwKKwl7IFVTQl9ERVZJQ0UoMHgwNGUyLCAweDE0MjQpfSwKKwl7IFVT Ql9ERVZJQ0UoMHgwNGUyLCAweDE0MDApfSwgLy8gWFIyMjgweCBjaCBBCisJeyBVU0JfREVWSUNF KDB4MDRlMiwgMHgxNDAxKX0sIC8vIFhSMjI4MHggY2ggQgorCXsgVVNCX0RFVklDRSgweDA0ZTIs IDB4MTQwMil9LCAvLyBYUjIyODB4IGNoIEMKKwl7IFVTQl9ERVZJQ0UoMHgwNGUyLCAweDE0MDMp fSwgLy8gWFIyMjgweCBjaCBECisJeyB9Cit9OworCitNT0RVTEVfREVWSUNFX1RBQkxFKHVzYiwg eHJ1c2JfaWRzKTsKKworc3RhdGljIHN0cnVjdCB1c2JfZHJpdmVyIHhydXNiX2RyaXZlciA9IHsK KwkubmFtZSA9CQkJInhydXNiX3NlcmlhbCIsCisJLnByb2JlID0JCXhydXNiX3Byb2JlLAorCS5k aXNjb25uZWN0ID0JCXhydXNiX2Rpc2Nvbm5lY3QsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1c3Bl bmQgPQkJeHJ1c2Jfc3VzcGVuZCwKKwkucmVzdW1lID0JCXhydXNiX3Jlc3VtZSwKKwkucmVzZXRf cmVzdW1lID0JCXhydXNiX3Jlc2V0X3Jlc3VtZSwKKyNlbmRpZgorCS5pZF90YWJsZSA9CQl4cnVz Yl9pZHMsCisjaWZkZWYgQ09ORklHX1BNCisJLnN1cHBvcnRzX2F1dG9zdXNwZW5kID0gMSwKKyNl bmRpZgorCS5kaXNhYmxlX2h1Yl9pbml0aWF0ZWRfbHBtID0gMSwKK307CisKKy8qCisgKiBUVFkg ZHJpdmVyIHN0cnVjdHVyZXMuCisgKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCB0dHlfb3BlcmF0 aW9ucyB4cnVzYl9vcHMgPSB7CisJLmluc3RhbGwgPQkJeHJ1c2JfdHR5X2luc3RhbGwsCisJLm9w ZW4gPQkJCXhydXNiX3R0eV9vcGVuLAorCS5jbG9zZSA9CQl4cnVzYl90dHlfY2xvc2UsCisJLmNs ZWFudXAgPQkJeHJ1c2JfdHR5X2NsZWFudXAsCisJLmhhbmd1cCA9CQl4cnVzYl90dHlfaGFuZ3Vw LAorCS53cml0ZSA9CQl4cnVzYl90dHlfd3JpdGUsCisJLndyaXRlX3Jvb20gPQkJeHJ1c2JfdHR5 X3dyaXRlX3Jvb20sCisJLmlvY3RsID0JCXhydXNiX3R0eV9pb2N0bCwKKwkudGhyb3R0bGUgPQkJ eHJ1c2JfdHR5X3Rocm90dGxlLAorCS51bnRocm90dGxlID0JCXhydXNiX3R0eV91bnRocm90dGxl LAorCS5jaGFyc19pbl9idWZmZXIgPQl4cnVzYl90dHlfY2hhcnNfaW5fYnVmZmVyLAorCS5icmVh a19jdGwgPQkJeHJ1c2JfdHR5X2JyZWFrX2N0bCwKKwkuc2V0X3Rlcm1pb3MgPQkJeHJ1c2JfdHR5 X3NldF90ZXJtaW9zLAorCS50aW9jbWdldCA9CQl4cnVzYl90dHlfdGlvY21nZXQsCisJLnRpb2Nt c2V0ID0JCXhydXNiX3R0eV90aW9jbXNldCwKK307CisKKy8qCisgKiBJbml0IC8gZXhpdC4KKyAq LworCitzdGF0aWMgaW50IF9faW5pdCB4cnVzYl9pbml0KHZvaWQpCit7CisJaW50IHJ2OworCisJ eHJ1c2JfdHR5X2RyaXZlciA9IGFsbG9jX3R0eV9kcml2ZXIoWFJVU0JfVFRZX01JTk9SUyk7CisJ aWYgKCF4cnVzYl90dHlfZHJpdmVyKQorCQlyZXR1cm4gLUVOT01FTTsKKwl4cnVzYl90dHlfZHJp dmVyLT5kcml2ZXJfbmFtZSA9ICJ4cnVzYiIsCisJeHJ1c2JfdHR5X2RyaXZlci0+bmFtZSA9ICJ0 dHlYUlVTQiIsCisJeHJ1c2JfdHR5X2RyaXZlci0+bWFqb3IgPSBYUlVTQl9UVFlfTUFKT1IsCisJ eHJ1c2JfdHR5X2RyaXZlci0+bWlub3Jfc3RhcnQgPSAwLAorCXhydXNiX3R0eV9kcml2ZXItPnR5 cGUgPSBUVFlfRFJJVkVSX1RZUEVfU0VSSUFMLAorCXhydXNiX3R0eV9kcml2ZXItPnN1YnR5cGUg PSBTRVJJQUxfVFlQRV9OT1JNQUwsCisJeHJ1c2JfdHR5X2RyaXZlci0+ZmxhZ3MgPSBUVFlfRFJJ VkVSX1JFQUxfUkFXIHwgVFRZX0RSSVZFUl9EWU5BTUlDX0RFVjsKKwl4cnVzYl90dHlfZHJpdmVy LT5pbml0X3Rlcm1pb3MgPSB0dHlfc3RkX3Rlcm1pb3M7CisJeHJ1c2JfdHR5X2RyaXZlci0+aW5p dF90ZXJtaW9zLmNfY2ZsYWcgPSBCOTYwMCB8IENTOCB8CisJCUNSRUFEIHwgSFVQQ0wgfCBDTE9D QUw7CisJdHR5X3NldF9vcGVyYXRpb25zKHhydXNiX3R0eV9kcml2ZXIsICZ4cnVzYl9vcHMpOwor CisJcnYgPSB0dHlfcmVnaXN0ZXJfZHJpdmVyKHhydXNiX3R0eV9kcml2ZXIpOworCWlmIChydikg eworCQlwdXRfdHR5X2RyaXZlcih4cnVzYl90dHlfZHJpdmVyKTsKKwkJcmV0dXJuIHJ2OworCX0K KworCXJ2ID0gdXNiX3JlZ2lzdGVyKCZ4cnVzYl9kcml2ZXIpOworCWlmIChydikgeworCQl0dHlf dW5yZWdpc3Rlcl9kcml2ZXIoeHJ1c2JfdHR5X2RyaXZlcik7CisJCXB1dF90dHlfZHJpdmVyKHhy dXNiX3R0eV9kcml2ZXIpOworCQlyZXR1cm4gcnY7CisJfQorCisJcHJpbnRrKEtFUk5fSU5GTyBL QlVJTERfTU9ETkFNRSAiOiAiIERSSVZFUl9ERVNDICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyB2b2lkIF9fZXhpdCB4cnVzYl9leGl0KHZvaWQpCit7CisJdXNiX2RlcmVnaXN0ZXIo JnhydXNiX2RyaXZlcik7CisJdHR5X3VucmVnaXN0ZXJfZHJpdmVyKHhydXNiX3R0eV9kcml2ZXIp OworCXB1dF90dHlfZHJpdmVyKHhydXNiX3R0eV9kcml2ZXIpOworfQorCittb2R1bGVfaW5pdCh4 cnVzYl9pbml0KTsKK21vZHVsZV9leGl0KHhydXNiX2V4aXQpOworCitNT0RVTEVfQVVUSE9SKERS SVZFUl9BVVRIT1IpOworTU9EVUxFX0RFU0NSSVBUSU9OKERSSVZFUl9ERVNDKTsKK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BTElBU19DSEFSREVWX01BSk9SKFhSVVNCX1RUWV9NQUpP Uik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmggYi9kcml2 ZXJzL3VzYi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAwLi5jNGIyMTRiM2U1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Vz Yi9zZXJpYWwveHJ1c2Jfc2VyaWFsLmgKQEAgLTAsMCArMSw0NDggQEAKKy8qIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisvKgorICogSW5jbHVkZXMgZm9yIHhydXNiX3Nlcmlh bC5jCisgKi8KKworLyoKKyAqIENNU1BBUiwgc29tZSBhcmNoaXRlY3R1cmVzIGNhbid0IGhhdmUg c3BhY2UgYW5kIG1hcmsgcGFyaXR5LgorICovCisKKyNpZm5kZWYgQ01TUEFSCisjZGVmaW5lIENN U1BBUgkJMAorI2VuZGlmCisKKy8qCisgKiBNYWpvciBhbmQgbWlub3IgbnVtYmVycy4KKyAqLwor CisjZGVmaW5lIFhSVVNCX1RUWV9NQUpPUgkJMjY2CisjZGVmaW5lIFhSVVNCX1RUWV9NSU5PUlMJ MjU2CisKKy8qCisgKiBSZXF1ZXN0cy4KKyAqLworCisjZGVmaW5lIFVTQl9SVF9YUlVTQgkJKFVT Ql9UWVBFX0NMQVNTIHwgVVNCX1JFQ0lQX0lOVEVSRkFDRSkKKworLyoKKyAqIE91dHB1dCBjb250 cm9sIGxpbmVzLgorICovCisKKyNkZWZpbmUgWFJVU0JfQ1RSTF9EVFIJCTB4MDEKKyNkZWZpbmUg WFJVU0JfQ1RSTF9SVFMJCTB4MDIKKworLyoKKyAqIElucHV0IGNvbnRyb2wgbGluZXMgYW5kIGxp bmUgZXJyb3JzLgorICovCisKKyNkZWZpbmUgWFJVU0JfQ1RSTF9EQ0QJCTB4MDEKKyNkZWZpbmUg WFJVU0JfQ1RSTF9EU1IJCTB4MDIKKyNkZWZpbmUgWFJVU0JfQ1RSTF9CUksJCTB4MDQKKyNkZWZp bmUgWFJVU0JfQ1RSTF9SSQkJMHgwOAorCisjZGVmaW5lIFhSVVNCX0NUUkxfRlJBTUlORwkweDEw CisjZGVmaW5lIFhSVVNCX0NUUkxfUEFSSVRZCTB4MjAKKyNkZWZpbmUgWFJVU0JfQ1RSTF9PVkVS UlVOCTB4NDAKKworLyoKKyAqIEludGVybmFsIGRyaXZlciBzdHJ1Y3R1cmVzLgorICovCisKKy8q CisgKiBUaGUgb25seSByZWFzb24gdG8gaGF2ZSBzZXZlcmFsIGJ1ZmZlcnMgaXMgdG8gYWNjb21t b2RhdGUgYXNzdW1wdGlvbnMKKyAqIGluIGxpbmUgZGlzY2lwbGluZXMuIFRoZXkgYXNrIGZvciBl bXB0eSBzcGFjZSBhbW91bnQsIHJlY2VpdmUgb3VyIFVSQiBzaXplLAorICogYW5kIHByb2NlZWQg dG8gaXNzdWUgc2V2ZXJhbCAxLWNoYXJhY3RlciB3cml0ZXMsIGFzc3VtaW5nIHRoZXkgd2lsbCBm aXQuCisgKiBUaGUgdmVyeSBmaXJzdCB3cml0ZSB0YWtlcyBhIGNvbXBsZXRlIFVSQi4gRm9ydHVu YXRlbHksIHRoaXMgb25seSBoYXBwZW5zCisgKiB3aGVuIHByb2Nlc3Npbmcgb25sY3IsIHNvIHdl IG9ubHkgbmVlZCAyIGJ1ZmZlcnMuIFRoZXNlIHZhbHVlcyBtdXN0IGJlCisgKiBwb3dlcnMgb2Yg Mi4KKyAqLworCisjZGVmaW5lIFhSVVNCX05XICAxNgorI2RlZmluZSBYUlVTQl9OUiAgMTYKKwor I2RlZmluZSBXSURFX01PREVfUEFSSVRZCTB4MQorI2RlZmluZSBXSURFX01PREVfQlJFQUsJCTB4 MgorI2RlZmluZSBXSURFX01PREVfRlJBTUUJCTB4NAorI2RlZmluZSBXSURFX01PREVfT1ZFUlJV TgkweDgKKworc3RydWN0IHhydXNiX3diIHsKKwl1bnNpZ25lZCBjaGFyICpidWY7CisJZG1hX2Fk ZHJfdCBkbWFoOworCWludCBsZW47CisJaW50IHVzZTsKKwlzdHJ1Y3QgdXJiCSp1cmI7CisJc3Ry dWN0IHhydXNiCSppbnN0YW5jZTsKK307CisKK3N0cnVjdCB4cnVzYl9yYiB7CisJaW50CXNpemU7 CisJdW5zaWduZWQgY2hhcgkqYmFzZTsKKwlkbWFfYWRkcl90CWRtYTsKKwlpbnQJaW5kZXg7CisJ c3RydWN0IHhydXNiCSppbnN0YW5jZTsKK307CisKK3N0cnVjdCByZWdfYWRkcl9tYXAgeworCXVu c2lnbmVkIGludCB1YXJ0X2VuYWJsZTsKKwl1bnNpZ25lZCBpbnQgdWFydF9mb3JtYXQ7CisJdW5z aWduZWQgaW50IHVhcnRfZmxvdzsKKwl1bnNpZ25lZCBpbnQgdWFydF94b25fY2hhcjsKKwl1bnNp Z25lZCBpbnQgdWFydF94b2ZmX2NoYXI7CisJdW5zaWduZWQgaW50IHVhcnRfdHhfYnJlYWs7CisJ dW5zaWduZWQgaW50IHVhcnRfcnM0ODVfZGVsYXk7CisJdW5zaWduZWQgaW50IHVhcnRfZ3Bpb19t b2RlOworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9fZGlyOworCXVuc2lnbmVkIGludCB1YXJ0X2dw aW9fc2V0OworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9fY2xyOworCXVuc2lnbmVkIGludCB1YXJ0 X2dwaW9fc3RhdHVzOworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9faW50X21hc2s7CisJdW5zaWdu ZWQgaW50IHVhcnRfY3VzdG9taXplZF9pbnQ7CisJdW5zaWduZWQgaW50IHVhcnRfZ3Bpb19vcGVu X2RyYWluOworCXVuc2lnbmVkIGludCB1YXJ0X2dwaW9fcHVsbF91cF9lbmFibGU7CisJdW5zaWdu ZWQgaW50IHVhcnRfZ3Bpb19wdWxsX2Rvd25fZW5hYmxlOworCXVuc2lnbmVkIGludCB1YXJ0X2xv b3BiYWNrOworCXVuc2lnbmVkIGludCB1YXJ0X2xvd19sYXRlbmN5OworCXVuc2lnbmVkIGludCB1 YXJ0X2N1c3RvbV9kcml2ZXI7Cit9OworCitzdHJ1Y3QgeHJ1c2Jfc2V0dGluZyB7CisJdW5zaWdu ZWQgaW50IHR4Y3ZyX21vZGUxX3BpbjsKKwl1bnNpZ25lZCBpbnQgdHhjdnJfbW9kZTBfcGluOwor CXVuc2lnbmVkIGludCB0eGN2cl9kaXJfcGluOworCXVuc2lnbmVkIGludCB0eGN2cl90ZXJtX3Bp bjsKKwl1bnNpZ25lZCBpbnQgdHhjdnJfc2xld19waW47CisJdW5zaWduZWQgaW50IHR4Y3ZyX21v ZGU7CisJdW5zaWduZWQgaW50IHRlcm1fbW9kZTsKKwl1bnNpZ25lZCBpbnQgc2xld19tb2RlOwor CXVuc2lnbmVkIGludCBsb3dfbGF0ZW5jeV9tb2RlOworfTsKKworc3RydWN0IHhydXNiIHsKKwlz dHJ1Y3QgdXNiX2RldmljZSAqZGV2OwkJCQkvKiB0aGUgY29ycmVzcG9uZGluZyB1c2IgZGV2aWNl ICovCisJc3RydWN0IHVzYl9pbnRlcmZhY2UgKmNvbnRyb2w7CQkJLyogY29udHJvbCBpbnRlcmZh Y2UgKi8KKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZSAqZGF0YTsJCQkvKiBkYXRhIGludGVyZmFjZSAq LworCXN0cnVjdCB0dHlfcG9ydCBwb3J0OwkJCQkvKiBvdXIgdHR5IHBvcnQgZGF0YSAqLworCXN0 cnVjdCB1cmIgKmN0cmx1cmI7CQkJCS8qIHVyYnMgKi8KKwl1OCAqY3RybF9idWZmZXI7CQkJCS8q IGJ1ZmZlcnMgb2YgdXJicyAqLworCWRtYV9hZGRyX3QgY3RybF9kbWE7CQkJCS8qIGRtYSBoYW5k bGVzIG9mIGJ1ZmZlcnMgKi8KKwlzdHJ1Y3QgeHJ1c2Jfd2Igd2JbWFJVU0JfTlddOworCXVuc2ln bmVkIGxvbmcgcmVhZF91cmJzX2ZyZWU7CisJc3RydWN0IHVyYiAqcmVhZF91cmJzW1hSVVNCX05S XTsKKwlzdHJ1Y3QgeHJ1c2JfcmIgcmVhZF9idWZmZXJzW1hSVVNCX05SXTsKKwlzdHJ1Y3QgeHJ1 c2Jfd2IgKnB1dGJ1ZmZlcjsKKwlpbnQgcnhfYnVmbGltaXQ7CisJaW50IHJ4X2VuZHBvaW50Owor CXNwaW5sb2NrX3QgcmVhZF9sb2NrOworCWludCB0cmFuc21pdHRpbmc7CisJc3BpbmxvY2tfdCB3 cml0ZV9sb2NrOworCXN0cnVjdCBtdXRleCBtdXRleDsKKwlib29sIGRpc2Nvbm5lY3RlZDsKKwlz dHJ1Y3QgdXNiX2NkY19saW5lX2NvZGluZyBsaW5lOwkJLyogYml0cywgc3RvcCwgcGFyaXR5ICov CisJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CQkJLyogd29yayBxdWV1ZSBlbnRyeSBmb3IgbGlu ZSBkaXNjaXBsaW5lIHdha2luZyB1cCAqLworCXVuc2lnbmVkIGludCBjdHJsaW47CQkJCS8qIGlu cHV0IGNvbnRyb2wgbGluZXMgKERDRCwgRFNSLCBSSSwgYnJlYWssIG92ZXJydW5zKSAqLworCXVu c2lnbmVkIGludCBjdHJsb3V0OwkJCQkvKiBvdXRwdXQgY29udHJvbCBsaW5lcyAoRFRSLCBSVFMp ICovCisJdW5zaWduZWQgaW50IHdyaXRlc2l6ZTsJCQkJLyogbWF4IHBhY2tldCBzaXplIGZvciB0 aGUgb3V0cHV0IGJ1bGsgZW5kcG9pbnQgKi8KKwl1bnNpZ25lZCBpbnQgcmVhZHNpemUsIGN0cmxz aXplOwkJCS8qIGJ1ZmZlciBzaXplcyBmb3IgZnJlZWluZyAqLworCXVuc2lnbmVkIGludCBtaW5v cjsJCQkJLyogeHJ1c2IgbWlub3IgbnVtYmVyICovCisJdW5zaWduZWQgY2hhciBjbG9jYWw7CQkJ CS8qIHRlcm1pb3MgQ0xPQ0FMICovCisJdW5zaWduZWQgaW50IGN0cmxfY2FwczsJCQkJLyogY29u dHJvbCBjYXBhYmlsaXRpZXMgZnJvbSB0aGUgY2xhc3Mgc3BlY2lmaWMgaGVhZGVyICovCisJdW5z aWduZWQgaW50IHN1c3BfY291bnQ7CQkJLyogbnVtYmVyIG9mIHN1c3BlbmRlZCBpbnRlcmZhY2Vz ICovCisJdW5zaWduZWQgaW50IGNvbWJpbmVkX2ludGVyZmFjZXM6MTsJCS8qIGNvbnRyb2wgYW5k IGRhdGEgY29sbGFwc2VkICovCisJdW5zaWduZWQgaW50IGlzX2ludF9lcDoxOwkJCS8qIGludGVy cnVwdCBlbmRwb2ludHMgY29udHJhcnkgdG8gc3BlYyB1c2VkICovCisJdW5zaWduZWQgaW50IHRo cm90dGxlZDoxOwkJCS8qIGFjdHVhbGx5IHRocm90dGxlZCAqLworCXVuc2lnbmVkIGludCB0aHJv dHRsZV9yZXE6MTsJCQkvKiB0aHJvdHRsZSByZXF1ZXN0ZWQgKi8KKwl1OCBiSW50ZXJ2YWw7CisK KwlzdHJ1Y3QgeHJ1c2Jfd2IgKmRlbGF5ZWRfd2I7CQkvKiB3cml0ZSBxdWV1ZWQgZm9yIGEgZGV2 aWNlIGFib3V0IHRvIGJlIHdva2VuICovCisJdW5zaWduZWQgaW50IGNoYW5uZWw7CisJaW50IHdp ZGVfbW9kZTsJCQkJCS8qIFVTQjogd2lkZSBtb2RlLCBUVFk6IGZsYWdzIHBlciBjaGFyYWN0ZXIg Ki8KKwlpbnQgaGF2ZV9leHRyYV9ieXRlOworCWludCBleHRyYV9ieXRlOworCisJdW5zaWduZWQg c2hvcnQgRGV2aWNlVmVuZG9yOworCXVuc2lnbmVkIHNob3J0IERldmljZVByb2R1Y3Q7CisKKwlp bnQgZm91bmRfc21iaW9zX2NhcmFjYWxsYV9jb25maWc7CQkvKiBNb2RlcyBwcmUtcHJvZ3JhbW1l ZCBpbiBCSU9TIGZvciBDYXJhY2FsbGEgYm9hcmQgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYW5uZWxf Y29uZmlnOwkJCS8qIE1vZGUgc2V0dGluZyBmb3IgZWFjaCBjaGFubmVsICovCisKKwlzdHJ1Y3Qg cmVnX2FkZHJfbWFwIHJlZ19tYXA7CisJc3RydWN0IHhydXNiX3NldHRpbmcgcG9ydF9zZXR0aW5n OworCXVuc2lnbmVkIGNoYXIgaGF2ZV90eGN2cl9jb25maWc7Cit9OworCisvKgorICogU01CSU9T IGNvZGUgc25pcHBldHMgYmVsb3cgYm9ycm93ZWQgZnJvbQorICogaHR0cHM6Ly9zb3VyY2Vmb3Jn ZS5uZXQvcHJvamVjdHMvc21iaW9zLworICoKKyAqLworCisjaWZuZGVmIF9fU01fQklPU19IX18K KyNkZWZpbmUgX19TTV9CSU9TX0hfXworCisjaWZkZWYgX0VOX0RFQlVHXworI2RlZmluZSBTTV9C SU9TX0RFQlVHKGZtdCwgYXJncy4uLikgcHJpbnRrKEtFUk5fREVCVUcgInNtYmlvczogIiBmbXQs ICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBTTV9CSU9TX0RFQlVHKGZtdCwgYXJncy4uLikgLyog bm90IGRlYnVnZ2luZzogbm90aGluZyAqLworI2VuZGlmCisKKy8qCisgKiAgIE1hZ2ljIG51bWJl cnMKKyAqLworCisvKiogc3RhcnQgYWRkcmVzcyBvZiBCSU9TIHNlZ21lbnQgdG8gc2Nhbm5lZCBm b3IgU00tQklPUyBhbmQgRE1JLUJJT1MgKi8KKyNkZWZpbmUgQklPU19TVEFSVF9BRERSRVNTICAg ICAgMHhGMDAwMAorLyoqIGxlbmd0aCBvZiB0aGUgc2Nhbm5lZCBCSU9TIGFyZWEgZm9yIFNNLUJJ T1MgYW5kIERNSS1CSU9TICovCisjZGVmaW5lIEJJT1NfTUFQX0xFTkdUSCAgICAgICAgIDB4MTAw MDAKKy8qKiBtYWdpYyA0IGJ5dGVzIHRvIGlkZW50aWZ5IFNNLUJJT1MgZW50cnkgcG9pbnQsIHBh cmFncmFwaCBib3VuZGFyeSAqLworI2RlZmluZSBTTUJJT1NfTUFHSUNfRFdPUkQgICAgICAweDVG NEQ1MzVGIC8qIGFuY2hvciBzdHJpbmcgIl9TTV8iICovCisvKiogaWRlbnRpZmllciBmb3IgU00t QklPUyBzdHJ1Y3R1cmVzIHdpdGhpbiBTTS1CSU9TIGVudHJ5IHBvaW50ICovCisjZGVmaW5lIERN SV9TVFJJTkcgICAgICAgICAgICAgICJfRE1JXyIKKworLyoKKyAqICAgU3RydWN0dXJlcworICov CisKKy8qKiBTTS1CSU9TIGVudHJ5IHBvaW50IHN0cnVjdHVyZQorICogdGhlIFNNQklPUyBFbnRy eSBQb2ludCBzdHJ1Y3R1cmUgZGVzY3JpYmVkIGJlbG93IGNhbiBiZSBsb2NhdGVkIGJ5CisgKiBh cHBsaWNhdGlvbiBzb2Z0d2FyZSBieSBzZWFyY2hpbmcgZm9yIHRoZSBhbmNob3Igc3RyaW5nIG9u IHBhcmFncmFwaAorICogKDE2IGJ5dGUpIGJvdW5kYXJpZXMgd2l0aGluIHRoZSBwaHlzaWNhbCBt ZW1vcnkgYWRkcmVzcyByYW5nZSAwMDBGMDAwMGggdG8KKyAqIDAwMEZGRkZGaC4gVGhpcyBlbnRy eSBwb2ludCBlbmNhcHN1bGF0ZXMgYW4gaW50ZXJtZWRpYXRlIGFuY2hvciBzdHJpbmcKKyAqIHRo YXQgaXMgdXNlZCBieSBzb21lIGV4aXN0aW5nIERNSSBicm93c2Vycy4KKyAqCisgKiBAbm90ZSBX aGlsZSB0aGUgU01CSU9TIE1ham9yIGFuZCBNaW5vciBWZXJzaW9ucyAob2Zmc2V0cyAwNmggYW5k IDA3aCkKKyAqIGN1cnJlbnRseSBkdXBsaWNhdGUgdGhlIGluZm9ybWF0aW9uIHByZXNlbnQgaW4g dGhlIFNNQklPUyBCQ0QgUmV2aXNpb24KKyAqIChvZmZzZXQgMURoKSwgdGhleSBwcm92aWRlIGEg cGF0aCBmb3IgZnV0dXJlIGdyb3d0aCBpbiB0aGlzIHNwZWNpZmljYXRpb24uCisgKiBUaGUgQkNE IFJldmlzaW9uLCBmb3IgZXhhbXBsZSwgcHJvdmlkZXMgb25seSBhIHNpbmdsZSBkaWdpdCBmb3Ig ZWFjaCBvZgorICogdGhlIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMuCisgKi8KK3N0 cnVjdCBzbWJpb3NfZW50cnlfcG9pbnRfc3RydWN0IHsKKwkvKiogIl9TTV8iLCBzcGVjaWZpZWQg YXMgZm91ciBBU0NJSSBjaGFyYWN0ZXJzICg1RiA1MyA0RCA1RikgKi8KKwlfX3UzMiBhbmNob3Jf c3RyaW5nOworCS8qKiBjaGVja3N1bSBvZiB0aGUgRW50cnkgUG9pbnQgU3RydWN0dXJlIChFUFMp LiBUaGlzIHZhbHVlLCB3aGVuIGFkZGVkIHRvCisJICogYWxsIG90aGVyIGJ5dGVzIGluIHRoZSBF UFMsIHdpbGwgcmVzdWx0IGluIHRoZSB2YWx1ZSAwMGggKHVzaW5nIDggYml0CisJICogYWRkaXRp b24gY2FsY3VsYXRpb25zKS4gVmFsdWVzIGluIHRoZSBFUFMgYXJlIHN1bW1lZCBzdGFydGluZyBh dCBvZmZzZXQKKwkgKiAwMGgsIGZvciBFbnRyeSBQb2ludCBMZW5ndGggYnl0ZXMuCisJICovCisJ X191OCAgZW50cnlfcG9pbnRfY2hlY2tzdW07CisJLyoqIExlbmd0aCBvZiB0aGUgRW50cnkgUG9p bnQgU3RydWN0dXJlLCBzdGFydGluZyB3aXRoIHRoZSBBbmNob3IgU3RyaW5nCisJICogZmllbGQs IGluIGJ5dGVzLCBjdXJyZW50bHkgMUZoLgorCSAqLworCV9fdTggIGVudHJ5X3BvaW50X2xlbmd0 aDsKKwkvKiogaWRlbnRpZmllcyB0aGUgbWFqb3IgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRp b24gaW1wbGVtZW50ZWQgaW4KKwkgKiB0aGUgdGFibGUgc3RydWN0dXJlcywgZS5nLiB0aGUgdmFs dWUgd2lsbCBiZSAwQWggZm9yIHJldmlzaW9uIDEwLjIyCisJICogYW5kIDAyaCBmb3IgcmV2aXNp b24gMi4xCisJICovCisJX191OCAgbWFqb3JfdmVyc2lvbjsKKwkvKiogaWRlbnRpZmllcyB0aGUg bWlub3IgdmVyc2lvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24gaW1wbGVtZW50ZWQgaW4KKwkgKiB0 aGUgdGFibGUgc3RydWN0dXJlcywgZS5nLiB0aGUgdmFsdWUgd2lsbCBiZSAxNmggZm9yIHJldmlz aW9uIDEwLjIyCisJICogYW5kIDAxaCBmb3IgcmV2aXNpb24gMi4xCisJICovCisJX191OCAgbWlu b3JfdmVyc2lvbjsKKwkvKiogc2l6ZSBvZiB0aGUgbGFyZ2VzdCBTTUJJT1Mgc3RydWN0dXJlLCBp biBieXRlcywgYW5kIGVuY29tcGFzc2VzIHRoZQorCSAqIHN0cnVjdHVyZSdzIGZvcm1hdHRlZCBh cmVhIGFuZCB0ZXh0IHN0cmluZ3MuIFRoaXMgaXMgdGhlIHZhbHVlIHJldHVybmVkCisJICogYXMg U3RydWN0dXJlU2l6ZSBmcm9tIHRoZSBQbHVnLW4tUGxheSAnR2V0IFNNQklPUyBJbmZvcm1hdGlv bicgZnVuY3Rpb24KKwkgKi8KKwlfX3UxNiBtYXhfc3RydWN0X3NpemU7CisJLyoqIGlkZW50aWZp ZXMgdGhlIEVQUyByZXZpc2lvbiBpbXBsZW1lbnRlZCBpbiB0aGlzIHN0cnVjdHVyZSBhbmQgaWRl bnRpZmllcworCSAqIHRoZSBmb3JtYXR0aW5nIG9mIG9mZnNldHMgMEJoIHRvIDBGaCwgb25lIG9m OgorCSAqIDAwaCAgICAgRW50cnkgUG9pbnQgYmFzZWQgb24gU01CSU9TIDIuMSBkZWZpbml0aW9u OyBmb3JtYXR0ZWQgYXJlYSBpcworCSAqICAgICAgICAgcmVzZXJ2ZWQgYW5kIHNldCB0byBhbGwg MDBoLgorCSAqIDAxaC1GRmggcmVzZXJ2ZWQgZm9yIGFzc2lnbm1lbnQgdmlhIHRoaXMgc3BlY2lm aWNhdGlvbgorCSAqLworCV9fdTggIHJldmlzaW9uOworCS8qKiB0aGUgdmFsdWUgcHJlc2VudCBp biB0aGUgRW50cnkgUG9pbnQgUmV2aXNpb24gZmllbGQgZGVmaW5lcyB0aGUKKwkgKiBpbnRlcnBy ZXRhdGlvbiB0byBiZSBwbGFjZWQgdXBvbiB0aGVzZTUgYnl0ZXMuCisJICovCisJX191OCAgZm9y bWF0ZWRfYXJlYVs1XTsKKwkvKiogIl9ETUlfIiwgc3BlY2lmaWVkIGFzIGZpdmUgQVNDSUkgY2hh cmFjdGVycyAoNUYgNDQgNEQgNDkgNUYpICovCisJX191OCAgaW50ZXJtZWRpYXRlX3N0cmluZ1s1 XTsKKwkvKiogY2hlY2tzdW0gb2YgdGhlIEludGVybWVkaWF0ZSBFbnRyeSBQb2ludCBTdHJ1Y3R1 cmUgKElFUFMpLiBUaGlzIHZhbHVlLAorCSAqIHdoZW4gYWRkZWQgdG8gYWxsIG90aGVyIGJ5dGVz IGluIHRoZSBJRVBTLCB3aWxsIHJlc3VsdCBpbiB0aGUgdmFsdWUgMDBoCisJICogKHVzaW5nIDgg Yml0IGFkZGl0aW9uIGNhbGN1bGF0aW9ucykuIFZhbHVlcyBpbiB0aGUgSUVQUyBhcmUgc3VtbWVk CisJICogc3RhcnRpbmcgYXQgb2Zmc2V0IDEwaCwgZm9yIDBGaCBieXRlcworCSAqLworCV9fdTgg IGludGVybWVkaWF0ZV9jaGVja3N1bTsKKwkvKiogdGhlIDMyIGJpdCBwaHlzaWNhbCBzdGFydGlu ZyBhZGRyZXNzIG9mIHRoZSByZWFkLW9ubHkgU01CSU9TIFN0cnVjdHVyZQorCSAqIFRhYmxlLCB0 aGF0IGNhbiBzdGFydCBhdCBhbnkgMzIgYml0IGFkZHJlc3MuIFRoaXMgYXJlYSBjb250YWlucyBh bGwgb2YgdGhlCisJICogU01CSU9TIHN0cnVjdHVyZXMgZnVsbHkgcGFja2VkIHRvZ2V0aGVyLiBU aGVzZSBzdHJ1Y3R1cmVzIGNhbiB0aGVuIGJlCisJICogcGFyc2VkIHRvIHByb2R1Y2UgZXhhY3Rs eSB0aGUgc2FtZSBmb3JtYXQgYXMgdGhhdCByZXR1cm5lZCBmcm9tIGEgJ0dldAorCSAqIFNNQklP UyBTdHJ1Y3R1cmUnIGZ1bmN0aW9uIGNhbGwuCisJICovCisJX191MTYgc3RydWN0X3RhYmxlX2xl bmd0aDsKKwlfX3UzMiBzdHJ1Y3RfdGFibGVfYWRkcmVzczsKKwlfX3UxNiBub19vZl9zdHJ1Y3R1 cmVzOworCV9fdTggIGJjZF9yZXZpc2lvbjsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOwor CisvKiogU00tQklPUyBzdHJ1Y3R1cmUgaGVhZGVyICovCitzdHJ1Y3Qgc21iaW9zX3N0cnVjdCB7 CisJX191OCAgdHlwZTsKKwlfX3U4ICBsZW5ndGg7CisJX191MTYgaGFuZGxlOworCV9fdTggIHN1 YnR5cGU7CisvKiAuLi4gb3RoZXIgZmllbGRzIGFyZSBzdHJ1Y3R1cmUgZGVwZW5kZW5kIC4uLiAq LworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2V4dGVybiB2b2lkICpzbWJpb3Nfc3Ry dWN0dXJlc19iYXNlOyAgICAgICAgICAgICAgICAgICAgICAgLyogYmFzZSBvZiBTTUJJT1MgcmF3 IHN0cnVjdHVyZXMgKi8KK2V4dGVybiB1bnNpZ25lZCBjaGFyIHNtYmlvc190eXBlc193aXRoX3N1 YnR5cGVzW107CitleHRlcm4gY2hhciBzbWJpb3NfdmVyc2lvbl9zdHJpbmdbMzJdOyAgICAgICAg ICAgICAgICAgICAgICAvKiBlLmcuIFYyLjMxICovCisKKy8qCisgKiAgIEZ1bmN0aW9ucworICov CisKKy8qIGZvciB0aGUgZGVzY3JpcHRpb24gc2VlIHRoZSBpbXBsZW1lbnRhdGlvbiBmaWxlICov CitzdHJ1Y3Qgc21iaW9zX2VudHJ5X3BvaW50X3N0cnVjdCAqc21iaW9zX2ZpbmRfZW50cnlfcG9p bnQodm9pZCAqYmFzZSk7CitzdHJ1Y3QgZG1pYmlvc19lbnRyeV9wb2ludF9zdHJ1Y3QgKmRtaWJp b3NfZmluZF9lbnRyeV9wb2ludCh2b2lkICpiYXNlKTsKK3Vuc2lnbmVkIGNoYXIgc21iaW9zX2No ZWNrX2VudHJ5X3BvaW50KHZvaWQgKmFkZHIpOworaW50IHNtYmlvc190eXBlX2hhc19zdWJ0eXBl KHVuc2lnbmVkIGNoYXIgdHlwZSk7CitpbnQgc21iaW9zX2dldF9zdHJ1Y3RfbGVuZ3RoKHN0cnVj dCBzbWJpb3Nfc3RydWN0ICpzdHJ1Y3RfcHRyKTsKK2ludCBkbWliaW9zX2dldF9zdHJ1Y3RfbGVu Z3RoKHN0cnVjdCBzbWJpb3Nfc3RydWN0ICpzdHJ1Y3RfcHRyKTsKK3Vuc2lnbmVkIGludCBzbWJp b3NfZ2V0X3JlYWRhYmxlX25hbWVfZXh0KGNoYXIgKnJlYWRhYmxlX25hbWUsIHN0cnVjdCBzbWJp b3Nfc3RydWN0ICpzdHJ1Y3RfcHRyKTsKK3Vuc2lnbmVkIGludCBzbWJpb3NfZ2V0X3JlYWRhYmxl X25hbWUoY2hhciAqcmVhZGFibGVfbmFtZSwgc3RydWN0IHNtYmlvc19zdHJ1Y3QgKnN0cnVjdF9w dHIpOworaW50IHNtYmlvc19jaGVja19pZl9oYXZlX2V4YXJfY29uZmlnKHVuc2lnbmVkIGNoYXIg KmNvbmZpZzAsIHVuc2lnbmVkIGNoYXIgKmNvbmZpZzEpOworCisKKyNlbmRpZiAvKiBfX0JJT1Nf SF9fICovCisKK3N0YXRpYyB2b2lkICpzbWJpb3NfYmFzZTsKK3N0cnVjdCBzbWJpb3NfZW50cnlf cG9pbnRfc3RydWN0ICpzbWJpb3NfZW50cnlfcG9pbnQ7CS8qKiBTTS1CSU9TIGVudHJ5IHBvaW50 IHN0cnVjdHVyZSAqLwordm9pZCAqc21iaW9zX3N0cnVjdHVyZXNfYmFzZTsKKworI2RlZmluZSBD RENfREFUQV9JTlRFUkZBQ0VfVFlQRQkweDBhCisKKy8qIGNvbnN0YW50cyBkZXNjcmliaW5nIHZh cmlvdXMgcXVpcmtzIGFuZCBlcnJvcnMgKi8KKyNkZWZpbmUgTk9fVU5JT05fTk9STUFMCQkJMQor I2RlZmluZSBTSU5HTEVfUlhfVVJCCQkJMgorI2RlZmluZSBOT19DQVBfTElORQkJCTQKKyNkZWZp bmUgTk9UX0FfTU9ERU0JCQk4CisjZGVmaW5lIE5PX0RBVEFfSU5URVJGQUNFCQkxNgorI2RlZmlu ZSBJR05PUkVfREVWSUNFCQkJMzIKKworLyogVVNCIFJlcXVlc3RzICovCisjZGVmaW5lIFhSVVNC X0dFVF9DSElQX0lECQkweEZGCisjZGVmaW5lIFhSVVNCX1NFVF9YUjIyODBYCQk1CisjZGVmaW5l IFhSVVNCX0dFVF9YUjIyODBYCQk1CisjZGVmaW5lIFhSVVNCX1NFVF9YUjIxQjE0MlgJCTAKKyNk ZWZpbmUgWFJVU0JfR0VUX1hSMjFCMTQyWAkJMAorI2RlZmluZSBYUlVTQl9TRVRfWFIyMVYxNDFY CQkwCisjZGVmaW5lIFhSVVNCX0dFVF9YUjIxVjE0MVgJCTEKKyNkZWZpbmUgWFJVU0JfU0VUX1hS MjFCMTQxMQkJMAorI2RlZmluZSBYUlVTQl9HRVRfWFIyMUIxNDExCQkxCisKKy8qIFhSMjFWMTQx eCBCYXVkIFJhdGUgR2VuZXJhdG9yIFJlZ2lzdGVycyAqLworI2RlZmluZSBYUjIxVjE0MVhfQ0xP Q0tfRElWSVNPUl8wCTB4MDA0CisjZGVmaW5lIFhSMjFWMTQxWF9DTE9DS19ESVZJU09SXzEJMHgw MDUKKyNkZWZpbmUgWFIyMVYxNDFYX0NMT0NLX0RJVklTT1JfMgkweDAwNgorI2RlZmluZSBYUjIx VjE0MVhfVFhfQ0xPQ0tfTUFTS18wCTB4MDA3CisjZGVmaW5lIFhSMjFWMTQxWF9UWF9DTE9DS19N QVNLXzEJMHgwMDgKKyNkZWZpbmUgWFIyMVYxNDFYX1JYX0NMT0NLX01BU0tfMAkweDAwOQorI2Rl ZmluZSBYUjIxVjE0MVhfUlhfQ0xPQ0tfTUFTS18xCTB4MDBhCisKKy8qIFhSMjFWMTQxeCBVQVJU IEJsb2NrIFJlZ2lzdGVycyAqLworI2RlZmluZSBYUjIxVjE0MXhfVVJNX1JFR19CTE9DSwkJNAor I2RlZmluZSBYUjIxVjE0MXhfVUFSVF9DVVNUT01fQkxPQ0sJMHg2NgorCisvKiBYUjIxVjE0MXgg VUFSVCBNYW5hZ2VyIFJlZ2lzdGVyIHZhbHVlcyAqLworI2RlZmluZSBYUjIxVjE0MXhfVVJNX0ZJ Rk9fRU5BQkxFX1JFRwkweDEwCisjZGVmaW5lIFhSMjFWMTQxeF9VUk1fRU5BQkxFX1RYX0ZJRk8J MHgxCisjZGVmaW5lIFhSMjFWMTQxeF9VUk1fRU5BQkxFX1JYX0ZJRk8JMHgyCisjZGVmaW5lIFhS MjFWMTQxeF9VUk1fUlhfRklGT19SRVNFVAkweDE4CisjZGVmaW5lIFhSMjFWMTQxeF9VUk1fVFhf RklGT19SRVNFVAkweDFDCisKKyNkZWZpbmUgVUFSVF9FTkFCTEVfVFgJCQkxCisjZGVmaW5lIFVB UlRfRU5BQkxFX1JYCQkJMgorCisvKiBHUElPcyAqLworI2RlZmluZSBHUElPOV9SWFQJCQkweDIw MAorI2RlZmluZSBHUElPOF9UWFQJCQkweDEwMAorI2RlZmluZSBHUElPN19YRU4JCQkweDgwCisj ZGVmaW5lIEdQSU82X0NMSwkJCTB4NDAKKyNkZWZpbmUgR1BJTzVfUlRTCQkJMHgyMAorI2RlZmlu ZSBHUElPNF9DVFMJCQkweDEwCisjZGVmaW5lIEdQSU8zX0RUUgkJCTB4OAorI2RlZmluZSBHUElP Ml9EU1IJCQkweDQKKyNkZWZpbmUgR1BJTzFfQ0QJCQkweDIKKyNkZWZpbmUgR1BJTzBfUkkJCQkw eDEKKworLyogTG9vcGJhY2sgUmVnaXN0ZXIgVmFsdWVzICovCisKKyNkZWZpbmUgTE9PUF9FTkFC TEUJCQkweDcKKyNkZWZpbmUgWFIyMVYxNDF4X0xPT1BfRU5BQkxFX0EJCTB4NDAKKyNkZWZpbmUg WFIyMVYxNDF4X0xPT1BfRU5BQkxFX0IJCTB4NDEKKyNkZWZpbmUgWFIyMVYxNDF4X0xPT1BfRU5B QkxFX0MJCTB4NDIKKyNkZWZpbmUgWFIyMVYxNDF4X0xPT1BfRU5BQkxFX0QJCTB4NDMKKworLyog RkxPV19NT0RFIFJlZ2lzdGVyIFZhbHVlcyAqLworCisjZGVmaW5lIFVBUlRfRkxPV19NT0RFX05P TkUJCTB4MAorI2RlZmluZSBVQVJUX0ZMT1dfTU9ERV9IVwkJMHgxCisjZGVmaW5lIFVBUlRfRkxP V19NT0RFX1NXCQkweDIKKworLyogR1BJT19NT0RFIFJlZ2lzdGVyIFZhbHVlcyAqLworCisjZGVm aW5lIFVBUlRfR1BJT19NT0RFX1NFTF9HUElPCQkweDAKKyNkZWZpbmUgVUFSVF9HUElPX01PREVf U0VMX1JUU19DVFMJMHgxCisjZGVmaW5lIFVBUlRfR1BJT19NT0RFX0RJUl9SVFNfSEkJMHhiCisj ZGVmaW5lIFVBUlRfR1BJT19NT0RFX0RJUl9SVFNfTE9XCTB4MworCisvKiBBZGRpdGlvbmFsIEdQ SU9fTU9ERSBSZWdpc3RlciBWYWx1ZXMgLSBYUjIxQjE0MnggKi8KKworI2RlZmluZSBVQVJUX0dQ SU9fTU9ERV9ESVJfWEVOX0hJCTB4MzgKKyNkZWZpbmUgVUFSVF9HUElPX01PREVfRElSX1hFTl9M T1cJMHgzMAorI2RlZmluZSBVQVJUX0dQSU9fTU9ERV9SWFQJCTB4MjAwCisjZGVmaW5lIFVBUlRf R1BJT19NT0RFX1RYVAkJMHgxMDAKKworLyogUmFuZG9tbHkgbG9jYXRlZCByZWdpc3RlcnMgKi8K KyNkZWZpbmUgWFIyMVYxNDFYX1dJREVfTU9ERV9SRUcgICAgICAgICAzCisKKyNkZWZpbmUgWFIy MUIxNDExX1VBUlRfRU5BQkxFCQkweEMwMAorI2RlZmluZSBYUjIxQjE0MTFfV0lERV9NT0RFX1JF RwkJMHhEMDIKKworI2RlZmluZSBYUjIxQjE0MnhfVUFSVF9FTkFCTEUJCTB4MDAKKyNkZWZpbmUg WFIyMUIxNDJYX1RYX1dJREVfTU9ERV9SRUcJMHg0MgorI2RlZmluZSBYUjIxQjE0MlhfUlhfV0lE RV9NT0RFX1JFRwkweDQ1CisKKyNkZWZpbmUgWFIyMjgwWF9UWF9XSURFX01PREVfUkVHCTB4NjIK KyNkZWZpbmUgWFIyMjgwWF9SWF9XSURFX01PREVfUkVHCTB4NjUKKworI2RlZmluZSBYUjIyODB4 X0ZVTkNfTUdSX09GRlNFVAkJMHg0MAorCisjZGVmaW5lIFhSVVNCX0lPQ19NQUdJQwkJCSd2Jwor CisjZGVmaW5lIFhSVVNCX0VOQUJMRQkJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDMpCisjZGVmaW5l IFhSVVNCX1NFVF9CQVVECQkJX0lPKFhSVVNCX0lPQ19NQUdJQywgNCkKKyNkZWZpbmUgWFJVU0Jf TE9PUEJBQ0sJCQlfSU8oWFJVU0JfSU9DX01BR0lDLCA1KQorCisjZGVmaW5lIFhSVVNCX1NFVF9H UElPX01PREUJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDcpCisjZGVmaW5lCVhSVVNCX0dFVF9HUElP X01PREUJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDgpCisjZGVmaW5lCVhSVVNCX1NFVF9HUElPX1NU QVRFCQlfSU8oWFJVU0JfSU9DX01BR0lDLCA5KQorI2RlZmluZQlYUlVTQl9HRVRfR1BJT19TVEFU RQkJX0lPKFhSVVNCX0lPQ19NQUdJQywgMTApCisjZGVmaW5lIFhSVVNCX0NMRUFSX0dQSU9fU1RB VEUJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDExKQorI2RlZmluZQlYUlVTQl9TRVRfR1BJT19JTlRf TUFTSwkJX0lPKFhSVVNCX0lPQ19NQUdJQywgMTIpCisjZGVmaW5lCVhSVVNCX0dFVF9HUElPX0lO VF9NQVNLCQlfSU8oWFJVU0JfSU9DX01BR0lDLCAxMykKKyNkZWZpbmUgWFJVU0JfU0VUX0dQSU9f UFVMTF9VUAkJX0lPKFhSVVNCX0lPQ19NQUdJQywgMTQpCisjZGVmaW5lCVhSVVNCX0dFVF9HUElP X1BVTExfVVAJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDE1KQorI2RlZmluZSBYUlVTQl9TRVRfR1BJ T19QVUxMX0RPV04JX0lPKFhSVVNCX0lPQ19NQUdJQywgMTYpCisjZGVmaW5lCVhSVVNCX0dFVF9H UElPX1BVTExfRE9XTglfSU8oWFJVU0JfSU9DX01BR0lDLCAxNykKKyNkZWZpbmUgWFJVU0JfU0VU X0dQSU9fT1BFTl9EUkFJTglfSU8oWFJVU0JfSU9DX01BR0lDLCAxOCkKKyNkZWZpbmUJWFJVU0Jf R0VUX0dQSU9fT1BFTl9EUkFJTglfSU8oWFJVU0JfSU9DX01BR0lDLCAxOSkKKworI2RlZmluZSBY UlVTQl9XSURFX01PREUJCQlfSU8oWFJVU0JfSU9DX01BR0lDLCAyMCkKKyNkZWZpbmUgWFJVU0Jf TVVMVElEUk9QX01PREUJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDIxKQorI2RlZmluZSBYUlVTQl9M T1dfTEFURU5DWV9NT0RFCQlfSU8oWFJVU0JfSU9DX01BR0lDLCAyMikKKyNkZWZpbmUgWFJVU0Jf U0VUX1JTNDg1X1BJTgkJX0lPKFhSVVNCX0lPQ19NQUdJQywgMjMpCisjZGVmaW5lIFhSVVNCX1JT NDg1X1BJTl9PUFRJT04JCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDI1KQorI2RlZmluZSBYUlVTQl9S UzQ4NV9ERUxBWQkJX0lPKFhSVVNCX0lPQ19NQUdJQywgMjYpCisjZGVmaW5lIFhSVVNCX0VOQUJM RV9SUzQ4NV9MT1cJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDI3KQorCisjZGVmaW5lIFhSVVNCX0VO QUJMRV9EVFJEU1JfRkxPVwlfSU8oWFJVU0JfSU9DX01BR0lDLCAyOCkKKyNkZWZpbmUgWFJVU0Jf RElTQUJMRV9GTE9XX0NPTlRST0wJX0lPKFhSVVNCX0lPQ19NQUdJQywgMjkpCisjZGVmaW5lIFhS VVNCX0dFVF9GTE9XX0NPTlRST0wJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDMwKQorI2RlZmluZSBY UlVTQl9TRVRfR1BJT19ESVIJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDMxKQorI2RlZmluZSBYUlVT Ql9HRVRfR1BJT19ESVIJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDMyKQorI2RlZmluZSBYUlVTQl9T RVRfVFhDVlJfTU9ERQkJX0lPKFhSVVNCX0lPQ19NQUdJQywgMzMpCisjZGVmaW5lIFhSVVNCX0dF VF9UWENWUl9NT0RFCQlfSU8oWFJVU0JfSU9DX01BR0lDLCAzNCkKKyNkZWZpbmUgWFJVU0JfU0VU X1RFUk1fTU9ERQkJX0lPKFhSVVNCX0lPQ19NQUdJQywgMzUpCisjZGVmaW5lIFhSVVNCX1NFVF9T TEVXX01PREUJCV9JTyhYUlVTQl9JT0NfTUFHSUMsIDM2KQorI2RlZmluZSBYUlVTQl9TRVRfR1BJ T19NQVBfVEFCTEUJX0lPKFhSVVNCX0lPQ19NQUdJQywgMzcpCg==