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: [RESEND,v8,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180419044000.7860-2-benh@kernel.crashing.org> Date: Thu, 19 Apr 2018 14:40:00 +1000 To: linux-usb@vger.kernel.org Cc: Felipe Balbi , Greg KH , Joel Stanley , Andrew Jeffery , Benjamin Herrenschmidt List-ID: VGhlIEFzcGVlZCBCTUMgU29DcyBzdXBwb3J0IGEgInZpcnR1YWwgaHViIiBmdW5jdGlvbi4gSXQg cHJvdmlkZXMgc29tZQpIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBiZWhpbmQg d2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCgpUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9y IHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKaHViIHN0YW5kYXJkIHJlcXVl c3RzIGFuZCBleHBvc2luZyA1IFVEQyBnYWRnZXQgZHJpdmVycyBjb3JyZXNwb25kaW5nCnRvIHRo ZSBwb3J0cy4KClRoZSBodWIgaXRzZWxmIGhhcyBIVyBwcm92aWRlZCBkZWRpY2F0ZWQgRVAwIGFu ZCBFUDEgKHRoZSBsYXR0ZXIgZm9yCmh1YiBpbnRlcnJ1cHRzKS4gSXQgYWxzbyBoYXMgZGVkaWNh dGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgpvdGhlciBlbmRwb2ludHMsIHRoZXJlJ3Mg YSBwb29sIG9mIDE1ICJnZW5lcmljIiBlbmRwb2ludHMgdGhhdCBhcmUKc2hhcmVkIGFtb25nIHRo ZSBwb3J0cy4KClRoZSBkcml2ZXIgcmVsaWVzIG9uIG15IHByZXZpb3VzIHBhdGNoIGFkZGluZyBh ICJkaXNwb3NlIiBFUCBvcCB0bwpoYW5kbGUgRVAgYWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBF UHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFyZWQKcG9vbCBpbiB0aGUgVURDICJtYXRjaF9l cCIgY2FsbGJhY2sgYW5kIGFzc2lnbmVkIHRvIHRoZSBVREMgaW5zdGFuY2UKKGFkZGVkIHRvIHRo ZSBnYWRnZXQgZXBfbGlzdCkuCgpXaGVuIHRoZSBjb21wb3NpdGUgZHJpdmVyIGdldHMgdW5ib3Vu ZCwgdGhlIG5ldyBob29rIHdpbGwgYWxsb3cgdGhlIFVEQwp0byBjbGVhbiB0aGluZ3MgdXAgYW5k IHJldHVybiB0aG9zZSBFUHMgdG8gdGhlIHNoYXJlZCBwb29sLgoKU2lnbmVkLW9mZi1ieTogQmVu amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjguIC0g UmV3b3JrIGFzdF92aHViX3JlcF9kZXNjKCkgdG8gYXZvaWQgaW5jb3JyZWN0IGJ1aWx0IGVycm9y CiAgICAgIHdoZW4gZm9ydGlmeSBpcyBlbmFibGVkCiAgICAtIFJld29yayBhc3Rfdmh1Yl9yZXBf c3RyaW5nKCkgdG8gdXNlIHVzYl9nYWRnZXRfZ2V0X3N0cmluZygpCiAgICAgIGluc3RlYWQgb2Yg YSBsb2NhbCBjb3B5IG9mIGFzY2lpMmRlc2MKICAgIC0gV2hpdGVzcGFjZSBmaXhlcwoKdjcuIC0g Rml4IE9GIG1hdGNoIGxpc3QKICAgIC0gUmVtb3ZlIHVudXNlZCB2YXJpYWJsZSBpbiBodWIgY29k ZQoKdjYuIC0gRml4IGJ1ZyB3aXRoIDAtbGVuZ3RoIHBhY2tldHMgb24gSU4gZW5kcG9pbnRzIGlu IGRlc2MgbW9kZQoKdjUuIC0gUmVtb3ZlICNpZmRlZidzIGFuZCBoYXJkIGNvZGVkIHZhbHVlcwog ICAgLSBSZW1vdmUgbW9kdWxlIHBhcmFtZXRlcnMKICAgIC0gSG9ub3IgbWF4aW11bSBzcGVlZCBk ZXZpY2UtdHJlZSBwcm9wZXJ0eQogICAgLSBSZW1vdmUgdXNlbGVzcyBsaXN0X2VtcHR5IHRlc3QK ICAgIC0gQ29zbWV0aWMvc3BhY2VzIGZpeGVzCiAgICAtIEFkZCBTUERYIGxpY2VuY2UgaWRlbnRp ZmllcnMKCnY0LiAtIEZpeCBtaXNzaW5nIHVubG9jayBhc3Rfdmh1Yl91ZGNfd2FrZXVwKCkgZXJy b3IgcGF0aAogICAgLSBNYWtlICJpcnEiIHNpZ25lZCB0byBkZWFsIHdpdGggZXJyb3IgZnJvbSBw bGF0Zm9ybV9nZXRfaXJxCiAgICAtIEZpeCBNYWtlZmlsZSBmb3IgbW9kdWxlIGJ1aWxkcwogICAg LSBGaXggYSBtaXNzaW5nIGVuZGlhbiBjb252ZXJzaW9uCgp2My4gLSBSZWJhc2VkCiAgICAtIEFk ZCBjbGsgc3R1ZmYKCnYyLiAtIENvc21ldGljIGZpeGVzCiAgICAtIFByb3Blcmx5ICJhbGxvY2F0 ZSIgZGV2aWNlIGFkZHJlc3NlcyBpbnN0ZWFkIG9mIHVzaW5nIGEgbmV2ZXIKICAgICAgcmVzZXQg Y291bnRlcgogICAgLSBNb3ZlIC5kdHNpIHVwZGF0ZXMgdG8gYSBkaWZmZXJlbnQgcGF0Y2gKLS0t CiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcgICAgICAgICAgICAgIHwgICAyICsKIGRy aXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnICB8ICAgNyArCiBkcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlIHwgICA0ICsKIGRyaXZlcnMvdXNiL2dh ZGdldC91ZGMvYXNwZWVkLXZodWIvY29yZS5jICAgfCA0MjIgKysrKysrKysrKysrKysKIGRyaXZl cnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMgICAgfCA1ODAgKysrKysrKysrKysr KysrKysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYyAgICB8IDQ3 OCArKysrKysrKysrKysrKysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vw bi5jICAgIHwgODQzICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dh ZGdldC91ZGMvYXNwZWVkLXZodWIvaHViLmMgICAgfCA4MTkgKysrKysrKysrKysrKysrKysrKysr KysrKysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaCAgIHwgNTE0 ICsrKysrKysrKysrKysrKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCAzNjcwIGluc2VydGlvbnMoKykK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tj b25maWcKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12 aHViL01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9h c3BlZWQtdmh1Yi9jb3JlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQv dWRjL2FzcGVlZC12aHViL2Rldi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNi L2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXBuLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmgKCmRpZmYgLS1naXQgYS9kcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25m aWcKaW5kZXggMDg3NWQzODQ3NmVlLi5iODM4Y2FlYWFhYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMv dXNiL2dhZGdldC91ZGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25m aWcKQEAgLTQzOCw2ICs0MzgsOCBAQCBjb25maWcgVVNCX0dBREdFVF9YSUxJTlgKIAkgIGR5bmFt aWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJ1ZGMteGlsaW54IiBhbmQgZm9yY2UgYWxsCiAJ ICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAorc291cmNl ICJkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWciCisKICMKICMgTEFT VCAtLSBkdW1teS9lbXVsYXRlZCBjb250cm9sbGVyCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQpp bmRleCBjZTg2NWIxMjlmZDYuLjg5N2Y2NDhmM2NmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxl CkBAIC0zOSw0ICszOSw1IEBAIG9iai0kKENPTkZJR19VU0JfTVZfVTNEKQkrPSBtdl91M2RfY29y ZS5vCiBvYmotJChDT05GSUdfVVNCX0dSX1VEQykJKz0gZ3JfdWRjLm8KIG9iai0kKENPTkZJR19V U0JfR0FER0VUX1hJTElOWCkJKz0gdWRjLXhpbGlueC5vCiBvYmotJChDT05GSUdfVVNCX1NOUF9V RENfUExBVCkgKz0gc25wc191ZGNfcGxhdC5vCitvYmotJChDT05GSUdfVVNCX0FTUEVFRF9WSFVC KQkrPSBhc3BlZWQtdmh1Yi8KIG9iai0kKENPTkZJR19VU0JfQkRDX1VEQykJKz0gYmRjLwpkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIGIvZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAw NjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZjBjZGY4OWI4NTAzCi0tLSAvZGV2L251bGwKKysrIGIv ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCkBAIC0wLDAgKzEsNyBA QAorIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKK2NvbmZpZyBVU0JfQVNQRUVE X1ZIVUIKKwl0cmlzdGF0ZSAiQXNwZWVkIHZIdWIgVURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFS Q0hfQVNQRUVEIHx8IENPTVBJTEVfVEVTVAorCWhlbHAKKwkgIFVTQiBwZXJpcGhlcmFsIGNvbnRy b2xsZXIgZm9yIHRoZSBBc3BlZWQgQVNUMjUwMCBmYW1pbHkKKwkgIFNvQ3Mgc3VwcG9ydGluZyB0 aGUgInZIdWIiIGZ1bmN0aW9uYWxpdHkgYW5kIFVTQjIuMApkaWZmIC0tZ2l0IGEvZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC91 ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi45ZjNhZGQ2MDVmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorIyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMCsKK29iai0kKENPTkZJR19VU0JfQVNQRUVEX1ZIVUIpCSs9 IGFzcGVlZC12aHViLm8KK2FzcGVlZC12aHViLXkJOj0gY29yZS5vIGVwMC5vIGVwbi5vIGRldi5v IGh1Yi5vCisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIv Y29yZS5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMKbmV3IGZp bGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi41YTA4MzcyYzIzMWUKLS0tIC9kZXYv bnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwpAQCAt MCwwICsxLDQyMiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgor ICogYXNwZWVkLXZodWIgLS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0 CisgKgorICogY29yZS5jIC0gVG9wIGxldmVsIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAx NyBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsg eW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAq IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExp Y2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisK KyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNp bmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5o PgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNp bmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRl IDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVk ZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxs aW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51 eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgv ZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgInZodWIuaCIKKwordm9pZCBhc3Rfdmh1Yl9kb25l KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSwKKwkJICAg aW50IHN0YXR1cykKK3sKKwlib29sIGludGVybmFsID0gcmVxLT5pbnRlcm5hbDsKKworCUVQVkRC RyhlcCwgImNvbXBsZXRpbmcgcmVxdWVzdCBAJXAsIHN0YXR1cyAlZFxuIiwgcmVxLCBzdGF0dXMp OworCisJbGlzdF9kZWxfaW5pdCgmcmVxLT5xdWV1ZSk7CisKKwlpZiAocmVxLT5yZXEuc3RhdHVz ID09IC1FSU5QUk9HUkVTUykKKwkJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCisJaWYgKHJl cS0+cmVxLmRtYSkgeworCQlpZiAoIVdBUk5fT04oIWVwLT5kZXYpKQorCQkJdXNiX2dhZGdldF91 bm1hcF9yZXF1ZXN0KCZlcC0+ZGV2LT5nYWRnZXQsCisJCQkJCQkgJnJlcS0+cmVxLCBlcC0+ZXBu LmlzX2luKTsKKwkJcmVxLT5yZXEuZG1hID0gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXNu J3QgYW4gaW50ZXJuYWwgRVAwIHJlcXVlc3QsIGNhbGwgdGhlIGNvcmUKKwkgKiB0byBjYWxsIHRo ZSBnYWRnZXQgY29tcGxldGlvbi4KKwkgKi8KKwlpZiAoIWludGVybmFsKSB7CisJCXNwaW5fdW5s b2NrKCZlcC0+dmh1Yi0+bG9jayk7CisJCXVzYl9nYWRnZXRfZ2l2ZWJhY2tfcmVxdWVzdCgmZXAt PmVwLCAmcmVxLT5yZXEpOworCQlzcGluX2xvY2soJmVwLT52aHViLT5sb2NrKTsKKwl9Cit9CisK K3ZvaWQgYXN0X3ZodWJfbnVrZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBpbnQgc3RhdHVzKQor eworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKworCUVQREJHKGVwLCAiTnVraW5nXG4iKTsK KworCS8qIEJld2FyZSwgbG9jayB3aWxsIGJlIGRyb3BwZWQgJiByZXEtYWNxdWlyZWQgYnkgZG9u ZSgpICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCXJlcSA9IGxpc3Rf Zmlyc3RfZW50cnkoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCQlh c3Rfdmh1Yl9kb25lKGVwLCByZXEsIHN0YXR1cyk7CisJfQorfQorCitzdHJ1Y3QgdXNiX3JlcXVl c3QgKmFzdF92aHViX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwKKwkJCQkJICAg Z2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKworCXJlcSA9 IGt6YWxsb2Moc2l6ZW9mKCpyZXEpLCBnZnBfZmxhZ3MpOworCWlmICghcmVxKQorCQlyZXR1cm4g TlVMTDsKKwlyZXR1cm4gJnJlcS0+cmVxOworfQorCit2b2lkIGFzdF92aHViX2ZyZWVfcmVxdWVz dChzdHJ1Y3QgdXNiX2VwICp1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxKQoreworCXN0 cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2FzdF9yZXEodV9yZXEpOworCisJa2ZyZWUocmVx KTsKK30KKworc3RhdGljIGlycXJldHVybl90IGFzdF92aHViX2lycShpbnQgaXJxLCB2b2lkICpk YXRhKQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGRhdGE7CisJaXJxcmV0dXJuX3QgaXJl dCA9IElSUV9OT05FOworCXUzMiBpc3RhdDsKKworCS8qIFN0YWxlIGludGVycnVwdCB3aGlsZSB0 ZWFyaW5nIGRvd24gKi8KKwlpZiAoIXZodWItPmVwMF9idWZzKQorCQlyZXR1cm4gSVJRX05PTkU7 CisKKwlzcGluX2xvY2soJnZodWItPmxvY2spOworCisJLyogUmVhZCBhbmQgQUNLIGludGVycnVw dHMgKi8KKwlpc3RhdCA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCWlmICgh aXN0YXQpCisJCWdvdG8gYmFpbDsKKwl3cml0ZWwoaXN0YXQsIHZodWItPnJlZ3MgKyBBU1RfVkhV Ql9JU1IpOworCWlyZXQgPSBJUlFfSEFORExFRDsKKworCVVEQ1ZEQkcodmh1YiwgImlycSBzdGF0 dXM9JTA4eCwgZXBfYWNrcz0lMDh4IGVwX25hY2tzPSUwOHhcbiIsCisJICAgICAgIGlzdGF0LAor CSAgICAgICByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUiksCisJICAgICAg IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9OQUNLX0lTUikpOworCisJLyogSGFuZGxl IGdlbmVyaWMgRVBzIGZpcnN0ICovCisJaWYgKGlzdGF0ICYgVkhVQl9JUlFfRVBfUE9PTF9BQ0tf U1RBTEwpIHsKKwkJdTMyIGksIGVwX2Fja3MgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJf RVBfQUNLX0lTUik7CisJCXdyaXRlbChlcF9hY2tzLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBf QUNLX0lTUik7CisKKwkJZm9yIChpID0gMDsgZXBfYWNrcyAmJiBpIDwgQVNUX1ZIVUJfTlVNX0dF Tl9FUHM7IGkrKykgeworCQkJdTMyIG1hc2sgPSBWSFVCX0VQX0lSUShpKTsKKwkJCWlmIChlcF9h Y2tzICYgbWFzaykgeworCQkJCWFzdF92aHViX2Vwbl9hY2tfaXJxKCZ2aHViLT5lcG5zW2ldKTsK KwkJCQllcF9hY2tzICY9IH5tYXNrOworCQkJfQorCQl9CisJfQorCisJLyogSGFuZGxlIGRldmlj ZSBpbnRlcnJ1cHRzICovCisJaWYgKGlzdGF0ICYgKFZIVUJfSVJRX0RFVklDRTEgfAorCQkgICAg IFZIVUJfSVJRX0RFVklDRTIgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTMgfAorCQkgICAgIFZI VUJfSVJRX0RFVklDRTQgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTUpKSB7CisJCWlmIChpc3Rh dCAmIFZIVUJfSVJRX0RFVklDRTEpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1sw XS5kZXYpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UyKQorCQkJYXN0X3ZodWJfZGV2 X2lycSgmdmh1Yi0+cG9ydHNbMV0uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNF MykKKwkJCWFzdF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzJdLmRldik7CisJCWlmIChpc3Rh dCAmIFZIVUJfSVJRX0RFVklDRTQpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1sz XS5kZXYpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0U1KQorCQkJYXN0X3ZodWJfZGV2 X2lycSgmdmh1Yi0+cG9ydHNbNF0uZGV2KTsKKwl9CisKKwkvKiBIYW5kbGUgdG9wLWxldmVsIHZI dWIgRVAwIGludGVycnVwdHMgKi8KKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfSFVCX0VQMF9PVVRf QUNLX1NUQUxMIHwKKwkJICAgICBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCB8CisJCSAg ICAgVkhVQl9JUlFfSFVCX0VQMF9TRVRVUCkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfSFVC X0VQMF9JTl9BQ0tfU1RBTEwpCisJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAw LCB0cnVlKTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMKQor CQkJYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soJnZodWItPmVwMCwgZmFsc2UpOworCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQKQorCQkJYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1 cCgmdmh1Yi0+ZXAwKTsKKwl9CisKKwkvKiBWYXJpb3VzIHRvcCBsZXZlbCBidXMgZXZlbnRzICov CisJaWYgKGlzdGF0ICYgKFZIVUJfSVJRX0JVU19SRVNVTUUgfAorCQkgICAgIFZIVUJfSVJRX0JV U19TVVNQRU5EIHwKKwkJICAgICBWSFVCX0lSUV9CVVNfUkVTRVQpKSB7CisJCWlmIChpc3RhdCAm IFZIVUJfSVJRX0JVU19SRVNVTUUpCisJCQlhc3Rfdmh1Yl9odWJfcmVzdW1lKHZodWIpOworCQlp ZiAoaXN0YXQgJiBWSFVCX0lSUV9CVVNfU1VTUEVORCkKKwkJCWFzdF92aHViX2h1Yl9zdXNwZW5k KHZodWIpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9CVVNfUkVTRVQpCisJCQlhc3Rfdmh1Yl9o dWJfcmVzZXQodmh1Yik7CisJfQorCisgYmFpbDoKKwlzcGluX3VubG9jaygmdmh1Yi0+bG9jayk7 CisJcmV0dXJuIGlyZXQ7Cit9CisKK3ZvaWQgYXN0X3ZodWJfaW5pdF9odyhzdHJ1Y3QgYXN0X3Zo dWIgKnZodWIpCit7CisJdTMyIGN0cmw7CisKKwlVRENEQkcodmh1YiwiKFJlKVN0YXJ0aW5nIEhX IC4uLlxuIik7CisKKwkvKiBFbmFibGUgUEhZICovCisJY3RybCA9IFZIVUJfQ1RSTF9QSFlfQ0xL IHwKKwkJVkhVQl9DVFJMX1BIWV9SRVNFVF9ESVM7CisKKyAgICAgICAvKgorCSogV2UgZG8gKk5P VCogc2V0IHRoZSBWSFVCX0NUUkxfQ0xLX1NUT1BfU1VTUEVORCBiaXQKKwkqIHRvIHN0b3AgdGhl IGxvZ2ljIGNsb2NrIGR1cmluZyBzdXNwZW5kIGJlY2F1c2UKKwkqIGl0IGNhdXNlcyB0aGUgcmVn aXN0ZXJzIHRvIGJlY29tZSBpbmFjY2Vzc2libGUgYW5kCisJKiB3ZSBoYXZlbid0IHlldCBmaWd1 cmVkIG91dCBhIGdvb2Qgd2F5dCB0byBicmluZyB0aGUKKwkqIGNvbnRyb2xsZXIgYmFjayBpbnRv IGxpZmUgdG8gaXNzdWUgYSB3YWtldXAuCisJKi8KKworCS8qCisJICogU2V0IHNvbWUgSVNPICYg c3BsaXQgY29udHJvbCBiaXRzIGFjY29yZGluZyB0byBBc3BlZWQKKwkgKiByZWNvbW1lbmRhdGlv bgorCSAqCisJICogVkhVQl9DVFJMX0lTT19SU1BfQ1RSTDogV2hlbiBzZXQgdGVsbHMgdGhlIEhX IHRvIHJlc3BvbmQKKwkgKiB3aXRoIDAgYnl0ZXMgZGF0YSBwYWNrZXQgdG8gSVNPIElOIGVuZHBv aW50cyB3aGVuIG5vIGRhdGEKKwkgKiBpcyBhdmFpbGFibGUuCisJICoKKwkgKiBWSFVCX0NUUkxf U1BMSVRfSU46IFRoaXMgbWFrZXMgYSBTT0YgY29tcGxldGUgYSBzcGxpdCBJTgorCSAqIHRyYW5z YWN0aW9uLgorCSAqLworCWN0cmwgfD0gVkhVQl9DVFJMX0lTT19SU1BfQ1RSTCB8IFZIVUJfQ1RS TF9TUExJVF9JTjsKKwl3cml0ZWwoY3RybCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOwor CXVkZWxheSgxKTsKKworCS8qIFNldCBkZXNjcmlwdG9yIHJpbmcgc2l6ZSAqLworCWlmIChBU1Rf VkhVQl9ERVNDU19DT1VOVCA9PSAyNTYpIHsKKwkJY3RybCB8PSBWSFVCX0NUUkxfTE9OR19ERVND OworCQl3cml0ZWwoY3RybCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCX0gZWxzZSB7 CisJCUJVSUxEX0JVR19PTihBU1RfVkhVQl9ERVNDU19DT1VOVCAhPSAzMik7CisJfQorCisJLyog UmVzZXQgYWxsIGRldmljZXMgKi8KKwl3cml0ZWwoVkhVQl9TV19SRVNFVF9BTEwsIHZodWItPnJl Z3MgKyBBU1RfVkhVQl9TV19SRVNFVCk7CisJdWRlbGF5KDEpOworCXdyaXRlbCgwLCB2aHViLT5y ZWdzICsgQVNUX1ZIVUJfU1dfUkVTRVQpOworCisJLyogRGlzYWJsZSBhbmQgY2xlYW51cCBFUCBB Q0svTkFDSyBpbnRlcnJ1cHRzICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9F UF9BQ0tfSUVSKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05BQ0tfSUVS KTsKKwl3cml0ZWwoVkhVQl9FUF9JUlFfQUxMLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNL X0lTUik7CisJd3JpdGVsKFZIVUJfRVBfSVJRX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQ X05BQ0tfSVNSKTsKKworCS8qIERlZmF1bHQgc2V0dGluZ3MgZm9yIEVQMCwgZW5hYmxlIEhXIGh1 YiBFUDEgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMKTsKKwl3 cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUgfAorCSAgICAgICBWSFVCX0VQMV9DVFJM X0VOQUJMRSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKwl3cml0 ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKKworCS8qIENvbmZpZ3Vy ZSBFUDAgRE1BIGJ1ZmZlciAqLworCXdyaXRlbCh2aHViLT5lcDAuYnVmX2RtYSwgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0VQMF9EQVRBKTsKKworCS8qIENsZWFyIGFkZHJlc3MgKi8KKwl3cml0ZWwo MCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NPTkYpOworCisJLyogUHVsbHVwIGh1YiAoYWN0aXZh dGUgb24gaG9zdCkgKi8KKwlpZiAodmh1Yi0+Zm9yY2VfdXNiMSkKKwkJY3RybCB8PSBWSFVCX0NU UkxfRlVMTF9TUEVFRF9PTkxZOworCisJY3RybCB8PSBWSFVCX0NUUkxfVVBTVFJFQU1fQ09OTkVD VDsKKwl3cml0ZWwoY3RybCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCisJLyogRW5h YmxlIHNvbWUgaW50ZXJydXB0cyAqLworCXdyaXRlbChWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19T VEFMTCB8CisJICAgICAgIFZIVUJfSVJRX0hVQl9FUDBfT1VUX0FDS19TVEFMTCB8CisJICAgICAg IFZIVUJfSVJRX0hVQl9FUDBfU0VUVVAgfAorCSAgICAgICBWSFVCX0lSUV9FUF9QT09MX0FDS19T VEFMTCB8CisJICAgICAgIFZIVUJfSVJRX0JVU19SRVNVTUUgfAorCSAgICAgICBWSFVCX0lSUV9C VVNfU1VTUEVORCB8CisJICAgICAgIFZIVUJfSVJRX0JVU19SRVNFVCwKKwkgICAgICAgdmh1Yi0+ cmVncyArIEFTVF9WSFVCX0lFUik7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfcmVtb3ZlKHN0 cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0g cGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQg aTsKKworCWlmICghdmh1YiB8fCAhdmh1Yi0+cmVncykKKwkJcmV0dXJuIDA7CisKKwkvKiBSZW1v dmUgZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykK KwkJYXN0X3ZodWJfZGVsX2Rldigmdmh1Yi0+cG9ydHNbaV0uZGV2KTsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwkvKiBNYXNrICYgYWNrIGFsbCBpbnRlcnJ1 cHRzICAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwl3cml0ZWwo VkhVQl9JUlFfQUNLX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisKKwkvKiBQdWxs IGRldmljZSwgbGVhdmUgUEhZIGVuYWJsZWQgKi8KKwl3cml0ZWwoVkhVQl9DVFJMX1BIWV9DTEsg fAorCSAgICAgICBWSFVCX0NUUkxfUEhZX1JFU0VUX0RJUywKKwkgICAgICAgdmh1Yi0+cmVncyAr IEFTVF9WSFVCX0NUUkwpOworCisJaWYgKHZodWItPmNsaykKKwkJY2xrX2Rpc2FibGVfdW5wcmVw YXJlKHZodWItPmNsayk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBm bGFncyk7CisKKwlpZiAodmh1Yi0+ZXAwX2J1ZnMpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2 LT5kZXYsCisJCQkJICBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqCisJCQkJICAoQVNUX1ZIVUJf TlVNX1BPUlRTICsgMSksCisJCQkJICB2aHViLT5lcDBfYnVmcywKKwkJCQkgIHZodWItPmVwMF9i dWZzX2RtYSk7CisJdmh1Yi0+ZXAwX2J1ZnMgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyBpbnQgYXN0X3ZodWJfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sK KwllbnVtIHVzYl9kZXZpY2Vfc3BlZWQgbWF4X3NwZWVkOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1 YjsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKKwlpbnQgaSwgcmMgPSAwOworCisJdmh1YiA9IGRl dm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKnZodWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAo IXZodWIpCisJCXJldHVybiAtRU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnZodWItPmxvY2sp OworCXZodWItPnBkZXYgPSBwZGV2OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBk ZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl2aHViLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291 cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUih2aHViLT5yZWdzKSkgeworCQlkZXZf ZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7CisJCXJldHVybiBQ VFJfRVJSKHZodWItPnJlZ3MpOworCX0KKwlVRENEQkcodmh1YiwgInZIdWJAJXBSIG1hcHBlZCBA JXBcbiIsIHJlcywgdmh1Yi0+cmVncyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB2 aHViKTsKKworCXZodWItPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKwlp ZiAoSVNfRVJSKHZodWItPmNsaykpIHsKKwkJcmMgPSBQVFJfRVJSKHZodWItPmNsayk7CisJCWdv dG8gZXJyOworCX0KKwlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZSh2aHViLT5jbGspOworCWlmIChy YykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBjb3VsZG4ndCBlbmFibGUgY2xvY2sg KCVkKVxuIiwgcmMpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBDaGVjayBpZiB3ZSBuZWVkIHRv IGxpbWl0IHRoZSBIVyB0byBVU0IxICovCisJbWF4X3NwZWVkID0gdXNiX2dldF9tYXhpbXVtX3Nw ZWVkKCZwZGV2LT5kZXYpOworCWlmIChtYXhfc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04gJiYg bWF4X3NwZWVkIDwgVVNCX1NQRUVEX0hJR0gpCisJCXZodWItPmZvcmNlX3VzYjEgPSB0cnVlOwor CisJLyogTWFzayAmIGFjayBhbGwgaW50ZXJydXB0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgaGFu ZGxlciAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwl3cml0ZWwo VkhVQl9JUlFfQUNLX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisKKwkvKiBGaW5k IGludGVycnVwdCBhbmQgaW5zdGFsbCBoYW5kbGVyICovCisJdmh1Yi0+aXJxID0gcGxhdGZvcm1f Z2V0X2lycShwZGV2LCAwKTsKKwlpZiAodmh1Yi0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2 LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGludGVycnVwdFxuIik7CisJCXJjID0gdmh1Yi0+aXJxOwor CQlnb3RvIGVycjsKKwl9CisJcmMgPSBkZXZtX3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHZodWIt PmlycSwgYXN0X3ZodWJfaXJxLCAwLAorCQkJICAgICAgS0JVSUxEX01PRE5BTUUsIHZodWIpOwor CWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpbnRl cnJ1cHRcbiIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKgorCSAqIEFsbG9jYXRlIERNQSBidWZm ZXJzIGZvciBhbGwgRVAwcyBpbiBvbmUgY2h1bmssCisJICogb25lIHBlciBwb3J0IGFuZCBvbmUg Zm9yIHRoZSB2SHViIGl0c2VsZgorCSAqLworCXZodWItPmVwMF9idWZzID0gZG1hX2FsbG9jX2Nv aGVyZW50KCZwZGV2LT5kZXYsCisJCQkJCSAgICBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqCisJ CQkJCSAgICAoQVNUX1ZIVUJfTlVNX1BPUlRTICsgMSksCisJCQkJCSAgICAmdmh1Yi0+ZXAwX2J1 ZnNfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZodWItPmVwMF9idWZzKSB7CisJCWRldl9lcnIo JnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBFUDAgRE1BIGJ1ZmZlcnNcbiIpOworCQly YyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOworCX0KKwlVRENWREJHKHZodWIsICJFUDAgRE1BIGJ1 ZmZlcnMgQCVwIChETUEgMHglMDh4KVxuIiwKKwkJdmh1Yi0+ZXAwX2J1ZnMsICh1MzIpdmh1Yi0+ ZXAwX2J1ZnNfZG1hKTsKKworCS8qIEluaXQgdkh1YiBFUDAgKi8KKwlhc3Rfdmh1Yl9pbml0X2Vw MCh2aHViLCAmdmh1Yi0+ZXAwLCBOVUxMKTsKKworCS8qIEluaXQgZGV2aWNlcyAqLworCWZvciAo aSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFMgJiYgcmMgPT0gMDsgaSsrKQorCQlyYyA9IGFz dF92aHViX2luaXRfZGV2KHZodWIsIGkpOworCWlmIChyYykKKwkJZ290byBlcnI7CisKKwkvKiBJ bml0IGh1YiBlbXVsYXRpb24gKi8KKwlhc3Rfdmh1Yl9pbml0X2h1Yih2aHViKTsKKworCS8qIElu aXRpYWxpemUgSFcgKi8KKwlhc3Rfdmh1Yl9pbml0X2h3KHZodWIpOworCisJcmV0dXJuIDA7Cisg ZXJyOgorCWFzdF92aHViX3JlbW92ZShwZGV2KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBj b25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFzdF92aHViX2R0X2lkc1tdID0geworCXsKKwkJLmNv bXBhdGlibGUgPSAiYXNwZWVkLGFzdDI0MDAtdXNiLXZodWIiLAorCX0sCisJeworCQkuY29tcGF0 aWJsZSA9ICJhc3BlZWQsYXN0MjUwMC11c2Itdmh1YiIsCisJfSwKKwl7IH0KK307CitNT0RVTEVf REVWSUNFX1RBQkxFKG9mLCBhc3Rfdmh1Yl9kdF9pZHMpOworCitzdGF0aWMgc3RydWN0IHBsYXRm b3JtX2RyaXZlciBhc3Rfdmh1Yl9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGFzdF92aHViX3Byb2Jl LAorCS5yZW1vdmUJCT0gYXN0X3ZodWJfcmVtb3ZlLAorCS5kcml2ZXIJCT0geworCQkubmFtZQk9 IEtCVUlMRF9NT0ROQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUJPSBhc3Rfdmh1Yl9kdF9pZHMsCisJ fSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFzdF92aHViX2RyaXZlcik7CisKK01PRFVM RV9ERVNDUklQVElPTigiQXNwZWVkIHZIdWIgdWRjIGRyaXZlciIpOworTU9EVUxFX0FVVEhPUigi QmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPiIpOworTU9E VUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9h c3BlZWQtdmh1Yi9kZXYuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2 LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi43NmQwMmViM2EyMzYK LS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rl di5jCkBAIC0wLDAgKzEsNTgwIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIu MCsKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIiIFVT QiBnYWRnZXQKKyAqCisgKiBkZXYuYyAtIEluZGl2aWR1YWwgZGV2aWNlL2dhZGdldCBtYW5hZ2Vt ZW50IChpZSwgYSBwb3J0ID0gYSBnYWRnZXQpCisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJNIENv cnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4g cmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJl ZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBv cgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVk ZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8 bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNs dWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8 bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgv aW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4 L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdXNi L2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bp by5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBw aW5nLmg+CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5o PgorCisjaW5jbHVkZSAidmh1Yi5oIgorCit2b2lkIGFzdF92aHViX2Rldl9pcnEoc3RydWN0IGFz dF92aHViX2RldiAqZCkKK3sKKwl1MzIgaXN0YXQgPSByZWFkbChkLT5yZWdzICsgQVNUX1ZIVUJf REVWX0lTUik7CisKKwl3cml0ZWwoaXN0YXQsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfSVNSKTsK KworCWlmIChpc3RhdCAmIFZIVVZfREVWX0lSUV9FUDBfSU5fQUNLX1NUQUxMKQorCQlhc3Rfdmh1 Yl9lcDBfaGFuZGxlX2FjaygmZC0+ZXAwLCB0cnVlKTsKKwlpZiAoaXN0YXQgJiBWSFVWX0RFVl9J UlFfRVAwX09VVF9BQ0tfU1RBTEwpCisJCWFzdF92aHViX2VwMF9oYW5kbGVfYWNrKCZkLT5lcDAs IGZhbHNlKTsKKwlpZiAoaXN0YXQgJiBWSFVWX0RFVl9JUlFfRVAwX1NFVFVQKQorCQlhc3Rfdmh1 Yl9lcDBfaGFuZGxlX3NldHVwKCZkLT5lcDApOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9k ZXZfZW5hYmxlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJdTMyIHJlZywgaG1zazsKKwor CWlmIChkLT5lbmFibGVkKQorCQlyZXR1cm47CisKKwkvKiBFbmFibGUgZGV2aWNlIGFuZCBpdHMg RVAwIGludGVycnVwdHMgKi8KKwlyZWcgPSBWSFVCX0RFVl9FTl9FTkFCTEVfUE9SVCB8CisJCVZI VUJfREVWX0VOX0VQMF9JTl9BQ0tfSVJRRU4gfAorCQlWSFVCX0RFVl9FTl9FUDBfT1VUX0FDS19J UlFFTiB8CisJCVZIVUJfREVWX0VOX0VQMF9TRVRVUF9JUlFFTjsKKwlpZiAoZC0+Z2FkZ2V0LnNw ZWVkID09IFVTQl9TUEVFRF9ISUdIKQorCQlyZWcgfD0gVkhVQl9ERVZfRU5fU1BFRURfU0VMX0hJ R0g7CisJd3JpdGVsKHJlZywgZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJMKTsKKworCS8q IEVuYWJsZSBkZXZpY2UgaW50ZXJydXB0IGluIHRoZSBodWIgYXMgd2VsbCAqLworCWhtc2sgPSBW SFVCX0lSUV9ERVZJQ0UxIDw8IGQtPmluZGV4OworCXJlZyA9IHJlYWRsKGQtPnZodWItPnJlZ3Mg KyBBU1RfVkhVQl9JRVIpOworCXJlZyB8PSBobXNrOworCXdyaXRlbChyZWcsIGQtPnZodWItPnJl Z3MgKyBBU1RfVkhVQl9JRVIpOworCisJLyogU2V0IEVQMCBETUEgYnVmZmVyIGFkZHJlc3MgKi8K Kwl3cml0ZWwoZC0+ZXAwLmJ1Zl9kbWEsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRVAwX0RBVEEp OworCisJZC0+ZW5hYmxlZCA9IHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Rldl9k aXNhYmxlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJdTMyIHJlZywgaG1zazsKKworCWlm ICghZC0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJLyogRGlzYWJsZSBkZXZpY2UgaW50ZXJydXB0 IGluIHRoZSBodWIgKi8KKwlobXNrID0gVkhVQl9JUlFfREVWSUNFMSA8PCBkLT5pbmRleDsKKwly ZWcgPSByZWFkbChkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwlyZWcgJj0gfmhtc2s7 CisJd3JpdGVsKHJlZywgZC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisKKwkvKiBUaGVu IGRpc2FibGUgZGV2aWNlICovCisJd3JpdGVsKDAsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRU5f Q1RSTCk7CisJZC0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJZC0+ZW5hYmxl ZCA9IGZhbHNlOworCWQtPnN1c3BlbmRlZCA9IGZhbHNlOworfQorCitzdGF0aWMgaW50IGFzdF92 aHViX2Rldl9mZWF0dXJlKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsCisJCQkJdTE2IHdJbmRleCwg dTE2IHdWYWx1ZSwKKwkJCQlib29sIGlzX3NldCkKK3sKKwlEREJHKGQsICIlc19GRUFUVVJFKGRl diB2YWw9JTAyeClcbiIsCisJICAgICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIHdWYWx1ZSk7 CisKKwlpZiAod1ZhbHVlICE9IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkKKwkJcmV0dXJuIHN0 ZF9yZXFfZHJpdmVyOworCisJZC0+d2FrZXVwX2VuID0gaXNfc2V0OworCisJcmV0dXJuIHN0ZF9y ZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBfZmVhdHVyZShzdHJ1Y3Qg YXN0X3ZodWJfZGV2ICpkLAorCQkJICAgICAgIHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUsIGJvb2wg aXNfc2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7CisJaW50IGVwX251bTsKKworCWVw X251bSA9IHdJbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwlEREJHKGQsICIlc19G RUFUVVJFKGVwJWQgdmFsPSUwMngpXG4iLAorCSAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xFQVIi LCBlcF9udW0sIHdWYWx1ZSk7CisJaWYgKGVwX251bSA9PSAwKQorCQlyZXR1cm4gc3RkX3JlcV9j b21wbGV0ZTsKKwlpZiAoZXBfbnVtID49IEFTVF9WSFVCX05VTV9HRU5fRVBzIHx8ICFkLT5lcG5z W2VwX251bSAtIDFdKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAod1ZhbHVlICE9IFVT Ql9FTkRQT0lOVF9IQUxUKQorCQlyZXR1cm4gc3RkX3JlcV9kcml2ZXI7CisKKwllcCA9IGQtPmVw bnNbZXBfbnVtIC0gMV07CisJaWYgKFdBUk5fT04oIWVwKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3Rh bGw7CisKKwlpZiAoIWVwLT5lcG4uZW5hYmxlZCB8fCAhZXAtPmVwLmRlc2MgfHwgZXAtPmVwbi5p c19pc28gfHwKKwkgICAgZXAtPmVwbi5pc19pbiAhPSAhISh3SW5kZXggJiBVU0JfRElSX0lOKSkK KwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwlEREJHKGQsICIlcyBzdGFsbCBvbiBFUCAlZFxu IiwKKwkgICAgIGlzX3NldCA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIsIGVwX251bSk7CisJZXAt PmVwbi5zdGFsbGVkID0gaXNfc2V0OworCWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXApOwor CisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZGV2 X3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJICAgICAgIHUxNiB3SW5kZXgsIHUx NiB3VmFsdWUpCit7CisJdTggc3QwOworCisJRERCRyhkLCAiR0VUX1NUQVRVUyhkZXYpXG4iKTsK KworCXN0MCA9IGQtPmdhZGdldC5pc19zZWxmcG93ZXJlZCA8PCBVU0JfREVWSUNFX1NFTEZfUE9X RVJFRDsKKwlpZiAoZC0+d2FrZXVwX2VuKQorCQlzdDAgfD0gMSA8PCBVU0JfREVWSUNFX1JFTU9U RV9XQUtFVVA7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KCZkLT5lcDAsIHN0MCwg MCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBfc3RhdHVzKHN0cnVjdCBhc3Rfdmh1Yl9k ZXYgKmQsCisJCQkgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlKQoreworCWludCBlcF9udW0g PSB3SW5kZXggJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJc3RydWN0IGFzdF92aHViX2Vw ICplcDsKKwl1OCBzdDAgPSAwOworCisJRERCRyhkLCAiR0VUX1NUQVRVUyhlcCVkKVxuIiwgZXBf bnVtKTsKKworCWlmIChlcF9udW0gPj0gQVNUX1ZIVUJfTlVNX0dFTl9FUHMpCisJCXJldHVybiBz dGRfcmVxX3N0YWxsOworCWlmIChlcF9udW0gIT0gMCkgeworCQllcCA9IGQtPmVwbnNbZXBfbnVt IC0gMV07CisJCWlmICghZXApCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJaWYgKCFlcC0+ ZXBuLmVuYWJsZWQgfHwgIWVwLT5lcC5kZXNjIHx8IGVwLT5lcG4uaXNfaXNvIHx8CisJCSAgICBl cC0+ZXBuLmlzX2luICE9ICEhKHdJbmRleCAmIFVTQl9ESVJfSU4pKQorCQkJcmV0dXJuIHN0ZF9y ZXFfc3RhbGw7CisJCWlmIChlcC0+ZXBuLnN0YWxsZWQpCisJCQlzdDAgfD0gMSA8PCBVU0JfRU5E UE9JTlRfSEFMVDsKKwl9CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KCZkLT5lcDAs IHN0MCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Rldl9zZXRfYWRkcmVzcyhzdHJ1 Y3QgYXN0X3ZodWJfZGV2ICpkLCB1OCBhZGRyKQoreworCXUzMiByZWc7CisKKwlEREJHKGQsICJT RVRfQUREUkVTUzogR290IGFkZHJlc3MgJXhcbiIsIGFkZHIpOworCisJcmVnID0gcmVhZGwoZC0+ cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJMKTsKKwlyZWcgJj0gflZIVUJfREVWX0VOX0FERFJf TUFTSzsKKwlyZWcgfD0gVkhVQl9ERVZfRU5fU0VUX0FERFIoYWRkcik7CisJd3JpdGVsKHJlZywg ZC0+cmVncyArIEFTVF9WSFVCX0RFVl9FTl9DVFJMKTsKK30KKworaW50IGFzdF92aHViX3N0ZF9k ZXZfcmVxdWVzdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJICAgICBzdHJ1Y3QgdXNiX2N0 cmxyZXF1ZXN0ICpjcnEpCit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9IGVwLT5kZXY7CisJ dTE2IHdWYWx1ZSwgd0luZGV4OworCisJLyogTm8gZHJpdmVyLCB3ZSBzaG91bGRuJ3QgYmUgZW5h YmxlZCAuLi4gKi8KKwlpZiAoIWQtPmRyaXZlciB8fCAhZC0+ZW5hYmxlZCB8fCBkLT5zdXNwZW5k ZWQpIHsKKwkJRVBEQkcoZXAsCisJCSAgICAgICJEZXZpY2UgaXMgd3Jvbmcgc3RhdGUgZHJpdmVy PSVwIGVuYWJsZWQ9JWQiCisJCSAgICAgICIgc3VzcGVuZGVkPSVkXG4iLAorCQkgICAgICBkLT5k cml2ZXIsIGQtPmVuYWJsZWQsIGQtPnN1c3BlbmRlZCk7CisJCXJldHVybiBzdGRfcmVxX3N0YWxs OworCX0KKworCS8qIEZpcnN0IHBhY2tldCwgZ3JhYiBzcGVlZCAqLworCWlmIChkLT5nYWRnZXQu c3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsKKwkJZC0+Z2FkZ2V0LnNwZWVkID0gZXAtPnZo dWItPnNwZWVkOworCQlpZiAoZC0+Z2FkZ2V0LnNwZWVkID4gZC0+ZHJpdmVyLT5tYXhfc3BlZWQp CisJCQlkLT5nYWRnZXQuc3BlZWQgPSBkLT5kcml2ZXItPm1heF9zcGVlZDsKKwkJRERCRyhkLCAi ZmlzdCBwYWNrZXQsIGNhcHR1cmVkIHNwZWVkICVkXG4iLAorCQkgICAgIGQtPmdhZGdldC5zcGVl ZCk7CisJfQorCisJd1ZhbHVlID0gbGUxNl90b19jcHUoY3JxLT53VmFsdWUpOworCXdJbmRleCA9 IGxlMTZfdG9fY3B1KGNycS0+d0luZGV4KTsKKworCXN3aXRjaCAoKGNycS0+YlJlcXVlc3RUeXBl IDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgeworCQkvKiBTRVRfQUREUkVTUyAqLworCWNhc2UgRGV2 aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCWFzdF92aHViX2Rldl9zZXRf YWRkcmVzcyhkLCB3VmFsdWUpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKworCQkvKiBH RVRfU1RBVFVTICovCisJY2FzZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVTOgor CQlyZXR1cm4gYXN0X3ZodWJfZGV2X3N0YXR1cyhkLCB3SW5kZXgsIHdWYWx1ZSk7CisJY2FzZSBJ bnRlcmZhY2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfU1RBVFVTOgorCQlyZXR1cm4gYXN0X3ZodWJf c2ltcGxlX3JlcGx5KGVwLCAwLCAwKTsKKwljYXNlIEVuZHBvaW50UmVxdWVzdCB8IFVTQl9SRVFf R0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX2VwX3N0YXR1cyhkLCB3SW5kZXgsIHdWYWx1 ZSk7CisKKwkJLyogU0VUL0NMRUFSX0ZFQVRVUkUgKi8KKwljYXNlIERldmljZU91dFJlcXVlc3Qg fCBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfZGV2X2ZlYXR1cmUoZCwg d0luZGV4LCB3VmFsdWUsIHRydWUpOworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFf Q0xFQVJfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2Rldl9mZWF0dXJlKGQsIHdJbmRleCwg d1ZhbHVlLCBmYWxzZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9G RUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfZXBfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1ZSwg dHJ1ZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6 CisJCXJldHVybiBhc3Rfdmh1Yl9lcF9mZWF0dXJlKGQsIHdJbmRleCwgd1ZhbHVlLCBmYWxzZSk7 CisJfQorCXJldHVybiBzdGRfcmVxX2RyaXZlcjsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl91 ZGNfd2FrZXVwKHN0cnVjdCB1c2JfZ2FkZ2V0KiBnYWRnZXQpCit7CisJc3RydWN0IGFzdF92aHVi X2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWlu dCByYyA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywgZmxh Z3MpOworCWlmICghZC0+d2FrZXVwX2VuKQorCQlnb3RvIGVycjsKKworCUREQkcoZCwgIkRldmlj ZSBpbml0aWF0ZWQgd2FrZXVwXG4iKTsKKworCS8qIFdha2V1cCB0aGUgaG9zdCAqLworCWFzdF92 aHViX2h1Yl93YWtlX2FsbChkLT52aHViKTsKKwlyYyA9IDA7CisgZXJyOgorCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0 YXRpYyBpbnQgYXN0X3ZodWJfdWRjX2dldF9mcmFtZShzdHJ1Y3QgdXNiX2dhZGdldCogZ2FkZ2V0 KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisKKwly ZXR1cm4gKHJlYWRsKGQtPnZodWItPnJlZ3MgKyBBU1RfVkhVQl9VU0JTVFMpID4+IDE2KSAmIDB4 N2ZmOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfbnVrZShzdHJ1Y3QgYXN0X3ZodWJf ZGV2ICpkKQoreworCXVuc2lnbmVkIGludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVC X05VTV9HRU5fRVBzOyBpKyspIHsKKwkJaWYgKCFkLT5lcG5zW2ldKQorCQkJY29udGludWU7CisJ CWFzdF92aHViX251a2UoZC0+ZXBuc1tpXSwgLUVTSFVURE9XTik7CisJfQorfQorCitzdGF0aWMg aW50IGFzdF92aHViX3VkY19wdWxsdXAoc3RydWN0IHVzYl9nYWRnZXQqIGdhZGdldCwgaW50IG9u KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBm bGFncyk7CisKKwlEREJHKGQsICJwdWxsdXAoJWQpXG4iLCBvbik7CisKKwkvKiBNYXJrIGRpc2Nv bm5lY3RlZCBpbiB0aGUgaHViICovCisJYXN0X3ZodWJfZGV2aWNlX2Nvbm5lY3QoZC0+dmh1Yiwg ZC0+aW5kZXgsIG9uKTsKKworCS8qCisJICogSWYgZW5hYmxlZCwgbnVrZSBhbGwgcmVxdWVzdHMg aWYgYW55ICh0aGVyZSBzaG91bGRuJ3QgYmUpCisJICogYW5kIGRpc2FibGUgdGhlIHBvcnQuIFRo aXMgd2lsbCBjbGVhciB0aGUgYWRkcmVzcyB0b28uCisJICovCisJaWYgKGQtPmVuYWJsZWQpIHsK KwkJYXN0X3ZodWJfZGV2X251a2UoZCk7CisJCWFzdF92aHViX2Rldl9kaXNhYmxlKGQpOworCX0K KworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJl dHVybiAwOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3VkY19zdGFydChzdHJ1Y3QgdXNiX2dh ZGdldCAqZ2FkZ2V0LAorCQkJICAgICAgc3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIp Cit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNp Z25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZs YWdzKTsKKworCUREQkcoZCwgInN0YXJ0XG4iKTsKKworCS8qIFdlIGRvbid0IGRvIG11Y2ggbW9y ZSB1bnRpbCB0aGUgaHViIGVuYWJsZXMgdXMgKi8KKwlkLT5kcml2ZXIgPSBkcml2ZXI7CisJZC0+ Z2FkZ2V0LmlzX3NlbGZwb3dlcmVkID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQt PnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVz Yl9lcCAqYXN0X3ZodWJfdWRjX21hdGNoX2VwKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCisJ CQkJCSAgICBzdHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCSAgICBz dHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVzY3JpcHRvciAqc3MpCit7CisJc3RydWN0IGFzdF92aHVi X2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwOwor CXN0cnVjdCB1c2JfZXAgKnVfZXA7CisJdW5zaWduZWQgaW50IG1heCwgYWRkciwgaTsKKworCURE QkcoZCwgIk1hdGNoIEVQIHR5cGUgJWRcbiIsIHVzYl9lbmRwb2ludF90eXBlKGRlc2MpKTsKKwor CS8qCisJICogRmlyc3Qgd2UgbmVlZCB0byBsb29rIGZvciBhbiBleGlzdGluZyB1bmNsYWltZWQg RVAgYXMgYW5vdGhlcgorCSAqIGNvbmZpZ3VyYXRpb24gbWF5IGhhdmUgYWxyZWFkeSBhc3NvY2lh dGVkIGEgYnVuY2ggb2YgRVBzIHdpdGgKKwkgKiB0aGlzIGdhZGdldC4gVGhpcyBkdXBsaWNhdGVz IHRoZSBjb2RlIGluIHVzYl9lcF9hdXRvY29uZmlnX3NzKCkKKwkgKiB1bmZvcnR1bmF0ZWx5Lgor CSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkodV9lcCwgJmdhZGdldC0+ZXBfbGlzdCwgZXBfbGlz dCkgeworCQlpZiAodXNiX2dhZGdldF9lcF9tYXRjaF9kZXNjKGdhZGdldCwgdV9lcCwgZGVzYywg c3MpKSB7CisJCQlEREJHKGQsICIgLT4gdXNpbmcgZXhpc3RpbmcgRVAlZFxuIiwKKwkJCSAgICAg dG9fYXN0X2VwKHVfZXApLT5kX2lkeCk7CisJCQlyZXR1cm4gdV9lcDsKKwkJfQorCX0KKworCS8q CisJICogV2UgZGlkbid0IGZpbmQgb25lLCB3ZSBuZWVkIHRvIGdyYWIgb25lIGZyb20gdGhlIHBv b2wuCisJICoKKwkgKiBGaXJzdCBsZXQncyBkbyBzb21lIHNhbml0eSBjaGVja2luZworCSAqLwor CXN3aXRjaCh1c2JfZW5kcG9pbnRfdHlwZShkZXNjKSkgeworCWNhc2UgVVNCX0VORFBPSU5UX1hG RVJfQ09OVFJPTDoKKwkJLyogT25seSBFUDAgY2FuIGJlIGEgY29udHJvbCBlbmRwb2ludCAqLwor CQlyZXR1cm4gTlVMTDsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCS8qIElTTzoJ IGxpbWl0IDEwMjMgYnl0ZXMgZnVsbCBzcGVlZCwgMTAyNCBoaWdoL3N1cGVyIHNwZWVkICovCisJ CWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpCisJCQltYXggPSAxMDI0OworCQllbHNl CisJCQltYXggPSAxMDIzOworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6 CisJCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpCisJCQltYXggPSA1MTI7CisJCWVs c2UKKwkJCW1heCA9IDY0OworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoK KwkJaWYgKGdhZGdldF9pc19kdWFsc3BlZWQoZ2FkZ2V0KSkKKwkJCW1heCA9IDEwMjQ7CisJCWVs c2UKKwkJCW1heCA9IDY0OworCQlicmVhazsKKwl9CisJaWYgKHVzYl9lbmRwb2ludF9tYXhwKGRl c2MpID4gbWF4KQorCQlyZXR1cm4gTlVMTDsKKworCS8qCisJICogRmluZCBhIGZyZWUgRVAgYWRk cmVzcyBmb3IgdGhhdCBkZXZpY2UuIFdlIGNhbid0CisJICogbGV0IHRoZSBnZW5lcmljIGNvZGUg YXNzaWduIHRoZXNlIGFzIGl0IHdvdWxkCisJICogY3JlYXRlIG92ZXJsYXBwaW5nIG51bWJlcnMg Zm9yIElOIGFuZCBPVVQgd2hpY2gKKwkgKiB3ZSBkb24ndCBzdXBwb3J0LCBzbyBhbHNvIGNyZWF0 ZSBhIHN1aXRhYmxlIG5hbWUKKwkgKiB0aGF0IHdpbGwgYWxsb3cgdGhlIGdlbmVyaWMgY29kZSB0 byB1c2Ugb3VyCisJICogYXNzaWduZWQgYWRkcmVzcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwg QVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykKKwkJaWYgKGQtPmVwbnNbaV0gPT0gTlVMTCkKKwkJ CWJyZWFrOworCWlmIChpID49IEFTVF9WSFVCX05VTV9HRU5fRVBzKQorCQlyZXR1cm4gTlVMTDsK KwlhZGRyID0gaSArIDE7CisKKwkvKgorCSAqIE5vdyBncmFiIGFuIEVQIGZyb20gdGhlIHNoYXJl ZCBwb29sIGFuZCBhc3NvY2lhdGUKKwkgKiBpdCB3aXRoIG91ciBkZXZpY2UKKwkgKi8KKwllcCA9 IGFzdF92aHViX2FsbG9jX2VwbihkLCBhZGRyKTsKKwlpZiAoIWVwKQorCQlyZXR1cm4gTlVMTDsK KwlEREJHKGQsICJBbGxvY2F0ZWQgZXBuIyVkIGZvciBwb3J0IEVQJWRcbiIsCisJICAgICBlcC0+ ZXBuLmdfaWR4LCBhZGRyKTsKKworCXJldHVybiAmZXAtPmVwOworfQorCitzdGF0aWMgaW50IGFz dF92aHViX3VkY19zdG9wKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQpCit7CisJc3RydWN0IGFz dF92aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCUREQkco ZCwgInN0b3BcbiIpOworCisJZC0+ZHJpdmVyID0gTlVMTDsKKwlkLT5nYWRnZXQuc3BlZWQgPSBV U0JfU1BFRURfVU5LTk9XTjsKKworCWFzdF92aHViX2Rldl9udWtlKGQpOworCisJaWYgKGQtPmVu YWJsZWQpCisJCWFzdF92aHViX2Rldl9kaXNhYmxlKGQpOworCisJc3Bpbl91bmxvY2tfaXJxcmVz dG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgdXNiX2dhZGdldF9vcHMgYXN0X3ZodWJfdWRjX29wcyA9IHsKKwkuZ2V0X2ZyYW1lCT0g YXN0X3ZodWJfdWRjX2dldF9mcmFtZSwKKwkud2FrZXVwCQk9IGFzdF92aHViX3VkY193YWtldXAs CisJLnB1bGx1cAkJPSBhc3Rfdmh1Yl91ZGNfcHVsbHVwLAorCS51ZGNfc3RhcnQJPSBhc3Rfdmh1 Yl91ZGNfc3RhcnQsCisJLnVkY19zdG9wCT0gYXN0X3ZodWJfdWRjX3N0b3AsCisJLm1hdGNoX2Vw CT0gYXN0X3ZodWJfdWRjX21hdGNoX2VwLAorfTsKKwordm9pZCBhc3Rfdmh1Yl9kZXZfc3VzcGVu ZChzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCWQtPnN1c3BlbmRlZCA9IHRydWU7CisJaWYg KGQtPmRyaXZlcikgeworCQlzcGluX3VubG9jaygmZC0+dmh1Yi0+bG9jayk7CisJCWQtPmRyaXZl ci0+c3VzcGVuZCgmZC0+Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZkLT52aHViLT5sb2NrKTsKKwl9 Cit9CisKK3ZvaWQgYXN0X3ZodWJfZGV2X3Jlc3VtZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQor eworCWQtPnN1c3BlbmRlZCA9IGZhbHNlOworCWlmIChkLT5kcml2ZXIpIHsKKwkJc3Bpbl91bmxv Y2soJmQtPnZodWItPmxvY2spOworCQlkLT5kcml2ZXItPnJlc3VtZSgmZC0+Z2FkZ2V0KTsKKwkJ c3Bpbl9sb2NrKCZkLT52aHViLT5sb2NrKTsKKwl9Cit9CisKK3ZvaWQgYXN0X3ZodWJfZGV2X3Jl c2V0KHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJLyoKKwkgKiBJZiBzcGVlZCBpcyBub3Qg c2V0LCB3ZSBlbmFibGUgdGhlIHBvcnQuIElmIGl0IGlzLAorCSAqIHNlbmQgcmVzZXQgdG8gdGhl IGdhZGdldCBhbmQgcmVzZXQgInNwZWVkIi4KKwkgKgorCSAqIFNwZWVkIGlzIGFuIGluZGljYXRp b24gdGhhdCB3ZSBoYXZlIGdvdCB0aGUgZmlyc3QKKwkgKiBzZXR1cCBwYWNrZXQgdG8gdGhlIGRl dmljZS4KKwkgKi8KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOICYm ICFkLT5lbmFibGVkKSB7CisJCUREQkcoZCwgIlJlc2V0IGF0IHVua25vd24gc3BlZWQgb2YgZGlz YWJsZWQgZGV2aWNlLCBlbmFibGluZy4uLlxuIik7CisJCWFzdF92aHViX2Rldl9lbmFibGUoZCk7 CisJCWQtPnN1c3BlbmRlZCA9IGZhbHNlOworCX0KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVkICE9IFVT Ql9TUEVFRF9VTktOT1dOICYmIGQtPmRyaXZlcikgeworCQl1bnNpZ25lZCBpbnQgaTsKKworCQlE REJHKGQsICJSZXNldCBhdCBrbm93biBzcGVlZCBvZiBib3VuZCBkZXZpY2UsIHJlc2V0dGluZy4u LlxuIik7CisJCXNwaW5fdW5sb2NrKCZkLT52aHViLT5sb2NrKTsKKwkJZC0+ZHJpdmVyLT5yZXNl dCgmZC0+Z2FkZ2V0KTsKKwkJc3Bpbl9sb2NrKCZkLT52aHViLT5sb2NrKTsKKworCQkvKgorCQkg KiBEaXNhYmxlL3JlLWVuYWJsZSBIVywgdGhpcyB3aWxsIGNsZWFyIHRoZSBhZGRyZXNzCisJCSAq IGFuZCBzcGVlZCBzZXR0aW5nLgorCQkgKi8KKwkJYXN0X3ZodWJfZGV2X2Rpc2FibGUoZCk7CisJ CWFzdF92aHViX2Rldl9lbmFibGUoZCk7CisKKwkJLyogQ2xlYXIgc3RhbGwgb24gYWxsIEVQcyAq LworCQlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykgeworCQkJc3Ry dWN0IGFzdF92aHViX2VwICplcCA9IGQtPmVwbnNbaV07CisKKwkJCWlmIChlcCAmJiBlcC0+ZXBu LnN0YWxsZWQpIHsKKwkJCQllcC0+ZXBuLnN0YWxsZWQgPSBmYWxzZTsKKwkJCQlhc3Rfdmh1Yl91 cGRhdGVfZXBuX3N0YWxsKGVwKTsKKwkJCX0KKwkJfQorCisJCS8qIEFkZGl0aW9uYWwgY2xlYW51 cHMgKi8KKwkJZC0+d2FrZXVwX2VuID0gZmFsc2U7CisJCWQtPnN1c3BlbmRlZCA9IGZhbHNlOwor CX0KK30KKwordm9pZCBhc3Rfdmh1Yl9kZWxfZGV2KHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5s b2NrLCBmbGFncyk7CisJaWYgKCFkLT5yZWdpc3RlcmVkKSB7CisJCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuOworCX0KKwlkLT5yZWdpc3Rl cmVkID0gZmFsc2U7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxh Z3MpOworCisJdXNiX2RlbF9nYWRnZXRfdWRjKCZkLT5nYWRnZXQpOworCWRldmljZV91bnJlZ2lz dGVyKCZkLT5wb3J0X2Rldik7Cit9CisKK2ludCBhc3Rfdmh1Yl9pbml0X2RldihzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIsIHVuc2lnbmVkIGludCBpZHgpCit7CisJc3RydWN0IGFzdF92aHViX2RldiAq ZCA9ICZ2aHViLT5wb3J0c1tpZHhdLmRldjsKKwlzdHJ1Y3QgZGV2aWNlICpwYXJlbnQgPSAmdmh1 Yi0+cGRldi0+ZGV2OworCWludCByYzsKKworCWQtPnZodWIgPSB2aHViOworCWQtPmluZGV4ID0g aWR4OworCWQtPm5hbWUgPSBkZXZtX2thc3ByaW50ZihwYXJlbnQsIEdGUF9LRVJORUwsICJwb3J0 JWQiLCBpZHgrMSk7CisJZC0+cmVncyA9IHZodWItPnJlZ3MgKyAweDEwMCArIDB4MTAgKiBpZHg7 CisKKwlhc3Rfdmh1Yl9pbml0X2VwMCh2aHViLCAmZC0+ZXAwLCBkKTsKKworCS8qCisJICogVGhl IFVEQyBjb3JlIHJlYWxseSBuZWVkcyB1cyB0byBoYXZlIHNlcGFyYXRlIGFuZCB1bmlxdWVseQor CSAqIG5hbWVkICJwYXJlbnQiIGRldmljZXMgZm9yIGVhY2ggcG9ydCBzbyB3ZSBjcmVhdGUgYSBz dWIgZGV2aWNlCisJICogaGVyZSBmb3IgdGhhdCBwdXJwb3NlCisJICovCisJZGV2aWNlX2luaXRp YWxpemUoJmQtPnBvcnRfZGV2KTsKKwlkLT5wb3J0X2Rldi5wYXJlbnQgPSBwYXJlbnQ7CisJZGV2 X3NldF9uYW1lKCZkLT5wb3J0X2RldiwgIiVzOnAlZCIsIGRldl9uYW1lKHBhcmVudCksIGlkeCAr IDEpOworCXJjID0gZGV2aWNlX2FkZCgmZC0+cG9ydF9kZXYpOworCWlmIChyYykKKwkJZ290byBm YWlsX2FkZDsKKworCS8qIFBvcHVsYXRlIGdhZGdldCAqLworCUlOSVRfTElTVF9IRUFEKCZkLT5n YWRnZXQuZXBfbGlzdCk7CisJZC0+Z2FkZ2V0Lm9wcyA9ICZhc3Rfdmh1Yl91ZGNfb3BzOworCWQt PmdhZGdldC5lcDAgPSAmZC0+ZXAwLmVwOworCWQtPmdhZGdldC5uYW1lID0gS0JVSUxEX01PRE5B TUU7CisJaWYgKHZodWItPmZvcmNlX3VzYjEpCisJCWQtPmdhZGdldC5tYXhfc3BlZWQgPSBVU0Jf U1BFRURfRlVMTDsKKwllbHNlCisJCWQtPmdhZGdldC5tYXhfc3BlZWQgPSBVU0JfU1BFRURfSElH SDsKKwlkLT5nYWRnZXQuc3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlkLT5nYWRnZXQuZGV2 Lm9mX25vZGUgPSB2aHViLT5wZGV2LT5kZXYub2Zfbm9kZTsKKworCXJjID0gdXNiX2FkZF9nYWRn ZXRfdWRjKCZkLT5wb3J0X2RldiwgJmQtPmdhZGdldCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8g ZmFpbF91ZGM7CisJZC0+cmVnaXN0ZXJlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKKyBmYWlsX3Vk YzoKKwlkZXZpY2VfZGVsKCZkLT5wb3J0X2Rldik7CisgZmFpbF9hZGQ6CisJcHV0X2RldmljZSgm ZC0+cG9ydF9kZXYpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNw ZWVkLXZodWIvZXAwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi43 OTcwOTlmMDZjYWEKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL2VwMC5jCkBAIC0wLDAgKzEsNDc4IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMCsKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBT b0MgInZIdWIiIFVTQiBnYWRnZXQKKyAqCisgKiBlcDAuYyAtIEVuZHBvaW50IDAgaGFuZGxpbmcK KyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dy YW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlm eQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhl ciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBs YXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRl IDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNp bmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxp bnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51 eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51 eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgv b2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFw Lmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgInZodWIuaCIK KworaW50IGFzdF92aHViX3JlcGx5KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGNoYXIgKnB0ciwg aW50IGxlbikKK3sKKwlzdHJ1Y3QgdXNiX3JlcXVlc3QgKnJlcSA9ICZlcC0+ZXAwLnJlcS5yZXE7 CisKKwlpZiAoV0FSTl9PTihlcC0+ZF9pZHggIT0gMCkpCisJCXJldHVybiBzdGRfcmVxX3N0YWxs OworCWlmIChXQVJOX09OKCFlcC0+ZXAwLmRpcl9pbikpCisJCXJldHVybiBzdGRfcmVxX3N0YWxs OworCWlmIChXQVJOX09OKGxlbiA+IEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUKSkKKwkJcmV0dXJu IHN0ZF9yZXFfc3RhbGw7CisJaWYgKFdBUk5fT04ocmVxLT5zdGF0dXMgPT0gLUVJTlBST0dSRVNT KSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwlyZXEtPmJ1ZiA9IHB0cjsKKwlyZXEtPmxl bmd0aCA9IGxlbjsKKwlyZXEtPmNvbXBsZXRlID0gTlVMTDsKKwlyZXEtPnplcm8gPSB0cnVlOwor CisJLyogQ2FsbCBpbnRlcm5hbCBxdWV1ZSBkaXJlY3RseSAqLworCWlmIChlcC0+ZXAub3BzLT5x dWV1ZSgmZXAtPmVwLCByZXEsIEdGUF9BVE9NSUMpKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsK KwllbHNlCisJCXJldHVybiBzdGRfcmVxX2RhdGE7Cit9CisKK2ludCBfX2FzdF92aHViX3NpbXBs ZV9yZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBpbnQgbGVuLCAuLi4pCit7CisJdTggKmJ1 ZmZlciA9IGVwLT5idWY7CisJdW5zaWduZWQgaW50IGk7CisJdmFfbGlzdCBhcmdzOworCisJdmFf c3RhcnQoYXJncywgbGVuKTsKKworCS8qIENvcHkgZGF0YSBkaXJlY3RseSBpbnRvIEVQIGJ1ZmZl ciAqLworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJYnVmZmVyW2ldID0gdmFfYXJnKGFy Z3MsIGludCk7CisJdmFfZW5kKGFyZ3MpOworCisJLyogcmVxLT5idWYgTlVMTCBtZWFucyBkYXRh IGlzIGFscmVhZHkgdGhlcmUgKi8KKwlyZXR1cm4gYXN0X3ZodWJfcmVwbHkoZXAsIE5VTEwsIGxl bik7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cChzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwKQoreworCXN0cnVjdCB1c2JfY3RybHJlcXVlc3QgY3JxOworCWVudW0gc3RkX3JlcV9y YyBzdGRfcmVxX3JjOworCWludCByYyA9IC1FTk9ERVY7CisKKwlpZiAoV0FSTl9PTihlcC0+ZF9p ZHggIT0gMCkpCisJCXJldHVybjsKKworCS8qCisJICogR3JhYiB0aGUgc2V0dXAgcGFja2V0IGZy b20gdGhlIGNoaXAgYW5kIGJ5dGVzd2FwCisJICogaW50ZXJlc3RpbmcgZmllbGRzCisJICovCisJ bWVtY3B5X2Zyb21pbygmY3JxLCBlcC0+ZXAwLnNldHVwLCBzaXplb2YoY3JxKSk7CisKKwlFUERC RyhlcCwgIlNFVFVQIHBhY2tldCAlMDJ4LyUwMngvJTA0eC8lMDR4LyUwNHggWyVzXSBzdD0lZFxu IiwKKwkgICAgICBjcnEuYlJlcXVlc3RUeXBlLCBjcnEuYlJlcXVlc3QsCisJICAgICAgIGxlMTZf dG9fY3B1KGNycS53VmFsdWUpLAorCSAgICAgICBsZTE2X3RvX2NwdShjcnEud0luZGV4KSwKKwkg ICAgICAgbGUxNl90b19jcHUoY3JxLndMZW5ndGgpLAorCSAgICAgICAoY3JxLmJSZXF1ZXN0VHlw ZSAmIFVTQl9ESVJfSU4pID8gImluIiA6ICJvdXQiLAorCSAgICAgICBlcC0+ZXAwLnN0YXRlKTsK KworCS8qIENoZWNrIG91ciBzdGF0ZSwgY2FuY2VsIHBlbmRpbmcgcmVxdWVzdHMgaWYgbmVlZGVk ICovCisJaWYgKGVwLT5lcDAuc3RhdGUgIT0gZXAwX3N0YXRlX3Rva2VuKSB7CisJCUVQREJHKGVw LCAid3Jvbmcgc3RhdGVcbiIpOworCQlhc3Rfdmh1Yl9udWtlKGVwLCAwKTsKKwkJZ290byBzdGFs bDsKKwl9CisKKwkvKiBDYWxjdWxhdGUgbmV4dCBzdGF0ZSBmb3IgRVAwICovCisJZXAtPmVwMC5z dGF0ZSA9IGVwMF9zdGF0ZV9kYXRhOworCWVwLT5lcDAuZGlyX2luID0gISEoY3JxLmJSZXF1ZXN0 VHlwZSAmIFVTQl9ESVJfSU4pOworCisJLyogSWYgdGhpcyBpcyB0aGUgdkh1Yiwgd2UgaGFuZGxl IHJlcXVlc3RzIGRpZmZlcmVudGx5ICovCisJc3RkX3JlcV9yYyA9IHN0ZF9yZXFfZHJpdmVyOwor CWlmIChlcC0+ZGV2ID09IE5VTEwpIHsKKwkJaWYgKChjcnEuYlJlcXVlc3RUeXBlICYgVVNCX1RZ UEVfTUFTSykgPT0gVVNCX1RZUEVfU1RBTkRBUkQpCisJCQlzdGRfcmVxX3JjID0gYXN0X3ZodWJf c3RkX2h1Yl9yZXF1ZXN0KGVwLCAmY3JxKTsKKwkJZWxzZSBpZiAoKGNycS5iUmVxdWVzdFR5cGUg JiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9DTEFTUykKKwkJCXN0ZF9yZXFfcmMgPSBhc3Rf dmh1Yl9jbGFzc19odWJfcmVxdWVzdChlcCwgJmNycSk7CisJCWVsc2UKKwkJCXN0ZF9yZXFfcmMg PSBzdGRfcmVxX3N0YWxsOworCX0gZWxzZSBpZiAoKGNycS5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQ RV9NQVNLKSA9PSBVU0JfVFlQRV9TVEFOREFSRCkKKwkJc3RkX3JlcV9yYyA9IGFzdF92aHViX3N0 ZF9kZXZfcmVxdWVzdChlcCwgJmNycSk7CisKKwkvKiBBY3QgdXBvbiByZXN1bHQgKi8KKwlzd2l0 Y2goc3RkX3JlcV9yYykgeworCWNhc2Ugc3RkX3JlcV9jb21wbGV0ZToKKwkJZ290byBjb21wbGV0 ZTsKKwljYXNlIHN0ZF9yZXFfc3RhbGw6CisJCWdvdG8gc3RhbGw7CisJY2FzZSBzdGRfcmVxX2Ry aXZlcjoKKwkJYnJlYWs7CisJY2FzZSBzdGRfcmVxX2RhdGE6CisJCXJldHVybjsKKwl9CisKKwkv KiBQYXNzIHJlcXVlc3QgdXAgdG8gdGhlIGdhZGdldCBkcml2ZXIgKi8KKwlpZiAoV0FSTl9PTigh ZXAtPmRldikpCisJCWdvdG8gc3RhbGw7CisJaWYgKGVwLT5kZXYtPmRyaXZlcikgeworCQlFUERC RyhlcCwgImZvcndhcmRpbmcgdG8gZ2FkZ2V0Li4uXG4iKTsKKwkJc3Bpbl91bmxvY2soJmVwLT52 aHViLT5sb2NrKTsKKwkJcmMgPSBlcC0+ZGV2LT5kcml2ZXItPnNldHVwKCZlcC0+ZGV2LT5nYWRn ZXQsICZjcnEpOworCQlzcGluX2xvY2soJmVwLT52aHViLT5sb2NrKTsKKwkJRVBEQkcoZXAsICJk cml2ZXIgcmV0dXJuZWQgJWRcbiIsIHJjKTsKKwl9IGVsc2UgeworCQlFUERCRyhlcCwgIm5vIGdh ZGdldCBmb3IgcmVxdWVzdCAhXG4iKTsKKwl9CisJaWYgKHJjID49IDApCisJCXJldHVybjsKKwor IHN0YWxsOgorCUVQREJHKGVwLCAic3RhbGxpbmdcbiIpOworCXdyaXRlbChWSFVCX0VQMF9DVFJM X1NUQUxMLCBlcC0+ZXAwLmN0bHN0YXQpOworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3Rh dHVzOworCWVwLT5lcDAuZGlyX2luID0gZmFsc2U7CisJcmV0dXJuOworCisgY29tcGxldGU6CisJ RVBWREJHKGVwLCAic2VuZGluZyBbaW5dIHN0YXR1cyB3aXRoIG5vIGRhdGFcbiIpOworCXdyaXRl bChWSFVCX0VQMF9UWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0KTsKKwllcC0+ZXAwLnN0YXRl ID0gZXAwX3N0YXRlX3N0YXR1czsKKwllcC0+ZXAwLmRpcl9pbiA9IGZhbHNlOworfQorCisKK3N0 YXRpYyB2b2lkIGFzdF92aHViX2VwMF9kb19zZW5kKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJ CQkJIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSkKK3sKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisJ dTMyIHJlZzsKKworCS8qIElmIHRoaXMgaXMgYSAwLWxlbmd0aCByZXF1ZXN0LCBpdCdzIHRoZSBn YWRnZXQgdHJ5aW5nIHRvCisJICogc2VuZCBhIHN0YXR1cyBvbiBvdXIgYmVoYWxmLiBXZSB0YWtl IGl0IGZyb20gaGVyZS4KKwkgKi8KKwlpZiAocmVxLT5yZXEubGVuZ3RoID09IDApCisJCXJlcS0+ bGFzdF9kZXNjID0gMTsKKworCS8qIEFyZSB3ZSBkb25lID8gQ29tcGxldGUgcmVxdWVzdCwgb3Ro ZXJ3aXNlIHdhaXQgZm9yIG5leHQgaW50ZXJydXB0ICovCisJaWYgKHJlcS0+bGFzdF9kZXNjID49 IDApIHsKKwkJRVBWREJHKGVwLCAiY29tcGxldGUgc2VuZCAlZC8lZFxuIiwKKwkJICAgICAgIHJl cS0+cmVxLmFjdHVhbCwgcmVxLT5yZXEubGVuZ3RoKTsKKwkJZXAtPmVwMC5zdGF0ZSA9IGVwMF9z dGF0ZV9zdGF0dXM7CisJCXdyaXRlbChWSFVCX0VQMF9SWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxz dGF0KTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAwKTsKKwkJcmV0dXJuOworCX0KKworCS8q CisJICogTmV4dCBjaHVuayBjcm9wcGVkIHRvIG1heCBwYWNrZXQgc2l6ZS4gQWxzbyBjaGVjayBp ZiB0aGlzCisJICogaXMgdGhlIGxhc3QgcGFja2V0CisJICovCisJY2h1bmsgPSByZXEtPnJlcS5s ZW5ndGggLSByZXEtPnJlcS5hY3R1YWw7CisJaWYgKGNodW5rID4gZXAtPmVwLm1heHBhY2tldCkK KwkJY2h1bmsgPSBlcC0+ZXAubWF4cGFja2V0OworCWVsc2UgaWYgKChjaHVuayA8IGVwLT5lcC5t YXhwYWNrZXQpIHx8ICFyZXEtPnJlcS56ZXJvKQorCQlyZXEtPmxhc3RfZGVzYyA9IDE7CisKKwlF UFZEQkcoZXAsICJzZW5kIGNodW5rPSVkIGxhc3Q9JWQsIHJlcS0+YWN0PSVkIG1wPSVkXG4iLAor CSAgICAgICBjaHVuaywgcmVxLT5sYXN0X2Rlc2MsIHJlcS0+cmVxLmFjdHVhbCwgZXAtPmVwLm1h eHBhY2tldCk7CisKKwkvKgorCSAqIENvcHkgZGF0YSBpZiBhbnkgKGludGVybmFsIHJlcXVlc3Rz IGFscmVhZHkgaGF2ZSBkYXRhCisJICogaW4gdGhlIEVQIGJ1ZmZlcikKKwkgKi8KKwlpZiAoY2h1 bmsgJiYgcmVxLT5yZXEuYnVmKQorCQltZW1jcHkoZXAtPmJ1ZiwgcmVxLT5yZXEuYnVmICsgcmVx LT5yZXEuYWN0dWFsLCBjaHVuayk7CisKKwkvKiBSZW1lbWJlciBjaHVuayBzaXplIGFuZCB0cmln Z2VyIHNlbmQgKi8KKwlyZWcgPSBWSFVCX0VQMF9TRVRfVFhfTEVOKGNodW5rKTsKKwl3cml0ZWwo cmVnLCBlcC0+ZXAwLmN0bHN0YXQpOworCXdyaXRlbChyZWcgfCBWSFVCX0VQMF9UWF9CVUZGX1JE WSwgZXAtPmVwMC5jdGxzdGF0KTsKKwlyZXEtPnJlcS5hY3R1YWwgKz0gY2h1bms7Cit9CisKK3N0 YXRpYyB2b2lkIGFzdF92aHViX2VwMF9yeF9wcmltZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQor eworCUVQVkRCRyhlcCwgInJ4IHByaW1lXG4iKTsKKworCS8qIFByaW1lIGVuZHBvaW50IGZvciBy ZWNlaXZpbmcgZGF0YSAqLworCXdyaXRlbChWSFVCX0VQMF9SWF9CVUZGX1JEWSwgZXAtPmVwMC5j dGxzdGF0ICsgQVNUX1ZIVUJfRVAwX0NUUkwpOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9l cDBfZG9fcmVjZWl2ZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBzdHJ1Y3QgYXN0X3ZodWJfcmVx ICpyZXEsCisJCQkJICAgIHVuc2lnbmVkIGludCBsZW4pCit7CisJdW5zaWduZWQgaW50IHJlbWFp bjsKKwlpbnQgcmMgPSAwOworCisJLyogV2UgYXJlIHJlY2VpdmluZy4uLiBncmFiIHJlcXVlc3Qg Ki8KKwlyZW1haW4gPSByZXEtPnJlcS5sZW5ndGggLSByZXEtPnJlcS5hY3R1YWw7CisKKwlFUFZE QkcoZXAsICJyZWNlaXZlIGdvdD0lZCByZW1haW49JWRcbiIsIGxlbiwgcmVtYWluKTsKKworCS8q IEFyZSB3ZSBnZXR0aW5nIG1vcmUgdGhhbiBhc2tlZCA/ICovCisJaWYgKGxlbiA+IHJlbWFpbikg eworCQlFUERCRyhlcCwgInJlY2VpdmluZyB0b28gbXVjaCAob3ZmOiAlZCkgIVxuIiwKKwkJICAg ICAgbGVuIC0gcmVtYWluKTsKKwkJbGVuID0gcmVtYWluOworCQlyYyA9IC1FT1ZFUkZMT1c7CisJ fQorCWlmIChsZW4gJiYgcmVxLT5yZXEuYnVmKQorCQltZW1jcHkocmVxLT5yZXEuYnVmICsgcmVx LT5yZXEuYWN0dWFsLCBlcC0+YnVmLCBsZW4pOworCXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisK KwkvKiBEb25lID8gKi8KKwlpZiAobGVuIDwgZXAtPmVwLm1heHBhY2tldCB8fCBsZW4gPT0gcmVt YWluKSB7CisJCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCQl3cml0ZWwoVkhV Ql9FUDBfVFhfQlVGRl9SRFksIGVwLT5lcDAuY3Rsc3RhdCk7CisJCWFzdF92aHViX2RvbmUoZXAs IHJlcSwgcmMpOworCX0gZWxzZQorCQlhc3Rfdmh1Yl9lcDBfcnhfcHJpbWUoZXApOworfQorCit2 b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfYWNrKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGJvb2wg aW5fYWNrKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwlzdHJ1Y3QgYXN0X3ZodWIg KnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdmh1Yi0+cGRldi0+ZGV2 OworCWJvb2wgc3RhbGwgPSBmYWxzZTsKKwl1MzIgc3RhdDsKKworCS8qIFJlYWQgRVAwIHN0YXR1 cyAqLworCXN0YXQgPSByZWFkbChlcC0+ZXAwLmN0bHN0YXQpOworCisJLyogR3JhYiBjdXJyZW50 IHJlcXVlc3QgaWYgYW55ICovCisJcmVxID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+ cXVldWUsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsIHF1ZXVlKTsKKworCUVQVkRCRyhlcCwgIkFDSyBz dGF0dXM9JTA4eCxzdGF0ZT0lZCBpc19pbj0lZCBpbl9hY2s9JWQgcmVxPSVwXG4iLAorCQlzdGF0 LCBlcC0+ZXAwLnN0YXRlLCBlcC0+ZXAwLmRpcl9pbiwgaW5fYWNrLCByZXEpOworCisJc3dpdGNo KGVwLT5lcDAuc3RhdGUpIHsKKwljYXNlIGVwMF9zdGF0ZV90b2tlbjoKKwkJLyogVGhlcmUgc2hv dWxkIGJlIG5vIHJlcXVlc3QgcXVldWVkIGluIHRoYXQgc3RhdGUuLi4gKi8KKwkJaWYgKHJlcSkg eworCQkJZGV2X3dhcm4oZGV2LCAicmVxdWVzdCBwcmVzZW50IHdoaWxlIGluIFRPS0VOIHN0YXRl XG4iKTsKKwkJCWFzdF92aHViX251a2UoZXAsIC1FSU5WQUwpOworCQl9CisJCWRldl93YXJuKGRl diwgImFjayB3aGlsZSBpbiBUT0tFTiBzdGF0ZVxuIik7CisJCXN0YWxsID0gdHJ1ZTsKKwkJYnJl YWs7CisJY2FzZSBlcDBfc3RhdGVfZGF0YToKKwkJLyogQ2hlY2sgdGhlIHN0YXRlIGJpdHMgY29y cmVzcG9uZGluZyB0byBvdXIgZGlyZWN0aW9uICovCisJCWlmICgoZXAtPmVwMC5kaXJfaW4gJiYg KHN0YXQgJiBWSFVCX0VQMF9UWF9CVUZGX1JEWSkpIHx8CisJCSAgICAoIWVwLT5lcDAuZGlyX2lu ICYmIChzdGF0ICYgVkhVQl9FUDBfUlhfQlVGRl9SRFkpKSB8fAorCQkgICAgKGVwLT5lcDAuZGly X2luICE9IGluX2FjaykpIHsKKwkJCWRldl93YXJuKGRldiwgImlycSBzdGF0ZSBtaXNtYXRjaCIp OworCQkJc3RhbGwgPSB0cnVlOworCQkJYnJlYWs7CisJCX0KKwkJLyoKKwkJICogV2UgYXJlIGlu IGRhdGEgcGhhc2UgYW5kIHRoZXJlJ3Mgbm8gcmVxdWVzdCwgc29tZXRoaW5nIGlzCisJCSAqIHdy b25nLCBzdGFsbAorCQkgKi8KKwkJaWYgKCFyZXEpIHsKKwkJCWRldl93YXJuKGRldiwgImRhdGEg cGhhc2UsIG5vIHJlcXVlc3RcbiIpOworCQkJc3RhbGwgPSB0cnVlOworCQkJYnJlYWs7CisJCX0K KworCQkvKiBXZSBoYXZlIGEgcmVxdWVzdCwgaGFuZGxlIGRhdGEgdHJhbnNmZXJzICovCisJCWlm IChlcC0+ZXAwLmRpcl9pbikKKwkJCWFzdF92aHViX2VwMF9kb19zZW5kKGVwLCByZXEpOworCQll bHNlCisJCQlhc3Rfdmh1Yl9lcDBfZG9fcmVjZWl2ZShlcCwgcmVxLCBWSFVCX0VQMF9SWF9MRU4o c3RhdCkpOworCQlyZXR1cm47CisJY2FzZSBlcDBfc3RhdGVfc3RhdHVzOgorCQkvKiBOdWtlIHN0 YWxlIHJlcXVlc3RzICovCisJCWlmIChyZXEpIHsKKwkJCWRldl93YXJuKGRldiwgInJlcXVlc3Qg cHJlc2VudCB3aGlsZSBpbiBTVEFUVVMgc3RhdGVcbiIpOworCQkJYXN0X3ZodWJfbnVrZShlcCwg LUVJTlZBTCk7CisJCX0KKworCQkvKgorCQkgKiBJZiB0aGUgc3RhdHVzIHBoYXNlIGNvbXBsZXRl cyB3aXRoIHRoZSB3cm9uZyBhY2ssIHN0YWxsCisJCSAqIHRoZSBlbmRwb2ludCBqdXN0IGluIGNh c2UsIHRvIGFib3J0IHdoYXRldmVyIHRoZSBob3N0CisJCSAqIHdhcyBkb2luZy4KKwkJICovCisJ CWlmIChlcC0+ZXAwLmRpcl9pbiA9PSBpbl9hY2spIHsKKwkJCWRldl93YXJuKGRldiwgInN0YXR1 cyBkaXJlY3Rpb24gbWlzbWF0Y2hcbiIpOworCQkJc3RhbGwgPSB0cnVlOworCQl9CisJfQorCisJ LyogUmVzZXQgdG8gdG9rZW4gc3RhdGUgKi8KKwllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3Rv a2VuOworCWlmIChzdGFsbCkKKwkJd3JpdGVsKFZIVUJfRVAwX0NUUkxfU1RBTEwsIGVwLT5lcDAu Y3Rsc3RhdCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXAwX3F1ZXVlKHN0cnVjdCB1c2Jf ZXAqIHVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEsCisJCQkgICAgICBnZnBfdCBnZnBf ZmxhZ3MpCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxID0gdG9fYXN0X3JlcSh1X3JlcSk7 CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSAmdmh1Yi0+cGRl di0+ZGV2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwkvKiBQYXJhbm9pZCBjaGVrcyAqLwor CWlmICghdV9yZXEgfHwgKCF1X3JlcS0+Y29tcGxldGUgJiYgIXJlcS0+aW50ZXJuYWwpKSB7CisJ CWRldl93YXJuKGRldiwgIkJvZ3VzIEVQMCByZXF1ZXN0ICEgdV9yZXE9JXBcbiIsIHVfcmVxKTsK KwkJaWYgKHVfcmVxKSB7CisJCQlkZXZfd2FybihkZXYsICJjb21wbGV0ZT0lcCBpbnRlcm5hbD0l ZFxuIiwKKwkJCQkgdV9yZXEtPmNvbXBsZXRlLCByZXEtPmludGVybmFsKTsKKwkJfQorCQlyZXR1 cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBOb3QgZW5kcG9pbnQgMCA/ICovCisJaWYgKFdBUk5fT04o ZXAtPmRfaWR4ICE9IDApKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIERpc2FibGVkIGRldmlj ZSAqLworCWlmIChlcC0+ZGV2ICYmICghZXAtPmRldi0+ZW5hYmxlZCB8fCBlcC0+ZGV2LT5zdXNw ZW5kZWQpKQorCQlyZXR1cm4gLUVTSFVURE9XTjsKKworCS8qIERhdGEsIG5vIGJ1ZmZlciBhbmQg bm90IGludGVybmFsID8gKi8KKwlpZiAodV9yZXEtPmxlbmd0aCAmJiAhdV9yZXEtPmJ1ZiAmJiAh cmVxLT5pbnRlcm5hbCkgeworCQlkZXZfd2FybihkZXYsICJSZXF1ZXN0IHdpdGggbm8gYnVmZmVy ICFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlFUFZEQkcoZXAsICJlbnF1ZXVlIHJl cSBAJXBcbiIsIHJlcSk7CisJRVBWREJHKGVwLCAiICBsPSVkIHplcm89JWQgbm9zaG9ydD0lZCBp c19pbj0lZFxuIiwKKwkgICAgICAgdV9yZXEtPmxlbmd0aCwgdV9yZXEtPnplcm8sCisJICAgICAg IHVfcmVxLT5zaG9ydF9ub3Rfb2ssIGVwLT5lcDAuZGlyX2luKTsKKworCS8qIEluaXRpYWxpemUg cmVxdWVzdCBwcm9ncmVzcyBmaWVsZHMgKi8KKwl1X3JlcS0+c3RhdHVzID0gLUVJTlBST0dSRVNT OworCXVfcmVxLT5hY3R1YWwgPSAwOworCXJlcS0+bGFzdF9kZXNjID0gLTE7CisJcmVxLT5hY3Rp dmUgPSBmYWxzZTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisK KwkvKiBFUDAgY2FuIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSByZXF1ZXN0IGF0IGEgdGltZSAqLwor CWlmICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSB8fCBlcC0+ZXAwLnN0YXRlID09IGVwMF9zdGF0 ZV90b2tlbikgeworCQlkZXZfd2FybihkZXYsICJFUDA6IFJlcXVlc3QgaW4gd3Jvbmcgc3RhdGVc biIpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJCXJl dHVybiAtRUJVU1k7CisJfQorCisJLyogQWRkIHJlcXVlc3QgdG8gbGlzdCBhbmQga2ljayBwcm9j ZXNzaW5nIGlmIGVtcHR5ICovCisJbGlzdF9hZGRfdGFpbCgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1 ZSk7CisKKwlpZiAoZXAtPmVwMC5kaXJfaW4pIHsKKwkJLyogSU4gcmVxdWVzdCwgc2VuZCBkYXRh ICovCisJCWFzdF92aHViX2VwMF9kb19zZW5kKGVwLCByZXEpOworCX0gZWxzZSBpZiAodV9yZXEt Pmxlbmd0aCA9PSAwKSB7CisJCS8qIDAtbGVuIHJlcXVlc3QsIHNlbmQgY29tcGxldGlvbiBhcyBy eCAqLworCQlFUFZEQkcoZXAsICIwLWxlbmd0aCByeCBjb21wbGV0aW9uXG4iKTsKKwkJZXAtPmVw MC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJCXdyaXRlbChWSFVCX0VQMF9UWF9CVUZGX1JE WSwgZXAtPmVwMC5jdGxzdGF0KTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAwKTsKKwl9IGVs c2UgeworCQkvKiBPVVQgcmVxdWVzdCwgc3RhcnQgcmVjZWl2ZXIgKi8KKwkJYXN0X3ZodWJfZXAw X3J4X3ByaW1lKGVwKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcDBfZGVx dWV1ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxKQorewor CXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92 aHViICp2aHViID0gZXAtPnZodWI7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCXVuc2ln bmVkIGxvbmcgZmxhZ3M7CisJaW50IHJjID0gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnFzYXZl KCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwkvKiBPbmx5IG9uZSByZXF1ZXN0IGNhbiBiZSBpbiB0 aGUgcXVldWUgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwg c3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCisJLyogSXMgaXQgb3VycyA/ICovCisJaWYg KHJlcSAmJiB1X3JlcSA9PSAmcmVxLT5yZXEpIHsKKwkJRVBWREJHKGVwLCAiZGVxdWV1ZSByZXEg QCVwXG4iLCByZXEpOworCisJCS8qCisJCSAqIFdlIGRvbid0IGhhdmUgdG8gZGVhbCB3aXRoICJh Y3RpdmUiIGFzIGFsbAorCQkgKiBETUFzIGdvIHRvIHRoZSBFUCBidWZmZXJzLCBub3QgdGhlIHJl cXVlc3QuCisJCSAqLworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIC1FQ09OTlJFU0VUKTsKKwor CQkvKiBXZSBkbyBzdGFsbCB0aGUgRVAgdG8gY2xlYW4gdGhpbmdzIHVwIGluIEhXICovCisJCXdy aXRlbChWSFVCX0VQMF9DVFJMX1NUQUxMLCBlcC0+ZXAwLmN0bHN0YXQpOworCQllcC0+ZXAwLnN0 YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJZXAtPmVwMC5kaXJfaW4gPSBmYWxzZTsKKwkJcmMg PSAwOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJ cmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2VwX29wcyBhc3Rfdmh1 Yl9lcDBfb3BzID0geworCS5xdWV1ZQkJPSBhc3Rfdmh1Yl9lcDBfcXVldWUsCisJLmRlcXVldWUJ PSBhc3Rfdmh1Yl9lcDBfZGVxdWV1ZSwKKwkuYWxsb2NfcmVxdWVzdAk9IGFzdF92aHViX2FsbG9j X3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdAk9IGFzdF92aHViX2ZyZWVfcmVxdWVzdCwKK307CisK K3ZvaWQgYXN0X3ZodWJfaW5pdF9lcDAoc3RydWN0IGFzdF92aHViICp2aHViLCBzdHJ1Y3QgYXN0 X3ZodWJfZXAgKmVwLAorCQkgICAgICAgc3RydWN0IGFzdF92aHViX2RldiAqZGV2KQoreworCW1l bXNldChlcCwgMCwgc2l6ZW9mKCplcCkpOworCisJSU5JVF9MSVNUX0hFQUQoJmVwLT5lcC5lcF9s aXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmZXAtPnF1ZXVlKTsKKwllcC0+ZXAub3BzID0gJmFzdF92 aHViX2VwMF9vcHM7CisJZXAtPmVwLm5hbWUgPSAiZXAwIjsKKwllcC0+ZXAuY2Fwcy50eXBlX2Nv bnRyb2wgPSB0cnVlOworCXVzYl9lcF9zZXRfbWF4cGFja2V0X2xpbWl0KCZlcC0+ZXAsIEFTVF9W SFVCX0VQMF9NQVhfUEFDS0VUKTsKKwllcC0+ZF9pZHggPSAwOworCWVwLT5kZXYgPSBkZXY7CisJ ZXAtPnZodWIgPSB2aHViOworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfdG9rZW47CisJSU5J VF9MSVNUX0hFQUQoJmVwLT5lcDAucmVxLnF1ZXVlKTsKKwllcC0+ZXAwLnJlcS5pbnRlcm5hbCA9 IHRydWU7CisKKwkvKiBTbWFsbCBkaWZmZXJlbmNlIGJldHdlZW4gdkh1YiBhbmQgZGV2aWNlcyAq LworCWlmIChkZXYpIHsKKwkJZXAtPmVwMC5jdGxzdGF0ID0gZGV2LT5yZWdzICsgQVNUX1ZIVUJf REVWX0VQMF9DVFJMOworCQllcC0+ZXAwLnNldHVwID0gdmh1Yi0+cmVncyArCisJCQlBU1RfVkhV Ql9TRVRVUDAgKyA4ICogKGRldi0+aW5kZXggKyAxKTsKKwkJZXAtPmJ1ZiA9IHZodWItPmVwMF9i dWZzICsKKwkJCUFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUICogKGRldi0+aW5kZXggKyAxKTsKKwkJ ZXAtPmJ1Zl9kbWEgPSB2aHViLT5lcDBfYnVmc19kbWEgKworCQkJQVNUX1ZIVUJfRVAwX01BWF9Q QUNLRVQgKiAoZGV2LT5pbmRleCArIDEpOworCX0gZWxzZSB7CisJCWVwLT5lcDAuY3Rsc3RhdCA9 IHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDBfQ1RSTDsKKwkJZXAtPmVwMC5zZXR1cCA9IHZodWIt PnJlZ3MgKyBBU1RfVkhVQl9TRVRVUDA7CisJCWVwLT5idWYgPSB2aHViLT5lcDBfYnVmczsKKwkJ ZXAtPmJ1Zl9kbWEgPSB2aHViLT5lcDBfYnVmc19kbWE7CisJfQorfQpkaWZmIC0tZ2l0IGEvZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4uYyBiL2RyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvZXBuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi44MGM5ZmVhYzUxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5jCkBAIC0wLDAgKzEsODQzIEBACisvLyBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMCsKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9y IEFzcGVlZCBTb0MgInZIdWIiIFVTQiBnYWRnZXQKKyAqCisgKiBlcG4uYyAtIEdlbmVyaWMgZW5k cG9pbnRzIG1hbmFnZW1lbnQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRpb24K KyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9r ZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0 Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4 L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJu by5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQu aD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2gu aD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+ CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5j bHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKwor I2luY2x1ZGUgInZodWIuaCIKKworI2RlZmluZSBFWFRSQV9DSEVDS1MKKworI2lmZGVmIEVYVFJB X0NIRUNLUworI2RlZmluZSBDSEVDSyhlcCwgZXhwciwgZm10Li4uKQkJCQkJXAorCWRvIHsJCQkJ CQkJXAorCQlpZiAoIShleHByKSkgRVBEQkcoZXAsICJDSEVDSzoiIGZtdCk7CQlcCisJfSB3aGls ZSgwKQorI2Vsc2UKKyNkZWZpbmUgQ0hFQ0soZXAsIGV4cHIsIGZtdC4uLikJZG8geyB9IHdoaWxl KDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2tpY2soc3RydWN0IGFzdF92 aHViX2VwICplcCwgc3RydWN0IGFzdF92aHViX3JlcSAqcmVxKQoreworCXVuc2lnbmVkIGludCBh Y3QgPSByZXEtPnJlcS5hY3R1YWw7CisJdW5zaWduZWQgaW50IGxlbiA9IHJlcS0+cmVxLmxlbmd0 aDsKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisKKwkvKiBUaGVyZSBzaG91bGQgYmUgbm8gRE1BIG9u Z29pbmcgKi8KKwlXQVJOX09OKHJlcS0+YWN0aXZlKTsKKworCS8qIENhbGN1bGF0ZSBuZXh0IGNo dW5rIHNpemUgKi8KKwljaHVuayA9IGxlbiAtIGFjdDsKKwlpZiAoY2h1bmsgPiBlcC0+ZXAubWF4 cGFja2V0KQorCQljaHVuayA9IGVwLT5lcC5tYXhwYWNrZXQ7CisJZWxzZSBpZiAoKGNodW5rIDwg ZXAtPmVwLm1heHBhY2tldCkgfHwgIXJlcS0+cmVxLnplcm8pCisJCXJlcS0+bGFzdF9kZXNjID0g MTsKKworCUVQVkRCRyhlcCwgImtpY2sgcmVxICVwIGFjdD0lZC8lZCBjaHVuaz0lZCBsYXN0PSVk XG4iLAorCSAgICAgICByZXEsIGFjdCwgbGVuLCBjaHVuaywgcmVxLT5sYXN0X2Rlc2MpOworCisJ LyogSWYgRE1BIHVuYXZhaWxhYmxlLCB1c2luZyBzdGFnaW5nIEVQIGJ1ZmZlciAqLworCWlmICgh cmVxLT5yZXEuZG1hKSB7CisKKwkJLyogRm9yIElOIHRyYW5zZmVycywgY29weSBkYXRhIG92ZXIg Zmlyc3QgKi8KKwkJaWYgKGVwLT5lcG4uaXNfaW4pCisJCQltZW1jcHkoZXAtPmJ1ZiwgcmVxLT5y ZXEuYnVmICsgYWN0LCBjaHVuayk7CisJCXdyaXRlbChlcC0+YnVmX2RtYSwgZXAtPmVwbi5yZWdz ICsgQVNUX1ZIVUJfRVBfREVTQ19CQVNFKTsKKwl9IGVsc2UKKwkJd3JpdGVsKHJlcS0+cmVxLmRt YSArIGFjdCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19CQVNFKTsKKworCS8qIFN0 YXJ0IERNQSAqLworCXJlcS0+YWN0aXZlID0gdHJ1ZTsKKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VU X1RYX1NJWkUoY2h1bmspLAorCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVND X1NUQVRVUyk7CisJd3JpdGVsKFZIVUJfRVBfRE1BX1NFVF9UWF9TSVpFKGNodW5rKSB8IFZIVUJf RVBfRE1BX1NJTkdMRV9LSUNLLAorCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9E RVNDX1NUQVRVUyk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9oYW5kbGVfYWNrKHN0 cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCXVu c2lnbmVkIGludCBsZW47CisJdTMyIHN0YXQ7CisKKwkvKiBSZWFkIEVQIHN0YXR1cyAqLworCXN0 YXQgPSByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisKKwkv KiBHcmFiIGN1cnJlbnQgcmVxdWVzdCBpZiBhbnkgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5 X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCisJRVBW REJHKGVwLCAiQUNLIHN0YXR1cz0lMDh4IGlzX2luPSVkLCByZXE9JXAgKGFjdGl2ZT0lZClcbiIs CisJICAgICAgIHN0YXQsIGVwLT5lcG4uaXNfaW4sIHJlcSwgcmVxID8gcmVxLT5hY3RpdmUgOiAw KTsKKworCS8qIEluIGFic2VuY2Ugb2YgYSByZXF1ZXN0LCBiYWlsIG91dCwgbXVzdCBoYXZlIGJl ZW4gZGVxdWV1ZWQgKi8KKwlpZiAoIXJlcSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBSZXF1ZXN0 IG5vdCBhY3RpdmUsIG1vdmUgb24gdG8gcHJvY2Vzc2luZyBxdWV1ZSwgYWN0aXZlIHJlcXVlc3QK KwkgKiB3YXMgcHJvYmFibHkgZGVxdWV1ZWQKKwkgKi8KKwlpZiAoIXJlcS0+YWN0aXZlKQorCQln b3RvIG5leHRfY2h1bms7CisKKwkvKiBDaGVjayBpZiBIVyBoYXMgbW92ZWQgb24gKi8KKwlpZiAo VkhVQl9FUF9ETUFfUlBUUihzdGF0KSAhPSAwKSB7CisJCUVQREJHKGVwLCAiRE1BIHJlYWQgcG9p bnRlciBub3QgMCAhXG4iKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vIGN1cnJlbnQgRE1BIG9u Z29pbmcgKi8KKwlyZXEtPmFjdGl2ZSA9IGZhbHNlOworCisJLyogR3JhYiBsZW5naHQgb3V0IG9m IEhXICovCisJbGVuID0gVkhVQl9FUF9ETUFfVFhfU0laRShzdGF0KTsKKworCS8qIElmIG5vdCB1 c2luZyBETUEsIGNvcHkgZGF0YSBvdXQgaWYgbmVlZGVkICovCisJaWYgKCFyZXEtPnJlcS5kbWEg JiYgIWVwLT5lcG4uaXNfaW4gJiYgbGVuKQorCQltZW1jcHkocmVxLT5yZXEuYnVmICsgcmVxLT5y ZXEuYWN0dWFsLCBlcC0+YnVmLCBsZW4pOworCisJLyogQWRqdXN0IHNpemUgKi8KKwlyZXEtPnJl cS5hY3R1YWwgKz0gbGVuOworCisJLyogQ2hlY2sgZm9yIHNob3J0IHBhY2tldCAqLworCWlmIChs ZW4gPCBlcC0+ZXAubWF4cGFja2V0KQorCQlyZXEtPmxhc3RfZGVzYyA9IDE7CisKKwkvKiBUaGF0 J3MgaXQgPyBjb21wbGV0ZSB0aGUgcmVxdWVzdCBhbmQgcGljayBhIG5ldyBvbmUgKi8KKwlpZiAo cmVxLT5sYXN0X2Rlc2MgPj0gMCkgeworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIDApOworCQly ZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHVi X3JlcSwKKwkJCQkJICAgICAgIHF1ZXVlKTsKKworCQkvKgorCQkgKiBEdWUgdG8gbG9jayBkcm9w cGluZyBpbnNpZGUgImRvbmUiIHRoZSBuZXh0IHJlcXVlc3QgY291bGQKKwkJICogYWxyZWFkeSBi ZSBhY3RpdmUsIHNvIGNoZWNrIGZvciB0aGF0IGFuZCBiYWlsIGlmIG5lZWRlZC4KKwkJICovCisJ CWlmICghcmVxIHx8IHJlcS0+YWN0aXZlKQorCQkJcmV0dXJuOworCX0KKworIG5leHRfY2h1bms6 CisJYXN0X3ZodWJfZXBuX2tpY2soZXAsIHJlcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWdu ZWQgaW50IGFzdF92aHViX2NvdW50X2ZyZWVfZGVzY3Moc3RydWN0IGFzdF92aHViX2VwICplcCkK K3sKKwkvKgorCSAqIGRfbmV4dCA9PSBkX2xhc3QgbWVhbnMgZGVzY3JpcHRvciBsaXN0IGVtcHR5 IHRvIEhXLAorCSAqIHRodXMgd2UgY2FuIG9ubHkgaGF2ZSBBU1RfVkhVQl9ERVNDU19DT1VOVC0x IGRlc2NyaXB0b3JzCisJICogaW4gdGhlIGxpc3QKKwkgKi8KKwlyZXR1cm4gKGVwLT5lcG4uZF9s YXN0ICsgQVNUX1ZIVUJfREVTQ1NfQ09VTlQgLSBlcC0+ZXBuLmRfbmV4dCAtIDEpICYKKwkJKEFT VF9WSFVCX0RFU0NTX0NPVU5UIC0gMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9r aWNrX2Rlc2Moc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgICBzdHJ1Y3QgYXN0X3ZodWJf cmVxICpyZXEpCit7CisJdW5zaWduZWQgaW50IGFjdCA9IHJlcS0+YWN0X2NvdW50OworCXVuc2ln bmVkIGludCBsZW4gPSByZXEtPnJlcS5sZW5ndGg7CisJdW5zaWduZWQgaW50IGNodW5rOworCisJ LyogTWFyayByZXF1ZXN0IGFjdGl2ZSBpZiBub3QgYWxyZWFkeSAqLworCXJlcS0+YWN0aXZlID0g dHJ1ZTsKKworCS8qIElmIHRoZSByZXF1ZXN0IHdhcyBhbHJlYWR5IGNvbXBsZXRlbHkgd3JpdHRl biwgZG8gbm90aGluZyAqLworCWlmIChyZXEtPmxhc3RfZGVzYyA+PSAwKQorCQlyZXR1cm47CisK KwlFUFZEQkcoZXAsICJraWNrIGFjdD0lZC8lZCBjaHVua19tYXg9JWQgZnJlZV9kZXNjcz0lZFxu IiwKKwkgICAgICAgYWN0LCBsZW4sIGVwLT5lcG4uY2h1bmtfbWF4LCBhc3Rfdmh1Yl9jb3VudF9m cmVlX2Rlc2NzKGVwKSk7CisKKwkvKiBXaGlsZSB3ZSBjYW4gY3JlYXRlIGRlc2NyaXB0b3JzICov CisJd2hpbGUgKGFzdF92aHViX2NvdW50X2ZyZWVfZGVzY3MoZXApICYmIHJlcS0+bGFzdF9kZXNj IDwgMCkgeworCQlzdHJ1Y3QgYXN0X3ZodWJfZGVzYyAqZGVzYzsKKwkJdW5zaWduZWQgaW50IGRf bnVtOworCisJCS8qIEdyYWIgbmV4dCBmcmVlIGRlc2NyaXB0b3IgKi8KKwkJZF9udW0gPSBlcC0+ ZXBuLmRfbmV4dDsKKwkJZGVzYyA9ICZlcC0+ZXBuLmRlc2NzW2RfbnVtXTsKKwkJZXAtPmVwbi5k X25leHQgPSAoZF9udW0gKyAxKSAmIChBU1RfVkhVQl9ERVNDU19DT1VOVCAtIDEpOworCisJCS8q IENhbGN1bGF0ZSBuZXh0IGNodW5rIHNpemUgKi8KKwkJY2h1bmsgPSBsZW4gLSBhY3Q7CisJCWlm IChjaHVuayA8PSBlcC0+ZXBuLmNodW5rX21heCkgeworCQkJLyoKKwkJCSAqIElzIHRoaXMgdGhl IGxhc3QgcGFja2V0ID8gQmVjYXVzZSBvZiBoYXZpbmcgdXAgdG8gOAorCQkJICogcGFja2V0cyBp biBhIGRlc2NyaXB0b3Igd2UgY2FuJ3QganVzdCBjb21wYXJlICJjaHVuayIKKwkJCSAqIHdpdGgg ZXAubWF4cGFja2V0LiBXZSBoYXZlIHRvIHNlZSBpZiBpdCdzIGEgbXVsdGlwbGUKKwkJCSAqIG9m IGl0IHRvIGtub3cgaWYgd2UgaGF2ZSB0byBzZW5kIGEgemVybyBwYWNrZXQuCisJCQkgKiBTYWRs eSB0aGF0IGludm9sdmVzIGEgbW9kdWxvIHdoaWNoIGlzIGEgYml0IGV4cGVuc2l2ZQorCQkJICog YnV0IHByb2JhYmx5IHN0aWxsIGJldHRlciB0aGFuIG5vdCBkb2luZyBpdC4KKwkJCSAqLworCQkJ aWYgKCFjaHVuayB8fCAhcmVxLT5yZXEuemVybyB8fCAoY2h1bmsgJSBlcC0+ZXAubWF4cGFja2V0 KSAhPSAwKQorCQkJCXJlcS0+bGFzdF9kZXNjID0gZF9udW07CisJCX0gZWxzZSB7CisJCQljaHVu ayA9IGVwLT5lcG4uY2h1bmtfbWF4OworCQl9CisKKwkJRVBWREJHKGVwLCAiIGNodW5rOiBhY3Q9 JWQvJWQgY2h1bms9JWQgbGFzdD0lZCBkZXNjPSVkIGZyZWU9JWRcbiIsCisJCSAgICAgICBhY3Qs IGxlbiwgY2h1bmssIHJlcS0+bGFzdF9kZXNjLCBkX251bSwKKwkJICAgICAgIGFzdF92aHViX2Nv dW50X2ZyZWVfZGVzY3MoZXApKTsKKworCQkvKiBQb3B1bGF0ZSBkZXNjcmlwdG9yICovCisJCWRl c2MtPncwID0gY3B1X3RvX2xlMzIocmVxLT5yZXEuZG1hICsgYWN0KTsKKworCQkvKiBJbnRlcnJ1 cHQgaWYgZW5kIG9mIHJlcXVlc3Qgb3Igbm8gbW9yZSBkZXNjcmlwdG9ycyAqLworCisJCS8qCisJ CSAqIFRPRE86IEJlIHNtYXJ0ZXIgYWJvdXQgaXQsIGlmIHdlIGRvbid0IGhhdmUgZW5vdWdoCisJ CSAqIGRlc2NyaXB0b3JzIHJlcXVlc3QgYW4gaW50ZXJydXB0IGJlZm9yZSBxdWV1ZSBlbXB0eQor CQkgKiBvciBzbyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHBvcHVsYXRlIG1vcmUgYmVmb3JlCisJ CSAqIHRoZSBIVyBydW5zIG91dC4gVGhpcyBpc24ndCBhIHByb2JsZW0gYXQgdGhlIG1vbWVudAor CQkgKiBhcyB3ZSB1c2UgMjU2IGRlc2NyaXB0b3JzIGFuZCBvbmx5IHB1dCBhdCBtb3N0IG9uZQor CQkgKiByZXF1ZXN0IGluIHRoZSByaW5nLgorCQkgKi8KKwkJZGVzYy0+dzEgPSBjcHVfdG9fbGUz MihWSFVCX0RTQzFfSU5fU0VUX0xFTihjaHVuaykpOworCQlpZiAocmVxLT5sYXN0X2Rlc2MgPj0g MCB8fCAhYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhlcCkpCisJCQlkZXNjLT53MSB8PSBjcHVf dG9fbGUzMihWSFVCX0RTQzFfSU5fSU5URVJSVVBUKTsKKworCQkvKiBBY2NvdW50IHBhY2tldCAq LworCQlyZXEtPmFjdF9jb3VudCA9IGFjdCA9IGFjdCArIGNodW5rOworCX0KKworCS8qIFRlbGwg SFcgYWJvdXQgbmV3IGRlc2NyaXB0b3JzICovCisJd3JpdGVsKFZIVUJfRVBfRE1BX1NFVF9DUFVf V1BUUihlcC0+ZXBuLmRfbmV4dCksCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQ X0RFU0NfU1RBVFVTKTsKKworCUVQVkRCRyhlcCwgIkhXIGtpY2tlZCwgZF9uZXh0PSVkIGRzdGF0 PSUwOHhcbiIsCisJICAgICAgIGVwLT5lcG4uZF9uZXh0LCByZWFkbChlcC0+ZXBuLnJlZ3MgKyBB U1RfVkhVQl9FUF9ERVNDX1NUQVRVUykpOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5f aGFuZGxlX2Fja19kZXNjKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJc3RydWN0IGFzdF92 aHViX3JlcSAqcmVxOworCXVuc2lnbmVkIGludCBsZW4sIGRfbGFzdDsKKwl1MzIgc3RhdCwgc3Rh dDE7CisKKwkvKiBSZWFkIEVQIHN0YXR1cywgd29ya2Fyb3VuZCBIVyByYWNlICovCisJZG8gewor CQlzdGF0ID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOwor CQlzdGF0MSA9IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsK Kwl9IHdoaWxlKHN0YXQgIT0gc3RhdDEpOworCisJLyogRXh0cmFjdCBSUFRSICovCisJZF9sYXN0 ID0gVkhVQl9FUF9ETUFfUlBUUihzdGF0KTsKKworCS8qIEdyYWIgY3VycmVudCByZXF1ZXN0IGlm IGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1 Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlFUFZEQkcoZXAsICJBQ0sgc3RhdHVzPSUwOHgg aXNfaW49JWQgZXAtPmRfbGFzdD0lZC4uJWRcbiIsCisJICAgICAgIHN0YXQsIGVwLT5lcG4uaXNf aW4sIGVwLT5lcG4uZF9sYXN0LCBkX2xhc3QpOworCisJLyogQ2hlY2sgYWxsIGNvbXBsZXRlZCBk ZXNjcmlwdG9ycyAqLworCXdoaWxlIChlcC0+ZXBuLmRfbGFzdCAhPSBkX2xhc3QpIHsKKwkJc3Ry dWN0IGFzdF92aHViX2Rlc2MgKmRlc2M7CisJCXVuc2lnbmVkIGludCBkX251bTsKKwkJYm9vbCBp c19sYXN0X2Rlc2M7CisKKwkJLyogR3JhYiBuZXh0IGNvbXBsZXRlZCBkZXNjcmlwdG9yICovCisJ CWRfbnVtID0gZXAtPmVwbi5kX2xhc3Q7CisJCWRlc2MgPSAmZXAtPmVwbi5kZXNjc1tkX251bV07 CisJCWVwLT5lcG4uZF9sYXN0ID0gKGRfbnVtICsgMSkgJiAoQVNUX1ZIVUJfREVTQ1NfQ09VTlQg LSAxKTsKKworCQkvKiBHcmFiIGxlbiBvdXQgb2YgZGVzY3JpcHRvciAqLworCQlsZW4gPSBWSFVC X0RTQzFfSU5fTEVOKGxlMzJfdG9fY3B1KGRlc2MtPncxKSk7CisKKwkJRVBWREJHKGVwLCAiIGRl c2MgJWQgbGVuPSVkIHJlcT0lcCAoYWN0PSVkKVxuIiwKKwkJICAgICAgIGRfbnVtLCBsZW4sIHJl cSwgcmVxID8gcmVxLT5hY3RpdmUgOiAwKTsKKworCQkvKiBJZiBubyBhY3RpdmUgcmVxdWVzdCBw ZW5kaW5nLCBtb3ZlIG9uICovCisJCWlmICghcmVxIHx8ICFyZXEtPmFjdGl2ZSkKKwkJCWNvbnRp bnVlOworCisJCS8qIEFkanVzdCBzaXplICovCisJCXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisK KwkJLyogSXMgdGhhdCB0aGUgbGFzdCBjaHVuayA/ICovCisJCWlzX2xhc3RfZGVzYyA9IHJlcS0+ bGFzdF9kZXNjID09IGRfbnVtOworCQlDSEVDSyhlcCwgaXNfbGFzdF9kZXNjID09IChsZW4gPCBl cC0+ZXAubWF4cGFja2V0IHx8CisJCQkJCSAgIChyZXEtPnJlcS5hY3R1YWwgPj0gcmVxLT5yZXEu bGVuZ3RoICYmCisJCQkJCSAgICAhcmVxLT5yZXEuemVybykpLAorCQkgICAgICAiTGFzdCBwYWNr ZXQgZGlzY3JlcGFuY3k6IGxhc3RfZGVzYz0lZCBsZW49JWQgci5hY3Q9JWQgIgorCQkgICAgICAi ci5sZW49JWQgci56ZXJvPSVkIG1wPSVkXG4iLAorCQkgICAgICBpc19sYXN0X2Rlc2MsIGxlbiwg cmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgsCisJCSAgICAgIHJlcS0+cmVxLnplcm8s IGVwLT5lcC5tYXhwYWNrZXQpOworCisJCWlmIChpc19sYXN0X2Rlc2MpIHsKKwkJCS8qCisJCQkg KiBCZWNhdXNlIHdlIGNhbiBvbmx5IGhhdmUgb25lIHJlcXVlc3QgYXQgYSB0aW1lCisJCQkgKiBp biBvdXIgZGVzY3JpcHRvciBsaXN0IGluIHRoaXMgaW1wbGVtZW50YXRpb24sCisJCQkgKiBkX2xh c3QgYW5kIGVwLT5kX2xhc3Qgc2hvdWxkIG5vdyBiZSBlcXVhbAorCQkJICovCisJCQlDSEVDSyhl cCwgZF9sYXN0ID09IGVwLT5lcG4uZF9sYXN0LAorCQkJICAgICAgIkRNQSByZWFkIHB0ciBtaXNt YXRjaCAlZCB2cyAlZFxuIiwKKwkJCSAgICAgIGRfbGFzdCwgZXAtPmVwbi5kX2xhc3QpOworCisJ CQkvKiBOb3RlOiBkb25lIHdpbGwgZHJvcCBhbmQgcmUtYWNxdWlyZSB0aGUgbG9jayAqLworCQkJ YXN0X3ZodWJfZG9uZShlcCwgcmVxLCAwKTsKKwkJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3Jf bnVsbCgmZXAtPnF1ZXVlLAorCQkJCQkJICAgICAgIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsCisJCQkJ CQkgICAgICAgcXVldWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBNb3JlIHdvcmsgPyAq LworCWlmIChyZXEpCisJCWFzdF92aHViX2Vwbl9raWNrX2Rlc2MoZXAsIHJlcSk7Cit9CisKK3Zv aWQgYXN0X3ZodWJfZXBuX2Fja19pcnEoc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwlpZiAo ZXAtPmVwbi5kZXNjX21vZGUpCisJCWFzdF92aHViX2Vwbl9oYW5kbGVfYWNrX2Rlc2MoZXApOwor CWVsc2UKKwkJYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2soZXApOworfQorCitzdGF0aWMgaW50IGFz dF92aHViX2Vwbl9xdWV1ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3Qg KnVfcmVxLAorCQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9y ZXEgKnJlcSA9IHRvX2FzdF9yZXEodV9yZXEpOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0 b19hc3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKwlib29sIGVtcHR5OworCWludCByYzsKKworCS8qIFBhcmFub2lk IGNoZWNrcyAqLworCWlmICghdV9yZXEgfHwgIXVfcmVxLT5jb21wbGV0ZSB8fCAhdV9yZXEtPmJ1 ZikgeworCQlkZXZfd2Fybigmdmh1Yi0+cGRldi0+ZGV2LCAiQm9ndXMgRVBuIHJlcXVlc3QgISB1 X3JlcT0lcFxuIiwgdV9yZXEpOworCQlpZiAodV9yZXEpIHsKKwkJCWRldl93YXJuKCZ2aHViLT5w ZGV2LT5kZXYsICJjb21wbGV0ZT0lcCBpbnRlcm5hbD0lZFxuIiwKKwkJCQkgdV9yZXEtPmNvbXBs ZXRlLCByZXEtPmludGVybmFsKTsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBF bmRwb2ludCBlbmFibGVkID8gKi8KKwlpZiAoIWVwLT5lcG4uZW5hYmxlZCB8fCAhdV9lcC0+ZGVz YyB8fCAhZXAtPmRldiB8fCAhZXAtPmRfaWR4IHx8CisJICAgICFlcC0+ZGV2LT5lbmFibGVkIHx8 IGVwLT5kZXYtPnN1c3BlbmRlZCkgeworCQlFUERCRyhlcCwiRW5xdWVpbmcgcmVxdWVzdCBvbiB3 cm9uZyBvciBkaXNhYmxlZCBFUFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOworCX0KKworCS8q IE1hcCByZXF1ZXN0IGZvciBETUEgaWYgcG9zc2libGUuIEZvciBub3csIHRoZSBydWxlIGZvciBE TUEgaXMKKwkgKiB0aGF0OgorCSAqCisJICogICogRm9yIHNpbmdsZSBzdGFnZSBtb2RlIChubyBk ZXNjcmlwdG9ycyk6CisJICoKKwkgKiAgIC0gVGhlIGJ1ZmZlciBpcyBhbGlnbmVkIHRvIGEgOCBi eXRlcyBib3VuZGFyeSAoSFcgcmVxdWlyZW1lbnQpCisJICogICAtIEZvciBhIE9VVCBlbmRwb2lu dCwgdGhlIHJlcXVlc3Qgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBFUAorCSAqICAgICBwYWNr ZXQgc2l6ZSAob3RoZXJ3aXNlIHRoZSBjb250cm9sbGVyIHdpbGwgRE1BIHBhc3QgdGhlIGVuZAor CSAqICAgICBvZiB0aGUgYnVmZmVyIGlmIHRoZSBob3N0IGlzIHNlbmRpbmcgYSB0b28gbG9uZyBw YWNrZXQpLgorCSAqCisJICogICogRm9yIGRlc2NyaXB0b3IgbW9kZSAodHggb25seSBmb3Igbm93 KSwgYWx3YXlzLgorCSAqCisJICogV2UgY291bGQgcmVsYXggdGhlIGxhdHRlciBieSBtYWtpbmcg dGhlIGRlY2lzaW9uIHRvIHVzZSB0aGUgYm91bmNlCisJICogYnVmZmVyIGJhc2VkIG9uIHRoZSBz aXplIG9mIGEgZ2l2ZW4gKnNlZ21lbnQqIG9mIHRoZSByZXF1ZXN0IHJhdGhlcgorCSAqIHRoYW4g dGhlIHdob2xlIHJlcXVlc3QuCisJICovCisJaWYgKGVwLT5lcG4uZGVzY19tb2RlIHx8CisJICAg ICgoKCh1bnNpZ25lZCBsb25nKXVfcmVxLT5idWYgJiA3KSA9PSAwKSAmJgorCSAgICAgKGVwLT5l cG4uaXNfaW4gfHwgISh1X3JlcS0+bGVuZ3RoICYgKHVfZXAtPm1heHBhY2tldCAtIDEpKSkpKSB7 CisJCXJjID0gdXNiX2dhZGdldF9tYXBfcmVxdWVzdCgmZXAtPmRldi0+Z2FkZ2V0LCB1X3JlcSwK KwkJCQkJICAgIGVwLT5lcG4uaXNfaW4pOworCQlpZiAocmMpIHsKKwkJCWRldl93YXJuKCZ2aHVi LT5wZGV2LT5kZXYsCisJCQkJICJSZXF1ZXN0IG1hcHBpbmcgZmFpbHVyZSAlZFxuIiwgcmMpOwor CQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlCisJCXVfcmVxLT5kbWEgPSAwOworCisJRVBWREJH KGVwLCAiZW5xdWV1ZSByZXEgQCVwXG4iLCByZXEpOworCUVQVkRCRyhlcCwgIiBsPSVkIGRtYT0w eCV4IHplcm89JWQgbm9zaG9ydD0lZCBub2lycT0lZCBpc19pbj0lZFxuIiwKKwkgICAgICAgdV9y ZXEtPmxlbmd0aCwgKHUzMil1X3JlcS0+ZG1hLCB1X3JlcS0+emVybywKKwkgICAgICAgdV9yZXEt PnNob3J0X25vdF9vaywgdV9yZXEtPm5vX2ludGVycnVwdCwKKwkgICAgICAgZXAtPmVwbi5pc19p bik7CisKKwkvKiBJbml0aWFsaXplIHJlcXVlc3QgcHJvZ3Jlc3MgZmllbGRzICovCisJdV9yZXEt PnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwl1X3JlcS0+YWN0dWFsID0gMDsKKwlyZXEtPmFjdF9j b3VudCA9IDA7CisJcmVxLT5hY3RpdmUgPSBmYWxzZTsKKwlyZXEtPmxhc3RfZGVzYyA9IC0xOwor CXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJZW1wdHkgPSBsaXN0X2Vt cHR5KCZlcC0+cXVldWUpOworCisJLyogQWRkIHJlcXVlc3QgdG8gbGlzdCBhbmQga2ljayBwcm9j ZXNzaW5nIGlmIGVtcHR5ICovCisJbGlzdF9hZGRfdGFpbCgmcmVxLT5xdWV1ZSwgJmVwLT5xdWV1 ZSk7CisJaWYgKGVtcHR5KSB7CisJCWlmIChlcC0+ZXBuLmRlc2NfbW9kZSkKKwkJCWFzdF92aHVi X2Vwbl9raWNrX2Rlc2MoZXAsIHJlcSk7CisJCWVsc2UKKwkJCWFzdF92aHViX2Vwbl9raWNrKGVw LCByZXEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7 CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfc3RvcF9hY3RpdmVfcmVx KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJICAgICBib29sIHJlc3RhcnRfZXApCit7CisJ dTMyIHN0YXRlLCByZWcsIGxvb3BzOworCisJLyogU3RvcCBETUEgYWN0aXZpdHkgKi8KKwl3cml0 ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCisJLyogV2Fp dCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlmb3IgKGxvb3BzID0gMDsgbG9vcHMgPCAxMDAwOyBs b29wcysrKSB7CisJCXN0YXRlID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1B X0NUTFNUQVQpOworCQlzdGF0ZSA9IFZIVUJfRVBfRE1BX1BST0NfU1RBVFVTKHN0YXRlKTsKKwkJ aWYgKHN0YXRlID09IEVQX0RNQV9QUk9DX1JYX0lETEUgfHwKKwkJICAgIHN0YXRlID09IEVQX0RN QV9QUk9DX1RYX0lETEUpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwlpZiAobG9vcHMg Pj0gMTAwMCkKKwkJZGV2X3dhcm4oJmVwLT52aHViLT5wZGV2LT5kZXYsICJUaW1lb3V0IHdhaXRp bmcgZm9yIERNQVxuIik7CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIHRvIHJlc3RhcnQgdGhlIGVu ZHBvaW50LCB0aGF0J3MgaXQgKi8KKwlpZiAoIXJlc3RhcnRfZXApCisJCXJldHVybjsKKworCS8q IFJlc3RhcnQgdGhlIGVuZHBvaW50ICovCisJaWYgKGVwLT5lcG4uZGVzY19tb2RlKSB7CisJCS8q CisJCSAqIFRha2Ugb3V0IGRlc2NyaXB0b3JzIGJ5IHJlc2V0dGluZyB0aGUgRE1BIHJlYWQKKwkJ ICogcG9pbnRlciB0byBiZSBlcXVhbCB0byB0aGUgQ1BVIHdyaXRlIHBvaW50ZXIuCisJCSAqCisJ CSAqIE5vdGU6IElmIHdlIGV2ZXIgc3VwcG9ydCBjcmVhdGluZyBkZXNjcmlwdG9ycyBmb3IKKwkJ ICogcmVxdWVzdHMgdGhhdCBhcmVuJ3QgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLCB3ZQorCQkgKiBt YXkgaGF2ZSB0byBkbyBzb21ldGhpbmcgbW9yZSBjb21wbGV4IGhlcmUsCisJCSAqIGVzcGVjaWFs bHkgaWYgdGhlIHJlcXVlc3QgYmVpbmcgdGFrZW4gb3V0IGlzCisJCSAqIG5vdCB0aGUgY3VycmVu dCBoZWFkIGRlc2NyaXB0b3JzLgorCQkgKi8KKwkJcmVnID0gVkhVQl9FUF9ETUFfU0VUX1JQVFIo ZXAtPmVwbi5kX25leHQpIHwKKwkJCVZIVUJfRVBfRE1BX1NFVF9DUFVfV1BUUihlcC0+ZXBuLmRf bmV4dCk7CisJCXdyaXRlbChyZWcsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RB VFVTKTsKKworCQkvKiBUaGVuIHR1cm4gaXQgYmFjayBvbiAqLworCQl3cml0ZWwoZXAtPmVwbi5k bWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFU KTsKKwl9IGVsc2UgeworCQkvKiBTaW5nbGUgbW9kZToganVzdCB0dXJuIGl0IGJhY2sgb24gKi8K KwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYsCisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1Rf VkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJfQorfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9k ZXF1ZXVlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEpCit7 CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5z aWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNh dmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIE1ha2Ugc3VyZSBpdCdzIGFjdHVhbGx5IHF1 ZXVlZCBvbiB0aGlzIGVuZHBvaW50ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAocmVxLCAmZXAt PnF1ZXVlLCBxdWV1ZSkgeworCQlpZiAoJnJlcS0+cmVxID09IHVfcmVxKQorCQkJYnJlYWs7CisJ fQorCisJaWYgKCZyZXEtPnJlcSA9PSB1X3JlcSkgeworCQlFUFZEQkcoZXAsICJkZXF1ZXVlIHJl cSBAJXAgYWN0aXZlPSVkXG4iLAorCQkgICAgICAgcmVxLCByZXEtPmFjdGl2ZSk7CisJCWlmIChy ZXEtPmFjdGl2ZSkKKwkJCWFzdF92aHViX3N0b3BfYWN0aXZlX3JlcShlcCwgdHJ1ZSk7CisJCWFz dF92aHViX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOworCQlyYyA9IDA7CisJfQorCisJc3Bp bl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCXJldHVybiByYzsKK30K Kwordm9pZCBhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAp Cit7CisJdTMyIHJlZzsKKworCWlmIChXQVJOX09OKGVwLT5kX2lkeCA9PSAwKSkKKwkJcmV0dXJu OworCXJlZyA9IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisJaWYg KGVwLT5lcG4uc3RhbGxlZCB8fCBlcC0+ZXBuLndlZGdlZCkKKwkJcmVnIHw9IFZIVUJfRVBfQ0ZH X1NUQUxMX0NUUkw7CisJZWxzZQorCQlyZWcgJj0gflZIVUJfRVBfQ0ZHX1NUQUxMX0NUUkw7CisJ d3JpdGVsKHJlZywgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsKKworCWlmICgh ZXAtPmVwbi5zdGFsbGVkICYmICFlcC0+ZXBuLndlZGdlZCkKKwkJd3JpdGVsKFZIVUJfRVBfVE9H R0xFX1NFVF9FUE5VTShlcC0+ZXBuLmdfaWR4KSwKKwkJICAgICAgIGVwLT52aHViLT5yZWdzICsg QVNUX1ZIVUJfRVBfVE9HR0xFKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9zZXRfaGFsdF9h bmRfd2VkZ2Uoc3RydWN0IHVzYl9lcCogdV9lcCwgYm9vbCBoYWx0LAorCQkJCSAgICAgIGJvb2wg d2VkZ2UpCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlz dHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CisJRVBEQkcoZXAsICJTZXQgaGFsdCAoJWQpICYgd2VkZ2UgKCVkKVxuIiwgaGFsdCwgd2VkZ2Up OworCisJaWYgKCF1X2VwIHx8ICF1X2VwLT5kZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAo ZXAtPmRfaWR4ID09IDApCisJCXJldHVybiAwOworCWlmIChlcC0+ZXBuLmlzX2lzbykKKwkJcmV0 dXJuIC1FT1BOT1RTVVBQOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdz KTsKKworCS8qIEZhaWwgd2l0aCBzdGlsbC1idXN5IElOIGVuZHBvaW50cyAqLworCWlmIChoYWx0 ICYmIGVwLT5lcG4uaXNfaW4gJiYgIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsKKwkJc3Bpbl91 bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4gLUVBR0FJTjsK Kwl9CisJZXAtPmVwbi5zdGFsbGVkID0gaGFsdDsKKwllcC0+ZXBuLndlZGdlZCA9IHdlZGdlOwor CWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXApOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXN0 X3ZodWJfZXBuX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKnVfZXAsIGludCB2YWx1ZSkKK3sKKwly ZXR1cm4gYXN0X3ZodWJfc2V0X2hhbHRfYW5kX3dlZGdlKHVfZXAsIHZhbHVlICE9IDAsIGZhbHNl KTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fc2V0X3dlZGdlKHN0cnVjdCB1c2JfZXAg KnVfZXApCit7CisJcmV0dXJuIGFzdF92aHViX3NldF9oYWx0X2FuZF93ZWRnZSh1X2VwLCB0cnVl LCB0cnVlKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fZGlzYWJsZShzdHJ1Y3QgdXNi X2VwKiB1X2VwKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7 CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJdW5zaWduZWQgbG9uZyBmbGFn czsKKwl1MzIgaW1hc2ssIGVwX2llcjsKKworCUVQREJHKGVwLCAiRGlzYWJsaW5nICFcbiIpOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCWVwLT5lcG4uZW5h YmxlZCA9IGZhbHNlOworCisJLyogU3RvcCBhY3RpdmUgRE1BIGlmIGFueSAqLworCWFzdF92aHVi X3N0b3BfYWN0aXZlX3JlcShlcCwgZmFsc2UpOworCisJLyogRGlzYWJsZSBlbmRwb2ludCAqLwor CXdyaXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9DT05GSUcpOworCisJLyogRGlz YWJsZSBBQ0sgaW50ZXJydXB0ICovCisJaW1hc2sgPSBWSFVCX0VQX0lSUShlcC0+ZXBuLmdfaWR4 KTsKKwllcF9pZXIgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJ ZXBfaWVyICY9IH5pbWFzazsKKwl3cml0ZWwoZXBfaWVyLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJf RVBfQUNLX0lFUik7CisJd3JpdGVsKGltYXNrLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNL X0lTUik7CisKKwkvKiBOdWtlIGFsbCBwZW5kaW5nIHJlcXVlc3RzICovCisJYXN0X3ZodWJfbnVr ZShlcCwgLUVTSFVURE9XTik7CisKKwkvKiBObyBtb3JlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3 aXRoIHJlcXVlc3QgKi8KKwllcC0+ZXAuZGVzYyA9IE5VTEw7CisKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlu dCBhc3Rfdmh1Yl9lcG5fZW5hYmxlKHN0cnVjdCB1c2JfZXAqIHVfZXAsCisJCQkgICAgICAgY29u c3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0YXRpYyBjb25z dCBjaGFyICplcF90eXBlX3N0cmluZ1tdIF9fbWF5YmVfdW51c2VkID0geyAiY3RybCIsCisJCQkJ CQkJICAgICAgICJpc29jIiwKKwkJCQkJCQkgICAgICAgImJ1bGsiLAorCQkJCQkJCSAgICAgICAi aW50ciIgfTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0 cnVjdCBhc3Rfdmh1Yl9kZXYgKmRldjsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWI7CisJdTE2IG1h eHBhY2tldCwgdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBlcF9jb25mLCBlcF9p ZXIsIGltYXNrOworCisJLyogQ2hlY2sgYXJndW1lbnRzICovCisJaWYgKCF1X2VwIHx8ICFkZXNj KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heHBhY2tldCA9IHVzYl9lbmRwb2ludF9tYXhwKGRl c2MpOworCWlmICghZXAtPmRfaWR4IHx8ICFlcC0+ZGV2IHx8CisJICAgIGRlc2MtPmJEZXNjcmlw dG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQgfHwKKwkgICAgbWF4cGFja2V0ID09IDAgfHwgbWF4 cGFja2V0ID4gZXAtPmVwLm1heHBhY2tldCkgeworCQlFUERCRyhlcCwgIkludmFsaWQgRVAgZW5h YmxlLGRfaWR4PSVkLGRldj0lcCx0eXBlPSVkLG1wPSVkLyVkXG4iLAorCQkgICAgICBlcC0+ZF9p ZHgsIGVwLT5kZXYsIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSwKKwkJICAgICAgbWF4cGFja2V0LCBl cC0+ZXAubWF4cGFja2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChlcC0+ZF9pZHgg IT0gdXNiX2VuZHBvaW50X251bShkZXNjKSkgeworCQlFUERCRyhlcCwgIkVQIG51bWJlciBtaXNt YXRjaCAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGVwLT5lcG4uZW5hYmxl ZCkgeworCQlFUERCRyhlcCwgIkFscmVhZHkgZW5hYmxlZFxuIik7CisJCXJldHVybiAtRUJVU1k7 CisJfQorCWRldiA9IGVwLT5kZXY7CisJdmh1YiA9IGVwLT52aHViOworCisJLyogQ2hlY2sgZGV2 aWNlIHN0YXRlICovCisJaWYgKCFkZXYtPmRyaXZlcikgeworCQlFUERCRyhlcCwgIkJvZ3VzIGRl dmljZSBzdGF0ZTogZHJpdmVyPSVwIHNwZWVkPSVkXG4iLAorCQkgICAgICAgZGV2LT5kcml2ZXIs IGRldi0+Z2FkZ2V0LnNwZWVkKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJLyogR3Jh YiBzb21lIGluZm8gZnJvbSB0aGUgZGVzY3JpcHRvciAqLworCWVwLT5lcG4uaXNfaW4gPSB1c2Jf ZW5kcG9pbnRfZGlyX2luKGRlc2MpOworCWVwLT5lcC5tYXhwYWNrZXQgPSBtYXhwYWNrZXQ7CisJ dHlwZSA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2MpOworCWVwLT5lcG4uZF9uZXh0ID0gZXAtPmVw bi5kX2xhc3QgPSAwOworCWVwLT5lcG4uaXNfaXNvID0gZmFsc2U7CisJZXAtPmVwbi5zdGFsbGVk ID0gZmFsc2U7CisJZXAtPmVwbi53ZWRnZWQgPSBmYWxzZTsKKworCUVQREJHKGVwLCAiRW5hYmxp bmcgWyVzXSAlcyBudW0gJWQgbWF4cGFja2V0PSVkXG4iLAorCSAgICAgIGVwLT5lcG4uaXNfaW4g PyAiaW4iIDogIm91dCIsIGVwX3R5cGVfc3RyaW5nW3R5cGVdLAorCSAgICAgIHVzYl9lbmRwb2lu dF9udW0oZGVzYyksIG1heHBhY2tldCk7CisKKwkvKiBDYW4gd2UgdXNlIERNQSBkZXNjcmlwdG9y IG1vZGUgPyAqLworCWVwLT5lcG4uZGVzY19tb2RlID0gZXAtPmVwbi5kZXNjcyAmJiBlcC0+ZXBu LmlzX2luOworCWlmIChlcC0+ZXBuLmRlc2NfbW9kZSkKKwkJbWVtc2V0KGVwLT5lcG4uZGVzY3Ms IDAsIDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCk7CisKKwkvKgorCSAqIExhcmdlIHNlbmQgZnVu Y3Rpb24gY2FuIHNlbmQgdXAgdG8gOCBwYWNrZXRzIGZyb20KKwkgKiBvbmUgZGVzY3JpcHRvciB3 aXRoIGEgbGltaXQgb2YgNDA5NSBieXRlcy4KKwkgKi8KKwllcC0+ZXBuLmNodW5rX21heCA9IGVw LT5lcC5tYXhwYWNrZXQ7CisJaWYgKGVwLT5lcG4uaXNfaW4pIHsKKwkJZXAtPmVwbi5jaHVua19t YXggPDw9IDM7CisJCXdoaWxlIChlcC0+ZXBuLmNodW5rX21heCA+IDQwOTUpCisJCQllcC0+ZXBu LmNodW5rX21heCAtPSBlcC0+ZXAubWF4cGFja2V0OworCX0KKworCXN3aXRjaCh0eXBlKSB7CisJ Y2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgorCQlFUERCRyhlcCwgIk9ubHkgb25lIGNv bnRyb2wgZW5kcG9pbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFVTQl9FTkRQT0lO VF9YRkVSX0lOVDoKKwkJZXBfY29uZiA9IFZIVUJfRVBfQ0ZHX1NFVF9UWVBFKEVQX1RZUEVfSU5U KTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQllcF9jb25mID0g VkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9CVUxLKTsKKwkJYnJlYWs7CisJY2FzZSBVU0Jf RU5EUE9JTlRfWEZFUl9JU09DOgorCQllcF9jb25mID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBf VFlQRV9JU08pOworCQllcC0+ZXBuLmlzX2lzbyA9IHRydWU7CisJCWJyZWFrOworCWRlZmF1bHQ6 CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuY29kZSB0aGUgcmVzdCBvZiB0aGUgRVAg Y29uZmlnIHJlZ2lzdGVyICovCisJaWYgKG1heHBhY2tldCA8IDEwMjQpCisJCWVwX2NvbmYgfD0g VkhVQl9FUF9DRkdfU0VUX01BWF9QS1QobWF4cGFja2V0KTsKKwlpZiAoIWVwLT5lcG4uaXNfaW4p CisJCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfRElSX09VVDsKKwllcF9jb25mIHw9IFZIVUJfRVBf Q0ZHX1NFVF9FUF9OVU0odXNiX2VuZHBvaW50X251bShkZXNjKSk7CisJZXBfY29uZiB8PSBWSFVC X0VQX0NGR19FTkFCTEU7CisJZXBfY29uZiB8PSBWSFVCX0VQX0NGR19TRVRfREVWKGRldi0+aW5k ZXggKyAxKTsKKwlFUFZEQkcoZXAsICJjb25maWc9JTA4eFxuIiwgZXBfY29uZik7CisKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJsZSBIVyBhbmQg cmVzZXQgRE1BICovCisJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJ Ryk7CisJd3JpdGVsKFZIVUJfRVBfRE1BX0NUUkxfUkVTRVQsCisJICAgICAgIGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKworCS8qIENvbmZpZ3VyZSBhbmQgZW5hYmxl ICovCisJd3JpdGVsKGVwX2NvbmYsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7 CisKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpIHsKKwkJLyogQ2xlYXIgRE1BIHN0YXR1cywgaW5j bHVkaW5nIHRoZSBETUEgcmVhZCBwdHIgKi8KKwkJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFT VF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCQkvKiBTZXQgZGVzY3JpcHRvciBiYXNlICovCisJ CXdyaXRlbChlcC0+ZXBuLmRlc2NzX2RtYSwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9W SFVCX0VQX0RFU0NfQkFTRSk7CisKKwkJLyogU2V0IGJhc2UgRE1BIGNvbmZpZyB2YWx1ZSAqLwor CQllcC0+ZXBuLmRtYV9jb25mID0gVkhVQl9FUF9ETUFfREVTQ19NT0RFOworCQlpZiAoZXAtPmVw bi5pc19pbikKKwkJCWVwLT5lcG4uZG1hX2NvbmYgfD0gVkhVQl9FUF9ETUFfSU5fTE9OR19NT0RF OworCisJCS8qIEZpcnN0IHJlc2V0IGFuZCBkaXNhYmxlIGFsbCBvcGVyYXRpb25zICovCisJCXdy aXRlbChlcC0+ZXBuLmRtYV9jb25mIHwgVkhVQl9FUF9ETUFfQ1RSTF9SRVNFVCwKKwkJICAgICAg IGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKworCQkvKiBFbmFibGUg ZGVzY3JpcHRvciBtb2RlICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mLAorCQkgICAgICAg ZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCX0gZWxzZSB7CisJCS8q IFNldCBiYXNlIERNQSBjb25maWcgdmFsdWUgKi8KKwkJZXAtPmVwbi5kbWFfY29uZiA9IFZIVUJf RVBfRE1BX1NJTkdMRV9TVEFHRTsKKworCQkvKiBSZXNldCBhbmQgc3dpdGNoIHRvIHNpbmdsZSBz dGFnZSBtb2RlICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mIHwgVkhVQl9FUF9ETUFfQ1RS TF9SRVNFVCwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFU KTsKKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYsCisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBB U1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJCXdyaXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBBU1Rf VkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJfQorCisJLyogQ2xlYW51cCBkYXRhIHRvZ2dsZSBqdXN0 IGluIGNhc2UgKi8KKwl3cml0ZWwoVkhVQl9FUF9UT0dHTEVfU0VUX0VQTlVNKGVwLT5lcG4uZ19p ZHgpLAorCSAgICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfVE9HR0xFKTsKKworCS8qIENs ZWFudXAgYW5kIGVuYWJsZSBBQ0sgaW50ZXJydXB0ICovCisJaW1hc2sgPSBWSFVCX0VQX0lSUShl cC0+ZXBuLmdfaWR4KTsKKwl3cml0ZWwoaW1hc2ssIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9B Q0tfSVNSKTsKKwllcF9pZXIgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lF Uik7CisJZXBfaWVyIHw9IGltYXNrOworCXdyaXRlbChlcF9pZXIsIHZodWItPnJlZ3MgKyBBU1Rf VkhVQl9FUF9BQ0tfSUVSKTsKKworCS8qIFdvb3QsIHdlIGFyZSBvbmxpbmUgISAqLworCWVwLT5l cG4uZW5hYmxlZCA9IHRydWU7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2Rp c3Bvc2Uoc3RydWN0IHVzYl9lcCAqdV9lcCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0g dG9fYXN0X2VwKHVfZXApOworCisJaWYgKFdBUk5fT04oIWVwLT5kZXYgfHwgIWVwLT5kX2lkeCkp CisJCXJldHVybjsKKworCUVQREJHKGVwLCAiUmVsZWFzaW5nIGVuZHBvaW50XG4iKTsKKworCS8q IFRha2UgaXQgb3V0IG9mIHRoZSBFUCBsaXN0ICovCisJbGlzdF9kZWxfaW5pdCgmZXAtPmVwLmVw X2xpc3QpOworCisJLyogTWFyayB0aGUgYWRkcmVzcyBmcmVlIGluIHRoZSBkZXZpY2UgKi8KKwll cC0+ZGV2LT5lcG5zW2VwLT5kX2lkeCAtIDFdID0gTlVMTDsKKworCS8qIEZyZWUgbmFtZSAmIERN QSBidWZmZXJzICovCisJa2ZyZWUoZXAtPmVwLm5hbWUpOworCWVwLT5lcC5uYW1lID0gTlVMTDsK KwlkbWFfZnJlZV9jb2hlcmVudCgmZXAtPnZodWItPnBkZXYtPmRldiwKKwkJCSAgQVNUX1ZIVUJf RVBuX01BWF9QQUNLRVQgKworCQkJICA4ICogQVNUX1ZIVUJfREVTQ1NfQ09VTlQsCisJCQkgIGVw LT5idWYsIGVwLT5idWZfZG1hKTsKKwllcC0+YnVmID0gTlVMTDsKKwllcC0+ZXBuLmRlc2NzID0g TlVMTDsKKworCS8qIE1hcmsgZnJlZSAqLworCWVwLT5kZXYgPSBOVUxMOworfQorCitzdGF0aWMg Y29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgYXN0X3ZodWJfZXBuX29wcyA9IHsKKwkuZW5hYmxlCQk9 IGFzdF92aHViX2Vwbl9lbmFibGUsCisJLmRpc2FibGUJPSBhc3Rfdmh1Yl9lcG5fZGlzYWJsZSwK KwkuZGlzcG9zZQk9IGFzdF92aHViX2Vwbl9kaXNwb3NlLAorCS5xdWV1ZQkJPSBhc3Rfdmh1Yl9l cG5fcXVldWUsCisJLmRlcXVldWUJPSBhc3Rfdmh1Yl9lcG5fZGVxdWV1ZSwKKwkuc2V0X2hhbHQJ PSBhc3Rfdmh1Yl9lcG5fc2V0X2hhbHQsCisJLnNldF93ZWRnZQk9IGFzdF92aHViX2Vwbl9zZXRf d2VkZ2UsCisJLmFsbG9jX3JlcXVlc3QJPSBhc3Rfdmh1Yl9hbGxvY19yZXF1ZXN0LAorCS5mcmVl X3JlcXVlc3QJPSBhc3Rfdmh1Yl9mcmVlX3JlcXVlc3QsCit9OworCitzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmFzdF92aHViX2FsbG9jX2VwbihzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLCB1OCBhZGRyKQor eworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGQtPnZodWI7CisJc3RydWN0IGFzdF92aHViX2Vw ICplcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogRmluZCBhIGZyZWUg b25lIChubyBkZXZpY2UpICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdz KTsKKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykKKwkJaWYgKHZo dWItPmVwbnNbaV0uZGV2ID09IE5VTEwpCisJCQlicmVhazsKKwlpZiAoaSA+PSBBU1RfVkhVQl9O VU1fR0VOX0VQcykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFn cyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFNldCBpdCB1cCAqLworCWVwID0gJnZodWIt PmVwbnNbaV07CisJZXAtPmRldiA9IGQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+ bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAiQWxsb2NhdGluZyBnZW4gRVAgJWQgZm9yIGFkZHIg JWRcbiIsIGksIGFkZHIpOworCUlOSVRfTElTVF9IRUFEKCZlcC0+cXVldWUpOworCWVwLT5kX2lk eCA9IGFkZHI7CisJZXAtPnZodWIgPSB2aHViOworCWVwLT5lcC5vcHMgPSAmYXN0X3ZodWJfZXBu X29wczsKKwllcC0+ZXAubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiZXAlZCIsIGFkZHIp OworCWQtPmVwbnNbYWRkci0xXSA9IGVwOworCWVwLT5lcG4uZ19pZHggPSBpOworCWVwLT5lcG4u cmVncyA9IHZodWItPnJlZ3MgKyAweDIwMCArIChpICogMHgxMCk7CisKKwllcC0+YnVmID0gZG1h X2FsbG9jX2NvaGVyZW50KCZ2aHViLT5wZGV2LT5kZXYsCisJCQkJICAgICBBU1RfVkhVQl9FUG5f TUFYX1BBQ0tFVCArCisJCQkJICAgICA4ICogQVNUX1ZIVUJfREVTQ1NfQ09VTlQsCisJCQkJICAg ICAmZXAtPmJ1Zl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghZXAtPmJ1ZikgeworCQlrZnJlZShl cC0+ZXAubmFtZSk7CisJCWVwLT5lcC5uYW1lID0gTlVMTDsKKwkJcmV0dXJuIE5VTEw7CisJfQor CWVwLT5lcG4uZGVzY3MgPSBlcC0+YnVmICsgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQ7CisJZXAt PmVwbi5kZXNjc19kbWEgPSBlcC0+YnVmX2RtYSArIEFTVF9WSFVCX0VQbl9NQVhfUEFDS0VUOwor CisJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJmVwLT5lcCwgQVNUX1ZIVUJfRVBuX01BWF9Q QUNLRVQpOworCWxpc3RfYWRkX3RhaWwoJmVwLT5lcC5lcF9saXN0LCAmZC0+Z2FkZ2V0LmVwX2xp c3QpOworCWVwLT5lcC5jYXBzLnR5cGVfaXNvID0gdHJ1ZTsKKwllcC0+ZXAuY2Fwcy50eXBlX2J1 bGsgPSB0cnVlOworCWVwLT5lcC5jYXBzLnR5cGVfaW50ID0gdHJ1ZTsKKwllcC0+ZXAuY2Fwcy5k aXJfaW4gPSB0cnVlOworCWVwLT5lcC5jYXBzLmRpcl9vdXQgPSB0cnVlOworCisJcmV0dXJuIGVw OworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIu YyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvaHViLmMKbmV3IGZpbGUgbW9k ZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5hNzc1ODJiZGExZmIKLS0tIC9kZXYvbnVsbAor KysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jCkBAIC0wLDAgKzEs ODE5IEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKKy8qCisgKiBhc3Bl ZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIiIFVTQiBnYWRnZXQKKyAqCisg KiBodWIuYyAtIHZpcnR1YWwgaHViIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJN IENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBj YW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUg RnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNl LCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5j bHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVk ZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNp bmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVk ZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGlu dXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxp bnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgv dXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2Zf Z3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1t YXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lv bi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4K KworI2luY2x1ZGUgInZodWIuaCIKKworLyogdXNiIDIuMCBodWIgZGV2aWNlIGRlc2NyaXB0b3IK KyAqCisgKiBBIGZldyB0aGluZ3Mgd2UgbWF5IHdhbnQgdG8gaW1wcm92ZSBoZXJlOgorICoKKyAq ICAgIC0gV2UgbWF5IG5lZWQgdG8gaW5kaWNhdGUgVFQgc3VwcG9ydAorICogICAgLSBXZSBtYXkg bmVlZCBhIGRldmljZSBxdWFsaWZpZXIgZGVzY3JpcHRvcgorICoJYXMgZGV2aWNlcyBjYW4gcHJl dGVuZCB0byBiZSB1c2IxIG9yIDIKKyAqICAgIC0gTWFrZSB2aWQvZGlkIG92ZXJyaWRhYmxlCisg KiAgICAtIG1ha2UgaXQgbG9vayBsaWtlIHVzYjEgaWYgdXNiMSBtb2RlIGZvcmNlZAorICovCisj ZGVmaW5lIEtFUk5FTF9SRUwJYmluMmJjZCgoKExJTlVYX1ZFUlNJT05fQ09ERSA+PiAxNikgJiAw eDBmZikpCisjZGVmaW5lIEtFUk5FTF9WRVIJYmluMmJjZCgoKExJTlVYX1ZFUlNJT05fQ09ERSA+ PiA4KSAmIDB4MGZmKSkKKworZW51bSB7CisJQVNUX1ZIVUJfU1RSX01BTlVGID0gMywKKwlBU1Rf VkhVQl9TVFJfUFJPRFVDVCA9IDIsCisJQVNUX1ZIVUJfU1RSX1NFUklBTCA9IDEsCit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IHVzYl9kZXZpY2VfZGVzY3JpcHRvciBhc3Rfdmh1Yl9kZXZfZGVz YyA9IHsKKwkuYkxlbmd0aAkJPSBVU0JfRFRfREVWSUNFX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlw ZQk9IFVTQl9EVF9ERVZJQ0UsCisJLmJjZFVTQgkJCT0gY3B1X3RvX2xlMTYoMHgwMjAwKSwKKwku YkRldmljZUNsYXNzCQk9IFVTQl9DTEFTU19IVUIsCisJLmJEZXZpY2VTdWJDbGFzcwk9IDAsCisJ LmJEZXZpY2VQcm90b2NvbAk9IDEsCisJLmJNYXhQYWNrZXRTaXplMAk9IDY0LAorCS5pZFZlbmRv cgkJPSBjcHVfdG9fbGUxNigweDFkNmIpLAorCS5pZFByb2R1Y3QJCT0gY3B1X3RvX2xlMTYoMHgw MTA3KSwKKwkuYmNkRGV2aWNlCQk9IGNwdV90b19sZTE2KDB4MDEwMCksCisJLmlNYW51ZmFjdHVy ZXIJCT0gQVNUX1ZIVUJfU1RSX01BTlVGLAorCS5pUHJvZHVjdAkJPSBBU1RfVkhVQl9TVFJfUFJP RFVDVCwKKwkuaVNlcmlhbE51bWJlcgkJPSBBU1RfVkhVQl9TVFJfU0VSSUFMLAorCS5iTnVtQ29u ZmlndXJhdGlvbnMJPSAxLAorfTsKKworLyogUGF0Y2hlcyB0byB0aGUgYWJvdmUgd2hlbiBmb3Jj aW5nIFVTQjEgbW9kZSAqLworc3RhdGljIHZvaWQgYXN0X3ZodWJfcGF0Y2hfZGV2X2Rlc2NfdXNi MShzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXNjKQoreworCWRlc2MtPmJjZFVTQiA9 IGNwdV90b19sZTE2KDB4MDEwMCk7CisJZGVzYy0+YkRldmljZVByb3RvY29sID0gMDsKK30KKwor LyoKKyAqIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcjogc2FtZSBjb21tZW50cyBhcyBhYm92ZQor ICogcmVnYXJkaW5nIGhhbmRsaW5nIFVTQjEgbW9kZS4KKyAqLworCisvKgorICogV2UgZG9uJ3Qg dXNlIHNpemVvZigpIGFzIExpbnV4IGRlZmluaXRpb24gb2YKKyAqIHN0cnVjdCB1c2JfZW5kcG9p bnRfZGVzY3JpcHRvciBjb250YWlucyAyCisgKiBleHRyYSBieXRlcworICovCisjZGVmaW5lIEFT VF9WSFVCX0NPTkZfREVTQ19TSVpFCShVU0JfRFRfQ09ORklHX1NJWkUgKyBcCisJCQkJIFVTQl9E VF9JTlRFUkZBQ0VfU0laRSArIFwKKwkJCQkgVVNCX0RUX0VORFBPSU5UX1NJWkUpCisKK3N0YXRp YyBjb25zdCBzdHJ1Y3QgYXN0X3ZodWJfZnVsbF9jZGVzYyB7CisJc3RydWN0IHVzYl9jb25maWdf ZGVzY3JpcHRvcgljZmc7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBpbnRmOwor CXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgllcDsKK30gX19hdHRyaWJ1dGVfXyAoKHBh Y2tlZCkpIGFzdF92aHViX2NvbmZfZGVzYyA9IHsKKwkuY2ZnID0geworCQkuYkxlbmd0aAkJPSBV U0JfRFRfQ09ORklHX1NJWkUsCisJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfQ09ORklHLAor CQkud1RvdGFsTGVuZ3RoCQk9IGNwdV90b19sZTE2KEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFKSwK KwkJLmJOdW1JbnRlcmZhY2VzCQk9IDEsCisJCS5iQ29uZmlndXJhdGlvblZhbHVlCT0gMSwKKwkJ LmlDb25maWd1cmF0aW9uCQk9IDAsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0NPTkZJR19BVFRf T05FIHwKKwkJCQkJICBVU0JfQ09ORklHX0FUVF9TRUxGUE9XRVIgfAorCQkJCQkgIFVTQl9DT05G SUdfQVRUX1dBS0VVUCwKKwkJLmJNYXhQb3dlcgkJPSAwLAorCX0sCisJLmludGYgPSB7CisJCS5i TGVuZ3RoCQk9IFVTQl9EVF9JTlRFUkZBQ0VfU0laRSwKKwkJLmJEZXNjcmlwdG9yVHlwZQk9IFVT Ql9EVF9JTlRFUkZBQ0UsCisJCS5iSW50ZXJmYWNlTnVtYmVyCT0gMCwKKwkJLmJBbHRlcm5hdGVT ZXR0aW5nCT0gMCwKKwkJLmJOdW1FbmRwb2ludHMJCT0gMSwKKwkJLmJJbnRlcmZhY2VDbGFzcwk9 IFVTQl9DTEFTU19IVUIsCisJCS5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAwLAorCQkuYkludGVyZmFj ZVByb3RvY29sCT0gMCwKKwkJLmlJbnRlcmZhY2UJCT0gMCwKKwl9LAorCS5lcCA9IHsKKwkJLmJM ZW5ndGgJCT0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0Jf RFRfRU5EUE9JTlQsCisJCS5iRW5kcG9pbnRBZGRyZXNzCT0gMHg4MSwKKwkJLmJtQXR0cmlidXRl cwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJCS53TWF4UGFja2V0U2l6ZQkJPSBjcHVfdG9f bGUxNigxKSwKKwkJLmJJbnRlcnZhbAkJPSAweDBjLAorCX0sCit9OworCisjZGVmaW5lIEFTVF9W SFVCX0hVQl9ERVNDX1NJWkUJKFVTQl9EVF9IVUJfTk9OVkFSX1NJWkUgKyAyKQorCitzdGF0aWMg Y29uc3Qgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciBhc3Rfdmh1Yl9odWJfZGVzYyA9IHsKKwku YkRlc2NMZW5ndGgJCQk9IEFTVF9WSFVCX0hVQl9ERVNDX1NJWkUsCisJLmJEZXNjcmlwdG9yVHlw ZQkJPSBVU0JfRFRfSFVCLAorCS5iTmJyUG9ydHMJCQk9IEFTVF9WSFVCX05VTV9QT1JUUywKKwku d0h1YkNoYXJhY3RlcmlzdGljcwkJPSBjcHVfdG9fbGUxNihIVUJfQ0hBUl9OT19MUFNNKSwKKwku YlB3ck9uMlB3ckdvb2QJCQk9IDEwLAorCS5iSHViQ29udHJDdXJyZW50CQk9IDAsCisJLnUuaHMu RGV2aWNlUmVtb3ZhYmxlWzBdCT0gMCwKKwkudS5ocy5EZXZpY2VSZW1vdmFibGVbMV0JPSAweGZm LAorfTsKKworLyoKKyAqIFRoZXNlIHN0cmluZ3MgY29udmVydGVkIHRvIFVURi0xNiBtdXN0IGJl IHNtYWxsZXIgdGhhbgorICogb3VyIEVQMCBidWZmZXIuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgdXNiX3N0cmluZyBhc3Rfdmh1Yl9zdHJfYXJyYXlbXSA9IHsKKwl7CisJCS5pZCA9IEFTVF9W SFVCX1NUUl9TRVJJQUwsCisJCS5zID0gIjAwMDAwMDAwIgorCX0sCisJeworCQkuaWQgPSBBU1Rf VkhVQl9TVFJfUFJPRFVDVCwKKwkJLnMgPSAiVVNCIFZpcnR1YWwgSHViIgorCX0sCisJeworCQku aWQgPSBBU1RfVkhVQl9TVFJfTUFOVUYsCisJCS5zID0gIkFzcGVlZCIKKwl9LAorCXsgfQorfTsK Kworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZ2FkZ2V0X3N0cmluZ3MgYXN0X3ZodWJfc3RyaW5n cyA9IHsKKwkubGFuZ3VhZ2UgPSAweDA0MDksCisJLnN0cmluZ3MgPSAoc3RydWN0IHVzYl9zdHJp bmcgKilhc3Rfdmh1Yl9zdHJfYXJyYXkKK307CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2Rl dl9zdGF0dXMoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgICB1MTYgd0luZGV4LCB1MTYg d1ZhbHVlKQoreworCXU4IHN0MDsKKworCUVQREJHKGVwLCAiR0VUX1NUQVRVUyhkZXYpXG4iKTsK KworCS8qCisJICogTWFyayBpdCBhcyBzZWxmLXBvd2VyZWQsIEkgZG91YnQgdGhlIEJNQyBpcyBw b3dlcmVkIG9mZgorCSAqIHRoZSBVU0IgYnVzIC4uLgorCSAqLworCXN0MCA9IDEgPDwgVVNCX0RF VklDRV9TRUxGX1BPV0VSRUQ7CisKKwkvKgorCSAqIE5lZWQgdG8gZG91YmxlIGNoZWNrIGhvdyBy ZW1vdGUgd2FrZXVwIGFjdHVhbGx5IHdvcmtzCisJICogb24gdGhhdCBjaGlwIGFuZCB3aGF0IHRy aWdnZXJzIGl0LgorCSAqLworCWlmIChlcC0+dmh1Yi0+d2FrZXVwX2VuKQorCQlzdDAgfD0gMSA8 PCBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVA7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3Jl cGx5KGVwLCBzdDAsIDApOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2h1Yl9lcF9zdGF0dXMo c3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgIHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUpCit7 CisJaW50IGVwX251bTsKKwl1OCBzdDAgPSAwOworCisJZXBfbnVtID0gd0luZGV4ICYgVVNCX0VO RFBPSU5UX05VTUJFUl9NQVNLOworCUVQREJHKGVwLCAiR0VUX1NUQVRVUyhlcCVkKVxuIiwgZXBf bnVtKTsKKworCS8qIE9uIHRoZSBodWIgd2UgaGF2ZSBvbmx5IEVQIDAgYW5kIDEgKi8KKwlpZiAo ZXBfbnVtID09IDEpIHsKKwkJaWYgKGVwLT52aHViLT5lcDFfc3RhbGxlZCkKKwkJCXN0MCB8PSAx IDw8IFVTQl9FTkRQT0lOVF9IQUxUOworCX0gZWxzZSBpZiAoZXBfbnVtICE9IDApCisJCXJldHVy biBzdGRfcmVxX3N0YWxsOworCisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgc3Qw LCAwKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJfZGV2X2ZlYXR1cmUoc3RydWN0IGFz dF92aHViX2VwICplcCwKKwkJCQkgICAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSwKKwkJCQkgICAg Ym9vbCBpc19zZXQpCit7CisJRVBEQkcoZXAsICIlc19GRUFUVVJFKGRldiB2YWw9JTAyeClcbiIs CisJICAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xFQVIiLCB3VmFsdWUpOworCisJaWYgKHdWYWx1 ZSAhPSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOwor CisJZXAtPnZodWItPndha2V1cF9lbiA9IGlzX3NldDsKKwlFUERCRyhlcCwgIkh1YiByZW1vdGUg d2FrZXVwICVzXG4iLAorCSAgICAgIGlzX3NldCA/ICJlbmFibGVkIiA6ICJkaXNhYmxlZCIpOwor CisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHVi X2VwX2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgICB1MTYgd0luZGV4LCB1 MTYgd1ZhbHVlLAorCQkJCSAgIGJvb2wgaXNfc2V0KQoreworCWludCBlcF9udW07CisJdTMyIHJl ZzsKKworCWVwX251bSA9IHdJbmRleCAmIFVTQl9FTkRQT0lOVF9OVU1CRVJfTUFTSzsKKwlFUERC RyhlcCwgIiVzX0ZFQVRVUkUoZXAlZCB2YWw9JTAyeClcbiIsCisJICAgICAgaXNfc2V0ID8gIlNF VCIgOiAiQ0xFQVIiLCBlcF9udW0sIHdWYWx1ZSk7CisKKwlpZiAoZXBfbnVtID4gMSkKKwkJcmV0 dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKHdWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKGVwX251bSA9PSAwKQorCQlyZXR1cm4gc3RkX3Jl cV9jb21wbGV0ZTsKKworCUVQREJHKGVwLCAiJXMgc3RhbGwgb24gRVAgMVxuIiwKKwkgICAgICBp c19zZXQgPyAic2V0dGluZyIgOiAiY2xlYXJpbmciKTsKKworCWVwLT52aHViLT5lcDFfc3RhbGxl ZCA9IGlzX3NldDsKKwlyZWcgPSByZWFkbChlcC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9D VFJMKTsKKwlpZiAoaXNfc2V0KSB7CisJCXJlZyB8PSBWSFVCX0VQMV9DVFJMX1NUQUxMOworCX0g ZWxzZSB7CisJCXJlZyAmPSB+VkhVQl9FUDFfQ1RSTF9TVEFMTDsKKwkJcmVnIHw9IFZIVUJfRVAx X0NUUkxfUkVTRVRfVE9HR0xFOworCX0KKwl3cml0ZWwocmVnLCBlcC0+dmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQMV9DVFJMKTsKKworCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX3JlcF9kZXNjKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkgICAg IHU4IGRlc2NfdHlwZSwgdTE2IGxlbikKK3sKKwlzaXplX3QgZHNpemU7CisKKwlFUERCRyhlcCwg IkdFVF9ERVNDUklQVE9SKHR5cGU6JWQpXG4iLCBkZXNjX3R5cGUpOworCisJLyoKKwkgKiBDb3B5 IGZpcnN0IHRvIEVQIGJ1ZmZlciBhbmQgc2VuZCBmcm9tIHRoZXJlLCBzbworCSAqIHdlIGNhbiBk byBzb21lIGluLXBsYWNlIHBhdGNoaW5nIGlmIG5lZWRlZC4gV2Uga25vdworCSAqIHRoZSBFUCBi dWZmZXIgaXMgYmlnIGVub3VnaCBidXQgZW5zdXJlIHRoYXQgZG9lc24ndAorCSAqIGNoYW5nZS4g V2UgZG8gdGhhdCBub3cgcmF0aGVyIHRoYW4gbGF0ZXIgYWZ0ZXIgd2UKKwkgKiBoYXZlIGNoZWNr ZWQgc2l6ZXMgZXRjLi4uIHRvIGF2b2lkIGEgZ2NjIGJ1ZyB3aGVyZQorCSAqIGl0IHRoaW5rcyBs ZW4gaXMgY29uc3RhbnQgYW5kIGJhcmZzIGFib3V0IHJlYWQKKwkgKiBvdmVyZmxvd3MgaW4gbWVt Y3B5LgorCSAqLworCXN3aXRjaChkZXNjX3R5cGUpIHsKKwljYXNlIFVTQl9EVF9ERVZJQ0U6CisJ CWRzaXplID0gVVNCX0RUX0RFVklDRV9TSVpFOworCQltZW1jcHkoZXAtPmJ1ZiwgJmFzdF92aHVi X2Rldl9kZXNjLCBkc2l6ZSk7CisJCUJVSUxEX0JVR19PTihkc2l6ZSA+IHNpemVvZihhc3Rfdmh1 Yl9kZXZfZGVzYykpOworCQlCVUlMRF9CVUdfT04oVVNCX0RUX0RFVklDRV9TSVpFID49IEFTVF9W SFVCX0VQMF9NQVhfUEFDS0VUKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRFRfQ09ORklHOgorCQlk c2l6ZSA9IEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFOworCQltZW1jcHkoZXAtPmJ1ZiwgJmFzdF92 aHViX2NvbmZfZGVzYywgZHNpemUpOworCQlCVUlMRF9CVUdfT04oZHNpemUgPiBzaXplb2YoYXN0 X3ZodWJfY29uZl9kZXNjKSk7CisJCUJVSUxEX0JVR19PTihBU1RfVkhVQl9DT05GX0RFU0NfU0la RSA+PSBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCk7CisJCWJyZWFrOworCWNhc2UgVVNCX0RUX0hV QjoKKwkJZHNpemUgPSBBU1RfVkhVQl9IVUJfREVTQ19TSVpFOworCQltZW1jcHkoZXAtPmJ1Ziwg JmFzdF92aHViX2h1Yl9kZXNjLCBkc2l6ZSk7CisJCUJVSUxEX0JVR19PTihkc2l6ZSA+IHNpemVv Zihhc3Rfdmh1Yl9odWJfZGVzYykpOworCUJVSUxEX0JVR19PTihBU1RfVkhVQl9IVUJfREVTQ19T SVpFID49IEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJfQorCisJLyogQ3JvcCByZXF1ZXN0ZWQgbGVuZ3RoICov CisJaWYgKGxlbiA+IGRzaXplKQorCQlsZW4gPSBkc2l6ZTsKKworCS8qIFBhdGNoIGl0IGlmIGZv cmNpbmcgVVNCMSAqLworCWlmIChkZXNjX3R5cGUgPT0gVVNCX0RUX0RFVklDRSAmJiBlcC0+dmh1 Yi0+Zm9yY2VfdXNiMSkKKwkJYXN0X3ZodWJfcGF0Y2hfZGV2X2Rlc2NfdXNiMShlcC0+YnVmKTsK KworCS8qIFNob290IGl0IGZyb20gdGhlIEVQIGJ1ZmZlciAqLworCXJldHVybiBhc3Rfdmh1Yl9y ZXBseShlcCwgTlVMTCwgbGVuKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9yZXBfc3RyaW5n KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkgICAgICAgdTggc3RyaW5nX2lkLCB1MTYgbGFu Z19pZCwKKwkJCSAgICAgICB1MTYgbGVuKQoreworCWludCByYyA9IHVzYl9nYWRnZXRfZ2V0X3N0 cmluZyAoJmFzdF92aHViX3N0cmluZ3MsIHN0cmluZ19pZCwgZXAtPmJ1Zik7CisKKwkvKgorCSAq IFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxlc3Mgd2UgcHV0IHRvbyBiaWcgc3RyaW5ncyBp bgorCSAqIHRoZSBhcnJheSBhYm92ZQorCSAqLworCUJVR19PTihyYyA+PSBBU1RfVkhVQl9FUDBf TUFYX1BBQ0tFVCk7CisKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwor CS8qIFNob290IGl0IGZyb20gdGhlIEVQIGJ1ZmZlciAqLworCXJldHVybiBhc3Rfdmh1Yl9yZXBs eShlcCwgTlVMTCwgbWluX3QodTE2LCByYywgbGVuKSk7Cit9CisKK2VudW0gc3RkX3JlcV9yYyBh c3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJIHN0 cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBl cC0+dmh1YjsKKwl1MTYgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2 X3RvX2NwdShjcnEtPndWYWx1ZSk7CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgp OworCXdMZW5ndGggPSBsZTE2X3RvX2NwdShjcnEtPndMZW5ndGgpOworCisJLyogRmlyc3QgcGFj a2V0LCBncmFiIHNwZWVkICovCisJaWYgKHZodWItPnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dO KSB7CisJCXUzMiB1c3RhdCA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9VU0JTVFMpOwor CQlpZiAodXN0YXQgJiBWSFVCX1VTQlNUU19ISVNQRUVEKQorCQkJdmh1Yi0+c3BlZWQgPSBVU0Jf U1BFRURfSElHSDsKKwkJZWxzZQorCQkJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKKwkJ VURDREJHKHZodWIsICJVU0Igc3RhdHVzPSUwOHggc3BlZWQ9JXNcbiIsIHVzdGF0LAorCQkgICAg ICAgdmh1Yi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJR0ggPyAiaGlnaCIgOiAiZnVsbCIpOworCX0K KworCXN3aXRjaCAoKGNycS0+YlJlcXVlc3RUeXBlIDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgewor CQkvKiBTRVRfQUREUkVTUyAqLworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VU X0FERFJFU1M6CisJCUVQREJHKGVwLCAiU0VUX0FERFJFU1M6IEdvdCBhZGRyZXNzICV4XG4iLCB3 VmFsdWUpOworCQl3cml0ZWwod1ZhbHVlLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ09ORik7CisJ CXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCisJCS8qIEdFVF9TVEFUVVMgKi8KKwljYXNlIERl dmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJf ZGV2X3N0YXR1cyhlcCwgd0luZGV4LCB3VmFsdWUpOworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8 IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwg MCwgMCk7CisJY2FzZSBFbmRwb2ludFJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJl dHVybiBhc3Rfdmh1Yl9odWJfZXBfc3RhdHVzKGVwLCB3SW5kZXgsIHdWYWx1ZSk7CisKKwkJLyog U0VUL0NMRUFSX0ZFQVRVUkUgKi8KKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NF VF9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfaHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgs IHdWYWx1ZSwgdHJ1ZSk7CisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9G RUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfaHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdW YWx1ZSwgZmFsc2UpOworCWNhc2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVB VFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2h1Yl9lcF9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1 ZSwgdHJ1ZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRV UkU6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZXBfZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUs IGZhbHNlKTsKKworCQkvKiBHRVQvU0VUX0NPTkZJR1VSQVRJT04gKi8KKwljYXNlIERldmljZVJl cXVlc3QgfCBVU0JfUkVRX0dFVF9DT05GSUdVUkFUSU9OOgorCQlyZXR1cm4gYXN0X3ZodWJfc2lt cGxlX3JlcGx5KGVwLCAxKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9D T05GSUdVUkFUSU9OOgorCQlpZiAod1ZhbHVlICE9IDEpCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFs bDsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX0RFU0NSSVBUT1IgKi8K KwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9ERVNDUklQVE9SOgorCQlzd2l0Y2gg KHdWYWx1ZSA+PiA4KSB7CisJCWNhc2UgVVNCX0RUX0RFVklDRToKKwkJY2FzZSBVU0JfRFRfQ09O RklHOgorCQkJcmV0dXJuIGFzdF92aHViX3JlcF9kZXNjKGVwLCB3VmFsdWUgPj4gOCwKKwkJCQkJ CSB3TGVuZ3RoKTsKKwkJY2FzZSBVU0JfRFRfU1RSSU5HOgorCQkJcmV0dXJuIGFzdF92aHViX3Jl cF9zdHJpbmcoZXAsIHdWYWx1ZSAmIDB4ZmYsCisJCQkJCQkgICB3SW5kZXgsIHdMZW5ndGgpOwor CQl9CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJCS8qIEdFVC9TRVRfSU5URVJGQUNFICov CisJY2FzZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JFUV9HRVRfSU5URVJGQUNFOgorCQlyZXR1cm4g YXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAwKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBV U0JfUkVRX1NFVF9JTlRFUkZBQ0U6CisJCWlmICh3VmFsdWUgIT0gMCB8fCB3SW5kZXggIT0gMCkK KwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9 CisJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3VwZGF0 ZV9odWJfZXAxKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHBv cnQpCit7CisJLyogVXBkYXRlIEhXIEVQMSByZXNwb25zZSAqLworCXUzMiByZWcgPSByZWFkbCh2 aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX1NUU19DSEcpOworCXUzMiBwbWFzayA9ICgxIDw8IChw b3J0ICsgMSkpOworCWlmICh2aHViLT5wb3J0c1twb3J0XS5jaGFuZ2UpCisJCXJlZyB8PSBwbWFz azsKKwllbHNlCisJCXJlZyAmPSB+cG1hc2s7CisJd3JpdGVsKHJlZywgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQMV9TVFNfQ0hHKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfY2hhbmdlX3Bv cnRfc3RhdChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBv cnQsCisJCQkJICAgICAgdTE2IGNscl9mbGFncywKKwkJCQkgICAgICB1MTYgc2V0X2ZsYWdzLAor CQkJCSAgICAgIGJvb2wgc2V0X2MpCit7CisJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1 Yi0+cG9ydHNbcG9ydF07CisJdTE2IHByZXY7CisKKwkvKiBVcGRhdGUgcG9ydCBzdGF0dXMgKi8K KwlwcmV2ID0gcC0+c3RhdHVzOworCXAtPnN0YXR1cyA9IChwcmV2ICYgfmNscl9mbGFncykgfCBz ZXRfZmxhZ3M7CisJRERCRygmcC0+ZGV2LCAicG9ydCAlZCBzdGF0dXMgJTA0eCAtPiAlMDR4IChD PSVkKVxuIiwKKwkgICAgIHBvcnQgKyAxLCBwcmV2LCBwLT5zdGF0dXMsIHNldF9jKTsKKworCS8q IFVwZGF0ZSBjaGFuZ2UgYml0cyBpZiBuZWVkZWQgKi8KKwlpZiAoc2V0X2MpIHsKKwkJdTE2IGNo ZyA9IHAtPnN0YXR1cyBeIHByZXY7CisKKwkJLyogT25seSB0aGVzZSBhcmUgcmVsZXZhbnQgZm9y IGNoYW5nZSAqLworCQljaGcgJj0gVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gfAorCQkgICAg ICAgVVNCX1BPUlRfU1RBVF9DX0VOQUJMRSB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VT UEVORCB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfT1ZFUkNVUlJFTlQgfAorCQkgICAgICAg VVNCX1BPUlRfU1RBVF9DX1JFU0VUIHwKKwkJICAgICAgIFVTQl9QT1JUX1NUQVRfQ19MMTsKKwkJ cC0+Y2hhbmdlIHw9IGNoZzsKKworCQlhc3Rfdmh1Yl91cGRhdGVfaHViX2VwMSh2aHViLCBwb3J0 KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3NlbmRfaG9zdF93YWtldXAoc3RydWN0 IGFzdF92aHViICp2aHViKQoreworCXUzMiByZWcgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZI VUJfQ1RSTCk7CisJVURDREJHKHZodWIsICJXYWtpbmcgdXAgaG9zdCAhXG4iKTsKKwlyZWcgfD0g VkhVQl9DVFJMX01BTlVBTF9SRU1PVEVfV0FLRVVQOworCXdyaXRlbChyZWcsIHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9DVFJMKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1 Y3QgYXN0X3ZodWIgKnZodWIsCisJCQkgICAgIHVuc2lnbmVkIGludCBwb3J0LCBib29sIG9uKQor eworCWlmIChvbikKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LCAwLAor CQkJCQkgIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElPTiwgdHJ1ZSk7CisJZWxzZQorCQlhc3Rfdmh1 Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIHBvcnQsCisJCQkJCSAgVVNCX1BPUlRfU1RBVF9DT05O RUNUSU9OIHwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX0VOQUJMRSwKKwkJCQkJICAwLCB0cnVlKTsK KworCS8qCisJICogSWYgdGhlIGh1YiBpcyBzZXQgdG8gd2FrdXAgdGhlIGhvc3Qgb24gY29ubmVj dGlvbiBldmVudHMKKwkgKiB0aGVuIHNlbmQgYSB3YWtldXAuCisJICovCisJaWYgKHZodWItPndh a2V1cF9lbikKKwkJYXN0X3ZodWJfc2VuZF9ob3N0X3dha2V1cCh2aHViKTsKK30KKworc3RhdGlj IHZvaWQgYXN0X3ZodWJfd2FrZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlz dHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJICAgICBzdHJ1 Y3QgYXN0X3ZodWIsCisJCQkJCSAgICAgd2FrZV93b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdz OworCXVuc2lnbmVkIGludCBpOworCisJLyoKKwkgKiBXYWtlIGFsbCBzbGVlcGluZyBwb3J0cy4g SWYgYSBwb3J0IGlzIHN1c3BlbmRlZCBieQorCSAqIHRoZSBob3N0IHN1c3BlbmQgKHdpdGhvdXQg ZXhwbGljaXQgc3RhdGUgc3VzcGVuZCksCisJICogd2UgbGV0IHRoZSBub3JtYWwgaG9zdCB3YWtl IHBhdGggZGVhbCB3aXRoIGl0IGxhdGVyLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHVi LT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9QT1JUUzsgaSsr KSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW2ldOworCisJCWlm ICghKHAtPnN0YXR1cyAmIFVTQl9QT1JUX1NUQVRfU1VTUEVORCkpCisJCQljb250aW51ZTsKKwkJ YXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBpLAorCQkJCQkgIFVTQl9QT1JUX1NUQVRf U1VTUEVORCwKKwkJCQkJICAwLCB0cnVlKTsKKwkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2 KTsKKwl9CisJYXN0X3ZodWJfc2VuZF9ob3N0X3dha2V1cCh2aHViKTsKKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3dh a2VfYWxsKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwkvKgorCSAqIEEgZGV2aWNlIGlzIHRy eWluZyB0byB3YWtlIHRoZSB3b3JsZCwgYmVjYXVzZSB0aGlzCisJICogY2FuIHJlY3Vyc2UgaW50 byB0aGUgZGV2aWNlLCB3ZSBicmVhayB0aGUgY2FsbCBjaGFpbgorCSAqIHVzaW5nIGEgd29yayBx dWV1ZQorCSAqLworCXNjaGVkdWxlX3dvcmsoJnZodWItPndha2Vfd29yayk7Cit9CisKK3N0YXRp YyB2b2lkIGFzdF92aHViX3BvcnRfcmVzZXQoc3RydWN0IGFzdF92aHViICp2aHViLCB1OCBwb3J0 KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW3BvcnRdOworCXUx NiBzZXQsIGNsciwgc3BlZWQ7CisKKwkvKiBGaXJzdCBtYXJrIGRpc2FibGVkICovCisJYXN0X3Zo dWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LAorCQkJCSAgVVNCX1BPUlRfU1RBVF9FTkFC TEUgfAorCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQRU5ELAorCQkJCSAgVVNCX1BPUlRfU1RBVF9S RVNFVCwKKwkJCQkgIGZhbHNlKTsKKworCWlmICghcC0+ZGV2LmRyaXZlcikKKwkJcmV0dXJuOwor CisJLyoKKwkgKiBUaGlzIHdpbGwgZWl0aGVyICJzdGFydCIgdGhlIHBvcnQgb3IgcmVzZXQgdGhl CisJICogZGV2aWNlIGlmIGFscmVhZHkgc3RhcnRlZC4uLgorCSAqLworCWFzdF92aHViX2Rldl9y ZXNldCgmcC0+ZGV2KTsKKworCS8qIEdyYWIgdGhlIHJpZ2h0IHNwZWVkICovCisJc3BlZWQgPSBw LT5kZXYuZHJpdmVyLT5tYXhfc3BlZWQ7CisJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dO IHx8IHNwZWVkID4gdmh1Yi0+c3BlZWQpCisJCXNwZWVkID0gdmh1Yi0+c3BlZWQ7CisKKwlzd2l0 Y2ggKHNwZWVkKSB7CisJY2FzZSBVU0JfU1BFRURfTE9XOgorCQlzZXQgPSBVU0JfUE9SVF9TVEFU X0xPV19TUEVFRDsKKwkJY2xyID0gVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOworCQlicmVhazsK KwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQlzZXQgPSAwOworCQljbHIgPSBVU0JfUE9SVF9TVEFU X0xPV19TUEVFRCB8CisJCQlVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQ7CisJCWJyZWFrOworCWNh c2UgVVNCX1NQRUVEX0hJR0g6CisJCXNldCA9IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJ Y2xyID0gVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVVE Q0RCRyh2aHViLCAiVW5zdXBwb3J0ZWQgc3BlZWQgJWQgd2hlbiIKKwkJICAgICAgICIgY29ubmVj dGluZyBkZXZpY2VcbiIsCisJCSAgICAgICBzcGVlZCk7CisJCXJldHVybjsKKwl9CisJY2xyIHw9 IFVTQl9QT1JUX1NUQVRfUkVTRVQ7CisJc2V0IHw9IFVTQl9QT1JUX1NUQVRfRU5BQkxFOworCisJ LyogVGhpcyBzaG91bGQgaWRlYWxseSBiZSBkZWxheWVkIC4uLiAqLworCWFzdF92aHViX2NoYW5n ZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwgY2xyLCBzZXQsIHRydWUpOworfQorCitzdGF0aWMgZW51 bSBzdGRfcmVxX3JjIGFzdF92aHViX3NldF9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2Vw ICplcCwKKwkJCQkJCSB1OCBwb3J0LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZo dWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09 IDAgfHwgcG9ydCA+IEFTVF9WSFVCX05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7 CisJcG9ydC0tOworCXAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkgewor CWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9S VF9TVEFUX0VOQUJMRSkpCisJCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwkJYXN0X3ZodWJf Y2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LAorCQkJCQkgIDAsIFVTQl9QT1JUX1NUQVRfU1VT UEVORCwKKwkJCQkJICBmYWxzZSk7CisJCWFzdF92aHViX2Rldl9zdXNwZW5kKCZwLT5kZXYpOwor CQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJ CUVQREJHKGVwLCAiUG9ydCByZXNldCAhXG4iKTsKKwkJYXN0X3ZodWJfcG9ydF9yZXNldCh2aHVi LCBwb3J0KTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFU X1BPV0VSOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9URVNUOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9J TkRJQ0FUT1I6CisJCS8qIFdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgKi8KKwkJcmV0 dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJfQorCXJldHVybiBzdGRfcmVxX3N0YWxsOworfQorCitz dGF0aWMgZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX2Nscl9wb3J0X2ZlYXR1cmUoc3RydWN0IGFz dF92aHViX2VwICplcCwKKwkJCQkJCSB1OCBwb3J0LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlm IChwb3J0ID09IDAgfHwgcG9ydCA+IEFTVF9WSFVCX05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9y ZXFfc3RhbGw7CisJcG9ydC0tOworCXAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2go ZmVhdCkgeworCWNhc2UgVVNCX1BPUlRfRkVBVF9FTkFCTEU6CisJCWFzdF92aHViX2NoYW5nZV9w b3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX0VOQUJMRSB8CisJCQkJ CSAgVVNCX1BPUlRfU1RBVF9TVVNQRU5ELCAwLAorCQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJf ZGV2X3N1c3BlbmQoJnAtPmRldik7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2Ug VVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFU X1NVU1BFTkQpKQorCQkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJCWFzdF92aHViX2NoYW5n ZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsIDAs CisJCQkJCSAgZmFsc2UpOworCQlhc3Rfdmh1Yl9kZXZfcmVzdW1lKCZwLT5kZXYpOworCQlyZXR1 cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CisJCS8qIFdl IGRvbid0IGRvIHBvd2VyIGNvbnRyb2wgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJ Y2FzZSBVU0JfUE9SVF9GRUFUX0lORElDQVRPUjoKKwkJLyogV2UgZG9uJ3QgaGF2ZSBpbmRpY2F0 b3JzICovCisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9D X0NPTk5FQ1RJT046CisJY2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCWNhc2UgVVNCX1BP UlRfRkVBVF9DX1NVU1BFTkQ6CisJY2FzZSBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgor CWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgorCQkvKiBDbGVhciBzdGF0ZS1jaGFuZ2UgZmVh dHVyZSAqLworCQlwLT5jaGFuZ2UgJj0gfigxdSA8PCAoZmVhdCAtIDE2KSk7CisJCWFzdF92aHVi X3VwZGF0ZV9odWJfZXAxKHZodWIsIHBvcnQpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsK Kwl9CisJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9CisKK3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMg YXN0X3ZodWJfZ2V0X3BvcnRfc3RhdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgICAg ICB1OCBwb3J0KQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXUxNiBz dGF0LCBjaGc7CisKKwlpZiAocG9ydCA9PSAwIHx8IHBvcnQgPiBBU1RfVkhVQl9OVU1fUE9SVFMp CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCXBvcnQtLTsKKworCXN0YXQgPSB2aHViLT5wb3J0 c1twb3J0XS5zdGF0dXM7CisJY2hnID0gdmh1Yi0+cG9ydHNbcG9ydF0uY2hhbmdlOworCisJLyog V2UgYWx3YXlzIGhhdmUgcG93ZXIgKi8KKwlzdGF0IHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisK KwlFUERCRyhlcCwgIiBwb3J0IHN0YXR1cz0lMDR4IGNoYW5nZT0lMDR4XG4iLCBzdGF0LCBjaGcp OworCisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwKKwkJCQkgICAgIHN0YXQgJiAw eGZmLAorCQkJCSAgICAgc3RhdCA+PiA4LAorCQkJCSAgICAgY2hnICYgMHhmZiwKKwkJCQkgICAg IGNoZyA+PiA4KTsKK30KKworZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1 ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJCSAgIHN0cnVjdCB1c2JfY3RybHJlcXVl c3QgKmNycSkKK3sKKwl1MTYgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBs ZTE2X3RvX2NwdShjcnEtPndWYWx1ZSk7CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5k ZXgpOworCXdMZW5ndGggPSBsZTE2X3RvX2NwdShjcnEtPndMZW5ndGgpOworCisJc3dpdGNoICgo Y3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEtPmJSZXF1ZXN0KSB7CisJY2FzZSBHZXRIdWJT dGF0dXM6CisJCUVQREJHKGVwLCAiR2V0SHViU3RhdHVzXG4iKTsKKwkJcmV0dXJuIGFzdF92aHVi X3NpbXBsZV9yZXBseShlcCwgMCwgMCwgMCwgMCk7CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlF UERCRyhlcCwgIkdldFBvcnRTdGF0dXMoJWQpXG4iLCB3SW5kZXggJiAweGZmKTsKKwkJcmV0dXJu IGFzdF92aHViX2dldF9wb3J0X3N0YXQoZXAsIHdJbmRleCAmIDB4Zik7CisJY2FzZSBHZXRIdWJE ZXNjcmlwdG9yOgorCQlpZiAod1ZhbHVlICE9IChVU0JfRFRfSFVCIDw8IDgpKQorCQkJcmV0dXJu IHN0ZF9yZXFfc3RhbGw7CisJCUVQREJHKGVwLCAiR2V0SHViRGVzY3JpcHRvciglZClcbiIsIHdJ bmRleCAmIDB4ZmYpOworCQlyZXR1cm4gYXN0X3ZodWJfcmVwX2Rlc2MoZXAsIFVTQl9EVF9IVUIs IHdMZW5ndGgpOworCWNhc2UgU2V0SHViRmVhdHVyZToKKwljYXNlIENsZWFySHViRmVhdHVyZToK KwkJRVBEQkcoZXAsICJHZXQvU2V0SHViRmVhdHVyZSglZClcbiIsIHdWYWx1ZSk7CisJCS8qIE5v IGZlYXR1cmUsIGp1c3QgY29tcGxldGUgdGhlIHJlcXVlc3RzICovCisJCWlmICh3VmFsdWUgPT0g Q19IVUJfTE9DQUxfUE9XRVIgfHwKKwkJICAgIHdWYWx1ZSA9PSBDX0hVQl9PVkVSX0NVUlJFTlQp CisJCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJ Y2FzZSBTZXRQb3J0RmVhdHVyZToKKwkJRVBEQkcoZXAsICJTZXRQb3J0RmVhdHVyZSglZCwlZClc biIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJcmV0dXJuIGFzdF92aHViX3NldF9wb3J0X2Zl YXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6 CisJCUVQREJHKGVwLCAiQ2xlYXJQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwg d1ZhbHVlKTsKKwkJcmV0dXJuIGFzdF92aHViX2Nscl9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAm IDB4Ziwgd1ZhbHVlKTsKKwlkZWZhdWx0OgorCQlFUERCRyhlcCwgIlVua25vd24gY2xhc3MgcmVx dWVzdFxuIik7CisJfQorCXJldHVybiBzdGRfcmVxX3N0YWxsOworfQorCit2b2lkIGFzdF92aHVi X2h1Yl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsK KworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1cyBzdXNwZW5kXG4iKTsKKworCWlmICh2aHViLT5zdXNw ZW5kZWQpCisJCXJldHVybjsKKworCXZodWItPnN1c3BlbmRlZCA9IHRydWU7CisKKwkvKgorCSAq IEZvcndhcmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMgd2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWly IGNvbm5lY3Rpb24gc3RhdHVzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1f UE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tp XTsKKworCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0 X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRldik7CisJfQorfQorCit2b2lkIGFzdF92aHViX2h1Yl9y ZXN1bWUoc3RydWN0IGFzdF92aHViICp2aHViKQoreworCXVuc2lnbmVkIGludCBpOworCisJVURD REJHKHZodWIsICJVU0IgYnVzIHJlc3VtZVxuIik7CisKKwlpZiAoIXZodWItPnN1c3BlbmRlZCkK KwkJcmV0dXJuOworCisJdmh1Yi0+c3VzcGVuZGVkID0gZmFsc2U7CisKKwkvKgorCSAqIEZvcndh cmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMgd2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5l Y3Rpb24gc3RhdHVzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7 IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKwor CQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJf ZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0 cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHVi LCAiVVNCIGJ1cyByZXNldFxuIik7CisKKwkvKgorCSAqIElzIHRoZSBzcGVlZCBrbm93biA/IElm IG5vdCB3ZSBkb24ndCBjYXJlLCB3ZSBhcmVuJ3QKKwkgKiBpbml0aWFsaXplZCB5ZXQgYW5kIHBv cnRzIGhhdmVuJ3QgYmVlbiBlbmFibGVkLgorCSAqLworCWlmICh2aHViLT5zcGVlZCA9PSBVU0Jf U1BFRURfVU5LTk9XTikKKwkJcmV0dXJuOworCisJLyogV2UgYXJlbid0IHN1c3BlbmRlZCBhbnlt b3JlIG9idmlvdXNseSAqLworCXZodWItPnN1c3BlbmRlZCA9IGZhbHNlOworCisJLyogTm8gc3Bl ZWQgc2V0ICovCisJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKworCS8qIFdha2V1 cCBub3QgZW5hYmxlZCBhbnltb3JlICovCisJdmh1Yi0+d2FrZXVwX2VuID0gZmFsc2U7CisKKwkv KgorCSAqIENsZWFyIGFsbCBwb3J0IHN0YXR1cywgZGlzYWJsZSBnYWRnZXRzIGFuZCAic3VzcGVu ZCIKKwkgKiB0aGVtLiBUaGV5IHdpbGwgYmUgd29rZW4gdXAgYnkgYSBwb3J0IHJlc2V0LgorCSAq LworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3Qg YXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQkvKiBPbmx5IGtlZXAgdGhl IGNvbm5lY3RlZCBmbGFnICovCisJCXAtPnN0YXR1cyAmPSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJ T047CisJCXAtPmNoYW5nZSA9IDA7CisKKwkJLyogU3VzcGVuZCB0aGUgZ2FkZ2V0IGlmIGFueSAq LworCQlhc3Rfdmh1Yl9kZXZfc3VzcGVuZCgmcC0+ZGV2KTsKKwl9CisKKwkvKiBDbGVhbnVwIEhX ICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DT05GKTsKKwl3cml0ZWwoMCwg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMKTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9S RVNFVF9UT0dHTEUgfAorCSAgICAgICBWSFVCX0VQMV9DVFJMX0VOQUJMRSwKKwkgICAgICAgdmh1 Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQMV9TVFNfQ0hHKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3Qg YXN0X3ZodWIgKnZodWIpCit7CisJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlJ TklUX1dPUksoJnZodWItPndha2Vfd29yaywgYXN0X3ZodWJfd2FrZV93b3JrKTsKK30KKwpkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmggYi9kcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0 NAppbmRleCAwMDAwMDAwMDAwMDAuLjQ0NzI3MjExYTVkMAotLS0gL2Rldi9udWxsCisrKyBiL2Ry aXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvdmh1Yi5oCkBAIC0wLDAgKzEsNTE0IEBA CisvKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsgKi8KKyNpZm5kZWYgX19BU1BF RURfVkhVQl9ICisjZGVmaW5lIF9fQVNQRUVEX1ZIVUJfSAorCisvKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVkhVQiByZWdp c3RlciBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioq KioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZQlBU1RfVkhVQl9DVFJMCQkweDAw CS8qIFJvb3QgRnVuY3Rpb24gQ29udHJvbCAmIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlB U1RfVkhVQl9DT05GCQkweDA0CS8qIFJvb3QgQ29uZmlndXJhdGlvbiBTZXR0aW5nIFJlZ2lzdGVy ICovCisjZGVmaW5lCUFTVF9WSFVCX0lFUgkJMHgwOAkvKiBJbnRlcnJ1cHQgQ3RybCBSZWdpc3Rl ciAqLworI2RlZmluZQlBU1RfVkhVQl9JU1IJCTB4MEMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdp c3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9FUF9BQ0tfSUVSCTB4MTAJLyogUHJvZ3JhbW1hYmxl IEVuZHBvaW50IFBvb2wgQUNLIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJ QVNUX1ZIVUJfRVBfTkFDS19JRVIJMHgxNAkvKiBQcm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBO QUNLIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX0FD S19JU1IJMHgxOAkvKiBQcm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBBQ0sgSW50ZXJydXB0IFN0 YXR1cyBSZWdpc3RlciAgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVBfTkFDS19JU1IJMHgxQwkvKiBQ cm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBOQUNLIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIg ICovCisjZGVmaW5lIEFTVF9WSFVCX1NXX1JFU0VUCTB4MjAJLyogRGV2aWNlIENvbnRyb2xsZXIg U29mdCBSZXNldCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfVVNCU1RTCQkw eDI0CS8qIFVTQiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVBfVE9HR0xF CTB4MjgJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgRGF0YSBUb2dnbGUgVmFsdWUgU2V0 ICovCisjZGVmaW5lIEFTVF9WSFVCX0lTT19GQUlMX0FDQwkweDJDCS8qIElzb2Nocm9ub3VzIFRy YW5zYWN0aW9uIEZhaWwgQWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0NUUkwJ MHgzMAkvKiBFbmRwb2ludCAwIENvbnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNU X1ZIVUJfRVAwX0RBVEEJMHgzNAkvKiBCYXNlIEFkZHJlc3Mgb2YgRW5kcG9pbnQgMCBJbi9PVVQg RGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX0NUUkwJMHgzOAkv KiBFbmRwb2ludCAxIENvbnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJf RVAxX1NUU19DSEcJMHgzQwkvKiBFbmRwb2ludCAxIFN0YXR1cyBDaGFuZ2UgQml0bWFwIERhdGEg Ki8KKyNkZWZpbmUgQVNUX1ZIVUJfU0VUVVAwCQkweDgwCS8qIFJvb3QgRGV2aWNlIFNldHVwIERh dGEgQnVmZmVyMCAqLworI2RlZmluZSBBU1RfVkhVQl9TRVRVUDEJCTB4ODQJLyogUm9vdCBEZXZp Y2UgU2V0dXAgRGF0YSBCdWZmZXIxICovCisKKy8qIE1haW4gY29udHJvbCByZWcgKi8KKyNkZWZp bmUgVkhVQl9DVFJMX1BIWV9DTEsJCQkoMSA8PCAzMSkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9M T09QX1RFU1QJCQkoMSA8PCAyNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0ROX1BXTgkJCSgxIDw8IDI0 KQorI2RlZmluZSBWSFVCX0NUUkxfRFBfUFdOCQkJKDEgPDwgMjMpCisjZGVmaW5lIFZIVUJfQ1RS TF9MT05HX0RFU0MJCQkoMSA8PCAxOCkKKyNkZWZpbmUgVkhVQl9DVFJMX0lTT19SU1BfQ1RSTAkJ CSgxIDw8IDE3KQorI2RlZmluZSBWSFVCX0NUUkxfU1BMSVRfSU4JCQkoMSA8PCAxNikKKyNkZWZp bmUgVkhVQl9DVFJMX0xPT1BfVF9SRVNVTFQJCQkoMSA8PCAxNSkKKyNkZWZpbmUgVkhVQl9DVFJM X0xPT1BfVF9TVFMJCQkoMSA8PCAxNCkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9CSVNUX1JFU1VM VAkJKDEgPDwgMTMpCisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlfQklTVF9DVFJMCQkJKDEgPDwgMTIp CisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlfUkVTRVRfRElTCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZI VUJfQ1RSTF9TRVRfVEVTVF9NT0RFKHgpCQkoKHgpIDw8IDgpCisjZGVmaW5lIFZIVUJfQ1RSTF9N QU5VQUxfUkVNT1RFX1dBS0VVUAkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVQl9DVFJMX0FVVE9fUkVN T1RFX1dBS0VVUAkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9DVFJMX0NMS19TVE9QX1NVU1BFTkQJ CSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfQ1RSTF9GVUxMX1NQRUVEX09OTFkJCSgxIDw8IDEpCisj ZGVmaW5lIFZIVUJfQ1RSTF9VUFNUUkVBTV9DT05ORUNUCQkoMSA8PCAwKQorCisvKiBJRVIgJiBJ U1IgKi8KKyNkZWZpbmUgVkhVQl9JUlFfVVNCX0NNRF9ERUFETE9DSwkJKDEgPDwgMTgpCisjZGVm aW5lIFZIVUJfSVJRX0VQX1BPT0xfTkFLCQkJKDEgPDwgMTcpCisjZGVmaW5lIFZIVUJfSVJRX0VQ X1BPT0xfQUNLX1NUQUxMCQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFNQkJCSgx IDw8IDEzKQorI2RlZmluZSBWSFVCX0lSUV9ERVZJQ0U0CQkJKDEgPDwgMTIpCisjZGVmaW5lIFZI VUJfSVJRX0RFVklDRTMJCQkoMSA8PCAxMSkKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFMgkJCSgx IDw8IDEwKQorI2RlZmluZSBWSFVCX0lSUV9ERVZJQ0UxCQkJKDEgPDwgOSkKKyNkZWZpbmUgVkhV Ql9JUlFfQlVTX1JFU1VNRQkJCSgxIDw8IDgpCisjZGVmaW5lIFZIVUJfSVJRX0JVU19TVVNQRU5E IAkJCSgxIDw8IDcpCisjZGVmaW5lIFZIVUJfSVJRX0JVU19SRVNFVCAJCQkoMSA8PCA2KQorI2Rl ZmluZSBWSFVCX0lSUV9IVUJfRVAxX0lOX0RBVEFfQUNLCQkoMSA8PCA1KQorI2RlZmluZSBWSFVC X0lSUV9IVUJfRVAwX0lOX0RBVEFfTkFLCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0lSUV9IVUJf RVAwX0lOX0FDS19TVEFMTAkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9PVVRf TkFLCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwJCSgx IDw8IDEpCisjZGVmaW5lIFZIVUJfSVJRX0hVQl9FUDBfU0VUVVAJCQkoMSA8PCAwKQorI2RlZmlu ZSBWSFVCX0lSUV9BQ0tfQUxMCQkJMHgxZmYKKworLyogU1cgcmVzZXQgcmVnICovCisjZGVmaW5l IFZIVUJfU1dfUkVTRVRfRVBfUE9PTAkJCSgxIDw8IDkpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRf RE1BX0NPTlRST0xMRVIJCSgxIDw8IDgpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFNQkJ CSgxIDw8IDUpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFNAkJCSgxIDw8IDQpCisjZGVm aW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMwkJCSgxIDw8IDMpCisjZGVmaW5lIFZIVUJfU1dfUkVT RVRfREVWSUNFMgkJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMQkJCSgx IDw8IDEpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfUk9PVF9IVUIJCQkoMSA8PCAwKQorI2RlZmlu ZSBWSFVCX1NXX1JFU0VUX0FMTAkJCShWSFVCX1NXX1JFU0VUX0VQX1BPT0wgfCBcCisJCQkJCQkg VkhVQl9TV19SRVNFVF9ETUFfQ09OVFJPTExFUiB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RF VklDRTUgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9ERVZJQ0U0IHwgXAorCQkJCQkJIFZIVUJf U1dfUkVTRVRfREVWSUNFMyB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTIgfCBcCisJ CQkJCQkgVkhVQl9TV19SRVNFVF9ERVZJQ0UxIHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfUk9P VF9IVUIpCisvKiBFUCBBQ0svTkFDSyBJUlEgbWFza3MgKi8KKyNkZWZpbmUgVkhVQl9FUF9JUlEo bikJCQkJKDEgPDwgKG4pKQorI2RlZmluZSBWSFVCX0VQX0lSUV9BTEwJCQkJMHg3ZmZmCS8qIDE1 IEVQcyAqLworCisvKiBVU0Igc3RhdHVzIHJlZyAqLworI2RlZmluZSBWSFVCX1VTQlNUU19ISVNQ RUVECQkJKDEgPDwgMjcpCisKKy8qIEVQIHRvZ2dsZSAqLworI2RlZmluZSBWSFVCX0VQX1RPR0dM RV9WQUxVRQkJCSgxIDw8IDgpCisjZGVmaW5lIFZIVUJfRVBfVE9HR0xFX1NFVF9FUE5VTSh4KQkJ KCh4KSAmIDB4MWYpCisKKy8qIEhVQiBFUDAgY29udHJvbCAqLworI2RlZmluZSBWSFVCX0VQMF9D VFJMX1NUQUxMCQkJKDEgPDwgMCkKKyNkZWZpbmUgVkhVQl9FUDBfVFhfQlVGRl9SRFkJCQkoMSA8 PCAxKQorI2RlZmluZSBWSFVCX0VQMF9SWF9CVUZGX1JEWQkJCSgxIDw8IDIpCisjZGVmaW5lIFZI VUJfRVAwX1JYX0xFTih4KQkJCSgoKHgpID4+IDE2KSAmIDB4N2YpCisjZGVmaW5lIFZIVUJfRVAw X1NFVF9UWF9MRU4oeCkJCQkoKCh4KSAmIDB4N2YpIDw8IDgpCisKKy8qIEhVQiBFUDEgY29udHJv bCAqLworI2RlZmluZSBWSFVCX0VQMV9DVFJMX1JFU0VUX1RPR0dMRQkJKDEgPDwgMikKKyNkZWZp bmUgVkhVQl9FUDFfQ1RSTF9TVEFMTAkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfRVAxX0NUUkxf RU5BQkxFCQkJKDEgPDwgMCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBlci1kZXZpY2UgcmVn aXN0ZXIgZGVmaW5pdGlvbnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFTVF9WSFVC X0RFVl9FTl9DVFJMCQkweDAwCisjZGVmaW5lIEFTVF9WSFVCX0RFVl9JU1IJCTB4MDQKKyNkZWZp bmUgQVNUX1ZIVUJfREVWX0VQMF9DVFJMCQkweDA4CisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FUDBf REFUQQkJMHgwYworCisvKiBEZXZpY2UgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9E RVZfRU5fU0VUX0FERFIoeCkJCQkoKHgpIDw8IDgpCisjZGVmaW5lIFZIVUJfREVWX0VOX0FERFJf TUFTSwkJCSgoMHhmZikgPDwgOCkKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX05BS19JUlFFTgkJ KDEgPDwgNikKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX0lOX0FDS19JUlFFTgkJKDEgPDwgNSkK KyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX09VVF9OQUtfSVJRRU4JCSgxIDw8IDQpCisjZGVmaW5l IFZIVUJfREVWX0VOX0VQMF9PVVRfQUNLX0lSUUVOCQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0RF Vl9FTl9FUDBfU0VUVVBfSVJRRU4JCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfREVWX0VOX1NQRUVE X1NFTF9ISUdICQkoMSA8PCAxKQorI2RlZmluZSBWSFVCX0RFVl9FTl9FTkFCTEVfUE9SVAkJCSgx IDw8IDApCisKKy8qIEludGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQ MF9JTl9EQVRBX05BQ0sJCSgxIDw8IDQpCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfSU5fQUNL X1NUQUxMCQkoMSA8PCAzKQorI2RlZmluZSBWSFVWX0RFVl9JUlFfRVAwX09VVF9EQVRBX05BQ0sJ CSgxIDw8IDIpCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfT1VUX0FDS19TVEFMTAkJKDEgPDwg MSkKKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9TRVRVUAkJCSgxIDw8IDApCisKKy8qIENvbnRy b2wgYml0cy4KKyAqCisgKiBOb3RlOiBUaGUgZHJpdmVyIHJlbGllcyBvbiB0aGUgYnVsayBvZiB0 aG9zZSBiaXRzCisgKiAgICAgICBtYXRjaGluZyBjb3JyZXNwb25kaW5nIHZIdWIgRVAwIGNvbnRy b2wgYml0cworICovCisjZGVmaW5lIFZIVUJfREVWX0VQMF9DVFJMX1NUQUxMCQkJVkhVQl9FUDBf Q1RSTF9TVEFMTAorI2RlZmluZSBWSFVCX0RFVl9FUDBfVFhfQlVGRl9SRFkJCVZIVUJfRVAwX1RY X0JVRkZfUkRZCisjZGVmaW5lIFZIVUJfREVWX0VQMF9SWF9CVUZGX1JEWQkJVkhVQl9FUDBfUlhf QlVGRl9SRFkKKyNkZWZpbmUgVkhVQl9ERVZfRVAwX1JYX0xFTih4KQkJCVZIVUJfRVAwX1JYX0xF Tih4KQorI2RlZmluZSBWSFVCX0RFVl9FUDBfU0VUX1RYX0xFTih4KQkJVkhVQl9FUDBfU0VUX1RY X0xFTih4KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBlci1lbmRwb2ludCByZWdpc3Rl ciBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgor ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVNUX1ZI VUJfRVBfQ09ORklHCQkweDAwCisjZGVmaW5lIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUCQkweDA0 CisjZGVmaW5lIEFTVF9WSFVCX0VQX0RFU0NfQkFTRQkJMHgwOAorI2RlZmluZSBBU1RfVkhVQl9F UF9ERVNDX1NUQVRVUwkJMHgwQworCisvKiBFUCBjb25maWcgcmVnICovCisjZGVmaW5lIFZIVUJf RVBfQ0ZHX1NFVF9NQVhfUEtUKHgpCSgoKHgpICYgMHgzZmYpIDw8IDE2KQorI2RlZmluZSBWSFVC X0VQX0NGR19BVVRPX0RBVEFfRElTQUJMRQkoMSA8PCAxMykKKyNkZWZpbmUgVkhVQl9FUF9DRkdf U1RBTExfQ1RSTAkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0oeCkJ KCgoeCkgJiAweGYpIDw8IDgpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9UWVBFKHgpCQkoKHgp IDw8IDUpCisjZGVmaW5lICAgRVBfVFlQRV9PRkYJCQkwCisjZGVmaW5lICAgRVBfVFlQRV9CVUxL CQkJMQorI2RlZmluZSAgIEVQX1RZUEVfSU5UCQkJMgorI2RlZmluZSAgIEVQX1RZUEVfSVNPCQkJ MworI2RlZmluZSBWSFVCX0VQX0NGR19ESVJfT1VUCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0VQ X0NGR19TRVRfREVWKHgpCQkoKHgpIDw8IDEpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX0VOQUJMRQkJ KDEgPDwgMCkKKworLyogRVAgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9FUF9ETUFfUFJP Q19TVEFUVVMoeCkJKCgoeCkgPj4gNCkgJiAweGYpCisjZGVmaW5lICAgRVBfRE1BX1BST0NfUlhf SURMRQkJMAorI2RlZmluZSAgIEVQX0RNQV9QUk9DX1RYX0lETEUJCTgKKyNkZWZpbmUgVkhVQl9F UF9ETUFfSU5fTE9OR19NT0RFCSgxIDw8IDMpCisjZGVmaW5lIFZIVUJfRVBfRE1BX09VVF9DT05U SUdfTU9ERQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0VQX0RNQV9DVFJMX1JFU0VUCQkoMSA8PCAy KQorI2RlZmluZSBWSFVCX0VQX0RNQV9TSU5HTEVfU1RBR0UJKDEgPDwgMSkKKyNkZWZpbmUgVkhV Ql9FUF9ETUFfREVTQ19NT0RFCQkoMSA8PCAwKQorCisvKiBFUCBETUEgc3RhdHVzICovCisjZGVm aW5lIFZIVUJfRVBfRE1BX1NFVF9UWF9TSVpFKHgpCSgoeCkgPDwgMTYpCisjZGVmaW5lIFZIVUJf RVBfRE1BX1RYX1NJWkUoeCkJCSgoKHgpID4+IDE2KSAmIDB4N2ZmKQorI2RlZmluZSBWSFVCX0VQ X0RNQV9SUFRSKHgpCQkoKCh4KSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NF VF9SUFRSKHgpCQkoKCh4KSAmIDB4ZmYpIDw8IDgpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9D UFVfV1BUUih4KQkoeCkKKyNkZWZpbmUgVkhVQl9FUF9ETUFfU0lOR0xFX0tJQ0sJCSgxIDw8IDAp IC8qIFdQVFIgPSAxIGZvciBzaW5nbGUgbW9kZSAqLworCisvKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERNQSBkZXNj cmlwdG9ycyBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgor ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIERlc2MgVzEgSU4gKi8KKyNk ZWZpbmUgVkhVQl9EU0MxX0lOX0lOVEVSUlVQVAkJKDEgPDwgMzEpCisjZGVmaW5lIFZIVUJfRFND MV9JTl9TUElEX0RBVEEwCQkoMCA8PCAxNCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NQSURfREFU QTIJCSgxIDw8IDE0KQorI2RlZmluZSBWSFVCX0RTQzFfSU5fU1BJRF9EQVRBMQkJKDIgPDwgMTQp CisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX01EQVRBCQkoMyA8PCAxNCkKKyNkZWZpbmUgVkhV Ql9EU0MxX0lOX1NFVF9MRU4oeCkJCSgoeCkgJiAweGZmZikKKyNkZWZpbmUgVkhVQl9EU0MxX0lO X0xFTih4KQkJKCh4KSAmIDB4ZmZmKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAq IERhdGEgc3RydWN0dXJlcyBhbmQgbWlzYyBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCisKKyNkZWZpbmUgQVNUX1ZIVUJfTlVNX0dFTl9FUHMJMTUJLyogR2VuZXJp YyBub24tMCBFUHMgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfTlVNX1BPUlRTCTUJLyogdkh1YiBwb3J0 cyAqLworI2RlZmluZSBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVAk2NAkvKiBFUDAncyBtYXggcGFj a2V0IHNpemUgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQJMTAyNAkvKiBHZW5l cmljIEVQcyBtYXggcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfREVTQ1NfQ09VTlQJ MjU2CS8qIFVzZSAyNTYgZGVzY3JpcHRvciBtb2RlICh2YWxpZAorCQkJCQkgKiB2YWx1ZXMgYXJl IDI1NiBhbmQgMzIpCisJCQkJCSAqLworCitzdHJ1Y3QgYXN0X3ZodWI7CitzdHJ1Y3QgYXN0X3Zo dWJfZGV2OworCisvKgorICogRE1BIGRlc2NyaXB0b3IgKGdlbmVyaWMgRVBzIG9ubHksIGN1cnJl bnRseSBvbmx5IHVzZWQKKyAqIGZvciBJTiBlbmRwb2ludHMKKyAqLworc3RydWN0IGFzdF92aHVi X2Rlc2MgeworCV9fbGUzMgl3MDsKKwlfX2xlMzIJdzE7Cit9OworCisvKiBBIHRyYW5zZmVyIHJl cXVlc3QsIGVpdGhlciBjb3JlLW9yaWdpbmF0ZWQgb3IgaW50ZXJuYWwgKi8KK3N0cnVjdCBhc3Rf dmh1Yl9yZXEgeworCXN0cnVjdCB1c2JfcmVxdWVzdAlyZXE7CisJc3RydWN0IGxpc3RfaGVhZAlx dWV1ZTsKKworCS8qIEFjdHVhbCBjb3VudCB3cml0dGVuIHRvIGRlc2NyaXB0b3JzIChkZXNjIG1v ZGUgb25seSkgKi8KKwl1bnNpZ25lZCBpbnQJCWFjdF9jb3VudDsKKworCS8qCisJICogRGVzYyBu dW1iZXIgb2YgdGhlIGZpbmFsIHBhY2tldCBvciAtMS4gRm9yIG5vbi1kZXNjCisJICogbW9kZSAo b3IgZXAwKSwgYW55ID49IDAgdmFsdWUgbWVhbnMgImxhc3QgcGFja2V0IgorCSAqLworCWludAkJ CWxhc3RfZGVzYzsKKworCS8qIFJlcXVlc3QgYWN0aXZlIChwZW5kaW5nIERNQXMpICovCisJYm9v bAkJCWFjdGl2ZSAgOiAxOworCisJLyogSW50ZXJuYWwgcmVxdWVzdCAoZG9uJ3QgY2FsbCBiYWNr IGNvcmUpICovCisJYm9vbAkJCWludGVybmFsIDogMTsKK307CisjZGVmaW5lIHRvX2FzdF9yZXEo X191cmVxKSBjb250YWluZXJfb2YoX191cmVxLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCByZXEpCisK Ky8qIEN1cnJlbnQgc3RhdGUgb2YgYW4gRVAwICovCitlbnVtIGVwMF9zdGF0ZSB7CisJZXAwX3N0 YXRlX3Rva2VuLAorCWVwMF9zdGF0ZV9kYXRhLAorCWVwMF9zdGF0ZV9zdGF0dXMsCit9OworCisv KgorICogQW4gZW5kcG9pbnQsIGVpdGhlciBnZW5lcmljLCBlcDAsIGFjdHVhbCBnYWRnZXQgRVAK KyAqIG9yIGludGVybmFsIHVzZSB2aHViIEVQMC4gdmh1YiBFUDEgZG9lc24ndCBoYXZlIGFuCisg KiBhc3NvY2lhdGVkIHN0cnVjdHVyZSBhcyBpdCdzIG1vc3RseSBIVyBtYW5hZ2VkLgorICovCitz dHJ1Y3QgYXN0X3ZodWJfZXAgeworCXN0cnVjdCB1c2JfZXAJCWVwOworCisJLyogUmVxdWVzdCBx dWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisKKwkvKiBFUCBpbmRleCBpbiB0aGUg ZGV2aWNlLCAwIG1lYW5zIHRoaXMgaXMgYW4gRVAwICovCisJdW5zaWduZWQgaW50CQlkX2lkeDsK KworCS8qIERldiBwb2ludGVyIG9yIE5VTEwgZm9yIHZIdWIgRVAwICovCisJc3RydWN0IGFzdF92 aHViX2RldgkqZGV2OworCisJLyogdkh1YiBpdHNlbGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWIJCSp2 aHViOworCisJLyoKKwkgKiBETUEgYnVmZmVyIGZvciBFUDAsIGZhbGxiYWNrIERNQSBidWZmZXIg Zm9yIG1pc2FsaWduZWQKKwkgKiBPVVQgdHJhbnNmZXJzIGZvciBnZW5lcmljIEVQcworCSAqLwor CXZvaWQJCQkqYnVmOworCWRtYV9hZGRyX3QJCWJ1Zl9kbWE7CisKKwkvKiBUaGUgcmVzdCBkZXBl bmRzIG9uIHRoZSBFUCB0eXBlICovCisJdW5pb24geworCQkvKiBFUDAgKGVpdGhlciBkZXZpY2Ug b3Igdmh1YikgKi8KKwkJc3RydWN0IHsKKwkJCS8qCisJCQkgKiBFUDAgcmVnaXN0ZXJzIGFyZSAi c2ltaWxhciIgZm9yCisJCQkgKiB2SHViIGFuZCBkZXZpY2VzIGJ1dCBsb2NhdGVkIGluCisJCQkg KiBkaWZmZXJlbnQgcGxhY2VzLgorCQkJICovCisJCQl2b2lkIF9faW9tZW0JCSpjdGxzdGF0Owor CQkJdm9pZCBfX2lvbWVtCQkqc2V0dXA7CisKKwkJCS8qIEN1cnJlbnQgc3RhdGUgJiBkaXJlY3Rp b24gKi8KKwkJCWVudW0gZXAwX3N0YXRlCQlzdGF0ZTsKKwkJCWJvb2wJCQlkaXJfaW47CisKKwkJ CS8qIEludGVybmFsIHVzZSByZXF1ZXN0ICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfcmVxCXJlcTsK KwkJfSBlcDA7CisKKwkJLyogR2VuZXJpYyBlbmRwb2ludCAoYWthIEVQbikgKi8KKwkJc3RydWN0 IHsKKwkJCS8qIFJlZ2lzdGVycyAqLworCQkJdm9pZCBfX2lvbWVtICAgCQkqcmVnczsKKworCQkJ LyogSW5kZXggaW4gZ2xvYmFsIHBvb2wgKDAuLjE0KSAqLworCQkJdW5zaWduZWQgaW50CQlnX2lk eDsKKworCQkJLyogRE1BIERlc2NyaXB0b3JzICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfZGVzYwkq ZGVzY3M7CisJCQlkbWFfYWRkcl90CQlkZXNjc19kbWE7CisJCQl1bnNpZ25lZCBpbnQJCWRfbmV4 dDsKKwkJCXVuc2lnbmVkIGludAkJZF9sYXN0OworCQkJdW5zaWduZWQgaW50CQlkbWFfY29uZjsK KworCQkJLyogTWF4IGNodW5rIHNpemUgZm9yIElOIEVQcyAqLworCQkJdW5zaWduZWQgaW50CQlj aHVua19tYXg7CisKKwkJCS8qIFN0YXRlIGZsYWdzICovCisJCQlib29sCQkJaXNfaW4gOiAgMTsK KwkJCWJvb2wJCQlpc19pc28gOiAxOworCQkJYm9vbAkJCXN0YWxsZWQgOiAxOworCQkJYm9vbAkJ CXdlZGdlZCA6IDE7CisJCQlib29sCQkJZW5hYmxlZCA6IDE7CisJCQlib29sCQkJZGVzY19tb2Rl IDogMTsKKwkJfSBlcG47CisJfTsKK307CisjZGVmaW5lIHRvX2FzdF9lcChfX3VlcCkgY29udGFp bmVyX29mKF9fdWVwLCBzdHJ1Y3QgYXN0X3ZodWJfZXAsIGVwKQorCisvKiBBIGRldmljZSBhdHRh Y2hlZCB0byBhIHZIdWIgcG9ydCAqLworc3RydWN0IGFzdF92aHViX2RldiB7CisJc3RydWN0IGFz dF92aHViCQkJKnZodWI7CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisKKwkvKiBEZXZpY2UgaW5k ZXggKDAuLi40KSBhbmQgbmFtZSBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCQlpbmRleDsKKwlj b25zdCBjaGFyCQkJKm5hbWU7CisKKwkvKiBzeXNmcyBlbmNsb3N1cmUgZm9yIHRoZSBnYWRnZXQg Z3VuayAqLworCXN0cnVjdCBkZXZpY2UJCQlwb3J0X2RldjsKKworCS8qIExpbmsgdG8gZ2FkZ2V0 IGNvcmUgKi8KKwlzdHJ1Y3QgdXNiX2dhZGdldAkJZ2FkZ2V0OworCXN0cnVjdCB1c2JfZ2FkZ2V0 X2RyaXZlcgkqZHJpdmVyOworCWJvb2wJCQkJcmVnaXN0ZXJlZCA6IDE7CisJYm9vbAkJCQl3YWtl dXBfZW4gOiAxOworCWJvb2wJCQkJc3VzcGVuZGVkIDogMTsKKwlib29sCQkJCWVuYWJsZWQgOiAx OworCisJLyogRW5kcG9pbnQgc3RydWN0dXJlcyAqLworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJZXAw OworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJKmVwbnNbQVNUX1ZIVUJfTlVNX0dFTl9FUHNdOworCit9 OworI2RlZmluZSB0b19hc3RfZGV2KF9fZykgY29udGFpbmVyX29mKF9fZywgc3RydWN0IGFzdF92 aHViX2RldiwgZ2FkZ2V0KQorCisvKiBQZXIgdmh1YiBwb3J0IHN0YXRlaW5mbyBzdHJ1Y3R1cmUg Ki8KK3N0cnVjdCBhc3Rfdmh1Yl9wb3J0IHsKKwkvKiBQb3J0IHN0YXR1cyAmIHN0YXR1cyBjaGFu Z2UgcmVnaXN0ZXJzICovCisJdTE2CQkJc3RhdHVzOworCXUxNgkJCWNoYW5nZTsKKworCS8qIEFz c29jaWF0ZWQgZGV2aWNlIHNsb3QgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2CWRldjsKK307CisK Ky8qIEdsb2JhbCB2aHViIHN0cnVjdHVyZSAqLworc3RydWN0IGFzdF92aHViIHsKKwlzdHJ1Y3Qg cGxhdGZvcm1fZGV2aWNlCQkqcGRldjsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKwlpbnQJCQkJ aXJxOworCXNwaW5sb2NrX3QJCQlsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd2FrZV93b3Jr OworCXN0cnVjdCBjbGsJCQkqY2xrOworCisJLyogRVAwIERNQSBidWZmZXJzIGFsbG9jYXRlZCBp biBvbmUgY2h1bmsgKi8KKwl2b2lkCQkJCSplcDBfYnVmczsKKwlkbWFfYWRkcl90CQkJZXAwX2J1 ZnNfZG1hOworCisJLyogRVAwIG9mIHRoZSB2aHViIGl0c2VsZiAqLworCXN0cnVjdCBhc3Rfdmh1 Yl9lcAkJZXAwOworCisJLyogU3RhdGUgb2Ygdmh1YiBlcDEgKi8KKwlib29sCQkJCWVwMV9zdGFs bGVkIDogMTsKKworCS8qIFBlci1wb3J0IGluZm8gKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydAkJ cG9ydHNbQVNUX1ZIVUJfTlVNX1BPUlRTXTsKKworCS8qIEdlbmVyaWMgRVAgZGF0YSBzdHJ1Y3R1 cmVzICovCisJc3RydWN0IGFzdF92aHViX2VwCQllcG5zW0FTVF9WSFVCX05VTV9HRU5fRVBzXTsK KworCS8qIFVwc3RyZWFtIGJ1cyBpcyBzdXNwZW5kZWQgPyAqLworCWJvb2wJCQkJc3VzcGVuZGVk IDogMTsKKworCS8qIEh1YiBpdHNlbGYgY2FuIHNpZ25hbCByZW1vdGUgd2FrZXVwICovCisJYm9v bAkJCQl3YWtldXBfZW4gOiAxOworCisJLyogRm9yY2UgZnVsbCBzcGVlZCBvbmx5ICovCisJYm9v bAkJCQlmb3JjZV91c2IxIDogMTsKKworCS8qIFVwc3RyZWFtIGJ1cyBzcGVlZCBjYXB0dXJlZCBh dCBidXMgcmVzZXQgKi8KKwl1bnNpZ25lZCBpbnQJCQlzcGVlZDsKK307CisKKy8qIFN0YW5kYXJk IHJlcXVlc3QgaGFuZGxlcnMgcmVzdWx0IGNvZGVzICovCitlbnVtIHN0ZF9yZXFfcmMgeworCXN0 ZF9yZXFfc3RhbGwgPSAtMSwJLyogU3RhbGwgcmVxdWVzdGVkICovCisJc3RkX3JlcV9jb21wbGV0 ZSA9IDAsCS8qIFJlcXVlc3QgY29tcGxldGVkIHdpdGggbm8gZGF0YSAqLworCXN0ZF9yZXFfZGF0 YSA9IDEsCS8qIFJlcXVlc3QgY29tcGxldGVkIHdpdGggZGF0YSAqLworCXN0ZF9yZXFfZHJpdmVy ID0gMiwJLyogUGFzcyB0byBkcml2ZXIgcGxzICovCit9OworCisjaWZkZWYgQ09ORklHX1VTQl9H QURHRVRfVkVSQk9TRQorI2RlZmluZSBVRENWREJHKHUsIGZtdC4uLikJZGV2X2RiZygmKHUpLT5w ZGV2LT5kZXYsIGZtdCkKKworI2RlZmluZSBFUFZEQkcoZXAsIGZtdCwgLi4uKQlkbyB7CQkJXAor CWRldl9kYmcoJihlcCktPnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlczpFUCVkICIgZm10LAkJ CQlcCisJCShlcCktPmRldiA/IChlcCktPmRldi0+bmFtZSA6ICJodWIiLAlcCisJCShlcCktPmRf aWR4LCAjI19fVkFfQVJHU19fKTsJCVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRFZEQkcoZCwg Zm10LCAuLi4pCWRvIHsJCQlcCisJZGV2X2RiZygmKGQpLT52aHViLT5wZGV2LT5kZXYsCQkJXAor CQkiJXMgIiBmbXQsIChkKS0+bmFtZSwJCQlcCisJCSMjX19WQV9BUkdTX18pOwkJCQlcCisJfSB3 aGlsZSgwKQorCisjZWxzZQorI2RlZmluZSBVRENWREJHKHUsIGZtdC4uLikJZG8geyB9IHdoaWxl KDApCisjZGVmaW5lIEVQVkRCRyhlcCwgZm10LCAuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmlu ZSBEVkRCRyhkLCBmbXQsIC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIENP TkZJR19VU0JfR0FER0VUX0RFQlVHCisjZGVmaW5lIFVEQ0RCRyh1LCBmbXQuLi4pCWRldl9kYmco Jih1KS0+cGRldi0+ZGV2LCBmbXQpCisKKyNkZWZpbmUgRVBEQkcoZXAsIGZtdCwgLi4uKQlkbyB7 CQkJXAorCWRldl9kYmcoJihlcCktPnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlczpFUCVkICIg Zm10LAkJCQlcCisJCShlcCktPmRldiA/IChlcCktPmRldi0+bmFtZSA6ICJodWIiLAlcCisJCShl cCktPmRfaWR4LCAjI19fVkFfQVJHU19fKTsJCVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRERC RyhkLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJnKCYoZCktPnZodWItPnBkZXYtPmRldiwJ CQlcCisJCSIlcyAiIGZtdCwgKGQpLT5uYW1lLAkJCVwKKwkJIyNfX1ZBX0FSR1NfXyk7CQkJCVwK Kwl9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBVRENEQkcodSwgZm10Li4uKQlkbyB7IH0gd2hp bGUoMCkKKyNkZWZpbmUgRVBEQkcoZXAsIGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZp bmUgRERCRyhkLCBmbXQsIC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLyogY29yZS5j ICovCit2b2lkIGFzdF92aHViX2RvbmUoc3RydWN0IGFzdF92aHViX2VwICplcCwgc3RydWN0IGFz dF92aHViX3JlcSAqcmVxLAorCQkgICBpbnQgc3RhdHVzKTsKK3ZvaWQgYXN0X3ZodWJfbnVrZShz dHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBpbnQgc3RhdHVzKTsKK3N0cnVjdCB1c2JfcmVxdWVzdCAq YXN0X3ZodWJfYWxsb2NfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1X2VwLAorCQkJCQkgICBnZnBf dCBnZnBfZmxhZ3MpOwordm9pZCBhc3Rfdmh1Yl9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAq dV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSk7Cit2b2lkIGFzdF92aHViX2luaXRfaHco c3RydWN0IGFzdF92aHViICp2aHViKTsKKworLyogZXAwLmMgKi8KK3ZvaWQgYXN0X3ZodWJfZXAw X2hhbmRsZV9hY2soc3RydWN0IGFzdF92aHViX2VwICplcCwgYm9vbCBpbl9hY2spOwordm9pZCBh c3Rfdmh1Yl9lcDBfaGFuZGxlX3NldHVwKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOwordm9pZCBh c3Rfdmh1Yl9pbml0X2VwMChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHN0cnVjdCBhc3Rfdmh1Yl9l cCAqZXAsCisJCSAgICAgICBzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkZXYpOworaW50IGFzdF92aHVi X3JlcGx5KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGNoYXIgKnB0ciwgaW50IGxlbik7CitpbnQg X19hc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IGxlbiwg Li4uKTsKKyNkZWZpbmUgYXN0X3ZodWJfc2ltcGxlX3JlcGx5KHVkYywgLi4uKQkJCQkJICAgICAg IFwKKwlfX2FzdF92aHViX3NpbXBsZV9yZXBseSgodWRjKSwJCQkJCSAgICAgICBcCisJCQkgICAg ICAgc2l6ZW9mKCh1OFtdKSB7IF9fVkFfQVJHU19fIH0pL3NpemVvZih1OCksICAgICAgXAorCQkJ ICAgICAgIF9fVkFfQVJHU19fKQorCisvKiBodWIuYyAqLwordm9pZCBhc3Rfdmh1Yl9pbml0X2h1 YihzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpOworZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX3N0ZF9o dWJfcmVxdWVzdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgc3RydWN0IHVzYl9jdHJs cmVxdWVzdCAqY3JxKTsKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9jbGFzc19odWJfcmVxdWVz dChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0 ICpjcnEpOwordm9pZCBhc3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1Y3QgYXN0X3ZodWIgKnZo dWIsIHVuc2lnbmVkIGludCBwb3J0LAorCQkJICAgICBib29sIG9uKTsKK3ZvaWQgYXN0X3ZodWJf aHViX3N1c3BlbmQoc3RydWN0IGFzdF92aHViICp2aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3Jl c3VtZShzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpOwordm9pZCBhc3Rfdmh1Yl9odWJfcmVzZXQoc3Ry dWN0IGFzdF92aHViICp2aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3dha2VfYWxsKHN0cnVjdCBh c3Rfdmh1YiAqdmh1Yik7CisKKy8qIGRldi5jICovCitpbnQgYXN0X3ZodWJfaW5pdF9kZXYoc3Ry dWN0IGFzdF92aHViICp2aHViLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3ZvaWQgYXN0X3ZodWJfZGVs X2RldihzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X2lycShzdHJ1 Y3QgYXN0X3ZodWJfZGV2ICpkKTsKK2ludCBhc3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3Qoc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsK KworLyogZXBuLmMgKi8KK3ZvaWQgYXN0X3ZodWJfZXBuX2Fja19pcnEoc3RydWN0IGFzdF92aHVi X2VwICplcCk7Cit2b2lkIGFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoc3RydWN0IGFzdF92aHVi X2VwICplcCk7CitzdHJ1Y3QgYXN0X3ZodWJfZXAgKmFzdF92aHViX2FsbG9jX2VwbihzdHJ1Y3Qg YXN0X3ZodWJfZGV2ICpkLCB1OCBhZGRyKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X3N1c3BlbmQoc3Ry dWN0IGFzdF92aHViX2RldiAqZCk7Cit2b2lkIGFzdF92aHViX2Rldl9yZXN1bWUoc3RydWN0IGFz dF92aHViX2RldiAqZCk7Cit2b2lkIGFzdF92aHViX2Rldl9yZXNldChzdHJ1Y3QgYXN0X3ZodWJf ZGV2ICpkKTsKKworI2VuZGlmIC8qIF9fQVNQRUVEX1ZIVUJfSCAqLwo=