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: [v6,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180323024407.30601-2-benh@kernel.crashing.org> Date: Fri, 23 Mar 2018 13:44:07 +1100 To: linux-usb@vger.kernel.org Cc: Felipe Balbi , Greg KH , Joel Stanley , Andrew Jeffery , Benjamin Herrenschmidt List-ID: VGhlIEFzcGVlZCBCTUMgU29DcyBzdXBwb3J0IGEgInZpcnR1YWwgaHViIiBmdW5jdGlvbi4gSXQg cHJvdmlkZXMgc29tZQpIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBiZWhpbmQg d2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCgpUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9y IHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKaHViIHN0YW5kYXJkIHJlcXVl c3RzIGFuZCBleHBvc2luZyA1IFVEQyBnYWRnZXQgZHJpdmVycyBjb3JyZXNwb25kaW5nCnRvIHRo ZSBwb3J0cy4KClRoZSBodWIgaXRzZWxmIGhhcyBIVyBwcm92aWRlZCBkZWRpY2F0ZWQgRVAwIGFu ZCBFUDEgKHRoZSBsYXR0ZXIgZm9yCmh1YiBpbnRlcnJ1cHRzKS4gSXQgYWxzbyBoYXMgZGVkaWNh dGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgpvdGhlciBlbmRwb2ludHMsIHRoZXJlJ3Mg YSBwb29sIG9mIDE1ICJnZW5lcmljIiBlbmRwb2ludHMgdGhhdCBhcmUKc2hhcmVkIGFtb25nIHRo ZSBwb3J0cy4KClRoZSBkcml2ZXIgcmVsaWVzIG9uIG15IHByZXZpb3VzIHBhdGNoIGFkZGluZyBh ICJkaXNwb3NlIiBFUCBvcCB0bwpoYW5kbGUgRVAgYWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBF UHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFyZWQKcG9vbCBpbiB0aGUgVURDICJtYXRjaF9l cCIgY2FsbGJhY2sgYW5kIGFzc2lnbmVkIHRvIHRoZSBVREMgaW5zdGFuY2UKKGFkZGVkIHRvIHRo ZSBnYWRnZXQgZXBfbGlzdCkuCgpXaGVuIHRoZSBjb21wb3NpdGUgZHJpdmVyIGdldHMgdW5ib3Vu ZCwgdGhlIG5ldyBob29rIHdpbGwgYWxsb3cgdGhlIFVEQwp0byBjbGVhbiB0aGluZ3MgdXAgYW5k IHJldHVybiB0aG9zZSBFUHMgdG8gdGhlIHNoYXJlZCBwb29sLgoKU2lnbmVkLW9mZi1ieTogQmVu amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjYuIC0g Rml4IGJ1ZyB3aXRoIDAtbGVuZ3RoIHBhY2tldHMgb24gSU4gZW5kcG9pbnRzIGluIGRlc2MgbW9k ZQoKdjUuIC0gUmVtb3ZlICNpZmRlZidzIGFuZCBoYXJkIGNvZGVkIHZhbHVlcwogICAgLSBSZW1v dmUgbW9kdWxlIHBhcmFtZXRlcnMKICAgIC0gSG9ub3IgbWF4aW11bSBzcGVlZCBkZXZpY2UtdHJl ZSBwcm9wZXJ0eQogICAgLSBSZW1vdmUgdXNlbGVzcyBsaXN0X2VtcHR5IHRlc3QKICAgIC0gQ29z bWV0aWMvc3BhY2VzIGZpeGVzCiAgICAtIEFkZCBTUERYIGxpY2VuY2UgaWRlbnRpZmllcnMKCnY0 LiAtIEZpeCBtaXNzaW5nIHVubG9jayBhc3Rfdmh1Yl91ZGNfd2FrZXVwKCkgZXJyb3IgcGF0aAog ICAgLSBNYWtlICJpcnEiIHNpZ25lZCB0byBkZWFsIHdpdGggZXJyb3IgZnJvbSBwbGF0Zm9ybV9n ZXRfaXJxCiAgICAtIEZpeCBNYWtlZmlsZSBmb3IgbW9kdWxlIGJ1aWxkcwogICAgLSBGaXggYSBt aXNzaW5nIGVuZGlhbiBjb252ZXJzaW9uCgp2My4gLSBSZWJhc2VkCiAgICAtIEFkZCBjbGsgc3R1 ZmYKCnYyLiAtIENvc21ldGljIGZpeGVzCiAgICAtIFByb3Blcmx5ICJhbGxvY2F0ZSIgZGV2aWNl IGFkZHJlc3NlcyBpbnN0ZWFkIG9mIHVzaW5nIGEgbmV2ZXIKICAgICAgcmVzZXQgY291bnRlcgog ICAgLSBNb3ZlIC5kdHNpIHVwZGF0ZXMgdG8gYSBkaWZmZXJlbnQgcGF0Y2gKCmZvbzIKLS0tCiBk cml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcgICAgICAgICAgICAgIHwgICAyICsKIGRyaXZl cnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnICB8ICAgNyArCiBkcml2ZXJzL3VzYi9n YWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlIHwgICA0ICsKIGRyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvY29yZS5jICAgfCA0MjAgKysrKysrKysrKysrKysKIGRyaXZlcnMv dXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMgICAgfCA1ODEgKysrKysrKysrKysrKysr KysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYyAgICB8IDQ3OCAr KysrKysrKysrKysrKysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5j ICAgIHwgODQzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvaHViLmMgICAgfCA4MjMgKysrKysrKysrKysrKysrKysrKysrKysr KysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaCAgIHwgNTE0ICsr KysrKysrKysrKysrKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCAzNjczIGluc2VydGlvbnMoKykKIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25m aWcKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3Bl ZWQtdmh1Yi9jb3JlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRj L2FzcGVlZC12aHViL2Rldi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dh ZGdldC91ZGMvYXNwZWVkLXZodWIvZXBuLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcK aW5kZXggMDg3NWQzODQ3NmVlLi5iODM4Y2FlYWFhYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNi L2dhZGdldC91ZGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcK QEAgLTQzOCw2ICs0MzgsOCBAQCBjb25maWcgVVNCX0dBREdFVF9YSUxJTlgKIAkgIGR5bmFtaWNh bGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJ1ZGMteGlsaW54IiBhbmQgZm9yY2UgYWxsCiAJICBn YWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAorc291cmNlICJk cml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWciCisKICMKICMgTEFTVCAt LSBkdW1teS9lbXVsYXRlZCBjb250cm9sbGVyCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9n YWRnZXQvdWRjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQppbmRl eCBjZTg2NWIxMjlmZDYuLjg5N2Y2NDhmM2NmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlCkBA IC0zOSw0ICszOSw1IEBAIG9iai0kKENPTkZJR19VU0JfTVZfVTNEKQkrPSBtdl91M2RfY29yZS5v CiBvYmotJChDT05GSUdfVVNCX0dSX1VEQykJKz0gZ3JfdWRjLm8KIG9iai0kKENPTkZJR19VU0Jf R0FER0VUX1hJTElOWCkJKz0gdWRjLXhpbGlueC5vCiBvYmotJChDT05GSUdfVVNCX1NOUF9VRENf UExBVCkgKz0gc25wc191ZGNfcGxhdC5vCitvYmotJChDT05GSUdfVVNCX0FTUEVFRF9WSFVCKQkr PSBhc3BlZWQtdmh1Yi8KIG9iai0kKENPTkZJR19VU0JfQkRDX1VEQykJKz0gYmRjLwpkaWZmIC0t Z2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIGIvZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0 CmluZGV4IDAwMDAwMDAwMDAwMC4uZjBjZGY4OWI4NTAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCkBAIC0wLDAgKzEsNyBAQAor IyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKK2NvbmZpZyBVU0JfQVNQRUVEX1ZI VUIKKwl0cmlzdGF0ZSAiQXNwZWVkIHZIdWIgVURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hf QVNQRUVEIHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIFVTQiBwZXJpcGhlcmFsIGNvbnRyb2xs ZXIgZm9yIHRoZSBBc3BlZWQgQVNUMjUwMCBmYW1pbHkKKwkgIFNvQ3Mgc3VwcG9ydGluZyB0aGUg InZIdWIiIGZ1bmN0aW9uYWxpdHkgYW5kIFVTQjIuMApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMv YXNwZWVkLXZodWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAw MDAwLi45ZjNhZGQ2MDVmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQv dWRjL2FzcGVlZC12aHViL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorIyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMCsKK29iai0kKENPTkZJR19VU0JfQVNQRUVEX1ZIVUIpCSs9IGFz cGVlZC12aHViLm8KK2FzcGVlZC12aHViLXkJOj0gY29yZS5vIGVwMC5vIGVwbi5vIGRldi5vIGh1 Yi5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvY29y ZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMKbmV3IGZpbGUg bW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi4xMjkzNjA3ZjJmMTkKLS0tIC9kZXYvbnVs bAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwpAQCAtMCww ICsxLDQyMCBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICog YXNwZWVkLXZodWIgLS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0Cisg KgorICogY29yZS5jIC0gVG9wIGxldmVsIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJ Qk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91 IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1z IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRo ZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vu c2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNp bmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNs dWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgor I2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNs dWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxs aW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8 bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51 eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9v Zl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1h LW1hcHBpbmcuaD4KKworI2luY2x1ZGUgInZodWIuaCIKKwordm9pZCBhc3Rfdmh1Yl9kb25lKHN0 cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSwKKwkJICAgaW50 IHN0YXR1cykKK3sKKwlib29sIGludGVybmFsID0gcmVxLT5pbnRlcm5hbDsKKworCUVQVkRCRyhl cCwgImNvbXBsZXRpbmcgcmVxdWVzdCBAJXAsIHN0YXR1cyAlZFxuIiwgcmVxLCBzdGF0dXMpOwor CisJbGlzdF9kZWxfaW5pdCgmcmVxLT5xdWV1ZSk7CisKKwlpZiAocmVxLT5yZXEuc3RhdHVzID09 IC1FSU5QUk9HUkVTUykKKwkJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCisJaWYgKHJlcS0+ cmVxLmRtYSkgeworCQlpZiAoIVdBUk5fT04oIWVwLT5kZXYpKQorCQkJdXNiX2dhZGdldF91bm1h cF9yZXF1ZXN0KCZlcC0+ZGV2LT5nYWRnZXQsCisJCQkJCQkgJnJlcS0+cmVxLCBlcC0+ZXBuLmlz X2luKTsKKwkJcmVxLT5yZXEuZG1hID0gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXNuJ3Qg YW4gaW50ZXJuYWwgRVAwIHJlcXVlc3QsIGNhbGwgdGhlIGNvcmUKKwkgKiB0byBjYWxsIHRoZSBn YWRnZXQgY29tcGxldGlvbi4KKwkgKi8KKwlpZiAoIWludGVybmFsKSB7CisJCXNwaW5fdW5sb2Nr KCZlcC0+dmh1Yi0+bG9jayk7CisJCXVzYl9nYWRnZXRfZ2l2ZWJhY2tfcmVxdWVzdCgmZXAtPmVw LCAmcmVxLT5yZXEpOworCQlzcGluX2xvY2soJmVwLT52aHViLT5sb2NrKTsKKwl9Cit9CisKK3Zv aWQgYXN0X3ZodWJfbnVrZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBpbnQgc3RhdHVzKQorewor CXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKworCUVQREJHKGVwLCAiTnVraW5nXG4iKTsKKwor CS8qIEJld2FyZSwgbG9jayB3aWxsIGJlIGRyb3BwZWQgJiByZXEtYWNxdWlyZWQgYnkgZG9uZSgp ICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCXJlcSA9IGxpc3RfZmly c3RfZW50cnkoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCQlhc3Rf dmh1Yl9kb25lKGVwLCByZXEsIHN0YXR1cyk7CisJfQorfQorCitzdHJ1Y3QgdXNiX3JlcXVlc3Qg KmFzdF92aHViX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwKKwkJCQkJICAgZ2Zw X3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKworCXJlcSA9IGt6 YWxsb2Moc2l6ZW9mKCpyZXEpLCBnZnBfZmxhZ3MpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVM TDsKKwlyZXR1cm4gJnJlcS0+cmVxOworfQorCit2b2lkIGFzdF92aHViX2ZyZWVfcmVxdWVzdChz dHJ1Y3QgdXNiX2VwICp1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxKQoreworCXN0cnVj dCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2FzdF9yZXEodV9yZXEpOworCisJa2ZyZWUocmVxKTsK K30KKworc3RhdGljIGlycXJldHVybl90IGFzdF92aHViX2lycShpbnQgaXJxLCB2b2lkICpkYXRh KQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGRhdGE7CisJaXJxcmV0dXJuX3QgaXJldCA9 IElSUV9OT05FOworCXUzMiBpc3RhdDsKKworCS8qIFN0YWxlIGludGVycnVwdCB3aGlsZSB0ZWFy aW5nIGRvd24gKi8KKwlpZiAoIXZodWItPmVwMF9idWZzKQorCQlyZXR1cm4gSVJRX05PTkU7CisK KwlzcGluX2xvY2soJnZodWItPmxvY2spOworCisJLyogUmVhZCBhbmQgQUNLIGludGVycnVwdHMg Ki8KKwlpc3RhdCA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCWlmICghaXN0 YXQpCisJCWdvdG8gYmFpbDsKKwl3cml0ZWwoaXN0YXQsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9J U1IpOworCWlyZXQgPSBJUlFfSEFORExFRDsKKworCVVEQ1ZEQkcodmh1YiwgImlycSBzdGF0dXM9 JTA4eCwgZXBfYWNrcz0lMDh4IGVwX25hY2tzPSUwOHhcbiIsCisJICAgICAgIGlzdGF0LAorCSAg ICAgICByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUiksCisJICAgICAgIHJl YWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9OQUNLX0lTUikpOworCisJLyogSGFuZGxlIGdl bmVyaWMgRVBzIGZpcnN0ICovCisJaWYgKGlzdGF0ICYgVkhVQl9JUlFfRVBfUE9PTF9BQ0tfU1RB TEwpIHsKKwkJdTMyIGksIGVwX2Fja3MgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBf QUNLX0lTUik7CisJCXdyaXRlbChlcF9hY2tzLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNL X0lTUik7CisKKwkJZm9yIChpID0gMDsgZXBfYWNrcyAmJiBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9F UHM7IGkrKykgeworCQkJdTMyIG1hc2sgPSBWSFVCX0VQX0lSUShpKTsKKwkJCWlmIChlcF9hY2tz ICYgbWFzaykgeworCQkJCWFzdF92aHViX2Vwbl9hY2tfaXJxKCZ2aHViLT5lcG5zW2ldKTsKKwkJ CQllcF9hY2tzICY9IH5tYXNrOworCQkJfQorCQl9CisJfQorCisJLyogSGFuZGxlIGRldmljZSBp bnRlcnJ1cHRzICovCisJaWYgKGlzdGF0ICYgKFZIVUJfSVJRX0RFVklDRTEgfAorCQkgICAgIFZI VUJfSVJRX0RFVklDRTIgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTMgfAorCQkgICAgIFZIVUJf SVJRX0RFVklDRTQgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTUpKSB7CisJCWlmIChpc3RhdCAm IFZIVUJfSVJRX0RFVklDRTEpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1swXS5k ZXYpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UyKQorCQkJYXN0X3ZodWJfZGV2X2ly cSgmdmh1Yi0+cG9ydHNbMV0uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFMykK KwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzJdLmRldik7CisJCWlmIChpc3RhdCAm IFZIVUJfSVJRX0RFVklDRTQpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1szXS5k ZXYpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0U1KQorCQkJYXN0X3ZodWJfZGV2X2ly cSgmdmh1Yi0+cG9ydHNbNF0uZGV2KTsKKwl9CisKKwkvKiBIYW5kbGUgdG9wLWxldmVsIHZIdWIg RVAwIGludGVycnVwdHMgKi8KKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNL X1NUQUxMIHwKKwkJICAgICBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCB8CisJCSAgICAg VkhVQl9JUlFfSFVCX0VQMF9TRVRVUCkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfSFVCX0VQ MF9JTl9BQ0tfU1RBTEwpCisJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCB0 cnVlKTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMKQorCQkJ YXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soJnZodWItPmVwMCwgZmFsc2UpOworCQlpZiAoaXN0YXQg JiBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQKQorCQkJYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cCgm dmh1Yi0+ZXAwKTsKKwl9CisKKwkvKiBWYXJpb3VzIHRvcCBsZXZlbCBidXMgZXZlbnRzICovCisJ aWYgKGlzdGF0ICYgKFZIVUJfSVJRX0JVU19SRVNVTUUgfAorCQkgICAgIFZIVUJfSVJRX0JVU19T VVNQRU5EIHwKKwkJICAgICBWSFVCX0lSUV9CVVNfUkVTRVQpKSB7CisJCWlmIChpc3RhdCAmIFZI VUJfSVJRX0JVU19SRVNVTUUpCisJCQlhc3Rfdmh1Yl9odWJfcmVzdW1lKHZodWIpOworCQlpZiAo aXN0YXQgJiBWSFVCX0lSUV9CVVNfU1VTUEVORCkKKwkJCWFzdF92aHViX2h1Yl9zdXNwZW5kKHZo dWIpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9CVVNfUkVTRVQpCisJCQlhc3Rfdmh1Yl9odWJf cmVzZXQodmh1Yik7CisJfQorCisgYmFpbDoKKwlzcGluX3VubG9jaygmdmh1Yi0+bG9jayk7CisJ cmV0dXJuIGlyZXQ7Cit9CisKK3ZvaWQgYXN0X3ZodWJfaW5pdF9odyhzdHJ1Y3QgYXN0X3ZodWIg KnZodWIpCit7CisJdTMyIGN0cmw7CisKKwlVRENEQkcodmh1YiwiKFJlKVN0YXJ0aW5nIEhXIC4u LlxuIik7CisKKwkvKiBFbmFibGUgUEhZICovCisJY3RybCA9IFZIVUJfQ1RSTF9QSFlfQ0xLIHwK KwkJVkhVQl9DVFJMX1BIWV9SRVNFVF9ESVM7CisKKyAgICAgICAvKgorCSogV2UgZG8gKk5PVCog c2V0IHRoZSBWSFVCX0NUUkxfQ0xLX1NUT1BfU1VTUEVORCBiaXQKKwkqIHRvIHN0b3AgdGhlIGxv Z2ljIGNsb2NrIGR1cmluZyBzdXNwZW5kIGJlY2F1c2UKKwkqIGl0IGNhdXNlcyB0aGUgcmVnaXN0 ZXJzIHRvIGJlY29tZSBpbmFjY2Vzc2libGUgYW5kCisJKiB3ZSBoYXZlbid0IHlldCBmaWd1cmVk IG91dCBhIGdvb2Qgd2F5dCB0byBicmluZyB0aGUKKwkqIGNvbnRyb2xsZXIgYmFjayBpbnRvIGxp ZmUgdG8gaXNzdWUgYSB3YWtldXAuCisJKi8KKworCS8qCisJICogU2V0IHNvbWUgSVNPICYgc3Bs aXQgY29udHJvbCBiaXRzIGFjY29yZGluZyB0byBBc3BlZWQKKwkgKiByZWNvbW1lbmRhdGlvbgor CSAqCisJICogVkhVQl9DVFJMX0lTT19SU1BfQ1RSTDogV2hlbiBzZXQgdGVsbHMgdGhlIEhXIHRv IHJlc3BvbmQKKwkgKiB3aXRoIDAgYnl0ZXMgZGF0YSBwYWNrZXQgdG8gSVNPIElOIGVuZHBvaW50 cyB3aGVuIG5vIGRhdGEKKwkgKiBpcyBhdmFpbGFibGUuCisJICoKKwkgKiBWSFVCX0NUUkxfU1BM SVRfSU46IFRoaXMgbWFrZXMgYSBTT0YgY29tcGxldGUgYSBzcGxpdCBJTgorCSAqIHRyYW5zYWN0 aW9uLgorCSAqLworCWN0cmwgfD0gVkhVQl9DVFJMX0lTT19SU1BfQ1RSTCB8IFZIVUJfQ1RSTF9T UExJVF9JTjsKKwl3cml0ZWwoY3RybCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCXVk ZWxheSgxKTsKKworCS8qIFNldCBkZXNjcmlwdG9yIHJpbmcgc2l6ZSAqLworCWlmIChBU1RfVkhV Ql9ERVNDU19DT1VOVCA9PSAyNTYpIHsKKwkJY3RybCB8PSBWSFVCX0NUUkxfTE9OR19ERVNDOwor CQl3cml0ZWwoY3RybCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCX0gZWxzZSB7CisJ CUJVSUxEX0JVR19PTihBU1RfVkhVQl9ERVNDU19DT1VOVCAhPSAzMik7CisJfQorCisJLyogUmVz ZXQgYWxsIGRldmljZXMgKi8KKwl3cml0ZWwoVkhVQl9TV19SRVNFVF9BTEwsIHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9TV19SRVNFVCk7CisJdWRlbGF5KDEpOworCXdyaXRlbCgwLCB2aHViLT5yZWdz ICsgQVNUX1ZIVUJfU1dfUkVTRVQpOworCisJLyogRGlzYWJsZSBhbmQgY2xlYW51cCBFUCBBQ0sv TkFDSyBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9B Q0tfSUVSKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05BQ0tfSUVSKTsK Kwl3cml0ZWwoVkhVQl9FUF9JUlFfQUxMLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lT Uik7CisJd3JpdGVsKFZIVUJfRVBfSVJRX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05B Q0tfSVNSKTsKKworCS8qIERlZmF1bHQgc2V0dGluZ3MgZm9yIEVQMCwgZW5hYmxlIEhXIGh1YiBF UDEgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMKTsKKwl3cml0 ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUgfAorCSAgICAgICBWSFVCX0VQMV9DVFJMX0VO QUJMRSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKwl3cml0ZWwo MCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKKworCS8qIENvbmZpZ3VyZSBF UDAgRE1BIGJ1ZmZlciAqLworCXdyaXRlbCh2aHViLT5lcDAuYnVmX2RtYSwgdmh1Yi0+cmVncyAr IEFTVF9WSFVCX0VQMF9EQVRBKTsKKworCS8qIENsZWFyIGFkZHJlc3MgKi8KKwl3cml0ZWwoMCwg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0NPTkYpOworCisJLyogUHVsbHVwIGh1YiAoYWN0aXZhdGUg b24gaG9zdCkgKi8KKwlpZiAodmh1Yi0+Zm9yY2VfdXNiMSkKKwkJY3RybCB8PSBWSFVCX0NUUkxf RlVMTF9TUEVFRF9PTkxZOworCisJY3RybCB8PSBWSFVCX0NUUkxfVVBTVFJFQU1fQ09OTkVDVDsK Kwl3cml0ZWwoY3RybCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCisJLyogRW5hYmxl IHNvbWUgaW50ZXJydXB0cyAqLworCXdyaXRlbChWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFM TCB8CisJICAgICAgIFZIVUJfSVJRX0hVQl9FUDBfT1VUX0FDS19TVEFMTCB8CisJICAgICAgIFZI VUJfSVJRX0hVQl9FUDBfU0VUVVAgfAorCSAgICAgICBWSFVCX0lSUV9FUF9QT09MX0FDS19TVEFM TCB8CisJICAgICAgIFZIVUJfSVJRX0JVU19SRVNVTUUgfAorCSAgICAgICBWSFVCX0lSUV9CVVNf U1VTUEVORCB8CisJICAgICAgIFZIVUJfSVJRX0JVU19SRVNFVCwKKwkgICAgICAgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0lFUik7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfcmVtb3ZlKHN0cnVj dCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gcGxh dGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsK KworCWlmICghdmh1YiB8fCAhdmh1Yi0+cmVncykKKwkJcmV0dXJuIDA7CisKKwkvKiBSZW1vdmUg ZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykKKwkJ YXN0X3ZodWJfZGVsX2Rldigmdmh1Yi0+cG9ydHNbaV0uZGV2KTsKKworCXNwaW5fbG9ja19pcnFz YXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwkvKiBNYXNrICYgYWNrIGFsbCBpbnRlcnJ1cHRz ICAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwl3cml0ZWwoVkhV Ql9JUlFfQUNLX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisKKwkvKiBQdWxsIGRl dmljZSwgbGVhdmUgUEhZIGVuYWJsZWQgKi8KKwl3cml0ZWwoVkhVQl9DVFJMX1BIWV9DTEsgfAor CSAgICAgICBWSFVCX0NUUkxfUEhZX1JFU0VUX0RJUywKKwkgICAgICAgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0NUUkwpOworCisJaWYgKHZodWItPmNsaykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJl KHZodWItPmNsayk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFn cyk7CisKKwlpZiAodmh1Yi0+ZXAwX2J1ZnMpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5k ZXYsCisJCQkJICBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqCisJCQkJICAoQVNUX1ZIVUJfTlVN X1BPUlRTICsgMSksCisJCQkJICB2aHViLT5lcDBfYnVmcywKKwkJCQkgIHZodWItPmVwMF9idWZz X2RtYSk7CisJdmh1Yi0+ZXAwX2J1ZnMgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgYXN0X3ZodWJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwll bnVtIHVzYl9kZXZpY2Vfc3BlZWQgbWF4X3NwZWVkOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YjsK KwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgcmMgPSAwOworCisJdmh1YiA9IGRldm1f a3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnZodWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZo dWIpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnZodWItPmxvY2spOwor CXZodWItPnBkZXYgPSBwZGV2OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYs IElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl2aHViLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNl KCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUih2aHViLT5yZWdzKSkgeworCQlkZXZfZXJy KCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7CisJCXJldHVybiBQVFJf RVJSKHZodWItPnJlZ3MpOworCX0KKwlVRENEQkcodmh1YiwgInZIdWJAJXBSIG1hcHBlZCBAJXBc biIsIHJlcywgdmh1Yi0+cmVncyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB2aHVi KTsKKworCXZodWItPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKyAgICAg ICAgaWYgKElTX0VSUih2aHViLT5jbGspKSB7CisgICAgICAgICAgICAgICAgcmMgPSBQVFJfRVJS KHZodWItPmNsayk7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKwlyYyA9 IGNsa19wcmVwYXJlX2VuYWJsZSh2aHViLT5jbGspOworCWlmIChyYykgeworCQlkZXZfZXJyKCZw ZGV2LT5kZXYsICJFcnJvciBjb3VsZG4ndCBlbmFibGUgY2xvY2sgKCVkKVxuIiwgcmMpOworCQln b3RvIGVycjsKKyAgICAgICAgfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBsaW1pdCB0aGUg SFcgdG8gVVNCMSAqLworCW1heF9zcGVlZCA9IHVzYl9nZXRfbWF4aW11bV9zcGVlZCgmcGRldi0+ ZGV2KTsKKwlpZiAobWF4X3NwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOICYmIG1heF9zcGVlZCA8 IFVTQl9TUEVFRF9ISUdIKQorCQl2aHViLT5mb3JjZV91c2IxID0gdHJ1ZTsKKworCS8qIE1hc2sg JiBhY2sgYWxsIGludGVycnVwdHMgYmVmb3JlIGluc3RhbGxpbmcgdGhlIGhhbmRsZXIgKi8KKwl3 cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisJd3JpdGVsKFZIVUJfSVJRX0FD S19BTEwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCisJLyogRmluZCBpbnRlcnJ1cHQg YW5kIGluc3RhbGwgaGFuZGxlciAqLworCXZodWItPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRl diwgMCk7CisJaWYgKHZodWItPmlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFp bGVkIHRvIGdldCBpbnRlcnJ1cHRcbiIpOworCQlyYyA9IHZodWItPmlycTsKKwkJZ290byBlcnI7 CisJfQorCXJjID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB2aHViLT5pcnEsIGFzdF92 aHViX2lycSwgMCwKKwkJCSAgICAgIEtCVUlMRF9NT0ROQU1FLCB2aHViKTsKKwlpZiAocmMpIHsK KwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaW50ZXJydXB0XG4iKTsK KwkJZ290byBlcnI7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0ZSBETUEgYnVmZmVycyBmb3IgYWxs IEVQMHMgaW4gb25lIGNodW5rLAorCSAqIG9uZSBwZXIgcG9ydCBhbmQgb25lIGZvciB0aGUgdkh1 YiBpdHNlbGYKKwkgKi8KKwl2aHViLT5lcDBfYnVmcyA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRl di0+ZGV2LAorCQkJCQkgICAgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKgorCQkJCQkgICAgKEFT VF9WSFVCX05VTV9QT1JUUyArIDEpLAorCQkJCQkgICAgJnZodWItPmVwMF9idWZzX2RtYSwgR0ZQ X0tFUk5FTCk7CisJaWYgKCF2aHViLT5lcDBfYnVmcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYs ICJGYWlsZWQgdG8gYWxsb2NhdGUgRVAwIERNQSBidWZmZXJzXG4iKTsKKwkJcmMgPSAtRU5PTUVN OworCQlnb3RvIGVycjsKKwl9CisJVURDVkRCRyh2aHViLCAiRVAwIERNQSBidWZmZXJzIEAlcCAo RE1BIDB4JTA4eClcbiIsCisJCXZodWItPmVwMF9idWZzLCAodTMyKXZodWItPmVwMF9idWZzX2Rt YSk7CisKKwkvKiBJbml0IHZIdWIgRVAwICovCisJYXN0X3ZodWJfaW5pdF9lcDAodmh1YiwgJnZo dWItPmVwMCwgTlVMTCk7CisKKwkvKiBJbml0IGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwg QVNUX1ZIVUJfTlVNX1BPUlRTICYmIHJjID09IDA7IGkrKykKKwkJcmMgPSBhc3Rfdmh1Yl9pbml0 X2Rldih2aHViLCBpKTsKKwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJLyogSW5pdCBodWIgZW11 bGF0aW9uICovCisJYXN0X3ZodWJfaW5pdF9odWIodmh1Yik7CisKKwkvKiBJbml0aWFsaXplIEhX ICovCisJYXN0X3ZodWJfaW5pdF9odyh2aHViKTsKKworCXJldHVybiAwOworIGVycjoKKwlhc3Rf dmh1Yl9yZW1vdmUocGRldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0 IG9mX2RldmljZV9pZCBhc3Rfdmh1Yl9kdF9pZHNbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0g ImFzcGVlZCxhc3QyNDAwLXVzYi12aHViIiwKKwkJLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1 MDAtdXNiLXZodWIiLAorCX0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXN0 X3ZodWJfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXN0X3ZodWJf ZHJpdmVyID0geworCS5wcm9iZQkJPSBhc3Rfdmh1Yl9wcm9iZSwKKwkucmVtb3ZlCQk9IGFzdF92 aHViX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKKwkJ Lm9mX21hdGNoX3RhYmxlCT0gYXN0X3ZodWJfZHRfaWRzLAorCX0sCit9OworbW9kdWxlX3BsYXRm b3JtX2RyaXZlcihhc3Rfdmh1Yl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFzcGVl ZCB2SHViIHVkYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1p ZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsK ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMgYi9k cml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYzMzYzFmZWZjMWFlCi0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYwpAQCAtMCwwICsxLDU4MSBA QAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICogYXNwZWVkLXZo dWIgLS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICogZGV2 LmMgLSBJbmRpdmlkdWFsIGRldmljZS9nYWRnZXQgbWFuYWdlbWVudCAoaWUsIGEgcG9ydCA9IGEg Z2FkZ2V0KQorICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRo aXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQv b3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1Ymxp YyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlv bikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgor I2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rldmlj ZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+ CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5j bHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1 ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1 ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRl IDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51 eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxp bnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKworI2luY2x1ZGUgInZodWIu aCIKKwordm9pZCBhc3Rfdmh1Yl9kZXZfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJ dTMyIGlzdGF0ID0gcmVhZGwoZC0+cmVncyArIEFTVF9WSFVCX0RFVl9JU1IpOworCisJd3JpdGVs KGlzdGF0LCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0lTUik7CisKKwlpZiAoaXN0YXQgJiBWSFVW X0RFVl9JUlFfRVAwX0lOX0FDS19TVEFMTCkKKwkJYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soJmQt PmVwMCwgdHJ1ZSk7CisJaWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJRX0VQMF9PVVRfQUNLX1NUQUxM KQorCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2FjaygmZC0+ZXAwLCBmYWxzZSk7CisJaWYgKGlzdGF0 ICYgVkhVVl9ERVZfSVJRX0VQMF9TRVRVUCkKKwkJYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cCgm ZC0+ZXAwKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X2VuYWJsZShzdHJ1Y3QgYXN0 X3ZodWJfZGV2ICpkKQoreworCXUzMiByZWcsIGhtc2s7CisKKwlpZiAoZC0+ZW5hYmxlZCkKKwkJ cmV0dXJuOworCisJLyogRW5hYmxlIGRldmljZSBhbmQgaXRzIEVQMCBpbnRlcnJ1cHRzICovCisJ cmVnID0gVkhVQl9ERVZfRU5fRU5BQkxFX1BPUlQgfAorCQlWSFVCX0RFVl9FTl9FUDBfSU5fQUNL X0lSUUVOIHwKKwkJVkhVQl9ERVZfRU5fRVAwX09VVF9BQ0tfSVJRRU4gfAorCQlWSFVCX0RFVl9F Tl9FUDBfU0VUVVBfSVJRRU47CisJaWYgKGQtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfSElH SCkKKwkJcmVnIHw9IFZIVUJfREVWX0VOX1NQRUVEX1NFTF9ISUdIOworCXdyaXRlbChyZWcsIGQt PnJlZ3MgKyBBU1RfVkhVQl9ERVZfRU5fQ1RSTCk7CisKKwkvKiBFbmFibGUgZGV2aWNlIGludGVy cnVwdCBpbiB0aGUgaHViIGFzIHdlbGwgKi8KKwlobXNrID0gVkhVQl9JUlFfREVWSUNFMSA8PCBk LT5pbmRleDsKKwlyZWcgPSByZWFkbChkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwly ZWcgfD0gaG1zazsKKwl3cml0ZWwocmVnLCBkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsK KworCS8qIFNldCBFUDAgRE1BIGJ1ZmZlciBhZGRyZXNzICovCisJd3JpdGVsKGQtPmVwMC5idWZf ZG1hLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VQMF9EQVRBKTsKKworCWQtPmVuYWJsZWQgPSB0 cnVlOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfZGlzYWJsZShzdHJ1Y3QgYXN0X3Zo dWJfZGV2ICpkKQoreworCXUzMiByZWcsIGhtc2s7CisKKwlpZiAoIWQtPmVuYWJsZWQpCisJCXJl dHVybjsKKworCS8qIERpc2FibGUgZGV2aWNlIGludGVycnVwdCBpbiB0aGUgaHViICovCisJaG1z ayA9IFZIVUJfSVJRX0RFVklDRTEgPDwgZC0+aW5kZXg7CisJcmVnID0gcmVhZGwoZC0+dmh1Yi0+ cmVncyArIEFTVF9WSFVCX0lFUik7CisJcmVnICY9IH5obXNrOworCXdyaXRlbChyZWcsIGQtPnZo dWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworCisJLyogVGhlbiBkaXNhYmxlIGRldmljZSAqLwor CXdyaXRlbCgwLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwpOworCWQtPmdhZGdldC5z cGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCWQtPmVuYWJsZWQgPSBmYWxzZTsKKwlkLT5zdXNw ZW5kZWQgPSBmYWxzZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9kZXZfZmVhdHVyZShzdHJ1 Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJCXUxNiB3SW5kZXgsIHUxNiB3VmFsdWUsCisJCQkJYm9v bCBpc19zZXQpCit7CisJRERCRyhkLCAiJXNfRkVBVFVSRShkZXYgdmFsPSUwMngpXG4iLAorCSAg ICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xFQVIiLCB3VmFsdWUpOworCisJaWYgKHdWYWx1ZSAhPSBV U0JfREVWSUNFX1JFTU9URV9XQUtFVVApCisJCXJldHVybiBzdGRfcmVxX2RyaXZlcjsKKworCWQt Pndha2V1cF9lbiA9IGlzX3NldDsKKworCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQorCitz dGF0aWMgaW50IGFzdF92aHViX2VwX2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2RldiAqZCwKKwkJ CSAgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLCBib29sIGlzX3NldCkKK3sKKwlzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmVwOworCWludCBlcF9udW07CisKKwllcF9udW0gPSB3SW5kZXggJiBVU0Jf RU5EUE9JTlRfTlVNQkVSX01BU0s7CisJRERCRyhkLCAiJXNfRkVBVFVSRShlcCVkIHZhbD0lMDJ4 KVxuIiwKKwkgICAgIGlzX3NldCA/ICJTRVQiIDogIkNMRUFSIiwgZXBfbnVtLCB3VmFsdWUpOwor CWlmIChlcF9udW0gPT0gMCkKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJaWYgKGVwX251 bSA+PSBBU1RfVkhVQl9OVU1fR0VOX0VQcyB8fCAhZC0+ZXBuc1tlcF9udW0gLSAxXSkKKwkJcmV0 dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKHdWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJ cmV0dXJuIHN0ZF9yZXFfZHJpdmVyOworCisJZXAgPSBkLT5lcG5zW2VwX251bSAtIDFdOworCWlm IChXQVJOX09OKCFlcCkpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJaWYgKCFlcC0+ZXBu LmVuYWJsZWQgfHwgIWVwLT5lcC5kZXNjIHx8IGVwLT5lcG4uaXNfaXNvIHx8CisJICAgIGVwLT5l cG4uaXNfaW4gIT0gISEod0luZGV4ICYgVVNCX0RJUl9JTikpCisJCXJldHVybiBzdGRfcmVxX3N0 YWxsOworCisJRERCRyhkLCAiJXMgc3RhbGwgb24gRVAgJWRcbiIsCisJICAgICBpc19zZXQgPyAi c2V0dGluZyIgOiAiY2xlYXJpbmciLCBlcF9udW0pOworCWVwLT5lcG4uc3RhbGxlZCA9IGlzX3Nl dDsKKwlhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKGVwKTsKKworCXJldHVybiBzdGRfcmVxX2Nv bXBsZXRlOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Rldl9zdGF0dXMoc3RydWN0IGFzdF92 aHViX2RldiAqZCwKKwkJCSAgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlKQoreworCXU4IHN0 MDsKKworCUREQkcoZCwgIkdFVF9TVEFUVVMoZGV2KVxuIik7CisKKwlzdDAgPSBkLT5nYWRnZXQu aXNfc2VsZnBvd2VyZWQgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQ7CisJaWYgKGQtPndha2V1 cF9lbikKKwkJc3QwIHw9IDEgPDwgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOworCisJcmV0dXJu IGFzdF92aHViX3NpbXBsZV9yZXBseSgmZC0+ZXAwLCBzdDAsIDApOworfQorCitzdGF0aWMgaW50 IGFzdF92aHViX2VwX3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJICAgICAgdTE2 IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sKKwlpbnQgZXBfbnVtID0gd0luZGV4ICYgVVNCX0VORFBP SU5UX05VTUJFUl9NQVNLOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7CisJdTggc3QwID0gMDsK KworCUREQkcoZCwgIkdFVF9TVEFUVVMoZXAlZClcbiIsIGVwX251bSk7CisKKwlpZiAoZXBfbnVt ID49IEFTVF9WSFVCX05VTV9HRU5fRVBzKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAo ZXBfbnVtICE9IDApIHsKKwkJZXAgPSBkLT5lcG5zW2VwX251bSAtIDFdOworCQlpZiAoIWVwKQor CQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCWlmICghZXAtPmVwbi5lbmFibGVkIHx8ICFlcC0+ ZXAuZGVzYyB8fCBlcC0+ZXBuLmlzX2lzbyB8fAorCQkgICAgZXAtPmVwbi5pc19pbiAhPSAhISh3 SW5kZXggJiBVU0JfRElSX0lOKSkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCQlpZiAoZXAt PmVwbi5zdGFsbGVkKQorCQkJc3QwIHw9IDEgPDwgVVNCX0VORFBPSU5UX0hBTFQ7CisJfQorCisJ cmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseSgmZC0+ZXAwLCBzdDAsIDApOworfQorCitzdGF0 aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfc2V0X2FkZHJlc3Moc3RydWN0IGFzdF92aHViX2RldiAqZCwg dTggYWRkcikKK3sKKwl1MzIgcmVnOworCisJRERCRyhkLCAiU0VUX0FERFJFU1M6IEdvdCBhZGRy ZXNzICV4XG4iLCBhZGRyKTsKKworCXJlZyA9IHJlYWRsKGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZf RU5fQ1RSTCk7CisJcmVnICY9IH5WSFVCX0RFVl9FTl9BRERSX01BU0s7CisJcmVnIHw9IFZIVUJf REVWX0VOX1NFVF9BRERSKGFkZHIpOworCXdyaXRlbChyZWcsIGQtPnJlZ3MgKyBBU1RfVkhVQl9E RVZfRU5fQ1RSTCk7Cit9CisKK2ludCBhc3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3Qoc3RydWN0IGFz dF92aHViX2VwICplcCwKKwkJCSAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKQorewor CXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSBlcC0+ZGV2OworCXUxNiB3VmFsdWUsIHdJbmRleCwg d0xlbmd0aDsKKworCS8qIE5vIGRyaXZlciwgd2Ugc2hvdWxkbid0IGJlIGVuYWJsZWQgLi4uICov CisJaWYgKCFkLT5kcml2ZXIgfHwgIWQtPmVuYWJsZWQgfHwgZC0+c3VzcGVuZGVkKSB7CisJCUVQ REJHKGVwLAorCQkgICAgICAiRGV2aWNlIGlzIHdyb25nIHN0YXRlIGRyaXZlcj0lcCBlbmFibGVk PSVkIgorCQkgICAgICAiIHN1c3BlbmRlZD0lZFxuIiwKKwkJICAgICAgZC0+ZHJpdmVyLCBkLT5l bmFibGVkLCBkLT5zdXNwZW5kZWQpOworCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwl9CisKKwkv KiBGaXJzdCBwYWNrZXQsIGdyYWIgc3BlZWQgKi8KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVkID09IFVT Ql9TUEVFRF9VTktOT1dOKSB7CisJCWQtPmdhZGdldC5zcGVlZCA9IGVwLT52aHViLT5zcGVlZDsK KwkJaWYgKGQtPmdhZGdldC5zcGVlZCA+IGQtPmRyaXZlci0+bWF4X3NwZWVkKQorCQkJZC0+Z2Fk Z2V0LnNwZWVkID0gZC0+ZHJpdmVyLT5tYXhfc3BlZWQ7CisJCUREQkcoZCwgImZpc3QgcGFja2V0 LCBjYXB0dXJlZCBzcGVlZCAlZFxuIiwKKwkJICAgICBkLT5nYWRnZXQuc3BlZWQpOworCX0KKwor CXdWYWx1ZSA9IGxlMTZfdG9fY3B1KGNycS0+d1ZhbHVlKTsKKwl3SW5kZXggPSBsZTE2X3RvX2Nw dShjcnEtPndJbmRleCk7CisJd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGNycS0+d0xlbmd0aCk7CisK Kwlzd2l0Y2ggKChjcnEtPmJSZXF1ZXN0VHlwZSA8PCA4KSB8IGNycS0+YlJlcXVlc3QpIHsKKwkJ LyogU0VUX0FERFJFU1MgKi8KKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9B RERSRVNTOgorCQlhc3Rfdmh1Yl9kZXZfc2V0X2FkZHJlc3MoZCwgd1ZhbHVlKTsKKwkJcmV0dXJu IHN0ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX1NUQVRVUyAqLworCWNhc2UgRGV2aWNlUmVx dWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX2Rldl9zdGF0dXMo ZCwgd0luZGV4LCB3VmFsdWUpOworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VU X1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCk7CisJY2Fz ZSBFbmRwb2ludFJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1 Yl9lcF9zdGF0dXMoZCwgd0luZGV4LCB3VmFsdWUpOworCisJCS8qIFNFVC9DTEVBUl9GRUFUVVJF ICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0 dXJuIGFzdF92aHViX2Rldl9mZWF0dXJlKGQsIHdJbmRleCwgd1ZhbHVlLCB0cnVlKTsKKwljYXNl IERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCXJldHVybiBhc3Rf dmh1Yl9kZXZfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCWNhc2UgRW5kcG9p bnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2Vw X2ZlYXR1cmUoZCwgd0luZGV4LCB3VmFsdWUsIHRydWUpOworCWNhc2UgRW5kcG9pbnRPdXRSZXF1 ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfZXBfZmVhdHVy ZShkLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCX0KKwlyZXR1cm4gc3RkX3JlcV9kcml2ZXI7 Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3dha2V1cChzdHJ1Y3QgdXNiX2dhZGdldCog Z2FkZ2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWQtPndha2V1cF9lbikKKwkJ Z290byBlcnI7CisKKwlEREJHKGQsICJEZXZpY2UgaW5pdGlhdGVkIHdha2V1cFxuIik7CisKKwkv KiBXYWtldXAgdGhlIGhvc3QgKi8KKwlhc3Rfdmh1Yl9odWJfd2FrZV9hbGwoZC0+dmh1Yik7CisJ cmMgPSAwOworIGVycjoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBm bGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3VkY19nZXRfZnJh bWUoc3RydWN0IHVzYl9nYWRnZXQqIGdhZGdldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpk ID0gdG9fYXN0X2RldihnYWRnZXQpOworCisJcmV0dXJuIChyZWFkbChkLT52aHViLT5yZWdzICsg QVNUX1ZIVUJfVVNCU1RTKSA+PiAxNikgJiAweDdmZjsKK30KKworc3RhdGljIHZvaWQgYXN0X3Zo dWJfZGV2X251a2Uoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsK KworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKSB7CisJCWlmICgh ZC0+ZXBuc1tpXSkKKwkJCWNvbnRpbnVlOworCQlhc3Rfdmh1Yl9udWtlKGQtPmVwbnNbaV0sIC1F U0hVVERPV04pOworCX0KK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl91ZGNfcHVsbHVwKHN0cnVj dCB1c2JfZ2FkZ2V0KiBnYWRnZXQsIGludCBvbikKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpk ID0gdG9fYXN0X2RldihnYWRnZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xv Y2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAicHVsbHVwKCVk KVxuIiwgb24pOworCisJLyogTWFyayBkaXNjb25uZWN0ZWQgaW4gdGhlIGh1YiAqLworCWFzdF92 aHViX2RldmljZV9jb25uZWN0KGQtPnZodWIsIGQtPmluZGV4LCBvbik7CisKKwkvKgorCSAqIElm IGVuYWJsZWQsIG51a2UgYWxsIHJlcXVlc3RzIGlmIGFueSAodGhlcmUgc2hvdWxkbid0IGJlKQor CSAqIGFuZCBkaXNhYmxlIHRoZSBwb3J0LiBUaGlzIHdpbGwgY2xlYXIgdGhlIGFkZHJlc3MgdG9v LgorCSAqLworCWlmIChkLT5lbmFibGVkKSB7CisJCWFzdF92aHViX2Rldl9udWtlKGQpOworCQlh c3Rfdmh1Yl9kZXZfZGlzYWJsZShkKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZk LT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rf dmh1Yl91ZGNfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwKKwkJCSAgICAgIHN0cnVj dCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQg PSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlEREJHKGQsICJzdGFydFxuIik7 CisKKwkvKiBXZSBkb24ndCBkbyBtdWNoIG1vcmUgdW50aWwgdGhlIGh1YiBlbmFibGVzIHVzICov CisJZC0+ZHJpdmVyID0gZHJpdmVyOworCWQtPmdhZGdldC5pc19zZWxmcG93ZXJlZCA9IDE7CisK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZXAgKmFzdF92aHViX3VkY19tYXRjaF9lcChz dHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LAorCQkJCQkgICAgc3RydWN0IHVzYl9lbmRwb2ludF9k ZXNjcmlwdG9yICpkZXNjLAorCQkJCQkgICAgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0 b3IgKnNzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7 CisJc3RydWN0IGFzdF92aHViX2VwICplcDsKKwlzdHJ1Y3QgdXNiX2VwICp1X2VwOworCXVuc2ln bmVkIGludCBtYXgsIGFkZHIsIGk7CisKKwlEREJHKGQsICJNYXRjaCBFUCB0eXBlICVkXG4iLCB1 c2JfZW5kcG9pbnRfdHlwZShkZXNjKSk7CisKKwkvKgorCSAqIEZpcnN0IHdlIG5lZWQgdG8gbG9v ayBmb3IgYW4gZXhpc3RpbmcgdW5jbGFpbWVkIEVQIGFzIGFub3RoZXIKKwkgKiBjb25maWd1cmF0 aW9uIG1heSBoYXZlIGFscmVhZHkgYXNzb2NpYXRlZCBhIGJ1bmNoIG9mIEVQcyB3aXRoCisJICog dGhpcyBnYWRnZXQuIFRoaXMgZHVwbGljYXRlcyB0aGUgY29kZSBpbiB1c2JfZXBfYXV0b2NvbmZp Z19zcygpCisJICogdW5mb3J0dW5hdGVseS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVf ZXAsICZnYWRnZXQtPmVwX2xpc3QsIGVwX2xpc3QpIHsKKwkJaWYgKHVzYl9nYWRnZXRfZXBfbWF0 Y2hfZGVzYyhnYWRnZXQsIHVfZXAsIGRlc2MsIHNzKSkgeworCQkJRERCRyhkLCAiIC0+IHVzaW5n IGV4aXN0aW5nIEVQJWRcbiIsCisJCQkgICAgIHRvX2FzdF9lcCh1X2VwKS0+ZF9pZHgpOworCQkJ cmV0dXJuIHVfZXA7CisJCX0KKwl9CisKKwkvKgorCSAqIFdlIGRpZG4ndCBmaW5kIG9uZSwgd2Ug bmVlZCB0byBncmFiIG9uZSBmcm9tIHRoZSBwb29sLgorCSAqCisJICogRmlyc3QgbGV0J3MgZG8g c29tZSBzYW5pdHkgY2hlY2tpbmcKKwkgKi8KKwlzd2l0Y2godXNiX2VuZHBvaW50X3R5cGUoZGVz YykpIHsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0w6CisJCS8qIE9ubHkgRVAwIGNh biBiZSBhIGNvbnRyb2wgZW5kcG9pbnQgKi8KKwkJcmV0dXJuIE5VTEw7CisJY2FzZSBVU0JfRU5E UE9JTlRfWEZFUl9JU09DOgorCQkvKiBJU086ICBsaW1pdCAxMDIzIGJ5dGVzIGZ1bGwgc3BlZWQs IDEwMjQgaGlnaC9zdXBlciBzcGVlZCAqLworCQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRn ZXQpKQorCQkJbWF4ID0gMTAyNDsKKwkJZWxzZQorCQkJbWF4ID0gMTAyMzsKKwkJYnJlYWs7CisJ Y2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChn YWRnZXQpKQorCQkJbWF4ID0gNTEyOworCQllbHNlCisJCQltYXggPSA2NDsKKwkJYnJlYWs7CisJ Y2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdh ZGdldCkpCisJCQltYXggPSAxMDI0OworCQllbHNlCisJCQltYXggPSA2NDsKKwkJYnJlYWs7CisJ fQorCWlmICh1c2JfZW5kcG9pbnRfbWF4cChkZXNjKSA+IG1heCkKKwkJcmV0dXJuIE5VTEw7CisK KwkvKgorCSAqIEZpbmQgYSBmcmVlIEVQIGFkZHJlc3MgZm9yIHRoYXQgZGV2aWNlLiBXZSBjYW4n dAorCSAqIGxldCB0aGUgZ2VuZXJpYyBjb2RlIGFzc2lnbiB0aGVzZSBhcyBpdCB3b3VsZAorCSAq IGNyZWF0ZSBvdmVybGFwcGluZyBudW1iZXJzIGZvciBJTiBhbmQgT1VUIHdoaWNoCisJICogd2Ug ZG9uJ3Qgc3VwcG9ydCwgc28gYWxzbyBjcmVhdGUgYSBzdWl0YWJsZSBuYW1lCisJICogdGhhdCB3 aWxsIGFsbG93IHRoZSBnZW5lcmljIGNvZGUgdG8gdXNlIG91cgorCSAqIGFzc2lnbmVkIGFkZHJl c3MuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKyspCisJ CWlmIChkLT5lcG5zW2ldID09IE5VTEwpCisJCQlicmVhazsKKwlpZiAoaSA+PSBBU1RfVkhVQl9O VU1fR0VOX0VQcykKKwkJcmV0dXJuIE5VTEw7CisJYWRkciA9IGkgKyAxOworCisJLyoKKwkgKiBO b3cgZ3JhYiBhbiBFUCBmcm9tIHRoZSBzaGFyZWQgcG9vbCBhbmQgYXNzb2NpYXRlCisJICogaXQg d2l0aCBvdXIgZGV2aWNlCisJICovCisgICAgICAgCWVwID0gYXN0X3ZodWJfYWxsb2NfZXBuKGQs IGFkZHIpOworCWlmICghZXApCisJCXJldHVybiBOVUxMOworCUREQkcoZCwgIkFsbG9jYXRlZCBl cG4jJWQgZm9yIHBvcnQgRVAlZFxuIiwKKwkgICAgIGVwLT5lcG4uZ19pZHgsIGFkZHIpOworCisJ cmV0dXJuICZlcC0+ZXA7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3N0b3Aoc3RydWN0 IHVzYl9nYWRnZXQgKmdhZGdldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0 X2RldihnYWRnZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2 ZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAic3RvcFxuIik7CisKKwlkLT5k cml2ZXIgPSBOVUxMOworCWQtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCisJ YXN0X3ZodWJfZGV2X251a2UoZCk7CisKKwlpZiAoZC0+ZW5hYmxlZCkKKwkJYXN0X3ZodWJfZGV2 X2Rpc2FibGUoZCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBm bGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBh c3Rfdmh1Yl91ZGNfb3BzID0geworCS5nZXRfZnJhbWUJPSBhc3Rfdmh1Yl91ZGNfZ2V0X2ZyYW1l LAorCS53YWtldXAJCT0gYXN0X3ZodWJfdWRjX3dha2V1cCwKKwkucHVsbHVwCQk9IGFzdF92aHVi X3VkY19wdWxsdXAsCisJLnVkY19zdGFydAk9IGFzdF92aHViX3VkY19zdGFydCwKKwkudWRjX3N0 b3AJPSBhc3Rfdmh1Yl91ZGNfc3RvcCwKKwkubWF0Y2hfZXAJPSBhc3Rfdmh1Yl91ZGNfbWF0Y2hf ZXAsCit9OworCit2b2lkIGFzdF92aHViX2Rldl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1Yl9kZXYg KmQpCit7CisJZC0+c3VzcGVuZGVkID0gdHJ1ZTsKKwlpZiAoZC0+ZHJpdmVyKSB7CisJCXNwaW5f dW5sb2NrKCZkLT52aHViLT5sb2NrKTsKKwkJZC0+ZHJpdmVyLT5zdXNwZW5kKCZkLT5nYWRnZXQp OworCQlzcGluX2xvY2soJmQtPnZodWItPmxvY2spOworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9k ZXZfcmVzdW1lKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJZC0+c3VzcGVuZGVkID0gZmFs c2U7CisJaWYgKGQtPmRyaXZlcikgeworCQlzcGluX3VubG9jaygmZC0+dmh1Yi0+bG9jayk7CisJ CWQtPmRyaXZlci0+cmVzdW1lKCZkLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmQtPnZodWItPmxv Y2spOworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzZXQoc3RydWN0IGFzdF92aHViX2Rl diAqZCkKK3sKKwkvKgorCSAqIElmIHNwZWVkIGlzIG5vdCBzZXQsIHdlIGVuYWJsZSB0aGUgcG9y dC4gSWYgaXQgaXMsCisJICogc2VuZCByZXNldCB0byB0aGUgZ2FkZ2V0IGFuZCByZXNldCAic3Bl ZWQiLgorCSAqCisJICogU3BlZWQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlIGhhdmUgZ290IHRo ZSBmaXJzdAorCSAqIHNldHVwIHBhY2tldCB0byB0aGUgZGV2aWNlLgorCSAqLworCWlmIChkLT5n YWRnZXQuc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04gJiYgIWQtPmVuYWJsZWQpIHsKKwkJRERC RyhkLCAiUmVzZXQgYXQgdW5rbm93biBzcGVlZCBvZiBkaXNhYmxlZCBkZXZpY2UsIGVuYWJsaW5n Li4uXG4iKTsKKwkJYXN0X3ZodWJfZGV2X2VuYWJsZShkKTsKKwkJZC0+c3VzcGVuZGVkID0gZmFs c2U7CisJfQorCWlmIChkLT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04gJiYgZC0+ ZHJpdmVyKSB7CisJCXVuc2lnbmVkIGludCBpOworCisJCUREQkcoZCwgIlJlc2V0IGF0IGtub3du IHNwZWVkIG9mIGJvdW5kIGRldmljZSwgcmVzZXR0aW5nLi4uXG4iKTsKKwkJc3Bpbl91bmxvY2so JmQtPnZodWItPmxvY2spOworCQlkLT5kcml2ZXItPnJlc2V0KCZkLT5nYWRnZXQpOworCQlzcGlu X2xvY2soJmQtPnZodWItPmxvY2spOworCisJCS8qCisJCSAqIERpc2FibGUvcmUtZW5hYmxlIEhX LCB0aGlzIHdpbGwgY2xlYXIgdGhlIGFkZHJlc3MKKwkJICogYW5kIHNwZWVkIHNldHRpbmcuCisJ CSAqLworCQlhc3Rfdmh1Yl9kZXZfZGlzYWJsZShkKTsKKwkJYXN0X3ZodWJfZGV2X2VuYWJsZShk KTsKKworCQkvKiBDbGVhciBzdGFsbCBvbiBhbGwgRVBzICovCisJCWZvciAoaSA9IDA7IGkgPCBB U1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKSB7CisJCQlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0g ZC0+ZXBuc1tpXTsKKworCQkJaWYgKGVwICYmIGVwLT5lcG4uc3RhbGxlZCkgeworCQkJCWVwLT5l cG4uc3RhbGxlZCA9IGZhbHNlOworCQkJCWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXApOwor CQkJfQorCQl9CisKKwkJLyogQWRkaXRpb25hbCBjbGVhbnVwcyAqLworCQlkLT53YWtldXBfZW4g PSBmYWxzZTsKKwkJZC0+c3VzcGVuZGVkID0gZmFsc2U7CisJfQorfQorCit2b2lkIGFzdF92aHVi X2RlbF9kZXYoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWQt PnJlZ2lzdGVyZWQpIHsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywg ZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWQtPnJlZ2lzdGVyZWQgPSBmYWxzZTsKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwl1c2JfZGVsX2dhZGdl dF91ZGMoJmQtPmdhZGdldCk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJmQtPnBvcnRfZGV2KTsKK30K KworaW50IGFzdF92aHViX2luaXRfZGV2KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwgdW5zaWduZWQg aW50IGlkeCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gJnZodWItPnBvcnRzW2lkeF0u ZGV2OworCXN0cnVjdCBkZXZpY2UgKnBhcmVudCA9ICZ2aHViLT5wZGV2LT5kZXY7CisJaW50IHJj OworCisJZC0+dmh1YiA9IHZodWI7CisJZC0+aW5kZXggPSBpZHg7CisJZC0+bmFtZSA9IGRldm1f a2FzcHJpbnRmKHBhcmVudCwgR0ZQX0tFUk5FTCwgInBvcnQlZCIsIGlkeCsxKTsKKwlkLT5yZWdz ID0gdmh1Yi0+cmVncyArIDB4MTAwICsgMHgxMCAqIGlkeDsKKworCWFzdF92aHViX2luaXRfZXAw KHZodWIsICZkLT5lcDAsIGQpOworCisJLyoKKwkgKiBUaGUgVURDIGNvcmUgcmVhbGx5IG5lZWRz IHVzIHRvIGhhdmUgc2VwYXJhdGUgYW5kIHVuaXF1ZWx5CisJICogbmFtZWQgInBhcmVudCIgZGV2 aWNlcyBmb3IgZWFjaCBwb3J0IHNvIHdlIGNyZWF0ZSBhIHN1YiBkZXZpY2UKKwkgKiBoZXJlIGZv ciB0aGF0IHB1cnBvc2UKKwkgKi8KKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZC0+cG9ydF9kZXYpOwor CWQtPnBvcnRfZGV2LnBhcmVudCA9IHBhcmVudDsKKwlkZXZfc2V0X25hbWUoJmQtPnBvcnRfZGV2 LCAiJXM6cCVkIiwgZGV2X25hbWUocGFyZW50KSwgaWR4ICsgMSk7CisJcmMgPSBkZXZpY2VfYWRk KCZkLT5wb3J0X2Rldik7CisJaWYgKHJjKQorCQlnb3RvIGZhaWxfYWRkOworCisJLyogUG9wdWxh dGUgZ2FkZ2V0ICovCisJSU5JVF9MSVNUX0hFQUQoJmQtPmdhZGdldC5lcF9saXN0KTsKKwlkLT5n YWRnZXQub3BzID0gJmFzdF92aHViX3VkY19vcHM7CisJZC0+Z2FkZ2V0LmVwMCA9ICZkLT5lcDAu ZXA7CisJZC0+Z2FkZ2V0Lm5hbWUgPSBLQlVJTERfTU9ETkFNRTsKKwlpZiAodmh1Yi0+Zm9yY2Vf dXNiMSkKKwkJZC0+Z2FkZ2V0Lm1heF9zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCWVsc2UKKwkJ ZC0+Z2FkZ2V0Lm1heF9zcGVlZCA9IFVTQl9TUEVFRF9ISUdIOworCWQtPmdhZGdldC5zcGVlZCA9 IFVTQl9TUEVFRF9VTktOT1dOOworCWQtPmdhZGdldC5kZXYub2Zfbm9kZSA9IHZodWItPnBkZXYt PmRldi5vZl9ub2RlOworCisJcmMgPSB1c2JfYWRkX2dhZGdldF91ZGMoJmQtPnBvcnRfZGV2LCAm ZC0+Z2FkZ2V0KTsKKwlpZiAocmMgIT0gMCkKKwkJZ290byBmYWlsX3VkYzsKKwlkLT5yZWdpc3Rl cmVkID0gdHJ1ZTsKKworCXJldHVybiAwOworIGZhaWxfdWRjOgorCWRldmljZV9kZWwoJmQtPnBv cnRfZGV2KTsKKyBmYWlsX2FkZDoKKwlwdXRfZGV2aWNlKCZkLT5wb3J0X2Rldik7CisKKwlyZXR1 cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L2VwMC5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjc5NzA5OWYwNmNhYQotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXAwLmMKQEAgLTAs MCArMSw0NzggQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAq IGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAor ICoKKyAqIGVwMC5jIC0gRW5kcG9pbnQgMCBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAyMDE3 IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICog dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGlj ZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKwor I2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lu Y2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+ CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2lu Y2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUg PGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRl IDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxp bnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4 L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9k bWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidmh1Yi5oIgorCitpbnQgYXN0X3ZodWJfcmVwbHko c3RydWN0IGFzdF92aHViX2VwICplcCwgY2hhciAqcHRyLCBpbnQgbGVuKQoreworCXN0cnVjdCB1 c2JfcmVxdWVzdCAqcmVxID0gJmVwLT5lcDAucmVxLnJlcTsKKworCWlmIChXQVJOX09OKGVwLT5k X2lkeCAhPSAwKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKFdBUk5fT04oIWVwLT5l cDAuZGlyX2luKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKFdBUk5fT04obGVuID4g QVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAo V0FSTl9PTihyZXEtPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpKQorCQlyZXR1cm4gc3RkX3JlcV9z dGFsbDsKKworCXJlcS0+YnVmID0gcHRyOworCXJlcS0+bGVuZ3RoID0gbGVuOworCXJlcS0+Y29t cGxldGUgPSBOVUxMOworCXJlcS0+emVybyA9IHRydWU7CisKKwkvKiBDYWxsIGludGVybmFsIHF1 ZXVlIGRpcmVjdGx5ICovCisJaWYgKGVwLT5lcC5vcHMtPnF1ZXVlKCZlcC0+ZXAsIHJlcSwgR0ZQ X0FUT01JQykpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWVsc2UKKwkJcmV0dXJuIHN0ZF9y ZXFfZGF0YTsKK30KKworaW50IF9fYXN0X3ZodWJfc2ltcGxlX3JlcGx5KHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXAsIGludCBsZW4sIC4uLikKK3sKKwl1OCAqYnVmZmVyID0gZXAtPmJ1ZjsKKwl1bnNp Z25lZCBpbnQgaTsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBsZW4pOworCisJ LyogQ29weSBkYXRhIGRpcmVjdGx5IGludG8gRVAgYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8 IGxlbjsgaSsrKQorCQlidWZmZXJbaV0gPSB2YV9hcmcoYXJncywgaW50KTsKKwl2YV9lbmQoYXJn cyk7CisKKwkvKiByZXEtPmJ1ZiBOVUxMIG1lYW5zIGRhdGEgaXMgYWxyZWFkeSB0aGVyZSAqLwor CXJldHVybiBhc3Rfdmh1Yl9yZXBseShlcCwgTlVMTCwgbGVuKTsKK30KKwordm9pZCBhc3Rfdmh1 Yl9lcDBfaGFuZGxlX3NldHVwKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJc3RydWN0IHVz Yl9jdHJscmVxdWVzdCBjcnE7CisJZW51bSBzdGRfcmVxX3JjIHN0ZF9yZXFfcmM7CisJaW50IHJj ID0gLUVOT0RFVjsKKworCWlmIChXQVJOX09OKGVwLT5kX2lkeCAhPSAwKSkKKwkJcmV0dXJuOwor CisJLyoKKwkgKiBHcmFiIHRoZSBzZXR1cCBwYWNrZXQgZnJvbSB0aGUgY2hpcCBhbmQgYnl0ZXN3 YXAKKwkgKiBpbnRlcmVzdGluZyBmaWVsZHMKKwkgKi8KKwltZW1jcHlfZnJvbWlvKCZjcnEsIGVw LT5lcDAuc2V0dXAsIHNpemVvZihjcnEpKTsKKworCUVQREJHKGVwLCAiU0VUVVAgcGFja2V0ICUw MngvJTAyeC8lMDR4LyUwNHgvJTA0eCBbJXNdIHN0PSVkXG4iLAorCSAgICAgIGNycS5iUmVxdWVz dFR5cGUsIGNycS5iUmVxdWVzdCwKKwkgICAgICAgbGUxNl90b19jcHUoY3JxLndWYWx1ZSksCisJ ICAgICAgIGxlMTZfdG9fY3B1KGNycS53SW5kZXgpLAorCSAgICAgICBsZTE2X3RvX2NwdShjcnEu d0xlbmd0aCksCisJICAgICAgIChjcnEuYlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPyAiaW4i IDogIm91dCIsCisJICAgICAgIGVwLT5lcDAuc3RhdGUpOworCisJLyogQ2hlY2sgb3VyIHN0YXRl LCBjYW5jZWwgcGVuZGluZyByZXF1ZXN0cyBpZiBuZWVkZWQgKi8KKwlpZiAoZXAtPmVwMC5zdGF0 ZSAhPSBlcDBfc3RhdGVfdG9rZW4pIHsKKwkJRVBEQkcoZXAsICJ3cm9uZyBzdGF0ZVxuIik7CisJ CWFzdF92aHViX251a2UoZXAsIDApOworCQlnb3RvIHN0YWxsOworCX0KKworCS8qIENhbGN1bGF0 ZSBuZXh0IHN0YXRlIGZvciBFUDAgKi8KKwllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX2RhdGE7 CisJZXAtPmVwMC5kaXJfaW4gPSAhIShjcnEuYlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTik7CisK KwkvKiBJZiB0aGlzIGlzIHRoZSB2SHViLCB3ZSBoYW5kbGUgcmVxdWVzdHMgZGlmZmVyZW50bHkg Ki8KKwlzdGRfcmVxX3JjID0gc3RkX3JlcV9kcml2ZXI7CisJaWYgKGVwLT5kZXYgPT0gTlVMTCkg eworCQlpZiAoKGNycS5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9T VEFOREFSRCkKKwkJCXN0ZF9yZXFfcmMgPSBhc3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3QoZXAsICZj cnEpOworCQllbHNlIGlmICgoY3JxLmJSZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01BU0spID09IFVT Ql9UWVBFX0NMQVNTKQorCQkJc3RkX3JlcV9yYyA9IGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0 KGVwLCAmY3JxKTsKKwkJZWxzZQorCQkJc3RkX3JlcV9yYyA9IHN0ZF9yZXFfc3RhbGw7CisJfSBl bHNlIGlmICgoY3JxLmJSZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01BU0spID09IFVTQl9UWVBFX1NU QU5EQVJEKQorCQlzdGRfcmVxX3JjID0gYXN0X3ZodWJfc3RkX2Rldl9yZXF1ZXN0KGVwLCAmY3Jx KTsKKworCS8qIEFjdCB1cG9uIHJlc3VsdCAqLworCXN3aXRjaChzdGRfcmVxX3JjKSB7CisJY2Fz ZSBzdGRfcmVxX2NvbXBsZXRlOgorCQlnb3RvIGNvbXBsZXRlOworCWNhc2Ugc3RkX3JlcV9zdGFs bDoKKwkJZ290byBzdGFsbDsKKwljYXNlIHN0ZF9yZXFfZHJpdmVyOgorCQlicmVhazsKKwljYXNl IHN0ZF9yZXFfZGF0YToKKwkJcmV0dXJuOworCX0KKworCS8qIFBhc3MgcmVxdWVzdCB1cCB0byB0 aGUgZ2FkZ2V0IGRyaXZlciAqLworCWlmIChXQVJOX09OKCFlcC0+ZGV2KSkKKwkJZ290byBzdGFs bDsKKwlpZiAoZXAtPmRldi0+ZHJpdmVyKSB7CisJCUVQREJHKGVwLCAiZm9yd2FyZGluZyB0byBn YWRnZXQuLi5cbiIpOworCQlzcGluX3VubG9jaygmZXAtPnZodWItPmxvY2spOworCQlyYyA9IGVw LT5kZXYtPmRyaXZlci0+c2V0dXAoJmVwLT5kZXYtPmdhZGdldCwgJmNycSk7CisJCXNwaW5fbG9j aygmZXAtPnZodWItPmxvY2spOworCQlFUERCRyhlcCwgImRyaXZlciByZXR1cm5lZCAlZFxuIiwg cmMpOworCX0gZWxzZSB7CisJCUVQREJHKGVwLCAibm8gZ2FkZ2V0IGZvciByZXF1ZXN0ICFcbiIp OworCX0KKwlpZiAocmMgPj0gMCkKKwkJcmV0dXJuOworCisgc3RhbGw6CisJRVBEQkcoZXAsICJz dGFsbGluZ1xuIik7CisJd3JpdGVsKFZIVUJfRVAwX0NUUkxfU1RBTEwsIGVwLT5lcDAuY3Rsc3Rh dCk7CisJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJZXAtPmVwMC5kaXJfaW4g PSBmYWxzZTsKKwlyZXR1cm47CisKKyBjb21wbGV0ZToKKwlFUFZEQkcoZXAsICJzZW5kaW5nIFtp bl0gc3RhdHVzIHdpdGggbm8gZGF0YVxuIik7CisJd3JpdGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZ LCBlcC0+ZXAwLmN0bHN0YXQpOworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOwor CWVwLT5lcDAuZGlyX2luID0gZmFsc2U7Cit9CisKKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXAw X2RvX3NlbmQoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgc3RydWN0IGFzdF92aHViX3Jl cSAqcmVxKQoreworCXVuc2lnbmVkIGludCBjaHVuazsKKwl1MzIgcmVnOworCisJLyogSWYgdGhp cyBpcyBhIDAtbGVuZ3RoIHJlcXVlc3QsIGl0J3MgdGhlIGdhZGdldCB0cnlpbmcgdG8KKwkgKiBz ZW5kIGEgc3RhdHVzIG9uIG91ciBiZWhhbGYuIFdlIHRha2UgaXQgZnJvbSBoZXJlLgorCSAqLwor CWlmIChyZXEtPnJlcS5sZW5ndGggPT0gMCkKKwkJcmVxLT5sYXN0X2Rlc2MgPSAxOworCisJLyog QXJlIHdlIGRvbmUgPyBDb21wbGV0ZSByZXF1ZXN0LCBvdGhlcndpc2Ugd2FpdCBmb3IgbmV4dCBp bnRlcnJ1cHQgKi8KKwlpZiAocmVxLT5sYXN0X2Rlc2MgPj0gMCkgeworCQlFUFZEQkcoZXAsICJj b21wbGV0ZSBzZW5kICVkLyVkXG4iLAorCQkgICAgICAgcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJl cS5sZW5ndGgpOworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJd3JpdGVs KFZIVUJfRVAwX1JYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCQlhc3Rfdmh1Yl9kb25l KGVwLCByZXEsIDApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBOZXh0IGNodW5rIGNyb3Bw ZWQgdG8gbWF4IHBhY2tldCBzaXplLiBBbHNvIGNoZWNrIGlmIHRoaXMKKwkgKiBpcyB0aGUgbGFz dCBwYWNrZXQKKwkgKi8KKwljaHVuayA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVh bDsKKwlpZiAoY2h1bmsgPiBlcC0+ZXAubWF4cGFja2V0KQorCQljaHVuayA9IGVwLT5lcC5tYXhw YWNrZXQ7CisJZWxzZSBpZiAoKGNodW5rIDwgZXAtPmVwLm1heHBhY2tldCkgfHwgIXJlcS0+cmVx Lnplcm8pCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCUVQVkRCRyhlcCwgInNlbmQgY2h1bms9 JWQgbGFzdD0lZCwgcmVxLT5hY3Q9JWQgbXA9JWRcbiIsCisJICAgICAgIGNodW5rLCByZXEtPmxh c3RfZGVzYywgcmVxLT5yZXEuYWN0dWFsLCBlcC0+ZXAubWF4cGFja2V0KTsKKworCS8qCisJICog Q29weSBkYXRhIGlmIGFueSAoaW50ZXJuYWwgcmVxdWVzdHMgYWxyZWFkeSBoYXZlIGRhdGEKKwkg KiBpbiB0aGUgRVAgYnVmZmVyKQorCSAqLworCWlmIChjaHVuayAmJiByZXEtPnJlcS5idWYpCisJ CW1lbWNweShlcC0+YnVmLCByZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWwsIGNodW5rKTsK KworCS8qIFJlbWVtYmVyIGNodW5rIHNpemUgYW5kIHRyaWdnZXIgc2VuZCAqLworCXJlZyA9IFZI VUJfRVAwX1NFVF9UWF9MRU4oY2h1bmspOworCXdyaXRlbChyZWcsIGVwLT5lcDAuY3Rsc3RhdCk7 CisJd3JpdGVsKHJlZyB8IFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOwor CXJlcS0+cmVxLmFjdHVhbCArPSBjaHVuazsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXAw X3J4X3ByaW1lKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJRVBWREJHKGVwLCAicnggcHJp bWVcbiIpOworCisJLyogUHJpbWUgZW5kcG9pbnQgZm9yIHJlY2VpdmluZyBkYXRhICovCisJd3Jp dGVsKFZIVUJfRVAwX1JYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQgKyBBU1RfVkhVQl9FUDBf Q1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2VwMF9kb19yZWNlaXZlKHN0cnVjdCBh c3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSwKKwkJCQkgICAgdW5zaWdu ZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcmVtYWluOworCWludCByYyA9IDA7CisKKwkv KiBXZSBhcmUgcmVjZWl2aW5nLi4uIGdyYWIgcmVxdWVzdCAqLworCXJlbWFpbiA9IHJlcS0+cmVx Lmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKKworCUVQVkRCRyhlcCwgInJlY2VpdmUgZ290PSVk IHJlbWFpbj0lZFxuIiwgbGVuLCByZW1haW4pOworCisJLyogQXJlIHdlIGdldHRpbmcgbW9yZSB0 aGFuIGFza2VkID8gKi8KKwlpZiAobGVuID4gcmVtYWluKSB7CisJCUVQREJHKGVwLCAicmVjZWl2 aW5nIHRvbyBtdWNoIChvdmY6ICVkKSAhXG4iLAorCQkgICAgICBsZW4gLSByZW1haW4pOworCQls ZW4gPSByZW1haW47CisJCXJjID0gLUVPVkVSRkxPVzsKKwl9CisJaWYgKGxlbiAmJiByZXEtPnJl cS5idWYpCisJCW1lbWNweShyZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWwsIGVwLT5idWYs IGxlbik7CisJcmVxLT5yZXEuYWN0dWFsICs9IGxlbjsKKworCS8qIERvbmUgPyAqLworCWlmIChs ZW4gPCBlcC0+ZXAubWF4cGFja2V0IHx8IGxlbiA9PSByZW1haW4pIHsKKwkJZXAtPmVwMC5zdGF0 ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJCXdyaXRlbChWSFVCX0VQMF9UWF9CVUZGX1JEWSwgZXAt PmVwMC5jdGxzdGF0KTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCByYyk7CisJfSBlbHNlCisJ CWFzdF92aHViX2VwMF9yeF9wcmltZShlcCk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRs ZV9hY2soc3RydWN0IGFzdF92aHViX2VwICplcCwgYm9vbCBpbl9hY2spCit7CisJc3RydWN0IGFz dF92aHViX3JlcSAqcmVxOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0 cnVjdCBkZXZpY2UgKmRldiA9ICZ2aHViLT5wZGV2LT5kZXY7CisJYm9vbCBzdGFsbCA9IGZhbHNl OworCXUzMiBzdGF0OworCisJLyogUmVhZCBFUDAgc3RhdHVzICovCisJc3RhdCA9IHJlYWRsKGVw LT5lcDAuY3Rsc3RhdCk7CisKKwkvKiBHcmFiIGN1cnJlbnQgcmVxdWVzdCBpZiBhbnkgKi8KKwly ZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHVi X3JlcSwgcXVldWUpOworCisJRVBWREJHKGVwLCAiQUNLIHN0YXR1cz0lMDh4LHN0YXRlPSVkIGlz X2luPSVkIGluX2Fjaz0lZCByZXE9JXBcbiIsCisJCXN0YXQsIGVwLT5lcDAuc3RhdGUsIGVwLT5l cDAuZGlyX2luLCBpbl9hY2ssIHJlcSk7CisKKwlzd2l0Y2goZXAtPmVwMC5zdGF0ZSkgeworCWNh c2UgZXAwX3N0YXRlX3Rva2VuOgorCQkvKiBUaGVyZSBzaG91bGQgYmUgbm8gcmVxdWVzdCBxdWV1 ZWQgaW4gdGhhdCBzdGF0ZS4uLiAqLworCQlpZiAocmVxKSB7CisJCQlkZXZfd2FybihkZXYsICJy ZXF1ZXN0IHByZXNlbnQgd2hpbGUgaW4gVE9LRU4gc3RhdGVcbiIpOworCQkJYXN0X3ZodWJfbnVr ZShlcCwgLUVJTlZBTCk7CisJCX0KKwkJZGV2X3dhcm4oZGV2LCAiYWNrIHdoaWxlIGluIFRPS0VO IHN0YXRlXG4iKTsKKwkJc3RhbGwgPSB0cnVlOworCQlicmVhazsKKwljYXNlIGVwMF9zdGF0ZV9k YXRhOgorCQkvKiBDaGVjayB0aGUgc3RhdGUgYml0cyBjb3JyZXNwb25kaW5nIHRvIG91ciBkaXJl Y3Rpb24gKi8KKwkJaWYgKChlcC0+ZXAwLmRpcl9pbiAmJiAoc3RhdCAmIFZIVUJfRVAwX1RYX0JV RkZfUkRZKSkgfHwKKwkJICAgICghZXAtPmVwMC5kaXJfaW4gJiYgKHN0YXQgJiBWSFVCX0VQMF9S WF9CVUZGX1JEWSkpIHx8CisJCSAgICAoZXAtPmVwMC5kaXJfaW4gIT0gaW5fYWNrKSkgeworCQkJ ZGV2X3dhcm4oZGV2LCAiaXJxIHN0YXRlIG1pc21hdGNoIik7CisJCQlzdGFsbCA9IHRydWU7CisJ CQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBXZSBhcmUgaW4gZGF0YSBwaGFzZSBhbmQgdGhlcmUn cyBubyByZXF1ZXN0LCBzb21ldGhpbmcgaXMKKwkJICogd3JvbmcsIHN0YWxsCisJCSAqLworCQlp ZiAoIXJlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAiZGF0YSBwaGFzZSwgbm8gcmVxdWVzdFxuIik7 CisJCQlzdGFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdlIGhhdmUgYSByZXF1 ZXN0LCBoYW5kbGUgZGF0YSB0cmFuc2ZlcnMgKi8KKwkJaWYgKGVwLT5lcDAuZGlyX2luKQorCQkJ YXN0X3ZodWJfZXAwX2RvX3NlbmQoZXAsIHJlcSk7CisJCWVsc2UKKwkJCWFzdF92aHViX2VwMF9k b19yZWNlaXZlKGVwLCByZXEsIFZIVUJfRVAwX1JYX0xFTihzdGF0KSk7CisJCXJldHVybjsKKwlj YXNlIGVwMF9zdGF0ZV9zdGF0dXM6CisJCS8qIE51a2Ugc3RhbGUgcmVxdWVzdHMgKi8KKwkJaWYg KHJlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAicmVxdWVzdCBwcmVzZW50IHdoaWxlIGluIFNUQVRV UyBzdGF0ZVxuIik7CisJCQlhc3Rfdmh1Yl9udWtlKGVwLCAtRUlOVkFMKTsKKwkJfQorCisJCS8q CisJCSAqIElmIHRoZSBzdGF0dXMgcGhhc2UgY29tcGxldGVzIHdpdGggdGhlIHdyb25nIGFjaywg c3RhbGwKKwkJICogdGhlIGVuZHBvaW50IGp1c3QgaW4gY2FzZSwgdG8gYWJvcnQgd2hhdGV2ZXIg dGhlIGhvc3QKKwkJICogd2FzIGRvaW5nLgorCQkgKi8KKwkJaWYgKGVwLT5lcDAuZGlyX2luID09 IGluX2FjaykgeworCQkJZGV2X3dhcm4oZGV2LCAic3RhdHVzIGRpcmVjdGlvbiBtaXNtYXRjaFxu Iik7CisJCQlzdGFsbCA9IHRydWU7CisJCX0KKwl9CisKKwkvKiBSZXNldCB0byB0b2tlbiBzdGF0 ZSAqLworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfdG9rZW47CisJaWYgKHN0YWxsKQorCQl3 cml0ZWwoVkhVQl9FUDBfQ1RSTF9TVEFMTCwgZXAtPmVwMC5jdGxzdGF0KTsKK30KKworc3RhdGlj IGludCBhc3Rfdmh1Yl9lcDBfcXVldWUoc3RydWN0IHVzYl9lcCogdV9lcCwgc3RydWN0IHVzYl9y ZXF1ZXN0ICp1X3JlcSwKKwkJCSAgICAgIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgYXN0 X3ZodWJfcmVxICpyZXEgPSB0b19hc3RfcmVxKHVfcmVxKTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAg KmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHVi OworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2aHViLT5wZGV2LT5kZXY7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKworCS8qIFBhcmFub2lkIGNoZWtzICovCisJaWYgKCF1X3JlcSB8fCAoIXVfcmVx LT5jb21wbGV0ZSAmJiAhcmVxLT5pbnRlcm5hbCkpIHsKKwkJZGV2X3dhcm4oZGV2LCAiQm9ndXMg RVAwIHJlcXVlc3QgISB1X3JlcT0lcFxuIiwgdV9yZXEpOworCQlpZiAodV9yZXEpIHsKKwkJCWRl dl93YXJuKGRldiwgImNvbXBsZXRlPSVwIGludGVybmFsPSVkXG4iLAorCQkJCSB1X3JlcS0+Y29t cGxldGUsIHJlcS0+aW50ZXJuYWwpOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8q IE5vdCBlbmRwb2ludCAwID8gKi8KKwlpZiAoV0FSTl9PTihlcC0+ZF9pZHggIT0gMCkpCisJCXJl dHVybiAtRUlOVkFMOworCisJLyogRGlzYWJsZWQgZGV2aWNlICovCisJaWYgKGVwLT5kZXYgJiYg KCFlcC0+ZGV2LT5lbmFibGVkIHx8IGVwLT5kZXYtPnN1c3BlbmRlZCkpCisJCXJldHVybiAtRVNI VVRET1dOOworCisJLyogRGF0YSwgbm8gYnVmZmVyIGFuZCBub3QgaW50ZXJuYWwgPyAqLworCWlm ICh1X3JlcS0+bGVuZ3RoICYmICF1X3JlcS0+YnVmICYmICFyZXEtPmludGVybmFsKSB7CisJCWRl dl93YXJuKGRldiwgIlJlcXVlc3Qgd2l0aCBubyBidWZmZXIgIVxuIik7CisJCXJldHVybiAtRUlO VkFMOworCX0KKworCUVQVkRCRyhlcCwgImVucXVldWUgcmVxIEAlcFxuIiwgcmVxKTsKKwlFUFZE QkcoZXAsICIgIGw9JWQgemVybz0lZCBub3Nob3J0PSVkIGlzX2luPSVkXG4iLAorCSAgICAgICB1 X3JlcS0+bGVuZ3RoLCB1X3JlcS0+emVybywKKwkgICAgICAgdV9yZXEtPnNob3J0X25vdF9vaywg ZXAtPmVwMC5kaXJfaW4pOworCisJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IHByb2dyZXNzIGZpZWxk cyAqLworCXVfcmVxLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJdV9yZXEtPmFjdHVhbCA9IDA7 CisJcmVxLT5sYXN0X2Rlc2MgPSAtMTsKKwlyZXEtPmFjdGl2ZSA9IGZhbHNlOworCisJc3Bpbl9s b2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIEVQMCBjYW4gb25seSBzdXBw b3J0IGEgc2luZ2xlIHJlcXVlc3QgYXQgYSB0aW1lICovCisJaWYgKCFsaXN0X2VtcHR5KCZlcC0+ cXVldWUpIHx8IGVwLT5lcDAuc3RhdGUgPT0gZXAwX3N0YXRlX3Rva2VuKSB7CisJCWRldl93YXJu KGRldiwgIkVQMDogUmVxdWVzdCBpbiB3cm9uZyBzdGF0ZVxuIik7CisJCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkv KiBBZGQgcmVxdWVzdCB0byBsaXN0IGFuZCBraWNrIHByb2Nlc3NpbmcgaWYgZW1wdHkgKi8KKwls aXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKworCWlmIChlcC0+ZXAwLmRp cl9pbikgeworCQkvKiBJTiByZXF1ZXN0LCBzZW5kIGRhdGEgKi8KKwkJYXN0X3ZodWJfZXAwX2Rv X3NlbmQoZXAsIHJlcSk7CisJfSBlbHNlIGlmICh1X3JlcS0+bGVuZ3RoID09IDApIHsKKwkJLyog MC1sZW4gcmVxdWVzdCwgc2VuZCBjb21wbGV0aW9uIGFzIHJ4ICovCisJCUVQVkRCRyhlcCwgIjAt bGVuZ3RoIHJ4IGNvbXBsZXRpb25cbiIpOworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0 YXR1czsKKwkJd3JpdGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOwor CQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIDApOworCX0gZWxzZSB7CisJCS8qIE9VVCByZXF1ZXN0 LCBzdGFydCByZWNlaXZlciAqLworCQlhc3Rfdmh1Yl9lcDBfcnhfcHJpbWUoZXApOworCX0KKwor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2VwMF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAqIHVf ZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEpCit7CisJc3RydWN0IGFzdF92aHViX2VwICpl cCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsK KwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQg cmMgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsK KworCS8qIE9ubHkgb25lIHJlcXVlc3QgY2FuIGJlIGluIHRoZSBxdWV1ZSAqLworCXJlcSA9IGxp c3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBx dWV1ZSk7CisKKwkvKiBJcyBpdCBvdXJzID8gKi8KKwlpZiAocmVxICYmIHVfcmVxID09ICZyZXEt PnJlcSkgeworCQlFUFZEQkcoZXAsICJkZXF1ZXVlIHJlcSBAJXBcbiIsIHJlcSk7CisKKwkJLyoK KwkJICogV2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggImFjdGl2ZSIgYXMgYWxsCisJCSAqIERN QXMgZ28gdG8gdGhlIEVQIGJ1ZmZlcnMsIG5vdCB0aGUgcmVxdWVzdC4KKwkJICovCisJCWFzdF92 aHViX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOworCisJCS8qIFdlIGRvIHN0YWxsIHRoZSBF UCB0byBjbGVhbiB0aGluZ3MgdXAgaW4gSFcgKi8KKwkJd3JpdGVsKFZIVUJfRVAwX0NUUkxfU1RB TEwsIGVwLT5lcDAuY3Rsc3RhdCk7CisJCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVz OworCQllcC0+ZXAwLmRpcl9pbiA9IGZhbHNlOworCQlyYyA9IDA7CisJfQorCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3Rh dGljIGNvbnN0IHN0cnVjdCB1c2JfZXBfb3BzIGFzdF92aHViX2VwMF9vcHMgPSB7CisJLnF1ZXVl CQk9IGFzdF92aHViX2VwMF9xdWV1ZSwKKwkuZGVxdWV1ZQk9IGFzdF92aHViX2VwMF9kZXF1ZXVl LAorCS5hbGxvY19yZXF1ZXN0CT0gYXN0X3ZodWJfYWxsb2NfcmVxdWVzdCwKKwkuZnJlZV9yZXF1 ZXN0CT0gYXN0X3ZodWJfZnJlZV9yZXF1ZXN0LAorfTsKKwordm9pZCBhc3Rfdmh1Yl9pbml0X2Vw MChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCSAgICAg ICBzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkZXYpCit7CisJbWVtc2V0KGVwLCAwLCBzaXplb2YoKmVw KSk7CisKKwlJTklUX0xJU1RfSEVBRCgmZXAtPmVwLmVwX2xpc3QpOworCUlOSVRfTElTVF9IRUFE KCZlcC0+cXVldWUpOworCWVwLT5lcC5vcHMgPSAmYXN0X3ZodWJfZXAwX29wczsKKwllcC0+ZXAu bmFtZSA9ICJlcDAiOworCWVwLT5lcC5jYXBzLnR5cGVfY29udHJvbCA9IHRydWU7CisJdXNiX2Vw X3NldF9tYXhwYWNrZXRfbGltaXQoJmVwLT5lcCwgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpOwor CWVwLT5kX2lkeCA9IDA7CisJZXAtPmRldiA9IGRldjsKKwllcC0+dmh1YiA9IHZodWI7CisJZXAt PmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV90b2tlbjsKKwlJTklUX0xJU1RfSEVBRCgmZXAtPmVwMC5y ZXEucXVldWUpOworCWVwLT5lcDAucmVxLmludGVybmFsID0gdHJ1ZTsKKworCS8qIFNtYWxsIGRp ZmZlcmVuY2UgYmV0d2VlbiB2SHViIGFuZCBkZXZpY2VzICovCisJaWYgKGRldikgeworCQllcC0+ ZXAwLmN0bHN0YXQgPSBkZXYtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRVAwX0NUUkw7CisJCWVwLT5l cDAuc2V0dXAgPSB2aHViLT5yZWdzICsKKwkJCUFTVF9WSFVCX1NFVFVQMCArIDggKiAoZGV2LT5p bmRleCArIDEpOworCQllcC0+YnVmID0gdmh1Yi0+ZXAwX2J1ZnMgKworCQkJQVNUX1ZIVUJfRVAw X01BWF9QQUNLRVQgKiAoZGV2LT5pbmRleCArIDEpOworCQllcC0+YnVmX2RtYSA9IHZodWItPmVw MF9idWZzX2RtYSArCisJCQlBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqIChkZXYtPmluZGV4ICsg MSk7CisJfSBlbHNlIHsKKwkJZXAtPmVwMC5jdGxzdGF0ID0gdmh1Yi0+cmVncyArIEFTVF9WSFVC X0VQMF9DVFJMOworCQllcC0+ZXAwLnNldHVwID0gdmh1Yi0+cmVncyArIEFTVF9WSFVCX1NFVFVQ MDsKKwkJZXAtPmJ1ZiA9IHZodWItPmVwMF9idWZzOworCQllcC0+YnVmX2RtYSA9IHZodWItPmVw MF9idWZzX2RtYTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL2Vwbi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4u YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjBlZjkyYTk5YjM4Zgot LS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXBu LmMKQEAgLTAsMCArMSw4NDMgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w KworLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNC IGdhZGdldAorICoKKyAqIGVwbi5jIC0gR2VuZXJpYyBlbmRwb2ludHMgbWFuYWdlbWVudAorICoK KyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBp cyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5Cisg KiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFz IHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZl cnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxp bnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1 ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8 bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgv bGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3By b2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Ns ay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5o PgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4K KyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidmh1Yi5oIgorCisj ZGVmaW5lIEVYVFJBX0NIRUNLUworCisjaWZkZWYgRVhUUkFfQ0hFQ0tTCisjZGVmaW5lIENIRUNL KGVwLCBleHByLCBmbXQuLi4pIAkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICghKGV4cHIpKSBF UERCRyhlcCwgIkNIRUNLOiIgZm10KTsJCVwKKwl9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBD SEVDSyhlcCwgZXhwciwgZm10Li4uKQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMg dm9pZCBhc3Rfdmh1Yl9lcG5fa2ljayhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBzdHJ1Y3QgYXN0 X3ZodWJfcmVxICpyZXEpCit7CisJdW5zaWduZWQgaW50IGFjdCA9IHJlcS0+cmVxLmFjdHVhbDsK Kwl1bnNpZ25lZCBpbnQgbGVuID0gcmVxLT5yZXEubGVuZ3RoOworCXVuc2lnbmVkIGludCBjaHVu azsKKworCS8qIFRoZXJlIHNob3VsZCBiZSBubyBETUEgb25nb2luZyAqLworCVdBUk5fT04ocmVx LT5hY3RpdmUpOworCisJLyogQ2FsY3VsYXRlIG5leHQgY2h1bmsgc2l6ZSAqLworCWNodW5rID0g bGVuIC0gYWN0OworCWlmIChjaHVuayA+IGVwLT5lcC5tYXhwYWNrZXQpCisJCWNodW5rID0gZXAt PmVwLm1heHBhY2tldDsKKwllbHNlIGlmICgoY2h1bmsgPCBlcC0+ZXAubWF4cGFja2V0KSB8fCAh cmVxLT5yZXEuemVybykKKwkJcmVxLT5sYXN0X2Rlc2MgPSAxOworCisJRVBWREJHKGVwLCAia2lj ayByZXEgJXAgYWN0PSVkLyVkIGNodW5rPSVkIGxhc3Q9JWRcbiIsCisJICAgICAgIHJlcSwgYWN0 LCBsZW4sIGNodW5rLCByZXEtPmxhc3RfZGVzYyk7CisKKwkvKiBJZiBETUEgdW5hdmFpbGFibGUs IHVzaW5nIHN0YWdpbmcgRVAgYnVmZmVyICovCisJaWYgKCFyZXEtPnJlcS5kbWEpIHsKKworCQkv KiBGb3IgSU4gdHJhbnNmZXJzLCBjb3B5IGRhdGEgb3ZlciBmaXJzdCAqLworCQlpZiAoZXAtPmVw bi5pc19pbikKKwkJCW1lbWNweShlcC0+YnVmLCByZXEtPnJlcS5idWYgKyBhY3QsIGNodW5rKTsK KwkJd3JpdGVsKGVwLT5idWZfZG1hLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX0JB U0UpOworCX0gZWxzZQorCQl3cml0ZWwocmVxLT5yZXEuZG1hICsgYWN0LCBlcC0+ZXBuLnJlZ3Mg KyBBU1RfVkhVQl9FUF9ERVNDX0JBU0UpOworCisJLyogU3RhcnQgRE1BICovCisJcmVxLT5hY3Rp dmUgPSB0cnVlOworCXdyaXRlbChWSFVCX0VQX0RNQV9TRVRfVFhfU0laRShjaHVuayksCisJICAg ICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKwl3cml0ZWwoVkhV Ql9FUF9ETUFfU0VUX1RYX1NJWkUoY2h1bmspIHwgVkhVQl9FUF9ETUFfU0lOR0xFX0tJQ0ssCisJ ICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKK30KKworc3Rh dGljIHZvaWQgYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2soc3RydWN0IGFzdF92aHViX2VwICplcCkK K3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1MzIg c3RhdDsKKworCS8qIFJlYWQgRVAgc3RhdHVzICovCisJc3RhdCA9IHJlYWRsKGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCS8qIEdyYWIgY3VycmVudCByZXF1ZXN0 IGlmIGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBz dHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlFUFZEQkcoZXAsICJBQ0sgc3RhdHVzPSUw OHggaXNfaW49JWQsIHJlcT0lcCAoYWN0aXZlPSVkKVxuIiwKKwkgICAgICAgc3RhdCwgZXAtPmVw bi5pc19pbiwgcmVxLCByZXEgPyByZXEtPmFjdGl2ZSA6IDApOworCisJLyogSW4gYWJzZW5jZSBv ZiBhIHJlcXVlc3QsIGJhaWwgb3V0LCBtdXN0IGhhdmUgYmVlbiBkZXF1ZXVlZCAqLworCWlmICgh cmVxKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlcXVlc3Qgbm90IGFjdGl2ZSwgbW92ZSBvbiB0 byBwcm9jZXNzaW5nIHF1ZXVlLCBhY3RpdmUgcmVxdWVzdAorCSAqIHdhcyBwcm9iYWJseSBkZXF1 ZXVlZAorCSAqLworCWlmICghcmVxLT5hY3RpdmUpCisJCWdvdG8gbmV4dF9jaHVuazsKKworCS8q IENoZWNrIGlmIEhXIGhhcyBtb3ZlZCBvbiAqLworCWlmIChWSFVCX0VQX0RNQV9SUFRSKHN0YXQp ICE9IDApIHsKKwkJRVBEQkcoZXAsICJETUEgcmVhZCBwb2ludGVyIG5vdCAwICFcbiIpOworCQly ZXR1cm47CisJfQorCisJLyogTm8gY3VycmVudCBETUEgb25nb2luZyAqLworCXJlcS0+YWN0aXZl ID0gZmFsc2U7CisKKwkvKiBHcmFiIGxlbmdodCBvdXQgb2YgSFcgKi8KKwlsZW4gPSBWSFVCX0VQ X0RNQV9UWF9TSVpFKHN0YXQpOworCisJLyogSWYgbm90IHVzaW5nIERNQSwgY29weSBkYXRhIG91 dCBpZiBuZWVkZWQgKi8KKwlpZiAoIXJlcS0+cmVxLmRtYSAmJiAhZXAtPmVwbi5pc19pbiAmJiBs ZW4pCisJCW1lbWNweShyZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWwsIGVwLT5idWYsIGxl bik7CisKKwkvKiBBZGp1c3Qgc2l6ZSAqLworCXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisKKwkv KiBDaGVjayBmb3Igc2hvcnQgcGFja2V0ICovCisJaWYgKGxlbiA8IGVwLT5lcC5tYXhwYWNrZXQp CisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCS8qIFRoYXQncyBpdCA/IGNvbXBsZXRlIHRoZSBy ZXF1ZXN0IGFuZCBwaWNrIGEgbmV3IG9uZSAqLworCWlmIChyZXEtPmxhc3RfZGVzYyA+PSAwKSB7 CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgMCk7CisJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlf b3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLAorCQkJCQkgICAgICAgcXVl dWUpOworCisJCS8qCisJCSAqIER1ZSB0byBsb2NrIGRyb3BwaW5nIGluc2lkZSAiZG9uZSIgdGhl IG5leHQgcmVxdWVzdCBjb3VsZAorCQkgKiBhbHJlYWR5IGJlIGFjdGl2ZSwgc28gY2hlY2sgZm9y IHRoYXQgYW5kIGJhaWwgaWYgbmVlZGVkLgorCQkgKi8KKwkJaWYgKCFyZXEgfHwgcmVxLT5hY3Rp dmUpCisJCQlyZXR1cm47CisJfQorCisgbmV4dF9jaHVuazoKKwlhc3Rfdmh1Yl9lcG5fa2ljayhl cCwgcmVxKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXN0X3ZodWJfY291bnRf ZnJlZV9kZXNjcyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCS8qCisJICogZF9uZXh0ID09 IGRfbGFzdCBtZWFucyBkZXNjcmlwdG9yIGxpc3QgZW1wdHkgdG8gSFcsCisJICogdGh1cyB3ZSBj YW4gb25seSBoYXZlIEFTVF9WSFVCX0RFU0NTX0NPVU5ULTEgZGVzY3JpcHRvcnMKKwkgKiBpbiB0 aGUgbGlzdAorCSAqLworCXJldHVybiAoZXAtPmVwbi5kX2xhc3QgKyBBU1RfVkhVQl9ERVNDU19D T1VOVCAtIGVwLT5lcG4uZF9uZXh0IC0gMSkgJgorCQkoQVNUX1ZIVUJfREVTQ1NfQ09VTlQgLSAx KTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2tpY2tfZGVzYyhzdHJ1Y3QgYXN0X3Zo dWJfZXAgKmVwLAorCQkJCSAgIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSkKK3sKKwl1bnNpZ25l ZCBpbnQgYWN0ID0gcmVxLT5hY3RfY291bnQ7CisJdW5zaWduZWQgaW50IGxlbiA9IHJlcS0+cmVx Lmxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisKKwkvKiBNYXJrIHJlcXVlc3QgYWN0aXZl IGlmIG5vdCBhbHJlYWR5ICovCisJcmVxLT5hY3RpdmUgPSB0cnVlOworCisJLyogSWYgdGhlIHJl cXVlc3Qgd2FzIGFscmVhZHkgY29tcGxldGVseSB3cml0dGVuLCBkbyBub3RoaW5nICovCisJaWYg KHJlcS0+bGFzdF9kZXNjID49IDApCisJCXJldHVybjsKKworCUVQVkRCRyhlcCwgImtpY2sgYWN0 PSVkLyVkIGNodW5rX21heD0lZCBmcmVlX2Rlc2NzPSVkXG4iLAorCSAgICAgICBhY3QsIGxlbiwg ZXAtPmVwbi5jaHVua19tYXgsIGFzdF92aHViX2NvdW50X2ZyZWVfZGVzY3MoZXApKTsKKworCS8q IFdoaWxlIHdlIGNhbiBjcmVhdGUgZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSAoYXN0X3ZodWJfY291 bnRfZnJlZV9kZXNjcyhlcCkgJiYgcmVxLT5sYXN0X2Rlc2MgPCAwKSB7CisJCXN0cnVjdCBhc3Rf dmh1Yl9kZXNjICpkZXNjOworCQl1bnNpZ25lZCBpbnQgZF9udW07CisKKwkJLyogR3JhYiBuZXh0 IGZyZWUgZGVzY3JpcHRvciAqLworCQlkX251bSA9IGVwLT5lcG4uZF9uZXh0OworCQlkZXNjID0g JmVwLT5lcG4uZGVzY3NbZF9udW1dOworCQllcC0+ZXBuLmRfbmV4dCA9IChkX251bSArIDEpICYg KEFTVF9WSFVCX0RFU0NTX0NPVU5UIC0gMSk7CisKKwkJLyogQ2FsY3VsYXRlIG5leHQgY2h1bmsg c2l6ZSAqLworCQljaHVuayA9IGxlbiAtIGFjdDsKKwkJaWYgKGNodW5rIDw9IGVwLT5lcG4uY2h1 bmtfbWF4KSB7CisJCQkvKgorCQkJICogSXMgdGhpcyB0aGUgbGFzdCBwYWNrZXQgPyBCZWNhdXNl IG9mIGhhdmluZyB1cCB0byA4CisJCQkgKiBwYWNrZXRzIGluIGEgZGVzY3JpcHRvciB3ZSBjYW4n dCBqdXN0IGNvbXBhcmUgImNodW5rIgorCQkJICogd2l0aCBlcC5tYXhwYWNrZXQuIFdlIGhhdmUg dG8gc2VlIGlmIGl0J3MgYSBtdWx0aXBsZQorCQkJICogb2YgaXQgdG8ga25vdyBpZiB3ZSBoYXZl IHRvIHNlbmQgYSB6ZXJvIHBhY2tldC4KKwkJCSAqIFNhZGx5IHRoYXQgaW52b2x2ZXMgYSBtb2R1 bG8gd2hpY2ggaXMgYSBiaXQgZXhwZW5zaXZlCisJCQkgKiBidXQgcHJvYmFibHkgc3RpbGwgYmV0 dGVyIHRoYW4gbm90IGRvaW5nIGl0LgorCQkJICovCisJCQlpZiAoIWNodW5rIHx8ICFyZXEtPnJl cS56ZXJvIHx8IChjaHVuayAlIGVwLT5lcC5tYXhwYWNrZXQpICE9IDApCisJCQkJcmVxLT5sYXN0 X2Rlc2MgPSBkX251bTsKKwkJfSBlbHNlIHsKKwkJCWNodW5rID0gZXAtPmVwbi5jaHVua19tYXg7 CisJCX0KKworCQlFUFZEQkcoZXAsICIgY2h1bms6IGFjdD0lZC8lZCBjaHVuaz0lZCBsYXN0PSVk IGRlc2M9JWQgZnJlZT0lZFxuIiwKKwkJICAgICAgIGFjdCwgbGVuLCBjaHVuaywgcmVxLT5sYXN0 X2Rlc2MsIGRfbnVtLAorCQkgICAgICAgYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhlcCkpOwor CisJCS8qIFBvcHVsYXRlIGRlc2NyaXB0b3IgKi8KKwkJZGVzYy0+dzAgPSBjcHVfdG9fbGUzMihy ZXEtPnJlcS5kbWEgKyBhY3QpOworCisJCS8qIEludGVycnVwdCBpZiBlbmQgb2YgcmVxdWVzdCBv ciBubyBtb3JlIGRlc2NyaXB0b3JzICovCisKKwkJLyoKKwkJICogVE9ETzogQmUgc21hcnRlciBh Ym91dCBpdCwgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2gKKwkJICogZGVzY3JpcHRvcnMgcmVxdWVz dCBhbiBpbnRlcnJ1cHQgYmVmb3JlIHF1ZXVlIGVtcHR5CisJCSAqIG9yIHNvIGluIG9yZGVyIHRv IGJlIGFibGUgdG8gcG9wdWxhdGUgbW9yZSBiZWZvcmUKKwkJICogdGhlIEhXIHJ1bnMgb3V0LiBU aGlzIGlzbid0IGEgcHJvYmxlbSBhdCB0aGUgbW9tZW50CisJCSAqIGFzIHdlIHVzZSAyNTYgZGVz Y3JpcHRvcnMgYW5kIG9ubHkgcHV0IGF0IG1vc3Qgb25lCisJCSAqIHJlcXVlc3QgaW4gdGhlIHJp bmcuCisJCSAqLworCQlkZXNjLT53MSA9IGNwdV90b19sZTMyKFZIVUJfRFNDMV9JTl9TRVRfTEVO KGNodW5rKSk7CisJCWlmIChyZXEtPmxhc3RfZGVzYyA+PSAwIHx8ICFhc3Rfdmh1Yl9jb3VudF9m cmVlX2Rlc2NzKGVwKSkKKwkJCWRlc2MtPncxIHw9IGNwdV90b19sZTMyKFZIVUJfRFNDMV9JTl9J TlRFUlJVUFQpOworCisJCS8qIEFjY291bnQgcGFja2V0ICovCisJCXJlcS0+YWN0X2NvdW50ID0g YWN0ID0gYWN0ICsgY2h1bms7CisJfQorCisJLyogVGVsbCBIVyBhYm91dCBuZXcgZGVzY3JpcHRv cnMgKi8KKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VUX0NQVV9XUFRSKGVwLT5lcG4uZF9uZXh0KSwK KwkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCisJRVBW REJHKGVwLCAiSFcga2lja2VkLCBkX25leHQ9JWQgZHN0YXQ9JTA4eFxuIiwKKwkgICAgICAgZXAt PmVwbi5kX25leHQsIHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVT KSk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9oYW5kbGVfYWNrX2Rlc2Moc3RydWN0 IGFzdF92aHViX2VwICplcCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5zaWdu ZWQgaW50IGxlbiwgZF9sYXN0OworCXUzMiBzdGF0LCBzdGF0MTsKKworCS8qIFJlYWQgRVAgc3Rh dHVzLCB3b3JrYXJvdW5kIEhXIHJhY2UgKi8KKwlkbyB7CisJCXN0YXQgPSByZWFkbChlcC0+ZXBu LnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJCXN0YXQxID0gcmVhZGwoZXAtPmVw bi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCX0gd2hpbGUoc3RhdCAhPSBzdGF0 MSk7CisKKwkvKiBFeHRyYWN0IFJQVFIgKi8KKwlkX2xhc3QgPSBWSFVCX0VQX0RNQV9SUFRSKHN0 YXQpOworCisJLyogR3JhYiBjdXJyZW50IHJlcXVlc3QgaWYgYW55ICovCisJcmVxID0gbGlzdF9m aXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+cXVldWUsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsIHF1ZXVl KTsKKworCUVQVkRCRyhlcCwgIkFDSyBzdGF0dXM9JTA4eCBpc19pbj0lZCBlcC0+ZF9sYXN0PSVk Li4lZFxuIiwKKwkgICAgICAgc3RhdCwgZXAtPmVwbi5pc19pbiwgZXAtPmVwbi5kX2xhc3QsIGRf bGFzdCk7CisKKwkvKiBDaGVjayBhbGwgY29tcGxldGVkIGRlc2NyaXB0b3JzICovCisJd2hpbGUg KGVwLT5lcG4uZF9sYXN0ICE9IGRfbGFzdCkgeworCQlzdHJ1Y3QgYXN0X3ZodWJfZGVzYyAqZGVz YzsKKwkJdW5zaWduZWQgaW50IGRfbnVtOworCQlib29sIGlzX2xhc3RfZGVzYzsKKworCQkvKiBH cmFiIG5leHQgY29tcGxldGVkIGRlc2NyaXB0b3IgKi8KKwkJZF9udW0gPSBlcC0+ZXBuLmRfbGFz dDsKKwkJZGVzYyA9ICZlcC0+ZXBuLmRlc2NzW2RfbnVtXTsKKwkJZXAtPmVwbi5kX2xhc3QgPSAo ZF9udW0gKyAxKSAmIChBU1RfVkhVQl9ERVNDU19DT1VOVCAtIDEpOworCisJCS8qIEdyYWIgbGVu IG91dCBvZiBkZXNjcmlwdG9yICovCisJCWxlbiA9IFZIVUJfRFNDMV9JTl9MRU4obGUzMl90b19j cHUoZGVzYy0+dzEpKTsKKworCQlFUFZEQkcoZXAsICIgZGVzYyAlZCBsZW49JWQgcmVxPSVwIChh Y3Q9JWQpXG4iLAorCQkgICAgICAgZF9udW0sIGxlbiwgcmVxLCByZXEgPyByZXEtPmFjdGl2ZSA6 IDApOworCisJCS8qIElmIG5vIGFjdGl2ZSByZXF1ZXN0IHBlbmRpbmcsIG1vdmUgb24gKi8KKwkJ aWYgKCFyZXEgfHwgIXJlcS0+YWN0aXZlKQorCQkJY29udGludWU7CisKKwkJLyogQWRqdXN0IHNp emUgKi8KKwkJcmVxLT5yZXEuYWN0dWFsICs9IGxlbjsKKworCQkvKiBJcyB0aGF0IHRoZSBsYXN0 IGNodW5rID8gKi8KKwkJaXNfbGFzdF9kZXNjID0gcmVxLT5sYXN0X2Rlc2MgPT0gZF9udW07CisJ CUNIRUNLKGVwLCBpc19sYXN0X2Rlc2MgPT0gKGxlbiA8IGVwLT5lcC5tYXhwYWNrZXQgfHwKKwkJ CQkJICAgKHJlcS0+cmVxLmFjdHVhbCA+PSByZXEtPnJlcS5sZW5ndGggJiYKKwkJCQkJICAgICFy ZXEtPnJlcS56ZXJvKSksCisJCSAgICAgICJMYXN0IHBhY2tldCBkaXNjcmVwYW5jeTogbGFzdF9k ZXNjPSVkIGxlbj0lZCByLmFjdD0lZCAiCisJCSAgICAgICJyLmxlbj0lZCByLnplcm89JWQgbXA9 JWRcbiIsCisJCSAgICAgIGlzX2xhc3RfZGVzYywgbGVuLCByZXEtPnJlcS5hY3R1YWwsIHJlcS0+ cmVxLmxlbmd0aCwKKwkJICAgICAgcmVxLT5yZXEuemVybywgZXAtPmVwLm1heHBhY2tldCk7CisK KwkJaWYgKGlzX2xhc3RfZGVzYykgeworCQkJLyoKKwkJCSAqIEJlY2F1c2Ugd2UgY2FuIG9ubHkg aGF2ZSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUKKwkJCSAqIGluIG91ciBkZXNjcmlwdG9yIGxpc3Qg aW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwKKwkJCSAqIGRfbGFzdCBhbmQgZXAtPmRfbGFzdCBzaG91 bGQgbm93IGJlIGVxdWFsCisJCQkgKi8KKwkJCUNIRUNLKGVwLCBkX2xhc3QgPT0gZXAtPmVwbi5k X2xhc3QsCisJCQkgICAgICAiRE1BIHJlYWQgcHRyIG1pc21hdGNoICVkIHZzICVkXG4iLAorCQkJ ICAgICAgZF9sYXN0LCBlcC0+ZXBuLmRfbGFzdCk7CisKKwkJCS8qIE5vdGU6IGRvbmUgd2lsbCBk cm9wIGFuZCByZS1hY3F1aXJlIHRoZSBsb2NrICovCisJCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEs IDApOworCQkJcmVxID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+cXVldWUsCisJCQkJ CQkgICAgICAgc3RydWN0IGFzdF92aHViX3JlcSwKKwkJCQkJCSAgICAgICBxdWV1ZSk7CisJCQli cmVhazsKKwkJfQorCX0KKworCS8qIE1vcmUgd29yayA/ICovCisJaWYgKHJlcSkKKwkJYXN0X3Zo dWJfZXBuX2tpY2tfZGVzYyhlcCwgcmVxKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9lcG5fYWNrX2ly cShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCWlmIChlcC0+ZXBuLmRlc2NfbW9kZSkKKwkJ YXN0X3ZodWJfZXBuX2hhbmRsZV9hY2tfZGVzYyhlcCk7CisJZWxzZQorCQlhc3Rfdmh1Yl9lcG5f aGFuZGxlX2FjayhlcCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX3F1ZXVlKHN0cnVj dCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEsCisJCQkgICAgICBnZnBf dCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxID0gdG9fYXN0X3JlcSh1 X3JlcSk7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1 Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWJv b2wgZW1wdHk7CisJaW50IHJjOworCisJLyogUGFyYW5vaWQgY2hlY2tzICovCisJaWYgKCF1X3Jl cSB8fCAhdV9yZXEtPmNvbXBsZXRlIHx8ICF1X3JlcS0+YnVmKSB7CisJCWRldl93YXJuKCZ2aHVi LT5wZGV2LT5kZXYsICJCb2d1cyBFUG4gcmVxdWVzdCAhIHVfcmVxPSVwXG4iLCB1X3JlcSk7CisJ CWlmICh1X3JlcSkgeworCQkJZGV2X3dhcm4oJnZodWItPnBkZXYtPmRldiwgImNvbXBsZXRlPSVw IGludGVybmFsPSVkXG4iLAorCQkJCSB1X3JlcS0+Y29tcGxldGUsIHJlcS0+aW50ZXJuYWwpOwor CQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuZHBvaW50IGVuYWJsZWQgPyAqLwor CWlmICghZXAtPmVwbi5lbmFibGVkIHx8ICF1X2VwLT5kZXNjIHx8ICFlcC0+ZGV2IHx8ICFlcC0+ ZF9pZHggfHwKKwkgICAgIWVwLT5kZXYtPmVuYWJsZWQgfHwgZXAtPmRldi0+c3VzcGVuZGVkKSB7 CisJCUVQREJHKGVwLCJFbnF1ZWluZyByZXF1ZXN0IG9uIHdyb25nIG9yIGRpc2FibGVkIEVQXG4i KTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJLyogTWFwIHJlcXVlc3QgZm9yIERNQSBp ZiBwb3NzaWJsZS4gRm9yIG5vdywgdGhlIHJ1bGUgZm9yIERNQSBpcworCSAqIHRoYXQ6CisJICoK KwkgKiAgKiBGb3Igc2luZ2xlIHN0YWdlIG1vZGUgKG5vIGRlc2NyaXB0b3JzKToKKwkgKgorCSAq ICAgLSBUaGUgYnVmZmVyIGlzIGFsaWduZWQgdG8gYSA4IGJ5dGVzIGJvdW5kYXJ5IChIVyByZXF1 aXJlbWVudCkKKwkgKiAgIC0gRm9yIGEgT1VUIGVuZHBvaW50LCB0aGUgcmVxdWVzdCBzaXplIGlz IGEgbXVsdGlwbGUgb2YgdGhlIEVQCisJICogICAgIHBhY2tldCBzaXplIChvdGhlcndpc2UgdGhl IGNvbnRyb2xsZXIgd2lsbCBETUEgcGFzdCB0aGUgZW5kCisJICogICAgIG9mIHRoZSBidWZmZXIg aWYgdGhlIGhvc3QgaXMgc2VuZGluZyBhIHRvbyBsb25nIHBhY2tldCkuCisJICoKKwkgKiAgKiBG b3IgZGVzY3JpcHRvciBtb2RlICh0eCBvbmx5IGZvciBub3cpLCBhbHdheXMuCisJICoKKwkgKiBX ZSBjb3VsZCByZWxheCB0aGUgbGF0dGVyIGJ5IG1ha2luZyB0aGUgZGVjaXNpb24gdG8gdXNlIHRo ZSBib3VuY2UKKwkgKiBidWZmZXIgYmFzZWQgb24gdGhlIHNpemUgb2YgYSBnaXZlbiAqc2VnbWVu dCogb2YgdGhlIHJlcXVlc3QgcmF0aGVyCisJICogdGhhbiB0aGUgd2hvbGUgcmVxdWVzdC4KKwkg Ki8KKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUgfHwKKwkgICAgKCgoKHVuc2lnbmVkIGxvbmcpdV9y ZXEtPmJ1ZiAmIDcpID09IDApICYmCisJICAgICAoZXAtPmVwbi5pc19pbiB8fCAhKHVfcmVxLT5s ZW5ndGggJiAodV9lcC0+bWF4cGFja2V0IC0gMSkpKSkpIHsKKwkJcmMgPSB1c2JfZ2FkZ2V0X21h cF9yZXF1ZXN0KCZlcC0+ZGV2LT5nYWRnZXQsIHVfcmVxLAorCQkJCQkgICAgZXAtPmVwbi5pc19p bik7CisJCWlmIChyYykgeworCQkJZGV2X3dhcm4oJnZodWItPnBkZXYtPmRldiwKKwkJCQkgIlJl cXVlc3QgbWFwcGluZyBmYWlsdXJlICVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9 IGVsc2UKKwkJdV9yZXEtPmRtYSA9IDA7CisKKwlFUFZEQkcoZXAsICJlbnF1ZXVlIHJlcSBAJXBc biIsIHJlcSk7CisJRVBWREJHKGVwLCAiIGw9JWQgZG1hPTB4JXggemVybz0lZCBub3Nob3J0PSVk IG5vaXJxPSVkIGlzX2luPSVkXG4iLAorCSAgICAgICB1X3JlcS0+bGVuZ3RoLCAodTMyKXVfcmVx LT5kbWEsIHVfcmVxLT56ZXJvLAorCSAgICAgICB1X3JlcS0+c2hvcnRfbm90X29rLCB1X3JlcS0+ bm9faW50ZXJydXB0LAorCSAgICAgICBlcC0+ZXBuLmlzX2luKTsKKworCS8qIEluaXRpYWxpemUg cmVxdWVzdCBwcm9ncmVzcyBmaWVsZHMgKi8KKwl1X3JlcS0+c3RhdHVzID0gLUVJTlBST0dSRVNT OworCXVfcmVxLT5hY3R1YWwgPSAwOworCXJlcS0+YWN0X2NvdW50ID0gMDsKKwlyZXEtPmFjdGl2 ZSA9IGZhbHNlOworCXJlcS0+bGFzdF9kZXNjID0gLTE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZo dWItPmxvY2ssIGZsYWdzKTsKKwllbXB0eSA9IGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSk7CisKKwkv KiBBZGQgcmVxdWVzdCB0byBsaXN0IGFuZCBraWNrIHByb2Nlc3NpbmcgaWYgZW1wdHkgKi8KKwls aXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKwlpZiAoZW1wdHkpIHsKKwkJ aWYgKGVwLT5lcG4uZGVzY19tb2RlKQorCQkJYXN0X3ZodWJfZXBuX2tpY2tfZGVzYyhlcCwgcmVx KTsKKwkJZWxzZQorCQkJYXN0X3ZodWJfZXBuX2tpY2soZXAsIHJlcSk7CisJfQorCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBhc3Rfdmh1Yl9zdG9wX2FjdGl2ZV9yZXEoc3RydWN0IGFzdF92aHViX2VwICpl cCwKKwkJCQkgICAgIGJvb2wgcmVzdGFydF9lcCkKK3sKKwl1MzIgc3RhdGUsIHJlZywgbG9vcHM7 CisKKwkvKiBTdG9wIERNQSBhY3Rpdml0eSAqLworCXdyaXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBB U1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisKKwkvKiBXYWl0IGZvciBpdCB0byBjb21wbGV0ZSAq LworCWZvciAobG9vcHMgPSAwOyBsb29wcyA8IDEwMDA7IGxvb3BzKyspIHsKKwkJc3RhdGUgPSBy ZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJCXN0YXRlID0g VkhVQl9FUF9ETUFfUFJPQ19TVEFUVVMoc3RhdGUpOworCQlpZiAoc3RhdGUgPT0gRVBfRE1BX1BS T0NfUlhfSURMRSB8fAorCQkgICAgc3RhdGUgPT0gRVBfRE1BX1BST0NfVFhfSURMRSkKKwkJCWJy ZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWlmIChsb29wcyA+PSAxMDAwKQorCQlkZXZfd2Fybigm ZXAtPnZodWItPnBkZXYtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgRE1BXG4iKTsKKworCS8q IElmIHdlIGRvbid0IGhhdmUgdG8gcmVzdGFydCB0aGUgZW5kcG9pbnQsIHRoYXQncyBpdCAqLwor CWlmICghcmVzdGFydF9lcCkKKwkJcmV0dXJuOworCisJLyogUmVzdGFydCB0aGUgZW5kcG9pbnQg Ki8KKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpIHsKKwkJLyoKKwkJICogVGFrZSBvdXQgZGVzY3Jp cHRvcnMgYnkgcmVzZXR0aW5nIHRoZSBETUEgcmVhZAorCQkgKiBwb2ludGVyIHRvIGJlIGVxdWFs IHRvIHRoZSBDUFUgd3JpdGUgcG9pbnRlci4KKwkJICoKKwkJICogTm90ZTogSWYgd2UgZXZlciBz dXBwb3J0IGNyZWF0aW5nIGRlc2NyaXB0b3JzIGZvcgorCQkgKiByZXF1ZXN0cyB0aGF0IGFyZW4n dCB0aGUgaGVhZCBvZiB0aGUgcXVldWUsIHdlCisJCSAqIG1heSBoYXZlIHRvIGRvIHNvbWV0aGlu ZyBtb3JlIGNvbXBsZXggaGVyZSwKKwkJICogZXNwZWNpYWxseSBpZiB0aGUgcmVxdWVzdCBiZWlu ZyB0YWtlbiBvdXQgaXMKKwkJICogbm90IHRoZSBjdXJyZW50IGhlYWQgZGVzY3JpcHRvcnMuCisJ CSAqLworCQlyZWcgPSBWSFVCX0VQX0RNQV9TRVRfUlBUUihlcC0+ZXBuLmRfbmV4dCkgfAorCQkJ VkhVQl9FUF9ETUFfU0VUX0NQVV9XUFRSKGVwLT5lcG4uZF9uZXh0KTsKKwkJd3JpdGVsKHJlZywg ZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCisJCS8qIFRoZW4gdHVy biBpdCBiYWNrIG9uICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mLAorCQkgICAgICAgZXAt PmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCX0gZWxzZSB7CisJCS8qIFNp bmdsZSBtb2RlOiBqdXN0IHR1cm4gaXQgYmFjayBvbiAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFf Y29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsK Kwl9Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX2RlcXVldWUoc3RydWN0IHVzYl9lcCog dV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAg KmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHVi OworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlu dCByYyA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3Mp OworCisJLyogTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVkIG9uIHRoaXMgZW5kcG9pbnQg Ki8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CisJCWlm ICgmcmVxLT5yZXEgPT0gdV9yZXEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoJnJlcS0+cmVxID09 IHVfcmVxKSB7CisJCUVQVkRCRyhlcCwgImRlcXVldWUgcmVxIEAlcCBhY3RpdmU9JWRcbiIsCisJ CSAgICAgICByZXEsIHJlcS0+YWN0aXZlKTsKKwkJaWYgKHJlcS0+YWN0aXZlKQorCQkJYXN0X3Zo dWJfc3RvcF9hY3RpdmVfcmVxKGVwLCB0cnVlKTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAt RUNPTk5SRVNFVCk7CisJCXJjID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2 aHViLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCit2b2lkIGFzdF92aHViX3VwZGF0 ZV9lcG5fc3RhbGwoc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwl1MzIgcmVnOworCisJaWYg KFdBUk5fT04oZXAtPmRfaWR4ID09IDApKQorCQlyZXR1cm47CisJcmVnID0gcmVhZGwoZXAtPmVw bi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsKKwlpZiAoZXAtPmVwbi5zdGFsbGVkIHx8IGVw LT5lcG4ud2VkZ2VkKQorCQlyZWcgfD0gVkhVQl9FUF9DRkdfU1RBTExfQ1RSTDsKKwllbHNlCisJ CXJlZyAmPSB+VkhVQl9FUF9DRkdfU1RBTExfQ1RSTDsKKwl3cml0ZWwocmVnLCBlcC0+ZXBuLnJl Z3MgKyBBU1RfVkhVQl9FUF9DT05GSUcpOworCisJaWYgKCFlcC0+ZXBuLnN0YWxsZWQgJiYgIWVw LT5lcG4ud2VkZ2VkKQorCQl3cml0ZWwoVkhVQl9FUF9UT0dHTEVfU0VUX0VQTlVNKGVwLT5lcG4u Z19pZHgpLAorCQkgICAgICAgZXAtPnZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9UT0dHTEUpOwor fQorCitzdGF0aWMgaW50IGFzdF92aHViX3NldF9oYWx0X2FuZF93ZWRnZShzdHJ1Y3QgdXNiX2Vw KiB1X2VwLCBib29sIGhhbHQsCisJCQkJICAgICAgYm9vbCB3ZWRnZSkKK3sKKwlzdHJ1Y3QgYXN0 X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9 IGVwLT52aHViOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlFUERCRyhlcCwgIlNldCBoYWx0 ICglZCkgJiB3ZWRnZSAoJWQpXG4iLCBoYWx0LCB3ZWRnZSk7CisKKwlpZiAoIXVfZXAgfHwgIXVf ZXAtPmRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlcC0+ZF9pZHggPT0gMCkKKwkJcmV0 dXJuIDA7CisJaWYgKGVwLT5lcG4uaXNfaXNvKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogRmFpbCB3aXRoIHN0 aWxsLWJ1c3kgSU4gZW5kcG9pbnRzICovCisJaWYgKGhhbHQgJiYgZXAtPmVwbi5pc19pbiAmJiAh bGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHVi LT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwllcC0+ZXBuLnN0YWxsZWQg PSBoYWx0OworCWVwLT5lcG4ud2VkZ2VkID0gd2VkZ2U7CisJYXN0X3ZodWJfdXBkYXRlX2Vwbl9z dGFsbChlcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fc2V0X2hhbHQoc3Ry dWN0IHVzYl9lcCAqdV9lcCwgaW50IHZhbHVlKQoreworCXJldHVybiBhc3Rfdmh1Yl9zZXRfaGFs dF9hbmRfd2VkZ2UodV9lcCwgdmFsdWUgIT0gMCwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IGFz dF92aHViX2Vwbl9zZXRfd2VkZ2Uoc3RydWN0IHVzYl9lcCAqdV9lcCkKK3sKKwlyZXR1cm4gYXN0 X3ZodWJfc2V0X2hhbHRfYW5kX3dlZGdlKHVfZXAsIHRydWUsIHRydWUpOworfQorCitzdGF0aWMg aW50IGFzdF92aHViX2Vwbl9kaXNhYmxlKHN0cnVjdCB1c2JfZXAqIHVfZXApCit7CisJc3RydWN0 IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZo dWIgPSBlcC0+dmh1YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbWFzaywgZXBfaWVy OworCisJRVBEQkcoZXAsICJEaXNhYmxpbmcgIVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgm dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJZXAtPmVwbi5lbmFibGVkID0gZmFsc2U7CisKKwkvKiBT dG9wIGFjdGl2ZSBETUEgaWYgYW55ICovCisJYXN0X3ZodWJfc3RvcF9hY3RpdmVfcmVxKGVwLCBm YWxzZSk7CisKKwkvKiBEaXNhYmxlIGVuZHBvaW50ICovCisJd3JpdGVsKDAsIGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisKKwkvKiBEaXNhYmxlIEFDSyBpbnRlcnJ1cHQgKi8K KwlpbWFzayA9IFZIVUJfRVBfSVJRKGVwLT5lcG4uZ19pZHgpOworCWVwX2llciA9IHJlYWRsKHZo dWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKwllcF9pZXIgJj0gfmltYXNrOworCXdy aXRlbChlcF9pZXIsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKwl3cml0ZWwo aW1hc2ssIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKworCS8qIE51a2UgYWxs IHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlhc3Rfdmh1Yl9udWtlKGVwLCAtRVNIVVRET1dOKTsKKwor CS8qIE5vIG1vcmUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVxdWVzdCAqLworCWVwLT5l cC5kZXNjID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZs YWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9lbmFibGUo c3RydWN0IHVzYl9lcCogdV9lcCwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3QgdXNiX2VuZHBvaW50 X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmVwX3R5cGVfc3RyaW5n W10gX19tYXliZV91bnVzZWQgPSB7ICJjdHJsIiwKKwkJCQkJCQkgICAgICAgImlzb2MiLAorCQkJ CQkJCSAgICAgICAiYnVsayIsCisJCQkJCQkJICAgICAgICJpbnRyIiB9OworCXN0cnVjdCBhc3Rf dmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92aHViX2RldiAqZGV2 OworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YjsKKwl1MTYgbWF4cGFja2V0LCB0eXBlOworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJdTMyIGVwX2NvbmYsIGVwX2llciwgaW1hc2s7CisKKwkvKiBDaGVj ayBhcmd1bWVudHMgKi8KKwlpZiAoIXVfZXAgfHwgIWRlc2MpCisJCXJldHVybiAtRUlOVkFMOwor CisJbWF4cGFja2V0ID0gdXNiX2VuZHBvaW50X21heHAoZGVzYyk7CisJaWYgKCFlcC0+ZF9pZHgg fHwgIWVwLT5kZXYgfHwKKwkgICAgZGVzYy0+YkRlc2NyaXB0b3JUeXBlICE9IFVTQl9EVF9FTkRQ T0lOVCB8fAorCSAgICBtYXhwYWNrZXQgPT0gMCB8fCBtYXhwYWNrZXQgPiBlcC0+ZXAubWF4cGFj a2V0KSB7CisJCUVQREJHKGVwLCAiSW52YWxpZCBFUCBlbmFibGUsZF9pZHg9JWQsZGV2PSVwLHR5 cGU9JWQsbXA9JWQvJWRcbiIsCisJCSAgICAgIGVwLT5kX2lkeCwgZXAtPmRldiwgZGVzYy0+YkRl c2NyaXB0b3JUeXBlLAorCQkgICAgICBtYXhwYWNrZXQsIGVwLT5lcC5tYXhwYWNrZXQpOworCQly ZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGVwLT5kX2lkeCAhPSB1c2JfZW5kcG9pbnRfbnVtKGRl c2MpKSB7CisJCUVQREJHKGVwLCAiRVAgbnVtYmVyIG1pc21hdGNoICFcbiIpOworCQlyZXR1cm4g LUVJTlZBTDsKKwl9CisKKwlpZiAoZXAtPmVwbi5lbmFibGVkKSB7CisJCUVQREJHKGVwLCAiQWxy ZWFkeSBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisJZGV2ID0gZXAtPmRldjsK Kwl2aHViID0gZXAtPnZodWI7CisKKwkvKiBDaGVjayBkZXZpY2Ugc3RhdGUgKi8KKwlpZiAoIWRl di0+ZHJpdmVyKSB7CisJCUVQREJHKGVwLCAiQm9ndXMgZGV2aWNlIHN0YXRlOiBkcml2ZXI9JXAg c3BlZWQ9JWRcbiIsCisJCSAgICAgICBkZXYtPmRyaXZlciwgZGV2LT5nYWRnZXQuc3BlZWQpOwor CQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisKKwkvKiBHcmFiIHNvbWUgaW5mbyBmcm9tIHRoZSBk ZXNjcmlwdG9yICovCisJZXAtPmVwbi5pc19pbiA9IHVzYl9lbmRwb2ludF9kaXJfaW4oZGVzYyk7 CisJZXAtPmVwLm1heHBhY2tldCA9IG1heHBhY2tldDsKKwl0eXBlID0gdXNiX2VuZHBvaW50X3R5 cGUoZGVzYyk7CisJZXAtPmVwbi5kX25leHQgPSBlcC0+ZXBuLmRfbGFzdCA9IDA7CisJZXAtPmVw bi5pc19pc28gPSBmYWxzZTsKKwllcC0+ZXBuLnN0YWxsZWQgPSBmYWxzZTsKKwllcC0+ZXBuLndl ZGdlZCA9IGZhbHNlOworCisJRVBEQkcoZXAsICJFbmFibGluZyBbJXNdICVzIG51bSAlZCBtYXhw YWNrZXQ9JWRcbiIsCisJICAgICAgZXAtPmVwbi5pc19pbiA/ICJpbiIgOiAib3V0IiwgZXBfdHlw ZV9zdHJpbmdbdHlwZV0sCisJICAgICAgdXNiX2VuZHBvaW50X251bShkZXNjKSwgbWF4cGFja2V0 KTsKKworCS8qIENhbiB3ZSB1c2UgRE1BIGRlc2NyaXB0b3IgbW9kZSA/ICovCisJZXAtPmVwbi5k ZXNjX21vZGUgPSBlcC0+ZXBuLmRlc2NzICYmIGVwLT5lcG4uaXNfaW47CisJaWYgKGVwLT5lcG4u ZGVzY19tb2RlKQorCQltZW1zZXQoZXAtPmVwbi5kZXNjcywgMCwgOCAqIEFTVF9WSFVCX0RFU0NT X0NPVU5UKTsKKworCS8qCisJICogTGFyZ2Ugc2VuZCBmdW5jdGlvbiBjYW4gc2VuZCB1cCB0byA4 IHBhY2tldHMgZnJvbQorCSAqIG9uZSBkZXNjcmlwdG9yIHdpdGggYSBsaW1pdCBvZiA0MDk1IGJ5 dGVzLgorCSAqLworCWVwLT5lcG4uY2h1bmtfbWF4ID0gZXAtPmVwLm1heHBhY2tldDsKKwlpZiAo ZXAtPmVwbi5pc19pbikgeworCQllcC0+ZXBuLmNodW5rX21heCA8PD0gMzsKKwkJd2hpbGUgKGVw LT5lcG4uY2h1bmtfbWF4ID4gNDA5NSkKKwkJCWVwLT5lcG4uY2h1bmtfbWF4IC09IGVwLT5lcC5t YXhwYWNrZXQ7CisJfQorCisJc3dpdGNoKHR5cGUpIHsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVS X0NPTlRST0w6CisJCUVQREJHKGVwLCAiT25seSBvbmUgY29udHJvbCBlbmRwb2ludFxuIik7CisJ CXJldHVybiAtRUlOVkFMOworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfSU5UOgorCQllcF9jb25m ID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9JTlQpOworCQlicmVhazsKKwljYXNlIFVT Ql9FTkRQT0lOVF9YRkVSX0JVTEs6CisJCWVwX2NvbmYgPSBWSFVCX0VQX0NGR19TRVRfVFlQRShF UF9UWVBFX0JVTEspOworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJ CWVwX2NvbmYgPSBWSFVCX0VQX0NGR19TRVRfVFlQRShFUF9UWVBFX0lTTyk7CisJCWVwLT5lcG4u aXNfaXNvID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCisJLyogRW5jb2RlIHRoZSByZXN0IG9mIHRoZSBFUCBjb25maWcgcmVnaXN0ZXIgKi8KKwlp ZiAobWF4cGFja2V0IDwgMTAyNCkKKwkJZXBfY29uZiB8PSBWSFVCX0VQX0NGR19TRVRfTUFYX1BL VChtYXhwYWNrZXQpOworCWlmICghZXAtPmVwbi5pc19pbikKKwkJZXBfY29uZiB8PSBWSFVCX0VQ X0NGR19ESVJfT1VUOworCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfU0VUX0VQX05VTSh1c2JfZW5k cG9pbnRfbnVtKGRlc2MpKTsKKwllcF9jb25mIHw9IFZIVUJfRVBfQ0ZHX0VOQUJMRTsKKwllcF9j b25mIHw9IFZIVUJfRVBfQ0ZHX1NFVF9ERVYoZGV2LT5pbmRleCArIDEpOworCUVQVkRCRyhlcCwg ImNvbmZpZz0lMDh4XG4iLCBlcF9jb25mKTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5s b2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIEhXIGFuZCByZXNldCBETUEgKi8KKwl3cml0ZWwo MCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsKKwl3cml0ZWwoVkhVQl9FUF9E TUFfQ1RSTF9SRVNFVCwKKwkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NU TFNUQVQpOworCisJLyogQ29uZmlndXJlIGFuZCBlbmFibGUgKi8KKwl3cml0ZWwoZXBfY29uZiwg ZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsKKworCWlmIChlcC0+ZXBuLmRlc2Nf bW9kZSkgeworCQkvKiBDbGVhciBETUEgc3RhdHVzLCBpbmNsdWRpbmcgdGhlIERNQSByZWFkIHB0 ciAqLworCQl3cml0ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMp OworCisJCS8qIFNldCBkZXNjcmlwdG9yIGJhc2UgKi8KKwkJd3JpdGVsKGVwLT5lcG4uZGVzY3Nf ZG1hLAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19CQVNFKTsKKwor CQkvKiBTZXQgYmFzZSBETUEgY29uZmlnIHZhbHVlICovCisJCWVwLT5lcG4uZG1hX2NvbmYgPSBW SFVCX0VQX0RNQV9ERVNDX01PREU7CisJCWlmIChlcC0+ZXBuLmlzX2luKQorCQkJZXAtPmVwbi5k bWFfY29uZiB8PSBWSFVCX0VQX0RNQV9JTl9MT05HX01PREU7CisKKwkJLyogRmlyc3QgcmVzZXQg YW5kIGRpc2FibGUgYWxsIG9wZXJhdGlvbnMgKi8KKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYg fCBWSFVCX0VQX0RNQV9DVFJMX1JFU0VULAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZI VUJfRVBfRE1BX0NUTFNUQVQpOworCisJCS8qIEVuYWJsZSBkZXNjcmlwdG9yIG1vZGUgKi8KKwkJ d3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYsCisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhV Ql9FUF9ETUFfQ1RMU1RBVCk7CisJfSBlbHNlIHsKKwkJLyogU2V0IGJhc2UgRE1BIGNvbmZpZyB2 YWx1ZSAqLworCQllcC0+ZXBuLmRtYV9jb25mID0gVkhVQl9FUF9ETUFfU0lOR0xFX1NUQUdFOwor CisJCS8qIFJlc2V0IGFuZCBzd2l0Y2ggdG8gc2luZ2xlIHN0YWdlIG1vZGUgKi8KKwkJd3JpdGVs KGVwLT5lcG4uZG1hX2NvbmYgfCBWSFVCX0VQX0RNQV9DVFJMX1JFU0VULAorCQkgICAgICAgZXAt PmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCQl3cml0ZWwoZXAtPmVwbi5k bWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFU KTsKKwkJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsK Kwl9CisKKwkvKiBDbGVhbnVwIGRhdGEgdG9nZ2xlIGp1c3QgaW4gY2FzZSAqLworCXdyaXRlbChW SFVCX0VQX1RPR0dMRV9TRVRfRVBOVU0oZXAtPmVwbi5nX2lkeCksCisJICAgICAgIHZodWItPnJl Z3MgKyBBU1RfVkhVQl9FUF9UT0dHTEUpOworCisJLyogQ2xlYW51cCBhbmQgZW5hYmxlIEFDSyBp bnRlcnJ1cHQgKi8KKwlpbWFzayA9IFZIVUJfRVBfSVJRKGVwLT5lcG4uZ19pZHgpOworCXdyaXRl bChpbWFzaywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JU1IpOworCWVwX2llciA9IHJl YWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKwllcF9pZXIgfD0gaW1hc2s7 CisJd3JpdGVsKGVwX2llciwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JRVIpOworCisJ LyogV29vdCwgd2UgYXJlIG9ubGluZSAhICovCisJZXAtPmVwbi5lbmFibGVkID0gdHJ1ZTsKKwor CXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5fZGlzcG9zZShzdHJ1Y3QgdXNiX2VwICp1 X2VwKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisKKwlp ZiAoV0FSTl9PTighZXAtPmRldiB8fCAhZXAtPmRfaWR4KSkKKwkJcmV0dXJuOworCisJRVBEQkco ZXAsICJSZWxlYXNpbmcgZW5kcG9pbnRcbiIpOworCisJLyogVGFrZSBpdCBvdXQgb2YgdGhlIEVQ IGxpc3QgKi8KKwlsaXN0X2RlbF9pbml0KCZlcC0+ZXAuZXBfbGlzdCk7CisKKwkvKiBNYXJrIHRo ZSBhZGRyZXNzIGZyZWUgaW4gdGhlIGRldmljZSAqLworCWVwLT5kZXYtPmVwbnNbZXAtPmRfaWR4 IC0gMV0gPSBOVUxMOworCisJLyogRnJlZSBuYW1lICYgRE1BIGJ1ZmZlcnMgKi8KKwlrZnJlZShl cC0+ZXAubmFtZSk7CisJZXAtPmVwLm5hbWUgPSBOVUxMOworCWRtYV9mcmVlX2NvaGVyZW50KCZl cC0+dmh1Yi0+cGRldi0+ZGV2LAorCQkJICBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVCArCisJCQkg IDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCSAgZXAtPmJ1ZiwgZXAtPmJ1Zl9kbWEpOwor CWVwLT5idWYgPSBOVUxMOworCWVwLT5lcG4uZGVzY3MgPSBOVUxMOworCisJLyogTWFyayBmcmVl ICovCisJZXAtPmRldiA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2VwX29w cyBhc3Rfdmh1Yl9lcG5fb3BzID0geworCS5lbmFibGUJCT0gYXN0X3ZodWJfZXBuX2VuYWJsZSwK KwkuZGlzYWJsZQk9IGFzdF92aHViX2Vwbl9kaXNhYmxlLAorCS5kaXNwb3NlCT0gYXN0X3ZodWJf ZXBuX2Rpc3Bvc2UsCisJLnF1ZXVlCQk9IGFzdF92aHViX2Vwbl9xdWV1ZSwKKwkuZGVxdWV1ZQk9 IGFzdF92aHViX2Vwbl9kZXF1ZXVlLAorCS5zZXRfaGFsdAk9IGFzdF92aHViX2Vwbl9zZXRfaGFs dCwKKwkuc2V0X3dlZGdlCT0gYXN0X3ZodWJfZXBuX3NldF93ZWRnZSwKKwkuYWxsb2NfcmVxdWVz dAk9IGFzdF92aHViX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdAk9IGFzdF92aHViX2Zy ZWVfcmVxdWVzdCwKK307CisKK3N0cnVjdCBhc3Rfdmh1Yl9lcCAqYXN0X3ZodWJfYWxsb2NfZXBu KHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsIHU4IGFkZHIpCit7CisJc3RydWN0IGFzdF92aHViICp2 aHViID0gZC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwOworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisJaW50IGk7CisKKwkvKiBGaW5kIGEgZnJlZSBvbmUgKG5vIGRldmljZSkgKi8KKwlz cGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBB U1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKQorCQlpZiAodmh1Yi0+ZXBuc1tpXS5kZXYgPT0gTlVM TCkKKwkJCWJyZWFrOworCWlmIChpID49IEFTVF9WSFVCX05VTV9HRU5fRVBzKSB7CisJCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJ fQorCisJLyogU2V0IGl0IHVwICovCisJZXAgPSAmdmh1Yi0+ZXBuc1tpXTsKKwllcC0+ZGV2ID0g ZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlEREJH KGQsICJBbGxvY2F0aW5nIGdlbiBFUCAlZCBmb3IgYWRkciAlZFxuIiwgaSwgYWRkcik7CisJSU5J VF9MSVNUX0hFQUQoJmVwLT5xdWV1ZSk7CisJZXAtPmRfaWR4ID0gYWRkcjsKKwllcC0+dmh1YiA9 IHZodWI7CisJZXAtPmVwLm9wcyA9ICZhc3Rfdmh1Yl9lcG5fb3BzOworCWVwLT5lcC5uYW1lID0g a2FzcHJpbnRmKEdGUF9LRVJORUwsICJlcCVkIiwgYWRkcik7CisJZC0+ZXBuc1thZGRyLTFdID0g ZXA7CisJZXAtPmVwbi5nX2lkeCA9IGk7CisJZXAtPmVwbi5yZWdzID0gdmh1Yi0+cmVncyArIDB4 MjAwICsgKGkgKiAweDEwKTsKKworCWVwLT5idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnZodWIt PnBkZXYtPmRldiwKKwkJCQkgICAgIEFTVF9WSFVCX0VQbl9NQVhfUEFDS0VUICsKKwkJCQkgICAg IDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCQkgICAgICZlcC0+YnVmX2RtYSwgR0ZQX0tF Uk5FTCk7CisJaWYgKCFlcC0+YnVmKSB7CisJCWtmcmVlKGVwLT5lcC5uYW1lKTsKKwkJZXAtPmVw Lm5hbWUgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZXAtPmVwbi5kZXNjcyA9IGVwLT5i dWYgKyBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVDsKKwllcC0+ZXBuLmRlc2NzX2RtYSA9IGVwLT5i dWZfZG1hICsgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQ7CisKKwl1c2JfZXBfc2V0X21heHBhY2tl dF9saW1pdCgmZXAtPmVwLCBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVCk7CisJbGlzdF9hZGRfdGFp bCgmZXAtPmVwLmVwX2xpc3QsICZkLT5nYWRnZXQuZXBfbGlzdCk7CisJZXAtPmVwLmNhcHMudHlw ZV9pc28gPSB0cnVlOworCWVwLT5lcC5jYXBzLnR5cGVfYnVsayA9IHRydWU7CisJZXAtPmVwLmNh cHMudHlwZV9pbnQgPSB0cnVlOworCWVwLT5lcC5jYXBzLmRpcl9pbiA9IHRydWU7CisJZXAtPmVw LmNhcHMuZGlyX291dCA9IHRydWU7CisKKwlyZXR1cm4gZXA7Cit9CmRpZmYgLS1naXQgYS9kcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi9odWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMDAuLjkzMzA4MzRmN2FiYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvaHViLmMKQEAgLTAsMCArMSw4MjMgQEAKKy8vIFNQRFgtTGljZW5z ZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZlciBmb3Ig QXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGh1Yi5jIC0gdmlydHVhbCBodWIg aGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBU aGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5k L29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJs aWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRp b247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4K KyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZp Y2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5o PgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2lu Y2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNs dWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNs dWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVk ZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGlu dXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKyNpbmNsdWRlIDxs aW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisjaW5jbHVkZSA8bGludXgv dXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5oPgorCisjaW5jbHVkZSAidmh1Yi5oIgor CisvKiB1c2IgMi4wIGh1YiBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIEEgZmV3IHRoaW5ncyB3 ZSBtYXkgd2FudCB0byBpbXByb3ZlIGhlcmU6CisgKgorICogICAgLSBXZSBtYXkgbmVlZCB0byBp bmRpY2F0ZSBUVCBzdXBwb3J0CisgKiAgICAtIFdlIG1heSBuZWVkIGEgZGV2aWNlIHF1YWxpZmll ciBkZXNjcmlwdG9yCisgKiAgICAgIGFzIGRldmljZXMgY2FuIHByZXRlbmQgdG8gYmUgdXNiMSBv ciAyCisgKiAgICAtIE1ha2UgdmlkL2RpZCBvdmVycmlkYWJsZQorICogICAgLSBtYWtlIGl0IGxv b2sgbGlrZSB1c2IxIGlmIHVzYjEgbW9kZSBmb3JjZWQKKyAqLworI2RlZmluZSBLRVJORUxfUkVM CWJpbjJiY2QoKChMSU5VWF9WRVJTSU9OX0NPREUgPj4gMTYpICYgMHgwZmYpKQorI2RlZmluZSBL RVJORUxfVkVSCWJpbjJiY2QoKChMSU5VWF9WRVJTSU9OX0NPREUgPj4gOCkgJiAweDBmZikpCisK K2VudW0geworCUFTVF9WSFVCX1NUUl9NQU5VRiA9IDMsCisJQVNUX1ZIVUJfU1RSX1BST0RVQ1Qg PSAyLAorCUFTVF9WSFVCX1NUUl9TRVJJQUwgPSAxLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVj dCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgYXN0X3ZodWJfZGV2X2Rlc2MgPSB7CisJLmJMZW5ndGgJ CT0gVVNCX0RUX0RFVklDRV9TSVpFLAorCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfREVWSUNF LAorCS5iY2RVU0IJCQk9IGNwdV90b19sZTE2KDB4MDIwMCksCisJLmJEZXZpY2VDbGFzcwkJPSBV U0JfQ0xBU1NfSFVCLAorCS5iRGV2aWNlU3ViQ2xhc3MJPSAwLAorCS5iRGV2aWNlUHJvdG9jb2wJ PSAxLAorCS5iTWF4UGFja2V0U2l6ZTAJPSA2NCwKKwkuaWRWZW5kb3IJICAgICAgIAk9IGNwdV90 b19sZTE2KDB4MWQ2YiksCisJLmlkUHJvZHVjdAkJPSBjcHVfdG9fbGUxNigweDAxMDcpLAorCS5i Y2REZXZpY2UJCT0gY3B1X3RvX2xlMTYoMHgwMTAwKSwKKwkuaU1hbnVmYWN0dXJlcgkJPSBBU1Rf VkhVQl9TVFJfTUFOVUYsCisJLmlQcm9kdWN0CQk9IEFTVF9WSFVCX1NUUl9QUk9EVUNULAorCS5p U2VyaWFsTnVtYmVyCQk9IEFTVF9WSFVCX1NUUl9TRVJJQUwsCisJLmJOdW1Db25maWd1cmF0aW9u cwk9IDEsCit9OworCisvKiBQYXRjaGVzIHRvIHRoZSBhYm92ZSB3aGVuIGZvcmNpbmcgVVNCMSBt b2RlICovCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9wYXRjaF9kZXZfZGVzY191c2IxKHN0cnVjdCB1 c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJZGVzYy0+YmNkVVNCID0gY3B1X3RvX2xl MTYoMHgwMTAwKTsKKwlkZXNjLT5iRGV2aWNlUHJvdG9jb2wgPSAwOworfQorCisvKgorICogQ29u ZmlndXJhdGlvbiBkZXNjcmlwdG9yOiBzYW1lIGNvbW1lbnRzIGFzIGFib3ZlCisgKiByZWdhcmRp bmcgaGFuZGxpbmcgVVNCMSBtb2RlLgorICovCisKKy8qCisgKiBXZSBkb24ndCB1c2Ugc2l6ZW9m KCkgYXMgTGludXggZGVmaW5pdGlvbiBvZgorICogc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlw dG9yIGNvbnRhaW5zIDIKKyAqIGV4dHJhIGJ5dGVzCisgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfQ09O Rl9ERVNDX1NJWkUJKFVTQl9EVF9DT05GSUdfU0laRSArIFwKKwkJCQkgVVNCX0RUX0lOVEVSRkFD RV9TSVpFICsgXAorCQkJCSBVU0JfRFRfRU5EUE9JTlRfU0laRSkKKworc3RhdGljIGNvbnN0IHN0 cnVjdCBhc3Rfdmh1Yl9mdWxsX2NkZXNjIHsKKwlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNjcmlwdG9y CWNmZzsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGludGY7CisJc3RydWN0IHVz Yl9lbmRwb2ludF9kZXNjcmlwdG9yCWVwOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSkgYXN0 X3ZodWJfY29uZl9kZXNjID0geworCS5jZmcgPSB7CisJCS5iTGVuZ3RoCQk9IFVTQl9EVF9DT05G SUdfU0laRSwKKwkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9DT05GSUcsCisJCS53VG90YWxM ZW5ndGgJCT0gY3B1X3RvX2xlMTYoQVNUX1ZIVUJfQ09ORl9ERVNDX1NJWkUpLAorCQkuYk51bUlu dGVyZmFjZXMJCT0gMSwKKwkJLmJDb25maWd1cmF0aW9uVmFsdWUJPSAxLAorCQkuaUNvbmZpZ3Vy YXRpb24JCT0gMCwKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfQ09ORklHX0FUVF9PTkUgfAorCQkJ CQkgIFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUiB8CisJCQkJCSAgVVNCX0NPTkZJR19BVFRfV0FL RVVQLAorCQkuYk1heFBvd2VyCQk9IDAsCisJfSwKKwkuaW50ZiA9IHsKKwkJLmJMZW5ndGgJCT0g VVNCX0RUX0lOVEVSRkFDRV9TSVpFLAorCQkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0lOVEVS RkFDRSwKKwkJLmJJbnRlcmZhY2VOdW1iZXIJPSAwLAorCQkuYkFsdGVybmF0ZVNldHRpbmcJPSAw LAorCQkuYk51bUVuZHBvaW50cwkJPSAxLAorCQkuYkludGVyZmFjZUNsYXNzCT0gVVNCX0NMQVNT X0hVQiwKKwkJLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDAsCisJCS5iSW50ZXJmYWNlUHJvdG9jb2wJ PSAwLAorCQkuaUludGVyZmFjZQkJPSAwLAorCX0sCisJLmVwID0geworCQkuYkxlbmd0aAkJPSBV U0JfRFRfRU5EUE9JTlRfU0laRSwKKwkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9FTkRQT0lO VCwKKwkJLmJFbmRwb2ludEFkZHJlc3MJPSAweDgxLAorCQkuYm1BdHRyaWJ1dGVzCQk9IFVTQl9F TkRQT0lOVF9YRkVSX0lOVCwKKwkJLndNYXhQYWNrZXRTaXplCQk9IGNwdV90b19sZTE2KDEpLAor CQkuYkludGVydmFsCQk9IDB4MGMsCisJfSwKK307CisKKyNkZWZpbmUgQVNUX1ZIVUJfSFVCX0RF U0NfU0laRQkoVVNCX0RUX0hVQl9OT05WQVJfU0laRSArIDIpCisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yIGFzdF92aHViX2h1Yl9kZXNjID0geworCS5iRGVzY0xlbmd0 aAkJCT0gQVNUX1ZIVUJfSFVCX0RFU0NfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlCQk9IFVTQl9E VF9IVUIsCisJLmJOYnJQb3J0cwkJCT0gQVNUX1ZIVUJfTlVNX1BPUlRTLAorCS53SHViQ2hhcmFj dGVyaXN0aWNzCQk9IGNwdV90b19sZTE2KEhVQl9DSEFSX05PX0xQU00pLAorCS5iUHdyT24yUHdy R29vZAkJCT0gMTAsCisJLmJIdWJDb250ckN1cnJlbnQJCT0gMCwKKwkudS5ocy5EZXZpY2VSZW1v dmFibGVbMF0JPSAwLAorCS51LmhzLkRldmljZVJlbW92YWJsZVsxXQk9IDB4ZmYsCit9OworCitz dGF0aWMgaW50IGFzdF92aHViX2h1Yl9kZXZfc3RhdHVzKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAs CisJCQkJICAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sKKwl1OCBzdDA7CisKKwlFUERCRyhl cCwgIkdFVF9TVEFUVVMoZGV2KVxuIik7CisKKwkvKgorCSAqIE1hcmsgaXQgYXMgc2VsZi1wb3dl cmVkLCBJIGRvdWJ0IHRoZSBCTUMgaXMgcG93ZXJlZCBvZmYKKwkgKiB0aGUgVVNCIGJ1cyAuLi4K KwkgKi8KKwlzdDAgPSAxIDw8IFVTQl9ERVZJQ0VfU0VMRl9QT1dFUkVEOworCisJLyoKKwkgKiBO ZWVkIHRvIGRvdWJsZSBjaGVjayBob3cgcmVtb3RlIHdha2V1cCBhY3R1YWxseSB3b3JrcworCSAq IG9uIHRoYXQgY2hpcCBhbmQgd2hhdCB0cmlnZ2VycyBpdC4KKwkgKi8KKwlpZiAoZXAtPnZodWIt Pndha2V1cF9lbikKKwkJc3QwIHw9IDEgPDwgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOworCisJ cmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgc3QwLCAwKTsKK30KKworc3RhdGljIGlu dCBhc3Rfdmh1Yl9odWJfZXBfc3RhdHVzKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJICB1 MTYgd0luZGV4LCB1MTYgd1ZhbHVlKQoreworCWludCBlcF9udW07CisJdTggc3QwID0gMDsKKwor CWVwX251bSA9IHdJbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwlFUERCRyhlcCwg IkdFVF9TVEFUVVMoZXAlZClcbiIsIGVwX251bSk7CisKKwkvKiBPbiB0aGUgaHViIHdlIGhhdmUg b25seSBFUCAwIGFuZCAxICovCisJaWYgKGVwX251bSA9PSAxKSB7CisJCWlmIChlcC0+dmh1Yi0+ ZXAxX3N0YWxsZWQpCisJCQlzdDAgfD0gMSA8PCBVU0JfRU5EUE9JTlRfSEFMVDsKKwl9IGVsc2Ug aWYgKGVwX251bSAhPSAwKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCXJldHVybiBhc3Rf dmh1Yl9zaW1wbGVfcmVwbHkoZXAsIHN0MCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf aHViX2Rldl9mZWF0dXJlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJICAgIHUxNiB3SW5k ZXgsIHUxNiB3VmFsdWUsCisJCQkJICAgIGJvb2wgaXNfc2V0KQoreworCUVQREJHKGVwLCAiJXNf RkVBVFVSRShkZXYgdmFsPSUwMngpXG4iLAorCSAgICAgIGlzX3NldCA/ICJTRVQiIDogIkNMRUFS Iiwgd1ZhbHVlKTsKKworCWlmICh3VmFsdWUgIT0gVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQKQor CQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCWVwLT52aHViLT53YWtldXBfZW4gPSBpc19zZXQ7 CisJRVBEQkcoZXAsICJIdWIgcmVtb3RlIHdha2V1cCAlc1xuIiwKKwkgICAgICBpc19zZXQgPyAi ZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQor CitzdGF0aWMgaW50IGFzdF92aHViX2h1Yl9lcF9mZWF0dXJlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAq ZXAsCisJCQkJICAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSwKKwkJCQkgICBib29sIGlzX3NldCkK K3sKKwlpbnQgZXBfbnVtOworCXUzMiByZWc7CisKKwllcF9udW0gPSB3SW5kZXggJiBVU0JfRU5E UE9JTlRfTlVNQkVSX01BU0s7CisJRVBEQkcoZXAsICIlc19GRUFUVVJFKGVwJWQgdmFsPSUwMngp XG4iLAorCSAgICAgIGlzX3NldCA/ICJTRVQiIDogIkNMRUFSIiwgZXBfbnVtLCB3VmFsdWUpOwor CisJaWYgKGVwX251bSA+IDEpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWlmICh3VmFsdWUg IT0gVVNCX0VORFBPSU5UX0hBTFQpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCWlmIChlcF9u dW0gPT0gMCkKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisKKwlFUERCRyhlcCwgIiVzIHN0 YWxsIG9uIEVQIDFcbiIsCisJICAgICAgaXNfc2V0ID8gInNldHRpbmciIDogImNsZWFyaW5nIik7 CisKKwllcC0+dmh1Yi0+ZXAxX3N0YWxsZWQgPSBpc19zZXQ7CisJcmVnID0gcmVhZGwoZXAtPnZo dWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfQ1RSTCk7CisJaWYgKGlzX3NldCkgeworCQlyZWcgfD0g VkhVQl9FUDFfQ1RSTF9TVEFMTDsKKwl9IGVsc2UgeworCQlyZWcgJj0gflZIVUJfRVAxX0NUUkxf U1RBTEw7CisJCXJlZyB8PSBWSFVCX0VQMV9DVFJMX1JFU0VUX1RPR0dMRTsKKwl9CisJd3JpdGVs KHJlZywgZXAtPnZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfQ1RSTCk7CisKKwlyZXR1cm4gc3Rk X3JlcV9jb21wbGV0ZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9yZXBfZGVzYyhzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmVwLAorCQkJICAgICB1OCBkZXNjX3R5cGUsIHUxNiBsZW4pCit7CisJY29u c3Qgdm9pZCAqZGVzYzsKKwlzaXplX3QgZHNpemU7CisKKwlFUERCRyhlcCwgIkdFVF9ERVNDUklQ VE9SKHR5cGU6JWQpXG4iLCBkZXNjX3R5cGUpOworCXN3aXRjaChkZXNjX3R5cGUpIHsKKwljYXNl IFVTQl9EVF9ERVZJQ0U6CisJCWRlc2MgPSAmYXN0X3ZodWJfZGV2X2Rlc2M7CisJCWRzaXplID0g VVNCX0RUX0RFVklDRV9TSVpFOworCQlicmVhazsKKwljYXNlIFVTQl9EVF9DT05GSUc6CisJCWRl c2MgPSAmYXN0X3ZodWJfY29uZl9kZXNjOworCQlkc2l6ZSA9IEFTVF9WSFVCX0NPTkZfREVTQ19T SVpFOworCQlicmVhazsKKwljYXNlIFVTQl9EVF9IVUI6CisJCWRlc2MgPSAmYXN0X3ZodWJfaHVi X2Rlc2M7CisJCWRzaXplID0gQVNUX1ZIVUJfSFVCX0RFU0NfU0laRTsKKwkJYnJlYWs7CisJZGVm YXVsdDoKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJfQorCWlmIChkc2l6ZSA8IGxlbikKKwkJ bGVuID0gZHNpemU7CisJLyoKKwkgKiBUaGlzIGlzIG91ciBsaW1pdCBmb3IgaHViIHJlcGxpZXMg aW4gb3VyIGN1cnJlbnQKKwkgKiBpbXBsZW1lbnRhdGlvbiwga2VlcHMgdGhpbmdzIHNpbXBsZXIu CisJICovCisJaWYgKFdBUk5fT04obGVuID49IEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUKSkKKwkJ bGVuID0gQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgLSAxOworCisJLyoKKwkgKiBDb3B5IGZpcnN0 IHRvIEVQIGJ1ZmZlciBhbmQgc2VuZCBmcm9tIHRoZXJlLCBzbworCSAqIHdlIGNhbiBkbyBzb21l IGluLXBsYWNlIHBhdGNoaW5nIGlmIG5lZWRlZAorCSAqLworCW1lbWNweShlcC0+YnVmLCBkZXNj LCBsZW4pOworCisJLyogUGF0Y2ggaXQgaWYgZm9yY2luZyBVU0IxICovCisJaWYgKGRlc2NfdHlw ZSA9PSBVU0JfRFRfREVWSUNFICYmIGVwLT52aHViLT5mb3JjZV91c2IxKQorCQlhc3Rfdmh1Yl9w YXRjaF9kZXZfZGVzY191c2IxKGVwLT5idWYpOworCisJLyogU2hvb3QgaXQgZnJvbSB0aGUgRVAg YnVmZmVyICovCisJcmV0dXJuIGFzdF92aHViX3JlcGx5KGVwLCBOVUxMLCBsZW4pOworfQorCisv KiBjb3BpZWQgZnJvbSBoZGMuYyAqLworc3RhdGljIHVuc2lnbmVkCithc2NpaTJkZXNjKGNoYXIg Y29uc3QgKnMsIHU4ICpidWYsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBuLCB0ID0gMiAr IDIqc3RybGVuKHMpOworCisJaWYgKHQgPiAyNTQpCisJCXQgPSAyNTQ7CS8qIExvbmdlc3QgcG9z c2libGUgVVRGIHN0cmluZyBkZXNjcmlwdG9yICovCisJaWYgKGxlbiA+IHQpCisJCWxlbiA9IHQ7 CisKKwl0ICs9IFVTQl9EVF9TVFJJTkcgPDwgODsJLyogTm93IHQgaXMgZmlyc3QgMTYgYml0cyB0 byBzdG9yZSAqLworCisJbiA9IGxlbjsKKwl3aGlsZSAobi0tKSB7CisJCSpidWYrKyA9IHQ7CisJ CWlmICghbi0tKQorCQkJYnJlYWs7CisJCSpidWYrKyA9IHQgPj4gODsKKwkJdCA9ICh1bnNpZ25l ZCBjaGFyKSpzKys7CisJfQorCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf cmVwX3N0cmluZyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJICAgICAgIHU4IHN0cmluZ19p ZCwgdTE2IGxhbmdfaWQsCisJCQkgICAgICAgdTE2IGxlbikKK3sKKwlzdGF0aWMgY2hhciBjb25z dCBsYW5naWRzWzRdID0gezQsIFVTQl9EVF9TVFJJTkcsIDB4MDksIDB4MDR9OworCisJc3dpdGNo IChzdHJpbmdfaWQpIHsKKwljYXNlIDA6IC8qIExhbmd1YWdlIElEcyBhcnJheSAqLworCQlpZiAo bGVuID4gNCkKKwkJCWxlbiA9IDQ7CisJCW1lbWNweShlcC0+YnVmLCBsYW5naWRzLCBsZW4pOwor CQlicmVhazsKKwljYXNlIEFTVF9WSFVCX1NUUl9TRVJJQUw6CisJCWxlbiA9IGFzY2lpMmRlc2Mo IjAwMDAwMDAwIiwgZXAtPmJ1ZiwgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBBU1RfVkhVQl9TVFJf UFJPRFVDVDoKKwkJbGVuID0gYXNjaWkyZGVzYygiVVNCIFZpcnR1YWwgSHViIiwgZXAtPmJ1Ziwg bGVuKTsKKwkJYnJlYWs7CisJY2FzZSBBU1RfVkhVQl9TVFJfTUFOVUY6CisJCWxlbiA9IGFzY2lp MmRlc2MoIkFzcGVlZCIsIGVwLT5idWYsIGxlbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJl dHVybiBzdGRfcmVxX3N0YWxsOworCX0KKworCS8qIFNob290IGl0IGZyb20gdGhlIEVQIGJ1ZmZl ciAqLworCXJldHVybiBhc3Rfdmh1Yl9yZXBseShlcCwgTlVMTCwgbGVuKTsKK30KKworZW51bSBz dGRfcmVxX3JjIGFzdF92aHViX3N0ZF9odWJfcmVxdWVzdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw LAorCQkJCQkgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKQoreworCXN0cnVjdCBhc3Rfdmh1 YiAqdmh1YiA9IGVwLT52aHViOworCXUxNiB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aDsKKworCXdW YWx1ZSA9IGxlMTZfdG9fY3B1KGNycS0+d1ZhbHVlKTsKKwl3SW5kZXggPSBsZTE2X3RvX2NwdShj cnEtPndJbmRleCk7CisJd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGNycS0+d0xlbmd0aCk7CisKKwkv KiBGaXJzdCBwYWNrZXQsIGdyYWIgc3BlZWQgKi8KKwlpZiAodmh1Yi0+c3BlZWQgPT0gVVNCX1NQ RUVEX1VOS05PV04pIHsKKwkJdTMyIHVzdGF0ID0gcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVC X1VTQlNUUyk7CisJCWlmICh1c3RhdCAmIFZIVUJfVVNCU1RTX0hJU1BFRUQpCisJCQl2aHViLT5z cGVlZCA9IFVTQl9TUEVFRF9ISUdIOworCQllbHNlCisJCQl2aHViLT5zcGVlZCA9IFVTQl9TUEVF RF9GVUxMOworCQlVRENEQkcodmh1YiwgIlVTQiBzdGF0dXM9JTA4eCBzcGVlZD0lc1xuIiwgdXN0 YXQsCisJCSAgICAgICB2aHViLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCA/ICJoaWdoIiA6ICJm dWxsIik7CisJfQorCisJc3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEtPmJS ZXF1ZXN0KSB7CisJCS8qIFNFVF9BRERSRVNTICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwg VVNCX1JFUV9TRVRfQUREUkVTUzoKKwkJRVBEQkcoZXAsICJTRVRfQUREUkVTUzogR290IGFkZHJl c3MgJXhcbiIsIHdWYWx1ZSk7CisJCXdyaXRlbCh3VmFsdWUsIHZodWItPnJlZ3MgKyBBU1RfVkhV Ql9DT05GKTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX1NUQVRVUyAq LworCWNhc2UgRGV2aWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFz dF92aHViX2h1Yl9kZXZfc3RhdHVzKGVwLCB3SW5kZXgsIHdWYWx1ZSk7CisJY2FzZSBJbnRlcmZh Y2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxl X3JlcGx5KGVwLCAwLCAwKTsKKwljYXNlIEVuZHBvaW50UmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NU QVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX2h1Yl9lcF9zdGF0dXMoZXAsIHdJbmRleCwgd1ZhbHVl KTsKKworCQkvKiBTRVQvQ0xFQVJfRkVBVFVSRSAqLworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8 IFVTQl9SRVFfU0VUX0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X2ZlYXR1cmUo ZXAsIHdJbmRleCwgd1ZhbHVlLCB0cnVlKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0Jf UkVRX0NMRUFSX0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X2ZlYXR1cmUoZXAs IHdJbmRleCwgd1ZhbHVlLCBmYWxzZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0Jf UkVRX1NFVF9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfaHViX2VwX2ZlYXR1cmUoZXAsIHdJ bmRleCwgd1ZhbHVlLCB0cnVlKTsKKwljYXNlIEVuZHBvaW50T3V0UmVxdWVzdCB8IFVTQl9SRVFf Q0xFQVJfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2h1Yl9lcF9mZWF0dXJlKGVwLCB3SW5k ZXgsIHdWYWx1ZSwgZmFsc2UpOworCisJCS8qIEdFVC9TRVRfQ09ORklHVVJBVElPTiAqLworCWNh c2UgRGV2aWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX0NPTkZJR1VSQVRJT046CisJCXJldHVybiBh c3Rfdmh1Yl9zaW1wbGVfcmVwbHkoZXAsIDEpOworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVT Ql9SRVFfU0VUX0NPTkZJR1VSQVRJT046CisJCWlmICh3VmFsdWUgIT0gMSkKKwkJCXJldHVybiBz dGRfcmVxX3N0YWxsOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKworCQkvKiBHRVRfREVT Q1JJUFRPUiAqLworCWNhc2UgRGV2aWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I6 CisJCXN3aXRjaCAod1ZhbHVlID4+IDgpIHsKKwkJY2FzZSBVU0JfRFRfREVWSUNFOgorCQljYXNl IFVTQl9EVF9DT05GSUc6CisJCQlyZXR1cm4gYXN0X3ZodWJfcmVwX2Rlc2MoZXAsIHdWYWx1ZSA+ PiA4LAorCQkJCQkJIHdMZW5ndGgpOworCQljYXNlIFVTQl9EVF9TVFJJTkc6CisJCQlyZXR1cm4g YXN0X3ZodWJfcmVwX3N0cmluZyhlcCwgd1ZhbHVlICYgMHhmZiwKKwkJCQkJCSAgIHdJbmRleCwg d0xlbmd0aCk7CisJCX0KKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwkJLyogR0VUL1NFVF9J TlRFUkZBQ0UgKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9JTlRFUkZBQ0U6 CisJCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoZXAsIDApOworCWNhc2UgRGV2aWNlT3V0 UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0lOVEVSRkFDRToKKwkJaWYgKHdWYWx1ZSAhPSAwIHx8IHdJ bmRleCAhPSAwKQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCXJldHVybiBzdGRfcmVxX2Nv bXBsZXRlOworCX0KKwlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKK30KKworc3RhdGljIHZvaWQgYXN0 X3ZodWJfdXBkYXRlX2h1Yl9lcDEoc3RydWN0IGFzdF92aHViICp2aHViLAorCQkJCSAgICB1bnNp Z25lZCBpbnQgcG9ydCkKK3sKKwkvKiBVcGRhdGUgSFcgRVAxIHJlc3BvbnNlICovCisJdTMyIHJl ZyA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfU1RTX0NIRyk7CisJdTMyIHBtYXNr ID0gKDEgPDwgKHBvcnQgKyAxKSk7CisJaWYgKHZodWItPnBvcnRzW3BvcnRdLmNoYW5nZSkKKwkJ cmVnIHw9IHBtYXNrOworCWVsc2UKKwkJcmVnICY9IH5wbWFzazsKKwl3cml0ZWwocmVnLCB2aHVi LT5yZWdzICsgQVNUX1ZIVUJfRVAxX1NUU19DSEcpOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1 Yl9jaGFuZ2VfcG9ydF9zdGF0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwKKwkJCQkgICAgICB1bnNp Z25lZCBpbnQgcG9ydCwKKwkJCQkgICAgICB1MTYgY2xyX2ZsYWdzLAorCQkJCSAgICAgIHUxNiBz ZXRfZmxhZ3MsCisJCQkJICAgICAgYm9vbCBzZXRfYykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcG9y dCAqcCA9ICZ2aHViLT5wb3J0c1twb3J0XTsKKwl1MTYgcHJldjsKKworCS8qIFVwZGF0ZSBwb3J0 IHN0YXR1cyAqLworCXByZXYgPSBwLT5zdGF0dXM7CisJcC0+c3RhdHVzID0gKHByZXYgJiB+Y2xy X2ZsYWdzKSB8IHNldF9mbGFnczsKKwlEREJHKCZwLT5kZXYsICJwb3J0ICVkIHN0YXR1cyAlMDR4 IC0+ICUwNHggKEM9JWQpXG4iLAorCSAgICAgcG9ydCArIDEsIHByZXYsIHAtPnN0YXR1cywgc2V0 X2MpOworCisJLyogVXBkYXRlIGNoYW5nZSBiaXRzIGlmIG5lZWRlZCAqLworCWlmIChzZXRfYykg eworCQl1MTYgY2hnID0gcC0+c3RhdHVzIF4gcHJldjsKKworCQkvKiBPbmx5IHRoZXNlIGFyZSBy ZWxldmFudCBmb3IgY2hhbmdlICovCisJCWNoZyAmPSBVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElP TiB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfRU5BQkxFIHwKKwkJICAgICAgIFVTQl9QT1JU X1NUQVRfQ19TVVNQRU5EIHwKKwkJICAgICAgIFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCB8 CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfUkVTRVQgfAorCQkgICAgICAgVVNCX1BPUlRfU1RB VF9DX0wxOworCQlwLT5jaGFuZ2UgfD0gY2hnOworCisJCWFzdF92aHViX3VwZGF0ZV9odWJfZXAx KHZodWIsIHBvcnQpOworCX0KK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfc2VuZF9ob3N0X3dh a2V1cChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdTMyIHJlZyA9IHJlYWRsKHZodWItPnJl Z3MgKyBBU1RfVkhVQl9DVFJMKTsKKwlVRENEQkcodmh1YiwgIldha2luZyB1cCBob3N0ICFcbiIp OworCXJlZyB8PSBWSFVCX0NUUkxfTUFOVUFMX1JFTU9URV9XQUtFVVA7CisJd3JpdGVsKHJlZywg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworfQorCit2b2lkIGFzdF92aHViX2RldmljZV9j b25uZWN0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwKKwkJCSAgICAgdW5zaWduZWQgaW50IHBvcnQs IGJvb2wgb24pCit7CisJaWYgKG9uKQorCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIs IHBvcnQsIDAsCisJCQkJCSAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OLCB0cnVlKTsKKwllbHNl CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJICBVU0JfUE9S VF9TVEFUX0NPTk5FQ1RJT04gfAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfRU5BQkxFLAorCQkJCQkg IDAsIHRydWUpOworCisJLyoKKwkgKiBJZiB0aGUgaHViIGlzIHNldCB0byB3YWt1cCB0aGUgaG9z dCBvbiBjb25uZWN0aW9uIGV2ZW50cworCSAqIHRoZW4gc2VuZCBhIHdha2V1cC4KKwkgKi8KKwlp ZiAodmh1Yi0+d2FrZXVwX2VuKQorCQlhc3Rfdmh1Yl9zZW5kX2hvc3Rfd2FrZXVwKHZodWIpOwor fQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl93YWtlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3 b3JrKQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJ CQkgICAgIHN0cnVjdCBhc3Rfdmh1YiwKKwkJCQkJICAgICB3YWtlX3dvcmspOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGk7CisKKwkvKgorCSAqIFdha2UgYWxsIHNsZWVw aW5nIHBvcnRzLiBJZiBhIHBvcnQgaXMgc3VzcGVuZGVkIGJ5CisJICogdGhlIGhvc3Qgc3VzcGVu ZCAod2l0aG91dCBleHBsaWNpdCBzdGF0ZSBzdXNwZW5kKSwKKwkgKiB3ZSBsZXQgdGhlIG5vcm1h bCBob3N0IHdha2UgcGF0aCBkZWFsIHdpdGggaXQgbGF0ZXIuCisJICovCisJc3Bpbl9sb2NrX2ly cXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVN X1BPUlRTOyBpKyspIHsKKwkJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNb aV07CisKKwkJaWYgKCEocC0+c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSkKKwkJCWNv bnRpbnVlOworCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIGksCisJCQkJCSAgVVNC X1BPUlRfU1RBVF9TVVNQRU5ELAorCQkJCQkgIDAsIHRydWUpOworCQlhc3Rfdmh1Yl9kZXZfcmVz dW1lKCZwLT5kZXYpOworCX0KKwlhc3Rfdmh1Yl9zZW5kX2hvc3Rfd2FrZXVwKHZodWIpOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBhc3Rf dmh1Yl9odWJfd2FrZV9hbGwoc3RydWN0IGFzdF92aHViICp2aHViKQoreworCS8qCisJICogQSBk ZXZpY2UgaXMgdHJ5aW5nIHRvIHdha2UgdGhlIHdvcmxkLCBiZWNhdXNlIHRoaXMKKwkgKiBjYW4g cmVjdXJzZSBpbnRvIHRoZSBkZXZpY2UsIHdlIGJyZWFrIHRoZSBjYWxsIGNoYWluCisJICogdXNp bmcgYSB3b3JrIHF1ZXVlCisJICovCisJc2NoZWR1bGVfd29yaygmdmh1Yi0+d2FrZV93b3JrKTsK K30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfcG9ydF9yZXNldChzdHJ1Y3QgYXN0X3ZodWIgKnZo dWIsIHU4IHBvcnQpCit7CisJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNb cG9ydF07CisJdTE2IHNldCwgY2xyLCBzcGVlZDsKKworCS8qIEZpcnN0IG1hcmsgZGlzYWJsZWQg Ki8KKwlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIHBvcnQsCisJCQkJICBVU0JfUE9S VF9TVEFUX0VOQUJMRSB8CisJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsCisJCQkJICBVU0Jf UE9SVF9TVEFUX1JFU0VULAorCQkJCSAgZmFsc2UpOworCisJaWYgKCFwLT5kZXYuZHJpdmVyKQor CQlyZXR1cm47CisKKwkvKgorCSAqIFRoaXMgd2lsbCBlaXRoZXIgInN0YXJ0IiB0aGUgcG9ydCBv ciByZXNldCB0aGUKKwkgKiBkZXZpY2UgaWYgYWxyZWFkeSBzdGFydGVkLi4uCisJICovCisJYXN0 X3ZodWJfZGV2X3Jlc2V0KCZwLT5kZXYpOworCisJLyogR3JhYiB0aGUgcmlnaHQgc3BlZWQgKi8K KwlzcGVlZCA9IHAtPmRldi5kcml2ZXItPm1heF9zcGVlZDsKKwlpZiAoc3BlZWQgPT0gVVNCX1NQ RUVEX1VOS05PV04gfHwgc3BlZWQgPiB2aHViLT5zcGVlZCkKKwkJc3BlZWQgPSB2aHViLT5zcGVl ZDsKKworCXN3aXRjaCAoc3BlZWQpIHsKKwljYXNlIFVTQl9TUEVFRF9MT1c6CisJCXNldCA9IFVT Ql9QT1JUX1NUQVRfTE9XX1NQRUVEOworCQljbHIgPSBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQ7 CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0ZVTEw6CisJCXNldCA9IDA7CisJCWNsciA9IFVT Ql9QT1JUX1NUQVRfTE9XX1NQRUVEIHwKKwkJCVVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJ YnJlYWs7CisJY2FzZSBVU0JfU1BFRURfSElHSDoKKwkJc2V0ID0gVVNCX1BPUlRfU1RBVF9ISUdI X1NQRUVEOworCQljbHIgPSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKwkJYnJlYWs7CisJZGVm YXVsdDoKKwkJVURDREJHKHZodWIsICJVbnN1cHBvcnRlZCBzcGVlZCAlZCB3aGVuIgorCQkgICAg ICAgIiBjb25uZWN0aW5nIGRldmljZVxuIiwKKwkJICAgICAgIHNwZWVkKTsKKwkJcmV0dXJuOwor CX0KKwljbHIgfD0gVVNCX1BPUlRfU1RBVF9SRVNFVDsKKwlzZXQgfD0gVVNCX1BPUlRfU1RBVF9F TkFCTEU7CisKKwkvKiBUaGlzIHNob3VsZCBpZGVhbGx5IGJlIGRlbGF5ZWQgLi4uICovCisJYXN0 X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LCBjbHIsIHNldCwgdHJ1ZSk7Cit9CisK K3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfc2V0X3BvcnRfZmVhdHVyZShzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmVwLAorCQkJCQkJIHU4IHBvcnQsIHUxNiBmZWF0KQoreworCXN0cnVjdCBh c3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwOworCisJ aWYgKHBvcnQgPT0gMCB8fCBwb3J0ID4gQVNUX1ZIVUJfTlVNX1BPUlRTKQorCQlyZXR1cm4gc3Rk X3JlcV9zdGFsbDsKKwlwb3J0LS07CisJcCA9ICZ2aHViLT5wb3J0c1twb3J0XTsKKworCXN3aXRj aChmZWF0KSB7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCWlmICghKHAtPnN0YXR1 cyAmIFVTQl9QT1JUX1NUQVRfRU5BQkxFKSkKKwkJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOwor CQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIHBvcnQsCisJCQkJCSAgMCwgVVNCX1BP UlRfU1RBVF9TVVNQRU5ELAorCQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJfZGV2X3N1c3BlbmQo JnAtPmRldik7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVB VF9SRVNFVDoKKwkJRVBEQkcoZXAsICJQb3J0IHJlc2V0ICFcbiIpOworCQlhc3Rfdmh1Yl9wb3J0 X3Jlc2V0KHZodWIsIHBvcnQpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVT Ql9QT1JUX0ZFQVRfUE9XRVI6CisJY2FzZSBVU0JfUE9SVF9GRUFUX1RFU1Q6CisJY2FzZSBVU0Jf UE9SVF9GRUFUX0lORElDQVRPUjoKKwkJLyogV2UgZG9uJ3QgZG8gYW55dGhpbmcgd2l0aCB0aGVz ZSAqLworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfc3Rh bGw7Cit9CisKK3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfY2xyX3BvcnRfZmVhdHVy ZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkJIHU4IHBvcnQsIHUxNiBmZWF0KQorewor CXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0 ICpwOworCisJaWYgKHBvcnQgPT0gMCB8fCBwb3J0ID4gQVNUX1ZIVUJfTlVNX1BPUlRTKQorCQly ZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlwb3J0LS07CisJcCA9ICZ2aHViLT5wb3J0c1twb3J0XTsK KworCXN3aXRjaChmZWF0KSB7CisJY2FzZSBVU0JfUE9SVF9GRUFUX0VOQUJMRToKKwkJYXN0X3Zo dWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfRU5B QkxFIHwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsIDAsCisJCQkJCSAgZmFsc2UpOwor CQlhc3Rfdmh1Yl9kZXZfc3VzcGVuZCgmcC0+ZGV2KTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxl dGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCWlmICghKHAtPnN0YXR1cyAmIFVT Ql9QT1JUX1NUQVRfU1VTUEVORCkpCisJCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwkJYXN0 X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LAorCQkJCQkgIFVTQl9QT1JUX1NUQVRf U1VTUEVORCwgMCwKKwkJCQkJICBmYWxzZSk7CisJCWFzdF92aHViX2Rldl9yZXN1bWUoJnAtPmRl dik7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9QT1dF UjoKKwkJLyogV2UgZG9uJ3QgZG8gcG93ZXIgY29udHJvbCAqLworCQlyZXR1cm4gc3RkX3JlcV9j b21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfSU5ESUNBVE9SOgorCQkvKiBXZSBkb24ndCBo YXZlIGluZGljYXRvcnMgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0Jf UE9SVF9GRUFUX0NfQ09OTkVDVElPTjoKKwljYXNlIFVTQl9QT1JUX0ZFQVRfQ19FTkFCTEU6CisJ Y2FzZSBVU0JfUE9SVF9GRUFUX0NfU1VTUEVORDoKKwljYXNlIFVTQl9QT1JUX0ZFQVRfQ19PVkVS X0NVUlJFTlQ6CisJY2FzZSBVU0JfUE9SVF9GRUFUX0NfUkVTRVQ6CisJCS8qIENsZWFyIHN0YXRl LWNoYW5nZSBmZWF0dXJlICovCisJCXAtPmNoYW5nZSAmPSB+KDF1IDw8IChmZWF0IC0gMTYpKTsK KwkJYXN0X3ZodWJfdXBkYXRlX2h1Yl9lcDEodmh1YiwgcG9ydCk7CisJCXJldHVybiBzdGRfcmVx X2NvbXBsZXRlOworCX0KKwlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKK30KKworc3RhdGljIGVudW0g c3RkX3JlcV9yYyBhc3Rfdmh1Yl9nZXRfcG9ydF9zdGF0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAs CisJCQkJCSAgICAgIHU4IHBvcnQpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZo dWI7CisJdTE2IHN0YXQsIGNoZzsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IEFTVF9WSFVC X05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9ydC0tOworCisJc3RhdCA9 IHZodWItPnBvcnRzW3BvcnRdLnN0YXR1czsKKwljaGcgPSB2aHViLT5wb3J0c1twb3J0XS5jaGFu Z2U7CisKKwkvKiBXZSBhbHdheXMgaGF2ZSBwb3dlciAqLworCXN0YXQgfD0gVVNCX1BPUlRfU1RB VF9QT1dFUjsKKworCUVQREJHKGVwLCAiIHBvcnQgc3RhdHVzPSUwNHggY2hhbmdlPSUwNHhcbiIs IHN0YXQsIGNoZyk7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLAorCQkJCSAg ICAgc3RhdCAmIDB4ZmYsCisJCQkJICAgICBzdGF0ID4+IDgsCisJCQkJICAgICBjaGcgJiAweGZm LAorCQkJCSAgICAgY2hnID4+IDgpOworfQorCitlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfY2xh c3NfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJICAgc3RydWN0IHVz Yl9jdHJscmVxdWVzdCAqY3JxKQoreworCXUxNiB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aDsKKwor CXdWYWx1ZSA9IGxlMTZfdG9fY3B1KGNycS0+d1ZhbHVlKTsKKwl3SW5kZXggPSBsZTE2X3RvX2Nw dShjcnEtPndJbmRleCk7CisJd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGNycS0+d0xlbmd0aCk7CisK Kwlzd2l0Y2ggKChjcnEtPmJSZXF1ZXN0VHlwZSA8PCA4KSB8IGNycS0+YlJlcXVlc3QpIHsKKwlj YXNlIEdldEh1YlN0YXR1czoKKwkJRVBEQkcoZXAsICJHZXRIdWJTdGF0dXNcbiIpOworCQlyZXR1 cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAwLCAwLCAwLCAwKTsKKwljYXNlIEdldFBvcnRT dGF0dXM6CisJCUVQREJHKGVwLCAiR2V0UG9ydFN0YXR1cyglZClcbiIsIHdJbmRleCAmIDB4ZmYp OworCQlyZXR1cm4gYXN0X3ZodWJfZ2V0X3BvcnRfc3RhdChlcCwgd0luZGV4ICYgMHhmKTsKKwlj YXNlIEdldEh1YkRlc2NyaXB0b3I6CisJCWlmICh3VmFsdWUgIT0gKFVTQl9EVF9IVUIgPDwgOCkp CisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJRVBEQkcoZXAsICJHZXRIdWJEZXNjcmlwdG9y KCVkKVxuIiwgd0luZGV4ICYgMHhmZik7CisJCXJldHVybiBhc3Rfdmh1Yl9yZXBfZGVzYyhlcCwg VVNCX0RUX0hVQiwgd0xlbmd0aCk7CisJY2FzZSBTZXRIdWJGZWF0dXJlOgorCWNhc2UgQ2xlYXJI dWJGZWF0dXJlOgorCQlFUERCRyhlcCwgIkdldC9TZXRIdWJGZWF0dXJlKCVkKVxuIiwgd1ZhbHVl KTsKKwkJLyogTm8gZmVhdHVyZSwganVzdCBjb21wbGV0ZSB0aGUgcmVxdWVzdHMgKi8KKwkJaWYg KHdWYWx1ZSA9PSBDX0hVQl9MT0NBTF9QT1dFUiB8fAorCQkgICAgd1ZhbHVlID09IENfSFVCX09W RVJfQ1VSUkVOVCkKKwkJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCQlyZXR1cm4gc3RkX3Jl cV9zdGFsbDsKKwljYXNlIFNldFBvcnRGZWF0dXJlOgorCQlFUERCRyhlcCwgIlNldFBvcnRGZWF0 dXJlKCVkLCVkKVxuIiwgd0luZGV4ICYgMHhmLCB3VmFsdWUpOworCQlyZXR1cm4gYXN0X3ZodWJf c2V0X3BvcnRfZmVhdHVyZShlcCwgd0luZGV4ICYgMHhmLCB3VmFsdWUpOworCWNhc2UgQ2xlYXJQ b3J0RmVhdHVyZToKKwkJRVBEQkcoZXAsICJDbGVhclBvcnRGZWF0dXJlKCVkLCVkKVxuIiwgd0lu ZGV4ICYgMHhmLCB3VmFsdWUpOworCQlyZXR1cm4gYXN0X3ZodWJfY2xyX3BvcnRfZmVhdHVyZShl cCwgd0luZGV4ICYgMHhmLCB3VmFsdWUpOworCWRlZmF1bHQ6CisJCUVQREJHKGVwLCAiVW5rbm93 biBjbGFzcyByZXF1ZXN0XG4iKTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9CisKK3Zv aWQgYXN0X3ZodWJfaHViX3N1c3BlbmQoc3RydWN0IGFzdF92aHViICp2aHViKQoreworCXVuc2ln bmVkIGludCBpOworCisJVURDREJHKHZodWIsICJVU0IgYnVzIHN1c3BlbmRcbiIpOworCisJaWYg KHZodWItPnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJdmh1Yi0+c3VzcGVuZGVkID0gdHJ1ZTsK KworCS8qCisJICogRm9yd2FyZCB0byB1bnN1c3BlbmRlZCBwb3J0cyB3aXRob3V0IGNoYW5naW5n CisJICogdGhlaXIgY29ubmVjdGlvbiBzdGF0dXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFT VF9WSFVCX05VTV9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZo dWItPnBvcnRzW2ldOworCisJCWlmICghKHAtPnN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfU1VTUEVO RCkpCisJCQlhc3Rfdmh1Yl9kZXZfc3VzcGVuZCgmcC0+ZGV2KTsKKwl9Cit9CisKK3ZvaWQgYXN0 X3ZodWJfaHViX3Jlc3VtZShzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdW5zaWduZWQgaW50 IGk7CisKKwlVRENEQkcodmh1YiwgIlVTQiBidXMgcmVzdW1lXG4iKTsKKworCWlmICghdmh1Yi0+ c3VzcGVuZGVkKQorCQlyZXR1cm47CisKKwl2aHViLT5zdXNwZW5kZWQgPSBmYWxzZTsKKworCS8q CisJICogRm9yd2FyZCB0byB1bnN1c3BlbmRlZCBwb3J0cyB3aXRob3V0IGNoYW5naW5nCisJICog dGhlaXIgY29ubmVjdGlvbiBzdGF0dXMuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVC X05VTV9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBv cnRzW2ldOworCisJCWlmICghKHAtPnN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfU1VTUEVORCkpCisJ CQlhc3Rfdmh1Yl9kZXZfcmVzdW1lKCZwLT5kZXYpOworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9o dWJfcmVzZXQoc3RydWN0IGFzdF92aHViICp2aHViKQoreworCXVuc2lnbmVkIGludCBpOworCisJ VURDREJHKHZodWIsICJVU0IgYnVzIHJlc2V0XG4iKTsKKworCS8qCisJICogSXMgdGhlIHNwZWVk IGtub3duID8gSWYgbm90IHdlIGRvbid0IGNhcmUsIHdlIGFyZW4ndAorCSAqIGluaXRpYWxpemVk IHlldCBhbmQgcG9ydHMgaGF2ZW4ndCBiZWVuIGVuYWJsZWQuCisJICovCisJaWYgKHZodWItPnNw ZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKQorCQlyZXR1cm47CisKKwkvKiBXZSBhcmVuJ3Qgc3Vz cGVuZGVkIGFueW1vcmUgb2J2aW91c2x5ICovCisJdmh1Yi0+c3VzcGVuZGVkID0gZmFsc2U7CisK KwkvKiBObyBzcGVlZCBzZXQgKi8KKwl2aHViLT5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOwor CisJLyogV2FrZXVwIG5vdCBlbmFibGVkIGFueW1vcmUgKi8KKwl2aHViLT53YWtldXBfZW4gPSBm YWxzZTsKKworCS8qCisJICogQ2xlYXIgYWxsIHBvcnQgc3RhdHVzLCBkaXNhYmxlIGdhZGdldHMg YW5kICJzdXNwZW5kIgorCSAqIHRoZW0uIFRoZXkgd2lsbCBiZSB3b2tlbiB1cCBieSBhIHBvcnQg cmVzZXQuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9QT1JUUzsgaSsrKSB7 CisJCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW2ldOworCisJCS8qIE9u bHkga2VlcCB0aGUgY29ubmVjdGVkIGZsYWcgKi8KKwkJcC0+c3RhdHVzICY9IFVTQl9QT1JUX1NU QVRfQ09OTkVDVElPTjsKKwkJcC0+Y2hhbmdlID0gMDsKKworCQkvKiBTdXNwZW5kIHRoZSBnYWRn ZXQgaWYgYW55ICovCisJCWFzdF92aHViX2Rldl9zdXNwZW5kKCZwLT5kZXYpOworCX0KKworCS8q IENsZWFudXAgSFcgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NPTkYpOwor CXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAwX0NUUkwpOworCXdyaXRlbChWSFVC X0VQMV9DVFJMX1JFU0VUX1RPR0dMRSB8CisJICAgICAgIFZIVUJfRVAxX0NUUkxfRU5BQkxFLAor CSAgICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NUUkwpOworCXdyaXRlbCgwLCB2aHVi LT5yZWdzICsgQVNUX1ZIVUJfRVAxX1NUU19DSEcpOworfQorCit2b2lkIGFzdF92aHViX2luaXRf aHViKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl2aHViLT5zcGVlZCA9IFVTQl9TUEVFRF9V TktOT1dOOworCUlOSVRfV09SSygmdmh1Yi0+d2FrZV93b3JrLCBhc3Rfdmh1Yl93YWtlX3dvcmsp OworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3Zo dWIuaCBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvdmh1Yi5oCm5ldyBmaWxl IG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uNDQ3MjcyMTFhNWQwCi0tLSAvZGV2L251 bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmgKQEAgLTAs MCArMSw1MTQgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKyAqLworI2lm bmRlZiBfX0FTUEVFRF9WSFVCX0gKKyNkZWZpbmUgX19BU1BFRURfVkhVQl9ICisKKy8qKioqKioq KioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAqCisg KiBWSFVCIHJlZ2lzdGVyIGRlZmluaXRpb25zICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAg ICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lCUFTVF9WSFVC X0NUUkwJCTB4MDAJLyogUm9vdCBGdW5jdGlvbiBDb250cm9sICYgU3RhdHVzIFJlZ2lzdGVyICov CisjZGVmaW5lCUFTVF9WSFVCX0NPTkYJCTB4MDQJLyogUm9vdCBDb25maWd1cmF0aW9uIFNldHRp bmcgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfSUVSCQkweDA4CS8qIEludGVycnVwdCBD dHJsIFJlZ2lzdGVyICovCisjZGVmaW5lCUFTVF9WSFVCX0lTUgkJMHgwQwkvKiBJbnRlcnJ1cHQg U3RhdHVzIFJlZ2lzdGVyICovCisjZGVmaW5lCUFTVF9WSFVCX0VQX0FDS19JRVIJMHgxMAkvKiBQ cm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBBQ0sgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAq LworI2RlZmluZQlBU1RfVkhVQl9FUF9OQUNLX0lFUgkweDE0CS8qIFByb2dyYW1tYWJsZSBFbmRw b2ludCBQb29sIE5BQ0sgSW50ZXJydXB0IEVuYWJsZSBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQVNU X1ZIVUJfRVBfQUNLX0lTUgkweDE4CS8qIFByb2dyYW1tYWJsZSBFbmRwb2ludCBQb29sIEFDSyBJ bnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICAqLworI2RlZmluZSBBU1RfVkhVQl9FUF9OQUNLX0lT UgkweDFDCS8qIFByb2dyYW1tYWJsZSBFbmRwb2ludCBQb29sIE5BQ0sgSW50ZXJydXB0IFN0YXR1 cyBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfU1dfUkVTRVQJMHgyMAkvKiBEZXZpY2Ug Q29udHJvbGxlciBTb2Z0IFJlc2V0IEVuYWJsZSBSZWdpc3RlciAqLworI2RlZmluZSBBU1RfVkhV Ql9VU0JTVFMJCTB4MjQJLyogVVNCIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZSBBU1RfVkhV Ql9FUF9UT0dHTEUJMHgyOAkvKiBQcm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBEYXRhIFRvZ2ds ZSBWYWx1ZSBTZXQgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfSVNPX0ZBSUxfQUNDCTB4MkMJLyogSXNv Y2hyb25vdXMgVHJhbnNhY3Rpb24gRmFpbCBBY2N1bXVsYXRvciAqLworI2RlZmluZSBBU1RfVkhV Ql9FUDBfQ1RSTAkweDMwCS8qIEVuZHBvaW50IDAgQ29udHJsL1N0YXR1cyBSZWdpc3RlciAqLwor I2RlZmluZSBBU1RfVkhVQl9FUDBfREFUQQkweDM0CS8qIEJhc2UgQWRkcmVzcyBvZiBFbmRwb2lu dCAwIEluL09VVCBEYXRhIEJ1ZmZlciBSZWdpc3RlciAqLworI2RlZmluZSBBU1RfVkhVQl9FUDFf Q1RSTAkweDM4CS8qIEVuZHBvaW50IDEgQ29udHJsL1N0YXR1cyBSZWdpc3RlciAqLworI2RlZmlu ZSBBU1RfVkhVQl9FUDFfU1RTX0NIRwkweDNDCS8qIEVuZHBvaW50IDEgU3RhdHVzIENoYW5nZSBC aXRtYXAgRGF0YSAqLworI2RlZmluZSBBU1RfVkhVQl9TRVRVUDAJCTB4ODAJLyogUm9vdCBEZXZp Y2UgU2V0dXAgRGF0YSBCdWZmZXIwICovCisjZGVmaW5lIEFTVF9WSFVCX1NFVFVQMQkJMHg4NAkv KiBSb290IERldmljZSBTZXR1cCBEYXRhIEJ1ZmZlcjEgKi8KKworLyogTWFpbiBjb250cm9sIHJl ZyAqLworI2RlZmluZSBWSFVCX0NUUkxfUEhZX0NMSwkJCSgxIDw8IDMxKQorI2RlZmluZSBWSFVC X0NUUkxfUEhZX0xPT1BfVEVTVAkJCSgxIDw8IDI1KQorI2RlZmluZSBWSFVCX0NUUkxfRE5fUFdO CQkJKDEgPDwgMjQpCisjZGVmaW5lIFZIVUJfQ1RSTF9EUF9QV04JCQkoMSA8PCAyMykKKyNkZWZp bmUgVkhVQl9DVFJMX0xPTkdfREVTQwkJCSgxIDw8IDE4KQorI2RlZmluZSBWSFVCX0NUUkxfSVNP X1JTUF9DVFJMCQkJKDEgPDwgMTcpCisjZGVmaW5lIFZIVUJfQ1RSTF9TUExJVF9JTgkJCSgxIDw8 IDE2KQorI2RlZmluZSBWSFVCX0NUUkxfTE9PUF9UX1JFU1VMVAkJCSgxIDw8IDE1KQorI2RlZmlu ZSBWSFVCX0NUUkxfTE9PUF9UX1NUUwkJCSgxIDw8IDE0KQorI2RlZmluZSBWSFVCX0NUUkxfUEhZ X0JJU1RfUkVTVUxUCQkoMSA8PCAxMykKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9CSVNUX0NUUkwJ CQkoMSA8PCAxMikKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9SRVNFVF9ESVMJCQkoMSA8PCAxMSkK KyNkZWZpbmUgVkhVQl9DVFJMX1NFVF9URVNUX01PREUoeCkJCSgoeCkgPDwgOCkKKyNkZWZpbmUg VkhVQl9DVFJMX01BTlVBTF9SRU1PVEVfV0FLRVVQCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0NU UkxfQVVUT19SRU1PVEVfV0FLRVVQCQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0NUUkxfQ0xLX1NU T1BfU1VTUEVORAkJKDEgPDwgMikKKyNkZWZpbmUgVkhVQl9DVFJMX0ZVTExfU1BFRURfT05MWQkJ KDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9DVFJMX1VQU1RSRUFNX0NPTk5FQ1QJCSgxIDw8IDApCisK Ky8qIElFUiAmIElTUiAqLworI2RlZmluZSBWSFVCX0lSUV9VU0JfQ01EX0RFQURMT0NLCQkoMSA8 PCAxOCkKKyNkZWZpbmUgVkhVQl9JUlFfRVBfUE9PTF9OQUsJCQkoMSA8PCAxNykKKyNkZWZpbmUg VkhVQl9JUlFfRVBfUE9PTF9BQ0tfU1RBTEwJCSgxIDw8IDE2KQorI2RlZmluZSBWSFVCX0lSUV9E RVZJQ0U1CQkJKDEgPDwgMTMpCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTQJCQkoMSA8PCAxMikK KyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFMwkJCSgxIDw8IDExKQorI2RlZmluZSBWSFVCX0lSUV9E RVZJQ0UyCQkJKDEgPDwgMTApCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTEJCQkoMSA8PCA5KQor I2RlZmluZSBWSFVCX0lSUV9CVVNfUkVTVU1FCQkJKDEgPDwgOCkKKyNkZWZpbmUgVkhVQl9JUlFf QlVTX1NVU1BFTkQgCQkJKDEgPDwgNykKKyNkZWZpbmUgVkhVQl9JUlFfQlVTX1JFU0VUIAkJCSgx IDw8IDYpCisjZGVmaW5lIFZIVUJfSVJRX0hVQl9FUDFfSU5fREFUQV9BQ0sJCSgxIDw8IDUpCisj ZGVmaW5lIFZIVUJfSVJRX0hVQl9FUDBfSU5fREFUQV9OQUsJCSgxIDw8IDQpCisjZGVmaW5lIFZI VUJfSVJRX0hVQl9FUDBfSU5fQUNLX1NUQUxMCQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0lSUV9I VUJfRVAwX09VVF9OQUsJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfSVJRX0hVQl9FUDBfT1VUX0FD S19TVEFMTAkJKDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9TRVRVUAkJCSgxIDw8 IDApCisjZGVmaW5lIFZIVUJfSVJRX0FDS19BTEwJCQkweDFmZgorCisvKiBTVyByZXNldCByZWcg Ki8KKyNkZWZpbmUgVkhVQl9TV19SRVNFVF9FUF9QT09MCQkJKDEgPDwgOSkKKyNkZWZpbmUgVkhV Ql9TV19SRVNFVF9ETUFfQ09OVFJPTExFUgkJKDEgPDwgOCkKKyNkZWZpbmUgVkhVQl9TV19SRVNF VF9ERVZJQ0U1CQkJKDEgPDwgNSkKKyNkZWZpbmUgVkhVQl9TV19SRVNFVF9ERVZJQ0U0CQkJKDEg PDwgNCkKKyNkZWZpbmUgVkhVQl9TV19SRVNFVF9ERVZJQ0UzCQkJKDEgPDwgMykKKyNkZWZpbmUg VkhVQl9TV19SRVNFVF9ERVZJQ0UyCQkJKDEgPDwgMikKKyNkZWZpbmUgVkhVQl9TV19SRVNFVF9E RVZJQ0UxCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9TV19SRVNFVF9ST09UX0hVQgkJCSgxIDw8 IDApCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfQUxMCQkJKFZIVUJfU1dfUkVTRVRfRVBfUE9PTCB8 IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RNQV9DT05UUk9MTEVSIHwgXAorCQkJCQkJIFZIVUJf U1dfUkVTRVRfREVWSUNFNSB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTQgfCBcCisJ CQkJCQkgVkhVQl9TV19SRVNFVF9ERVZJQ0UzIHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfREVW SUNFMiB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTEgfCBcCisJCQkJCQkgVkhVQl9T V19SRVNFVF9ST09UX0hVQikKKy8qIEVQIEFDSy9OQUNLIElSUSBtYXNrcyAqLworI2RlZmluZSBW SFVCX0VQX0lSUShuKQkJCQkoMSA8PCAobikpCisjZGVmaW5lIFZIVUJfRVBfSVJRX0FMTAkJCQkw eDdmZmYJLyogMTUgRVBzICovCisKKy8qIFVTQiBzdGF0dXMgcmVnICovCisjZGVmaW5lIFZIVUJf VVNCU1RTX0hJU1BFRUQJCQkoMSA8PCAyNykKKworLyogRVAgdG9nZ2xlICovCisjZGVmaW5lIFZI VUJfRVBfVE9HR0xFX1ZBTFVFCQkJKDEgPDwgOCkKKyNkZWZpbmUgVkhVQl9FUF9UT0dHTEVfU0VU X0VQTlVNKHgpCQkoKHgpICYgMHgxZikKKworLyogSFVCIEVQMCBjb250cm9sICovCisjZGVmaW5l IFZIVUJfRVAwX0NUUkxfU1RBTEwJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX0VQMF9UWF9CVUZG X1JEWQkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfRVAwX1JYX0JVRkZfUkRZCQkJKDEgPDwgMikK KyNkZWZpbmUgVkhVQl9FUDBfUlhfTEVOKHgpCQkJKCgoeCkgPj4gMTYpICYgMHg3ZikKKyNkZWZp bmUgVkhVQl9FUDBfU0VUX1RYX0xFTih4KQkJCSgoKHgpICYgMHg3ZikgPDwgOCkKKworLyogSFVC IEVQMSBjb250cm9sICovCisjZGVmaW5lIFZIVUJfRVAxX0NUUkxfUkVTRVRfVE9HR0xFCQkoMSA8 PCAyKQorI2RlZmluZSBWSFVCX0VQMV9DVFJMX1NUQUxMCQkJKDEgPDwgMSkKKyNkZWZpbmUgVkhV Ql9FUDFfQ1RSTF9FTkFCTEUJCQkoMSA8PCAwKQorCisvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGVy LWRldmljZSByZWdpc3RlciBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZp bmUgQVNUX1ZIVUJfREVWX0VOX0NUUkwJCTB4MDAKKyNkZWZpbmUgQVNUX1ZIVUJfREVWX0lTUgkJ MHgwNAorI2RlZmluZSBBU1RfVkhVQl9ERVZfRVAwX0NUUkwJCTB4MDgKKyNkZWZpbmUgQVNUX1ZI VUJfREVWX0VQMF9EQVRBCQkweDBjCisKKy8qIERldmljZSBlbmFibGUgY29udHJvbCAqLworI2Rl ZmluZSBWSFVCX0RFVl9FTl9TRVRfQUREUih4KQkJCSgoeCkgPDwgOCkKKyNkZWZpbmUgVkhVQl9E RVZfRU5fQUREUl9NQVNLCQkJKCgweGZmKSA8PCA4KQorI2RlZmluZSBWSFVCX0RFVl9FTl9FUDBf TkFLX0lSUUVOCQkoMSA8PCA2KQorI2RlZmluZSBWSFVCX0RFVl9FTl9FUDBfSU5fQUNLX0lSUUVO CQkoMSA8PCA1KQorI2RlZmluZSBWSFVCX0RFVl9FTl9FUDBfT1VUX05BS19JUlFFTgkJKDEgPDwg NCkKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX09VVF9BQ0tfSVJRRU4JCSgxIDw8IDMpCisjZGVm aW5lIFZIVUJfREVWX0VOX0VQMF9TRVRVUF9JUlFFTgkJKDEgPDwgMikKKyNkZWZpbmUgVkhVQl9E RVZfRU5fU1BFRURfU0VMX0hJR0gJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VOQUJM RV9QT1JUCQkJKDEgPDwgMCkKKworLyogSW50ZXJydXB0IHN0YXR1cyAqLworI2RlZmluZSBWSFVW X0RFVl9JUlFfRVAwX0lOX0RBVEFfTkFDSwkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVVl9ERVZfSVJR X0VQMF9JTl9BQ0tfU1RBTEwJCSgxIDw8IDMpCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfT1VU X0RBVEFfTkFDSwkJKDEgPDwgMikKKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9PVVRfQUNLX1NU QUxMCQkoMSA8PCAxKQorI2RlZmluZSBWSFVWX0RFVl9JUlFfRVAwX1NFVFVQCQkJKDEgPDwgMCkK KworLyogQ29udHJvbCBiaXRzLgorICoKKyAqIE5vdGU6IFRoZSBkcml2ZXIgcmVsaWVzIG9uIHRo ZSBidWxrIG9mIHRob3NlIGJpdHMKKyAqICAgICAgIG1hdGNoaW5nIGNvcnJlc3BvbmRpbmcgdkh1 YiBFUDAgY29udHJvbCBiaXRzCisgKi8KKyNkZWZpbmUgVkhVQl9ERVZfRVAwX0NUUkxfU1RBTEwJ CQlWSFVCX0VQMF9DVFJMX1NUQUxMCisjZGVmaW5lIFZIVUJfREVWX0VQMF9UWF9CVUZGX1JEWQkJ VkhVQl9FUDBfVFhfQlVGRl9SRFkKKyNkZWZpbmUgVkhVQl9ERVZfRVAwX1JYX0JVRkZfUkRZCQlW SFVCX0VQMF9SWF9CVUZGX1JEWQorI2RlZmluZSBWSFVCX0RFVl9FUDBfUlhfTEVOKHgpCQkJVkhV Ql9FUDBfUlhfTEVOKHgpCisjZGVmaW5lIFZIVUJfREVWX0VQMF9TRVRfVFhfTEVOKHgpCQlWSFVC X0VQMF9TRVRfVFhfTEVOKHgpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogcGVyLWVuZHBv aW50IHJlZ2lzdGVyIGRlZmluaXRpb25zICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2Rl ZmluZSBBU1RfVkhVQl9FUF9DT05GSUcJCTB4MDAKKyNkZWZpbmUgQVNUX1ZIVUJfRVBfRE1BX0NU TFNUQVQJCTB4MDQKKyNkZWZpbmUgQVNUX1ZIVUJfRVBfREVTQ19CQVNFCQkweDA4CisjZGVmaW5l IEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTCQkweDBDCisKKy8qIEVQIGNvbmZpZyByZWcgKi8KKyNk ZWZpbmUgVkhVQl9FUF9DRkdfU0VUX01BWF9QS1QoeCkJKCgoeCkgJiAweDNmZikgPDwgMTYpCisj ZGVmaW5lIFZIVUJfRVBfQ0ZHX0FVVE9fREFUQV9ESVNBQkxFCSgxIDw8IDEzKQorI2RlZmluZSBW SFVCX0VQX0NGR19TVEFMTF9DVFJMCQkoMSA8PCAxMikKKyNkZWZpbmUgVkhVQl9FUF9DRkdfU0VU X0VQX05VTSh4KQkoKCh4KSAmIDB4ZikgPDwgOCkKKyNkZWZpbmUgVkhVQl9FUF9DRkdfU0VUX1RZ UEUoeCkJCSgoeCkgPDwgNSkKKyNkZWZpbmUgICBFUF9UWVBFX09GRgkJCTAKKyNkZWZpbmUgICBF UF9UWVBFX0JVTEsJCQkxCisjZGVmaW5lICAgRVBfVFlQRV9JTlQJCQkyCisjZGVmaW5lICAgRVBf VFlQRV9JU08JCQkzCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX0RJUl9PVVQJCSgxIDw8IDQpCisjZGVm aW5lIFZIVUJfRVBfQ0ZHX1NFVF9ERVYoeCkJCSgoeCkgPDwgMSkKKyNkZWZpbmUgVkhVQl9FUF9D RkdfRU5BQkxFCQkoMSA8PCAwKQorCisvKiBFUCBETUEgY29udHJvbCAqLworI2RlZmluZSBWSFVC X0VQX0RNQV9QUk9DX1NUQVRVUyh4KQkoKCh4KSA+PiA0KSAmIDB4ZikKKyNkZWZpbmUgICBFUF9E TUFfUFJPQ19SWF9JRExFCQkwCisjZGVmaW5lICAgRVBfRE1BX1BST0NfVFhfSURMRQkJOAorI2Rl ZmluZSBWSFVCX0VQX0RNQV9JTl9MT05HX01PREUJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9FUF9E TUFfT1VUX0NPTlRJR19NT0RFCSgxIDw8IDMpCisjZGVmaW5lIFZIVUJfRVBfRE1BX0NUUkxfUkVT RVQJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NJTkdMRV9TVEFHRQkoMSA8PCAxKQor I2RlZmluZSBWSFVCX0VQX0RNQV9ERVNDX01PREUJCSgxIDw8IDApCisKKy8qIEVQIERNQSBzdGF0 dXMgKi8KKyNkZWZpbmUgVkhVQl9FUF9ETUFfU0VUX1RYX1NJWkUoeCkJKCh4KSA8PCAxNikKKyNk ZWZpbmUgVkhVQl9FUF9ETUFfVFhfU0laRSh4KQkJKCgoeCkgPj4gMTYpICYgMHg3ZmYpCisjZGVm aW5lIFZIVUJfRVBfRE1BX1JQVFIoeCkJCSgoKHgpID4+IDgpICYgMHhmZikKKyNkZWZpbmUgVkhV Ql9FUF9ETUFfU0VUX1JQVFIoeCkJCSgoKHgpICYgMHhmZikgPDwgOCkKKyNkZWZpbmUgVkhVQl9F UF9ETUFfU0VUX0NQVV9XUFRSKHgpCSh4KQorI2RlZmluZSBWSFVCX0VQX0RNQV9TSU5HTEVfS0lD SwkJKDEgPDwgMCkgLyogV1BUUiA9IDEgZm9yIHNpbmdsZSBtb2RlICovCisKKy8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgor ICogRE1BIGRlc2NyaXB0b3JzIGRlZmluaXRpb25zICoKKyAqICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogRGVzYyBX MSBJTiAqLworI2RlZmluZSBWSFVCX0RTQzFfSU5fSU5URVJSVVBUCQkoMSA8PCAzMSkKKyNkZWZp bmUgVkhVQl9EU0MxX0lOX1NQSURfREFUQTAJCSgwIDw8IDE0KQorI2RlZmluZSBWSFVCX0RTQzFf SU5fU1BJRF9EQVRBMgkJKDEgPDwgMTQpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX0RBVEEx CQkoMiA8PCAxNCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NQSURfTURBVEEJCSgzIDw8IDE0KQor I2RlZmluZSBWSFVCX0RTQzFfSU5fU0VUX0xFTih4KQkJKCh4KSAmIDB4ZmZmKQorI2RlZmluZSBW SFVCX0RTQzFfSU5fTEVOKHgpCQkoKHgpICYgMHhmZmYpCisKKy8qKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgKgorICogRGF0YSBzdHJ1Y3R1cmVzIGFuZCBtaXNjIGRlZmluaXRpb25zICoKKyAqICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBBU1RfVkhVQl9OVU1fR0VOX0VQcwkx NQkvKiBHZW5lcmljIG5vbi0wIEVQcyAqLworI2RlZmluZSBBU1RfVkhVQl9OVU1fUE9SVFMJNQkv KiB2SHViIHBvcnRzICovCisjZGVmaW5lIEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUCTY0CS8qIEVQ MCdzIG1heCBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVAkx MDI0CS8qIEdlbmVyaWMgRVBzIG1heCBwYWNrZXQgc2l6ZSAqLworI2RlZmluZSBBU1RfVkhVQl9E RVNDU19DT1VOVAkyNTYJLyogVXNlIDI1NiBkZXNjcmlwdG9yIG1vZGUgKHZhbGlkCisJCQkJCSAq IHZhbHVlcyBhcmUgMjU2IGFuZCAzMikKKwkJCQkJICovCisKK3N0cnVjdCBhc3Rfdmh1YjsKK3N0 cnVjdCBhc3Rfdmh1Yl9kZXY7CisKKy8qCisgKiBETUEgZGVzY3JpcHRvciAoZ2VuZXJpYyBFUHMg b25seSwgY3VycmVudGx5IG9ubHkgdXNlZAorICogZm9yIElOIGVuZHBvaW50cworICovCitzdHJ1 Y3QgYXN0X3ZodWJfZGVzYyB7CisJX19sZTMyCXcwOworCV9fbGUzMgl3MTsKK307CisKKy8qIEEg dHJhbnNmZXIgcmVxdWVzdCwgZWl0aGVyIGNvcmUtb3JpZ2luYXRlZCBvciBpbnRlcm5hbCAqLwor c3RydWN0IGFzdF92aHViX3JlcSB7CisJc3RydWN0IHVzYl9yZXF1ZXN0CXJlcTsKKwlzdHJ1Y3Qg bGlzdF9oZWFkCXF1ZXVlOworCisJLyogQWN0dWFsIGNvdW50IHdyaXR0ZW4gdG8gZGVzY3JpcHRv cnMgKGRlc2MgbW9kZSBvbmx5KSAqLworCXVuc2lnbmVkIGludAkJYWN0X2NvdW50OworCisJLyoK KwkgKiBEZXNjIG51bWJlciBvZiB0aGUgZmluYWwgcGFja2V0IG9yIC0xLiBGb3Igbm9uLWRlc2MK KwkgKiBtb2RlIChvciBlcDApLCBhbnkgPj0gMCB2YWx1ZSBtZWFucyAibGFzdCBwYWNrZXQiCisJ ICovCisJaW50CQkJbGFzdF9kZXNjOworCisJLyogUmVxdWVzdCBhY3RpdmUgKHBlbmRpbmcgRE1B cykgKi8KKwlib29sCQkJYWN0aXZlICA6IDE7CisKKwkvKiBJbnRlcm5hbCByZXF1ZXN0IChkb24n dCBjYWxsIGJhY2sgY29yZSkgKi8KKwlib29sCQkJaW50ZXJuYWwgOiAxOworfTsKKyNkZWZpbmUg dG9fYXN0X3JlcShfX3VyZXEpIGNvbnRhaW5lcl9vZihfX3VyZXEsIHN0cnVjdCBhc3Rfdmh1Yl9y ZXEsIHJlcSkKKworLyogQ3VycmVudCBzdGF0ZSBvZiBhbiBFUDAgKi8KK2VudW0gZXAwX3N0YXRl IHsKKwllcDBfc3RhdGVfdG9rZW4sCisJZXAwX3N0YXRlX2RhdGEsCisJZXAwX3N0YXRlX3N0YXR1 cywKK307CisKKy8qCisgKiBBbiBlbmRwb2ludCwgZWl0aGVyIGdlbmVyaWMsIGVwMCwgYWN0dWFs IGdhZGdldCBFUAorICogb3IgaW50ZXJuYWwgdXNlIHZodWIgRVAwLiB2aHViIEVQMSBkb2Vzbid0 IGhhdmUgYW4KKyAqIGFzc29jaWF0ZWQgc3RydWN0dXJlIGFzIGl0J3MgbW9zdGx5IEhXIG1hbmFn ZWQuCisgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9lcCB7CisJc3RydWN0IHVzYl9lcAkJZXA7CisKKwkv KiBSZXF1ZXN0IHF1ZXVlICovCisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKworCS8qIEVQIGlu ZGV4IGluIHRoZSBkZXZpY2UsIDAgbWVhbnMgdGhpcyBpcyBhbiBFUDAgKi8KKwl1bnNpZ25lZCBp bnQJCWRfaWR4OworCisJLyogRGV2IHBvaW50ZXIgb3IgTlVMTCBmb3Igdkh1YiBFUDAgKi8KKwlz dHJ1Y3QgYXN0X3ZodWJfZGV2CSpkZXY7CisKKwkvKiB2SHViIGl0c2VsZiAqLworCXN0cnVjdCBh c3Rfdmh1YgkJKnZodWI7CisKKwkvKgorCSAqIERNQSBidWZmZXIgZm9yIEVQMCwgZmFsbGJhY2sg RE1BIGJ1ZmZlciBmb3IgbWlzYWxpZ25lZAorCSAqIE9VVCB0cmFuc2ZlcnMgZm9yIGdlbmVyaWMg RVBzCisJICovCisJdm9pZAkJCSpidWY7CisJZG1hX2FkZHJfdAkJYnVmX2RtYTsKKworCS8qIFRo ZSByZXN0IGRlcGVuZHMgb24gdGhlIEVQIHR5cGUgKi8KKwl1bmlvbiB7CisJCS8qIEVQMCAoZWl0 aGVyIGRldmljZSBvciB2aHViKSAqLworCQlzdHJ1Y3QgeworCQkJLyoKKwkJCSAqIEVQMCByZWdp c3RlcnMgYXJlICJzaW1pbGFyIiBmb3IKKwkJCSAqIHZIdWIgYW5kIGRldmljZXMgYnV0IGxvY2F0 ZWQgaW4KKwkJCSAqIGRpZmZlcmVudCBwbGFjZXMuCisJCQkgKi8KKwkJCXZvaWQgX19pb21lbQkJ KmN0bHN0YXQ7CisJCQl2b2lkIF9faW9tZW0JCSpzZXR1cDsKKworCQkJLyogQ3VycmVudCBzdGF0 ZSAmIGRpcmVjdGlvbiAqLworCQkJZW51bSBlcDBfc3RhdGUJCXN0YXRlOworCQkJYm9vbAkJCWRp cl9pbjsKKworCQkJLyogSW50ZXJuYWwgdXNlIHJlcXVlc3QgKi8KKwkJCXN0cnVjdCBhc3Rfdmh1 Yl9yZXEJcmVxOworCQl9IGVwMDsKKworCQkvKiBHZW5lcmljIGVuZHBvaW50IChha2EgRVBuKSAq LworCQlzdHJ1Y3QgeworCQkJLyogUmVnaXN0ZXJzICovCisJCQl2b2lkIF9faW9tZW0gICAJCSpy ZWdzOworCisJCQkvKiBJbmRleCBpbiBnbG9iYWwgcG9vbCAoMC4uMTQpICovCisJCQl1bnNpZ25l ZCBpbnQJCWdfaWR4OworCisJCQkvKiBETUEgRGVzY3JpcHRvcnMgKi8KKwkJCXN0cnVjdCBhc3Rf dmh1Yl9kZXNjCSpkZXNjczsKKwkJCWRtYV9hZGRyX3QJCWRlc2NzX2RtYTsKKwkJCXVuc2lnbmVk IGludAkJZF9uZXh0OworCQkJdW5zaWduZWQgaW50CQlkX2xhc3Q7CisJCQl1bnNpZ25lZCBpbnQJ CWRtYV9jb25mOworCisJCQkvKiBNYXggY2h1bmsgc2l6ZSBmb3IgSU4gRVBzICovCisJCQl1bnNp Z25lZCBpbnQJCWNodW5rX21heDsKKworCQkJLyogU3RhdGUgZmxhZ3MgKi8KKwkJCWJvb2wJCQlp c19pbiA6ICAxOworCQkJYm9vbAkJCWlzX2lzbyA6IDE7CisJCQlib29sCQkJc3RhbGxlZCA6IDE7 CisJCQlib29sCQkJd2VkZ2VkIDogMTsKKwkJCWJvb2wJCQllbmFibGVkIDogMTsKKwkJCWJvb2wJ CQlkZXNjX21vZGUgOiAxOworCQl9IGVwbjsKKwl9OworfTsKKyNkZWZpbmUgdG9fYXN0X2VwKF9f dWVwKSBjb250YWluZXJfb2YoX191ZXAsIHN0cnVjdCBhc3Rfdmh1Yl9lcCwgZXApCisKKy8qIEEg ZGV2aWNlIGF0dGFjaGVkIHRvIGEgdkh1YiBwb3J0ICovCitzdHJ1Y3QgYXN0X3ZodWJfZGV2IHsK KwlzdHJ1Y3QgYXN0X3ZodWIJCQkqdmh1YjsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKworCS8q IERldmljZSBpbmRleCAoMC4uLjQpIGFuZCBuYW1lIHN0cmluZyAqLworCXVuc2lnbmVkIGludAkJ CWluZGV4OworCWNvbnN0IGNoYXIJCQkqbmFtZTsKKworCS8qIHN5c2ZzIGVuY2xvc3VyZSBmb3Ig dGhlIGdhZGdldCBndW5rICovCisJc3RydWN0IGRldmljZQkJCXBvcnRfZGV2OworCisJLyogTGlu ayB0byBnYWRnZXQgY29yZSAqLworCXN0cnVjdCB1c2JfZ2FkZ2V0CQlnYWRnZXQ7CisJc3RydWN0 IHVzYl9nYWRnZXRfZHJpdmVyCSpkcml2ZXI7CisJYm9vbAkJCQlyZWdpc3RlcmVkIDogMTsKKwli b29sCQkJCXdha2V1cF9lbiA6IDE7CisJYm9vbAkJCQlzdXNwZW5kZWQgOiAxOworCWJvb2wJCQkJ ZW5hYmxlZCA6IDE7CisKKwkvKiBFbmRwb2ludCBzdHJ1Y3R1cmVzICovCisJc3RydWN0IGFzdF92 aHViX2VwCQllcDA7CisJc3RydWN0IGFzdF92aHViX2VwCQkqZXBuc1tBU1RfVkhVQl9OVU1fR0VO X0VQc107CisKK307CisjZGVmaW5lIHRvX2FzdF9kZXYoX19nKSBjb250YWluZXJfb2YoX19nLCBz dHJ1Y3QgYXN0X3ZodWJfZGV2LCBnYWRnZXQpCisKKy8qIFBlciB2aHViIHBvcnQgc3RhdGVpbmZv IHN0cnVjdHVyZSAqLworc3RydWN0IGFzdF92aHViX3BvcnQgeworCS8qIFBvcnQgc3RhdHVzICYg c3RhdHVzIGNoYW5nZSByZWdpc3RlcnMgKi8KKwl1MTYJCQlzdGF0dXM7CisJdTE2CQkJY2hhbmdl OworCisJLyogQXNzb2NpYXRlZCBkZXZpY2Ugc2xvdCAqLworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYJ ZGV2OworfTsKKworLyogR2xvYmFsIHZodWIgc3RydWN0dXJlICovCitzdHJ1Y3QgYXN0X3ZodWIg eworCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UJCSpwZGV2OworCXZvaWQgX19pb21lbQkJCSpyZWdz OworCWludAkJCQlpcnE7CisJc3BpbmxvY2tfdAkJCWxvY2s7CisJc3RydWN0IHdvcmtfc3RydWN0 CQl3YWtlX3dvcms7CisJc3RydWN0IGNsawkJCSpjbGs7CisKKwkvKiBFUDAgRE1BIGJ1ZmZlcnMg YWxsb2NhdGVkIGluIG9uZSBjaHVuayAqLworCXZvaWQJCQkJKmVwMF9idWZzOworCWRtYV9hZGRy X3QJCQllcDBfYnVmc19kbWE7CisKKwkvKiBFUDAgb2YgdGhlIHZodWIgaXRzZWxmICovCisJc3Ry dWN0IGFzdF92aHViX2VwCQllcDA7CisKKwkvKiBTdGF0ZSBvZiB2aHViIGVwMSAqLworCWJvb2wJ CQkJZXAxX3N0YWxsZWQgOiAxOworCisJLyogUGVyLXBvcnQgaW5mbyAqLworCXN0cnVjdCBhc3Rf dmh1Yl9wb3J0CQlwb3J0c1tBU1RfVkhVQl9OVU1fUE9SVFNdOworCisJLyogR2VuZXJpYyBFUCBk YXRhIHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwbnNbQVNUX1ZIVUJfTlVN X0dFTl9FUHNdOworCisJLyogVXBzdHJlYW0gYnVzIGlzIHN1c3BlbmRlZCA/ICovCisJYm9vbAkJ CQlzdXNwZW5kZWQgOiAxOworCisJLyogSHViIGl0c2VsZiBjYW4gc2lnbmFsIHJlbW90ZSB3YWtl dXAgKi8KKwlib29sCQkJCXdha2V1cF9lbiA6IDE7CisKKwkvKiBGb3JjZSBmdWxsIHNwZWVkIG9u bHkgKi8KKwlib29sCQkJCWZvcmNlX3VzYjEgOiAxOworCisJLyogVXBzdHJlYW0gYnVzIHNwZWVk IGNhcHR1cmVkIGF0IGJ1cyByZXNldCAqLworCXVuc2lnbmVkIGludAkJCXNwZWVkOworfTsKKwor LyogU3RhbmRhcmQgcmVxdWVzdCBoYW5kbGVycyByZXN1bHQgY29kZXMgKi8KK2VudW0gc3RkX3Jl cV9yYyB7CisJc3RkX3JlcV9zdGFsbCA9IC0xLAkvKiBTdGFsbCByZXF1ZXN0ZWQgKi8KKwlzdGRf cmVxX2NvbXBsZXRlID0gMCwJLyogUmVxdWVzdCBjb21wbGV0ZWQgd2l0aCBubyBkYXRhICovCisJ c3RkX3JlcV9kYXRhID0gMSwJLyogUmVxdWVzdCBjb21wbGV0ZWQgd2l0aCBkYXRhICovCisJc3Rk X3JlcV9kcml2ZXIgPSAyLAkvKiBQYXNzIHRvIGRyaXZlciBwbHMgKi8KK307CisKKyNpZmRlZiBD T05GSUdfVVNCX0dBREdFVF9WRVJCT1NFCisjZGVmaW5lIFVEQ1ZEQkcodSwgZm10Li4uKQlkZXZf ZGJnKCYodSktPnBkZXYtPmRldiwgZm10KQorCisjZGVmaW5lIEVQVkRCRyhlcCwgZm10LCAuLi4p CWRvIHsJCQlcCisJZGV2X2RiZygmKGVwKS0+dmh1Yi0+cGRldi0+ZGV2LAkJCVwKKwkJIiVzOkVQ JWQgIiBmbXQsCQkJCVwKKwkJKGVwKS0+ZGV2ID8gKGVwKS0+ZGV2LT5uYW1lIDogImh1YiIsCVwK KwkJKGVwKS0+ZF9pZHgsICMjX19WQV9BUkdTX18pOwkJXAorCX0gd2hpbGUoMCkKKworI2RlZmlu ZSBEVkRCRyhkLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJnKCYoZCktPnZodWItPnBkZXYt PmRldiwJCQlcCisJCSIlcyAiIGZtdCwgKGQpLT5uYW1lLAkJCVwKKwkJIyNfX1ZBX0FSR1NfXyk7 CQkJCVwKKwl9IHdoaWxlKDApCisKKyNlbHNlCisjZGVmaW5lIFVEQ1ZEQkcodSwgZm10Li4uKQlk byB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRVBWREJHKGVwLCBmbXQsIC4uLikJZG8geyB9IHdoaWxl KDApCisjZGVmaW5lIERWREJHKGQsIGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgor CisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfREVCVUcKKyNkZWZpbmUgVURDREJHKHUsIGZtdC4u LikJZGV2X2RiZygmKHUpLT5wZGV2LT5kZXYsIGZtdCkKKworI2RlZmluZSBFUERCRyhlcCwgZm10 LCAuLi4pCWRvIHsJCQlcCisJZGV2X2RiZygmKGVwKS0+dmh1Yi0+cGRldi0+ZGV2LAkJCVwKKwkJ IiVzOkVQJWQgIiBmbXQsCQkJCVwKKwkJKGVwKS0+ZGV2ID8gKGVwKS0+ZGV2LT5uYW1lIDogImh1 YiIsCVwKKwkJKGVwKS0+ZF9pZHgsICMjX19WQV9BUkdTX18pOwkJXAorCX0gd2hpbGUoMCkKKwor I2RlZmluZSBEREJHKGQsIGZtdCwgLi4uKQlkbyB7CQkJXAorCWRldl9kYmcoJihkKS0+dmh1Yi0+ cGRldi0+ZGV2LAkJCVwKKwkJIiVzICIgZm10LCAoZCktPm5hbWUsCQkJXAorCQkjI19fVkFfQVJH U19fKTsJCQkJXAorCX0gd2hpbGUoMCkKKyNlbHNlCisjZGVmaW5lIFVEQ0RCRyh1LCBmbXQuLi4p CWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBFUERCRyhlcCwgZm10LCAuLi4pCWRvIHsgfSB3aGls ZSgwKQorI2RlZmluZSBEREJHKGQsIGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgor CisvKiBjb3JlLmMgKi8KK3ZvaWQgYXN0X3ZodWJfZG9uZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw LCBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEsCisJCSAgIGludCBzdGF0dXMpOwordm9pZCBhc3Rf dmh1Yl9udWtlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBzdGF0dXMpOworc3RydWN0IHVz Yl9yZXF1ZXN0ICphc3Rfdmh1Yl9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKnVfZXAsCisJ CQkJCSAgIGdmcF90IGdmcF9mbGFncyk7Cit2b2lkIGFzdF92aHViX2ZyZWVfcmVxdWVzdChzdHJ1 Y3QgdXNiX2VwICp1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxKTsKK3ZvaWQgYXN0X3Zo dWJfaW5pdF9odyhzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpOworCisvKiBlcDAuYyAqLwordm9pZCBh c3Rfdmh1Yl9lcDBfaGFuZGxlX2FjayhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBib29sIGluX2Fj ayk7Cit2b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfc2V0dXAoc3RydWN0IGFzdF92aHViX2VwICpl cCk7Cit2b2lkIGFzdF92aHViX2luaXRfZXAwKHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yiwgc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJICAgICAgIHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmRldik7Citp bnQgYXN0X3ZodWJfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICplcCwgY2hhciAqcHRyLCBpbnQg bGVuKTsKK2ludCBfX2FzdF92aHViX3NpbXBsZV9yZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw LCBpbnQgbGVuLCAuLi4pOworI2RlZmluZSBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHkodWRjLCAuLi4p CQkJCQkgICAgICAgXAorCV9fYXN0X3ZodWJfc2ltcGxlX3JlcGx5KCh1ZGMpLAkJCQkJICAgICAg IFwKKwkJCSAgICAgICBzaXplb2YoKHU4W10pIHsgX19WQV9BUkdTX18gfSkvc2l6ZW9mKHU4KSwg ICAgICBcCisJCQkgICAgICAgX19WQV9BUkdTX18pCisKKy8qIGh1Yi5jICovCit2b2lkIGFzdF92 aHViX2luaXRfaHViKHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7CitlbnVtIHN0ZF9yZXFfcmMgYXN0 X3ZodWJfc3RkX2h1Yl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJCSBzdHJ1 Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcnEpOworZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX2NsYXNz X2h1Yl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJCSAgIHN0cnVjdCB1c2Jf Y3RybHJlcXVlc3QgKmNycSk7Cit2b2lkIGFzdF92aHViX2RldmljZV9jb25uZWN0KHN0cnVjdCBh c3Rfdmh1YiAqdmh1YiwgdW5zaWduZWQgaW50IHBvcnQsCisJCQkgICAgIGJvb2wgb24pOwordm9p ZCBhc3Rfdmh1Yl9odWJfc3VzcGVuZChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpOwordm9pZCBhc3Rf dmh1Yl9odWJfcmVzdW1lKHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7Cit2b2lkIGFzdF92aHViX2h1 Yl9yZXNldChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpOwordm9pZCBhc3Rfdmh1Yl9odWJfd2FrZV9h bGwoc3RydWN0IGFzdF92aHViICp2aHViKTsKKworLyogZGV2LmMgKi8KK2ludCBhc3Rfdmh1Yl9p bml0X2RldihzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHVuc2lnbmVkIGludCBpZHgpOwordm9pZCBh c3Rfdmh1Yl9kZWxfZGV2KHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpOwordm9pZCBhc3Rfdmh1Yl9k ZXZfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpOworaW50IGFzdF92aHViX3N0ZF9kZXZfcmVx dWVzdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJICAgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1 ZXN0ICpjcnEpOworCisvKiBlcG4uYyAqLwordm9pZCBhc3Rfdmh1Yl9lcG5fYWNrX2lycShzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwKTsKK3ZvaWQgYXN0X3ZodWJfdXBkYXRlX2Vwbl9zdGFsbChzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwKTsKK3N0cnVjdCBhc3Rfdmh1Yl9lcCAqYXN0X3ZodWJfYWxsb2Nf ZXBuKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsIHU4IGFkZHIpOwordm9pZCBhc3Rfdmh1Yl9kZXZf c3VzcGVuZChzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X3Jlc3Vt ZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X3Jlc2V0KHN0cnVj dCBhc3Rfdmh1Yl9kZXYgKmQpOworCisjZW5kaWYgLyogX19BU1BFRURfVkhVQl9IICovCg==