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: [v4,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180126000133.3840-2-benh@kernel.crashing.org> Date: Fri, 26 Jan 2018 11:01:33 +1100 To: linux-usb@vger.kernel.org Cc: Greg KH , Joel Stanley , Andrew Jeffery , Felipe Balbi , Benjamin Herrenschmidt List-ID: VGhlIEFzcGVlZCBCTUMgU29DcyBzdXBwb3J0IGEgInZpcnR1YWwgaHViIiBmdW5jdGlvbi4gSXQg cHJvdmlkZXMgc29tZQpIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBiZWhpbmQg d2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCgpUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9y IHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKaHViIHN0YW5kYXJkIHJlcXVl c3RzIGFuZCBleHBvc2luZyA1IFVEQyBnYWRnZXQgZHJpdmVycyBjb3JyZXNwb25kaW5nCnRvIHRo ZSBwb3J0cy4KClRoZSBodWIgaXRzZWxmIGhhcyBIVyBwcm92aWRlZCBkZWRpY2F0ZWQgRVAwIGFu ZCBFUDEgKHRoZSBsYXR0ZXIgZm9yCmh1YiBpbnRlcnJ1cHRzKS4gSXQgYWxzbyBoYXMgZGVkaWNh dGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgpvdGhlciBlbmRwb2ludHMsIHRoZXJlJ3Mg YSBwb29sIG9mIDE1ICJnZW5lcmljIiBlbmRwb2ludHMgdGhhdCBhcmUKc2hhcmVkIGFtb25nIHRo ZSBwb3J0cy4KClRoZSBkcml2ZXIgcmVsaWVzIG9uIG15IHByZXZpb3VzIHBhdGNoIGFkZGluZyBh ICJkaXNwb3NlIiBFUCBvcCB0bwpoYW5kbGUgRVAgYWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBF UHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFyZWQKcG9vbCBpbiB0aGUgVURDICJtYXRjaF9l cCIgY2FsbGJhY2sgYW5kIGFzc2lnbmVkIHRvIHRoZSBVREMgaW5zdGFuY2UKKGFkZGVkIHRvIHRo ZSBnYWRnZXQgZXBfbGlzdCkuCgpXaGVuIHRoZSBjb21wb3NpdGUgZHJpdmVyIGdldHMgdW5ib3Vu ZCwgdGhlIG5ldyBob29rIHdpbGwgYWxsb3cgdGhlIFVEQwp0byBjbGVhbiB0aGluZ3MgdXAgYW5k IHJldHVybiB0aG9zZSBFUHMgdG8gdGhlIHNoYXJlZCBwb29sLgoKU2lnbmVkLW9mZi1ieTogQmVu amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjQuIC0g Rml4IG1pc3NpbmcgdW5sb2NrIGFzdF92aHViX3VkY193YWtldXAoKSBlcnJvciBwYXRoCiAgICAt IE1ha2UgImlycSIgc2lnbmVkIHRvIGRlYWwgd2l0aCBlcnJvciBmcm9tIHBsYXRmb3JtX2dldF9p cnEKICAgIC0gRml4IE1ha2VmaWxlIGZvciBtb2R1bGUgYnVpbGRzCiAgICAtIEZpeCBhIG1pc3Np bmcgZW5kaWFuIGNvbnZlcnNpb24KCnYzLiAtIFJlYmFzZWQKICAgIC0gQWRkIGNsayBzdHVmZgoK djIuIC0gQ29zbWV0aWMgZml4ZXMKICAgIC0gUHJvcGVybHkgImFsbG9jYXRlIiBkZXZpY2UgYWRk cmVzc2VzIGluc3RlYWQgb2YgdXNpbmcgYSBuZXZlcgogICAgICByZXNldCBjb3VudGVyCiAgICAt IE1vdmUgLmR0c2kgdXBkYXRlcyB0byBhIGRpZmZlcmVudCBwYXRjaAoKZm9vCgpnb28KLS0tCiBk cml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcgICAgICAgICAgICAgIHwgICAyICsKIGRyaXZl cnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnICB8ICAgNiArCiBkcml2ZXJzL3VzYi9n YWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlIHwgICAzICsKIGRyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvY29yZS5jICAgfCA0MjkgKysrKysrKysrKysrKysKIGRyaXZlcnMv dXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMgICAgfCA1ODAgKysrKysrKysrKysrKysr KysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYyAgICB8IDQ3NCAr KysrKysrKysrKysrKysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5j ICAgIHwgODQwICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvaHViLmMgICAgfCA4MjIgKysrKysrKysrKysrKysrKysrKysrKysr KysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaCAgIHwgNDk2ICsr KysrKysrKysrKysrKysKIDEwIGZpbGVzIGNoYW5nZWQsIDM2NTMgaW5zZXJ0aW9ucygrKQogY3Jl YXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZp ZwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIv TWFrZWZpbGUKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVl ZC12aHViL2NvcmUuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMv YXNwZWVkLXZodWIvZGV2LmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQv dWRjL2FzcGVlZC12aHViL2VwMC5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4uYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNi L2dhZGdldC91ZGMvYXNwZWVkLXZodWIvaHViLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaAoKZGlmZiAtLWdpdCBhL2RyaXZlcnMv dXNiL2dhZGdldC91ZGMvS2NvbmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwpp bmRleCAxZTk1NjcwOTFkODYuLjE0Y2YzMWEyNzAzYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9LY29uZmlnCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZwpA QCAtNDM5LDYgKzQzOSw4IEBAIGNvbmZpZyBVU0JfR0FER0VUX1hJTElOWAogCSAgZHluYW1pY2Fs bHkgbGlua2VkIG1vZHVsZSBjYWxsZWQgInVkYy14aWxpbngiIGFuZCBmb3JjZSBhbGwKIAkgIGdh ZGdldCBkcml2ZXJzIHRvIGFsc28gYmUgZHluYW1pY2FsbHkgbGlua2VkLgogCitzb3VyY2UgImRy aXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZyIKKwogIwogIyBMQVNUIC0t IGR1bW15L2VtdWxhdGVkIGNvbnRyb2xsZXIKICMKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dh ZGdldC91ZGMvTWFrZWZpbGUgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlCmluZGV4 IGNlODY1YjEyOWZkNi4uODk3ZjY0OGYzY2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUKQEAg LTM5LDQgKzM5LDUgQEAgb2JqLSQoQ09ORklHX1VTQl9NVl9VM0QpCSs9IG12X3UzZF9jb3JlLm8K IG9iai0kKENPTkZJR19VU0JfR1JfVURDKQkrPSBncl91ZGMubwogb2JqLSQoQ09ORklHX1VTQl9H QURHRVRfWElMSU5YKQkrPSB1ZGMteGlsaW54Lm8KIG9iai0kKENPTkZJR19VU0JfU05QX1VEQ19Q TEFUKSArPSBzbnBzX3VkY19wbGF0Lm8KK29iai0kKENPTkZJR19VU0JfQVNQRUVEX1ZIVUIpCSs9 IGFzcGVlZC12aHViLwogb2JqLSQoQ09ORklHX1VTQl9CRENfVURDKQkrPSBiZGMvCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcgYi9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQK aW5kZXggMDAwMDAwMDAwMDAwLi5jYjAyMmM4ODU0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcKQEAgLTAsMCArMSw2IEBACitj b25maWcgVVNCX0FTUEVFRF9WSFVCCisJdHJpc3RhdGUgIkFzcGVlZCB2SHViIFVEQyBkcml2ZXIi CisJZGVwZW5kcyBvbiBBUkNIX0FTUEVFRCB8fCBDT01QSUxFX1RFU1QKKwloZWxwCisJICBVU0Ig cGVyaXBoZXJhbCBjb250cm9sbGVyIGZvciB0aGUgQXNwZWVkIEFTVDI1MDAgZmFtaWx5CisJICBT b0NzIHN1cHBvcnRpbmcgdGhlICJ2SHViIiBmdW5jdGlvbmFsaXR5IGFuZCBVU0IyLjAKZGlmZiAt LWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUgYi9kcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uNDI1NjI2NmMwYThhCi0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZQpAQCAtMCwwICsxLDMg QEAKK29iai0kKENPTkZJR19VU0JfQVNQRUVEX1ZIVUIpCSs9IGFzcGVlZC12aHViLm8KK2FzcGVl ZC12aHViLXkJOj0gY29yZS5vIGVwMC5vIGVwbi5vIGRldi5vIGh1Yi5vCisKZGlmZiAtLWdpdCBh L2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvY29yZS5jIGIvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMDAwMDAwLi4zMWVkMmI2ZTI0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwpAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAq IGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAor ICoKKyAqIGNvcmUuYyAtIFRvcCBsZXZlbCBzdXBwb3J0CisgKgorICogQ29weXJpZ2h0IDIwMTcg SUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlv dSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJt cyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0 aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNl bnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisj aW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5j bHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4K KyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5j bHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8 bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUg PGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGlu dXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgv b2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2Rt YS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJ2aHViLmgiCisKK3N0YXRpYyBib29sIGZvcmNlX3Vz YjEgPSBmYWxzZTsKK3N0YXRpYyBib29sIG5vX2RtYV9kZXNjID0gZmFsc2U7CisKK21vZHVsZV9w YXJhbV9uYW1lZChmb3JjZV91c2IxLCBmb3JjZV91c2IxLCBib29sLCAwNjQ0KTsKK01PRFVMRV9Q QVJNX0RFU0MoZm9yY2VfdXNiMSwgIlNldCB0byB0cnVlIHRvIGZvcmNlIHRvIFVTQjEgc3BlZWQi KTsKK21vZHVsZV9wYXJhbV9uYW1lZChub19kbWFfZGVzYywgbm9fZG1hX2Rlc2MsIGJvb2wsIDA2 NDQpOworTU9EVUxFX1BBUk1fREVTQyhub19kbWFfZGVzYywgIlNldCB0byB0cnVlIHRvIGRpc2Fi bGUgdXNlIG9mIERNQSBkZXNjcmlwdG9ycyIpOworCit2b2lkIGFzdF92aHViX2RvbmUoc3RydWN0 IGFzdF92aHViX2VwICplcCwgc3RydWN0IGFzdF92aHViX3JlcSAqcmVxLAorCQkgICBpbnQgc3Rh dHVzKQoreworCWJvb2wgaW50ZXJuYWwgPSByZXEtPmludGVybmFsOworCisJRVBWREJHKGVwLCAi Y29tcGxldGluZyByZXF1ZXN0IEAlcCwgc3RhdHVzICVkXG4iLCByZXEsIHN0YXR1cyk7CisKKwls aXN0X2RlbF9pbml0KCZyZXEtPnF1ZXVlKTsKKworCWlmIChyZXEtPnJlcS5zdGF0dXMgPT0gLUVJ TlBST0dSRVNTKQorCQlyZXEtPnJlcS5zdGF0dXMgPSBzdGF0dXM7CisKKwlpZiAocmVxLT5yZXEu ZG1hKSB7CisJCWlmICghV0FSTl9PTighZXAtPmRldikpCisJCQl1c2JfZ2FkZ2V0X3VubWFwX3Jl cXVlc3QoJmVwLT5kZXYtPmdhZGdldCwKKwkJCQkJCSAmcmVxLT5yZXEsIGVwLT5lcG4uaXNfaW4p OworCQlyZXEtPnJlcS5kbWEgPSAwOworCX0KKworCS8qCisJICogSWYgdGhpcyBpc24ndCBhbiBp bnRlcm5hbCBFUDAgcmVxdWVzdCwgY2FsbCB0aGUgY29yZQorCSAqIHRvIGNhbGwgdGhlIGdhZGdl dCBjb21wbGV0aW9uLgorCSAqLworCWlmICghaW50ZXJuYWwpIHsKKwkJc3Bpbl91bmxvY2soJmVw LT52aHViLT5sb2NrKTsKKwkJdXNiX2dhZGdldF9naXZlYmFja19yZXF1ZXN0KCZlcC0+ZXAsICZy ZXEtPnJlcSk7CisJCXNwaW5fbG9jaygmZXAtPnZodWItPmxvY2spOworCX0KK30KKwordm9pZCBh c3Rfdmh1Yl9udWtlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBzdGF0dXMpCit7CisJc3Ry dWN0IGFzdF92aHViX3JlcSAqcmVxOworCisJRVBEQkcoZXAsICJOdWtpbmdcbiIpOworCisJLyog dGVybWluYXRlIGFueSByZXF1ZXN0IGluIHRoZSBxdWV1ZSAqLworCWlmIChsaXN0X2VtcHR5KCZl cC0+cXVldWUpKQorCQlyZXR1cm47CisKKwkvKiBCZXdhcmUsIGxvY2sgd2lsbCBiZSBkcm9wcGVk ICYgcmVxLWFjcXVpcmVkIGJ5IGRvbmUoKSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZXAtPnF1 ZXVlKSkgeworCQlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZlcC0+cXVldWUsIHN0cnVjdCBhc3Rf dmh1Yl9yZXEsIHF1ZXVlKTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCBzdGF0dXMpOworCX0K K30KKworc3RydWN0IHVzYl9yZXF1ZXN0ICphc3Rfdmh1Yl9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1 c2JfZXAgKnVfZXAsCisJCQkJCSAgIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgYXN0X3Zo dWJfcmVxICpyZXE7CisKKwlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgZ2ZwX2ZsYWdzKTsK KwlpZiAoIXJlcSkKKwkJcmV0dXJuIE5VTEw7CisJSU5JVF9MSVNUX0hFQUQoJnJlcS0+cXVldWUp OworCXJldHVybiAmcmVxLT5yZXE7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZnJlZV9yZXF1ZXN0KHN0 cnVjdCB1c2JfZXAgKnVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEpCit7CisJc3RydWN0 IGFzdF92aHViX3JlcSAqcmVxID0gdG9fYXN0X3JlcSh1X3JlcSk7CisKKwlrZnJlZShyZXEpOwor fQorCitzdGF0aWMgaXJxcmV0dXJuX3QgYXN0X3ZodWJfaXJxIChpbnQgaXJxLCB2b2lkICpkYXRh KQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGRhdGE7CisJaXJxcmV0dXJuX3QgaXJldCA9 IElSUV9OT05FOworCXUzMiBpc3RhdDsKKworCS8qIFN0YWxlIGludGVycnVwdCB3aGlsZSB0ZWFy aW5nIGRvd24gKi8KKwlpZiAoIXZodWItPmVwMF9idWZzKQorCQlyZXR1cm4gSVJRX05PTkU7CisK KwlzcGluX2xvY2soJnZodWItPmxvY2spOworCisJLyogUmVhZCBhbmQgQUNLIGludGVycnVwdHMg Ki8KKwlpc3RhdCA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCWlmICghaXN0 YXQpCisJCWdvdG8gYmFpbDsKKwl3cml0ZWwoaXN0YXQsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9J U1IpOworCWlyZXQgPSBJUlFfSEFORExFRDsKKworCVVEQ1ZEQkcodmh1YiwgImlycSBzdGF0dXM9 JTA4eCwgZXBfYWNrcz0lMDh4IGVwX25hY2tzPSUwOHhcbiIsCisJICAgICAgIGlzdGF0LAorCSAg ICAgICByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUiksCisJICAgICAgIHJl YWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9OQUNLX0lTUikpOworCisJLyogSGFuZGxlIGdl bmVyaWMgRVBzIGZpcnN0ICovCisJaWYgKGlzdGF0ICYgVkhVQl9JUlFfRVBfUE9PTF9BQ0tfU1RB TEwpIHsKKwkJdTMyIGksIGVwX2Fja3MgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBf QUNLX0lTUik7CisJCXdyaXRlbChlcF9hY2tzLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNL X0lTUik7CisKKwkJLyogQ2hlY2sgaWYgd2UgaGF2ZSBhIHVzZWZ1bCBmZnMgb24gYXJtIC4uLiAq LworCQlmb3IgKGkgPSAwOyBlcF9hY2tzICYmIGkgPCBBU1RfVkhVQl9OVU1fR0VOX0VQczsgaSsr KSB7CisJCQl1MzIgbWFzayA9IDEgPDwgaTsKKwkJCWlmIChlcF9hY2tzICYgbWFzaykgeworCQkJ CWFzdF92aHViX2Vwbl9hY2tfaXJxKCZ2aHViLT5lcG5zW2ldKTsKKwkJCQllcF9hY2tzICY9IH5t YXNrOworCQkJfQorCQl9CisJfQorCisJLyogSGFuZGxlIGRldmljZSBpbnRlcnJ1cHRzICovCisJ aWYgKGlzdGF0ICYgKFZIVUJfSVJRX0RFVklDRTEgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTIg fAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTMgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTQgfAor CQkgICAgIFZIVUJfSVJRX0RFVklDRTUpKSB7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0RFVklD RTEpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1swXS5kZXYpOworCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9ERVZJQ0UyKQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+cG9ydHNb MV0uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFMykKKwkJCWFzdF92aHViX2Rl dl9pcnEoJnZodWItPnBvcnRzWzJdLmRldik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0RFVklD RTQpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1szXS5kZXYpOworCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9ERVZJQ0U1KQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+cG9ydHNb NF0uZGV2KTsKKwl9CisKKwkvKiBIYW5kbGUgdG9wLWxldmVsIHZIdWIgRVAwIGludGVycnVwdHMg Ki8KKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMIHwKKwkJICAg ICBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCB8CisJCSAgICAgVkhVQl9JUlFfSFVCX0VQ MF9TRVRVUCkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfSFVCX0VQMF9JTl9BQ0tfU1RBTEwp CisJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCB0cnVlKTsKKwkJaWYgKGlz dGF0ICYgVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMKQorCQkJYXN0X3ZodWJfZXAwX2hh bmRsZV9hY2soJnZodWItPmVwMCwgZmFsc2UpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9IVUJf RVAwX1NFVFVQKQorCQkJYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cCgmdmh1Yi0+ZXAwKTsKKwl9 CisKKwkvKiBWYXJpb3VzIHRvcCBsZXZlbCBidXMgZXZlbnRzICovCisJaWYgKGlzdGF0ICYgKFZI VUJfSVJRX0JVU19SRVNVTUUgfAorCQkgICAgIFZIVUJfSVJRX0JVU19TVVNQRU5EIHwKKwkJICAg ICBWSFVCX0lSUV9CVVNfUkVTRVQpKSB7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0JVU19SRVNV TUUpCisJCQlhc3Rfdmh1Yl9odWJfcmVzdW1lKHZodWIpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lS UV9CVVNfU1VTUEVORCkKKwkJCWFzdF92aHViX2h1Yl9zdXNwZW5kKHZodWIpOworCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9CVVNfUkVTRVQpCisJCQlhc3Rfdmh1Yl9odWJfcmVzZXQodmh1Yik7CisJ fQorCisgYmFpbDoKKwlzcGluX3VubG9jaygmdmh1Yi0+bG9jayk7CisJcmV0dXJuIGlyZXQ7Cit9 CisKK3ZvaWQgYXN0X3ZodWJfaW5pdF9odyhzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdTMy IGN0cmw7CisKKwlVRENEQkcodmh1YiwiKFJlKVN0YXJ0aW5nIEhXIC4uLlxuIik7CisKKwkvKiBF bmFibGUgUEhZICovCisJY3RybCA9IFZIVUJfQ1RSTF9QSFlfQ0xLIHwKKwkJVkhVQl9DVFJMX1BI WV9SRVNFVF9ESVM7CisKKyNpZiAwIC8qCisgICAgICAgKiBUaGlzIGNhdXNlcyByZWdpc3RlcnMg dG8gYmVjb21lIGluYWNjZXNzaWJsZSBkdXJpbmcKKyAgICAgICAqIHN1c3BlbmQuIE5lZWQgdG8g ZmlndXJlIG91dCBob3cgdG8gYnJpbmcgdGhlIGNvbnRyb2xsZXIKKyAgICAgICAqIGJhY2sgaW50 byBsaWZlIHRvIGlzc3VlIGEgd2FrZXVwLgorICAgICAgICovCisJY3RybCB8PSBWSFVCX0NUUkxf Q0xLX1NUT1BfU1VTUEVORDsKKyNlbmRpZgorCisJLyoKKwkgKiBTZXQgc29tZSBJU08gJiBzcGxp dCBjb250cm9sIGJpdHMgYWNjb3JkaW5nIHRvIEFzcGVlZAorCSAqIHJlY29tbWVuZGF0aW9uCisJ ICoKKwkgKiBWSFVCX0NUUkxfSVNPX1JTUF9DVFJMOiBXaGVuIHNldCB0ZWxscyB0aGUgSFcgdG8g cmVzcG9uZAorCSAqIHdpdGggMCBieXRlcyBkYXRhIHBhY2tldCB0byBJU08gSU4gZW5kcG9pbnRz IHdoZW4gbm8gZGF0YQorCSAqIGlzIGF2YWlsYWJsZS4KKwkgKgorCSAqIFZIVUJfQ1RSTF9TUExJ VF9JTjogVGhpcyBtYWtlcyBhIFNPRiBjb21wbGV0ZSBhIHNwbGl0IElOCisJICogdHJhbnNhY3Rp b24uCisJICovCisJY3RybCB8PSBWSFVCX0NUUkxfSVNPX1JTUF9DVFJMIHwgVkhVQl9DVFJMX1NQ TElUX0lOOworCXdyaXRlbChjdHJsLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisJdWRl bGF5KDEpOworCisJLyogU2V0IGRlc2NyaXB0b3IgcmluZyBzaXplICovCisjaWYgQVNUX1ZIVUJf REVTQ1NfQ09VTlQgPT0gMjU2CisJY3RybCB8PSBWSFVCX0NUUkxfTE9OR19ERVNDOworCXdyaXRl bChjdHJsLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisjZWxpZiBBU1RfVkhVQl9ERVND U19DT1VOVCAhPSAzMgorCSNlcnJvciBJbnZhbGlkIEFTVF9WSFVCX0RFU0NTX0NPVU5UCisjZW5k aWYKKworCS8qIFJlc2V0IGFsbCBkZXZpY2VzICovCisJd3JpdGVsKDB4MzNmLCB2aHViLT5yZWdz ICsgQVNUX1ZIVUJfU1dfUkVTVCk7CisJdWRlbGF5KDEpOworCXdyaXRlbCgwLCB2aHViLT5yZWdz ICsgQVNUX1ZIVUJfU1dfUkVTVCk7CisKKwkvKiBEaXNhYmxlIGFuZCBjbGVhbnVwIEVQIEFDSy9O QUNLIGludGVycnVwdHMgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FD S19JRVIpOworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19JRVIpOwor CXdyaXRlbCgweGZmZmZmZmZmLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7CisJ d3JpdGVsKDB4ZmZmZmZmZmYsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9OQUNLX0lTUik7CisK KwkvKiBEZWZhdWx0IHNldHRpbmdzIGZvciBFUDAsIGVuYWJsZSBIVyBodWIgRVAxICovCisJd3Jp dGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDBfQ1RSTCk7CisJd3JpdGVsKFZIVUJfRVAx X0NUUkxfUkVTRVRfVE9HR0xFIHwKKwkgICAgICAgVkhVQl9FUDFfQ1RSTF9FTkFCTEUsCisJICAg ICAgIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfQ1RSTCk7CisJd3JpdGVsKDAsIHZodWItPnJl Z3MgKyBBU1RfVkhVQl9FUDFfU1RTX0NIRyk7CisKKwkvKiBDb25maWd1cmUgRVAwIERNQSBidWZm ZXIgKi8KKwl3cml0ZWwodmh1Yi0+ZXAwLmJ1Zl9kbWEsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9F UDBfREFUQSk7CisKKwkvKiBDbGVhciBhZGRyZXNzICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9DT05GKTsKKworCS8qIFB1bGx1cCBodWIgKGFjdGl2YXRlIG9uIGhvc3QpICov CisJaWYgKHZodWItPmZvcmNlX3VzYjEpCisJCWN0cmwgfD0gVkhVQl9DVFJMX0ZVTExfU1BFRURf T05MWTsKKworCWN0cmwgfD0gVkhVQl9DVFJMX1VQU1RSRUFNX0NPTk5FQ1Q7CisJd3JpdGVsKGN0 cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKKworCS8qIEVuYWJsZSBzb21lIGludGVy cnVwdHMgKi8KKwl3cml0ZWwoVkhVQl9JUlFfSFVCX0VQMF9JTl9BQ0tfU1RBTEwgfAorCSAgICAg ICBWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwgfAorCSAgICAgICBWSFVCX0lSUV9IVUJf RVAwX1NFVFVQIHwKKwkgICAgICAgVkhVQl9JUlFfRVBfUE9PTF9BQ0tfU1RBTEwgfAorCSAgICAg ICBWSFVCX0lSUV9CVVNfUkVTVU1FIHwKKwkgICAgICAgVkhVQl9JUlFfQlVTX1NVU1BFTkQgfAor CSAgICAgICBWSFVCX0lSUV9CVVNfUkVTRVQsCisJICAgICAgIHZodWItPnJlZ3MgKyBBU1RfVkhV Ql9JRVIpOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1f ZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IHBsYXRmb3JtX2dldF9k cnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwlpZiAoIXZo dWIgfHwgIXZodWItPnJlZ3MpCisJCXJldHVybiAwOworCisJLyogUmVtb3ZlIGRldmljZXMgKi8K Kwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX1BPUlRTOyBpKyspCisJCWFzdF92aHViX2Rl bF9kZXYoJnZodWItPnBvcnRzW2ldLmRldik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+ bG9jaywgZmxhZ3MpOworCisJLyogTWFzayAmIGFjayBhbGwgaW50ZXJydXB0cyAgKi8KKwl3cml0 ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisJd3JpdGVsKFZIVUJfSVJRX0FDS19B TEwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCisJLyogUHVsbCBkZXZpY2UsIGxlYXZl IFBIWSBlbmFibGVkICovCisJd3JpdGVsKFZIVUJfQ1RSTF9QSFlfQ0xLIHwKKwkgICAgICAgVkhV Ql9DVFJMX1BIWV9SRVNFVF9ESVMsCisJICAgICAgIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJM KTsKKworCWlmICh2aHViLT5jbGspCisJCWNsa19kaXNhYmxlX3VucHJlcGFyZSh2aHViLT5jbGsp OworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJaWYg KHZodWItPmVwMF9idWZzKQorCQlkbWFfZnJlZV9jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCSAg QVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKgorCQkJCSAgKEFTVF9WSFVCX05VTV9QT1JUUyArIDEp LAorCQkJCSAgdmh1Yi0+ZXAwX2J1ZnMsCisJCQkJICB2aHViLT5lcDBfYnVmc19kbWEpOworCXZo dWItPmVwMF9idWZzID0gTlVMTDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzdF92 aHViX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFzdF92 aHViICp2aHViOworCXN0cnVjdCByZXNvdXJjZSAqcmVzOworCWludCBpLCByYyA9IDA7CisKKwl2 aHViID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNpemVvZigqdmh1YiksIEdGUF9LRVJORUwp OworCWlmICghdmh1YikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcGluX2xvY2tfaW5pdCgmdmh1 Yi0+bG9jayk7CisJdmh1Yi0+cGRldiA9IHBkZXY7CisJdmh1Yi0+Zm9yY2VfdXNiMSA9IGZvcmNl X3VzYjE7CisJdmh1Yi0+bm9fZG1hX2Rlc2MgPSBub19kbWFfZGVzYzsKKworCXJlcyA9IHBsYXRm b3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJdmh1Yi0+cmVncyA9 IGRldm1faW9yZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIodmh1 Yi0+cmVncykpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIG1hcCByZXNvdXJj ZXNcbiIpOworCQlyZXR1cm4gUFRSX0VSUih2aHViLT5yZWdzKTsKKwl9CisJVURDREJHKHZodWIs ICJ2SHViQCVwUiBtYXBwZWQgQCVwXG4iLCByZXMsIHZodWItPnJlZ3MpOworCisJcGxhdGZvcm1f c2V0X2RydmRhdGEocGRldiwgdmh1Yik7CisKKwl2aHViLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBk ZXYtPmRldiwgTlVMTCk7CisgICAgICAgIGlmIChJU19FUlIodmh1Yi0+Y2xrKSkgeworICAgICAg ICAgICAgICAgIHJjID0gUFRSX0VSUih2aHViLT5jbGspOworICAgICAgICAgICAgICAgIGdvdG8g ZXJyOworICAgICAgICB9CisJcmMgPSBjbGtfcHJlcGFyZV9lbmFibGUodmh1Yi0+Y2xrKTsKKwlp ZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgY291bGRuJ3QgZW5hYmxlIGNs b2NrICglZClcbiIsIHJjKTsKKwkJZ290byBlcnI7CisgICAgICAgIH0KKworCS8qIE1hc2sgJiBh Y2sgYWxsIGludGVycnVwdHMgYmVmb3JlIGluc3RhbGxpbmcgdGhlIGhhbmRsZXIgKi8KKwl3cml0 ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisJd3JpdGVsKFZIVUJfSVJRX0FDS19B TEwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCisJLyogRmluZCBpbnRlcnJ1cHQgYW5k IGluc3RhbGwgaGFuZGxlciAqLworCXZodWItPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwg MCk7CisJaWYgKHZodWItPmlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVk IHRvIGdldCBpbnRlcnJ1cHRcbiIpOworCQlyYyA9IHZodWItPmlycTsKKwkJZ290byBlcnI7CisJ fQorCXJjID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB2aHViLT5pcnEsIGFzdF92aHVi X2lycSwgMCwKKwkJCSAgICAgIEtCVUlMRF9NT0ROQU1FLCB2aHViKTsKKwlpZiAocmMpIHsKKwkJ ZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaW50ZXJydXB0XG4iKTsKKwkJ Z290byBlcnI7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBETUEgYnVmZmVycyBmb3IgYWxsIEVQ MHMgaW4gb25lIGNodW5rLAorCSAqIG9uZSBwZXIgcG9ydCBhbmQgb25lIGZvciB0aGUgdkh1YiBp dHNlbGYKKwkgKi8KKwl2aHViLT5lcDBfYnVmcyA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ ZGV2LAorCQkJCQkgICAgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKgorCQkJCQkgICAgKEFTVF9W SFVCX05VTV9QT1JUUyArIDEpLAorCQkJCQkgICAgJnZodWItPmVwMF9idWZzX2RtYSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCF2aHViLT5lcDBfYnVmcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJG YWlsZWQgdG8gYWxsb2NhdGUgRVAwIERNQSBidWZmZXJzXG4iKTsKKwkJcmMgPSAtRU5PTUVNOwor CQlnb3RvIGVycjsKKwl9CisJVURDVkRCRyh2aHViLCAiRVAwIERNQSBidWZmZXJzIEAlcCAoRE1B IDB4JTA4eClcbiIsCisJCXZodWItPmVwMF9idWZzLCAodTMyKXZodWItPmVwMF9idWZzX2RtYSk7 CisKKwkvKiBJbml0IHZIdWIgRVAwICovCisJYXN0X3ZodWJfaW5pdF9lcDAodmh1YiwgJnZodWIt PmVwMCwgTlVMTCk7CisKKwkvKiBJbml0IGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNU X1ZIVUJfTlVNX1BPUlRTICYmIHJjID09IDA7IGkrKykKKwkJcmMgPSBhc3Rfdmh1Yl9pbml0X2Rl dih2aHViLCBpKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJLyogSW5pdCBodWIgZW11bGF0 aW9uICovCisJYXN0X3ZodWJfaW5pdF9odWIodmh1Yik7CisKKwkvKiBJbml0aWFsaXplIEhXICov CisJYXN0X3ZodWJfaW5pdF9odyh2aHViKTsKKworCXJldHVybiAwOworIGVycjoKKwlhc3Rfdmh1 Yl9yZW1vdmUocGRldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9m X2RldmljZV9pZCBhc3Rfdmh1Yl9kdF9pZHNbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImFz cGVlZCxhc3QyNDAwLXVzYi12aHViIiwKKwkJLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1MDAt dXNiLXZodWIiLAorCX0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXN0X3Zo dWJfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXN0X3ZodWJfZHJp dmVyID0geworCS5wcm9iZQkJPSBhc3Rfdmh1Yl9wcm9iZSwKKwkucmVtb3ZlCQk9IGFzdF92aHVi X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKKwkJLm9m X21hdGNoX3RhYmxlCT0gYXN0X3ZodWJfZHRfaWRzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3Jt X2RyaXZlcihhc3Rfdmh1Yl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFzcGVlZCB2 SHViIHVkYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1pZHQg PGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlm ZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMgYi9kcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwMC4uNjI2MTk5NGU2YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYwpAQCAtMCwwICsxLDU4MCBAQAor LyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdh ZGdldAorICoKKyAqIGRldi5jIC0gSW5kaXZpZHVhbCBkZXZpY2UvZ2FkZ2V0IG1hbmFnZW1lbnQg KGllLCBhIHBvcnQgPSBhIGdhZGdldCkKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9y YXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRp c3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBH TlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNv ZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisg KiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxs aW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51 eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUg PGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51 eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRl cnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJl ZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2Fk Z2V0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+ CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcu aD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvaGNkLmg+CisK KyNpbmNsdWRlICJ2aHViLmgiCisKK3ZvaWQgYXN0X3ZodWJfZGV2X2lycShzdHJ1Y3QgYXN0X3Zo dWJfZGV2ICpkKQoreworCXUzMiBpc3RhdCA9IHJlYWRsKGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZf SVNSKTsKKworCXdyaXRlbChpc3RhdCwgZC0+cmVncyArIEFTVF9WSFVCX0RFVl9JU1IpOworCisJ aWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJRX0VQMF9JTl9BQ0tfU1RBTEwpCisJCWFzdF92aHViX2Vw MF9oYW5kbGVfYWNrKCZkLT5lcDAsIHRydWUpOworCWlmIChpc3RhdCAmIFZIVVZfREVWX0lSUV9F UDBfT1VUX0FDS19TVEFMTCkKKwkJYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soJmQtPmVwMCwgZmFs c2UpOworCWlmIChpc3RhdCAmIFZIVVZfREVWX0lSUV9FUDBfU0VUVVApCisJCWFzdF92aHViX2Vw MF9oYW5kbGVfc2V0dXAoJmQtPmVwMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Rldl9l bmFibGUoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwl1MzIgcmVnLCBobXNrOworCisJaWYg KGQtPmVuYWJsZWQpCisJCXJldHVybjsKKworCS8qIEVuYWJsZSBkZXZpY2UgYW5kIGl0cyBFUDAg aW50ZXJydXB0cyAqLworCXJlZyA9IFZIVUJfREVWX0VOX0VOQUJMRV9QT1JUIHwKKwkJVkhVQl9E RVZfRU5fRVAwX0lOX0FDS19JUlFFTiB8CisJCVZIVUJfREVWX0VOX0VQMF9PVVRfQUNLX0lSUUVO IHwKKwkJVkhVQl9ERVZfRU5fRVAwX1NFVFVQX0lSUUVOOworCWlmIChkLT5nYWRnZXQuc3BlZWQg PT0gVVNCX1NQRUVEX0hJR0gpCisJCXJlZyB8PSBWSFVCX0RFVl9FTl9TUEVFRF9TRUxfSElHSDsK Kwl3cml0ZWwocmVnLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwpOworCisJLyogRW5h YmxlIGRldmljZSBpbnRlcnJ1cHQgaW4gdGhlIGh1YiBhcyB3ZWxsICovCisJaG1zayA9IFZIVUJf SVJRX0RFVklDRTEgPDwgZC0+aW5kZXg7CisJcmVnID0gcmVhZGwoZC0+dmh1Yi0+cmVncyArIEFT VF9WSFVCX0lFUik7CisJcmVnIHw9IGhtc2s7CisJd3JpdGVsKHJlZywgZC0+dmh1Yi0+cmVncyAr IEFTVF9WSFVCX0lFUik7CisKKwkvKiBTZXQgRVAwIERNQSBidWZmZXIgYWRkcmVzcyAqLworCXdy aXRlbChkLT5lcDAuYnVmX2RtYSwgZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FUDBfREFUQSk7CisK KwlkLT5lbmFibGVkID0gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X2Rpc2Fi bGUoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwl1MzIgcmVnLCBobXNrOworCisJaWYgKCFk LT5lbmFibGVkKQorCQlyZXR1cm47CisKKwkvKiBEaXNhYmxlIGRldmljZSBpbnRlcnJ1cHQgaW4g dGhlIGh1YiAqLworCWhtc2sgPSBWSFVCX0lSUV9ERVZJQ0UxIDw8IGQtPmluZGV4OworCXJlZyA9 IHJlYWRsKGQtPnZodWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworCXJlZyAmPSB+aG1zazsKKwl3 cml0ZWwocmVnLCBkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKworCS8qIFRoZW4gZGlz YWJsZSBkZXZpY2UgKi8KKwl3cml0ZWwoMCwgZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJM KTsKKwlkLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlkLT5lbmFibGVkID0g ZmFsc2U7CisJZC0+c3VzcGVuZGVkID0gZmFsc2U7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf ZGV2X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2RldiAqZCwKKwkJCQl1MTYgd0luZGV4LCB1MTYg d1ZhbHVlLAorCQkJCWJvb2wgaXNfc2V0KQoreworCUREQkcoZCwgIiVzX0ZFQVRVUkUoZGV2IHZh bD0lMDJ4KVxuIiwKKwkgICAgIGlzX3NldCA/ICJTRVQiIDogIkNMRUFSIiwgd1ZhbHVlKTsKKwor CWlmICh3VmFsdWUgIT0gVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQKQorCQlyZXR1cm4gc3RkX3Jl cV9kcml2ZXI7CisKKwlkLT53YWtldXBfZW4gPSBpc19zZXQ7CisKKwlyZXR1cm4gc3RkX3JlcV9j b21wbGV0ZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcF9mZWF0dXJlKHN0cnVjdCBhc3Rf dmh1Yl9kZXYgKmQsCisJCQkgICAgICAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSwgYm9vbCBpc19z ZXQpCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcDsKKwlpbnQgZXBfbnVtOworCisJZXBfbnVt ID0gd0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCUREQkcoZCwgIiVzX0ZFQVRV UkUoZXAlZCB2YWw9JTAyeClcbiIsCisJICAgICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIGVw X251bSwgd1ZhbHVlKTsKKwlpZiAoZXBfbnVtID09IDApCisJCXJldHVybiBzdGRfcmVxX2NvbXBs ZXRlOworCWlmIChlcF9udW0gPj0gQVNUX1ZIVUJfTlVNX0dFTl9FUHMgfHwgIWQtPmVwbnNbZXBf bnVtIC0gMV0pCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWlmICh3VmFsdWUgIT0gVVNCX0VO RFBPSU5UX0hBTFQpCisJCXJldHVybiBzdGRfcmVxX2RyaXZlcjsKKworCWVwID0gZC0+ZXBuc1tl cF9udW0gLSAxXTsKKwlpZiAoV0FSTl9PTighZXApKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsK KworCWlmICghZXAtPmVwbi5lbmFibGVkIHx8ICFlcC0+ZXAuZGVzYyB8fCBlcC0+ZXBuLmlzX2lz byB8fAorCSAgICBlcC0+ZXBuLmlzX2luICE9ICEhKHdJbmRleCAmIFVTQl9ESVJfSU4pKQorCQly ZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCUREQkcoZCwgIiVzIHN0YWxsIG9uIEVQICVkXG4iLAor CSAgICAgaXNfc2V0ID8gInNldHRpbmciIDogImNsZWFyaW5nIiwgZXBfbnVtKTsKKwllcC0+ZXBu LnN0YWxsZWQgPSBpc19zZXQ7CisJYXN0X3ZodWJfdXBkYXRlX2Vwbl9zdGFsbChlcCk7CisKKwly ZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9kZXZfc3Rh dHVzKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsCisJCQkgICAgICAgdTE2IHdJbmRleCwgdTE2IHdW YWx1ZSkKK3sKKwl1OCBzdDA7CisKKwlEREJHKGQsICJHRVRfU1RBVFVTKGRldilcbiIpOworCisJ c3QwID0gZC0+Z2FkZ2V0LmlzX3NlbGZwb3dlcmVkIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVE OworCWlmIChkLT53YWtldXBfZW4pCisJCXN0MCB8PSAxIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dB S0VVUDsKKworCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoJmQtPmVwMCwgc3QwLCAwKTsK K30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcF9zdGF0dXMoc3RydWN0IGFzdF92aHViX2RldiAq ZCwKKwkJCSAgICAgIHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUpCit7CisJaW50IGVwX251bSA9IHdJ bmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw OworCXU4IHN0MCA9IDA7CisKKwlEREJHKGQsICJHRVRfU1RBVFVTKGVwJWQpXG4iLCBlcF9udW0p OworCisJaWYgKGVwX251bSA+PSBBU1RfVkhVQl9OVU1fR0VOX0VQcykKKwkJcmV0dXJuIHN0ZF9y ZXFfc3RhbGw7CisJaWYgKGVwX251bSAhPSAwKSB7CisJCWVwID0gZC0+ZXBuc1tlcF9udW0gLSAx XTsKKwkJaWYgKCFlcCkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCQlpZiAoIWVwLT5lcG4u ZW5hYmxlZCB8fCAhZXAtPmVwLmRlc2MgfHwgZXAtPmVwbi5pc19pc28gfHwKKwkJICAgIGVwLT5l cG4uaXNfaW4gIT0gISEod0luZGV4ICYgVVNCX0RJUl9JTikpCisJCQlyZXR1cm4gc3RkX3JlcV9z dGFsbDsKKwkJaWYgKGVwLT5lcG4uc3RhbGxlZCkKKwkJCXN0MCB8PSAxIDw8IFVTQl9FTkRQT0lO VF9IQUxUOworCX0KKworCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoJmQtPmVwMCwgc3Qw LCAwKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X3NldF9hZGRyZXNzKHN0cnVjdCBh c3Rfdmh1Yl9kZXYgKmQsIHU4IGFkZHIpCit7CisJdTMyIHJlZzsKKworCUREQkcoZCwgIlNFVF9B RERSRVNTOiBHb3QgYWRkcmVzcyAleFxuIiwgYWRkcik7CisKKwlyZWcgPSByZWFkbChkLT5yZWdz ICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwpOworCXJlZyAmPSB+VkhVQl9ERVZfRU5fQUREUl9NQVNL OworCXJlZyB8PSBWSFVCX0RFVl9FTl9TRVRfQUREUihhZGRyKTsKKwl3cml0ZWwocmVnLCBkLT5y ZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwpOworfQorCitpbnQgYXN0X3ZodWJfc3RkX2Rldl9y ZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkgICAgIHN0cnVjdCB1c2JfY3RybHJl cXVlc3QgKmNycSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gZXAtPmRldjsKKwl1MTYg d1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGg7CisKKwkvKiBObyBkcml2ZXIsIHdlIHNob3VsZG4ndCBi ZSBlbmFibGVkIC4uLiAqLworCWlmICghZC0+ZHJpdmVyIHx8ICFkLT5lbmFibGVkIHx8IGQtPnN1 c3BlbmRlZCkgeworCQlFUERCRyhlcCwKKwkJICAgICAgIkRldmljZSBpcyB3cm9uZyBzdGF0ZSBk cml2ZXI9JXAgZW5hYmxlZD0lZCIKKwkJICAgICAgIiBzdXNwZW5kZWQ9JWRcbiIsCisJCSAgICAg IGQtPmRyaXZlciwgZC0+ZW5hYmxlZCwgZC0+c3VzcGVuZGVkKTsKKwkJcmV0dXJuIHN0ZF9yZXFf c3RhbGw7CisJfQorCisJLyogRmlyc3QgcGFja2V0LCBncmFiIHNwZWVkICovCisJaWYgKGQtPmdh ZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikgeworCQlkLT5nYWRnZXQuc3BlZWQgPSBl cC0+dmh1Yi0+c3BlZWQ7CisJCWlmIChkLT5nYWRnZXQuc3BlZWQgPiBkLT5kcml2ZXItPm1heF9z cGVlZCkKKwkJCWQtPmdhZGdldC5zcGVlZCA9IGQtPmRyaXZlci0+bWF4X3NwZWVkOworCQlEREJH KGQsICJmaXN0IHBhY2tldCwgY2FwdHVyZWQgc3BlZWQgJWRcbiIsCisJCSAgICAgZC0+Z2FkZ2V0 LnNwZWVkKTsKKwl9CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEtPndWYWx1ZSk7CisJd0lu ZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGggPSBsZTE2X3RvX2NwdShj cnEtPndMZW5ndGgpOworCisJc3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEt PmJSZXF1ZXN0KSB7CisJCS8qIFNFVF9BRERSRVNTICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0 IHwgVVNCX1JFUV9TRVRfQUREUkVTUzoKKwkJYXN0X3ZodWJfZGV2X3NldF9hZGRyZXNzKGQsIHdW YWx1ZSk7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCisJCS8qIEdFVF9TVEFUVVMgKi8K KwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rf dmh1Yl9kZXZfc3RhdHVzKGQsIHdJbmRleCwgd1ZhbHVlKTsKKwljYXNlIEludGVyZmFjZVJlcXVl c3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHko ZXAsIDAsIDApOworCWNhc2UgRW5kcG9pbnRSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVTOgor CQlyZXR1cm4gYXN0X3ZodWJfZXBfc3RhdHVzKGQsIHdJbmRleCwgd1ZhbHVlKTsKKworCQkvKiBT RVQvQ0xFQVJfRkVBVFVSRSAqLworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VU X0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9kZXZfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1 ZSwgdHJ1ZSk7CisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJF OgorCQlyZXR1cm4gYXN0X3ZodWJfZGV2X2ZlYXR1cmUoZCwgd0luZGV4LCB3VmFsdWUsIGZhbHNl KTsKKwljYXNlIEVuZHBvaW50T3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCXJl dHVybiBhc3Rfdmh1Yl9lcF9mZWF0dXJlKGQsIHdJbmRleCwgd1ZhbHVlLCB0cnVlKTsKKwljYXNl IEVuZHBvaW50T3V0UmVxdWVzdCB8IFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToKKwkJcmV0dXJuIGFz dF92aHViX2VwX2ZlYXR1cmUoZCwgd0luZGV4LCB3VmFsdWUsIGZhbHNlKTsKKwl9CisJcmV0dXJu IHN0ZF9yZXFfZHJpdmVyOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3VkY193YWtldXAoc3Ry dWN0IHVzYl9nYWRnZXQqIGdhZGdldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9f YXN0X2RldihnYWRnZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTlZB TDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisJaWYgKCFk LT53YWtldXBfZW4pCisJCWdvdG8gZXJyOworCisJRERCRyhkLCAiRGV2aWNlIGluaXRpYXRlZCB3 YWtldXBcbiIpOworCisJLyogV2FrZXVwIHRoZSBob3N0ICovCisJYXN0X3ZodWJfaHViX3dha2Vf YWxsKGQtPnZodWIpOworCXJjID0gMDsKKyBlcnI6CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm ZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhc3Rf dmh1Yl91ZGNfZ2V0X2ZyYW1lKHN0cnVjdCB1c2JfZ2FkZ2V0KiBnYWRnZXQpCit7CisJc3RydWN0 IGFzdF92aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKworCXJldHVybiAocmVhZGwo ZC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX1VTQlNUUykgPj4gMTYpICYgMHg3ZmY7Cit9CisKK3N0 YXRpYyB2b2lkIGFzdF92aHViX2Rldl9udWtlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJ dW5zaWduZWQgaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7 IGkrKykgeworCQlpZiAoIWQtPmVwbnNbaV0pCisJCQljb250aW51ZTsKKwkJYXN0X3ZodWJfbnVr ZShkLT5lcG5zW2ldLCAtRVNIVVRET1dOKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf dWRjX3B1bGx1cChzdHJ1Y3QgdXNiX2dhZGdldCogZ2FkZ2V0LCBpbnQgb24pCit7CisJc3RydWN0 IGFzdF92aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZs YWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCURE QkcoZCwgInB1bGx1cCglZClcbiIsIG9uKTsKKworCS8qIE1hcmsgZGlzY29ubmVjdGVkIGluIHRo ZSBodWIgKi8KKwlhc3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChkLT52aHViLCBkLT5pbmRleCwgb24p OworCisJLyoKKwkgKiBJZiBlbmFibGVkLCBudWtlIGFsbCByZXF1ZXN0cyBpZiBhbnkgKHRoZXJl IHNob3VsZG4ndCBiZSkKKwkgKiBhbmQgZGlzYWJsZSB0aGUgcG9ydC4gVGhpcyB3aWxsIGNsZWFy IHRoZSBhZGRyZXNzIHRvby4KKwkgKi8KKwlpZiAoZC0+ZW5hYmxlZCkgeworCQlhc3Rfdmh1Yl9k ZXZfbnVrZShkKTsKKwkJYXN0X3ZodWJfZGV2X2Rpc2FibGUoZCk7CisJfQorCisJc3Bpbl91bmxv Y2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3N0YXJ0KHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQs CisJCQkgICAgICBzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIgKmRyaXZlcikKK3sKKwlzdHJ1Y3Qg YXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2RldihnYWRnZXQpOworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJRERC RyhkLCAic3RhcnRcbiIpOworCisJLyogV2UgZG9uJ3QgZG8gbXVjaCBtb3JlIHVudGlsIHRoZSBo dWIgZW5hYmxlcyB1cyAqLworCWQtPmRyaXZlciA9IGRyaXZlcjsKKwlkLT5nYWRnZXQuaXNfc2Vs ZnBvd2VyZWQgPSAxOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywg ZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgdXNiX2VwICphc3Rfdmh1 Yl91ZGNfbWF0Y2hfZXAoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwKKwkJCQkJICAgIHN0cnVj dCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciAqZGVzYywKKwkJCQkJICAgIHN0cnVjdCB1c2Jfc3Nf ZXBfY29tcF9kZXNjcmlwdG9yICpzcykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9f YXN0X2RldihnYWRnZXQpOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7CisJc3RydWN0IHVzYl9l cCAqdV9lcDsKKwl1bnNpZ25lZCBpbnQgbWF4LCBhZGRyLCBpOworCisJRERCRyhkLCAiTWF0Y2gg RVAgdHlwZSAlZFxuIiwgdXNiX2VuZHBvaW50X3R5cGUoZGVzYykpOworCisJLyoKKwkgKiBGaXJz dCB3ZSBuZWVkIHRvIGxvb2sgZm9yIGFuIGV4aXN0aW5nIHVuY2xhaW1lZCBFUCBhcyBhbm90aGVy CisJICogY29uZmlndXJhdGlvbiBtYXkgaGF2ZSBhbHJlYWR5IGFzc29jaWF0ZWQgYSBidW5jaCBv ZiBFUHMgd2l0aAorCSAqIHRoaXMgZ2FkZ2V0LiBUaGlzIGR1cGxpY2F0ZXMgdGhlIGNvZGUgaW4g dXNiX2VwX2F1dG9jb25maWdfc3MoKQorCSAqIHVuZm9ydHVuYXRlbHkuCisJICovCisJbGlzdF9m b3JfZWFjaF9lbnRyeSh1X2VwLCAmZ2FkZ2V0LT5lcF9saXN0LCBlcF9saXN0KSB7CisJCWlmICh1 c2JfZ2FkZ2V0X2VwX21hdGNoX2Rlc2MoZ2FkZ2V0LCB1X2VwLCBkZXNjLCBzcykpIHsKKwkJCURE QkcoZCwgIiAtPiB1c2luZyBleGlzdGluZyBFUCVkXG4iLAorCQkJICAgICB0b19hc3RfZXAodV9l cCktPmRfaWR4KTsKKwkJCXJldHVybiB1X2VwOworCQl9CisJfQorCisJLyoKKwkgKiBXZSBkaWRu J3QgZmluZCBvbmUsIHdlIG5lZWQgdG8gZ3JhYiBvbmUgZnJvbSB0aGUgcG9vbC4KKwkgKgorCSAq IEZpcnN0IGxldCdzIGRvIHNvbWUgc2FuaXR5IGNoZWNraW5nCisJICovCisJc3dpdGNoKHVzYl9l bmRwb2ludF90eXBlKGRlc2MpKSB7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgor CQkvKiBPbmx5IEVQMCBjYW4gYmUgYSBjb250cm9sIGVuZHBvaW50ICovCisJCXJldHVybiBOVUxM OworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSVNPQzoKKwkJLyogSVNPOiAgbGltaXQgMTAyMyBi eXRlcyBmdWxsIHNwZWVkLCAxMDI0IGhpZ2gvc3VwZXIgc3BlZWQgKi8KKwkJaWYgKGdhZGdldF9p c19kdWFsc3BlZWQoZ2FkZ2V0KSkKKwkJCW1heCA9IDEwMjQ7CisJCWVsc2UKKwkJCW1heCA9IDEw MjM7CisJCWJyZWFrOworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQlVMSzoKKwkJaWYgKGdhZGdl dF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkKKwkJCW1heCA9IDUxMjsKKwkJZWxzZQorCQkJbWF4ID0g NjQ7CisJCWJyZWFrOworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQlpZiAoZ2FkZ2V0 X2lzX2R1YWxzcGVlZChnYWRnZXQpKQorCQkJbWF4ID0gMTAyNDsKKwkJZWxzZQorCQkJbWF4ID0g NjQ7CisJCWJyZWFrOworCX0KKwlpZiAodXNiX2VuZHBvaW50X21heHAoZGVzYykgPiBtYXgpCisJ CXJldHVybiBOVUxMOworCisJLyoKKwkgKiBGaW5kIGEgZnJlZSBFUCBhZGRyZXNzIGZvciB0aGF0 IGRldmljZS4gV2UgY2FuJ3QKKwkgKiBsZXQgdGhlIGdlbmVyaWMgY29kZSBhc3NpZ24gdGhlc2Ug YXMgaXQgd291bGQKKwkgKiBjcmVhdGUgb3ZlcmxhcHBpbmcgbnVtYmVycyBmb3IgSU4gYW5kIE9V VCB3aGljaAorCSAqIHdlIGRvbid0IHN1cHBvcnQsIHNvIGFsc28gY3JlYXRlIGEgc3VpdGFibGUg bmFtZQorCSAqIHRoYXQgd2lsbCBhbGxvdyB0aGUgZ2VuZXJpYyBjb2RlIHRvIHVzZSBvdXIKKwkg KiBhc3NpZ25lZCBhZGRyZXNzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1f R0VOX0VQczsgaSsrKQorCQlpZiAoZC0+ZXBuc1tpXSA9PSBOVUxMKQorCQkJYnJlYWs7CisJaWYg KGkgPj0gQVNUX1ZIVUJfTlVNX0dFTl9FUHMpCisJCXJldHVybiBOVUxMOworCWFkZHIgPSBpICsg MTsKKworCS8qCisJICogTm93IGdyYWIgYW4gRVAgZnJvbSB0aGUgc2hhcmVkIHBvb2wgYW5kIGFz c29jaWF0ZQorCSAqIGl0IHdpdGggb3VyIGRldmljZQorCSAqLworICAgICAgIAllcCA9IGFzdF92 aHViX2FsbG9jX2VwbihkLCBhZGRyKTsKKwlpZiAoIWVwKQorCQlyZXR1cm4gTlVMTDsKKwlEREJH KGQsICJBbGxvY2F0ZWQgZXBuIyVkIGZvciBwb3J0IEVQJWRcbiIsCisJICAgICBlcC0+ZXBuLmdf aWR4LCBhZGRyKTsKKworCXJldHVybiAmZXAtPmVwOworfQorCitzdGF0aWMgaW50IGFzdF92aHVi X3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGFzdF92aHVi X2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJ c3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCUREQkcoZCwgInN0 b3BcbiIpOworCisJZC0+ZHJpdmVyID0gTlVMTDsKKwlkLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BF RURfVU5LTk9XTjsKKworCWFzdF92aHViX2Rldl9udWtlKGQpOworCisJaWYgKGQtPmVuYWJsZWQp CisJCWFzdF92aHViX2Rldl9kaXNhYmxlKGQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgm ZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qg dXNiX2dhZGdldF9vcHMgYXN0X3ZodWJfdWRjX29wcyA9IHsKKwkuZ2V0X2ZyYW1lCT0gYXN0X3Zo dWJfdWRjX2dldF9mcmFtZSwKKwkud2FrZXVwCQk9IGFzdF92aHViX3VkY193YWtldXAsCisJLnB1 bGx1cAkJPSBhc3Rfdmh1Yl91ZGNfcHVsbHVwLAorCS51ZGNfc3RhcnQJPSBhc3Rfdmh1Yl91ZGNf c3RhcnQsCisJLnVkY19zdG9wCT0gYXN0X3ZodWJfdWRjX3N0b3AsCisJLm1hdGNoX2VwCT0gYXN0 X3ZodWJfdWRjX21hdGNoX2VwLAorfTsKKwordm9pZCBhc3Rfdmh1Yl9kZXZfc3VzcGVuZChzdHJ1 Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCWQtPnN1c3BlbmRlZCA9IHRydWU7CisJaWYgKGQtPmRy aXZlcikgeworCQlzcGluX3VubG9jaygmZC0+dmh1Yi0+bG9jayk7CisJCWQtPmRyaXZlci0+c3Vz cGVuZCgmZC0+Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZkLT52aHViLT5sb2NrKTsKKwl9Cit9CisK K3ZvaWQgYXN0X3ZodWJfZGV2X3Jlc3VtZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCWQt PnN1c3BlbmRlZCA9IGZhbHNlOworCWlmIChkLT5kcml2ZXIpIHsKKwkJc3Bpbl91bmxvY2soJmQt PnZodWItPmxvY2spOworCQlkLT5kcml2ZXItPnJlc3VtZSgmZC0+Z2FkZ2V0KTsKKwkJc3Bpbl9s b2NrKCZkLT52aHViLT5sb2NrKTsKKwl9Cit9CisKK3ZvaWQgYXN0X3ZodWJfZGV2X3Jlc2V0KHN0 cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJLyoKKwkgKiBJZiBzcGVlZCBpcyBub3Qgc2V0LCB3 ZSBlbmFibGUgdGhlIHBvcnQuIElmIGl0IGlzLAorCSAqIHNlbmQgcmVzZXQgdG8gdGhlIGdhZGdl dCBhbmQgcmVzZXQgInNwZWVkIi4KKwkgKgorCSAqIFNwZWVkIGlzIGFuIGluZGljYXRpb24gdGhh dCB3ZSBoYXZlIGdvdCB0aGUgZmlyc3QKKwkgKiBzZXR1cCBwYWNrZXQgdG8gdGhlIGRldmljZS4K KwkgKi8KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOICYmICFkLT5l bmFibGVkKSB7CisJCUREQkcoZCwgIlJlc2V0IGF0IHVua25vd24gc3BlZWQgb2YgZGlzYWJsZWQg ZGV2aWNlLCBlbmFibGluZy4uLlxuIik7CisJCWFzdF92aHViX2Rldl9lbmFibGUoZCk7CisJCWQt PnN1c3BlbmRlZCA9IGZhbHNlOworCX0KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVkICE9IFVTQl9TUEVF RF9VTktOT1dOICYmIGQtPmRyaXZlcikgeworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlEREJHKGQs ICJSZXNldCBhdCBrbm93biBzcGVlZCBvZiBib3VuZCBkZXZpY2UsIHJlc2V0dGluZy4uLlxuIik7 CisJCXNwaW5fdW5sb2NrKCZkLT52aHViLT5sb2NrKTsKKwkJZC0+ZHJpdmVyLT5yZXNldCgmZC0+ Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZkLT52aHViLT5sb2NrKTsKKworCQkvKgorCQkgKiBEaXNh YmxlL3JlLWVuYWJsZSBIVywgdGhpcyB3aWxsIGNsZWFyIHRoZSBhZGRyZXNzCisJCSAqIGFuZCBz cGVlZCBzZXR0aW5nLgorCQkgKi8KKwkJYXN0X3ZodWJfZGV2X2Rpc2FibGUoZCk7CisJCWFzdF92 aHViX2Rldl9lbmFibGUoZCk7CisKKwkJLyogQ2xlYXIgc3RhbGwgb24gYWxsIEVQcyAqLworCQlm b3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykgeworCQkJc3RydWN0IGFz dF92aHViX2VwICplcCA9IGQtPmVwbnNbaV07CisKKwkJCWlmIChlcCAmJiBlcC0+ZXBuLnN0YWxs ZWQpIHsKKwkJCQllcC0+ZXBuLnN0YWxsZWQgPSBmYWxzZTsKKwkJCQlhc3Rfdmh1Yl91cGRhdGVf ZXBuX3N0YWxsKGVwKTsKKwkJCX0KKwkJfQorCisJCS8qIEFkZGl0aW9uYWwgY2xlYW51cHMgKi8K KwkJZC0+d2FrZXVwX2VuID0gZmFsc2U7CisJCWQtPnN1c3BlbmRlZCA9IGZhbHNlOworCX0KK30K Kwordm9pZCBhc3Rfdmh1Yl9kZWxfZGV2KHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBm bGFncyk7CisJaWYgKCFkLT5yZWdpc3RlcmVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlkLT5yZWdpc3RlcmVkID0g ZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOwor CisJdXNiX2RlbF9nYWRnZXRfdWRjKCZkLT5nYWRnZXQpOworCWRldmljZV91bnJlZ2lzdGVyKCZk LT5wb3J0X2Rldik7Cit9CisKK2ludCBhc3Rfdmh1Yl9pbml0X2RldihzdHJ1Y3QgYXN0X3ZodWIg KnZodWIsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9ICZ2 aHViLT5wb3J0c1tpZHhdLmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSAmdmh1Yi0+cGRl di0+ZGV2OworCWludCByYzsKKworCWQtPnZodWIgPSB2aHViOworCWQtPmluZGV4ID0gaWR4Owor CWQtPm5hbWUgPSBkZXZtX2thc3ByaW50ZihwYXJlbnQsIEdGUF9LRVJORUwsICJwb3J0JWQiLCBp ZHgrMSk7CisJZC0+cmVncyA9IHZodWItPnJlZ3MgKyAweDEwMCArIDB4MTAgKiBpZHg7CisKKwlh c3Rfdmh1Yl9pbml0X2VwMCh2aHViLCAmZC0+ZXAwLCBkKTsKKworCS8qCisJICogVGhlIFVEQyBj b3JlIHJlYWxseSBuZWVkcyB1cyB0byBoYXZlIHNlcGFyYXRlIGFuZCB1bmlxdWVseQorCSAqIG5h bWVkICJwYXJlbnQiIGRldmljZXMgZm9yIGVhY2ggcG9ydCBzbyB3ZSBjcmVhdGUgYSBzdWIgZGV2 aWNlCisJICogaGVyZSBmb3IgdGhhdCBwdXJwb3NlCisJICovCisJZGV2aWNlX2luaXRpYWxpemUo JmQtPnBvcnRfZGV2KTsKKwlkLT5wb3J0X2Rldi5wYXJlbnQgPSBwYXJlbnQ7CisJZGV2X3NldF9u YW1lKCZkLT5wb3J0X2RldiwgIiVzOnAlZCIsIGRldl9uYW1lKHBhcmVudCksIGlkeCArIDEpOwor CXJjID0gZGV2aWNlX2FkZCgmZC0+cG9ydF9kZXYpOworCWlmIChyYykKKwkJZ290byBmYWlsX2Fk ZDsKKworCS8qIFBvcHVsYXRlIGdhZGdldCAqLworCUlOSVRfTElTVF9IRUFEKCZkLT5nYWRnZXQu ZXBfbGlzdCk7CisJZC0+Z2FkZ2V0Lm9wcyA9ICZhc3Rfdmh1Yl91ZGNfb3BzOworCWQtPmdhZGdl dC5lcDAgPSAmZC0+ZXAwLmVwOworCWQtPmdhZGdldC5uYW1lID0gS0JVSUxEX01PRE5BTUU7CisJ aWYgKHZodWItPmZvcmNlX3VzYjEpCisJCWQtPmdhZGdldC5tYXhfc3BlZWQgPSBVU0JfU1BFRURf RlVMTDsKKwllbHNlCisJCWQtPmdhZGdldC5tYXhfc3BlZWQgPSBVU0JfU1BFRURfSElHSDsKKwlk LT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlkLT5nYWRnZXQuZGV2Lm9mX25v ZGUgPSB2aHViLT5wZGV2LT5kZXYub2Zfbm9kZTsKKworCXJjID0gdXNiX2FkZF9nYWRnZXRfdWRj KCZkLT5wb3J0X2RldiwgJmQtPmdhZGdldCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZmFpbF91 ZGM7CisJZC0+cmVnaXN0ZXJlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKKyBmYWlsX3VkYzoKKwlk ZXZpY2VfZGVsKCZkLT5wb3J0X2Rldik7CisgZmFpbF9hZGQ6CisJcHV0X2RldmljZSgmZC0+cG9y dF9kZXYpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvZXAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4wNDgyYTg0 NjNkYzEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12 aHViL2VwMC5jCkBAIC0wLDAgKzEsNDc0IEBACisvKgorICogYXNwZWVkLXZodWIgLS0gRHJpdmVy IGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICogZXAwLmMgLSBFbmRwb2lu dCAwIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJNIENvcnBvcmF0aW9uCisgKgor ICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0 IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3Vu ZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVs Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1f ZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3Bv cnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4K KyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Cisj aW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+Cisj aW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2lu Y2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUg PGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNs dWRlICJ2aHViLmgiCisKK2ludCBhc3Rfdmh1Yl9yZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw LCBjaGFyICpwdHIsIGludCBsZW4pCit7CisJc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSAmZXAt PmVwMC5yZXEucmVxOworCisJaWYgKFdBUk5fT04oZXAtPmRfaWR4ICE9IDApKQorCQlyZXR1cm4g c3RkX3JlcV9zdGFsbDsKKwlpZiAoV0FSTl9PTighZXAtPmVwMC5kaXJfaW4pKQorCQlyZXR1cm4g c3RkX3JlcV9zdGFsbDsKKwlpZiAoV0FSTl9PTihsZW4gPiBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tF VCkpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWlmIChXQVJOX09OKHJlcS0+c3RhdHVzID09 IC1FSU5QUk9HUkVTUykpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJcmVxLT5idWYgPSBw dHI7CisJcmVxLT5sZW5ndGggPSBsZW47CisJcmVxLT5jb21wbGV0ZSA9IE5VTEw7CisJcmVxLT56 ZXJvID0gdHJ1ZTsKKworCS8qIENhbGwgaW50ZXJuYWwgcXVldWUgZGlyZWN0bHkgKi8KKwlpZiAo ZXAtPmVwLm9wcy0+cXVldWUoJmVwLT5lcCwgcmVxLCBHRlBfQVRPTUlDKSkKKwkJcmV0dXJuIHN0 ZF9yZXFfc3RhbGw7CisJZWxzZQorCQlyZXR1cm4gc3RkX3JlcV9kYXRhOworfQorCitpbnQgX19h c3Rfdmh1Yl9zaW1wbGVfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IGxlbiwgLi4u KQoreworCXU4ICpidWZmZXIgPSBlcC0+YnVmOworCXVuc2lnbmVkIGludCBpOworCXZhX2xpc3Qg YXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGxlbik7CisKKwkvKiBDb3B5IGRhdGEgZGlyZWN0bHkg aW50byBFUCBidWZmZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCWJ1ZmZlcltp XSA9IHZhX2FyZyhhcmdzLCBpbnQpOworCXZhX2VuZChhcmdzKTsKKworCS8qIHJlcS0+YnVmIE5V TEwgbWVhbnMgZGF0YSBpcyBhbHJlYWR5IHRoZXJlICovCisJcmV0dXJuIGFzdF92aHViX3JlcGx5 KGVwLCBOVUxMLCBsZW4pOworfQorCit2b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfc2V0dXAoc3Ry dWN0IGFzdF92aHViX2VwICplcCkKK3sKKwlzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0IGNycTsKKwll bnVtIHN0ZF9yZXFfcmMgc3RkX3JlcV9yYzsKKwlpbnQgcmMgPSAtRU5PREVWOworCisJaWYgKFdB Uk5fT04oZXAtPmRfaWR4ICE9IDApKQorCQlyZXR1cm47CisKKwkvKgorCSAqIEdyYWIgdGhlIHNl dHVwIHBhY2tldCBmcm9tIHRoZSBjaGlwIGFuZCBieXRlc3dhcAorCSAqIGludGVyZXN0aW5nIGZp ZWxkcworCSAqLworCW1lbWNweV9mcm9taW8oJmNycSwgZXAtPmVwMC5zZXR1cCwgc2l6ZW9mKGNy cSkpOworCisJRVBEQkcoZXAsICJTRVRVUCBwYWNrZXQgJTAyeC8lMDJ4LyUwNHgvJTA0eC8lMDR4 IFslc10gc3Q9JWRcbiIsCisJICAgICAgY3JxLmJSZXF1ZXN0VHlwZSwgY3JxLmJSZXF1ZXN0LAor CSAgICAgICBsZTE2X3RvX2NwdShjcnEud1ZhbHVlKSwKKwkgICAgICAgbGUxNl90b19jcHUoY3Jx LndJbmRleCksCisJICAgICAgIGxlMTZfdG9fY3B1KGNycS53TGVuZ3RoKSwKKwkgICAgICAgKGNy cS5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKSA/ICJpbiIgOiAib3V0IiwKKwkgICAgICAgZXAt PmVwMC5zdGF0ZSk7CisKKwkvKiBDaGVjayBvdXIgc3RhdGUsIGNhbmNlbCBwZW5kaW5nIHJlcXVl c3RzIGlmIG5lZWRlZCAqLworCWlmIChlcC0+ZXAwLnN0YXRlICE9IGVwMF9zdGF0ZV90b2tlbikg eworCQlFUERCRyhlcCwgIndyb25nIHN0YXRlXG4iKTsKKwkJYXN0X3ZodWJfbnVrZShlcCwgMCk7 CisJCWdvdG8gc3RhbGw7CisJfQorCisJLyogQ2FsY3VsYXRlIG5leHQgc3RhdGUgZm9yIEVQMCAq LworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfZGF0YTsKKwllcC0+ZXAwLmRpcl9pbiA9ICEh KGNycS5iUmVxdWVzdFR5cGUgJiBVU0JfRElSX0lOKTsKKworCS8qIElmIHRoaXMgaXMgdGhlIHZI dWIsIHdlIGhhbmRsZSByZXF1ZXN0cyBkaWZmZXJlbnRseSAqLworCXN0ZF9yZXFfcmMgPSBzdGRf cmVxX2RyaXZlcjsKKwlpZiAoZXAtPmRldiA9PSBOVUxMKSB7CisJCWlmICgoY3JxLmJSZXF1ZXN0 VHlwZSAmIFVTQl9UWVBFX01BU0spID09IFVTQl9UWVBFX1NUQU5EQVJEKQorCQkJc3RkX3JlcV9y YyA9IGFzdF92aHViX3N0ZF9odWJfcmVxdWVzdChlcCwgJmNycSk7CisJCWVsc2UgaWYgKChjcnEu YlJlcXVlc3RUeXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfQ0xBU1MpCisJCQlzdGRf cmVxX3JjID0gYXN0X3ZodWJfY2xhc3NfaHViX3JlcXVlc3QoZXAsICZjcnEpOworCQllbHNlCisJ CQlzdGRfcmVxX3JjID0gc3RkX3JlcV9zdGFsbDsKKwl9IGVsc2UgaWYgKChjcnEuYlJlcXVlc3RU eXBlICYgVVNCX1RZUEVfTUFTSykgPT0gVVNCX1RZUEVfU1RBTkRBUkQpCisJCXN0ZF9yZXFfcmMg PSBhc3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3QoZXAsICZjcnEpOworCisJLyogQWN0IHVwb24gcmVz dWx0ICovCisJc3dpdGNoKHN0ZF9yZXFfcmMpIHsKKwljYXNlIHN0ZF9yZXFfY29tcGxldGU6CisJ CWdvdG8gY29tcGxldGU7CisJY2FzZSBzdGRfcmVxX3N0YWxsOgorCQlnb3RvIHN0YWxsOworCWNh c2Ugc3RkX3JlcV9kcml2ZXI6CisJCWJyZWFrOworCWNhc2Ugc3RkX3JlcV9kYXRhOgorCQlyZXR1 cm47CisJfQorCisJLyogUGFzcyByZXF1ZXN0IHVwIHRvIHRoZSBnYWRnZXQgZHJpdmVyICovCisJ aWYgKFdBUk5fT04oIWVwLT5kZXYpKQorCQlnb3RvIHN0YWxsOworCWlmIChlcC0+ZGV2LT5kcml2 ZXIpIHsKKwkJRVBEQkcoZXAsICJmb3J3YXJkaW5nIHRvIGdhZGdldC4uLlxuIik7CisJCXNwaW5f dW5sb2NrKCZlcC0+dmh1Yi0+bG9jayk7CisJCXJjID0gZXAtPmRldi0+ZHJpdmVyLT5zZXR1cCgm ZXAtPmRldi0+Z2FkZ2V0LCAmY3JxKTsKKwkJc3Bpbl9sb2NrKCZlcC0+dmh1Yi0+bG9jayk7CisJ CUVQREJHKGVwLCAiZHJpdmVyIHJldHVybmVkICVkXG4iLCByYyk7CisJfSBlbHNlIHsKKwkJRVBE QkcoZXAsICJubyBnYWRnZXQgZm9yIHJlcXVlc3QgIVxuIik7CisJfQorCWlmIChyYyA+PSAwKQor CQlyZXR1cm47CisKKyBzdGFsbDoKKwlFUERCRyhlcCwgInN0YWxsaW5nXG4iKTsKKwl3cml0ZWwo VkhVQl9FUDBfQ1RSTF9TVEFMTCwgZXAtPmVwMC5jdGxzdGF0KTsKKwllcC0+ZXAwLnN0YXRlID0g ZXAwX3N0YXRlX3N0YXR1czsKKwllcC0+ZXAwLmRpcl9pbiA9IGZhbHNlOworCXJldHVybjsKKwor IGNvbXBsZXRlOgorCUVQVkRCRyhlcCwgInNlbmRpbmcgW2luXSBzdGF0dXMgd2l0aCBubyBkYXRh XG4iKTsKKwl3cml0ZWwoVkhVQl9FUDBfVFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rsc3RhdCk7CisJ ZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJZXAtPmVwMC5kaXJfaW4gPSBmYWxz ZTsKK30KKworCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcDBfZG9fc2VuZChzdHJ1Y3QgYXN0X3Zo dWJfZXAgKmVwLAorCQkJCSBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEpCit7CisJdW5zaWduZWQg aW50IGNodW5rOworCXUzMiByZWc7CisKKwkvKiBJZiB0aGlzIGlzIGEgMC1sZW5ndGggcmVxdWVz dCwgaXQncyB0aGUgZ2FkZ2V0IHRyeWluZyB0bworCSAqIHNlbmQgYSBzdGF0dXMgb24gb3VyIGJl aGFsZi4gV2UgdGFrZSBpdCBmcm9tIGhlcmUuCisJICovCisJaWYgKHJlcS0+cmVxLmxlbmd0aCA9 PSAwKQorCQlyZXEtPmxhc3RfZGVzYyA9IDE7CisKKwkvKiBBcmUgd2UgZG9uZSA/IENvbXBsZXRl IHJlcXVlc3QsIG90aGVyd2lzZSB3YWl0IGZvciBuZXh0IGludGVycnVwdCAqLworCWlmIChyZXEt Pmxhc3RfZGVzYyA+PSAwKSB7CisJCUVQVkRCRyhlcCwgImNvbXBsZXRlIHNlbmQgJWQvJWRcbiIs CisJCSAgICAgICByZXEtPnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCk7CisJCWVwLT5lcDAu c3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCQl3cml0ZWwoVkhVQl9FUDBfUlhfQlVGRl9SRFks IGVwLT5lcDAuY3Rsc3RhdCk7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgMCk7CisJCXJldHVy bjsKKwl9CisKKwkvKgorCSAqIE5leHQgY2h1bmsgY3JvcHBlZCB0byBtYXggcGFja2V0IHNpemUu IEFsc28gY2hlY2sgaWYgdGhpcworCSAqIGlzIHRoZSBsYXN0IHBhY2tldAorCSAqLworCWNodW5r ID0gcmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0dWFsOworCWlmIChjaHVuayA+IGVwLT5l cC5tYXhwYWNrZXQpCisJCWNodW5rID0gZXAtPmVwLm1heHBhY2tldDsKKwllbHNlIGlmICgoY2h1 bmsgPCBlcC0+ZXAubWF4cGFja2V0KSB8fCAhcmVxLT5yZXEuemVybykKKwkJcmVxLT5sYXN0X2Rl c2MgPSAxOworCisJRVBWREJHKGVwLCAic2VuZCBjaHVuaz0lZCBsYXN0PSVkLCByZXEtPmFjdD0l ZCBtcD0lZFxuIiwKKwkgICAgICAgY2h1bmssIHJlcS0+bGFzdF9kZXNjLCByZXEtPnJlcS5hY3R1 YWwsIGVwLT5lcC5tYXhwYWNrZXQpOworCisJLyoKKwkgKiBDb3B5IGRhdGEgaWYgYW55IChpbnRl cm5hbCByZXF1ZXN0cyBhbHJlYWR5IGhhdmUgZGF0YQorCSAqIGluIHRoZSBFUCBidWZmZXIpCisJ ICovCisJaWYgKGNodW5rICYmIHJlcS0+cmVxLmJ1ZikKKwkJbWVtY3B5KGVwLT5idWYsIHJlcS0+ cmVxLmJ1ZiArIHJlcS0+cmVxLmFjdHVhbCwgY2h1bmspOworCisJLyogUmVtZW1iZXIgY2h1bmsg c2l6ZSBhbmQgdHJpZ2dlciBzZW5kICovCisJcmVnID0gVkhVQl9FUDBfU0VUX1RYX0xFTihjaHVu ayk7CisJd3JpdGVsKHJlZywgZXAtPmVwMC5jdGxzdGF0KTsKKwl3cml0ZWwocmVnIHwgVkhVQl9F UDBfVFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rsc3RhdCk7CisJcmVxLT5yZXEuYWN0dWFsICs9IGNo dW5rOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcDBfcnhfcHJpbWUoc3RydWN0IGFzdF92 aHViX2VwICplcCkKK3sKKwlFUFZEQkcoZXAsICJyeCBwcmltZVxuIik7CisKKwkvKiBQcmltZSBl bmRwb2ludCBmb3IgcmVjZWl2aW5nIGRhdGEgKi8KKwl3cml0ZWwoVkhVQl9FUDBfUlhfQlVGRl9S RFksIGVwLT5lcDAuY3Rsc3RhdCArIEFTVF9WSFVCX0VQMF9DVFJMKTsKK30KKworc3RhdGljIHZv aWQgYXN0X3ZodWJfZXAwX2RvX3JlY2VpdmUoc3RydWN0IGFzdF92aHViX2VwICplcCwgc3RydWN0 IGFzdF92aHViX3JlcSAqcmVxLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2ln bmVkIGludCByZW1haW47CisJaW50IHJjID0gMDsKKworCS8qIFdlIGFyZSByZWNlaXZpbmcuLi4g Z3JhYiByZXF1ZXN0ICovCisJcmVtYWluID0gcmVxLT5yZXEubGVuZ3RoIC0gcmVxLT5yZXEuYWN0 dWFsOworCisJRVBWREJHKGVwLCAicmVjZWl2ZSBnb3Q9JWQgcmVtYWluPSVkXG4iLCBsZW4sIHJl bWFpbik7CisKKwkvKiBBcmUgd2UgZ2V0dGluZyBtb3JlIHRoYW4gYXNrZWQgPyAqLworCWlmIChs ZW4gPiByZW1haW4pIHsKKwkJRVBEQkcoZXAsICJyZWNlaXZpbmcgdG9vIG11Y2ggKG92ZjogJWQp ICFcbiIsCisJCSAgICAgIGxlbiAtIHJlbWFpbik7CisJCWxlbiA9IHJlbWFpbjsKKwkJcmMgPSAt RU9WRVJGTE9XOworCX0KKwlpZiAobGVuICYmIHJlcS0+cmVxLmJ1ZikKKwkJbWVtY3B5KHJlcS0+ cmVxLmJ1ZiArIHJlcS0+cmVxLmFjdHVhbCwgZXAtPmJ1ZiwgbGVuKTsKKwlyZXEtPnJlcS5hY3R1 YWwgKz0gbGVuOworCisJLyogRG9uZSA/ICovCisJaWYgKGxlbiA8IGVwLT5lcC5tYXhwYWNrZXQg fHwgbGVuID09IHJlbWFpbikgeworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsK KwkJd3JpdGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCQlhc3Rf dmh1Yl9kb25lKGVwLCByZXEsIHJjKTsKKwl9IGVsc2UKKwkJYXN0X3ZodWJfZXAwX3J4X3ByaW1l KGVwKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9lcDBfaGFuZGxlX2FjayhzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLCBib29sIGluX2FjaykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJc3Ry dWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJc3RydWN0IGRldmljZSAqZGV2ID0gJnZo dWItPnBkZXYtPmRldjsKKwlib29sIHN0YWxsID0gZmFsc2U7CisJdTMyIHN0YXQ7CisKKwkvKiBS ZWFkIEVQMCBzdGF0dXMgKi8KKwlzdGF0ID0gcmVhZGwoZXAtPmVwMC5jdGxzdGF0KTsKKworCS8q IEdyYWIgY3VycmVudCByZXF1ZXN0IGlmIGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlf b3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlFUFZE QkcoZXAsICJBQ0sgc3RhdHVzPSUwOHgsc3RhdGU9JWQgaXNfaW49JWQgaW5fYWNrPSVkIHJlcT0l cFxuIiwKKwkJc3RhdCwgZXAtPmVwMC5zdGF0ZSwgZXAtPmVwMC5kaXJfaW4sIGluX2FjaywgcmVx KTsKKworCXN3aXRjaChlcC0+ZXAwLnN0YXRlKSB7CisJY2FzZSBlcDBfc3RhdGVfdG9rZW46CisJ CS8qIFRoZXJlIHNob3VsZCBiZSBubyByZXF1ZXN0IHF1ZXVlZCBpbiB0aGF0IHN0YXRlLi4uICov CisJCWlmIChyZXEpIHsKKwkJCWRldl93YXJuKGRldiwgInJlcXVlc3QgcHJlc2VudCB3aGlsZSBp biBUT0tFTiBzdGF0ZVxuIik7CisJCQlhc3Rfdmh1Yl9udWtlKGVwLCAtRUlOVkFMKTsKKwkJfQor CQlkZXZfd2FybihkZXYsICJhY2sgd2hpbGUgaW4gVE9LRU4gc3RhdGVcbiIpOworCQlzdGFsbCA9 IHRydWU7CisJCWJyZWFrOworCWNhc2UgZXAwX3N0YXRlX2RhdGE6CisJCS8qIENoZWNrIHRoZSBz dGF0ZSBiaXRzIGNvcnJlc3BvbmRpbmcgdG8gb3VyIGRpcmVjdGlvbiAqLworCQlpZiAoKGVwLT5l cDAuZGlyX2luICYmIChzdGF0ICYgVkhVQl9FUDBfVFhfQlVGRl9SRFkpKSB8fAorCQkgICAgKCFl cC0+ZXAwLmRpcl9pbiAmJiAoc3RhdCAmIFZIVUJfRVAwX1JYX0JVRkZfUkRZKSkgfHwKKwkJICAg IChlcC0+ZXAwLmRpcl9pbiAhPSBpbl9hY2spKSB7CisJCQlkZXZfd2FybihkZXYsICJpcnEgc3Rh dGUgbWlzbWF0Y2giKTsKKwkJCXN0YWxsID0gdHJ1ZTsKKwkJCWJyZWFrOworCQl9CisJCS8qCisJ CSAqIFdlIGFyZSBpbiBkYXRhIHBoYXNlIGFuZCB0aGVyZSdzIG5vIHJlcXVlc3QsIHNvbWV0aGlu ZyBpcworCQkgKiB3cm9uZywgc3RhbGwKKwkJICovCisJCWlmICghcmVxKSB7CisJCQlkZXZfd2Fy bihkZXYsICJkYXRhIHBoYXNlLCBubyByZXF1ZXN0XG4iKTsKKwkJCXN0YWxsID0gdHJ1ZTsKKwkJ CWJyZWFrOworCQl9CisKKwkJLyogV2UgaGF2ZSBhIHJlcXVlc3QsIGhhbmRsZSBkYXRhIHRyYW5z ZmVycyAqLworCQlpZiAoZXAtPmVwMC5kaXJfaW4pCisJCQlhc3Rfdmh1Yl9lcDBfZG9fc2VuZChl cCwgcmVxKTsKKwkJZWxzZQorCQkJYXN0X3ZodWJfZXAwX2RvX3JlY2VpdmUoZXAsIHJlcSwgVkhV Ql9FUDBfUlhfTEVOKHN0YXQpKTsKKwkJcmV0dXJuOworCWNhc2UgZXAwX3N0YXRlX3N0YXR1czoK KwkJLyogTnVrZSBzdGFsZSByZXF1ZXN0cyAqLworCQlpZiAocmVxKSB7CisJCQlkZXZfd2Fybihk ZXYsICJyZXF1ZXN0IHByZXNlbnQgd2hpbGUgaW4gU1RBVFVTIHN0YXRlXG4iKTsKKwkJCWFzdF92 aHViX251a2UoZXAsIC1FSU5WQUwpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhlIHN0YXR1cyBw aGFzZSBjb21wbGV0ZXMgd2l0aCB0aGUgd3JvbmcgYWNrLCBzdGFsbAorCQkgKiB0aGUgZW5kcG9p bnQganVzdCBpbiBjYXNlLCB0byBhYm9ydCB3aGF0ZXZlciB0aGUgaG9zdAorCQkgKiB3YXMgZG9p bmcuCisJCSAqLworCQlpZiAoZXAtPmVwMC5kaXJfaW4gPT0gaW5fYWNrKSB7CisJCQlkZXZfd2Fy bihkZXYsICJzdGF0dXMgZGlyZWN0aW9uIG1pc21hdGNoXG4iKTsKKwkJCXN0YWxsID0gdHJ1ZTsK KwkJfQorCX0KKworCS8qIFJlc2V0IHRvIHRva2VuIHN0YXRlICovCisJZXAtPmVwMC5zdGF0ZSA9 IGVwMF9zdGF0ZV90b2tlbjsKKwlpZiAoc3RhbGwpCisJCXdyaXRlbChWSFVCX0VQMF9DVFJMX1NU QUxMLCBlcC0+ZXAwLmN0bHN0YXQpOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2VwMF9xdWV1 ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxLAorCQkJICAg ICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2Fz dF9yZXEodV9yZXEpOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7 CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJc3RydWN0IGRldmljZSAqZGV2 ID0gJnZodWItPnBkZXYtPmRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJLyogUGFyYW5v aWQgY2hla3MgKi8KKwlpZiAoIXVfcmVxIHx8ICghdV9yZXEtPmNvbXBsZXRlICYmICFyZXEtPmlu dGVybmFsKSB8fAorCSAgICAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpIHsKKwkJZGV2X3dhcm4o ZGV2LCAiQm9ndXMgcmVxdWVzdCAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyog Tm90IGVuZHBvaW50IDAgPyAqLworCWlmIChXQVJOX09OKGVwLT5kX2lkeCAhPSAwKSkKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwkvKiBEaXNhYmxlZCBkZXZpY2UgKi8KKwlpZiAoZXAtPmRldiAmJiAo IWVwLT5kZXYtPmVuYWJsZWQgfHwgZXAtPmRldi0+c3VzcGVuZGVkKSkKKwkJcmV0dXJuIC1FU0hV VERPV047CisKKwkvKiBEYXRhLCBubyBidWZmZXIgYW5kIG5vdCBpbnRlcm5hbCA/ICovCisJaWYg KHVfcmVxLT5sZW5ndGggJiYgIXVfcmVxLT5idWYgJiYgIXJlcS0+aW50ZXJuYWwpIHsKKwkJZGV2 X3dhcm4oZGV2LCAiUmVxdWVzdCB3aXRoIG5vIGJ1ZmZlciAhXG4iKTsKKwkJcmV0dXJuIC1FSU5W QUw7CisJfQorCisJRVBWREJHKGVwLCAiZW5xdWV1ZSByZXEgQCVwXG4iLCByZXEpOworCUVQVkRC RyhlcCwgIiAgbD0lZCB6ZXJvPSVkIG5vc2hvcnQ9JWQgaXNfaW49JWRcbiIsCisJICAgICAgIHVf cmVxLT5sZW5ndGgsIHVfcmVxLT56ZXJvLAorCSAgICAgICB1X3JlcS0+c2hvcnRfbm90X29rLCBl cC0+ZXAwLmRpcl9pbik7CisKKwkvKiBJbml0aWFsaXplIHJlcXVlc3QgcHJvZ3Jlc3MgZmllbGRz ICovCisJdV9yZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwl1X3JlcS0+YWN0dWFsID0gMDsK KwlyZXEtPmxhc3RfZGVzYyA9IC0xOworCXJlcS0+YWN0aXZlID0gZmFsc2U7CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogRVAwIGNhbiBvbmx5IHN1cHBv cnQgYSBzaW5nbGUgcmVxdWVzdCBhdCBhIHRpbWUgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5x dWV1ZSkgfHwgZXAtPmVwMC5zdGF0ZSA9PSBlcDBfc3RhdGVfdG9rZW4pIHsKKwkJZGV2X3dhcm4o ZGV2LCAiRVAwOiBSZXF1ZXN0IGluIHdyb25nIHN0YXRlXG4iKTsKKwkJc3Bpbl91bmxvY2tfaXJx cmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCS8q IEFkZCByZXF1ZXN0IHRvIGxpc3QgYW5kIGtpY2sgcHJvY2Vzc2luZyBpZiBlbXB0eSAqLworCWxp c3RfYWRkX3RhaWwoJnJlcS0+cXVldWUsICZlcC0+cXVldWUpOworCisJaWYgKGVwLT5lcDAuZGly X2luKSB7CisJCS8qIElOIHJlcXVlc3QsIHNlbmQgZGF0YSAqLworCQlhc3Rfdmh1Yl9lcDBfZG9f c2VuZChlcCwgcmVxKTsKKwl9IGVsc2UgaWYgKHVfcmVxLT5sZW5ndGggPT0gMCkgeworCQkvKiAw LWxlbiByZXF1ZXN0LCBzZW5kIGNvbXBsZXRpb24gYXMgcnggKi8KKwkJRVBWREJHKGVwLCAiMC1s ZW5ndGggcnggY29tcGxldGlvblxuIik7CisJCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3Rh dHVzOworCQl3cml0ZWwoVkhVQl9FUDBfVFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rsc3RhdCk7CisJ CWFzdF92aHViX2RvbmUoZXAsIHJlcSwgMCk7CisJfSBlbHNlIHsKKwkJLyogT1VUIHJlcXVlc3Qs IHN0YXJ0IHJlY2VpdmVyICovCisJCWFzdF92aHViX2VwMF9yeF9wcmltZShlcCk7CisJfQorCisJ c3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7 Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXAwX2RlcXVldWUoc3RydWN0IHVzYl9lcCogdV9l cCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw ID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOwor CXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBy YyA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOwor CisJLyogT25seSBvbmUgcmVxdWVzdCBjYW4gYmUgaW4gdGhlIHF1ZXVlICovCisJcmVxID0gbGlz dF9maXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+cXVldWUsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsIHF1 ZXVlKTsKKworCS8qIElzIGl0IG91cnMgPyAqLworCWlmIChyZXEgJiYgdV9yZXEgPT0gJnJlcS0+ cmVxKSB7CisJCUVQVkRCRyhlcCwgImRlcXVldWUgcmVxIEAlcFxuIiwgcmVxKTsKKworCQkvKgor CQkgKiBXZSBkb24ndCBoYXZlIHRvIGRlYWwgd2l0aCAiYWN0aXZlIiBhcyBhbGwKKwkJICogRE1B cyBnbyB0byB0aGUgRVAgYnVmZmVycywgbm90IHRoZSByZXF1ZXN0LgorCQkgKi8KKwkJYXN0X3Zo dWJfZG9uZShlcCwgcmVxLCAtRUNPTk5SRVNFVCk7CisKKwkJLyogV2UgZG8gc3RhbGwgdGhlIEVQ IHRvIGNsZWFuIHRoaW5ncyB1cCBpbiBIVyAqLworCQl3cml0ZWwoVkhVQl9FUDBfQ1RSTF9TVEFM TCwgZXAtPmVwMC5jdGxzdGF0KTsKKwkJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7 CisJCWVwLT5lcDAuZGlyX2luID0gZmFsc2U7CisJCXJjID0gMDsKKwl9CisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30KKworCitzdGF0 aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgYXN0X3ZodWJfZXAwX29wcyA9IHsKKwkucXVldWUJ CT0gYXN0X3ZodWJfZXAwX3F1ZXVlLAorCS5kZXF1ZXVlCT0gYXN0X3ZodWJfZXAwX2RlcXVldWUs CisJLmFsbG9jX3JlcXVlc3QJPSBhc3Rfdmh1Yl9hbGxvY19yZXF1ZXN0LAorCS5mcmVlX3JlcXVl c3QJPSBhc3Rfdmh1Yl9mcmVlX3JlcXVlc3QsCit9OworCit2b2lkIGFzdF92aHViX2luaXRfZXAw KHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yiwgc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJICAgICAg IHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmRldikKK3sKKwltZW1zZXQoZXAsIDAsIHNpemVvZigqZXAp KTsKKworCUlOSVRfTElTVF9IRUFEKCZlcC0+ZXAuZXBfbGlzdCk7CisJSU5JVF9MSVNUX0hFQUQo JmVwLT5xdWV1ZSk7CisJZXAtPmVwLm9wcyA9ICZhc3Rfdmh1Yl9lcDBfb3BzOworCWVwLT5lcC5u YW1lID0gImVwMCI7CisJZXAtPmVwLmNhcHMudHlwZV9jb250cm9sID0gdHJ1ZTsKKwl1c2JfZXBf c2V0X21heHBhY2tldF9saW1pdCgmZXAtPmVwLCBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCk7CisJ ZXAtPmRfaWR4ID0gMDsKKwllcC0+ZGV2ID0gZGV2OworCWVwLT52aHViID0gdmh1YjsKKwllcC0+ ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3Rva2VuOworCUlOSVRfTElTVF9IRUFEKCZlcC0+ZXAwLnJl cS5xdWV1ZSk7CisJZXAtPmVwMC5yZXEuaW50ZXJuYWwgPSB0cnVlOworCisJLyogU21hbGwgZGlm ZmVyZW5jZSBiZXR3ZWVuIHZIdWIgYW5kIGRldmljZXMgKi8KKwlpZiAoZGV2KSB7CisJCWVwLT5l cDAuY3Rsc3RhdCA9IGRldi0+cmVncyArIEFTVF9WSFVCX0RFVl9FUDBfQ1RSTDsKKwkJZXAtPmVw MC5zZXR1cCA9IHZodWItPnJlZ3MgKworCQkJQVNUX1ZIVUJfU0VUVVAwICsgOCAqIChkZXYtPmlu ZGV4ICsgMSk7CisJCWVwLT5idWYgPSB2aHViLT5lcDBfYnVmcyArCisJCQlBU1RfVkhVQl9FUDBf TUFYX1BBQ0tFVCAqIChkZXYtPmluZGV4ICsgMSk7CisJCWVwLT5idWZfZG1hID0gdmh1Yi0+ZXAw X2J1ZnNfZG1hICsKKwkJCUFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUICogKGRldi0+aW5kZXggKyAx KTsKKwl9IGVsc2UgeworCQllcC0+ZXAwLmN0bHN0YXQgPSB2aHViLT5yZWdzICsgQVNUX1ZIVUJf RVAwX0NUUkw7CisJCWVwLT5lcDAuc2V0dXAgPSB2aHViLT5yZWdzICsgQVNUX1ZIVUJfU0VUVVAw OworCQllcC0+YnVmID0gdmh1Yi0+ZXAwX2J1ZnM7CisJCWVwLT5idWZfZG1hID0gdmh1Yi0+ZXAw X2J1ZnNfZG1hOworCX0KK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNw ZWVkLXZodWIvZXBuLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZWE2MjM0OGYwZTRlCi0t LSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4u YwpAQCAtMCwwICsxLDg0MCBAQAorLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNw ZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGVwbi5jIC0gR2VuZXJpYyBlbmRwb2lu dHMgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5l bC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9w b3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+ CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgor I2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgor I2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNp bmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRl IDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5j bHVkZSAidmh1Yi5oIgorCisjZGVmaW5lIEVYVFJBX0NIRUNLUworCisjaWZkZWYgRVhUUkFfQ0hF Q0tTCisjZGVmaW5lIENIRUNLKGVwLCBleHByLCBmbXQuLi4pIAkJCQlcCisJZG8gewkJCQkJCQlc CisJCWlmICghKGV4cHIpKSBFUERCRyhlcCwgIkNIRUNLOiIgZm10KTsJCVwKKwl9IHdoaWxlKDAp CisjZWxzZQorI2RlZmluZSBDSEVDSyhlcCwgZXhwciwgZm10Li4uKQlkbyB7IH0gd2hpbGUoMCkK KyNlbmRpZgorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5fa2ljayhzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEpCit7CisJdW5zaWduZWQgaW50IGFjdCA9 IHJlcS0+cmVxLmFjdHVhbDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gcmVxLT5yZXEubGVuZ3RoOwor CXVuc2lnbmVkIGludCBjaHVuazsKKworCS8qIFRoZXJlIHNob3VsZCBiZSBubyBETUEgb25nb2lu ZyAqLworCVdBUk5fT04ocmVxLT5hY3RpdmUpOworCisJLyogQ2FsY3VsYXRlIG5leHQgY2h1bmsg c2l6ZSAqLworCWNodW5rID0gbGVuIC0gYWN0OworCWlmIChjaHVuayA+IGVwLT5lcC5tYXhwYWNr ZXQpCisJCWNodW5rID0gZXAtPmVwLm1heHBhY2tldDsKKwllbHNlIGlmICgoY2h1bmsgPCBlcC0+ ZXAubWF4cGFja2V0KSB8fCAhcmVxLT5yZXEuemVybykKKwkJcmVxLT5sYXN0X2Rlc2MgPSAxOwor CisJRVBWREJHKGVwLCAia2ljayByZXEgJXAgYWN0PSVkLyVkIGNodW5rPSVkIGxhc3Q9JWRcbiIs CisJICAgICAgIHJlcSwgYWN0LCBsZW4sIGNodW5rLCByZXEtPmxhc3RfZGVzYyk7CisKKwkvKiBJ ZiBETUEgdW5hdmFpbGFibGUsIHVzaW5nIHN0YWdpbmcgRVAgYnVmZmVyICovCisJaWYgKCFyZXEt PnJlcS5kbWEpIHsKKworCQkvKiBGb3IgSU4gdHJhbnNmZXJzLCBjb3B5IGRhdGEgb3ZlciBmaXJz dCAqLworCQlpZiAoZXAtPmVwbi5pc19pbikKKwkJCW1lbWNweShlcC0+YnVmLCByZXEtPnJlcS5i dWYgKyBhY3QsIGNodW5rKTsKKwkJd3JpdGVsKGVwLT5idWZfZG1hLCBlcC0+ZXBuLnJlZ3MgKyBB U1RfVkhVQl9FUF9ERVNDX0JBU0UpOworCX0gZWxzZQorCQl3cml0ZWwocmVxLT5yZXEuZG1hICsg YWN0LCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX0JBU0UpOworCisJLyogU3RhcnQg RE1BICovCisJcmVxLT5hY3RpdmUgPSB0cnVlOworCXdyaXRlbChWSFVCX0VQX0RNQV9TRVRfVFhf U0laRShjaHVuayksCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RB VFVTKTsKKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VUX1RYX1NJWkUoY2h1bmspIHwgVkhVQl9FUF9E TUFfU0lOR0xFX0tJQ0ssCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0Nf U1RBVFVTKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2soc3RydWN0 IGFzdF92aHViX2VwICplcCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5zaWdu ZWQgaW50IGxlbjsKKwl1MzIgc3RhdDsKKworCS8qIFJlYWQgRVAgc3RhdHVzICovCisJc3RhdCA9 IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCS8qIEdy YWIgY3VycmVudCByZXF1ZXN0IGlmIGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3Jf bnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlFUFZEQkco ZXAsICJBQ0sgc3RhdHVzPSUwOHggaXNfaW49JWQsIHJlcT0lcCAoYWN0aXZlPSVkKVxuIiwKKwkg ICAgICAgc3RhdCwgZXAtPmVwbi5pc19pbiwgcmVxLCByZXEgPyByZXEtPmFjdGl2ZSA6IDApOwor CisJLyogSW4gYWJzZW5jZSBvZiBhIHJlcXVlc3QsIGJhaWwgb3V0LCBtdXN0IGhhdmUgYmVlbiBk ZXF1ZXVlZCAqLworCWlmICghcmVxKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlcXVlc3Qgbm90 IGFjdGl2ZSwgbW92ZSBvbiB0byBwcm9jZXNzaW5nIHF1ZXVlLCBhY3RpdmUgcmVxdWVzdAorCSAq IHdhcyBwcm9iYWJseSBkZXF1ZXVlZAorCSAqLworCWlmICghcmVxLT5hY3RpdmUpCisJCWdvdG8g bmV4dF9jaHVuazsKKworCS8qIENoZWNrIGlmIEhXIGhhcyBtb3ZlZCBvbiAqLworCWlmIChWSFVC X0VQX0RNQV9SUFRSKHN0YXQpICE9IDApIHsKKwkJRVBEQkcoZXAsICJETUEgcmVhZCBwb2ludGVy IG5vdCAwICFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogTm8gY3VycmVudCBETUEgb25nb2lu ZyAqLworCXJlcS0+YWN0aXZlID0gZmFsc2U7CisKKwkvKiBHcmFiIGxlbmdodCBvdXQgb2YgSFcg Ki8KKwlsZW4gPSBWSFVCX0VQX0RNQV9UWF9TSVpFKHN0YXQpOworCisJLyogSWYgbm90IHVzaW5n IERNQSwgY29weSBkYXRhIG91dCBpZiBuZWVkZWQgKi8KKwlpZiAoIXJlcS0+cmVxLmRtYSAmJiAh ZXAtPmVwbi5pc19pbiAmJiBsZW4pCisJCW1lbWNweShyZXEtPnJlcS5idWYgKyByZXEtPnJlcS5h Y3R1YWwsIGVwLT5idWYsIGxlbik7CisKKwkvKiBBZGp1c3Qgc2l6ZSAqLworCXJlcS0+cmVxLmFj dHVhbCArPSBsZW47CisKKwkvKiBDaGVjayBmb3Igc2hvcnQgcGFja2V0ICovCisJaWYgKGxlbiA8 IGVwLT5lcC5tYXhwYWNrZXQpCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCS8qIFRoYXQncyBp dCA/IGNvbXBsZXRlIHRoZSByZXF1ZXN0IGFuZCBwaWNrIGEgbmV3IG9uZSAqLworCWlmIChyZXEt Pmxhc3RfZGVzYyA+PSAwKSB7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgMCk7CisJCXJlcSA9 IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVx LAorCQkJCQkgICAgICAgcXVldWUpOworCisJCS8qCisJCSAqIER1ZSB0byBsb2NrIGRyb3BwaW5n IGluc2lkZSAiZG9uZSIgdGhlIG5leHQgcmVxdWVzdCBjb3VsZAorCQkgKiBhbHJlYWR5IGJlIGFj dGl2ZSwgc28gY2hlY2sgZm9yIHRoYXQgYW5kIGJhaWwgaWYgbmVlZGVkLgorCQkgKi8KKwkJaWYg KCFyZXEgfHwgcmVxLT5hY3RpdmUpCisJCQlyZXR1cm47CisJfQorCisgbmV4dF9jaHVuazoKKwlh c3Rfdmh1Yl9lcG5fa2ljayhlcCwgcmVxKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBp bnQgYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQorewor CS8qCisJICogZF9uZXh0ID09IGRfbGFzdCBtZWFucyBkZXNjcmlwdG9yIGxpc3QgZW1wdHkgdG8g SFcsCisJICogdGh1cyB3ZSBjYW4gb25seSBoYXZlIEFTVF9WSFVCX0RFU0NTX0NPVU5ULTEgZGVz Y3JpcHRvcnMKKwkgKiBpbiB0aGUgbGlzdAorCSAqLworCXJldHVybiAoZXAtPmVwbi5kX2xhc3Qg KyBBU1RfVkhVQl9ERVNDU19DT1VOVCAtIGVwLT5lcG4uZF9uZXh0IC0gMSkgJgorCQkoQVNUX1ZI VUJfREVTQ1NfQ09VTlQgLSAxKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2tpY2tf ZGVzYyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHN0cnVjdCBhc3Rfdmh1Yl9yZXEg KnJlcSkKK3sKKwl1bnNpZ25lZCBpbnQgYWN0ID0gcmVxLT5hY3RfY291bnQ7CisJdW5zaWduZWQg aW50IGxlbiA9IHJlcS0+cmVxLmxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisKKwkvKiBN YXJrIHJlcXVlc3QgYWN0aXZlIGlmIG5vdCBhbHJlYWR5ICovCisJcmVxLT5hY3RpdmUgPSB0cnVl OworCisJLyogSWYgdGhlIHJlcXVlc3Qgd2FzIGFscmVhZHkgY29tcGxldGVseSB3cml0dGVuLCBk byBub3RoaW5nICovCisJaWYgKHJlcS0+bGFzdF9kZXNjID49IDApCisJCXJldHVybjsKKworCUVQ VkRCRyhlcCwgImtpY2sgYWN0PSVkLyVkIGNodW5rX21heD0lZCBmcmVlX2Rlc2NzPSVkXG4iLAor CSAgICAgICBhY3QsIGxlbiwgZXAtPmVwbi5jaHVua19tYXgsIGFzdF92aHViX2NvdW50X2ZyZWVf ZGVzY3MoZXApKTsKKworCS8qIFdoaWxlIHdlIGNhbiBjcmVhdGUgZGVzY3JpcHRvcnMgKi8KKwl3 aGlsZSAoYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhlcCkgJiYgcmVxLT5sYXN0X2Rlc2MgPCAw KSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9kZXNjICpkZXNjOworCQl1bnNpZ25lZCBpbnQgZF9udW07 CisKKwkJLyogR3JhYiBuZXh0IGZyZWUgZGVzY3JpcHRvciAqLworCQlkX251bSA9IGVwLT5lcG4u ZF9uZXh0OworCQlkZXNjID0gJmVwLT5lcG4uZGVzY3NbZF9udW1dOworCQllcC0+ZXBuLmRfbmV4 dCA9IChkX251bSArIDEpICYgKEFTVF9WSFVCX0RFU0NTX0NPVU5UIC0gMSk7CisKKwkJLyogQ2Fs Y3VsYXRlIG5leHQgY2h1bmsgc2l6ZSAqLworCQljaHVuayA9IGxlbiAtIGFjdDsKKwkJaWYgKGNo dW5rIDw9IGVwLT5lcG4uY2h1bmtfbWF4KSB7CisJCQkvKgorCQkJICogSXMgdGhpcyB0aGUgbGFz dCBwYWNrZXQgPyBCZWNhdXNlIG9mIGhhdmluZyB1cCB0byA4CisJCQkgKiBwYWNrZXMgaW4gYSBk ZXNjcmlwdG9yIHdlIGNhbid0IGp1c3QgY29tcGFyZSAiY2h1bmsiCisJCQkgKiB3aXRoIGVwLm1h eHBhY2tldC4gV2UgaGF2ZSB0byBzZWUgaWYgaXQncyBhIG11bHRpcGxlCisJCQkgKiBvZiBpdCB0 byBrbm93IGlmIHdlIGhhdmUgdG8gc2VuZCBhIHplcm8gcGFja2V0LgorCQkJICogU2FkbHkgdGhh dCBpbnZvbHZlcyBhIG1vZHVsbyB3aGljaCBpcyBhIGJpdCBleHBlbnNpdmUKKwkJCSAqIGJ1dCBw cm9iYWJseSBzdGlsbCBiZXR0ZXIgdGhhbiBub3QgZG9pbmcgaXQuCisJCQkgKi8KKwkJCWlmICgh cmVxLT5yZXEuemVybyB8fCAoY2h1bmsgJSBlcC0+ZXAubWF4cGFja2V0KSAhPSAwKQorCQkJCXJl cS0+bGFzdF9kZXNjID0gZF9udW07CisJCX0gZWxzZSB7CisJCQljaHVuayA9IGVwLT5lcG4uY2h1 bmtfbWF4OworCQl9CisKKwkJRVBWREJHKGVwLCAiIGNodW5rOiBhY3Q9JWQvJWQgY2h1bms9JWQg bGFzdD0lZCBkZXNjPSVkIGZyZWU9JWRcbiIsCisJCSAgICAgICBhY3QsIGxlbiwgY2h1bmssIHJl cS0+bGFzdF9kZXNjLCBkX251bSwKKwkJICAgICAgIGFzdF92aHViX2NvdW50X2ZyZWVfZGVzY3Mo ZXApKTsKKworCQkvKiBQb3B1bGF0ZSBkZXNjcmlwdG9yICovCisJCWRlc2MtPncwID0gY3B1X3Rv X2xlMzIocmVxLT5yZXEuZG1hICsgYWN0KTsKKworCQkvKiBJbnRlcnJ1cHQgaWYgZW5kIG9mIHJl cXVlc3Qgb3Igbm8gbW9yZSBkZXNjcmlwdG9ycyAqLworCisJCS8qCisJCSAqIFRPRE86IEJlIHNt YXJ0ZXIgYWJvdXQgaXQsIGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoCisJCSAqIGRlc2NyaXB0b3Jz IHJlcXVlc3QgYW4gaW50ZXJydXB0IGJlZm9yZSBxdWV1ZSBlbXB0eQorCQkgKiBvciBzbyBpbiBv cmRlciB0byBiZSBhYmxlIHRvIHBvcHVsYXRlIG1vcmUgYmVmb3JlCisJCSAqIHRoZSBIVyBydW5z IG91dC4gVGhpcyBpc24ndCBhIHByb2JsZW0gYXQgdGhlIG1vbWVudAorCQkgKiBhcyB3ZSB1c2Ug MjU2IGRlc2NyaXB0b3JzIGFuZCBvbmx5IHB1dCBhdCBtb3N0IG9uZQorCQkgKiByZXF1ZXN0IGlu IHRoZSByaW5nLgorCQkgKi8KKwkJZGVzYy0+dzEgPSBjcHVfdG9fbGUzMihWSFVCX0RTQzFfSU5f U0VUX0xFTihjaHVuaykpOworCQlpZiAocmVxLT5sYXN0X2Rlc2MgPj0gMCB8fCAhYXN0X3ZodWJf Y291bnRfZnJlZV9kZXNjcyhlcCkpCisJCQlkZXNjLT53MSB8PSBjcHVfdG9fbGUzMihWSFVCX0RT QzFfSU5fSU5URVJSVVBUKTsKKworCQkvKiBBY2NvdW50IHBhY2tldCAqLworCQlyZXEtPmFjdF9j b3VudCA9IGFjdCA9IGFjdCArIGNodW5rOworCX0KKworCS8qIFRlbGwgSFcgYWJvdXQgbmV3IGRl c2NyaXB0b3JzICovCisJd3JpdGVsKFZIVUJfRVBfRE1BX1NFVF9DUFVfV1BUUihlcC0+ZXBuLmRf bmV4dCksCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsK KworCUVQVkRCRyhlcCwgIkhXIGtpY2tlZCwgZF9uZXh0PSVkIGRzdGF0PSUwOHhcbiIsCisJICAg ICAgIGVwLT5lcG4uZF9uZXh0LCByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVND X1NUQVRVUykpOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5faGFuZGxlX2Fja19kZXNj KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOwor CXVuc2lnbmVkIGludCBsZW4sIGRfbGFzdDsKKwl1MzIgc3RhdCwgc3RhdDE7CisKKwkvKiBSZWFk IEVQIHN0YXR1cywgd29ya2Fyb3VuZCBIVyByYWNlICovCisJZG8geworCQlzdGF0ID0gcmVhZGwo ZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCQlzdGF0MSA9IHJlYWRs KGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKwl9IHdoaWxlKHN0YXQg IT0gc3RhdDEpOworCisJLyogRXh0cmFjdCBSUFRSICovCisJZF9sYXN0ID0gVkhVQl9FUF9ETUFf UlBUUihzdGF0KTsKKworCS8qIEdyYWIgY3VycmVudCByZXF1ZXN0IGlmIGFueSAqLworCXJlcSA9 IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVx LCBxdWV1ZSk7CisKKwlFUFZEQkcoZXAsICJBQ0sgc3RhdHVzPSUwOHggaXNfaW49JWQgZXAtPmRf bGFzdD0lZC4uJWRcbiIsCisJICAgICAgIHN0YXQsIGVwLT5lcG4uaXNfaW4sIGVwLT5lcG4uZF9s YXN0LCBkX2xhc3QpOworCisJLyogQ2hlY2sgYWxsIGNvbXBsZXRlZCBkZXNjcmlwdG9ycyAqLwor CXdoaWxlIChlcC0+ZXBuLmRfbGFzdCAhPSBkX2xhc3QpIHsKKwkJc3RydWN0IGFzdF92aHViX2Rl c2MgKmRlc2M7CisJCXVuc2lnbmVkIGludCBkX251bTsKKwkJYm9vbCBpc19sYXN0X2Rlc2M7CisK KwkJLyogR3JhYiBuZXh0IGNvbXBsZXRlZCBkZXNjcmlwdG9yICovCisJCWRfbnVtID0gZXAtPmVw bi5kX2xhc3Q7CisJCWRlc2MgPSAmZXAtPmVwbi5kZXNjc1tkX251bV07CisJCWVwLT5lcG4uZF9s YXN0ID0gKGRfbnVtICsgMSkgJiAoQVNUX1ZIVUJfREVTQ1NfQ09VTlQgLSAxKTsKKworCQkvKiBH cmFiIGxlbiBvdXQgb2YgZGVzY3JpcHRvciAqLworCQlsZW4gPSBWSFVCX0RTQzFfSU5fTEVOKGxl MzJfdG9fY3B1KGRlc2MtPncxKSk7CisKKwkJRVBWREJHKGVwLCAiIGRlc2MgJWQgbGVuPSVkIHJl cT0lcCAoYWN0PSVkKVxuIiwKKwkJICAgICAgIGRfbnVtLCBsZW4sIHJlcSwgcmVxID8gcmVxLT5h Y3RpdmUgOiAwKTsKKworCQkvKiBJZiBubyBhY3RpdmUgcmVxdWVzdCBwZW5kaW5nLCBtb3ZlIG9u ICovCisJCWlmICghcmVxIHx8ICFyZXEtPmFjdGl2ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFk anVzdCBzaXplICovCisJCXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisKKwkJLyogSXMgdGhhdCB0 aGUgbGFzdCBjaHVuayA/ICovCisJCWlzX2xhc3RfZGVzYyA9IHJlcS0+bGFzdF9kZXNjID09IGRf bnVtOworCQlDSEVDSyhlcCwgaXNfbGFzdF9kZXNjID09IChsZW4gPCBlcC0+ZXAubWF4cGFja2V0 IHx8CisJCQkJCSAgIChyZXEtPnJlcS5hY3R1YWwgPj0gcmVxLT5yZXEubGVuZ3RoICYmCisJCQkJ CSAgICAhcmVxLT5yZXEuemVybykpLAorCQkgICAgICAiTGFzdCBwYWNrZXQgZGlzY3JlcGFuY3k6 IGxhc3RfZGVzYz0lZCBsZW49JWQgci5hY3Q9JWQgIgorCQkgICAgICAici5sZW49JWQgci56ZXJv PSVkIG1wPSVkXG4iLAorCQkgICAgICBpc19sYXN0X2Rlc2MsIGxlbiwgcmVxLT5yZXEuYWN0dWFs LCByZXEtPnJlcS5sZW5ndGgsCisJCSAgICAgIHJlcS0+cmVxLnplcm8sIGVwLT5lcC5tYXhwYWNr ZXQpOworCisJCWlmIChpc19sYXN0X2Rlc2MpIHsKKwkJCS8qCisJCQkgKiBCZWNhdXNlIHdlIGNh biBvbmx5IGhhdmUgb25lIHJlcXVlc3QgYXQgYSB0aW1lCisJCQkgKiBpbiBvdXIgZGVzY3JpcHRv ciBsaXN0IGluIHRoaXMgaW1wbGVtZW50YXRpb24sCisJCQkgKiBkX2xhc3QgYW5kIGVwLT5kX2xh c3Qgc2hvdWxkIG5vdyBiZSBlcXVhbAorCQkJICovCisJCQlDSEVDSyhlcCwgZF9sYXN0ID09IGVw LT5lcG4uZF9sYXN0LAorCQkJICAgICAgIkRNQSByZWFkIHB0ciBtaXNtYXRjaCAlZCB2cyAlZFxu IiwKKwkJCSAgICAgIGRfbGFzdCwgZXAtPmVwbi5kX2xhc3QpOworCisJCQkvKiBOb3RlOiBkb25l IHdpbGwgZHJvcCBhbmQgcmUtYWNxdWlyZSB0aGUgbG9jayAqLworCQkJYXN0X3ZodWJfZG9uZShl cCwgcmVxLCAwKTsKKwkJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVl LAorCQkJCQkJICAgICAgIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsCisJCQkJCQkgICAgICAgcXVldWUp OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBNb3JlIHdvcmsgPyAqLworCWlmIChyZXEpCisJ CWFzdF92aHViX2Vwbl9raWNrX2Rlc2MoZXAsIHJlcSk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXBu X2Fja19pcnEoc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwlpZiAoZXAtPmVwbi5kZXNjX21v ZGUpCisJCWFzdF92aHViX2Vwbl9oYW5kbGVfYWNrX2Rlc2MoZXApOworCWVsc2UKKwkJYXN0X3Zo dWJfZXBuX2hhbmRsZV9hY2soZXApOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9xdWV1 ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxLAorCQkJICAg ICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2Fz dF9yZXEodV9yZXEpOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7 CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKwlib29sIGVtcHR5OworCWludCByYzsKKworCS8qIFBhcmFub2lkIGNoZWNrcyAqLworCWlm ICghdV9yZXEgfHwgIXVfcmVxLT5jb21wbGV0ZSB8fCAhdV9yZXEtPmJ1ZiB8fAorCSAgICAhbGlz dF9lbXB0eSgmcmVxLT5xdWV1ZSkpIHsKKwkJZGV2X3dhcm4oJnZodWItPnBkZXYtPmRldiwgIkJv Z3VzIHJlcXVlc3QgIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuZHBvaW50 IGVuYWJsZWQgPyAqLworCWlmICghZXAtPmVwbi5lbmFibGVkIHx8ICF1X2VwLT5kZXNjIHx8ICFl cC0+ZGV2IHx8ICFlcC0+ZF9pZHggfHwKKwkgICAgIWVwLT5kZXYtPmVuYWJsZWQgfHwgZXAtPmRl di0+c3VzcGVuZGVkKSB7CisJCUVQREJHKGVwLCJFbnF1ZWluZyByZXF1ZXN0IG9uIHdyb25nIG9y IGRpc2FibGVkIEVQXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJLyogTWFwIHJl cXVlc3QgZm9yIERNQSBpZiBwb3NzaWJsZS4gRm9yIG5vdywgdGhlIHJ1bGUgZm9yIERNQSBpcwor CSAqIHRoYXQ6CisJICoKKwkgKiAgKiBGb3Igc2luZ2xlIHN0YWdlIG1vZGUgKG5vIGRlc2NyaXB0 b3JzKToKKwkgKgorCSAqICAgLSBUaGUgYnVmZmVyIGlzIGFsaWduZWQgdG8gYSA4IGJ5dGVzIGJv dW5kYXJ5IChIVyByZXF1aXJlbWVudCkKKwkgKiAgIC0gRm9yIGEgT1VUIGVuZHBvaW50LCB0aGUg cmVxdWVzdCBzaXplIGlzIGEgbXVsdGlwbGUgb2YgdGhlIEVQCisJICogICAgIHBhY2tldCBzaXpl IChvdGhlcndpc2UgdGhlIGNvbnRyb2xsZXIgd2lsbCBETUEgcGFzdCB0aGUgZW5kCisJICogICAg IG9mIHRoZSBidWZmZXIgaWYgdGhlIGhvc3QgaXMgc2VuZGluZyBhIHRvbyBsb25nIHBhY2tldCku CisJICoKKwkgKiAgKiBGb3IgZGVzY3JpcHRvciBtb2RlICh0eCBvbmx5IGZvciBub3cpLCBhbHdh eXMuCisJICoKKwkgKiBXZSBjb3VsZCByZWxheCB0aGUgbGF0dGVyIGJ5IG1ha2luZyB0aGUgZGVj aXNpb24gdG8gdXNlIHRoZSBib3VuY2UKKwkgKiBidWZmZXIgYmFzZWQgb24gdGhlIHNpemUgb2Yg YSBnaXZlbiAqc2VnbWVudCogb2YgdGhlIHJlcXVlc3QgcmF0aGVyCisJICogdGhhbiB0aGUgd2hv bGUgcmVxdWVzdC4KKwkgKi8KKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUgfHwKKwkgICAgKCgoKHVu c2lnbmVkIGxvbmcpdV9yZXEtPmJ1ZiAmIDcpID09IDApICYmCisJICAgICAoZXAtPmVwbi5pc19p biB8fCAhKHVfcmVxLT5sZW5ndGggJiAodV9lcC0+bWF4cGFja2V0IC0gMSkpKSkpIHsKKwkJcmMg PSB1c2JfZ2FkZ2V0X21hcF9yZXF1ZXN0KCZlcC0+ZGV2LT5nYWRnZXQsIHVfcmVxLAorCQkJCQkg ICAgZXAtPmVwbi5pc19pbik7CisJCWlmIChyYykgeworCQkJZGV2X3dhcm4oJnZodWItPnBkZXYt PmRldiwKKwkJCQkgIlJlcXVlc3QgbWFwcGluZyBmYWlsdXJlICVkXG4iLCByYyk7CisJCQlyZXR1 cm4gcmM7CisJCX0KKwl9IGVsc2UKKwkJdV9yZXEtPmRtYSA9IDA7CisKKwlFUFZEQkcoZXAsICJl bnF1ZXVlIHJlcSBAJXBcbiIsIHJlcSk7CisJRVBWREJHKGVwLCAiIGw9JWQgZG1hPTB4JXggemVy bz0lZCBub3Nob3J0PSVkIG5vaXJxPSVkIGlzX2luPSVkXG4iLAorCSAgICAgICB1X3JlcS0+bGVu Z3RoLCAodTMyKXVfcmVxLT5kbWEsIHVfcmVxLT56ZXJvLAorCSAgICAgICB1X3JlcS0+c2hvcnRf bm90X29rLCB1X3JlcS0+bm9faW50ZXJydXB0LAorCSAgICAgICBlcC0+ZXBuLmlzX2luKTsKKwor CS8qIEluaXRpYWxpemUgcmVxdWVzdCBwcm9ncmVzcyBmaWVsZHMgKi8KKwl1X3JlcS0+c3RhdHVz ID0gLUVJTlBST0dSRVNTOworCXVfcmVxLT5hY3R1YWwgPSAwOworCXJlcS0+YWN0X2NvdW50ID0g MDsKKwlyZXEtPmFjdGl2ZSA9IGZhbHNlOworCXJlcS0+bGFzdF9kZXNjID0gLTE7CisJc3Bpbl9s b2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwllbXB0eSA9IGxpc3RfZW1wdHkoJmVw LT5xdWV1ZSk7CisKKwkvKiBBZGQgcmVxdWVzdCB0byBsaXN0IGFuZCBraWNrIHByb2Nlc3Npbmcg aWYgZW1wdHkgKi8KKwlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKwlp ZiAoZW1wdHkpIHsKKwkJaWYgKGVwLT5lcG4uZGVzY19tb2RlKQorCQkJYXN0X3ZodWJfZXBuX2tp Y2tfZGVzYyhlcCwgcmVxKTsKKwkJZWxzZQorCQkJYXN0X3ZodWJfZXBuX2tpY2soZXAsIHJlcSk7 CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9zdG9wX2FjdGl2ZV9yZXEoc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCQkgICAgIGJvb2wgcmVzdGFydF9lcCkKK3sKKwl1MzIgc3Rh dGUsIHJlZywgbG9vcHM7CisKKwkvKiBTdG9wIERNQSBhY3Rpdml0eSAqLworCXdyaXRlbCgwLCBl cC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisKKwkvKiBXYWl0IGZvciBp dCB0byBjb21wbGV0ZSAqLworCWZvciAobG9vcHMgPSAwOyBsb29wcyA8IDEwMDA7IGxvb3BzKysp IHsKKwkJc3RhdGUgPSByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RB VCk7CisJCXN0YXRlID0gVkhVQl9FUF9ETUFfUFJPQ19TVEFUVVMoc3RhdGUpOworCQlpZiAoc3Rh dGUgPT0gRVBfRE1BX1BST0NfUlhfSURMRSB8fAorCQkgICAgc3RhdGUgPT0gRVBfRE1BX1BST0Nf VFhfSURMRSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWlmIChsb29wcyA+PSAxMDAw KQorCQlkZXZfd2FybigmZXAtPnZodWItPnBkZXYtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3Ig RE1BXG4iKTsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgdG8gcmVzdGFydCB0aGUgZW5kcG9pbnQs IHRoYXQncyBpdCAqLworCWlmICghcmVzdGFydF9lcCkKKwkJcmV0dXJuOworCisJLyogUmVzdGFy dCB0aGUgZW5kcG9pbnQgKi8KKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpIHsKKwkJLyoKKwkJICog VGFrZSBvdXQgZGVzY3JpcHRvcnMgYnkgcmVzZXR0aW5nIHRoZSBETUEgcmVhZAorCQkgKiBwb2lu dGVyIHRvIGJlIGVxdWFsIHRvIHRoZSBDUFUgd3JpdGUgcG9pbnRlci4KKwkJICoKKwkJICogTm90 ZTogSWYgd2UgZXZlciBzdXBwb3J0IGNyZWF0aW5nIGRlc2NyaXB0b3JzIGZvcgorCQkgKiByZXF1 ZXN0cyB0aGF0IGFyZW4ndCB0aGUgaGVhZCBvZiB0aGUgcXVldWUsIHdlCisJCSAqIG1heSBoYXZl IHRvIGRvIHNvbWV0aGluZyBtb3JlIGNvbXBsZXggaGVyZSwKKwkJICogZXNwZWNpYWxseSBpZiB0 aGUgcmVxdWVzdCBiZWluZyB0YWtlbiBvdXQgaXMKKwkJICogbm90IHRoZSBjdXJyZW50IGhlYWQg ZGVzY3JpcHRvcnMuCisJCSAqLworCQlyZWcgPSBWSFVCX0VQX0RNQV9TRVRfUlBUUihlcC0+ZXBu LmRfbmV4dCkgfAorCQkJVkhVQl9FUF9ETUFfU0VUX0NQVV9XUFRSKGVwLT5lcG4uZF9uZXh0KTsK KwkJd3JpdGVsKHJlZywgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOwor CisJCS8qIFRoZW4gdHVybiBpdCBiYWNrIG9uICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25m LAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCX0g ZWxzZSB7CisJCS8qIFNpbmdsZSBtb2RlOiBqdXN0IHR1cm4gaXQgYmFjayBvbiAqLworCQl3cml0 ZWwoZXAtPmVwbi5kbWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQ X0RNQV9DVExTVEFUKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX2RlcXVldWUo c3RydWN0IHVzYl9lcCogdV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSkKK3sKKwlzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAq dmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCWludCByYyA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1 Yi0+bG9jaywgZmxhZ3MpOworCisJLyogTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVkIG9u IHRoaXMgZW5kcG9pbnQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVldWUs IHF1ZXVlKSB7CisJCWlmICgmcmVxLT5yZXEgPT0gdV9yZXEpCisJCQlicmVhazsKKwl9CisKKwlp ZiAoJnJlcS0+cmVxID09IHVfcmVxKSB7CisJCUVQVkRCRyhlcCwgImRlcXVldWUgcmVxIEAlcCBh Y3RpdmU9JWRcbiIsCisJCSAgICAgICByZXEsIHJlcS0+YWN0aXZlKTsKKwkJaWYgKHJlcS0+YWN0 aXZlKQorCQkJYXN0X3ZodWJfc3RvcF9hY3RpdmVfcmVxKGVwLCB0cnVlKTsKKwkJYXN0X3ZodWJf ZG9uZShlcCwgcmVxLCAtRUNPTk5SRVNFVCk7CisJCXJjID0gMDsKKwl9CisKKwlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCit2b2lk IGFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwl1 MzIgcmVnOworCisJaWYgKFdBUk5fT04oZXAtPmRfaWR4ID09IDApKQorCQlyZXR1cm47CisJcmVn ID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsKKwlpZiAoZXAtPmVw bi5zdGFsbGVkIHx8IGVwLT5lcG4ud2VkZ2VkKQorCQlyZWcgfD0gVkhVQl9FUF9DRkdfU1RBTExf Q1RSTDsKKwllbHNlCisJCXJlZyAmPSB+VkhVQl9FUF9DRkdfU1RBTExfQ1RSTDsKKwl3cml0ZWwo cmVnLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9DT05GSUcpOworCisJaWYgKCFlcC0+ZXBu LnN0YWxsZWQgJiYgIWVwLT5lcG4ud2VkZ2VkKQorCQl3cml0ZWwoVkhVQl9FUF9UT0dHTEVfU0VU X0VQTlVNKGVwLT5lcG4uZ19pZHgpLAorCQkgICAgICAgZXAtPnZodWItPnJlZ3MgKyBBU1RfVkhV Ql9FUF9UT0dHTEUpOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3NldF9oYWx0X2FuZF93ZWRn ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBib29sIGhhbHQsCisJCQkJICAgICAgYm9vbCB3ZWRnZSkK K3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBh c3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlFUERC RyhlcCwgIlNldCBoYWx0ICglZCkgJiB3ZWRnZSAoJWQpXG4iLCBoYWx0LCB3ZWRnZSk7CisKKwlp ZiAoIXVfZXAgfHwgIXVfZXAtPmRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlcC0+ZF9p ZHggPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGVwLT5lcG4uaXNfaXNvKQorCQlyZXR1cm4gLUVP UE5PVFNVUFA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJ LyogRmFpbCB3aXRoIHN0aWxsLWJ1c3kgSU4gZW5kcG9pbnRzICovCisJaWYgKGhhbHQgJiYgZXAt PmVwbi5pc19pbiAmJiAhbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgeworCQlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwll cC0+ZXBuLnN0YWxsZWQgPSBoYWx0OworCWVwLT5lcG4ud2VkZ2VkID0gd2VkZ2U7CisJYXN0X3Zo dWJfdXBkYXRlX2Vwbl9zdGFsbChlcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHVi LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9l cG5fc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqdV9lcCwgaW50IHZhbHVlKQoreworCXJldHVybiBh c3Rfdmh1Yl9zZXRfaGFsdF9hbmRfd2VkZ2UodV9lcCwgdmFsdWUgIT0gMCwgZmFsc2UpOworfQor CitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9zZXRfd2VkZ2Uoc3RydWN0IHVzYl9lcCAqdV9lcCkK K3sKKwlyZXR1cm4gYXN0X3ZodWJfc2V0X2hhbHRfYW5kX3dlZGdlKHVfZXAsIHRydWUsIHRydWUp OworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9kaXNhYmxlKHN0cnVjdCB1c2JfZXAqIHVf ZXApCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1 Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUz MiBpbWFzaywgZXBfaWVyOworCisJRVBEQkcoZXAsICJEaXNhYmxpbmcgIVxuIik7CisKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJZXAtPmVwbi5lbmFibGVkID0g ZmFsc2U7CisKKwkvKiBTdG9wIGFjdGl2ZSBETUEgaWYgYW55ICovCisJYXN0X3ZodWJfc3RvcF9h Y3RpdmVfcmVxKGVwLCBmYWxzZSk7CisKKwkvKiBEaXNhYmxlIGVuZHBvaW50ICovCisJd3JpdGVs KDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisKKwkvKiBEaXNhYmxlIEFD SyBpbnRlcnJ1cHQgKi8KKwlpbWFzayA9IDEgPDwgZXAtPmVwbi5nX2lkeDsKKwllcF9pZXIgPSBy ZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJZXBfaWVyICY9IH5pbWFz azsKKwl3cml0ZWwoZXBfaWVyLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJ d3JpdGVsKGltYXNrLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7CisKKwkvKiBO dWtlIGFsbCBwZW5kaW5nIHJlcXVlc3RzICovCisJYXN0X3ZodWJfbnVrZShlcCwgLUVTSFVURE9X Tik7CisKKwkvKiBObyBtb3JlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QgKi8K KwllcC0+ZXAuZGVzYyA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5s b2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5f ZW5hYmxlKHN0cnVjdCB1c2JfZXAqIHVfZXAsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9l bmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcF90eXBl X3N0cmluZ1tdIF9fbWF5YmVfdW51c2VkID0geyAiY3RybCIsCisJCQkJCQkJICAgICAgICJpc29j IiwKKwkJCQkJCQkgICAgICAgImJ1bGsiLAorCQkJCQkJCSAgICAgICAiaW50ciIgfTsKKwlzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1Yl9k ZXYgKmRldjsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWI7CisJdTE2IG1heHBhY2tldCwgdHlwZTsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBlcF9jb25mLCBlcF9pZXIsIGltYXNrOworCisJ LyogQ2hlY2sgYXJndW1lbnRzICovCisJaWYgKCF1X2VwIHx8ICFkZXNjKQorCQlyZXR1cm4gLUVJ TlZBTDsKKworCW1heHBhY2tldCA9IHVzYl9lbmRwb2ludF9tYXhwKGRlc2MpOworCWlmICghZXAt PmRfaWR4IHx8ICFlcC0+ZGV2IHx8CisJICAgIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0Jf RFRfRU5EUE9JTlQgfHwKKwkgICAgbWF4cGFja2V0ID09IDAgfHwgbWF4cGFja2V0ID4gZXAtPmVw Lm1heHBhY2tldCkgeworCQlFUERCRyhlcCwgIkludmFsaWQgRVAgZW5hYmxlLGRfaWR4PSVkLGRl dj0lcCx0eXBlPSVkLG1wPSVkLyVkXG4iLAorCQkgICAgICBlcC0+ZF9pZHgsIGVwLT5kZXYsIGRl c2MtPmJEZXNjcmlwdG9yVHlwZSwKKwkJICAgICAgbWF4cGFja2V0LCBlcC0+ZXAubWF4cGFja2V0 KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChlcC0+ZF9pZHggIT0gdXNiX2VuZHBvaW50 X251bShkZXNjKSkgeworCQlFUERCRyhlcCwgIkVQIG51bWJlciBtaXNtYXRjaCAhXG4iKTsKKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGVwLT5lcG4uZW5hYmxlZCkgeworCQlFUERCRyhl cCwgIkFscmVhZHkgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7CisJfQorCWRldiA9IGVw LT5kZXY7CisJdmh1YiA9IGVwLT52aHViOworCisJLyogQ2hlY2sgZGV2aWNlIHN0YXRlICovCisJ aWYgKCFkZXYtPmRyaXZlcikgeworCQlFUERCRyhlcCwgIkJvZ3VzIGRldmljZSBzdGF0ZTogZHJp dmVyPSVwIHNwZWVkPSVkXG4iLAorCQkgICAgICAgZGV2LT5kcml2ZXIsIGRldi0+Z2FkZ2V0LnNw ZWVkKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJLyogR3JhYiBzb21lIGluZm8gZnJv bSB0aGUgZGVzY3JpcHRvciAqLworCWVwLT5lcG4uaXNfaW4gPSB1c2JfZW5kcG9pbnRfZGlyX2lu KGRlc2MpOworCWVwLT5lcC5tYXhwYWNrZXQgPSBtYXhwYWNrZXQ7CisJdHlwZSA9IHVzYl9lbmRw b2ludF90eXBlKGRlc2MpOworCWVwLT5lcG4uZF9uZXh0ID0gZXAtPmVwbi5kX2xhc3QgPSAwOwor CWVwLT5lcG4uaXNfaXNvID0gZmFsc2U7CisJZXAtPmVwbi5zdGFsbGVkID0gZmFsc2U7CisJZXAt PmVwbi53ZWRnZWQgPSBmYWxzZTsKKworCUVQREJHKGVwLCAiRW5hYmxpbmcgWyVzXSAlcyBudW0g JWQgbWF4cGFja2V0PSVkXG4iLAorCSAgICAgIGVwLT5lcG4uaXNfaW4gPyAiaW4iIDogIm91dCIs IGVwX3R5cGVfc3RyaW5nW3R5cGVdLAorCSAgICAgIHVzYl9lbmRwb2ludF9udW0oZGVzYyksIG1h eHBhY2tldCk7CisKKwkvKiBDYW4gd2UgdXNlIERNQSBkZXNjcmlwdG9yIG1vZGUgPyAqLworCWVw LT5lcG4uZGVzY19tb2RlID0gZXAtPmVwbi5kZXNjcyAmJiBlcC0+ZXBuLmlzX2luICYmCisJCSF2 aHViLT5ub19kbWFfZGVzYzsKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpCisJCW1lbXNldChlcC0+ ZXBuLmRlc2NzLCAwLCA4ICogQVNUX1ZIVUJfREVTQ1NfQ09VTlQpOworCisJLyoKKwkgKiBMYXJn ZSBzZW5kIGZ1bmN0aW9uIGNhbiBzZW5kIHVwIHRvIDggcGFja2V0cyBmcm9tCisJICogb25lIGRl c2NyaXB0b3Igd2l0aCBhIGxpbWl0IG9mIDQwOTUgYnl0ZXMuCisJICovCisJZXAtPmVwbi5jaHVu a19tYXggPSBlcC0+ZXAubWF4cGFja2V0OworCWlmIChlcC0+ZXBuLmlzX2luICYmICFlcC0+dmh1 Yi0+bm9fbGFyZ2Vfc2VuZHMpIHsKKwkJZXAtPmVwbi5jaHVua19tYXggPDw9IDM7CisJCXdoaWxl IChlcC0+ZXBuLmNodW5rX21heCA+IDQwOTUpCisJCQllcC0+ZXBuLmNodW5rX21heCAtPSBlcC0+ ZXAubWF4cGFja2V0OworCX0KKworCXN3aXRjaCh0eXBlKSB7CisJY2FzZSBVU0JfRU5EUE9JTlRf WEZFUl9DT05UUk9MOgorCQlFUERCRyhlcCwgIk9ubHkgb25lIGNvbnRyb2wgZW5kcG9pbnRcbiIp OworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJZXBf Y29uZiA9IFZIVUJfRVBfQ0ZHX1NFVF9UWVBFKEVQX1RZUEVfSU5UKTsKKwkJYnJlYWs7CisJY2Fz ZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQllcF9jb25mID0gVkhVQl9FUF9DRkdfU0VUX1RZ UEUoRVBfVFlQRV9CVUxLKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09D OgorCQllcF9jb25mID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9JU08pOworCQllcC0+ ZXBuLmlzX2lzbyA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFM OworCX0KKworCS8qIEVuY29kZSB0aGUgcmVzdCBvZiB0aGUgRVAgY29uZmlnIHJlZ2lzdGVyICov CisJaWYgKG1heHBhY2tldCA8IDEwMjQpCisJCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfU0VUX01B WF9QS1QobWF4cGFja2V0KTsKKwlpZiAoIWVwLT5lcG4uaXNfaW4pCisJCWVwX2NvbmYgfD0gVkhV Ql9FUF9DRkdfRElSX09VVDsKKwllcF9jb25mIHw9IFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0odXNi X2VuZHBvaW50X251bShkZXNjKSk7CisJZXBfY29uZiB8PSBWSFVCX0VQX0NGR19FTkFCTEU7CisJ ZXBfY29uZiB8PSBWSFVCX0VQX0NGR19TRVRfREVWKGRldi0+aW5kZXggKyAxKTsKKwlFUFZEQkco ZXAsICJjb25maWc9JTA4eFxuIiwgZXBfY29uZik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1 Yi0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSBIVyBhbmQgcmVzZXQgRE1BICovCisJd3Jp dGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisJd3JpdGVsKFZIVUJf RVBfRE1BX0NUUkxfUkVTRVQsCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RN QV9DVExTVEFUKTsKKworCS8qIENvbmZpZ3VyZSBhbmQgZW5hYmxlICovCisJd3JpdGVsKGVwX2Nv bmYsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisKKwlpZiAoZXAtPmVwbi5k ZXNjX21vZGUpIHsKKwkJLyogQ2xlYXIgRE1BIHN0YXR1cywgaW5jbHVkaW5nIHRoZSBETUEgcmVh ZCBwdHIgKi8KKwkJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RB VFVTKTsKKworCQkvKiBTZXQgZGVzY3JpcHRvciBiYXNlICovCisJCXdyaXRlbChlcC0+ZXBuLmRl c2NzX2RtYSwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfQkFTRSk7 CisKKwkJLyogU2V0IGJhc2UgRE1BIGNvbmZpZyB2YWx1ZSAqLworCQllcC0+ZXBuLmRtYV9jb25m ID0gVkhVQl9FUF9ETUFfREVTQ19NT0RFOworCQlpZiAoZXAtPmVwbi5pc19pbiAmJiAhdmh1Yi0+ bm9fbGFyZ2Vfc2VuZHMpCisJCQllcC0+ZXBuLmRtYV9jb25mIHw9IFZIVUJfRVBfRE1BX0lOX0xP TkdfTU9ERTsKKworCQkvKiBGaXJzdCByZXNldCBhbmQgZGlzYWJsZSBhbGwgb3BlcmF0aW9ucyAq LworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiB8IFZIVUJfRVBfRE1BX0NUUkxfUkVTRVQsCisJ CSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisKKwkJLyog RW5hYmxlIGRlc2NyaXB0b3IgbW9kZSAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiwKKwkJ ICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKwl9IGVsc2Ug eworCQkvKiBTZXQgYmFzZSBETUEgY29uZmlnIHZhbHVlICovCisJCWVwLT5lcG4uZG1hX2NvbmYg PSBWSFVCX0VQX0RNQV9TSU5HTEVfU1RBR0U7CisKKwkJLyogUmVzZXQgYW5kIHN3aXRjaCB0byBz aW5nbGUgc3RhZ2UgbW9kZSAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiB8IFZIVUJfRVBf RE1BX0NUUkxfUkVTRVQsCisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFf Q1RMU1RBVCk7CisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mLAorCQkgICAgICAgZXAtPmVwbi5y ZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCQl3cml0ZWwoMCwgZXAtPmVwbi5yZWdz ICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCX0KKworCS8qIENsZWFudXAgZGF0YSB0b2dn bGUganVzdCBpbiBjYXNlICovCisJd3JpdGVsKFZIVUJfRVBfVE9HR0xFX1NFVF9FUE5VTShlcC0+ ZXBuLmdfaWR4KSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX1RPR0dMRSk7CisK KwkvKiBDbGVhbnVwIGFuZCBlbmFibGUgQUNLIGludGVycnVwdCAqLworCWltYXNrID0gMSA8PCBl cC0+ZXBuLmdfaWR4OworCXdyaXRlbChpbWFzaywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FD S19JU1IpOworCWVwX2llciA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVS KTsKKwllcF9pZXIgfD0gaW1hc2s7CisJd3JpdGVsKGVwX2llciwgdmh1Yi0+cmVncyArIEFTVF9W SFVCX0VQX0FDS19JRVIpOworCisJLyogV29vdCwgd2UgYXJlIG9ubGluZSAhICovCisJZXAtPmVw bi5lbmFibGVkID0gdHJ1ZTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ss IGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5fZGlz cG9zZShzdHJ1Y3QgdXNiX2VwICp1X2VwKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0 b19hc3RfZXAodV9lcCk7CisKKwlpZiAoV0FSTl9PTighZXAtPmRldiB8fCAhZXAtPmRfaWR4KSkK KwkJcmV0dXJuOworCisJRVBEQkcoZXAsICJSZWxlYXNpbmcgZW5kcG9pbnRcbiIpOworCisJLyog VGFrZSBpdCBvdXQgb2YgdGhlIEVQIGxpc3QgKi8KKwlsaXN0X2RlbF9pbml0KCZlcC0+ZXAuZXBf bGlzdCk7CisKKwkvKiBNYXJrIHRoZSBhZGRyZXNzIGZyZWUgaW4gdGhlIGRldmljZSAqLworCWVw LT5kZXYtPmVwbnNbZXAtPmRfaWR4IC0gMV0gPSBOVUxMOworCisJLyogRnJlZSBuYW1lICYgRE1B IGJ1ZmZlcnMgKi8KKwlrZnJlZShlcC0+ZXAubmFtZSk7CisJZXAtPmVwLm5hbWUgPSBOVUxMOwor CWRtYV9mcmVlX2NvaGVyZW50KCZlcC0+dmh1Yi0+cGRldi0+ZGV2LAorCQkJICBBU1RfVkhVQl9F UG5fTUFYX1BBQ0tFVCArCisJCQkgIDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCSAgZXAt PmJ1ZiwgZXAtPmJ1Zl9kbWEpOworCWVwLT5idWYgPSBOVUxMOworCWVwLT5lcG4uZGVzY3MgPSBO VUxMOworCisJLyogTWFyayBmcmVlICovCisJZXAtPmRldiA9IE5VTEw7Cit9CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3QgdXNiX2VwX29wcyBhc3Rfdmh1Yl9lcG5fb3BzID0geworCS5lbmFibGUJCT0g YXN0X3ZodWJfZXBuX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGFzdF92aHViX2Vwbl9kaXNhYmxlLAor CS5kaXNwb3NlCT0gYXN0X3ZodWJfZXBuX2Rpc3Bvc2UsCisJLnF1ZXVlCQk9IGFzdF92aHViX2Vw bl9xdWV1ZSwKKwkuZGVxdWV1ZQk9IGFzdF92aHViX2Vwbl9kZXF1ZXVlLAorCS5zZXRfaGFsdAk9 IGFzdF92aHViX2Vwbl9zZXRfaGFsdCwKKwkuc2V0X3dlZGdlCT0gYXN0X3ZodWJfZXBuX3NldF93 ZWRnZSwKKwkuYWxsb2NfcmVxdWVzdAk9IGFzdF92aHViX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVf cmVxdWVzdAk9IGFzdF92aHViX2ZyZWVfcmVxdWVzdCwKK307CisKK3N0cnVjdCBhc3Rfdmh1Yl9l cCAqYXN0X3ZodWJfYWxsb2NfZXBuKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsIHU4IGFkZHIpCit7 CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAg KmVwOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBGaW5kIGEgZnJlZSBv bmUgKG5vIGRldmljZSkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3Mp OworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKQorCQlpZiAodmh1 Yi0+ZXBuc1tpXS5kZXYgPT0gTlVMTCkKKwkJCWJyZWFrOworCWlmIChpID49IEFTVF9WSFVCX05V TV9HRU5fRVBzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdz KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogU2V0IGl0IHVwICovCisJZXAgPSAmdmh1Yi0+ ZXBuc1tpXTsKKwllcC0+ZGV2ID0gZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5s b2NrLCBmbGFncyk7CisKKwlEREJHKGQsICJBbGxvY2F0aW5nIGdlbiBFUCAlZCBmb3IgYWRkciAl ZFxuIiwgaSwgYWRkcik7CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5xdWV1ZSk7CisJZXAtPmRfaWR4 ID0gYWRkcjsKKwllcC0+dmh1YiA9IHZodWI7CisJZXAtPmVwLm9wcyA9ICZhc3Rfdmh1Yl9lcG5f b3BzOworCWVwLT5lcC5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJlcCVkIiwgYWRkcik7 CisJZC0+ZXBuc1thZGRyLTFdID0gZXA7CisJZXAtPmVwbi5nX2lkeCA9IGk7CisJZXAtPmVwbi5y ZWdzID0gdmh1Yi0+cmVncyArIDB4MjAwICsgKGkgKiAweDEwKTsKKworCWVwLT5idWYgPSBkbWFf YWxsb2NfY29oZXJlbnQoJnZodWItPnBkZXYtPmRldiwKKwkJCQkgICAgIEFTVF9WSFVCX0VQbl9N QVhfUEFDS0VUICsKKwkJCQkgICAgIDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCQkgICAg ICZlcC0+YnVmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlcC0+YnVmKSB7CisJCWtmcmVlKGVw LT5lcC5uYW1lKTsKKwkJZXAtPmVwLm5hbWUgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisJ ZXAtPmVwbi5kZXNjcyA9IGVwLT5idWYgKyBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVDsKKwllcC0+ ZXBuLmRlc2NzX2RtYSA9IGVwLT5idWZfZG1hICsgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQ7CisK Kwl1c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmZXAtPmVwLCBBU1RfVkhVQl9FUG5fTUFYX1BB Q0tFVCk7CisJbGlzdF9hZGRfdGFpbCgmZXAtPmVwLmVwX2xpc3QsICZkLT5nYWRnZXQuZXBfbGlz dCk7CisJZXAtPmVwLmNhcHMudHlwZV9pc28gPSB0cnVlOworCWVwLT5lcC5jYXBzLnR5cGVfYnVs ayA9IHRydWU7CisJZXAtPmVwLmNhcHMudHlwZV9pbnQgPSB0cnVlOworCWVwLT5lcC5jYXBzLmRp cl9pbiA9IHRydWU7CisJZXAtPmVwLmNhcHMuZGlyX291dCA9IHRydWU7CisKKwlyZXR1cm4gZXA7 Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5j IGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmYxMjQ4NjMzMWZlMgotLS0gL2Rldi9udWxsCisr KyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvaHViLmMKQEAgLTAsMCArMSw4 MjIgQEAKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIi IFVTQiBnYWRnZXQKKyAqCisgKiBodWIuYyAtIHZpcnR1YWwgaHViIGhhbmRsaW5nCisgKgorICog Q29weXJpZ2h0IDIwMTcgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZy ZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lv biAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVy c2lvbi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgv bW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8 bGludXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51 eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0 Lmg+CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19m cy5oPgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+ CisjaW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+Cisj aW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2lu Y2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5j bHVkZSA8bGludXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUg PGxpbnV4L3VzYi9oY2QuaD4KKworI2luY2x1ZGUgInZodWIuaCIKKworLyogdXNiIDIuMCBodWIg ZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisgKiBBIGZldyB0aGluZ3Mgd2UgbWF5IHdhbnQgdG8gaW1w cm92ZSBoZXJlOgorICoKKyAqICAgIC0gV2UgbWF5IG5lZWQgdG8gaW5kaWNhdGUgVFQgc3VwcG9y dAorICogICAgLSBXZSBtYXkgbmVlZCBhIGRldmljZSBxdWFsaWZpZXIgZGVzY3JpcHRvcgorICog ICAgICBhcyBkZXZpY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIHVzYjEgb3IgMgorICogICAgLSBNYWtl IHZpZC9kaWQgb3ZlcnJpZGFibGUKKyAqICAgIC0gbWFrZSBpdCBsb29rIGxpa2UgdXNiMSBpZiB1 c2IxIG1vZGUgZm9yY2VkCisgKi8KKyNkZWZpbmUgS0VSTkVMX1JFTAliaW4yYmNkKCgoTElOVVhf VkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4MGZmKSkKKyNkZWZpbmUgS0VSTkVMX1ZFUgliaW4yYmNk KCgoTElOVVhfVkVSU0lPTl9DT0RFID4+IDgpICYgMHgwZmYpKQorCitlbnVtIHsKKwlBU1RfVkhV Ql9TVFJfTUFOVUYgPSAzLAorCUFTVF9WSFVCX1NUUl9QUk9EVUNUID0gMiwKKwlBU1RfVkhVQl9T VFJfU0VSSUFMID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9kZXNj cmlwdG9yIGFzdF92aHViX2Rldl9kZXNjID0geworCS5iTGVuZ3RoCQk9IFVTQl9EVF9ERVZJQ0Vf U0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0RFVklDRSwKKwkuYmNkVVNCCQkJPSBj cHVfdG9fbGUxNigweDAyMDApLAorCS5iRGV2aWNlQ2xhc3MJCT0gVVNCX0NMQVNTX0hVQiwKKwku YkRldmljZVN1YkNsYXNzCT0gMCwKKwkuYkRldmljZVByb3RvY29sCT0gMSwKKwkuYk1heFBhY2tl dFNpemUwCT0gNjQsCisJLmlkVmVuZG9yCSAgICAgICAJPSBjcHVfdG9fbGUxNigweDFkNmIpLAor CS5pZFByb2R1Y3QJCT0gY3B1X3RvX2xlMTYoMHgwMTA3KSwKKwkuYmNkRGV2aWNlCQk9IGNwdV90 b19sZTE2KDB4MDEwMCksCisJLmlNYW51ZmFjdHVyZXIJCT0gQVNUX1ZIVUJfU1RSX01BTlVGLAor CS5pUHJvZHVjdAkJPSBBU1RfVkhVQl9TVFJfUFJPRFVDVCwKKwkuaVNlcmlhbE51bWJlcgkJPSBB U1RfVkhVQl9TVFJfU0VSSUFMLAorCS5iTnVtQ29uZmlndXJhdGlvbnMJPSAxLAorfTsKKworLyog UGF0Y2hlcyB0byB0aGUgYWJvdmUgd2hlbiBmb3JjaW5nIFVTQjEgbW9kZSAqLworc3RhdGljIHZv aWQgYXN0X3ZodWJfcGF0Y2hfZGV2X2Rlc2NfdXNiMShzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlw dG9yICpkZXNjKQoreworCWRlc2MtPmJjZFVTQiA9IGNwdV90b19sZTE2KDB4MDEwMCk7CisJZGVz Yy0+YkRldmljZVByb3RvY29sID0gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gZGVzY3Jp cHRvcjogc2FtZSBjb21tZW50cyBhcyBhYm92ZQorICogcmVnYXJkaW5nIGhhbmRsaW5nIFVTQjEg bW9kZS4KKyAqLworCisvKgorICogV2UgZG9uJ3QgdXNlIHNpemVvZigpIGFzIExpbnV4IGRlZmlu aXRpb24gb2YKKyAqIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBjb250YWlucyAyCisg KiBleHRyYSBieXRlcworICovCisjZGVmaW5lIEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFCShVU0Jf RFRfQ09ORklHX1NJWkUgKyBcCisJCQkJIFVTQl9EVF9JTlRFUkZBQ0VfU0laRSArIFwKKwkJCQkg VVNCX0RUX0VORFBPSU5UX1NJWkUpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXN0X3ZodWJfZnVs bF9jZGVzYyB7CisJc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvcgljZmc7CisJc3RydWN0IHVz Yl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3Jp cHRvcgllcDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFzdF92aHViX2NvbmZfZGVzYyA9 IHsKKwkuY2ZnID0geworCQkuYkxlbmd0aAkJPSBVU0JfRFRfQ09ORklHX1NJWkUsCisJCS5iRGVz Y3JpcHRvclR5cGUJPSBVU0JfRFRfQ09ORklHLAorCQkud1RvdGFsTGVuZ3RoCQk9IGNwdV90b19s ZTE2KEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFKSwKKwkJLmJOdW1JbnRlcmZhY2VzCQk9IDEsCisJ CS5iQ29uZmlndXJhdGlvblZhbHVlCT0gMSwKKwkJLmlDb25maWd1cmF0aW9uCQk9IDAsCisJCS5i bUF0dHJpYnV0ZXMJCT0gVVNCX0NPTkZJR19BVFRfT05FIHwKKwkJCQkJICBVU0JfQ09ORklHX0FU VF9TRUxGUE9XRVIgfAorCQkJCQkgIFVTQl9DT05GSUdfQVRUX1dBS0VVUCwKKwkJLmJNYXhQb3dl cgkJPSAwLAorCX0sCisJLmludGYgPSB7CisJCS5iTGVuZ3RoCQk9IFVTQl9EVF9JTlRFUkZBQ0Vf U0laRSwKKwkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCS5iSW50ZXJm YWNlTnVtYmVyCT0gMCwKKwkJLmJBbHRlcm5hdGVTZXR0aW5nCT0gMCwKKwkJLmJOdW1FbmRwb2lu dHMJCT0gMSwKKwkJLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19IVUIsCisJCS5iSW50ZXJm YWNlU3ViQ2xhc3MJPSAwLAorCQkuYkludGVyZmFjZVByb3RvY29sCT0gMCwKKwkJLmlJbnRlcmZh Y2UJCT0gMCwKKwl9LAorCS5lcCA9IHsKKwkJLmJMZW5ndGgJCT0gVVNCX0RUX0VORFBPSU5UX1NJ WkUsCisJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQsCisJCS5iRW5kcG9pbnRB ZGRyZXNzCT0gMHg4MSwKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQs CisJCS53TWF4UGFja2V0U2l6ZQkJPSBjcHVfdG9fbGUxNigxKSwKKwkJLmJJbnRlcnZhbAkJPSAw eDBjLAorCX0sCit9OworCisjZGVmaW5lIEFTVF9WSFVCX0hVQl9ERVNDX1NJWkUJKFVTQl9EVF9I VUJfTk9OVkFSX1NJWkUgKyAyKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9odWJfZGVzY3Jp cHRvciBhc3Rfdmh1Yl9odWJfZGVzYyA9IHsKKwkuYkRlc2NMZW5ndGgJCQk9IEFTVF9WSFVCX0hV Ql9ERVNDX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlwZQkJPSBVU0JfRFRfSFVCLAorCS5iTmJyUG9y dHMJCQk9IEFTVF9WSFVCX05VTV9QT1JUUywKKwkud0h1YkNoYXJhY3RlcmlzdGljcwkJPSBjcHVf dG9fbGUxNihIVUJfQ0hBUl9OT19MUFNNKSwKKwkuYlB3ck9uMlB3ckdvb2QJCQk9IDEwLAorCS5i SHViQ29udHJDdXJyZW50CQk9IDAsCisJLnUuaHMuRGV2aWNlUmVtb3ZhYmxlWzBdCT0gMCwKKwku dS5ocy5EZXZpY2VSZW1vdmFibGVbMV0JPSAweGZmLAorfTsKKworc3RhdGljIGludCBhc3Rfdmh1 Yl9odWJfZGV2X3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3SW5k ZXgsIHUxNiB3VmFsdWUpCit7CisJdTggc3QwOworCisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGRl dilcbiIpOworCisJLyoKKwkgKiBNYXJrIGl0IGFzIHNlbGYtcG93ZXJlZCwgSSBkb3VidCB0aGUg Qk1DIGlzIHBvd2VyZWQgb2ZmCisJICogdGhlIFVTQiBidXMgLi4uCisJICovCisJc3QwID0gMSA8 PCBVU0JfREVWSUNFX1NFTEZfUE9XRVJFRDsKKworCS8qCisJICogTmVlZCB0byBkb3VibGUgY2hl Y2sgaG93IHJlbW90ZSB3YWtldXAgYWN0dWFsbHkgd29ya3MKKwkgKiBvbiB0aGF0IGNoaXAgYW5k IHdoYXQgdHJpZ2dlcnMgaXQuCisJICovCisJaWYgKGVwLT52aHViLT53YWtldXBfZW4pCisJCXN0 MCB8PSAxIDw8IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDsKKworCXJldHVybiBhc3Rfdmh1Yl9z aW1wbGVfcmVwbHkoZXAsIHN0MCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2Vw X3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgdTE2IHdJbmRleCwgdTE2IHdW YWx1ZSkKK3sKKwlpbnQgZXBfbnVtOworCXU4IHN0MCA9IDA7CisKKwllcF9udW0gPSB3SW5kZXgg JiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGVwJWQp XG4iLCBlcF9udW0pOworCisJLyogT24gdGhlIGh1YiB3ZSBoYXZlIG9ubHkgRVAgMCBhbmQgMSAq LworCWlmIChlcF9udW0gPT0gMSkgeworCQlpZiAoZXAtPnZodWItPmVwMV9zdGFsbGVkKQorCQkJ c3QwIHw9IDEgPDwgVVNCX0VORFBPSU5UX0hBTFQ7CisJfSBlbHNlIGlmIChlcF9udW0gIT0gMCkK KwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5 KGVwLCBzdDAsIDApOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2h1Yl9kZXZfZmVhdHVyZShz dHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLAor CQkJCSAgICBib29sIGlzX3NldCkKK3sKKwlFUERCRyhlcCwgIiVzX0ZFQVRVUkUoZGV2IHZhbD0l MDJ4KVxuIiwKKwkgICAgICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIHdWYWx1ZSk7CisKKwlp ZiAod1ZhbHVlICE9IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkKKwkJcmV0dXJuIHN0ZF9yZXFf c3RhbGw7CisKKwllcC0+dmh1Yi0+d2FrZXVwX2VuID0gaXNfc2V0OworCUVQREJHKGVwLCAiSHVi IHJlbW90ZSB3YWtldXAgJXNcbiIsCisJICAgICAgaXNfc2V0ID8gImVuYWJsZWQiIDogImRpc2Fi bGVkIik7CisKKwlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKK30KKworc3RhdGljIGludCBhc3Rf dmh1Yl9odWJfZXBfZmVhdHVyZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3 SW5kZXgsIHUxNiB3VmFsdWUsCisJCQkJICAgYm9vbCBpc19zZXQpCit7CisJaW50IGVwX251bTsK Kwl1MzIgcmVnOworCisJZXBfbnVtID0gd0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNL OworCUVQREJHKGVwLCAiJXNfRkVBVFVSRShlcCVkIHZhbD0lMDJ4KVxuIiwKKwkgICAgICBpc19z ZXQgPyAiU0VUIiA6ICJDTEVBUiIsIGVwX251bSwgd1ZhbHVlKTsKKworCWlmIChlcF9udW0gPiAx KQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAod1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9I QUxUKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAoZXBfbnVtID09IDApCisJCXJldHVy biBzdGRfcmVxX2NvbXBsZXRlOworCisJRVBEQkcoZXAsICIlcyBzdGFsbCBvbiBFUCAxXG4iLAor CSAgICAgIGlzX3NldCA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIpOworCisJZXAtPnZodWItPmVw MV9zdGFsbGVkID0gaXNfc2V0OworCXJlZyA9IHJlYWRsKGVwLT52aHViLT5yZWdzICsgQVNUX1ZI VUJfRVAxX0NUUkwpOworCWlmIChpc19zZXQpIHsKKwkJcmVnIHw9IFZIVUJfRVAxX0NUUkxfU1RB TEw7CisJfSBlbHNlIHsKKwkJcmVnICY9IH5WSFVCX0VQMV9DVFJMX1NUQUxMOworCQlyZWcgfD0g VkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEU7CisJfQorCXdyaXRlbChyZWcsIGVwLT52aHViLT5y ZWdzICsgQVNUX1ZIVUJfRVAxX0NUUkwpOworCisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9 CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfcmVwX2Rlc2Moc3RydWN0IGFzdF92aHViX2VwICplcCwK KwkJCSAgICAgdTggZGVzY190eXBlLCB1MTYgbGVuKQoreworCWNvbnN0IHZvaWQgKmRlc2M7CisJ c2l6ZV90IGRzaXplOworCisJRVBEQkcoZXAsICJHRVRfREVTQ1JJUFRPUih0eXBlOiVkKVxuIiwg ZGVzY190eXBlKTsKKwlzd2l0Y2goZGVzY190eXBlKSB7CisJY2FzZSBVU0JfRFRfREVWSUNFOgor CQlkZXNjID0gJmFzdF92aHViX2Rldl9kZXNjOworCQlkc2l6ZSA9IFVTQl9EVF9ERVZJQ0VfU0la RTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRFRfQ09ORklHOgorCQlkZXNjID0gJmFzdF92aHViX2Nv bmZfZGVzYzsKKwkJZHNpemUgPSBBU1RfVkhVQl9DT05GX0RFU0NfU0laRTsKKwkJYnJlYWs7CisJ Y2FzZSBVU0JfRFRfSFVCOgorCQlkZXNjID0gJmFzdF92aHViX2h1Yl9kZXNjOworCQlkc2l6ZSA9 IEFTVF9WSFVCX0hVQl9ERVNDX1NJWkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBz dGRfcmVxX3N0YWxsOworCX0KKwlpZiAoZHNpemUgPCBsZW4pCisJCWxlbiA9IGRzaXplOworCS8q CisJICogVGhpcyBpcyBvdXIgbGltaXQgZm9yIGh1YiByZXBsaWVzIGluIG91ciBjdXJyZW50CisJ ICogaW1wbGVtZW50YXRpb24sIGtlZXBzIHRoaW5ncyBzaW1wbGVyLgorCSAqLworCWlmIChXQVJO X09OKGxlbiA+PSBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCkpCisJCWxlbiA9IEFTVF9WSFVCX0VQ MF9NQVhfUEFDS0VUIC0gMTsKKworCS8qCisJICogQ29weSBmaXJzdCB0byBFUCBidWZmZXIgYW5k IHNlbmQgZnJvbSB0aGVyZSwgc28KKwkgKiB3ZSBjYW4gZG8gc29tZSBpbi1wbGFjZSBwYXRjaGlu ZyBpZiBuZWVkZWQKKwkgKi8KKwltZW1jcHkoZXAtPmJ1ZiwgZGVzYywgbGVuKTsKKworCS8qIFBh dGNoIGl0IGlmIGZvcmNpbmcgVVNCMSAqLworCWlmIChkZXNjX3R5cGUgPT0gVVNCX0RUX0RFVklD RSAmJiBlcC0+dmh1Yi0+Zm9yY2VfdXNiMSkKKwkJYXN0X3ZodWJfcGF0Y2hfZGV2X2Rlc2NfdXNi MShlcC0+YnVmKTsKKworCS8qIFNob290IGl0IGZyb20gdGhlIEVQIGJ1ZmZlciAqLworCXJldHVy biBhc3Rfdmh1Yl9yZXBseShlcCwgTlVMTCwgbGVuKTsKK30KKworLyogY29waWVkIGZyb20gaGRj LmMgKi8KK3N0YXRpYyB1bnNpZ25lZAorYXNjaWkyZGVzYyhjaGFyIGNvbnN0ICpzLCB1OCAqYnVm LCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQgbiwgdCA9IDIgKyAyKnN0cmxlbihzKTsKKwor CWlmICh0ID4gMjU0KQorCQl0ID0gMjU0OwkvKiBMb25nZXN0IHBvc3NpYmxlIFVURiBzdHJpbmcg ZGVzY3JpcHRvciAqLworCWlmIChsZW4gPiB0KQorCQlsZW4gPSB0OworCisJdCArPSBVU0JfRFRf U1RSSU5HIDw8IDg7CS8qIE5vdyB0IGlzIGZpcnN0IDE2IGJpdHMgdG8gc3RvcmUgKi8KKworCW4g PSBsZW47CisJd2hpbGUgKG4tLSkgeworCQkqYnVmKysgPSB0OworCQlpZiAoIW4tLSkKKwkJCWJy ZWFrOworCQkqYnVmKysgPSB0ID4+IDg7CisJCXQgPSAodW5zaWduZWQgY2hhcikqcysrOworCX0K KwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3JlcF9zdHJpbmcoc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAgICB1OCBzdHJpbmdfaWQsIHUxNiBsYW5nX2lkLAor CQkJICAgICAgIHUxNiBsZW4pCit7CisJc3RhdGljIGNoYXIgY29uc3QgbGFuZ2lkc1s0XSA9IHs0 LCBVU0JfRFRfU1RSSU5HLCAweDA5LCAweDA0fTsKKworCXN3aXRjaCAoc3RyaW5nX2lkKSB7CisJ Y2FzZSAwOiAvKiBMYW5ndWFnZSBJRHMgYXJyYXkgKi8KKwkJaWYgKGxlbiA+IDQpCisJCQlsZW4g PSA0OworCQltZW1jcHkoZXAtPmJ1ZiwgbGFuZ2lkcywgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBB U1RfVkhVQl9TVFJfU0VSSUFMOgorCQlsZW4gPSBhc2NpaTJkZXNjKCIwMDAwMDAwMCIsIGVwLT5i dWYsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQVNUX1ZIVUJfU1RSX1BST0RVQ1Q6CisJCWxlbiA9 IGFzY2lpMmRlc2MoIlVTQiBWaXJ0dWFsIEh1YiIsIGVwLT5idWYsIGxlbik7CisJCWJyZWFrOwor CWNhc2UgQVNUX1ZIVUJfU1RSX01BTlVGOgorCQlsZW4gPSBhc2NpaTJkZXNjKCJBc3BlZWQiLCBl cC0+YnVmLCBsZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3RkX3JlcV9zdGFs bDsKKwl9CisKKwkvKiBTaG9vdCBpdCBmcm9tIHRoZSBFUCBidWZmZXIgKi8KKwlyZXR1cm4gYXN0 X3ZodWJfcmVwbHkoZXAsIE5VTEwsIGxlbik7Cit9CisKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1 Yl9zdGRfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJIHN0cnVjdCB1 c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1 YjsKKwl1MTYgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2Nw dShjcnEtPndWYWx1ZSk7CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdM ZW5ndGggPSBsZTE2X3RvX2NwdShjcnEtPndMZW5ndGgpOworCisJLyogRmlyc3QgcGFja2V0LCBn cmFiIHNwZWVkICovCisJaWYgKHZodWItPnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJ CXUzMiB1c3RhdCA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9VU0JTVFMpOworCQlpZiAo dXN0YXQgJiBWSFVCX1VTQlNUU19ISVNQRUVEKQorCQkJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURf SElHSDsKKwkJZWxzZQorCQkJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKKwkJVURDREJH KHZodWIsICJVU0Igc3RhdHVzPSUwOHggc3BlZWQ9JXNcbiIsIHVzdGF0LAorCQkgICAgICAgdmh1 Yi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0ggPyAiaGlnaCIgOiAiZnVsbCIpOworCX0KKworCXN3 aXRjaCAoKGNycS0+YlJlcXVlc3RUeXBlIDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgeworCQkvKiBT RVRfQUREUkVTUyAqLworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0FERFJF U1M6CisJCUVQREJHKGVwLCAiU0VUX0FERFJFU1M6IEdvdCBhZGRyZXNzICV4XG4iLCB3VmFsdWUp OworCQl3cml0ZWwod1ZhbHVlLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ09ORik7CisJCXJldHVy biBzdGRfcmVxX2NvbXBsZXRlOworCisJCS8qIEdFVF9TVEFUVVMgKi8KKwljYXNlIERldmljZVJl cXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X3N0 YXR1cyhlcCwgd0luZGV4LCB3VmFsdWUpOworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8IFVTQl9S RVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCk7 CisJY2FzZSBFbmRwb2ludFJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBh c3Rfdmh1Yl9odWJfZXBfc3RhdHVzKGVwLCB3SW5kZXgsIHdWYWx1ZSk7CisKKwkJLyogU0VUL0NM RUFSX0ZFQVRVUkUgKi8KKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9GRUFU VVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfaHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1 ZSwgdHJ1ZSk7CisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJF OgorCQlyZXR1cm4gYXN0X3ZodWJfaHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwg ZmFsc2UpOworCWNhc2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToK KwkJcmV0dXJuIGFzdF92aHViX2h1Yl9lcF9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1 ZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJ CXJldHVybiBhc3Rfdmh1Yl9odWJfZXBfZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUsIGZhbHNl KTsKKworCQkvKiBHRVQvU0VUX0NPTkZJR1VSQVRJT04gKi8KKwljYXNlIERldmljZVJlcXVlc3Qg fCBVU0JfUkVRX0dFVF9DT05GSUdVUkFUSU9OOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3Jl cGx5KGVwLCAxKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9DT05GSUdV UkFUSU9OOgorCQlpZiAod1ZhbHVlICE9IDEpCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJ cmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX0RFU0NSSVBUT1IgKi8KKwljYXNl IERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9ERVNDUklQVE9SOgorCQlzd2l0Y2ggKHdWYWx1 ZSA+PiA4KSB7CisJCWNhc2UgVVNCX0RUX0RFVklDRToKKwkJY2FzZSBVU0JfRFRfQ09ORklHOgor CQkJcmV0dXJuIGFzdF92aHViX3JlcF9kZXNjKGVwLCB3VmFsdWUgPj4gOCwKKwkJCQkJCSB3TGVu Z3RoKTsKKwkJY2FzZSBVU0JfRFRfU1RSSU5HOgorCQkJcmV0dXJuIGFzdF92aHViX3JlcF9zdHJp bmcoZXAsIHdWYWx1ZSAmIDB4ZmYsCisJCQkJCQkgICB3SW5kZXgsIHdMZW5ndGgpOworCQl9CisJ CXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJCS8qIEdFVC9TRVRfSU5URVJGQUNFICovCisJY2Fz ZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfSU5URVJGQUNFOgorCQlyZXR1cm4gYXN0X3Zo dWJfc2ltcGxlX3JlcGx5KGVwLCAwKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVR X1NFVF9JTlRFUkZBQ0U6CisJCWlmICh3VmFsdWUgIT0gMCB8fCB3SW5kZXggIT0gMCkKKwkJCXJl dHVybiBzdGRfcmVxX3N0YWxsOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0 dXJuIHN0ZF9yZXFfc3RhbGw7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3VwZGF0ZV9odWJf ZXAxKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHBvcnQpCit7 CisJLyogVXBkYXRlIEhXIEVQMSByZXNwb25zZSAqLworCXUzMiByZWcgPSByZWFkbCh2aHViLT5y ZWdzICsgQVNUX1ZIVUJfRVAxX1NUU19DSEcpOworCXUzMiBwbWFzayA9ICgxIDw8IChwb3J0ICsg MSkpOworCWlmICh2aHViLT5wb3J0c1twb3J0XS5jaGFuZ2UpCisJCXJlZyB8PSBwbWFzazsKKwll bHNlCisJCXJlZyAmPSB+cG1hc2s7CisJd3JpdGVsKHJlZywgdmh1Yi0+cmVncyArIEFTVF9WSFVC X0VQMV9TVFNfQ0hHKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3Rh dChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnQsCisJ CQkJICAgICAgdTE2IGNscl9mbGFncywKKwkJCQkgICAgICB1MTYgc2V0X2ZsYWdzLAorCQkJCSAg ICAgIGJvb2wgc2V0X2MpCit7CisJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9y dHNbcG9ydF07CisJdTE2IHByZXY7CisKKwkvKiBVcGRhdGUgcG9ydCBzdGF0dXMgKi8KKwlwcmV2 ID0gcC0+c3RhdHVzOworCXAtPnN0YXR1cyA9IChwcmV2ICYgfmNscl9mbGFncykgfCBzZXRfZmxh Z3M7CisJRERCRygmcC0+ZGV2LCAicG9ydCAlZCBzdGF0dXMgJTA0eCAtPiAlMDR4IChDPSVkKVxu IiwKKwkgICAgIHBvcnQgKyAxLCBwcmV2LCBwLT5zdGF0dXMsIHNldF9jKTsKKworCS8qIFVwZGF0 ZSBjaGFuZ2UgYml0cyBpZiBuZWVkZWQgKi8KKwlpZiAoc2V0X2MpIHsKKwkJdTE2IGNoZyA9IHAt PnN0YXR1cyBeIHByZXY7CisKKwkJLyogT25seSB0aGVzZSBhcmUgcmVsZXZhbnQgZm9yIGNoYW5n ZSAqLworCQljaGcgJj0gVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gfAorCQkgICAgICAgVVNC X1BPUlRfU1RBVF9DX0VOQUJMRSB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8 CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfT1ZFUkNVUlJFTlQgfAorCQkgICAgICAgVVNCX1BP UlRfU1RBVF9DX1JFU0VUIHwKKwkJICAgICAgIFVTQl9QT1JUX1NUQVRfQ19MMTsKKwkJcC0+Y2hh bmdlIHw9IGNoZzsKKworCQlhc3Rfdmh1Yl91cGRhdGVfaHViX2VwMSh2aHViLCBwb3J0KTsKKwl9 Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3NlbmRfaG9zdF93YWtldXAoc3RydWN0IGFzdF92 aHViICp2aHViKQoreworCXUzMiByZWcgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RS TCk7CisJVURDREJHKHZodWIsICJXYWtpbmcgdXAgaG9zdCAhXG4iKTsKKwlyZWcgfD0gVkhVQl9D VFJMX01BTlVBTF9SRU1PVEVfV0FLRVVQOworCXdyaXRlbChyZWcsIHZodWItPnJlZ3MgKyBBU1Rf VkhVQl9DVFJMKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIsCisJCQkgICAgIHVuc2lnbmVkIGludCBwb3J0LCBib29sIG9uKQoreworCWlm IChvbikKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LCAwLAorCQkJCQkg IFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTiwgdHJ1ZSk7CisJZWxzZQorCQlhc3Rfdmh1Yl9jaGFu Z2VfcG9ydF9zdGF0KHZodWIsIHBvcnQsCisJCQkJCSAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9O IHwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX0VOQUJMRSwKKwkJCQkJICAwLCB0cnVlKTsKKworCS8q CisJICogSWYgdGhlIGh1YiBpcyBzZXQgdG8gd2FrdXAgdGhlIGhvc3Qgb24gY29ubmVjdGlvbiBl dmVudHMKKwkgKiB0aGVuIHNlbmQgYSB3YWtldXAuCisJICovCisJaWYgKHZodWItPndha2V1cF9l bikKKwkJYXN0X3ZodWJfc2VuZF9ob3N0X3dha2V1cCh2aHViKTsKK30KKworc3RhdGljIHZvaWQg YXN0X3ZodWJfd2FrZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qg YXN0X3ZodWIgKnZodWIgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJICAgICBzdHJ1Y3QgYXN0 X3ZodWIsCisJCQkJCSAgICAgd2FrZV93b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVu c2lnbmVkIGludCBpOworCisJLyoKKwkgKiBXYWtlIGFsbCBzbGVlcGluZyBwb3J0cy4gSWYgYSBw b3J0IGlzIHN1c3BlbmRlZCBieQorCSAqIHRoZSBob3N0IHN1c3BlbmQgKHdpdGhvdXQgZXhwbGlj aXQgc3RhdGUgc3VzcGVuZCksCisJICogd2UgbGV0IHRoZSBub3JtYWwgaG9zdCB3YWtlIHBhdGgg ZGVhbCB3aXRoIGl0IGxhdGVyLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9QT1JUUzsgaSsrKSB7CisJ CXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW2ldOworCisJCWlmICghKHAt PnN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfU1VTUEVORCkpCisJCQljb250aW51ZTsKKwkJYXN0X3Zo dWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBpLAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfU1VTUEVO RCwKKwkJCQkJICAwLCB0cnVlKTsKKwkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9 CisJYXN0X3ZodWJfc2VuZF9ob3N0X3dha2V1cCh2aHViKTsKKwlzcGluX3VubG9ja19pcnFyZXN0 b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3dha2VfYWxs KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwkvKgorCSAqIEEgZGV2aWNlIGlzIHRyeWluZyB0 byB3YWtlIHRoZSB3b3JsZCwgYmVjYXVzZSB0aGlzCisJICogY2FuIHJlY3Vyc2UgaW50byB0aGUg ZGV2aWNlLCB3ZSBicmVhayB0aGUgY2FsbCBjaGFpbgorCSAqIHVzaW5nIGEgd29yayBxdWV1ZQor CSAqLworCXNjaGVkdWxlX3dvcmsoJnZodWItPndha2Vfd29yayk7Cit9CisKK3N0YXRpYyB2b2lk IGFzdF92aHViX3BvcnRfcmVzZXQoc3RydWN0IGFzdF92aHViICp2aHViLCB1OCBwb3J0KQorewor CXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW3BvcnRdOworCXUxNiBzZXQs IGNsciwgc3BlZWQ7CisKKwkvKiBGaXJzdCBtYXJrIGRpc2FibGVkICovCisJYXN0X3ZodWJfY2hh bmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LAorCQkJCSAgVVNCX1BPUlRfU1RBVF9FTkFCTEUgfAor CQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQRU5ELAorCQkJCSAgVVNCX1BPUlRfU1RBVF9SRVNFVCwK KwkJCQkgIGZhbHNlKTsKKworCWlmICghcC0+ZGV2LmRyaXZlcikKKwkJcmV0dXJuOworCisJLyoK KwkgKiBUaGlzIHdpbGwgZWl0aGVyICJzdGFydCIgdGhlIHBvcnQgb3IgcmVzZXQgdGhlCisJICog ZGV2aWNlIGlmIGFscmVhZHkgc3RhcnRlZC4uLgorCSAqLworCWFzdF92aHViX2Rldl9yZXNldCgm cC0+ZGV2KTsKKworCS8qIEdyYWIgdGhlIHJpZ2h0IHNwZWVkICovCisJc3BlZWQgPSBwLT5kZXYu ZHJpdmVyLT5tYXhfc3BlZWQ7CisJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOIHx8IHNw ZWVkID4gdmh1Yi0+c3BlZWQpCisJCXNwZWVkID0gdmh1Yi0+c3BlZWQ7CisKKwlzd2l0Y2ggKHNw ZWVkKSB7CisJY2FzZSBVU0JfU1BFRURfTE9XOgorCQlzZXQgPSBVU0JfUE9SVF9TVEFUX0xPV19T UEVFRDsKKwkJY2xyID0gVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOworCQlicmVhazsKKwljYXNl IFVTQl9TUEVFRF9GVUxMOgorCQlzZXQgPSAwOworCQljbHIgPSBVU0JfUE9SVF9TVEFUX0xPV19T UEVFRCB8CisJCQlVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQ7CisJCWJyZWFrOworCWNhc2UgVVNC X1NQRUVEX0hJR0g6CisJCXNldCA9IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJY2xyID0g VVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVVEQ0RCRyh2 aHViLCAiVW5zdXBwb3J0ZWQgc3BlZWQgJWQgd2hlbiIKKwkJICAgICAgICIgY29ubmVjdGluZyBk ZXZpY2VcbiIsCisJCSAgICAgICBzcGVlZCk7CisJCXJldHVybjsKKwl9CisJY2xyIHw9IFVTQl9Q T1JUX1NUQVRfUkVTRVQ7CisJc2V0IHw9IFVTQl9QT1JUX1NUQVRfRU5BQkxFOworCisJLyogVGhp cyBzaG91bGQgaWRlYWxseSBiZSBkZWxheWVkIC4uLiAqLworCWFzdF92aHViX2NoYW5nZV9wb3J0 X3N0YXQodmh1YiwgcG9ydCwgY2xyLCBzZXQsIHRydWUpOworfQorCitzdGF0aWMgZW51bSBzdGRf cmVxX3JjIGFzdF92aHViX3NldF9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwK KwkJCQkJCSB1OCBwb3J0LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBl cC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwg cG9ydCA+IEFTVF9WSFVCX05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9y dC0tOworCXAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2Ug VVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFU X0VOQUJMRSkpCisJCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwkJYXN0X3ZodWJfY2hhbmdl X3BvcnRfc3RhdCh2aHViLCBwb3J0LAorCQkJCQkgIDAsIFVTQl9QT1JUX1NUQVRfU1VTUEVORCwK KwkJCQkJICBmYWxzZSk7CisJCWFzdF92aHViX2Rldl9zdXNwZW5kKCZwLT5kZXYpOworCQlyZXR1 cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCUVQREJH KGVwLCAiUG9ydCByZXNldCAhXG4iKTsKKwkJYXN0X3ZodWJfcG9ydF9yZXNldCh2aHViLCBwb3J0 KTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VS OgorCWNhc2UgVVNCX1BPUlRfRkVBVF9URVNUOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9JTkRJQ0FU T1I6CisJCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgKi8KKwkJcmV0dXJuIHN0 ZF9yZXFfY29tcGxldGU7CisJfQorCXJldHVybiBzdGRfcmVxX3N0YWxsOworfQorCitzdGF0aWMg ZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX2Nscl9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHVi X2VwICplcCwKKwkJCQkJCSB1OCBwb3J0LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIg KnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0 ID09IDAgfHwgcG9ydCA+IEFTVF9WSFVCX05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3Rh bGw7CisJcG9ydC0tOworCXAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkg eworCWNhc2UgVVNCX1BPUlRfRkVBVF9FTkFCTEU6CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0 YXQodmh1YiwgcG9ydCwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX0VOQUJMRSB8CisJCQkJCSAgVVNC X1BPUlRfU1RBVF9TVVNQRU5ELCAwLAorCQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJfZGV2X3N1 c3BlbmQoJnAtPmRldik7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BP UlRfRkVBVF9TVVNQRU5EOgorCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BF TkQpKQorCQkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJCWFzdF92aHViX2NoYW5nZV9wb3J0 X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsIDAsCisJCQkJ CSAgZmFsc2UpOworCQlhc3Rfdmh1Yl9kZXZfcmVzdW1lKCZwLT5kZXYpOworCQlyZXR1cm4gc3Rk X3JlcV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CisJCS8qIFdlIGRvbid0 IGRvIHBvd2VyIGNvbnRyb2wgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBV U0JfUE9SVF9GRUFUX0lORElDQVRPUjoKKwkJLyogV2UgZG9uJ3QgaGF2ZSBpbmRpY2F0b3JzICov CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0NPTk5F Q1RJT046CisJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCWNhc2UgVVNCX1BPUlRfRkVB VF9DX1NVU1BFTkQ6CisJY2FzZSBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgorCWNhc2Ug VVNCX1BPUlRfRkVBVF9DX1JFU0VUOgorCQkvKiBDbGVhciBzdGF0ZS1jaGFuZ2UgZmVhdHVyZSAq LworCQlwLT5jaGFuZ2UgJj0gfigxdSA8PCAoZmVhdCAtIDE2KSk7CisJCWFzdF92aHViX3VwZGF0 ZV9odWJfZXAxKHZodWIsIHBvcnQpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9CisKK3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMgYXN0X3Zo dWJfZ2V0X3BvcnRfc3RhdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgICAgICB1OCBw b3J0KQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXUxNiBzdGF0LCBj aGc7CisKKwlpZiAocG9ydCA9PSAwIHx8IHBvcnQgPiBBU1RfVkhVQl9OVU1fUE9SVFMpCisJCXJl dHVybiBzdGRfcmVxX3N0YWxsOworCXBvcnQtLTsKKworCXN0YXQgPSB2aHViLT5wb3J0c1twb3J0 XS5zdGF0dXM7CisJY2hnID0gdmh1Yi0+cG9ydHNbcG9ydF0uY2hhbmdlOworCisJLyogV2UgYWx3 YXlzIGhhdmUgcG93ZXIgKi8KKwlzdGF0IHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisKKwlFUERC RyhlcCwgIiBwb3J0IHN0YXR1cz0lMDR4IGNoYW5nZT0lMDR4XG4iLCBzdGF0LCBjaGcpOworCisJ cmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwKKwkJCQkgICAgIHN0YXQgJiAweGZmLAor CQkJCSAgICAgc3RhdCA+PiA4LAorCQkJCSAgICAgY2hnICYgMHhmZiwKKwkJCQkgICAgIGNoZyA+ PiA4KTsKK30KKworZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0KHN0 cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJCSAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNy cSkKK3sKKwl1MTYgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3Rv X2NwdShjcnEtPndWYWx1ZSk7CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOwor CXdMZW5ndGggPSBsZTE2X3RvX2NwdShjcnEtPndMZW5ndGgpOworCisJc3dpdGNoICgoY3JxLT5i UmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEtPmJSZXF1ZXN0KSB7CisJY2FzZSBHZXRIdWJTdGF0dXM6 CisJCUVQREJHKGVwLCAiR2V0SHViU3RhdHVzXG4iKTsKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBs ZV9yZXBseShlcCwgMCwgMCwgMCwgMCk7CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlFUERCRyhl cCwgIkdldFBvcnRTdGF0dXMoJWQpXG4iLCB3SW5kZXggJiAweGZmKTsKKwkJcmV0dXJuIGFzdF92 aHViX2dldF9wb3J0X3N0YXQoZXAsIHdJbmRleCAmIDB4Zik7CisJY2FzZSBHZXRIdWJEZXNjcmlw dG9yOgorCQlpZiAod1ZhbHVlICE9IChVU0JfRFRfSFVCIDw8IDgpKQorCQkJcmV0dXJuIHN0ZF9y ZXFfc3RhbGw7CisJCUVQREJHKGVwLCAiR2V0SHViRGVzY3JpcHRvciglZClcbiIsIHdJbmRleCAm IDB4ZmYpOworCQlyZXR1cm4gYXN0X3ZodWJfcmVwX2Rlc2MoZXAsIFVTQl9EVF9IVUIsIHdMZW5n dGgpOworCWNhc2UgU2V0SHViRmVhdHVyZToKKwljYXNlIENsZWFySHViRmVhdHVyZToKKwkJRVBE QkcoZXAsICJHZXQvU2V0SHViRmVhdHVyZSglZClcbiIsIHdWYWx1ZSk7CisJCS8qIE5vIGZlYXR1 cmUsIGp1c3QgY29tcGxldGUgdGhlIHJlcXVlc3RzICovCisJCWlmICh3VmFsdWUgPT0gQ19IVUJf TE9DQUxfUE9XRVIgfHwKKwkJICAgIHdWYWx1ZSA9PSBDX0hVQl9PVkVSX0NVUlJFTlQpCisJCQly ZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJY2FzZSBT ZXRQb3J0RmVhdHVyZToKKwkJRVBEQkcoZXAsICJTZXRQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJ bmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJcmV0dXJuIGFzdF92aHViX3NldF9wb3J0X2ZlYXR1cmUo ZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCUVQ REJHKGVwLCAiQ2xlYXJQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVl KTsKKwkJcmV0dXJuIGFzdF92aHViX2Nscl9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwg d1ZhbHVlKTsKKwlkZWZhdWx0OgorCQlFUERCRyhlcCwgIlVua25vd24gY2xhc3MgcmVxdWVzdFxu Iik7CisJfQorCXJldHVybiBzdGRfcmVxX3N0YWxsOworfQorCit2b2lkIGFzdF92aHViX2h1Yl9z dXNwZW5kKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVE Q0RCRyh2aHViLCAiVVNCIGJ1cyBzdXNwZW5kXG4iKTsKKworCWlmICh2aHViLT5zdXNwZW5kZWQp CisJCXJldHVybjsKKworCXZodWItPnN1c3BlbmRlZCA9IHRydWU7CisKKwkvKgorCSAqIEZvcndh cmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMgd2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5l Y3Rpb24gc3RhdHVzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7 IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKwor CQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJf ZGV2X3N1c3BlbmQoJnAtPmRldik7CisJfQorfQorCit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUo c3RydWN0IGFzdF92aHViICp2aHViKQoreworCXVuc2lnbmVkIGludCBpOworCisJVURDREJHKHZo dWIsICJVU0IgYnVzIHJlc3VtZVxuIik7CisKKwlpZiAoIXZodWItPnN1c3BlbmRlZCkKKwkJcmV0 dXJuOworCisJdmh1Yi0+c3VzcGVuZGVkID0gZmFsc2U7CisKKwkvKgorCSAqIEZvcndhcmQgdG8g dW5zdXNwZW5kZWQgcG9ydHMgd2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24g c3RhdHVzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykg eworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAo IShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3Jl c3VtZSgmcC0+ZGV2KTsKKwl9Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBh c3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNC IGJ1cyByZXNldFxuIik7CisKKwkvKgorCSAqIElzIHRoZSBzcGVlZCBrbm93biA/IElmIG5vdCB3 ZSBkb24ndCBjYXJlLCB3ZSBhcmVuJ3QKKwkgKiBpbml0aWFsaXplZCB5ZXQgYW5kIHBvcnRzIGhh dmVuJ3QgYmVlbiBlbmFibGVkLgorCSAqLworCWlmICh2aHViLT5zcGVlZCA9PSBVU0JfU1BFRURf VU5LTk9XTikKKwkJcmV0dXJuOworCisJLyogV2UgYXJlbid0IHN1c3BlbmRlZCBhbnltb3JlIG9i dmlvdXNseSAqLworCXZodWItPnN1c3BlbmRlZCA9IGZhbHNlOworCisJLyogTm8gc3BlZWQgc2V0 ICovCisJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKworCS8qIFdha2V1cCBub3Qg ZW5hYmxlZCBhbnltb3JlICovCisJdmh1Yi0+d2FrZXVwX2VuID0gZmFsc2U7CisKKwkvKgorCSAq IENsZWFyIGFsbCBwb3J0IHN0YXR1cywgZGlzYWJsZSBnYWRnZXRzIGFuZCAic3VzcGVuZCIKKwkg KiB0aGVtLiBUaGV5IHdpbGwgYmUgd29rZW4gdXAgYnkgYSBwb3J0IHJlc2V0LgorCSAqLworCWZv ciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3Zo dWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQkvKiBPbmx5IGtlZXAgdGhlIGNvbm5l Y3RlZCBmbGFnICovCisJCXAtPnN0YXR1cyAmPSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJ CXAtPmNoYW5nZSA9IDA7CisKKwkJLyogU3VzcGVuZCB0aGUgZ2FkZ2V0IGlmIGFueSAqLworCQlh c3Rfdmh1Yl9kZXZfc3VzcGVuZCgmcC0+ZGV2KTsKKwl9CisKKwkvKiBDbGVhbnVwIEhXICovCisJ d3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DT05GKTsKKwl3cml0ZWwoMCwgdmh1Yi0+ cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMKTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9U T0dHTEUgfAorCSAgICAgICBWSFVCX0VQMV9DVFJMX0VOQUJMRSwKKwkgICAgICAgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVC X0VQMV9TVFNfQ0hHKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3QgYXN0X3Zo dWIgKnZodWIpCit7CisJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlJTklUX1dP UksoJnZodWItPndha2Vfd29yaywgYXN0X3ZodWJfd2FrZV93b3JrKTsKK30KKwpkaWZmIC0tZ2l0 IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmggYi9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMDAuLjhkZTVlYjQ0YTZiMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMv dXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvdmh1Yi5oCkBAIC0wLDAgKzEsNDk2IEBACisjaWZu ZGVmIF9fQVNQRUVEX1ZIVUJfSAorI2RlZmluZSBfX0FTUEVFRF9WSFVCX0gKKworLyoqKioqKioq KioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAq IFZIVUIgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAg ICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUJQVNUX1ZIVUJf Q1RSTAkJMHgwMAkvKiBSb290IEZ1bmN0aW9uIENvbnRyb2wgJiBTdGF0dXMgUmVnaXN0ZXIgKi8K KyNkZWZpbmUJQVNUX1ZIVUJfQ09ORgkJMHgwNAkvKiBSb290IENvbmZpZ3VyYXRpb24gU2V0dGlu ZyBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9JRVIJCTB4MDgJLyogSW50ZXJydXB0IEN0 cmwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfSVNSCQkweDBDCS8qIEludGVycnVwdCBT dGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfRVBfQUNLX0lFUgkweDEwCS8qIFBy b2dyYW1tYWJsZSBFbmRwb2ludCBQb29sIEFDSyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICov CisjZGVmaW5lCUFTVF9WSFVCX0VQX05BQ0tfSUVSCTB4MTQJLyogUHJvZ3JhbW1hYmxlIEVuZHBv aW50IFBvb2wgTkFDSyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICAqLworI2RlZmluZSBBU1Rf VkhVQl9FUF9BQ0tfSVNSCTB4MTgJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgQUNLIElu dGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX05BQ0tfSVNS CTB4MUMJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgTkFDSyBJbnRlcnJ1cHQgU3RhdHVz IFJlZ2lzdGVyICAqLworI2RlZmluZSBBU1RfVkhVQl9TV19SRVNUCTB4MjAJLyogRGV2aWNlIENv bnRyb2xsZXIgU29mdCBSZXNldCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJf VVNCU1RTCQkweDI0CS8qIFVTQiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJf RVBfVE9HR0xFCTB4MjgJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgRGF0YSBUb2dnbGUg VmFsdWUgU2V0ICovCisjZGVmaW5lIEFTVF9WSFVCX0lTT19GQUlMX0FDQwkweDJDCS8qIElzb2No cm9ub3VzIFRyYW5zYWN0aW9uIEZhaWwgQWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgQVNUX1ZIVUJf RVAwX0NUUkwJMHgzMAkvKiBFbmRwb2ludCAwIENvbnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNk ZWZpbmUgQVNUX1ZIVUJfRVAwX0RBVEEJMHgzNAkvKiBCYXNlIEFkZHJlc3Mgb2YgRW5kcG9pbnQg MCBJbi9PVVQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX0NU UkwJMHgzOAkvKiBFbmRwb2ludCAxIENvbnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUg QVNUX1ZIVUJfRVAxX1NUU19DSEcJMHgzQwkvKiBFbmRwb2ludCAxIFN0YXR1cyBDaGFuZ2UgQml0 bWFwIERhdGEgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfU0VUVVAwCQkweDgwCS8qIFJvb3QgRGV2aWNl IFNldHVwIERhdGEgQnVmZmVyMCAqLworI2RlZmluZSBBU1RfVkhVQl9TRVRVUDEJCTB4ODQJLyog Um9vdCBEZXZpY2UgU2V0dXAgRGF0YSBCdWZmZXIxICovCisKKy8qIE1haW4gY29udHJvbCByZWcg Ki8KKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9DTEsJCQkoMSA8PCAzMSkKKyNkZWZpbmUgVkhVQl9D VFJMX1BIWV9MT09QX1RFU1QJCQkoMSA8PCAyNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0ROX1BXTgkJ CSgxIDw8IDI0KQorI2RlZmluZSBWSFVCX0NUUkxfRFBfUFdOCQkJKDEgPDwgMjMpCisjZGVmaW5l IFZIVUJfQ1RSTF9MT05HX0RFU0MJCQkoMSA8PCAxOCkKKyNkZWZpbmUgVkhVQl9DVFJMX0lTT19S U1BfQ1RSTAkJCSgxIDw8IDE3KQorI2RlZmluZSBWSFVCX0NUUkxfU1BMSVRfSU4JCQkoMSA8PCAx NikKKyNkZWZpbmUgVkhVQl9DVFJMX0xPT1BfVF9SRVNVTFQJCQkoMSA8PCAxNSkKKyNkZWZpbmUg VkhVQl9DVFJMX0xPT1BfVF9TVFMJCQkoMSA8PCAxNCkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9C SVNUX1JFU1VMVAkJKDEgPDwgMTMpCisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlfQklTVF9DVFJMCQkJ KDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlfUkVTRVRfRElTCQkJKDEgPDwgMTEpCisj ZGVmaW5lIFZIVUJfQ1RSTF9TRVRfVEVTVF9NT0RFKHgpCQkoKHgpIDw8IDgpCisjZGVmaW5lIFZI VUJfQ1RSTF9NQU5VQUxfUkVNT1RFX1dBS0VVUAkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVQl9DVFJM X0FVVE9fUkVNT1RFX1dBS0VVUAkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9DVFJMX0NMS19TVE9Q X1NVU1BFTkQJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfQ1RSTF9GVUxMX1NQRUVEX09OTFkJCSgx IDw8IDEpCisjZGVmaW5lIFZIVUJfQ1RSTF9VUFNUUkVBTV9DT05ORUNUCQkoMSA8PCAwKQorCisv KiBJRVIgJiBJU1IgKi8KKyNkZWZpbmUgVkhVQl9JUlFfVVNCX0NNRF9ERUFETE9DSwkJKDEgPDwg MTgpCisjZGVmaW5lIFZIVUJfSVJRX0VQX1BPT0xfTkFLCQkJKDEgPDwgMTcpCisjZGVmaW5lIFZI VUJfSVJRX0VQX1BPT0xfQUNLX1NUQUxMCQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9JUlFfREVW SUNFNQkJCSgxIDw8IDEzKQorI2RlZmluZSBWSFVCX0lSUV9ERVZJQ0U0CQkJKDEgPDwgMTIpCisj ZGVmaW5lIFZIVUJfSVJRX0RFVklDRTMJCQkoMSA8PCAxMSkKKyNkZWZpbmUgVkhVQl9JUlFfREVW SUNFMgkJCSgxIDw8IDEwKQorI2RlZmluZSBWSFVCX0lSUV9ERVZJQ0UxCQkJKDEgPDwgOSkKKyNk ZWZpbmUgVkhVQl9JUlFfQlVTX1JFU1VNRQkJCSgxIDw8IDgpCisjZGVmaW5lIFZIVUJfSVJRX0JV U19TVVNQRU5EIAkJCSgxIDw8IDcpCisjZGVmaW5lIFZIVUJfSVJRX0JVU19SRVNFVCAJCQkoMSA8 PCA2KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAxX0lOX0RBVEFfQUNLCQkoMSA8PCA1KQorI2Rl ZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lOX0RBVEFfTkFLCQkoMSA8PCA0KQorI2RlZmluZSBWSFVC X0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTAkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9JUlFfSFVC X0VQMF9PVVRfTkFLCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tf U1RBTEwJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfSVJRX0hVQl9FUDBfU0VUVVAJCQkoMSA8PCAw KQorI2RlZmluZSBWSFVCX0lSUV9BQ0tfQUxMCQkJMHgxZmYKKworLyogVVNCIHN0YXR1cyByZWcg Ki8KKyNkZWZpbmUgVkhVQl9VU0JTVFNfSElTUEVFRAkJCSgxIDw8IDI3KQorCisvKiBFUCB0b2dn bGUgKi8KKyNkZWZpbmUgVkhVQl9FUF9UT0dHTEVfVkFMVUUJCQkoMSA8PCA4KQorI2RlZmluZSBW SFVCX0VQX1RPR0dMRV9TRVRfRVBOVU0oeCkJCSgoeCkgJiAweDFmKQorCisvKiBIVUIgRVAwIGNv bnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9FUDBfQ1RSTF9TVEFMTAkJCSgxIDw8IDApCisjZGVmaW5l IFZIVUJfRVAwX1RYX0JVRkZfUkRZCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9FUDBfUlhfQlVG Rl9SRFkJCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0VQMF9SWF9MRU4oeCkJCQkoKCh4KSA+PiAx NikgJiAweDdmKQorI2RlZmluZSBWSFVCX0VQMF9TRVRfVFhfTEVOKHgpCQkJKCgoeCkgJiAweDdm KSA8PCA4KQorCisvKiBIVUIgRVAxIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9FUDFfQ1RSTF9S RVNFVF9UT0dHTEUJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfRVAxX0NUUkxfU1RBTEwJCQkoMSA8 PCAxKQorI2RlZmluZSBWSFVCX0VQMV9DVFJMX0VOQUJMRQkJCSgxIDw8IDApCisKKy8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCisgKiBwZXItZGV2aWNlIHJlZ2lzdGVyIGRlZmluaXRpb25zICoKKyAqICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLworI2RlZmluZSBBU1RfVkhVQl9ERVZfRU5fQ1RSTAkJMHgwMAorI2RlZmluZSBB U1RfVkhVQl9ERVZfSVNSCQkweDA0CisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FUDBfQ1RSTAkJMHgw OAorI2RlZmluZSBBU1RfVkhVQl9ERVZfRVAwX0RBVEEJCTB4MGMKKworLyogRGV2aWNlIGVuYWJs ZSBjb250cm9sICovCisjZGVmaW5lIFZIVUJfREVWX0VOX1NFVF9BRERSKHgpCQkJKCh4KSA8PCA4 KQorI2RlZmluZSBWSFVCX0RFVl9FTl9BRERSX01BU0sJCQkoKDB4ZmYpIDw8IDgpCisjZGVmaW5l IFZIVUJfREVWX0VOX0VQMF9OQUtfSVJRRU4JCSgxIDw8IDYpCisjZGVmaW5lIFZIVUJfREVWX0VO X0VQMF9JTl9BQ0tfSVJRRU4JCSgxIDw8IDUpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQMF9PVVRf TkFLX0lSUUVOCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0RFVl9FTl9FUDBfT1VUX0FDS19JUlFF TgkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX1NFVFVQX0lSUUVOCQkoMSA8PCAy KQorI2RlZmluZSBWSFVCX0RFVl9FTl9TUEVFRF9TRUxfSElHSAkJKDEgPDwgMSkKKyNkZWZpbmUg VkhVQl9ERVZfRU5fRU5BQkxFX1BPUlQJCQkoMSA8PCAwKQorCisvKiBJbnRlcnJ1cHQgc3RhdHVz ICovCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfSU5fREFUQV9OQUNLCQkoMSA8PCA0KQorI2Rl ZmluZSBWSFVWX0RFVl9JUlFfRVAwX0lOX0FDS19TVEFMTAkJKDEgPDwgMykKKyNkZWZpbmUgVkhV Vl9ERVZfSVJRX0VQMF9PVVRfREFUQV9OQUNLCQkoMSA8PCAyKQorI2RlZmluZSBWSFVWX0RFVl9J UlFfRVAwX09VVF9BQ0tfU1RBTEwJCSgxIDw8IDEpCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBf U0VUVVAJCQkoMSA8PCAwKQorCisvKiBDb250cm9sIGJpdHMuCisgKgorICogTm90ZTogVGhlIGRy aXZlciByZWxpZXMgb24gdGhlIGJ1bGsgb2YgdGhvc2UgYml0cworICogICAgICAgbWF0Y2hpbmcg Y29ycmVzcG9uZGluZyB2SHViIEVQMCBjb250cm9sIGJpdHMKKyAqLworI2RlZmluZSBWSFVCX0RF Vl9FUDBfQ1RSTF9TVEFMTAkJCVZIVUJfRVAwX0NUUkxfU1RBTEwKKyNkZWZpbmUgVkhVQl9ERVZf RVAwX1RYX0JVRkZfUkRZCQlWSFVCX0VQMF9UWF9CVUZGX1JEWQorI2RlZmluZSBWSFVCX0RFVl9F UDBfUlhfQlVGRl9SRFkJCVZIVUJfRVAwX1JYX0JVRkZfUkRZCisjZGVmaW5lIFZIVUJfREVWX0VQ MF9SWF9MRU4oeCkJCQlWSFVCX0VQMF9SWF9MRU4oeCkKKyNkZWZpbmUgVkhVQl9ERVZfRVAwX1NF VF9UWF9MRU4oeCkJCVZIVUJfRVAwX1NFVF9UWF9MRU4oeCkKKworLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAqCisgKiBwZXItZW5kcG9pbnQgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLworCisjZGVmaW5lIEFTVF9WSFVCX0VQX0NPTkZJRwkJMHgwMAorI2RlZmluZSBB U1RfVkhVQl9FUF9ETUFfQ1RMU1RBVAkJMHgwNAorI2RlZmluZSBBU1RfVkhVQl9FUF9ERVNDX0JB U0UJCTB4MDgKKyNkZWZpbmUgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMJCTB4MEMKKworLyogRVAg Y29uZmlnIHJlZyAqLworI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfTUFYX1BLVCh4KQkoKCh4KSAm IDB4M2ZmKSA8PCAxNikKKyNkZWZpbmUgVkhVQl9FUF9DRkdfQVVUT19EQVRBX0RJU0FCTEUJKDEg PDwgMTMpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NUQUxMX0NUUkwJCSgxIDw8IDEyKQorI2RlZmlu ZSBWSFVCX0VQX0NGR19TRVRfRVBfTlVNKHgpCSgoKHgpICYgMHhmKSA8PCA4KQorI2RlZmluZSBW SFVCX0VQX0NGR19TRVRfVFlQRSh4KQkJKCh4KSA8PCA1KQorI2RlZmluZSAgIEVQX1RZUEVfT0ZG CQkJMAorI2RlZmluZSAgIEVQX1RZUEVfQlVMSwkJCTEKKyNkZWZpbmUgICBFUF9UWVBFX0lOVAkJ CTIKKyNkZWZpbmUgICBFUF9UWVBFX0lTTwkJCTMKKyNkZWZpbmUgVkhVQl9FUF9DRkdfRElSX09V VAkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVQl9FUF9DRkdfU0VUX0RFVih4KQkJKCh4KSA8PCAxKQor I2RlZmluZSBWSFVCX0VQX0NGR19FTkFCTEUJCSgxIDw8IDApCisKKy8qIEVQIERNQSBjb250cm9s ICovCisjZGVmaW5lIFZIVUJfRVBfRE1BX1BST0NfU1RBVFVTKHgpCSgoKHgpID4+IDQpICYgMHhm KQorI2RlZmluZSAgIEVQX0RNQV9QUk9DX1JYX0lETEUJCTAKKyNkZWZpbmUgICBFUF9ETUFfUFJP Q19UWF9JRExFCQk4CisjZGVmaW5lIFZIVUJfRVBfRE1BX0lOX0xPTkdfTU9ERQkoMSA8PCAzKQor I2RlZmluZSBWSFVCX0VQX0RNQV9PVVRfQ09OVElHX01PREUJKDEgPDwgMykKKyNkZWZpbmUgVkhV Ql9FUF9ETUFfQ1RSTF9SRVNFVAkJKDEgPDwgMikKKyNkZWZpbmUgVkhVQl9FUF9ETUFfU0lOR0xF X1NUQUdFCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfRVBfRE1BX0RFU0NfTU9ERQkJKDEgPDwgMCkK KworLyogRVAgRE1BIHN0YXR1cyAqLworI2RlZmluZSBWSFVCX0VQX0RNQV9TRVRfVFhfU0laRSh4 KQkoKHgpIDw8IDE2KQorI2RlZmluZSBWSFVCX0VQX0RNQV9UWF9TSVpFKHgpCQkoKCh4KSA+PiAx NikgJiAweDdmZikKKyNkZWZpbmUgVkhVQl9FUF9ETUFfUlBUUih4KQkJKCgoeCkgPj4gOCkgJiAw eGZmKQorI2RlZmluZSBWSFVCX0VQX0RNQV9TRVRfUlBUUih4KQkJKCgoeCkgJiAweGZmKSA8PCA4 KQorI2RlZmluZSBWSFVCX0VQX0RNQV9TRVRfQ1BVX1dQVFIoeCkJKHgpCisjZGVmaW5lIFZIVUJf RVBfRE1BX1NJTkdMRV9LSUNLCQkoMSA8PCAwKSAvKiBXUFRSID0gMSBmb3Igc2luZ2xlIG1vZGUg Ki8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAqCisgKiBETUEgZGVzY3JpcHRvcnMgZGVmaW5pdGlvbnMgKgorICogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqLworCisvKiBEZXNjIFcxIElOICovCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9JTlRFUlJVUFQJ CSgxIDw8IDMxKQorI2RlZmluZSBWSFVCX0RTQzFfSU5fU1BJRF9EQVRBMAkJKDAgPDwgMTQpCisj ZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX0RBVEEyCQkoMSA8PCAxNCkKKyNkZWZpbmUgVkhVQl9E U0MxX0lOX1NQSURfREFUQTEJCSgyIDw8IDE0KQorI2RlZmluZSBWSFVCX0RTQzFfSU5fU1BJRF9N REFUQQkJKDMgPDwgMTQpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TRVRfTEVOKHgpCQkoKHgpICYg MHhmZmYpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9MRU4oeCkJCSgoeCkgJiAweGZmZikKKworLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBEYXRhIHN0cnVjdHVyZXMgYW5kIG1pc2MgZGVm aW5pdGlvbnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFTVF9W SFVCX05VTV9HRU5fRVBzCTE1CS8qIEdlbmVyaWMgbm9uLTAgRVBzICovCisjZGVmaW5lIEFTVF9W SFVCX05VTV9QT1JUUwk1CS8qIHZIdWIgcG9ydHMgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX01B WF9QQUNLRVQJNjQJLyogRVAwJ3MgbWF4IHBhY2tldCBzaXplICovCisjZGVmaW5lIEFTVF9WSFVC X0VQbl9NQVhfUEFDS0VUCTEwMjQJLyogR2VuZXJpYyBFUHMgbWF4IHBhY2tldCBzaXplICovCisj ZGVmaW5lIEFTVF9WSFVCX0RFU0NTX0NPVU5UCTI1NgkvKiBVc2UgMjU2IGRlc2NyaXB0b3IgbW9k ZSAqLworCitzdHJ1Y3QgYXN0X3ZodWI7CitzdHJ1Y3QgYXN0X3ZodWJfZGV2OworCisvKgorICog RE1BIGRlc2NyaXB0b3IgKGdlbmVyaWMgRVBzIG9ubHksIGN1cnJlbnRseSBvbmx5IHVzZWQKKyAq IGZvciBJTiBlbmRwb2ludHMKKyAqLworc3RydWN0IGFzdF92aHViX2Rlc2MgeworCV9fbGUzMgl3 MDsKKwlfX2xlMzIJdzE7Cit9OworCisvKiBBIHRyYW5zZmVyIHJlcXVlc3QsIGVpdGhlciBjb3Jl LW9yaWdpbmF0ZWQgb3IgaW50ZXJuYWwgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9yZXEgeworCXN0cnVj dCB1c2JfcmVxdWVzdAlyZXE7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKworCS8qIEFjdHVh bCBjb3VudCB3cml0dGVuIHRvIGRlc2NyaXB0b3JzIChkZXNjIG1vZGUgb25seSkgKi8KKwl1bnNp Z25lZCBpbnQJCWFjdF9jb3VudDsKKworCS8qCisJICogRGVzYyBudW1iZXIgb2YgdGhlIGZpbmFs IHBhY2tldCBvciAtMS4gRm9yIG5vbi1kZXNjCisJICogbW9kZSAob3IgZXAwKSwgYW55ID49IDAg dmFsdWUgbWVhbnMgImxhc3QgcGFja2V0IgorCSAqLworCWludAkJCWxhc3RfZGVzYzsKKworCS8q IFJlcXVlc3QgYWN0aXZlIChwZW5kaW5nIERNQXMpICovCisJYm9vbAkJCWFjdGl2ZSAgOiAxOwor CisJLyogSW50ZXJuYWwgcmVxdWVzdCAoZG9uJ3QgY2FsbCBiYWNrIGNvcmUpICovCisJYm9vbAkJ CWludGVybmFsIDogMTsKK307CisjZGVmaW5lIHRvX2FzdF9yZXEoX191cmVxKSBjb250YWluZXJf b2YoX191cmVxLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCByZXEpCisKKy8qIEN1cnJlbnQgc3RhdGUg b2YgYW4gRVAwICovCitlbnVtIGVwMF9zdGF0ZSB7CisJZXAwX3N0YXRlX3Rva2VuLAorCWVwMF9z dGF0ZV9kYXRhLAorCWVwMF9zdGF0ZV9zdGF0dXMsCit9OworCisvKgorICogQW4gZW5kcG9pbnQs IGVpdGhlciBnZW5lcmljLCBlcDAsIGFjdHVhbCBnYWRnZXQgRVAKKyAqIG9yIGludGVybmFsIHVz ZSB2aHViIEVQMC4gdmh1YiBFUDEgZG9lc24ndCBoYXZlIGFuCisgKiBhc3NvY2lhdGVkIHN0cnVj dHVyZSBhcyBpdCdzIG1vc3RseSBIVyBtYW5hZ2VkLgorICovCitzdHJ1Y3QgYXN0X3ZodWJfZXAg eworCXN0cnVjdCB1c2JfZXAJCWVwOworCisJLyogUmVxdWVzdCBxdWV1ZSAqLworCXN0cnVjdCBs aXN0X2hlYWQJcXVldWU7CisKKwkvKiBFUCBpbmRleCBpbiB0aGUgZGV2aWNlLCAwIG1lYW5zIHRo aXMgaXMgYW4gRVAwICovCisJdW5zaWduZWQgaW50CQlkX2lkeDsKKworCS8qIERldiBwb2ludGVy IG9yIE5VTEwgZm9yIHZIdWIgRVAwICovCisJc3RydWN0IGFzdF92aHViX2RldgkqZGV2OworCisJ Lyogdkh1YiBpdHNlbGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWIJCSp2aHViOworCisJLyoKKwkgKiBE TUEgYnVmZmVyIGZvciBFUDAsIGZhbGxiYWNrIERNQSBidWZmZXIgZm9yIG1pc2FsaWduZWQKKwkg KiBPVVQgdHJhbnNmZXJzIGZvciBnZW5lcmljIEVQcworCSAqLworCXZvaWQJCQkqYnVmOworCWRt YV9hZGRyX3QJCWJ1Zl9kbWE7CisKKwkvKiBUaGUgcmVzdCBkZXBlbmRzIG9uIHRoZSBFUCB0eXBl ICovCisJdW5pb24geworCQkvKiBFUDAgKGVpdGhlciBkZXZpY2Ugb3Igdmh1YikgKi8KKwkJc3Ry dWN0IHsKKwkJCS8qCisJCQkgKiBFUDAgcmVnaXN0ZXJzIGFyZSAic2ltaWxhciIgZm9yCisJCQkg KiB2SHViIGFuZCBkZXZpY2VzIGJ1dCBsb2NhdGVkIGluCisJCQkgKiBkaWZmZXJlbnQgcGxhY2Vz LgorCQkJICovCisJCQl2b2lkIF9faW9tZW0JCSpjdGxzdGF0OworCQkJdm9pZCBfX2lvbWVtCQkq c2V0dXA7CisKKwkJCS8qIEN1cnJlbnQgc3RhdGUgJiBkaXJlY3Rpb24gKi8KKwkJCWVudW0gZXAw X3N0YXRlCQlzdGF0ZTsKKwkJCWJvb2wJCQlkaXJfaW47CisKKwkJCS8qIEludGVybmFsIHVzZSBy ZXF1ZXN0ICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfcmVxCXJlcTsKKwkJfSBlcDA7CisKKwkJLyog R2VuZXJpYyBlbmRwb2ludCAoYWthIEVQbikgKi8KKwkJc3RydWN0IHsKKwkJCS8qIFJlZ2lzdGVy cyAqLworCQkJdm9pZCBfX2lvbWVtICAgCQkqcmVnczsKKworCQkJLyogSW5kZXggaW4gZ2xvYmFs IHBvb2wgKDAuLjE0KSAqLworCQkJdW5zaWduZWQgaW50CQlnX2lkeDsKKworCQkJLyogRE1BIERl c2NyaXB0b3JzICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfZGVzYwkqZGVzY3M7CisJCQlkbWFfYWRk cl90CQlkZXNjc19kbWE7CisJCQl1bnNpZ25lZCBpbnQJCWRfbmV4dDsKKwkJCXVuc2lnbmVkIGlu dAkJZF9sYXN0OworCQkJdW5zaWduZWQgaW50CQlkbWFfY29uZjsKKworCQkJLyogTWF4IGNodW5r IHNpemUgZm9yIElOIEVQcyAqLworCQkJdW5zaWduZWQgaW50CQljaHVua19tYXg7CisKKwkJCS8q IFN0YXRlIGZsYWdzICovCisJCQlib29sCQkJaXNfaW4gOiAgMTsKKwkJCWJvb2wJCQlpc19pc28g OiAxOworCQkJYm9vbAkJCXN0YWxsZWQgOiAxOworCQkJYm9vbAkJCXdlZGdlZCA6IDE7CisJCQli b29sCQkJZW5hYmxlZCA6IDE7CisJCQlib29sCQkJZGVzY19tb2RlIDogMTsKKwkJfSBlcG47CisJ fTsKK307CisjZGVmaW5lIHRvX2FzdF9lcChfX3VlcCkgY29udGFpbmVyX29mKF9fdWVwLCBzdHJ1 Y3QgYXN0X3ZodWJfZXAsIGVwKQorCisvKiBBIGRldmljZSBhdHRhY2hlZCB0byBhIHZIdWIgcG9y dCAqLworc3RydWN0IGFzdF92aHViX2RldiB7CisJc3RydWN0IGFzdF92aHViCQkJKnZodWI7CisJ dm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisKKwkvKiBEZXZpY2UgaW5kZXggKDAuLi40KSBhbmQgbmFt ZSBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCQlpbmRleDsKKwljb25zdCBjaGFyCQkJKm5hbWU7 CisKKwkvKiBzeXNmcyBlbmNsb3N1cmUgZm9yIHRoZSBnYWRnZXQgZ3VuayAqLworCXN0cnVjdCBk ZXZpY2UJCQlwb3J0X2RldjsKKworCS8qIExpbmsgdG8gZ2FkZ2V0IGNvcmUgKi8KKwlzdHJ1Y3Qg dXNiX2dhZGdldAkJZ2FkZ2V0OworCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlcgkqZHJpdmVyOwor CWJvb2wJCQkJcmVnaXN0ZXJlZCA6IDE7CisJYm9vbAkJCQl3YWtldXBfZW4gOiAxOworCWJvb2wJ CQkJc3VzcGVuZGVkIDogMTsKKwlib29sCQkJCWVuYWJsZWQgOiAxOworCisJLyogRW5kcG9pbnQg c3RydWN0dXJlcyAqLworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJZXAwOworCXN0cnVjdCBhc3Rfdmh1 Yl9lcAkJKmVwbnNbQVNUX1ZIVUJfTlVNX0dFTl9FUHNdOworCit9OworI2RlZmluZSB0b19hc3Rf ZGV2KF9fZykgY29udGFpbmVyX29mKF9fZywgc3RydWN0IGFzdF92aHViX2RldiwgZ2FkZ2V0KQor CisvKiBQZXIgdmh1YiBwb3J0IHN0YXRlaW5mbyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhc3Rfdmh1 Yl9wb3J0IHsKKwkvKiBQb3J0IHN0YXR1cyAmIHN0YXR1cyBjaGFuZ2UgcmVnaXN0ZXJzICovCisJ dTE2CQkJc3RhdHVzOworCXUxNgkJCWNoYW5nZTsKKworCS8qIEFzc29jaWF0ZWQgZGV2aWNlIHNs b3QgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2CWRldjsKK307CisKKy8qIEdsb2JhbCB2aHViIHN0 cnVjdHVyZSAqLworc3RydWN0IGFzdF92aHViIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkq cGRldjsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKwlpbnQJCQkJaXJxOworCXNwaW5sb2NrX3QJ CQlsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd2FrZV93b3JrOworCXN0cnVjdCBjbGsJCQkq Y2xrOworCisJLyogRVAwIERNQSBidWZmZXJzIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgKi8KKwl2 b2lkCQkJCSplcDBfYnVmczsKKwlkbWFfYWRkcl90CQkJZXAwX2J1ZnNfZG1hOworCisJLyogRVAw IG9mIHRoZSB2aHViIGl0c2VsZiAqLworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJZXAwOworCisJLyog U3RhdGUgb2Ygdmh1YiBlcDEgKi8KKwlib29sCQkJCWVwMV9zdGFsbGVkIDogMTsKKworCS8qIFBl ci1wb3J0IGluZm8gKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydAkJcG9ydHNbQVNUX1ZIVUJfTlVN X1BPUlRTXTsKKworCS8qIEdlbmVyaWMgRVAgZGF0YSBzdHJ1Y3R1cmVzICovCisJc3RydWN0IGFz dF92aHViX2VwCQllcG5zW0FTVF9WSFVCX05VTV9HRU5fRVBzXTsKKworCS8qIFVwc3RyZWFtIGJ1 cyBpcyBzdXNwZW5kZWQgPyAqLworCWJvb2wJCQkJc3VzcGVuZGVkIDogMTsKKworCS8qIEh1YiBp dHNlbGYgY2FuIHNpZ25hbCByZW1vdGUgd2FrZXVwICovCisJYm9vbAkJCQl3YWtldXBfZW4gOiAx OworCisJLyogRm9yY2UgZnVsbCBzcGVlZCBvbmx5ICovCisJYm9vbAkJCQlmb3JjZV91c2IxIDog MTsKKworCS8qIERpc2FibGUgRE1BIGRlc2NyaXB0b3IgbW9kZSAqLworCWJvb2wJCQkJbm9fZG1h X2Rlc2MgOiAxOworCisJLyogRGlzYWJsZSBETUEgZGVzY3JpcHRvciBtb2RlICovCisJYm9vbAkJ CQlub19sYXJnZV9zZW5kcyA6IDE7CisKKwkvKiBVcHN0cmVhbSBidXMgc3BlZWQgY2FwdHVyZWQg YXQgYnVzIHJlc2V0ICovCisJdW5zaWduZWQgaW50CQkJc3BlZWQ7Cit9OworCisvKiBTdGFuZGFy ZCByZXF1ZXN0IGhhbmRsZXJzIHJlc3VsdCBjb2RlcyAqLworZW51bSBzdGRfcmVxX3JjIHsKKwlz dGRfcmVxX3N0YWxsID0gLTEsCS8qIFN0YWxsIHJlcXVlc3RlZCAqLworCXN0ZF9yZXFfY29tcGxl dGUgPSAwLAkvKiBSZXF1ZXN0IGNvbXBsZXRlZCB3aXRoIG5vIGRhdGEgKi8KKwlzdGRfcmVxX2Rh dGEgPSAxLAkvKiBSZXF1ZXN0IGNvbXBsZXRlZCB3aXRoIGRhdGEgKi8KKwlzdGRfcmVxX2RyaXZl ciA9IDIsCS8qIFBhc3MgdG8gZHJpdmVyIHBscyAqLworfTsKKworI2lmZGVmIENPTkZJR19VU0Jf R0FER0VUX1ZFUkJPU0UKKyNkZWZpbmUgVURDVkRCRyh1LCBmbXQuLi4pCWRldl9kYmcoJih1KS0+ cGRldi0+ZGV2LCBmbXQpCisKKyNkZWZpbmUgRVBWREJHKGVwLCBmbXQsIC4uLikJZG8gewkJCVwK KwlkZXZfZGJnKCYoZXApLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXM6RVAlZCAiIGZtdCwJ CQkJXAorCQkoZXApLT5kZXYgPyAoZXApLT5kZXYtPm5hbWUgOiAiaHViIiwJXAorCQkoZXApLT5k X2lkeCwgIyNfX1ZBX0FSR1NfXyk7CQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIERWREJHKGQs IGZtdCwgLi4uKQlkbyB7CQkJXAorCWRldl9kYmcoJihkKS0+dmh1Yi0+cGRldi0+ZGV2LAkJCVwK KwkJIiVzICIgZm10LCAoZCktPm5hbWUsCQkJXAorCQkjI19fVkFfQVJHU19fKTsJCQkJXAorCX0g d2hpbGUoMCkKKworI2Vsc2UKKyNkZWZpbmUgVURDVkRCRyh1LCBmbXQuLi4pCWRvIHsgfSB3aGls ZSgwKQorI2RlZmluZSBFUFZEQkcoZXAsIGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZp bmUgRFZEQkcoZCwgZm10LCAuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBD T05GSUdfVVNCX0dBREdFVF9ERUJVRworI2RlZmluZSBVRENEQkcodSwgZm10Li4uKQlkZXZfZGJn KCYodSktPnBkZXYtPmRldiwgZm10KQorCisjZGVmaW5lIEVQREJHKGVwLCBmbXQsIC4uLikJZG8g ewkJCVwKKwlkZXZfZGJnKCYoZXApLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXM6RVAlZCAi IGZtdCwJCQkJXAorCQkoZXApLT5kZXYgPyAoZXApLT5kZXYtPm5hbWUgOiAiaHViIiwJXAorCQko ZXApLT5kX2lkeCwgIyNfX1ZBX0FSR1NfXyk7CQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIERE QkcoZCwgZm10LCAuLi4pCWRvIHsJCQlcCisJZGV2X2RiZygmKGQpLT52aHViLT5wZGV2LT5kZXYs CQkJXAorCQkiJXMgIiBmbXQsIChkKS0+bmFtZSwJCQlcCisJCSMjX19WQV9BUkdTX18pOwkJCQlc CisJfSB3aGlsZSgwKQorI2Vsc2UKKyNkZWZpbmUgVURDREJHKHUsIGZtdC4uLikJZG8geyB9IHdo aWxlKDApCisjZGVmaW5lIEVQREJHKGVwLCBmbXQsIC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVm aW5lIEREQkcoZCwgZm10LCAuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIGNvcmUu YyAqLwordm9pZCBhc3Rfdmh1Yl9kb25lKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBh c3Rfdmh1Yl9yZXEgKnJlcSwKKwkJICAgaW50IHN0YXR1cyk7Cit2b2lkIGFzdF92aHViX251a2Uo c3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IHN0YXR1cyk7CitzdHJ1Y3QgdXNiX3JlcXVlc3Qg KmFzdF92aHViX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwKKwkJCQkJICAgZ2Zw X3QgZ2ZwX2ZsYWdzKTsKK3ZvaWQgYXN0X3ZodWJfZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAg KnVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEpOwordm9pZCBhc3Rfdmh1Yl9pbml0X2h3 KHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7CisKKy8qIGVwMC5jICovCit2b2lkIGFzdF92aHViX2Vw MF9oYW5kbGVfYWNrKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGJvb2wgaW5fYWNrKTsKK3ZvaWQg YXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKTsKK3ZvaWQg YXN0X3ZodWJfaW5pdF9lcDAoc3RydWN0IGFzdF92aHViICp2aHViLCBzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLAorCQkgICAgICAgc3RydWN0IGFzdF92aHViX2RldiAqZGV2KTsKK2ludCBhc3Rfdmh1 Yl9yZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBjaGFyICpwdHIsIGludCBsZW4pOworaW50 IF9fYXN0X3ZodWJfc2ltcGxlX3JlcGx5KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBsZW4s IC4uLik7CisjZGVmaW5lIGFzdF92aHViX3NpbXBsZV9yZXBseSh1ZGMsIC4uLikJCQkJCSAgICAg ICBcCisJX19hc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoKHVkYyksCQkJCQkgICAgICAgXAorCQkJICAg ICAgIHNpemVvZigodThbXSkgeyBfX1ZBX0FSR1NfXyB9KS9zaXplb2YodTgpLCAgICAgIFwKKwkJ CSAgICAgICBfX1ZBX0FSR1NfXykKKworLyogaHViLmMgKi8KK3ZvaWQgYXN0X3ZodWJfaW5pdF9o dWIoc3RydWN0IGFzdF92aHViICp2aHViKTsKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9zdGRf aHViX3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJIHN0cnVjdCB1c2JfY3Ry bHJlcXVlc3QgKmNycSk7CitlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfY2xhc3NfaHViX3JlcXVl c3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJICAgc3RydWN0IHVzYl9jdHJscmVxdWVz dCAqY3JxKTsKK3ZvaWQgYXN0X3ZodWJfZGV2aWNlX2Nvbm5lY3Qoc3RydWN0IGFzdF92aHViICp2 aHViLCB1bnNpZ25lZCBpbnQgcG9ydCwKKwkJCSAgICAgYm9vbCBvbik7Cit2b2lkIGFzdF92aHVi X2h1Yl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7Cit2b2lkIGFzdF92aHViX2h1Yl9y ZXN1bWUoc3RydWN0IGFzdF92aHViICp2aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0 cnVjdCBhc3Rfdmh1YiAqdmh1Yik7Cit2b2lkIGFzdF92aHViX2h1Yl93YWtlX2FsbChzdHJ1Y3Qg YXN0X3ZodWIgKnZodWIpOworCisvKiBkZXYuYyAqLworaW50IGFzdF92aHViX2luaXRfZGV2KHN0 cnVjdCBhc3Rfdmh1YiAqdmh1YiwgdW5zaWduZWQgaW50IGlkeCk7Cit2b2lkIGFzdF92aHViX2Rl bF9kZXYoc3RydWN0IGFzdF92aHViX2RldiAqZCk7Cit2b2lkIGFzdF92aHViX2Rldl9pcnEoc3Ry dWN0IGFzdF92aHViX2RldiAqZCk7CitpbnQgYXN0X3ZodWJfc3RkX2Rldl9yZXF1ZXN0KHN0cnVj dCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkgICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSk7 CisKKy8qIGVwbi5jICovCit2b2lkIGFzdF92aHViX2Vwbl9hY2tfaXJxKHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXApOwordm9pZCBhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXApOworc3RydWN0IGFzdF92aHViX2VwICphc3Rfdmh1Yl9hbGxvY19lcG4oc3RydWN0 IGFzdF92aHViX2RldiAqZCwgdTggYWRkcik7Cit2b2lkIGFzdF92aHViX2Rldl9zdXNwZW5kKHN0 cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpOwordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzdW1lKHN0cnVjdCBh c3Rfdmh1Yl9kZXYgKmQpOwordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzZXQoc3RydWN0IGFzdF92aHVi X2RldiAqZCk7CisKKyNlbmRpZiAvKiBfX0FTUEVFRF9WSFVCX0ggKi8K