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: [v5,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180316004407.7826-2-benh@kernel.crashing.org> Date: Fri, 16 Mar 2018 11:44:07 +1100 To: linux-usb@vger.kernel.org Cc: Felipe Balbi , Greg KH , Joel Stanley , Andrew Jeffery , Benjamin Herrenschmidt List-ID: VGhlIEFzcGVlZCBCTUMgU29DcyBzdXBwb3J0IGEgInZpcnR1YWwgaHViIiBmdW5jdGlvbi4gSXQg cHJvdmlkZXMgc29tZQpIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBiZWhpbmQg d2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCgpUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9y IHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKaHViIHN0YW5kYXJkIHJlcXVl c3RzIGFuZCBleHBvc2luZyA1IFVEQyBnYWRnZXQgZHJpdmVycyBjb3JyZXNwb25kaW5nCnRvIHRo ZSBwb3J0cy4KClRoZSBodWIgaXRzZWxmIGhhcyBIVyBwcm92aWRlZCBkZWRpY2F0ZWQgRVAwIGFu ZCBFUDEgKHRoZSBsYXR0ZXIgZm9yCmh1YiBpbnRlcnJ1cHRzKS4gSXQgYWxzbyBoYXMgZGVkaWNh dGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgpvdGhlciBlbmRwb2ludHMsIHRoZXJlJ3Mg YSBwb29sIG9mIDE1ICJnZW5lcmljIiBlbmRwb2ludHMgdGhhdCBhcmUKc2hhcmVkIGFtb25nIHRo ZSBwb3J0cy4KClRoZSBkcml2ZXIgcmVsaWVzIG9uIG15IHByZXZpb3VzIHBhdGNoIGFkZGluZyBh ICJkaXNwb3NlIiBFUCBvcCB0bwpoYW5kbGUgRVAgYWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBF UHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFyZWQKcG9vbCBpbiB0aGUgVURDICJtYXRjaF9l cCIgY2FsbGJhY2sgYW5kIGFzc2lnbmVkIHRvIHRoZSBVREMgaW5zdGFuY2UKKGFkZGVkIHRvIHRo ZSBnYWRnZXQgZXBfbGlzdCkuCgpXaGVuIHRoZSBjb21wb3NpdGUgZHJpdmVyIGdldHMgdW5ib3Vu ZCwgdGhlIG5ldyBob29rIHdpbGwgYWxsb3cgdGhlIFVEQwp0byBjbGVhbiB0aGluZ3MgdXAgYW5k IHJldHVybiB0aG9zZSBFUHMgdG8gdGhlIHNoYXJlZCBwb29sLgoKU2lnbmVkLW9mZi1ieTogQmVu amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjUuIC0g UmVtb3ZlICNpZmRlZidzIGFuZCBoYXJkIGNvZGVkIHZhbHVlcwogICAgLSBSZW1vdmUgbW9kdWxl IHBhcmFtZXRlcnMKICAgIC0gSG9ub3IgbWF4aW11bSBzcGVlZCBkZXZpY2UtdHJlZSBwcm9wZXJ0 eQogICAgLSBSZW1vdmUgdXNlbGVzcyBsaXN0X2VtcHR5IHRlc3QKICAgIC0gQ29zbWV0aWMvc3Bh Y2VzIGZpeGVzCiAgICAtIEFkZCBTUERYIGxpY2VuY2UgaWRlbnRpZmllcnMKCnY0LiAtIEZpeCBt aXNzaW5nIHVubG9jayBhc3Rfdmh1Yl91ZGNfd2FrZXVwKCkgZXJyb3IgcGF0aAogICAgLSBNYWtl ICJpcnEiIHNpZ25lZCB0byBkZWFsIHdpdGggZXJyb3IgZnJvbSBwbGF0Zm9ybV9nZXRfaXJxCiAg ICAtIEZpeCBNYWtlZmlsZSBmb3IgbW9kdWxlIGJ1aWxkcwogICAgLSBGaXggYSBtaXNzaW5nIGVu ZGlhbiBjb252ZXJzaW9uCgp2My4gLSBSZWJhc2VkCiAgICAtIEFkZCBjbGsgc3R1ZmYKCnYyLiAt IENvc21ldGljIGZpeGVzCiAgICAtIFByb3Blcmx5ICJhbGxvY2F0ZSIgZGV2aWNlIGFkZHJlc3Nl cyBpbnN0ZWFkIG9mIHVzaW5nIGEgbmV2ZXIKICAgICAgcmVzZXQgY291bnRlcgogICAgLSBNb3Zl IC5kdHNpIHVwZGF0ZXMgdG8gYSBkaWZmZXJlbnQgcGF0Y2gKLS0tCiBkcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL0tjb25maWcgICAgICAgICAgICAgIHwgICAyICsKIGRyaXZlcnMvdXNiL2dhZGdldC91 ZGMvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9h c3BlZWQtdmh1Yi9LY29uZmlnICB8ICAgNyArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVl ZC12aHViL01ha2VmaWxlIHwgICA0ICsKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvY29yZS5jICAgfCA0MjAgKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMv YXNwZWVkLXZodWIvZGV2LmMgICAgfCA1ODEgKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYyAgICB8IDQ3OCArKysrKysrKysrKysrKysr CiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5jICAgIHwgODQzICsrKysr KysrKysrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvaHViLmMgICAgfCA4MjMgKysrKysrKysrKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL3ZodWIuaCAgIHwgNTE0ICsrKysrKysrKysrKysrKysr CiAxMCBmaWxlcyBjaGFuZ2VkLCAzNjczIGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0 NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWcKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlCiBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMK IGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rl di5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1 Yi9lcDAuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVk LXZodWIvZXBuLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL2h1Yi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi92aHViLmgKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRj L0tjb25maWcgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKaW5kZXggMDg3NWQzODQ3 NmVlLi5iODM4Y2FlYWFhYTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2Nv bmZpZworKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKQEAgLTQzOCw2ICs0Mzgs OCBAQCBjb25maWcgVVNCX0dBREdFVF9YSUxJTlgKIAkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1 bGUgY2FsbGVkICJ1ZGMteGlsaW54IiBhbmQgZm9yY2UgYWxsCiAJICBnYWRnZXQgZHJpdmVycyB0 byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxpbmtlZC4KIAorc291cmNlICJkcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL0tjb25maWciCisKICMKICMgTEFTVCAtLSBkdW1teS9lbXVsYXRl ZCBjb250cm9sbGVyCiAjCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2Vm aWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQppbmRleCBjZTg2NWIxMjlmZDYu Ljg5N2Y2NDhmM2NmMSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmls ZQorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlCkBAIC0zOSw0ICszOSw1IEBA IG9iai0kKENPTkZJR19VU0JfTVZfVTNEKQkrPSBtdl91M2RfY29yZS5vCiBvYmotJChDT05GSUdf VVNCX0dSX1VEQykJKz0gZ3JfdWRjLm8KIG9iai0kKENPTkZJR19VU0JfR0FER0VUX1hJTElOWCkJ Kz0gdWRjLXhpbGlueC5vCiBvYmotJChDT05GSUdfVVNCX1NOUF9VRENfUExBVCkgKz0gc25wc191 ZGNfcGxhdC5vCitvYmotJChDT05GSUdfVVNCX0FTUEVFRF9WSFVCKQkrPSBhc3BlZWQtdmh1Yi8K IG9iai0kKENPTkZJR19VU0JfQkRDX1VEQykJKz0gYmRjLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uZjBjZGY4OWI4NTAzCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCkBAIC0wLDAgKzEsNyBAQAorIyBTUERYLUxpY2Vuc2Ut SWRlbnRpZmllcjogR1BMLTIuMCsKK2NvbmZpZyBVU0JfQVNQRUVEX1ZIVUIKKwl0cmlzdGF0ZSAi QXNwZWVkIHZIdWIgVURDIGRyaXZlciIKKwlkZXBlbmRzIG9uIEFSQ0hfQVNQRUVEIHx8IENPTVBJ TEVfVEVTVAorCWhlbHAKKwkgIFVTQiBwZXJpcGhlcmFsIGNvbnRyb2xsZXIgZm9yIHRoZSBBc3Bl ZWQgQVNUMjUwMCBmYW1pbHkKKwkgIFNvQ3Mgc3VwcG9ydGluZyB0aGUgInZIdWIiIGZ1bmN0aW9u YWxpdHkgYW5kIFVTQjIuMApkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3Bl ZWQtdmh1Yi9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFr ZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi45ZjNhZGQ2MDVm OGUKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L01ha2VmaWxlCkBAIC0wLDAgKzEsNCBAQAorIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BM LTIuMCsKK29iai0kKENPTkZJR19VU0JfQVNQRUVEX1ZIVUIpCSs9IGFzcGVlZC12aHViLm8KK2Fz cGVlZC12aHViLXkJOj0gY29yZS5vIGVwMC5vIGVwbi5vIGRldi5vIGh1Yi5vCisKZGlmZiAtLWdp dCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvY29yZS5jIGIvZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5k ZXggMDAwMDAwMDAwMDAwLi4xMjkzNjA3ZjJmMTkKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYwpAQCAtMCwwICsxLDQyMCBAQAorLy8g U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICogYXNwZWVkLXZodWIgLS0g RHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICogY29yZS5jIC0g VG9wIGxldmVsIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRpb24K KyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1 dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJl IEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQg eW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9r ZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0 Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4 L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJu by5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQu aD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2gu aD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+ CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5j bHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKwor I2luY2x1ZGUgInZodWIuaCIKKwordm9pZCBhc3Rfdmh1Yl9kb25lKHN0cnVjdCBhc3Rfdmh1Yl9l cCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSwKKwkJICAgaW50IHN0YXR1cykKK3sKKwli b29sIGludGVybmFsID0gcmVxLT5pbnRlcm5hbDsKKworCUVQVkRCRyhlcCwgImNvbXBsZXRpbmcg cmVxdWVzdCBAJXAsIHN0YXR1cyAlZFxuIiwgcmVxLCBzdGF0dXMpOworCisJbGlzdF9kZWxfaW5p dCgmcmVxLT5xdWV1ZSk7CisKKwlpZiAocmVxLT5yZXEuc3RhdHVzID09IC1FSU5QUk9HUkVTUykK KwkJcmVxLT5yZXEuc3RhdHVzID0gc3RhdHVzOworCisJaWYgKHJlcS0+cmVxLmRtYSkgeworCQlp ZiAoIVdBUk5fT04oIWVwLT5kZXYpKQorCQkJdXNiX2dhZGdldF91bm1hcF9yZXF1ZXN0KCZlcC0+ ZGV2LT5nYWRnZXQsCisJCQkJCQkgJnJlcS0+cmVxLCBlcC0+ZXBuLmlzX2luKTsKKwkJcmVxLT5y ZXEuZG1hID0gMDsKKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXNuJ3QgYW4gaW50ZXJuYWwgRVAw IHJlcXVlc3QsIGNhbGwgdGhlIGNvcmUKKwkgKiB0byBjYWxsIHRoZSBnYWRnZXQgY29tcGxldGlv bi4KKwkgKi8KKwlpZiAoIWludGVybmFsKSB7CisJCXNwaW5fdW5sb2NrKCZlcC0+dmh1Yi0+bG9j ayk7CisJCXVzYl9nYWRnZXRfZ2l2ZWJhY2tfcmVxdWVzdCgmZXAtPmVwLCAmcmVxLT5yZXEpOwor CQlzcGluX2xvY2soJmVwLT52aHViLT5sb2NrKTsKKwl9Cit9CisKK3ZvaWQgYXN0X3ZodWJfbnVr ZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBpbnQgc3RhdHVzKQoreworCXN0cnVjdCBhc3Rfdmh1 Yl9yZXEgKnJlcTsKKworCUVQREJHKGVwLCAiTnVraW5nXG4iKTsKKworCS8qIEJld2FyZSwgbG9j ayB3aWxsIGJlIGRyb3BwZWQgJiByZXEtYWNxdWlyZWQgYnkgZG9uZSgpICovCisJd2hpbGUgKCFs aXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnkoJmVwLT5x dWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCQlhc3Rfdmh1Yl9kb25lKGVwLCBy ZXEsIHN0YXR1cyk7CisJfQorfQorCitzdHJ1Y3QgdXNiX3JlcXVlc3QgKmFzdF92aHViX2FsbG9j X3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQor eworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKworCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpy ZXEpLCBnZnBfZmxhZ3MpOworCWlmICghcmVxKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4gJnJl cS0+cmVxOworfQorCit2b2lkIGFzdF92aHViX2ZyZWVfcmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1 X2VwLCBzdHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEg KnJlcSA9IHRvX2FzdF9yZXEodV9yZXEpOworCisJa2ZyZWUocmVxKTsKK30KKworc3RhdGljIGly cXJldHVybl90IGFzdF92aHViX2lycShpbnQgaXJxLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBh c3Rfdmh1YiAqdmh1YiA9IGRhdGE7CisJaXJxcmV0dXJuX3QgaXJldCA9IElSUV9OT05FOworCXUz MiBpc3RhdDsKKworCS8qIFN0YWxlIGludGVycnVwdCB3aGlsZSB0ZWFyaW5nIGRvd24gKi8KKwlp ZiAoIXZodWItPmVwMF9idWZzKQorCQlyZXR1cm4gSVJRX05PTkU7CisKKwlzcGluX2xvY2soJnZo dWItPmxvY2spOworCisJLyogUmVhZCBhbmQgQUNLIGludGVycnVwdHMgKi8KKwlpc3RhdCA9IHJl YWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCWlmICghaXN0YXQpCisJCWdvdG8gYmFp bDsKKwl3cml0ZWwoaXN0YXQsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOworCWlyZXQgPSBJ UlFfSEFORExFRDsKKworCVVEQ1ZEQkcodmh1YiwgImlycSBzdGF0dXM9JTA4eCwgZXBfYWNrcz0l MDh4IGVwX25hY2tzPSUwOHhcbiIsCisJICAgICAgIGlzdGF0LAorCSAgICAgICByZWFkbCh2aHVi LT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUiksCisJICAgICAgIHJlYWRsKHZodWItPnJlZ3Mg KyBBU1RfVkhVQl9FUF9OQUNLX0lTUikpOworCisJLyogSGFuZGxlIGdlbmVyaWMgRVBzIGZpcnN0 ICovCisJaWYgKGlzdGF0ICYgVkhVQl9JUlFfRVBfUE9PTF9BQ0tfU1RBTEwpIHsKKwkJdTMyIGks IGVwX2Fja3MgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7CisJCXdy aXRlbChlcF9hY2tzLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7CisKKwkJZm9y IChpID0gMDsgZXBfYWNrcyAmJiBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykgeworCQkJ dTMyIG1hc2sgPSBWSFVCX0VQX0lSUShpKTsKKwkJCWlmIChlcF9hY2tzICYgbWFzaykgeworCQkJ CWFzdF92aHViX2Vwbl9hY2tfaXJxKCZ2aHViLT5lcG5zW2ldKTsKKwkJCQllcF9hY2tzICY9IH5t YXNrOworCQkJfQorCQl9CisJfQorCisJLyogSGFuZGxlIGRldmljZSBpbnRlcnJ1cHRzICovCisJ aWYgKGlzdGF0ICYgKFZIVUJfSVJRX0RFVklDRTEgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTIg fAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTMgfAorCQkgICAgIFZIVUJfSVJRX0RFVklDRTQgfAor CQkgICAgIFZIVUJfSVJRX0RFVklDRTUpKSB7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0RFVklD RTEpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1swXS5kZXYpOworCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9ERVZJQ0UyKQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+cG9ydHNb MV0uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFMykKKwkJCWFzdF92aHViX2Rl dl9pcnEoJnZodWItPnBvcnRzWzJdLmRldik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0RFVklD RTQpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1szXS5kZXYpOworCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9ERVZJQ0U1KQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+cG9ydHNb NF0uZGV2KTsKKwl9CisKKwkvKiBIYW5kbGUgdG9wLWxldmVsIHZIdWIgRVAwIGludGVycnVwdHMg Ki8KKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMIHwKKwkJICAg ICBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCB8CisJCSAgICAgVkhVQl9JUlFfSFVCX0VQ MF9TRVRVUCkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfSFVCX0VQMF9JTl9BQ0tfU1RBTEwp CisJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1Yi0+ZXAwLCB0cnVlKTsKKwkJaWYgKGlz dGF0ICYgVkhVQl9JUlFfSFVCX0VQMF9PVVRfQUNLX1NUQUxMKQorCQkJYXN0X3ZodWJfZXAwX2hh bmRsZV9hY2soJnZodWItPmVwMCwgZmFsc2UpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9IVUJf RVAwX1NFVFVQKQorCQkJYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cCgmdmh1Yi0+ZXAwKTsKKwl9 CisKKwkvKiBWYXJpb3VzIHRvcCBsZXZlbCBidXMgZXZlbnRzICovCisJaWYgKGlzdGF0ICYgKFZI VUJfSVJRX0JVU19SRVNVTUUgfAorCQkgICAgIFZIVUJfSVJRX0JVU19TVVNQRU5EIHwKKwkJICAg ICBWSFVCX0lSUV9CVVNfUkVTRVQpKSB7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0JVU19SRVNV TUUpCisJCQlhc3Rfdmh1Yl9odWJfcmVzdW1lKHZodWIpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lS UV9CVVNfU1VTUEVORCkKKwkJCWFzdF92aHViX2h1Yl9zdXNwZW5kKHZodWIpOworCQlpZiAoaXN0 YXQgJiBWSFVCX0lSUV9CVVNfUkVTRVQpCisJCQlhc3Rfdmh1Yl9odWJfcmVzZXQodmh1Yik7CisJ fQorCisgYmFpbDoKKwlzcGluX3VubG9jaygmdmh1Yi0+bG9jayk7CisJcmV0dXJuIGlyZXQ7Cit9 CisKK3ZvaWQgYXN0X3ZodWJfaW5pdF9odyhzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdTMy IGN0cmw7CisKKwlVRENEQkcodmh1YiwiKFJlKVN0YXJ0aW5nIEhXIC4uLlxuIik7CisKKwkvKiBF bmFibGUgUEhZICovCisJY3RybCA9IFZIVUJfQ1RSTF9QSFlfQ0xLIHwKKwkJVkhVQl9DVFJMX1BI WV9SRVNFVF9ESVM7CisKKyAgICAgICAvKgorCSogV2UgZG8gKk5PVCogc2V0IHRoZSBWSFVCX0NU UkxfQ0xLX1NUT1BfU1VTUEVORCBiaXQKKwkqIHRvIHN0b3AgdGhlIGxvZ2ljIGNsb2NrIGR1cmlu ZyBzdXNwZW5kIGJlY2F1c2UKKwkqIGl0IGNhdXNlcyB0aGUgcmVnaXN0ZXJzIHRvIGJlY29tZSBp bmFjY2Vzc2libGUgYW5kCisJKiB3ZSBoYXZlbid0IHlldCBmaWd1cmVkIG91dCBhIGdvb2Qgd2F5 dCB0byBicmluZyB0aGUKKwkqIGNvbnRyb2xsZXIgYmFjayBpbnRvIGxpZmUgdG8gaXNzdWUgYSB3 YWtldXAuCisJKi8KKworCS8qCisJICogU2V0IHNvbWUgSVNPICYgc3BsaXQgY29udHJvbCBiaXRz IGFjY29yZGluZyB0byBBc3BlZWQKKwkgKiByZWNvbW1lbmRhdGlvbgorCSAqCisJICogVkhVQl9D VFJMX0lTT19SU1BfQ1RSTDogV2hlbiBzZXQgdGVsbHMgdGhlIEhXIHRvIHJlc3BvbmQKKwkgKiB3 aXRoIDAgYnl0ZXMgZGF0YSBwYWNrZXQgdG8gSVNPIElOIGVuZHBvaW50cyB3aGVuIG5vIGRhdGEK KwkgKiBpcyBhdmFpbGFibGUuCisJICoKKwkgKiBWSFVCX0NUUkxfU1BMSVRfSU46IFRoaXMgbWFr ZXMgYSBTT0YgY29tcGxldGUgYSBzcGxpdCBJTgorCSAqIHRyYW5zYWN0aW9uLgorCSAqLworCWN0 cmwgfD0gVkhVQl9DVFJMX0lTT19SU1BfQ1RSTCB8IFZIVUJfQ1RSTF9TUExJVF9JTjsKKwl3cml0 ZWwoY3RybCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCXVkZWxheSgxKTsKKworCS8q IFNldCBkZXNjcmlwdG9yIHJpbmcgc2l6ZSAqLworCWlmIChBU1RfVkhVQl9ERVNDU19DT1VOVCA9 PSAyNTYpIHsKKwkJY3RybCB8PSBWSFVCX0NUUkxfTE9OR19ERVNDOworCQl3cml0ZWwoY3RybCwg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCX0gZWxzZSB7CisJCUJVSUxEX0JVR19PTihB U1RfVkhVQl9ERVNDU19DT1VOVCAhPSAzMik7CisJfQorCisJLyogUmVzZXQgYWxsIGRldmljZXMg Ki8KKwl3cml0ZWwoVkhVQl9TV19SRVNFVF9BTEwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9TV19S RVNFVCk7CisJdWRlbGF5KDEpOworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfU1df UkVTRVQpOworCisJLyogRGlzYWJsZSBhbmQgY2xlYW51cCBFUCBBQ0svTkFDSyBpbnRlcnJ1cHRz ICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKwl3cml0 ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05BQ0tfSUVSKTsKKwl3cml0ZWwoVkhVQl9F UF9JUlFfQUxMLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7CisJd3JpdGVsKFZI VUJfRVBfSVJRX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05BQ0tfSVNSKTsKKworCS8q IERlZmF1bHQgc2V0dGluZ3MgZm9yIEVQMCwgZW5hYmxlIEhXIGh1YiBFUDEgKi8KKwl3cml0ZWwo MCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMKTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RS TF9SRVNFVF9UT0dHTEUgfAorCSAgICAgICBWSFVCX0VQMV9DVFJMX0VOQUJMRSwKKwkgICAgICAg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyAr IEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKKworCS8qIENvbmZpZ3VyZSBFUDAgRE1BIGJ1ZmZlciAq LworCXdyaXRlbCh2aHViLT5lcDAuYnVmX2RtYSwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9E QVRBKTsKKworCS8qIENsZWFyIGFkZHJlc3MgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0NPTkYpOworCisJLyogUHVsbHVwIGh1YiAoYWN0aXZhdGUgb24gaG9zdCkgKi8KKwlp ZiAodmh1Yi0+Zm9yY2VfdXNiMSkKKwkJY3RybCB8PSBWSFVCX0NUUkxfRlVMTF9TUEVFRF9PTkxZ OworCisJY3RybCB8PSBWSFVCX0NUUkxfVVBTVFJFQU1fQ09OTkVDVDsKKwl3cml0ZWwoY3RybCwg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCisJLyogRW5hYmxlIHNvbWUgaW50ZXJydXB0 cyAqLworCXdyaXRlbChWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCB8CisJICAgICAgIFZI VUJfSVJRX0hVQl9FUDBfT1VUX0FDS19TVEFMTCB8CisJICAgICAgIFZIVUJfSVJRX0hVQl9FUDBf U0VUVVAgfAorCSAgICAgICBWSFVCX0lSUV9FUF9QT09MX0FDS19TVEFMTCB8CisJICAgICAgIFZI VUJfSVJRX0JVU19SRVNVTUUgfAorCSAgICAgICBWSFVCX0lSUV9CVVNfU1VTUEVORCB8CisJICAg ICAgIFZIVUJfSVJRX0JVU19SRVNFVCwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lF Uik7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZp Y2UgKnBkZXYpCit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gcGxhdGZvcm1fZ2V0X2RydmRh dGEocGRldik7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWlmICghdmh1YiB8 fCAhdmh1Yi0+cmVncykKKwkJcmV0dXJuIDA7CisKKwkvKiBSZW1vdmUgZGV2aWNlcyAqLworCWZv ciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykKKwkJYXN0X3ZodWJfZGVsX2Rl digmdmh1Yi0+cG9ydHNbaV0uZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisKKwkvKiBNYXNrICYgYWNrIGFsbCBpbnRlcnJ1cHRzICAqLworCXdyaXRlbCgw LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwl3cml0ZWwoVkhVQl9JUlFfQUNLX0FMTCwg dmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisKKwkvKiBQdWxsIGRldmljZSwgbGVhdmUgUEhZ IGVuYWJsZWQgKi8KKwl3cml0ZWwoVkhVQl9DVFJMX1BIWV9DTEsgfAorCSAgICAgICBWSFVCX0NU UkxfUEhZX1JFU0VUX0RJUywKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOwor CisJaWYgKHZodWItPmNsaykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHZodWItPmNsayk7CisK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmh1 Yi0+ZXAwX2J1ZnMpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJICBBU1Rf VkhVQl9FUDBfTUFYX1BBQ0tFVCAqCisJCQkJICAoQVNUX1ZIVUJfTlVNX1BPUlRTICsgMSksCisJ CQkJICB2aHViLT5lcDBfYnVmcywKKwkJCQkgIHZodWItPmVwMF9idWZzX2RtYSk7CisJdmh1Yi0+ ZXAwX2J1ZnMgPSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf cHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwllbnVtIHVzYl9kZXZpY2Vf c3BlZWQgbWF4X3NwZWVkOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YjsKKwlzdHJ1Y3QgcmVzb3Vy Y2UgKnJlczsKKwlpbnQgaSwgcmMgPSAwOworCisJdmh1YiA9IGRldm1fa3phbGxvYygmcGRldi0+ ZGV2LCBzaXplb2YoKnZodWIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXZodWIpCisJCXJldHVybiAt RU5PTUVNOworCisJc3Bpbl9sb2NrX2luaXQoJnZodWItPmxvY2spOworCXZodWItPnBkZXYgPSBw ZGV2OworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVN LCAwKTsKKwl2aHViLT5yZWdzID0gZGV2bV9pb3JlbWFwX3Jlc291cmNlKCZwZGV2LT5kZXYsIHJl cyk7CisJaWYgKElTX0VSUih2aHViLT5yZWdzKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJG YWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7CisJCXJldHVybiBQVFJfRVJSKHZodWItPnJlZ3Mp OworCX0KKwlVRENEQkcodmh1YiwgInZIdWJAJXBSIG1hcHBlZCBAJXBcbiIsIHJlcywgdmh1Yi0+ cmVncyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShwZGV2LCB2aHViKTsKKworCXZodWItPmNs ayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxMKTsKKyAgICAgICAgaWYgKElTX0VSUih2 aHViLT5jbGspKSB7CisgICAgICAgICAgICAgICAgcmMgPSBQVFJfRVJSKHZodWItPmNsayk7Cisg ICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAgIH0KKwlyYyA9IGNsa19wcmVwYXJlX2Vu YWJsZSh2aHViLT5jbGspOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJv ciBjb3VsZG4ndCBlbmFibGUgY2xvY2sgKCVkKVxuIiwgcmMpOworCQlnb3RvIGVycjsKKyAgICAg ICAgfQorCisJLyogQ2hlY2sgaWYgd2UgbmVlZCB0byBsaW1pdCB0aGUgSFcgdG8gVVNCMSAqLwor CW1heF9zcGVlZCA9IHVzYl9nZXRfbWF4aW11bV9zcGVlZCgmcGRldi0+ZGV2KTsKKwlpZiAobWF4 X3NwZWVkICE9IFVTQl9TUEVFRF9VTktOT1dOICYmIG1heF9zcGVlZCA8IFVTQl9TUEVFRF9ISUdI KQorCQl2aHViLT5mb3JjZV91c2IxID0gdHJ1ZTsKKworCS8qIE1hc2sgJiBhY2sgYWxsIGludGVy cnVwdHMgYmVmb3JlIGluc3RhbGxpbmcgdGhlIGhhbmRsZXIgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+ cmVncyArIEFTVF9WSFVCX0lFUik7CisJd3JpdGVsKFZIVUJfSVJRX0FDS19BTEwsIHZodWItPnJl Z3MgKyBBU1RfVkhVQl9JU1IpOworCisJLyogRmluZCBpbnRlcnJ1cHQgYW5kIGluc3RhbGwgaGFu ZGxlciAqLworCXZodWItPmlycSA9IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHZo dWItPmlycSA8IDApIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBpbnRl cnJ1cHRcbiIpOworCQlyYyA9IHZodWItPmlycTsKKwkJZ290byBlcnI7CisJfQorCXJjID0gZGV2 bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB2aHViLT5pcnEsIGFzdF92aHViX2lycSwgMCwKKwkJ CSAgICAgIEtCVUlMRF9NT0ROQU1FLCB2aHViKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRl di0+ZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgaW50ZXJydXB0XG4iKTsKKwkJZ290byBlcnI7CisJ fQorCisJLyoKKwkgKiBBbGxvY2F0ZSBETUEgYnVmZmVycyBmb3IgYWxsIEVQMHMgaW4gb25lIGNo dW5rLAorCSAqIG9uZSBwZXIgcG9ydCBhbmQgb25lIGZvciB0aGUgdkh1YiBpdHNlbGYKKwkgKi8K Kwl2aHViLT5lcDBfYnVmcyA9IGRtYV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCQkg ICAgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKgorCQkJCQkgICAgKEFTVF9WSFVCX05VTV9QT1JU UyArIDEpLAorCQkJCQkgICAgJnZodWItPmVwMF9idWZzX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYg KCF2aHViLT5lcDBfYnVmcykgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxs b2NhdGUgRVAwIERNQSBidWZmZXJzXG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsK Kwl9CisJVURDVkRCRyh2aHViLCAiRVAwIERNQSBidWZmZXJzIEAlcCAoRE1BIDB4JTA4eClcbiIs CisJCXZodWItPmVwMF9idWZzLCAodTMyKXZodWItPmVwMF9idWZzX2RtYSk7CisKKwkvKiBJbml0 IHZIdWIgRVAwICovCisJYXN0X3ZodWJfaW5pdF9lcDAodmh1YiwgJnZodWItPmVwMCwgTlVMTCk7 CisKKwkvKiBJbml0IGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX1BP UlRTICYmIHJjID09IDA7IGkrKykKKwkJcmMgPSBhc3Rfdmh1Yl9pbml0X2Rldih2aHViLCBpKTsK KwlpZiAocmMpCisJCWdvdG8gZXJyOworCisJLyogSW5pdCBodWIgZW11bGF0aW9uICovCisJYXN0 X3ZodWJfaW5pdF9odWIodmh1Yik7CisKKwkvKiBJbml0aWFsaXplIEhXICovCisJYXN0X3ZodWJf aW5pdF9odyh2aHViKTsKKworCXJldHVybiAwOworIGVycjoKKwlhc3Rfdmh1Yl9yZW1vdmUocGRl dik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBh c3Rfdmh1Yl9kdF9pZHNbXSA9IHsKKwl7CisJCS5jb21wYXRpYmxlID0gImFzcGVlZCxhc3QyNDAw LXVzYi12aHViIiwKKwkJLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI1MDAtdXNiLXZodWIiLAor CX0sCisJeyB9Cit9OworTU9EVUxFX0RFVklDRV9UQUJMRShvZiwgYXN0X3ZodWJfZHRfaWRzKTsK Kworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgYXN0X3ZodWJfZHJpdmVyID0geworCS5w cm9iZQkJPSBhc3Rfdmh1Yl9wcm9iZSwKKwkucmVtb3ZlCQk9IGFzdF92aHViX3JlbW92ZSwKKwku ZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBLQlVJTERfTU9ETkFNRSwKKwkJLm9mX21hdGNoX3RhYmxl CT0gYXN0X3ZodWJfZHRfaWRzLAorCX0sCit9OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhc3Rf dmh1Yl9kcml2ZXIpOworCitNT0RVTEVfREVTQ1JJUFRJT04oIkFzcGVlZCB2SHViIHVkYyBkcml2 ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJlbmphbWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVs LmNyYXNoaW5nLm9yZz4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2Ry aXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZGV2LmMgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAw MDAwMDAwMC4uYzMzYzFmZWZjMWFlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYwpAQCAtMCwwICsxLDU4MSBAQAorLy8gU1BEWC1MaWNl bnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisvKgorICogYXNwZWVkLXZodWIgLS0gRHJpdmVyIGZv ciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICogZGV2LmMgLSBJbmRpdmlkdWFs IGRldmljZS9nYWRnZXQgbWFuYWdlbWVudCAoaWUsIGEgcG9ydCA9IGEgZ2FkZ2V0KQorICoKKyAq IENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBm cmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBp dCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1 Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZl cnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUg PGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGlu dXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlz dC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2Nf ZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5o PgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgor I2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNp bmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2lu Y2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKworI2luY2x1ZGUgInZodWIuaCIKKwordm9pZCBhc3Rf dmh1Yl9kZXZfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJdTMyIGlzdGF0ID0gcmVh ZGwoZC0+cmVncyArIEFTVF9WSFVCX0RFVl9JU1IpOworCisJd3JpdGVsKGlzdGF0LCBkLT5yZWdz ICsgQVNUX1ZIVUJfREVWX0lTUik7CisKKwlpZiAoaXN0YXQgJiBWSFVWX0RFVl9JUlFfRVAwX0lO X0FDS19TVEFMTCkKKwkJYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soJmQtPmVwMCwgdHJ1ZSk7CisJ aWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJRX0VQMF9PVVRfQUNLX1NUQUxMKQorCQlhc3Rfdmh1Yl9l cDBfaGFuZGxlX2FjaygmZC0+ZXAwLCBmYWxzZSk7CisJaWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJR X0VQMF9TRVRVUCkKKwkJYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1cCgmZC0+ZXAwKTsKK30KKwor c3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X2VuYWJsZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQor eworCXUzMiByZWcsIGhtc2s7CisKKwlpZiAoZC0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJLyog RW5hYmxlIGRldmljZSBhbmQgaXRzIEVQMCBpbnRlcnJ1cHRzICovCisJcmVnID0gVkhVQl9ERVZf RU5fRU5BQkxFX1BPUlQgfAorCQlWSFVCX0RFVl9FTl9FUDBfSU5fQUNLX0lSUUVOIHwKKwkJVkhV Ql9ERVZfRU5fRVAwX09VVF9BQ0tfSVJRRU4gfAorCQlWSFVCX0RFVl9FTl9FUDBfU0VUVVBfSVJR RU47CisJaWYgKGQtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCkKKwkJcmVnIHw9IFZI VUJfREVWX0VOX1NQRUVEX1NFTF9ISUdIOworCXdyaXRlbChyZWcsIGQtPnJlZ3MgKyBBU1RfVkhV Ql9ERVZfRU5fQ1RSTCk7CisKKwkvKiBFbmFibGUgZGV2aWNlIGludGVycnVwdCBpbiB0aGUgaHVi IGFzIHdlbGwgKi8KKwlobXNrID0gVkhVQl9JUlFfREVWSUNFMSA8PCBkLT5pbmRleDsKKwlyZWcg PSByZWFkbChkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwlyZWcgfD0gaG1zazsKKwl3 cml0ZWwocmVnLCBkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsKKworCS8qIFNldCBFUDAg RE1BIGJ1ZmZlciBhZGRyZXNzICovCisJd3JpdGVsKGQtPmVwMC5idWZfZG1hLCBkLT5yZWdzICsg QVNUX1ZIVUJfREVWX0VQMF9EQVRBKTsKKworCWQtPmVuYWJsZWQgPSB0cnVlOworfQorCitzdGF0 aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfZGlzYWJsZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQorewor CXUzMiByZWcsIGhtc2s7CisKKwlpZiAoIWQtPmVuYWJsZWQpCisJCXJldHVybjsKKworCS8qIERp c2FibGUgZGV2aWNlIGludGVycnVwdCBpbiB0aGUgaHViICovCisJaG1zayA9IFZIVUJfSVJRX0RF VklDRTEgPDwgZC0+aW5kZXg7CisJcmVnID0gcmVhZGwoZC0+dmh1Yi0+cmVncyArIEFTVF9WSFVC X0lFUik7CisJcmVnICY9IH5obXNrOworCXdyaXRlbChyZWcsIGQtPnZodWItPnJlZ3MgKyBBU1Rf VkhVQl9JRVIpOworCisJLyogVGhlbiBkaXNhYmxlIGRldmljZSAqLworCXdyaXRlbCgwLCBkLT5y ZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwpOworCWQtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVF RF9VTktOT1dOOworCWQtPmVuYWJsZWQgPSBmYWxzZTsKKwlkLT5zdXNwZW5kZWQgPSBmYWxzZTsK K30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9kZXZfZmVhdHVyZShzdHJ1Y3QgYXN0X3ZodWJfZGV2 ICpkLAorCQkJCXUxNiB3SW5kZXgsIHUxNiB3VmFsdWUsCisJCQkJYm9vbCBpc19zZXQpCit7CisJ RERCRyhkLCAiJXNfRkVBVFVSRShkZXYgdmFsPSUwMngpXG4iLAorCSAgICAgaXNfc2V0ID8gIlNF VCIgOiAiQ0xFQVIiLCB3VmFsdWUpOworCisJaWYgKHdWYWx1ZSAhPSBVU0JfREVWSUNFX1JFTU9U RV9XQUtFVVApCisJCXJldHVybiBzdGRfcmVxX2RyaXZlcjsKKworCWQtPndha2V1cF9lbiA9IGlz X3NldDsKKworCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGFzdF92 aHViX2VwX2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2RldiAqZCwKKwkJCSAgICAgICB1MTYgd0lu ZGV4LCB1MTYgd1ZhbHVlLCBib29sIGlzX3NldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw OworCWludCBlcF9udW07CisKKwllcF9udW0gPSB3SW5kZXggJiBVU0JfRU5EUE9JTlRfTlVNQkVS X01BU0s7CisJRERCRyhkLCAiJXNfRkVBVFVSRShlcCVkIHZhbD0lMDJ4KVxuIiwKKwkgICAgIGlz X3NldCA/ICJTRVQiIDogIkNMRUFSIiwgZXBfbnVtLCB3VmFsdWUpOworCWlmIChlcF9udW0gPT0g MCkKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJaWYgKGVwX251bSA+PSBBU1RfVkhVQl9O VU1fR0VOX0VQcyB8fCAhZC0+ZXBuc1tlcF9udW0gLSAxXSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3Rh bGw7CisJaWYgKHdWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkKKwkJcmV0dXJuIHN0ZF9yZXFf ZHJpdmVyOworCisJZXAgPSBkLT5lcG5zW2VwX251bSAtIDFdOworCWlmIChXQVJOX09OKCFlcCkp CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJaWYgKCFlcC0+ZXBuLmVuYWJsZWQgfHwgIWVw LT5lcC5kZXNjIHx8IGVwLT5lcG4uaXNfaXNvIHx8CisJICAgIGVwLT5lcG4uaXNfaW4gIT0gISEo d0luZGV4ICYgVVNCX0RJUl9JTikpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJRERCRyhk LCAiJXMgc3RhbGwgb24gRVAgJWRcbiIsCisJICAgICBpc19zZXQgPyAic2V0dGluZyIgOiAiY2xl YXJpbmciLCBlcF9udW0pOworCWVwLT5lcG4uc3RhbGxlZCA9IGlzX3NldDsKKwlhc3Rfdmh1Yl91 cGRhdGVfZXBuX3N0YWxsKGVwKTsKKworCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQorCitz dGF0aWMgaW50IGFzdF92aHViX2Rldl9zdGF0dXMoc3RydWN0IGFzdF92aHViX2RldiAqZCwKKwkJ CSAgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlKQoreworCXU4IHN0MDsKKworCUREQkcoZCwg IkdFVF9TVEFUVVMoZGV2KVxuIik7CisKKwlzdDAgPSBkLT5nYWRnZXQuaXNfc2VsZnBvd2VyZWQg PDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQ7CisJaWYgKGQtPndha2V1cF9lbikKKwkJc3QwIHw9 IDEgPDwgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOworCisJcmV0dXJuIGFzdF92aHViX3NpbXBs ZV9yZXBseSgmZC0+ZXAwLCBzdDAsIDApOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2VwX3N0 YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJICAgICAgdTE2IHdJbmRleCwgdTE2IHdW YWx1ZSkKK3sKKwlpbnQgZXBfbnVtID0gd0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNL OworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7CisJdTggc3QwID0gMDsKKworCUREQkcoZCwgIkdF VF9TVEFUVVMoZXAlZClcbiIsIGVwX251bSk7CisKKwlpZiAoZXBfbnVtID49IEFTVF9WSFVCX05V TV9HRU5fRVBzKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAoZXBfbnVtICE9IDApIHsK KwkJZXAgPSBkLT5lcG5zW2VwX251bSAtIDFdOworCQlpZiAoIWVwKQorCQkJcmV0dXJuIHN0ZF9y ZXFfc3RhbGw7CisJCWlmICghZXAtPmVwbi5lbmFibGVkIHx8ICFlcC0+ZXAuZGVzYyB8fCBlcC0+ ZXBuLmlzX2lzbyB8fAorCQkgICAgZXAtPmVwbi5pc19pbiAhPSAhISh3SW5kZXggJiBVU0JfRElS X0lOKSkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCQlpZiAoZXAtPmVwbi5zdGFsbGVkKQor CQkJc3QwIHw9IDEgPDwgVVNCX0VORFBPSU5UX0hBTFQ7CisJfQorCisJcmV0dXJuIGFzdF92aHVi X3NpbXBsZV9yZXBseSgmZC0+ZXAwLCBzdDAsIDApOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1 Yl9kZXZfc2V0X2FkZHJlc3Moc3RydWN0IGFzdF92aHViX2RldiAqZCwgdTggYWRkcikKK3sKKwl1 MzIgcmVnOworCisJRERCRyhkLCAiU0VUX0FERFJFU1M6IEdvdCBhZGRyZXNzICV4XG4iLCBhZGRy KTsKKworCXJlZyA9IHJlYWRsKGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRU5fQ1RSTCk7CisJcmVn ICY9IH5WSFVCX0RFVl9FTl9BRERSX01BU0s7CisJcmVnIHw9IFZIVUJfREVWX0VOX1NFVF9BRERS KGFkZHIpOworCXdyaXRlbChyZWcsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRU5fQ1RSTCk7Cit9 CisKK2ludCBhc3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwK KwkJCSAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKQoreworCXN0cnVjdCBhc3Rfdmh1 Yl9kZXYgKmQgPSBlcC0+ZGV2OworCXUxNiB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aDsKKworCS8q IE5vIGRyaXZlciwgd2Ugc2hvdWxkbid0IGJlIGVuYWJsZWQgLi4uICovCisJaWYgKCFkLT5kcml2 ZXIgfHwgIWQtPmVuYWJsZWQgfHwgZC0+c3VzcGVuZGVkKSB7CisJCUVQREJHKGVwLAorCQkgICAg ICAiRGV2aWNlIGlzIHdyb25nIHN0YXRlIGRyaXZlcj0lcCBlbmFibGVkPSVkIgorCQkgICAgICAi IHN1c3BlbmRlZD0lZFxuIiwKKwkJICAgICAgZC0+ZHJpdmVyLCBkLT5lbmFibGVkLCBkLT5zdXNw ZW5kZWQpOworCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwl9CisKKwkvKiBGaXJzdCBwYWNrZXQs IGdyYWIgc3BlZWQgKi8KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dO KSB7CisJCWQtPmdhZGdldC5zcGVlZCA9IGVwLT52aHViLT5zcGVlZDsKKwkJaWYgKGQtPmdhZGdl dC5zcGVlZCA+IGQtPmRyaXZlci0+bWF4X3NwZWVkKQorCQkJZC0+Z2FkZ2V0LnNwZWVkID0gZC0+ ZHJpdmVyLT5tYXhfc3BlZWQ7CisJCUREQkcoZCwgImZpc3QgcGFja2V0LCBjYXB0dXJlZCBzcGVl ZCAlZFxuIiwKKwkJICAgICBkLT5nYWRnZXQuc3BlZWQpOworCX0KKworCXdWYWx1ZSA9IGxlMTZf dG9fY3B1KGNycS0+d1ZhbHVlKTsKKwl3SW5kZXggPSBsZTE2X3RvX2NwdShjcnEtPndJbmRleCk7 CisJd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGNycS0+d0xlbmd0aCk7CisKKwlzd2l0Y2ggKChjcnEt PmJSZXF1ZXN0VHlwZSA8PCA4KSB8IGNycS0+YlJlcXVlc3QpIHsKKwkJLyogU0VUX0FERFJFU1Mg Ki8KKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9BRERSRVNTOgorCQlhc3Rf dmh1Yl9kZXZfc2V0X2FkZHJlc3MoZCwgd1ZhbHVlKTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxl dGU7CisKKwkJLyogR0VUX1NUQVRVUyAqLworCWNhc2UgRGV2aWNlUmVxdWVzdCB8IFVTQl9SRVFf R0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX2Rldl9zdGF0dXMoZCwgd0luZGV4LCB3VmFs dWUpOworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0 dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCk7CisJY2FzZSBFbmRwb2ludFJlcXVl c3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9lcF9zdGF0dXMoZCwg d0luZGV4LCB3VmFsdWUpOworCisJCS8qIFNFVC9DTEVBUl9GRUFUVVJFICovCisJY2FzZSBEZXZp Y2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2Rl dl9mZWF0dXJlKGQsIHdJbmRleCwgd1ZhbHVlLCB0cnVlKTsKKwljYXNlIERldmljZU91dFJlcXVl c3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9kZXZfZmVhdHVy ZShkLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCWNhc2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwg VVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2VwX2ZlYXR1cmUoZCwgd0lu ZGV4LCB3VmFsdWUsIHRydWUpOworCWNhc2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9D TEVBUl9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfZXBfZmVhdHVyZShkLCB3SW5kZXgsIHdW YWx1ZSwgZmFsc2UpOworCX0KKwlyZXR1cm4gc3RkX3JlcV9kcml2ZXI7Cit9CisKK3N0YXRpYyBp bnQgYXN0X3ZodWJfdWRjX3dha2V1cChzdHJ1Y3QgdXNiX2dhZGdldCogZ2FkZ2V0KQoreworCXN0 cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQgbG9u ZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZo dWItPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWQtPndha2V1cF9lbikKKwkJZ290byBlcnI7CisKKwlE REJHKGQsICJEZXZpY2UgaW5pdGlhdGVkIHdha2V1cFxuIik7CisKKwkvKiBXYWtldXAgdGhlIGhv c3QgKi8KKwlhc3Rfdmh1Yl9odWJfd2FrZV9hbGwoZC0+dmh1Yik7CisJcmMgPSAwOworIGVycjoK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisJcmV0dXJu IHJjOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3VkY19nZXRfZnJhbWUoc3RydWN0IHVzYl9n YWRnZXQqIGdhZGdldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2Rldihn YWRnZXQpOworCisJcmV0dXJuIChyZWFkbChkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfVVNCU1RT KSA+PiAxNikgJiAweDdmZjsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X251a2Uoc3Ry dWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7 IGkgPCBBU1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKSB7CisJCWlmICghZC0+ZXBuc1tpXSkKKwkJ CWNvbnRpbnVlOworCQlhc3Rfdmh1Yl9udWtlKGQtPmVwbnNbaV0sIC1FU0hVVERPV04pOworCX0K K30KKworc3RhdGljIGludCBhc3Rfdmh1Yl91ZGNfcHVsbHVwKHN0cnVjdCB1c2JfZ2FkZ2V0KiBn YWRnZXQsIGludCBvbikKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2Rldihn YWRnZXQpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+ dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAicHVsbHVwKCVkKVxuIiwgb24pOworCisJ LyogTWFyayBkaXNjb25uZWN0ZWQgaW4gdGhlIGh1YiAqLworCWFzdF92aHViX2RldmljZV9jb25u ZWN0KGQtPnZodWIsIGQtPmluZGV4LCBvbik7CisKKwkvKgorCSAqIElmIGVuYWJsZWQsIG51a2Ug YWxsIHJlcXVlc3RzIGlmIGFueSAodGhlcmUgc2hvdWxkbid0IGJlKQorCSAqIGFuZCBkaXNhYmxl IHRoZSBwb3J0LiBUaGlzIHdpbGwgY2xlYXIgdGhlIGFkZHJlc3MgdG9vLgorCSAqLworCWlmIChk LT5lbmFibGVkKSB7CisJCWFzdF92aHViX2Rldl9udWtlKGQpOworCQlhc3Rfdmh1Yl9kZXZfZGlz YWJsZShkKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBm bGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl91ZGNfc3RhcnQo c3RydWN0IHVzYl9nYWRnZXQgKmdhZGdldCwKKwkJCSAgICAgIHN0cnVjdCB1c2JfZ2FkZ2V0X2Ry aXZlciAqZHJpdmVyKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdh ZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52 aHViLT5sb2NrLCBmbGFncyk7CisKKwlEREJHKGQsICJzdGFydFxuIik7CisKKwkvKiBXZSBkb24n dCBkbyBtdWNoIG1vcmUgdW50aWwgdGhlIGh1YiBlbmFibGVzIHVzICovCisJZC0+ZHJpdmVyID0g ZHJpdmVyOworCWQtPmdhZGdldC5pc19zZWxmcG93ZXJlZCA9IDE7CisKKwlzcGluX3VubG9ja19p cnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3Rh dGljIHN0cnVjdCB1c2JfZXAgKmFzdF92aHViX3VkY19tYXRjaF9lcChzdHJ1Y3QgdXNiX2dhZGdl dCAqZ2FkZ2V0LAorCQkJCQkgICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNj LAorCQkJCQkgICAgc3RydWN0IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKnNzKQoreworCXN0 cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJc3RydWN0IGFzdF92 aHViX2VwICplcDsKKwlzdHJ1Y3QgdXNiX2VwICp1X2VwOworCXVuc2lnbmVkIGludCBtYXgsIGFk ZHIsIGk7CisKKwlEREJHKGQsICJNYXRjaCBFUCB0eXBlICVkXG4iLCB1c2JfZW5kcG9pbnRfdHlw ZShkZXNjKSk7CisKKwkvKgorCSAqIEZpcnN0IHdlIG5lZWQgdG8gbG9vayBmb3IgYW4gZXhpc3Rp bmcgdW5jbGFpbWVkIEVQIGFzIGFub3RoZXIKKwkgKiBjb25maWd1cmF0aW9uIG1heSBoYXZlIGFs cmVhZHkgYXNzb2NpYXRlZCBhIGJ1bmNoIG9mIEVQcyB3aXRoCisJICogdGhpcyBnYWRnZXQuIFRo aXMgZHVwbGljYXRlcyB0aGUgY29kZSBpbiB1c2JfZXBfYXV0b2NvbmZpZ19zcygpCisJICogdW5m b3J0dW5hdGVseS4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVfZXAsICZnYWRnZXQtPmVw X2xpc3QsIGVwX2xpc3QpIHsKKwkJaWYgKHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhnYWRnZXQs IHVfZXAsIGRlc2MsIHNzKSkgeworCQkJRERCRyhkLCAiIC0+IHVzaW5nIGV4aXN0aW5nIEVQJWRc biIsCisJCQkgICAgIHRvX2FzdF9lcCh1X2VwKS0+ZF9pZHgpOworCQkJcmV0dXJuIHVfZXA7CisJ CX0KKwl9CisKKwkvKgorCSAqIFdlIGRpZG4ndCBmaW5kIG9uZSwgd2UgbmVlZCB0byBncmFiIG9u ZSBmcm9tIHRoZSBwb29sLgorCSAqCisJICogRmlyc3QgbGV0J3MgZG8gc29tZSBzYW5pdHkgY2hl Y2tpbmcKKwkgKi8KKwlzd2l0Y2godXNiX2VuZHBvaW50X3R5cGUoZGVzYykpIHsKKwljYXNlIFVT Ql9FTkRQT0lOVF9YRkVSX0NPTlRST0w6CisJCS8qIE9ubHkgRVAwIGNhbiBiZSBhIGNvbnRyb2wg ZW5kcG9pbnQgKi8KKwkJcmV0dXJuIE5VTEw7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09D OgorCQkvKiBJU086ICBsaW1pdCAxMDIzIGJ5dGVzIGZ1bGwgc3BlZWQsIDEwMjQgaGlnaC9zdXBl ciBzcGVlZCAqLworCQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpKQorCQkJbWF4ID0g MTAyNDsKKwkJZWxzZQorCQkJbWF4ID0gMTAyMzsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9J TlRfWEZFUl9CVUxLOgorCQlpZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpKQorCQkJbWF4 ID0gNTEyOworCQllbHNlCisJCQltYXggPSA2NDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9J TlRfWEZFUl9JTlQ6CisJCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpCisJCQltYXgg PSAxMDI0OworCQllbHNlCisJCQltYXggPSA2NDsKKwkJYnJlYWs7CisJfQorCWlmICh1c2JfZW5k cG9pbnRfbWF4cChkZXNjKSA+IG1heCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIEZpbmQg YSBmcmVlIEVQIGFkZHJlc3MgZm9yIHRoYXQgZGV2aWNlLiBXZSBjYW4ndAorCSAqIGxldCB0aGUg Z2VuZXJpYyBjb2RlIGFzc2lnbiB0aGVzZSBhcyBpdCB3b3VsZAorCSAqIGNyZWF0ZSBvdmVybGFw cGluZyBudW1iZXJzIGZvciBJTiBhbmQgT1VUIHdoaWNoCisJICogd2UgZG9uJ3Qgc3VwcG9ydCwg c28gYWxzbyBjcmVhdGUgYSBzdWl0YWJsZSBuYW1lCisJICogdGhhdCB3aWxsIGFsbG93IHRoZSBn ZW5lcmljIGNvZGUgdG8gdXNlIG91cgorCSAqIGFzc2lnbmVkIGFkZHJlc3MuCisJICovCisJZm9y IChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKyspCisJCWlmIChkLT5lcG5zW2ld ID09IE5VTEwpCisJCQlicmVhazsKKwlpZiAoaSA+PSBBU1RfVkhVQl9OVU1fR0VOX0VQcykKKwkJ cmV0dXJuIE5VTEw7CisJYWRkciA9IGkgKyAxOworCisJLyoKKwkgKiBOb3cgZ3JhYiBhbiBFUCBm cm9tIHRoZSBzaGFyZWQgcG9vbCBhbmQgYXNzb2NpYXRlCisJICogaXQgd2l0aCBvdXIgZGV2aWNl CisJICovCisgICAgICAgCWVwID0gYXN0X3ZodWJfYWxsb2NfZXBuKGQsIGFkZHIpOworCWlmICgh ZXApCisJCXJldHVybiBOVUxMOworCUREQkcoZCwgIkFsbG9jYXRlZCBlcG4jJWQgZm9yIHBvcnQg RVAlZFxuIiwKKwkgICAgIGVwLT5lcG4uZ19pZHgsIGFkZHIpOworCisJcmV0dXJuICZlcC0+ZXA7 Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3N0b3Aoc3RydWN0IHVzYl9nYWRnZXQgKmdh ZGdldCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2RldihnYWRnZXQpOwor CXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9j aywgZmxhZ3MpOworCisJRERCRyhkLCAic3RvcFxuIik7CisKKwlkLT5kcml2ZXIgPSBOVUxMOwor CWQtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCisJYXN0X3ZodWJfZGV2X251 a2UoZCk7CisKKwlpZiAoZC0+ZW5hYmxlZCkKKwkJYXN0X3ZodWJfZGV2X2Rpc2FibGUoZCk7CisK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZ2FkZ2V0X29wcyBhc3Rfdmh1Yl91ZGNfb3Bz ID0geworCS5nZXRfZnJhbWUJPSBhc3Rfdmh1Yl91ZGNfZ2V0X2ZyYW1lLAorCS53YWtldXAJCT0g YXN0X3ZodWJfdWRjX3dha2V1cCwKKwkucHVsbHVwCQk9IGFzdF92aHViX3VkY19wdWxsdXAsCisJ LnVkY19zdGFydAk9IGFzdF92aHViX3VkY19zdGFydCwKKwkudWRjX3N0b3AJPSBhc3Rfdmh1Yl91 ZGNfc3RvcCwKKwkubWF0Y2hfZXAJPSBhc3Rfdmh1Yl91ZGNfbWF0Y2hfZXAsCit9OworCit2b2lk IGFzdF92aHViX2Rldl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJZC0+c3Vz cGVuZGVkID0gdHJ1ZTsKKwlpZiAoZC0+ZHJpdmVyKSB7CisJCXNwaW5fdW5sb2NrKCZkLT52aHVi LT5sb2NrKTsKKwkJZC0+ZHJpdmVyLT5zdXNwZW5kKCZkLT5nYWRnZXQpOworCQlzcGluX2xvY2so JmQtPnZodWItPmxvY2spOworCX0KK30KKwordm9pZCBhc3Rfdmh1Yl9kZXZfcmVzdW1lKHN0cnVj dCBhc3Rfdmh1Yl9kZXYgKmQpCit7CisJZC0+c3VzcGVuZGVkID0gZmFsc2U7CisJaWYgKGQtPmRy aXZlcikgeworCQlzcGluX3VubG9jaygmZC0+dmh1Yi0+bG9jayk7CisJCWQtPmRyaXZlci0+cmVz dW1lKCZkLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmQtPnZodWItPmxvY2spOworCX0KK30KKwor dm9pZCBhc3Rfdmh1Yl9kZXZfcmVzZXQoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwkvKgor CSAqIElmIHNwZWVkIGlzIG5vdCBzZXQsIHdlIGVuYWJsZSB0aGUgcG9ydC4gSWYgaXQgaXMsCisJ ICogc2VuZCByZXNldCB0byB0aGUgZ2FkZ2V0IGFuZCByZXNldCAic3BlZWQiLgorCSAqCisJICog U3BlZWQgaXMgYW4gaW5kaWNhdGlvbiB0aGF0IHdlIGhhdmUgZ290IHRoZSBmaXJzdAorCSAqIHNl dHVwIHBhY2tldCB0byB0aGUgZGV2aWNlLgorCSAqLworCWlmIChkLT5nYWRnZXQuc3BlZWQgPT0g VVNCX1NQRUVEX1VOS05PV04gJiYgIWQtPmVuYWJsZWQpIHsKKwkJRERCRyhkLCAiUmVzZXQgYXQg dW5rbm93biBzcGVlZCBvZiBkaXNhYmxlZCBkZXZpY2UsIGVuYWJsaW5nLi4uXG4iKTsKKwkJYXN0 X3ZodWJfZGV2X2VuYWJsZShkKTsKKwkJZC0+c3VzcGVuZGVkID0gZmFsc2U7CisJfQorCWlmIChk LT5nYWRnZXQuc3BlZWQgIT0gVVNCX1NQRUVEX1VOS05PV04gJiYgZC0+ZHJpdmVyKSB7CisJCXVu c2lnbmVkIGludCBpOworCisJCUREQkcoZCwgIlJlc2V0IGF0IGtub3duIHNwZWVkIG9mIGJvdW5k IGRldmljZSwgcmVzZXR0aW5nLi4uXG4iKTsKKwkJc3Bpbl91bmxvY2soJmQtPnZodWItPmxvY2sp OworCQlkLT5kcml2ZXItPnJlc2V0KCZkLT5nYWRnZXQpOworCQlzcGluX2xvY2soJmQtPnZodWIt PmxvY2spOworCisJCS8qCisJCSAqIERpc2FibGUvcmUtZW5hYmxlIEhXLCB0aGlzIHdpbGwgY2xl YXIgdGhlIGFkZHJlc3MKKwkJICogYW5kIHNwZWVkIHNldHRpbmcuCisJCSAqLworCQlhc3Rfdmh1 Yl9kZXZfZGlzYWJsZShkKTsKKwkJYXN0X3ZodWJfZGV2X2VuYWJsZShkKTsKKworCQkvKiBDbGVh ciBzdGFsbCBvbiBhbGwgRVBzICovCisJCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fR0VO X0VQczsgaSsrKSB7CisJCQlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gZC0+ZXBuc1tpXTsKKwor CQkJaWYgKGVwICYmIGVwLT5lcG4uc3RhbGxlZCkgeworCQkJCWVwLT5lcG4uc3RhbGxlZCA9IGZh bHNlOworCQkJCWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXApOworCQkJfQorCQl9CisKKwkJ LyogQWRkaXRpb25hbCBjbGVhbnVwcyAqLworCQlkLT53YWtldXBfZW4gPSBmYWxzZTsKKwkJZC0+ c3VzcGVuZGVkID0gZmFsc2U7CisJfQorfQorCit2b2lkIGFzdF92aHViX2RlbF9kZXYoc3RydWN0 IGFzdF92aHViX2RldiAqZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWQtPnJlZ2lzdGVyZWQpIHsK KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCQlyZXR1 cm47CisJfQorCWQtPnJlZ2lzdGVyZWQgPSBmYWxzZTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwl1c2JfZGVsX2dhZGdldF91ZGMoJmQtPmdhZGdl dCk7CisJZGV2aWNlX3VucmVnaXN0ZXIoJmQtPnBvcnRfZGV2KTsKK30KKworaW50IGFzdF92aHVi X2luaXRfZGV2KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwgdW5zaWduZWQgaW50IGlkeCkKK3sKKwlz dHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gJnZodWItPnBvcnRzW2lkeF0uZGV2OworCXN0cnVjdCBk ZXZpY2UgKnBhcmVudCA9ICZ2aHViLT5wZGV2LT5kZXY7CisJaW50IHJjOworCisJZC0+dmh1YiA9 IHZodWI7CisJZC0+aW5kZXggPSBpZHg7CisJZC0+bmFtZSA9IGRldm1fa2FzcHJpbnRmKHBhcmVu dCwgR0ZQX0tFUk5FTCwgInBvcnQlZCIsIGlkeCsxKTsKKwlkLT5yZWdzID0gdmh1Yi0+cmVncyAr IDB4MTAwICsgMHgxMCAqIGlkeDsKKworCWFzdF92aHViX2luaXRfZXAwKHZodWIsICZkLT5lcDAs IGQpOworCisJLyoKKwkgKiBUaGUgVURDIGNvcmUgcmVhbGx5IG5lZWRzIHVzIHRvIGhhdmUgc2Vw YXJhdGUgYW5kIHVuaXF1ZWx5CisJICogbmFtZWQgInBhcmVudCIgZGV2aWNlcyBmb3IgZWFjaCBw b3J0IHNvIHdlIGNyZWF0ZSBhIHN1YiBkZXZpY2UKKwkgKiBoZXJlIGZvciB0aGF0IHB1cnBvc2UK KwkgKi8KKwlkZXZpY2VfaW5pdGlhbGl6ZSgmZC0+cG9ydF9kZXYpOworCWQtPnBvcnRfZGV2LnBh cmVudCA9IHBhcmVudDsKKwlkZXZfc2V0X25hbWUoJmQtPnBvcnRfZGV2LCAiJXM6cCVkIiwgZGV2 X25hbWUocGFyZW50KSwgaWR4ICsgMSk7CisJcmMgPSBkZXZpY2VfYWRkKCZkLT5wb3J0X2Rldik7 CisJaWYgKHJjKQorCQlnb3RvIGZhaWxfYWRkOworCisJLyogUG9wdWxhdGUgZ2FkZ2V0ICovCisJ SU5JVF9MSVNUX0hFQUQoJmQtPmdhZGdldC5lcF9saXN0KTsKKwlkLT5nYWRnZXQub3BzID0gJmFz dF92aHViX3VkY19vcHM7CisJZC0+Z2FkZ2V0LmVwMCA9ICZkLT5lcDAuZXA7CisJZC0+Z2FkZ2V0 Lm5hbWUgPSBLQlVJTERfTU9ETkFNRTsKKwlpZiAodmh1Yi0+Zm9yY2VfdXNiMSkKKwkJZC0+Z2Fk Z2V0Lm1heF9zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCWVsc2UKKwkJZC0+Z2FkZ2V0Lm1heF9z cGVlZCA9IFVTQl9TUEVFRF9ISUdIOworCWQtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktO T1dOOworCWQtPmdhZGdldC5kZXYub2Zfbm9kZSA9IHZodWItPnBkZXYtPmRldi5vZl9ub2RlOwor CisJcmMgPSB1c2JfYWRkX2dhZGdldF91ZGMoJmQtPnBvcnRfZGV2LCAmZC0+Z2FkZ2V0KTsKKwlp ZiAocmMgIT0gMCkKKwkJZ290byBmYWlsX3VkYzsKKwlkLT5yZWdpc3RlcmVkID0gdHJ1ZTsKKwor CXJldHVybiAwOworIGZhaWxfdWRjOgorCWRldmljZV9kZWwoJmQtPnBvcnRfZGV2KTsKKyBmYWls X2FkZDoKKwlwdXRfZGV2aWNlKCZkLT5wb3J0X2Rldik7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYg LS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2VwMC5jIGIvZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NApp bmRleCAwMDAwMDAwMDAwMDAuLjc5NzA5OWYwNmNhYQotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZl cnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXAwLmMKQEAgLTAsMCArMSw0NzggQEAKKy8v IFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGFzcGVlZC12aHViIC0t IERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGVwMC5jIC0g RW5kcG9pbnQgMCBoYW5kbGluZworICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlv bgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJp YnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBH ZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdh cmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChh dCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4 L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Bs YXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGlu dXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vy cm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVw dC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRj aC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQu aD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNp bmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgor CisjaW5jbHVkZSAidmh1Yi5oIgorCitpbnQgYXN0X3ZodWJfcmVwbHkoc3RydWN0IGFzdF92aHVi X2VwICplcCwgY2hhciAqcHRyLCBpbnQgbGVuKQoreworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVx ID0gJmVwLT5lcDAucmVxLnJlcTsKKworCWlmIChXQVJOX09OKGVwLT5kX2lkeCAhPSAwKSkKKwkJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKFdBUk5fT04oIWVwLT5lcDAuZGlyX2luKSkKKwkJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKFdBUk5fT04obGVuID4gQVNUX1ZIVUJfRVAwX01B WF9QQUNLRVQpKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAoV0FSTl9PTihyZXEtPnN0 YXR1cyA9PSAtRUlOUFJPR1JFU1MpKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCXJlcS0+ YnVmID0gcHRyOworCXJlcS0+bGVuZ3RoID0gbGVuOworCXJlcS0+Y29tcGxldGUgPSBOVUxMOwor CXJlcS0+emVybyA9IHRydWU7CisKKwkvKiBDYWxsIGludGVybmFsIHF1ZXVlIGRpcmVjdGx5ICov CisJaWYgKGVwLT5lcC5vcHMtPnF1ZXVlKCZlcC0+ZXAsIHJlcSwgR0ZQX0FUT01JQykpCisJCXJl dHVybiBzdGRfcmVxX3N0YWxsOworCWVsc2UKKwkJcmV0dXJuIHN0ZF9yZXFfZGF0YTsKK30KKwor aW50IF9fYXN0X3ZodWJfc2ltcGxlX3JlcGx5KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBs ZW4sIC4uLikKK3sKKwl1OCAqYnVmZmVyID0gZXAtPmJ1ZjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl2 YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBsZW4pOworCisJLyogQ29weSBkYXRhIGRp cmVjdGx5IGludG8gRVAgYnVmZmVyICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQli dWZmZXJbaV0gPSB2YV9hcmcoYXJncywgaW50KTsKKwl2YV9lbmQoYXJncyk7CisKKwkvKiByZXEt PmJ1ZiBOVUxMIG1lYW5zIGRhdGEgaXMgYWxyZWFkeSB0aGVyZSAqLworCXJldHVybiBhc3Rfdmh1 Yl9yZXBseShlcCwgTlVMTCwgbGVuKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9lcDBfaGFuZGxlX3Nl dHVwKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCBj cnE7CisJZW51bSBzdGRfcmVxX3JjIHN0ZF9yZXFfcmM7CisJaW50IHJjID0gLUVOT0RFVjsKKwor CWlmIChXQVJOX09OKGVwLT5kX2lkeCAhPSAwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBHcmFi IHRoZSBzZXR1cCBwYWNrZXQgZnJvbSB0aGUgY2hpcCBhbmQgYnl0ZXN3YXAKKwkgKiBpbnRlcmVz dGluZyBmaWVsZHMKKwkgKi8KKwltZW1jcHlfZnJvbWlvKCZjcnEsIGVwLT5lcDAuc2V0dXAsIHNp emVvZihjcnEpKTsKKworCUVQREJHKGVwLCAiU0VUVVAgcGFja2V0ICUwMngvJTAyeC8lMDR4LyUw NHgvJTA0eCBbJXNdIHN0PSVkXG4iLAorCSAgICAgIGNycS5iUmVxdWVzdFR5cGUsIGNycS5iUmVx dWVzdCwKKwkgICAgICAgbGUxNl90b19jcHUoY3JxLndWYWx1ZSksCisJICAgICAgIGxlMTZfdG9f Y3B1KGNycS53SW5kZXgpLAorCSAgICAgICBsZTE2X3RvX2NwdShjcnEud0xlbmd0aCksCisJICAg ICAgIChjcnEuYlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTikgPyAiaW4iIDogIm91dCIsCisJICAg ICAgIGVwLT5lcDAuc3RhdGUpOworCisJLyogQ2hlY2sgb3VyIHN0YXRlLCBjYW5jZWwgcGVuZGlu ZyByZXF1ZXN0cyBpZiBuZWVkZWQgKi8KKwlpZiAoZXAtPmVwMC5zdGF0ZSAhPSBlcDBfc3RhdGVf dG9rZW4pIHsKKwkJRVBEQkcoZXAsICJ3cm9uZyBzdGF0ZVxuIik7CisJCWFzdF92aHViX251a2Uo ZXAsIDApOworCQlnb3RvIHN0YWxsOworCX0KKworCS8qIENhbGN1bGF0ZSBuZXh0IHN0YXRlIGZv ciBFUDAgKi8KKwllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX2RhdGE7CisJZXAtPmVwMC5kaXJf aW4gPSAhIShjcnEuYlJlcXVlc3RUeXBlICYgVVNCX0RJUl9JTik7CisKKwkvKiBJZiB0aGlzIGlz IHRoZSB2SHViLCB3ZSBoYW5kbGUgcmVxdWVzdHMgZGlmZmVyZW50bHkgKi8KKwlzdGRfcmVxX3Jj ID0gc3RkX3JlcV9kcml2ZXI7CisJaWYgKGVwLT5kZXYgPT0gTlVMTCkgeworCQlpZiAoKGNycS5i UmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9TVEFOREFSRCkKKwkJCXN0 ZF9yZXFfcmMgPSBhc3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3QoZXAsICZjcnEpOworCQllbHNlIGlm ICgoY3JxLmJSZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01BU0spID09IFVTQl9UWVBFX0NMQVNTKQor CQkJc3RkX3JlcV9yYyA9IGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0KGVwLCAmY3JxKTsKKwkJ ZWxzZQorCQkJc3RkX3JlcV9yYyA9IHN0ZF9yZXFfc3RhbGw7CisJfSBlbHNlIGlmICgoY3JxLmJS ZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01BU0spID09IFVTQl9UWVBFX1NUQU5EQVJEKQorCQlzdGRf cmVxX3JjID0gYXN0X3ZodWJfc3RkX2Rldl9yZXF1ZXN0KGVwLCAmY3JxKTsKKworCS8qIEFjdCB1 cG9uIHJlc3VsdCAqLworCXN3aXRjaChzdGRfcmVxX3JjKSB7CisJY2FzZSBzdGRfcmVxX2NvbXBs ZXRlOgorCQlnb3RvIGNvbXBsZXRlOworCWNhc2Ugc3RkX3JlcV9zdGFsbDoKKwkJZ290byBzdGFs bDsKKwljYXNlIHN0ZF9yZXFfZHJpdmVyOgorCQlicmVhazsKKwljYXNlIHN0ZF9yZXFfZGF0YToK KwkJcmV0dXJuOworCX0KKworCS8qIFBhc3MgcmVxdWVzdCB1cCB0byB0aGUgZ2FkZ2V0IGRyaXZl ciAqLworCWlmIChXQVJOX09OKCFlcC0+ZGV2KSkKKwkJZ290byBzdGFsbDsKKwlpZiAoZXAtPmRl di0+ZHJpdmVyKSB7CisJCUVQREJHKGVwLCAiZm9yd2FyZGluZyB0byBnYWRnZXQuLi5cbiIpOwor CQlzcGluX3VubG9jaygmZXAtPnZodWItPmxvY2spOworCQlyYyA9IGVwLT5kZXYtPmRyaXZlci0+ c2V0dXAoJmVwLT5kZXYtPmdhZGdldCwgJmNycSk7CisJCXNwaW5fbG9jaygmZXAtPnZodWItPmxv Y2spOworCQlFUERCRyhlcCwgImRyaXZlciByZXR1cm5lZCAlZFxuIiwgcmMpOworCX0gZWxzZSB7 CisJCUVQREJHKGVwLCAibm8gZ2FkZ2V0IGZvciByZXF1ZXN0ICFcbiIpOworCX0KKwlpZiAocmMg Pj0gMCkKKwkJcmV0dXJuOworCisgc3RhbGw6CisJRVBEQkcoZXAsICJzdGFsbGluZ1xuIik7CisJ d3JpdGVsKFZIVUJfRVAwX0NUUkxfU1RBTEwsIGVwLT5lcDAuY3Rsc3RhdCk7CisJZXAtPmVwMC5z dGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJZXAtPmVwMC5kaXJfaW4gPSBmYWxzZTsKKwlyZXR1 cm47CisKKyBjb21wbGV0ZToKKwlFUFZEQkcoZXAsICJzZW5kaW5nIFtpbl0gc3RhdHVzIHdpdGgg bm8gZGF0YVxuIik7CisJd3JpdGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0 YXQpOworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCWVwLT5lcDAuZGlyX2lu ID0gZmFsc2U7Cit9CisKKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXAwX2RvX3NlbmQoc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCQkgc3RydWN0IGFzdF92aHViX3JlcSAqcmVxKQoreworCXVu c2lnbmVkIGludCBjaHVuazsKKwl1MzIgcmVnOworCisJLyogSWYgdGhpcyBpcyBhIDAtbGVuZ3Ro IHJlcXVlc3QsIGl0J3MgdGhlIGdhZGdldCB0cnlpbmcgdG8KKwkgKiBzZW5kIGEgc3RhdHVzIG9u IG91ciBiZWhhbGYuIFdlIHRha2UgaXQgZnJvbSBoZXJlLgorCSAqLworCWlmIChyZXEtPnJlcS5s ZW5ndGggPT0gMCkKKwkJcmVxLT5sYXN0X2Rlc2MgPSAxOworCisJLyogQXJlIHdlIGRvbmUgPyBD b21wbGV0ZSByZXF1ZXN0LCBvdGhlcndpc2Ugd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQgKi8KKwlp ZiAocmVxLT5sYXN0X2Rlc2MgPj0gMCkgeworCQlFUFZEQkcoZXAsICJjb21wbGV0ZSBzZW5kICVk LyVkXG4iLAorCQkgICAgICAgcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgpOworCQll cC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJd3JpdGVsKFZIVUJfRVAwX1JYX0JV RkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIDApOwor CQlyZXR1cm47CisJfQorCisJLyoKKwkgKiBOZXh0IGNodW5rIGNyb3BwZWQgdG8gbWF4IHBhY2tl dCBzaXplLiBBbHNvIGNoZWNrIGlmIHRoaXMKKwkgKiBpcyB0aGUgbGFzdCBwYWNrZXQKKwkgKi8K KwljaHVuayA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKKwlpZiAoY2h1bmsg PiBlcC0+ZXAubWF4cGFja2V0KQorCQljaHVuayA9IGVwLT5lcC5tYXhwYWNrZXQ7CisJZWxzZSBp ZiAoKGNodW5rIDwgZXAtPmVwLm1heHBhY2tldCkgfHwgIXJlcS0+cmVxLnplcm8pCisJCXJlcS0+ bGFzdF9kZXNjID0gMTsKKworCUVQVkRCRyhlcCwgInNlbmQgY2h1bms9JWQgbGFzdD0lZCwgcmVx LT5hY3Q9JWQgbXA9JWRcbiIsCisJICAgICAgIGNodW5rLCByZXEtPmxhc3RfZGVzYywgcmVxLT5y ZXEuYWN0dWFsLCBlcC0+ZXAubWF4cGFja2V0KTsKKworCS8qCisJICogQ29weSBkYXRhIGlmIGFu eSAoaW50ZXJuYWwgcmVxdWVzdHMgYWxyZWFkeSBoYXZlIGRhdGEKKwkgKiBpbiB0aGUgRVAgYnVm ZmVyKQorCSAqLworCWlmIChjaHVuayAmJiByZXEtPnJlcS5idWYpCisJCW1lbWNweShlcC0+YnVm LCByZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWwsIGNodW5rKTsKKworCS8qIFJlbWVtYmVy IGNodW5rIHNpemUgYW5kIHRyaWdnZXIgc2VuZCAqLworCXJlZyA9IFZIVUJfRVAwX1NFVF9UWF9M RU4oY2h1bmspOworCXdyaXRlbChyZWcsIGVwLT5lcDAuY3Rsc3RhdCk7CisJd3JpdGVsKHJlZyB8 IFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCXJlcS0+cmVxLmFjdHVh bCArPSBjaHVuazsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXAwX3J4X3ByaW1lKHN0cnVj dCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJRVBWREJHKGVwLCAicnggcHJpbWVcbiIpOworCisJLyog UHJpbWUgZW5kcG9pbnQgZm9yIHJlY2VpdmluZyBkYXRhICovCisJd3JpdGVsKFZIVUJfRVAwX1JY X0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQgKyBBU1RfVkhVQl9FUDBfQ1RSTCk7Cit9CisKK3N0 YXRpYyB2b2lkIGFzdF92aHViX2VwMF9kb19yZWNlaXZlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAs IHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGxlbikKK3sK Kwl1bnNpZ25lZCBpbnQgcmVtYWluOworCWludCByYyA9IDA7CisKKwkvKiBXZSBhcmUgcmVjZWl2 aW5nLi4uIGdyYWIgcmVxdWVzdCAqLworCXJlbWFpbiA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+ cmVxLmFjdHVhbDsKKworCUVQVkRCRyhlcCwgInJlY2VpdmUgZ290PSVkIHJlbWFpbj0lZFxuIiwg bGVuLCByZW1haW4pOworCisJLyogQXJlIHdlIGdldHRpbmcgbW9yZSB0aGFuIGFza2VkID8gKi8K KwlpZiAobGVuID4gcmVtYWluKSB7CisJCUVQREJHKGVwLCAicmVjZWl2aW5nIHRvbyBtdWNoIChv dmY6ICVkKSAhXG4iLAorCQkgICAgICBsZW4gLSByZW1haW4pOworCQlsZW4gPSByZW1haW47CisJ CXJjID0gLUVPVkVSRkxPVzsKKwl9CisJaWYgKGxlbiAmJiByZXEtPnJlcS5idWYpCisJCW1lbWNw eShyZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWwsIGVwLT5idWYsIGxlbik7CisJcmVxLT5y ZXEuYWN0dWFsICs9IGxlbjsKKworCS8qIERvbmUgPyAqLworCWlmIChsZW4gPCBlcC0+ZXAubWF4 cGFja2V0IHx8IGxlbiA9PSByZW1haW4pIHsKKwkJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9z dGF0dXM7CisJCXdyaXRlbChWSFVCX0VQMF9UWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0KTsK KwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCByYyk7CisJfSBlbHNlCisJCWFzdF92aHViX2VwMF9y eF9wcmltZShlcCk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soc3RydWN0IGFz dF92aHViX2VwICplcCwgYm9vbCBpbl9hY2spCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVx OworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBkZXZpY2UgKmRl diA9ICZ2aHViLT5wZGV2LT5kZXY7CisJYm9vbCBzdGFsbCA9IGZhbHNlOworCXUzMiBzdGF0Owor CisJLyogUmVhZCBFUDAgc3RhdHVzICovCisJc3RhdCA9IHJlYWRsKGVwLT5lcDAuY3Rsc3RhdCk7 CisKKwkvKiBHcmFiIGN1cnJlbnQgcmVxdWVzdCBpZiBhbnkgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0 X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOwor CisJRVBWREJHKGVwLCAiQUNLIHN0YXR1cz0lMDh4LHN0YXRlPSVkIGlzX2luPSVkIGluX2Fjaz0l ZCByZXE9JXBcbiIsCisJCXN0YXQsIGVwLT5lcDAuc3RhdGUsIGVwLT5lcDAuZGlyX2luLCBpbl9h Y2ssIHJlcSk7CisKKwlzd2l0Y2goZXAtPmVwMC5zdGF0ZSkgeworCWNhc2UgZXAwX3N0YXRlX3Rv a2VuOgorCQkvKiBUaGVyZSBzaG91bGQgYmUgbm8gcmVxdWVzdCBxdWV1ZWQgaW4gdGhhdCBzdGF0 ZS4uLiAqLworCQlpZiAocmVxKSB7CisJCQlkZXZfd2FybihkZXYsICJyZXF1ZXN0IHByZXNlbnQg d2hpbGUgaW4gVE9LRU4gc3RhdGVcbiIpOworCQkJYXN0X3ZodWJfbnVrZShlcCwgLUVJTlZBTCk7 CisJCX0KKwkJZGV2X3dhcm4oZGV2LCAiYWNrIHdoaWxlIGluIFRPS0VOIHN0YXRlXG4iKTsKKwkJ c3RhbGwgPSB0cnVlOworCQlicmVhazsKKwljYXNlIGVwMF9zdGF0ZV9kYXRhOgorCQkvKiBDaGVj ayB0aGUgc3RhdGUgYml0cyBjb3JyZXNwb25kaW5nIHRvIG91ciBkaXJlY3Rpb24gKi8KKwkJaWYg KChlcC0+ZXAwLmRpcl9pbiAmJiAoc3RhdCAmIFZIVUJfRVAwX1RYX0JVRkZfUkRZKSkgfHwKKwkJ ICAgICghZXAtPmVwMC5kaXJfaW4gJiYgKHN0YXQgJiBWSFVCX0VQMF9SWF9CVUZGX1JEWSkpIHx8 CisJCSAgICAoZXAtPmVwMC5kaXJfaW4gIT0gaW5fYWNrKSkgeworCQkJZGV2X3dhcm4oZGV2LCAi aXJxIHN0YXRlIG1pc21hdGNoIik7CisJCQlzdGFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJfQor CQkvKgorCQkgKiBXZSBhcmUgaW4gZGF0YSBwaGFzZSBhbmQgdGhlcmUncyBubyByZXF1ZXN0LCBz b21ldGhpbmcgaXMKKwkJICogd3JvbmcsIHN0YWxsCisJCSAqLworCQlpZiAoIXJlcSkgeworCQkJ ZGV2X3dhcm4oZGV2LCAiZGF0YSBwaGFzZSwgbm8gcmVxdWVzdFxuIik7CisJCQlzdGFsbCA9IHRy dWU7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFdlIGhhdmUgYSByZXF1ZXN0LCBoYW5kbGUgZGF0 YSB0cmFuc2ZlcnMgKi8KKwkJaWYgKGVwLT5lcDAuZGlyX2luKQorCQkJYXN0X3ZodWJfZXAwX2Rv X3NlbmQoZXAsIHJlcSk7CisJCWVsc2UKKwkJCWFzdF92aHViX2VwMF9kb19yZWNlaXZlKGVwLCBy ZXEsIFZIVUJfRVAwX1JYX0xFTihzdGF0KSk7CisJCXJldHVybjsKKwljYXNlIGVwMF9zdGF0ZV9z dGF0dXM6CisJCS8qIE51a2Ugc3RhbGUgcmVxdWVzdHMgKi8KKwkJaWYgKHJlcSkgeworCQkJZGV2 X3dhcm4oZGV2LCAicmVxdWVzdCBwcmVzZW50IHdoaWxlIGluIFNUQVRVUyBzdGF0ZVxuIik7CisJ CQlhc3Rfdmh1Yl9udWtlKGVwLCAtRUlOVkFMKTsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBz dGF0dXMgcGhhc2UgY29tcGxldGVzIHdpdGggdGhlIHdyb25nIGFjaywgc3RhbGwKKwkJICogdGhl IGVuZHBvaW50IGp1c3QgaW4gY2FzZSwgdG8gYWJvcnQgd2hhdGV2ZXIgdGhlIGhvc3QKKwkJICog d2FzIGRvaW5nLgorCQkgKi8KKwkJaWYgKGVwLT5lcDAuZGlyX2luID09IGluX2FjaykgeworCQkJ ZGV2X3dhcm4oZGV2LCAic3RhdHVzIGRpcmVjdGlvbiBtaXNtYXRjaFxuIik7CisJCQlzdGFsbCA9 IHRydWU7CisJCX0KKwl9CisKKwkvKiBSZXNldCB0byB0b2tlbiBzdGF0ZSAqLworCWVwLT5lcDAu c3RhdGUgPSBlcDBfc3RhdGVfdG9rZW47CisJaWYgKHN0YWxsKQorCQl3cml0ZWwoVkhVQl9FUDBf Q1RSTF9TVEFMTCwgZXAtPmVwMC5jdGxzdGF0KTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9l cDBfcXVldWUoc3RydWN0IHVzYl9lcCogdV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSwK KwkJCSAgICAgIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEg PSB0b19hc3RfcmVxKHVfcmVxKTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2Vw KHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBkZXZp Y2UgKmRldiA9ICZ2aHViLT5wZGV2LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8q IFBhcmFub2lkIGNoZWtzICovCisJaWYgKCF1X3JlcSB8fCAoIXVfcmVxLT5jb21wbGV0ZSAmJiAh cmVxLT5pbnRlcm5hbCkpIHsKKwkJZGV2X3dhcm4oZGV2LCAiQm9ndXMgRVAwIHJlcXVlc3QgISB1 X3JlcT0lcFxuIiwgdV9yZXEpOworCQlpZiAodV9yZXEpIHsKKwkJCWRldl93YXJuKGRldiwgImNv bXBsZXRlPSVwIGludGVybmFsPSVkXG4iLAorCQkJCSB1X3JlcS0+Y29tcGxldGUsIHJlcS0+aW50 ZXJuYWwpOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE5vdCBlbmRwb2ludCAw ID8gKi8KKwlpZiAoV0FSTl9PTihlcC0+ZF9pZHggIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOwor CisJLyogRGlzYWJsZWQgZGV2aWNlICovCisJaWYgKGVwLT5kZXYgJiYgKCFlcC0+ZGV2LT5lbmFi bGVkIHx8IGVwLT5kZXYtPnN1c3BlbmRlZCkpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJLyog RGF0YSwgbm8gYnVmZmVyIGFuZCBub3QgaW50ZXJuYWwgPyAqLworCWlmICh1X3JlcS0+bGVuZ3Ro ICYmICF1X3JlcS0+YnVmICYmICFyZXEtPmludGVybmFsKSB7CisJCWRldl93YXJuKGRldiwgIlJl cXVlc3Qgd2l0aCBubyBidWZmZXIgIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUVQ VkRCRyhlcCwgImVucXVldWUgcmVxIEAlcFxuIiwgcmVxKTsKKwlFUFZEQkcoZXAsICIgIGw9JWQg emVybz0lZCBub3Nob3J0PSVkIGlzX2luPSVkXG4iLAorCSAgICAgICB1X3JlcS0+bGVuZ3RoLCB1 X3JlcS0+emVybywKKwkgICAgICAgdV9yZXEtPnNob3J0X25vdF9vaywgZXAtPmVwMC5kaXJfaW4p OworCisJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IHByb2dyZXNzIGZpZWxkcyAqLworCXVfcmVxLT5z dGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJdV9yZXEtPmFjdHVhbCA9IDA7CisJcmVxLT5sYXN0X2Rl c2MgPSAtMTsKKwlyZXEtPmFjdGl2ZSA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZo dWItPmxvY2ssIGZsYWdzKTsKKworCS8qIEVQMCBjYW4gb25seSBzdXBwb3J0IGEgc2luZ2xlIHJl cXVlc3QgYXQgYSB0aW1lICovCisJaWYgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpIHx8IGVwLT5l cDAuc3RhdGUgPT0gZXAwX3N0YXRlX3Rva2VuKSB7CisJCWRldl93YXJuKGRldiwgIkVQMDogUmVx dWVzdCBpbiB3cm9uZyBzdGF0ZVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWIt PmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBBZGQgcmVxdWVzdCB0 byBsaXN0IGFuZCBraWNrIHByb2Nlc3NpbmcgaWYgZW1wdHkgKi8KKwlsaXN0X2FkZF90YWlsKCZy ZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKworCWlmIChlcC0+ZXAwLmRpcl9pbikgeworCQkvKiBJ TiByZXF1ZXN0LCBzZW5kIGRhdGEgKi8KKwkJYXN0X3ZodWJfZXAwX2RvX3NlbmQoZXAsIHJlcSk7 CisJfSBlbHNlIGlmICh1X3JlcS0+bGVuZ3RoID09IDApIHsKKwkJLyogMC1sZW4gcmVxdWVzdCwg c2VuZCBjb21wbGV0aW9uIGFzIHJ4ICovCisJCUVQVkRCRyhlcCwgIjAtbGVuZ3RoIHJ4IGNvbXBs ZXRpb25cbiIpOworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJd3JpdGVs KFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCQlhc3Rfdmh1Yl9kb25l KGVwLCByZXEsIDApOworCX0gZWxzZSB7CisJCS8qIE9VVCByZXF1ZXN0LCBzdGFydCByZWNlaXZl ciAqLworCQlhc3Rfdmh1Yl9lcDBfcnhfcHJpbWUoZXApOworCX0KKworCXNwaW5fdW5sb2NrX2ly cXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMg aW50IGFzdF92aHViX2VwMF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1c2Jf cmVxdWVzdCAqdV9yZXEpCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1 X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3Zo dWJfcmVxICpyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFMOwor CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIE9ubHkgb25l IHJlcXVlc3QgY2FuIGJlIGluIHRoZSBxdWV1ZSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlf b3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwkvKiBJ cyBpdCBvdXJzID8gKi8KKwlpZiAocmVxICYmIHVfcmVxID09ICZyZXEtPnJlcSkgeworCQlFUFZE QkcoZXAsICJkZXF1ZXVlIHJlcSBAJXBcbiIsIHJlcSk7CisKKwkJLyoKKwkJICogV2UgZG9uJ3Qg aGF2ZSB0byBkZWFsIHdpdGggImFjdGl2ZSIgYXMgYWxsCisJCSAqIERNQXMgZ28gdG8gdGhlIEVQ IGJ1ZmZlcnMsIG5vdCB0aGUgcmVxdWVzdC4KKwkJICovCisJCWFzdF92aHViX2RvbmUoZXAsIHJl cSwgLUVDT05OUkVTRVQpOworCisJCS8qIFdlIGRvIHN0YWxsIHRoZSBFUCB0byBjbGVhbiB0aGlu Z3MgdXAgaW4gSFcgKi8KKwkJd3JpdGVsKFZIVUJfRVAwX0NUUkxfU1RBTEwsIGVwLT5lcDAuY3Rs c3RhdCk7CisJCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCQllcC0+ZXAwLmRp cl9pbiA9IGZhbHNlOworCQlyYyA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZo dWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVj dCB1c2JfZXBfb3BzIGFzdF92aHViX2VwMF9vcHMgPSB7CisJLnF1ZXVlCQk9IGFzdF92aHViX2Vw MF9xdWV1ZSwKKwkuZGVxdWV1ZQk9IGFzdF92aHViX2VwMF9kZXF1ZXVlLAorCS5hbGxvY19yZXF1 ZXN0CT0gYXN0X3ZodWJfYWxsb2NfcmVxdWVzdCwKKwkuZnJlZV9yZXF1ZXN0CT0gYXN0X3ZodWJf ZnJlZV9yZXF1ZXN0LAorfTsKKwordm9pZCBhc3Rfdmh1Yl9pbml0X2VwMChzdHJ1Y3QgYXN0X3Zo dWIgKnZodWIsIHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCSAgICAgICBzdHJ1Y3QgYXN0X3Zo dWJfZGV2ICpkZXYpCit7CisJbWVtc2V0KGVwLCAwLCBzaXplb2YoKmVwKSk7CisKKwlJTklUX0xJ U1RfSEVBRCgmZXAtPmVwLmVwX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZlcC0+cXVldWUpOwor CWVwLT5lcC5vcHMgPSAmYXN0X3ZodWJfZXAwX29wczsKKwllcC0+ZXAubmFtZSA9ICJlcDAiOwor CWVwLT5lcC5jYXBzLnR5cGVfY29udHJvbCA9IHRydWU7CisJdXNiX2VwX3NldF9tYXhwYWNrZXRf bGltaXQoJmVwLT5lcCwgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpOworCWVwLT5kX2lkeCA9IDA7 CisJZXAtPmRldiA9IGRldjsKKwllcC0+dmh1YiA9IHZodWI7CisJZXAtPmVwMC5zdGF0ZSA9IGVw MF9zdGF0ZV90b2tlbjsKKwlJTklUX0xJU1RfSEVBRCgmZXAtPmVwMC5yZXEucXVldWUpOworCWVw LT5lcDAucmVxLmludGVybmFsID0gdHJ1ZTsKKworCS8qIFNtYWxsIGRpZmZlcmVuY2UgYmV0d2Vl biB2SHViIGFuZCBkZXZpY2VzICovCisJaWYgKGRldikgeworCQllcC0+ZXAwLmN0bHN0YXQgPSBk ZXYtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRVAwX0NUUkw7CisJCWVwLT5lcDAuc2V0dXAgPSB2aHVi LT5yZWdzICsKKwkJCUFTVF9WSFVCX1NFVFVQMCArIDggKiAoZGV2LT5pbmRleCArIDEpOworCQll cC0+YnVmID0gdmh1Yi0+ZXAwX2J1ZnMgKworCQkJQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKiAo ZGV2LT5pbmRleCArIDEpOworCQllcC0+YnVmX2RtYSA9IHZodWItPmVwMF9idWZzX2RtYSArCisJ CQlBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqIChkZXYtPmluZGV4ICsgMSk7CisJfSBlbHNlIHsK KwkJZXAtPmVwMC5jdGxzdGF0ID0gdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMOworCQll cC0+ZXAwLnNldHVwID0gdmh1Yi0+cmVncyArIEFTVF9WSFVCX1NFVFVQMDsKKwkJZXAtPmJ1ZiA9 IHZodWItPmVwMF9idWZzOworCQllcC0+YnVmX2RtYSA9IHZodWItPmVwMF9idWZzX2RtYTsKKwl9 Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5j IGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4uYwpuZXcgZmlsZSBtb2Rl IDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmQ3YTE4YTkzZmZiYQotLS0gL2Rldi9udWxsCisr KyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXBuLmMKQEAgLTAsMCArMSw4 NDMgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGFzcGVl ZC12aHViIC0tIERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAq IGVwbi5jIC0gR2VuZXJpYyBlbmRwb2ludHMgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAy MDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJl OyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUg dGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQor ICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUg TGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8K KworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgor I2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5 Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgor I2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1 ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNs dWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUg PGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxp bnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51 eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidmh1Yi5oIgorCisjZGVmaW5lIEVYVFJBX0NI RUNLUworCisjaWZkZWYgRVhUUkFfQ0hFQ0tTCisjZGVmaW5lIENIRUNLKGVwLCBleHByLCBmbXQu Li4pIAkJCQlcCisJZG8gewkJCQkJCQlcCisJCWlmICghKGV4cHIpKSBFUERCRyhlcCwgIkNIRUNL OiIgZm10KTsJCVwKKwl9IHdoaWxlKDApCisjZWxzZQorI2RlZmluZSBDSEVDSyhlcCwgZXhwciwg Zm10Li4uKQlkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9l cG5fa2ljayhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEp Cit7CisJdW5zaWduZWQgaW50IGFjdCA9IHJlcS0+cmVxLmFjdHVhbDsKKwl1bnNpZ25lZCBpbnQg bGVuID0gcmVxLT5yZXEubGVuZ3RoOworCXVuc2lnbmVkIGludCBjaHVuazsKKworCS8qIFRoZXJl IHNob3VsZCBiZSBubyBETUEgb25nb2luZyAqLworCVdBUk5fT04ocmVxLT5hY3RpdmUpOworCisJ LyogQ2FsY3VsYXRlIG5leHQgY2h1bmsgc2l6ZSAqLworCWNodW5rID0gbGVuIC0gYWN0OworCWlm IChjaHVuayA+IGVwLT5lcC5tYXhwYWNrZXQpCisJCWNodW5rID0gZXAtPmVwLm1heHBhY2tldDsK KwllbHNlIGlmICgoY2h1bmsgPCBlcC0+ZXAubWF4cGFja2V0KSB8fCAhcmVxLT5yZXEuemVybykK KwkJcmVxLT5sYXN0X2Rlc2MgPSAxOworCisJRVBWREJHKGVwLCAia2ljayByZXEgJXAgYWN0PSVk LyVkIGNodW5rPSVkIGxhc3Q9JWRcbiIsCisJICAgICAgIHJlcSwgYWN0LCBsZW4sIGNodW5rLCBy ZXEtPmxhc3RfZGVzYyk7CisKKwkvKiBJZiBETUEgdW5hdmFpbGFibGUsIHVzaW5nIHN0YWdpbmcg RVAgYnVmZmVyICovCisJaWYgKCFyZXEtPnJlcS5kbWEpIHsKKworCQkvKiBGb3IgSU4gdHJhbnNm ZXJzLCBjb3B5IGRhdGEgb3ZlciBmaXJzdCAqLworCQlpZiAoZXAtPmVwbi5pc19pbikKKwkJCW1l bWNweShlcC0+YnVmLCByZXEtPnJlcS5idWYgKyBhY3QsIGNodW5rKTsKKwkJd3JpdGVsKGVwLT5i dWZfZG1hLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX0JBU0UpOworCX0gZWxzZQor CQl3cml0ZWwocmVxLT5yZXEuZG1hICsgYWN0LCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9E RVNDX0JBU0UpOworCisJLyogU3RhcnQgRE1BICovCisJcmVxLT5hY3RpdmUgPSB0cnVlOworCXdy aXRlbChWSFVCX0VQX0RNQV9TRVRfVFhfU0laRShjaHVuayksCisJICAgICAgIGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VUX1RY X1NJWkUoY2h1bmspIHwgVkhVQl9FUF9ETUFfU0lOR0xFX0tJQ0ssCisJICAgICAgIGVwLT5lcG4u cmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3Zo dWJfZXBuX2hhbmRsZV9hY2soc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwlzdHJ1Y3QgYXN0 X3ZodWJfcmVxICpyZXE7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1MzIgc3RhdDsKKworCS8qIFJl YWQgRVAgc3RhdHVzICovCisJc3RhdCA9IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQ X0RFU0NfU1RBVFVTKTsKKworCS8qIEdyYWIgY3VycmVudCByZXF1ZXN0IGlmIGFueSAqLworCXJl cSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJf cmVxLCBxdWV1ZSk7CisKKwlFUFZEQkcoZXAsICJBQ0sgc3RhdHVzPSUwOHggaXNfaW49JWQsIHJl cT0lcCAoYWN0aXZlPSVkKVxuIiwKKwkgICAgICAgc3RhdCwgZXAtPmVwbi5pc19pbiwgcmVxLCBy ZXEgPyByZXEtPmFjdGl2ZSA6IDApOworCisJLyogSW4gYWJzZW5jZSBvZiBhIHJlcXVlc3QsIGJh aWwgb3V0LCBtdXN0IGhhdmUgYmVlbiBkZXF1ZXVlZCAqLworCWlmICghcmVxKQorCQlyZXR1cm47 CisKKwkvKgorCSAqIFJlcXVlc3Qgbm90IGFjdGl2ZSwgbW92ZSBvbiB0byBwcm9jZXNzaW5nIHF1 ZXVlLCBhY3RpdmUgcmVxdWVzdAorCSAqIHdhcyBwcm9iYWJseSBkZXF1ZXVlZAorCSAqLworCWlm ICghcmVxLT5hY3RpdmUpCisJCWdvdG8gbmV4dF9jaHVuazsKKworCS8qIENoZWNrIGlmIEhXIGhh cyBtb3ZlZCBvbiAqLworCWlmIChWSFVCX0VQX0RNQV9SUFRSKHN0YXQpICE9IDApIHsKKwkJRVBE QkcoZXAsICJETUEgcmVhZCBwb2ludGVyIG5vdCAwICFcbiIpOworCQlyZXR1cm47CisJfQorCisJ LyogTm8gY3VycmVudCBETUEgb25nb2luZyAqLworCXJlcS0+YWN0aXZlID0gZmFsc2U7CisKKwkv KiBHcmFiIGxlbmdodCBvdXQgb2YgSFcgKi8KKwlsZW4gPSBWSFVCX0VQX0RNQV9UWF9TSVpFKHN0 YXQpOworCisJLyogSWYgbm90IHVzaW5nIERNQSwgY29weSBkYXRhIG91dCBpZiBuZWVkZWQgKi8K KwlpZiAoIXJlcS0+cmVxLmRtYSAmJiAhZXAtPmVwbi5pc19pbiAmJiBsZW4pCisJCW1lbWNweShy ZXEtPnJlcS5idWYgKyByZXEtPnJlcS5hY3R1YWwsIGVwLT5idWYsIGxlbik7CisKKwkvKiBBZGp1 c3Qgc2l6ZSAqLworCXJlcS0+cmVxLmFjdHVhbCArPSBsZW47CisKKwkvKiBDaGVjayBmb3Igc2hv cnQgcGFja2V0ICovCisJaWYgKGxlbiA8IGVwLT5lcC5tYXhwYWNrZXQpCisJCXJlcS0+bGFzdF9k ZXNjID0gMTsKKworCS8qIFRoYXQncyBpdCA/IGNvbXBsZXRlIHRoZSByZXF1ZXN0IGFuZCBwaWNr IGEgbmV3IG9uZSAqLworCWlmIChyZXEtPmxhc3RfZGVzYyA+PSAwKSB7CisJCWFzdF92aHViX2Rv bmUoZXAsIHJlcSwgMCk7CisJCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1 ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLAorCQkJCQkgICAgICAgcXVldWUpOworCisJCS8qCisJ CSAqIER1ZSB0byBsb2NrIGRyb3BwaW5nIGluc2lkZSAiZG9uZSIgdGhlIG5leHQgcmVxdWVzdCBj b3VsZAorCQkgKiBhbHJlYWR5IGJlIGFjdGl2ZSwgc28gY2hlY2sgZm9yIHRoYXQgYW5kIGJhaWwg aWYgbmVlZGVkLgorCQkgKi8KKwkJaWYgKCFyZXEgfHwgcmVxLT5hY3RpdmUpCisJCQlyZXR1cm47 CisJfQorCisgbmV4dF9jaHVuazoKKwlhc3Rfdmh1Yl9lcG5fa2ljayhlcCwgcmVxKTsKK30KKwor c3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCS8qCisJICogZF9uZXh0ID09IGRfbGFzdCBtZWFucyBk ZXNjcmlwdG9yIGxpc3QgZW1wdHkgdG8gSFcsCisJICogdGh1cyB3ZSBjYW4gb25seSBoYXZlIEFT VF9WSFVCX0RFU0NTX0NPVU5ULTEgZGVzY3JpcHRvcnMKKwkgKiBpbiB0aGUgbGlzdAorCSAqLwor CXJldHVybiAoZXAtPmVwbi5kX2xhc3QgKyBBU1RfVkhVQl9ERVNDU19DT1VOVCAtIGVwLT5lcG4u ZF9uZXh0IC0gMSkgJgorCQkoQVNUX1ZIVUJfREVTQ1NfQ09VTlQgLSAxKTsKK30KKworc3RhdGlj IHZvaWQgYXN0X3ZodWJfZXBuX2tpY2tfZGVzYyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJ CSAgIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSkKK3sKKwl1bnNpZ25lZCBpbnQgYWN0ID0gcmVx LT5hY3RfY291bnQ7CisJdW5zaWduZWQgaW50IGxlbiA9IHJlcS0+cmVxLmxlbmd0aDsKKwl1bnNp Z25lZCBpbnQgY2h1bms7CisKKwkvKiBNYXJrIHJlcXVlc3QgYWN0aXZlIGlmIG5vdCBhbHJlYWR5 ICovCisJcmVxLT5hY3RpdmUgPSB0cnVlOworCisJLyogSWYgdGhlIHJlcXVlc3Qgd2FzIGFscmVh ZHkgY29tcGxldGVseSB3cml0dGVuLCBkbyBub3RoaW5nICovCisJaWYgKHJlcS0+bGFzdF9kZXNj ID49IDApCisJCXJldHVybjsKKworCUVQVkRCRyhlcCwgImtpY2sgYWN0PSVkLyVkIGNodW5rX21h eD0lZCBmcmVlX2Rlc2NzPSVkXG4iLAorCSAgICAgICBhY3QsIGxlbiwgZXAtPmVwbi5jaHVua19t YXgsIGFzdF92aHViX2NvdW50X2ZyZWVfZGVzY3MoZXApKTsKKworCS8qIFdoaWxlIHdlIGNhbiBj cmVhdGUgZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSAoYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhl cCkgJiYgcmVxLT5sYXN0X2Rlc2MgPCAwKSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9kZXNjICpkZXNj OworCQl1bnNpZ25lZCBpbnQgZF9udW07CisKKwkJLyogR3JhYiBuZXh0IGZyZWUgZGVzY3JpcHRv ciAqLworCQlkX251bSA9IGVwLT5lcG4uZF9uZXh0OworCQlkZXNjID0gJmVwLT5lcG4uZGVzY3Nb ZF9udW1dOworCQllcC0+ZXBuLmRfbmV4dCA9IChkX251bSArIDEpICYgKEFTVF9WSFVCX0RFU0NT X0NPVU5UIC0gMSk7CisKKwkJLyogQ2FsY3VsYXRlIG5leHQgY2h1bmsgc2l6ZSAqLworCQljaHVu ayA9IGxlbiAtIGFjdDsKKwkJaWYgKGNodW5rIDw9IGVwLT5lcG4uY2h1bmtfbWF4KSB7CisJCQkv KgorCQkJICogSXMgdGhpcyB0aGUgbGFzdCBwYWNrZXQgPyBCZWNhdXNlIG9mIGhhdmluZyB1cCB0 byA4CisJCQkgKiBwYWNrZXMgaW4gYSBkZXNjcmlwdG9yIHdlIGNhbid0IGp1c3QgY29tcGFyZSAi Y2h1bmsiCisJCQkgKiB3aXRoIGVwLm1heHBhY2tldC4gV2UgaGF2ZSB0byBzZWUgaWYgaXQncyBh IG11bHRpcGxlCisJCQkgKiBvZiBpdCB0byBrbm93IGlmIHdlIGhhdmUgdG8gc2VuZCBhIHplcm8g cGFja2V0LgorCQkJICogU2FkbHkgdGhhdCBpbnZvbHZlcyBhIG1vZHVsbyB3aGljaCBpcyBhIGJp dCBleHBlbnNpdmUKKwkJCSAqIGJ1dCBwcm9iYWJseSBzdGlsbCBiZXR0ZXIgdGhhbiBub3QgZG9p bmcgaXQuCisJCQkgKi8KKwkJCWlmICghcmVxLT5yZXEuemVybyB8fCAoY2h1bmsgJSBlcC0+ZXAu bWF4cGFja2V0KSAhPSAwKQorCQkJCXJlcS0+bGFzdF9kZXNjID0gZF9udW07CisJCX0gZWxzZSB7 CisJCQljaHVuayA9IGVwLT5lcG4uY2h1bmtfbWF4OworCQl9CisKKwkJRVBWREJHKGVwLCAiIGNo dW5rOiBhY3Q9JWQvJWQgY2h1bms9JWQgbGFzdD0lZCBkZXNjPSVkIGZyZWU9JWRcbiIsCisJCSAg ICAgICBhY3QsIGxlbiwgY2h1bmssIHJlcS0+bGFzdF9kZXNjLCBkX251bSwKKwkJICAgICAgIGFz dF92aHViX2NvdW50X2ZyZWVfZGVzY3MoZXApKTsKKworCQkvKiBQb3B1bGF0ZSBkZXNjcmlwdG9y ICovCisJCWRlc2MtPncwID0gY3B1X3RvX2xlMzIocmVxLT5yZXEuZG1hICsgYWN0KTsKKworCQkv KiBJbnRlcnJ1cHQgaWYgZW5kIG9mIHJlcXVlc3Qgb3Igbm8gbW9yZSBkZXNjcmlwdG9ycyAqLwor CisJCS8qCisJCSAqIFRPRE86IEJlIHNtYXJ0ZXIgYWJvdXQgaXQsIGlmIHdlIGRvbid0IGhhdmUg ZW5vdWdoCisJCSAqIGRlc2NyaXB0b3JzIHJlcXVlc3QgYW4gaW50ZXJydXB0IGJlZm9yZSBxdWV1 ZSBlbXB0eQorCQkgKiBvciBzbyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHBvcHVsYXRlIG1vcmUg YmVmb3JlCisJCSAqIHRoZSBIVyBydW5zIG91dC4gVGhpcyBpc24ndCBhIHByb2JsZW0gYXQgdGhl IG1vbWVudAorCQkgKiBhcyB3ZSB1c2UgMjU2IGRlc2NyaXB0b3JzIGFuZCBvbmx5IHB1dCBhdCBt b3N0IG9uZQorCQkgKiByZXF1ZXN0IGluIHRoZSByaW5nLgorCQkgKi8KKwkJZGVzYy0+dzEgPSBj cHVfdG9fbGUzMihWSFVCX0RTQzFfSU5fU0VUX0xFTihjaHVuaykpOworCQlpZiAocmVxLT5sYXN0 X2Rlc2MgPj0gMCB8fCAhYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhlcCkpCisJCQlkZXNjLT53 MSB8PSBjcHVfdG9fbGUzMihWSFVCX0RTQzFfSU5fSU5URVJSVVBUKTsKKworCQkvKiBBY2NvdW50 IHBhY2tldCAqLworCQlyZXEtPmFjdF9jb3VudCA9IGFjdCA9IGFjdCArIGNodW5rOworCX0KKwor CS8qIFRlbGwgSFcgYWJvdXQgbmV3IGRlc2NyaXB0b3JzICovCisJd3JpdGVsKFZIVUJfRVBfRE1B X1NFVF9DUFVfV1BUUihlcC0+ZXBuLmRfbmV4dCksCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFT VF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCUVQVkRCRyhlcCwgIkhXIGtpY2tlZCwgZF9uZXh0 PSVkIGRzdGF0PSUwOHhcbiIsCisJICAgICAgIGVwLT5lcG4uZF9uZXh0LCByZWFkbChlcC0+ZXBu LnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUykpOworfQorCitzdGF0aWMgdm9pZCBhc3Rf dmh1Yl9lcG5faGFuZGxlX2Fja19kZXNjKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJc3Ry dWN0IGFzdF92aHViX3JlcSAqcmVxOworCXVuc2lnbmVkIGludCBsZW4sIGRfbGFzdDsKKwl1MzIg c3RhdCwgc3RhdDE7CisKKwkvKiBSZWFkIEVQIHN0YXR1cywgd29ya2Fyb3VuZCBIVyByYWNlICov CisJZG8geworCQlzdGF0ID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19T VEFUVVMpOworCQlzdGF0MSA9IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0Nf U1RBVFVTKTsKKwl9IHdoaWxlKHN0YXQgIT0gc3RhdDEpOworCisJLyogRXh0cmFjdCBSUFRSICov CisJZF9sYXN0ID0gVkhVQl9FUF9ETUFfUlBUUihzdGF0KTsKKworCS8qIEdyYWIgY3VycmVudCBy ZXF1ZXN0IGlmIGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1 ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlFUFZEQkcoZXAsICJBQ0sgc3Rh dHVzPSUwOHggaXNfaW49JWQgZXAtPmRfbGFzdD0lZC4uJWRcbiIsCisJICAgICAgIHN0YXQsIGVw LT5lcG4uaXNfaW4sIGVwLT5lcG4uZF9sYXN0LCBkX2xhc3QpOworCisJLyogQ2hlY2sgYWxsIGNv bXBsZXRlZCBkZXNjcmlwdG9ycyAqLworCXdoaWxlIChlcC0+ZXBuLmRfbGFzdCAhPSBkX2xhc3Qp IHsKKwkJc3RydWN0IGFzdF92aHViX2Rlc2MgKmRlc2M7CisJCXVuc2lnbmVkIGludCBkX251bTsK KwkJYm9vbCBpc19sYXN0X2Rlc2M7CisKKwkJLyogR3JhYiBuZXh0IGNvbXBsZXRlZCBkZXNjcmlw dG9yICovCisJCWRfbnVtID0gZXAtPmVwbi5kX2xhc3Q7CisJCWRlc2MgPSAmZXAtPmVwbi5kZXNj c1tkX251bV07CisJCWVwLT5lcG4uZF9sYXN0ID0gKGRfbnVtICsgMSkgJiAoQVNUX1ZIVUJfREVT Q1NfQ09VTlQgLSAxKTsKKworCQkvKiBHcmFiIGxlbiBvdXQgb2YgZGVzY3JpcHRvciAqLworCQls ZW4gPSBWSFVCX0RTQzFfSU5fTEVOKGxlMzJfdG9fY3B1KGRlc2MtPncxKSk7CisKKwkJRVBWREJH KGVwLCAiIGRlc2MgJWQgbGVuPSVkIHJlcT0lcCAoYWN0PSVkKVxuIiwKKwkJICAgICAgIGRfbnVt LCBsZW4sIHJlcSwgcmVxID8gcmVxLT5hY3RpdmUgOiAwKTsKKworCQkvKiBJZiBubyBhY3RpdmUg cmVxdWVzdCBwZW5kaW5nLCBtb3ZlIG9uICovCisJCWlmICghcmVxIHx8ICFyZXEtPmFjdGl2ZSkK KwkJCWNvbnRpbnVlOworCisJCS8qIEFkanVzdCBzaXplICovCisJCXJlcS0+cmVxLmFjdHVhbCAr PSBsZW47CisKKwkJLyogSXMgdGhhdCB0aGUgbGFzdCBjaHVuayA/ICovCisJCWlzX2xhc3RfZGVz YyA9IHJlcS0+bGFzdF9kZXNjID09IGRfbnVtOworCQlDSEVDSyhlcCwgaXNfbGFzdF9kZXNjID09 IChsZW4gPCBlcC0+ZXAubWF4cGFja2V0IHx8CisJCQkJCSAgIChyZXEtPnJlcS5hY3R1YWwgPj0g cmVxLT5yZXEubGVuZ3RoICYmCisJCQkJCSAgICAhcmVxLT5yZXEuemVybykpLAorCQkgICAgICAi TGFzdCBwYWNrZXQgZGlzY3JlcGFuY3k6IGxhc3RfZGVzYz0lZCBsZW49JWQgci5hY3Q9JWQgIgor CQkgICAgICAici5sZW49JWQgci56ZXJvPSVkIG1wPSVkXG4iLAorCQkgICAgICBpc19sYXN0X2Rl c2MsIGxlbiwgcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgsCisJCSAgICAgIHJlcS0+ cmVxLnplcm8sIGVwLT5lcC5tYXhwYWNrZXQpOworCisJCWlmIChpc19sYXN0X2Rlc2MpIHsKKwkJ CS8qCisJCQkgKiBCZWNhdXNlIHdlIGNhbiBvbmx5IGhhdmUgb25lIHJlcXVlc3QgYXQgYSB0aW1l CisJCQkgKiBpbiBvdXIgZGVzY3JpcHRvciBsaXN0IGluIHRoaXMgaW1wbGVtZW50YXRpb24sCisJ CQkgKiBkX2xhc3QgYW5kIGVwLT5kX2xhc3Qgc2hvdWxkIG5vdyBiZSBlcXVhbAorCQkJICovCisJ CQlDSEVDSyhlcCwgZF9sYXN0ID09IGVwLT5lcG4uZF9sYXN0LAorCQkJICAgICAgIkRNQSByZWFk IHB0ciBtaXNtYXRjaCAlZCB2cyAlZFxuIiwKKwkJCSAgICAgIGRfbGFzdCwgZXAtPmVwbi5kX2xh c3QpOworCisJCQkvKiBOb3RlOiBkb25lIHdpbGwgZHJvcCBhbmQgcmUtYWNxdWlyZSB0aGUgbG9j ayAqLworCQkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAwKTsKKwkJCXJlcSA9IGxpc3RfZmlyc3Rf ZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLAorCQkJCQkJICAgICAgIHN0cnVjdCBhc3Rfdmh1Yl9y ZXEsCisJCQkJCQkgICAgICAgcXVldWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBNb3Jl IHdvcmsgPyAqLworCWlmIChyZXEpCisJCWFzdF92aHViX2Vwbl9raWNrX2Rlc2MoZXAsIHJlcSk7 Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXBuX2Fja19pcnEoc3RydWN0IGFzdF92aHViX2VwICplcCkK K3sKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpCisJCWFzdF92aHViX2Vwbl9oYW5kbGVfYWNrX2Rl c2MoZXApOworCWVsc2UKKwkJYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2soZXApOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX2Vwbl9xdWV1ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBzdHJ1Y3QgdXNi X3JlcXVlc3QgKnVfcmVxLAorCQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBh c3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2FzdF9yZXEodV9yZXEpOworCXN0cnVjdCBhc3Rfdmh1Yl9l cCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZo dWI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGVtcHR5OworCWludCByYzsKKworCS8q IFBhcmFub2lkIGNoZWNrcyAqLworCWlmICghdV9yZXEgfHwgIXVfcmVxLT5jb21wbGV0ZSB8fCAh dV9yZXEtPmJ1ZikgeworCQlkZXZfd2Fybigmdmh1Yi0+cGRldi0+ZGV2LCAiQm9ndXMgRVBuIHJl cXVlc3QgISB1X3JlcT0lcFxuIiwgdV9yZXEpOworCQlpZiAodV9yZXEpIHsKKwkJCWRldl93YXJu KCZ2aHViLT5wZGV2LT5kZXYsICJjb21wbGV0ZT0lcCBpbnRlcm5hbD0lZFxuIiwKKwkJCQkgdV9y ZXEtPmNvbXBsZXRlLCByZXEtPmludGVybmFsKTsKKwkJfQorCQlyZXR1cm4gLUVJTlZBTDsKKwl9 CisKKwkvKiBFbmRwb2ludCBlbmFibGVkID8gKi8KKwlpZiAoIWVwLT5lcG4uZW5hYmxlZCB8fCAh dV9lcC0+ZGVzYyB8fCAhZXAtPmRldiB8fCAhZXAtPmRfaWR4IHx8CisJICAgICFlcC0+ZGV2LT5l bmFibGVkIHx8IGVwLT5kZXYtPnN1c3BlbmRlZCkgeworCQlFUERCRyhlcCwiRW5xdWVpbmcgcmVx dWVzdCBvbiB3cm9uZyBvciBkaXNhYmxlZCBFUFxuIik7CisJCXJldHVybiAtRVNIVVRET1dOOwor CX0KKworCS8qIE1hcCByZXF1ZXN0IGZvciBETUEgaWYgcG9zc2libGUuIEZvciBub3csIHRoZSBy dWxlIGZvciBETUEgaXMKKwkgKiB0aGF0OgorCSAqCisJICogICogRm9yIHNpbmdsZSBzdGFnZSBt b2RlIChubyBkZXNjcmlwdG9ycyk6CisJICoKKwkgKiAgIC0gVGhlIGJ1ZmZlciBpcyBhbGlnbmVk IHRvIGEgOCBieXRlcyBib3VuZGFyeSAoSFcgcmVxdWlyZW1lbnQpCisJICogICAtIEZvciBhIE9V VCBlbmRwb2ludCwgdGhlIHJlcXVlc3Qgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIHRoZSBFUAorCSAq ICAgICBwYWNrZXQgc2l6ZSAob3RoZXJ3aXNlIHRoZSBjb250cm9sbGVyIHdpbGwgRE1BIHBhc3Qg dGhlIGVuZAorCSAqICAgICBvZiB0aGUgYnVmZmVyIGlmIHRoZSBob3N0IGlzIHNlbmRpbmcgYSB0 b28gbG9uZyBwYWNrZXQpLgorCSAqCisJICogICogRm9yIGRlc2NyaXB0b3IgbW9kZSAodHggb25s eSBmb3Igbm93KSwgYWx3YXlzLgorCSAqCisJICogV2UgY291bGQgcmVsYXggdGhlIGxhdHRlciBi eSBtYWtpbmcgdGhlIGRlY2lzaW9uIHRvIHVzZSB0aGUgYm91bmNlCisJICogYnVmZmVyIGJhc2Vk IG9uIHRoZSBzaXplIG9mIGEgZ2l2ZW4gKnNlZ21lbnQqIG9mIHRoZSByZXF1ZXN0IHJhdGhlcgor CSAqIHRoYW4gdGhlIHdob2xlIHJlcXVlc3QuCisJICovCisJaWYgKGVwLT5lcG4uZGVzY19tb2Rl IHx8CisJICAgICgoKCh1bnNpZ25lZCBsb25nKXVfcmVxLT5idWYgJiA3KSA9PSAwKSAmJgorCSAg ICAgKGVwLT5lcG4uaXNfaW4gfHwgISh1X3JlcS0+bGVuZ3RoICYgKHVfZXAtPm1heHBhY2tldCAt IDEpKSkpKSB7CisJCXJjID0gdXNiX2dhZGdldF9tYXBfcmVxdWVzdCgmZXAtPmRldi0+Z2FkZ2V0 LCB1X3JlcSwKKwkJCQkJICAgIGVwLT5lcG4uaXNfaW4pOworCQlpZiAocmMpIHsKKwkJCWRldl93 YXJuKCZ2aHViLT5wZGV2LT5kZXYsCisJCQkJICJSZXF1ZXN0IG1hcHBpbmcgZmFpbHVyZSAlZFxu IiwgcmMpOworCQkJcmV0dXJuIHJjOworCQl9CisJfSBlbHNlCisJCXVfcmVxLT5kbWEgPSAwOwor CisJRVBWREJHKGVwLCAiZW5xdWV1ZSByZXEgQCVwXG4iLCByZXEpOworCUVQVkRCRyhlcCwgIiBs PSVkIGRtYT0weCV4IHplcm89JWQgbm9zaG9ydD0lZCBub2lycT0lZCBpc19pbj0lZFxuIiwKKwkg ICAgICAgdV9yZXEtPmxlbmd0aCwgKHUzMil1X3JlcS0+ZG1hLCB1X3JlcS0+emVybywKKwkgICAg ICAgdV9yZXEtPnNob3J0X25vdF9vaywgdV9yZXEtPm5vX2ludGVycnVwdCwKKwkgICAgICAgZXAt PmVwbi5pc19pbik7CisKKwkvKiBJbml0aWFsaXplIHJlcXVlc3QgcHJvZ3Jlc3MgZmllbGRzICov CisJdV9yZXEtPnN0YXR1cyA9IC1FSU5QUk9HUkVTUzsKKwl1X3JlcS0+YWN0dWFsID0gMDsKKwly ZXEtPmFjdF9jb3VudCA9IDA7CisJcmVxLT5hY3RpdmUgPSBmYWxzZTsKKwlyZXEtPmxhc3RfZGVz YyA9IC0xOworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJZW1wdHkg PSBsaXN0X2VtcHR5KCZlcC0+cXVldWUpOworCisJLyogQWRkIHJlcXVlc3QgdG8gbGlzdCBhbmQg a2ljayBwcm9jZXNzaW5nIGlmIGVtcHR5ICovCisJbGlzdF9hZGRfdGFpbCgmcmVxLT5xdWV1ZSwg JmVwLT5xdWV1ZSk7CisJaWYgKGVtcHR5KSB7CisJCWlmIChlcC0+ZXBuLmRlc2NfbW9kZSkKKwkJ CWFzdF92aHViX2Vwbl9raWNrX2Rlc2MoZXAsIHJlcSk7CisJCWVsc2UKKwkJCWFzdF92aHViX2Vw bl9raWNrKGVwLCByZXEpOworCX0KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfc3RvcF9h Y3RpdmVfcmVxKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkJICAgICBib29sIHJlc3RhcnRf ZXApCit7CisJdTMyIHN0YXRlLCByZWcsIGxvb3BzOworCisJLyogU3RvcCBETUEgYWN0aXZpdHkg Ki8KKwl3cml0ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOwor CisJLyogV2FpdCBmb3IgaXQgdG8gY29tcGxldGUgKi8KKwlmb3IgKGxvb3BzID0gMDsgbG9vcHMg PCAxMDAwOyBsb29wcysrKSB7CisJCXN0YXRlID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZI VUJfRVBfRE1BX0NUTFNUQVQpOworCQlzdGF0ZSA9IFZIVUJfRVBfRE1BX1BST0NfU1RBVFVTKHN0 YXRlKTsKKwkJaWYgKHN0YXRlID09IEVQX0RNQV9QUk9DX1JYX0lETEUgfHwKKwkJICAgIHN0YXRl ID09IEVQX0RNQV9QUk9DX1RYX0lETEUpCisJCQlicmVhazsKKwkJdWRlbGF5KDEpOworCX0KKwlp ZiAobG9vcHMgPj0gMTAwMCkKKwkJZGV2X3dhcm4oJmVwLT52aHViLT5wZGV2LT5kZXYsICJUaW1l b3V0IHdhaXRpbmcgZm9yIERNQVxuIik7CisKKwkvKiBJZiB3ZSBkb24ndCBoYXZlIHRvIHJlc3Rh cnQgdGhlIGVuZHBvaW50LCB0aGF0J3MgaXQgKi8KKwlpZiAoIXJlc3RhcnRfZXApCisJCXJldHVy bjsKKworCS8qIFJlc3RhcnQgdGhlIGVuZHBvaW50ICovCisJaWYgKGVwLT5lcG4uZGVzY19tb2Rl KSB7CisJCS8qCisJCSAqIFRha2Ugb3V0IGRlc2NyaXB0b3JzIGJ5IHJlc2V0dGluZyB0aGUgRE1B IHJlYWQKKwkJICogcG9pbnRlciB0byBiZSBlcXVhbCB0byB0aGUgQ1BVIHdyaXRlIHBvaW50ZXIu CisJCSAqCisJCSAqIE5vdGU6IElmIHdlIGV2ZXIgc3VwcG9ydCBjcmVhdGluZyBkZXNjcmlwdG9y cyBmb3IKKwkJICogcmVxdWVzdHMgdGhhdCBhcmVuJ3QgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlLCB3 ZQorCQkgKiBtYXkgaGF2ZSB0byBkbyBzb21ldGhpbmcgbW9yZSBjb21wbGV4IGhlcmUsCisJCSAq IGVzcGVjaWFsbHkgaWYgdGhlIHJlcXVlc3QgYmVpbmcgdGFrZW4gb3V0IGlzCisJCSAqIG5vdCB0 aGUgY3VycmVudCBoZWFkIGRlc2NyaXB0b3JzLgorCQkgKi8KKwkJcmVnID0gVkhVQl9FUF9ETUFf U0VUX1JQVFIoZXAtPmVwbi5kX25leHQpIHwKKwkJCVZIVUJfRVBfRE1BX1NFVF9DUFVfV1BUUihl cC0+ZXBuLmRfbmV4dCk7CisJCXdyaXRlbChyZWcsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQ X0RFU0NfU1RBVFVTKTsKKworCQkvKiBUaGVuIHR1cm4gaXQgYmFjayBvbiAqLworCQl3cml0ZWwo ZXAtPmVwbi5kbWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RN QV9DVExTVEFUKTsKKwl9IGVsc2UgeworCQkvKiBTaW5nbGUgbW9kZToganVzdCB0dXJuIGl0IGJh Y2sgb24gKi8KKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYsCisJCSAgICAgICBlcC0+ZXBuLnJl Z3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJfQorfQorCitzdGF0aWMgaW50IGFzdF92 aHViX2Vwbl9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAq dV9yZXEpCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlz dHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpy ZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3Bpbl9s b2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIE1ha2Ugc3VyZSBpdCdzIGFj dHVhbGx5IHF1ZXVlZCBvbiB0aGlzIGVuZHBvaW50ICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeSAo cmVxLCAmZXAtPnF1ZXVlLCBxdWV1ZSkgeworCQlpZiAoJnJlcS0+cmVxID09IHVfcmVxKQorCQkJ YnJlYWs7CisJfQorCisJaWYgKCZyZXEtPnJlcSA9PSB1X3JlcSkgeworCQlFUFZEQkcoZXAsICJk ZXF1ZXVlIHJlcSBAJXAgYWN0aXZlPSVkXG4iLAorCQkgICAgICAgcmVxLCByZXEtPmFjdGl2ZSk7 CisJCWlmIChyZXEtPmFjdGl2ZSkKKwkJCWFzdF92aHViX3N0b3BfYWN0aXZlX3JlcShlcCwgdHJ1 ZSk7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOworCQlyYyA9IDA7CisJ fQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCXJldHVy biByYzsKK30KKwordm9pZCBhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXApCit7CisJdTMyIHJlZzsKKworCWlmIChXQVJOX09OKGVwLT5kX2lkeCA9PSAwKSkK KwkJcmV0dXJuOworCXJlZyA9IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJ Ryk7CisJaWYgKGVwLT5lcG4uc3RhbGxlZCB8fCBlcC0+ZXBuLndlZGdlZCkKKwkJcmVnIHw9IFZI VUJfRVBfQ0ZHX1NUQUxMX0NUUkw7CisJZWxzZQorCQlyZWcgJj0gflZIVUJfRVBfQ0ZHX1NUQUxM X0NUUkw7CisJd3JpdGVsKHJlZywgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsK KworCWlmICghZXAtPmVwbi5zdGFsbGVkICYmICFlcC0+ZXBuLndlZGdlZCkKKwkJd3JpdGVsKFZI VUJfRVBfVE9HR0xFX1NFVF9FUE5VTShlcC0+ZXBuLmdfaWR4KSwKKwkJICAgICAgIGVwLT52aHVi LT5yZWdzICsgQVNUX1ZIVUJfRVBfVE9HR0xFKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9z ZXRfaGFsdF9hbmRfd2VkZ2Uoc3RydWN0IHVzYl9lcCogdV9lcCwgYm9vbCBoYWx0LAorCQkJCSAg ICAgIGJvb2wgd2VkZ2UpCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1 X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1bnNpZ25lZCBsb25n IGZsYWdzOworCisJRVBEQkcoZXAsICJTZXQgaGFsdCAoJWQpICYgd2VkZ2UgKCVkKVxuIiwgaGFs dCwgd2VkZ2UpOworCisJaWYgKCF1X2VwIHx8ICF1X2VwLT5kZXNjKQorCQlyZXR1cm4gLUVJTlZB TDsKKwlpZiAoZXAtPmRfaWR4ID09IDApCisJCXJldHVybiAwOworCWlmIChlcC0+ZXBuLmlzX2lz bykKKwkJcmV0dXJuIC1FT1BOT1RTVVBQOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxv Y2ssIGZsYWdzKTsKKworCS8qIEZhaWwgd2l0aCBzdGlsbC1idXN5IElOIGVuZHBvaW50cyAqLwor CWlmIChoYWx0ICYmIGVwLT5lcG4uaXNfaW4gJiYgIWxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpIHsK KwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCQlyZXR1cm4g LUVBR0FJTjsKKwl9CisJZXAtPmVwbi5zdGFsbGVkID0gaGFsdDsKKwllcC0+ZXBuLndlZGdlZCA9 IHdlZGdlOworCWFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoZXApOworCisJc3Bpbl91bmxvY2tf aXJxcmVzdG9yZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRp YyBpbnQgYXN0X3ZodWJfZXBuX3NldF9oYWx0KHN0cnVjdCB1c2JfZXAgKnVfZXAsIGludCB2YWx1 ZSkKK3sKKwlyZXR1cm4gYXN0X3ZodWJfc2V0X2hhbHRfYW5kX3dlZGdlKHVfZXAsIHZhbHVlICE9 IDAsIGZhbHNlKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fc2V0X3dlZGdlKHN0cnVj dCB1c2JfZXAgKnVfZXApCit7CisJcmV0dXJuIGFzdF92aHViX3NldF9oYWx0X2FuZF93ZWRnZSh1 X2VwLCB0cnVlLCB0cnVlKTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fZGlzYWJsZShz dHJ1Y3QgdXNiX2VwKiB1X2VwKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3Rf ZXAodV9lcCk7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gZXAtPnZodWI7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKwl1MzIgaW1hc2ssIGVwX2llcjsKKworCUVQREJHKGVwLCAiRGlzYWJsaW5n ICFcbiIpOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCWVw LT5lcG4uZW5hYmxlZCA9IGZhbHNlOworCisJLyogU3RvcCBhY3RpdmUgRE1BIGlmIGFueSAqLwor CWFzdF92aHViX3N0b3BfYWN0aXZlX3JlcShlcCwgZmFsc2UpOworCisJLyogRGlzYWJsZSBlbmRw b2ludCAqLworCXdyaXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9DT05GSUcpOwor CisJLyogRGlzYWJsZSBBQ0sgaW50ZXJydXB0ICovCisJaW1hc2sgPSBWSFVCX0VQX0lSUShlcC0+ ZXBuLmdfaWR4KTsKKwllcF9pZXIgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNL X0lFUik7CisJZXBfaWVyICY9IH5pbWFzazsKKwl3cml0ZWwoZXBfaWVyLCB2aHViLT5yZWdzICsg QVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJd3JpdGVsKGltYXNrLCB2aHViLT5yZWdzICsgQVNUX1ZI VUJfRVBfQUNLX0lTUik7CisKKwkvKiBOdWtlIGFsbCBwZW5kaW5nIHJlcXVlc3RzICovCisJYXN0 X3ZodWJfbnVrZShlcCwgLUVTSFVURE9XTik7CisKKwkvKiBObyBtb3JlIGRlc2NyaXB0b3IgYXNz b2NpYXRlZCB3aXRoIHJlcXVlc3QgKi8KKwllcC0+ZXAuZGVzYyA9IE5VTEw7CisKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fZW5hYmxlKHN0cnVjdCB1c2JfZXAqIHVfZXAsCisJCQkg ICAgICAgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjKQoreworCXN0 YXRpYyBjb25zdCBjaGFyICplcF90eXBlX3N0cmluZ1tdIF9fbWF5YmVfdW51c2VkID0geyAiY3Ry bCIsCisJCQkJCQkJICAgICAgICJpc29jIiwKKwkJCQkJCQkgICAgICAgImJ1bGsiLAorCQkJCQkJ CSAgICAgICAiaW50ciIgfTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVf ZXApOworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmRldjsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWI7 CisJdTE2IG1heHBhY2tldCwgdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBlcF9j b25mLCBlcF9pZXIsIGltYXNrOworCisJLyogQ2hlY2sgYXJndW1lbnRzICovCisJaWYgKCF1X2Vw IHx8ICFkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heHBhY2tldCA9IHVzYl9lbmRwb2lu dF9tYXhwKGRlc2MpOworCWlmICghZXAtPmRfaWR4IHx8ICFlcC0+ZGV2IHx8CisJICAgIGRlc2Mt PmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQgfHwKKwkgICAgbWF4cGFja2V0ID09 IDAgfHwgbWF4cGFja2V0ID4gZXAtPmVwLm1heHBhY2tldCkgeworCQlFUERCRyhlcCwgIkludmFs aWQgRVAgZW5hYmxlLGRfaWR4PSVkLGRldj0lcCx0eXBlPSVkLG1wPSVkLyVkXG4iLAorCQkgICAg ICBlcC0+ZF9pZHgsIGVwLT5kZXYsIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSwKKwkJICAgICAgbWF4 cGFja2V0LCBlcC0+ZXAubWF4cGFja2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChl cC0+ZF9pZHggIT0gdXNiX2VuZHBvaW50X251bShkZXNjKSkgeworCQlFUERCRyhlcCwgIkVQIG51 bWJlciBtaXNtYXRjaCAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGVwLT5l cG4uZW5hYmxlZCkgeworCQlFUERCRyhlcCwgIkFscmVhZHkgZW5hYmxlZFxuIik7CisJCXJldHVy biAtRUJVU1k7CisJfQorCWRldiA9IGVwLT5kZXY7CisJdmh1YiA9IGVwLT52aHViOworCisJLyog Q2hlY2sgZGV2aWNlIHN0YXRlICovCisJaWYgKCFkZXYtPmRyaXZlcikgeworCQlFUERCRyhlcCwg IkJvZ3VzIGRldmljZSBzdGF0ZTogZHJpdmVyPSVwIHNwZWVkPSVkXG4iLAorCQkgICAgICAgZGV2 LT5kcml2ZXIsIGRldi0+Z2FkZ2V0LnNwZWVkKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQor CisJLyogR3JhYiBzb21lIGluZm8gZnJvbSB0aGUgZGVzY3JpcHRvciAqLworCWVwLT5lcG4uaXNf aW4gPSB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpOworCWVwLT5lcC5tYXhwYWNrZXQgPSBtYXhw YWNrZXQ7CisJdHlwZSA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2MpOworCWVwLT5lcG4uZF9uZXh0 ID0gZXAtPmVwbi5kX2xhc3QgPSAwOworCWVwLT5lcG4uaXNfaXNvID0gZmFsc2U7CisJZXAtPmVw bi5zdGFsbGVkID0gZmFsc2U7CisJZXAtPmVwbi53ZWRnZWQgPSBmYWxzZTsKKworCUVQREJHKGVw LCAiRW5hYmxpbmcgWyVzXSAlcyBudW0gJWQgbWF4cGFja2V0PSVkXG4iLAorCSAgICAgIGVwLT5l cG4uaXNfaW4gPyAiaW4iIDogIm91dCIsIGVwX3R5cGVfc3RyaW5nW3R5cGVdLAorCSAgICAgIHVz Yl9lbmRwb2ludF9udW0oZGVzYyksIG1heHBhY2tldCk7CisKKwkvKiBDYW4gd2UgdXNlIERNQSBk ZXNjcmlwdG9yIG1vZGUgPyAqLworCWVwLT5lcG4uZGVzY19tb2RlID0gZXAtPmVwbi5kZXNjcyAm JiBlcC0+ZXBuLmlzX2luOworCWlmIChlcC0+ZXBuLmRlc2NfbW9kZSkKKwkJbWVtc2V0KGVwLT5l cG4uZGVzY3MsIDAsIDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCk7CisKKwkvKgorCSAqIExhcmdl IHNlbmQgZnVuY3Rpb24gY2FuIHNlbmQgdXAgdG8gOCBwYWNrZXRzIGZyb20KKwkgKiBvbmUgZGVz Y3JpcHRvciB3aXRoIGEgbGltaXQgb2YgNDA5NSBieXRlcy4KKwkgKi8KKwllcC0+ZXBuLmNodW5r X21heCA9IGVwLT5lcC5tYXhwYWNrZXQ7CisJaWYgKGVwLT5lcG4uaXNfaW4pIHsKKwkJZXAtPmVw bi5jaHVua19tYXggPDw9IDM7CisJCXdoaWxlIChlcC0+ZXBuLmNodW5rX21heCA+IDQwOTUpCisJ CQllcC0+ZXBuLmNodW5rX21heCAtPSBlcC0+ZXAubWF4cGFja2V0OworCX0KKworCXN3aXRjaCh0 eXBlKSB7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgorCQlFUERCRyhlcCwgIk9u bHkgb25lIGNvbnRyb2wgZW5kcG9pbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwljYXNlIFVT Ql9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJZXBfY29uZiA9IFZIVUJfRVBfQ0ZHX1NFVF9UWVBFKEVQ X1RZUEVfSU5UKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQll cF9jb25mID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9CVUxLKTsKKwkJYnJlYWs7CisJ Y2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgorCQllcF9jb25mID0gVkhVQl9FUF9DRkdfU0VU X1RZUEUoRVBfVFlQRV9JU08pOworCQllcC0+ZXBuLmlzX2lzbyA9IHRydWU7CisJCWJyZWFrOwor CWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuY29kZSB0aGUgcmVzdCBv ZiB0aGUgRVAgY29uZmlnIHJlZ2lzdGVyICovCisJaWYgKG1heHBhY2tldCA8IDEwMjQpCisJCWVw X2NvbmYgfD0gVkhVQl9FUF9DRkdfU0VUX01BWF9QS1QobWF4cGFja2V0KTsKKwlpZiAoIWVwLT5l cG4uaXNfaW4pCisJCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfRElSX09VVDsKKwllcF9jb25mIHw9 IFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0odXNiX2VuZHBvaW50X251bShkZXNjKSk7CisJZXBfY29u ZiB8PSBWSFVCX0VQX0NGR19FTkFCTEU7CisJZXBfY29uZiB8PSBWSFVCX0VQX0NGR19TRVRfREVW KGRldi0+aW5kZXggKyAxKTsKKwlFUFZEQkcoZXAsICJjb25maWc9JTA4eFxuIiwgZXBfY29uZik7 CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogRGlzYWJs ZSBIVyBhbmQgcmVzZXQgRE1BICovCisJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVC X0VQX0NPTkZJRyk7CisJd3JpdGVsKFZIVUJfRVBfRE1BX0NUUkxfUkVTRVQsCisJICAgICAgIGVw LT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKworCS8qIENvbmZpZ3VyZSBh bmQgZW5hYmxlICovCisJd3JpdGVsKGVwX2NvbmYsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQ X0NPTkZJRyk7CisKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpIHsKKwkJLyogQ2xlYXIgRE1BIHN0 YXR1cywgaW5jbHVkaW5nIHRoZSBETUEgcmVhZCBwdHIgKi8KKwkJd3JpdGVsKDAsIGVwLT5lcG4u cmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCQkvKiBTZXQgZGVzY3JpcHRvciBi YXNlICovCisJCXdyaXRlbChlcC0+ZXBuLmRlc2NzX2RtYSwKKwkJICAgICAgIGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0RFU0NfQkFTRSk7CisKKwkJLyogU2V0IGJhc2UgRE1BIGNvbmZpZyB2 YWx1ZSAqLworCQllcC0+ZXBuLmRtYV9jb25mID0gVkhVQl9FUF9ETUFfREVTQ19NT0RFOworCQlp ZiAoZXAtPmVwbi5pc19pbikKKwkJCWVwLT5lcG4uZG1hX2NvbmYgfD0gVkhVQl9FUF9ETUFfSU5f TE9OR19NT0RFOworCisJCS8qIEZpcnN0IHJlc2V0IGFuZCBkaXNhYmxlIGFsbCBvcGVyYXRpb25z ICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mIHwgVkhVQl9FUF9ETUFfQ1RSTF9SRVNFVCwK KwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKworCQkv KiBFbmFibGUgZGVzY3JpcHRvciBtb2RlICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mLAor CQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCX0gZWxz ZSB7CisJCS8qIFNldCBiYXNlIERNQSBjb25maWcgdmFsdWUgKi8KKwkJZXAtPmVwbi5kbWFfY29u ZiA9IFZIVUJfRVBfRE1BX1NJTkdMRV9TVEFHRTsKKworCQkvKiBSZXNldCBhbmQgc3dpdGNoIHRv IHNpbmdsZSBzdGFnZSBtb2RlICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mIHwgVkhVQl9F UF9ETUFfQ1RSTF9SRVNFVCwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RN QV9DVExTVEFUKTsKKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYsCisJCSAgICAgICBlcC0+ZXBu LnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJCXdyaXRlbCgwLCBlcC0+ZXBuLnJl Z3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJfQorCisJLyogQ2xlYW51cCBkYXRhIHRv Z2dsZSBqdXN0IGluIGNhc2UgKi8KKwl3cml0ZWwoVkhVQl9FUF9UT0dHTEVfU0VUX0VQTlVNKGVw LT5lcG4uZ19pZHgpLAorCSAgICAgICB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfVE9HR0xFKTsK KworCS8qIENsZWFudXAgYW5kIGVuYWJsZSBBQ0sgaW50ZXJydXB0ICovCisJaW1hc2sgPSBWSFVC X0VQX0lSUShlcC0+ZXBuLmdfaWR4KTsKKwl3cml0ZWwoaW1hc2ssIHZodWItPnJlZ3MgKyBBU1Rf VkhVQl9FUF9BQ0tfSVNSKTsKKwllcF9pZXIgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJf RVBfQUNLX0lFUik7CisJZXBfaWVyIHw9IGltYXNrOworCXdyaXRlbChlcF9pZXIsIHZodWItPnJl Z3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKworCS8qIFdvb3QsIHdlIGFyZSBvbmxpbmUgISAq LworCWVwLT5lcG4uZW5hYmxlZCA9IHRydWU7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2 aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYXN0X3Zo dWJfZXBuX2Rpc3Bvc2Uoc3RydWN0IHVzYl9lcCAqdV9lcCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCisJaWYgKFdBUk5fT04oIWVwLT5kZXYgfHwgIWVw LT5kX2lkeCkpCisJCXJldHVybjsKKworCUVQREJHKGVwLCAiUmVsZWFzaW5nIGVuZHBvaW50XG4i KTsKKworCS8qIFRha2UgaXQgb3V0IG9mIHRoZSBFUCBsaXN0ICovCisJbGlzdF9kZWxfaW5pdCgm ZXAtPmVwLmVwX2xpc3QpOworCisJLyogTWFyayB0aGUgYWRkcmVzcyBmcmVlIGluIHRoZSBkZXZp Y2UgKi8KKwllcC0+ZGV2LT5lcG5zW2VwLT5kX2lkeCAtIDFdID0gTlVMTDsKKworCS8qIEZyZWUg bmFtZSAmIERNQSBidWZmZXJzICovCisJa2ZyZWUoZXAtPmVwLm5hbWUpOworCWVwLT5lcC5uYW1l ID0gTlVMTDsKKwlkbWFfZnJlZV9jb2hlcmVudCgmZXAtPnZodWItPnBkZXYtPmRldiwKKwkJCSAg QVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQgKworCQkJICA4ICogQVNUX1ZIVUJfREVTQ1NfQ09VTlQs CisJCQkgIGVwLT5idWYsIGVwLT5idWZfZG1hKTsKKwllcC0+YnVmID0gTlVMTDsKKwllcC0+ZXBu LmRlc2NzID0gTlVMTDsKKworCS8qIE1hcmsgZnJlZSAqLworCWVwLT5kZXYgPSBOVUxMOworfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9lcF9vcHMgYXN0X3ZodWJfZXBuX29wcyA9IHsKKwku ZW5hYmxlCQk9IGFzdF92aHViX2Vwbl9lbmFibGUsCisJLmRpc2FibGUJPSBhc3Rfdmh1Yl9lcG5f ZGlzYWJsZSwKKwkuZGlzcG9zZQk9IGFzdF92aHViX2Vwbl9kaXNwb3NlLAorCS5xdWV1ZQkJPSBh c3Rfdmh1Yl9lcG5fcXVldWUsCisJLmRlcXVldWUJPSBhc3Rfdmh1Yl9lcG5fZGVxdWV1ZSwKKwku c2V0X2hhbHQJPSBhc3Rfdmh1Yl9lcG5fc2V0X2hhbHQsCisJLnNldF93ZWRnZQk9IGFzdF92aHVi X2Vwbl9zZXRfd2VkZ2UsCisJLmFsbG9jX3JlcXVlc3QJPSBhc3Rfdmh1Yl9hbGxvY19yZXF1ZXN0 LAorCS5mcmVlX3JlcXVlc3QJPSBhc3Rfdmh1Yl9mcmVlX3JlcXVlc3QsCit9OworCitzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmFzdF92aHViX2FsbG9jX2VwbihzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLCB1 OCBhZGRyKQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGQtPnZodWI7CisJc3RydWN0IGFz dF92aHViX2VwICplcDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBpOworCisJLyogRmlu ZCBhIGZyZWUgb25lIChubyBkZXZpY2UpICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxv Y2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkrKykK KwkJaWYgKHZodWItPmVwbnNbaV0uZGV2ID09IE5VTEwpCisJCQlicmVhazsKKwlpZiAoaSA+PSBB U1RfVkhVQl9OVU1fR0VOX0VQcykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5s b2NrLCBmbGFncyk7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIFNldCBpdCB1cCAqLworCWVw ID0gJnZodWItPmVwbnNbaV07CisJZXAtPmRldiA9IGQ7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9y ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJRERCRyhkLCAiQWxsb2NhdGluZyBnZW4gRVAgJWQg Zm9yIGFkZHIgJWRcbiIsIGksIGFkZHIpOworCUlOSVRfTElTVF9IRUFEKCZlcC0+cXVldWUpOwor CWVwLT5kX2lkeCA9IGFkZHI7CisJZXAtPnZodWIgPSB2aHViOworCWVwLT5lcC5vcHMgPSAmYXN0 X3ZodWJfZXBuX29wczsKKwllcC0+ZXAubmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiZXAl ZCIsIGFkZHIpOworCWQtPmVwbnNbYWRkci0xXSA9IGVwOworCWVwLT5lcG4uZ19pZHggPSBpOwor CWVwLT5lcG4ucmVncyA9IHZodWItPnJlZ3MgKyAweDIwMCArIChpICogMHgxMCk7CisKKwllcC0+ YnVmID0gZG1hX2FsbG9jX2NvaGVyZW50KCZ2aHViLT5wZGV2LT5kZXYsCisJCQkJICAgICBBU1Rf VkhVQl9FUG5fTUFYX1BBQ0tFVCArCisJCQkJICAgICA4ICogQVNUX1ZIVUJfREVTQ1NfQ09VTlQs CisJCQkJICAgICAmZXAtPmJ1Zl9kbWEsIEdGUF9LRVJORUwpOworCWlmICghZXAtPmJ1Zikgewor CQlrZnJlZShlcC0+ZXAubmFtZSk7CisJCWVwLT5lcC5uYW1lID0gTlVMTDsKKwkJcmV0dXJuIE5V TEw7CisJfQorCWVwLT5lcG4uZGVzY3MgPSBlcC0+YnVmICsgQVNUX1ZIVUJfRVBuX01BWF9QQUNL RVQ7CisJZXAtPmVwbi5kZXNjc19kbWEgPSBlcC0+YnVmX2RtYSArIEFTVF9WSFVCX0VQbl9NQVhf UEFDS0VUOworCisJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJmVwLT5lcCwgQVNUX1ZIVUJf RVBuX01BWF9QQUNLRVQpOworCWxpc3RfYWRkX3RhaWwoJmVwLT5lcC5lcF9saXN0LCAmZC0+Z2Fk Z2V0LmVwX2xpc3QpOworCWVwLT5lcC5jYXBzLnR5cGVfaXNvID0gdHJ1ZTsKKwllcC0+ZXAuY2Fw cy50eXBlX2J1bGsgPSB0cnVlOworCWVwLT5lcC5jYXBzLnR5cGVfaW50ID0gdHJ1ZTsKKwllcC0+ ZXAuY2Fwcy5kaXJfaW4gPSB0cnVlOworCWVwLT5lcC5jYXBzLmRpcl9vdXQgPSB0cnVlOworCisJ cmV0dXJuIGVwOworfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQt dmh1Yi9odWIuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvaHViLmMKbmV3 IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi45MzMwODM0ZjdhYmIKLS0tIC9k ZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jCkBA IC0wLDAgKzEsODIzIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKKy8q CisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIiIFVTQiBnYWRn ZXQKKyAqCisgKiBodWIuYyAtIHZpcnR1YWwgaHViIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0 IDIwMTcgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRo ZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq LworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVs YXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5j bHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2lu Y2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVk ZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8 bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxp bnV4L2RtYS1tYXBwaW5nLmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGlu dXgvdmVyc2lvbi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3Vz Yi9oY2QuaD4KKworI2luY2x1ZGUgInZodWIuaCIKKworLyogdXNiIDIuMCBodWIgZGV2aWNlIGRl c2NyaXB0b3IKKyAqCisgKiBBIGZldyB0aGluZ3Mgd2UgbWF5IHdhbnQgdG8gaW1wcm92ZSBoZXJl OgorICoKKyAqICAgIC0gV2UgbWF5IG5lZWQgdG8gaW5kaWNhdGUgVFQgc3VwcG9ydAorICogICAg LSBXZSBtYXkgbmVlZCBhIGRldmljZSBxdWFsaWZpZXIgZGVzY3JpcHRvcgorICogICAgICBhcyBk ZXZpY2VzIGNhbiBwcmV0ZW5kIHRvIGJlIHVzYjEgb3IgMgorICogICAgLSBNYWtlIHZpZC9kaWQg b3ZlcnJpZGFibGUKKyAqICAgIC0gbWFrZSBpdCBsb29rIGxpa2UgdXNiMSBpZiB1c2IxIG1vZGUg Zm9yY2VkCisgKi8KKyNkZWZpbmUgS0VSTkVMX1JFTAliaW4yYmNkKCgoTElOVVhfVkVSU0lPTl9D T0RFID4+IDE2KSAmIDB4MGZmKSkKKyNkZWZpbmUgS0VSTkVMX1ZFUgliaW4yYmNkKCgoTElOVVhf VkVSU0lPTl9DT0RFID4+IDgpICYgMHgwZmYpKQorCitlbnVtIHsKKwlBU1RfVkhVQl9TVFJfTUFO VUYgPSAzLAorCUFTVF9WSFVCX1NUUl9QUk9EVUNUID0gMiwKKwlBU1RfVkhVQl9TVFJfU0VSSUFM ID0gMSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGFz dF92aHViX2Rldl9kZXNjID0geworCS5iTGVuZ3RoCQk9IFVTQl9EVF9ERVZJQ0VfU0laRSwKKwku YkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RUX0RFVklDRSwKKwkuYmNkVVNCCQkJPSBjcHVfdG9fbGUx NigweDAyMDApLAorCS5iRGV2aWNlQ2xhc3MJCT0gVVNCX0NMQVNTX0hVQiwKKwkuYkRldmljZVN1 YkNsYXNzCT0gMCwKKwkuYkRldmljZVByb3RvY29sCT0gMSwKKwkuYk1heFBhY2tldFNpemUwCT0g NjQsCisJLmlkVmVuZG9yCSAgICAgICAJPSBjcHVfdG9fbGUxNigweDFkNmIpLAorCS5pZFByb2R1 Y3QJCT0gY3B1X3RvX2xlMTYoMHgwMTA3KSwKKwkuYmNkRGV2aWNlCQk9IGNwdV90b19sZTE2KDB4 MDEwMCksCisJLmlNYW51ZmFjdHVyZXIJCT0gQVNUX1ZIVUJfU1RSX01BTlVGLAorCS5pUHJvZHVj dAkJPSBBU1RfVkhVQl9TVFJfUFJPRFVDVCwKKwkuaVNlcmlhbE51bWJlcgkJPSBBU1RfVkhVQl9T VFJfU0VSSUFMLAorCS5iTnVtQ29uZmlndXJhdGlvbnMJPSAxLAorfTsKKworLyogUGF0Y2hlcyB0 byB0aGUgYWJvdmUgd2hlbiBmb3JjaW5nIFVTQjEgbW9kZSAqLworc3RhdGljIHZvaWQgYXN0X3Zo dWJfcGF0Y2hfZGV2X2Rlc2NfdXNiMShzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXNj KQoreworCWRlc2MtPmJjZFVTQiA9IGNwdV90b19sZTE2KDB4MDEwMCk7CisJZGVzYy0+YkRldmlj ZVByb3RvY29sID0gMDsKK30KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcjogc2Ft ZSBjb21tZW50cyBhcyBhYm92ZQorICogcmVnYXJkaW5nIGhhbmRsaW5nIFVTQjEgbW9kZS4KKyAq LworCisvKgorICogV2UgZG9uJ3QgdXNlIHNpemVvZigpIGFzIExpbnV4IGRlZmluaXRpb24gb2YK KyAqIHN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvciBjb250YWlucyAyCisgKiBleHRyYSBi eXRlcworICovCisjZGVmaW5lIEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFCShVU0JfRFRfQ09ORklH X1NJWkUgKyBcCisJCQkJIFVTQl9EVF9JTlRFUkZBQ0VfU0laRSArIFwKKwkJCQkgVVNCX0RUX0VO RFBPSU5UX1NJWkUpCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXN0X3ZodWJfZnVsbF9jZGVzYyB7 CisJc3RydWN0IHVzYl9jb25maWdfZGVzY3JpcHRvcgljZmc7CisJc3RydWN0IHVzYl9pbnRlcmZh Y2VfZGVzY3JpcHRvciBpbnRmOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgllcDsK K30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpIGFzdF92aHViX2NvbmZfZGVzYyA9IHsKKwkuY2Zn ID0geworCQkuYkxlbmd0aAkJPSBVU0JfRFRfQ09ORklHX1NJWkUsCisJCS5iRGVzY3JpcHRvclR5 cGUJPSBVU0JfRFRfQ09ORklHLAorCQkud1RvdGFsTGVuZ3RoCQk9IGNwdV90b19sZTE2KEFTVF9W SFVCX0NPTkZfREVTQ19TSVpFKSwKKwkJLmJOdW1JbnRlcmZhY2VzCQk9IDEsCisJCS5iQ29uZmln dXJhdGlvblZhbHVlCT0gMSwKKwkJLmlDb25maWd1cmF0aW9uCQk9IDAsCisJCS5ibUF0dHJpYnV0 ZXMJCT0gVVNCX0NPTkZJR19BVFRfT05FIHwKKwkJCQkJICBVU0JfQ09ORklHX0FUVF9TRUxGUE9X RVIgfAorCQkJCQkgIFVTQl9DT05GSUdfQVRUX1dBS0VVUCwKKwkJLmJNYXhQb3dlcgkJPSAwLAor CX0sCisJLmludGYgPSB7CisJCS5iTGVuZ3RoCQk9IFVTQl9EVF9JTlRFUkZBQ0VfU0laRSwKKwkJ LmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCS5iSW50ZXJmYWNlTnVtYmVy CT0gMCwKKwkJLmJBbHRlcm5hdGVTZXR0aW5nCT0gMCwKKwkJLmJOdW1FbmRwb2ludHMJCT0gMSwK KwkJLmJJbnRlcmZhY2VDbGFzcwk9IFVTQl9DTEFTU19IVUIsCisJCS5iSW50ZXJmYWNlU3ViQ2xh c3MJPSAwLAorCQkuYkludGVyZmFjZVByb3RvY29sCT0gMCwKKwkJLmlJbnRlcmZhY2UJCT0gMCwK Kwl9LAorCS5lcCA9IHsKKwkJLmJMZW5ndGgJCT0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJCS5i RGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfRU5EUE9JTlQsCisJCS5iRW5kcG9pbnRBZGRyZXNzCT0g MHg4MSwKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJCS53TWF4 UGFja2V0U2l6ZQkJPSBjcHVfdG9fbGUxNigxKSwKKwkJLmJJbnRlcnZhbAkJPSAweDBjLAorCX0s Cit9OworCisjZGVmaW5lIEFTVF9WSFVCX0hVQl9ERVNDX1NJWkUJKFVTQl9EVF9IVUJfTk9OVkFS X1NJWkUgKyAyKQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciBhc3Rf dmh1Yl9odWJfZGVzYyA9IHsKKwkuYkRlc2NMZW5ndGgJCQk9IEFTVF9WSFVCX0hVQl9ERVNDX1NJ WkUsCisJLmJEZXNjcmlwdG9yVHlwZQkJPSBVU0JfRFRfSFVCLAorCS5iTmJyUG9ydHMJCQk9IEFT VF9WSFVCX05VTV9QT1JUUywKKwkud0h1YkNoYXJhY3RlcmlzdGljcwkJPSBjcHVfdG9fbGUxNihI VUJfQ0hBUl9OT19MUFNNKSwKKwkuYlB3ck9uMlB3ckdvb2QJCQk9IDEwLAorCS5iSHViQ29udHJD dXJyZW50CQk9IDAsCisJLnUuaHMuRGV2aWNlUmVtb3ZhYmxlWzBdCT0gMCwKKwkudS5ocy5EZXZp Y2VSZW1vdmFibGVbMV0JPSAweGZmLAorfTsKKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJfZGV2 X3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3SW5kZXgsIHUxNiB3 VmFsdWUpCit7CisJdTggc3QwOworCisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGRldilcbiIpOwor CisJLyoKKwkgKiBNYXJrIGl0IGFzIHNlbGYtcG93ZXJlZCwgSSBkb3VidCB0aGUgQk1DIGlzIHBv d2VyZWQgb2ZmCisJICogdGhlIFVTQiBidXMgLi4uCisJICovCisJc3QwID0gMSA8PCBVU0JfREVW SUNFX1NFTEZfUE9XRVJFRDsKKworCS8qCisJICogTmVlZCB0byBkb3VibGUgY2hlY2sgaG93IHJl bW90ZSB3YWtldXAgYWN0dWFsbHkgd29ya3MKKwkgKiBvbiB0aGF0IGNoaXAgYW5kIHdoYXQgdHJp Z2dlcnMgaXQuCisJICovCisJaWYgKGVwLT52aHViLT53YWtldXBfZW4pCisJCXN0MCB8PSAxIDw8 IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUDsKKworCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVw bHkoZXAsIHN0MCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2VwX3N0YXR1cyhz dHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sK KwlpbnQgZXBfbnVtOworCXU4IHN0MCA9IDA7CisKKwllcF9udW0gPSB3SW5kZXggJiBVU0JfRU5E UE9JTlRfTlVNQkVSX01BU0s7CisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGVwJWQpXG4iLCBlcF9u dW0pOworCisJLyogT24gdGhlIGh1YiB3ZSBoYXZlIG9ubHkgRVAgMCBhbmQgMSAqLworCWlmIChl cF9udW0gPT0gMSkgeworCQlpZiAoZXAtPnZodWItPmVwMV9zdGFsbGVkKQorCQkJc3QwIHw9IDEg PDwgVVNCX0VORFBPSU5UX0hBTFQ7CisJfSBlbHNlIGlmIChlcF9udW0gIT0gMCkKKwkJcmV0dXJu IHN0ZF9yZXFfc3RhbGw7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCBzdDAs IDApOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2h1Yl9kZXZfZmVhdHVyZShzdHJ1Y3QgYXN0 X3ZodWJfZXAgKmVwLAorCQkJCSAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLAorCQkJCSAgICBi b29sIGlzX3NldCkKK3sKKwlFUERCRyhlcCwgIiVzX0ZFQVRVUkUoZGV2IHZhbD0lMDJ4KVxuIiwK KwkgICAgICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIHdWYWx1ZSk7CisKKwlpZiAod1ZhbHVl ICE9IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisK KwllcC0+dmh1Yi0+d2FrZXVwX2VuID0gaXNfc2V0OworCUVQREJHKGVwLCAiSHViIHJlbW90ZSB3 YWtldXAgJXNcbiIsCisJICAgICAgaXNfc2V0ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisK KwlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJf ZXBfZmVhdHVyZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3SW5kZXgsIHUx NiB3VmFsdWUsCisJCQkJICAgYm9vbCBpc19zZXQpCit7CisJaW50IGVwX251bTsKKwl1MzIgcmVn OworCisJZXBfbnVtID0gd0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCUVQREJH KGVwLCAiJXNfRkVBVFVSRShlcCVkIHZhbD0lMDJ4KVxuIiwKKwkgICAgICBpc19zZXQgPyAiU0VU IiA6ICJDTEVBUiIsIGVwX251bSwgd1ZhbHVlKTsKKworCWlmIChlcF9udW0gPiAxKQorCQlyZXR1 cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAod1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUKQorCQly ZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAoZXBfbnVtID09IDApCisJCXJldHVybiBzdGRfcmVx X2NvbXBsZXRlOworCisJRVBEQkcoZXAsICIlcyBzdGFsbCBvbiBFUCAxXG4iLAorCSAgICAgIGlz X3NldCA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIpOworCisJZXAtPnZodWItPmVwMV9zdGFsbGVk ID0gaXNfc2V0OworCXJlZyA9IHJlYWRsKGVwLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NU UkwpOworCWlmIChpc19zZXQpIHsKKwkJcmVnIHw9IFZIVUJfRVAxX0NUUkxfU1RBTEw7CisJfSBl bHNlIHsKKwkJcmVnICY9IH5WSFVCX0VQMV9DVFJMX1NUQUxMOworCQlyZWcgfD0gVkhVQl9FUDFf Q1RSTF9SRVNFVF9UT0dHTEU7CisJfQorCXdyaXRlbChyZWcsIGVwLT52aHViLT5yZWdzICsgQVNU X1ZIVUJfRVAxX0NUUkwpOworCisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRp YyBpbnQgYXN0X3ZodWJfcmVwX2Rlc2Moc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAg dTggZGVzY190eXBlLCB1MTYgbGVuKQoreworCWNvbnN0IHZvaWQgKmRlc2M7CisJc2l6ZV90IGRz aXplOworCisJRVBEQkcoZXAsICJHRVRfREVTQ1JJUFRPUih0eXBlOiVkKVxuIiwgZGVzY190eXBl KTsKKwlzd2l0Y2goZGVzY190eXBlKSB7CisJY2FzZSBVU0JfRFRfREVWSUNFOgorCQlkZXNjID0g JmFzdF92aHViX2Rldl9kZXNjOworCQlkc2l6ZSA9IFVTQl9EVF9ERVZJQ0VfU0laRTsKKwkJYnJl YWs7CisJY2FzZSBVU0JfRFRfQ09ORklHOgorCQlkZXNjID0gJmFzdF92aHViX2NvbmZfZGVzYzsK KwkJZHNpemUgPSBBU1RfVkhVQl9DT05GX0RFU0NfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBVU0Jf RFRfSFVCOgorCQlkZXNjID0gJmFzdF92aHViX2h1Yl9kZXNjOworCQlkc2l6ZSA9IEFTVF9WSFVC X0hVQl9ERVNDX1NJWkU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBzdGRfcmVxX3N0 YWxsOworCX0KKwlpZiAoZHNpemUgPCBsZW4pCisJCWxlbiA9IGRzaXplOworCS8qCisJICogVGhp cyBpcyBvdXIgbGltaXQgZm9yIGh1YiByZXBsaWVzIGluIG91ciBjdXJyZW50CisJICogaW1wbGVt ZW50YXRpb24sIGtlZXBzIHRoaW5ncyBzaW1wbGVyLgorCSAqLworCWlmIChXQVJOX09OKGxlbiA+ PSBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCkpCisJCWxlbiA9IEFTVF9WSFVCX0VQMF9NQVhfUEFD S0VUIC0gMTsKKworCS8qCisJICogQ29weSBmaXJzdCB0byBFUCBidWZmZXIgYW5kIHNlbmQgZnJv bSB0aGVyZSwgc28KKwkgKiB3ZSBjYW4gZG8gc29tZSBpbi1wbGFjZSBwYXRjaGluZyBpZiBuZWVk ZWQKKwkgKi8KKwltZW1jcHkoZXAtPmJ1ZiwgZGVzYywgbGVuKTsKKworCS8qIFBhdGNoIGl0IGlm IGZvcmNpbmcgVVNCMSAqLworCWlmIChkZXNjX3R5cGUgPT0gVVNCX0RUX0RFVklDRSAmJiBlcC0+ dmh1Yi0+Zm9yY2VfdXNiMSkKKwkJYXN0X3ZodWJfcGF0Y2hfZGV2X2Rlc2NfdXNiMShlcC0+YnVm KTsKKworCS8qIFNob290IGl0IGZyb20gdGhlIEVQIGJ1ZmZlciAqLworCXJldHVybiBhc3Rfdmh1 Yl9yZXBseShlcCwgTlVMTCwgbGVuKTsKK30KKworLyogY29waWVkIGZyb20gaGRjLmMgKi8KK3N0 YXRpYyB1bnNpZ25lZAorYXNjaWkyZGVzYyhjaGFyIGNvbnN0ICpzLCB1OCAqYnVmLCB1bnNpZ25l ZCBsZW4pCit7CisJdW5zaWduZWQgbiwgdCA9IDIgKyAyKnN0cmxlbihzKTsKKworCWlmICh0ID4g MjU0KQorCQl0ID0gMjU0OwkvKiBMb25nZXN0IHBvc3NpYmxlIFVURiBzdHJpbmcgZGVzY3JpcHRv ciAqLworCWlmIChsZW4gPiB0KQorCQlsZW4gPSB0OworCisJdCArPSBVU0JfRFRfU1RSSU5HIDw8 IDg7CS8qIE5vdyB0IGlzIGZpcnN0IDE2IGJpdHMgdG8gc3RvcmUgKi8KKworCW4gPSBsZW47CisJ d2hpbGUgKG4tLSkgeworCQkqYnVmKysgPSB0OworCQlpZiAoIW4tLSkKKwkJCWJyZWFrOworCQkq YnVmKysgPSB0ID4+IDg7CisJCXQgPSAodW5zaWduZWQgY2hhcikqcysrOworCX0KKwlyZXR1cm4g bGVuOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3JlcF9zdHJpbmcoc3RydWN0IGFzdF92aHVi X2VwICplcCwKKwkJCSAgICAgICB1OCBzdHJpbmdfaWQsIHUxNiBsYW5nX2lkLAorCQkJICAgICAg IHUxNiBsZW4pCit7CisJc3RhdGljIGNoYXIgY29uc3QgbGFuZ2lkc1s0XSA9IHs0LCBVU0JfRFRf U1RSSU5HLCAweDA5LCAweDA0fTsKKworCXN3aXRjaCAoc3RyaW5nX2lkKSB7CisJY2FzZSAwOiAv KiBMYW5ndWFnZSBJRHMgYXJyYXkgKi8KKwkJaWYgKGxlbiA+IDQpCisJCQlsZW4gPSA0OworCQlt ZW1jcHkoZXAtPmJ1ZiwgbGFuZ2lkcywgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBBU1RfVkhVQl9T VFJfU0VSSUFMOgorCQlsZW4gPSBhc2NpaTJkZXNjKCIwMDAwMDAwMCIsIGVwLT5idWYsIGxlbik7 CisJCWJyZWFrOworCWNhc2UgQVNUX1ZIVUJfU1RSX1BST0RVQ1Q6CisJCWxlbiA9IGFzY2lpMmRl c2MoIlVTQiBWaXJ0dWFsIEh1YiIsIGVwLT5idWYsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQVNU X1ZIVUJfU1RSX01BTlVGOgorCQlsZW4gPSBhc2NpaTJkZXNjKCJBc3BlZWQiLCBlcC0+YnVmLCBs ZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwl9CisK KwkvKiBTaG9vdCBpdCBmcm9tIHRoZSBFUCBidWZmZXIgKi8KKwlyZXR1cm4gYXN0X3ZodWJfcmVw bHkoZXAsIE5VTEwsIGxlbik7Cit9CisKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9zdGRfaHVi X3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJIHN0cnVjdCB1c2JfY3RybHJl cXVlc3QgKmNycSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1MTYg d1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEtPndW YWx1ZSk7CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGggPSBs ZTE2X3RvX2NwdShjcnEtPndMZW5ndGgpOworCisJLyogRmlyc3QgcGFja2V0LCBncmFiIHNwZWVk ICovCisJaWYgKHZodWItPnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCXUzMiB1c3Rh dCA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9VU0JTVFMpOworCQlpZiAodXN0YXQgJiBW SFVCX1VTQlNUU19ISVNQRUVEKQorCQkJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfSElHSDsKKwkJ ZWxzZQorCQkJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKKwkJVURDREJHKHZodWIsICJV U0Igc3RhdHVzPSUwOHggc3BlZWQ9JXNcbiIsIHVzdGF0LAorCQkgICAgICAgdmh1Yi0+c3BlZWQg PT0gVVNCX1NQRUVEX0hJR0ggPyAiaGlnaCIgOiAiZnVsbCIpOworCX0KKworCXN3aXRjaCAoKGNy cS0+YlJlcXVlc3RUeXBlIDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgeworCQkvKiBTRVRfQUREUkVT UyAqLworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCUVQ REJHKGVwLCAiU0VUX0FERFJFU1M6IEdvdCBhZGRyZXNzICV4XG4iLCB3VmFsdWUpOworCQl3cml0 ZWwod1ZhbHVlLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ09ORik7CisJCXJldHVybiBzdGRfcmVx X2NvbXBsZXRlOworCisJCS8qIEdFVF9TVEFUVVMgKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBV U0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X3N0YXR1cyhlcCwg d0luZGV4LCB3VmFsdWUpOworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NU QVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCk7CisJY2FzZSBF bmRwb2ludFJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9o dWJfZXBfc3RhdHVzKGVwLCB3SW5kZXgsIHdWYWx1ZSk7CisKKwkJLyogU0VUL0NMRUFSX0ZFQVRV UkUgKi8KKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQly ZXR1cm4gYXN0X3ZodWJfaHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1ZSk7 CisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlyZXR1 cm4gYXN0X3ZodWJfaHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOwor CWNhc2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJu IGFzdF92aHViX2h1Yl9lcF9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1ZSk7CisJY2Fz ZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCXJldHVybiBh c3Rfdmh1Yl9odWJfZXBfZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUsIGZhbHNlKTsKKworCQkv KiBHRVQvU0VUX0NPTkZJR1VSQVRJT04gKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVR X0dFVF9DT05GSUdVUkFUSU9OOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAx KTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OOgor CQlpZiAod1ZhbHVlICE9IDEpCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJcmV0dXJuIHN0 ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX0RFU0NSSVBUT1IgKi8KKwljYXNlIERldmljZVJl cXVlc3QgfCBVU0JfUkVRX0dFVF9ERVNDUklQVE9SOgorCQlzd2l0Y2ggKHdWYWx1ZSA+PiA4KSB7 CisJCWNhc2UgVVNCX0RUX0RFVklDRToKKwkJY2FzZSBVU0JfRFRfQ09ORklHOgorCQkJcmV0dXJu IGFzdF92aHViX3JlcF9kZXNjKGVwLCB3VmFsdWUgPj4gOCwKKwkJCQkJCSB3TGVuZ3RoKTsKKwkJ Y2FzZSBVU0JfRFRfU1RSSU5HOgorCQkJcmV0dXJuIGFzdF92aHViX3JlcF9zdHJpbmcoZXAsIHdW YWx1ZSAmIDB4ZmYsCisJCQkJCQkgICB3SW5kZXgsIHdMZW5ndGgpOworCQl9CisJCXJldHVybiBz dGRfcmVxX3N0YWxsOworCisJCS8qIEdFVC9TRVRfSU5URVJGQUNFICovCisJY2FzZSBEZXZpY2VS ZXF1ZXN0IHwgVVNCX1JFUV9HRVRfSU5URVJGQUNFOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxl X3JlcGx5KGVwLCAwKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9JTlRF UkZBQ0U6CisJCWlmICh3VmFsdWUgIT0gMCB8fCB3SW5kZXggIT0gMCkKKwkJCXJldHVybiBzdGRf cmVxX3N0YWxsOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0ZF9y ZXFfc3RhbGw7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHN0cnVj dCBhc3Rfdmh1YiAqdmh1YiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHBvcnQpCit7CisJLyogVXBk YXRlIEhXIEVQMSByZXNwb25zZSAqLworCXUzMiByZWcgPSByZWFkbCh2aHViLT5yZWdzICsgQVNU X1ZIVUJfRVAxX1NUU19DSEcpOworCXUzMiBwbWFzayA9ICgxIDw8IChwb3J0ICsgMSkpOworCWlm ICh2aHViLT5wb3J0c1twb3J0XS5jaGFuZ2UpCisJCXJlZyB8PSBwbWFzazsKKwllbHNlCisJCXJl ZyAmPSB+cG1hc2s7CisJd3JpdGVsKHJlZywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNf Q0hHKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdChzdHJ1Y3Qg YXN0X3ZodWIgKnZodWIsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnQsCisJCQkJICAgICAg dTE2IGNscl9mbGFncywKKwkJCQkgICAgICB1MTYgc2V0X2ZsYWdzLAorCQkJCSAgICAgIGJvb2wg c2V0X2MpCit7CisJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07 CisJdTE2IHByZXY7CisKKwkvKiBVcGRhdGUgcG9ydCBzdGF0dXMgKi8KKwlwcmV2ID0gcC0+c3Rh dHVzOworCXAtPnN0YXR1cyA9IChwcmV2ICYgfmNscl9mbGFncykgfCBzZXRfZmxhZ3M7CisJRERC RygmcC0+ZGV2LCAicG9ydCAlZCBzdGF0dXMgJTA0eCAtPiAlMDR4IChDPSVkKVxuIiwKKwkgICAg IHBvcnQgKyAxLCBwcmV2LCBwLT5zdGF0dXMsIHNldF9jKTsKKworCS8qIFVwZGF0ZSBjaGFuZ2Ug Yml0cyBpZiBuZWVkZWQgKi8KKwlpZiAoc2V0X2MpIHsKKwkJdTE2IGNoZyA9IHAtPnN0YXR1cyBe IHByZXY7CisKKwkJLyogT25seSB0aGVzZSBhcmUgcmVsZXZhbnQgZm9yIGNoYW5nZSAqLworCQlj aGcgJj0gVVNCX1BPUlRfU1RBVF9DX0NPTk5FQ1RJT04gfAorCQkgICAgICAgVVNCX1BPUlRfU1RB VF9DX0VOQUJMRSB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8CisJCSAgICAg ICBVU0JfUE9SVF9TVEFUX0NfT1ZFUkNVUlJFTlQgfAorCQkgICAgICAgVVNCX1BPUlRfU1RBVF9D X1JFU0VUIHwKKwkJICAgICAgIFVTQl9QT1JUX1NUQVRfQ19MMTsKKwkJcC0+Y2hhbmdlIHw9IGNo ZzsKKworCQlhc3Rfdmh1Yl91cGRhdGVfaHViX2VwMSh2aHViLCBwb3J0KTsKKwl9Cit9CisKK3N0 YXRpYyB2b2lkIGFzdF92aHViX3NlbmRfaG9zdF93YWtldXAoc3RydWN0IGFzdF92aHViICp2aHVi KQoreworCXUzMiByZWcgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisJVURD REJHKHZodWIsICJXYWtpbmcgdXAgaG9zdCAhXG4iKTsKKwlyZWcgfD0gVkhVQl9DVFJMX01BTlVB TF9SRU1PVEVfV0FLRVVQOworCXdyaXRlbChyZWcsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJM KTsKK30KKwordm9pZCBhc3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1Y3QgYXN0X3ZodWIgKnZo dWIsCisJCQkgICAgIHVuc2lnbmVkIGludCBwb3J0LCBib29sIG9uKQoreworCWlmIChvbikKKwkJ YXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LCAwLAorCQkJCQkgIFVTQl9QT1JU X1NUQVRfQ09OTkVDVElPTiwgdHJ1ZSk7CisJZWxzZQorCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9z dGF0KHZodWIsIHBvcnQsCisJCQkJCSAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwKKwkJCQkJ ICBVU0JfUE9SVF9TVEFUX0VOQUJMRSwKKwkJCQkJICAwLCB0cnVlKTsKKworCS8qCisJICogSWYg dGhlIGh1YiBpcyBzZXQgdG8gd2FrdXAgdGhlIGhvc3Qgb24gY29ubmVjdGlvbiBldmVudHMKKwkg KiB0aGVuIHNlbmQgYSB3YWtldXAuCisJICovCisJaWYgKHZodWItPndha2V1cF9lbikKKwkJYXN0 X3ZodWJfc2VuZF9ob3N0X3dha2V1cCh2aHViKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJf d2FrZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIg KnZodWIgPSBjb250YWluZXJfb2Yod29yaywKKwkJCQkJICAgICBzdHJ1Y3QgYXN0X3ZodWIsCisJ CQkJCSAgICAgd2FrZV93b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGlu dCBpOworCisJLyoKKwkgKiBXYWtlIGFsbCBzbGVlcGluZyBwb3J0cy4gSWYgYSBwb3J0IGlzIHN1 c3BlbmRlZCBieQorCSAqIHRoZSBob3N0IHN1c3BlbmQgKHdpdGhvdXQgZXhwbGljaXQgc3RhdGUg c3VzcGVuZCksCisJICogd2UgbGV0IHRoZSBub3JtYWwgaG9zdCB3YWtlIHBhdGggZGVhbCB3aXRo IGl0IGxhdGVyLgorCSAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7 CisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBh c3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW2ldOworCisJCWlmICghKHAtPnN0YXR1cyAm IFVTQl9QT1JUX1NUQVRfU1VTUEVORCkpCisJCQljb250aW51ZTsKKwkJYXN0X3ZodWJfY2hhbmdl X3BvcnRfc3RhdCh2aHViLCBpLAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfU1VTUEVORCwKKwkJCQkJ ICAwLCB0cnVlKTsKKwkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9CisJYXN0X3Zo dWJfc2VuZF9ob3N0X3dha2V1cCh2aHViKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHVi LT5sb2NrLCBmbGFncyk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3dha2VfYWxsKHN0cnVjdCBh c3Rfdmh1YiAqdmh1YikKK3sKKwkvKgorCSAqIEEgZGV2aWNlIGlzIHRyeWluZyB0byB3YWtlIHRo ZSB3b3JsZCwgYmVjYXVzZSB0aGlzCisJICogY2FuIHJlY3Vyc2UgaW50byB0aGUgZGV2aWNlLCB3 ZSBicmVhayB0aGUgY2FsbCBjaGFpbgorCSAqIHVzaW5nIGEgd29yayBxdWV1ZQorCSAqLworCXNj aGVkdWxlX3dvcmsoJnZodWItPndha2Vfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHVi X3BvcnRfcmVzZXQoc3RydWN0IGFzdF92aHViICp2aHViLCB1OCBwb3J0KQoreworCXN0cnVjdCBh c3Rfdmh1Yl9wb3J0ICpwID0gJnZodWItPnBvcnRzW3BvcnRdOworCXUxNiBzZXQsIGNsciwgc3Bl ZWQ7CisKKwkvKiBGaXJzdCBtYXJrIGRpc2FibGVkICovCisJYXN0X3ZodWJfY2hhbmdlX3BvcnRf c3RhdCh2aHViLCBwb3J0LAorCQkJCSAgVVNCX1BPUlRfU1RBVF9FTkFCTEUgfAorCQkJCSAgVVNC X1BPUlRfU1RBVF9TVVNQRU5ELAorCQkJCSAgVVNCX1BPUlRfU1RBVF9SRVNFVCwKKwkJCQkgIGZh bHNlKTsKKworCWlmICghcC0+ZGV2LmRyaXZlcikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGlz IHdpbGwgZWl0aGVyICJzdGFydCIgdGhlIHBvcnQgb3IgcmVzZXQgdGhlCisJICogZGV2aWNlIGlm IGFscmVhZHkgc3RhcnRlZC4uLgorCSAqLworCWFzdF92aHViX2Rldl9yZXNldCgmcC0+ZGV2KTsK KworCS8qIEdyYWIgdGhlIHJpZ2h0IHNwZWVkICovCisJc3BlZWQgPSBwLT5kZXYuZHJpdmVyLT5t YXhfc3BlZWQ7CisJaWYgKHNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOIHx8IHNwZWVkID4gdmh1 Yi0+c3BlZWQpCisJCXNwZWVkID0gdmh1Yi0+c3BlZWQ7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJ Y2FzZSBVU0JfU1BFRURfTE9XOgorCQlzZXQgPSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKwkJ Y2xyID0gVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVF RF9GVUxMOgorCQlzZXQgPSAwOworCQljbHIgPSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRCB8CisJ CQlVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQ7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0hJ R0g6CisJCXNldCA9IFVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJY2xyID0gVVNCX1BPUlRf U1RBVF9MT1dfU1BFRUQ7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVVEQ0RCRyh2aHViLCAiVW5z dXBwb3J0ZWQgc3BlZWQgJWQgd2hlbiIKKwkJICAgICAgICIgY29ubmVjdGluZyBkZXZpY2VcbiIs CisJCSAgICAgICBzcGVlZCk7CisJCXJldHVybjsKKwl9CisJY2xyIHw9IFVTQl9QT1JUX1NUQVRf UkVTRVQ7CisJc2V0IHw9IFVTQl9QT1JUX1NUQVRfRU5BQkxFOworCisJLyogVGhpcyBzaG91bGQg aWRlYWxseSBiZSBkZWxheWVkIC4uLiAqLworCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1 YiwgcG9ydCwgY2xyLCBzZXQsIHRydWUpOworfQorCitzdGF0aWMgZW51bSBzdGRfcmVxX3JjIGFz dF92aHViX3NldF9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJCSB1 OCBwb3J0LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsK KwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IEFT VF9WSFVCX05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9ydC0tOworCXAg PSAmdmh1Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2UgVVNCX1BPUlRf RkVBVF9TVVNQRU5EOgorCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkp CisJCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3Rh dCh2aHViLCBwb3J0LAorCQkJCQkgIDAsIFVTQl9QT1JUX1NUQVRfU1VTUEVORCwKKwkJCQkJICBm YWxzZSk7CisJCWFzdF92aHViX2Rldl9zdXNwZW5kKCZwLT5kZXYpOworCQlyZXR1cm4gc3RkX3Jl cV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCUVQREJHKGVwLCAiUG9y dCByZXNldCAhXG4iKTsKKwkJYXN0X3ZodWJfcG9ydF9yZXNldCh2aHViLCBwb3J0KTsKKwkJcmV0 dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCWNhc2Ug VVNCX1BPUlRfRkVBVF9URVNUOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1I6CisJCS8q IFdlIGRvbid0IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29t cGxldGU7CisJfQorCXJldHVybiBzdGRfcmVxX3N0YWxsOworfQorCitzdGF0aWMgZW51bSBzdGRf cmVxX3JjIGFzdF92aHViX2Nscl9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwK KwkJCQkJCSB1OCBwb3J0LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBl cC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwg cG9ydCA+IEFTVF9WSFVCX05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9y dC0tOworCXAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2Ug VVNCX1BPUlRfRkVBVF9FTkFCTEU6CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1Yiwg cG9ydCwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX0VOQUJMRSB8CisJCQkJCSAgVVNCX1BPUlRfU1RB VF9TVVNQRU5ELCAwLAorCQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAt PmRldik7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9T VVNQRU5EOgorCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJ cmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1 YiwgcG9ydCwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsIDAsCisJCQkJCSAgZmFsc2Up OworCQlhc3Rfdmh1Yl9kZXZfcmVzdW1lKCZwLT5kZXYpOworCQlyZXR1cm4gc3RkX3JlcV9jb21w bGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CisJCS8qIFdlIGRvbid0IGRvIHBvd2Vy IGNvbnRyb2wgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9G RUFUX0lORElDQVRPUjoKKwkJLyogV2UgZG9uJ3QgaGF2ZSBpbmRpY2F0b3JzICovCisJCXJldHVy biBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT046CisJ Y2FzZSBVU0JfUE9SVF9GRUFUX0NfRU5BQkxFOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BF TkQ6CisJY2FzZSBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgorCWNhc2UgVVNCX1BPUlRf RkVBVF9DX1JFU0VUOgorCQkvKiBDbGVhciBzdGF0ZS1jaGFuZ2UgZmVhdHVyZSAqLworCQlwLT5j aGFuZ2UgJj0gfigxdSA8PCAoZmVhdCAtIDE2KSk7CisJCWFzdF92aHViX3VwZGF0ZV9odWJfZXAx KHZodWIsIHBvcnQpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0 ZF9yZXFfc3RhbGw7Cit9CisKK3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfZ2V0X3Bv cnRfc3RhdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgICAgICB1OCBwb3J0KQorewor CXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXUxNiBzdGF0LCBjaGc7CisKKwlp ZiAocG9ydCA9PSAwIHx8IHBvcnQgPiBBU1RfVkhVQl9OVU1fUE9SVFMpCisJCXJldHVybiBzdGRf cmVxX3N0YWxsOworCXBvcnQtLTsKKworCXN0YXQgPSB2aHViLT5wb3J0c1twb3J0XS5zdGF0dXM7 CisJY2hnID0gdmh1Yi0+cG9ydHNbcG9ydF0uY2hhbmdlOworCisJLyogV2UgYWx3YXlzIGhhdmUg cG93ZXIgKi8KKwlzdGF0IHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisKKwlFUERCRyhlcCwgIiBw b3J0IHN0YXR1cz0lMDR4IGNoYW5nZT0lMDR4XG4iLCBzdGF0LCBjaGcpOworCisJcmV0dXJuIGFz dF92aHViX3NpbXBsZV9yZXBseShlcCwKKwkJCQkgICAgIHN0YXQgJiAweGZmLAorCQkJCSAgICAg c3RhdCA+PiA4LAorCQkJCSAgICAgY2hnICYgMHhmZiwKKwkJCQkgICAgIGNoZyA+PiA4KTsKK30K KworZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0KHN0cnVjdCBhc3Rf dmh1Yl9lcCAqZXAsCisJCQkJCSAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwl1 MTYgd1ZhbHVlLCB3SW5kZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEt PndWYWx1ZSk7CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGgg PSBsZTE2X3RvX2NwdShjcnEtPndMZW5ndGgpOworCisJc3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5 cGUgPDwgOCkgfCBjcnEtPmJSZXF1ZXN0KSB7CisJY2FzZSBHZXRIdWJTdGF0dXM6CisJCUVQREJH KGVwLCAiR2V0SHViU3RhdHVzXG4iKTsKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShl cCwgMCwgMCwgMCwgMCk7CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlFUERCRyhlcCwgIkdldFBv cnRTdGF0dXMoJWQpXG4iLCB3SW5kZXggJiAweGZmKTsKKwkJcmV0dXJuIGFzdF92aHViX2dldF9w b3J0X3N0YXQoZXAsIHdJbmRleCAmIDB4Zik7CisJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgorCQlp ZiAod1ZhbHVlICE9IChVU0JfRFRfSFVCIDw8IDgpKQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7 CisJCUVQREJHKGVwLCAiR2V0SHViRGVzY3JpcHRvciglZClcbiIsIHdJbmRleCAmIDB4ZmYpOwor CQlyZXR1cm4gYXN0X3ZodWJfcmVwX2Rlc2MoZXAsIFVTQl9EVF9IVUIsIHdMZW5ndGgpOworCWNh c2UgU2V0SHViRmVhdHVyZToKKwljYXNlIENsZWFySHViRmVhdHVyZToKKwkJRVBEQkcoZXAsICJH ZXQvU2V0SHViRmVhdHVyZSglZClcbiIsIHdWYWx1ZSk7CisJCS8qIE5vIGZlYXR1cmUsIGp1c3Qg Y29tcGxldGUgdGhlIHJlcXVlc3RzICovCisJCWlmICh3VmFsdWUgPT0gQ19IVUJfTE9DQUxfUE9X RVIgfHwKKwkJICAgIHdWYWx1ZSA9PSBDX0hVQl9PVkVSX0NVUlJFTlQpCisJCQlyZXR1cm4gc3Rk X3JlcV9jb21wbGV0ZTsKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJY2FzZSBTZXRQb3J0RmVh dHVyZToKKwkJRVBEQkcoZXAsICJTZXRQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4 Ziwgd1ZhbHVlKTsKKwkJcmV0dXJuIGFzdF92aHViX3NldF9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRl eCAmIDB4Ziwgd1ZhbHVlKTsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCUVQREJHKGVwLCAi Q2xlYXJQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJcmV0 dXJuIGFzdF92aHViX2Nscl9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsK KwlkZWZhdWx0OgorCQlFUERCRyhlcCwgIlVua25vd24gY2xhc3MgcmVxdWVzdFxuIik7CisJfQor CXJldHVybiBzdGRfcmVxX3N0YWxsOworfQorCit2b2lkIGFzdF92aHViX2h1Yl9zdXNwZW5kKHN0 cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHVi LCAiVVNCIGJ1cyBzdXNwZW5kXG4iKTsKKworCWlmICh2aHViLT5zdXNwZW5kZWQpCisJCXJldHVy bjsKKworCXZodWItPnN1c3BlbmRlZCA9IHRydWU7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5z dXNwZW5kZWQgcG9ydHMgd2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3Rh dHVzLgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgewor CQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShw LT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3N1c3Bl bmQoJnAtPmRldik7CisJfQorfQorCit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUoc3RydWN0IGFz dF92aHViICp2aHViKQoreworCXVuc2lnbmVkIGludCBpOworCisJVURDREJHKHZodWIsICJVU0Ig YnVzIHJlc3VtZVxuIik7CisKKwlpZiAoIXZodWItPnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJ dmh1Yi0+c3VzcGVuZGVkID0gZmFsc2U7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5zdXNwZW5k ZWQgcG9ydHMgd2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3RhdHVzLgor CSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1 Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0 dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ ZGV2KTsKKwl9Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAq dmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1cyByZXNl dFxuIik7CisKKwkvKgorCSAqIElzIHRoZSBzcGVlZCBrbm93biA/IElmIG5vdCB3ZSBkb24ndCBj YXJlLCB3ZSBhcmVuJ3QKKwkgKiBpbml0aWFsaXplZCB5ZXQgYW5kIHBvcnRzIGhhdmVuJ3QgYmVl biBlbmFibGVkLgorCSAqLworCWlmICh2aHViLT5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikK KwkJcmV0dXJuOworCisJLyogV2UgYXJlbid0IHN1c3BlbmRlZCBhbnltb3JlIG9idmlvdXNseSAq LworCXZodWItPnN1c3BlbmRlZCA9IGZhbHNlOworCisJLyogTm8gc3BlZWQgc2V0ICovCisJdmh1 Yi0+c3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKworCS8qIFdha2V1cCBub3QgZW5hYmxlZCBh bnltb3JlICovCisJdmh1Yi0+d2FrZXVwX2VuID0gZmFsc2U7CisKKwkvKgorCSAqIENsZWFyIGFs bCBwb3J0IHN0YXR1cywgZGlzYWJsZSBnYWRnZXRzIGFuZCAic3VzcGVuZCIKKwkgKiB0aGVtLiBU aGV5IHdpbGwgYmUgd29rZW4gdXAgYnkgYSBwb3J0IHJlc2V0LgorCSAqLworCWZvciAoaSA9IDA7 IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAq cCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQkvKiBPbmx5IGtlZXAgdGhlIGNvbm5lY3RlZCBmbGFn ICovCisJCXAtPnN0YXR1cyAmPSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJCXAtPmNoYW5n ZSA9IDA7CisKKwkJLyogU3VzcGVuZCB0aGUgZ2FkZ2V0IGlmIGFueSAqLworCQlhc3Rfdmh1Yl9k ZXZfc3VzcGVuZCgmcC0+ZGV2KTsKKwl9CisKKwkvKiBDbGVhbnVwIEhXICovCisJd3JpdGVsKDAs IHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DT05GKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQMF9DVFJMKTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUgfAor CSAgICAgICBWSFVCX0VQMV9DVFJMX0VOQUJMRSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9W SFVCX0VQMV9DVFJMKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNf Q0hHKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3QgYXN0X3ZodWIgKnZodWIp Cit7CisJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlJTklUX1dPUksoJnZodWIt Pndha2Vfd29yaywgYXN0X3ZodWJfd2FrZV93b3JrKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQv dWRjL2FzcGVlZC12aHViL3ZodWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw MDAwMDAuLjQ0NzI3MjExYTVkMAotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvdmh1Yi5oCkBAIC0wLDAgKzEsNTE0IEBACisvKiBTUERYLUxpY2Vu c2UtSWRlbnRpZmllcjogR1BMLTIuMCsgKi8KKyNpZm5kZWYgX19BU1BFRURfVkhVQl9ICisjZGVm aW5lIF9fQVNQRUVEX1ZIVUJfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICogVkhVQiByZWdpc3RlciBkZWZpbml0aW9u cyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKi8KKworI2RlZmluZQlBU1RfVkhVQl9DVFJMCQkweDAwCS8qIFJvb3QgRnVuY3Rp b24gQ29udHJvbCAmIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9DT05GCQkw eDA0CS8qIFJvb3QgQ29uZmlndXJhdGlvbiBTZXR0aW5nIFJlZ2lzdGVyICovCisjZGVmaW5lCUFT VF9WSFVCX0lFUgkJMHgwOAkvKiBJbnRlcnJ1cHQgQ3RybCBSZWdpc3RlciAqLworI2RlZmluZQlB U1RfVkhVQl9JU1IJCTB4MEMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmlu ZQlBU1RfVkhVQl9FUF9BQ0tfSUVSCTB4MTAJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wg QUNLIEludGVycnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfRVBfTkFD S19JRVIJMHgxNAkvKiBQcm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBOQUNLIEludGVycnVwdCBF bmFibGUgUmVnaXN0ZXIgICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX0FDS19JU1IJMHgxOAkvKiBQ cm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBBQ0sgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAg Ki8KKyNkZWZpbmUgQVNUX1ZIVUJfRVBfTkFDS19JU1IJMHgxQwkvKiBQcm9ncmFtbWFibGUgRW5k cG9pbnQgUG9vbCBOQUNLIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICovCisjZGVmaW5lIEFT VF9WSFVCX1NXX1JFU0VUCTB4MjAJLyogRGV2aWNlIENvbnRyb2xsZXIgU29mdCBSZXNldCBFbmFi bGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfVVNCU1RTCQkweDI0CS8qIFVTQiBTdGF0 dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVBfVE9HR0xFCTB4MjgJLyogUHJvZ3Jh bW1hYmxlIEVuZHBvaW50IFBvb2wgRGF0YSBUb2dnbGUgVmFsdWUgU2V0ICovCisjZGVmaW5lIEFT VF9WSFVCX0lTT19GQUlMX0FDQwkweDJDCS8qIElzb2Nocm9ub3VzIFRyYW5zYWN0aW9uIEZhaWwg QWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0NUUkwJMHgzMAkvKiBFbmRwb2lu dCAwIENvbnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0RBVEEJ MHgzNAkvKiBCYXNlIEFkZHJlc3Mgb2YgRW5kcG9pbnQgMCBJbi9PVVQgRGF0YSBCdWZmZXIgUmVn aXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX0NUUkwJMHgzOAkvKiBFbmRwb2ludCAxIENv bnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX1NUU19DSEcJMHgz QwkvKiBFbmRwb2ludCAxIFN0YXR1cyBDaGFuZ2UgQml0bWFwIERhdGEgKi8KKyNkZWZpbmUgQVNU X1ZIVUJfU0VUVVAwCQkweDgwCS8qIFJvb3QgRGV2aWNlIFNldHVwIERhdGEgQnVmZmVyMCAqLwor I2RlZmluZSBBU1RfVkhVQl9TRVRVUDEJCTB4ODQJLyogUm9vdCBEZXZpY2UgU2V0dXAgRGF0YSBC dWZmZXIxICovCisKKy8qIE1haW4gY29udHJvbCByZWcgKi8KKyNkZWZpbmUgVkhVQl9DVFJMX1BI WV9DTEsJCQkoMSA8PCAzMSkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9MT09QX1RFU1QJCQkoMSA8 PCAyNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0ROX1BXTgkJCSgxIDw8IDI0KQorI2RlZmluZSBWSFVC X0NUUkxfRFBfUFdOCQkJKDEgPDwgMjMpCisjZGVmaW5lIFZIVUJfQ1RSTF9MT05HX0RFU0MJCQko MSA8PCAxOCkKKyNkZWZpbmUgVkhVQl9DVFJMX0lTT19SU1BfQ1RSTAkJCSgxIDw8IDE3KQorI2Rl ZmluZSBWSFVCX0NUUkxfU1BMSVRfSU4JCQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9DVFJMX0xP T1BfVF9SRVNVTFQJCQkoMSA8PCAxNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0xPT1BfVF9TVFMJCQko MSA8PCAxNCkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9CSVNUX1JFU1VMVAkJKDEgPDwgMTMpCisj ZGVmaW5lIFZIVUJfQ1RSTF9QSFlfQklTVF9DVFJMCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJf Q1RSTF9QSFlfUkVTRVRfRElTCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZIVUJfQ1RSTF9TRVRfVEVT VF9NT0RFKHgpCQkoKHgpIDw8IDgpCisjZGVmaW5lIFZIVUJfQ1RSTF9NQU5VQUxfUkVNT1RFX1dB S0VVUAkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVQl9DVFJMX0FVVE9fUkVNT1RFX1dBS0VVUAkJKDEg PDwgMykKKyNkZWZpbmUgVkhVQl9DVFJMX0NMS19TVE9QX1NVU1BFTkQJCSgxIDw8IDIpCisjZGVm aW5lIFZIVUJfQ1RSTF9GVUxMX1NQRUVEX09OTFkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfQ1RS TF9VUFNUUkVBTV9DT05ORUNUCQkoMSA8PCAwKQorCisvKiBJRVIgJiBJU1IgKi8KKyNkZWZpbmUg VkhVQl9JUlFfVVNCX0NNRF9ERUFETE9DSwkJKDEgPDwgMTgpCisjZGVmaW5lIFZIVUJfSVJRX0VQ X1BPT0xfTkFLCQkJKDEgPDwgMTcpCisjZGVmaW5lIFZIVUJfSVJRX0VQX1BPT0xfQUNLX1NUQUxM CQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFNQkJCSgxIDw8IDEzKQorI2RlZmlu ZSBWSFVCX0lSUV9ERVZJQ0U0CQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTMJ CQkoMSA8PCAxMSkKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFMgkJCSgxIDw8IDEwKQorI2RlZmlu ZSBWSFVCX0lSUV9ERVZJQ0UxCQkJKDEgPDwgOSkKKyNkZWZpbmUgVkhVQl9JUlFfQlVTX1JFU1VN RQkJCSgxIDw8IDgpCisjZGVmaW5lIFZIVUJfSVJRX0JVU19TVVNQRU5EIAkJCSgxIDw8IDcpCisj ZGVmaW5lIFZIVUJfSVJRX0JVU19SRVNFVCAJCQkoMSA8PCA2KQorI2RlZmluZSBWSFVCX0lSUV9I VUJfRVAxX0lOX0RBVEFfQUNLCQkoMSA8PCA1KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lO X0RBVEFfTkFLCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFM TAkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9PVVRfTkFLCQkoMSA8PCAyKQor I2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwJCSgxIDw8IDEpCisjZGVmaW5l IFZIVUJfSVJRX0hVQl9FUDBfU0VUVVAJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX0lSUV9BQ0tf QUxMCQkJMHgxZmYKKworLyogU1cgcmVzZXQgcmVnICovCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRf RVBfUE9PTAkJCSgxIDw8IDkpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfRE1BX0NPTlRST0xMRVIJ CSgxIDw8IDgpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFNQkJCSgxIDw8IDUpCisjZGVm aW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFNAkJCSgxIDw8IDQpCisjZGVmaW5lIFZIVUJfU1dfUkVT RVRfREVWSUNFMwkJCSgxIDw8IDMpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMgkJCSgx IDw8IDIpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMQkJCSgxIDw8IDEpCisjZGVmaW5l IFZIVUJfU1dfUkVTRVRfUk9PVF9IVUIJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX1NXX1JFU0VU X0FMTAkJCShWSFVCX1NXX1JFU0VUX0VQX1BPT0wgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9E TUFfQ09OVFJPTExFUiB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTUgfCBcCisJCQkJ CQkgVkhVQl9TV19SRVNFVF9ERVZJQ0U0IHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfREVWSUNF MyB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTIgfCBcCisJCQkJCQkgVkhVQl9TV19S RVNFVF9ERVZJQ0UxIHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfUk9PVF9IVUIpCisvKiBFUCBB Q0svTkFDSyBJUlEgbWFza3MgKi8KKyNkZWZpbmUgVkhVQl9FUF9JUlEobikJCQkJKDEgPDwgKG4p KQorI2RlZmluZSBWSFVCX0VQX0lSUV9BTEwJCQkJMHg3ZmZmCS8qIDE1IEVQcyAqLworCisvKiBV U0Igc3RhdHVzIHJlZyAqLworI2RlZmluZSBWSFVCX1VTQlNUU19ISVNQRUVECQkJKDEgPDwgMjcp CisKKy8qIEVQIHRvZ2dsZSAqLworI2RlZmluZSBWSFVCX0VQX1RPR0dMRV9WQUxVRQkJCSgxIDw8 IDgpCisjZGVmaW5lIFZIVUJfRVBfVE9HR0xFX1NFVF9FUE5VTSh4KQkJKCh4KSAmIDB4MWYpCisK Ky8qIEhVQiBFUDAgY29udHJvbCAqLworI2RlZmluZSBWSFVCX0VQMF9DVFJMX1NUQUxMCQkJKDEg PDwgMCkKKyNkZWZpbmUgVkhVQl9FUDBfVFhfQlVGRl9SRFkJCQkoMSA8PCAxKQorI2RlZmluZSBW SFVCX0VQMF9SWF9CVUZGX1JEWQkJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfRVAwX1JYX0xFTih4 KQkJCSgoKHgpID4+IDE2KSAmIDB4N2YpCisjZGVmaW5lIFZIVUJfRVAwX1NFVF9UWF9MRU4oeCkJ CQkoKCh4KSAmIDB4N2YpIDw8IDgpCisKKy8qIEhVQiBFUDEgY29udHJvbCAqLworI2RlZmluZSBW SFVCX0VQMV9DVFJMX1JFU0VUX1RPR0dMRQkJKDEgPDwgMikKKyNkZWZpbmUgVkhVQl9FUDFfQ1RS TF9TVEFMTAkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfRVAxX0NUUkxfRU5BQkxFCQkJKDEgPDwg MCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICoKKyAqIHBlci1kZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlv bnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FTl9DVFJMCQkw eDAwCisjZGVmaW5lIEFTVF9WSFVCX0RFVl9JU1IJCTB4MDQKKyNkZWZpbmUgQVNUX1ZIVUJfREVW X0VQMF9DVFJMCQkweDA4CisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FUDBfREFUQQkJMHgwYworCisv KiBEZXZpY2UgZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9ERVZfRU5fU0VUX0FERFIo eCkJCQkoKHgpIDw8IDgpCisjZGVmaW5lIFZIVUJfREVWX0VOX0FERFJfTUFTSwkJCSgoMHhmZikg PDwgOCkKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAwX05BS19JUlFFTgkJKDEgPDwgNikKKyNkZWZp bmUgVkhVQl9ERVZfRU5fRVAwX0lOX0FDS19JUlFFTgkJKDEgPDwgNSkKKyNkZWZpbmUgVkhVQl9E RVZfRU5fRVAwX09VVF9OQUtfSVJRRU4JCSgxIDw8IDQpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQ MF9PVVRfQUNLX0lSUUVOCQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0RFVl9FTl9FUDBfU0VUVVBf SVJRRU4JCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfREVWX0VOX1NQRUVEX1NFTF9ISUdICQkoMSA8 PCAxKQorI2RlZmluZSBWSFVCX0RFVl9FTl9FTkFCTEVfUE9SVAkJCSgxIDw8IDApCisKKy8qIElu dGVycnVwdCBzdGF0dXMgKi8KKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9JTl9EQVRBX05BQ0sJ CSgxIDw8IDQpCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfSU5fQUNLX1NUQUxMCQkoMSA8PCAz KQorI2RlZmluZSBWSFVWX0RFVl9JUlFfRVAwX09VVF9EQVRBX05BQ0sJCSgxIDw8IDIpCisjZGVm aW5lIFZIVVZfREVWX0lSUV9FUDBfT1VUX0FDS19TVEFMTAkJKDEgPDwgMSkKKyNkZWZpbmUgVkhV Vl9ERVZfSVJRX0VQMF9TRVRVUAkJCSgxIDw8IDApCisKKy8qIENvbnRyb2wgYml0cy4KKyAqCisg KiBOb3RlOiBUaGUgZHJpdmVyIHJlbGllcyBvbiB0aGUgYnVsayBvZiB0aG9zZSBiaXRzCisgKiAg ICAgICBtYXRjaGluZyBjb3JyZXNwb25kaW5nIHZIdWIgRVAwIGNvbnRyb2wgYml0cworICovCisj ZGVmaW5lIFZIVUJfREVWX0VQMF9DVFJMX1NUQUxMCQkJVkhVQl9FUDBfQ1RSTF9TVEFMTAorI2Rl ZmluZSBWSFVCX0RFVl9FUDBfVFhfQlVGRl9SRFkJCVZIVUJfRVAwX1RYX0JVRkZfUkRZCisjZGVm aW5lIFZIVUJfREVWX0VQMF9SWF9CVUZGX1JEWQkJVkhVQl9FUDBfUlhfQlVGRl9SRFkKKyNkZWZp bmUgVkhVQl9ERVZfRVAwX1JYX0xFTih4KQkJCVZIVUJfRVAwX1JYX0xFTih4KQorI2RlZmluZSBW SFVCX0RFVl9FUDBfU0VUX1RYX0xFTih4KQkJVkhVQl9FUDBfU0VUX1RYX0xFTih4KQorCisvKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICoKKyAqIHBlci1lbmRwb2ludCByZWdpc3RlciBkZWZpbml0aW9ucyAq CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVNUX1ZIVUJfRVBfQ09ORklHCQkw eDAwCisjZGVmaW5lIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUCQkweDA0CisjZGVmaW5lIEFTVF9W SFVCX0VQX0RFU0NfQkFTRQkJMHgwOAorI2RlZmluZSBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUwkJ MHgwQworCisvKiBFUCBjb25maWcgcmVnICovCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9NQVhf UEtUKHgpCSgoKHgpICYgMHgzZmYpIDw8IDE2KQorI2RlZmluZSBWSFVCX0VQX0NGR19BVVRPX0RB VEFfRElTQUJMRQkoMSA8PCAxMykKKyNkZWZpbmUgVkhVQl9FUF9DRkdfU1RBTExfQ1RSTAkJKDEg PDwgMTIpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0oeCkJKCgoeCkgJiAweGYpIDw8 IDgpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9UWVBFKHgpCQkoKHgpIDw8IDUpCisjZGVmaW5l ICAgRVBfVFlQRV9PRkYJCQkwCisjZGVmaW5lICAgRVBfVFlQRV9CVUxLCQkJMQorI2RlZmluZSAg IEVQX1RZUEVfSU5UCQkJMgorI2RlZmluZSAgIEVQX1RZUEVfSVNPCQkJMworI2RlZmluZSBWSFVC X0VQX0NGR19ESVJfT1VUCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfREVWKHgp CQkoKHgpIDw8IDEpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX0VOQUJMRQkJKDEgPDwgMCkKKworLyog RVAgRE1BIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9FUF9ETUFfUFJPQ19TVEFUVVMoeCkJKCgo eCkgPj4gNCkgJiAweGYpCisjZGVmaW5lICAgRVBfRE1BX1BST0NfUlhfSURMRQkJMAorI2RlZmlu ZSAgIEVQX0RNQV9QUk9DX1RYX0lETEUJCTgKKyNkZWZpbmUgVkhVQl9FUF9ETUFfSU5fTE9OR19N T0RFCSgxIDw8IDMpCisjZGVmaW5lIFZIVUJfRVBfRE1BX09VVF9DT05USUdfTU9ERQkoMSA8PCAz KQorI2RlZmluZSBWSFVCX0VQX0RNQV9DVFJMX1JFU0VUCQkoMSA8PCAyKQorI2RlZmluZSBWSFVC X0VQX0RNQV9TSU5HTEVfU1RBR0UJKDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9FUF9ETUFfREVTQ19N T0RFCQkoMSA8PCAwKQorCisvKiBFUCBETUEgc3RhdHVzICovCisjZGVmaW5lIFZIVUJfRVBfRE1B X1NFVF9UWF9TSVpFKHgpCSgoeCkgPDwgMTYpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1RYX1NJWkUo eCkJCSgoKHgpID4+IDE2KSAmIDB4N2ZmKQorI2RlZmluZSBWSFVCX0VQX0RNQV9SUFRSKHgpCQko KCh4KSA+PiA4KSAmIDB4ZmYpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9SUFRSKHgpCQkoKCh4 KSAmIDB4ZmYpIDw8IDgpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9DUFVfV1BUUih4KQkoeCkK KyNkZWZpbmUgVkhVQl9FUF9ETUFfU0lOR0xFX0tJQ0sJCSgxIDw8IDApIC8qIFdQVFIgPSAxIGZv ciBzaW5nbGUgbW9kZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERNQSBkZXNjcmlwdG9ycyBkZWZpbml0 aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioq KioqKioqKioqKioqKioqKiovCisKKy8qIERlc2MgVzEgSU4gKi8KKyNkZWZpbmUgVkhVQl9EU0Mx X0lOX0lOVEVSUlVQVAkJKDEgPDwgMzEpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX0RBVEEw CQkoMCA8PCAxNCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NQSURfREFUQTIJCSgxIDw8IDE0KQor I2RlZmluZSBWSFVCX0RTQzFfSU5fU1BJRF9EQVRBMQkJKDIgPDwgMTQpCisjZGVmaW5lIFZIVUJf RFNDMV9JTl9TUElEX01EQVRBCQkoMyA8PCAxNCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NFVF9M RU4oeCkJCSgoeCkgJiAweGZmZikKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX0xFTih4KQkJKCh4KSAm IDB4ZmZmKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERhdGEgc3RydWN0dXJl cyBhbmQgbWlzYyBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisK KyNkZWZpbmUgQVNUX1ZIVUJfTlVNX0dFTl9FUHMJMTUJLyogR2VuZXJpYyBub24tMCBFUHMgKi8K KyNkZWZpbmUgQVNUX1ZIVUJfTlVNX1BPUlRTCTUJLyogdkh1YiBwb3J0cyAqLworI2RlZmluZSBB U1RfVkhVQl9FUDBfTUFYX1BBQ0tFVAk2NAkvKiBFUDAncyBtYXggcGFja2V0IHNpemUgKi8KKyNk ZWZpbmUgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQJMTAyNAkvKiBHZW5lcmljIEVQcyBtYXggcGFj a2V0IHNpemUgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfREVTQ1NfQ09VTlQJMjU2CS8qIFVzZSAyNTYg ZGVzY3JpcHRvciBtb2RlICh2YWxpZAorCQkJCQkgKiB2YWx1ZXMgYXJlIDI1NiBhbmQgMzIpCisJ CQkJCSAqLworCitzdHJ1Y3QgYXN0X3ZodWI7CitzdHJ1Y3QgYXN0X3ZodWJfZGV2OworCisvKgor ICogRE1BIGRlc2NyaXB0b3IgKGdlbmVyaWMgRVBzIG9ubHksIGN1cnJlbnRseSBvbmx5IHVzZWQK KyAqIGZvciBJTiBlbmRwb2ludHMKKyAqLworc3RydWN0IGFzdF92aHViX2Rlc2MgeworCV9fbGUz Mgl3MDsKKwlfX2xlMzIJdzE7Cit9OworCisvKiBBIHRyYW5zZmVyIHJlcXVlc3QsIGVpdGhlciBj b3JlLW9yaWdpbmF0ZWQgb3IgaW50ZXJuYWwgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9yZXEgeworCXN0 cnVjdCB1c2JfcmVxdWVzdAlyZXE7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKworCS8qIEFj dHVhbCBjb3VudCB3cml0dGVuIHRvIGRlc2NyaXB0b3JzIChkZXNjIG1vZGUgb25seSkgKi8KKwl1 bnNpZ25lZCBpbnQJCWFjdF9jb3VudDsKKworCS8qCisJICogRGVzYyBudW1iZXIgb2YgdGhlIGZp bmFsIHBhY2tldCBvciAtMS4gRm9yIG5vbi1kZXNjCisJICogbW9kZSAob3IgZXAwKSwgYW55ID49 IDAgdmFsdWUgbWVhbnMgImxhc3QgcGFja2V0IgorCSAqLworCWludAkJCWxhc3RfZGVzYzsKKwor CS8qIFJlcXVlc3QgYWN0aXZlIChwZW5kaW5nIERNQXMpICovCisJYm9vbAkJCWFjdGl2ZSAgOiAx OworCisJLyogSW50ZXJuYWwgcmVxdWVzdCAoZG9uJ3QgY2FsbCBiYWNrIGNvcmUpICovCisJYm9v bAkJCWludGVybmFsIDogMTsKK307CisjZGVmaW5lIHRvX2FzdF9yZXEoX191cmVxKSBjb250YWlu ZXJfb2YoX191cmVxLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCByZXEpCisKKy8qIEN1cnJlbnQgc3Rh dGUgb2YgYW4gRVAwICovCitlbnVtIGVwMF9zdGF0ZSB7CisJZXAwX3N0YXRlX3Rva2VuLAorCWVw MF9zdGF0ZV9kYXRhLAorCWVwMF9zdGF0ZV9zdGF0dXMsCit9OworCisvKgorICogQW4gZW5kcG9p bnQsIGVpdGhlciBnZW5lcmljLCBlcDAsIGFjdHVhbCBnYWRnZXQgRVAKKyAqIG9yIGludGVybmFs IHVzZSB2aHViIEVQMC4gdmh1YiBFUDEgZG9lc24ndCBoYXZlIGFuCisgKiBhc3NvY2lhdGVkIHN0 cnVjdHVyZSBhcyBpdCdzIG1vc3RseSBIVyBtYW5hZ2VkLgorICovCitzdHJ1Y3QgYXN0X3ZodWJf ZXAgeworCXN0cnVjdCB1c2JfZXAJCWVwOworCisJLyogUmVxdWVzdCBxdWV1ZSAqLworCXN0cnVj dCBsaXN0X2hlYWQJcXVldWU7CisKKwkvKiBFUCBpbmRleCBpbiB0aGUgZGV2aWNlLCAwIG1lYW5z IHRoaXMgaXMgYW4gRVAwICovCisJdW5zaWduZWQgaW50CQlkX2lkeDsKKworCS8qIERldiBwb2lu dGVyIG9yIE5VTEwgZm9yIHZIdWIgRVAwICovCisJc3RydWN0IGFzdF92aHViX2RldgkqZGV2Owor CisJLyogdkh1YiBpdHNlbGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWIJCSp2aHViOworCisJLyoKKwkg KiBETUEgYnVmZmVyIGZvciBFUDAsIGZhbGxiYWNrIERNQSBidWZmZXIgZm9yIG1pc2FsaWduZWQK KwkgKiBPVVQgdHJhbnNmZXJzIGZvciBnZW5lcmljIEVQcworCSAqLworCXZvaWQJCQkqYnVmOwor CWRtYV9hZGRyX3QJCWJ1Zl9kbWE7CisKKwkvKiBUaGUgcmVzdCBkZXBlbmRzIG9uIHRoZSBFUCB0 eXBlICovCisJdW5pb24geworCQkvKiBFUDAgKGVpdGhlciBkZXZpY2Ugb3Igdmh1YikgKi8KKwkJ c3RydWN0IHsKKwkJCS8qCisJCQkgKiBFUDAgcmVnaXN0ZXJzIGFyZSAic2ltaWxhciIgZm9yCisJ CQkgKiB2SHViIGFuZCBkZXZpY2VzIGJ1dCBsb2NhdGVkIGluCisJCQkgKiBkaWZmZXJlbnQgcGxh Y2VzLgorCQkJICovCisJCQl2b2lkIF9faW9tZW0JCSpjdGxzdGF0OworCQkJdm9pZCBfX2lvbWVt CQkqc2V0dXA7CisKKwkJCS8qIEN1cnJlbnQgc3RhdGUgJiBkaXJlY3Rpb24gKi8KKwkJCWVudW0g ZXAwX3N0YXRlCQlzdGF0ZTsKKwkJCWJvb2wJCQlkaXJfaW47CisKKwkJCS8qIEludGVybmFsIHVz ZSByZXF1ZXN0ICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfcmVxCXJlcTsKKwkJfSBlcDA7CisKKwkJ LyogR2VuZXJpYyBlbmRwb2ludCAoYWthIEVQbikgKi8KKwkJc3RydWN0IHsKKwkJCS8qIFJlZ2lz dGVycyAqLworCQkJdm9pZCBfX2lvbWVtICAgCQkqcmVnczsKKworCQkJLyogSW5kZXggaW4gZ2xv YmFsIHBvb2wgKDAuLjE0KSAqLworCQkJdW5zaWduZWQgaW50CQlnX2lkeDsKKworCQkJLyogRE1B IERlc2NyaXB0b3JzICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfZGVzYwkqZGVzY3M7CisJCQlkbWFf YWRkcl90CQlkZXNjc19kbWE7CisJCQl1bnNpZ25lZCBpbnQJCWRfbmV4dDsKKwkJCXVuc2lnbmVk IGludAkJZF9sYXN0OworCQkJdW5zaWduZWQgaW50CQlkbWFfY29uZjsKKworCQkJLyogTWF4IGNo dW5rIHNpemUgZm9yIElOIEVQcyAqLworCQkJdW5zaWduZWQgaW50CQljaHVua19tYXg7CisKKwkJ CS8qIFN0YXRlIGZsYWdzICovCisJCQlib29sCQkJaXNfaW4gOiAgMTsKKwkJCWJvb2wJCQlpc19p c28gOiAxOworCQkJYm9vbAkJCXN0YWxsZWQgOiAxOworCQkJYm9vbAkJCXdlZGdlZCA6IDE7CisJ CQlib29sCQkJZW5hYmxlZCA6IDE7CisJCQlib29sCQkJZGVzY19tb2RlIDogMTsKKwkJfSBlcG47 CisJfTsKK307CisjZGVmaW5lIHRvX2FzdF9lcChfX3VlcCkgY29udGFpbmVyX29mKF9fdWVwLCBz dHJ1Y3QgYXN0X3ZodWJfZXAsIGVwKQorCisvKiBBIGRldmljZSBhdHRhY2hlZCB0byBhIHZIdWIg cG9ydCAqLworc3RydWN0IGFzdF92aHViX2RldiB7CisJc3RydWN0IGFzdF92aHViCQkJKnZodWI7 CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisKKwkvKiBEZXZpY2UgaW5kZXggKDAuLi40KSBhbmQg bmFtZSBzdHJpbmcgKi8KKwl1bnNpZ25lZCBpbnQJCQlpbmRleDsKKwljb25zdCBjaGFyCQkJKm5h bWU7CisKKwkvKiBzeXNmcyBlbmNsb3N1cmUgZm9yIHRoZSBnYWRnZXQgZ3VuayAqLworCXN0cnVj dCBkZXZpY2UJCQlwb3J0X2RldjsKKworCS8qIExpbmsgdG8gZ2FkZ2V0IGNvcmUgKi8KKwlzdHJ1 Y3QgdXNiX2dhZGdldAkJZ2FkZ2V0OworCXN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlcgkqZHJpdmVy OworCWJvb2wJCQkJcmVnaXN0ZXJlZCA6IDE7CisJYm9vbAkJCQl3YWtldXBfZW4gOiAxOworCWJv b2wJCQkJc3VzcGVuZGVkIDogMTsKKwlib29sCQkJCWVuYWJsZWQgOiAxOworCisJLyogRW5kcG9p bnQgc3RydWN0dXJlcyAqLworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJZXAwOworCXN0cnVjdCBhc3Rf dmh1Yl9lcAkJKmVwbnNbQVNUX1ZIVUJfTlVNX0dFTl9FUHNdOworCit9OworI2RlZmluZSB0b19h c3RfZGV2KF9fZykgY29udGFpbmVyX29mKF9fZywgc3RydWN0IGFzdF92aHViX2RldiwgZ2FkZ2V0 KQorCisvKiBQZXIgdmh1YiBwb3J0IHN0YXRlaW5mbyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhc3Rf dmh1Yl9wb3J0IHsKKwkvKiBQb3J0IHN0YXR1cyAmIHN0YXR1cyBjaGFuZ2UgcmVnaXN0ZXJzICov CisJdTE2CQkJc3RhdHVzOworCXUxNgkJCWNoYW5nZTsKKworCS8qIEFzc29jaWF0ZWQgZGV2aWNl IHNsb3QgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZGV2CWRldjsKK307CisKKy8qIEdsb2JhbCB2aHVi IHN0cnVjdHVyZSAqLworc3RydWN0IGFzdF92aHViIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNl CQkqcGRldjsKKwl2b2lkIF9faW9tZW0JCQkqcmVnczsKKwlpbnQJCQkJaXJxOworCXNwaW5sb2Nr X3QJCQlsb2NrOworCXN0cnVjdCB3b3JrX3N0cnVjdAkJd2FrZV93b3JrOworCXN0cnVjdCBjbGsJ CQkqY2xrOworCisJLyogRVAwIERNQSBidWZmZXJzIGFsbG9jYXRlZCBpbiBvbmUgY2h1bmsgKi8K Kwl2b2lkCQkJCSplcDBfYnVmczsKKwlkbWFfYWRkcl90CQkJZXAwX2J1ZnNfZG1hOworCisJLyog RVAwIG9mIHRoZSB2aHViIGl0c2VsZiAqLworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJZXAwOworCisJ LyogU3RhdGUgb2Ygdmh1YiBlcDEgKi8KKwlib29sCQkJCWVwMV9zdGFsbGVkIDogMTsKKworCS8q IFBlci1wb3J0IGluZm8gKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydAkJcG9ydHNbQVNUX1ZIVUJf TlVNX1BPUlRTXTsKKworCS8qIEdlbmVyaWMgRVAgZGF0YSBzdHJ1Y3R1cmVzICovCisJc3RydWN0 IGFzdF92aHViX2VwCQllcG5zW0FTVF9WSFVCX05VTV9HRU5fRVBzXTsKKworCS8qIFVwc3RyZWFt IGJ1cyBpcyBzdXNwZW5kZWQgPyAqLworCWJvb2wJCQkJc3VzcGVuZGVkIDogMTsKKworCS8qIEh1 YiBpdHNlbGYgY2FuIHNpZ25hbCByZW1vdGUgd2FrZXVwICovCisJYm9vbAkJCQl3YWtldXBfZW4g OiAxOworCisJLyogRm9yY2UgZnVsbCBzcGVlZCBvbmx5ICovCisJYm9vbAkJCQlmb3JjZV91c2Ix IDogMTsKKworCS8qIFVwc3RyZWFtIGJ1cyBzcGVlZCBjYXB0dXJlZCBhdCBidXMgcmVzZXQgKi8K Kwl1bnNpZ25lZCBpbnQJCQlzcGVlZDsKK307CisKKy8qIFN0YW5kYXJkIHJlcXVlc3QgaGFuZGxl cnMgcmVzdWx0IGNvZGVzICovCitlbnVtIHN0ZF9yZXFfcmMgeworCXN0ZF9yZXFfc3RhbGwgPSAt MSwJLyogU3RhbGwgcmVxdWVzdGVkICovCisJc3RkX3JlcV9jb21wbGV0ZSA9IDAsCS8qIFJlcXVl c3QgY29tcGxldGVkIHdpdGggbm8gZGF0YSAqLworCXN0ZF9yZXFfZGF0YSA9IDEsCS8qIFJlcXVl c3QgY29tcGxldGVkIHdpdGggZGF0YSAqLworCXN0ZF9yZXFfZHJpdmVyID0gMiwJLyogUGFzcyB0 byBkcml2ZXIgcGxzICovCit9OworCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfVkVSQk9TRQor I2RlZmluZSBVRENWREJHKHUsIGZtdC4uLikJZGV2X2RiZygmKHUpLT5wZGV2LT5kZXYsIGZtdCkK KworI2RlZmluZSBFUFZEQkcoZXAsIGZtdCwgLi4uKQlkbyB7CQkJXAorCWRldl9kYmcoJihlcCkt PnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlczpFUCVkICIgZm10LAkJCQlcCisJCShlcCktPmRl diA/IChlcCktPmRldi0+bmFtZSA6ICJodWIiLAlcCisJCShlcCktPmRfaWR4LCAjI19fVkFfQVJH U19fKTsJCVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRFZEQkcoZCwgZm10LCAuLi4pCWRvIHsJ CQlcCisJZGV2X2RiZygmKGQpLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXMgIiBmbXQsIChk KS0+bmFtZSwJCQlcCisJCSMjX19WQV9BUkdTX18pOwkJCQlcCisJfSB3aGlsZSgwKQorCisjZWxz ZQorI2RlZmluZSBVRENWREJHKHUsIGZtdC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEVQ VkRCRyhlcCwgZm10LCAuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBEVkRCRyhkLCBmbXQs IC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VU X0RFQlVHCisjZGVmaW5lIFVEQ0RCRyh1LCBmbXQuLi4pCWRldl9kYmcoJih1KS0+cGRldi0+ZGV2 LCBmbXQpCisKKyNkZWZpbmUgRVBEQkcoZXAsIGZtdCwgLi4uKQlkbyB7CQkJXAorCWRldl9kYmco JihlcCktPnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlczpFUCVkICIgZm10LAkJCQlcCisJCShl cCktPmRldiA/IChlcCktPmRldi0+bmFtZSA6ICJodWIiLAlcCisJCShlcCktPmRfaWR4LCAjI19f VkFfQVJHU19fKTsJCVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRERCRyhkLCBmbXQsIC4uLikJ ZG8gewkJCVwKKwlkZXZfZGJnKCYoZCktPnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlcyAiIGZt dCwgKGQpLT5uYW1lLAkJCVwKKwkJIyNfX1ZBX0FSR1NfXyk7CQkJCVwKKwl9IHdoaWxlKDApCisj ZWxzZQorI2RlZmluZSBVRENEQkcodSwgZm10Li4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUg RVBEQkcoZXAsIGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRERCRyhkLCBmbXQs IC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLyogY29yZS5jICovCit2b2lkIGFzdF92 aHViX2RvbmUoc3RydWN0IGFzdF92aHViX2VwICplcCwgc3RydWN0IGFzdF92aHViX3JlcSAqcmVx LAorCQkgICBpbnQgc3RhdHVzKTsKK3ZvaWQgYXN0X3ZodWJfbnVrZShzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLCBpbnQgc3RhdHVzKTsKK3N0cnVjdCB1c2JfcmVxdWVzdCAqYXN0X3ZodWJfYWxsb2Nf cmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1X2VwLAorCQkJCQkgICBnZnBfdCBnZnBfZmxhZ3MpOwor dm9pZCBhc3Rfdmh1Yl9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwgc3RydWN0IHVz Yl9yZXF1ZXN0ICp1X3JlcSk7Cit2b2lkIGFzdF92aHViX2luaXRfaHcoc3RydWN0IGFzdF92aHVi ICp2aHViKTsKKworLyogZXAwLmMgKi8KK3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soc3Ry dWN0IGFzdF92aHViX2VwICplcCwgYm9vbCBpbl9hY2spOwordm9pZCBhc3Rfdmh1Yl9lcDBfaGFu ZGxlX3NldHVwKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOwordm9pZCBhc3Rfdmh1Yl9pbml0X2Vw MChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCSAgICAg ICBzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkZXYpOworaW50IGFzdF92aHViX3JlcGx5KHN0cnVjdCBh c3Rfdmh1Yl9lcCAqZXAsIGNoYXIgKnB0ciwgaW50IGxlbik7CitpbnQgX19hc3Rfdmh1Yl9zaW1w bGVfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IGxlbiwgLi4uKTsKKyNkZWZpbmUg YXN0X3ZodWJfc2ltcGxlX3JlcGx5KHVkYywgLi4uKQkJCQkJICAgICAgIFwKKwlfX2FzdF92aHVi X3NpbXBsZV9yZXBseSgodWRjKSwJCQkJCSAgICAgICBcCisJCQkgICAgICAgc2l6ZW9mKCh1OFtd KSB7IF9fVkFfQVJHU19fIH0pL3NpemVvZih1OCksICAgICAgXAorCQkJICAgICAgIF9fVkFfQVJH U19fKQorCisvKiBodWIuYyAqLwordm9pZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3QgYXN0X3Zo dWIgKnZodWIpOworZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX3N0ZF9odWJfcmVxdWVzdChzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsK K2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9jbGFzc19odWJfcmVxdWVzdChzdHJ1Y3QgYXN0X3Zo dWJfZXAgKmVwLAorCQkJCQkgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcnEpOwordm9pZCBh c3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHVuc2lnbmVkIGlu dCBwb3J0LAorCQkJICAgICBib29sIG9uKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3N1c3BlbmQoc3Ry dWN0IGFzdF92aHViICp2aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc3VtZShzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIpOwordm9pZCBhc3Rfdmh1Yl9odWJfcmVzZXQoc3RydWN0IGFzdF92aHViICp2 aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3dha2VfYWxsKHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7 CisKKy8qIGRldi5jICovCitpbnQgYXN0X3ZodWJfaW5pdF9kZXYoc3RydWN0IGFzdF92aHViICp2 aHViLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3ZvaWQgYXN0X3ZodWJfZGVsX2RldihzdHJ1Y3QgYXN0 X3ZodWJfZGV2ICpkKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X2lycShzdHJ1Y3QgYXN0X3ZodWJfZGV2 ICpkKTsKK2ludCBhc3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICpl cCwKKwkJCSAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsKKworLyogZXBuLmMgKi8K K3ZvaWQgYXN0X3ZodWJfZXBuX2Fja19pcnEoc3RydWN0IGFzdF92aHViX2VwICplcCk7Cit2b2lk IGFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoc3RydWN0IGFzdF92aHViX2VwICplcCk7CitzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmFzdF92aHViX2FsbG9jX2VwbihzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpk LCB1OCBhZGRyKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X3N1c3BlbmQoc3RydWN0IGFzdF92aHViX2Rl diAqZCk7Cit2b2lkIGFzdF92aHViX2Rldl9yZXN1bWUoc3RydWN0IGFzdF92aHViX2RldiAqZCk7 Cit2b2lkIGFzdF92aHViX2Rldl9yZXNldChzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKTsKKworI2Vu ZGlmIC8qIF9fQVNQRUVEX1ZIVUJfSCAqLwo=