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: [v7] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180326003219.20765-1-benh@kernel.crashing.org> Date: Mon, 26 Mar 2018 11:32:19 +1100 To: linux-usb@vger.kernel.org Cc: Felipe Balbi , Greg KH , Joel Stanley , Andrew Jeffery , Benjamin Herrenschmidt List-ID: VGhlIEFzcGVlZCBCTUMgU29DcyBzdXBwb3J0IGEgInZpcnR1YWwgaHViIiBmdW5jdGlvbi4gSXQg cHJvdmlkZXMgc29tZQpIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBiZWhpbmQg d2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCgpUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9y IHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKaHViIHN0YW5kYXJkIHJlcXVl c3RzIGFuZCBleHBvc2luZyA1IFVEQyBnYWRnZXQgZHJpdmVycyBjb3JyZXNwb25kaW5nCnRvIHRo ZSBwb3J0cy4KClRoZSBodWIgaXRzZWxmIGhhcyBIVyBwcm92aWRlZCBkZWRpY2F0ZWQgRVAwIGFu ZCBFUDEgKHRoZSBsYXR0ZXIgZm9yCmh1YiBpbnRlcnJ1cHRzKS4gSXQgYWxzbyBoYXMgZGVkaWNh dGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgpvdGhlciBlbmRwb2ludHMsIHRoZXJlJ3Mg YSBwb29sIG9mIDE1ICJnZW5lcmljIiBlbmRwb2ludHMgdGhhdCBhcmUKc2hhcmVkIGFtb25nIHRo ZSBwb3J0cy4KClRoZSBkcml2ZXIgcmVsaWVzIG9uIG15IHByZXZpb3VzIHBhdGNoIGFkZGluZyBh ICJkaXNwb3NlIiBFUCBvcCB0bwpoYW5kbGUgRVAgYWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBF UHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFyZWQKcG9vbCBpbiB0aGUgVURDICJtYXRjaF9l cCIgY2FsbGJhY2sgYW5kIGFzc2lnbmVkIHRvIHRoZSBVREMgaW5zdGFuY2UKKGFkZGVkIHRvIHRo ZSBnYWRnZXQgZXBfbGlzdCkuCgpXaGVuIHRoZSBjb21wb3NpdGUgZHJpdmVyIGdldHMgdW5ib3Vu ZCwgdGhlIG5ldyBob29rIHdpbGwgYWxsb3cgdGhlIFVEQwp0byBjbGVhbiB0aGluZ3MgdXAgYW5k IHJldHVybiB0aG9zZSBFUHMgdG8gdGhlIHNoYXJlZCBwb29sLgoKU2lnbmVkLW9mZi1ieTogQmVu amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjcuIC0g Rml4IE9GIG1hdGNoIGxpc3QKICAgIC0gUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpbiBodWIgY29k ZQoKdjYuIC0gRml4IGJ1ZyB3aXRoIDAtbGVuZ3RoIHBhY2tldHMgb24gSU4gZW5kcG9pbnRzIGlu IGRlc2MgbW9kZQoKdjUuIC0gUmVtb3ZlICNpZmRlZidzIGFuZCBoYXJkIGNvZGVkIHZhbHVlcwog ICAgLSBSZW1vdmUgbW9kdWxlIHBhcmFtZXRlcnMKICAgIC0gSG9ub3IgbWF4aW11bSBzcGVlZCBk ZXZpY2UtdHJlZSBwcm9wZXJ0eQogICAgLSBSZW1vdmUgdXNlbGVzcyBsaXN0X2VtcHR5IHRlc3QK ICAgIC0gQ29zbWV0aWMvc3BhY2VzIGZpeGVzCiAgICAtIEFkZCBTUERYIGxpY2VuY2UgaWRlbnRp ZmllcnMKCnY0LiAtIEZpeCBtaXNzaW5nIHVubG9jayBhc3Rfdmh1Yl91ZGNfd2FrZXVwKCkgZXJy b3IgcGF0aAogICAgLSBNYWtlICJpcnEiIHNpZ25lZCB0byBkZWFsIHdpdGggZXJyb3IgZnJvbSBw bGF0Zm9ybV9nZXRfaXJxCiAgICAtIEZpeCBNYWtlZmlsZSBmb3IgbW9kdWxlIGJ1aWxkcwogICAg LSBGaXggYSBtaXNzaW5nIGVuZGlhbiBjb252ZXJzaW9uCgp2My4gLSBSZWJhc2VkCiAgICAtIEFk ZCBjbGsgc3R1ZmYKCnYyLiAtIENvc21ldGljIGZpeGVzCiAgICAtIFByb3Blcmx5ICJhbGxvY2F0 ZSIgZGV2aWNlIGFkZHJlc3NlcyBpbnN0ZWFkIG9mIHVzaW5nIGEgbmV2ZXIKICAgICAgcmVzZXQg Y291bnRlcgogICAgLSBNb3ZlIC5kdHNpIHVwZGF0ZXMgdG8gYSBkaWZmZXJlbnQgcGF0Y2gKCmZv bzIKCmZvbwotLS0KIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZyAgICAgICAgICAgICAg fCAgIDIgKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZSAgICAgICAgICAgICB8ICAg MSArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcgIHwgICA3ICsK IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUgfCAgIDQgKwogZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMgICB8IDQyMiArKysrKysrKysr KysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYyAgICB8IDU4MCAr KysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vw MC5jICAgIHwgNDc4ICsrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNw ZWVkLXZodWIvZXBuLmMgICAgfCA4NDMgKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYyAgICB8IDgyMyArKysrKysrKysr KysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvdmh1 Yi5oICAgfCA1MTQgKysrKysrKysrKysrKysrKysKIDEwIGZpbGVzIGNoYW5nZWQsIDM2NzQgaW5z ZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNw ZWVkLXZodWIvS2NvbmZpZwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91 ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9n YWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMv dXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2VwMC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4uYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvaHViLmMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaAoKZGlmZiAt LWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdl dC91ZGMvS2NvbmZpZwppbmRleCAwODc1ZDM4NDc2ZWUuLmI4MzhjYWVhYWFhMSAxMDA2NDQKLS0t IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdl dC91ZGMvS2NvbmZpZwpAQCAtNDM4LDYgKzQzOCw4IEBAIGNvbmZpZyBVU0JfR0FER0VUX1hJTElO WAogCSAgZHluYW1pY2FsbHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgInVkYy14aWxpbngiIGFuZCBm b3JjZSBhbGwKIAkgIGdhZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2Vk LgogCitzb3VyY2UgImRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZyIK KwogIwogIyBMQVNUIC0tIGR1bW15L2VtdWxhdGVkIGNvbnRyb2xsZXIKICMKZGlmZiAtLWdpdCBh L2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRj L01ha2VmaWxlCmluZGV4IGNlODY1YjEyOWZkNi4uODk3ZjY0OGYzY2YxIDEwMDY0NAotLS0gYS9k cml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91 ZGMvTWFrZWZpbGUKQEAgLTM5LDQgKzM5LDUgQEAgb2JqLSQoQ09ORklHX1VTQl9NVl9VM0QpCSs9 IG12X3UzZF9jb3JlLm8KIG9iai0kKENPTkZJR19VU0JfR1JfVURDKQkrPSBncl91ZGMubwogb2Jq LSQoQ09ORklHX1VTQl9HQURHRVRfWElMSU5YKQkrPSB1ZGMteGlsaW54Lm8KIG9iai0kKENPTkZJ R19VU0JfU05QX1VEQ19QTEFUKSArPSBzbnBzX3VkY19wbGF0Lm8KK29iai0kKENPTkZJR19VU0Jf QVNQRUVEX1ZIVUIpCSs9IGFzcGVlZC12aHViLwogb2JqLSQoQ09ORklHX1VTQl9CRENfVURDKQkr PSBiZGMvCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tj b25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5mMGNkZjg5Yjg1MDMKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcKQEAg LTAsMCArMSw3IEBACisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworY29uZmln IFVTQl9BU1BFRURfVkhVQgorCXRyaXN0YXRlICJBc3BlZWQgdkh1YiBVREMgZHJpdmVyIgorCWRl cGVuZHMgb24gQVJDSF9BU1BFRUQgfHwgQ09NUElMRV9URVNUCisJaGVscAorCSAgVVNCIHBlcmlw aGVyYWwgY29udHJvbGxlciBmb3IgdGhlIEFzcGVlZCBBU1QyNTAwIGZhbWlseQorCSAgU29DcyBz dXBwb3J0aW5nIHRoZSAidkh1YiIgZnVuY3Rpb25hbGl0eSBhbmQgVVNCMi4wCmRpZmYgLS1naXQg YS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlIGIvZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMDAuLjlmM2FkZDYwNWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZl cnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisj IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworb2JqLSQoQ09ORklHX1VTQl9BU1BF RURfVkhVQikJKz0gYXNwZWVkLXZodWIubworYXNwZWVkLXZodWIteQk6PSBjb3JlLm8gZXAwLm8g ZXBuLm8gZGV2Lm8gaHViLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9h c3BlZWQtdmh1Yi9jb3JlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Nv cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjM5NDBiZDM2ZTkw YwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIv Y29yZS5jCkBAIC0wLDAgKzEsNDIyIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMCsKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIi IFVTQiBnYWRnZXQKKyAqCisgKiBjb3JlLmMgLSBUb3AgbGV2ZWwgc3VwcG9ydAorICoKKyAqIENv cHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVl IHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1 bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxp c2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24g MiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNp b24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxp bnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgv c2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5o PgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMu aD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgor I2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2lu Y2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNs dWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidmh1Yi5oIgorCit2b2lkIGFz dF92aHViX2RvbmUoc3RydWN0IGFzdF92aHViX2VwICplcCwgc3RydWN0IGFzdF92aHViX3JlcSAq cmVxLAorCQkgICBpbnQgc3RhdHVzKQoreworCWJvb2wgaW50ZXJuYWwgPSByZXEtPmludGVybmFs OworCisJRVBWREJHKGVwLCAiY29tcGxldGluZyByZXF1ZXN0IEAlcCwgc3RhdHVzICVkXG4iLCBy ZXEsIHN0YXR1cyk7CisKKwlsaXN0X2RlbF9pbml0KCZyZXEtPnF1ZXVlKTsKKworCWlmIChyZXEt PnJlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKQorCQlyZXEtPnJlcS5zdGF0dXMgPSBzdGF0dXM7 CisKKwlpZiAocmVxLT5yZXEuZG1hKSB7CisJCWlmICghV0FSTl9PTighZXAtPmRldikpCisJCQl1 c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3QoJmVwLT5kZXYtPmdhZGdldCwKKwkJCQkJCSAmcmVxLT5y ZXEsIGVwLT5lcG4uaXNfaW4pOworCQlyZXEtPnJlcS5kbWEgPSAwOworCX0KKworCS8qCisJICog SWYgdGhpcyBpc24ndCBhbiBpbnRlcm5hbCBFUDAgcmVxdWVzdCwgY2FsbCB0aGUgY29yZQorCSAq IHRvIGNhbGwgdGhlIGdhZGdldCBjb21wbGV0aW9uLgorCSAqLworCWlmICghaW50ZXJuYWwpIHsK KwkJc3Bpbl91bmxvY2soJmVwLT52aHViLT5sb2NrKTsKKwkJdXNiX2dhZGdldF9naXZlYmFja19y ZXF1ZXN0KCZlcC0+ZXAsICZyZXEtPnJlcSk7CisJCXNwaW5fbG9jaygmZXAtPnZodWItPmxvY2sp OworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9udWtlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGlu dCBzdGF0dXMpCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCisJRVBEQkcoZXAsICJO dWtpbmdcbiIpOworCisJLyogQmV3YXJlLCBsb2NrIHdpbGwgYmUgZHJvcHBlZCAmIHJlcS1hY3F1 aXJlZCBieSBkb25lKCkgKi8KKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJ cmVxID0gbGlzdF9maXJzdF9lbnRyeSgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBx dWV1ZSk7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgc3RhdHVzKTsKKwl9Cit9CisKK3N0cnVj dCB1c2JfcmVxdWVzdCAqYXN0X3ZodWJfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1X2Vw LAorCQkJCQkgICBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVx OworCisJcmVxID0ga3phbGxvYyhzaXplb2YoKnJlcSksIGdmcF9mbGFncyk7CisJaWYgKCFyZXEp CisJCXJldHVybiBOVUxMOworCXJldHVybiAmcmVxLT5yZXE7Cit9CisKK3ZvaWQgYXN0X3ZodWJf ZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKnVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9y ZXEpCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxID0gdG9fYXN0X3JlcSh1X3JlcSk7CisK KwlrZnJlZShyZXEpOworfQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXN0X3ZodWJfaXJxKGludCBp cnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZGF0YTsKKwlpcnFy ZXR1cm5fdCBpcmV0ID0gSVJRX05PTkU7CisJdTMyIGlzdGF0OworCisJLyogU3RhbGUgaW50ZXJy dXB0IHdoaWxlIHRlYXJpbmcgZG93biAqLworCWlmICghdmh1Yi0+ZXAwX2J1ZnMpCisJCXJldHVy biBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygmdmh1Yi0+bG9jayk7CisKKwkvKiBSZWFkIGFuZCBB Q0sgaW50ZXJydXB0cyAqLworCWlzdGF0ID0gcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0lT Uik7CisJaWYgKCFpc3RhdCkKKwkJZ290byBiYWlsOworCXdyaXRlbChpc3RhdCwgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0lTUik7CisJaXJldCA9IElSUV9IQU5ETEVEOworCisJVURDVkRCRyh2aHVi LCAiaXJxIHN0YXR1cz0lMDh4LCBlcF9hY2tzPSUwOHggZXBfbmFja3M9JTA4eFxuIiwKKwkgICAg ICAgaXN0YXQsCisJICAgICAgIHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNS KSwKKwkgICAgICAgcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05BQ0tfSVNSKSk7CisK KwkvKiBIYW5kbGUgZ2VuZXJpYyBFUHMgZmlyc3QgKi8KKwlpZiAoaXN0YXQgJiBWSFVCX0lSUV9F UF9QT09MX0FDS19TVEFMTCkgeworCQl1MzIgaSwgZXBfYWNrcyA9IHJlYWRsKHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKwkJd3JpdGVsKGVwX2Fja3MsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9FUF9BQ0tfSVNSKTsKKworCQlmb3IgKGkgPSAwOyBlcF9hY2tzICYmIGkgPCBBU1Rf VkhVQl9OVU1fR0VOX0VQczsgaSsrKSB7CisJCQl1MzIgbWFzayA9IFZIVUJfRVBfSVJRKGkpOwor CQkJaWYgKGVwX2Fja3MgJiBtYXNrKSB7CisJCQkJYXN0X3ZodWJfZXBuX2Fja19pcnEoJnZodWIt PmVwbnNbaV0pOworCQkJCWVwX2Fja3MgJj0gfm1hc2s7CisJCQl9CisJCX0KKwl9CisKKwkvKiBI YW5kbGUgZGV2aWNlIGludGVycnVwdHMgKi8KKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfREVWSUNF MSB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNFMiB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNFMyB8 CisJCSAgICAgVkhVQl9JUlFfREVWSUNFNCB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNFNSkpIHsK KwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFMSkKKwkJCWFzdF92aHViX2Rldl9pcnEoJnZo dWItPnBvcnRzWzBdLmRldik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0RFVklDRTIpCisJCQlh c3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1sxXS5kZXYpOworCQlpZiAoaXN0YXQgJiBWSFVC X0lSUV9ERVZJQ0UzKQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+cG9ydHNbMl0uZGV2KTsK KwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFNCkKKwkJCWFzdF92aHViX2Rldl9pcnEoJnZo dWItPnBvcnRzWzNdLmRldik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0RFVklDRTUpCisJCQlh c3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1s0XS5kZXYpOworCX0KKworCS8qIEhhbmRsZSB0 b3AtbGV2ZWwgdkh1YiBFUDAgaW50ZXJydXB0cyAqLworCWlmIChpc3RhdCAmIChWSFVCX0lSUV9I VUJfRVAwX09VVF9BQ0tfU1RBTEwgfAorCQkgICAgIFZIVUJfSVJRX0hVQl9FUDBfSU5fQUNLX1NU QUxMIHwKKwkJICAgICBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQKSkgeworCQlpZiAoaXN0YXQgJiBW SFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCkKKwkJCWFzdF92aHViX2VwMF9oYW5kbGVfYWNr KCZ2aHViLT5lcDAsIHRydWUpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9IVUJfRVAwX09VVF9B Q0tfU1RBTEwpCisJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCBmYWxzZSk7 CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0hVQl9FUDBfU0VUVVApCisJCQlhc3Rfdmh1Yl9lcDBf aGFuZGxlX3NldHVwKCZ2aHViLT5lcDApOworCX0KKworCS8qIFZhcmlvdXMgdG9wIGxldmVsIGJ1 cyBldmVudHMgKi8KKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfQlVTX1JFU1VNRSB8CisJCSAgICAg VkhVQl9JUlFfQlVTX1NVU1BFTkQgfAorCQkgICAgIFZIVUJfSVJRX0JVU19SRVNFVCkpIHsKKwkJ aWYgKGlzdGF0ICYgVkhVQl9JUlFfQlVTX1JFU1VNRSkKKwkJCWFzdF92aHViX2h1Yl9yZXN1bWUo dmh1Yik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0JVU19TVVNQRU5EKQorCQkJYXN0X3ZodWJf aHViX3N1c3BlbmQodmh1Yik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0JVU19SRVNFVCkKKwkJ CWFzdF92aHViX2h1Yl9yZXNldCh2aHViKTsKKwl9CisKKyBiYWlsOgorCXNwaW5fdW5sb2NrKCZ2 aHViLT5sb2NrKTsKKwlyZXR1cm4gaXJldDsKK30KKwordm9pZCBhc3Rfdmh1Yl9pbml0X2h3KHN0 cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1MzIgY3RybDsKKworCVVEQ0RCRyh2aHViLCIoUmUp U3RhcnRpbmcgSFcgLi4uXG4iKTsKKworCS8qIEVuYWJsZSBQSFkgKi8KKwljdHJsID0gVkhVQl9D VFJMX1BIWV9DTEsgfAorCQlWSFVCX0NUUkxfUEhZX1JFU0VUX0RJUzsKKworICAgICAgIC8qCisJ KiBXZSBkbyAqTk9UKiBzZXQgdGhlIFZIVUJfQ1RSTF9DTEtfU1RPUF9TVVNQRU5EIGJpdAorCSog dG8gc3RvcCB0aGUgbG9naWMgY2xvY2sgZHVyaW5nIHN1c3BlbmQgYmVjYXVzZQorCSogaXQgY2F1 c2VzIHRoZSByZWdpc3RlcnMgdG8gYmVjb21lIGluYWNjZXNzaWJsZSBhbmQKKwkqIHdlIGhhdmVu J3QgeWV0IGZpZ3VyZWQgb3V0IGEgZ29vZCB3YXl0IHRvIGJyaW5nIHRoZQorCSogY29udHJvbGxl ciBiYWNrIGludG8gbGlmZSB0byBpc3N1ZSBhIHdha2V1cC4KKwkqLworCisJLyoKKwkgKiBTZXQg c29tZSBJU08gJiBzcGxpdCBjb250cm9sIGJpdHMgYWNjb3JkaW5nIHRvIEFzcGVlZAorCSAqIHJl Y29tbWVuZGF0aW9uCisJICoKKwkgKiBWSFVCX0NUUkxfSVNPX1JTUF9DVFJMOiBXaGVuIHNldCB0 ZWxscyB0aGUgSFcgdG8gcmVzcG9uZAorCSAqIHdpdGggMCBieXRlcyBkYXRhIHBhY2tldCB0byBJ U08gSU4gZW5kcG9pbnRzIHdoZW4gbm8gZGF0YQorCSAqIGlzIGF2YWlsYWJsZS4KKwkgKgorCSAq IFZIVUJfQ1RSTF9TUExJVF9JTjogVGhpcyBtYWtlcyBhIFNPRiBjb21wbGV0ZSBhIHNwbGl0IElO CisJICogdHJhbnNhY3Rpb24uCisJICovCisJY3RybCB8PSBWSFVCX0NUUkxfSVNPX1JTUF9DVFJM IHwgVkhVQl9DVFJMX1NQTElUX0lOOworCXdyaXRlbChjdHJsLCB2aHViLT5yZWdzICsgQVNUX1ZI VUJfQ1RSTCk7CisJdWRlbGF5KDEpOworCisJLyogU2V0IGRlc2NyaXB0b3IgcmluZyBzaXplICov CisJaWYgKEFTVF9WSFVCX0RFU0NTX0NPVU5UID09IDI1NikgeworCQljdHJsIHw9IFZIVUJfQ1RS TF9MT05HX0RFU0M7CisJCXdyaXRlbChjdHJsLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7 CisJfSBlbHNlIHsKKwkJQlVJTERfQlVHX09OKEFTVF9WSFVCX0RFU0NTX0NPVU5UICE9IDMyKTsK Kwl9CisKKwkvKiBSZXNldCBhbGwgZGV2aWNlcyAqLworCXdyaXRlbChWSFVCX1NXX1JFU0VUX0FM TCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX1NXX1JFU0VUKTsKKwl1ZGVsYXkoMSk7CisJd3JpdGVs KDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9TV19SRVNFVCk7CisKKwkvKiBEaXNhYmxlIGFuZCBj bGVhbnVwIEVQIEFDSy9OQUNLIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyAr IEFTVF9WSFVCX0VQX0FDS19JRVIpOworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJf RVBfTkFDS19JRVIpOworCXdyaXRlbChWSFVCX0VQX0lSUV9BTEwsIHZodWItPnJlZ3MgKyBBU1Rf VkhVQl9FUF9BQ0tfSVNSKTsKKwl3cml0ZWwoVkhVQl9FUF9JUlFfQUxMLCB2aHViLT5yZWdzICsg QVNUX1ZIVUJfRVBfTkFDS19JU1IpOworCisJLyogRGVmYXVsdCBzZXR0aW5ncyBmb3IgRVAwLCBl bmFibGUgSFcgaHViIEVQMSAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAw X0NUUkwpOworCXdyaXRlbChWSFVCX0VQMV9DVFJMX1JFU0VUX1RPR0dMRSB8CisJICAgICAgIFZI VUJfRVAxX0NUUkxfRU5BQkxFLAorCSAgICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NU UkwpOworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX1NUU19DSEcpOworCisJ LyogQ29uZmlndXJlIEVQMCBETUEgYnVmZmVyICovCisJd3JpdGVsKHZodWItPmVwMC5idWZfZG1h LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAwX0RBVEEpOworCisJLyogQ2xlYXIgYWRkcmVzcyAq LworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ09ORik7CisKKwkvKiBQdWxsdXAg aHViIChhY3RpdmF0ZSBvbiBob3N0KSAqLworCWlmICh2aHViLT5mb3JjZV91c2IxKQorCQljdHJs IHw9IFZIVUJfQ1RSTF9GVUxMX1NQRUVEX09OTFk7CisKKwljdHJsIHw9IFZIVUJfQ1RSTF9VUFNU UkVBTV9DT05ORUNUOworCXdyaXRlbChjdHJsLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7 CisKKwkvKiBFbmFibGUgc29tZSBpbnRlcnJ1cHRzICovCisJd3JpdGVsKFZIVUJfSVJRX0hVQl9F UDBfSU5fQUNLX1NUQUxMIHwKKwkgICAgICAgVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxM IHwKKwkgICAgICAgVkhVQl9JUlFfSFVCX0VQMF9TRVRVUCB8CisJICAgICAgIFZIVUJfSVJRX0VQ X1BPT0xfQUNLX1NUQUxMIHwKKwkgICAgICAgVkhVQl9JUlFfQlVTX1JFU1VNRSB8CisJICAgICAg IFZIVUJfSVJRX0JVU19TVVNQRU5EIHwKKwkgICAgICAgVkhVQl9JUlFfQlVTX1JFU0VULAorCSAg ICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1 Yl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXN0X3Zo dWIgKnZodWIgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCWludCBpOworCisJaWYgKCF2aHViIHx8ICF2aHViLT5yZWdzKQorCQlyZXR1cm4gMDsK KworCS8qIFJlbW92ZSBkZXZpY2VzICovCisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9Q T1JUUzsgaSsrKQorCQlhc3Rfdmh1Yl9kZWxfZGV2KCZ2aHViLT5wb3J0c1tpXS5kZXYpOworCisJ c3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIE1hc2sgJiBhY2sg YWxsIGludGVycnVwdHMgICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIp OworCXdyaXRlbChWSFVCX0lSUV9BQ0tfQUxMLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSVNSKTsK KworCS8qIFB1bGwgZGV2aWNlLCBsZWF2ZSBQSFkgZW5hYmxlZCAqLworCXdyaXRlbChWSFVCX0NU UkxfUEhZX0NMSyB8CisJICAgICAgIFZIVUJfQ1RSTF9QSFlfUkVTRVRfRElTLAorCSAgICAgICB2 aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisKKwlpZiAodmh1Yi0+Y2xrKQorCQljbGtfZGlz YWJsZV91bnByZXBhcmUodmh1Yi0+Y2xrKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZo dWItPmxvY2ssIGZsYWdzKTsKKworCWlmICh2aHViLT5lcDBfYnVmcykKKwkJZG1hX2ZyZWVfY29o ZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkgIEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUICoKKwkJCQkg IChBU1RfVkhVQl9OVU1fUE9SVFMgKyAxKSwKKwkJCQkgIHZodWItPmVwMF9idWZzLAorCQkJCSAg dmh1Yi0+ZXAwX2J1ZnNfZG1hKTsKKwl2aHViLT5lcDBfYnVmcyA9IE5VTEw7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl ICpwZGV2KQoreworCWVudW0gdXNiX2RldmljZV9zcGVlZCBtYXhfc3BlZWQ7CisJc3RydWN0IGFz dF92aHViICp2aHViOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpLCByYyA9IDA7CisK Kwl2aHViID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdmh1YiksIEdGUF9LRVJO RUwpOworCWlmICghdmh1YikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgm dmh1Yi0+bG9jayk7CisJdmh1Yi0+cGRldiA9IHBkZXY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRf cmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9NRU0sIDApOworCXZodWItPnJlZ3MgPSBkZXZtX2lv cmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwgcmVzKTsKKwlpZiAoSVNfRVJSKHZodWItPnJlZ3Mp KSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBtYXAgcmVzb3VyY2VzXG4iKTsK KwkJcmV0dXJuIFBUUl9FUlIodmh1Yi0+cmVncyk7CisJfQorCVVEQ0RCRyh2aHViLCAidkh1YkAl cFIgbWFwcGVkIEAlcFxuIiwgcmVzLCB2aHViLT5yZWdzKTsKKworCXBsYXRmb3JtX3NldF9kcnZk YXRhKHBkZXYsIHZodWIpOworCisJdmh1Yi0+Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYs IE5VTEwpOworICAgICAgICBpZiAoSVNfRVJSKHZodWItPmNsaykpIHsKKyAgICAgICAgICAgICAg ICByYyA9IFBUUl9FUlIodmh1Yi0+Y2xrKTsKKyAgICAgICAgICAgICAgICBnb3RvIGVycjsKKyAg ICAgICAgfQorCXJjID0gY2xrX3ByZXBhcmVfZW5hYmxlKHZodWItPmNsayk7CisJaWYgKHJjKSB7 CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkVycm9yIGNvdWxkbid0IGVuYWJsZSBjbG9jayAoJWQp XG4iLCByYyk7CisJCWdvdG8gZXJyOworICAgICAgICB9CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVk IHRvIGxpbWl0IHRoZSBIVyB0byBVU0IxICovCisJbWF4X3NwZWVkID0gdXNiX2dldF9tYXhpbXVt X3NwZWVkKCZwZGV2LT5kZXYpOworCWlmIChtYXhfc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04g JiYgbWF4X3NwZWVkIDwgVVNCX1NQRUVEX0hJR0gpCisJCXZodWItPmZvcmNlX3VzYjEgPSB0cnVl OworCisJLyogTWFzayAmIGFjayBhbGwgaW50ZXJydXB0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGUg aGFuZGxlciAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwl3cml0 ZWwoVkhVQl9JUlFfQUNLX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisKKwkvKiBG aW5kIGludGVycnVwdCBhbmQgaW5zdGFsbCBoYW5kbGVyICovCisJdmh1Yi0+aXJxID0gcGxhdGZv cm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAodmh1Yi0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZw ZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGludGVycnVwdFxuIik7CisJCXJjID0gdmh1Yi0+aXJx OworCQlnb3RvIGVycjsKKwl9CisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHZo dWItPmlycSwgYXN0X3ZodWJfaXJxLCAwLAorCQkJICAgICAgS0JVSUxEX01PRE5BTUUsIHZodWIp OworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBp bnRlcnJ1cHRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIERNQSBi dWZmZXJzIGZvciBhbGwgRVAwcyBpbiBvbmUgY2h1bmssCisJICogb25lIHBlciBwb3J0IGFuZCBv bmUgZm9yIHRoZSB2SHViIGl0c2VsZgorCSAqLworCXZodWItPmVwMF9idWZzID0gZG1hX2FsbG9j X2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJCSAgICBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAq CisJCQkJCSAgICAoQVNUX1ZIVUJfTlVNX1BPUlRTICsgMSksCisJCQkJCSAgICAmdmh1Yi0+ZXAw X2J1ZnNfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZodWItPmVwMF9idWZzKSB7CisJCWRldl9l cnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBFUDAgRE1BIGJ1ZmZlcnNcbiIpOwor CQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwlVRENWREJHKHZodWIsICJFUDAgRE1B IGJ1ZmZlcnMgQCVwIChETUEgMHglMDh4KVxuIiwKKwkJdmh1Yi0+ZXAwX2J1ZnMsICh1MzIpdmh1 Yi0+ZXAwX2J1ZnNfZG1hKTsKKworCS8qIEluaXQgdkh1YiBFUDAgKi8KKwlhc3Rfdmh1Yl9pbml0 X2VwMCh2aHViLCAmdmh1Yi0+ZXAwLCBOVUxMKTsKKworCS8qIEluaXQgZGV2aWNlcyAqLworCWZv ciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFMgJiYgcmMgPT0gMDsgaSsrKQorCQlyYyA9 IGFzdF92aHViX2luaXRfZGV2KHZodWIsIGkpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwkv KiBJbml0IGh1YiBlbXVsYXRpb24gKi8KKwlhc3Rfdmh1Yl9pbml0X2h1Yih2aHViKTsKKworCS8q IEluaXRpYWxpemUgSFcgKi8KKwlhc3Rfdmh1Yl9pbml0X2h3KHZodWIpOworCisJcmV0dXJuIDA7 CisgZXJyOgorCWFzdF92aHViX3JlbW92ZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRp YyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzdF92aHViX2R0X2lkc1tdID0geworCXsKKwkJ LmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtdXNiLXZodWIiLAorCX0sCisJeworCQkuY29t cGF0aWJsZSA9ICJhc3BlZWQsYXN0MjUwMC11c2Itdmh1YiIsCisJfSwKKwl7IH0KK307CitNT0RV TEVfREVWSUNFX1RBQkxFKG9mLCBhc3Rfdmh1Yl9kdF9pZHMpOworCitzdGF0aWMgc3RydWN0IHBs YXRmb3JtX2RyaXZlciBhc3Rfdmh1Yl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFzdF92aHViX3By b2JlLAorCS5yZW1vdmUJCT0gYXN0X3ZodWJfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFt ZQk9IEtCVUlMRF9NT0ROQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBhc3Rfdmh1Yl9kdF9pZHMs CisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFzdF92aHViX2RyaXZlcik7CisKK01P RFVMRV9ERVNDUklQVElPTigiQXNwZWVkIHZIdWIgdWRjIGRyaXZlciIpOworTU9EVUxFX0FVVEhP UigiQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiIpOwor TU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi9kZXYuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIv ZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi41ZTVkYmE1MjE0 YmEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L2Rldi5jCkBAIC0wLDAgKzEsNTgwIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMCsKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIi IFVTQiBnYWRnZXQKKyAqCisgKiBkZXYuYyAtIEluZGl2aWR1YWwgZGV2aWNlL2dhZGdldCBtYW5h Z2VtZW50IChpZSwgYSBwb3J0ID0gYSBnYWRnZXQpCisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJN IENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl LCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5j bHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNp bmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVk ZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGlu dXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxp bnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgv dXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2Zf Z3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1t YXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2hj ZC5oPgorCisjaW5jbHVkZSAidmh1Yi5oIgorCit2b2lkIGFzdF92aHViX2Rldl9pcnEoc3RydWN0 IGFzdF92aHViX2RldiAqZCkKK3sKKwl1MzIgaXN0YXQgPSByZWFkbChkLT5yZWdzICsgQVNUX1ZI VUJfREVWX0lTUik7CisKKwl3cml0ZWwoaXN0YXQsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfSVNS KTsKKworCWlmIChpc3RhdCAmIFZIVVZfREVWX0lSUV9FUDBfSU5fQUNLX1NUQUxMKQorCQlhc3Rf dmh1Yl9lcDBfaGFuZGxlX2FjaygmZC0+ZXAwLCB0cnVlKTsKKwlpZiAoaXN0YXQgJiBWSFVWX0RF Vl9JUlFfRVAwX09VVF9BQ0tfU1RBTEwpCisJCWFzdF92aHViX2VwMF9oYW5kbGVfYWNrKCZkLT5l cDAsIGZhbHNlKTsKKwlpZiAoaXN0YXQgJiBWSFVWX0RFVl9JUlFfRVAwX1NFVFVQKQorCQlhc3Rf dmh1Yl9lcDBfaGFuZGxlX3NldHVwKCZkLT5lcDApOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1 Yl9kZXZfZW5hYmxlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJdTMyIHJlZywgaG1zazsK KworCWlmIChkLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwkvKiBFbmFibGUgZGV2aWNlIGFuZCBp dHMgRVAwIGludGVycnVwdHMgKi8KKwlyZWcgPSBWSFVCX0RFVl9FTl9FTkFCTEVfUE9SVCB8CisJ CVZIVUJfREVWX0VOX0VQMF9JTl9BQ0tfSVJRRU4gfAorCQlWSFVCX0RFVl9FTl9FUDBfT1VUX0FD S19JUlFFTiB8CisJCVZIVUJfREVWX0VOX0VQMF9TRVRVUF9JUlFFTjsKKwlpZiAoZC0+Z2FkZ2V0 LnNwZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQlyZWcgfD0gVkhVQl9ERVZfRU5fU1BFRURfU0VM X0hJR0g7CisJd3JpdGVsKHJlZywgZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJMKTsKKwor CS8qIEVuYWJsZSBkZXZpY2UgaW50ZXJydXB0IGluIHRoZSBodWIgYXMgd2VsbCAqLworCWhtc2sg PSBWSFVCX0lSUV9ERVZJQ0UxIDw8IGQtPmluZGV4OworCXJlZyA9IHJlYWRsKGQtPnZodWItPnJl Z3MgKyBBU1RfVkhVQl9JRVIpOworCXJlZyB8PSBobXNrOworCXdyaXRlbChyZWcsIGQtPnZodWIt PnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworCisJLyogU2V0IEVQMCBETUEgYnVmZmVyIGFkZHJlc3Mg Ki8KKwl3cml0ZWwoZC0+ZXAwLmJ1Zl9kbWEsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRVAwX0RB VEEpOworCisJZC0+ZW5hYmxlZCA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Rl dl9kaXNhYmxlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJdTMyIHJlZywgaG1zazsKKwor CWlmICghZC0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSBkZXZpY2UgaW50ZXJy dXB0IGluIHRoZSBodWIgKi8KKwlobXNrID0gVkhVQl9JUlFfREVWSUNFMSA8PCBkLT5pbmRleDsK KwlyZWcgPSByZWFkbChkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwlyZWcgJj0gfmht c2s7CisJd3JpdGVsKHJlZywgZC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisKKwkvKiBU aGVuIGRpc2FibGUgZGV2aWNlICovCisJd3JpdGVsKDAsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZf RU5fQ1RSTCk7CisJZC0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJZC0+ZW5h YmxlZCA9IGZhbHNlOworCWQtPnN1c3BlbmRlZCA9IGZhbHNlOworfQorCitzdGF0aWMgaW50IGFz dF92aHViX2Rldl9mZWF0dXJlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsCisJCQkJdTE2IHdJbmRl eCwgdTE2IHdWYWx1ZSwKKwkJCQlib29sIGlzX3NldCkKK3sKKwlEREJHKGQsICIlc19GRUFUVVJF KGRldiB2YWw9JTAyeClcbiIsCisJICAgICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIHdWYWx1 ZSk7CisKKwlpZiAod1ZhbHVlICE9IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkKKwkJcmV0dXJu IHN0ZF9yZXFfZHJpdmVyOworCisJZC0+d2FrZXVwX2VuID0gaXNfc2V0OworCisJcmV0dXJuIHN0 ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBfZmVhdHVyZShzdHJ1 Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJICAgICAgIHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUsIGJv b2wgaXNfc2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7CisJaW50IGVwX251bTsKKwor CWVwX251bSA9IHdJbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwlEREJHKGQsICIl c19GRUFUVVJFKGVwJWQgdmFsPSUwMngpXG4iLAorCSAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xF QVIiLCBlcF9udW0sIHdWYWx1ZSk7CisJaWYgKGVwX251bSA9PSAwKQorCQlyZXR1cm4gc3RkX3Jl cV9jb21wbGV0ZTsKKwlpZiAoZXBfbnVtID49IEFTVF9WSFVCX05VTV9HRU5fRVBzIHx8ICFkLT5l cG5zW2VwX251bSAtIDFdKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAod1ZhbHVlICE9 IFVTQl9FTkRQT0lOVF9IQUxUKQorCQlyZXR1cm4gc3RkX3JlcV9kcml2ZXI7CisKKwllcCA9IGQt PmVwbnNbZXBfbnVtIC0gMV07CisJaWYgKFdBUk5fT04oIWVwKSkKKwkJcmV0dXJuIHN0ZF9yZXFf c3RhbGw7CisKKwlpZiAoIWVwLT5lcG4uZW5hYmxlZCB8fCAhZXAtPmVwLmRlc2MgfHwgZXAtPmVw bi5pc19pc28gfHwKKwkgICAgZXAtPmVwbi5pc19pbiAhPSAhISh3SW5kZXggJiBVU0JfRElSX0lO KSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwlEREJHKGQsICIlcyBzdGFsbCBvbiBFUCAl ZFxuIiwKKwkgICAgIGlzX3NldCA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIsIGVwX251bSk7CisJ ZXAtPmVwbi5zdGFsbGVkID0gaXNfc2V0OworCWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXAp OworCisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf ZGV2X3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJICAgICAgIHUxNiB3SW5kZXgs IHUxNiB3VmFsdWUpCit7CisJdTggc3QwOworCisJRERCRyhkLCAiR0VUX1NUQVRVUyhkZXYpXG4i KTsKKworCXN0MCA9IGQtPmdhZGdldC5pc19zZWxmcG93ZXJlZCA8PCBVU0JfREVWSUNFX1NFTEZf UE9XRVJFRDsKKwlpZiAoZC0+d2FrZXVwX2VuKQorCQlzdDAgfD0gMSA8PCBVU0JfREVWSUNFX1JF TU9URV9XQUtFVVA7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KCZkLT5lcDAsIHN0 MCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBfc3RhdHVzKHN0cnVjdCBhc3Rfdmh1 Yl9kZXYgKmQsCisJCQkgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlKQoreworCWludCBlcF9u dW0gPSB3SW5kZXggJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJc3RydWN0IGFzdF92aHVi X2VwICplcDsKKwl1OCBzdDAgPSAwOworCisJRERCRyhkLCAiR0VUX1NUQVRVUyhlcCVkKVxuIiwg ZXBfbnVtKTsKKworCWlmIChlcF9udW0gPj0gQVNUX1ZIVUJfTlVNX0dFTl9FUHMpCisJCXJldHVy biBzdGRfcmVxX3N0YWxsOworCWlmIChlcF9udW0gIT0gMCkgeworCQllcCA9IGQtPmVwbnNbZXBf bnVtIC0gMV07CisJCWlmICghZXApCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJaWYgKCFl cC0+ZXBuLmVuYWJsZWQgfHwgIWVwLT5lcC5kZXNjIHx8IGVwLT5lcG4uaXNfaXNvIHx8CisJCSAg ICBlcC0+ZXBuLmlzX2luICE9ICEhKHdJbmRleCAmIFVTQl9ESVJfSU4pKQorCQkJcmV0dXJuIHN0 ZF9yZXFfc3RhbGw7CisJCWlmIChlcC0+ZXBuLnN0YWxsZWQpCisJCQlzdDAgfD0gMSA8PCBVU0Jf RU5EUE9JTlRfSEFMVDsKKwl9CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KCZkLT5l cDAsIHN0MCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Rldl9zZXRfYWRkcmVzcyhz dHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLCB1OCBhZGRyKQoreworCXUzMiByZWc7CisKKwlEREJHKGQs ICJTRVRfQUREUkVTUzogR290IGFkZHJlc3MgJXhcbiIsIGFkZHIpOworCisJcmVnID0gcmVhZGwo ZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJMKTsKKwlyZWcgJj0gflZIVUJfREVWX0VOX0FE RFJfTUFTSzsKKwlyZWcgfD0gVkhVQl9ERVZfRU5fU0VUX0FERFIoYWRkcik7CisJd3JpdGVsKHJl ZywgZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJMKTsKK30KKworaW50IGFzdF92aHViX3N0 ZF9kZXZfcmVxdWVzdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJICAgICBzdHJ1Y3QgdXNi X2N0cmxyZXF1ZXN0ICpjcnEpCit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9IGVwLT5kZXY7 CisJdTE2IHdWYWx1ZSwgd0luZGV4OworCisJLyogTm8gZHJpdmVyLCB3ZSBzaG91bGRuJ3QgYmUg ZW5hYmxlZCAuLi4gKi8KKwlpZiAoIWQtPmRyaXZlciB8fCAhZC0+ZW5hYmxlZCB8fCBkLT5zdXNw ZW5kZWQpIHsKKwkJRVBEQkcoZXAsCisJCSAgICAgICJEZXZpY2UgaXMgd3Jvbmcgc3RhdGUgZHJp dmVyPSVwIGVuYWJsZWQ9JWQiCisJCSAgICAgICIgc3VzcGVuZGVkPSVkXG4iLAorCQkgICAgICBk LT5kcml2ZXIsIGQtPmVuYWJsZWQsIGQtPnN1c3BlbmRlZCk7CisJCXJldHVybiBzdGRfcmVxX3N0 YWxsOworCX0KKworCS8qIEZpcnN0IHBhY2tldCwgZ3JhYiBzcGVlZCAqLworCWlmIChkLT5nYWRn ZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJZC0+Z2FkZ2V0LnNwZWVkID0gZXAt PnZodWItPnNwZWVkOworCQlpZiAoZC0+Z2FkZ2V0LnNwZWVkID4gZC0+ZHJpdmVyLT5tYXhfc3Bl ZWQpCisJCQlkLT5nYWRnZXQuc3BlZWQgPSBkLT5kcml2ZXItPm1heF9zcGVlZDsKKwkJRERCRyhk LCAiZmlzdCBwYWNrZXQsIGNhcHR1cmVkIHNwZWVkICVkXG4iLAorCQkgICAgIGQtPmdhZGdldC5z cGVlZCk7CisJfQorCisJd1ZhbHVlID0gbGUxNl90b19jcHUoY3JxLT53VmFsdWUpOworCXdJbmRl eCA9IGxlMTZfdG9fY3B1KGNycS0+d0luZGV4KTsKKworCXN3aXRjaCAoKGNycS0+YlJlcXVlc3RU eXBlIDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgeworCQkvKiBTRVRfQUREUkVTUyAqLworCWNhc2Ug RGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCWFzdF92aHViX2Rldl9z ZXRfYWRkcmVzcyhkLCB3VmFsdWUpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKworCQkv KiBHRVRfU1RBVFVTICovCisJY2FzZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVT OgorCQlyZXR1cm4gYXN0X3ZodWJfZGV2X3N0YXR1cyhkLCB3SW5kZXgsIHdWYWx1ZSk7CisJY2Fz ZSBJbnRlcmZhY2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQlyZXR1cm4gYXN0X3Zo dWJfc2ltcGxlX3JlcGx5KGVwLCAwLCAwKTsKKwljYXNlIEVuZHBvaW50UmVxdWVzdCB8IFVTQl9S RVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX2VwX3N0YXR1cyhkLCB3SW5kZXgsIHdW YWx1ZSk7CisKKwkJLyogU0VUL0NMRUFSX0ZFQVRVUkUgKi8KKwljYXNlIERldmljZU91dFJlcXVl c3QgfCBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfZGV2X2ZlYXR1cmUo ZCwgd0luZGV4LCB3VmFsdWUsIHRydWUpOworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9S RVFfQ0xFQVJfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2Rldl9mZWF0dXJlKGQsIHdJbmRl eCwgd1ZhbHVlLCBmYWxzZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX1NF VF9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfZXBfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1 ZSwgdHJ1ZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRV UkU6CisJCXJldHVybiBhc3Rfdmh1Yl9lcF9mZWF0dXJlKGQsIHdJbmRleCwgd1ZhbHVlLCBmYWxz ZSk7CisJfQorCXJldHVybiBzdGRfcmVxX2RyaXZlcjsKK30KKworc3RhdGljIGludCBhc3Rfdmh1 Yl91ZGNfd2FrZXVwKHN0cnVjdCB1c2JfZ2FkZ2V0KiBnYWRnZXQpCit7CisJc3RydWN0IGFzdF92 aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CWludCByYyA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywg ZmxhZ3MpOworCWlmICghZC0+d2FrZXVwX2VuKQorCQlnb3RvIGVycjsKKworCUREQkcoZCwgIkRl dmljZSBpbml0aWF0ZWQgd2FrZXVwXG4iKTsKKworCS8qIFdha2V1cCB0aGUgaG9zdCAqLworCWFz dF92aHViX2h1Yl93YWtlX2FsbChkLT52aHViKTsKKwlyYyA9IDA7CisgZXJyOgorCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisK K3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX2dldF9mcmFtZShzdHJ1Y3QgdXNiX2dhZGdldCogZ2Fk Z2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisK KwlyZXR1cm4gKHJlYWRsKGQtPnZodWItPnJlZ3MgKyBBU1RfVkhVQl9VU0JTVFMpID4+IDE2KSAm IDB4N2ZmOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfbnVrZShzdHJ1Y3QgYXN0X3Zo dWJfZGV2ICpkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFTVF9W SFVCX05VTV9HRU5fRVBzOyBpKyspIHsKKwkJaWYgKCFkLT5lcG5zW2ldKQorCQkJY29udGludWU7 CisJCWFzdF92aHViX251a2UoZC0+ZXBuc1tpXSwgLUVTSFVURE9XTik7CisJfQorfQorCitzdGF0 aWMgaW50IGFzdF92aHViX3VkY19wdWxsdXAoc3RydWN0IHVzYl9nYWRnZXQqIGdhZGdldCwgaW50 IG9uKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2Nr LCBmbGFncyk7CisKKwlEREJHKGQsICJwdWxsdXAoJWQpXG4iLCBvbik7CisKKwkvKiBNYXJrIGRp c2Nvbm5lY3RlZCBpbiB0aGUgaHViICovCisJYXN0X3ZodWJfZGV2aWNlX2Nvbm5lY3QoZC0+dmh1 YiwgZC0+aW5kZXgsIG9uKTsKKworCS8qCisJICogSWYgZW5hYmxlZCwgbnVrZSBhbGwgcmVxdWVz dHMgaWYgYW55ICh0aGVyZSBzaG91bGRuJ3QgYmUpCisJICogYW5kIGRpc2FibGUgdGhlIHBvcnQu IFRoaXMgd2lsbCBjbGVhciB0aGUgYWRkcmVzcyB0b28uCisJICovCisJaWYgKGQtPmVuYWJsZWQp IHsKKwkJYXN0X3ZodWJfZGV2X251a2UoZCk7CisJCWFzdF92aHViX2Rldl9kaXNhYmxlKGQpOwor CX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3VkY19zdGFydChzdHJ1Y3QgdXNi X2dhZGdldCAqZ2FkZ2V0LAorCQkJICAgICAgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2 ZXIpCit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1 bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ss IGZsYWdzKTsKKworCUREQkcoZCwgInN0YXJ0XG4iKTsKKworCS8qIFdlIGRvbid0IGRvIG11Y2gg bW9yZSB1bnRpbCB0aGUgaHViIGVuYWJsZXMgdXMgKi8KKwlkLT5kcml2ZXIgPSBkcml2ZXI7CisJ ZC0+Z2FkZ2V0LmlzX3NlbGZwb3dlcmVkID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0 IHVzYl9lcCAqYXN0X3ZodWJfdWRjX21hdGNoX2VwKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQs CisJCQkJCSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCSAg ICBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqc3MpCit7CisJc3RydWN0IGFzdF92 aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw OworCXN0cnVjdCB1c2JfZXAgKnVfZXA7CisJdW5zaWduZWQgaW50IG1heCwgYWRkciwgaTsKKwor CUREQkcoZCwgIk1hdGNoIEVQIHR5cGUgJWRcbiIsIHVzYl9lbmRwb2ludF90eXBlKGRlc2MpKTsK KworCS8qCisJICogRmlyc3Qgd2UgbmVlZCB0byBsb29rIGZvciBhbiBleGlzdGluZyB1bmNsYWlt ZWQgRVAgYXMgYW5vdGhlcgorCSAqIGNvbmZpZ3VyYXRpb24gbWF5IGhhdmUgYWxyZWFkeSBhc3Nv Y2lhdGVkIGEgYnVuY2ggb2YgRVBzIHdpdGgKKwkgKiB0aGlzIGdhZGdldC4gVGhpcyBkdXBsaWNh dGVzIHRoZSBjb2RlIGluIHVzYl9lcF9hdXRvY29uZmlnX3NzKCkKKwkgKiB1bmZvcnR1bmF0ZWx5 LgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodV9lcCwgJmdhZGdldC0+ZXBfbGlzdCwgZXBf bGlzdCkgeworCQlpZiAodXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKGdhZGdldCwgdV9lcCwgZGVz Yywgc3MpKSB7CisJCQlEREJHKGQsICIgLT4gdXNpbmcgZXhpc3RpbmcgRVAlZFxuIiwKKwkJCSAg ICAgdG9fYXN0X2VwKHVfZXApLT5kX2lkeCk7CisJCQlyZXR1cm4gdV9lcDsKKwkJfQorCX0KKwor CS8qCisJICogV2UgZGlkbid0IGZpbmQgb25lLCB3ZSBuZWVkIHRvIGdyYWIgb25lIGZyb20gdGhl IHBvb2wuCisJICoKKwkgKiBGaXJzdCBsZXQncyBkbyBzb21lIHNhbml0eSBjaGVja2luZworCSAq LworCXN3aXRjaCh1c2JfZW5kcG9pbnRfdHlwZShkZXNjKSkgeworCWNhc2UgVVNCX0VORFBPSU5U X1hGRVJfQ09OVFJPTDoKKwkJLyogT25seSBFUDAgY2FuIGJlIGEgY29udHJvbCBlbmRwb2ludCAq LworCQlyZXR1cm4gTlVMTDsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCS8qIElT TzogIGxpbWl0IDEwMjMgYnl0ZXMgZnVsbCBzcGVlZCwgMTAyNCBoaWdoL3N1cGVyIHNwZWVkICov CisJCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpCisJCQltYXggPSAxMDI0OworCQll bHNlCisJCQltYXggPSAxMDIzOworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JV TEs6CisJCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpCisJCQltYXggPSA1MTI7CisJ CWVsc2UKKwkJCW1heCA9IDY0OworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lO VDoKKwkJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkKKwkJCW1heCA9IDEwMjQ7CisJ CWVsc2UKKwkJCW1heCA9IDY0OworCQlicmVhazsKKwl9CisJaWYgKHVzYl9lbmRwb2ludF9tYXhw KGRlc2MpID4gbWF4KQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogRmluZCBhIGZyZWUgRVAg YWRkcmVzcyBmb3IgdGhhdCBkZXZpY2UuIFdlIGNhbid0CisJICogbGV0IHRoZSBnZW5lcmljIGNv ZGUgYXNzaWduIHRoZXNlIGFzIGl0IHdvdWxkCisJICogY3JlYXRlIG92ZXJsYXBwaW5nIG51bWJl cnMgZm9yIElOIGFuZCBPVVQgd2hpY2gKKwkgKiB3ZSBkb24ndCBzdXBwb3J0LCBzbyBhbHNvIGNy ZWF0ZSBhIHN1aXRhYmxlIG5hbWUKKwkgKiB0aGF0IHdpbGwgYWxsb3cgdGhlIGdlbmVyaWMgY29k ZSB0byB1c2Ugb3VyCisJICogYXNzaWduZWQgYWRkcmVzcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBp IDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykKKwkJaWYgKGQtPmVwbnNbaV0gPT0gTlVMTCkK KwkJCWJyZWFrOworCWlmIChpID49IEFTVF9WSFVCX05VTV9HRU5fRVBzKQorCQlyZXR1cm4gTlVM TDsKKwlhZGRyID0gaSArIDE7CisKKwkvKgorCSAqIE5vdyBncmFiIGFuIEVQIGZyb20gdGhlIHNo YXJlZCBwb29sIGFuZCBhc3NvY2lhdGUKKwkgKiBpdCB3aXRoIG91ciBkZXZpY2UKKwkgKi8KKyAg ICAgICAJZXAgPSBhc3Rfdmh1Yl9hbGxvY19lcG4oZCwgYWRkcik7CisJaWYgKCFlcCkKKwkJcmV0 dXJuIE5VTEw7CisJRERCRyhkLCAiQWxsb2NhdGVkIGVwbiMlZCBmb3IgcG9ydCBFUCVkXG4iLAor CSAgICAgZXAtPmVwbi5nX2lkeCwgYWRkcik7CisKKwlyZXR1cm4gJmVwLT5lcDsKK30KKworc3Rh dGljIGludCBhc3Rfdmh1Yl91ZGNfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQorewor CXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7 CisKKwlEREJHKGQsICJzdG9wXG4iKTsKKworCWQtPmRyaXZlciA9IE5VTEw7CisJZC0+Z2FkZ2V0 LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisKKwlhc3Rfdmh1Yl9kZXZfbnVrZShkKTsKKwor CWlmIChkLT5lbmFibGVkKQorCQlhc3Rfdmh1Yl9kZXZfZGlzYWJsZShkKTsKKworCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRfb3BzIGFzdF92aHViX3VkY19vcHMgPSB7CisJLmdl dF9mcmFtZQk9IGFzdF92aHViX3VkY19nZXRfZnJhbWUsCisJLndha2V1cAkJPSBhc3Rfdmh1Yl91 ZGNfd2FrZXVwLAorCS5wdWxsdXAJCT0gYXN0X3ZodWJfdWRjX3B1bGx1cCwKKwkudWRjX3N0YXJ0 CT0gYXN0X3ZodWJfdWRjX3N0YXJ0LAorCS51ZGNfc3RvcAk9IGFzdF92aHViX3VkY19zdG9wLAor CS5tYXRjaF9lcAk9IGFzdF92aHViX3VkY19tYXRjaF9lcCwKK307CisKK3ZvaWQgYXN0X3ZodWJf ZGV2X3N1c3BlbmQoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwlkLT5zdXNwZW5kZWQgPSB0 cnVlOworCWlmIChkLT5kcml2ZXIpIHsKKwkJc3Bpbl91bmxvY2soJmQtPnZodWItPmxvY2spOwor CQlkLT5kcml2ZXItPnN1c3BlbmQoJmQtPmdhZGdldCk7CisJCXNwaW5fbG9jaygmZC0+dmh1Yi0+ bG9jayk7CisJfQorfQorCit2b2lkIGFzdF92aHViX2Rldl9yZXN1bWUoc3RydWN0IGFzdF92aHVi X2RldiAqZCkKK3sKKwlkLT5zdXNwZW5kZWQgPSBmYWxzZTsKKwlpZiAoZC0+ZHJpdmVyKSB7CisJ CXNwaW5fdW5sb2NrKCZkLT52aHViLT5sb2NrKTsKKwkJZC0+ZHJpdmVyLT5yZXN1bWUoJmQtPmdh ZGdldCk7CisJCXNwaW5fbG9jaygmZC0+dmh1Yi0+bG9jayk7CisJfQorfQorCit2b2lkIGFzdF92 aHViX2Rldl9yZXNldChzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCS8qCisJICogSWYgc3Bl ZWQgaXMgbm90IHNldCwgd2UgZW5hYmxlIHRoZSBwb3J0LiBJZiBpdCBpcywKKwkgKiBzZW5kIHJl c2V0IHRvIHRoZSBnYWRnZXQgYW5kIHJlc2V0ICJzcGVlZCIuCisJICoKKwkgKiBTcGVlZCBpcyBh biBpbmRpY2F0aW9uIHRoYXQgd2UgaGF2ZSBnb3QgdGhlIGZpcnN0CisJICogc2V0dXAgcGFja2V0 IHRvIHRoZSBkZXZpY2UuCisJICovCisJaWYgKGQtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURf VU5LTk9XTiAmJiAhZC0+ZW5hYmxlZCkgeworCQlEREJHKGQsICJSZXNldCBhdCB1bmtub3duIHNw ZWVkIG9mIGRpc2FibGVkIGRldmljZSwgZW5hYmxpbmcuLi5cbiIpOworCQlhc3Rfdmh1Yl9kZXZf ZW5hYmxlKGQpOworCQlkLT5zdXNwZW5kZWQgPSBmYWxzZTsKKwl9CisJaWYgKGQtPmdhZGdldC5z cGVlZCAhPSBVU0JfU1BFRURfVU5LTk9XTiAmJiBkLT5kcml2ZXIpIHsKKwkJdW5zaWduZWQgaW50 IGk7CisKKwkJRERCRyhkLCAiUmVzZXQgYXQga25vd24gc3BlZWQgb2YgYm91bmQgZGV2aWNlLCBy ZXNldHRpbmcuLi5cbiIpOworCQlzcGluX3VubG9jaygmZC0+dmh1Yi0+bG9jayk7CisJCWQtPmRy aXZlci0+cmVzZXQoJmQtPmdhZGdldCk7CisJCXNwaW5fbG9jaygmZC0+dmh1Yi0+bG9jayk7CisK KwkJLyoKKwkJICogRGlzYWJsZS9yZS1lbmFibGUgSFcsIHRoaXMgd2lsbCBjbGVhciB0aGUgYWRk cmVzcworCQkgKiBhbmQgc3BlZWQgc2V0dGluZy4KKwkJICovCisJCWFzdF92aHViX2Rldl9kaXNh YmxlKGQpOworCQlhc3Rfdmh1Yl9kZXZfZW5hYmxlKGQpOworCisJCS8qIENsZWFyIHN0YWxsIG9u IGFsbCBFUHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKysp IHsKKwkJCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSBkLT5lcG5zW2ldOworCisJCQlpZiAoZXAg JiYgZXAtPmVwbi5zdGFsbGVkKSB7CisJCQkJZXAtPmVwbi5zdGFsbGVkID0gZmFsc2U7CisJCQkJ YXN0X3ZodWJfdXBkYXRlX2Vwbl9zdGFsbChlcCk7CisJCQl9CisJCX0KKworCQkvKiBBZGRpdGlv bmFsIGNsZWFudXBzICovCisJCWQtPndha2V1cF9lbiA9IGZhbHNlOworCQlkLT5zdXNwZW5kZWQg PSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQgYXN0X3ZodWJfZGVsX2RldihzdHJ1Y3QgYXN0X3ZodWJf ZGV2ICpkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgm ZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCWlmICghZC0+cmVnaXN0ZXJlZCkgeworCQlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJ ZC0+cmVnaXN0ZXJlZCA9IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPnZodWIt PmxvY2ssIGZsYWdzKTsKKworCXVzYl9kZWxfZ2FkZ2V0X3VkYygmZC0+Z2FkZ2V0KTsKKwlkZXZp Y2VfdW5yZWdpc3RlcigmZC0+cG9ydF9kZXYpOworfQorCitpbnQgYXN0X3ZodWJfaW5pdF9kZXYo c3RydWN0IGFzdF92aHViICp2aHViLCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhc3Rf dmh1Yl9kZXYgKmQgPSAmdmh1Yi0+cG9ydHNbaWR4XS5kZXY7CisJc3RydWN0IGRldmljZSAqcGFy ZW50ID0gJnZodWItPnBkZXYtPmRldjsKKwlpbnQgcmM7CisKKwlkLT52aHViID0gdmh1YjsKKwlk LT5pbmRleCA9IGlkeDsKKwlkLT5uYW1lID0gZGV2bV9rYXNwcmludGYocGFyZW50LCBHRlBfS0VS TkVMLCAicG9ydCVkIiwgaWR4KzEpOworCWQtPnJlZ3MgPSB2aHViLT5yZWdzICsgMHgxMDAgKyAw eDEwICogaWR4OworCisJYXN0X3ZodWJfaW5pdF9lcDAodmh1YiwgJmQtPmVwMCwgZCk7CisKKwkv KgorCSAqIFRoZSBVREMgY29yZSByZWFsbHkgbmVlZHMgdXMgdG8gaGF2ZSBzZXBhcmF0ZSBhbmQg dW5pcXVlbHkKKwkgKiBuYW1lZCAicGFyZW50IiBkZXZpY2VzIGZvciBlYWNoIHBvcnQgc28gd2Ug Y3JlYXRlIGEgc3ViIGRldmljZQorCSAqIGhlcmUgZm9yIHRoYXQgcHVycG9zZQorCSAqLworCWRl dmljZV9pbml0aWFsaXplKCZkLT5wb3J0X2Rldik7CisJZC0+cG9ydF9kZXYucGFyZW50ID0gcGFy ZW50OworCWRldl9zZXRfbmFtZSgmZC0+cG9ydF9kZXYsICIlczpwJWQiLCBkZXZfbmFtZShwYXJl bnQpLCBpZHggKyAxKTsKKwlyYyA9IGRldmljZV9hZGQoJmQtPnBvcnRfZGV2KTsKKwlpZiAocmMp CisJCWdvdG8gZmFpbF9hZGQ7CisKKwkvKiBQb3B1bGF0ZSBnYWRnZXQgKi8KKwlJTklUX0xJU1Rf SEVBRCgmZC0+Z2FkZ2V0LmVwX2xpc3QpOworCWQtPmdhZGdldC5vcHMgPSAmYXN0X3ZodWJfdWRj X29wczsKKwlkLT5nYWRnZXQuZXAwID0gJmQtPmVwMC5lcDsKKwlkLT5nYWRnZXQubmFtZSA9IEtC VUlMRF9NT0ROQU1FOworCWlmICh2aHViLT5mb3JjZV91c2IxKQorCQlkLT5nYWRnZXQubWF4X3Nw ZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisJZWxzZQorCQlkLT5nYWRnZXQubWF4X3NwZWVkID0gVVNC X1NQRUVEX0hJR0g7CisJZC0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJZC0+ Z2FkZ2V0LmRldi5vZl9ub2RlID0gdmh1Yi0+cGRldi0+ZGV2Lm9mX25vZGU7CisKKwlyYyA9IHVz Yl9hZGRfZ2FkZ2V0X3VkYygmZC0+cG9ydF9kZXYsICZkLT5nYWRnZXQpOworCWlmIChyYyAhPSAw KQorCQlnb3RvIGZhaWxfdWRjOworCWQtPnJlZ2lzdGVyZWQgPSB0cnVlOworCisJcmV0dXJuIDA7 CisgZmFpbF91ZGM6CisJZGV2aWNlX2RlbCgmZC0+cG9ydF9kZXYpOworIGZhaWxfYWRkOgorCXB1 dF9kZXZpY2UoJmQtPnBvcnRfZGV2KTsKKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXAwLmMgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL2VwMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwMC4uNzk3MDk5ZjA2Y2FhCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwpAQCAtMCwwICsxLDQ3OCBAQAorLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICogYXNwZWVkLXZodWIgLS0gRHJpdmVyIGZv ciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICogZXAwLmMgLSBFbmRwb2ludCAw IGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJNIENvcnBvcmF0aW9uCisgKgorICog VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVi bGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0 aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0 aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+ CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2 aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQu aD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNp bmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5j bHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5j bHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1 ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxp bnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRl ICJ2aHViLmgiCisKK2ludCBhc3Rfdmh1Yl9yZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBj aGFyICpwdHIsIGludCBsZW4pCit7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSAmZXAtPmVw MC5yZXEucmVxOworCisJaWYgKFdBUk5fT04oZXAtPmRfaWR4ICE9IDApKQorCQlyZXR1cm4gc3Rk X3JlcV9zdGFsbDsKKwlpZiAoV0FSTl9PTighZXAtPmVwMC5kaXJfaW4pKQorCQlyZXR1cm4gc3Rk X3JlcV9zdGFsbDsKKwlpZiAoV0FSTl9PTihsZW4gPiBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCkp CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWlmIChXQVJOX09OKHJlcS0+c3RhdHVzID09IC1F SU5QUk9HUkVTUykpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJcmVxLT5idWYgPSBwdHI7 CisJcmVxLT5sZW5ndGggPSBsZW47CisJcmVxLT5jb21wbGV0ZSA9IE5VTEw7CisJcmVxLT56ZXJv ID0gdHJ1ZTsKKworCS8qIENhbGwgaW50ZXJuYWwgcXVldWUgZGlyZWN0bHkgKi8KKwlpZiAoZXAt PmVwLm9wcy0+cXVldWUoJmVwLT5lcCwgcmVxLCBHRlBfQVRPTUlDKSkKKwkJcmV0dXJuIHN0ZF9y ZXFfc3RhbGw7CisJZWxzZQorCQlyZXR1cm4gc3RkX3JlcV9kYXRhOworfQorCitpbnQgX19hc3Rf dmh1Yl9zaW1wbGVfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IGxlbiwgLi4uKQor eworCXU4ICpidWZmZXIgPSBlcC0+YnVmOworCXVuc2lnbmVkIGludCBpOworCXZhX2xpc3QgYXJn czsKKworCXZhX3N0YXJ0KGFyZ3MsIGxlbik7CisKKwkvKiBDb3B5IGRhdGEgZGlyZWN0bHkgaW50 byBFUCBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJ1ZmZlcltpXSA9 IHZhX2FyZyhhcmdzLCBpbnQpOworCXZhX2VuZChhcmdzKTsKKworCS8qIHJlcS0+YnVmIE5VTEwg bWVhbnMgZGF0YSBpcyBhbHJlYWR5IHRoZXJlICovCisJcmV0dXJuIGFzdF92aHViX3JlcGx5KGVw LCBOVUxMLCBsZW4pOworfQorCit2b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfc2V0dXAoc3RydWN0 IGFzdF92aHViX2VwICplcCkKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGNycTsKKwllbnVt IHN0ZF9yZXFfcmMgc3RkX3JlcV9yYzsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJaWYgKFdBUk5f T04oZXAtPmRfaWR4ICE9IDApKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEdyYWIgdGhlIHNldHVw IHBhY2tldCBmcm9tIHRoZSBjaGlwIGFuZCBieXRlc3dhcAorCSAqIGludGVyZXN0aW5nIGZpZWxk cworCSAqLworCW1lbWNweV9mcm9taW8oJmNycSwgZXAtPmVwMC5zZXR1cCwgc2l6ZW9mKGNycSkp OworCisJRVBEQkcoZXAsICJTRVRVUCBwYWNrZXQgJTAyeC8lMDJ4LyUwNHgvJTA0eC8lMDR4IFsl c10gc3Q9JWRcbiIsCisJICAgICAgY3JxLmJSZXF1ZXN0VHlwZSwgY3JxLmJSZXF1ZXN0LAorCSAg ICAgICBsZTE2X3RvX2NwdShjcnEud1ZhbHVlKSwKKwkgICAgICAgbGUxNl90b19jcHUoY3JxLndJ bmRleCksCisJICAgICAgIGxlMTZfdG9fY3B1KGNycS53TGVuZ3RoKSwKKwkgICAgICAgKGNycS5i UmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA/ICJpbiIgOiAib3V0IiwKKwkgICAgICAgZXAtPmVw MC5zdGF0ZSk7CisKKwkvKiBDaGVjayBvdXIgc3RhdGUsIGNhbmNlbCBwZW5kaW5nIHJlcXVlc3Rz IGlmIG5lZWRlZCAqLworCWlmIChlcC0+ZXAwLnN0YXRlICE9IGVwMF9zdGF0ZV90b2tlbikgewor CQlFUERCRyhlcCwgIndyb25nIHN0YXRlXG4iKTsKKwkJYXN0X3ZodWJfbnVrZShlcCwgMCk7CisJ CWdvdG8gc3RhbGw7CisJfQorCisJLyogQ2FsY3VsYXRlIG5leHQgc3RhdGUgZm9yIEVQMCAqLwor CWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfZGF0YTsKKwllcC0+ZXAwLmRpcl9pbiA9ICEhKGNy cS5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKTsKKworCS8qIElmIHRoaXMgaXMgdGhlIHZIdWIs IHdlIGhhbmRsZSByZXF1ZXN0cyBkaWZmZXJlbnRseSAqLworCXN0ZF9yZXFfcmMgPSBzdGRfcmVx X2RyaXZlcjsKKwlpZiAoZXAtPmRldiA9PSBOVUxMKSB7CisJCWlmICgoY3JxLmJSZXF1ZXN0VHlw ZSAmIFVTQl9UWVBFX01BU0spID09IFVTQl9UWVBFX1NUQU5EQVJEKQorCQkJc3RkX3JlcV9yYyA9 IGFzdF92aHViX3N0ZF9odWJfcmVxdWVzdChlcCwgJmNycSk7CisJCWVsc2UgaWYgKChjcnEuYlJl cXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfQ0xBU1MpCisJCQlzdGRfcmVx X3JjID0gYXN0X3ZodWJfY2xhc3NfaHViX3JlcXVlc3QoZXAsICZjcnEpOworCQllbHNlCisJCQlz dGRfcmVxX3JjID0gc3RkX3JlcV9zdGFsbDsKKwl9IGVsc2UgaWYgKChjcnEuYlJlcXVlc3RUeXBl ICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfU1RBTkRBUkQpCisJCXN0ZF9yZXFfcmMgPSBh c3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3QoZXAsICZjcnEpOworCisJLyogQWN0IHVwb24gcmVzdWx0 ICovCisJc3dpdGNoKHN0ZF9yZXFfcmMpIHsKKwljYXNlIHN0ZF9yZXFfY29tcGxldGU6CisJCWdv dG8gY29tcGxldGU7CisJY2FzZSBzdGRfcmVxX3N0YWxsOgorCQlnb3RvIHN0YWxsOworCWNhc2Ug c3RkX3JlcV9kcml2ZXI6CisJCWJyZWFrOworCWNhc2Ugc3RkX3JlcV9kYXRhOgorCQlyZXR1cm47 CisJfQorCisJLyogUGFzcyByZXF1ZXN0IHVwIHRvIHRoZSBnYWRnZXQgZHJpdmVyICovCisJaWYg KFdBUk5fT04oIWVwLT5kZXYpKQorCQlnb3RvIHN0YWxsOworCWlmIChlcC0+ZGV2LT5kcml2ZXIp IHsKKwkJRVBEQkcoZXAsICJmb3J3YXJkaW5nIHRvIGdhZGdldC4uLlxuIik7CisJCXNwaW5fdW5s b2NrKCZlcC0+dmh1Yi0+bG9jayk7CisJCXJjID0gZXAtPmRldi0+ZHJpdmVyLT5zZXR1cCgmZXAt PmRldi0+Z2FkZ2V0LCAmY3JxKTsKKwkJc3Bpbl9sb2NrKCZlcC0+dmh1Yi0+bG9jayk7CisJCUVQ REJHKGVwLCAiZHJpdmVyIHJldHVybmVkICVkXG4iLCByYyk7CisJfSBlbHNlIHsKKwkJRVBEQkco ZXAsICJubyBnYWRnZXQgZm9yIHJlcXVlc3QgIVxuIik7CisJfQorCWlmIChyYyA+PSAwKQorCQly ZXR1cm47CisKKyBzdGFsbDoKKwlFUERCRyhlcCwgInN0YWxsaW5nXG4iKTsKKwl3cml0ZWwoVkhV Ql9FUDBfQ1RSTF9TVEFMTCwgZXAtPmVwMC5jdGxzdGF0KTsKKwllcC0+ZXAwLnN0YXRlID0gZXAw X3N0YXRlX3N0YXR1czsKKwllcC0+ZXAwLmRpcl9pbiA9IGZhbHNlOworCXJldHVybjsKKworIGNv bXBsZXRlOgorCUVQVkRCRyhlcCwgInNlbmRpbmcgW2luXSBzdGF0dXMgd2l0aCBubyBkYXRhXG4i KTsKKwl3cml0ZWwoVkhVQl9FUDBfVFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rsc3RhdCk7CisJZXAt PmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJZXAtPmVwMC5kaXJfaW4gPSBmYWxzZTsK K30KKworCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcDBfZG9fc2VuZChzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLAorCQkJCSBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEpCit7CisJdW5zaWduZWQgaW50 IGNodW5rOworCXUzMiByZWc7CisKKwkvKiBJZiB0aGlzIGlzIGEgMC1sZW5ndGggcmVxdWVzdCwg aXQncyB0aGUgZ2FkZ2V0IHRyeWluZyB0bworCSAqIHNlbmQgYSBzdGF0dXMgb24gb3VyIGJlaGFs Zi4gV2UgdGFrZSBpdCBmcm9tIGhlcmUuCisJICovCisJaWYgKHJlcS0+cmVxLmxlbmd0aCA9PSAw KQorCQlyZXEtPmxhc3RfZGVzYyA9IDE7CisKKwkvKiBBcmUgd2UgZG9uZSA/IENvbXBsZXRlIHJl cXVlc3QsIG90aGVyd2lzZSB3YWl0IGZvciBuZXh0IGludGVycnVwdCAqLworCWlmIChyZXEtPmxh c3RfZGVzYyA+PSAwKSB7CisJCUVQVkRCRyhlcCwgImNvbXBsZXRlIHNlbmQgJWQvJWRcbiIsCisJ CSAgICAgICByZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CisJCWVwLT5lcDAuc3Rh dGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCQl3cml0ZWwoVkhVQl9FUDBfUlhfQlVGRl9SRFksIGVw LT5lcDAuY3Rsc3RhdCk7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgMCk7CisJCXJldHVybjsK Kwl9CisKKwkvKgorCSAqIE5leHQgY2h1bmsgY3JvcHBlZCB0byBtYXggcGFja2V0IHNpemUuIEFs c28gY2hlY2sgaWYgdGhpcworCSAqIGlzIHRoZSBsYXN0IHBhY2tldAorCSAqLworCWNodW5rID0g cmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsOworCWlmIChjaHVuayA+IGVwLT5lcC5t YXhwYWNrZXQpCisJCWNodW5rID0gZXAtPmVwLm1heHBhY2tldDsKKwllbHNlIGlmICgoY2h1bmsg PCBlcC0+ZXAubWF4cGFja2V0KSB8fCAhcmVxLT5yZXEuemVybykKKwkJcmVxLT5sYXN0X2Rlc2Mg PSAxOworCisJRVBWREJHKGVwLCAic2VuZCBjaHVuaz0lZCBsYXN0PSVkLCByZXEtPmFjdD0lZCBt cD0lZFxuIiwKKwkgICAgICAgY2h1bmssIHJlcS0+bGFzdF9kZXNjLCByZXEtPnJlcS5hY3R1YWws IGVwLT5lcC5tYXhwYWNrZXQpOworCisJLyoKKwkgKiBDb3B5IGRhdGEgaWYgYW55IChpbnRlcm5h bCByZXF1ZXN0cyBhbHJlYWR5IGhhdmUgZGF0YQorCSAqIGluIHRoZSBFUCBidWZmZXIpCisJICov CisJaWYgKGNodW5rICYmIHJlcS0+cmVxLmJ1ZikKKwkJbWVtY3B5KGVwLT5idWYsIHJlcS0+cmVx LmJ1ZiArIHJlcS0+cmVxLmFjdHVhbCwgY2h1bmspOworCisJLyogUmVtZW1iZXIgY2h1bmsgc2l6 ZSBhbmQgdHJpZ2dlciBzZW5kICovCisJcmVnID0gVkhVQl9FUDBfU0VUX1RYX0xFTihjaHVuayk7 CisJd3JpdGVsKHJlZywgZXAtPmVwMC5jdGxzdGF0KTsKKwl3cml0ZWwocmVnIHwgVkhVQl9FUDBf VFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rsc3RhdCk7CisJcmVxLT5yZXEuYWN0dWFsICs9IGNodW5r OworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcDBfcnhfcHJpbWUoc3RydWN0IGFzdF92aHVi X2VwICplcCkKK3sKKwlFUFZEQkcoZXAsICJyeCBwcmltZVxuIik7CisKKwkvKiBQcmltZSBlbmRw b2ludCBmb3IgcmVjZWl2aW5nIGRhdGEgKi8KKwl3cml0ZWwoVkhVQl9FUDBfUlhfQlVGRl9SRFks IGVwLT5lcDAuY3Rsc3RhdCArIEFTVF9WSFVCX0VQMF9DVFJMKTsKK30KKworc3RhdGljIHZvaWQg YXN0X3ZodWJfZXAwX2RvX3JlY2VpdmUoc3RydWN0IGFzdF92aHViX2VwICplcCwgc3RydWN0IGFz dF92aHViX3JlcSAqcmVxLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVk IGludCByZW1haW47CisJaW50IHJjID0gMDsKKworCS8qIFdlIGFyZSByZWNlaXZpbmcuLi4gZ3Jh YiByZXF1ZXN0ICovCisJcmVtYWluID0gcmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFs OworCisJRVBWREJHKGVwLCAicmVjZWl2ZSBnb3Q9JWQgcmVtYWluPSVkXG4iLCBsZW4sIHJlbWFp bik7CisKKwkvKiBBcmUgd2UgZ2V0dGluZyBtb3JlIHRoYW4gYXNrZWQgPyAqLworCWlmIChsZW4g PiByZW1haW4pIHsKKwkJRVBEQkcoZXAsICJyZWNlaXZpbmcgdG9vIG11Y2ggKG92ZjogJWQpICFc biIsCisJCSAgICAgIGxlbiAtIHJlbWFpbik7CisJCWxlbiA9IHJlbWFpbjsKKwkJcmMgPSAtRU9W RVJGTE9XOworCX0KKwlpZiAobGVuICYmIHJlcS0+cmVxLmJ1ZikKKwkJbWVtY3B5KHJlcS0+cmVx LmJ1ZiArIHJlcS0+cmVxLmFjdHVhbCwgZXAtPmJ1ZiwgbGVuKTsKKwlyZXEtPnJlcS5hY3R1YWwg Kz0gbGVuOworCisJLyogRG9uZSA/ICovCisJaWYgKGxlbiA8IGVwLT5lcC5tYXhwYWNrZXQgfHwg bGVuID09IHJlbWFpbikgeworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJ d3JpdGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCQlhc3Rfdmh1 Yl9kb25lKGVwLCByZXEsIHJjKTsKKwl9IGVsc2UKKwkJYXN0X3ZodWJfZXAwX3J4X3ByaW1lKGVw KTsKK30KKwordm9pZCBhc3Rfdmh1Yl9lcDBfaGFuZGxlX2FjayhzdHJ1Y3QgYXN0X3ZodWJfZXAg KmVwLCBib29sIGluX2FjaykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJc3RydWN0 IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnZodWIt PnBkZXYtPmRldjsKKwlib29sIHN0YWxsID0gZmFsc2U7CisJdTMyIHN0YXQ7CisKKwkvKiBSZWFk IEVQMCBzdGF0dXMgKi8KKwlzdGF0ID0gcmVhZGwoZXAtPmVwMC5jdGxzdGF0KTsKKworCS8qIEdy YWIgY3VycmVudCByZXF1ZXN0IGlmIGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3Jf bnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlFUFZEQkco ZXAsICJBQ0sgc3RhdHVzPSUwOHgsc3RhdGU9JWQgaXNfaW49JWQgaW5fYWNrPSVkIHJlcT0lcFxu IiwKKwkJc3RhdCwgZXAtPmVwMC5zdGF0ZSwgZXAtPmVwMC5kaXJfaW4sIGluX2FjaywgcmVxKTsK KworCXN3aXRjaChlcC0+ZXAwLnN0YXRlKSB7CisJY2FzZSBlcDBfc3RhdGVfdG9rZW46CisJCS8q IFRoZXJlIHNob3VsZCBiZSBubyByZXF1ZXN0IHF1ZXVlZCBpbiB0aGF0IHN0YXRlLi4uICovCisJ CWlmIChyZXEpIHsKKwkJCWRldl93YXJuKGRldiwgInJlcXVlc3QgcHJlc2VudCB3aGlsZSBpbiBU T0tFTiBzdGF0ZVxuIik7CisJCQlhc3Rfdmh1Yl9udWtlKGVwLCAtRUlOVkFMKTsKKwkJfQorCQlk ZXZfd2FybihkZXYsICJhY2sgd2hpbGUgaW4gVE9LRU4gc3RhdGVcbiIpOworCQlzdGFsbCA9IHRy dWU7CisJCWJyZWFrOworCWNhc2UgZXAwX3N0YXRlX2RhdGE6CisJCS8qIENoZWNrIHRoZSBzdGF0 ZSBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gb3VyIGRpcmVjdGlvbiAqLworCQlpZiAoKGVwLT5lcDAu ZGlyX2luICYmIChzdGF0ICYgVkhVQl9FUDBfVFhfQlVGRl9SRFkpKSB8fAorCQkgICAgKCFlcC0+ ZXAwLmRpcl9pbiAmJiAoc3RhdCAmIFZIVUJfRVAwX1JYX0JVRkZfUkRZKSkgfHwKKwkJICAgIChl cC0+ZXAwLmRpcl9pbiAhPSBpbl9hY2spKSB7CisJCQlkZXZfd2FybihkZXYsICJpcnEgc3RhdGUg bWlzbWF0Y2giKTsKKwkJCXN0YWxsID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAq IFdlIGFyZSBpbiBkYXRhIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlcXVlc3QsIHNvbWV0aGluZyBp cworCQkgKiB3cm9uZywgc3RhbGwKKwkJICovCisJCWlmICghcmVxKSB7CisJCQlkZXZfd2Fybihk ZXYsICJkYXRhIHBoYXNlLCBubyByZXF1ZXN0XG4iKTsKKwkJCXN0YWxsID0gdHJ1ZTsKKwkJCWJy ZWFrOworCQl9CisKKwkJLyogV2UgaGF2ZSBhIHJlcXVlc3QsIGhhbmRsZSBkYXRhIHRyYW5zZmVy cyAqLworCQlpZiAoZXAtPmVwMC5kaXJfaW4pCisJCQlhc3Rfdmh1Yl9lcDBfZG9fc2VuZChlcCwg cmVxKTsKKwkJZWxzZQorCQkJYXN0X3ZodWJfZXAwX2RvX3JlY2VpdmUoZXAsIHJlcSwgVkhVQl9F UDBfUlhfTEVOKHN0YXQpKTsKKwkJcmV0dXJuOworCWNhc2UgZXAwX3N0YXRlX3N0YXR1czoKKwkJ LyogTnVrZSBzdGFsZSByZXF1ZXN0cyAqLworCQlpZiAocmVxKSB7CisJCQlkZXZfd2FybihkZXYs ICJyZXF1ZXN0IHByZXNlbnQgd2hpbGUgaW4gU1RBVFVTIHN0YXRlXG4iKTsKKwkJCWFzdF92aHVi X251a2UoZXAsIC1FSU5WQUwpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIHN0YXR1cyBwaGFz ZSBjb21wbGV0ZXMgd2l0aCB0aGUgd3JvbmcgYWNrLCBzdGFsbAorCQkgKiB0aGUgZW5kcG9pbnQg anVzdCBpbiBjYXNlLCB0byBhYm9ydCB3aGF0ZXZlciB0aGUgaG9zdAorCQkgKiB3YXMgZG9pbmcu CisJCSAqLworCQlpZiAoZXAtPmVwMC5kaXJfaW4gPT0gaW5fYWNrKSB7CisJCQlkZXZfd2Fybihk ZXYsICJzdGF0dXMgZGlyZWN0aW9uIG1pc21hdGNoXG4iKTsKKwkJCXN0YWxsID0gdHJ1ZTsKKwkJ fQorCX0KKworCS8qIFJlc2V0IHRvIHRva2VuIHN0YXRlICovCisJZXAtPmVwMC5zdGF0ZSA9IGVw MF9zdGF0ZV90b2tlbjsKKwlpZiAoc3RhbGwpCisJCXdyaXRlbChWSFVCX0VQMF9DVFJMX1NUQUxM LCBlcC0+ZXAwLmN0bHN0YXQpOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2VwMF9xdWV1ZShz dHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxLAorCQkJICAgICAg Z2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2FzdF9y ZXEodV9yZXEpOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJ c3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJc3RydWN0IGRldmljZSAqZGV2ID0g JnZodWItPnBkZXYtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUGFyYW5vaWQg Y2hla3MgKi8KKwlpZiAoIXVfcmVxIHx8ICghdV9yZXEtPmNvbXBsZXRlICYmICFyZXEtPmludGVy bmFsKSkgeworCQlkZXZfd2FybihkZXYsICJCb2d1cyBFUDAgcmVxdWVzdCAhIHVfcmVxPSVwXG4i LCB1X3JlcSk7CisJCWlmICh1X3JlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAiY29tcGxldGU9JXAg aW50ZXJuYWw9JWRcbiIsCisJCQkJIHVfcmVxLT5jb21wbGV0ZSwgcmVxLT5pbnRlcm5hbCk7CisJ CX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogTm90IGVuZHBvaW50IDAgPyAqLworCWlm IChXQVJOX09OKGVwLT5kX2lkeCAhPSAwKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwkvKiBEaXNh YmxlZCBkZXZpY2UgKi8KKwlpZiAoZXAtPmRldiAmJiAoIWVwLT5kZXYtPmVuYWJsZWQgfHwgZXAt PmRldi0+c3VzcGVuZGVkKSkKKwkJcmV0dXJuIC1FU0hVVERPV047CisKKwkvKiBEYXRhLCBubyBi dWZmZXIgYW5kIG5vdCBpbnRlcm5hbCA/ICovCisJaWYgKHVfcmVxLT5sZW5ndGggJiYgIXVfcmVx LT5idWYgJiYgIXJlcS0+aW50ZXJuYWwpIHsKKwkJZGV2X3dhcm4oZGV2LCAiUmVxdWVzdCB3aXRo IG5vIGJ1ZmZlciAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJRVBWREJHKGVwLCAi ZW5xdWV1ZSByZXEgQCVwXG4iLCByZXEpOworCUVQVkRCRyhlcCwgIiAgbD0lZCB6ZXJvPSVkIG5v c2hvcnQ9JWQgaXNfaW49JWRcbiIsCisJICAgICAgIHVfcmVxLT5sZW5ndGgsIHVfcmVxLT56ZXJv LAorCSAgICAgICB1X3JlcS0+c2hvcnRfbm90X29rLCBlcC0+ZXAwLmRpcl9pbik7CisKKwkvKiBJ bml0aWFsaXplIHJlcXVlc3QgcHJvZ3Jlc3MgZmllbGRzICovCisJdV9yZXEtPnN0YXR1cyA9IC1F SU5QUk9HUkVTUzsKKwl1X3JlcS0+YWN0dWFsID0gMDsKKwlyZXEtPmxhc3RfZGVzYyA9IC0xOwor CXJlcS0+YWN0aXZlID0gZmFsc2U7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywg ZmxhZ3MpOworCisJLyogRVAwIGNhbiBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgcmVxdWVzdCBhdCBh IHRpbWUgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkgfHwgZXAtPmVwMC5zdGF0ZSA9 PSBlcDBfc3RhdGVfdG9rZW4pIHsKKwkJZGV2X3dhcm4oZGV2LCAiRVAwOiBSZXF1ZXN0IGluIHdy b25nIHN0YXRlXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxh Z3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8qIEFkZCByZXF1ZXN0IHRvIGxpc3QgYW5k IGtpY2sgcHJvY2Vzc2luZyBpZiBlbXB0eSAqLworCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWUs ICZlcC0+cXVldWUpOworCisJaWYgKGVwLT5lcDAuZGlyX2luKSB7CisJCS8qIElOIHJlcXVlc3Qs IHNlbmQgZGF0YSAqLworCQlhc3Rfdmh1Yl9lcDBfZG9fc2VuZChlcCwgcmVxKTsKKwl9IGVsc2Ug aWYgKHVfcmVxLT5sZW5ndGggPT0gMCkgeworCQkvKiAwLWxlbiByZXF1ZXN0LCBzZW5kIGNvbXBs ZXRpb24gYXMgcnggKi8KKwkJRVBWREJHKGVwLCAiMC1sZW5ndGggcnggY29tcGxldGlvblxuIik7 CisJCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCQl3cml0ZWwoVkhVQl9FUDBf VFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rsc3RhdCk7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwg MCk7CisJfSBlbHNlIHsKKwkJLyogT1VUIHJlcXVlc3QsIHN0YXJ0IHJlY2VpdmVyICovCisJCWFz dF92aHViX2VwMF9yeF9wcmltZShlcCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3Zo dWJfZXAwX2RlcXVldWUoc3RydWN0IHVzYl9lcCogdV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1 X3JlcSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0 cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJl cTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IC1FSU5WQUw7CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogT25seSBvbmUgcmVxdWVzdCBj YW4gYmUgaW4gdGhlIHF1ZXVlICovCisJcmVxID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZl cC0+cXVldWUsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsIHF1ZXVlKTsKKworCS8qIElzIGl0IG91cnMg PyAqLworCWlmIChyZXEgJiYgdV9yZXEgPT0gJnJlcS0+cmVxKSB7CisJCUVQVkRCRyhlcCwgImRl cXVldWUgcmVxIEAlcFxuIiwgcmVxKTsKKworCQkvKgorCQkgKiBXZSBkb24ndCBoYXZlIHRvIGRl YWwgd2l0aCAiYWN0aXZlIiBhcyBhbGwKKwkJICogRE1BcyBnbyB0byB0aGUgRVAgYnVmZmVycywg bm90IHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAtRUNPTk5S RVNFVCk7CisKKwkJLyogV2UgZG8gc3RhbGwgdGhlIEVQIHRvIGNsZWFuIHRoaW5ncyB1cCBpbiBI VyAqLworCQl3cml0ZWwoVkhVQl9FUDBfQ1RSTF9TVEFMTCwgZXAtPmVwMC5jdGxzdGF0KTsKKwkJ ZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJCWVwLT5lcDAuZGlyX2luID0gZmFs c2U7CisJCXJjID0gMDsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywg ZmxhZ3MpOworCXJldHVybiByYzsKK30KKworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9v cHMgYXN0X3ZodWJfZXAwX29wcyA9IHsKKwkucXVldWUJCT0gYXN0X3ZodWJfZXAwX3F1ZXVlLAor CS5kZXF1ZXVlCT0gYXN0X3ZodWJfZXAwX2RlcXVldWUsCisJLmFsbG9jX3JlcXVlc3QJPSBhc3Rf dmh1Yl9hbGxvY19yZXF1ZXN0LAorCS5mcmVlX3JlcXVlc3QJPSBhc3Rfdmh1Yl9mcmVlX3JlcXVl c3QsCit9OworCit2b2lkIGFzdF92aHViX2luaXRfZXAwKHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yiwg c3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJICAgICAgIHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmRl dikKK3sKKwltZW1zZXQoZXAsIDAsIHNpemVvZigqZXApKTsKKworCUlOSVRfTElTVF9IRUFEKCZl cC0+ZXAuZXBfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5xdWV1ZSk7CisJZXAtPmVwLm9w cyA9ICZhc3Rfdmh1Yl9lcDBfb3BzOworCWVwLT5lcC5uYW1lID0gImVwMCI7CisJZXAtPmVwLmNh cHMudHlwZV9jb250cm9sID0gdHJ1ZTsKKwl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmZXAt PmVwLCBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCk7CisJZXAtPmRfaWR4ID0gMDsKKwllcC0+ZGV2 ID0gZGV2OworCWVwLT52aHViID0gdmh1YjsKKwllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3Rv a2VuOworCUlOSVRfTElTVF9IRUFEKCZlcC0+ZXAwLnJlcS5xdWV1ZSk7CisJZXAtPmVwMC5yZXEu aW50ZXJuYWwgPSB0cnVlOworCisJLyogU21hbGwgZGlmZmVyZW5jZSBiZXR3ZWVuIHZIdWIgYW5k IGRldmljZXMgKi8KKwlpZiAoZGV2KSB7CisJCWVwLT5lcDAuY3Rsc3RhdCA9IGRldi0+cmVncyAr IEFTVF9WSFVCX0RFVl9FUDBfQ1RSTDsKKwkJZXAtPmVwMC5zZXR1cCA9IHZodWItPnJlZ3MgKwor CQkJQVNUX1ZIVUJfU0VUVVAwICsgOCAqIChkZXYtPmluZGV4ICsgMSk7CisJCWVwLT5idWYgPSB2 aHViLT5lcDBfYnVmcyArCisJCQlBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqIChkZXYtPmluZGV4 ICsgMSk7CisJCWVwLT5idWZfZG1hID0gdmh1Yi0+ZXAwX2J1ZnNfZG1hICsKKwkJCUFTVF9WSFVC X0VQMF9NQVhfUEFDS0VUICogKGRldi0+aW5kZXggKyAxKTsKKwl9IGVsc2UgeworCQllcC0+ZXAw LmN0bHN0YXQgPSB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAwX0NUUkw7CisJCWVwLT5lcDAuc2V0 dXAgPSB2aHViLT5yZWdzICsgQVNUX1ZIVUJfU0VUVVAwOworCQllcC0+YnVmID0gdmh1Yi0+ZXAw X2J1ZnM7CisJCWVwLT5idWZfZG1hID0gdmh1Yi0+ZXAwX2J1ZnNfZG1hOworCX0KK30KZGlmZiAt LWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXBuLmMgYi9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uMGVmOTJhOTliMzhmCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4uYwpAQCAtMCwwICsxLDg0MyBAQAorLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICogYXNwZWVkLXZodWIgLS0g RHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICogZXBuLmMgLSBH ZW5lcmljIGVuZHBvaW50cyBtYW5hZ2VtZW50CisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJNIENv cnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv cgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVk ZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNs dWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8 bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgv aW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4 L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdXNi L2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bp by5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBw aW5nLmg+CisKKyNpbmNsdWRlICJ2aHViLmgiCisKKyNkZWZpbmUgRVhUUkFfQ0hFQ0tTCisKKyNp ZmRlZiBFWFRSQV9DSEVDS1MKKyNkZWZpbmUgQ0hFQ0soZXAsIGV4cHIsIGZtdC4uLikgCQkJCVwK KwlkbyB7CQkJCQkJCVwKKwkJaWYgKCEoZXhwcikpIEVQREJHKGVwLCAiQ0hFQ0s6IiBmbXQpOwkJ XAorCX0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIENIRUNLKGVwLCBleHByLCBmbXQuLi4pCWRv IHsgfSB3aGlsZSgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9raWNrKHN0 cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSkKK3sKKwl1bnNp Z25lZCBpbnQgYWN0ID0gcmVxLT5yZXEuYWN0dWFsOworCXVuc2lnbmVkIGludCBsZW4gPSByZXEt PnJlcS5sZW5ndGg7CisJdW5zaWduZWQgaW50IGNodW5rOworCisJLyogVGhlcmUgc2hvdWxkIGJl IG5vIERNQSBvbmdvaW5nICovCisJV0FSTl9PTihyZXEtPmFjdGl2ZSk7CisKKwkvKiBDYWxjdWxh dGUgbmV4dCBjaHVuayBzaXplICovCisJY2h1bmsgPSBsZW4gLSBhY3Q7CisJaWYgKGNodW5rID4g ZXAtPmVwLm1heHBhY2tldCkKKwkJY2h1bmsgPSBlcC0+ZXAubWF4cGFja2V0OworCWVsc2UgaWYg KChjaHVuayA8IGVwLT5lcC5tYXhwYWNrZXQpIHx8ICFyZXEtPnJlcS56ZXJvKQorCQlyZXEtPmxh c3RfZGVzYyA9IDE7CisKKwlFUFZEQkcoZXAsICJraWNrIHJlcSAlcCBhY3Q9JWQvJWQgY2h1bms9 JWQgbGFzdD0lZFxuIiwKKwkgICAgICAgcmVxLCBhY3QsIGxlbiwgY2h1bmssIHJlcS0+bGFzdF9k ZXNjKTsKKworCS8qIElmIERNQSB1bmF2YWlsYWJsZSwgdXNpbmcgc3RhZ2luZyBFUCBidWZmZXIg Ki8KKwlpZiAoIXJlcS0+cmVxLmRtYSkgeworCisJCS8qIEZvciBJTiB0cmFuc2ZlcnMsIGNvcHkg ZGF0YSBvdmVyIGZpcnN0ICovCisJCWlmIChlcC0+ZXBuLmlzX2luKQorCQkJbWVtY3B5KGVwLT5i dWYsIHJlcS0+cmVxLmJ1ZiArIGFjdCwgY2h1bmspOworCQl3cml0ZWwoZXAtPmJ1Zl9kbWEsIGVw LT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfQkFTRSk7CisJfSBlbHNlCisJCXdyaXRlbChy ZXEtPnJlcS5kbWEgKyBhY3QsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfQkFTRSk7 CisKKwkvKiBTdGFydCBETUEgKi8KKwlyZXEtPmFjdGl2ZSA9IHRydWU7CisJd3JpdGVsKFZIVUJf RVBfRE1BX1NFVF9UWF9TSVpFKGNodW5rKSwKKwkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZI VUJfRVBfREVTQ19TVEFUVVMpOworCXdyaXRlbChWSFVCX0VQX0RNQV9TRVRfVFhfU0laRShjaHVu aykgfCBWSFVCX0VQX0RNQV9TSU5HTEVfS0lDSywKKwkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNU X1ZIVUJfRVBfREVTQ19TVEFUVVMpOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5faGFu ZGxlX2FjayhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEg KnJlcTsKKwl1bnNpZ25lZCBpbnQgbGVuOworCXUzMiBzdGF0OworCisJLyogUmVhZCBFUCBzdGF0 dXMgKi8KKwlzdGF0ID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFU VVMpOworCisJLyogR3JhYiBjdXJyZW50IHJlcXVlc3QgaWYgYW55ICovCisJcmVxID0gbGlzdF9m aXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+cXVldWUsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsIHF1ZXVl KTsKKworCUVQVkRCRyhlcCwgIkFDSyBzdGF0dXM9JTA4eCBpc19pbj0lZCwgcmVxPSVwIChhY3Rp dmU9JWQpXG4iLAorCSAgICAgICBzdGF0LCBlcC0+ZXBuLmlzX2luLCByZXEsIHJlcSA/IHJlcS0+ YWN0aXZlIDogMCk7CisKKwkvKiBJbiBhYnNlbmNlIG9mIGEgcmVxdWVzdCwgYmFpbCBvdXQsIG11 c3QgaGF2ZSBiZWVuIGRlcXVldWVkICovCisJaWYgKCFyZXEpCisJCXJldHVybjsKKworCS8qCisJ ICogUmVxdWVzdCBub3QgYWN0aXZlLCBtb3ZlIG9uIHRvIHByb2Nlc3NpbmcgcXVldWUsIGFjdGl2 ZSByZXF1ZXN0CisJICogd2FzIHByb2JhYmx5IGRlcXVldWVkCisJICovCisJaWYgKCFyZXEtPmFj dGl2ZSkKKwkJZ290byBuZXh0X2NodW5rOworCisJLyogQ2hlY2sgaWYgSFcgaGFzIG1vdmVkIG9u ICovCisJaWYgKFZIVUJfRVBfRE1BX1JQVFIoc3RhdCkgIT0gMCkgeworCQlFUERCRyhlcCwgIkRN QSByZWFkIHBvaW50ZXIgbm90IDAgIVxuIik7CisJCXJldHVybjsKKwl9CisKKwkvKiBObyBjdXJy ZW50IERNQSBvbmdvaW5nICovCisJcmVxLT5hY3RpdmUgPSBmYWxzZTsKKworCS8qIEdyYWIgbGVu Z2h0IG91dCBvZiBIVyAqLworCWxlbiA9IFZIVUJfRVBfRE1BX1RYX1NJWkUoc3RhdCk7CisKKwkv KiBJZiBub3QgdXNpbmcgRE1BLCBjb3B5IGRhdGEgb3V0IGlmIG5lZWRlZCAqLworCWlmICghcmVx LT5yZXEuZG1hICYmICFlcC0+ZXBuLmlzX2luICYmIGxlbikKKwkJbWVtY3B5KHJlcS0+cmVxLmJ1 ZiArIHJlcS0+cmVxLmFjdHVhbCwgZXAtPmJ1ZiwgbGVuKTsKKworCS8qIEFkanVzdCBzaXplICov CisJcmVxLT5yZXEuYWN0dWFsICs9IGxlbjsKKworCS8qIENoZWNrIGZvciBzaG9ydCBwYWNrZXQg Ki8KKwlpZiAobGVuIDwgZXAtPmVwLm1heHBhY2tldCkKKwkJcmVxLT5sYXN0X2Rlc2MgPSAxOwor CisJLyogVGhhdCdzIGl0ID8gY29tcGxldGUgdGhlIHJlcXVlc3QgYW5kIHBpY2sgYSBuZXcgb25l ICovCisJaWYgKHJlcS0+bGFzdF9kZXNjID49IDApIHsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVx LCAwKTsKKwkJcmVxID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+cXVldWUsIHN0cnVj dCBhc3Rfdmh1Yl9yZXEsCisJCQkJCSAgICAgICBxdWV1ZSk7CisKKwkJLyoKKwkJICogRHVlIHRv IGxvY2sgZHJvcHBpbmcgaW5zaWRlICJkb25lIiB0aGUgbmV4dCByZXF1ZXN0IGNvdWxkCisJCSAq IGFscmVhZHkgYmUgYWN0aXZlLCBzbyBjaGVjayBmb3IgdGhhdCBhbmQgYmFpbCBpZiBuZWVkZWQu CisJCSAqLworCQlpZiAoIXJlcSB8fCByZXEtPmFjdGl2ZSkKKwkJCXJldHVybjsKKwl9CisKKyBu ZXh0X2NodW5rOgorCWFzdF92aHViX2Vwbl9raWNrKGVwLCByZXEpOworfQorCitzdGF0aWMgaW5s aW5lIHVuc2lnbmVkIGludCBhc3Rfdmh1Yl9jb3VudF9mcmVlX2Rlc2NzKHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXApCit7CisJLyoKKwkgKiBkX25leHQgPT0gZF9sYXN0IG1lYW5zIGRlc2NyaXB0b3Ig bGlzdCBlbXB0eSB0byBIVywKKwkgKiB0aHVzIHdlIGNhbiBvbmx5IGhhdmUgQVNUX1ZIVUJfREVT Q1NfQ09VTlQtMSBkZXNjcmlwdG9ycworCSAqIGluIHRoZSBsaXN0CisJICovCisJcmV0dXJuIChl cC0+ZXBuLmRfbGFzdCArIEFTVF9WSFVCX0RFU0NTX0NPVU5UIC0gZXAtPmVwbi5kX25leHQgLSAx KSAmCisJCShBU1RfVkhVQl9ERVNDU19DT1VOVCAtIDEpOworfQorCitzdGF0aWMgdm9pZCBhc3Rf dmh1Yl9lcG5fa2lja19kZXNjKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJICAgc3RydWN0 IGFzdF92aHViX3JlcSAqcmVxKQoreworCXVuc2lnbmVkIGludCBhY3QgPSByZXEtPmFjdF9jb3Vu dDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gcmVxLT5yZXEubGVuZ3RoOworCXVuc2lnbmVkIGludCBj aHVuazsKKworCS8qIE1hcmsgcmVxdWVzdCBhY3RpdmUgaWYgbm90IGFscmVhZHkgKi8KKwlyZXEt PmFjdGl2ZSA9IHRydWU7CisKKwkvKiBJZiB0aGUgcmVxdWVzdCB3YXMgYWxyZWFkeSBjb21wbGV0 ZWx5IHdyaXR0ZW4sIGRvIG5vdGhpbmcgKi8KKwlpZiAocmVxLT5sYXN0X2Rlc2MgPj0gMCkKKwkJ cmV0dXJuOworCisJRVBWREJHKGVwLCAia2ljayBhY3Q9JWQvJWQgY2h1bmtfbWF4PSVkIGZyZWVf ZGVzY3M9JWRcbiIsCisJICAgICAgIGFjdCwgbGVuLCBlcC0+ZXBuLmNodW5rX21heCwgYXN0X3Zo dWJfY291bnRfZnJlZV9kZXNjcyhlcCkpOworCisJLyogV2hpbGUgd2UgY2FuIGNyZWF0ZSBkZXNj cmlwdG9ycyAqLworCXdoaWxlIChhc3Rfdmh1Yl9jb3VudF9mcmVlX2Rlc2NzKGVwKSAmJiByZXEt Pmxhc3RfZGVzYyA8IDApIHsKKwkJc3RydWN0IGFzdF92aHViX2Rlc2MgKmRlc2M7CisJCXVuc2ln bmVkIGludCBkX251bTsKKworCQkvKiBHcmFiIG5leHQgZnJlZSBkZXNjcmlwdG9yICovCisJCWRf bnVtID0gZXAtPmVwbi5kX25leHQ7CisJCWRlc2MgPSAmZXAtPmVwbi5kZXNjc1tkX251bV07CisJ CWVwLT5lcG4uZF9uZXh0ID0gKGRfbnVtICsgMSkgJiAoQVNUX1ZIVUJfREVTQ1NfQ09VTlQgLSAx KTsKKworCQkvKiBDYWxjdWxhdGUgbmV4dCBjaHVuayBzaXplICovCisJCWNodW5rID0gbGVuIC0g YWN0OworCQlpZiAoY2h1bmsgPD0gZXAtPmVwbi5jaHVua19tYXgpIHsKKwkJCS8qCisJCQkgKiBJ cyB0aGlzIHRoZSBsYXN0IHBhY2tldCA/IEJlY2F1c2Ugb2YgaGF2aW5nIHVwIHRvIDgKKwkJCSAq IHBhY2tldHMgaW4gYSBkZXNjcmlwdG9yIHdlIGNhbid0IGp1c3QgY29tcGFyZSAiY2h1bmsiCisJ CQkgKiB3aXRoIGVwLm1heHBhY2tldC4gV2UgaGF2ZSB0byBzZWUgaWYgaXQncyBhIG11bHRpcGxl CisJCQkgKiBvZiBpdCB0byBrbm93IGlmIHdlIGhhdmUgdG8gc2VuZCBhIHplcm8gcGFja2V0Lgor CQkJICogU2FkbHkgdGhhdCBpbnZvbHZlcyBhIG1vZHVsbyB3aGljaCBpcyBhIGJpdCBleHBlbnNp dmUKKwkJCSAqIGJ1dCBwcm9iYWJseSBzdGlsbCBiZXR0ZXIgdGhhbiBub3QgZG9pbmcgaXQuCisJ CQkgKi8KKwkJCWlmICghY2h1bmsgfHwgIXJlcS0+cmVxLnplcm8gfHwgKGNodW5rICUgZXAtPmVw Lm1heHBhY2tldCkgIT0gMCkKKwkJCQlyZXEtPmxhc3RfZGVzYyA9IGRfbnVtOworCQl9IGVsc2Ug eworCQkJY2h1bmsgPSBlcC0+ZXBuLmNodW5rX21heDsKKwkJfQorCisJCUVQVkRCRyhlcCwgIiBj aHVuazogYWN0PSVkLyVkIGNodW5rPSVkIGxhc3Q9JWQgZGVzYz0lZCBmcmVlPSVkXG4iLAorCQkg ICAgICAgYWN0LCBsZW4sIGNodW5rLCByZXEtPmxhc3RfZGVzYywgZF9udW0sCisJCSAgICAgICBh c3Rfdmh1Yl9jb3VudF9mcmVlX2Rlc2NzKGVwKSk7CisKKwkJLyogUG9wdWxhdGUgZGVzY3JpcHRv ciAqLworCQlkZXNjLT53MCA9IGNwdV90b19sZTMyKHJlcS0+cmVxLmRtYSArIGFjdCk7CisKKwkJ LyogSW50ZXJydXB0IGlmIGVuZCBvZiByZXF1ZXN0IG9yIG5vIG1vcmUgZGVzY3JpcHRvcnMgKi8K KworCQkvKgorCQkgKiBUT0RPOiBCZSBzbWFydGVyIGFib3V0IGl0LCBpZiB3ZSBkb24ndCBoYXZl IGVub3VnaAorCQkgKiBkZXNjcmlwdG9ycyByZXF1ZXN0IGFuIGludGVycnVwdCBiZWZvcmUgcXVl dWUgZW1wdHkKKwkJICogb3Igc28gaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBwb3B1bGF0ZSBtb3Jl IGJlZm9yZQorCQkgKiB0aGUgSFcgcnVucyBvdXQuIFRoaXMgaXNuJ3QgYSBwcm9ibGVtIGF0IHRo ZSBtb21lbnQKKwkJICogYXMgd2UgdXNlIDI1NiBkZXNjcmlwdG9ycyBhbmQgb25seSBwdXQgYXQg bW9zdCBvbmUKKwkJICogcmVxdWVzdCBpbiB0aGUgcmluZy4KKwkJICovCisJCWRlc2MtPncxID0g Y3B1X3RvX2xlMzIoVkhVQl9EU0MxX0lOX1NFVF9MRU4oY2h1bmspKTsKKwkJaWYgKHJlcS0+bGFz dF9kZXNjID49IDAgfHwgIWFzdF92aHViX2NvdW50X2ZyZWVfZGVzY3MoZXApKQorCQkJZGVzYy0+ dzEgfD0gY3B1X3RvX2xlMzIoVkhVQl9EU0MxX0lOX0lOVEVSUlVQVCk7CisKKwkJLyogQWNjb3Vu dCBwYWNrZXQgKi8KKwkJcmVxLT5hY3RfY291bnQgPSBhY3QgPSBhY3QgKyBjaHVuazsKKwl9CisK KwkvKiBUZWxsIEhXIGFib3V0IG5ldyBkZXNjcmlwdG9ycyAqLworCXdyaXRlbChWSFVCX0VQX0RN QV9TRVRfQ1BVX1dQVFIoZXAtPmVwbi5kX25leHQpLAorCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBB U1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisKKwlFUFZEQkcoZXAsICJIVyBraWNrZWQsIGRfbmV4 dD0lZCBkc3RhdD0lMDh4XG4iLAorCSAgICAgICBlcC0+ZXBuLmRfbmV4dCwgcmVhZGwoZXAtPmVw bi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpKTsKK30KKworc3RhdGljIHZvaWQgYXN0 X3ZodWJfZXBuX2hhbmRsZV9hY2tfZGVzYyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCXN0 cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwl1bnNpZ25lZCBpbnQgbGVuLCBkX2xhc3Q7CisJdTMy IHN0YXQsIHN0YXQxOworCisJLyogUmVhZCBFUCBzdGF0dXMsIHdvcmthcm91bmQgSFcgcmFjZSAq LworCWRvIHsKKwkJc3RhdCA9IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0Nf U1RBVFVTKTsKKwkJc3RhdDEgPSByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVND X1NUQVRVUyk7CisJfSB3aGlsZShzdGF0ICE9IHN0YXQxKTsKKworCS8qIEV4dHJhY3QgUlBUUiAq LworCWRfbGFzdCA9IFZIVUJfRVBfRE1BX1JQVFIoc3RhdCk7CisKKwkvKiBHcmFiIGN1cnJlbnQg cmVxdWVzdCBpZiBhbnkgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwLT5x dWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCisJRVBWREJHKGVwLCAiQUNLIHN0 YXR1cz0lMDh4IGlzX2luPSVkIGVwLT5kX2xhc3Q9JWQuLiVkXG4iLAorCSAgICAgICBzdGF0LCBl cC0+ZXBuLmlzX2luLCBlcC0+ZXBuLmRfbGFzdCwgZF9sYXN0KTsKKworCS8qIENoZWNrIGFsbCBj b21wbGV0ZWQgZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSAoZXAtPmVwbi5kX2xhc3QgIT0gZF9sYXN0 KSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9kZXNjICpkZXNjOworCQl1bnNpZ25lZCBpbnQgZF9udW07 CisJCWJvb2wgaXNfbGFzdF9kZXNjOworCisJCS8qIEdyYWIgbmV4dCBjb21wbGV0ZWQgZGVzY3Jp cHRvciAqLworCQlkX251bSA9IGVwLT5lcG4uZF9sYXN0OworCQlkZXNjID0gJmVwLT5lcG4uZGVz Y3NbZF9udW1dOworCQllcC0+ZXBuLmRfbGFzdCA9IChkX251bSArIDEpICYgKEFTVF9WSFVCX0RF U0NTX0NPVU5UIC0gMSk7CisKKwkJLyogR3JhYiBsZW4gb3V0IG9mIGRlc2NyaXB0b3IgKi8KKwkJ bGVuID0gVkhVQl9EU0MxX0lOX0xFTihsZTMyX3RvX2NwdShkZXNjLT53MSkpOworCisJCUVQVkRC RyhlcCwgIiBkZXNjICVkIGxlbj0lZCByZXE9JXAgKGFjdD0lZClcbiIsCisJCSAgICAgICBkX251 bSwgbGVuLCByZXEsIHJlcSA/IHJlcS0+YWN0aXZlIDogMCk7CisKKwkJLyogSWYgbm8gYWN0aXZl IHJlcXVlc3QgcGVuZGluZywgbW92ZSBvbiAqLworCQlpZiAoIXJlcSB8fCAhcmVxLT5hY3RpdmUp CisJCQljb250aW51ZTsKKworCQkvKiBBZGp1c3Qgc2l6ZSAqLworCQlyZXEtPnJlcS5hY3R1YWwg Kz0gbGVuOworCisJCS8qIElzIHRoYXQgdGhlIGxhc3QgY2h1bmsgPyAqLworCQlpc19sYXN0X2Rl c2MgPSByZXEtPmxhc3RfZGVzYyA9PSBkX251bTsKKwkJQ0hFQ0soZXAsIGlzX2xhc3RfZGVzYyA9 PSAobGVuIDwgZXAtPmVwLm1heHBhY2tldCB8fAorCQkJCQkgICAocmVxLT5yZXEuYWN0dWFsID49 IHJlcS0+cmVxLmxlbmd0aCAmJgorCQkJCQkgICAgIXJlcS0+cmVxLnplcm8pKSwKKwkJICAgICAg Ikxhc3QgcGFja2V0IGRpc2NyZXBhbmN5OiBsYXN0X2Rlc2M9JWQgbGVuPSVkIHIuYWN0PSVkICIK KwkJICAgICAgInIubGVuPSVkIHIuemVybz0lZCBtcD0lZFxuIiwKKwkJICAgICAgaXNfbGFzdF9k ZXNjLCBsZW4sIHJlcS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3RoLAorCQkgICAgICByZXEt PnJlcS56ZXJvLCBlcC0+ZXAubWF4cGFja2V0KTsKKworCQlpZiAoaXNfbGFzdF9kZXNjKSB7CisJ CQkvKgorCQkJICogQmVjYXVzZSB3ZSBjYW4gb25seSBoYXZlIG9uZSByZXF1ZXN0IGF0IGEgdGlt ZQorCQkJICogaW4gb3VyIGRlc2NyaXB0b3IgbGlzdCBpbiB0aGlzIGltcGxlbWVudGF0aW9uLAor CQkJICogZF9sYXN0IGFuZCBlcC0+ZF9sYXN0IHNob3VsZCBub3cgYmUgZXF1YWwKKwkJCSAqLwor CQkJQ0hFQ0soZXAsIGRfbGFzdCA9PSBlcC0+ZXBuLmRfbGFzdCwKKwkJCSAgICAgICJETUEgcmVh ZCBwdHIgbWlzbWF0Y2ggJWQgdnMgJWRcbiIsCisJCQkgICAgICBkX2xhc3QsIGVwLT5lcG4uZF9s YXN0KTsKKworCQkJLyogTm90ZTogZG9uZSB3aWxsIGRyb3AgYW5kIHJlLWFjcXVpcmUgdGhlIGxv Y2sgKi8KKwkJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgMCk7CisJCQlyZXEgPSBsaXN0X2ZpcnN0 X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwKKwkJCQkJCSAgICAgICBzdHJ1Y3QgYXN0X3ZodWJf cmVxLAorCQkJCQkJICAgICAgIHF1ZXVlKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogTW9y ZSB3b3JrID8gKi8KKwlpZiAocmVxKQorCQlhc3Rfdmh1Yl9lcG5fa2lja19kZXNjKGVwLCByZXEp OworfQorCit2b2lkIGFzdF92aHViX2Vwbl9hY2tfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAp Cit7CisJaWYgKGVwLT5lcG4uZGVzY19tb2RlKQorCQlhc3Rfdmh1Yl9lcG5faGFuZGxlX2Fja19k ZXNjKGVwKTsKKwllbHNlCisJCWFzdF92aHViX2Vwbl9oYW5kbGVfYWNrKGVwKTsKK30KKworc3Rh dGljIGludCBhc3Rfdmh1Yl9lcG5fcXVldWUoc3RydWN0IHVzYl9lcCogdV9lcCwgc3RydWN0IHVz Yl9yZXF1ZXN0ICp1X3JlcSwKKwkJCSAgICAgIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3Qg YXN0X3ZodWJfcmVxICpyZXEgPSB0b19hc3RfcmVxKHVfcmVxKTsKKwlzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52 aHViOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCBlbXB0eTsKKwlpbnQgcmM7CisKKwkv KiBQYXJhbm9pZCBjaGVja3MgKi8KKwlpZiAoIXVfcmVxIHx8ICF1X3JlcS0+Y29tcGxldGUgfHwg IXVfcmVxLT5idWYpIHsKKwkJZGV2X3dhcm4oJnZodWItPnBkZXYtPmRldiwgIkJvZ3VzIEVQbiBy ZXF1ZXN0ICEgdV9yZXE9JXBcbiIsIHVfcmVxKTsKKwkJaWYgKHVfcmVxKSB7CisJCQlkZXZfd2Fy bigmdmh1Yi0+cGRldi0+ZGV2LCAiY29tcGxldGU9JXAgaW50ZXJuYWw9JWRcbiIsCisJCQkJIHVf cmVxLT5jb21wbGV0ZSwgcmVxLT5pbnRlcm5hbCk7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJLyogRW5kcG9pbnQgZW5hYmxlZCA/ICovCisJaWYgKCFlcC0+ZXBuLmVuYWJsZWQgfHwg IXVfZXAtPmRlc2MgfHwgIWVwLT5kZXYgfHwgIWVwLT5kX2lkeCB8fAorCSAgICAhZXAtPmRldi0+ ZW5hYmxlZCB8fCBlcC0+ZGV2LT5zdXNwZW5kZWQpIHsKKwkJRVBEQkcoZXAsIkVucXVlaW5nIHJl cXVlc3Qgb24gd3Jvbmcgb3IgZGlzYWJsZWQgRVBcbiIpOworCQlyZXR1cm4gLUVTSFVURE9XTjsK Kwl9CisKKwkvKiBNYXAgcmVxdWVzdCBmb3IgRE1BIGlmIHBvc3NpYmxlLiBGb3Igbm93LCB0aGUg cnVsZSBmb3IgRE1BIGlzCisJICogdGhhdDoKKwkgKgorCSAqICAqIEZvciBzaW5nbGUgc3RhZ2Ug bW9kZSAobm8gZGVzY3JpcHRvcnMpOgorCSAqCisJICogICAtIFRoZSBidWZmZXIgaXMgYWxpZ25l ZCB0byBhIDggYnl0ZXMgYm91bmRhcnkgKEhXIHJlcXVpcmVtZW50KQorCSAqICAgLSBGb3IgYSBP VVQgZW5kcG9pbnQsIHRoZSByZXF1ZXN0IHNpemUgaXMgYSBtdWx0aXBsZSBvZiB0aGUgRVAKKwkg KiAgICAgcGFja2V0IHNpemUgKG90aGVyd2lzZSB0aGUgY29udHJvbGxlciB3aWxsIERNQSBwYXN0 IHRoZSBlbmQKKwkgKiAgICAgb2YgdGhlIGJ1ZmZlciBpZiB0aGUgaG9zdCBpcyBzZW5kaW5nIGEg dG9vIGxvbmcgcGFja2V0KS4KKwkgKgorCSAqICAqIEZvciBkZXNjcmlwdG9yIG1vZGUgKHR4IG9u bHkgZm9yIG5vdyksIGFsd2F5cy4KKwkgKgorCSAqIFdlIGNvdWxkIHJlbGF4IHRoZSBsYXR0ZXIg YnkgbWFraW5nIHRoZSBkZWNpc2lvbiB0byB1c2UgdGhlIGJvdW5jZQorCSAqIGJ1ZmZlciBiYXNl ZCBvbiB0aGUgc2l6ZSBvZiBhIGdpdmVuICpzZWdtZW50KiBvZiB0aGUgcmVxdWVzdCByYXRoZXIK KwkgKiB0aGFuIHRoZSB3aG9sZSByZXF1ZXN0LgorCSAqLworCWlmIChlcC0+ZXBuLmRlc2NfbW9k ZSB8fAorCSAgICAoKCgodW5zaWduZWQgbG9uZyl1X3JlcS0+YnVmICYgNykgPT0gMCkgJiYKKwkg ICAgIChlcC0+ZXBuLmlzX2luIHx8ICEodV9yZXEtPmxlbmd0aCAmICh1X2VwLT5tYXhwYWNrZXQg LSAxKSkpKSkgeworCQlyYyA9IHVzYl9nYWRnZXRfbWFwX3JlcXVlc3QoJmVwLT5kZXYtPmdhZGdl dCwgdV9yZXEsCisJCQkJCSAgICBlcC0+ZXBuLmlzX2luKTsKKwkJaWYgKHJjKSB7CisJCQlkZXZf d2Fybigmdmh1Yi0+cGRldi0+ZGV2LAorCQkJCSAiUmVxdWVzdCBtYXBwaW5nIGZhaWx1cmUgJWRc biIsIHJjKTsKKwkJCXJldHVybiByYzsKKwkJfQorCX0gZWxzZQorCQl1X3JlcS0+ZG1hID0gMDsK KworCUVQVkRCRyhlcCwgImVucXVldWUgcmVxIEAlcFxuIiwgcmVxKTsKKwlFUFZEQkcoZXAsICIg bD0lZCBkbWE9MHgleCB6ZXJvPSVkIG5vc2hvcnQ9JWQgbm9pcnE9JWQgaXNfaW49JWRcbiIsCisJ ICAgICAgIHVfcmVxLT5sZW5ndGgsICh1MzIpdV9yZXEtPmRtYSwgdV9yZXEtPnplcm8sCisJICAg ICAgIHVfcmVxLT5zaG9ydF9ub3Rfb2ssIHVfcmVxLT5ub19pbnRlcnJ1cHQsCisJICAgICAgIGVw LT5lcG4uaXNfaW4pOworCisJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IHByb2dyZXNzIGZpZWxkcyAq LworCXVfcmVxLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJdV9yZXEtPmFjdHVhbCA9IDA7CisJ cmVxLT5hY3RfY291bnQgPSAwOworCXJlcS0+YWN0aXZlID0gZmFsc2U7CisJcmVxLT5sYXN0X2Rl c2MgPSAtMTsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCWVtcHR5 ID0gbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKTsKKworCS8qIEFkZCByZXF1ZXN0IHRvIGxpc3QgYW5k IGtpY2sgcHJvY2Vzc2luZyBpZiBlbXB0eSAqLworCWxpc3RfYWRkX3RhaWwoJnJlcS0+cXVldWUs ICZlcC0+cXVldWUpOworCWlmIChlbXB0eSkgeworCQlpZiAoZXAtPmVwbi5kZXNjX21vZGUpCisJ CQlhc3Rfdmh1Yl9lcG5fa2lja19kZXNjKGVwLCByZXEpOworCQllbHNlCisJCQlhc3Rfdmh1Yl9l cG5fa2ljayhlcCwgcmVxKTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9j aywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3N0b3Bf YWN0aXZlX3JlcShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgICAgYm9vbCByZXN0YXJ0 X2VwKQoreworCXUzMiBzdGF0ZSwgcmVnLCBsb29wczsKKworCS8qIFN0b3AgRE1BIGFjdGl2aXR5 ICovCisJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsK KworCS8qIFdhaXQgZm9yIGl0IHRvIGNvbXBsZXRlICovCisJZm9yIChsb29wcyA9IDA7IGxvb3Bz IDwgMTAwMDsgbG9vcHMrKykgeworCQlzdGF0ZSA9IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9W SFVCX0VQX0RNQV9DVExTVEFUKTsKKwkJc3RhdGUgPSBWSFVCX0VQX0RNQV9QUk9DX1NUQVRVUyhz dGF0ZSk7CisJCWlmIChzdGF0ZSA9PSBFUF9ETUFfUFJPQ19SWF9JRExFIHx8CisJCSAgICBzdGF0 ZSA9PSBFUF9ETUFfUFJPQ19UWF9JRExFKQorCQkJYnJlYWs7CisJCXVkZWxheSgxKTsKKwl9CisJ aWYgKGxvb3BzID49IDEwMDApCisJCWRldl93YXJuKCZlcC0+dmh1Yi0+cGRldi0+ZGV2LCAiVGlt ZW91dCB3YWl0aW5nIGZvciBETUFcbiIpOworCisJLyogSWYgd2UgZG9uJ3QgaGF2ZSB0byByZXN0 YXJ0IHRoZSBlbmRwb2ludCwgdGhhdCdzIGl0ICovCisJaWYgKCFyZXN0YXJ0X2VwKQorCQlyZXR1 cm47CisKKwkvKiBSZXN0YXJ0IHRoZSBlbmRwb2ludCAqLworCWlmIChlcC0+ZXBuLmRlc2NfbW9k ZSkgeworCQkvKgorCQkgKiBUYWtlIG91dCBkZXNjcmlwdG9ycyBieSByZXNldHRpbmcgdGhlIERN QSByZWFkCisJCSAqIHBvaW50ZXIgdG8gYmUgZXF1YWwgdG8gdGhlIENQVSB3cml0ZSBwb2ludGVy LgorCQkgKgorCQkgKiBOb3RlOiBJZiB3ZSBldmVyIHN1cHBvcnQgY3JlYXRpbmcgZGVzY3JpcHRv cnMgZm9yCisJCSAqIHJlcXVlc3RzIHRoYXQgYXJlbid0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZSwg d2UKKwkJICogbWF5IGhhdmUgdG8gZG8gc29tZXRoaW5nIG1vcmUgY29tcGxleCBoZXJlLAorCQkg KiBlc3BlY2lhbGx5IGlmIHRoZSByZXF1ZXN0IGJlaW5nIHRha2VuIG91dCBpcworCQkgKiBub3Qg dGhlIGN1cnJlbnQgaGVhZCBkZXNjcmlwdG9ycy4KKwkJICovCisJCXJlZyA9IFZIVUJfRVBfRE1B X1NFVF9SUFRSKGVwLT5lcG4uZF9uZXh0KSB8CisJCQlWSFVCX0VQX0RNQV9TRVRfQ1BVX1dQVFIo ZXAtPmVwbi5kX25leHQpOworCQl3cml0ZWwocmVnLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9F UF9ERVNDX1NUQVRVUyk7CisKKwkJLyogVGhlbiB0dXJuIGl0IGJhY2sgb24gKi8KKwkJd3JpdGVs KGVwLT5lcG4uZG1hX2NvbmYsCisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9E TUFfQ1RMU1RBVCk7CisJfSBlbHNlIHsKKwkJLyogU2luZ2xlIG1vZGU6IGp1c3QgdHVybiBpdCBi YWNrIG9uICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mLAorCQkgICAgICAgZXAtPmVwbi5y ZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCX0KK30KKworc3RhdGljIGludCBhc3Rf dmh1Yl9lcG5fZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3Qg KnVfcmVxKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJ c3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJc3RydWN0IGFzdF92aHViX3JlcSAq cmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTlZBTDsKKworCXNwaW5f bG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwkvKiBNYWtlIHN1cmUgaXQncyBh Y3R1YWxseSBxdWV1ZWQgb24gdGhpcyBlbmRwb2ludCAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkg KHJlcSwgJmVwLT5xdWV1ZSwgcXVldWUpIHsKKwkJaWYgKCZyZXEtPnJlcSA9PSB1X3JlcSkKKwkJ CWJyZWFrOworCX0KKworCWlmICgmcmVxLT5yZXEgPT0gdV9yZXEpIHsKKwkJRVBWREJHKGVwLCAi ZGVxdWV1ZSByZXEgQCVwIGFjdGl2ZT0lZFxuIiwKKwkJICAgICAgIHJlcSwgcmVxLT5hY3RpdmUp OworCQlpZiAocmVxLT5hY3RpdmUpCisJCQlhc3Rfdmh1Yl9zdG9wX2FjdGl2ZV9yZXEoZXAsIHRy dWUpOworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKKwkJcmMgPSAwOwor CX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1 cm4gcmM7Cit9CisKK3ZvaWQgYXN0X3ZodWJfdXBkYXRlX2Vwbl9zdGFsbChzdHJ1Y3QgYXN0X3Zo dWJfZXAgKmVwKQoreworCXUzMiByZWc7CisKKwlpZiAoV0FSTl9PTihlcC0+ZF9pZHggPT0gMCkp CisJCXJldHVybjsKKwlyZWcgPSByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9DT05G SUcpOworCWlmIChlcC0+ZXBuLnN0YWxsZWQgfHwgZXAtPmVwbi53ZWRnZWQpCisJCXJlZyB8PSBW SFVCX0VQX0NGR19TVEFMTF9DVFJMOworCWVsc2UKKwkJcmVnICY9IH5WSFVCX0VQX0NGR19TVEFM TF9DVFJMOworCXdyaXRlbChyZWcsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7 CisKKwlpZiAoIWVwLT5lcG4uc3RhbGxlZCAmJiAhZXAtPmVwbi53ZWRnZWQpCisJCXdyaXRlbChW SFVCX0VQX1RPR0dMRV9TRVRfRVBOVU0oZXAtPmVwbi5nX2lkeCksCisJCSAgICAgICBlcC0+dmh1 Yi0+cmVncyArIEFTVF9WSFVCX0VQX1RPR0dMRSk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf c2V0X2hhbHRfYW5kX3dlZGdlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIGJvb2wgaGFsdCwKKwkJCQkg ICAgICBib29sIHdlZGdlKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAo dV9lcCk7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKworCUVQREJHKGVwLCAiU2V0IGhhbHQgKCVkKSAmIHdlZGdlICglZClcbiIsIGhh bHQsIHdlZGdlKTsKKworCWlmICghdV9lcCB8fCAhdV9lcC0+ZGVzYykKKwkJcmV0dXJuIC1FSU5W QUw7CisJaWYgKGVwLT5kX2lkeCA9PSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoZXAtPmVwbi5pc19p c28pCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5s b2NrLCBmbGFncyk7CisKKwkvKiBGYWlsIHdpdGggc3RpbGwtYnVzeSBJTiBlbmRwb2ludHMgKi8K KwlpZiAoaGFsdCAmJiBlcC0+ZXBuLmlzX2luICYmICFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7 CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJu IC1FQUdBSU47CisJfQorCWVwLT5lcG4uc3RhbGxlZCA9IGhhbHQ7CisJZXAtPmVwbi53ZWRnZWQg PSB3ZWRnZTsKKwlhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKGVwKTsKKworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX2Vwbl9zZXRfaGFsdChzdHJ1Y3QgdXNiX2VwICp1X2VwLCBpbnQgdmFs dWUpCit7CisJcmV0dXJuIGFzdF92aHViX3NldF9oYWx0X2FuZF93ZWRnZSh1X2VwLCB2YWx1ZSAh PSAwLCBmYWxzZSk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX3NldF93ZWRnZShzdHJ1 Y3QgdXNiX2VwICp1X2VwKQoreworCXJldHVybiBhc3Rfdmh1Yl9zZXRfaGFsdF9hbmRfd2VkZ2Uo dV9lcCwgdHJ1ZSwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX2Rpc2FibGUo c3RydWN0IHVzYl9lcCogdV9lcCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0 X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJdTMyIGltYXNrLCBlcF9pZXI7CisKKwlFUERCRyhlcCwgIkRpc2FibGlu ZyAhXG4iKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwll cC0+ZXBuLmVuYWJsZWQgPSBmYWxzZTsKKworCS8qIFN0b3AgYWN0aXZlIERNQSBpZiBhbnkgKi8K Kwlhc3Rfdmh1Yl9zdG9wX2FjdGl2ZV9yZXEoZXAsIGZhbHNlKTsKKworCS8qIERpc2FibGUgZW5k cG9pbnQgKi8KKwl3cml0ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsK KworCS8qIERpc2FibGUgQUNLIGludGVycnVwdCAqLworCWltYXNrID0gVkhVQl9FUF9JUlEoZXAt PmVwbi5nX2lkeCk7CisJZXBfaWVyID0gcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FD S19JRVIpOworCWVwX2llciAmPSB+aW1hc2s7CisJd3JpdGVsKGVwX2llciwgdmh1Yi0+cmVncyAr IEFTVF9WSFVCX0VQX0FDS19JRVIpOworCXdyaXRlbChpbWFzaywgdmh1Yi0+cmVncyArIEFTVF9W SFVCX0VQX0FDS19JU1IpOworCisJLyogTnVrZSBhbGwgcGVuZGluZyByZXF1ZXN0cyAqLworCWFz dF92aHViX251a2UoZXAsIC1FU0hVVERPV04pOworCisJLyogTm8gbW9yZSBkZXNjcmlwdG9yIGFz c29jaWF0ZWQgd2l0aCByZXF1ZXN0ICovCisJZXAtPmVwLmRlc2MgPSBOVUxMOworCisJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX2VuYWJsZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLAorCQkJ ICAgICAgIGNvbnN0IHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYykKK3sKKwlz dGF0aWMgY29uc3QgY2hhciAqZXBfdHlwZV9zdHJpbmdbXSBfX21heWJlX3VudXNlZCA9IHsgImN0 cmwiLAorCQkJCQkJCSAgICAgICAiaXNvYyIsCisJCQkJCQkJICAgICAgICJidWxrIiwKKwkJCQkJ CQkgICAgICAgImludHIiIH07CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1 X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkZXY7CisJc3RydWN0IGFzdF92aHViICp2aHVi OworCXUxNiBtYXhwYWNrZXQsIHR5cGU7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgZXBf Y29uZiwgZXBfaWVyLCBpbWFzazsKKworCS8qIENoZWNrIGFyZ3VtZW50cyAqLworCWlmICghdV9l cCB8fCAhZGVzYykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltYXhwYWNrZXQgPSB1c2JfZW5kcG9p bnRfbWF4cChkZXNjKTsKKwlpZiAoIWVwLT5kX2lkeCB8fCAhZXAtPmRldiB8fAorCSAgICBkZXNj LT5iRGVzY3JpcHRvclR5cGUgIT0gVVNCX0RUX0VORFBPSU5UIHx8CisJICAgIG1heHBhY2tldCA9 PSAwIHx8IG1heHBhY2tldCA+IGVwLT5lcC5tYXhwYWNrZXQpIHsKKwkJRVBEQkcoZXAsICJJbnZh bGlkIEVQIGVuYWJsZSxkX2lkeD0lZCxkZXY9JXAsdHlwZT0lZCxtcD0lZC8lZFxuIiwKKwkJICAg ICAgZXAtPmRfaWR4LCBlcC0+ZGV2LCBkZXNjLT5iRGVzY3JpcHRvclR5cGUsCisJCSAgICAgIG1h eHBhY2tldCwgZXAtPmVwLm1heHBhY2tldCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAo ZXAtPmRfaWR4ICE9IHVzYl9lbmRwb2ludF9udW0oZGVzYykpIHsKKwkJRVBEQkcoZXAsICJFUCBu dW1iZXIgbWlzbWF0Y2ggIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChlcC0+ ZXBuLmVuYWJsZWQpIHsKKwkJRVBEQkcoZXAsICJBbHJlYWR5IGVuYWJsZWRcbiIpOworCQlyZXR1 cm4gLUVCVVNZOworCX0KKwlkZXYgPSBlcC0+ZGV2OworCXZodWIgPSBlcC0+dmh1YjsKKworCS8q IENoZWNrIGRldmljZSBzdGF0ZSAqLworCWlmICghZGV2LT5kcml2ZXIpIHsKKwkJRVBEQkcoZXAs ICJCb2d1cyBkZXZpY2Ugc3RhdGU6IGRyaXZlcj0lcCBzcGVlZD0lZFxuIiwKKwkJICAgICAgIGRl di0+ZHJpdmVyLCBkZXYtPmdhZGdldC5zcGVlZCk7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0K KworCS8qIEdyYWIgc29tZSBpbmZvIGZyb20gdGhlIGRlc2NyaXB0b3IgKi8KKwllcC0+ZXBuLmlz X2luID0gdXNiX2VuZHBvaW50X2Rpcl9pbihkZXNjKTsKKwllcC0+ZXAubWF4cGFja2V0ID0gbWF4 cGFja2V0OworCXR5cGUgPSB1c2JfZW5kcG9pbnRfdHlwZShkZXNjKTsKKwllcC0+ZXBuLmRfbmV4 dCA9IGVwLT5lcG4uZF9sYXN0ID0gMDsKKwllcC0+ZXBuLmlzX2lzbyA9IGZhbHNlOworCWVwLT5l cG4uc3RhbGxlZCA9IGZhbHNlOworCWVwLT5lcG4ud2VkZ2VkID0gZmFsc2U7CisKKwlFUERCRyhl cCwgIkVuYWJsaW5nIFslc10gJXMgbnVtICVkIG1heHBhY2tldD0lZFxuIiwKKwkgICAgICBlcC0+ ZXBuLmlzX2luID8gImluIiA6ICJvdXQiLCBlcF90eXBlX3N0cmluZ1t0eXBlXSwKKwkgICAgICB1 c2JfZW5kcG9pbnRfbnVtKGRlc2MpLCBtYXhwYWNrZXQpOworCisJLyogQ2FuIHdlIHVzZSBETUEg ZGVzY3JpcHRvciBtb2RlID8gKi8KKwllcC0+ZXBuLmRlc2NfbW9kZSA9IGVwLT5lcG4uZGVzY3Mg JiYgZXAtPmVwbi5pc19pbjsKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpCisJCW1lbXNldChlcC0+ ZXBuLmRlc2NzLCAwLCA4ICogQVNUX1ZIVUJfREVTQ1NfQ09VTlQpOworCisJLyoKKwkgKiBMYXJn ZSBzZW5kIGZ1bmN0aW9uIGNhbiBzZW5kIHVwIHRvIDggcGFja2V0cyBmcm9tCisJICogb25lIGRl c2NyaXB0b3Igd2l0aCBhIGxpbWl0IG9mIDQwOTUgYnl0ZXMuCisJICovCisJZXAtPmVwbi5jaHVu a19tYXggPSBlcC0+ZXAubWF4cGFja2V0OworCWlmIChlcC0+ZXBuLmlzX2luKSB7CisJCWVwLT5l cG4uY2h1bmtfbWF4IDw8PSAzOworCQl3aGlsZSAoZXAtPmVwbi5jaHVua19tYXggPiA0MDk1KQor CQkJZXAtPmVwbi5jaHVua19tYXggLT0gZXAtPmVwLm1heHBhY2tldDsKKwl9CisKKwlzd2l0Y2go dHlwZSkgeworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTDoKKwkJRVBEQkcoZXAsICJP bmx5IG9uZSBjb250cm9sIGVuZHBvaW50XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJY2FzZSBV U0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCWVwX2NvbmYgPSBWSFVCX0VQX0NGR19TRVRfVFlQRShF UF9UWVBFX0lOVCk7CisJCWJyZWFrOworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKKwkJ ZXBfY29uZiA9IFZIVUJfRVBfQ0ZHX1NFVF9UWVBFKEVQX1RZUEVfQlVMSyk7CisJCWJyZWFrOwor CWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSVNPQzoKKwkJZXBfY29uZiA9IFZIVUJfRVBfQ0ZHX1NF VF9UWVBFKEVQX1RZUEVfSVNPKTsKKwkJZXAtPmVwbi5pc19pc28gPSB0cnVlOworCQlicmVhazsK KwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFbmNvZGUgdGhlIHJlc3Qg b2YgdGhlIEVQIGNvbmZpZyByZWdpc3RlciAqLworCWlmIChtYXhwYWNrZXQgPCAxMDI0KQorCQll cF9jb25mIHw9IFZIVUJfRVBfQ0ZHX1NFVF9NQVhfUEtUKG1heHBhY2tldCk7CisJaWYgKCFlcC0+ ZXBuLmlzX2luKQorCQllcF9jb25mIHw9IFZIVUJfRVBfQ0ZHX0RJUl9PVVQ7CisJZXBfY29uZiB8 PSBWSFVCX0VQX0NGR19TRVRfRVBfTlVNKHVzYl9lbmRwb2ludF9udW0oZGVzYykpOworCWVwX2Nv bmYgfD0gVkhVQl9FUF9DRkdfRU5BQkxFOworCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfU0VUX0RF VihkZXYtPmluZGV4ICsgMSk7CisJRVBWREJHKGVwLCAiY29uZmlnPSUwOHhcbiIsIGVwX2NvbmYp OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIERpc2Fi bGUgSFcgYW5kIHJlc2V0IERNQSAqLworCXdyaXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhV Ql9FUF9DT05GSUcpOworCXdyaXRlbChWSFVCX0VQX0RNQV9DVFJMX1JFU0VULAorCSAgICAgICBl cC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisKKwkvKiBDb25maWd1cmUg YW5kIGVuYWJsZSAqLworCXdyaXRlbChlcF9jb25mLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9F UF9DT05GSUcpOworCisJaWYgKGVwLT5lcG4uZGVzY19tb2RlKSB7CisJCS8qIENsZWFyIERNQSBz dGF0dXMsIGluY2x1ZGluZyB0aGUgRE1BIHJlYWQgcHRyICovCisJCXdyaXRlbCgwLCBlcC0+ZXBu LnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisKKwkJLyogU2V0IGRlc2NyaXB0b3Ig YmFzZSAqLworCQl3cml0ZWwoZXAtPmVwbi5kZXNjc19kbWEsCisJCSAgICAgICBlcC0+ZXBuLnJl Z3MgKyBBU1RfVkhVQl9FUF9ERVNDX0JBU0UpOworCisJCS8qIFNldCBiYXNlIERNQSBjb25maWcg dmFsdWUgKi8KKwkJZXAtPmVwbi5kbWFfY29uZiA9IFZIVUJfRVBfRE1BX0RFU0NfTU9ERTsKKwkJ aWYgKGVwLT5lcG4uaXNfaW4pCisJCQllcC0+ZXBuLmRtYV9jb25mIHw9IFZIVUJfRVBfRE1BX0lO X0xPTkdfTU9ERTsKKworCQkvKiBGaXJzdCByZXNldCBhbmQgZGlzYWJsZSBhbGwgb3BlcmF0aW9u cyAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiB8IFZIVUJfRVBfRE1BX0NUUkxfUkVTRVQs CisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisKKwkJ LyogRW5hYmxlIGRlc2NyaXB0b3IgbW9kZSAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiwK KwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKwl9IGVs c2UgeworCQkvKiBTZXQgYmFzZSBETUEgY29uZmlnIHZhbHVlICovCisJCWVwLT5lcG4uZG1hX2Nv bmYgPSBWSFVCX0VQX0RNQV9TSU5HTEVfU1RBR0U7CisKKwkJLyogUmVzZXQgYW5kIHN3aXRjaCB0 byBzaW5nbGUgc3RhZ2UgbW9kZSAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiB8IFZIVUJf RVBfRE1BX0NUUkxfUkVTRVQsCisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9E TUFfQ1RMU1RBVCk7CisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mLAorCQkgICAgICAgZXAtPmVw bi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCQl3cml0ZWwoMCwgZXAtPmVwbi5y ZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCX0KKworCS8qIENsZWFudXAgZGF0YSB0 b2dnbGUganVzdCBpbiBjYXNlICovCisJd3JpdGVsKFZIVUJfRVBfVE9HR0xFX1NFVF9FUE5VTShl cC0+ZXBuLmdfaWR4KSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX1RPR0dMRSk7 CisKKwkvKiBDbGVhbnVwIGFuZCBlbmFibGUgQUNLIGludGVycnVwdCAqLworCWltYXNrID0gVkhV Ql9FUF9JUlEoZXAtPmVwbi5nX2lkeCk7CisJd3JpdGVsKGltYXNrLCB2aHViLT5yZWdzICsgQVNU X1ZIVUJfRVBfQUNLX0lTUik7CisJZXBfaWVyID0gcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVC X0VQX0FDS19JRVIpOworCWVwX2llciB8PSBpbWFzazsKKwl3cml0ZWwoZXBfaWVyLCB2aHViLT5y ZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisKKwkvKiBXb290LCB3ZSBhcmUgb25saW5lICEg Ki8KKwllcC0+ZXBuLmVuYWJsZWQgPSB0cnVlOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92 aHViX2Vwbl9kaXNwb3NlKHN0cnVjdCB1c2JfZXAgKnVfZXApCit7CisJc3RydWN0IGFzdF92aHVi X2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKworCWlmIChXQVJOX09OKCFlcC0+ZGV2IHx8ICFl cC0+ZF9pZHgpKQorCQlyZXR1cm47CisKKwlFUERCRyhlcCwgIlJlbGVhc2luZyBlbmRwb2ludFxu Iik7CisKKwkvKiBUYWtlIGl0IG91dCBvZiB0aGUgRVAgbGlzdCAqLworCWxpc3RfZGVsX2luaXQo JmVwLT5lcC5lcF9saXN0KTsKKworCS8qIE1hcmsgdGhlIGFkZHJlc3MgZnJlZSBpbiB0aGUgZGV2 aWNlICovCisJZXAtPmRldi0+ZXBuc1tlcC0+ZF9pZHggLSAxXSA9IE5VTEw7CisKKwkvKiBGcmVl IG5hbWUgJiBETUEgYnVmZmVycyAqLworCWtmcmVlKGVwLT5lcC5uYW1lKTsKKwllcC0+ZXAubmFt ZSA9IE5VTEw7CisJZG1hX2ZyZWVfY29oZXJlbnQoJmVwLT52aHViLT5wZGV2LT5kZXYsCisJCQkg IEFTVF9WSFVCX0VQbl9NQVhfUEFDS0VUICsKKwkJCSAgOCAqIEFTVF9WSFVCX0RFU0NTX0NPVU5U LAorCQkJICBlcC0+YnVmLCBlcC0+YnVmX2RtYSk7CisJZXAtPmJ1ZiA9IE5VTEw7CisJZXAtPmVw bi5kZXNjcyA9IE5VTEw7CisKKwkvKiBNYXJrIGZyZWUgKi8KKwllcC0+ZGV2ID0gTlVMTDsKK30K Kworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZXBfb3BzIGFzdF92aHViX2Vwbl9vcHMgPSB7CisJ LmVuYWJsZQkJPSBhc3Rfdmh1Yl9lcG5fZW5hYmxlLAorCS5kaXNhYmxlCT0gYXN0X3ZodWJfZXBu X2Rpc2FibGUsCisJLmRpc3Bvc2UJPSBhc3Rfdmh1Yl9lcG5fZGlzcG9zZSwKKwkucXVldWUJCT0g YXN0X3ZodWJfZXBuX3F1ZXVlLAorCS5kZXF1ZXVlCT0gYXN0X3ZodWJfZXBuX2RlcXVldWUsCisJ LnNldF9oYWx0CT0gYXN0X3ZodWJfZXBuX3NldF9oYWx0LAorCS5zZXRfd2VkZ2UJPSBhc3Rfdmh1 Yl9lcG5fc2V0X3dlZGdlLAorCS5hbGxvY19yZXF1ZXN0CT0gYXN0X3ZodWJfYWxsb2NfcmVxdWVz dCwKKwkuZnJlZV9yZXF1ZXN0CT0gYXN0X3ZodWJfZnJlZV9yZXF1ZXN0LAorfTsKKworc3RydWN0 IGFzdF92aHViX2VwICphc3Rfdmh1Yl9hbGxvY19lcG4oc3RydWN0IGFzdF92aHViX2RldiAqZCwg dTggYWRkcikKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBkLT52aHViOworCXN0cnVjdCBh c3Rfdmh1Yl9lcCAqZXA7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCS8qIEZp bmQgYSBmcmVlIG9uZSAobm8gZGV2aWNlKSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5s b2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKysp CisJCWlmICh2aHViLT5lcG5zW2ldLmRldiA9PSBOVUxMKQorCQkJYnJlYWs7CisJaWYgKGkgPj0g QVNUX1ZIVUJfTlVNX0dFTl9FUHMpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+ bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBTZXQgaXQgdXAgKi8KKwll cCA9ICZ2aHViLT5lcG5zW2ldOworCWVwLT5kZXYgPSBkOworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCUREQkcoZCwgIkFsbG9jYXRpbmcgZ2VuIEVQICVk IGZvciBhZGRyICVkXG4iLCBpLCBhZGRyKTsKKwlJTklUX0xJU1RfSEVBRCgmZXAtPnF1ZXVlKTsK KwllcC0+ZF9pZHggPSBhZGRyOworCWVwLT52aHViID0gdmh1YjsKKwllcC0+ZXAub3BzID0gJmFz dF92aHViX2Vwbl9vcHM7CisJZXAtPmVwLm5hbWUgPSBrYXNwcmludGYoR0ZQX0tFUk5FTCwgImVw JWQiLCBhZGRyKTsKKwlkLT5lcG5zW2FkZHItMV0gPSBlcDsKKwllcC0+ZXBuLmdfaWR4ID0gaTsK KwllcC0+ZXBuLnJlZ3MgPSB2aHViLT5yZWdzICsgMHgyMDAgKyAoaSAqIDB4MTApOworCisJZXAt PmJ1ZiA9IGRtYV9hbGxvY19jb2hlcmVudCgmdmh1Yi0+cGRldi0+ZGV2LAorCQkJCSAgICAgQVNU X1ZIVUJfRVBuX01BWF9QQUNLRVQgKworCQkJCSAgICAgOCAqIEFTVF9WSFVCX0RFU0NTX0NPVU5U LAorCQkJCSAgICAgJmVwLT5idWZfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVwLT5idWYpIHsK KwkJa2ZyZWUoZXAtPmVwLm5hbWUpOworCQllcC0+ZXAubmFtZSA9IE5VTEw7CisJCXJldHVybiBO VUxMOworCX0KKwllcC0+ZXBuLmRlc2NzID0gZXAtPmJ1ZiArIEFTVF9WSFVCX0VQbl9NQVhfUEFD S0VUOworCWVwLT5lcG4uZGVzY3NfZG1hID0gZXAtPmJ1Zl9kbWEgKyBBU1RfVkhVQl9FUG5fTUFY X1BBQ0tFVDsKKworCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZlcC0+ZXAsIEFTVF9WSFVC X0VQbl9NQVhfUEFDS0VUKTsKKwlsaXN0X2FkZF90YWlsKCZlcC0+ZXAuZXBfbGlzdCwgJmQtPmdh ZGdldC5lcF9saXN0KTsKKwllcC0+ZXAuY2Fwcy50eXBlX2lzbyA9IHRydWU7CisJZXAtPmVwLmNh cHMudHlwZV9idWxrID0gdHJ1ZTsKKwllcC0+ZXAuY2Fwcy50eXBlX2ludCA9IHRydWU7CisJZXAt PmVwLmNhcHMuZGlyX2luID0gdHJ1ZTsKKwllcC0+ZXAuY2Fwcy5kaXJfb3V0ID0gdHJ1ZTsKKwor CXJldHVybiBlcDsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVk LXZodWIvaHViLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uOTMzMDgzNGY3YWJiCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYwpA QCAtMCwwICsxLDgyMyBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisv KgorICogYXNwZWVkLXZodWIgLS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2Fk Z2V0CisgKgorICogaHViLmMgLSB2aXJ0dWFsIGh1YiBoYW5kbGluZworICoKKyAqIENvcHlyaWdo dCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3 YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0 aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBi eQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0 aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisg Ki8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5o PgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Rl bGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5o PgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2lu Y2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNp bmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1 ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUg PGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxs aW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2JjZC5oPgorI2luY2x1ZGUgPGxp bnV4L3ZlcnNpb24uaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91 c2IvaGNkLmg+CisKKyNpbmNsdWRlICJ2aHViLmgiCisKKy8qIHVzYiAyLjAgaHViIGRldmljZSBk ZXNjcmlwdG9yCisgKgorICogQSBmZXcgdGhpbmdzIHdlIG1heSB3YW50IHRvIGltcHJvdmUgaGVy ZToKKyAqCisgKiAgICAtIFdlIG1heSBuZWVkIHRvIGluZGljYXRlIFRUIHN1cHBvcnQKKyAqICAg IC0gV2UgbWF5IG5lZWQgYSBkZXZpY2UgcXVhbGlmaWVyIGRlc2NyaXB0b3IKKyAqICAgICAgYXMg ZGV2aWNlcyBjYW4gcHJldGVuZCB0byBiZSB1c2IxIG9yIDIKKyAqICAgIC0gTWFrZSB2aWQvZGlk IG92ZXJyaWRhYmxlCisgKiAgICAtIG1ha2UgaXQgbG9vayBsaWtlIHVzYjEgaWYgdXNiMSBtb2Rl IGZvcmNlZAorICovCisjZGVmaW5lIEtFUk5FTF9SRUwJYmluMmJjZCgoKExJTlVYX1ZFUlNJT05f Q09ERSA+PiAxNikgJiAweDBmZikpCisjZGVmaW5lIEtFUk5FTF9WRVIJYmluMmJjZCgoKExJTlVY X1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4MGZmKSkKKworZW51bSB7CisJQVNUX1ZIVUJfU1RSX01B TlVGID0gMywKKwlBU1RfVkhVQl9TVFJfUFJPRFVDVCA9IDIsCisJQVNUX1ZIVUJfU1RSX1NFUklB TCA9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciBh c3Rfdmh1Yl9kZXZfZGVzYyA9IHsKKwkuYkxlbmd0aAkJPSBVU0JfRFRfREVWSUNFX1NJWkUsCisJ LmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9ERVZJQ0UsCisJLmJjZFVTQgkJCT0gY3B1X3RvX2xl MTYoMHgwMjAwKSwKKwkuYkRldmljZUNsYXNzCQk9IFVTQl9DTEFTU19IVUIsCisJLmJEZXZpY2VT dWJDbGFzcwk9IDAsCisJLmJEZXZpY2VQcm90b2NvbAk9IDEsCisJLmJNYXhQYWNrZXRTaXplMAk9 IDY0LAorCS5pZFZlbmRvcgkgICAgICAgCT0gY3B1X3RvX2xlMTYoMHgxZDZiKSwKKwkuaWRQcm9k dWN0CQk9IGNwdV90b19sZTE2KDB4MDEwNyksCisJLmJjZERldmljZQkJPSBjcHVfdG9fbGUxNigw eDAxMDApLAorCS5pTWFudWZhY3R1cmVyCQk9IEFTVF9WSFVCX1NUUl9NQU5VRiwKKwkuaVByb2R1 Y3QJCT0gQVNUX1ZIVUJfU1RSX1BST0RVQ1QsCisJLmlTZXJpYWxOdW1iZXIJCT0gQVNUX1ZIVUJf U1RSX1NFUklBTCwKKwkuYk51bUNvbmZpZ3VyYXRpb25zCT0gMSwKK307CisKKy8qIFBhdGNoZXMg dG8gdGhlIGFib3ZlIHdoZW4gZm9yY2luZyBVU0IxIG1vZGUgKi8KK3N0YXRpYyB2b2lkIGFzdF92 aHViX3BhdGNoX2Rldl9kZXNjX3VzYjEoc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciAqZGVz YykKK3sKKwlkZXNjLT5iY2RVU0IgPSBjcHVfdG9fbGUxNigweDAxMDApOworCWRlc2MtPmJEZXZp Y2VQcm90b2NvbCA9IDA7Cit9CisKKy8qCisgKiBDb25maWd1cmF0aW9uIGRlc2NyaXB0b3I6IHNh bWUgY29tbWVudHMgYXMgYWJvdmUKKyAqIHJlZ2FyZGluZyBoYW5kbGluZyBVU0IxIG1vZGUuCisg Ki8KKworLyoKKyAqIFdlIGRvbid0IHVzZSBzaXplb2YoKSBhcyBMaW51eCBkZWZpbml0aW9uIG9m CisgKiBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgY29udGFpbnMgMgorICogZXh0cmEg Ynl0ZXMKKyAqLworI2RlZmluZSBBU1RfVkhVQl9DT05GX0RFU0NfU0laRQkoVVNCX0RUX0NPTkZJ R19TSVpFICsgXAorCQkJCSBVU0JfRFRfSU5URVJGQUNFX1NJWkUgKyBcCisJCQkJIFVTQl9EVF9F TkRQT0lOVF9TSVpFKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFzdF92aHViX2Z1bGxfY2Rlc2Mg eworCXN0cnVjdCB1c2JfY29uZmlnX2Rlc2NyaXB0b3IJY2ZnOworCXN0cnVjdCB1c2JfaW50ZXJm YWNlX2Rlc2NyaXB0b3IgaW50ZjsKKwlzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IJZXA7 Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKSBhc3Rfdmh1Yl9jb25mX2Rlc2MgPSB7CisJLmNm ZyA9IHsKKwkJLmJMZW5ndGgJCT0gVVNCX0RUX0NPTkZJR19TSVpFLAorCQkuYkRlc2NyaXB0b3JU eXBlCT0gVVNCX0RUX0NPTkZJRywKKwkJLndUb3RhbExlbmd0aAkJPSBjcHVfdG9fbGUxNihBU1Rf VkhVQl9DT05GX0RFU0NfU0laRSksCisJCS5iTnVtSW50ZXJmYWNlcwkJPSAxLAorCQkuYkNvbmZp Z3VyYXRpb25WYWx1ZQk9IDEsCisJCS5pQ29uZmlndXJhdGlvbgkJPSAwLAorCQkuYm1BdHRyaWJ1 dGVzCQk9IFVTQl9DT05GSUdfQVRUX09ORSB8CisJCQkJCSAgVVNCX0NPTkZJR19BVFRfU0VMRlBP V0VSIHwKKwkJCQkJICBVU0JfQ09ORklHX0FUVF9XQUtFVVAsCisJCS5iTWF4UG93ZXIJCT0gMCwK Kwl9LAorCS5pbnRmID0geworCQkuYkxlbmd0aAkJPSBVU0JfRFRfSU5URVJGQUNFX1NJWkUsCisJ CS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfSU5URVJGQUNFLAorCQkuYkludGVyZmFjZU51bWJl cgk9IDAsCisJCS5iQWx0ZXJuYXRlU2V0dGluZwk9IDAsCisJCS5iTnVtRW5kcG9pbnRzCQk9IDEs CisJCS5iSW50ZXJmYWNlQ2xhc3MJPSBVU0JfQ0xBU1NfSFVCLAorCQkuYkludGVyZmFjZVN1YkNs YXNzCT0gMCwKKwkJLmJJbnRlcmZhY2VQcm90b2NvbAk9IDAsCisJCS5pSW50ZXJmYWNlCQk9IDAs CisJfSwKKwkuZXAgPSB7CisJCS5iTGVuZ3RoCQk9IFVTQl9EVF9FTkRQT0lOVF9TSVpFLAorCQku YkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0VORFBPSU5ULAorCQkuYkVuZHBvaW50QWRkcmVzcwk9 IDB4ODEsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0VORFBPSU5UX1hGRVJfSU5ULAorCQkud01h eFBhY2tldFNpemUJCT0gY3B1X3RvX2xlMTYoMSksCisJCS5iSW50ZXJ2YWwJCT0gMHgwYywKKwl9 LAorfTsKKworI2RlZmluZSBBU1RfVkhVQl9IVUJfREVTQ19TSVpFCShVU0JfRFRfSFVCX05PTlZB Ul9TSVpFICsgMikKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfaHViX2Rlc2NyaXB0b3IgYXN0 X3ZodWJfaHViX2Rlc2MgPSB7CisJLmJEZXNjTGVuZ3RoCQkJPSBBU1RfVkhVQl9IVUJfREVTQ19T SVpFLAorCS5iRGVzY3JpcHRvclR5cGUJCT0gVVNCX0RUX0hVQiwKKwkuYk5iclBvcnRzCQkJPSBB U1RfVkhVQl9OVU1fUE9SVFMsCisJLndIdWJDaGFyYWN0ZXJpc3RpY3MJCT0gY3B1X3RvX2xlMTYo SFVCX0NIQVJfTk9fTFBTTSksCisJLmJQd3JPbjJQd3JHb29kCQkJPSAxMCwKKwkuYkh1YkNvbnRy Q3VycmVudAkJPSAwLAorCS51LmhzLkRldmljZVJlbW92YWJsZVswXQk9IDAsCisJLnUuaHMuRGV2 aWNlUmVtb3ZhYmxlWzFdCT0gMHhmZiwKK307CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2Rl dl9zdGF0dXMoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgICB1MTYgd0luZGV4LCB1MTYg d1ZhbHVlKQoreworCXU4IHN0MDsKKworCUVQREJHKGVwLCAiR0VUX1NUQVRVUyhkZXYpXG4iKTsK KworCS8qCisJICogTWFyayBpdCBhcyBzZWxmLXBvd2VyZWQsIEkgZG91YnQgdGhlIEJNQyBpcyBw b3dlcmVkIG9mZgorCSAqIHRoZSBVU0IgYnVzIC4uLgorCSAqLworCXN0MCA9IDEgPDwgVVNCX0RF VklDRV9TRUxGX1BPV0VSRUQ7CisKKwkvKgorCSAqIE5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyBy ZW1vdGUgd2FrZXVwIGFjdHVhbGx5IHdvcmtzCisJICogb24gdGhhdCBjaGlwIGFuZCB3aGF0IHRy aWdnZXJzIGl0LgorCSAqLworCWlmIChlcC0+dmh1Yi0+d2FrZXVwX2VuKQorCQlzdDAgfD0gMSA8 PCBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVA7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3Jl cGx5KGVwLCBzdDAsIDApOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2h1Yl9lcF9zdGF0dXMo c3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgIHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUpCit7 CisJaW50IGVwX251bTsKKwl1OCBzdDAgPSAwOworCisJZXBfbnVtID0gd0luZGV4ICYgVVNCX0VO RFBPSU5UX05VTUJFUl9NQVNLOworCUVQREJHKGVwLCAiR0VUX1NUQVRVUyhlcCVkKVxuIiwgZXBf bnVtKTsKKworCS8qIE9uIHRoZSBodWIgd2UgaGF2ZSBvbmx5IEVQIDAgYW5kIDEgKi8KKwlpZiAo ZXBfbnVtID09IDEpIHsKKwkJaWYgKGVwLT52aHViLT5lcDFfc3RhbGxlZCkKKwkJCXN0MCB8PSAx IDw8IFVTQl9FTkRQT0lOVF9IQUxUOworCX0gZWxzZSBpZiAoZXBfbnVtICE9IDApCisJCXJldHVy biBzdGRfcmVxX3N0YWxsOworCisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgc3Qw LCAwKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJfZGV2X2ZlYXR1cmUoc3RydWN0IGFz dF92aHViX2VwICplcCwKKwkJCQkgICAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSwKKwkJCQkgICAg Ym9vbCBpc19zZXQpCit7CisJRVBEQkcoZXAsICIlc19GRUFUVVJFKGRldiB2YWw9JTAyeClcbiIs CisJICAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xFQVIiLCB3VmFsdWUpOworCisJaWYgKHdWYWx1 ZSAhPSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOwor CisJZXAtPnZodWItPndha2V1cF9lbiA9IGlzX3NldDsKKwlFUERCRyhlcCwgIkh1YiByZW1vdGUg d2FrZXVwICVzXG4iLAorCSAgICAgIGlzX3NldCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwor CisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHVi X2VwX2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgICB1MTYgd0luZGV4LCB1 MTYgd1ZhbHVlLAorCQkJCSAgIGJvb2wgaXNfc2V0KQoreworCWludCBlcF9udW07CisJdTMyIHJl ZzsKKworCWVwX251bSA9IHdJbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwlFUERC RyhlcCwgIiVzX0ZFQVRVUkUoZXAlZCB2YWw9JTAyeClcbiIsCisJICAgICAgaXNfc2V0ID8gIlNF VCIgOiAiQ0xFQVIiLCBlcF9udW0sIHdWYWx1ZSk7CisKKwlpZiAoZXBfbnVtID4gMSkKKwkJcmV0 dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKHdWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKGVwX251bSA9PSAwKQorCQlyZXR1cm4gc3RkX3Jl cV9jb21wbGV0ZTsKKworCUVQREJHKGVwLCAiJXMgc3RhbGwgb24gRVAgMVxuIiwKKwkgICAgICBp c19zZXQgPyAic2V0dGluZyIgOiAiY2xlYXJpbmciKTsKKworCWVwLT52aHViLT5lcDFfc3RhbGxl ZCA9IGlzX3NldDsKKwlyZWcgPSByZWFkbChlcC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9D VFJMKTsKKwlpZiAoaXNfc2V0KSB7CisJCXJlZyB8PSBWSFVCX0VQMV9DVFJMX1NUQUxMOworCX0g ZWxzZSB7CisJCXJlZyAmPSB+VkhVQl9FUDFfQ1RSTF9TVEFMTDsKKwkJcmVnIHw9IFZIVUJfRVAx X0NUUkxfUkVTRVRfVE9HR0xFOworCX0KKwl3cml0ZWwocmVnLCBlcC0+dmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQMV9DVFJMKTsKKworCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX3JlcF9kZXNjKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkgICAg IHU4IGRlc2NfdHlwZSwgdTE2IGxlbikKK3sKKwljb25zdCB2b2lkICpkZXNjOworCXNpemVfdCBk c2l6ZTsKKworCUVQREJHKGVwLCAiR0VUX0RFU0NSSVBUT1IodHlwZTolZClcbiIsIGRlc2NfdHlw ZSk7CisJc3dpdGNoKGRlc2NfdHlwZSkgeworCWNhc2UgVVNCX0RUX0RFVklDRToKKwkJZGVzYyA9 ICZhc3Rfdmh1Yl9kZXZfZGVzYzsKKwkJZHNpemUgPSBVU0JfRFRfREVWSUNFX1NJWkU7CisJCWJy ZWFrOworCWNhc2UgVVNCX0RUX0NPTkZJRzoKKwkJZGVzYyA9ICZhc3Rfdmh1Yl9jb25mX2Rlc2M7 CisJCWRzaXplID0gQVNUX1ZIVUJfQ09ORl9ERVNDX1NJWkU7CisJCWJyZWFrOworCWNhc2UgVVNC X0RUX0hVQjoKKwkJZGVzYyA9ICZhc3Rfdmh1Yl9odWJfZGVzYzsKKwkJZHNpemUgPSBBU1RfVkhV Ql9IVUJfREVTQ19TSVpFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3RkX3JlcV9z dGFsbDsKKwl9CisJaWYgKGRzaXplIDwgbGVuKQorCQlsZW4gPSBkc2l6ZTsKKwkvKgorCSAqIFRo aXMgaXMgb3VyIGxpbWl0IGZvciBodWIgcmVwbGllcyBpbiBvdXIgY3VycmVudAorCSAqIGltcGxl bWVudGF0aW9uLCBrZWVwcyB0aGluZ3Mgc2ltcGxlci4KKwkgKi8KKwlpZiAoV0FSTl9PTihsZW4g Pj0gQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpKQorCQlsZW4gPSBBU1RfVkhVQl9FUDBfTUFYX1BB Q0tFVCAtIDE7CisKKwkvKgorCSAqIENvcHkgZmlyc3QgdG8gRVAgYnVmZmVyIGFuZCBzZW5kIGZy b20gdGhlcmUsIHNvCisJICogd2UgY2FuIGRvIHNvbWUgaW4tcGxhY2UgcGF0Y2hpbmcgaWYgbmVl ZGVkCisJICovCisJbWVtY3B5KGVwLT5idWYsIGRlc2MsIGxlbik7CisKKwkvKiBQYXRjaCBpdCBp ZiBmb3JjaW5nIFVTQjEgKi8KKwlpZiAoZGVzY190eXBlID09IFVTQl9EVF9ERVZJQ0UgJiYgZXAt PnZodWItPmZvcmNlX3VzYjEpCisJCWFzdF92aHViX3BhdGNoX2Rldl9kZXNjX3VzYjEoZXAtPmJ1 Zik7CisKKwkvKiBTaG9vdCBpdCBmcm9tIHRoZSBFUCBidWZmZXIgKi8KKwlyZXR1cm4gYXN0X3Zo dWJfcmVwbHkoZXAsIE5VTEwsIGxlbik7Cit9CisKKy8qIGNvcGllZCBmcm9tIGhkYy5jICovCitz dGF0aWMgdW5zaWduZWQKK2FzY2lpMmRlc2MoY2hhciBjb25zdCAqcywgdTggKmJ1ZiwgdW5zaWdu ZWQgbGVuKQoreworCXVuc2lnbmVkIG4sIHQgPSAyICsgMipzdHJsZW4ocyk7CisKKwlpZiAodCA+ IDI1NCkKKwkJdCA9IDI1NDsJLyogTG9uZ2VzdCBwb3NzaWJsZSBVVEYgc3RyaW5nIGRlc2NyaXB0 b3IgKi8KKwlpZiAobGVuID4gdCkKKwkJbGVuID0gdDsKKworCXQgKz0gVVNCX0RUX1NUUklORyA8 PCA4OwkvKiBOb3cgdCBpcyBmaXJzdCAxNiBiaXRzIHRvIHN0b3JlICovCisKKwluID0gbGVuOwor CXdoaWxlIChuLS0pIHsKKwkJKmJ1ZisrID0gdDsKKwkJaWYgKCFuLS0pCisJCQlicmVhazsKKwkJ KmJ1ZisrID0gdCA+PiA4OworCQl0ID0gKHVuc2lnbmVkIGNoYXIpKnMrKzsKKwl9CisJcmV0dXJu IGxlbjsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9yZXBfc3RyaW5nKHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXAsCisJCQkgICAgICAgdTggc3RyaW5nX2lkLCB1MTYgbGFuZ19pZCwKKwkJCSAgICAg ICB1MTYgbGVuKQoreworCXN0YXRpYyBjaGFyIGNvbnN0IGxhbmdpZHNbNF0gPSB7NCwgVVNCX0RU X1NUUklORywgMHgwOSwgMHgwNH07CisKKwlzd2l0Y2ggKHN0cmluZ19pZCkgeworCWNhc2UgMDog LyogTGFuZ3VhZ2UgSURzIGFycmF5ICovCisJCWlmIChsZW4gPiA0KQorCQkJbGVuID0gNDsKKwkJ bWVtY3B5KGVwLT5idWYsIGxhbmdpZHMsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQVNUX1ZIVUJf U1RSX1NFUklBTDoKKwkJbGVuID0gYXNjaWkyZGVzYygiMDAwMDAwMDAiLCBlcC0+YnVmLCBsZW4p OworCQlicmVhazsKKwljYXNlIEFTVF9WSFVCX1NUUl9QUk9EVUNUOgorCQlsZW4gPSBhc2NpaTJk ZXNjKCJVU0IgVmlydHVhbCBIdWIiLCBlcC0+YnVmLCBsZW4pOworCQlicmVhazsKKwljYXNlIEFT VF9WSFVCX1NUUl9NQU5VRjoKKwkJbGVuID0gYXNjaWkyZGVzYygiQXNwZWVkIiwgZXAtPmJ1Ziwg bGVuKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJfQor CisJLyogU2hvb3QgaXQgZnJvbSB0aGUgRVAgYnVmZmVyICovCisJcmV0dXJuIGFzdF92aHViX3Jl cGx5KGVwLCBOVUxMLCBsZW4pOworfQorCitlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfc3RkX2h1 Yl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJCSBzdHJ1Y3QgdXNiX2N0cmxy ZXF1ZXN0ICpjcnEpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJdTE2 IHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoOworCisJd1ZhbHVlID0gbGUxNl90b19jcHUoY3JxLT53 VmFsdWUpOworCXdJbmRleCA9IGxlMTZfdG9fY3B1KGNycS0+d0luZGV4KTsKKwl3TGVuZ3RoID0g bGUxNl90b19jcHUoY3JxLT53TGVuZ3RoKTsKKworCS8qIEZpcnN0IHBhY2tldCwgZ3JhYiBzcGVl ZCAqLworCWlmICh2aHViLT5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCQl1MzIgdXN0 YXQgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfVVNCU1RTKTsKKwkJaWYgKHVzdGF0ICYg VkhVQl9VU0JTVFNfSElTUEVFRCkKKwkJCXZodWItPnNwZWVkID0gVVNCX1NQRUVEX0hJR0g7CisJ CWVsc2UKKwkJCXZodWItPnNwZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisJCVVEQ0RCRyh2aHViLCAi VVNCIHN0YXR1cz0lMDh4IHNwZWVkPSVzXG4iLCB1c3RhdCwKKwkJICAgICAgIHZodWItPnNwZWVk ID09IFVTQl9TUEVFRF9ISUdIID8gImhpZ2giIDogImZ1bGwiKTsKKwl9CisKKwlzd2l0Y2ggKChj cnEtPmJSZXF1ZXN0VHlwZSA8PCA4KSB8IGNycS0+YlJlcXVlc3QpIHsKKwkJLyogU0VUX0FERFJF U1MgKi8KKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9BRERSRVNTOgorCQlF UERCRyhlcCwgIlNFVF9BRERSRVNTOiBHb3QgYWRkcmVzcyAleFxuIiwgd1ZhbHVlKTsKKwkJd3Jp dGVsKHdWYWx1ZSwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NPTkYpOworCQlyZXR1cm4gc3RkX3Jl cV9jb21wbGV0ZTsKKworCQkvKiBHRVRfU1RBVFVTICovCisJY2FzZSBEZXZpY2VSZXF1ZXN0IHwg VVNCX1JFUV9HRVRfU1RBVFVTOgorCQlyZXR1cm4gYXN0X3ZodWJfaHViX2Rldl9zdGF0dXMoZXAs IHdJbmRleCwgd1ZhbHVlKTsKKwljYXNlIEludGVyZmFjZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9T VEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoZXAsIDAsIDApOworCWNhc2Ug RW5kcG9pbnRSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQlyZXR1cm4gYXN0X3ZodWJf aHViX2VwX3N0YXR1cyhlcCwgd0luZGV4LCB3VmFsdWUpOworCisJCS8qIFNFVC9DTEVBUl9GRUFU VVJFICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJ cmV0dXJuIGFzdF92aHViX2h1Yl9kZXZfZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUsIHRydWUp OworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKKwkJcmV0 dXJuIGFzdF92aHViX2h1Yl9kZXZfZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUsIGZhbHNlKTsK KwljYXNlIEVuZHBvaW50T3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCXJldHVy biBhc3Rfdmh1Yl9odWJfZXBfZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUsIHRydWUpOworCWNh c2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlyZXR1cm4g YXN0X3ZodWJfaHViX2VwX2ZlYXR1cmUoZXAsIHdJbmRleCwgd1ZhbHVlLCBmYWxzZSk7CisKKwkJ LyogR0VUL1NFVF9DT05GSUdVUkFUSU9OICovCisJY2FzZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JF UV9HRVRfQ09ORklHVVJBVElPTjoKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwg MSk7CisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfQ09ORklHVVJBVElPTjoK KwkJaWYgKHdWYWx1ZSAhPSAxKQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCXJldHVybiBz dGRfcmVxX2NvbXBsZXRlOworCisJCS8qIEdFVF9ERVNDUklQVE9SICovCisJY2FzZSBEZXZpY2VS ZXF1ZXN0IHwgVVNCX1JFUV9HRVRfREVTQ1JJUFRPUjoKKwkJc3dpdGNoICh3VmFsdWUgPj4gOCkg eworCQljYXNlIFVTQl9EVF9ERVZJQ0U6CisJCWNhc2UgVVNCX0RUX0NPTkZJRzoKKwkJCXJldHVy biBhc3Rfdmh1Yl9yZXBfZGVzYyhlcCwgd1ZhbHVlID4+IDgsCisJCQkJCQkgd0xlbmd0aCk7CisJ CWNhc2UgVVNCX0RUX1NUUklORzoKKwkJCXJldHVybiBhc3Rfdmh1Yl9yZXBfc3RyaW5nKGVwLCB3 VmFsdWUgJiAweGZmLAorCQkJCQkJICAgd0luZGV4LCB3TGVuZ3RoKTsKKwkJfQorCQlyZXR1cm4g c3RkX3JlcV9zdGFsbDsKKworCQkvKiBHRVQvU0VUX0lOVEVSRkFDRSAqLworCWNhc2UgRGV2aWNl UmVxdWVzdCB8IFVTQl9SRVFfR0VUX0lOVEVSRkFDRToKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBs ZV9yZXBseShlcCwgMCk7CisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfSU5U RVJGQUNFOgorCQlpZiAod1ZhbHVlICE9IDAgfHwgd0luZGV4ICE9IDApCisJCQlyZXR1cm4gc3Rk X3JlcV9zdGFsbDsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJfQorCXJldHVybiBzdGRf cmVxX3N0YWxsOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl91cGRhdGVfaHViX2VwMShzdHJ1 Y3QgYXN0X3ZodWIgKnZodWIsCisJCQkJICAgIHVuc2lnbmVkIGludCBwb3J0KQoreworCS8qIFVw ZGF0ZSBIVyBFUDEgcmVzcG9uc2UgKi8KKwl1MzIgcmVnID0gcmVhZGwodmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQMV9TVFNfQ0hHKTsKKwl1MzIgcG1hc2sgPSAoMSA8PCAocG9ydCArIDEpKTsKKwlp ZiAodmh1Yi0+cG9ydHNbcG9ydF0uY2hhbmdlKQorCQlyZWcgfD0gcG1hc2s7CisJZWxzZQorCQly ZWcgJj0gfnBtYXNrOworCXdyaXRlbChyZWcsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfU1RT X0NIRyk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQoc3RydWN0 IGFzdF92aHViICp2aHViLAorCQkJCSAgICAgIHVuc2lnbmVkIGludCBwb3J0LAorCQkJCSAgICAg IHUxNiBjbHJfZmxhZ3MsCisJCQkJICAgICAgdTE2IHNldF9mbGFncywKKwkJCQkgICAgICBib29s IHNldF9jKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW3BvcnRd OworCXUxNiBwcmV2OworCisJLyogVXBkYXRlIHBvcnQgc3RhdHVzICovCisJcHJldiA9IHAtPnN0 YXR1czsKKwlwLT5zdGF0dXMgPSAocHJldiAmIH5jbHJfZmxhZ3MpIHwgc2V0X2ZsYWdzOworCURE QkcoJnAtPmRldiwgInBvcnQgJWQgc3RhdHVzICUwNHggLT4gJTA0eCAoQz0lZClcbiIsCisJICAg ICBwb3J0ICsgMSwgcHJldiwgcC0+c3RhdHVzLCBzZXRfYyk7CisKKwkvKiBVcGRhdGUgY2hhbmdl IGJpdHMgaWYgbmVlZGVkICovCisJaWYgKHNldF9jKSB7CisJCXUxNiBjaGcgPSBwLT5zdGF0dXMg XiBwcmV2OworCisJCS8qIE9ubHkgdGhlc2UgYXJlIHJlbGV2YW50IGZvciBjaGFuZ2UgKi8KKwkJ Y2hnICY9IFVTQl9QT1JUX1NUQVRfQ19DT05ORUNUSU9OIHwKKwkJICAgICAgIFVTQl9QT1JUX1NU QVRfQ19FTkFCTEUgfAorCQkgICAgICAgVVNCX1BPUlRfU1RBVF9DX1NVU1BFTkQgfAorCQkgICAg ICAgVVNCX1BPUlRfU1RBVF9DX09WRVJDVVJSRU5UIHwKKwkJICAgICAgIFVTQl9QT1JUX1NUQVRf Q19SRVNFVCB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfTDE7CisJCXAtPmNoYW5nZSB8PSBj aGc7CisKKwkJYXN0X3ZodWJfdXBkYXRlX2h1Yl9lcDEodmh1YiwgcG9ydCk7CisJfQorfQorCitz dGF0aWMgdm9pZCBhc3Rfdmh1Yl9zZW5kX2hvc3Rfd2FrZXVwKHN0cnVjdCBhc3Rfdmh1YiAqdmh1 YikKK3sKKwl1MzIgcmVnID0gcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCVVE Q0RCRyh2aHViLCAiV2FraW5nIHVwIGhvc3QgIVxuIik7CisJcmVnIHw9IFZIVUJfQ1RSTF9NQU5V QUxfUkVNT1RFX1dBS0VVUDsKKwl3cml0ZWwocmVnLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RS TCk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZGV2aWNlX2Nvbm5lY3Qoc3RydWN0IGFzdF92aHViICp2 aHViLAorCQkJICAgICB1bnNpZ25lZCBpbnQgcG9ydCwgYm9vbCBvbikKK3sKKwlpZiAob24pCisJ CWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwgMCwKKwkJCQkJICBVU0JfUE9S VF9TVEFUX0NPTk5FQ1RJT04sIHRydWUpOworCWVsc2UKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRf c3RhdCh2aHViLCBwb3J0LAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTiB8CisJCQkJ CSAgVVNCX1BPUlRfU1RBVF9FTkFCTEUsCisJCQkJCSAgMCwgdHJ1ZSk7CisKKwkvKgorCSAqIElm IHRoZSBodWIgaXMgc2V0IHRvIHdha3VwIHRoZSBob3N0IG9uIGNvbm5lY3Rpb24gZXZlbnRzCisJ ICogdGhlbiBzZW5kIGEgd2FrZXVwLgorCSAqLworCWlmICh2aHViLT53YWtldXBfZW4pCisJCWFz dF92aHViX3NlbmRfaG9zdF93YWtldXAodmh1Yik7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHVi X3dha2Vfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCit7CisJc3RydWN0IGFzdF92aHVi ICp2aHViID0gY29udGFpbmVyX29mKHdvcmssCisJCQkJCSAgICAgc3RydWN0IGFzdF92aHViLAor CQkJCQkgICAgIHdha2Vfd29yayk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBp bnQgaTsKKworCS8qCisJICogV2FrZSBhbGwgc2xlZXBpbmcgcG9ydHMuIElmIGEgcG9ydCBpcyBz dXNwZW5kZWQgYnkKKwkgKiB0aGUgaG9zdCBzdXNwZW5kICh3aXRob3V0IGV4cGxpY2l0IHN0YXRl IHN1c3BlbmQpLAorCSAqIHdlIGxldCB0aGUgbm9ybWFsIGhvc3Qgd2FrZSBwYXRoIGRlYWwgd2l0 aCBpdCBsYXRlci4KKwkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3Mp OworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3Qg YXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0dXMg JiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJY29udGludWU7CisJCWFzdF92aHViX2NoYW5n ZV9wb3J0X3N0YXQodmh1YiwgaSwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsCisJCQkJ CSAgMCwgdHJ1ZSk7CisJCWFzdF92aHViX2Rldl9yZXN1bWUoJnAtPmRldik7CisJfQorCWFzdF92 aHViX3NlbmRfaG9zdF93YWtldXAodmh1Yik7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1 Yi0+bG9jaywgZmxhZ3MpOworfQorCit2b2lkIGFzdF92aHViX2h1Yl93YWtlX2FsbChzdHJ1Y3Qg YXN0X3ZodWIgKnZodWIpCit7CisJLyoKKwkgKiBBIGRldmljZSBpcyB0cnlpbmcgdG8gd2FrZSB0 aGUgd29ybGQsIGJlY2F1c2UgdGhpcworCSAqIGNhbiByZWN1cnNlIGludG8gdGhlIGRldmljZSwg d2UgYnJlYWsgdGhlIGNhbGwgY2hhaW4KKwkgKiB1c2luZyBhIHdvcmsgcXVldWUKKwkgKi8KKwlz Y2hlZHVsZV93b3JrKCZ2aHViLT53YWtlX3dvcmspOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1 Yl9wb3J0X3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwgdTggcG9ydCkKK3sKKwlzdHJ1Y3Qg YXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1twb3J0XTsKKwl1MTYgc2V0LCBjbHIsIHNw ZWVkOworCisJLyogRmlyc3QgbWFyayBkaXNhYmxlZCAqLworCWFzdF92aHViX2NoYW5nZV9wb3J0 X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkgIFVTQl9QT1JUX1NUQVRfRU5BQkxFIHwKKwkJCQkgIFVT Ql9QT1JUX1NUQVRfU1VTUEVORCwKKwkJCQkgIFVTQl9QT1JUX1NUQVRfUkVTRVQsCisJCQkJICBm YWxzZSk7CisKKwlpZiAoIXAtPmRldi5kcml2ZXIpCisJCXJldHVybjsKKworCS8qCisJICogVGhp cyB3aWxsIGVpdGhlciAic3RhcnQiIHRoZSBwb3J0IG9yIHJlc2V0IHRoZQorCSAqIGRldmljZSBp ZiBhbHJlYWR5IHN0YXJ0ZWQuLi4KKwkgKi8KKwlhc3Rfdmh1Yl9kZXZfcmVzZXQoJnAtPmRldik7 CisKKwkvKiBHcmFiIHRoZSByaWdodCBzcGVlZCAqLworCXNwZWVkID0gcC0+ZGV2LmRyaXZlci0+ bWF4X3NwZWVkOworCWlmIChzcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTiB8fCBzcGVlZCA+IHZo dWItPnNwZWVkKQorCQlzcGVlZCA9IHZodWItPnNwZWVkOworCisJc3dpdGNoIChzcGVlZCkgewor CWNhc2UgVVNCX1NQRUVEX0xPVzoKKwkJc2V0ID0gVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQ7CisJ CWNsciA9IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfU1BF RURfRlVMTDoKKwkJc2V0ID0gMDsKKwkJY2xyID0gVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQgfAor CQkJVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9I SUdIOgorCQlzZXQgPSBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQ7CisJCWNsciA9IFVTQl9QT1JU X1NUQVRfTE9XX1NQRUVEOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlVRENEQkcodmh1YiwgIlVu c3VwcG9ydGVkIHNwZWVkICVkIHdoZW4iCisJCSAgICAgICAiIGNvbm5lY3RpbmcgZGV2aWNlXG4i LAorCQkgICAgICAgc3BlZWQpOworCQlyZXR1cm47CisJfQorCWNsciB8PSBVU0JfUE9SVF9TVEFU X1JFU0VUOworCXNldCB8PSBVU0JfUE9SVF9TVEFUX0VOQUJMRTsKKworCS8qIFRoaXMgc2hvdWxk IGlkZWFsbHkgYmUgZGVsYXllZCAuLi4gKi8KKwlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZo dWIsIHBvcnQsIGNsciwgc2V0LCB0cnVlKTsKK30KKworc3RhdGljIGVudW0gc3RkX3JlcV9yYyBh c3Rfdmh1Yl9zZXRfcG9ydF9mZWF0dXJlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJCQkg dTggcG9ydCwgdTE2IGZlYXQpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7 CisJc3RydWN0IGFzdF92aHViX3BvcnQgKnA7CisKKwlpZiAocG9ydCA9PSAwIHx8IHBvcnQgPiBB U1RfVkhVQl9OVU1fUE9SVFMpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCXBvcnQtLTsKKwlw ID0gJnZodWItPnBvcnRzW3BvcnRdOworCisJc3dpdGNoKGZlYXQpIHsKKwljYXNlIFVTQl9QT1JU X0ZFQVRfU1VTUEVORDoKKwkJaWYgKCEocC0+c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9FTkFCTEUp KQorCQkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0 YXQodmh1YiwgcG9ydCwKKwkJCQkJICAwLCBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsCisJCQkJCSAg ZmFsc2UpOworCQlhc3Rfdmh1Yl9kZXZfc3VzcGVuZCgmcC0+ZGV2KTsKKwkJcmV0dXJuIHN0ZF9y ZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1JFU0VUOgorCQlFUERCRyhlcCwgIlBv cnQgcmVzZXQgIVxuIik7CisJCWFzdF92aHViX3BvcnRfcmVzZXQodmh1YiwgcG9ydCk7CisJCXJl dHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dFUjoKKwljYXNl IFVTQl9QT1JUX0ZFQVRfVEVTVDoKKwljYXNlIFVTQl9QT1JUX0ZFQVRfSU5ESUNBVE9SOgorCQkv KiBXZSBkb24ndCBkbyBhbnl0aGluZyB3aXRoIHRoZXNlICovCisJCXJldHVybiBzdGRfcmVxX2Nv bXBsZXRlOworCX0KKwlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKK30KKworc3RhdGljIGVudW0gc3Rk X3JlcV9yYyBhc3Rfdmh1Yl9jbHJfcG9ydF9mZWF0dXJlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAs CisJCQkJCQkgdTggcG9ydCwgdTE2IGZlYXQpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0g ZXAtPnZodWI7CisJc3RydWN0IGFzdF92aHViX3BvcnQgKnA7CisKKwlpZiAocG9ydCA9PSAwIHx8 IHBvcnQgPiBBU1RfVkhVQl9OVU1fUE9SVFMpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCXBv cnQtLTsKKwlwID0gJnZodWItPnBvcnRzW3BvcnRdOworCisJc3dpdGNoKGZlYXQpIHsKKwljYXNl IFVTQl9QT1JUX0ZFQVRfRU5BQkxFOgorCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIs IHBvcnQsCisJCQkJCSAgVVNCX1BPUlRfU1RBVF9FTkFCTEUgfAorCQkJCQkgIFVTQl9QT1JUX1NU QVRfU1VTUEVORCwgMCwKKwkJCQkJICBmYWxzZSk7CisJCWFzdF92aHViX2Rldl9zdXNwZW5kKCZw LT5kZXYpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRf U1VTUEVORDoKKwkJaWYgKCEocC0+c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSkKKwkJ CXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZo dWIsIHBvcnQsCisJCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQRU5ELCAwLAorCQkJCQkgIGZhbHNl KTsKKwkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29t cGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCQkvKiBXZSBkb24ndCBkbyBwb3dl ciBjb250cm9sICovCisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRf RkVBVF9JTkRJQ0FUT1I6CisJCS8qIFdlIGRvbid0IGhhdmUgaW5kaWNhdG9ycyAqLworCQlyZXR1 cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfQ19DT05ORUNUSU9OOgor CWNhc2UgVVNCX1BPUlRfRkVBVF9DX0VOQUJMRToKKwljYXNlIFVTQl9QT1JUX0ZFQVRfQ19TVVNQ RU5EOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX09WRVJfQ1VSUkVOVDoKKwljYXNlIFVTQl9QT1JU X0ZFQVRfQ19SRVNFVDoKKwkJLyogQ2xlYXIgc3RhdGUtY2hhbmdlIGZlYXR1cmUgKi8KKwkJcC0+ Y2hhbmdlICY9IH4oMXUgPDwgKGZlYXQgLSAxNikpOworCQlhc3Rfdmh1Yl91cGRhdGVfaHViX2Vw MSh2aHViLCBwb3J0KTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJfQorCXJldHVybiBz dGRfcmVxX3N0YWxsOworfQorCitzdGF0aWMgZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX2dldF9w b3J0X3N0YXQoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJICAgICAgdTggcG9ydCkKK3sK KwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1MTYgc3RhdCwgY2hnOworCisJ aWYgKHBvcnQgPT0gMCB8fCBwb3J0ID4gQVNUX1ZIVUJfTlVNX1BPUlRTKQorCQlyZXR1cm4gc3Rk X3JlcV9zdGFsbDsKKwlwb3J0LS07CisKKwlzdGF0ID0gdmh1Yi0+cG9ydHNbcG9ydF0uc3RhdHVz OworCWNoZyA9IHZodWItPnBvcnRzW3BvcnRdLmNoYW5nZTsKKworCS8qIFdlIGFsd2F5cyBoYXZl IHBvd2VyICovCisJc3RhdCB8PSBVU0JfUE9SVF9TVEFUX1BPV0VSOworCisJRVBEQkcoZXAsICIg cG9ydCBzdGF0dXM9JTA0eCBjaGFuZ2U9JTA0eFxuIiwgc3RhdCwgY2hnKTsKKworCXJldHVybiBh c3Rfdmh1Yl9zaW1wbGVfcmVwbHkoZXAsCisJCQkJICAgICBzdGF0ICYgMHhmZiwKKwkJCQkgICAg IHN0YXQgPj4gOCwKKwkJCQkgICAgIGNoZyAmIDB4ZmYsCisJCQkJICAgICBjaGcgPj4gOCk7Cit9 CisKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9jbGFzc19odWJfcmVxdWVzdChzdHJ1Y3QgYXN0 X3ZodWJfZXAgKmVwLAorCQkJCQkgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcnEpCit7CisJ dTE2IHdWYWx1ZSwgd0luZGV4LCB3TGVuZ3RoOworCisJd1ZhbHVlID0gbGUxNl90b19jcHUoY3Jx LT53VmFsdWUpOworCXdJbmRleCA9IGxlMTZfdG9fY3B1KGNycS0+d0luZGV4KTsKKwl3TGVuZ3Ro ID0gbGUxNl90b19jcHUoY3JxLT53TGVuZ3RoKTsKKworCXN3aXRjaCAoKGNycS0+YlJlcXVlc3RU eXBlIDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgeworCWNhc2UgR2V0SHViU3RhdHVzOgorCQlFUERC RyhlcCwgIkdldEh1YlN0YXR1c1xuIik7CisJCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHko ZXAsIDAsIDAsIDAsIDApOworCWNhc2UgR2V0UG9ydFN0YXR1czoKKwkJRVBEQkcoZXAsICJHZXRQ b3J0U3RhdHVzKCVkKVxuIiwgd0luZGV4ICYgMHhmZik7CisJCXJldHVybiBhc3Rfdmh1Yl9nZXRf cG9ydF9zdGF0KGVwLCB3SW5kZXggJiAweGYpOworCWNhc2UgR2V0SHViRGVzY3JpcHRvcjoKKwkJ aWYgKHdWYWx1ZSAhPSAoVVNCX0RUX0hVQiA8PCA4KSkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxs OworCQlFUERCRyhlcCwgIkdldEh1YkRlc2NyaXB0b3IoJWQpXG4iLCB3SW5kZXggJiAweGZmKTsK KwkJcmV0dXJuIGFzdF92aHViX3JlcF9kZXNjKGVwLCBVU0JfRFRfSFVCLCB3TGVuZ3RoKTsKKwlj YXNlIFNldEh1YkZlYXR1cmU6CisJY2FzZSBDbGVhckh1YkZlYXR1cmU6CisJCUVQREJHKGVwLCAi R2V0L1NldEh1YkZlYXR1cmUoJWQpXG4iLCB3VmFsdWUpOworCQkvKiBObyBmZWF0dXJlLCBqdXN0 IGNvbXBsZXRlIHRoZSByZXF1ZXN0cyAqLworCQlpZiAod1ZhbHVlID09IENfSFVCX0xPQ0FMX1BP V0VSIHx8CisJCSAgICB3VmFsdWUgPT0gQ19IVUJfT1ZFUl9DVVJSRU5UKQorCQkJcmV0dXJuIHN0 ZF9yZXFfY29tcGxldGU7CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWNhc2UgU2V0UG9ydEZl YXR1cmU6CisJCUVQREJHKGVwLCAiU2V0UG9ydEZlYXR1cmUoJWQsJWQpXG4iLCB3SW5kZXggJiAw eGYsIHdWYWx1ZSk7CisJCXJldHVybiBhc3Rfdmh1Yl9zZXRfcG9ydF9mZWF0dXJlKGVwLCB3SW5k ZXggJiAweGYsIHdWYWx1ZSk7CisJY2FzZSBDbGVhclBvcnRGZWF0dXJlOgorCQlFUERCRyhlcCwg IkNsZWFyUG9ydEZlYXR1cmUoJWQsJWQpXG4iLCB3SW5kZXggJiAweGYsIHdWYWx1ZSk7CisJCXJl dHVybiBhc3Rfdmh1Yl9jbHJfcG9ydF9mZWF0dXJlKGVwLCB3SW5kZXggJiAweGYsIHdWYWx1ZSk7 CisJZGVmYXVsdDoKKwkJRVBEQkcoZXAsICJVbmtub3duIGNsYXNzIHJlcXVlc3RcbiIpOworCX0K KwlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKK30KKwordm9pZCBhc3Rfdmh1Yl9odWJfc3VzcGVuZChz dHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlVRENEQkcodmh1 YiwgIlVTQiBidXMgc3VzcGVuZFxuIik7CisKKwlpZiAodmh1Yi0+c3VzcGVuZGVkKQorCQlyZXR1 cm47CisKKwl2aHViLT5zdXNwZW5kZWQgPSB0cnVlOworCisJLyoKKwkgKiBGb3J3YXJkIHRvIHVu c3VzcGVuZGVkIHBvcnRzIHdpdGhvdXQgY2hhbmdpbmcKKwkgKiB0aGVpciBjb25uZWN0aW9uIHN0 YXR1cy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX1BPUlRTOyBpKyspIHsK KwkJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNbaV07CisKKwkJaWYgKCEo cC0+c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSkKKwkJCWFzdF92aHViX2Rldl9zdXNw ZW5kKCZwLT5kZXYpOworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9odWJfcmVzdW1lKHN0cnVjdCBh c3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNC IGJ1cyByZXN1bWVcbiIpOworCisJaWYgKCF2aHViLT5zdXNwZW5kZWQpCisJCXJldHVybjsKKwor CXZodWItPnN1c3BlbmRlZCA9IGZhbHNlOworCisJLyoKKwkgKiBGb3J3YXJkIHRvIHVuc3VzcGVu ZGVkIHBvcnRzIHdpdGhvdXQgY2hhbmdpbmcKKwkgKiB0aGVpciBjb25uZWN0aW9uIHN0YXR1cy4K KwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX1BPUlRTOyBpKyspIHsKKwkJc3Ry dWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNbaV07CisKKwkJaWYgKCEocC0+c3Rh dHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSkKKwkJCWFzdF92aHViX2Rldl9yZXN1bWUoJnAt PmRldik7CisJfQorfQorCit2b2lkIGFzdF92aHViX2h1Yl9yZXNldChzdHJ1Y3QgYXN0X3ZodWIg KnZodWIpCit7CisJdW5zaWduZWQgaW50IGk7CisKKwlVRENEQkcodmh1YiwgIlVTQiBidXMgcmVz ZXRcbiIpOworCisJLyoKKwkgKiBJcyB0aGUgc3BlZWQga25vd24gPyBJZiBub3Qgd2UgZG9uJ3Qg Y2FyZSwgd2UgYXJlbid0CisJICogaW5pdGlhbGl6ZWQgeWV0IGFuZCBwb3J0cyBoYXZlbid0IGJl ZW4gZW5hYmxlZC4KKwkgKi8KKwlpZiAodmh1Yi0+c3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04p CisJCXJldHVybjsKKworCS8qIFdlIGFyZW4ndCBzdXNwZW5kZWQgYW55bW9yZSBvYnZpb3VzbHkg Ki8KKwl2aHViLT5zdXNwZW5kZWQgPSBmYWxzZTsKKworCS8qIE5vIHNwZWVkIHNldCAqLworCXZo dWItPnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisKKwkvKiBXYWtldXAgbm90IGVuYWJsZWQg YW55bW9yZSAqLworCXZodWItPndha2V1cF9lbiA9IGZhbHNlOworCisJLyoKKwkgKiBDbGVhciBh bGwgcG9ydCBzdGF0dXMsIGRpc2FibGUgZ2FkZ2V0cyBhbmQgInN1c3BlbmQiCisJICogdGhlbS4g VGhleSB3aWxsIGJlIHdva2VuIHVwIGJ5IGEgcG9ydCByZXNldC4KKwkgKi8KKwlmb3IgKGkgPSAw OyBpIDwgQVNUX1ZIVUJfTlVNX1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IGFzdF92aHViX3BvcnQg KnAgPSAmdmh1Yi0+cG9ydHNbaV07CisKKwkJLyogT25seSBrZWVwIHRoZSBjb25uZWN0ZWQgZmxh ZyAqLworCQlwLT5zdGF0dXMgJj0gVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OOworCQlwLT5jaGFu Z2UgPSAwOworCisJCS8qIFN1c3BlbmQgdGhlIGdhZGdldCBpZiBhbnkgKi8KKwkJYXN0X3ZodWJf ZGV2X3N1c3BlbmQoJnAtPmRldik7CisJfQorCisJLyogQ2xlYW51cCBIVyAqLworCXdyaXRlbCgw LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ09ORik7CisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9FUDBfQ1RSTCk7CisJd3JpdGVsKFZIVUJfRVAxX0NUUkxfUkVTRVRfVE9HR0xFIHwK KwkgICAgICAgVkhVQl9FUDFfQ1RSTF9FTkFCTEUsCisJICAgICAgIHZodWItPnJlZ3MgKyBBU1Rf VkhVQl9FUDFfQ1RSTCk7CisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfU1RT X0NIRyk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfaW5pdF9odWIoc3RydWN0IGFzdF92aHViICp2aHVi KQoreworCXZodWItPnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJSU5JVF9XT1JLKCZ2aHVi LT53YWtlX3dvcmssIGFzdF92aHViX3dha2Vfd29yayk7Cit9CisKZGlmZiAtLWdpdCBhL2RyaXZl cnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvdmh1Yi5oIGIvZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi92aHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi40NDcyNzIxMWE1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaApAQCAtMCwwICsxLDUxNCBAQAorLyogU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjArICovCisjaWZuZGVmIF9fQVNQRUVEX1ZIVUJfSAorI2Rl ZmluZSBfX0FTUEVFRF9WSFVCX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisg KiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFZIVUIgcmVnaXN0ZXIgZGVmaW5pdGlv bnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCisKKyNkZWZpbmUJQVNUX1ZIVUJfQ1RSTAkJMHgwMAkvKiBSb290IEZ1bmN0 aW9uIENvbnRyb2wgJiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfQ09ORgkJ MHgwNAkvKiBSb290IENvbmZpZ3VyYXRpb24gU2V0dGluZyBSZWdpc3RlciAqLworI2RlZmluZQlB U1RfVkhVQl9JRVIJCTB4MDgJLyogSW50ZXJydXB0IEN0cmwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJ QVNUX1ZIVUJfSVNSCQkweDBDCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZp bmUJQVNUX1ZIVUJfRVBfQUNLX0lFUgkweDEwCS8qIFByb2dyYW1tYWJsZSBFbmRwb2ludCBQb29s IEFDSyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFTVF9WSFVCX0VQX05B Q0tfSUVSCTB4MTQJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgTkFDSyBJbnRlcnJ1cHQg RW5hYmxlIFJlZ2lzdGVyICAqLworI2RlZmluZSBBU1RfVkhVQl9FUF9BQ0tfSVNSCTB4MTgJLyog UHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgQUNLIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIg ICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX05BQ0tfSVNSCTB4MUMJLyogUHJvZ3JhbW1hYmxlIEVu ZHBvaW50IFBvb2wgTkFDSyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICAqLworI2RlZmluZSBB U1RfVkhVQl9TV19SRVNFVAkweDIwCS8qIERldmljZSBDb250cm9sbGVyIFNvZnQgUmVzZXQgRW5h YmxlIFJlZ2lzdGVyICovCisjZGVmaW5lIEFTVF9WSFVCX1VTQlNUUwkJMHgyNAkvKiBVU0IgU3Rh dHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX1RPR0dMRQkweDI4CS8qIFByb2dy YW1tYWJsZSBFbmRwb2ludCBQb29sIERhdGEgVG9nZ2xlIFZhbHVlIFNldCAqLworI2RlZmluZSBB U1RfVkhVQl9JU09fRkFJTF9BQ0MJMHgyQwkvKiBJc29jaHJvbm91cyBUcmFuc2FjdGlvbiBGYWls IEFjY3VtdWxhdG9yICovCisjZGVmaW5lIEFTVF9WSFVCX0VQMF9DVFJMCTB4MzAJLyogRW5kcG9p bnQgMCBDb250cmwvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFTVF9WSFVCX0VQMF9EQVRB CTB4MzQJLyogQmFzZSBBZGRyZXNzIG9mIEVuZHBvaW50IDAgSW4vT1VUIERhdGEgQnVmZmVyIFJl Z2lzdGVyICovCisjZGVmaW5lIEFTVF9WSFVCX0VQMV9DVFJMCTB4MzgJLyogRW5kcG9pbnQgMSBD b250cmwvU3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lIEFTVF9WSFVCX0VQMV9TVFNfQ0hHCTB4 M0MJLyogRW5kcG9pbnQgMSBTdGF0dXMgQ2hhbmdlIEJpdG1hcCBEYXRhICovCisjZGVmaW5lIEFT VF9WSFVCX1NFVFVQMAkJMHg4MAkvKiBSb290IERldmljZSBTZXR1cCBEYXRhIEJ1ZmZlcjAgKi8K KyNkZWZpbmUgQVNUX1ZIVUJfU0VUVVAxCQkweDg0CS8qIFJvb3QgRGV2aWNlIFNldHVwIERhdGEg QnVmZmVyMSAqLworCisvKiBNYWluIGNvbnRyb2wgcmVnICovCisjZGVmaW5lIFZIVUJfQ1RSTF9Q SFlfQ0xLCQkJKDEgPDwgMzEpCisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlfTE9PUF9URVNUCQkJKDEg PDwgMjUpCisjZGVmaW5lIFZIVUJfQ1RSTF9ETl9QV04JCQkoMSA8PCAyNCkKKyNkZWZpbmUgVkhV Ql9DVFJMX0RQX1BXTgkJCSgxIDw8IDIzKQorI2RlZmluZSBWSFVCX0NUUkxfTE9OR19ERVNDCQkJ KDEgPDwgMTgpCisjZGVmaW5lIFZIVUJfQ1RSTF9JU09fUlNQX0NUUkwJCQkoMSA8PCAxNykKKyNk ZWZpbmUgVkhVQl9DVFJMX1NQTElUX0lOCQkJKDEgPDwgMTYpCisjZGVmaW5lIFZIVUJfQ1RSTF9M T09QX1RfUkVTVUxUCQkJKDEgPDwgMTUpCisjZGVmaW5lIFZIVUJfQ1RSTF9MT09QX1RfU1RTCQkJ KDEgPDwgMTQpCisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlfQklTVF9SRVNVTFQJCSgxIDw8IDEzKQor I2RlZmluZSBWSFVCX0NUUkxfUEhZX0JJU1RfQ1RSTAkJCSgxIDw8IDEyKQorI2RlZmluZSBWSFVC X0NUUkxfUEhZX1JFU0VUX0RJUwkJCSgxIDw8IDExKQorI2RlZmluZSBWSFVCX0NUUkxfU0VUX1RF U1RfTU9ERSh4KQkJKCh4KSA8PCA4KQorI2RlZmluZSBWSFVCX0NUUkxfTUFOVUFMX1JFTU9URV9X QUtFVVAJCSgxIDw8IDQpCisjZGVmaW5lIFZIVUJfQ1RSTF9BVVRPX1JFTU9URV9XQUtFVVAJCSgx IDw8IDMpCisjZGVmaW5lIFZIVUJfQ1RSTF9DTEtfU1RPUF9TVVNQRU5ECQkoMSA8PCAyKQorI2Rl ZmluZSBWSFVCX0NUUkxfRlVMTF9TUEVFRF9PTkxZCQkoMSA8PCAxKQorI2RlZmluZSBWSFVCX0NU UkxfVVBTVFJFQU1fQ09OTkVDVAkJKDEgPDwgMCkKKworLyogSUVSICYgSVNSICovCisjZGVmaW5l IFZIVUJfSVJRX1VTQl9DTURfREVBRExPQ0sJCSgxIDw8IDE4KQorI2RlZmluZSBWSFVCX0lSUV9F UF9QT09MX05BSwkJCSgxIDw8IDE3KQorI2RlZmluZSBWSFVCX0lSUV9FUF9QT09MX0FDS19TVEFM TAkJKDEgPDwgMTYpCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTUJCQkoMSA8PCAxMykKKyNkZWZp bmUgVkhVQl9JUlFfREVWSUNFNAkJCSgxIDw8IDEyKQorI2RlZmluZSBWSFVCX0lSUV9ERVZJQ0Uz CQkJKDEgPDwgMTEpCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTIJCQkoMSA8PCAxMCkKKyNkZWZp bmUgVkhVQl9JUlFfREVWSUNFMQkJCSgxIDw8IDkpCisjZGVmaW5lIFZIVUJfSVJRX0JVU19SRVNV TUUJCQkoMSA8PCA4KQorI2RlZmluZSBWSFVCX0lSUV9CVVNfU1VTUEVORCAJCQkoMSA8PCA3KQor I2RlZmluZSBWSFVCX0lSUV9CVVNfUkVTRVQgCQkJKDEgPDwgNikKKyNkZWZpbmUgVkhVQl9JUlFf SFVCX0VQMV9JTl9EQVRBX0FDSwkJKDEgPDwgNSkKKyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9J Tl9EQVRBX05BSwkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9JTl9BQ0tfU1RB TEwJCSgxIDw8IDMpCisjZGVmaW5lIFZIVUJfSVJRX0hVQl9FUDBfT1VUX05BSwkJKDEgPDwgMikK KyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMCQkoMSA8PCAxKQorI2RlZmlu ZSBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQCQkJKDEgPDwgMCkKKyNkZWZpbmUgVkhVQl9JUlFfQUNL X0FMTAkJCTB4MWZmCisKKy8qIFNXIHJlc2V0IHJlZyAqLworI2RlZmluZSBWSFVCX1NXX1JFU0VU X0VQX1BPT0wJCQkoMSA8PCA5KQorI2RlZmluZSBWSFVCX1NXX1JFU0VUX0RNQV9DT05UUk9MTEVS CQkoMSA8PCA4KQorI2RlZmluZSBWSFVCX1NXX1JFU0VUX0RFVklDRTUJCQkoMSA8PCA1KQorI2Rl ZmluZSBWSFVCX1NXX1JFU0VUX0RFVklDRTQJCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX1NXX1JF U0VUX0RFVklDRTMJCQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX1NXX1JFU0VUX0RFVklDRTIJCQko MSA8PCAyKQorI2RlZmluZSBWSFVCX1NXX1JFU0VUX0RFVklDRTEJCQkoMSA8PCAxKQorI2RlZmlu ZSBWSFVCX1NXX1JFU0VUX1JPT1RfSFVCCQkJKDEgPDwgMCkKKyNkZWZpbmUgVkhVQl9TV19SRVNF VF9BTEwJCQkoVkhVQl9TV19SRVNFVF9FUF9QT09MIHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRf RE1BX0NPTlRST0xMRVIgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9ERVZJQ0U1IHwgXAorCQkJ CQkJIFZIVUJfU1dfUkVTRVRfREVWSUNFNCB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklD RTMgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9ERVZJQ0UyIHwgXAorCQkJCQkJIFZIVUJfU1df UkVTRVRfREVWSUNFMSB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX1JPT1RfSFVCKQorLyogRVAg QUNLL05BQ0sgSVJRIG1hc2tzICovCisjZGVmaW5lIFZIVUJfRVBfSVJRKG4pCQkJCSgxIDw8IChu KSkKKyNkZWZpbmUgVkhVQl9FUF9JUlFfQUxMCQkJCTB4N2ZmZgkvKiAxNSBFUHMgKi8KKworLyog VVNCIHN0YXR1cyByZWcgKi8KKyNkZWZpbmUgVkhVQl9VU0JTVFNfSElTUEVFRAkJCSgxIDw8IDI3 KQorCisvKiBFUCB0b2dnbGUgKi8KKyNkZWZpbmUgVkhVQl9FUF9UT0dHTEVfVkFMVUUJCQkoMSA8 PCA4KQorI2RlZmluZSBWSFVCX0VQX1RPR0dMRV9TRVRfRVBOVU0oeCkJCSgoeCkgJiAweDFmKQor CisvKiBIVUIgRVAwIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9FUDBfQ1RSTF9TVEFMTAkJCSgx IDw8IDApCisjZGVmaW5lIFZIVUJfRVAwX1RYX0JVRkZfUkRZCQkJKDEgPDwgMSkKKyNkZWZpbmUg VkhVQl9FUDBfUlhfQlVGRl9SRFkJCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0VQMF9SWF9MRU4o eCkJCQkoKCh4KSA+PiAxNikgJiAweDdmKQorI2RlZmluZSBWSFVCX0VQMF9TRVRfVFhfTEVOKHgp CQkJKCgoeCkgJiAweDdmKSA8PCA4KQorCisvKiBIVUIgRVAxIGNvbnRyb2wgKi8KKyNkZWZpbmUg VkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfRVAxX0NU UkxfU1RBTEwJCQkoMSA8PCAxKQorI2RlZmluZSBWSFVCX0VQMV9DVFJMX0VOQUJMRQkJCSgxIDw8 IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwZXItZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRp b25zICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBU1RfVkhVQl9ERVZfRU5fQ1RSTAkJ MHgwMAorI2RlZmluZSBBU1RfVkhVQl9ERVZfSVNSCQkweDA0CisjZGVmaW5lIEFTVF9WSFVCX0RF Vl9FUDBfQ1RSTAkJMHgwOAorI2RlZmluZSBBU1RfVkhVQl9ERVZfRVAwX0RBVEEJCTB4MGMKKwor LyogRGV2aWNlIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIFZIVUJfREVWX0VOX1NFVF9BRERS KHgpCQkJKCh4KSA8PCA4KQorI2RlZmluZSBWSFVCX0RFVl9FTl9BRERSX01BU0sJCQkoKDB4ZmYp IDw8IDgpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQMF9OQUtfSVJRRU4JCSgxIDw8IDYpCisjZGVm aW5lIFZIVUJfREVWX0VOX0VQMF9JTl9BQ0tfSVJRRU4JCSgxIDw8IDUpCisjZGVmaW5lIFZIVUJf REVWX0VOX0VQMF9PVVRfTkFLX0lSUUVOCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0RFVl9FTl9F UDBfT1VUX0FDS19JUlFFTgkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX1NFVFVQ X0lSUUVOCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0RFVl9FTl9TUEVFRF9TRUxfSElHSAkJKDEg PDwgMSkKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRU5BQkxFX1BPUlQJCQkoMSA8PCAwKQorCisvKiBJ bnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfSU5fREFUQV9OQUNL CQkoMSA8PCA0KQorI2RlZmluZSBWSFVWX0RFVl9JUlFfRVAwX0lOX0FDS19TVEFMTAkJKDEgPDwg MykKKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9PVVRfREFUQV9OQUNLCQkoMSA8PCAyKQorI2Rl ZmluZSBWSFVWX0RFVl9JUlFfRVAwX09VVF9BQ0tfU1RBTEwJCSgxIDw8IDEpCisjZGVmaW5lIFZI VVZfREVWX0lSUV9FUDBfU0VUVVAJCQkoMSA8PCAwKQorCisvKiBDb250cm9sIGJpdHMuCisgKgor ICogTm90ZTogVGhlIGRyaXZlciByZWxpZXMgb24gdGhlIGJ1bGsgb2YgdGhvc2UgYml0cworICog ICAgICAgbWF0Y2hpbmcgY29ycmVzcG9uZGluZyB2SHViIEVQMCBjb250cm9sIGJpdHMKKyAqLwor I2RlZmluZSBWSFVCX0RFVl9FUDBfQ1RSTF9TVEFMTAkJCVZIVUJfRVAwX0NUUkxfU1RBTEwKKyNk ZWZpbmUgVkhVQl9ERVZfRVAwX1RYX0JVRkZfUkRZCQlWSFVCX0VQMF9UWF9CVUZGX1JEWQorI2Rl ZmluZSBWSFVCX0RFVl9FUDBfUlhfQlVGRl9SRFkJCVZIVUJfRVAwX1JYX0JVRkZfUkRZCisjZGVm aW5lIFZIVUJfREVWX0VQMF9SWF9MRU4oeCkJCQlWSFVCX0VQMF9SWF9MRU4oeCkKKyNkZWZpbmUg VkhVQl9ERVZfRVAwX1NFVF9UWF9MRU4oeCkJCVZIVUJfRVAwX1NFVF9UWF9MRU4oeCkKKworLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAqCisgKiBwZXItZW5kcG9pbnQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMg KgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFTVF9WSFVCX0VQX0NPTkZJRwkJ MHgwMAorI2RlZmluZSBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVAkJMHgwNAorI2RlZmluZSBBU1Rf VkhVQl9FUF9ERVNDX0JBU0UJCTB4MDgKKyNkZWZpbmUgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMJ CTB4MEMKKworLyogRVAgY29uZmlnIHJlZyAqLworI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfTUFY X1BLVCh4KQkoKCh4KSAmIDB4M2ZmKSA8PCAxNikKKyNkZWZpbmUgVkhVQl9FUF9DRkdfQVVUT19E QVRBX0RJU0FCTEUJKDEgPDwgMTMpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NUQUxMX0NUUkwJCSgx IDw8IDEyKQorI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfRVBfTlVNKHgpCSgoKHgpICYgMHhmKSA8 PCA4KQorI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfVFlQRSh4KQkJKCh4KSA8PCA1KQorI2RlZmlu ZSAgIEVQX1RZUEVfT0ZGCQkJMAorI2RlZmluZSAgIEVQX1RZUEVfQlVMSwkJCTEKKyNkZWZpbmUg ICBFUF9UWVBFX0lOVAkJCTIKKyNkZWZpbmUgICBFUF9UWVBFX0lTTwkJCTMKKyNkZWZpbmUgVkhV Ql9FUF9DRkdfRElSX09VVAkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVQl9FUF9DRkdfU0VUX0RFVih4 KQkJKCh4KSA8PCAxKQorI2RlZmluZSBWSFVCX0VQX0NGR19FTkFCTEUJCSgxIDw8IDApCisKKy8q IEVQIERNQSBjb250cm9sICovCisjZGVmaW5lIFZIVUJfRVBfRE1BX1BST0NfU1RBVFVTKHgpCSgo KHgpID4+IDQpICYgMHhmKQorI2RlZmluZSAgIEVQX0RNQV9QUk9DX1JYX0lETEUJCTAKKyNkZWZp bmUgICBFUF9ETUFfUFJPQ19UWF9JRExFCQk4CisjZGVmaW5lIFZIVUJfRVBfRE1BX0lOX0xPTkdf TU9ERQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0VQX0RNQV9PVVRfQ09OVElHX01PREUJKDEgPDwg MykKKyNkZWZpbmUgVkhVQl9FUF9ETUFfQ1RSTF9SRVNFVAkJKDEgPDwgMikKKyNkZWZpbmUgVkhV Ql9FUF9ETUFfU0lOR0xFX1NUQUdFCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfRVBfRE1BX0RFU0Nf TU9ERQkJKDEgPDwgMCkKKworLyogRVAgRE1BIHN0YXR1cyAqLworI2RlZmluZSBWSFVCX0VQX0RN QV9TRVRfVFhfU0laRSh4KQkoKHgpIDw8IDE2KQorI2RlZmluZSBWSFVCX0VQX0RNQV9UWF9TSVpF KHgpCQkoKCh4KSA+PiAxNikgJiAweDdmZikKKyNkZWZpbmUgVkhVQl9FUF9ETUFfUlBUUih4KQkJ KCgoeCkgPj4gOCkgJiAweGZmKQorI2RlZmluZSBWSFVCX0VQX0RNQV9TRVRfUlBUUih4KQkJKCgo eCkgJiAweGZmKSA8PCA4KQorI2RlZmluZSBWSFVCX0VQX0RNQV9TRVRfQ1BVX1dQVFIoeCkJKHgp CisjZGVmaW5lIFZIVUJfRVBfRE1BX1NJTkdMRV9LSUNLCQkoMSA8PCAwKSAvKiBXUFRSID0gMSBm b3Igc2luZ2xlIG1vZGUgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBETUEgZGVzY3JpcHRvcnMgZGVmaW5p dGlvbnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqLworCisvKiBEZXNjIFcxIElOICovCisjZGVmaW5lIFZIVUJfRFND MV9JTl9JTlRFUlJVUFQJCSgxIDw8IDMxKQorI2RlZmluZSBWSFVCX0RTQzFfSU5fU1BJRF9EQVRB MAkJKDAgPDwgMTQpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX0RBVEEyCQkoMSA8PCAxNCkK KyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NQSURfREFUQTEJCSgyIDw8IDE0KQorI2RlZmluZSBWSFVC X0RTQzFfSU5fU1BJRF9NREFUQQkJKDMgPDwgMTQpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TRVRf TEVOKHgpCQkoKHgpICYgMHhmZmYpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9MRU4oeCkJCSgoeCkg JiAweGZmZikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEYXRhIHN0cnVjdHVy ZXMgYW5kIG1pc2MgZGVmaW5pdGlvbnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwor CisjZGVmaW5lIEFTVF9WSFVCX05VTV9HRU5fRVBzCTE1CS8qIEdlbmVyaWMgbm9uLTAgRVBzICov CisjZGVmaW5lIEFTVF9WSFVCX05VTV9QT1JUUwk1CS8qIHZIdWIgcG9ydHMgKi8KKyNkZWZpbmUg QVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQJNjQJLyogRVAwJ3MgbWF4IHBhY2tldCBzaXplICovCisj ZGVmaW5lIEFTVF9WSFVCX0VQbl9NQVhfUEFDS0VUCTEwMjQJLyogR2VuZXJpYyBFUHMgbWF4IHBh Y2tldCBzaXplICovCisjZGVmaW5lIEFTVF9WSFVCX0RFU0NTX0NPVU5UCTI1NgkvKiBVc2UgMjU2 IGRlc2NyaXB0b3IgbW9kZSAodmFsaWQKKwkJCQkJICogdmFsdWVzIGFyZSAyNTYgYW5kIDMyKQor CQkJCQkgKi8KKworc3RydWN0IGFzdF92aHViOworc3RydWN0IGFzdF92aHViX2RldjsKKworLyoK KyAqIERNQSBkZXNjcmlwdG9yIChnZW5lcmljIEVQcyBvbmx5LCBjdXJyZW50bHkgb25seSB1c2Vk CisgKiBmb3IgSU4gZW5kcG9pbnRzCisgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9kZXNjIHsKKwlfX2xl MzIJdzA7CisJX19sZTMyCXcxOworfTsKKworLyogQSB0cmFuc2ZlciByZXF1ZXN0LCBlaXRoZXIg Y29yZS1vcmlnaW5hdGVkIG9yIGludGVybmFsICovCitzdHJ1Y3QgYXN0X3ZodWJfcmVxIHsKKwlz dHJ1Y3QgdXNiX3JlcXVlc3QJcmVxOworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisKKwkvKiBB Y3R1YWwgY291bnQgd3JpdHRlbiB0byBkZXNjcmlwdG9ycyAoZGVzYyBtb2RlIG9ubHkpICovCisJ dW5zaWduZWQgaW50CQlhY3RfY291bnQ7CisKKwkvKgorCSAqIERlc2MgbnVtYmVyIG9mIHRoZSBm aW5hbCBwYWNrZXQgb3IgLTEuIEZvciBub24tZGVzYworCSAqIG1vZGUgKG9yIGVwMCksIGFueSA+ PSAwIHZhbHVlIG1lYW5zICJsYXN0IHBhY2tldCIKKwkgKi8KKwlpbnQJCQlsYXN0X2Rlc2M7CisK KwkvKiBSZXF1ZXN0IGFjdGl2ZSAocGVuZGluZyBETUFzKSAqLworCWJvb2wJCQlhY3RpdmUgIDog MTsKKworCS8qIEludGVybmFsIHJlcXVlc3QgKGRvbid0IGNhbGwgYmFjayBjb3JlKSAqLworCWJv b2wJCQlpbnRlcm5hbCA6IDE7Cit9OworI2RlZmluZSB0b19hc3RfcmVxKF9fdXJlcSkgY29udGFp bmVyX29mKF9fdXJlcSwgc3RydWN0IGFzdF92aHViX3JlcSwgcmVxKQorCisvKiBDdXJyZW50IHN0 YXRlIG9mIGFuIEVQMCAqLworZW51bSBlcDBfc3RhdGUgeworCWVwMF9zdGF0ZV90b2tlbiwKKwll cDBfc3RhdGVfZGF0YSwKKwllcDBfc3RhdGVfc3RhdHVzLAorfTsKKworLyoKKyAqIEFuIGVuZHBv aW50LCBlaXRoZXIgZ2VuZXJpYywgZXAwLCBhY3R1YWwgZ2FkZ2V0IEVQCisgKiBvciBpbnRlcm5h bCB1c2Ugdmh1YiBFUDAuIHZodWIgRVAxIGRvZXNuJ3QgaGF2ZSBhbgorICogYXNzb2NpYXRlZCBz dHJ1Y3R1cmUgYXMgaXQncyBtb3N0bHkgSFcgbWFuYWdlZC4KKyAqLworc3RydWN0IGFzdF92aHVi X2VwIHsKKwlzdHJ1Y3QgdXNiX2VwCQllcDsKKworCS8qIFJlcXVlc3QgcXVldWUgKi8KKwlzdHJ1 Y3QgbGlzdF9oZWFkCXF1ZXVlOworCisJLyogRVAgaW5kZXggaW4gdGhlIGRldmljZSwgMCBtZWFu cyB0aGlzIGlzIGFuIEVQMCAqLworCXVuc2lnbmVkIGludAkJZF9pZHg7CisKKwkvKiBEZXYgcG9p bnRlciBvciBOVUxMIGZvciB2SHViIEVQMCAqLworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYJKmRldjsK KworCS8qIHZIdWIgaXRzZWxmICovCisJc3RydWN0IGFzdF92aHViCQkqdmh1YjsKKworCS8qCisJ ICogRE1BIGJ1ZmZlciBmb3IgRVAwLCBmYWxsYmFjayBETUEgYnVmZmVyIGZvciBtaXNhbGlnbmVk CisJICogT1VUIHRyYW5zZmVycyBmb3IgZ2VuZXJpYyBFUHMKKwkgKi8KKwl2b2lkCQkJKmJ1ZjsK KwlkbWFfYWRkcl90CQlidWZfZG1hOworCisJLyogVGhlIHJlc3QgZGVwZW5kcyBvbiB0aGUgRVAg dHlwZSAqLworCXVuaW9uIHsKKwkJLyogRVAwIChlaXRoZXIgZGV2aWNlIG9yIHZodWIpICovCisJ CXN0cnVjdCB7CisJCQkvKgorCQkJICogRVAwIHJlZ2lzdGVycyBhcmUgInNpbWlsYXIiIGZvcgor CQkJICogdkh1YiBhbmQgZGV2aWNlcyBidXQgbG9jYXRlZCBpbgorCQkJICogZGlmZmVyZW50IHBs YWNlcy4KKwkJCSAqLworCQkJdm9pZCBfX2lvbWVtCQkqY3Rsc3RhdDsKKwkJCXZvaWQgX19pb21l bQkJKnNldHVwOworCisJCQkvKiBDdXJyZW50IHN0YXRlICYgZGlyZWN0aW9uICovCisJCQllbnVt IGVwMF9zdGF0ZQkJc3RhdGU7CisJCQlib29sCQkJZGlyX2luOworCisJCQkvKiBJbnRlcm5hbCB1 c2UgcmVxdWVzdCAqLworCQkJc3RydWN0IGFzdF92aHViX3JlcQlyZXE7CisJCX0gZXAwOworCisJ CS8qIEdlbmVyaWMgZW5kcG9pbnQgKGFrYSBFUG4pICovCisJCXN0cnVjdCB7CisJCQkvKiBSZWdp c3RlcnMgKi8KKwkJCXZvaWQgX19pb21lbSAgIAkJKnJlZ3M7CisKKwkJCS8qIEluZGV4IGluIGds b2JhbCBwb29sICgwLi4xNCkgKi8KKwkJCXVuc2lnbmVkIGludAkJZ19pZHg7CisKKwkJCS8qIERN QSBEZXNjcmlwdG9ycyAqLworCQkJc3RydWN0IGFzdF92aHViX2Rlc2MJKmRlc2NzOworCQkJZG1h X2FkZHJfdAkJZGVzY3NfZG1hOworCQkJdW5zaWduZWQgaW50CQlkX25leHQ7CisJCQl1bnNpZ25l ZCBpbnQJCWRfbGFzdDsKKwkJCXVuc2lnbmVkIGludAkJZG1hX2NvbmY7CisKKwkJCS8qIE1heCBj aHVuayBzaXplIGZvciBJTiBFUHMgKi8KKwkJCXVuc2lnbmVkIGludAkJY2h1bmtfbWF4OworCisJ CQkvKiBTdGF0ZSBmbGFncyAqLworCQkJYm9vbAkJCWlzX2luIDogIDE7CisJCQlib29sCQkJaXNf aXNvIDogMTsKKwkJCWJvb2wJCQlzdGFsbGVkIDogMTsKKwkJCWJvb2wJCQl3ZWRnZWQgOiAxOwor CQkJYm9vbAkJCWVuYWJsZWQgOiAxOworCQkJYm9vbAkJCWRlc2NfbW9kZSA6IDE7CisJCX0gZXBu OworCX07Cit9OworI2RlZmluZSB0b19hc3RfZXAoX191ZXApIGNvbnRhaW5lcl9vZihfX3VlcCwg c3RydWN0IGFzdF92aHViX2VwLCBlcCkKKworLyogQSBkZXZpY2UgYXR0YWNoZWQgdG8gYSB2SHVi IHBvcnQgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9kZXYgeworCXN0cnVjdCBhc3Rfdmh1YgkJCSp2aHVi OworCXZvaWQgX19pb21lbQkJCSpyZWdzOworCisJLyogRGV2aWNlIGluZGV4ICgwLi4uNCkgYW5k IG5hbWUgc3RyaW5nICovCisJdW5zaWduZWQgaW50CQkJaW5kZXg7CisJY29uc3QgY2hhcgkJCSpu YW1lOworCisJLyogc3lzZnMgZW5jbG9zdXJlIGZvciB0aGUgZ2FkZ2V0IGd1bmsgKi8KKwlzdHJ1 Y3QgZGV2aWNlCQkJcG9ydF9kZXY7CisKKwkvKiBMaW5rIHRvIGdhZGdldCBjb3JlICovCisJc3Ry dWN0IHVzYl9nYWRnZXQJCWdhZGdldDsKKwlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIJKmRyaXZl cjsKKwlib29sCQkJCXJlZ2lzdGVyZWQgOiAxOworCWJvb2wJCQkJd2FrZXVwX2VuIDogMTsKKwli b29sCQkJCXN1c3BlbmRlZCA6IDE7CisJYm9vbAkJCQllbmFibGVkIDogMTsKKworCS8qIEVuZHBv aW50IHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwMDsKKwlzdHJ1Y3QgYXN0 X3ZodWJfZXAJCSplcG5zW0FTVF9WSFVCX05VTV9HRU5fRVBzXTsKKworfTsKKyNkZWZpbmUgdG9f YXN0X2RldihfX2cpIGNvbnRhaW5lcl9vZihfX2csIHN0cnVjdCBhc3Rfdmh1Yl9kZXYsIGdhZGdl dCkKKworLyogUGVyIHZodWIgcG9ydCBzdGF0ZWluZm8gc3RydWN0dXJlICovCitzdHJ1Y3QgYXN0 X3ZodWJfcG9ydCB7CisJLyogUG9ydCBzdGF0dXMgJiBzdGF0dXMgY2hhbmdlIHJlZ2lzdGVycyAq LworCXUxNgkJCXN0YXR1czsKKwl1MTYJCQljaGFuZ2U7CisKKwkvKiBBc3NvY2lhdGVkIGRldmlj ZSBzbG90ICovCisJc3RydWN0IGFzdF92aHViX2RldglkZXY7Cit9OworCisvKiBHbG9iYWwgdmh1 YiBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhc3Rfdmh1YiB7CisJc3RydWN0IHBsYXRmb3JtX2Rldmlj ZQkJKnBkZXY7CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisJaW50CQkJCWlycTsKKwlzcGlubG9j a190CQkJbG9jazsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdha2Vfd29yazsKKwlzdHJ1Y3QgY2xr CQkJKmNsazsKKworCS8qIEVQMCBETUEgYnVmZmVycyBhbGxvY2F0ZWQgaW4gb25lIGNodW5rICov CisJdm9pZAkJCQkqZXAwX2J1ZnM7CisJZG1hX2FkZHJfdAkJCWVwMF9idWZzX2RtYTsKKworCS8q IEVQMCBvZiB0aGUgdmh1YiBpdHNlbGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwMDsKKwor CS8qIFN0YXRlIG9mIHZodWIgZXAxICovCisJYm9vbAkJCQllcDFfc3RhbGxlZCA6IDE7CisKKwkv KiBQZXItcG9ydCBpbmZvICovCisJc3RydWN0IGFzdF92aHViX3BvcnQJCXBvcnRzW0FTVF9WSFVC X05VTV9QT1JUU107CisKKwkvKiBHZW5lcmljIEVQIGRhdGEgc3RydWN0dXJlcyAqLworCXN0cnVj dCBhc3Rfdmh1Yl9lcAkJZXBuc1tBU1RfVkhVQl9OVU1fR0VOX0VQc107CisKKwkvKiBVcHN0cmVh bSBidXMgaXMgc3VzcGVuZGVkID8gKi8KKwlib29sCQkJCXN1c3BlbmRlZCA6IDE7CisKKwkvKiBI dWIgaXRzZWxmIGNhbiBzaWduYWwgcmVtb3RlIHdha2V1cCAqLworCWJvb2wJCQkJd2FrZXVwX2Vu IDogMTsKKworCS8qIEZvcmNlIGZ1bGwgc3BlZWQgb25seSAqLworCWJvb2wJCQkJZm9yY2VfdXNi MSA6IDE7CisKKwkvKiBVcHN0cmVhbSBidXMgc3BlZWQgY2FwdHVyZWQgYXQgYnVzIHJlc2V0ICov CisJdW5zaWduZWQgaW50CQkJc3BlZWQ7Cit9OworCisvKiBTdGFuZGFyZCByZXF1ZXN0IGhhbmRs ZXJzIHJlc3VsdCBjb2RlcyAqLworZW51bSBzdGRfcmVxX3JjIHsKKwlzdGRfcmVxX3N0YWxsID0g LTEsCS8qIFN0YWxsIHJlcXVlc3RlZCAqLworCXN0ZF9yZXFfY29tcGxldGUgPSAwLAkvKiBSZXF1 ZXN0IGNvbXBsZXRlZCB3aXRoIG5vIGRhdGEgKi8KKwlzdGRfcmVxX2RhdGEgPSAxLAkvKiBSZXF1 ZXN0IGNvbXBsZXRlZCB3aXRoIGRhdGEgKi8KKwlzdGRfcmVxX2RyaXZlciA9IDIsCS8qIFBhc3Mg dG8gZHJpdmVyIHBscyAqLworfTsKKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX1ZFUkJPU0UK KyNkZWZpbmUgVURDVkRCRyh1LCBmbXQuLi4pCWRldl9kYmcoJih1KS0+cGRldi0+ZGV2LCBmbXQp CisKKyNkZWZpbmUgRVBWREJHKGVwLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJnKCYoZXAp LT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXM6RVAlZCAiIGZtdCwJCQkJXAorCQkoZXApLT5k ZXYgPyAoZXApLT5kZXYtPm5hbWUgOiAiaHViIiwJXAorCQkoZXApLT5kX2lkeCwgIyNfX1ZBX0FS R1NfXyk7CQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIERWREJHKGQsIGZtdCwgLi4uKQlkbyB7 CQkJXAorCWRldl9kYmcoJihkKS0+dmh1Yi0+cGRldi0+ZGV2LAkJCVwKKwkJIiVzICIgZm10LCAo ZCktPm5hbWUsCQkJXAorCQkjI19fVkFfQVJHU19fKTsJCQkJXAorCX0gd2hpbGUoMCkKKworI2Vs c2UKKyNkZWZpbmUgVURDVkRCRyh1LCBmbXQuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBF UFZEQkcoZXAsIGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRFZEQkcoZCwgZm10 LCAuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdF VF9ERUJVRworI2RlZmluZSBVRENEQkcodSwgZm10Li4uKQlkZXZfZGJnKCYodSktPnBkZXYtPmRl diwgZm10KQorCisjZGVmaW5lIEVQREJHKGVwLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJn KCYoZXApLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXM6RVAlZCAiIGZtdCwJCQkJXAorCQko ZXApLT5kZXYgPyAoZXApLT5kZXYtPm5hbWUgOiAiaHViIiwJXAorCQkoZXApLT5kX2lkeCwgIyNf X1ZBX0FSR1NfXyk7CQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIEREQkcoZCwgZm10LCAuLi4p CWRvIHsJCQlcCisJZGV2X2RiZygmKGQpLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXMgIiBm bXQsIChkKS0+bmFtZSwJCQlcCisJCSMjX19WQV9BUkdTX18pOwkJCQlcCisJfSB3aGlsZSgwKQor I2Vsc2UKKyNkZWZpbmUgVURDREJHKHUsIGZtdC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5l IEVQREJHKGVwLCBmbXQsIC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEREQkcoZCwgZm10 LCAuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIGNvcmUuYyAqLwordm9pZCBhc3Rf dmh1Yl9kb25lKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJl cSwKKwkJICAgaW50IHN0YXR1cyk7Cit2b2lkIGFzdF92aHViX251a2Uoc3RydWN0IGFzdF92aHVi X2VwICplcCwgaW50IHN0YXR1cyk7CitzdHJ1Y3QgdXNiX3JlcXVlc3QgKmFzdF92aHViX2FsbG9j X3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwX2ZsYWdzKTsK K3ZvaWQgYXN0X3ZodWJfZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKnVfZXAsIHN0cnVjdCB1 c2JfcmVxdWVzdCAqdV9yZXEpOwordm9pZCBhc3Rfdmh1Yl9pbml0X2h3KHN0cnVjdCBhc3Rfdmh1 YiAqdmh1Yik7CisKKy8qIGVwMC5jICovCit2b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfYWNrKHN0 cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGJvb2wgaW5fYWNrKTsKK3ZvaWQgYXN0X3ZodWJfZXAwX2hh bmRsZV9zZXR1cChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKTsKK3ZvaWQgYXN0X3ZodWJfaW5pdF9l cDAoc3RydWN0IGFzdF92aHViICp2aHViLCBzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkgICAg ICAgc3RydWN0IGFzdF92aHViX2RldiAqZGV2KTsKK2ludCBhc3Rfdmh1Yl9yZXBseShzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmVwLCBjaGFyICpwdHIsIGludCBsZW4pOworaW50IF9fYXN0X3ZodWJfc2lt cGxlX3JlcGx5KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBsZW4sIC4uLik7CisjZGVmaW5l IGFzdF92aHViX3NpbXBsZV9yZXBseSh1ZGMsIC4uLikJCQkJCSAgICAgICBcCisJX19hc3Rfdmh1 Yl9zaW1wbGVfcmVwbHkoKHVkYyksCQkJCQkgICAgICAgXAorCQkJICAgICAgIHNpemVvZigodThb XSkgeyBfX1ZBX0FSR1NfXyB9KS9zaXplb2YodTgpLCAgICAgIFwKKwkJCSAgICAgICBfX1ZBX0FS R1NfXykKKworLyogaHViLmMgKi8KK3ZvaWQgYXN0X3ZodWJfaW5pdF9odWIoc3RydWN0IGFzdF92 aHViICp2aHViKTsKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3Qoc3Ry dWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSk7 CitlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfY2xhc3NfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92 aHViX2VwICplcCwKKwkJCQkJICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsKK3ZvaWQg YXN0X3ZodWJfZGV2aWNlX2Nvbm5lY3Qoc3RydWN0IGFzdF92aHViICp2aHViLCB1bnNpZ25lZCBp bnQgcG9ydCwKKwkJCSAgICAgYm9vbCBvbik7Cit2b2lkIGFzdF92aHViX2h1Yl9zdXNwZW5kKHN0 cnVjdCBhc3Rfdmh1YiAqdmh1Yik7Cit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUoc3RydWN0IGFz dF92aHViICp2aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAq dmh1Yik7Cit2b2lkIGFzdF92aHViX2h1Yl93YWtlX2FsbChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIp OworCisvKiBkZXYuYyAqLworaW50IGFzdF92aHViX2luaXRfZGV2KHN0cnVjdCBhc3Rfdmh1YiAq dmh1YiwgdW5zaWduZWQgaW50IGlkeCk7Cit2b2lkIGFzdF92aHViX2RlbF9kZXYoc3RydWN0IGFz dF92aHViX2RldiAqZCk7Cit2b2lkIGFzdF92aHViX2Rldl9pcnEoc3RydWN0IGFzdF92aHViX2Rl diAqZCk7CitpbnQgYXN0X3ZodWJfc3RkX2Rldl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAq ZXAsCisJCQkgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSk7CisKKy8qIGVwbi5jICov Cit2b2lkIGFzdF92aHViX2Vwbl9hY2tfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOwordm9p ZCBhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOworc3Ry dWN0IGFzdF92aHViX2VwICphc3Rfdmh1Yl9hbGxvY19lcG4oc3RydWN0IGFzdF92aHViX2RldiAq ZCwgdTggYWRkcik7Cit2b2lkIGFzdF92aHViX2Rldl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1Yl9k ZXYgKmQpOwordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzdW1lKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQp Owordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzZXQoc3RydWN0IGFzdF92aHViX2RldiAqZCk7CisKKyNl bmRpZiAvKiBfX0FTUEVFRF9WSFVCX0ggKi8K