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: [v9,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180502063311.535-2-benh@kernel.crashing.org> Date: Wed, 2 May 2018 16:33:11 +1000 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 amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjkuIC0g Rml4IGxvY2sgcmVjdXJzaW9uIGlzc3VlcyB3aGVuIHJlcGx5aW5nIHRvIHN0YW5kYXJkIFNFVFVQ CiAgICAgIHBhY2tldHMKICAgIC0gRml4IGxpZmV0aW1lIG9mIHRoZSBwb3J0X2RldiBzdHJ1Y3Qg ZGV2aWNlCgp2OC4gLSBSZXdvcmsgYXN0X3ZodWJfcmVwX2Rlc2MoKSB0byBhdm9pZCBpbmNvcnJl Y3QgYnVpbHQgZXJyb3IKICAgICAgd2hlbiBmb3J0aWZ5IGlzIGVuYWJsZWQKICAgIC0gUmV3b3Jr IGFzdF92aHViX3JlcF9zdHJpbmcoKSB0byB1c2UgdXNiX2dhZGdldF9nZXRfc3RyaW5nKCkKICAg ICAgaW5zdGVhZCBvZiBhIGxvY2FsIGNvcHkgb2YgYXNjaWkyZGVzYwogICAgLSBXaGl0ZXNwYWNl IGZpeGVzCgp2Ny4gLSBGaXggT0YgbWF0Y2ggbGlzdAogICAgLSBSZW1vdmUgdW51c2VkIHZhcmlh YmxlIGluIGh1YiBjb2RlCgp2Ni4gLSBGaXggYnVnIHdpdGggMC1sZW5ndGggcGFja2V0cyBvbiBJ TiBlbmRwb2ludHMgaW4gZGVzYyBtb2RlCgp2NS4gLSBSZW1vdmUgI2lmZGVmJ3MgYW5kIGhhcmQg Y29kZWQgdmFsdWVzCiAgICAtIFJlbW92ZSBtb2R1bGUgcGFyYW1ldGVycwogICAgLSBIb25vciBt YXhpbXVtIHNwZWVkIGRldmljZS10cmVlIHByb3BlcnR5CiAgICAtIFJlbW92ZSB1c2VsZXNzIGxp c3RfZW1wdHkgdGVzdAogICAgLSBDb3NtZXRpYy9zcGFjZXMgZml4ZXMKICAgIC0gQWRkIFNQRFgg bGljZW5jZSBpZGVudGlmaWVycwoKdjQuIC0gRml4IG1pc3NpbmcgdW5sb2NrIGFzdF92aHViX3Vk Y193YWtldXAoKSBlcnJvciBwYXRoCiAgICAtIE1ha2UgImlycSIgc2lnbmVkIHRvIGRlYWwgd2l0 aCBlcnJvciBmcm9tIHBsYXRmb3JtX2dldF9pcnEKICAgIC0gRml4IE1ha2VmaWxlIGZvciBtb2R1 bGUgYnVpbGRzCiAgICAtIEZpeCBhIG1pc3NpbmcgZW5kaWFuIGNvbnZlcnNpb24KCnYzLiAtIFJl YmFzZWQKICAgIC0gQWRkIGNsayBzdHVmZgoKdjIuIC0gQ29zbWV0aWMgZml4ZXMKICAgIC0gUHJv cGVybHkgImFsbG9jYXRlIiBkZXZpY2UgYWRkcmVzc2VzIGluc3RlYWQgb2YgdXNpbmcgYSBuZXZl cgogICAgICByZXNldCBjb3VudGVyCiAgICAtIE1vdmUgLmR0c2kgdXBkYXRlcyB0byBhIGRpZmZl cmVudCBwYXRjaAoKZm9vCi0tLQogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAgICAg ICAgICAgICB8ICAgMiArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlICAgICAgICAg ICAgIHwgICAxICsKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZyAg fCAgIDcgKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZSB8ICAg NCArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYyAgIHwgNDI1ICsr KysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMgICAgfCA1 ODkgKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXAw LmMgICAgfCA0ODYgKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvZXBuLmMgICAgfCA4NDMgKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvaHViLmMgICAgfCA4MTkgKysrKysrKysrKysrKysrKysrKwogZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmggICB8IDUxNCArKysrKysrKysr KysKIDEwIGZpbGVzIGNoYW5nZWQsIDM2OTAgaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUu YwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIv ZGV2LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12 aHViL2VwMC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3Bl ZWQtdmh1Yi9lcG4uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMv YXNwZWVkLXZodWIvaHViLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQv dWRjL2FzcGVlZC12aHViL3ZodWIuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91 ZGMvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwppbmRleCAwODc1ZDM4 NDc2ZWUuLmI4MzhjYWVhYWFhMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9L Y29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwpAQCAtNDM4LDYgKzQz OCw4IEBAIGNvbmZpZyBVU0JfR0FER0VUX1hJTElOWAogCSAgZHluYW1pY2FsbHkgbGlua2VkIG1v ZHVsZSBjYWxsZWQgInVkYy14aWxpbngiIGFuZCBmb3JjZSBhbGwKIAkgIGdhZGdldCBkcml2ZXJz IHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgogCitzb3VyY2UgImRyaXZlcnMvdXNiL2dh ZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZyIKKwogIwogIyBMQVNUIC0tIGR1bW15L2VtdWxh dGVkIGNvbnRyb2xsZXIKICMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFr ZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlCmluZGV4IGNlODY1YjEyOWZk Ni4uODk3ZjY0OGYzY2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2Vm aWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUKQEAgLTM5LDQgKzM5LDUg QEAgb2JqLSQoQ09ORklHX1VTQl9NVl9VM0QpCSs9IG12X3UzZF9jb3JlLm8KIG9iai0kKENPTkZJ R19VU0JfR1JfVURDKQkrPSBncl91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9HQURHRVRfWElMSU5Y KQkrPSB1ZGMteGlsaW54Lm8KIG9iai0kKENPTkZJR19VU0JfU05QX1VEQ19QTEFUKSArPSBzbnBz X3VkY19wbGF0Lm8KK29iai0kKENPTkZJR19VU0JfQVNQRUVEX1ZIVUIpCSs9IGFzcGVlZC12aHVi Lwogb2JqLSQoQ09ORklHX1VTQl9CRENfVURDKQkrPSBiZGMvCmRpZmYgLS1naXQgYS9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQv dWRjL2FzcGVlZC12aHViL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi5mMGNkZjg5Yjg1MDMKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcKQEAgLTAsMCArMSw3IEBACisjIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wKworY29uZmlnIFVTQl9BU1BFRURfVkhVQgorCXRyaXN0YXRl ICJBc3BlZWQgdkh1YiBVREMgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9BU1BFRUQgfHwgQ09N UElMRV9URVNUCisJaGVscAorCSAgVVNCIHBlcmlwaGVyYWwgY29udHJvbGxlciBmb3IgdGhlIEFz cGVlZCBBU1QyNTAwIGZhbWlseQorCSAgU29DcyBzdXBwb3J0aW5nIHRoZSAidkh1YiIgZnVuY3Rp b25hbGl0eSBhbmQgVVNCMi4wCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9N YWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjlmM2FkZDYw NWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvTWFrZWZpbGUKQEAgLTAsMCArMSw0IEBACisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBH UEwtMi4wKworb2JqLSQoQ09ORklHX1VTQl9BU1BFRURfVkhVQikJKz0gYXNwZWVkLXZodWIubwor YXNwZWVkLXZodWIteQk6PSBjb3JlLm8gZXAwLm8gZXBuLm8gZGV2Lm8gaHViLm8KKwpkaWZmIC0t Z2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMgYi9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMDAuLmRiMzYyOGJlMzhjMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZl cnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvY29yZS5jCkBAIC0wLDAgKzEsNDI1IEBACisv LyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKKy8qCisgKiBhc3BlZWQtdmh1YiAt LSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIiIFVTQiBnYWRnZXQKKyAqCisgKiBjb3JlLmMg LSBUb3AgbGV2ZWwgc3VwcG9ydAorICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlv bgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4 L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bs YXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGlu dXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vy cm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRj aC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQu aD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNp bmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgor CisjaW5jbHVkZSAidmh1Yi5oIgorCit2b2lkIGFzdF92aHViX2RvbmUoc3RydWN0IGFzdF92aHVi X2VwICplcCwgc3RydWN0IGFzdF92aHViX3JlcSAqcmVxLAorCQkgICBpbnQgc3RhdHVzKQorewor CWJvb2wgaW50ZXJuYWwgPSByZXEtPmludGVybmFsOworCisJRVBWREJHKGVwLCAiY29tcGxldGlu ZyByZXF1ZXN0IEAlcCwgc3RhdHVzICVkXG4iLCByZXEsIHN0YXR1cyk7CisKKwlsaXN0X2RlbF9p bml0KCZyZXEtPnF1ZXVlKTsKKworCWlmIChyZXEtPnJlcS5zdGF0dXMgPT0gLUVJTlBST0dSRVNT KQorCQlyZXEtPnJlcS5zdGF0dXMgPSBzdGF0dXM7CisKKwlpZiAocmVxLT5yZXEuZG1hKSB7CisJ CWlmICghV0FSTl9PTighZXAtPmRldikpCisJCQl1c2JfZ2FkZ2V0X3VubWFwX3JlcXVlc3QoJmVw LT5kZXYtPmdhZGdldCwKKwkJCQkJCSAmcmVxLT5yZXEsIGVwLT5lcG4uaXNfaW4pOworCQlyZXEt PnJlcS5kbWEgPSAwOworCX0KKworCS8qCisJICogSWYgdGhpcyBpc24ndCBhbiBpbnRlcm5hbCBF UDAgcmVxdWVzdCwgY2FsbCB0aGUgY29yZQorCSAqIHRvIGNhbGwgdGhlIGdhZGdldCBjb21wbGV0 aW9uLgorCSAqLworCWlmICghaW50ZXJuYWwpIHsKKwkJc3Bpbl91bmxvY2soJmVwLT52aHViLT5s b2NrKTsKKwkJdXNiX2dhZGdldF9naXZlYmFja19yZXF1ZXN0KCZlcC0+ZXAsICZyZXEtPnJlcSk7 CisJCXNwaW5fbG9jaygmZXAtPnZodWItPmxvY2spOworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9u dWtlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBzdGF0dXMpCit7CisJc3RydWN0IGFzdF92 aHViX3JlcSAqcmVxOworCisJRVBEQkcoZXAsICJOdWtpbmdcbiIpOworCisJLyogQmV3YXJlLCBs b2NrIHdpbGwgYmUgZHJvcHBlZCAmIHJlcS1hY3F1aXJlZCBieSBkb25lKCkgKi8KKwl3aGlsZSAo IWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJcmVxID0gbGlzdF9maXJzdF9lbnRyeSgmZXAt PnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisJCWFzdF92aHViX2RvbmUoZXAs IHJlcSwgc3RhdHVzKTsKKwl9Cit9CisKK3N0cnVjdCB1c2JfcmVxdWVzdCAqYXN0X3ZodWJfYWxs b2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1X2VwLAorCQkJCQkgICBnZnBfdCBnZnBfZmxhZ3Mp Cit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCisJcmVxID0ga3phbGxvYyhzaXplb2Yo KnJlcSksIGdmcF9mbGFncyk7CisJaWYgKCFyZXEpCisJCXJldHVybiBOVUxMOworCXJldHVybiAm cmVxLT5yZXE7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAg KnVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEpCit7CisJc3RydWN0IGFzdF92aHViX3Jl cSAqcmVxID0gdG9fYXN0X3JlcSh1X3JlcSk7CisKKwlrZnJlZShyZXEpOworfQorCitzdGF0aWMg aXJxcmV0dXJuX3QgYXN0X3ZodWJfaXJxKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0 IGFzdF92aHViICp2aHViID0gZGF0YTsKKwlpcnFyZXR1cm5fdCBpcmV0ID0gSVJRX05PTkU7CisJ dTMyIGlzdGF0OworCisJLyogU3RhbGUgaW50ZXJydXB0IHdoaWxlIHRlYXJpbmcgZG93biAqLwor CWlmICghdmh1Yi0+ZXAwX2J1ZnMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygm dmh1Yi0+bG9jayk7CisKKwkvKiBSZWFkIGFuZCBBQ0sgaW50ZXJydXB0cyAqLworCWlzdGF0ID0g cmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisJaWYgKCFpc3RhdCkKKwkJZ290byBi YWlsOworCXdyaXRlbChpc3RhdCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisJaXJldCA9 IElSUV9IQU5ETEVEOworCisJVURDVkRCRyh2aHViLCAiaXJxIHN0YXR1cz0lMDh4LCBlcF9hY2tz PSUwOHggZXBfbmFja3M9JTA4eFxuIiwKKwkgICAgICAgaXN0YXQsCisJICAgICAgIHJlYWRsKHZo dWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKSwKKwkgICAgICAgcmVhZGwodmh1Yi0+cmVn cyArIEFTVF9WSFVCX0VQX05BQ0tfSVNSKSk7CisKKwkvKiBIYW5kbGUgZ2VuZXJpYyBFUHMgZmly c3QgKi8KKwlpZiAoaXN0YXQgJiBWSFVCX0lSUV9FUF9QT09MX0FDS19TVEFMTCkgeworCQl1MzIg aSwgZXBfYWNrcyA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKwkJ d3JpdGVsKGVwX2Fja3MsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKworCQlm b3IgKGkgPSAwOyBlcF9hY2tzICYmIGkgPCBBU1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKSB7CisJ CQl1MzIgbWFzayA9IFZIVUJfRVBfSVJRKGkpOworCQkJaWYgKGVwX2Fja3MgJiBtYXNrKSB7CisJ CQkJYXN0X3ZodWJfZXBuX2Fja19pcnEoJnZodWItPmVwbnNbaV0pOworCQkJCWVwX2Fja3MgJj0g fm1hc2s7CisJCQl9CisJCX0KKwl9CisKKwkvKiBIYW5kbGUgZGV2aWNlIGludGVycnVwdHMgKi8K KwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfREVWSUNFMSB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNF MiB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNFMyB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNFNCB8 CisJCSAgICAgVkhVQl9JUlFfREVWSUNFNSkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVW SUNFMSkKKwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzBdLmRldik7CisJCWlmIChp c3RhdCAmIFZIVUJfSVJRX0RFVklDRTIpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0 c1sxXS5kZXYpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UzKQorCQkJYXN0X3ZodWJf ZGV2X2lycSgmdmh1Yi0+cG9ydHNbMl0uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVW SUNFNCkKKwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzNdLmRldik7CisJCWlmIChp c3RhdCAmIFZIVUJfSVJRX0RFVklDRTUpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0 c1s0XS5kZXYpOworCX0KKworCS8qIEhhbmRsZSB0b3AtbGV2ZWwgdkh1YiBFUDAgaW50ZXJydXB0 cyAqLworCWlmIChpc3RhdCAmIChWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwgfAorCQkg ICAgIFZIVUJfSVJRX0hVQl9FUDBfSU5fQUNLX1NUQUxMIHwKKwkJICAgICBWSFVCX0lSUV9IVUJf RVAwX1NFVFVQKSkgeworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFM TCkKKwkJCWFzdF92aHViX2VwMF9oYW5kbGVfYWNrKCZ2aHViLT5lcDAsIHRydWUpOworCQlpZiAo aXN0YXQgJiBWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwpCisJCQlhc3Rfdmh1Yl9lcDBf aGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCBmYWxzZSk7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0hV Ql9FUDBfU0VUVVApCisJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX3NldHVwKCZ2aHViLT5lcDApOwor CX0KKworCS8qIFZhcmlvdXMgdG9wIGxldmVsIGJ1cyBldmVudHMgKi8KKwlpZiAoaXN0YXQgJiAo VkhVQl9JUlFfQlVTX1JFU1VNRSB8CisJCSAgICAgVkhVQl9JUlFfQlVTX1NVU1BFTkQgfAorCQkg ICAgIFZIVUJfSVJRX0JVU19SRVNFVCkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfQlVTX1JF U1VNRSkKKwkJCWFzdF92aHViX2h1Yl9yZXN1bWUodmh1Yik7CisJCWlmIChpc3RhdCAmIFZIVUJf SVJRX0JVU19TVVNQRU5EKQorCQkJYXN0X3ZodWJfaHViX3N1c3BlbmQodmh1Yik7CisJCWlmIChp c3RhdCAmIFZIVUJfSVJRX0JVU19SRVNFVCkKKwkJCWFzdF92aHViX2h1Yl9yZXNldCh2aHViKTsK Kwl9CisKKyBiYWlsOgorCXNwaW5fdW5sb2NrKCZ2aHViLT5sb2NrKTsKKwlyZXR1cm4gaXJldDsK K30KKwordm9pZCBhc3Rfdmh1Yl9pbml0X2h3KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1 MzIgY3RybDsKKworCVVEQ0RCRyh2aHViLCIoUmUpU3RhcnRpbmcgSFcgLi4uXG4iKTsKKworCS8q IEVuYWJsZSBQSFkgKi8KKwljdHJsID0gVkhVQl9DVFJMX1BIWV9DTEsgfAorCQlWSFVCX0NUUkxf UEhZX1JFU0VUX0RJUzsKKworICAgICAgIC8qCisJKiBXZSBkbyAqTk9UKiBzZXQgdGhlIFZIVUJf Q1RSTF9DTEtfU1RPUF9TVVNQRU5EIGJpdAorCSogdG8gc3RvcCB0aGUgbG9naWMgY2xvY2sgZHVy aW5nIHN1c3BlbmQgYmVjYXVzZQorCSogaXQgY2F1c2VzIHRoZSByZWdpc3RlcnMgdG8gYmVjb21l IGluYWNjZXNzaWJsZSBhbmQKKwkqIHdlIGhhdmVuJ3QgeWV0IGZpZ3VyZWQgb3V0IGEgZ29vZCB3 YXl0IHRvIGJyaW5nIHRoZQorCSogY29udHJvbGxlciBiYWNrIGludG8gbGlmZSB0byBpc3N1ZSBh IHdha2V1cC4KKwkqLworCisJLyoKKwkgKiBTZXQgc29tZSBJU08gJiBzcGxpdCBjb250cm9sIGJp dHMgYWNjb3JkaW5nIHRvIEFzcGVlZAorCSAqIHJlY29tbWVuZGF0aW9uCisJICoKKwkgKiBWSFVC X0NUUkxfSVNPX1JTUF9DVFJMOiBXaGVuIHNldCB0ZWxscyB0aGUgSFcgdG8gcmVzcG9uZAorCSAq IHdpdGggMCBieXRlcyBkYXRhIHBhY2tldCB0byBJU08gSU4gZW5kcG9pbnRzIHdoZW4gbm8gZGF0 YQorCSAqIGlzIGF2YWlsYWJsZS4KKwkgKgorCSAqIFZIVUJfQ1RSTF9TUExJVF9JTjogVGhpcyBt YWtlcyBhIFNPRiBjb21wbGV0ZSBhIHNwbGl0IElOCisJICogdHJhbnNhY3Rpb24uCisJICovCisJ Y3RybCB8PSBWSFVCX0NUUkxfSVNPX1JTUF9DVFJMIHwgVkhVQl9DVFJMX1NQTElUX0lOOworCXdy aXRlbChjdHJsLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisJdWRlbGF5KDEpOworCisJ LyogU2V0IGRlc2NyaXB0b3IgcmluZyBzaXplICovCisJaWYgKEFTVF9WSFVCX0RFU0NTX0NPVU5U ID09IDI1NikgeworCQljdHJsIHw9IFZIVUJfQ1RSTF9MT05HX0RFU0M7CisJCXdyaXRlbChjdHJs LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisJfSBlbHNlIHsKKwkJQlVJTERfQlVHX09O KEFTVF9WSFVCX0RFU0NTX0NPVU5UICE9IDMyKTsKKwl9CisKKwkvKiBSZXNldCBhbGwgZGV2aWNl cyAqLworCXdyaXRlbChWSFVCX1NXX1JFU0VUX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX1NX X1JFU0VUKTsKKwl1ZGVsYXkoMSk7CisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9T V19SRVNFVCk7CisKKwkvKiBEaXNhYmxlIGFuZCBjbGVhbnVwIEVQIEFDSy9OQUNLIGludGVycnVw dHMgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JRVIpOworCXdy aXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19JRVIpOworCXdyaXRlbChWSFVC X0VQX0lSUV9BTEwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKwl3cml0ZWwo VkhVQl9FUF9JUlFfQUxMLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19JU1IpOworCisJ LyogRGVmYXVsdCBzZXR0aW5ncyBmb3IgRVAwLCBlbmFibGUgSFcgaHViIEVQMSAqLworCXdyaXRl bCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAwX0NUUkwpOworCXdyaXRlbChWSFVCX0VQMV9D VFJMX1JFU0VUX1RPR0dMRSB8CisJICAgICAgIFZIVUJfRVAxX0NUUkxfRU5BQkxFLAorCSAgICAg ICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NUUkwpOworCXdyaXRlbCgwLCB2aHViLT5yZWdz ICsgQVNUX1ZIVUJfRVAxX1NUU19DSEcpOworCisJLyogQ29uZmlndXJlIEVQMCBETUEgYnVmZmVy ICovCisJd3JpdGVsKHZodWItPmVwMC5idWZfZG1hLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAw X0RBVEEpOworCisJLyogQ2xlYXIgYWRkcmVzcyAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsg QVNUX1ZIVUJfQ09ORik7CisKKwkvKiBQdWxsdXAgaHViIChhY3RpdmF0ZSBvbiBob3N0KSAqLwor CWlmICh2aHViLT5mb3JjZV91c2IxKQorCQljdHJsIHw9IFZIVUJfQ1RSTF9GVUxMX1NQRUVEX09O TFk7CisKKwljdHJsIHw9IFZIVUJfQ1RSTF9VUFNUUkVBTV9DT05ORUNUOworCXdyaXRlbChjdHJs LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisKKwkvKiBFbmFibGUgc29tZSBpbnRlcnJ1 cHRzICovCisJd3JpdGVsKFZIVUJfSVJRX0hVQl9FUDBfSU5fQUNLX1NUQUxMIHwKKwkgICAgICAg VkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMIHwKKwkgICAgICAgVkhVQl9JUlFfSFVCX0VQ MF9TRVRVUCB8CisJICAgICAgIFZIVUJfSVJRX0VQX1BPT0xfQUNLX1NUQUxMIHwKKwkgICAgICAg VkhVQl9JUlFfQlVTX1JFU1VNRSB8CisJICAgICAgIFZIVUJfSVJRX0JVU19TVVNQRU5EIHwKKwkg ICAgICAgVkhVQl9JUlFfQlVTX1JFU0VULAorCSAgICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJf SUVSKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rl dmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBwbGF0Zm9ybV9nZXRfZHJ2 ZGF0YShwZGV2KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJaWYgKCF2aHVi IHx8ICF2aHViLT5yZWdzKQorCQlyZXR1cm4gMDsKKworCS8qIFJlbW92ZSBkZXZpY2VzICovCisJ Zm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9QT1JUUzsgaSsrKQorCQlhc3Rfdmh1Yl9kZWxf ZGV2KCZ2aHViLT5wb3J0c1tpXS5kZXYpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxv Y2ssIGZsYWdzKTsKKworCS8qIE1hc2sgJiBhY2sgYWxsIGludGVycnVwdHMgICovCisJd3JpdGVs KDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworCXdyaXRlbChWSFVCX0lSUV9BQ0tfQUxM LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSVNSKTsKKworCS8qIFB1bGwgZGV2aWNlLCBsZWF2ZSBQ SFkgZW5hYmxlZCAqLworCXdyaXRlbChWSFVCX0NUUkxfUEhZX0NMSyB8CisJICAgICAgIFZIVUJf Q1RSTF9QSFlfUkVTRVRfRElTLAorCSAgICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7 CisKKwlpZiAodmh1Yi0+Y2xrKQorCQljbGtfZGlzYWJsZV91bnByZXBhcmUodmh1Yi0+Y2xrKTsK KworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCWlmICh2 aHViLT5lcDBfYnVmcykKKwkJZG1hX2ZyZWVfY29oZXJlbnQoJnBkZXYtPmRldiwKKwkJCQkgIEFT VF9WSFVCX0VQMF9NQVhfUEFDS0VUICoKKwkJCQkgIChBU1RfVkhVQl9OVU1fUE9SVFMgKyAxKSwK KwkJCQkgIHZodWItPmVwMF9idWZzLAorCQkJCSAgdmh1Yi0+ZXAwX2J1ZnNfZG1hKTsKKwl2aHVi LT5lcDBfYnVmcyA9IE5VTEw7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1 Yl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCWVudW0gdXNiX2Rldmlj ZV9zcGVlZCBtYXhfc3BlZWQ7CisJc3RydWN0IGFzdF92aHViICp2aHViOworCXN0cnVjdCByZXNv dXJjZSAqcmVzOworCWludCBpLCByYyA9IDA7CisKKwl2aHViID0gZGV2bV9remFsbG9jKCZwZGV2 LT5kZXYsIHNpemVvZigqdmh1YiksIEdGUF9LRVJORUwpOworCWlmICghdmh1YikKKwkJcmV0dXJu IC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmdmh1Yi0+bG9jayk7CisJdmh1Yi0+cGRldiA9 IHBkZXY7CisKKwlyZXMgPSBwbGF0Zm9ybV9nZXRfcmVzb3VyY2UocGRldiwgSU9SRVNPVVJDRV9N RU0sIDApOworCXZodWItPnJlZ3MgPSBkZXZtX2lvcmVtYXBfcmVzb3VyY2UoJnBkZXYtPmRldiwg cmVzKTsKKwlpZiAoSVNfRVJSKHZodWItPnJlZ3MpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwg IkZhaWxlZCB0byBtYXAgcmVzb3VyY2VzXG4iKTsKKwkJcmV0dXJuIFBUUl9FUlIodmh1Yi0+cmVn cyk7CisJfQorCVVEQ0RCRyh2aHViLCAidkh1YkAlcFIgbWFwcGVkIEAlcFxuIiwgcmVzLCB2aHVi LT5yZWdzKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIHZodWIpOworCisJdmh1Yi0+ Y2xrID0gZGV2bV9jbGtfZ2V0KCZwZGV2LT5kZXYsIE5VTEwpOworCWlmIChJU19FUlIodmh1Yi0+ Y2xrKSkgeworCQlyYyA9IFBUUl9FUlIodmh1Yi0+Y2xrKTsKKwkJZ290byBlcnI7CisJfQorCXJj ID0gY2xrX3ByZXBhcmVfZW5hYmxlKHZodWItPmNsayk7CisJaWYgKHJjKSB7CisJCWRldl9lcnIo JnBkZXYtPmRldiwgIkVycm9yIGNvdWxkbid0IGVuYWJsZSBjbG9jayAoJWQpXG4iLCByYyk7CisJ CWdvdG8gZXJyOworCX0KKworCS8qIENoZWNrIGlmIHdlIG5lZWQgdG8gbGltaXQgdGhlIEhXIHRv IFVTQjEgKi8KKwltYXhfc3BlZWQgPSB1c2JfZ2V0X21heGltdW1fc3BlZWQoJnBkZXYtPmRldik7 CisJaWYgKG1heF9zcGVlZCAhPSBVU0JfU1BFRURfVU5LTk9XTiAmJiBtYXhfc3BlZWQgPCBVU0Jf U1BFRURfSElHSCkKKwkJdmh1Yi0+Zm9yY2VfdXNiMSA9IHRydWU7CisKKwkvKiBNYXNrICYgYWNr IGFsbCBpbnRlcnJ1cHRzIGJlZm9yZSBpbnN0YWxsaW5nIHRoZSBoYW5kbGVyICovCisJd3JpdGVs KDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworCXdyaXRlbChWSFVCX0lSUV9BQ0tfQUxM LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSVNSKTsKKworCS8qIEZpbmQgaW50ZXJydXB0IGFuZCBp bnN0YWxsIGhhbmRsZXIgKi8KKwl2aHViLT5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDAp OworCWlmICh2aHViLT5pcnEgPCAwKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0 byBnZXQgaW50ZXJydXB0XG4iKTsKKwkJcmMgPSB2aHViLT5pcnE7CisJCWdvdG8gZXJyOworCX0K KwlyYyA9IGRldm1fcmVxdWVzdF9pcnEoJnBkZXYtPmRldiwgdmh1Yi0+aXJxLCBhc3Rfdmh1Yl9p cnEsIDAsCisJCQkgICAgICBLQlVJTERfTU9ETkFNRSwgdmh1Yik7CisJaWYgKHJjKSB7CisJCWRl dl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byByZXF1ZXN0IGludGVycnVwdFxuIik7CisJCWdv dG8gZXJyOworCX0KKworCS8qCisJICogQWxsb2NhdGUgRE1BIGJ1ZmZlcnMgZm9yIGFsbCBFUDBz IGluIG9uZSBjaHVuaywKKwkgKiBvbmUgcGVyIHBvcnQgYW5kIG9uZSBmb3IgdGhlIHZIdWIgaXRz ZWxmCisJICovCisJdmh1Yi0+ZXAwX2J1ZnMgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnBkZXYtPmRl diwKKwkJCQkJICAgIEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUICoKKwkJCQkJICAgIChBU1RfVkhV Ql9OVU1fUE9SVFMgKyAxKSwKKwkJCQkJICAgICZ2aHViLT5lcDBfYnVmc19kbWEsIEdGUF9LRVJO RUwpOworCWlmICghdmh1Yi0+ZXAwX2J1ZnMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFp bGVkIHRvIGFsbG9jYXRlIEVQMCBETUEgYnVmZmVyc1xuIik7CisJCXJjID0gLUVOT01FTTsKKwkJ Z290byBlcnI7CisJfQorCVVEQ1ZEQkcodmh1YiwgIkVQMCBETUEgYnVmZmVycyBAJXAgKERNQSAw eCUwOHgpXG4iLAorCQl2aHViLT5lcDBfYnVmcywgKHUzMil2aHViLT5lcDBfYnVmc19kbWEpOwor CisJLyogSW5pdCB2SHViIEVQMCAqLworCWFzdF92aHViX2luaXRfZXAwKHZodWIsICZ2aHViLT5l cDAsIE5VTEwpOworCisJLyogSW5pdCBkZXZpY2VzICovCisJZm9yIChpID0gMDsgaSA8IEFTVF9W SFVCX05VTV9QT1JUUyAmJiByYyA9PSAwOyBpKyspCisJCXJjID0gYXN0X3ZodWJfaW5pdF9kZXYo dmh1YiwgaSk7CisJaWYgKHJjKQorCQlnb3RvIGVycjsKKworCS8qIEluaXQgaHViIGVtdWxhdGlv biAqLworCWFzdF92aHViX2luaXRfaHViKHZodWIpOworCisJLyogSW5pdGlhbGl6ZSBIVyAqLwor CWFzdF92aHViX2luaXRfaHcodmh1Yik7CisKKwlkZXZfaW5mbygmcGRldi0+ZGV2LCAiSW5pdGlh bGl6ZWQgdmlydHVhbCBodWIgaW4gVVNCJWQgbW9kZVxuIiwKKwkJIHZodWItPmZvcmNlX3VzYjEg PyAxIDogMik7CisKKwlyZXR1cm4gMDsKKyBlcnI6CisJYXN0X3ZodWJfcmVtb3ZlKHBkZXYpOwor CXJldHVybiByYzsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgYXN0X3Zo dWJfZHRfaWRzW10gPSB7CisJeworCQkuY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0MjQwMC11c2It dmh1YiIsCisJfSwKKwl7CisJCS5jb21wYXRpYmxlID0gImFzcGVlZCxhc3QyNTAwLXVzYi12aHVi IiwKKwl9LAorCXsgfQorfTsKK01PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIGFzdF92aHViX2R0X2lk cyk7CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGFzdF92aHViX2RyaXZlciA9IHsK KwkucHJvYmUJCT0gYXN0X3ZodWJfcHJvYmUsCisJLnJlbW92ZQkJPSBhc3Rfdmh1Yl9yZW1vdmUs CisJLmRyaXZlcgkJPSB7CisJCS5uYW1lCT0gS0JVSUxEX01PRE5BTUUsCisJCS5vZl9tYXRjaF90 YWJsZQk9IGFzdF92aHViX2R0X2lkcywKKwl9LAorfTsKK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIo YXN0X3ZodWJfZHJpdmVyKTsKKworTU9EVUxFX0RFU0NSSVBUSU9OKCJBc3BlZWQgdkh1YiB1ZGMg ZHJpdmVyIik7CitNT0RVTEVfQVVUSE9SKCJCZW5qYW1pbiBIZXJyZW5zY2htaWR0IDxiZW5oQGtl cm5lbC5jcmFzaGluZy5vcmc+Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQg YS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jIGIvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMDAuLmYwMjMzOTEyYmFjZQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNi L2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMKQEAgLTAsMCArMSw1ODkgQEAKKy8vIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZl ciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGRldi5jIC0gSW5kaXZp ZHVhbCBkZXZpY2UvZ2FkZ2V0IG1hbmFnZW1lbnQgKGllLCBhIHBvcnQgPSBhIGdhZGdldCkKKyAq CisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0g aXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQor ICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBh cyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2 ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRl ciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxs aW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNs dWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUg PGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4 L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9w cm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9j bGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvb2Yu aD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+ CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4K KyNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CisKKyNpbmNsdWRlICJ2aHViLmgiCisKK3ZvaWQg YXN0X3ZodWJfZGV2X2lycShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCXUzMiBpc3RhdCA9 IHJlYWRsKGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfSVNSKTsKKworCXdyaXRlbChpc3RhdCwgZC0+ cmVncyArIEFTVF9WSFVCX0RFVl9JU1IpOworCisJaWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJRX0VQ MF9JTl9BQ0tfU1RBTEwpCisJCWFzdF92aHViX2VwMF9oYW5kbGVfYWNrKCZkLT5lcDAsIHRydWUp OworCWlmIChpc3RhdCAmIFZIVVZfREVWX0lSUV9FUDBfT1VUX0FDS19TVEFMTCkKKwkJYXN0X3Zo dWJfZXAwX2hhbmRsZV9hY2soJmQtPmVwMCwgZmFsc2UpOworCWlmIChpc3RhdCAmIFZIVVZfREVW X0lSUV9FUDBfU0VUVVApCisJCWFzdF92aHViX2VwMF9oYW5kbGVfc2V0dXAoJmQtPmVwMCk7Cit9 CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Rldl9lbmFibGUoc3RydWN0IGFzdF92aHViX2RldiAq ZCkKK3sKKwl1MzIgcmVnLCBobXNrOworCisJaWYgKGQtPmVuYWJsZWQpCisJCXJldHVybjsKKwor CS8qIEVuYWJsZSBkZXZpY2UgYW5kIGl0cyBFUDAgaW50ZXJydXB0cyAqLworCXJlZyA9IFZIVUJf REVWX0VOX0VOQUJMRV9QT1JUIHwKKwkJVkhVQl9ERVZfRU5fRVAwX0lOX0FDS19JUlFFTiB8CisJ CVZIVUJfREVWX0VOX0VQMF9PVVRfQUNLX0lSUUVOIHwKKwkJVkhVQl9ERVZfRU5fRVAwX1NFVFVQ X0lSUUVOOworCWlmIChkLT5nYWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX0hJR0gpCisJCXJlZyB8 PSBWSFVCX0RFVl9FTl9TUEVFRF9TRUxfSElHSDsKKwl3cml0ZWwocmVnLCBkLT5yZWdzICsgQVNU X1ZIVUJfREVWX0VOX0NUUkwpOworCisJLyogRW5hYmxlIGRldmljZSBpbnRlcnJ1cHQgaW4gdGhl IGh1YiBhcyB3ZWxsICovCisJaG1zayA9IFZIVUJfSVJRX0RFVklDRTEgPDwgZC0+aW5kZXg7CisJ cmVnID0gcmVhZGwoZC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisJcmVnIHw9IGhtc2s7 CisJd3JpdGVsKHJlZywgZC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisKKwkvKiBTZXQg RVAwIERNQSBidWZmZXIgYWRkcmVzcyAqLworCXdyaXRlbChkLT5lcDAuYnVmX2RtYSwgZC0+cmVn cyArIEFTVF9WSFVCX0RFVl9FUDBfREFUQSk7CisKKwlkLT5lbmFibGVkID0gdHJ1ZTsKK30KKwor c3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X2Rpc2FibGUoc3RydWN0IGFzdF92aHViX2RldiAqZCkK K3sKKwl1MzIgcmVnLCBobXNrOworCisJaWYgKCFkLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwkv KiBEaXNhYmxlIGRldmljZSBpbnRlcnJ1cHQgaW4gdGhlIGh1YiAqLworCWhtc2sgPSBWSFVCX0lS UV9ERVZJQ0UxIDw8IGQtPmluZGV4OworCXJlZyA9IHJlYWRsKGQtPnZodWItPnJlZ3MgKyBBU1Rf VkhVQl9JRVIpOworCXJlZyAmPSB+aG1zazsKKwl3cml0ZWwocmVnLCBkLT52aHViLT5yZWdzICsg QVNUX1ZIVUJfSUVSKTsKKworCS8qIFRoZW4gZGlzYWJsZSBkZXZpY2UgKi8KKwl3cml0ZWwoMCwg ZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJMKTsKKwlkLT5nYWRnZXQuc3BlZWQgPSBVU0Jf U1BFRURfVU5LTk9XTjsKKwlkLT5lbmFibGVkID0gZmFsc2U7CisJZC0+c3VzcGVuZGVkID0gZmFs c2U7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZGV2X2ZlYXR1cmUoc3RydWN0IGFzdF92aHVi X2RldiAqZCwKKwkJCQl1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLAorCQkJCWJvb2wgaXNfc2V0KQor eworCUREQkcoZCwgIiVzX0ZFQVRVUkUoZGV2IHZhbD0lMDJ4KVxuIiwKKwkgICAgIGlzX3NldCA/ ICJTRVQiIDogIkNMRUFSIiwgd1ZhbHVlKTsKKworCWlmICh3VmFsdWUgIT0gVVNCX0RFVklDRV9S RU1PVEVfV0FLRVVQKQorCQlyZXR1cm4gc3RkX3JlcV9kcml2ZXI7CisKKwlkLT53YWtldXBfZW4g PSBpc19zZXQ7CisKKwlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKK30KKworc3RhdGljIGludCBh c3Rfdmh1Yl9lcF9mZWF0dXJlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsCisJCQkgICAgICAgdTE2 IHdJbmRleCwgdTE2IHdWYWx1ZSwgYm9vbCBpc19zZXQpCit7CisJc3RydWN0IGFzdF92aHViX2Vw ICplcDsKKwlpbnQgZXBfbnVtOworCisJZXBfbnVtID0gd0luZGV4ICYgVVNCX0VORFBPSU5UX05V TUJFUl9NQVNLOworCUREQkcoZCwgIiVzX0ZFQVRVUkUoZXAlZCB2YWw9JTAyeClcbiIsCisJICAg ICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIGVwX251bSwgd1ZhbHVlKTsKKwlpZiAoZXBfbnVt ID09IDApCisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWlmIChlcF9udW0gPj0gQVNUX1ZI VUJfTlVNX0dFTl9FUHMgfHwgIWQtPmVwbnNbZXBfbnVtIC0gMV0pCisJCXJldHVybiBzdGRfcmVx X3N0YWxsOworCWlmICh3VmFsdWUgIT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCXJldHVybiBzdGRf cmVxX2RyaXZlcjsKKworCWVwID0gZC0+ZXBuc1tlcF9udW0gLSAxXTsKKwlpZiAoV0FSTl9PTigh ZXApKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCWlmICghZXAtPmVwbi5lbmFibGVkIHx8 ICFlcC0+ZXAuZGVzYyB8fCBlcC0+ZXBuLmlzX2lzbyB8fAorCSAgICBlcC0+ZXBuLmlzX2luICE9 ICEhKHdJbmRleCAmIFVTQl9ESVJfSU4pKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCURE QkcoZCwgIiVzIHN0YWxsIG9uIEVQICVkXG4iLAorCSAgICAgaXNfc2V0ID8gInNldHRpbmciIDog ImNsZWFyaW5nIiwgZXBfbnVtKTsKKwllcC0+ZXBuLnN0YWxsZWQgPSBpc19zZXQ7CisJYXN0X3Zo dWJfdXBkYXRlX2Vwbl9zdGFsbChlcCk7CisKKwlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKK30K Kworc3RhdGljIGludCBhc3Rfdmh1Yl9kZXZfc3RhdHVzKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQs CisJCQkgICAgICAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sKKwl1OCBzdDA7CisKKwlEREJH KGQsICJHRVRfU1RBVFVTKGRldilcbiIpOworCisJc3QwID0gZC0+Z2FkZ2V0LmlzX3NlbGZwb3dl cmVkIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEOworCWlmIChkLT53YWtldXBfZW4pCisJCXN0 MCB8PSAxIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDsKKworCXJldHVybiBhc3Rfdmh1Yl9z aW1wbGVfcmVwbHkoJmQtPmVwMCwgc3QwLCAwKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9l cF9zdGF0dXMoc3RydWN0IGFzdF92aHViX2RldiAqZCwKKwkJCSAgICAgIHUxNiB3SW5kZXgsIHUx NiB3VmFsdWUpCit7CisJaW50IGVwX251bSA9IHdJbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJf TUFTSzsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwOworCXU4IHN0MCA9IDA7CisKKwlEREJHKGQs ICJHRVRfU1RBVFVTKGVwJWQpXG4iLCBlcF9udW0pOworCisJaWYgKGVwX251bSA+PSBBU1RfVkhV Ql9OVU1fR0VOX0VQcykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKGVwX251bSAhPSAw KSB7CisJCWVwID0gZC0+ZXBuc1tlcF9udW0gLSAxXTsKKwkJaWYgKCFlcCkKKwkJCXJldHVybiBz dGRfcmVxX3N0YWxsOworCQlpZiAoIWVwLT5lcG4uZW5hYmxlZCB8fCAhZXAtPmVwLmRlc2MgfHwg ZXAtPmVwbi5pc19pc28gfHwKKwkJICAgIGVwLT5lcG4uaXNfaW4gIT0gISEod0luZGV4ICYgVVNC X0RJUl9JTikpCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJaWYgKGVwLT5lcG4uc3RhbGxl ZCkKKwkJCXN0MCB8PSAxIDw8IFVTQl9FTkRQT0lOVF9IQUxUOworCX0KKworCXJldHVybiBhc3Rf dmh1Yl9zaW1wbGVfcmVwbHkoJmQtPmVwMCwgc3QwLCAwKTsKK30KKworc3RhdGljIHZvaWQgYXN0 X3ZodWJfZGV2X3NldF9hZGRyZXNzKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsIHU4IGFkZHIpCit7 CisJdTMyIHJlZzsKKworCUREQkcoZCwgIlNFVF9BRERSRVNTOiBHb3QgYWRkcmVzcyAleFxuIiwg YWRkcik7CisKKwlyZWcgPSByZWFkbChkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwpOwor CXJlZyAmPSB+VkhVQl9ERVZfRU5fQUREUl9NQVNLOworCXJlZyB8PSBWSFVCX0RFVl9FTl9TRVRf QUREUihhZGRyKTsKKwl3cml0ZWwocmVnLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwp OworfQorCitpbnQgYXN0X3ZodWJfc3RkX2Rldl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAq ZXAsCisJCQkgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwlzdHJ1Y3QgYXN0 X3ZodWJfZGV2ICpkID0gZXAtPmRldjsKKwl1MTYgd1ZhbHVlLCB3SW5kZXg7CisKKwkvKiBObyBk cml2ZXIsIHdlIHNob3VsZG4ndCBiZSBlbmFibGVkIC4uLiAqLworCWlmICghZC0+ZHJpdmVyIHx8 ICFkLT5lbmFibGVkIHx8IGQtPnN1c3BlbmRlZCkgeworCQlFUERCRyhlcCwKKwkJICAgICAgIkRl dmljZSBpcyB3cm9uZyBzdGF0ZSBkcml2ZXI9JXAgZW5hYmxlZD0lZCIKKwkJICAgICAgIiBzdXNw ZW5kZWQ9JWRcbiIsCisJCSAgICAgIGQtPmRyaXZlciwgZC0+ZW5hYmxlZCwgZC0+c3VzcGVuZGVk KTsKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJfQorCisJLyogRmlyc3QgcGFja2V0LCBncmFi IHNwZWVkICovCisJaWYgKGQtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgewor CQlkLT5nYWRnZXQuc3BlZWQgPSBlcC0+dmh1Yi0+c3BlZWQ7CisJCWlmIChkLT5nYWRnZXQuc3Bl ZWQgPiBkLT5kcml2ZXItPm1heF9zcGVlZCkKKwkJCWQtPmdhZGdldC5zcGVlZCA9IGQtPmRyaXZl ci0+bWF4X3NwZWVkOworCQlEREJHKGQsICJmaXN0IHBhY2tldCwgY2FwdHVyZWQgc3BlZWQgJWRc biIsCisJCSAgICAgZC0+Z2FkZ2V0LnNwZWVkKTsKKwl9CisKKwl3VmFsdWUgPSBsZTE2X3RvX2Nw dShjcnEtPndWYWx1ZSk7CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCisJ c3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEtPmJSZXF1ZXN0KSB7CisJCS8q IFNFVF9BRERSRVNTICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfQURE UkVTUzoKKwkJYXN0X3ZodWJfZGV2X3NldF9hZGRyZXNzKGQsIHdWYWx1ZSk7CisJCXJldHVybiBz dGRfcmVxX2NvbXBsZXRlOworCisJCS8qIEdFVF9TVEFUVVMgKi8KKwljYXNlIERldmljZVJlcXVl c3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9kZXZfc3RhdHVzKGQs IHdJbmRleCwgd1ZhbHVlKTsKKwljYXNlIEludGVyZmFjZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9T VEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoZXAsIDAsIDApOworCWNhc2Ug RW5kcG9pbnRSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQlyZXR1cm4gYXN0X3ZodWJf ZXBfc3RhdHVzKGQsIHdJbmRleCwgd1ZhbHVlKTsKKworCQkvKiBTRVQvQ0xFQVJfRkVBVFVSRSAq LworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCXJldHVy biBhc3Rfdmh1Yl9kZXZfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1ZSk7CisJY2FzZSBE ZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3Zo dWJfZGV2X2ZlYXR1cmUoZCwgd0luZGV4LCB3VmFsdWUsIGZhbHNlKTsKKwljYXNlIEVuZHBvaW50 T3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9lcF9m ZWF0dXJlKGQsIHdJbmRleCwgd1ZhbHVlLCB0cnVlKTsKKwljYXNlIEVuZHBvaW50T3V0UmVxdWVz dCB8IFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2VwX2ZlYXR1cmUo ZCwgd0luZGV4LCB3VmFsdWUsIGZhbHNlKTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfZHJpdmVyOwor fQorCitzdGF0aWMgaW50IGFzdF92aHViX3VkY193YWtldXAoc3RydWN0IHVzYl9nYWRnZXQqIGdh ZGdldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2RldihnYWRnZXQpOwor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisJaWYgKCFkLT53YWtldXBfZW4pCisJCWdv dG8gZXJyOworCisJRERCRyhkLCAiRGV2aWNlIGluaXRpYXRlZCB3YWtldXBcbiIpOworCisJLyog V2FrZXVwIHRoZSBob3N0ICovCisJYXN0X3ZodWJfaHViX3dha2VfYWxsKGQtPnZodWIpOworCXJj ID0gMDsKKyBlcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxh Z3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl91ZGNfZ2V0X2ZyYW1l KHN0cnVjdCB1c2JfZ2FkZ2V0KiBnYWRnZXQpCit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9 IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKworCXJldHVybiAocmVhZGwoZC0+dmh1Yi0+cmVncyArIEFT VF9WSFVCX1VTQlNUUykgPj4gMTYpICYgMHg3ZmY7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHVi X2Rldl9udWtlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJdW5zaWduZWQgaW50IGk7CisK Kwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykgeworCQlpZiAoIWQt PmVwbnNbaV0pCisJCQljb250aW51ZTsKKwkJYXN0X3ZodWJfbnVrZShkLT5lcG5zW2ldLCAtRVNI VVRET1dOKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3B1bGx1cChzdHJ1Y3Qg dXNiX2dhZGdldCogZ2FkZ2V0LCBpbnQgb24pCit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9 IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCUREQkcoZCwgInB1bGx1cCglZClc biIsIG9uKTsKKworCS8qIE1hcmsgZGlzY29ubmVjdGVkIGluIHRoZSBodWIgKi8KKwlhc3Rfdmh1 Yl9kZXZpY2VfY29ubmVjdChkLT52aHViLCBkLT5pbmRleCwgb24pOworCisJLyoKKwkgKiBJZiBl bmFibGVkLCBudWtlIGFsbCByZXF1ZXN0cyBpZiBhbnkgKHRoZXJlIHNob3VsZG4ndCBiZSkKKwkg KiBhbmQgZGlzYWJsZSB0aGUgcG9ydC4gVGhpcyB3aWxsIGNsZWFyIHRoZSBhZGRyZXNzIHRvby4K KwkgKi8KKwlpZiAoZC0+ZW5hYmxlZCkgeworCQlhc3Rfdmh1Yl9kZXZfbnVrZShkKTsKKwkJYXN0 X3ZodWJfZGV2X2Rpc2FibGUoZCk7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+ dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3Zo dWJfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCisJCQkgICAgICBzdHJ1Y3Qg dXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0g dG9fYXN0X2RldihnYWRnZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAic3RhcnRcbiIpOwor CisJLyogV2UgZG9uJ3QgZG8gbXVjaCBtb3JlIHVudGlsIHRoZSBodWIgZW5hYmxlcyB1cyAqLwor CWQtPmRyaXZlciA9IGRyaXZlcjsKKwlkLT5nYWRnZXQuaXNfc2VsZnBvd2VyZWQgPSAxOworCisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJu IDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VwICphc3Rfdmh1Yl91ZGNfbWF0Y2hfZXAoc3Ry dWN0IHVzYl9nYWRnZXQgKmdhZGdldCwKKwkJCQkJICAgIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVz Y3JpcHRvciAqZGVzYywKKwkJCQkJICAgIHN0cnVjdCB1c2Jfc3NfZXBfY29tcF9kZXNjcmlwdG9y ICpzcykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2RldihnYWRnZXQpOwor CXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7CisJc3RydWN0IHVzYl9lcCAqdV9lcDsKKwl1bnNpZ25l ZCBpbnQgbWF4LCBhZGRyLCBpOworCisJRERCRyhkLCAiTWF0Y2ggRVAgdHlwZSAlZFxuIiwgdXNi X2VuZHBvaW50X3R5cGUoZGVzYykpOworCisJLyoKKwkgKiBGaXJzdCB3ZSBuZWVkIHRvIGxvb2sg Zm9yIGFuIGV4aXN0aW5nIHVuY2xhaW1lZCBFUCBhcyBhbm90aGVyCisJICogY29uZmlndXJhdGlv biBtYXkgaGF2ZSBhbHJlYWR5IGFzc29jaWF0ZWQgYSBidW5jaCBvZiBFUHMgd2l0aAorCSAqIHRo aXMgZ2FkZ2V0LiBUaGlzIGR1cGxpY2F0ZXMgdGhlIGNvZGUgaW4gdXNiX2VwX2F1dG9jb25maWdf c3MoKQorCSAqIHVuZm9ydHVuYXRlbHkuCisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSh1X2Vw LCAmZ2FkZ2V0LT5lcF9saXN0LCBlcF9saXN0KSB7CisJCWlmICh1c2JfZ2FkZ2V0X2VwX21hdGNo X2Rlc2MoZ2FkZ2V0LCB1X2VwLCBkZXNjLCBzcykpIHsKKwkJCUREQkcoZCwgIiAtPiB1c2luZyBl eGlzdGluZyBFUCVkXG4iLAorCQkJICAgICB0b19hc3RfZXAodV9lcCktPmRfaWR4KTsKKwkJCXJl dHVybiB1X2VwOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBkaWRuJ3QgZmluZCBvbmUsIHdlIG5l ZWQgdG8gZ3JhYiBvbmUgZnJvbSB0aGUgcG9vbC4KKwkgKgorCSAqIEZpcnN0IGxldCdzIGRvIHNv bWUgc2FuaXR5IGNoZWNraW5nCisJICovCisJc3dpdGNoKHVzYl9lbmRwb2ludF90eXBlKGRlc2Mp KSB7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgorCQkvKiBPbmx5IEVQMCBjYW4g YmUgYSBjb250cm9sIGVuZHBvaW50ICovCisJCXJldHVybiBOVUxMOworCWNhc2UgVVNCX0VORFBP SU5UX1hGRVJfSVNPQzoKKwkJLyogSVNPOgkgbGltaXQgMTAyMyBieXRlcyBmdWxsIHNwZWVkLCAx MDI0IGhpZ2gvc3VwZXIgc3BlZWQgKi8KKwkJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0 KSkKKwkJCW1heCA9IDEwMjQ7CisJCWVsc2UKKwkJCW1heCA9IDEwMjM7CisJCWJyZWFrOworCWNh c2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKKwkJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2Fk Z2V0KSkKKwkJCW1heCA9IDUxMjsKKwkJZWxzZQorCQkJbWF4ID0gNjQ7CisJCWJyZWFrOworCWNh c2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRn ZXQpKQorCQkJbWF4ID0gMTAyNDsKKwkJZWxzZQorCQkJbWF4ID0gNjQ7CisJCWJyZWFrOworCX0K KwlpZiAodXNiX2VuZHBvaW50X21heHAoZGVzYykgPiBtYXgpCisJCXJldHVybiBOVUxMOworCisJ LyoKKwkgKiBGaW5kIGEgZnJlZSBFUCBhZGRyZXNzIGZvciB0aGF0IGRldmljZS4gV2UgY2FuJ3QK KwkgKiBsZXQgdGhlIGdlbmVyaWMgY29kZSBhc3NpZ24gdGhlc2UgYXMgaXQgd291bGQKKwkgKiBj cmVhdGUgb3ZlcmxhcHBpbmcgbnVtYmVycyBmb3IgSU4gYW5kIE9VVCB3aGljaAorCSAqIHdlIGRv bid0IHN1cHBvcnQsIHNvIGFsc28gY3JlYXRlIGEgc3VpdGFibGUgbmFtZQorCSAqIHRoYXQgd2ls bCBhbGxvdyB0aGUgZ2VuZXJpYyBjb2RlIHRvIHVzZSBvdXIKKwkgKiBhc3NpZ25lZCBhZGRyZXNz LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKQorCQlp ZiAoZC0+ZXBuc1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJaWYgKGkgPj0gQVNUX1ZIVUJfTlVN X0dFTl9FUHMpCisJCXJldHVybiBOVUxMOworCWFkZHIgPSBpICsgMTsKKworCS8qCisJICogTm93 IGdyYWIgYW4gRVAgZnJvbSB0aGUgc2hhcmVkIHBvb2wgYW5kIGFzc29jaWF0ZQorCSAqIGl0IHdp dGggb3VyIGRldmljZQorCSAqLworCWVwID0gYXN0X3ZodWJfYWxsb2NfZXBuKGQsIGFkZHIpOwor CWlmICghZXApCisJCXJldHVybiBOVUxMOworCUREQkcoZCwgIkFsbG9jYXRlZCBlcG4jJWQgZm9y IHBvcnQgRVAlZFxuIiwKKwkgICAgIGVwLT5lcG4uZ19pZHgsIGFkZHIpOworCisJcmV0dXJuICZl cC0+ZXA7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRn ZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2RldihnYWRn ZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1 Yi0+bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAic3RvcFxuIik7CisKKwlkLT5kcml2ZXIgPSBO VUxMOworCWQtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCisJYXN0X3ZodWJf ZGV2X251a2UoZCk7CisKKwlpZiAoZC0+ZW5hYmxlZCkKKwkJYXN0X3ZodWJfZGV2X2Rpc2FibGUo ZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBhc3Rfdmh1Yl91 ZGNfb3BzID0geworCS5nZXRfZnJhbWUJPSBhc3Rfdmh1Yl91ZGNfZ2V0X2ZyYW1lLAorCS53YWtl dXAJCT0gYXN0X3ZodWJfdWRjX3dha2V1cCwKKwkucHVsbHVwCQk9IGFzdF92aHViX3VkY19wdWxs dXAsCisJLnVkY19zdGFydAk9IGFzdF92aHViX3VkY19zdGFydCwKKwkudWRjX3N0b3AJPSBhc3Rf dmh1Yl91ZGNfc3RvcCwKKwkubWF0Y2hfZXAJPSBhc3Rfdmh1Yl91ZGNfbWF0Y2hfZXAsCit9Owor Cit2b2lkIGFzdF92aHViX2Rldl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJ ZC0+c3VzcGVuZGVkID0gdHJ1ZTsKKwlpZiAoZC0+ZHJpdmVyKSB7CisJCXNwaW5fdW5sb2NrKCZk LT52aHViLT5sb2NrKTsKKwkJZC0+ZHJpdmVyLT5zdXNwZW5kKCZkLT5nYWRnZXQpOworCQlzcGlu X2xvY2soJmQtPnZodWItPmxvY2spOworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzdW1l KHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJZC0+c3VzcGVuZGVkID0gZmFsc2U7CisJaWYg KGQtPmRyaXZlcikgeworCQlzcGluX3VubG9jaygmZC0+dmh1Yi0+bG9jayk7CisJCWQtPmRyaXZl ci0+cmVzdW1lKCZkLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmQtPnZodWItPmxvY2spOworCX0K K30KKwordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzZXQoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sK KwkvKgorCSAqIElmIHNwZWVkIGlzIG5vdCBzZXQsIHdlIGVuYWJsZSB0aGUgcG9ydC4gSWYgaXQg aXMsCisJICogc2VuZCByZXNldCB0byB0aGUgZ2FkZ2V0IGFuZCByZXNldCAic3BlZWQiLgorCSAq CisJICogU3BlZWQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlIGhhdmUgZ290IHRoZSBmaXJzdAor CSAqIHNldHVwIHBhY2tldCB0byB0aGUgZGV2aWNlLgorCSAqLworCWlmIChkLT5nYWRnZXQuc3Bl ZWQgPT0gVVNCX1NQRUVEX1VOS05PV04gJiYgIWQtPmVuYWJsZWQpIHsKKwkJRERCRyhkLCAiUmVz ZXQgYXQgdW5rbm93biBzcGVlZCBvZiBkaXNhYmxlZCBkZXZpY2UsIGVuYWJsaW5nLi4uXG4iKTsK KwkJYXN0X3ZodWJfZGV2X2VuYWJsZShkKTsKKwkJZC0+c3VzcGVuZGVkID0gZmFsc2U7CisJfQor CWlmIChkLT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04gJiYgZC0+ZHJpdmVyKSB7 CisJCXVuc2lnbmVkIGludCBpOworCisJCUREQkcoZCwgIlJlc2V0IGF0IGtub3duIHNwZWVkIG9m IGJvdW5kIGRldmljZSwgcmVzZXR0aW5nLi4uXG4iKTsKKwkJc3Bpbl91bmxvY2soJmQtPnZodWIt PmxvY2spOworCQlkLT5kcml2ZXItPnJlc2V0KCZkLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmQt PnZodWItPmxvY2spOworCisJCS8qCisJCSAqIERpc2FibGUvcmUtZW5hYmxlIEhXLCB0aGlzIHdp bGwgY2xlYXIgdGhlIGFkZHJlc3MKKwkJICogYW5kIHNwZWVkIHNldHRpbmcuCisJCSAqLworCQlh c3Rfdmh1Yl9kZXZfZGlzYWJsZShkKTsKKwkJYXN0X3ZodWJfZGV2X2VuYWJsZShkKTsKKworCQkv KiBDbGVhciBzdGFsbCBvbiBhbGwgRVBzICovCisJCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9O VU1fR0VOX0VQczsgaSsrKSB7CisJCQlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gZC0+ZXBuc1tp XTsKKworCQkJaWYgKGVwICYmIGVwLT5lcG4uc3RhbGxlZCkgeworCQkJCWVwLT5lcG4uc3RhbGxl ZCA9IGZhbHNlOworCQkJCWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXApOworCQkJfQorCQl9 CisKKwkJLyogQWRkaXRpb25hbCBjbGVhbnVwcyAqLworCQlkLT53YWtldXBfZW4gPSBmYWxzZTsK KwkJZC0+c3VzcGVuZGVkID0gZmFsc2U7CisJfQorfQorCit2b2lkIGFzdF92aHViX2RlbF9kZXYo c3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bp bl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWQtPnJlZ2lzdGVy ZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOwor CQlyZXR1cm47CisJfQorCWQtPnJlZ2lzdGVyZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwl1c2JfZGVsX2dhZGdldF91ZGMoJmQt PmdhZGdldCk7CisJZGV2aWNlX3VucmVnaXN0ZXIoZC0+cG9ydF9kZXYpOworfQorCitzdGF0aWMg dm9pZCBhc3Rfdmh1Yl9kZXZfcmVsZWFzZShzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJa2ZyZWUo ZGV2KTsKK30KKworaW50IGFzdF92aHViX2luaXRfZGV2KHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yiwg dW5zaWduZWQgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gJnZodWItPnBv cnRzW2lkeF0uZGV2OworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9ICZ2aHViLT5wZGV2LT5kZXY7 CisJaW50IHJjOworCisJZC0+dmh1YiA9IHZodWI7CisJZC0+aW5kZXggPSBpZHg7CisJZC0+bmFt ZSA9IGRldm1fa2FzcHJpbnRmKHBhcmVudCwgR0ZQX0tFUk5FTCwgInBvcnQlZCIsIGlkeCsxKTsK KwlkLT5yZWdzID0gdmh1Yi0+cmVncyArIDB4MTAwICsgMHgxMCAqIGlkeDsKKworCWFzdF92aHVi X2luaXRfZXAwKHZodWIsICZkLT5lcDAsIGQpOworCisJLyoKKwkgKiBUaGUgVURDIGNvcmUgcmVh bGx5IG5lZWRzIHVzIHRvIGhhdmUgc2VwYXJhdGUgYW5kIHVuaXF1ZWx5CisJICogbmFtZWQgInBh cmVudCIgZGV2aWNlcyBmb3IgZWFjaCBwb3J0IHNvIHdlIGNyZWF0ZSBhIHN1YiBkZXZpY2UKKwkg KiBoZXJlIGZvciB0aGF0IHB1cnBvc2UKKwkgKi8KKwlkLT5wb3J0X2RldiA9IGt6YWxsb2Moc2l6 ZW9mKHN0cnVjdCBkZXZpY2UpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWQtPnBvcnRfZGV2KQorCQly ZXR1cm4gLUVOT01FTTsKKwlkZXZpY2VfaW5pdGlhbGl6ZShkLT5wb3J0X2Rldik7CisJZC0+cG9y dF9kZXYtPnJlbGVhc2UgPSBhc3Rfdmh1Yl9kZXZfcmVsZWFzZTsKKwlkLT5wb3J0X2Rldi0+cGFy ZW50ID0gcGFyZW50OworCWRldl9zZXRfbmFtZShkLT5wb3J0X2RldiwgIiVzOnAlZCIsIGRldl9u YW1lKHBhcmVudCksIGlkeCArIDEpOworCXJjID0gZGV2aWNlX2FkZChkLT5wb3J0X2Rldik7CisJ aWYgKHJjKQorCQlnb3RvIGZhaWxfYWRkOworCisJLyogUG9wdWxhdGUgZ2FkZ2V0ICovCisJSU5J VF9MSVNUX0hFQUQoJmQtPmdhZGdldC5lcF9saXN0KTsKKwlkLT5nYWRnZXQub3BzID0gJmFzdF92 aHViX3VkY19vcHM7CisJZC0+Z2FkZ2V0LmVwMCA9ICZkLT5lcDAuZXA7CisJZC0+Z2FkZ2V0Lm5h bWUgPSBLQlVJTERfTU9ETkFNRTsKKwlpZiAodmh1Yi0+Zm9yY2VfdXNiMSkKKwkJZC0+Z2FkZ2V0 Lm1heF9zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCWVsc2UKKwkJZC0+Z2FkZ2V0Lm1heF9zcGVl ZCA9IFVTQl9TUEVFRF9ISUdIOworCWQtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dO OworCWQtPmdhZGdldC5kZXYub2Zfbm9kZSA9IHZodWItPnBkZXYtPmRldi5vZl9ub2RlOworCisJ cmMgPSB1c2JfYWRkX2dhZGdldF91ZGMoZC0+cG9ydF9kZXYsICZkLT5nYWRnZXQpOworCWlmIChy YyAhPSAwKQorCQlnb3RvIGZhaWxfdWRjOworCWQtPnJlZ2lzdGVyZWQgPSB0cnVlOworCisJcmV0 dXJuIDA7CisgZmFpbF91ZGM6CisJZGV2aWNlX2RlbChkLT5wb3J0X2Rldik7CisgZmFpbF9hZGQ6 CisJcHV0X2RldmljZShkLT5wb3J0X2Rldik7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQg YS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2VwMC5jIGIvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAw MDAwMDAwMDAwMDAuLjIwZmZiMDNmZjZhYwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNi L2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXAwLmMKQEAgLTAsMCArMSw0ODYgQEAKKy8vIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZl ciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGVwMC5jIC0gRW5kcG9p bnQgMCBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5l bC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9w b3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+ CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgor I2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgor I2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNp bmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRl IDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5j bHVkZSAidmh1Yi5oIgorCitpbnQgYXN0X3ZodWJfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICpl cCwgY2hhciAqcHRyLCBpbnQgbGVuKQoreworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gJmVw LT5lcDAucmVxLnJlcTsKKwlpbnQgcmM7CisKKwlpZiAoV0FSTl9PTihlcC0+ZF9pZHggIT0gMCkp CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWlmIChXQVJOX09OKCFlcC0+ZXAwLmRpcl9pbikp CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWlmIChXQVJOX09OKGxlbiA+IEFTVF9WSFVCX0VQ MF9NQVhfUEFDS0VUKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKFdBUk5fT04ocmVx LT5zdGF0dXMgPT0gLUVJTlBST0dSRVNTKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwly ZXEtPmJ1ZiA9IHB0cjsKKwlyZXEtPmxlbmd0aCA9IGxlbjsKKwlyZXEtPmNvbXBsZXRlID0gTlVM TDsKKwlyZXEtPnplcm8gPSB0cnVlOworCisJLyoKKwkgKiBDYWxsIGludGVybmFsIHF1ZXVlIGRp cmVjdGx5IGFmdGVyIGRyb3BwaW5nIHRoZSBsb2NrLiBUaGlzIGlzCisJICogc2FmZSB0byBkbyBh cyB0aGUgcmVwbHkgaXMgYWx3YXlzIHRoZSBsYXN0IHRoaW5nIGRvbmUgd2hlbgorCSAqIHByb2Nl c3NpbmcgYSBTRVRVUCBwYWNrZXQsIHVzdWFsbHkgYXMgYSB0YWlsIGNhbGwKKwkgKi8KKwlzcGlu X3VubG9jaygmZXAtPnZodWItPmxvY2spOworCWlmIChlcC0+ZXAub3BzLT5xdWV1ZSgmZXAtPmVw LCByZXEsIEdGUF9BVE9NSUMpKQorCQlyYyA9IHN0ZF9yZXFfc3RhbGw7CisJZWxzZQorCQlyYyA9 IHN0ZF9yZXFfZGF0YTsKKwlzcGluX2xvY2soJmVwLT52aHViLT5sb2NrKTsKKwlyZXR1cm4gcmM7 Cit9CisKK2ludCBfX2FzdF92aHViX3NpbXBsZV9yZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw LCBpbnQgbGVuLCAuLi4pCit7CisJdTggKmJ1ZmZlciA9IGVwLT5idWY7CisJdW5zaWduZWQgaW50 IGk7CisJdmFfbGlzdCBhcmdzOworCisJdmFfc3RhcnQoYXJncywgbGVuKTsKKworCS8qIENvcHkg ZGF0YSBkaXJlY3RseSBpbnRvIEVQIGJ1ZmZlciAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkr KykKKwkJYnVmZmVyW2ldID0gdmFfYXJnKGFyZ3MsIGludCk7CisJdmFfZW5kKGFyZ3MpOworCisJ LyogcmVxLT5idWYgTlVMTCBtZWFucyBkYXRhIGlzIGFscmVhZHkgdGhlcmUgKi8KKwlyZXR1cm4g YXN0X3ZodWJfcmVwbHkoZXAsIE5VTEwsIGxlbik7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXAwX2hh bmRsZV9zZXR1cChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCXN0cnVjdCB1c2JfY3RybHJl cXVlc3QgY3JxOworCWVudW0gc3RkX3JlcV9yYyBzdGRfcmVxX3JjOworCWludCByYyA9IC1FTk9E RVY7CisKKwlpZiAoV0FSTl9PTihlcC0+ZF9pZHggIT0gMCkpCisJCXJldHVybjsKKworCS8qCisJ ICogR3JhYiB0aGUgc2V0dXAgcGFja2V0IGZyb20gdGhlIGNoaXAgYW5kIGJ5dGVzd2FwCisJICog aW50ZXJlc3RpbmcgZmllbGRzCisJICovCisJbWVtY3B5X2Zyb21pbygmY3JxLCBlcC0+ZXAwLnNl dHVwLCBzaXplb2YoY3JxKSk7CisKKwlFUERCRyhlcCwgIlNFVFVQIHBhY2tldCAlMDJ4LyUwMngv JTA0eC8lMDR4LyUwNHggWyVzXSBzdD0lZFxuIiwKKwkgICAgICBjcnEuYlJlcXVlc3RUeXBlLCBj cnEuYlJlcXVlc3QsCisJICAgICAgIGxlMTZfdG9fY3B1KGNycS53VmFsdWUpLAorCSAgICAgICBs ZTE2X3RvX2NwdShjcnEud0luZGV4KSwKKwkgICAgICAgbGUxNl90b19jcHUoY3JxLndMZW5ndGgp LAorCSAgICAgICAoY3JxLmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pID8gImluIiA6ICJvdXQi LAorCSAgICAgICBlcC0+ZXAwLnN0YXRlKTsKKworCS8qIENoZWNrIG91ciBzdGF0ZSwgY2FuY2Vs IHBlbmRpbmcgcmVxdWVzdHMgaWYgbmVlZGVkICovCisJaWYgKGVwLT5lcDAuc3RhdGUgIT0gZXAw X3N0YXRlX3Rva2VuKSB7CisJCUVQREJHKGVwLCAid3Jvbmcgc3RhdGVcbiIpOworCQlhc3Rfdmh1 Yl9udWtlKGVwLCAwKTsKKwkJZ290byBzdGFsbDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgbmV4dCBz dGF0ZSBmb3IgRVAwICovCisJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9kYXRhOworCWVwLT5l cDAuZGlyX2luID0gISEoY3JxLmJSZXF1ZXN0VHlwZSAmIFVTQl9ESVJfSU4pOworCisJLyogSWYg dGhpcyBpcyB0aGUgdkh1Yiwgd2UgaGFuZGxlIHJlcXVlc3RzIGRpZmZlcmVudGx5ICovCisJc3Rk X3JlcV9yYyA9IHN0ZF9yZXFfZHJpdmVyOworCWlmIChlcC0+ZGV2ID09IE5VTEwpIHsKKwkJaWYg KChjcnEuYlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfU1RBTkRBUkQp CisJCQlzdGRfcmVxX3JjID0gYXN0X3ZodWJfc3RkX2h1Yl9yZXF1ZXN0KGVwLCAmY3JxKTsKKwkJ ZWxzZSBpZiAoKGNycS5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9D TEFTUykKKwkJCXN0ZF9yZXFfcmMgPSBhc3Rfdmh1Yl9jbGFzc19odWJfcmVxdWVzdChlcCwgJmNy cSk7CisJCWVsc2UKKwkJCXN0ZF9yZXFfcmMgPSBzdGRfcmVxX3N0YWxsOworCX0gZWxzZSBpZiAo KGNycS5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9TVEFOREFSRCkK KwkJc3RkX3JlcV9yYyA9IGFzdF92aHViX3N0ZF9kZXZfcmVxdWVzdChlcCwgJmNycSk7CisKKwkv KiBBY3QgdXBvbiByZXN1bHQgKi8KKwlzd2l0Y2goc3RkX3JlcV9yYykgeworCWNhc2Ugc3RkX3Jl cV9jb21wbGV0ZToKKwkJZ290byBjb21wbGV0ZTsKKwljYXNlIHN0ZF9yZXFfc3RhbGw6CisJCWdv dG8gc3RhbGw7CisJY2FzZSBzdGRfcmVxX2RyaXZlcjoKKwkJYnJlYWs7CisJY2FzZSBzdGRfcmVx X2RhdGE6CisJCXJldHVybjsKKwl9CisKKwkvKiBQYXNzIHJlcXVlc3QgdXAgdG8gdGhlIGdhZGdl dCBkcml2ZXIgKi8KKwlpZiAoV0FSTl9PTighZXAtPmRldikpCisJCWdvdG8gc3RhbGw7CisJaWYg KGVwLT5kZXYtPmRyaXZlcikgeworCQlFUERCRyhlcCwgImZvcndhcmRpbmcgdG8gZ2FkZ2V0Li4u XG4iKTsKKwkJc3Bpbl91bmxvY2soJmVwLT52aHViLT5sb2NrKTsKKwkJcmMgPSBlcC0+ZGV2LT5k cml2ZXItPnNldHVwKCZlcC0+ZGV2LT5nYWRnZXQsICZjcnEpOworCQlzcGluX2xvY2soJmVwLT52 aHViLT5sb2NrKTsKKwkJRVBEQkcoZXAsICJkcml2ZXIgcmV0dXJuZWQgJWRcbiIsIHJjKTsKKwl9 IGVsc2UgeworCQlFUERCRyhlcCwgIm5vIGdhZGdldCBmb3IgcmVxdWVzdCAhXG4iKTsKKwl9CisJ aWYgKHJjID49IDApCisJCXJldHVybjsKKworIHN0YWxsOgorCUVQREJHKGVwLCAic3RhbGxpbmdc biIpOworCXdyaXRlbChWSFVCX0VQMF9DVFJMX1NUQUxMLCBlcC0+ZXAwLmN0bHN0YXQpOworCWVw LT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCWVwLT5lcDAuZGlyX2luID0gZmFsc2U7 CisJcmV0dXJuOworCisgY29tcGxldGU6CisJRVBWREJHKGVwLCAic2VuZGluZyBbaW5dIHN0YXR1 cyB3aXRoIG5vIGRhdGFcbiIpOworCXdyaXRlbChWSFVCX0VQMF9UWF9CVUZGX1JEWSwgZXAtPmVw MC5jdGxzdGF0KTsKKwllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwllcC0+ZXAw LmRpcl9pbiA9IGZhbHNlOworfQorCisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2VwMF9kb19zZW5k KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSkK K3sKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisJdTMyIHJlZzsKKworCS8qIElmIHRoaXMgaXMgYSAw LWxlbmd0aCByZXF1ZXN0LCBpdCdzIHRoZSBnYWRnZXQgdHJ5aW5nIHRvCisJICogc2VuZCBhIHN0 YXR1cyBvbiBvdXIgYmVoYWxmLiBXZSB0YWtlIGl0IGZyb20gaGVyZS4KKwkgKi8KKwlpZiAocmVx LT5yZXEubGVuZ3RoID09IDApCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCS8qIEFyZSB3ZSBk b25lID8gQ29tcGxldGUgcmVxdWVzdCwgb3RoZXJ3aXNlIHdhaXQgZm9yIG5leHQgaW50ZXJydXB0 ICovCisJaWYgKHJlcS0+bGFzdF9kZXNjID49IDApIHsKKwkJRVBWREJHKGVwLCAiY29tcGxldGUg c2VuZCAlZC8lZFxuIiwKKwkJICAgICAgIHJlcS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3Ro KTsKKwkJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJCXdyaXRlbChWSFVCX0VQ MF9SWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0KTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVx LCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogTmV4dCBjaHVuayBjcm9wcGVkIHRvIG1h eCBwYWNrZXQgc2l6ZS4gQWxzbyBjaGVjayBpZiB0aGlzCisJICogaXMgdGhlIGxhc3QgcGFja2V0 CisJICovCisJY2h1bmsgPSByZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWw7CisJaWYg KGNodW5rID4gZXAtPmVwLm1heHBhY2tldCkKKwkJY2h1bmsgPSBlcC0+ZXAubWF4cGFja2V0Owor CWVsc2UgaWYgKChjaHVuayA8IGVwLT5lcC5tYXhwYWNrZXQpIHx8ICFyZXEtPnJlcS56ZXJvKQor CQlyZXEtPmxhc3RfZGVzYyA9IDE7CisKKwlFUFZEQkcoZXAsICJzZW5kIGNodW5rPSVkIGxhc3Q9 JWQsIHJlcS0+YWN0PSVkIG1wPSVkXG4iLAorCSAgICAgICBjaHVuaywgcmVxLT5sYXN0X2Rlc2Ms IHJlcS0+cmVxLmFjdHVhbCwgZXAtPmVwLm1heHBhY2tldCk7CisKKwkvKgorCSAqIENvcHkgZGF0 YSBpZiBhbnkgKGludGVybmFsIHJlcXVlc3RzIGFscmVhZHkgaGF2ZSBkYXRhCisJICogaW4gdGhl IEVQIGJ1ZmZlcikKKwkgKi8KKwlpZiAoY2h1bmsgJiYgcmVxLT5yZXEuYnVmKQorCQltZW1jcHko ZXAtPmJ1ZiwgcmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsLCBjaHVuayk7CisKKwkvKiBS ZW1lbWJlciBjaHVuayBzaXplIGFuZCB0cmlnZ2VyIHNlbmQgKi8KKwlyZWcgPSBWSFVCX0VQMF9T RVRfVFhfTEVOKGNodW5rKTsKKwl3cml0ZWwocmVnLCBlcC0+ZXAwLmN0bHN0YXQpOworCXdyaXRl bChyZWcgfCBWSFVCX0VQMF9UWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0KTsKKwlyZXEtPnJl cS5hY3R1YWwgKz0gY2h1bms7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2VwMF9yeF9wcmlt ZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCUVQVkRCRyhlcCwgInJ4IHByaW1lXG4iKTsK KworCS8qIFByaW1lIGVuZHBvaW50IGZvciByZWNlaXZpbmcgZGF0YSAqLworCXdyaXRlbChWSFVC X0VQMF9SWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0ICsgQVNUX1ZIVUJfRVAwX0NUUkwpOwor fQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcDBfZG9fcmVjZWl2ZShzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEsCisJCQkJICAgIHVuc2lnbmVkIGludCBs ZW4pCit7CisJdW5zaWduZWQgaW50IHJlbWFpbjsKKwlpbnQgcmMgPSAwOworCisJLyogV2UgYXJl IHJlY2VpdmluZy4uLiBncmFiIHJlcXVlc3QgKi8KKwlyZW1haW4gPSByZXEtPnJlcS5sZW5ndGgg LSByZXEtPnJlcS5hY3R1YWw7CisKKwlFUFZEQkcoZXAsICJyZWNlaXZlIGdvdD0lZCByZW1haW49 JWRcbiIsIGxlbiwgcmVtYWluKTsKKworCS8qIEFyZSB3ZSBnZXR0aW5nIG1vcmUgdGhhbiBhc2tl ZCA/ICovCisJaWYgKGxlbiA+IHJlbWFpbikgeworCQlFUERCRyhlcCwgInJlY2VpdmluZyB0b28g bXVjaCAob3ZmOiAlZCkgIVxuIiwKKwkJICAgICAgbGVuIC0gcmVtYWluKTsKKwkJbGVuID0gcmVt YWluOworCQlyYyA9IC1FT1ZFUkZMT1c7CisJfQorCWlmIChsZW4gJiYgcmVxLT5yZXEuYnVmKQor CQltZW1jcHkocmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsLCBlcC0+YnVmLCBsZW4pOwor CXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisKKwkvKiBEb25lID8gKi8KKwlpZiAobGVuIDwgZXAt PmVwLm1heHBhY2tldCB8fCBsZW4gPT0gcmVtYWluKSB7CisJCWVwLT5lcDAuc3RhdGUgPSBlcDBf c3RhdGVfc3RhdHVzOworCQl3cml0ZWwoVkhVQl9FUDBfVFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rs c3RhdCk7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgcmMpOworCX0gZWxzZQorCQlhc3Rfdmh1 Yl9lcDBfcnhfcHJpbWUoZXApOworfQorCit2b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfYWNrKHN0 cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGJvb2wgaW5fYWNrKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9y ZXEgKnJlcTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgZGV2 aWNlICpkZXYgPSAmdmh1Yi0+cGRldi0+ZGV2OworCWJvb2wgc3RhbGwgPSBmYWxzZTsKKwl1MzIg c3RhdDsKKworCS8qIFJlYWQgRVAwIHN0YXR1cyAqLworCXN0YXQgPSByZWFkbChlcC0+ZXAwLmN0 bHN0YXQpOworCisJLyogR3JhYiBjdXJyZW50IHJlcXVlc3QgaWYgYW55ICovCisJcmVxID0gbGlz dF9maXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+cXVldWUsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsIHF1 ZXVlKTsKKworCUVQVkRCRyhlcCwgIkFDSyBzdGF0dXM9JTA4eCxzdGF0ZT0lZCBpc19pbj0lZCBp bl9hY2s9JWQgcmVxPSVwXG4iLAorCQlzdGF0LCBlcC0+ZXAwLnN0YXRlLCBlcC0+ZXAwLmRpcl9p biwgaW5fYWNrLCByZXEpOworCisJc3dpdGNoKGVwLT5lcDAuc3RhdGUpIHsKKwljYXNlIGVwMF9z dGF0ZV90b2tlbjoKKwkJLyogVGhlcmUgc2hvdWxkIGJlIG5vIHJlcXVlc3QgcXVldWVkIGluIHRo YXQgc3RhdGUuLi4gKi8KKwkJaWYgKHJlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAicmVxdWVzdCBw cmVzZW50IHdoaWxlIGluIFRPS0VOIHN0YXRlXG4iKTsKKwkJCWFzdF92aHViX251a2UoZXAsIC1F SU5WQUwpOworCQl9CisJCWRldl93YXJuKGRldiwgImFjayB3aGlsZSBpbiBUT0tFTiBzdGF0ZVxu Iik7CisJCXN0YWxsID0gdHJ1ZTsKKwkJYnJlYWs7CisJY2FzZSBlcDBfc3RhdGVfZGF0YToKKwkJ LyogQ2hlY2sgdGhlIHN0YXRlIGJpdHMgY29ycmVzcG9uZGluZyB0byBvdXIgZGlyZWN0aW9uICov CisJCWlmICgoZXAtPmVwMC5kaXJfaW4gJiYgKHN0YXQgJiBWSFVCX0VQMF9UWF9CVUZGX1JEWSkp IHx8CisJCSAgICAoIWVwLT5lcDAuZGlyX2luICYmIChzdGF0ICYgVkhVQl9FUDBfUlhfQlVGRl9S RFkpKSB8fAorCQkgICAgKGVwLT5lcDAuZGlyX2luICE9IGluX2FjaykpIHsKKwkJCWRldl93YXJu KGRldiwgImlycSBzdGF0ZSBtaXNtYXRjaCIpOworCQkJc3RhbGwgPSB0cnVlOworCQkJYnJlYWs7 CisJCX0KKwkJLyoKKwkJICogV2UgYXJlIGluIGRhdGEgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmVx dWVzdCwgc29tZXRoaW5nIGlzCisJCSAqIHdyb25nLCBzdGFsbAorCQkgKi8KKwkJaWYgKCFyZXEp IHsKKwkJCWRldl93YXJuKGRldiwgImRhdGEgcGhhc2UsIG5vIHJlcXVlc3RcbiIpOworCQkJc3Rh bGwgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBXZSBoYXZlIGEgcmVxdWVzdCwgaGFu ZGxlIGRhdGEgdHJhbnNmZXJzICovCisJCWlmIChlcC0+ZXAwLmRpcl9pbikKKwkJCWFzdF92aHVi X2VwMF9kb19zZW5kKGVwLCByZXEpOworCQllbHNlCisJCQlhc3Rfdmh1Yl9lcDBfZG9fcmVjZWl2 ZShlcCwgcmVxLCBWSFVCX0VQMF9SWF9MRU4oc3RhdCkpOworCQlyZXR1cm47CisJY2FzZSBlcDBf c3RhdGVfc3RhdHVzOgorCQkvKiBOdWtlIHN0YWxlIHJlcXVlc3RzICovCisJCWlmIChyZXEpIHsK KwkJCWRldl93YXJuKGRldiwgInJlcXVlc3QgcHJlc2VudCB3aGlsZSBpbiBTVEFUVVMgc3RhdGVc biIpOworCQkJYXN0X3ZodWJfbnVrZShlcCwgLUVJTlZBTCk7CisJCX0KKworCQkvKgorCQkgKiBJ ZiB0aGUgc3RhdHVzIHBoYXNlIGNvbXBsZXRlcyB3aXRoIHRoZSB3cm9uZyBhY2ssIHN0YWxsCisJ CSAqIHRoZSBlbmRwb2ludCBqdXN0IGluIGNhc2UsIHRvIGFib3J0IHdoYXRldmVyIHRoZSBob3N0 CisJCSAqIHdhcyBkb2luZy4KKwkJICovCisJCWlmIChlcC0+ZXAwLmRpcl9pbiA9PSBpbl9hY2sp IHsKKwkJCWRldl93YXJuKGRldiwgInN0YXR1cyBkaXJlY3Rpb24gbWlzbWF0Y2hcbiIpOworCQkJ c3RhbGwgPSB0cnVlOworCQl9CisJfQorCisJLyogUmVzZXQgdG8gdG9rZW4gc3RhdGUgKi8KKwll cC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3Rva2VuOworCWlmIChzdGFsbCkKKwkJd3JpdGVsKFZI VUJfRVAwX0NUUkxfU1RBTEwsIGVwLT5lcDAuY3Rsc3RhdCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0 X3ZodWJfZXAwX3F1ZXVlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAq dV9yZXEsCisJCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGFzdF92aHViX3Jl cSAqcmVxID0gdG9fYXN0X3JlcSh1X3JlcSk7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRv X2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSAmdmh1Yi0+cGRldi0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7 CisKKwkvKiBQYXJhbm9pZCBjaGVrcyAqLworCWlmICghdV9yZXEgfHwgKCF1X3JlcS0+Y29tcGxl dGUgJiYgIXJlcS0+aW50ZXJuYWwpKSB7CisJCWRldl93YXJuKGRldiwgIkJvZ3VzIEVQMCByZXF1 ZXN0ICEgdV9yZXE9JXBcbiIsIHVfcmVxKTsKKwkJaWYgKHVfcmVxKSB7CisJCQlkZXZfd2Fybihk ZXYsICJjb21wbGV0ZT0lcCBpbnRlcm5hbD0lZFxuIiwKKwkJCQkgdV9yZXEtPmNvbXBsZXRlLCBy ZXEtPmludGVybmFsKTsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBOb3QgZW5k cG9pbnQgMCA/ICovCisJaWYgKFdBUk5fT04oZXAtPmRfaWR4ICE9IDApKQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCS8qIERpc2FibGVkIGRldmljZSAqLworCWlmIChlcC0+ZGV2ICYmICghZXAtPmRl di0+ZW5hYmxlZCB8fCBlcC0+ZGV2LT5zdXNwZW5kZWQpKQorCQlyZXR1cm4gLUVTSFVURE9XTjsK KworCS8qIERhdGEsIG5vIGJ1ZmZlciBhbmQgbm90IGludGVybmFsID8gKi8KKwlpZiAodV9yZXEt Pmxlbmd0aCAmJiAhdV9yZXEtPmJ1ZiAmJiAhcmVxLT5pbnRlcm5hbCkgeworCQlkZXZfd2Fybihk ZXYsICJSZXF1ZXN0IHdpdGggbm8gYnVmZmVyICFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9 CisKKwlFUFZEQkcoZXAsICJlbnF1ZXVlIHJlcSBAJXBcbiIsIHJlcSk7CisJRVBWREJHKGVwLCAi ICBsPSVkIHplcm89JWQgbm9zaG9ydD0lZCBpc19pbj0lZFxuIiwKKwkgICAgICAgdV9yZXEtPmxl bmd0aCwgdV9yZXEtPnplcm8sCisJICAgICAgIHVfcmVxLT5zaG9ydF9ub3Rfb2ssIGVwLT5lcDAu ZGlyX2luKTsKKworCS8qIEluaXRpYWxpemUgcmVxdWVzdCBwcm9ncmVzcyBmaWVsZHMgKi8KKwl1 X3JlcS0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCXVfcmVxLT5hY3R1YWwgPSAwOworCXJlcS0+ bGFzdF9kZXNjID0gLTE7CisJcmVxLT5hY3RpdmUgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFz YXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwkvKiBFUDAgY2FuIG9ubHkgc3VwcG9ydCBhIHNp bmdsZSByZXF1ZXN0IGF0IGEgdGltZSAqLworCWlmICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSB8 fCBlcC0+ZXAwLnN0YXRlID09IGVwMF9zdGF0ZV90b2tlbikgeworCQlkZXZfd2FybihkZXYsICJF UDA6IFJlcXVlc3QgaW4gd3Jvbmcgc3RhdGVcbiIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZ2aHViLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUJVU1k7CisJfQorCisJLyogQWRkIHJl cXVlc3QgdG8gbGlzdCBhbmQga2ljayBwcm9jZXNzaW5nIGlmIGVtcHR5ICovCisJbGlzdF9hZGRf dGFpbCgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1ZSk7CisKKwlpZiAoZXAtPmVwMC5kaXJfaW4pIHsK KwkJLyogSU4gcmVxdWVzdCwgc2VuZCBkYXRhICovCisJCWFzdF92aHViX2VwMF9kb19zZW5kKGVw LCByZXEpOworCX0gZWxzZSBpZiAodV9yZXEtPmxlbmd0aCA9PSAwKSB7CisJCS8qIDAtbGVuIHJl cXVlc3QsIHNlbmQgY29tcGxldGlvbiBhcyByeCAqLworCQlFUFZEQkcoZXAsICIwLWxlbmd0aCBy eCBjb21wbGV0aW9uXG4iKTsKKwkJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJ CXdyaXRlbChWSFVCX0VQMF9UWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0KTsKKwkJYXN0X3Zo dWJfZG9uZShlcCwgcmVxLCAwKTsKKwl9IGVsc2UgeworCQkvKiBPVVQgcmVxdWVzdCwgc3RhcnQg cmVjZWl2ZXIgKi8KKwkJYXN0X3ZodWJfZXAwX3J4X3ByaW1lKGVwKTsKKwl9CisKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBhc3Rfdmh1Yl9lcDBfZGVxdWV1ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1 Y3QgdXNiX3JlcXVlc3QgKnVfcmVxKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19h c3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJc3RydWN0 IGFzdF92aHViX3JlcSAqcmVxOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJ TlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwkvKiBP bmx5IG9uZSByZXF1ZXN0IGNhbiBiZSBpbiB0aGUgcXVldWUgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0 X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOwor CisJLyogSXMgaXQgb3VycyA/ICovCisJaWYgKHJlcSAmJiB1X3JlcSA9PSAmcmVxLT5yZXEpIHsK KwkJRVBWREJHKGVwLCAiZGVxdWV1ZSByZXEgQCVwXG4iLCByZXEpOworCisJCS8qCisJCSAqIFdl IGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoICJhY3RpdmUiIGFzIGFsbAorCQkgKiBETUFzIGdvIHRv IHRoZSBFUCBidWZmZXJzLCBub3QgdGhlIHJlcXVlc3QuCisJCSAqLworCQlhc3Rfdmh1Yl9kb25l KGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKKworCQkvKiBXZSBkbyBzdGFsbCB0aGUgRVAgdG8gY2xl YW4gdGhpbmdzIHVwIGluIEhXICovCisJCXdyaXRlbChWSFVCX0VQMF9DVFJMX1NUQUxMLCBlcC0+ ZXAwLmN0bHN0YXQpOworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJZXAt PmVwMC5kaXJfaW4gPSBmYWxzZTsKKwkJcmMgPSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgdXNiX2VwX29wcyBhc3Rfdmh1Yl9lcDBfb3BzID0geworCS5xdWV1ZQkJPSBhc3Rf dmh1Yl9lcDBfcXVldWUsCisJLmRlcXVldWUJPSBhc3Rfdmh1Yl9lcDBfZGVxdWV1ZSwKKwkuYWxs b2NfcmVxdWVzdAk9IGFzdF92aHViX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdAk9IGFz dF92aHViX2ZyZWVfcmVxdWVzdCwKK307CisKK3ZvaWQgYXN0X3ZodWJfaW5pdF9lcDAoc3RydWN0 IGFzdF92aHViICp2aHViLCBzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkgICAgICAgc3RydWN0 IGFzdF92aHViX2RldiAqZGV2KQoreworCW1lbXNldChlcCwgMCwgc2l6ZW9mKCplcCkpOworCisJ SU5JVF9MSVNUX0hFQUQoJmVwLT5lcC5lcF9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZXAtPnF1 ZXVlKTsKKwllcC0+ZXAub3BzID0gJmFzdF92aHViX2VwMF9vcHM7CisJZXAtPmVwLm5hbWUgPSAi ZXAwIjsKKwllcC0+ZXAuY2Fwcy50eXBlX2NvbnRyb2wgPSB0cnVlOworCXVzYl9lcF9zZXRfbWF4 cGFja2V0X2xpbWl0KCZlcC0+ZXAsIEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUKTsKKwllcC0+ZF9p ZHggPSAwOworCWVwLT5kZXYgPSBkZXY7CisJZXAtPnZodWIgPSB2aHViOworCWVwLT5lcDAuc3Rh dGUgPSBlcDBfc3RhdGVfdG9rZW47CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5lcDAucmVxLnF1ZXVl KTsKKwllcC0+ZXAwLnJlcS5pbnRlcm5hbCA9IHRydWU7CisKKwkvKiBTbWFsbCBkaWZmZXJlbmNl IGJldHdlZW4gdkh1YiBhbmQgZGV2aWNlcyAqLworCWlmIChkZXYpIHsKKwkJZXAtPmVwMC5jdGxz dGF0ID0gZGV2LT5yZWdzICsgQVNUX1ZIVUJfREVWX0VQMF9DVFJMOworCQllcC0+ZXAwLnNldHVw ID0gdmh1Yi0+cmVncyArCisJCQlBU1RfVkhVQl9TRVRVUDAgKyA4ICogKGRldi0+aW5kZXggKyAx KTsKKwkJZXAtPmJ1ZiA9IHZodWItPmVwMF9idWZzICsKKwkJCUFTVF9WSFVCX0VQMF9NQVhfUEFD S0VUICogKGRldi0+aW5kZXggKyAxKTsKKwkJZXAtPmJ1Zl9kbWEgPSB2aHViLT5lcDBfYnVmc19k bWEgKworCQkJQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKiAoZGV2LT5pbmRleCArIDEpOworCX0g ZWxzZSB7CisJCWVwLT5lcDAuY3Rsc3RhdCA9IHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDBfQ1RS TDsKKwkJZXAtPmVwMC5zZXR1cCA9IHZodWItPnJlZ3MgKyBBU1RfVkhVQl9TRVRVUDA7CisJCWVw LT5idWYgPSB2aHViLT5lcDBfYnVmczsKKwkJZXAtPmJ1Zl9kbWEgPSB2aHViLT5lcDBfYnVmc19k bWE7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1 Yi9lcG4uYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXBuLmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44MGM5ZmVhYzUxNDcKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5jCkBAIC0w LDAgKzEsODQzIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKKy8qCisg KiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIiIFVTQiBnYWRnZXQK KyAqCisgKiBlcG4uYyAtIEdlbmVyaWMgZW5kcG9pbnRzIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5 cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBz b2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5k ZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNo ZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIg b2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1 bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51 eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3Ns YWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4K KyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+ CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNp bmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNs dWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVk ZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgInZodWIuaCIKKworI2RlZmluZSBF WFRSQV9DSEVDS1MKKworI2lmZGVmIEVYVFJBX0NIRUNLUworI2RlZmluZSBDSEVDSyhlcCwgZXhw ciwgZm10Li4uKQkJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoIShleHByKSkgRVBEQkcoZXAs ICJDSEVDSzoiIGZtdCk7CQlcCisJfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0soZXAs IGV4cHIsIGZtdC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgYXN0 X3ZodWJfZXBuX2tpY2soc3RydWN0IGFzdF92aHViX2VwICplcCwgc3RydWN0IGFzdF92aHViX3Jl cSAqcmVxKQoreworCXVuc2lnbmVkIGludCBhY3QgPSByZXEtPnJlcS5hY3R1YWw7CisJdW5zaWdu ZWQgaW50IGxlbiA9IHJlcS0+cmVxLmxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisKKwkv KiBUaGVyZSBzaG91bGQgYmUgbm8gRE1BIG9uZ29pbmcgKi8KKwlXQVJOX09OKHJlcS0+YWN0aXZl KTsKKworCS8qIENhbGN1bGF0ZSBuZXh0IGNodW5rIHNpemUgKi8KKwljaHVuayA9IGxlbiAtIGFj dDsKKwlpZiAoY2h1bmsgPiBlcC0+ZXAubWF4cGFja2V0KQorCQljaHVuayA9IGVwLT5lcC5tYXhw YWNrZXQ7CisJZWxzZSBpZiAoKGNodW5rIDwgZXAtPmVwLm1heHBhY2tldCkgfHwgIXJlcS0+cmVx Lnplcm8pCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCUVQVkRCRyhlcCwgImtpY2sgcmVxICVw IGFjdD0lZC8lZCBjaHVuaz0lZCBsYXN0PSVkXG4iLAorCSAgICAgICByZXEsIGFjdCwgbGVuLCBj aHVuaywgcmVxLT5sYXN0X2Rlc2MpOworCisJLyogSWYgRE1BIHVuYXZhaWxhYmxlLCB1c2luZyBz dGFnaW5nIEVQIGJ1ZmZlciAqLworCWlmICghcmVxLT5yZXEuZG1hKSB7CisKKwkJLyogRm9yIElO IHRyYW5zZmVycywgY29weSBkYXRhIG92ZXIgZmlyc3QgKi8KKwkJaWYgKGVwLT5lcG4uaXNfaW4p CisJCQltZW1jcHkoZXAtPmJ1ZiwgcmVxLT5yZXEuYnVmICsgYWN0LCBjaHVuayk7CisJCXdyaXRl bChlcC0+YnVmX2RtYSwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19CQVNFKTsKKwl9 IGVsc2UKKwkJd3JpdGVsKHJlcS0+cmVxLmRtYSArIGFjdCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZI VUJfRVBfREVTQ19CQVNFKTsKKworCS8qIFN0YXJ0IERNQSAqLworCXJlcS0+YWN0aXZlID0gdHJ1 ZTsKKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VUX1RYX1NJWkUoY2h1bmspLAorCSAgICAgICBlcC0+ ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJd3JpdGVsKFZIVUJfRVBfRE1B X1NFVF9UWF9TSVpFKGNodW5rKSB8IFZIVUJfRVBfRE1BX1NJTkdMRV9LSUNLLAorCSAgICAgICBl cC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7Cit9CisKK3N0YXRpYyB2b2lk IGFzdF92aHViX2Vwbl9oYW5kbGVfYWNrKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJc3Ry dWN0IGFzdF92aHViX3JlcSAqcmVxOworCXVuc2lnbmVkIGludCBsZW47CisJdTMyIHN0YXQ7CisK KwkvKiBSZWFkIEVQIHN0YXR1cyAqLworCXN0YXQgPSByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1Rf VkhVQl9FUF9ERVNDX1NUQVRVUyk7CisKKwkvKiBHcmFiIGN1cnJlbnQgcmVxdWVzdCBpZiBhbnkg Ki8KKwlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFz dF92aHViX3JlcSwgcXVldWUpOworCisJRVBWREJHKGVwLCAiQUNLIHN0YXR1cz0lMDh4IGlzX2lu PSVkLCByZXE9JXAgKGFjdGl2ZT0lZClcbiIsCisJICAgICAgIHN0YXQsIGVwLT5lcG4uaXNfaW4s IHJlcSwgcmVxID8gcmVxLT5hY3RpdmUgOiAwKTsKKworCS8qIEluIGFic2VuY2Ugb2YgYSByZXF1 ZXN0LCBiYWlsIG91dCwgbXVzdCBoYXZlIGJlZW4gZGVxdWV1ZWQgKi8KKwlpZiAoIXJlcSkKKwkJ cmV0dXJuOworCisJLyoKKwkgKiBSZXF1ZXN0IG5vdCBhY3RpdmUsIG1vdmUgb24gdG8gcHJvY2Vz c2luZyBxdWV1ZSwgYWN0aXZlIHJlcXVlc3QKKwkgKiB3YXMgcHJvYmFibHkgZGVxdWV1ZWQKKwkg Ki8KKwlpZiAoIXJlcS0+YWN0aXZlKQorCQlnb3RvIG5leHRfY2h1bms7CisKKwkvKiBDaGVjayBp ZiBIVyBoYXMgbW92ZWQgb24gKi8KKwlpZiAoVkhVQl9FUF9ETUFfUlBUUihzdGF0KSAhPSAwKSB7 CisJCUVQREJHKGVwLCAiRE1BIHJlYWQgcG9pbnRlciBub3QgMCAhXG4iKTsKKwkJcmV0dXJuOwor CX0KKworCS8qIE5vIGN1cnJlbnQgRE1BIG9uZ29pbmcgKi8KKwlyZXEtPmFjdGl2ZSA9IGZhbHNl OworCisJLyogR3JhYiBsZW5naHQgb3V0IG9mIEhXICovCisJbGVuID0gVkhVQl9FUF9ETUFfVFhf U0laRShzdGF0KTsKKworCS8qIElmIG5vdCB1c2luZyBETUEsIGNvcHkgZGF0YSBvdXQgaWYgbmVl ZGVkICovCisJaWYgKCFyZXEtPnJlcS5kbWEgJiYgIWVwLT5lcG4uaXNfaW4gJiYgbGVuKQorCQlt ZW1jcHkocmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsLCBlcC0+YnVmLCBsZW4pOworCisJ LyogQWRqdXN0IHNpemUgKi8KKwlyZXEtPnJlcS5hY3R1YWwgKz0gbGVuOworCisJLyogQ2hlY2sg Zm9yIHNob3J0IHBhY2tldCAqLworCWlmIChsZW4gPCBlcC0+ZXAubWF4cGFja2V0KQorCQlyZXEt Pmxhc3RfZGVzYyA9IDE7CisKKwkvKiBUaGF0J3MgaXQgPyBjb21wbGV0ZSB0aGUgcmVxdWVzdCBh bmQgcGljayBhIG5ldyBvbmUgKi8KKwlpZiAocmVxLT5sYXN0X2Rlc2MgPj0gMCkgeworCQlhc3Rf dmh1Yl9kb25lKGVwLCByZXEsIDApOworCQlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwo JmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwKKwkJCQkJICAgICAgIHF1ZXVlKTsKKwor CQkvKgorCQkgKiBEdWUgdG8gbG9jayBkcm9wcGluZyBpbnNpZGUgImRvbmUiIHRoZSBuZXh0IHJl cXVlc3QgY291bGQKKwkJICogYWxyZWFkeSBiZSBhY3RpdmUsIHNvIGNoZWNrIGZvciB0aGF0IGFu ZCBiYWlsIGlmIG5lZWRlZC4KKwkJICovCisJCWlmICghcmVxIHx8IHJlcS0+YWN0aXZlKQorCQkJ cmV0dXJuOworCX0KKworIG5leHRfY2h1bms6CisJYXN0X3ZodWJfZXBuX2tpY2soZXAsIHJlcSk7 Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFzdF92aHViX2NvdW50X2ZyZWVfZGVz Y3Moc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwkvKgorCSAqIGRfbmV4dCA9PSBkX2xhc3Qg bWVhbnMgZGVzY3JpcHRvciBsaXN0IGVtcHR5IHRvIEhXLAorCSAqIHRodXMgd2UgY2FuIG9ubHkg aGF2ZSBBU1RfVkhVQl9ERVNDU19DT1VOVC0xIGRlc2NyaXB0b3JzCisJICogaW4gdGhlIGxpc3QK KwkgKi8KKwlyZXR1cm4gKGVwLT5lcG4uZF9sYXN0ICsgQVNUX1ZIVUJfREVTQ1NfQ09VTlQgLSBl cC0+ZXBuLmRfbmV4dCAtIDEpICYKKwkJKEFTVF9WSFVCX0RFU0NTX0NPVU5UIC0gMSk7Cit9CisK K3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9raWNrX2Rlc2Moc3RydWN0IGFzdF92aHViX2VwICpl cCwKKwkJCQkgICBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEpCit7CisJdW5zaWduZWQgaW50IGFj dCA9IHJlcS0+YWN0X2NvdW50OworCXVuc2lnbmVkIGludCBsZW4gPSByZXEtPnJlcS5sZW5ndGg7 CisJdW5zaWduZWQgaW50IGNodW5rOworCisJLyogTWFyayByZXF1ZXN0IGFjdGl2ZSBpZiBub3Qg YWxyZWFkeSAqLworCXJlcS0+YWN0aXZlID0gdHJ1ZTsKKworCS8qIElmIHRoZSByZXF1ZXN0IHdh cyBhbHJlYWR5IGNvbXBsZXRlbHkgd3JpdHRlbiwgZG8gbm90aGluZyAqLworCWlmIChyZXEtPmxh c3RfZGVzYyA+PSAwKQorCQlyZXR1cm47CisKKwlFUFZEQkcoZXAsICJraWNrIGFjdD0lZC8lZCBj aHVua19tYXg9JWQgZnJlZV9kZXNjcz0lZFxuIiwKKwkgICAgICAgYWN0LCBsZW4sIGVwLT5lcG4u Y2h1bmtfbWF4LCBhc3Rfdmh1Yl9jb3VudF9mcmVlX2Rlc2NzKGVwKSk7CisKKwkvKiBXaGlsZSB3 ZSBjYW4gY3JlYXRlIGRlc2NyaXB0b3JzICovCisJd2hpbGUgKGFzdF92aHViX2NvdW50X2ZyZWVf ZGVzY3MoZXApICYmIHJlcS0+bGFzdF9kZXNjIDwgMCkgeworCQlzdHJ1Y3QgYXN0X3ZodWJfZGVz YyAqZGVzYzsKKwkJdW5zaWduZWQgaW50IGRfbnVtOworCisJCS8qIEdyYWIgbmV4dCBmcmVlIGRl c2NyaXB0b3IgKi8KKwkJZF9udW0gPSBlcC0+ZXBuLmRfbmV4dDsKKwkJZGVzYyA9ICZlcC0+ZXBu LmRlc2NzW2RfbnVtXTsKKwkJZXAtPmVwbi5kX25leHQgPSAoZF9udW0gKyAxKSAmIChBU1RfVkhV Ql9ERVNDU19DT1VOVCAtIDEpOworCisJCS8qIENhbGN1bGF0ZSBuZXh0IGNodW5rIHNpemUgKi8K KwkJY2h1bmsgPSBsZW4gLSBhY3Q7CisJCWlmIChjaHVuayA8PSBlcC0+ZXBuLmNodW5rX21heCkg eworCQkJLyoKKwkJCSAqIElzIHRoaXMgdGhlIGxhc3QgcGFja2V0ID8gQmVjYXVzZSBvZiBoYXZp bmcgdXAgdG8gOAorCQkJICogcGFja2V0cyBpbiBhIGRlc2NyaXB0b3Igd2UgY2FuJ3QganVzdCBj b21wYXJlICJjaHVuayIKKwkJCSAqIHdpdGggZXAubWF4cGFja2V0LiBXZSBoYXZlIHRvIHNlZSBp ZiBpdCdzIGEgbXVsdGlwbGUKKwkJCSAqIG9mIGl0IHRvIGtub3cgaWYgd2UgaGF2ZSB0byBzZW5k IGEgemVybyBwYWNrZXQuCisJCQkgKiBTYWRseSB0aGF0IGludm9sdmVzIGEgbW9kdWxvIHdoaWNo IGlzIGEgYml0IGV4cGVuc2l2ZQorCQkJICogYnV0IHByb2JhYmx5IHN0aWxsIGJldHRlciB0aGFu IG5vdCBkb2luZyBpdC4KKwkJCSAqLworCQkJaWYgKCFjaHVuayB8fCAhcmVxLT5yZXEuemVybyB8 fCAoY2h1bmsgJSBlcC0+ZXAubWF4cGFja2V0KSAhPSAwKQorCQkJCXJlcS0+bGFzdF9kZXNjID0g ZF9udW07CisJCX0gZWxzZSB7CisJCQljaHVuayA9IGVwLT5lcG4uY2h1bmtfbWF4OworCQl9CisK KwkJRVBWREJHKGVwLCAiIGNodW5rOiBhY3Q9JWQvJWQgY2h1bms9JWQgbGFzdD0lZCBkZXNjPSVk IGZyZWU9JWRcbiIsCisJCSAgICAgICBhY3QsIGxlbiwgY2h1bmssIHJlcS0+bGFzdF9kZXNjLCBk X251bSwKKwkJICAgICAgIGFzdF92aHViX2NvdW50X2ZyZWVfZGVzY3MoZXApKTsKKworCQkvKiBQ b3B1bGF0ZSBkZXNjcmlwdG9yICovCisJCWRlc2MtPncwID0gY3B1X3RvX2xlMzIocmVxLT5yZXEu ZG1hICsgYWN0KTsKKworCQkvKiBJbnRlcnJ1cHQgaWYgZW5kIG9mIHJlcXVlc3Qgb3Igbm8gbW9y ZSBkZXNjcmlwdG9ycyAqLworCisJCS8qCisJCSAqIFRPRE86IEJlIHNtYXJ0ZXIgYWJvdXQgaXQs IGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoCisJCSAqIGRlc2NyaXB0b3JzIHJlcXVlc3QgYW4gaW50 ZXJydXB0IGJlZm9yZSBxdWV1ZSBlbXB0eQorCQkgKiBvciBzbyBpbiBvcmRlciB0byBiZSBhYmxl IHRvIHBvcHVsYXRlIG1vcmUgYmVmb3JlCisJCSAqIHRoZSBIVyBydW5zIG91dC4gVGhpcyBpc24n dCBhIHByb2JsZW0gYXQgdGhlIG1vbWVudAorCQkgKiBhcyB3ZSB1c2UgMjU2IGRlc2NyaXB0b3Jz IGFuZCBvbmx5IHB1dCBhdCBtb3N0IG9uZQorCQkgKiByZXF1ZXN0IGluIHRoZSByaW5nLgorCQkg Ki8KKwkJZGVzYy0+dzEgPSBjcHVfdG9fbGUzMihWSFVCX0RTQzFfSU5fU0VUX0xFTihjaHVuaykp OworCQlpZiAocmVxLT5sYXN0X2Rlc2MgPj0gMCB8fCAhYXN0X3ZodWJfY291bnRfZnJlZV9kZXNj cyhlcCkpCisJCQlkZXNjLT53MSB8PSBjcHVfdG9fbGUzMihWSFVCX0RTQzFfSU5fSU5URVJSVVBU KTsKKworCQkvKiBBY2NvdW50IHBhY2tldCAqLworCQlyZXEtPmFjdF9jb3VudCA9IGFjdCA9IGFj dCArIGNodW5rOworCX0KKworCS8qIFRlbGwgSFcgYWJvdXQgbmV3IGRlc2NyaXB0b3JzICovCisJ d3JpdGVsKFZIVUJfRVBfRE1BX1NFVF9DUFVfV1BUUihlcC0+ZXBuLmRfbmV4dCksCisJICAgICAg IGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCUVQVkRCRyhlcCwg IkhXIGtpY2tlZCwgZF9uZXh0PSVkIGRzdGF0PSUwOHhcbiIsCisJICAgICAgIGVwLT5lcG4uZF9u ZXh0LCByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUykpOworfQor CitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5faGFuZGxlX2Fja19kZXNjKHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXApCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCXVuc2lnbmVkIGludCBs ZW4sIGRfbGFzdDsKKwl1MzIgc3RhdCwgc3RhdDE7CisKKwkvKiBSZWFkIEVQIHN0YXR1cywgd29y a2Fyb3VuZCBIVyByYWNlICovCisJZG8geworCQlzdGF0ID0gcmVhZGwoZXAtPmVwbi5yZWdzICsg QVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCQlzdGF0MSA9IHJlYWRsKGVwLT5lcG4ucmVncyAr IEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKwl9IHdoaWxlKHN0YXQgIT0gc3RhdDEpOworCisJ LyogRXh0cmFjdCBSUFRSICovCisJZF9sYXN0ID0gVkhVQl9FUF9ETUFfUlBUUihzdGF0KTsKKwor CS8qIEdyYWIgY3VycmVudCByZXF1ZXN0IGlmIGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50 cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlF UFZEQkcoZXAsICJBQ0sgc3RhdHVzPSUwOHggaXNfaW49JWQgZXAtPmRfbGFzdD0lZC4uJWRcbiIs CisJICAgICAgIHN0YXQsIGVwLT5lcG4uaXNfaW4sIGVwLT5lcG4uZF9sYXN0LCBkX2xhc3QpOwor CisJLyogQ2hlY2sgYWxsIGNvbXBsZXRlZCBkZXNjcmlwdG9ycyAqLworCXdoaWxlIChlcC0+ZXBu LmRfbGFzdCAhPSBkX2xhc3QpIHsKKwkJc3RydWN0IGFzdF92aHViX2Rlc2MgKmRlc2M7CisJCXVu c2lnbmVkIGludCBkX251bTsKKwkJYm9vbCBpc19sYXN0X2Rlc2M7CisKKwkJLyogR3JhYiBuZXh0 IGNvbXBsZXRlZCBkZXNjcmlwdG9yICovCisJCWRfbnVtID0gZXAtPmVwbi5kX2xhc3Q7CisJCWRl c2MgPSAmZXAtPmVwbi5kZXNjc1tkX251bV07CisJCWVwLT5lcG4uZF9sYXN0ID0gKGRfbnVtICsg MSkgJiAoQVNUX1ZIVUJfREVTQ1NfQ09VTlQgLSAxKTsKKworCQkvKiBHcmFiIGxlbiBvdXQgb2Yg ZGVzY3JpcHRvciAqLworCQlsZW4gPSBWSFVCX0RTQzFfSU5fTEVOKGxlMzJfdG9fY3B1KGRlc2Mt PncxKSk7CisKKwkJRVBWREJHKGVwLCAiIGRlc2MgJWQgbGVuPSVkIHJlcT0lcCAoYWN0PSVkKVxu IiwKKwkJICAgICAgIGRfbnVtLCBsZW4sIHJlcSwgcmVxID8gcmVxLT5hY3RpdmUgOiAwKTsKKwor CQkvKiBJZiBubyBhY3RpdmUgcmVxdWVzdCBwZW5kaW5nLCBtb3ZlIG9uICovCisJCWlmICghcmVx IHx8ICFyZXEtPmFjdGl2ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFkanVzdCBzaXplICovCisJ CXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisKKwkJLyogSXMgdGhhdCB0aGUgbGFzdCBjaHVuayA/ ICovCisJCWlzX2xhc3RfZGVzYyA9IHJlcS0+bGFzdF9kZXNjID09IGRfbnVtOworCQlDSEVDSyhl cCwgaXNfbGFzdF9kZXNjID09IChsZW4gPCBlcC0+ZXAubWF4cGFja2V0IHx8CisJCQkJCSAgIChy ZXEtPnJlcS5hY3R1YWwgPj0gcmVxLT5yZXEubGVuZ3RoICYmCisJCQkJCSAgICAhcmVxLT5yZXEu emVybykpLAorCQkgICAgICAiTGFzdCBwYWNrZXQgZGlzY3JlcGFuY3k6IGxhc3RfZGVzYz0lZCBs ZW49JWQgci5hY3Q9JWQgIgorCQkgICAgICAici5sZW49JWQgci56ZXJvPSVkIG1wPSVkXG4iLAor CQkgICAgICBpc19sYXN0X2Rlc2MsIGxlbiwgcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5n dGgsCisJCSAgICAgIHJlcS0+cmVxLnplcm8sIGVwLT5lcC5tYXhwYWNrZXQpOworCisJCWlmIChp c19sYXN0X2Rlc2MpIHsKKwkJCS8qCisJCQkgKiBCZWNhdXNlIHdlIGNhbiBvbmx5IGhhdmUgb25l IHJlcXVlc3QgYXQgYSB0aW1lCisJCQkgKiBpbiBvdXIgZGVzY3JpcHRvciBsaXN0IGluIHRoaXMg aW1wbGVtZW50YXRpb24sCisJCQkgKiBkX2xhc3QgYW5kIGVwLT5kX2xhc3Qgc2hvdWxkIG5vdyBi ZSBlcXVhbAorCQkJICovCisJCQlDSEVDSyhlcCwgZF9sYXN0ID09IGVwLT5lcG4uZF9sYXN0LAor CQkJICAgICAgIkRNQSByZWFkIHB0ciBtaXNtYXRjaCAlZCB2cyAlZFxuIiwKKwkJCSAgICAgIGRf bGFzdCwgZXAtPmVwbi5kX2xhc3QpOworCisJCQkvKiBOb3RlOiBkb25lIHdpbGwgZHJvcCBhbmQg cmUtYWNxdWlyZSB0aGUgbG9jayAqLworCQkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAwKTsKKwkJ CXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLAorCQkJCQkJICAgICAg IHN0cnVjdCBhc3Rfdmh1Yl9yZXEsCisJCQkJCQkgICAgICAgcXVldWUpOworCQkJYnJlYWs7CisJ CX0KKwl9CisKKwkvKiBNb3JlIHdvcmsgPyAqLworCWlmIChyZXEpCisJCWFzdF92aHViX2Vwbl9r aWNrX2Rlc2MoZXAsIHJlcSk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXBuX2Fja19pcnEoc3RydWN0 IGFzdF92aHViX2VwICplcCkKK3sKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpCisJCWFzdF92aHVi X2Vwbl9oYW5kbGVfYWNrX2Rlc2MoZXApOworCWVsc2UKKwkJYXN0X3ZodWJfZXBuX2hhbmRsZV9h Y2soZXApOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9xdWV1ZShzdHJ1Y3QgdXNiX2Vw KiB1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxLAorCQkJICAgICAgZ2ZwX3QgZ2ZwX2Zs YWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2FzdF9yZXEodV9yZXEpOwor CXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92 aHViICp2aHViID0gZXAtPnZodWI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGVtcHR5 OworCWludCByYzsKKworCS8qIFBhcmFub2lkIGNoZWNrcyAqLworCWlmICghdV9yZXEgfHwgIXVf cmVxLT5jb21wbGV0ZSB8fCAhdV9yZXEtPmJ1ZikgeworCQlkZXZfd2Fybigmdmh1Yi0+cGRldi0+ ZGV2LCAiQm9ndXMgRVBuIHJlcXVlc3QgISB1X3JlcT0lcFxuIiwgdV9yZXEpOworCQlpZiAodV9y ZXEpIHsKKwkJCWRldl93YXJuKCZ2aHViLT5wZGV2LT5kZXYsICJjb21wbGV0ZT0lcCBpbnRlcm5h bD0lZFxuIiwKKwkJCQkgdV9yZXEtPmNvbXBsZXRlLCByZXEtPmludGVybmFsKTsKKwkJfQorCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBFbmRwb2ludCBlbmFibGVkID8gKi8KKwlpZiAoIWVw LT5lcG4uZW5hYmxlZCB8fCAhdV9lcC0+ZGVzYyB8fCAhZXAtPmRldiB8fCAhZXAtPmRfaWR4IHx8 CisJICAgICFlcC0+ZGV2LT5lbmFibGVkIHx8IGVwLT5kZXYtPnN1c3BlbmRlZCkgeworCQlFUERC RyhlcCwiRW5xdWVpbmcgcmVxdWVzdCBvbiB3cm9uZyBvciBkaXNhYmxlZCBFUFxuIik7CisJCXJl dHVybiAtRVNIVVRET1dOOworCX0KKworCS8qIE1hcCByZXF1ZXN0IGZvciBETUEgaWYgcG9zc2li bGUuIEZvciBub3csIHRoZSBydWxlIGZvciBETUEgaXMKKwkgKiB0aGF0OgorCSAqCisJICogICog Rm9yIHNpbmdsZSBzdGFnZSBtb2RlIChubyBkZXNjcmlwdG9ycyk6CisJICoKKwkgKiAgIC0gVGhl IGJ1ZmZlciBpcyBhbGlnbmVkIHRvIGEgOCBieXRlcyBib3VuZGFyeSAoSFcgcmVxdWlyZW1lbnQp CisJICogICAtIEZvciBhIE9VVCBlbmRwb2ludCwgdGhlIHJlcXVlc3Qgc2l6ZSBpcyBhIG11bHRp cGxlIG9mIHRoZSBFUAorCSAqICAgICBwYWNrZXQgc2l6ZSAob3RoZXJ3aXNlIHRoZSBjb250cm9s bGVyIHdpbGwgRE1BIHBhc3QgdGhlIGVuZAorCSAqICAgICBvZiB0aGUgYnVmZmVyIGlmIHRoZSBo b3N0IGlzIHNlbmRpbmcgYSB0b28gbG9uZyBwYWNrZXQpLgorCSAqCisJICogICogRm9yIGRlc2Ny aXB0b3IgbW9kZSAodHggb25seSBmb3Igbm93KSwgYWx3YXlzLgorCSAqCisJICogV2UgY291bGQg cmVsYXggdGhlIGxhdHRlciBieSBtYWtpbmcgdGhlIGRlY2lzaW9uIHRvIHVzZSB0aGUgYm91bmNl CisJICogYnVmZmVyIGJhc2VkIG9uIHRoZSBzaXplIG9mIGEgZ2l2ZW4gKnNlZ21lbnQqIG9mIHRo ZSByZXF1ZXN0IHJhdGhlcgorCSAqIHRoYW4gdGhlIHdob2xlIHJlcXVlc3QuCisJICovCisJaWYg KGVwLT5lcG4uZGVzY19tb2RlIHx8CisJICAgICgoKCh1bnNpZ25lZCBsb25nKXVfcmVxLT5idWYg JiA3KSA9PSAwKSAmJgorCSAgICAgKGVwLT5lcG4uaXNfaW4gfHwgISh1X3JlcS0+bGVuZ3RoICYg KHVfZXAtPm1heHBhY2tldCAtIDEpKSkpKSB7CisJCXJjID0gdXNiX2dhZGdldF9tYXBfcmVxdWVz dCgmZXAtPmRldi0+Z2FkZ2V0LCB1X3JlcSwKKwkJCQkJICAgIGVwLT5lcG4uaXNfaW4pOworCQlp ZiAocmMpIHsKKwkJCWRldl93YXJuKCZ2aHViLT5wZGV2LT5kZXYsCisJCQkJICJSZXF1ZXN0IG1h cHBpbmcgZmFpbHVyZSAlZFxuIiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlCisJ CXVfcmVxLT5kbWEgPSAwOworCisJRVBWREJHKGVwLCAiZW5xdWV1ZSByZXEgQCVwXG4iLCByZXEp OworCUVQVkRCRyhlcCwgIiBsPSVkIGRtYT0weCV4IHplcm89JWQgbm9zaG9ydD0lZCBub2lycT0l ZCBpc19pbj0lZFxuIiwKKwkgICAgICAgdV9yZXEtPmxlbmd0aCwgKHUzMil1X3JlcS0+ZG1hLCB1 X3JlcS0+emVybywKKwkgICAgICAgdV9yZXEtPnNob3J0X25vdF9vaywgdV9yZXEtPm5vX2ludGVy cnVwdCwKKwkgICAgICAgZXAtPmVwbi5pc19pbik7CisKKwkvKiBJbml0aWFsaXplIHJlcXVlc3Qg cHJvZ3Jlc3MgZmllbGRzICovCisJdV9yZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwl1X3Jl cS0+YWN0dWFsID0gMDsKKwlyZXEtPmFjdF9jb3VudCA9IDA7CisJcmVxLT5hY3RpdmUgPSBmYWxz ZTsKKwlyZXEtPmxhc3RfZGVzYyA9IC0xOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisJZW1wdHkgPSBsaXN0X2VtcHR5KCZlcC0+cXVldWUpOworCisJLyogQWRkIHJl cXVlc3QgdG8gbGlzdCBhbmQga2ljayBwcm9jZXNzaW5nIGlmIGVtcHR5ICovCisJbGlzdF9hZGRf dGFpbCgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1ZSk7CisJaWYgKGVtcHR5KSB7CisJCWlmIChlcC0+ ZXBuLmRlc2NfbW9kZSkKKwkJCWFzdF92aHViX2Vwbl9raWNrX2Rlc2MoZXAsIHJlcSk7CisJCWVs c2UKKwkJCWFzdF92aHViX2Vwbl9raWNrKGVwLCByZXEpOworCX0KKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgYXN0X3ZodWJfc3RvcF9hY3RpdmVfcmVxKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJ ICAgICBib29sIHJlc3RhcnRfZXApCit7CisJdTMyIHN0YXRlLCByZWcsIGxvb3BzOworCisJLyog U3RvcCBETUEgYWN0aXZpdHkgKi8KKwl3cml0ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJf RVBfRE1BX0NUTFNUQVQpOworCisJLyogV2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlmb3Ig KGxvb3BzID0gMDsgbG9vcHMgPCAxMDAwOyBsb29wcysrKSB7CisJCXN0YXRlID0gcmVhZGwoZXAt PmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCQlzdGF0ZSA9IFZIVUJfRVBf RE1BX1BST0NfU1RBVFVTKHN0YXRlKTsKKwkJaWYgKHN0YXRlID09IEVQX0RNQV9QUk9DX1JYX0lE TEUgfHwKKwkJICAgIHN0YXRlID09IEVQX0RNQV9QUk9DX1RYX0lETEUpCisJCQlicmVhazsKKwkJ dWRlbGF5KDEpOworCX0KKwlpZiAobG9vcHMgPj0gMTAwMCkKKwkJZGV2X3dhcm4oJmVwLT52aHVi LT5wZGV2LT5kZXYsICJUaW1lb3V0IHdhaXRpbmcgZm9yIERNQVxuIik7CisKKwkvKiBJZiB3ZSBk b24ndCBoYXZlIHRvIHJlc3RhcnQgdGhlIGVuZHBvaW50LCB0aGF0J3MgaXQgKi8KKwlpZiAoIXJl c3RhcnRfZXApCisJCXJldHVybjsKKworCS8qIFJlc3RhcnQgdGhlIGVuZHBvaW50ICovCisJaWYg KGVwLT5lcG4uZGVzY19tb2RlKSB7CisJCS8qCisJCSAqIFRha2Ugb3V0IGRlc2NyaXB0b3JzIGJ5 IHJlc2V0dGluZyB0aGUgRE1BIHJlYWQKKwkJICogcG9pbnRlciB0byBiZSBlcXVhbCB0byB0aGUg Q1BVIHdyaXRlIHBvaW50ZXIuCisJCSAqCisJCSAqIE5vdGU6IElmIHdlIGV2ZXIgc3VwcG9ydCBj cmVhdGluZyBkZXNjcmlwdG9ycyBmb3IKKwkJICogcmVxdWVzdHMgdGhhdCBhcmVuJ3QgdGhlIGhl YWQgb2YgdGhlIHF1ZXVlLCB3ZQorCQkgKiBtYXkgaGF2ZSB0byBkbyBzb21ldGhpbmcgbW9yZSBj b21wbGV4IGhlcmUsCisJCSAqIGVzcGVjaWFsbHkgaWYgdGhlIHJlcXVlc3QgYmVpbmcgdGFrZW4g b3V0IGlzCisJCSAqIG5vdCB0aGUgY3VycmVudCBoZWFkIGRlc2NyaXB0b3JzLgorCQkgKi8KKwkJ cmVnID0gVkhVQl9FUF9ETUFfU0VUX1JQVFIoZXAtPmVwbi5kX25leHQpIHwKKwkJCVZIVUJfRVBf RE1BX1NFVF9DUFVfV1BUUihlcC0+ZXBuLmRfbmV4dCk7CisJCXdyaXRlbChyZWcsIGVwLT5lcG4u cmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCQkvKiBUaGVuIHR1cm4gaXQgYmFj ayBvbiAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKwl9IGVsc2UgeworCQkvKiBTaW5nbGUgbW9k ZToganVzdCB0dXJuIGl0IGJhY2sgb24gKi8KKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYsCisJ CSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJfQorfQor CitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0 cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEpCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRv X2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1 Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAt RUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8q IE1ha2Ugc3VyZSBpdCdzIGFjdHVhbGx5IHF1ZXVlZCBvbiB0aGlzIGVuZHBvaW50ICovCisJbGlz dF9mb3JfZWFjaF9lbnRyeSAocmVxLCAmZXAtPnF1ZXVlLCBxdWV1ZSkgeworCQlpZiAoJnJlcS0+ cmVxID09IHVfcmVxKQorCQkJYnJlYWs7CisJfQorCisJaWYgKCZyZXEtPnJlcSA9PSB1X3JlcSkg eworCQlFUFZEQkcoZXAsICJkZXF1ZXVlIHJlcSBAJXAgYWN0aXZlPSVkXG4iLAorCQkgICAgICAg cmVxLCByZXEtPmFjdGl2ZSk7CisJCWlmIChyZXEtPmFjdGl2ZSkKKwkJCWFzdF92aHViX3N0b3Bf YWN0aXZlX3JlcShlcCwgdHJ1ZSk7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVT RVQpOworCQlyYyA9IDA7CisJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9j aywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKwordm9pZCBhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0 YWxsKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJdTMyIHJlZzsKKworCWlmIChXQVJOX09O KGVwLT5kX2lkeCA9PSAwKSkKKwkJcmV0dXJuOworCXJlZyA9IHJlYWRsKGVwLT5lcG4ucmVncyAr IEFTVF9WSFVCX0VQX0NPTkZJRyk7CisJaWYgKGVwLT5lcG4uc3RhbGxlZCB8fCBlcC0+ZXBuLndl ZGdlZCkKKwkJcmVnIHw9IFZIVUJfRVBfQ0ZHX1NUQUxMX0NUUkw7CisJZWxzZQorCQlyZWcgJj0g flZIVUJfRVBfQ0ZHX1NUQUxMX0NUUkw7CisJd3JpdGVsKHJlZywgZXAtPmVwbi5yZWdzICsgQVNU X1ZIVUJfRVBfQ09ORklHKTsKKworCWlmICghZXAtPmVwbi5zdGFsbGVkICYmICFlcC0+ZXBuLndl ZGdlZCkKKwkJd3JpdGVsKFZIVUJfRVBfVE9HR0xFX1NFVF9FUE5VTShlcC0+ZXBuLmdfaWR4KSwK KwkJICAgICAgIGVwLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfVE9HR0xFKTsKK30KKworc3Rh dGljIGludCBhc3Rfdmh1Yl9zZXRfaGFsdF9hbmRfd2VkZ2Uoc3RydWN0IHVzYl9lcCogdV9lcCwg Ym9vbCBoYWx0LAorCQkJCSAgICAgIGJvb2wgd2VkZ2UpCit7CisJc3RydWN0IGFzdF92aHViX2Vw ICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1 YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJRVBEQkcoZXAsICJTZXQgaGFsdCAoJWQpICYg d2VkZ2UgKCVkKVxuIiwgaGFsdCwgd2VkZ2UpOworCisJaWYgKCF1X2VwIHx8ICF1X2VwLT5kZXNj KQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZXAtPmRfaWR4ID09IDApCisJCXJldHVybiAwOwor CWlmIChlcC0+ZXBuLmlzX2lzbykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIEZhaWwgd2l0aCBzdGlsbC1idXN5 IElOIGVuZHBvaW50cyAqLworCWlmIChoYWx0ICYmIGVwLT5lcG4uaXNfaW4gJiYgIWxpc3RfZW1w dHkoJmVwLT5xdWV1ZSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywg ZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsKKwl9CisJZXAtPmVwbi5zdGFsbGVkID0gaGFsdDsK KwllcC0+ZXBuLndlZGdlZCA9IHdlZGdlOworCWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXAp OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0 dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX3NldF9oYWx0KHN0cnVjdCB1c2Jf ZXAgKnVfZXAsIGludCB2YWx1ZSkKK3sKKwlyZXR1cm4gYXN0X3ZodWJfc2V0X2hhbHRfYW5kX3dl ZGdlKHVfZXAsIHZhbHVlICE9IDAsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9l cG5fc2V0X3dlZGdlKHN0cnVjdCB1c2JfZXAgKnVfZXApCit7CisJcmV0dXJuIGFzdF92aHViX3Nl dF9oYWx0X2FuZF93ZWRnZSh1X2VwLCB0cnVlLCB0cnVlKTsKK30KKworc3RhdGljIGludCBhc3Rf dmh1Yl9lcG5fZGlzYWJsZShzdHJ1Y3QgdXNiX2VwKiB1X2VwKQoreworCXN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAt PnZodWI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1MzIgaW1hc2ssIGVwX2llcjsKKworCUVQ REJHKGVwLCAiRGlzYWJsaW5nICFcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxv Y2ssIGZsYWdzKTsKKworCWVwLT5lcG4uZW5hYmxlZCA9IGZhbHNlOworCisJLyogU3RvcCBhY3Rp dmUgRE1BIGlmIGFueSAqLworCWFzdF92aHViX3N0b3BfYWN0aXZlX3JlcShlcCwgZmFsc2UpOwor CisJLyogRGlzYWJsZSBlbmRwb2ludCAqLworCXdyaXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBBU1Rf VkhVQl9FUF9DT05GSUcpOworCisJLyogRGlzYWJsZSBBQ0sgaW50ZXJydXB0ICovCisJaW1hc2sg PSBWSFVCX0VQX0lSUShlcC0+ZXBuLmdfaWR4KTsKKwllcF9pZXIgPSByZWFkbCh2aHViLT5yZWdz ICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJZXBfaWVyICY9IH5pbWFzazsKKwl3cml0ZWwoZXBf aWVyLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJd3JpdGVsKGltYXNrLCB2 aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7CisKKwkvKiBOdWtlIGFsbCBwZW5kaW5n IHJlcXVlc3RzICovCisJYXN0X3ZodWJfbnVrZShlcCwgLUVTSFVURE9XTik7CisKKwkvKiBObyBt b3JlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QgKi8KKwllcC0+ZXAuZGVzYyA9 IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisK KwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fZW5hYmxlKHN0cnVjdCB1 c2JfZXAqIHVfZXAsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlw dG9yICpkZXNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcF90eXBlX3N0cmluZ1tdIF9fbWF5 YmVfdW51c2VkID0geyAiY3RybCIsCisJCQkJCQkJICAgICAgICJpc29jIiwKKwkJCQkJCQkgICAg ICAgImJ1bGsiLAorCQkJCQkJCSAgICAgICAiaW50ciIgfTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAg KmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmRldjsKKwlzdHJ1 Y3QgYXN0X3ZodWIgKnZodWI7CisJdTE2IG1heHBhY2tldCwgdHlwZTsKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCXUzMiBlcF9jb25mLCBlcF9pZXIsIGltYXNrOworCisJLyogQ2hlY2sgYXJndW1l bnRzICovCisJaWYgKCF1X2VwIHx8ICFkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heHBh Y2tldCA9IHVzYl9lbmRwb2ludF9tYXhwKGRlc2MpOworCWlmICghZXAtPmRfaWR4IHx8ICFlcC0+ ZGV2IHx8CisJICAgIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQgfHwK KwkgICAgbWF4cGFja2V0ID09IDAgfHwgbWF4cGFja2V0ID4gZXAtPmVwLm1heHBhY2tldCkgewor CQlFUERCRyhlcCwgIkludmFsaWQgRVAgZW5hYmxlLGRfaWR4PSVkLGRldj0lcCx0eXBlPSVkLG1w PSVkLyVkXG4iLAorCQkgICAgICBlcC0+ZF9pZHgsIGVwLT5kZXYsIGRlc2MtPmJEZXNjcmlwdG9y VHlwZSwKKwkJICAgICAgbWF4cGFja2V0LCBlcC0+ZXAubWF4cGFja2V0KTsKKwkJcmV0dXJuIC1F SU5WQUw7CisJfQorCWlmIChlcC0+ZF9pZHggIT0gdXNiX2VuZHBvaW50X251bShkZXNjKSkgewor CQlFUERCRyhlcCwgIkVQIG51bWJlciBtaXNtYXRjaCAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7 CisJfQorCisJaWYgKGVwLT5lcG4uZW5hYmxlZCkgeworCQlFUERCRyhlcCwgIkFscmVhZHkgZW5h YmxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWRldiA9IGVwLT5kZXY7CisJdmh1YiA9 IGVwLT52aHViOworCisJLyogQ2hlY2sgZGV2aWNlIHN0YXRlICovCisJaWYgKCFkZXYtPmRyaXZl cikgeworCQlFUERCRyhlcCwgIkJvZ3VzIGRldmljZSBzdGF0ZTogZHJpdmVyPSVwIHNwZWVkPSVk XG4iLAorCQkgICAgICAgZGV2LT5kcml2ZXIsIGRldi0+Z2FkZ2V0LnNwZWVkKTsKKwkJcmV0dXJu IC1FU0hVVERPV047CisJfQorCisJLyogR3JhYiBzb21lIGluZm8gZnJvbSB0aGUgZGVzY3JpcHRv ciAqLworCWVwLT5lcG4uaXNfaW4gPSB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpOworCWVwLT5l cC5tYXhwYWNrZXQgPSBtYXhwYWNrZXQ7CisJdHlwZSA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2Mp OworCWVwLT5lcG4uZF9uZXh0ID0gZXAtPmVwbi5kX2xhc3QgPSAwOworCWVwLT5lcG4uaXNfaXNv ID0gZmFsc2U7CisJZXAtPmVwbi5zdGFsbGVkID0gZmFsc2U7CisJZXAtPmVwbi53ZWRnZWQgPSBm YWxzZTsKKworCUVQREJHKGVwLCAiRW5hYmxpbmcgWyVzXSAlcyBudW0gJWQgbWF4cGFja2V0PSVk XG4iLAorCSAgICAgIGVwLT5lcG4uaXNfaW4gPyAiaW4iIDogIm91dCIsIGVwX3R5cGVfc3RyaW5n W3R5cGVdLAorCSAgICAgIHVzYl9lbmRwb2ludF9udW0oZGVzYyksIG1heHBhY2tldCk7CisKKwkv KiBDYW4gd2UgdXNlIERNQSBkZXNjcmlwdG9yIG1vZGUgPyAqLworCWVwLT5lcG4uZGVzY19tb2Rl ID0gZXAtPmVwbi5kZXNjcyAmJiBlcC0+ZXBuLmlzX2luOworCWlmIChlcC0+ZXBuLmRlc2NfbW9k ZSkKKwkJbWVtc2V0KGVwLT5lcG4uZGVzY3MsIDAsIDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCk7 CisKKwkvKgorCSAqIExhcmdlIHNlbmQgZnVuY3Rpb24gY2FuIHNlbmQgdXAgdG8gOCBwYWNrZXRz IGZyb20KKwkgKiBvbmUgZGVzY3JpcHRvciB3aXRoIGEgbGltaXQgb2YgNDA5NSBieXRlcy4KKwkg Ki8KKwllcC0+ZXBuLmNodW5rX21heCA9IGVwLT5lcC5tYXhwYWNrZXQ7CisJaWYgKGVwLT5lcG4u aXNfaW4pIHsKKwkJZXAtPmVwbi5jaHVua19tYXggPDw9IDM7CisJCXdoaWxlIChlcC0+ZXBuLmNo dW5rX21heCA+IDQwOTUpCisJCQllcC0+ZXBuLmNodW5rX21heCAtPSBlcC0+ZXAubWF4cGFja2V0 OworCX0KKworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9M OgorCQlFUERCRyhlcCwgIk9ubHkgb25lIGNvbnRyb2wgZW5kcG9pbnRcbiIpOworCQlyZXR1cm4g LUVJTlZBTDsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJZXBfY29uZiA9IFZIVUJf RVBfQ0ZHX1NFVF9UWVBFKEVQX1RZUEVfSU5UKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9J TlRfWEZFUl9CVUxLOgorCQllcF9jb25mID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9C VUxLKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgorCQllcF9jb25m ID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9JU08pOworCQllcC0+ZXBuLmlzX2lzbyA9 IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8q IEVuY29kZSB0aGUgcmVzdCBvZiB0aGUgRVAgY29uZmlnIHJlZ2lzdGVyICovCisJaWYgKG1heHBh Y2tldCA8IDEwMjQpCisJCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfU0VUX01BWF9QS1QobWF4cGFj a2V0KTsKKwlpZiAoIWVwLT5lcG4uaXNfaW4pCisJCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfRElS X09VVDsKKwllcF9jb25mIHw9IFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0odXNiX2VuZHBvaW50X251 bShkZXNjKSk7CisJZXBfY29uZiB8PSBWSFVCX0VQX0NGR19FTkFCTEU7CisJZXBfY29uZiB8PSBW SFVCX0VQX0NGR19TRVRfREVWKGRldi0+aW5kZXggKyAxKTsKKwlFUFZEQkcoZXAsICJjb25maWc9 JTA4eFxuIiwgZXBfY29uZik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxh Z3MpOworCisJLyogRGlzYWJsZSBIVyBhbmQgcmVzZXQgRE1BICovCisJd3JpdGVsKDAsIGVwLT5l cG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisJd3JpdGVsKFZIVUJfRVBfRE1BX0NUUkxf UkVTRVQsCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsK KworCS8qIENvbmZpZ3VyZSBhbmQgZW5hYmxlICovCisJd3JpdGVsKGVwX2NvbmYsIGVwLT5lcG4u cmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpIHsK KwkJLyogQ2xlYXIgRE1BIHN0YXR1cywgaW5jbHVkaW5nIHRoZSBETUEgcmVhZCBwdHIgKi8KKwkJ d3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCQkv KiBTZXQgZGVzY3JpcHRvciBiYXNlICovCisJCXdyaXRlbChlcC0+ZXBuLmRlc2NzX2RtYSwKKwkJ ICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfQkFTRSk7CisKKwkJLyogU2V0 IGJhc2UgRE1BIGNvbmZpZyB2YWx1ZSAqLworCQllcC0+ZXBuLmRtYV9jb25mID0gVkhVQl9FUF9E TUFfREVTQ19NT0RFOworCQlpZiAoZXAtPmVwbi5pc19pbikKKwkJCWVwLT5lcG4uZG1hX2NvbmYg fD0gVkhVQl9FUF9ETUFfSU5fTE9OR19NT0RFOworCisJCS8qIEZpcnN0IHJlc2V0IGFuZCBkaXNh YmxlIGFsbCBvcGVyYXRpb25zICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mIHwgVkhVQl9F UF9ETUFfQ1RSTF9SRVNFVCwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RN QV9DVExTVEFUKTsKKworCQkvKiBFbmFibGUgZGVzY3JpcHRvciBtb2RlICovCisJCXdyaXRlbChl cC0+ZXBuLmRtYV9jb25mLAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1B X0NUTFNUQVQpOworCX0gZWxzZSB7CisJCS8qIFNldCBiYXNlIERNQSBjb25maWcgdmFsdWUgKi8K KwkJZXAtPmVwbi5kbWFfY29uZiA9IFZIVUJfRVBfRE1BX1NJTkdMRV9TVEFHRTsKKworCQkvKiBS ZXNldCBhbmQgc3dpdGNoIHRvIHNpbmdsZSBzdGFnZSBtb2RlICovCisJCXdyaXRlbChlcC0+ZXBu LmRtYV9jb25mIHwgVkhVQl9FUF9ETUFfQ1RSTF9SRVNFVCwKKwkJICAgICAgIGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYs CisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJCXdy aXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJfQorCisJ LyogQ2xlYW51cCBkYXRhIHRvZ2dsZSBqdXN0IGluIGNhc2UgKi8KKwl3cml0ZWwoVkhVQl9FUF9U T0dHTEVfU0VUX0VQTlVNKGVwLT5lcG4uZ19pZHgpLAorCSAgICAgICB2aHViLT5yZWdzICsgQVNU X1ZIVUJfRVBfVE9HR0xFKTsKKworCS8qIENsZWFudXAgYW5kIGVuYWJsZSBBQ0sgaW50ZXJydXB0 ICovCisJaW1hc2sgPSBWSFVCX0VQX0lSUShlcC0+ZXBuLmdfaWR4KTsKKwl3cml0ZWwoaW1hc2ss IHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKwllcF9pZXIgPSByZWFkbCh2aHVi LT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJZXBfaWVyIHw9IGltYXNrOworCXdyaXRl bChlcF9pZXIsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKworCS8qIFdvb3Qs IHdlIGFyZSBvbmxpbmUgISAqLworCWVwLT5lcG4uZW5hYmxlZCA9IHRydWU7CisKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2Rpc3Bvc2Uoc3RydWN0IHVzYl9lcCAqdV9lcCkKK3sK KwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCisJaWYgKFdBUk5f T04oIWVwLT5kZXYgfHwgIWVwLT5kX2lkeCkpCisJCXJldHVybjsKKworCUVQREJHKGVwLCAiUmVs ZWFzaW5nIGVuZHBvaW50XG4iKTsKKworCS8qIFRha2UgaXQgb3V0IG9mIHRoZSBFUCBsaXN0ICov CisJbGlzdF9kZWxfaW5pdCgmZXAtPmVwLmVwX2xpc3QpOworCisJLyogTWFyayB0aGUgYWRkcmVz cyBmcmVlIGluIHRoZSBkZXZpY2UgKi8KKwllcC0+ZGV2LT5lcG5zW2VwLT5kX2lkeCAtIDFdID0g TlVMTDsKKworCS8qIEZyZWUgbmFtZSAmIERNQSBidWZmZXJzICovCisJa2ZyZWUoZXAtPmVwLm5h bWUpOworCWVwLT5lcC5uYW1lID0gTlVMTDsKKwlkbWFfZnJlZV9jb2hlcmVudCgmZXAtPnZodWIt PnBkZXYtPmRldiwKKwkJCSAgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQgKworCQkJICA4ICogQVNU X1ZIVUJfREVTQ1NfQ09VTlQsCisJCQkgIGVwLT5idWYsIGVwLT5idWZfZG1hKTsKKwllcC0+YnVm ID0gTlVMTDsKKwllcC0+ZXBuLmRlc2NzID0gTlVMTDsKKworCS8qIE1hcmsgZnJlZSAqLworCWVw LT5kZXYgPSBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgYXN0X3Zo dWJfZXBuX29wcyA9IHsKKwkuZW5hYmxlCQk9IGFzdF92aHViX2Vwbl9lbmFibGUsCisJLmRpc2Fi bGUJPSBhc3Rfdmh1Yl9lcG5fZGlzYWJsZSwKKwkuZGlzcG9zZQk9IGFzdF92aHViX2Vwbl9kaXNw b3NlLAorCS5xdWV1ZQkJPSBhc3Rfdmh1Yl9lcG5fcXVldWUsCisJLmRlcXVldWUJPSBhc3Rfdmh1 Yl9lcG5fZGVxdWV1ZSwKKwkuc2V0X2hhbHQJPSBhc3Rfdmh1Yl9lcG5fc2V0X2hhbHQsCisJLnNl dF93ZWRnZQk9IGFzdF92aHViX2Vwbl9zZXRfd2VkZ2UsCisJLmFsbG9jX3JlcXVlc3QJPSBhc3Rf dmh1Yl9hbGxvY19yZXF1ZXN0LAorCS5mcmVlX3JlcXVlc3QJPSBhc3Rfdmh1Yl9mcmVlX3JlcXVl c3QsCit9OworCitzdHJ1Y3QgYXN0X3ZodWJfZXAgKmFzdF92aHViX2FsbG9jX2VwbihzdHJ1Y3Qg YXN0X3ZodWJfZGV2ICpkLCB1OCBhZGRyKQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGQt PnZodWI7CisJc3RydWN0IGFzdF92aHViX2VwICplcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CWludCBpOworCisJLyogRmluZCBhIGZyZWUgb25lIChubyBkZXZpY2UpICovCisJc3Bpbl9sb2Nr X2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJf TlVNX0dFTl9FUHM7IGkrKykKKwkJaWYgKHZodWItPmVwbnNbaV0uZGV2ID09IE5VTEwpCisJCQli cmVhazsKKwlpZiAoaSA+PSBBU1RfVkhVQl9OVU1fR0VOX0VQcykgeworCQlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8q IFNldCBpdCB1cCAqLworCWVwID0gJnZodWItPmVwbnNbaV07CisJZXAtPmRldiA9IGQ7CisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAiQWxs b2NhdGluZyBnZW4gRVAgJWQgZm9yIGFkZHIgJWRcbiIsIGksIGFkZHIpOworCUlOSVRfTElTVF9I RUFEKCZlcC0+cXVldWUpOworCWVwLT5kX2lkeCA9IGFkZHI7CisJZXAtPnZodWIgPSB2aHViOwor CWVwLT5lcC5vcHMgPSAmYXN0X3ZodWJfZXBuX29wczsKKwllcC0+ZXAubmFtZSA9IGthc3ByaW50 ZihHRlBfS0VSTkVMLCAiZXAlZCIsIGFkZHIpOworCWQtPmVwbnNbYWRkci0xXSA9IGVwOworCWVw LT5lcG4uZ19pZHggPSBpOworCWVwLT5lcG4ucmVncyA9IHZodWItPnJlZ3MgKyAweDIwMCArIChp ICogMHgxMCk7CisKKwllcC0+YnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZ2aHViLT5wZGV2LT5k ZXYsCisJCQkJICAgICBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVCArCisJCQkJICAgICA4ICogQVNU X1ZIVUJfREVTQ1NfQ09VTlQsCisJCQkJICAgICAmZXAtPmJ1Zl9kbWEsIEdGUF9LRVJORUwpOwor CWlmICghZXAtPmJ1ZikgeworCQlrZnJlZShlcC0+ZXAubmFtZSk7CisJCWVwLT5lcC5uYW1lID0g TlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWVwLT5lcG4uZGVzY3MgPSBlcC0+YnVmICsgQVNU X1ZIVUJfRVBuX01BWF9QQUNLRVQ7CisJZXAtPmVwbi5kZXNjc19kbWEgPSBlcC0+YnVmX2RtYSAr IEFTVF9WSFVCX0VQbl9NQVhfUEFDS0VUOworCisJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQo JmVwLT5lcCwgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQpOworCWxpc3RfYWRkX3RhaWwoJmVwLT5l cC5lcF9saXN0LCAmZC0+Z2FkZ2V0LmVwX2xpc3QpOworCWVwLT5lcC5jYXBzLnR5cGVfaXNvID0g dHJ1ZTsKKwllcC0+ZXAuY2Fwcy50eXBlX2J1bGsgPSB0cnVlOworCWVwLT5lcC5jYXBzLnR5cGVf aW50ID0gdHJ1ZTsKKwllcC0+ZXAuY2Fwcy5kaXJfaW4gPSB0cnVlOworCWVwLT5lcC5jYXBzLmRp cl9vdXQgPSB0cnVlOworCisJcmV0dXJuIGVwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNw ZWVkLXZodWIvaHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5h Nzc1ODJiZGExZmIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL2h1Yi5jCkBAIC0wLDAgKzEsODE5IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMCsKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBT b0MgInZIdWIiIFVTQiBnYWRnZXQKKyAqCisgKiBodWIuYyAtIHZpcnR1YWwgaHViIGhhbmRsaW5n CisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9n cmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2Rp ZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vu c2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkg bGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVk ZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Cisj aW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNs dWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxs aW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGlu dXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGlu dXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4 L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21h cC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmNk Lmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgor I2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKworI2luY2x1ZGUgInZodWIuaCIKKworLyogdXNi IDIuMCBodWIgZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBBIGZldyB0aGluZ3Mgd2UgbWF5IHdh bnQgdG8gaW1wcm92ZSBoZXJlOgorICoKKyAqICAgIC0gV2UgbWF5IG5lZWQgdG8gaW5kaWNhdGUg VFQgc3VwcG9ydAorICogICAgLSBXZSBtYXkgbmVlZCBhIGRldmljZSBxdWFsaWZpZXIgZGVzY3Jp cHRvcgorICoJYXMgZGV2aWNlcyBjYW4gcHJldGVuZCB0byBiZSB1c2IxIG9yIDIKKyAqICAgIC0g TWFrZSB2aWQvZGlkIG92ZXJyaWRhYmxlCisgKiAgICAtIG1ha2UgaXQgbG9vayBsaWtlIHVzYjEg aWYgdXNiMSBtb2RlIGZvcmNlZAorICovCisjZGVmaW5lIEtFUk5FTF9SRUwJYmluMmJjZCgoKExJ TlVYX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAweDBmZikpCisjZGVmaW5lIEtFUk5FTF9WRVIJYmlu MmJjZCgoKExJTlVYX1ZFUlNJT05fQ09ERSA+PiA4KSAmIDB4MGZmKSkKKworZW51bSB7CisJQVNU X1ZIVUJfU1RSX01BTlVGID0gMywKKwlBU1RfVkhVQl9TVFJfUFJPRFVDVCA9IDIsCisJQVNUX1ZI VUJfU1RSX1NFUklBTCA9IDEsCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2Vf ZGVzY3JpcHRvciBhc3Rfdmh1Yl9kZXZfZGVzYyA9IHsKKwkuYkxlbmd0aAkJPSBVU0JfRFRfREVW SUNFX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9ERVZJQ0UsCisJLmJjZFVTQgkJ CT0gY3B1X3RvX2xlMTYoMHgwMjAwKSwKKwkuYkRldmljZUNsYXNzCQk9IFVTQl9DTEFTU19IVUIs CisJLmJEZXZpY2VTdWJDbGFzcwk9IDAsCisJLmJEZXZpY2VQcm90b2NvbAk9IDEsCisJLmJNYXhQ YWNrZXRTaXplMAk9IDY0LAorCS5pZFZlbmRvcgkJPSBjcHVfdG9fbGUxNigweDFkNmIpLAorCS5p ZFByb2R1Y3QJCT0gY3B1X3RvX2xlMTYoMHgwMTA3KSwKKwkuYmNkRGV2aWNlCQk9IGNwdV90b19s ZTE2KDB4MDEwMCksCisJLmlNYW51ZmFjdHVyZXIJCT0gQVNUX1ZIVUJfU1RSX01BTlVGLAorCS5p UHJvZHVjdAkJPSBBU1RfVkhVQl9TVFJfUFJPRFVDVCwKKwkuaVNlcmlhbE51bWJlcgkJPSBBU1Rf VkhVQl9TVFJfU0VSSUFMLAorCS5iTnVtQ29uZmlndXJhdGlvbnMJPSAxLAorfTsKKworLyogUGF0 Y2hlcyB0byB0aGUgYWJvdmUgd2hlbiBmb3JjaW5nIFVTQjEgbW9kZSAqLworc3RhdGljIHZvaWQg YXN0X3ZodWJfcGF0Y2hfZGV2X2Rlc2NfdXNiMShzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9y ICpkZXNjKQoreworCWRlc2MtPmJjZFVTQiA9IGNwdV90b19sZTE2KDB4MDEwMCk7CisJZGVzYy0+ YkRldmljZVByb3RvY29sID0gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRv cjogc2FtZSBjb21tZW50cyBhcyBhYm92ZQorICogcmVnYXJkaW5nIGhhbmRsaW5nIFVTQjEgbW9k ZS4KKyAqLworCisvKgorICogV2UgZG9uJ3QgdXNlIHNpemVvZigpIGFzIExpbnV4IGRlZmluaXRp b24gb2YKKyAqIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBjb250YWlucyAyCisgKiBl eHRyYSBieXRlcworICovCisjZGVmaW5lIEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFCShVU0JfRFRf Q09ORklHX1NJWkUgKyBcCisJCQkJIFVTQl9EVF9JTlRFUkZBQ0VfU0laRSArIFwKKwkJCQkgVVNC X0RUX0VORFBPSU5UX1NJWkUpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXN0X3ZodWJfZnVsbF9j ZGVzYyB7CisJc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvcgljZmc7CisJc3RydWN0IHVzYl9p bnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRv cgllcDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFzdF92aHViX2NvbmZfZGVzYyA9IHsK KwkuY2ZnID0geworCQkuYkxlbmd0aAkJPSBVU0JfRFRfQ09ORklHX1NJWkUsCisJCS5iRGVzY3Jp cHRvclR5cGUJPSBVU0JfRFRfQ09ORklHLAorCQkud1RvdGFsTGVuZ3RoCQk9IGNwdV90b19sZTE2 KEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFKSwKKwkJLmJOdW1JbnRlcmZhY2VzCQk9IDEsCisJCS5i Q29uZmlndXJhdGlvblZhbHVlCT0gMSwKKwkJLmlDb25maWd1cmF0aW9uCQk9IDAsCisJCS5ibUF0 dHJpYnV0ZXMJCT0gVVNCX0NPTkZJR19BVFRfT05FIHwKKwkJCQkJICBVU0JfQ09ORklHX0FUVF9T RUxGUE9XRVIgfAorCQkJCQkgIFVTQl9DT05GSUdfQVRUX1dBS0VVUCwKKwkJLmJNYXhQb3dlcgkJ PSAwLAorCX0sCisJLmludGYgPSB7CisJCS5iTGVuZ3RoCQk9IFVTQl9EVF9JTlRFUkZBQ0VfU0la RSwKKwkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCS5iSW50ZXJmYWNl TnVtYmVyCT0gMCwKKwkJLmJBbHRlcm5hdGVTZXR0aW5nCT0gMCwKKwkJLmJOdW1FbmRwb2ludHMJ CT0gMSwKKwkJLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19IVUIsCisJCS5iSW50ZXJmYWNl U3ViQ2xhc3MJPSAwLAorCQkuYkludGVyZmFjZVByb3RvY29sCT0gMCwKKwkJLmlJbnRlcmZhY2UJ CT0gMCwKKwl9LAorCS5lcCA9IHsKKwkJLmJMZW5ndGgJCT0gVVNCX0RUX0VORFBPSU5UX1NJWkUs CisJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQsCisJCS5iRW5kcG9pbnRBZGRy ZXNzCT0gMHg4MSwKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJ CS53TWF4UGFja2V0U2l6ZQkJPSBjcHVfdG9fbGUxNigxKSwKKwkJLmJJbnRlcnZhbAkJPSAweDBj LAorCX0sCit9OworCisjZGVmaW5lIEFTVF9WSFVCX0hVQl9ERVNDX1NJWkUJKFVTQl9EVF9IVUJf Tk9OVkFSX1NJWkUgKyAyKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRv ciBhc3Rfdmh1Yl9odWJfZGVzYyA9IHsKKwkuYkRlc2NMZW5ndGgJCQk9IEFTVF9WSFVCX0hVQl9E RVNDX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZQkJPSBVU0JfRFRfSFVCLAorCS5iTmJyUG9ydHMJ CQk9IEFTVF9WSFVCX05VTV9QT1JUUywKKwkud0h1YkNoYXJhY3RlcmlzdGljcwkJPSBjcHVfdG9f bGUxNihIVUJfQ0hBUl9OT19MUFNNKSwKKwkuYlB3ck9uMlB3ckdvb2QJCQk9IDEwLAorCS5iSHVi Q29udHJDdXJyZW50CQk9IDAsCisJLnUuaHMuRGV2aWNlUmVtb3ZhYmxlWzBdCT0gMCwKKwkudS5o cy5EZXZpY2VSZW1vdmFibGVbMV0JPSAweGZmLAorfTsKKworLyoKKyAqIFRoZXNlIHN0cmluZ3Mg Y29udmVydGVkIHRvIFVURi0xNiBtdXN0IGJlIHNtYWxsZXIgdGhhbgorICogb3VyIEVQMCBidWZm ZXIuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX3N0cmluZyBhc3Rfdmh1Yl9zdHJfYXJy YXlbXSA9IHsKKwl7CisJCS5pZCA9IEFTVF9WSFVCX1NUUl9TRVJJQUwsCisJCS5zID0gIjAwMDAw MDAwIgorCX0sCisJeworCQkuaWQgPSBBU1RfVkhVQl9TVFJfUFJPRFVDVCwKKwkJLnMgPSAiVVNC IFZpcnR1YWwgSHViIgorCX0sCisJeworCQkuaWQgPSBBU1RfVkhVQl9TVFJfTUFOVUYsCisJCS5z ID0gIkFzcGVlZCIKKwl9LAorCXsgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2Fk Z2V0X3N0cmluZ3MgYXN0X3ZodWJfc3RyaW5ncyA9IHsKKwkubGFuZ3VhZ2UgPSAweDA0MDksCisJ LnN0cmluZ3MgPSAoc3RydWN0IHVzYl9zdHJpbmcgKilhc3Rfdmh1Yl9zdHJfYXJyYXkKK307CisK K3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2Rldl9zdGF0dXMoc3RydWN0IGFzdF92aHViX2VwICpl cCwKKwkJCQkgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlKQoreworCXU4IHN0MDsKKworCUVQREJH KGVwLCAiR0VUX1NUQVRVUyhkZXYpXG4iKTsKKworCS8qCisJICogTWFyayBpdCBhcyBzZWxmLXBv d2VyZWQsIEkgZG91YnQgdGhlIEJNQyBpcyBwb3dlcmVkIG9mZgorCSAqIHRoZSBVU0IgYnVzIC4u LgorCSAqLworCXN0MCA9IDEgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQ7CisKKwkvKgorCSAq IE5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyByZW1vdGUgd2FrZXVwIGFjdHVhbGx5IHdvcmtzCisJ ICogb24gdGhhdCBjaGlwIGFuZCB3aGF0IHRyaWdnZXJzIGl0LgorCSAqLworCWlmIChlcC0+dmh1 Yi0+d2FrZXVwX2VuKQorCQlzdDAgfD0gMSA8PCBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVA7CisK KwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCBzdDAsIDApOworfQorCitzdGF0aWMg aW50IGFzdF92aHViX2h1Yl9lcF9zdGF0dXMoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkg IHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUpCit7CisJaW50IGVwX251bTsKKwl1OCBzdDAgPSAwOwor CisJZXBfbnVtID0gd0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCUVQREJHKGVw LCAiR0VUX1NUQVRVUyhlcCVkKVxuIiwgZXBfbnVtKTsKKworCS8qIE9uIHRoZSBodWIgd2UgaGF2 ZSBvbmx5IEVQIDAgYW5kIDEgKi8KKwlpZiAoZXBfbnVtID09IDEpIHsKKwkJaWYgKGVwLT52aHVi LT5lcDFfc3RhbGxlZCkKKwkJCXN0MCB8PSAxIDw8IFVTQl9FTkRQT0lOVF9IQUxUOworCX0gZWxz ZSBpZiAoZXBfbnVtICE9IDApCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJcmV0dXJuIGFz dF92aHViX3NpbXBsZV9yZXBseShlcCwgc3QwLCAwKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1 Yl9odWJfZGV2X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgICAgdTE2IHdJ bmRleCwgdTE2IHdWYWx1ZSwKKwkJCQkgICAgYm9vbCBpc19zZXQpCit7CisJRVBEQkcoZXAsICIl c19GRUFUVVJFKGRldiB2YWw9JTAyeClcbiIsCisJICAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xF QVIiLCB3VmFsdWUpOworCisJaWYgKHdWYWx1ZSAhPSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVAp CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJZXAtPnZodWItPndha2V1cF9lbiA9IGlzX3Nl dDsKKwlFUERCRyhlcCwgIkh1YiByZW1vdGUgd2FrZXVwICVzXG4iLAorCSAgICAgIGlzX3NldCA/ ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOworCisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9 CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2VwX2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2Vw ICplcCwKKwkJCQkgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLAorCQkJCSAgIGJvb2wgaXNfc2V0 KQoreworCWludCBlcF9udW07CisJdTMyIHJlZzsKKworCWVwX251bSA9IHdJbmRleCAmIFVTQl9F TkRQT0lOVF9OVU1CRVJfTUFTSzsKKwlFUERCRyhlcCwgIiVzX0ZFQVRVUkUoZXAlZCB2YWw9JTAy eClcbiIsCisJICAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xFQVIiLCBlcF9udW0sIHdWYWx1ZSk7 CisKKwlpZiAoZXBfbnVtID4gMSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKHdWYWx1 ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKGVw X251bSA9PSAwKQorCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKworCUVQREJHKGVwLCAiJXMg c3RhbGwgb24gRVAgMVxuIiwKKwkgICAgICBpc19zZXQgPyAic2V0dGluZyIgOiAiY2xlYXJpbmci KTsKKworCWVwLT52aHViLT5lcDFfc3RhbGxlZCA9IGlzX3NldDsKKwlyZWcgPSByZWFkbChlcC0+ dmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKwlpZiAoaXNfc2V0KSB7CisJCXJlZyB8 PSBWSFVCX0VQMV9DVFJMX1NUQUxMOworCX0gZWxzZSB7CisJCXJlZyAmPSB+VkhVQl9FUDFfQ1RS TF9TVEFMTDsKKwkJcmVnIHw9IFZIVUJfRVAxX0NUUkxfUkVTRVRfVE9HR0xFOworCX0KKwl3cml0 ZWwocmVnLCBlcC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKworCXJldHVybiBz dGRfcmVxX2NvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3JlcF9kZXNjKHN0cnVj dCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkgICAgIHU4IGRlc2NfdHlwZSwgdTE2IGxlbikKK3sKKwlz aXplX3QgZHNpemU7CisKKwlFUERCRyhlcCwgIkdFVF9ERVNDUklQVE9SKHR5cGU6JWQpXG4iLCBk ZXNjX3R5cGUpOworCisJLyoKKwkgKiBDb3B5IGZpcnN0IHRvIEVQIGJ1ZmZlciBhbmQgc2VuZCBm cm9tIHRoZXJlLCBzbworCSAqIHdlIGNhbiBkbyBzb21lIGluLXBsYWNlIHBhdGNoaW5nIGlmIG5l ZWRlZC4gV2Uga25vdworCSAqIHRoZSBFUCBidWZmZXIgaXMgYmlnIGVub3VnaCBidXQgZW5zdXJl IHRoYXQgZG9lc24ndAorCSAqIGNoYW5nZS4gV2UgZG8gdGhhdCBub3cgcmF0aGVyIHRoYW4gbGF0 ZXIgYWZ0ZXIgd2UKKwkgKiBoYXZlIGNoZWNrZWQgc2l6ZXMgZXRjLi4uIHRvIGF2b2lkIGEgZ2Nj IGJ1ZyB3aGVyZQorCSAqIGl0IHRoaW5rcyBsZW4gaXMgY29uc3RhbnQgYW5kIGJhcmZzIGFib3V0 IHJlYWQKKwkgKiBvdmVyZmxvd3MgaW4gbWVtY3B5LgorCSAqLworCXN3aXRjaChkZXNjX3R5cGUp IHsKKwljYXNlIFVTQl9EVF9ERVZJQ0U6CisJCWRzaXplID0gVVNCX0RUX0RFVklDRV9TSVpFOwor CQltZW1jcHkoZXAtPmJ1ZiwgJmFzdF92aHViX2Rldl9kZXNjLCBkc2l6ZSk7CisJCUJVSUxEX0JV R19PTihkc2l6ZSA+IHNpemVvZihhc3Rfdmh1Yl9kZXZfZGVzYykpOworCQlCVUlMRF9CVUdfT04o VVNCX0RUX0RFVklDRV9TSVpFID49IEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUKTsKKwkJYnJlYWs7 CisJY2FzZSBVU0JfRFRfQ09ORklHOgorCQlkc2l6ZSA9IEFTVF9WSFVCX0NPTkZfREVTQ19TSVpF OworCQltZW1jcHkoZXAtPmJ1ZiwgJmFzdF92aHViX2NvbmZfZGVzYywgZHNpemUpOworCQlCVUlM RF9CVUdfT04oZHNpemUgPiBzaXplb2YoYXN0X3ZodWJfY29uZl9kZXNjKSk7CisJCUJVSUxEX0JV R19PTihBU1RfVkhVQl9DT05GX0RFU0NfU0laRSA+PSBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCk7 CisJCWJyZWFrOworCWNhc2UgVVNCX0RUX0hVQjoKKwkJZHNpemUgPSBBU1RfVkhVQl9IVUJfREVT Q19TSVpFOworCQltZW1jcHkoZXAtPmJ1ZiwgJmFzdF92aHViX2h1Yl9kZXNjLCBkc2l6ZSk7CisJ CUJVSUxEX0JVR19PTihkc2l6ZSA+IHNpemVvZihhc3Rfdmh1Yl9odWJfZGVzYykpOworCUJVSUxE X0JVR19PTihBU1RfVkhVQl9IVUJfREVTQ19TSVpFID49IEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VU KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJfQorCisJ LyogQ3JvcCByZXF1ZXN0ZWQgbGVuZ3RoICovCisJaWYgKGxlbiA+IGRzaXplKQorCQlsZW4gPSBk c2l6ZTsKKworCS8qIFBhdGNoIGl0IGlmIGZvcmNpbmcgVVNCMSAqLworCWlmIChkZXNjX3R5cGUg PT0gVVNCX0RUX0RFVklDRSAmJiBlcC0+dmh1Yi0+Zm9yY2VfdXNiMSkKKwkJYXN0X3ZodWJfcGF0 Y2hfZGV2X2Rlc2NfdXNiMShlcC0+YnVmKTsKKworCS8qIFNob290IGl0IGZyb20gdGhlIEVQIGJ1 ZmZlciAqLworCXJldHVybiBhc3Rfdmh1Yl9yZXBseShlcCwgTlVMTCwgbGVuKTsKK30KKworc3Rh dGljIGludCBhc3Rfdmh1Yl9yZXBfc3RyaW5nKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkg ICAgICAgdTggc3RyaW5nX2lkLCB1MTYgbGFuZ19pZCwKKwkJCSAgICAgICB1MTYgbGVuKQorewor CWludCByYyA9IHVzYl9nYWRnZXRfZ2V0X3N0cmluZyAoJmFzdF92aHViX3N0cmluZ3MsIHN0cmlu Z19pZCwgZXAtPmJ1Zik7CisKKwkvKgorCSAqIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxl c3Mgd2UgcHV0IHRvbyBiaWcgc3RyaW5ncyBpbgorCSAqIHRoZSBhcnJheSBhYm92ZQorCSAqLwor CUJVR19PTihyYyA+PSBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCk7CisKKwlpZiAocmMgPCAwKQor CQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCS8qIFNob290IGl0IGZyb20gdGhlIEVQIGJ1ZmZl ciAqLworCXJldHVybiBhc3Rfdmh1Yl9yZXBseShlcCwgTlVMTCwgbWluX3QodTE2LCByYywgbGVu KSk7Cit9CisKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3Qoc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCQkJIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sK KwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1MTYgd1ZhbHVlLCB3SW5kZXgs IHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEtPndWYWx1ZSk7CisJd0luZGV4 ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGggPSBsZTE2X3RvX2NwdShjcnEt PndMZW5ndGgpOworCisJLyogRmlyc3QgcGFja2V0LCBncmFiIHNwZWVkICovCisJaWYgKHZodWIt PnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCXUzMiB1c3RhdCA9IHJlYWRsKHZodWIt PnJlZ3MgKyBBU1RfVkhVQl9VU0JTVFMpOworCQlpZiAodXN0YXQgJiBWSFVCX1VTQlNUU19ISVNQ RUVEKQorCQkJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfSElHSDsKKwkJZWxzZQorCQkJdmh1Yi0+ c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKKwkJVURDREJHKHZodWIsICJVU0Igc3RhdHVzPSUwOHgg c3BlZWQ9JXNcbiIsIHVzdGF0LAorCQkgICAgICAgdmh1Yi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJ R0ggPyAiaGlnaCIgOiAiZnVsbCIpOworCX0KKworCXN3aXRjaCAoKGNycS0+YlJlcXVlc3RUeXBl IDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgeworCQkvKiBTRVRfQUREUkVTUyAqLworCWNhc2UgRGV2 aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCUVQREJHKGVwLCAiU0VUX0FE RFJFU1M6IEdvdCBhZGRyZXNzICV4XG4iLCB3VmFsdWUpOworCQl3cml0ZWwod1ZhbHVlLCB2aHVi LT5yZWdzICsgQVNUX1ZIVUJfQ09ORik7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCisJ CS8qIEdFVF9TVEFUVVMgKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFU VVM6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X3N0YXR1cyhlcCwgd0luZGV4LCB3VmFsdWUp OworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJu IGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCk7CisJY2FzZSBFbmRwb2ludFJlcXVlc3Qg fCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZXBfc3RhdHVzKGVw LCB3SW5kZXgsIHdWYWx1ZSk7CisKKwkJLyogU0VUL0NMRUFSX0ZFQVRVUkUgKi8KKwljYXNlIERl dmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJf aHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1ZSk7CisJY2FzZSBEZXZpY2VP dXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfaHVi X2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCWNhc2UgRW5kcG9pbnRP dXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2h1Yl9l cF9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1ZSk7CisJY2FzZSBFbmRwb2ludE91dFJl cXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZXBf ZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUsIGZhbHNlKTsKKworCQkvKiBHRVQvU0VUX0NPTkZJ R1VSQVRJT04gKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9DT05GSUdVUkFU SU9OOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAxKTsKKwljYXNlIERldmlj ZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OOgorCQlpZiAod1ZhbHVlICE9 IDEpCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7 CisKKwkJLyogR0VUX0RFU0NSSVBUT1IgKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVR X0dFVF9ERVNDUklQVE9SOgorCQlzd2l0Y2ggKHdWYWx1ZSA+PiA4KSB7CisJCWNhc2UgVVNCX0RU X0RFVklDRToKKwkJY2FzZSBVU0JfRFRfQ09ORklHOgorCQkJcmV0dXJuIGFzdF92aHViX3JlcF9k ZXNjKGVwLCB3VmFsdWUgPj4gOCwKKwkJCQkJCSB3TGVuZ3RoKTsKKwkJY2FzZSBVU0JfRFRfU1RS SU5HOgorCQkJcmV0dXJuIGFzdF92aHViX3JlcF9zdHJpbmcoZXAsIHdWYWx1ZSAmIDB4ZmYsCisJ CQkJCQkgICB3SW5kZXgsIHdMZW5ndGgpOworCQl9CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOwor CisJCS8qIEdFVC9TRVRfSU5URVJGQUNFICovCisJY2FzZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JF UV9HRVRfSU5URVJGQUNFOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAwKTsK KwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9JTlRFUkZBQ0U6CisJCWlmICh3 VmFsdWUgIT0gMCB8fCB3SW5kZXggIT0gMCkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCQly ZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9CisK K3N0YXRpYyB2b2lkIGFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHN0cnVjdCBhc3Rfdmh1YiAqdmh1 YiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHBvcnQpCit7CisJLyogVXBkYXRlIEhXIEVQMSByZXNw b25zZSAqLworCXUzMiByZWcgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX1NUU19D SEcpOworCXUzMiBwbWFzayA9ICgxIDw8IChwb3J0ICsgMSkpOworCWlmICh2aHViLT5wb3J0c1tw b3J0XS5jaGFuZ2UpCisJCXJlZyB8PSBwbWFzazsKKwllbHNlCisJCXJlZyAmPSB+cG1hc2s7CisJ d3JpdGVsKHJlZywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKK30KKworc3Rh dGljIHZvaWQgYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIs CisJCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnQsCisJCQkJICAgICAgdTE2IGNscl9mbGFncywK KwkJCQkgICAgICB1MTYgc2V0X2ZsYWdzLAorCQkJCSAgICAgIGJvb2wgc2V0X2MpCit7CisJc3Ry dWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisJdTE2IHByZXY7CisK KwkvKiBVcGRhdGUgcG9ydCBzdGF0dXMgKi8KKwlwcmV2ID0gcC0+c3RhdHVzOworCXAtPnN0YXR1 cyA9IChwcmV2ICYgfmNscl9mbGFncykgfCBzZXRfZmxhZ3M7CisJRERCRygmcC0+ZGV2LCAicG9y dCAlZCBzdGF0dXMgJTA0eCAtPiAlMDR4IChDPSVkKVxuIiwKKwkgICAgIHBvcnQgKyAxLCBwcmV2 LCBwLT5zdGF0dXMsIHNldF9jKTsKKworCS8qIFVwZGF0ZSBjaGFuZ2UgYml0cyBpZiBuZWVkZWQg Ki8KKwlpZiAoc2V0X2MpIHsKKwkJdTE2IGNoZyA9IHAtPnN0YXR1cyBeIHByZXY7CisKKwkJLyog T25seSB0aGVzZSBhcmUgcmVsZXZhbnQgZm9yIGNoYW5nZSAqLworCQljaGcgJj0gVVNCX1BPUlRf U1RBVF9DX0NPTk5FQ1RJT04gfAorCQkgICAgICAgVVNCX1BPUlRfU1RBVF9DX0VOQUJMRSB8CisJ CSAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFU X0NfT1ZFUkNVUlJFTlQgfAorCQkgICAgICAgVVNCX1BPUlRfU1RBVF9DX1JFU0VUIHwKKwkJICAg ICAgIFVTQl9QT1JUX1NUQVRfQ19MMTsKKwkJcC0+Y2hhbmdlIHw9IGNoZzsKKworCQlhc3Rfdmh1 Yl91cGRhdGVfaHViX2VwMSh2aHViLCBwb3J0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92 aHViX3NlbmRfaG9zdF93YWtldXAoc3RydWN0IGFzdF92aHViICp2aHViKQoreworCXUzMiByZWcg PSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisJVURDREJHKHZodWIsICJXYWtp bmcgdXAgaG9zdCAhXG4iKTsKKwlyZWcgfD0gVkhVQl9DVFJMX01BTlVBTF9SRU1PVEVfV0FLRVVQ OworCXdyaXRlbChyZWcsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKK30KKwordm9pZCBh c3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsCisJCQkgICAgIHVu c2lnbmVkIGludCBwb3J0LCBib29sIG9uKQoreworCWlmIChvbikKKwkJYXN0X3ZodWJfY2hhbmdl X3BvcnRfc3RhdCh2aHViLCBwb3J0LCAwLAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElP TiwgdHJ1ZSk7CisJZWxzZQorCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIHBvcnQs CisJCQkJCSAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwKKwkJCQkJICBVU0JfUE9SVF9TVEFU X0VOQUJMRSwKKwkJCQkJICAwLCB0cnVlKTsKKworCS8qCisJICogSWYgdGhlIGh1YiBpcyBzZXQg dG8gd2FrdXAgdGhlIGhvc3Qgb24gY29ubmVjdGlvbiBldmVudHMKKwkgKiB0aGVuIHNlbmQgYSB3 YWtldXAuCisJICovCisJaWYgKHZodWItPndha2V1cF9lbikKKwkJYXN0X3ZodWJfc2VuZF9ob3N0 X3dha2V1cCh2aHViKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfd2FrZV93b3JrKHN0cnVj dCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBjb250YWlu ZXJfb2Yod29yaywKKwkJCQkJICAgICBzdHJ1Y3QgYXN0X3ZodWIsCisJCQkJCSAgICAgd2FrZV93 b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCisJLyoKKwkg KiBXYWtlIGFsbCBzbGVlcGluZyBwb3J0cy4gSWYgYSBwb3J0IGlzIHN1c3BlbmRlZCBieQorCSAq IHRoZSBob3N0IHN1c3BlbmQgKHdpdGhvdXQgZXhwbGljaXQgc3RhdGUgc3VzcGVuZCksCisJICog d2UgbGV0IHRoZSBub3JtYWwgaG9zdCB3YWtlIHBhdGggZGVhbCB3aXRoIGl0IGxhdGVyLgorCSAq LworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsg aSA8IEFTVF9WSFVCX05VTV9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpw ID0gJnZodWItPnBvcnRzW2ldOworCisJCWlmICghKHAtPnN0YXR1cyAmIFVTQl9QT1JUX1NUQVRf U1VTUEVORCkpCisJCQljb250aW51ZTsKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHVi LCBpLAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfU1VTUEVORCwKKwkJCQkJICAwLCB0cnVlKTsKKwkJ YXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9CisJYXN0X3ZodWJfc2VuZF9ob3N0X3dh a2V1cCh2aHViKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7 Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3dha2VfYWxsKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikK K3sKKwkvKgorCSAqIEEgZGV2aWNlIGlzIHRyeWluZyB0byB3YWtlIHRoZSB3b3JsZCwgYmVjYXVz ZSB0aGlzCisJICogY2FuIHJlY3Vyc2UgaW50byB0aGUgZGV2aWNlLCB3ZSBicmVhayB0aGUgY2Fs bCBjaGFpbgorCSAqIHVzaW5nIGEgd29yayBxdWV1ZQorCSAqLworCXNjaGVkdWxlX3dvcmsoJnZo dWItPndha2Vfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3BvcnRfcmVzZXQoc3Ry dWN0IGFzdF92aHViICp2aHViLCB1OCBwb3J0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpw ID0gJnZodWItPnBvcnRzW3BvcnRdOworCXUxNiBzZXQsIGNsciwgc3BlZWQ7CisKKwkvKiBGaXJz dCBtYXJrIGRpc2FibGVkICovCisJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0 LAorCQkJCSAgVVNCX1BPUlRfU1RBVF9FTkFCTEUgfAorCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQ RU5ELAorCQkJCSAgVVNCX1BPUlRfU1RBVF9SRVNFVCwKKwkJCQkgIGZhbHNlKTsKKworCWlmICgh cC0+ZGV2LmRyaXZlcikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGlzIHdpbGwgZWl0aGVyICJz dGFydCIgdGhlIHBvcnQgb3IgcmVzZXQgdGhlCisJICogZGV2aWNlIGlmIGFscmVhZHkgc3RhcnRl ZC4uLgorCSAqLworCWFzdF92aHViX2Rldl9yZXNldCgmcC0+ZGV2KTsKKworCS8qIEdyYWIgdGhl IHJpZ2h0IHNwZWVkICovCisJc3BlZWQgPSBwLT5kZXYuZHJpdmVyLT5tYXhfc3BlZWQ7CisJaWYg KHNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOIHx8IHNwZWVkID4gdmh1Yi0+c3BlZWQpCisJCXNw ZWVkID0gdmh1Yi0+c3BlZWQ7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSBVU0JfU1BFRURf TE9XOgorCQlzZXQgPSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKwkJY2xyID0gVVNCX1BPUlRf U1RBVF9ISUdIX1NQRUVEOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQlzZXQg PSAwOworCQljbHIgPSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRCB8CisJCQlVU0JfUE9SVF9TVEFU X0hJR0hfU1BFRUQ7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCXNldCA9IFVT Ql9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJY2xyID0gVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQ7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVVEQ0RCRyh2aHViLCAiVW5zdXBwb3J0ZWQgc3BlZWQg JWQgd2hlbiIKKwkJICAgICAgICIgY29ubmVjdGluZyBkZXZpY2VcbiIsCisJCSAgICAgICBzcGVl ZCk7CisJCXJldHVybjsKKwl9CisJY2xyIHw9IFVTQl9QT1JUX1NUQVRfUkVTRVQ7CisJc2V0IHw9 IFVTQl9QT1JUX1NUQVRfRU5BQkxFOworCisJLyogVGhpcyBzaG91bGQgaWRlYWxseSBiZSBkZWxh eWVkIC4uLiAqLworCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwgY2xyLCBz ZXQsIHRydWUpOworfQorCitzdGF0aWMgZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX3NldF9wb3J0 X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJCSB1OCBwb3J0LCB1MTYgZmVh dCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3Zo dWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IEFTVF9WSFVCX05VTV9QT1JU UykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9ydC0tOworCXAgPSAmdmh1Yi0+cG9ydHNb cG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgor CQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkpCisJCQlyZXR1cm4gc3Rk X3JlcV9jb21wbGV0ZTsKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LAor CQkJCQkgIDAsIFVTQl9QT1JUX1NUQVRfU1VTUEVORCwKKwkJCQkJICBmYWxzZSk7CisJCWFzdF92 aHViX2Rldl9zdXNwZW5kKCZwLT5kZXYpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwlj YXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCUVQREJHKGVwLCAiUG9ydCByZXNldCAhXG4iKTsK KwkJYXN0X3ZodWJfcG9ydF9yZXNldCh2aHViLCBwb3J0KTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29t cGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9U RVNUOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1I6CisJCS8qIFdlIGRvbid0IGRvIGFu eXRoaW5nIHdpdGggdGhlc2UgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJfQorCXJl dHVybiBzdGRfcmVxX3N0YWxsOworfQorCitzdGF0aWMgZW51bSBzdGRfcmVxX3JjIGFzdF92aHVi X2Nscl9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJCSB1OCBwb3J0 LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1 Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IEFTVF9WSFVC X05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9ydC0tOworCXAgPSAmdmh1 Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2UgVVNCX1BPUlRfRkVBVF9F TkFCTEU6CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJICBV U0JfUE9SVF9TVEFUX0VOQUJMRSB8CisJCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQRU5ELCAwLAor CQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRldik7CisJCXJldHVy biBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQlpZiAo IShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJcmV0dXJuIHN0ZF9yZXFf Y29tcGxldGU7CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJ ICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsIDAsCisJCQkJCSAgZmFsc2UpOworCQlhc3Rfdmh1Yl9k ZXZfcmVzdW1lKCZwLT5kZXYpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVT Ql9QT1JUX0ZFQVRfUE9XRVI6CisJCS8qIFdlIGRvbid0IGRvIHBvd2VyIGNvbnRyb2wgKi8KKwkJ cmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX0lORElDQVRPUjoK KwkJLyogV2UgZG9uJ3QgaGF2ZSBpbmRpY2F0b3JzICovCisJCXJldHVybiBzdGRfcmVxX2NvbXBs ZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT046CisJY2FzZSBVU0JfUE9SVF9G RUFUX0NfRU5BQkxFOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6CisJY2FzZSBVU0Jf UE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgor CQkvKiBDbGVhciBzdGF0ZS1jaGFuZ2UgZmVhdHVyZSAqLworCQlwLT5jaGFuZ2UgJj0gfigxdSA8 PCAoZmVhdCAtIDE2KSk7CisJCWFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHZodWIsIHBvcnQpOwor CQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9 CisKK3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfZ2V0X3BvcnRfc3RhdChzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgICAgICB1OCBwb3J0KQoreworCXN0cnVjdCBhc3Rfdmh1 YiAqdmh1YiA9IGVwLT52aHViOworCXUxNiBzdGF0LCBjaGc7CisKKwlpZiAocG9ydCA9PSAwIHx8 IHBvcnQgPiBBU1RfVkhVQl9OVU1fUE9SVFMpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCXBv cnQtLTsKKworCXN0YXQgPSB2aHViLT5wb3J0c1twb3J0XS5zdGF0dXM7CisJY2hnID0gdmh1Yi0+ cG9ydHNbcG9ydF0uY2hhbmdlOworCisJLyogV2UgYWx3YXlzIGhhdmUgcG93ZXIgKi8KKwlzdGF0 IHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisKKwlFUERCRyhlcCwgIiBwb3J0IHN0YXR1cz0lMDR4 IGNoYW5nZT0lMDR4XG4iLCBzdGF0LCBjaGcpOworCisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9y ZXBseShlcCwKKwkJCQkgICAgIHN0YXQgJiAweGZmLAorCQkJCSAgICAgc3RhdCA+PiA4LAorCQkJ CSAgICAgY2hnICYgMHhmZiwKKwkJCQkgICAgIGNoZyA+PiA4KTsKK30KKworZW51bSBzdGRfcmVx X3JjIGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJ CQkJCSAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwl1MTYgd1ZhbHVlLCB3SW5k ZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEtPndWYWx1ZSk7CisJd0lu ZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGggPSBsZTE2X3RvX2NwdShj cnEtPndMZW5ndGgpOworCisJc3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEt PmJSZXF1ZXN0KSB7CisJY2FzZSBHZXRIdWJTdGF0dXM6CisJCUVQREJHKGVwLCAiR2V0SHViU3Rh dHVzXG4iKTsKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCwgMCwgMCk7 CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlFUERCRyhlcCwgIkdldFBvcnRTdGF0dXMoJWQpXG4i LCB3SW5kZXggJiAweGZmKTsKKwkJcmV0dXJuIGFzdF92aHViX2dldF9wb3J0X3N0YXQoZXAsIHdJ bmRleCAmIDB4Zik7CisJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgorCQlpZiAod1ZhbHVlICE9IChV U0JfRFRfSFVCIDw8IDgpKQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCUVQREJHKGVwLCAi R2V0SHViRGVzY3JpcHRvciglZClcbiIsIHdJbmRleCAmIDB4ZmYpOworCQlyZXR1cm4gYXN0X3Zo dWJfcmVwX2Rlc2MoZXAsIFVTQl9EVF9IVUIsIHdMZW5ndGgpOworCWNhc2UgU2V0SHViRmVhdHVy ZToKKwljYXNlIENsZWFySHViRmVhdHVyZToKKwkJRVBEQkcoZXAsICJHZXQvU2V0SHViRmVhdHVy ZSglZClcbiIsIHdWYWx1ZSk7CisJCS8qIE5vIGZlYXR1cmUsIGp1c3QgY29tcGxldGUgdGhlIHJl cXVlc3RzICovCisJCWlmICh3VmFsdWUgPT0gQ19IVUJfTE9DQUxfUE9XRVIgfHwKKwkJICAgIHdW YWx1ZSA9PSBDX0hVQl9PVkVSX0NVUlJFTlQpCisJCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsK KwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJY2FzZSBTZXRQb3J0RmVhdHVyZToKKwkJRVBEQkco ZXAsICJTZXRQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJ cmV0dXJuIGFzdF92aHViX3NldF9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVl KTsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCUVQREJHKGVwLCAiQ2xlYXJQb3J0RmVhdHVy ZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJcmV0dXJuIGFzdF92aHViX2Ns cl9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwlkZWZhdWx0OgorCQlF UERCRyhlcCwgIlVua25vd24gY2xhc3MgcmVxdWVzdFxuIik7CisJfQorCXJldHVybiBzdGRfcmVx X3N0YWxsOworfQorCit2b2lkIGFzdF92aHViX2h1Yl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1YiAq dmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1cyBzdXNw ZW5kXG4iKTsKKworCWlmICh2aHViLT5zdXNwZW5kZWQpCisJCXJldHVybjsKKworCXZodWItPnN1 c3BlbmRlZCA9IHRydWU7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMg d2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3RhdHVzLgorCSAqLworCWZv ciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3Zo dWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0dXMgJiBVU0Jf UE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRldik7CisJ fQorfQorCit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUoc3RydWN0IGFzdF92aHViICp2aHViKQor eworCXVuc2lnbmVkIGludCBpOworCisJVURDREJHKHZodWIsICJVU0IgYnVzIHJlc3VtZVxuIik7 CisKKwlpZiAoIXZodWItPnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJdmh1Yi0+c3VzcGVuZGVk ID0gZmFsc2U7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMgd2l0aG91 dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3RhdHVzLgorCSAqLworCWZvciAoaSA9 IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9y dCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9T VEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9Cit9CisK K3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNp Z25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1cyByZXNldFxuIik7CisKKwkvKgor CSAqIElzIHRoZSBzcGVlZCBrbm93biA/IElmIG5vdCB3ZSBkb24ndCBjYXJlLCB3ZSBhcmVuJ3QK KwkgKiBpbml0aWFsaXplZCB5ZXQgYW5kIHBvcnRzIGhhdmVuJ3QgYmVlbiBlbmFibGVkLgorCSAq LworCWlmICh2aHViLT5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuOworCisJ LyogV2UgYXJlbid0IHN1c3BlbmRlZCBhbnltb3JlIG9idmlvdXNseSAqLworCXZodWItPnN1c3Bl bmRlZCA9IGZhbHNlOworCisJLyogTm8gc3BlZWQgc2V0ICovCisJdmh1Yi0+c3BlZWQgPSBVU0Jf U1BFRURfVU5LTk9XTjsKKworCS8qIFdha2V1cCBub3QgZW5hYmxlZCBhbnltb3JlICovCisJdmh1 Yi0+d2FrZXVwX2VuID0gZmFsc2U7CisKKwkvKgorCSAqIENsZWFyIGFsbCBwb3J0IHN0YXR1cywg ZGlzYWJsZSBnYWRnZXRzIGFuZCAic3VzcGVuZCIKKwkgKiB0aGVtLiBUaGV5IHdpbGwgYmUgd29r ZW4gdXAgYnkgYSBwb3J0IHJlc2V0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9O VU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0 c1tpXTsKKworCQkvKiBPbmx5IGtlZXAgdGhlIGNvbm5lY3RlZCBmbGFnICovCisJCXAtPnN0YXR1 cyAmPSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJCXAtPmNoYW5nZSA9IDA7CisKKwkJLyog U3VzcGVuZCB0aGUgZ2FkZ2V0IGlmIGFueSAqLworCQlhc3Rfdmh1Yl9kZXZfc3VzcGVuZCgmcC0+ ZGV2KTsKKwl9CisKKwkvKiBDbGVhbnVwIEhXICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9DT05GKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJM KTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUgfAorCSAgICAgICBWSFVCX0VQ MV9DVFJMX0VOQUJMRSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsK Kwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKK30KKwordm9p ZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdmh1Yi0+c3Bl ZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlJTklUX1dPUksoJnZodWItPndha2Vfd29yaywgYXN0 X3ZodWJfd2FrZV93b3JrKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi92aHViLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L3ZodWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjJiMDQwMjU3 YmMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvdmh1Yi5oCkBAIC0wLDAgKzEsNTE0IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjog R1BMLTIuMCsgKi8KKyNpZm5kZWYgX19BU1BFRURfVkhVQl9ICisjZGVmaW5lIF9fQVNQRUVEX1ZI VUJfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgKgorICogVkhVQiByZWdpc3RlciBkZWZpbml0aW9ucyAqCisgKiAgICAgICAg ICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwor I2RlZmluZQlBU1RfVkhVQl9DVFJMCQkweDAwCS8qIFJvb3QgRnVuY3Rpb24gQ29udHJvbCAmIFN0 YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9DT05GCQkweDA0CS8qIFJvb3QgQ29u ZmlndXJhdGlvbiBTZXR0aW5nIFJlZ2lzdGVyICovCisjZGVmaW5lCUFTVF9WSFVCX0lFUgkJMHgw OAkvKiBJbnRlcnJ1cHQgQ3RybCBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9JU1IJCTB4 MEMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9FUF9B Q0tfSUVSCTB4MTAJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgQUNLIEludGVycnVwdCBF bmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfRVBfTkFDS19JRVIJMHgxNAkvKiBQ cm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBOQUNLIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIg ICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX0FDS19JU1IJMHgxOAkvKiBQcm9ncmFtbWFibGUgRW5k cG9pbnQgUG9vbCBBQ0sgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQVNU X1ZIVUJfRVBfTkFDS19JU1IJMHgxQwkvKiBQcm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBOQUNL IEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICovCisjZGVmaW5lIEFTVF9WSFVCX1NXX1JFU0VU CTB4MjAJLyogRGV2aWNlIENvbnRyb2xsZXIgU29mdCBSZXNldCBFbmFibGUgUmVnaXN0ZXIgKi8K KyNkZWZpbmUgQVNUX1ZIVUJfVVNCU1RTCQkweDI0CS8qIFVTQiBTdGF0dXMgUmVnaXN0ZXIgKi8K KyNkZWZpbmUgQVNUX1ZIVUJfRVBfVE9HR0xFCTB4MjgJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50 IFBvb2wgRGF0YSBUb2dnbGUgVmFsdWUgU2V0ICovCisjZGVmaW5lIEFTVF9WSFVCX0lTT19GQUlM X0FDQwkweDJDCS8qIElzb2Nocm9ub3VzIFRyYW5zYWN0aW9uIEZhaWwgQWNjdW11bGF0b3IgKi8K KyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0NUUkwJMHgzMAkvKiBFbmRwb2ludCAwIENvbnRybC9TdGF0 dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0RBVEEJMHgzNAkvKiBCYXNlIEFk ZHJlc3Mgb2YgRW5kcG9pbnQgMCBJbi9PVVQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZp bmUgQVNUX1ZIVUJfRVAxX0NUUkwJMHgzOAkvKiBFbmRwb2ludCAxIENvbnRybC9TdGF0dXMgUmVn aXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX1NUU19DSEcJMHgzQwkvKiBFbmRwb2ludCAx IFN0YXR1cyBDaGFuZ2UgQml0bWFwIERhdGEgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfU0VUVVAwCQkw eDgwCS8qIFJvb3QgRGV2aWNlIFNldHVwIERhdGEgQnVmZmVyMCAqLworI2RlZmluZSBBU1RfVkhV Ql9TRVRVUDEJCTB4ODQJLyogUm9vdCBEZXZpY2UgU2V0dXAgRGF0YSBCdWZmZXIxICovCisKKy8q IE1haW4gY29udHJvbCByZWcgKi8KKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9DTEsJCQkoMSA8PCAz MSkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9MT09QX1RFU1QJCQkoMSA8PCAyNSkKKyNkZWZpbmUg VkhVQl9DVFJMX0ROX1BXTgkJCSgxIDw8IDI0KQorI2RlZmluZSBWSFVCX0NUUkxfRFBfUFdOCQkJ KDEgPDwgMjMpCisjZGVmaW5lIFZIVUJfQ1RSTF9MT05HX0RFU0MJCQkoMSA8PCAxOCkKKyNkZWZp bmUgVkhVQl9DVFJMX0lTT19SU1BfQ1RSTAkJCSgxIDw8IDE3KQorI2RlZmluZSBWSFVCX0NUUkxf U1BMSVRfSU4JCQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9DVFJMX0xPT1BfVF9SRVNVTFQJCQko MSA8PCAxNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0xPT1BfVF9TVFMJCQkoMSA8PCAxNCkKKyNkZWZp bmUgVkhVQl9DVFJMX1BIWV9CSVNUX1JFU1VMVAkJKDEgPDwgMTMpCisjZGVmaW5lIFZIVUJfQ1RS TF9QSFlfQklTVF9DVFJMCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlfUkVTRVRf RElTCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZIVUJfQ1RSTF9TRVRfVEVTVF9NT0RFKHgpCQkoKHgp IDw8IDgpCisjZGVmaW5lIFZIVUJfQ1RSTF9NQU5VQUxfUkVNT1RFX1dBS0VVUAkJKDEgPDwgNCkK KyNkZWZpbmUgVkhVQl9DVFJMX0FVVE9fUkVNT1RFX1dBS0VVUAkJKDEgPDwgMykKKyNkZWZpbmUg VkhVQl9DVFJMX0NMS19TVE9QX1NVU1BFTkQJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfQ1RSTF9G VUxMX1NQRUVEX09OTFkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfQ1RSTF9VUFNUUkVBTV9DT05O RUNUCQkoMSA8PCAwKQorCisvKiBJRVIgJiBJU1IgKi8KKyNkZWZpbmUgVkhVQl9JUlFfVVNCX0NN RF9ERUFETE9DSwkJKDEgPDwgMTgpCisjZGVmaW5lIFZIVUJfSVJRX0VQX1BPT0xfTkFLCQkJKDEg PDwgMTcpCisjZGVmaW5lIFZIVUJfSVJRX0VQX1BPT0xfQUNLX1NUQUxMCQkoMSA8PCAxNikKKyNk ZWZpbmUgVkhVQl9JUlFfREVWSUNFNQkJCSgxIDw8IDEzKQorI2RlZmluZSBWSFVCX0lSUV9ERVZJ Q0U0CQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTMJCQkoMSA8PCAxMSkKKyNk ZWZpbmUgVkhVQl9JUlFfREVWSUNFMgkJCSgxIDw8IDEwKQorI2RlZmluZSBWSFVCX0lSUV9ERVZJ Q0UxCQkJKDEgPDwgOSkKKyNkZWZpbmUgVkhVQl9JUlFfQlVTX1JFU1VNRQkJCSgxIDw8IDgpCisj ZGVmaW5lIFZIVUJfSVJRX0JVU19TVVNQRU5EIAkJCSgxIDw8IDcpCisjZGVmaW5lIFZIVUJfSVJR X0JVU19SRVNFVCAJCQkoMSA8PCA2KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAxX0lOX0RBVEFf QUNLCQkoMSA8PCA1KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lOX0RBVEFfTkFLCQkoMSA8 PCA0KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTAkJKDEgPDwgMykKKyNk ZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9PVVRfTkFLCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0lS UV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfSVJRX0hVQl9F UDBfU0VUVVAJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX0lSUV9BQ0tfQUxMCQkJMHgxZmYKKwor LyogU1cgcmVzZXQgcmVnICovCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfRVBfUE9PTAkJCSgxIDw8 IDkpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfRE1BX0NPTlRST0xMRVIJCSgxIDw8IDgpCisjZGVm aW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFNQkJCSgxIDw8IDUpCisjZGVmaW5lIFZIVUJfU1dfUkVT RVRfREVWSUNFNAkJCSgxIDw8IDQpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMwkJCSgx IDw8IDMpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMgkJCSgxIDw8IDIpCisjZGVmaW5l IFZIVUJfU1dfUkVTRVRfREVWSUNFMQkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRf Uk9PVF9IVUIJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX1NXX1JFU0VUX0FMTAkJCShWSFVCX1NX X1JFU0VUX0VQX1BPT0wgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9ETUFfQ09OVFJPTExFUiB8 IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTUgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNF VF9ERVZJQ0U0IHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfREVWSUNFMyB8IFwKKwkJCQkJCSBW SFVCX1NXX1JFU0VUX0RFVklDRTIgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9ERVZJQ0UxIHwg XAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfUk9PVF9IVUIpCisvKiBFUCBBQ0svTkFDSyBJUlEgbWFz a3MgKi8KKyNkZWZpbmUgVkhVQl9FUF9JUlEobikJCQkJKDEgPDwgKG4pKQorI2RlZmluZSBWSFVC X0VQX0lSUV9BTEwJCQkJMHg3ZmZmCS8qIDE1IEVQcyAqLworCisvKiBVU0Igc3RhdHVzIHJlZyAq LworI2RlZmluZSBWSFVCX1VTQlNUU19ISVNQRUVECQkJKDEgPDwgMjcpCisKKy8qIEVQIHRvZ2ds ZSAqLworI2RlZmluZSBWSFVCX0VQX1RPR0dMRV9WQUxVRQkJCSgxIDw8IDgpCisjZGVmaW5lIFZI VUJfRVBfVE9HR0xFX1NFVF9FUE5VTSh4KQkJKCh4KSAmIDB4MWYpCisKKy8qIEhVQiBFUDAgY29u dHJvbCAqLworI2RlZmluZSBWSFVCX0VQMF9DVFJMX1NUQUxMCQkJKDEgPDwgMCkKKyNkZWZpbmUg VkhVQl9FUDBfVFhfQlVGRl9SRFkJCQkoMSA8PCAxKQorI2RlZmluZSBWSFVCX0VQMF9SWF9CVUZG X1JEWQkJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfRVAwX1JYX0xFTih4KQkJCSgoKHgpID4+IDE2 KSAmIDB4N2YpCisjZGVmaW5lIFZIVUJfRVAwX1NFVF9UWF9MRU4oeCkJCQkoKCh4KSAmIDB4N2Yp IDw8IDgpCisKKy8qIEhVQiBFUDEgY29udHJvbCAqLworI2RlZmluZSBWSFVCX0VQMV9DVFJMX1JF U0VUX1RPR0dMRQkJKDEgPDwgMikKKyNkZWZpbmUgVkhVQl9FUDFfQ1RSTF9TVEFMTAkJCSgxIDw8 IDEpCisjZGVmaW5lIFZIVUJfRVAxX0NUUkxfRU5BQkxFCQkJKDEgPDwgMCkKKworLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICoKKyAqIHBlci1kZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKgorICogICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FTl9DVFJMCQkweDAwCisjZGVmaW5lIEFT VF9WSFVCX0RFVl9JU1IJCTB4MDQKKyNkZWZpbmUgQVNUX1ZIVUJfREVWX0VQMF9DVFJMCQkweDA4 CisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FUDBfREFUQQkJMHgwYworCisvKiBEZXZpY2UgZW5hYmxl IGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9ERVZfRU5fU0VUX0FERFIoeCkJCQkoKHgpIDw8IDgp CisjZGVmaW5lIFZIVUJfREVWX0VOX0FERFJfTUFTSwkJCSgoMHhmZikgPDwgOCkKKyNkZWZpbmUg VkhVQl9ERVZfRU5fRVAwX05BS19JUlFFTgkJKDEgPDwgNikKKyNkZWZpbmUgVkhVQl9ERVZfRU5f RVAwX0lOX0FDS19JUlFFTgkJKDEgPDwgNSkKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX09VVF9O QUtfSVJRRU4JCSgxIDw8IDQpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQMF9PVVRfQUNLX0lSUUVO CQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0RFVl9FTl9FUDBfU0VUVVBfSVJRRU4JCSgxIDw8IDIp CisjZGVmaW5lIFZIVUJfREVWX0VOX1NQRUVEX1NFTF9ISUdICQkoMSA8PCAxKQorI2RlZmluZSBW SFVCX0RFVl9FTl9FTkFCTEVfUE9SVAkJCSgxIDw8IDApCisKKy8qIEludGVycnVwdCBzdGF0dXMg Ki8KKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9JTl9EQVRBX05BQ0sJCSgxIDw8IDQpCisjZGVm aW5lIFZIVVZfREVWX0lSUV9FUDBfSU5fQUNLX1NUQUxMCQkoMSA8PCAzKQorI2RlZmluZSBWSFVW X0RFVl9JUlFfRVAwX09VVF9EQVRBX05BQ0sJCSgxIDw8IDIpCisjZGVmaW5lIFZIVVZfREVWX0lS UV9FUDBfT1VUX0FDS19TVEFMTAkJKDEgPDwgMSkKKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9T RVRVUAkJCSgxIDw8IDApCisKKy8qIENvbnRyb2wgYml0cy4KKyAqCisgKiBOb3RlOiBUaGUgZHJp dmVyIHJlbGllcyBvbiB0aGUgYnVsayBvZiB0aG9zZSBiaXRzCisgKiAgICAgICBtYXRjaGluZyBj b3JyZXNwb25kaW5nIHZIdWIgRVAwIGNvbnRyb2wgYml0cworICovCisjZGVmaW5lIFZIVUJfREVW X0VQMF9DVFJMX1NUQUxMCQkJVkhVQl9FUDBfQ1RSTF9TVEFMTAorI2RlZmluZSBWSFVCX0RFVl9F UDBfVFhfQlVGRl9SRFkJCVZIVUJfRVAwX1RYX0JVRkZfUkRZCisjZGVmaW5lIFZIVUJfREVWX0VQ MF9SWF9CVUZGX1JEWQkJVkhVQl9FUDBfUlhfQlVGRl9SRFkKKyNkZWZpbmUgVkhVQl9ERVZfRVAw X1JYX0xFTih4KQkJCVZIVUJfRVAwX1JYX0xFTih4KQorI2RlZmluZSBWSFVCX0RFVl9FUDBfU0VU X1RYX0xFTih4KQkJVkhVQl9FUDBfU0VUX1RYX0xFTih4KQorCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICoKKyAqIHBlci1lbmRwb2ludCByZWdpc3RlciBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCisKKyNkZWZpbmUgQVNUX1ZIVUJfRVBfQ09ORklHCQkweDAwCisjZGVmaW5lIEFT VF9WSFVCX0VQX0RNQV9DVExTVEFUCQkweDA0CisjZGVmaW5lIEFTVF9WSFVCX0VQX0RFU0NfQkFT RQkJMHgwOAorI2RlZmluZSBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUwkJMHgwQworCisvKiBFUCBj b25maWcgcmVnICovCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9NQVhfUEtUKHgpCSgoKHgpICYg MHgzZmYpIDw8IDE2KQorI2RlZmluZSBWSFVCX0VQX0NGR19BVVRPX0RBVEFfRElTQUJMRQkoMSA8 PCAxMykKKyNkZWZpbmUgVkhVQl9FUF9DRkdfU1RBTExfQ1RSTAkJKDEgPDwgMTIpCisjZGVmaW5l IFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0oeCkJKCgoeCkgJiAweGYpIDw8IDgpCisjZGVmaW5lIFZI VUJfRVBfQ0ZHX1NFVF9UWVBFKHgpCQkoKHgpIDw8IDUpCisjZGVmaW5lICAgRVBfVFlQRV9PRkYJ CQkwCisjZGVmaW5lICAgRVBfVFlQRV9CVUxLCQkJMQorI2RlZmluZSAgIEVQX1RZUEVfSU5UCQkJ MgorI2RlZmluZSAgIEVQX1RZUEVfSVNPCQkJMworI2RlZmluZSBWSFVCX0VQX0NGR19ESVJfT1VU CQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfREVWKHgpCQkoKHgpIDw8IDEpCisj ZGVmaW5lIFZIVUJfRVBfQ0ZHX0VOQUJMRQkJKDEgPDwgMCkKKworLyogRVAgRE1BIGNvbnRyb2wg Ki8KKyNkZWZpbmUgVkhVQl9FUF9ETUFfUFJPQ19TVEFUVVMoeCkJKCgoeCkgPj4gNCkgJiAweGYp CisjZGVmaW5lICAgRVBfRE1BX1BST0NfUlhfSURMRQkJMAorI2RlZmluZSAgIEVQX0RNQV9QUk9D X1RYX0lETEUJCTgKKyNkZWZpbmUgVkhVQl9FUF9ETUFfSU5fTE9OR19NT0RFCSgxIDw8IDMpCisj ZGVmaW5lIFZIVUJfRVBfRE1BX09VVF9DT05USUdfTU9ERQkoMSA8PCAzKQorI2RlZmluZSBWSFVC X0VQX0RNQV9DVFJMX1JFU0VUCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0VQX0RNQV9TSU5HTEVf U1RBR0UJKDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9FUF9ETUFfREVTQ19NT0RFCQkoMSA8PCAwKQor CisvKiBFUCBETUEgc3RhdHVzICovCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9UWF9TSVpFKHgp CSgoeCkgPDwgMTYpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1RYX1NJWkUoeCkJCSgoKHgpID4+IDE2 KSAmIDB4N2ZmKQorI2RlZmluZSBWSFVCX0VQX0RNQV9SUFRSKHgpCQkoKCh4KSA+PiA4KSAmIDB4 ZmYpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9SUFRSKHgpCQkoKCh4KSAmIDB4ZmYpIDw8IDgp CisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9DUFVfV1BUUih4KQkoeCkKKyNkZWZpbmUgVkhVQl9F UF9ETUFfU0lOR0xFX0tJQ0sJCSgxIDw8IDApIC8qIFdQVFIgPSAxIGZvciBzaW5nbGUgbW9kZSAq LworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICoKKyAqIERNQSBkZXNjcmlwdG9ycyBkZWZpbml0aW9ucyAqCisgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KiovCisKKy8qIERlc2MgVzEgSU4gKi8KKyNkZWZpbmUgVkhVQl9EU0MxX0lOX0lOVEVSUlVQVAkJ KDEgPDwgMzEpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX0RBVEEwCQkoMCA8PCAxNCkKKyNk ZWZpbmUgVkhVQl9EU0MxX0lOX1NQSURfREFUQTIJCSgxIDw8IDE0KQorI2RlZmluZSBWSFVCX0RT QzFfSU5fU1BJRF9EQVRBMQkJKDIgPDwgMTQpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX01E QVRBCQkoMyA8PCAxNCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NFVF9MRU4oeCkJCSgoeCkgJiAw eGZmZikKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX0xFTih4KQkJKCh4KSAmIDB4ZmZmKQorCisvKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERhdGEgc3RydWN0dXJlcyBhbmQgbWlzYyBkZWZp bml0aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVNUX1ZI VUJfTlVNX0dFTl9FUHMJMTUJLyogR2VuZXJpYyBub24tMCBFUHMgKi8KKyNkZWZpbmUgQVNUX1ZI VUJfTlVNX1BPUlRTCTUJLyogdkh1YiBwb3J0cyAqLworI2RlZmluZSBBU1RfVkhVQl9FUDBfTUFY X1BBQ0tFVAk2NAkvKiBFUDAncyBtYXggcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgQVNUX1ZIVUJf RVBuX01BWF9QQUNLRVQJMTAyNAkvKiBHZW5lcmljIEVQcyBtYXggcGFja2V0IHNpemUgKi8KKyNk ZWZpbmUgQVNUX1ZIVUJfREVTQ1NfQ09VTlQJMjU2CS8qIFVzZSAyNTYgZGVzY3JpcHRvciBtb2Rl ICh2YWxpZAorCQkJCQkgKiB2YWx1ZXMgYXJlIDI1NiBhbmQgMzIpCisJCQkJCSAqLworCitzdHJ1 Y3QgYXN0X3ZodWI7CitzdHJ1Y3QgYXN0X3ZodWJfZGV2OworCisvKgorICogRE1BIGRlc2NyaXB0 b3IgKGdlbmVyaWMgRVBzIG9ubHksIGN1cnJlbnRseSBvbmx5IHVzZWQKKyAqIGZvciBJTiBlbmRw b2ludHMKKyAqLworc3RydWN0IGFzdF92aHViX2Rlc2MgeworCV9fbGUzMgl3MDsKKwlfX2xlMzIJ dzE7Cit9OworCisvKiBBIHRyYW5zZmVyIHJlcXVlc3QsIGVpdGhlciBjb3JlLW9yaWdpbmF0ZWQg b3IgaW50ZXJuYWwgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9yZXEgeworCXN0cnVjdCB1c2JfcmVxdWVz dAlyZXE7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKworCS8qIEFjdHVhbCBjb3VudCB3cml0 dGVuIHRvIGRlc2NyaXB0b3JzIChkZXNjIG1vZGUgb25seSkgKi8KKwl1bnNpZ25lZCBpbnQJCWFj dF9jb3VudDsKKworCS8qCisJICogRGVzYyBudW1iZXIgb2YgdGhlIGZpbmFsIHBhY2tldCBvciAt MS4gRm9yIG5vbi1kZXNjCisJICogbW9kZSAob3IgZXAwKSwgYW55ID49IDAgdmFsdWUgbWVhbnMg Imxhc3QgcGFja2V0IgorCSAqLworCWludAkJCWxhc3RfZGVzYzsKKworCS8qIFJlcXVlc3QgYWN0 aXZlIChwZW5kaW5nIERNQXMpICovCisJYm9vbAkJCWFjdGl2ZSAgOiAxOworCisJLyogSW50ZXJu YWwgcmVxdWVzdCAoZG9uJ3QgY2FsbCBiYWNrIGNvcmUpICovCisJYm9vbAkJCWludGVybmFsIDog MTsKK307CisjZGVmaW5lIHRvX2FzdF9yZXEoX191cmVxKSBjb250YWluZXJfb2YoX191cmVxLCBz dHJ1Y3QgYXN0X3ZodWJfcmVxLCByZXEpCisKKy8qIEN1cnJlbnQgc3RhdGUgb2YgYW4gRVAwICov CitlbnVtIGVwMF9zdGF0ZSB7CisJZXAwX3N0YXRlX3Rva2VuLAorCWVwMF9zdGF0ZV9kYXRhLAor CWVwMF9zdGF0ZV9zdGF0dXMsCit9OworCisvKgorICogQW4gZW5kcG9pbnQsIGVpdGhlciBnZW5l cmljLCBlcDAsIGFjdHVhbCBnYWRnZXQgRVAKKyAqIG9yIGludGVybmFsIHVzZSB2aHViIEVQMC4g dmh1YiBFUDEgZG9lc24ndCBoYXZlIGFuCisgKiBhc3NvY2lhdGVkIHN0cnVjdHVyZSBhcyBpdCdz IG1vc3RseSBIVyBtYW5hZ2VkLgorICovCitzdHJ1Y3QgYXN0X3ZodWJfZXAgeworCXN0cnVjdCB1 c2JfZXAJCWVwOworCisJLyogUmVxdWVzdCBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXVl dWU7CisKKwkvKiBFUCBpbmRleCBpbiB0aGUgZGV2aWNlLCAwIG1lYW5zIHRoaXMgaXMgYW4gRVAw ICovCisJdW5zaWduZWQgaW50CQlkX2lkeDsKKworCS8qIERldiBwb2ludGVyIG9yIE5VTEwgZm9y IHZIdWIgRVAwICovCisJc3RydWN0IGFzdF92aHViX2RldgkqZGV2OworCisJLyogdkh1YiBpdHNl bGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWIJCSp2aHViOworCisJLyoKKwkgKiBETUEgYnVmZmVyIGZv ciBFUDAsIGZhbGxiYWNrIERNQSBidWZmZXIgZm9yIG1pc2FsaWduZWQKKwkgKiBPVVQgdHJhbnNm ZXJzIGZvciBnZW5lcmljIEVQcworCSAqLworCXZvaWQJCQkqYnVmOworCWRtYV9hZGRyX3QJCWJ1 Zl9kbWE7CisKKwkvKiBUaGUgcmVzdCBkZXBlbmRzIG9uIHRoZSBFUCB0eXBlICovCisJdW5pb24g eworCQkvKiBFUDAgKGVpdGhlciBkZXZpY2Ugb3Igdmh1YikgKi8KKwkJc3RydWN0IHsKKwkJCS8q CisJCQkgKiBFUDAgcmVnaXN0ZXJzIGFyZSAic2ltaWxhciIgZm9yCisJCQkgKiB2SHViIGFuZCBk ZXZpY2VzIGJ1dCBsb2NhdGVkIGluCisJCQkgKiBkaWZmZXJlbnQgcGxhY2VzLgorCQkJICovCisJ CQl2b2lkIF9faW9tZW0JCSpjdGxzdGF0OworCQkJdm9pZCBfX2lvbWVtCQkqc2V0dXA7CisKKwkJ CS8qIEN1cnJlbnQgc3RhdGUgJiBkaXJlY3Rpb24gKi8KKwkJCWVudW0gZXAwX3N0YXRlCQlzdGF0 ZTsKKwkJCWJvb2wJCQlkaXJfaW47CisKKwkJCS8qIEludGVybmFsIHVzZSByZXF1ZXN0ICovCisJ CQlzdHJ1Y3QgYXN0X3ZodWJfcmVxCXJlcTsKKwkJfSBlcDA7CisKKwkJLyogR2VuZXJpYyBlbmRw b2ludCAoYWthIEVQbikgKi8KKwkJc3RydWN0IHsKKwkJCS8qIFJlZ2lzdGVycyAqLworCQkJdm9p ZCBfX2lvbWVtICAgCQkqcmVnczsKKworCQkJLyogSW5kZXggaW4gZ2xvYmFsIHBvb2wgKDAuLjE0 KSAqLworCQkJdW5zaWduZWQgaW50CQlnX2lkeDsKKworCQkJLyogRE1BIERlc2NyaXB0b3JzICov CisJCQlzdHJ1Y3QgYXN0X3ZodWJfZGVzYwkqZGVzY3M7CisJCQlkbWFfYWRkcl90CQlkZXNjc19k bWE7CisJCQl1bnNpZ25lZCBpbnQJCWRfbmV4dDsKKwkJCXVuc2lnbmVkIGludAkJZF9sYXN0Owor CQkJdW5zaWduZWQgaW50CQlkbWFfY29uZjsKKworCQkJLyogTWF4IGNodW5rIHNpemUgZm9yIElO IEVQcyAqLworCQkJdW5zaWduZWQgaW50CQljaHVua19tYXg7CisKKwkJCS8qIFN0YXRlIGZsYWdz ICovCisJCQlib29sCQkJaXNfaW4gOiAgMTsKKwkJCWJvb2wJCQlpc19pc28gOiAxOworCQkJYm9v bAkJCXN0YWxsZWQgOiAxOworCQkJYm9vbAkJCXdlZGdlZCA6IDE7CisJCQlib29sCQkJZW5hYmxl ZCA6IDE7CisJCQlib29sCQkJZGVzY19tb2RlIDogMTsKKwkJfSBlcG47CisJfTsKK307CisjZGVm aW5lIHRvX2FzdF9lcChfX3VlcCkgY29udGFpbmVyX29mKF9fdWVwLCBzdHJ1Y3QgYXN0X3ZodWJf ZXAsIGVwKQorCisvKiBBIGRldmljZSBhdHRhY2hlZCB0byBhIHZIdWIgcG9ydCAqLworc3RydWN0 IGFzdF92aHViX2RldiB7CisJc3RydWN0IGFzdF92aHViCQkJKnZodWI7CisJdm9pZCBfX2lvbWVt CQkJKnJlZ3M7CisKKwkvKiBEZXZpY2UgaW5kZXggKDAuLi40KSBhbmQgbmFtZSBzdHJpbmcgKi8K Kwl1bnNpZ25lZCBpbnQJCQlpbmRleDsKKwljb25zdCBjaGFyCQkJKm5hbWU7CisKKwkvKiBzeXNm cyBlbmNsb3N1cmUgZm9yIHRoZSBnYWRnZXQgZ3VuayAqLworCXN0cnVjdCBkZXZpY2UJCQkqcG9y dF9kZXY7CisKKwkvKiBMaW5rIHRvIGdhZGdldCBjb3JlICovCisJc3RydWN0IHVzYl9nYWRnZXQJ CWdhZGdldDsKKwlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIJKmRyaXZlcjsKKwlib29sCQkJCXJl Z2lzdGVyZWQgOiAxOworCWJvb2wJCQkJd2FrZXVwX2VuIDogMTsKKwlib29sCQkJCXN1c3BlbmRl ZCA6IDE7CisJYm9vbAkJCQllbmFibGVkIDogMTsKKworCS8qIEVuZHBvaW50IHN0cnVjdHVyZXMg Ki8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwMDsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCSplcG5z W0FTVF9WSFVCX05VTV9HRU5fRVBzXTsKKworfTsKKyNkZWZpbmUgdG9fYXN0X2RldihfX2cpIGNv bnRhaW5lcl9vZihfX2csIHN0cnVjdCBhc3Rfdmh1Yl9kZXYsIGdhZGdldCkKKworLyogUGVyIHZo dWIgcG9ydCBzdGF0ZWluZm8gc3RydWN0dXJlICovCitzdHJ1Y3QgYXN0X3ZodWJfcG9ydCB7CisJ LyogUG9ydCBzdGF0dXMgJiBzdGF0dXMgY2hhbmdlIHJlZ2lzdGVycyAqLworCXUxNgkJCXN0YXR1 czsKKwl1MTYJCQljaGFuZ2U7CisKKwkvKiBBc3NvY2lhdGVkIGRldmljZSBzbG90ICovCisJc3Ry dWN0IGFzdF92aHViX2RldglkZXY7Cit9OworCisvKiBHbG9iYWwgdmh1YiBzdHJ1Y3R1cmUgKi8K K3N0cnVjdCBhc3Rfdmh1YiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7CisJdm9p ZCBfX2lvbWVtCQkJKnJlZ3M7CisJaW50CQkJCWlycTsKKwlzcGlubG9ja190CQkJbG9jazsKKwlz dHJ1Y3Qgd29ya19zdHJ1Y3QJCXdha2Vfd29yazsKKwlzdHJ1Y3QgY2xrCQkJKmNsazsKKworCS8q IEVQMCBETUEgYnVmZmVycyBhbGxvY2F0ZWQgaW4gb25lIGNodW5rICovCisJdm9pZAkJCQkqZXAw X2J1ZnM7CisJZG1hX2FkZHJfdAkJCWVwMF9idWZzX2RtYTsKKworCS8qIEVQMCBvZiB0aGUgdmh1 YiBpdHNlbGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwMDsKKworCS8qIFN0YXRlIG9mIHZo dWIgZXAxICovCisJYm9vbAkJCQllcDFfc3RhbGxlZCA6IDE7CisKKwkvKiBQZXItcG9ydCBpbmZv ICovCisJc3RydWN0IGFzdF92aHViX3BvcnQJCXBvcnRzW0FTVF9WSFVCX05VTV9QT1JUU107CisK KwkvKiBHZW5lcmljIEVQIGRhdGEgc3RydWN0dXJlcyAqLworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJ ZXBuc1tBU1RfVkhVQl9OVU1fR0VOX0VQc107CisKKwkvKiBVcHN0cmVhbSBidXMgaXMgc3VzcGVu ZGVkID8gKi8KKwlib29sCQkJCXN1c3BlbmRlZCA6IDE7CisKKwkvKiBIdWIgaXRzZWxmIGNhbiBz aWduYWwgcmVtb3RlIHdha2V1cCAqLworCWJvb2wJCQkJd2FrZXVwX2VuIDogMTsKKworCS8qIEZv cmNlIGZ1bGwgc3BlZWQgb25seSAqLworCWJvb2wJCQkJZm9yY2VfdXNiMSA6IDE7CisKKwkvKiBV cHN0cmVhbSBidXMgc3BlZWQgY2FwdHVyZWQgYXQgYnVzIHJlc2V0ICovCisJdW5zaWduZWQgaW50 CQkJc3BlZWQ7Cit9OworCisvKiBTdGFuZGFyZCByZXF1ZXN0IGhhbmRsZXJzIHJlc3VsdCBjb2Rl cyAqLworZW51bSBzdGRfcmVxX3JjIHsKKwlzdGRfcmVxX3N0YWxsID0gLTEsCS8qIFN0YWxsIHJl cXVlc3RlZCAqLworCXN0ZF9yZXFfY29tcGxldGUgPSAwLAkvKiBSZXF1ZXN0IGNvbXBsZXRlZCB3 aXRoIG5vIGRhdGEgKi8KKwlzdGRfcmVxX2RhdGEgPSAxLAkvKiBSZXF1ZXN0IGNvbXBsZXRlZCB3 aXRoIGRhdGEgKi8KKwlzdGRfcmVxX2RyaXZlciA9IDIsCS8qIFBhc3MgdG8gZHJpdmVyIHBscyAq LworfTsKKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX1ZFUkJPU0UKKyNkZWZpbmUgVURDVkRC Ryh1LCBmbXQuLi4pCWRldl9kYmcoJih1KS0+cGRldi0+ZGV2LCBmbXQpCisKKyNkZWZpbmUgRVBW REJHKGVwLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJnKCYoZXApLT52aHViLT5wZGV2LT5k ZXYsCQkJXAorCQkiJXM6RVAlZCAiIGZtdCwJCQkJXAorCQkoZXApLT5kZXYgPyAoZXApLT5kZXYt Pm5hbWUgOiAiaHViIiwJXAorCQkoZXApLT5kX2lkeCwgIyNfX1ZBX0FSR1NfXyk7CQlcCisJfSB3 aGlsZSgwKQorCisjZGVmaW5lIERWREJHKGQsIGZtdCwgLi4uKQlkbyB7CQkJXAorCWRldl9kYmco JihkKS0+dmh1Yi0+cGRldi0+ZGV2LAkJCVwKKwkJIiVzICIgZm10LCAoZCktPm5hbWUsCQkJXAor CQkjI19fVkFfQVJHU19fKTsJCQkJXAorCX0gd2hpbGUoMCkKKworI2Vsc2UKKyNkZWZpbmUgVURD VkRCRyh1LCBmbXQuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBFUFZEQkcoZXAsIGZtdCwg Li4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRFZEQkcoZCwgZm10LCAuLi4pCWRvIHsgfSB3 aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9ERUJVRworI2RlZmlu ZSBVRENEQkcodSwgZm10Li4uKQlkZXZfZGJnKCYodSktPnBkZXYtPmRldiwgZm10KQorCisjZGVm aW5lIEVQREJHKGVwLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJnKCYoZXApLT52aHViLT5w ZGV2LT5kZXYsCQkJXAorCQkiJXM6RVAlZCAiIGZtdCwJCQkJXAorCQkoZXApLT5kZXYgPyAoZXAp LT5kZXYtPm5hbWUgOiAiaHViIiwJXAorCQkoZXApLT5kX2lkeCwgIyNfX1ZBX0FSR1NfXyk7CQlc CisJfSB3aGlsZSgwKQorCisjZGVmaW5lIEREQkcoZCwgZm10LCAuLi4pCWRvIHsJCQlcCisJZGV2 X2RiZygmKGQpLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXMgIiBmbXQsIChkKS0+bmFtZSwJ CQlcCisJCSMjX19WQV9BUkdTX18pOwkJCQlcCisJfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUg VURDREJHKHUsIGZtdC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEVQREJHKGVwLCBmbXQs IC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEREQkcoZCwgZm10LCAuLi4pCWRvIHsgfSB3 aGlsZSgwKQorI2VuZGlmCisKKy8qIGNvcmUuYyAqLwordm9pZCBhc3Rfdmh1Yl9kb25lKHN0cnVj dCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSwKKwkJICAgaW50IHN0 YXR1cyk7Cit2b2lkIGFzdF92aHViX251a2Uoc3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IHN0 YXR1cyk7CitzdHJ1Y3QgdXNiX3JlcXVlc3QgKmFzdF92aHViX2FsbG9jX3JlcXVlc3Qoc3RydWN0 IHVzYl9lcCAqdV9lcCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwX2ZsYWdzKTsKK3ZvaWQgYXN0X3ZodWJf ZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKnVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9y ZXEpOwordm9pZCBhc3Rfdmh1Yl9pbml0X2h3KHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7CisKKy8q IGVwMC5jICovCit2b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfYWNrKHN0cnVjdCBhc3Rfdmh1Yl9l cCAqZXAsIGJvb2wgaW5fYWNrKTsKK3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cChzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwKTsKK3ZvaWQgYXN0X3ZodWJfaW5pdF9lcDAoc3RydWN0IGFzdF92 aHViICp2aHViLCBzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkgICAgICAgc3RydWN0IGFzdF92 aHViX2RldiAqZGV2KTsKK2ludCBhc3Rfdmh1Yl9yZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw LCBjaGFyICpwdHIsIGludCBsZW4pOworaW50IF9fYXN0X3ZodWJfc2ltcGxlX3JlcGx5KHN0cnVj dCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBsZW4sIC4uLik7CisjZGVmaW5lIGFzdF92aHViX3NpbXBs ZV9yZXBseSh1ZGMsIC4uLikJCQkJCSAgICAgICBcCisJX19hc3Rfdmh1Yl9zaW1wbGVfcmVwbHko KHVkYyksCQkJCQkgICAgICAgXAorCQkJICAgICAgIHNpemVvZigodThbXSkgeyBfX1ZBX0FSR1Nf XyB9KS9zaXplb2YodTgpLCAgICAgIFwKKwkJCSAgICAgICBfX1ZBX0FSR1NfXykKKworLyogaHVi LmMgKi8KK3ZvaWQgYXN0X3ZodWJfaW5pdF9odWIoc3RydWN0IGFzdF92aHViICp2aHViKTsKK2Vu dW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2Vw ICplcCwKKwkJCQkJIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSk7CitlbnVtIHN0ZF9yZXFf cmMgYXN0X3ZodWJfY2xhc3NfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJ CQkJICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsKK3ZvaWQgYXN0X3ZodWJfZGV2aWNl X2Nvbm5lY3Qoc3RydWN0IGFzdF92aHViICp2aHViLCB1bnNpZ25lZCBpbnQgcG9ydCwKKwkJCSAg ICAgYm9vbCBvbik7Cit2b2lkIGFzdF92aHViX2h1Yl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1YiAq dmh1Yik7Cit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUoc3RydWN0IGFzdF92aHViICp2aHViKTsK K3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7Cit2b2lkIGFz dF92aHViX2h1Yl93YWtlX2FsbChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpOworCisvKiBkZXYuYyAq LworaW50IGFzdF92aHViX2luaXRfZGV2KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwgdW5zaWduZWQg aW50IGlkeCk7Cit2b2lkIGFzdF92aHViX2RlbF9kZXYoc3RydWN0IGFzdF92aHViX2RldiAqZCk7 Cit2b2lkIGFzdF92aHViX2Rldl9pcnEoc3RydWN0IGFzdF92aHViX2RldiAqZCk7CitpbnQgYXN0 X3ZodWJfc3RkX2Rldl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkgICAgIHN0 cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSk7CisKKy8qIGVwbi5jICovCit2b2lkIGFzdF92aHVi X2Vwbl9hY2tfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOwordm9pZCBhc3Rfdmh1Yl91cGRh dGVfZXBuX3N0YWxsKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOworc3RydWN0IGFzdF92aHViX2Vw ICphc3Rfdmh1Yl9hbGxvY19lcG4oc3RydWN0IGFzdF92aHViX2RldiAqZCwgdTggYWRkcik7Cit2 b2lkIGFzdF92aHViX2Rldl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpOwordm9pZCBh c3Rfdmh1Yl9kZXZfcmVzdW1lKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpOwordm9pZCBhc3Rfdmh1 Yl9kZXZfcmVzZXQoc3RydWN0IGFzdF92aHViX2RldiAqZCk7CisKKyNlbmRpZiAvKiBfX0FTUEVF RF9WSFVCX0ggKi8K