From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Brower Date: Tue, 22 Feb 2005 18:07:55 +0000 Subject: [RFC/PATCH] envctrl framework and envctrltwo (UE250) driver Message-Id: MIME-Version: 1 Content-Type: multipart/mixed; boundary="----=_Part_716_11853718.1109095675419" List-Id: To: ultralinux@vger.kernel.org ------=_Part_716_11853718.1109095675419 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Content-Disposition: inline Attached is a patch against a somewhat dated BK 2.6.10 that provides the following: 1) a basic framework for supporting SUNW,envctrl environmental monitoring flavors 2) an implementation of the framework for basic SUNW,envctrltwo (UE250) support I am using the term "framework" very lightly here. This demonstrates use of the in-kernel I2C subsystem rather than the current roll-your-own support found in the envctrl and bbc_envctrl drivers. There are a few shortcomings with using the in-kernel I2C but these can perhaps be ironed-out over time. As well, it addresses issue brought up many months ago related to how the monitoring kernel thread is started/stopped and how the shutdown functions are invoked-- basically a freshening. I believe it would be easy to move the existing envctrl driver (should be renamed envctrl-i2c or somesuch) to this framework as well and I might be convinced to do so if there is any interest. As for the in-kernel I2C shortcomings (as I understand them; correct me if you know better): First, the UE250 is a multi-master I2C bus; this is unlike (so far as I know) other envctrl implementations. The in-kernel I2C subsystem doesn't handle multimaster, but I've included an I2C patch to support detection of lost arbitration and I've passed this on to the lmsensors folks (still awaiting a response). This lost arbitration detection and recovery could be tightened up a bit, but seems relatively stable. Second, and related to the first, there does not seem to be a way within the I2C subsystem to send multiple I2C messages with dyamic content in a bus-atomic fashion, which is required for proper multimaster operation. I have no workaround for this, though the I2C API could be easily modified to accomodate such an extension, I believe. For the moment, our heavy locking (see below) and collision detection give us a level of protection but it doesn't make me sleep well at night. Second, the in-kernel I2C isn't written to support use while in_interrupt() (it uses semaphores for restricting access), which is a requirement of the SUNW,envctrltwo (if we use interrupts...). As a workaround, I've wrapped all I2C bus access calls with spinlocks. Fourth, I don't see any easy way to leverage the use of the already-written chip drivers. Implementing support for them was trivial, and it is not clear to me how a kernel module could probe existing chip drivers and retain a handle to them for in-kernel access. This driver is relatively rough, but has been running on my E250 for quite a while under a bit of I2C bus stress. I'd like to see reports from folks with dual CPUs, though. Please note that I needed to upgrade my BK 2.6 to include SYM53C8XX version 2.1.18n, but that may just be due to my setup. I've excessively abused sysfs for access to sensors data in this driver. I'd appreciate any feedback. Thanks, E ------=_Part_716_11853718.1109095675419 Content-Type: application/octet-stream; name="26_envctrltwo.patch" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="26_envctrltwo.patch" PT09PT0gYXJjaC9zcGFyYzY0L0tjb25maWcgMS42MSB2cyBlZGl0ZWQgPT09PT0KLS0tIDEuNjEv YXJjaC9zcGFyYzY0L0tjb25maWcJMjAwNS0wMS0xMCAxMzoxMTowMyAtMDg6MDAKKysrIGVkaXRl ZC9hcmNoL3NwYXJjNjQvS2NvbmZpZwkyMDA1LTAyLTAyIDE4OjIwOjQ2IC0wODowMApAQCAtNDE4 LDcgKzQxOCw3IEBACiAJICBtYWNybyBpbiBscC5jIGFuZCB0aGUgUEFSUE9SVF9NQVggbWFjcm8g aW4gcGFycG9ydC5oLgogCiBjb25maWcgRU5WQ1RSTAotCXRyaXN0YXRlICJTVU5XLCBlbnZjdHJs IHN1cHBvcnQiCisJdHJpc3RhdGUgIlNVTlcsZW52Y3RybCBzdXBwb3J0IgogCWRlcGVuZHMgb24g UENJCiAJaGVscAogCSAgS2VybmVsIHN1cHBvcnQgZm9yIHRlbXBlcmF0dXJlIGFuZCBmYW4gbW9u aXRvcmluZyBvbiBTdW4gU01FCkBAIC00MjYsNiArNDI2LDEzIEBACiAKIAkgIFRvIGNvbXBpbGUg dGhpcyBkcml2ZXIgYXMgYSBtb2R1bGUsIGNob29zZSBNIGhlcmU6IHRoZQogCSAgbW9kdWxlIHdp bGwgYmUgY2FsbGVkIGVudmN0cmwuCisKK2NvbmZpZyBFTlZDVFJMVFdPCisJdHJpc3RhdGUgIlNV TlcsZW52Y3RybHR3byBlbnZpcm9ubWVudGFsIG1vbml0b3Jpbmcgc3VwcG9ydCIKKwlkZXBlbmRz IG9uIEkyQ19FTlZDVFJMCisJaGVscAorCSAgVGhpcyBkcml2ZXIgcHJvdmlkZXMgZW52aXJvbm1l bnRhbCBtb25pdG9yaW5nIGFuZCBmcm9udCBzdGF0dXMKKwkgIHBhbmVsIHN1cHBvcnQgZm9yIHN5 c3RlbXMgd2l0aCBTVU5XLGVudmN0cmx0d28gKFVsdHJhIEVudGVycHJpc2UgMjUwKQogCiBjb25m aWcgRElTUExBWTdTRUcKIAl0cmlzdGF0ZSAiNy1TZWdtZW50IERpc3BsYXkgc3VwcG9ydCIKPT09 PT0gYXJjaC9zcGFyYzY0L2RlZmNvbmZpZyAxLjE1NSB2cyBlZGl0ZWQgPT09PT0KLS0tIDEuMTU1 L2FyY2gvc3BhcmM2NC9kZWZjb25maWcJMjAwNS0wMS0yMSAyMDowMzozNSAtMDg6MDAKKysrIGVk aXRlZC9hcmNoL3NwYXJjNjQvZGVmY29uZmlnCTIwMDUtMDItMDIgMTg6MjE6MDQgLTA4OjAwCkBA IC0xMTUsNiArMTE1LDcgQEAKIENPTkZJR19QQVJQT1JUXzEyODQ9eQogQ09ORklHX1BSSU5URVI9 bQogQ09ORklHX0VOVkNUUkw9bQorQ09ORklHX0VOVkNUUkxUV089bQogQ09ORklHX0RJU1BMQVk3 U0VHPW0KICMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAKPT09PT0gYXJjaC9zcGFy YzY0L2tlcm5lbC9NYWtlZmlsZSAxLjMwIHZzIGVkaXRlZCA9PT09PQotLS0gMS4zMC9hcmNoL3Nw YXJjNjQva2VybmVsL01ha2VmaWxlCTIwMDQtMDktMDEgMTc6NTI6NTMgLTA3OjAwCisrKyBlZGl0 ZWQvYXJjaC9zcGFyYzY0L2tlcm5lbC9NYWtlZmlsZQkyMDA1LTAyLTE1IDA4OjQ1OjIzIC0wODow MApAQCAtMjMsNiArMjMsOSBAQAogb2JqLSQoQ09ORklHX1VTM19GUkVRKSArPSB1czNfY3B1ZnJl cS5vCiBvYmotJChDT05GSUdfVVMyRV9GUkVRKSArPSB1czJlX2NwdWZyZXEubwogb2JqLSQoQ09O RklHX0tQUk9CRVMpICs9IGtwcm9iZXMubworb2JqLSQoQ09ORklHX0VOVkNUUkxUV08pICs9IGVu dmN0cmx0d28ubworCitlbnZjdHJsdHdvLW9ianMgOj0gZW52X2xpYi5vIGVudl9lbnZjdHJsdHdv Lm8KIAogaWZkZWYgQ09ORklHX1NVTk9TX0VNVUwKICAgb2JqLXkgKz0gc3lzX3N1bm9zMzIubyBz dW5vc19pb2N0bDMyLm8KPT09PT0gYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnZfZW52Y3RybHR3by5j IDEuMSB2cyBlZGl0ZWQgPT09PT0KLS0tIDEuMS9hcmNoL3NwYXJjNjQva2VybmVsL2Vudl9lbnZj dHJsdHdvLmMJMjAwNS0wMi0wMyAxMDoxMjozOCAtMDg6MDAKKysrIGVkaXRlZC9hcmNoL3NwYXJj NjQva2VybmVsL2Vudl9lbnZjdHJsdHdvLmMJMjAwNS0wMi0xOCAxOToxNTozOCAtMDg6MDAKQEAg LTAsMCArMSwxMDEyIEBACisvKiAkSWQkCisgKiBlbnZfZW52Y3RybHR3by5jOiBFbnZpcm9ubWVu dGFsIG1vbml0b3JpbmcgYW5kIGZyb250IHN0YXR1cyBwYW5lbAorICogICAgICAgICAgICAgICAg ICAgc3VwcG9ydCBmb3IgU1VOVyxlbnZjdHJsdHdvIChFMjUwKQorICoKKyAqIENvcHlyaWdodCAo QykgMjAwNC0yMDA1IEVyaWMgQnJvd2VyIChlYnJvd2VyQGdtYWlsLmNvbSkKKyAqIAorICogVE9E T3M6IG1vdmUgb3ZlcnRlbXAgaGFuZGxpbmcgdG8gbGlicmFyeSBjb2RlCisgKiAgICAgICAgaW1w bGVtZW50IGRpYWdub3N0aWMgcmV0dXJuIHZhbHVlcyBmb3IgYWxsIEkyQy1hY2Nlc3MgZnVuY3Rp b25zCisgKiAgICAgICAgKGkyYykgaTJjLWNvcmUgY2Fubm90IGJlIHVzZWQgaW5faW50ZXJydXB0 KCkgZHVlIHRvIHNlbWFwaG9yZXMKKyAqIAkgIChpMmMpIGJ1cy1hdG9taWNpdHkgZm9yIHNlbmRp bmcgbXVsdGlwbGUgbWVzc2FnZXMgKHJlYWQseG9yLHdyaXRlKQorICoJICBiZXR0ZXIgSVJRIGNh dXNlIHJlcG9ydGluZy9oYW5kbGluZyAoc2VlIElERUFzIGJlbG93KQorICoKKyAqIElERUFzOiBt b25pdG9yIGtleXN3aWNoLS0gc2VjdXJlID09IHN5c2N0bCBrZXJuZWwuc3RvcC1hID0gMCAKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlhZyAgID09IHN5c2N0bCBrZXJuZWwucHJpbnRr IGluY3JlYXNlZCBsb2dsZXZlbAorICoJICBvdmVycmlkZSBzeXNjdGwga2VybmVsLnNjb25zLXBv d2Vyb2ZmIGlmIG92ZXJ0ZW1wX2FjdGlvbiA9PSBwb3dlcm9mZgorICoJICBkZWNyZWFzZSBvbi1k ZW1hbmQgYnVzIHRyYWZmaWMgd2l0aCBzZW5zb3IgcGVyaW9kaWMgcG9sbGluZworICogICAgICAg IHBlcmlvZGljIHBvbGxpbmcgb2YgcHMgYW5kIGRpc2sgc2Vuc29ycyAoYW5kIGludGVycnVwdHMp IHRvIHNldCBsZWRzCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUg PGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGlu dXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lv cG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9taXNjZGV2 aWNlLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Cisj aW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvaTJjLmg+CisjaW5jbHVk ZSA8bGludXgva21vZC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUg PGxpbnV4L2t0aHJlYWQuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51 eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L3JlYm9vdC5oPgorI2luY2x1ZGUgPGxpbnV4 L3N5c2ZzLmg+CisKKyNpbmNsdWRlIDxhc20vZWJ1cy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNz Lmg+CisjaW5jbHVkZSA8YXNtL2F1eGlvLmg+CisKKyNpbmNsdWRlIDxhc20vaTJjLWVudmN0cmwu aD4KKyNpbmNsdWRlICJlbnZfZW52Y3RybHR3by5oIgorI2luY2x1ZGUgImVudl9saWIuaCIKKwor I2RlZmluZSBFTlYyX0RFVk5BTUUJImVudmN0cmx0d28iCisjZGVmaW5lIEVOVjJfVkVSU0lPTiAg ICAiMC4yLjAiCisKKyNkZWZpbmUgRU5WMl9ERUJVR19USEVSTVMgKDApIC8qIGR1bXAgdGhlcm1p c3RlcnMgZm91bmQgYW5kIHZhbHVlcyBwcm9iZWQgICovCisjZGVmaW5lIEVOVjJfREVCVUdfRkFO ICAgICgwKSAvKiB1c2VyIGZhbnNwZWVkIGNvbnRyb2wgdmlhIHN5c2ZzIC0gREFOR0VSISAqLwor I2RlZmluZSBFTlYyX0RFQlVHX1RFTVAgICAoMCkgLyogdXNlciBDUFUgdGVtcCBjb250cm9sIHZp YSBzeXNmcyAgICAgICAgICAgKi8KKworc3RhdGljIHN0cnVjdCBwY2ZfZW52Y3RybF9uZXh1cyAq bmV4OworCisvKiB0aGVzZSBhcmUgcmVmZXJlbmNlZCBieSBlbnZfbGliLS0gcGVyaGFwcyBhbiBp bml0KCkgZnVuYyB3b3VsZCBiZSBiZXR0ZXIgKi8KK3N0cnVjdCBpMmNfYWRhcHRlciAqZW52Y3Ry bF9hZGFwOworc3BpbmxvY2tfdCBlbnZjdHJsX2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CisK Ky8qCisgKiBPQlAgInRoZXJtaXN0ZXJzIiBwcm9wZXJ0eQorICogTm90ZTogIm5hbWUiIGlzIGFj dHVhbGx5IHZhcmlhYmxlIGxlbmd0aCwKKyAqIGJ1dCBudWxsLXBhZGRlZCB0byBhdCBsZWFzdCA0 IGNoYXJhY3RlcnMKKyAqLworc3RydWN0IGVudjJfdGhlcm1pc3Rlcl9wcm9wIHsKKwl1MzIJYWRk cjsKKwl1MzIJcG9ydDsKKwl1MzIJbWluX3RlbXA7CisJdTMyCXdhcm5fdGVtcDsKKwl1MzIJc2h1 dGRvd25fdGVtcDsKKwl1MzIJbnVtOworCXUzMglkZW47CisJdTgJbmFtZVs0XTsKK31fX2F0dHJp YnV0ZSgocGFja2VkKSk7CisKK3R5cGVkZWYgZW51bSBlbnYyX3RoZXJtX3R5cGUgeworCXRoZXJt X3R5cGVfY3B1ID0gMCwKKwl0aGVybV90eXBlX25vbmNwdSwKK30gdGhlcm10eXBlX3Q7CisKK3N0 cnVjdCB0aGVybSB7CisJc3RydWN0IGVudjJfdGhlcm1pc3Rlcl9wcm9wICAqY2ZnOworCXRoZXJt dHlwZV90ICAgICAgICAgICAgICAgICAgdHlwZTsgCisJdW5zaWduZWQgbG9uZyAgICAgICAgICAg ICAgICBsYXN0X3dhcm47CisJc3RydWN0IGxpc3RfaGVhZCAgICAgICAgICAgICBsaXN0OworfTsK Kworc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZW52Ml90aGVybXMgPSBMSVNUX0hFQURfSU5JVChl bnYyX3RoZXJtcyk7CitzdGF0aWMgdTggZW52Ml9jcHVfdGVtcF90YWJsZVsyNTZdOworc3RhdGlj IHU4IGVudjJfY3B1X2ZhbnNwZWVkX3RhYmxlWzI1Nl07CitzdGF0aWMgdTggKmVudjJfdGhlcm1z X2RhdGE7CisKK3N0YXRpYyBzdHJ1Y3QgdGltZXJfbGlzdCBlbnYyX2ZzcF9hY3RfdGltZXI7Citz dGF0aWMgdW5zaWduZWQgaW50IGVudjJfZnNwX2lycTsKKworc3RhdGljIHN0cnVjdCB0YXNrX3N0 cnVjdCAqa2VudmN0cmxkX3Rhc2s7CisKK3N0YXRpYyB2b2lkIGVudjJfZG9fcG93ZXJvZmYodm9p ZCk7CitzdGF0aWMgdm9pZCBlbnYyX2RvX3NodXRkb3duKHZvaWQpOworc3RhdGljIHZvaWQgKCpl bnYyX3Bvd2Vyb2ZmX3Bmbikodm9pZCkgPSBOVUxMIC8qIGVudjJfZG9fcG93ZXJvZmYgKi87Citz dGF0aWMgaW50IGVudjJfZmFuc3BlZWRfZm9yY2VkID0gMDsKKworLyogc3lzZnMgc2ghdGUgZ29l cyBoZXJlLi4uICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqZW52Ml9kZXZpY2U7 CisKK3N0YXRpYyBzc2l6ZV90IGVudjJfc2hvd19mYW5zcGVlZChzdHJ1Y3QgZGV2aWNlICpkLCBj aGFyICpidWYpOworI2lmIEVOVjJfREVCVUdfRkFOCisJc3RhdGljIHNzaXplX3QgZW52Ml9zdG9y ZV9mYW5zcGVlZCgKKwkJc3RydWN0IGRldmljZSAqLCBjb25zdCBjaGFyICosIHNpemVfdCk7CisJ c3RhdGljIERFVklDRV9BVFRSKGZhbnNwZWVkLCBcCisJCVNfSVJVR098U19JV1VTUiwgZW52Ml9z aG93X2ZhbnNwZWVkLCBlbnYyX3N0b3JlX2ZhbnNwZWVkKTsKKyNlbHNlIAorCXN0YXRpYyBERVZJ Q0VfQVRUUihmYW5zcGVlZCwgU19JUlVHTywgZW52Ml9zaG93X2ZhbnNwZWVkLCBOVUxMKTsKKyNl bmRpZgorI2lmIEVOVjJfREVCVUdfVEVNUAorCXN0YXRpYyB1OCBlbnYyX2ZvcmNlZF90ZW1wOwor CXN0YXRpYyBzc2l6ZV90IGVudjJfc3RvcmVfdGVtcChzdHJ1Y3QgZGV2aWNlICosIGNvbnN0IGNo YXIgKiwgc2l6ZV90KTsKKwlzdGF0aWMgc3NpemVfdCBlbnYyX3Nob3dfdGVtcCAoc3RydWN0IGRl dmljZSAqLCBjaGFyICpidWYpOworCXN0YXRpYyBERVZJQ0VfQVRUUihmb3JjZWRfdGVtcCwgXAor CQlTX0lSVUdPIHwgU19JV1VTUiwgZW52Ml9zaG93X3RlbXAsIGVudjJfc3RvcmVfdGVtcCk7Cisj ZW5kaWYKK3N0YXRpYyBzc2l6ZV90IGVudjJfc2hvd190aGVybWlzdGVycyhzdHJ1Y3QgZGV2aWNl ICpkLCBjaGFyICpidWYpOworc3RhdGljIERFVklDRV9BVFRSKHRoZXJtaXN0ZXJzLCBTX0lSVUdP LCBlbnYyX3Nob3dfdGhlcm1pc3RlcnMsIE5VTEwpOworLyogVE9ETzogc3RvcmVfcG93ZXIgZm9y IFBTIHN0YXR1cyBvdmVycmlkZSA/Pz8gKi8KK3N0YXRpYyBzc2l6ZV90IGVudjJfc2hvd19wb3dl cihzdHJ1Y3QgZGV2aWNlICpkLCBjaGFyICpidWYpOworc3RhdGljIERFVklDRV9BVFRSKHBvd2Vy LCBTX0lSVUdPLCBlbnYyX3Nob3dfcG93ZXIsIE5VTEwpOworLyogVE9ETzogc3RvcmVfZGlza3Mg Zm9yIGRpc2sgc3RhdHVzIG92ZXJyaWRlID8/PyAqLworc3RhdGljIHNzaXplX3QgZW52Ml9zaG93 X2Rpc2tzKHN0cnVjdCBkZXZpY2UgKmQsIGNoYXIgKmJ1Zik7CitzdGF0aWMgc3NpemVfdCBlbnYy X3N0b3JlX2Rpc2tzKHN0cnVjdCBkZXZpY2UgKmQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNu dCk7CitzdGF0aWMgREVWSUNFX0FUVFIoZGlza3MsIFNfSVJVR098U19JV1VTUiwgZW52Ml9zaG93 X2Rpc2tzLCBlbnYyX3N0b3JlX2Rpc2tzKTsKK3N0YXRpYyBzc2l6ZV90IGVudjJfc2hvd19rZXlz d2l0Y2goc3RydWN0IGRldmljZSAqZCwgY2hhciAqYnVmKTsKK3N0YXRpYyBERVZJQ0VfQVRUUihr ZXlzd2l0Y2gsIFNfSVJVR08sIGVudjJfc2hvd19rZXlzd2l0Y2gsIE5VTEwpOworLyogd2UgY2Fu IHNldCBMRURzLCBidXQgdW50aWwgd2UgaGF2ZSBidXMtYXRvbWljaXR5IGl0IGlzIHJhY3kgKi8K K3N0YXRpYyBzc2l6ZV90IGVudjJfc2hvd19mc3BsZWRzKHN0cnVjdCBkZXZpY2UgKmQsIGNoYXIg KmJ1Zik7CitzdGF0aWMgc3NpemVfdCBlbnYyX3N0b3JlX2ZzcGxlZHMoc3RydWN0IGRldmljZSAq ZCwgY29uc3QgY2hhciAqYiwgc2l6ZV90IGMpOworc3RhdGljIERFVklDRV9BVFRSKGZzcGxlZHMs IFwKKwlTX0lSVUdPfFNfSVdVU1IsIGVudjJfc2hvd19mc3BsZWRzLCBlbnYyX3N0b3JlX2ZzcGxl ZHMpOworCisvKiBzcGVjaWZ5ICJlbnZjdHJsX292ZXJ0ZW1wPSIgdG8gb3ZlcnJpZGUgdGhlIGRl ZmF1bHQgb3Zlci10ZW1wZXJhdHVyZQorICogYWN0aW9uLiAgQWxsb3dhYmxlIHZhbHVlcyBhcmUg cG93ZXJvZmYsIHNodXRkb3duIGFuZCBub25lIChkYW5nZXJvdXMhKS4KKyAqIFRoZSBkZWZhdWx0 IGlzIHNodXRkb3duIHRvIGJlIGlkaW9tYXRpYyB3aXRoIGV4aXN0aW5nIExpbnV4L1NQQVJDIGVu dmN0cmwKKyAqIGRyaXZlcnMuCisgKiBUaGV5IGFsbCBvdWdodCB0byBiZSAicG93ZXJvZmYiIGZv ciBzYWZldHktLSB0aG91Z2ggdGhpcyByZXF1aXJlcworICogdHdlYWtpbmcgdGhlIHNjb25zX3Bv d2Vyb2ZmIHN5c2N0bCBvbiBrZXJuZWxzIHRoYXQgc3VwcG9ydCBpdCwKKyAqIG90aGVyd2lzZSBz ZXJpYWwgY29uc29sZSBiYXNlZCBzeXN0ZW1zIHdpbGwgbm90IHBvd2Vyb2ZmIHByb3Blcmx5Lgor ICovCitzdGF0aWMgaW50IF9faW5pdCBlbnYyX3BhcnNlX292ZXJ0ZW1wX29wdGlvbihjb25zdCBj aGFyICpzdHIpCit7CisJaWYgKE5VTEwgPT0gc3RyKSB7CisJCXJldHVybiAxOworCX0KKyAKKwlp ZiAoIXN0cm5jbXAoc3RyLCAicG93ZXJvZmYiLCBzdHJsZW4oInBvd2Vyb2ZmIikpKSB7CisJCWVu djJfcG93ZXJvZmZfcGZuID0gZW52Ml9kb19wb3dlcm9mZjsKKwkJcmV0dXJuIDE7CisJfQorCWVs c2UgaWYgKCFzdHJuY21wKHN0ciwgInNodXRkb3duIiwgc3RybGVuKCJzaHV0ZG93biIpKSkgewor CQllbnYyX3Bvd2Vyb2ZmX3BmbiA9IGVudjJfZG9fc2h1dGRvd247CisJCXJldHVybiAxOworCX0K KyNpZiBFTlYyX0RFQlVHX1RFTVAKKwllbHNlIGlmICghc3RybmNtcChzdHIsICJub25lIiwgc3Ry bGVuKCJub25lIikpKSB7CisJCWVudjJfcG93ZXJvZmZfcGZuID0gTlVMTDsKKwkJcHJpbnRrKEtF Uk5fSU5GTyAKKwkJCSIlczogV0FSTklORzogdGhlcm1hbCBzaHV0ZG93bi9wb3dlci1vZmYgZGlz YWJsZWQhXG4iLAorCQkJRU5WMl9ERVZOQU1FKTsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisJ ZWxzZSB7CisJCXByaW50ayhLRVJOX0VSUiAKKwkJCSIlczogdW5yZWNvZ25pemVkIGVudmN0cmxf b3ZlcnRlbXAgdmFsdWUgXCIlc1wiIGlnbm9yZWRcbiIsIAorCQkJRU5WMl9ERVZOQU1FLCBzdHIp OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmVudmN0cmxfb3ZlcnRl bXA7CitNT0RVTEVfUEFSTSAoZW52Y3RybF9vdmVydGVtcCwgInMiKTsKK01PRFVMRV9QQVJNX0RF U0MoZW52Y3RybF9vdmVydGVtcCwKKyAgICAgICAgIm92ZXItdGVtcGVyYXR1cmUgYWN0aW9uOiBw b3dlcm9mZiBvciBzaHV0ZG93biAoZGVmYXVsdCkiKTsKKworc3RhdGljIGludCBfX2luaXQgZW52 Ml9pbml0X3RoZXJtaXN0ZXJzKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldikgCit7CisJ aW50IGk7CisJaW50IG50aGVybXMgPSAwOworCXN0cnVjdCBlbnYyX3RoZXJtaXN0ZXJfcHJvcCAq dF9pdHI7CisJdTggKnN0YXJ0LCAqZW5kOworCisJc3RydWN0IHRoZXJtICp0aGVybTsKKwlzdHJ1 Y3QgbGlzdF9oZWFkICp0bXAxLCAqdG1wMjsJCisKKwkvKgorCSAqIFRoZSBsb29rdXAgdGFibGUg bGVuZ3RoIGlzIHNob3J0IGJ5IHR3byBlbnRyaWVzIHRoYXQgCisJICogcmVwcmVzZW50IHRoZSBj b29sZXN0IHRoZXJtaXN0ZXIgcmF3IHZhbHVlcyAKKwkgKiAoaW5kZWNpZXMgMjU0LCAyNTUpLiAg VGhlc2UgbG93ZXIgdmFsdWVzIGFyZSByZWFzb25hYmx5CisJICogZXhwZWN0ZWQsIHNvIHdlIGFs bG9jYXRlIGEgYmlnZ2VyIHRhYmxlIGFuZCBzaGlmdCB0aGUgdGFibGUKKwkgKiB2YWx1ZXMgZG93 biBieSB0d28uICBXZSdsbCBkdXBsaWNhdGUgdGhlIHZhbHVlIGF0IHRoZSB0b3Agb2YKKwkgKiB0 aGUgdGFibGUgZm9yIHRoZSB0d28gbmV3IHNsb3RzICh0aG91Z2ggdGhlc2UgYXJlIGNvb2tpbmcK KwkgKiB0ZW1wZXJhdHVyZXMgd2UnZCBub3QgZXhwZWN0IHRvIHNlZSkuCisJICovCisJaSA9IHBy b21fZ2V0cHJvcGxlbihlZGV2LT5wcm9tX25vZGUsICJjcHUtdGVtcC1mYWN0b3JzIik7CisJaWYg KGkgIT0gMjU0KSB7CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuZXhwZWN0ZWQgY3B1LXRlbXAt ZmFjdG9ycyB0YWJsZSBzaXplICIgXAorCQkJIihpcyAldSwgZXhwZWN0ZWQgJXUpXG4iLCBFTlYy X0RFVk5BTUUsIGksIDI1NCk7CisJCWdvdG8gb3V0X2VycjsKKwl9CisKKwlpID0gcHJvbV9nZXRw cm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsICJjcHUtdGVtcC1mYWN0b3JzIiwKKwkJKHU4KikoJmVu djJfY3B1X3RlbXBfdGFibGUpICsgMiwgaSk7CisJaWYgKGkgPT0gLTEpIHsKKwkJcHJpbnRrKEtF Uk5fRVJSICIlczogdW5hYmxlIHRvIHJlYWQgT0JQIGNwdSB0ZW1wIHRhYmxlXG4iLAorCQkJRU5W Ml9ERVZOQU1FKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwllbnYyX2NwdV90ZW1wX3RhYmxlWzBd ID0gXAorCQllbnYyX2NwdV90ZW1wX3RhYmxlWzFdID0gZW52Ml9jcHVfdGVtcF90YWJsZVsyXTsK KworCS8qIFNhbWUgZHJpbGwgd2l0aCBjcHUtZmFuLXNwZWVkcyB0YWJsZS4uLgorCSAqCisJICog T2JzZXJ2ZWQgYmVoYXZpb3IgZGlmZmVycyBmcm9tIE9CUCBjcHUtZmFuLXNwZWVkcyB0YWJsZTsK KwkgKiBpdCBzZWVtcyB0aGF0IDE2MiBpcyB0aGUgbWluaW11bSBzcGVlZCBhdCB3aGljaCB0aGUg ZmFuIGNhbiBydW4sCisJICogc28gZG9uJ3QgYmUgY29uZnVzZWQgYnkgdGhlIGRpc2NyZXBhbmN5 IGJldHdlZW4gdGFibGUgYW5kIHJlYWRpbmdzCisJICogYXQgdGhlIGxvdyBlbmQgb2YgdGhlIHNj YWxlLgorCSAqLworCWkgPSBwcm9tX2dldHByb3BsZW4oZWRldi0+cHJvbV9ub2RlLCAiY3B1LWZh bi1zcGVlZHMiKTsKKwlpZiAoaSAhPSAyNTQpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5l eHBlY3RlZCBjcHUtZmFuLXNwZWVkcyB0YWJsZSBzaXplICIgXAorCQkJIihpcyAldSBleHBlY3Rl ZCAldSlcbiIsIEVOVjJfREVWTkFNRSwgaSwgMjU0KTsKKwkJZ290byBvdXRfZXJyOworCX0KKwkK KwlpID0gcHJvbV9nZXRwcm9wZXJ0eShlZGV2LT5wcm9tX25vZGUsICJjcHUtZmFuLXNwZWVkcyIs CisJCSh1OCopKCZlbnYyX2NwdV9mYW5zcGVlZF90YWJsZSkgKyAyLCBpKTsKKwlpZiAoaSA9PSAt MSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gcmVhZCBPQlAgY3B1LWZhbi1z cGVlZHMgdGFibGVcbiIsCisJCQlFTlYyX0RFVk5BTUUpOworCQlnb3RvIG91dF9lcnI7CisJfQor CWVudjJfY3B1X2ZhbnNwZWVkX3RhYmxlWzBdID0gXAorCQllbnYyX2NwdV9mYW5zcGVlZF90YWJs ZVsxXSA9IGVudjJfY3B1X2ZhbnNwZWVkX3RhYmxlWzJdOworCisJaSA9IHByb21fZ2V0cHJvcGxl bihlZGV2LT5wcm9tX25vZGUsICJ0aGVybWlzdGVycyIpOworCWlmICghaSkgeworCQlwcmludGso S0VSTl9FUlIgIiVzOiBubyB0aGVybWlzdGVyIGRhdGEgZm91bmQgaW4gT0JQXG4iLAorCQkJRU5W Ml9ERVZOQU1FKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwllbnYyX3RoZXJtc19kYXRhID0gKHU4 Kikga21hbGxvYyhpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVudjJfdGhlcm1zX2RhdGEpIHsKKwkJ cHJpbnRrKEtFUk5fRVJSICIlczogZmFpbGVkIHRvIG1hbGxvYyB0aGVybWlzdGVyIHRhYmxlXG4i LAorCQkJRU5WMl9ERVZOQU1FKTsKKwkJZ290byBvdXRfZXJyOworCX0KKwlpZiAoISBwcm9tX2dl dHByb3BlcnR5KGVkZXYtPnByb21fbm9kZSwgInRoZXJtaXN0ZXJzIiwKKwkJCSAgICAgICBlbnYy X3RoZXJtc19kYXRhLCBpKSkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiB1bmFibGUgdG8gY29s bGVjdCB0aGVybWlzdGVyIGRhdGFcbiIsCisJCQlFTlYyX0RFVk5BTUUpOworCQlnb3RvIG91dF9l cnI7CisJfQorCQorCXN0YXJ0ID0gZW52Ml90aGVybXNfZGF0YTsKKwllbmQgICA9IHN0YXJ0ICsg aSAtIDE7CisKKwl3aGlsZSAoc3RhcnQgPCBlbmQgJiYKKwkgICAgICAoKGVuZCAtIHN0YXJ0KSA+ PSBzaXplb2Yoc3RydWN0IGVudjJfdGhlcm1pc3Rlcl9wcm9wKSkpIHsKKwkJdF9pdHIgPSAoc3Ry dWN0IGVudjJfdGhlcm1pc3Rlcl9wcm9wICopIHN0YXJ0OworCQlzdGFydCA9IHRfaXRyLT5uYW1l ICsgc3RybGVuKHRfaXRyLT5uYW1lKSArIDE7CisKKwkJdGhlcm0gPSBrbWFsbG9jKHNpemVvZihz dHJ1Y3QgdGhlcm0pLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCF0aGVybSkgeworCQkJZ290byBvdXRf ZXJyOworCQl9CisKKwkJLyogaW5pdCBvbmUgdGhlcm1pc3RlciAqLworCQl0aGVybS0+Y2ZnID0g dF9pdHI7CisJCXRoZXJtLT5sYXN0X3dhcm4gPSAwOworCQl0aGVybS0+dHlwZSA9IAorCQkJKCFz dHJuY21wKHRoZXJtLT5jZmctPm5hbWUsICJDUFUiLCBzdHJsZW4oIkNQVSIpKSkgPworCQkJdGhl cm1fdHlwZV9jcHUgOiB0aGVybV90eXBlX25vbmNwdTsKKwkJbGlzdF9hZGRfdGFpbCgmKHRoZXJt LT5saXN0KSwgJmVudjJfdGhlcm1zKTsKKwkJbnRoZXJtcysrOworCX0KKwlyZXR1cm4gbnRoZXJt czsKKworb3V0X2VycjoKKwlpZiAoZW52Ml90aGVybXNfZGF0YSkgeworCQlrZnJlZShlbnYyX3Ro ZXJtc19kYXRhKTsKKwl9CisJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcDEsIHRtcDIsICZlbnYyX3Ro ZXJtcykgeworCQl0aGVybSA9IGxpc3RfZW50cnkodG1wMSwgc3RydWN0IHRoZXJtLCBsaXN0KTsK KwkJbGlzdF9kZWwodG1wMSk7CisJCWtmcmVlKHRoZXJtKTsKKwl9CisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpcnFyZXR1cm5fdCBlbnYyX2ZzcF9pbnRyKGludCBpcnEsIHZvaWQgKmRldl9pZCwg c3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJLyogVE9ETzoKKwkgKiBrbm93biBpbnRlcnJ1cHQg c291cmNlcyBieSBpbnZlcnRlZCBiaXQ6CisJICogICAweEJGIC0gUFMgCisJICogICAweERGIC0g S2V5c3dpdGNoCisJICogICAweEVGIC0gRmFuCisJICogICAweEZCIC0gRGlzayAoMCAmIDEgdGVz dGVkKSAKKwkgKi8KKwl1OCBzcmNzID0gZW52Y3RybF9pMmNfcmVhZF84NTc0KEVOVjJfRlNQX0NU UkxfQUREUik7CisJZW52Y3RybF9pMmNfd3JpdGVfODU3NChFTlYyX0ZTUF9DVFJMX0FERFIsIDB4 RkYpOyAvKiBBY2sgQWxsLi4uICovCisgICAgICAgIHByaW50ayhLRVJOX0RFQlVHICJlbnZjdHJs OiByZWNlaXZlZCBGU1AgaW50ZXJydXB0IChjdHJsIDB4JTAyeClcbiIsCisJCXNyY3MpOworCisJ cmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgdm9pZCBlbnYyX2ZzcF9hY3Rpdml0eSh1 bnNpZ25lZCBsb25nIHVudXNlZCkKK3sKKwl1OCByZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CisJLyogVE9ETzogdGhpcyBtdXN0IGJlIG1hZGUgaTJjLWF0b21pYy0tIG5vdCBqdXN0IHNwaW5s b2NrZWQgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmZW52Y3RybF9sb2NrLCBmbGFncyk7CisKKwlf X2VudmN0cmxfaTJjX3JlYWRfODU3NChFTlYyX0ZTUF9MRURfQUREUik7CisJLyogYWx3YXlzIHdy aXRlIGtleXN3aXRjaCBtYXNrLS0ga2V5IGJpdHMgY2FuIGJlIHVuc2V0LCBidXQgbm90IHNldCEg Ki8KKwlyZCA9IChfX2VudmN0cmxfaTJjX3JlYWRfODU3NChFTlYyX0ZTUF9MRURfQUREUikgXiBF TlYyX0xFRF9BQ1RJVkUpIAorCQl8IEVOVjJfRlNQX0tFWU1TSzsKKwlfX2VudmN0cmxfaTJjX3dy aXRlXzg1NzQoRU5WMl9GU1BfTEVEX0FERFIsIHJkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmVudmN0cmxfbG9jaywgZmxhZ3MpOworCisJbW9kX3RpbWVyKCZlbnYyX2ZzcF9hY3RfdGlt ZXIsIGppZmZpZXMgKyAoSFovMikpOworfQorCitzdGF0aWMgaW50IF9faW5pdCBlbnYyX2luaXRf ZnNwKHN0cnVjdCBsaW51eF9lYnVzX2RldmljZSAqZWRldikgCit7CisKKwl1OCBsZWRzOworCisJ aWYgKGVkZXYtPm51bV9pcnFzICE9IDIpIHsKKwkJcHJpbnRrKEtFUk5fRVJSICIlczogdW5leHBl Y3RlZCBudW1iZXIgb2YgaW50ZXJydXB0cyAiCisJCQkiKGlzICVpIGV4cGVjdGVkICVpKVxuIiwg CisJCQlFTlYyX0RFVk5BTUUsIGVkZXYtPm51bV9pcnFzLCAyKTsKKwkJcmV0dXJuIDA7CisJfQor CisJZW52Ml9mc3BfaXJxID0gZWRldi0+aXJxc1sxXTsKKwlpZiAocmVxdWVzdF9pcnEoZW52Ml9m c3BfaXJxLCAmZW52Ml9mc3BfaW50ciwKKwkJCVNBX1NISVJRLCAiU1VOVyxlbnZjdHJsdHdvIEZT UCIsCisJCQkodm9pZCAqKSZlbnYyX2ZzcF9hY3RfdGltZXIpKSB7CisJCXByaW50ayhLRVJOX0VS UiAiJXM6IHVuYWJsZSB0byByZWdpc3RlciBGU1AgaXJxXG4iLCAKKwkJCUVOVjJfREVWTkFNRSk7 CisJCWVudjJfZnNwX2lycSA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qIAorCSAqIEZTUCBH RU5fRVJSIExFRCBpcyBwbHVtYmVkIE9SJ2VkIHdpdGggYXV4aW8gTEVEIGJpdC4KKwkgKiBFeHRp bmd1aXNoIGl0LCBvdGhlcndpc2Ugc3lzdGVtIGFwcGVhcnMgaW4gZXJyb3IKKwkgKi8KKwlhdXhp b19zZXRfbGVkKEFVWElPX0xFRF9PRkYpOworCisJbGVkcyA9IGVudmN0cmxfaTJjX3JlYWRfODU3 NChFTlYyX0ZTUF9MRURfQUREUik7CisJZW52Y3RybF9pMmNfd3JpdGVfODU3NChFTlYyX0ZTUF9M RURfQUREUiwgbGVkcyB8IEVOVjJfRlNQX0xFRE1TSyk7CisKKwlpbml0X3RpbWVyKCZlbnYyX2Zz cF9hY3RfdGltZXIpOworCWVudjJfZnNwX2FjdF90aW1lci5leHBpcmVzICA9IGppZmZpZXMgKyAo SFovMik7CisJZW52Ml9mc3BfYWN0X3RpbWVyLmZ1bmN0aW9uID0gZW52Ml9mc3BfYWN0aXZpdHk7 CisJYWRkX3RpbWVyKCZlbnYyX2ZzcF9hY3RfdGltZXIpOworCSAKKwkvKiBFbmFibGUgRlNQIGlu dGVycnVwdHMgKi8KKwllbnZjdHJsX2kyY193cml0ZV84NTc0KEVOVjJfRlNQX0NUUkxfQUREUiwg RU5WMl9GU1BfREZMT1BfSU5JVDApOworCWVudmN0cmxfaTJjX3dyaXRlXzg1NzQoRU5WMl9GU1Bf Q1RSTF9BRERSLCBFTlYyX0ZTUF9ERkxPUF9JTklUMSk7CisJZW52Y3RybF9pMmNfd3JpdGVfODU3 NChFTlYyX0ZTUF9DVFJMX0FERFIsIEVOVjJfRlNQX0RFVklOVFJfSU5JVDApOworCWVudmN0cmxf aTJjX3dyaXRlXzg1NzQoRU5WMl9GU1BfQ1RSTF9BRERSLCBFTlYyX0ZTUF9ERVZJTlRSX0lOSVQx KTsKKworCXJldHVybiAxOworfQorCisvKiBlbnYyX3JlYWRfdGhlcm1pc3RlcjogcmVhZHMgYSB0 aGVybWlzdGVyIGFuZCByZXR1cm5zIGEgdHJhbnNsYXRlZCB2YWx1ZQorICogICBpZiAicmF3IiBp cyBub24tbnVsbCwgdGhlIHJhdyB0aGVybWlzdGVyIHJlYWRpbmcgd2lsbCBiZSBzdG9yZWQgaW50 byBpdAorICovCitzdGF0aWMgdTggZW52Ml9yZWFkX3RoZXJtaXN0ZXIoc3RydWN0IHRoZXJtICp0 LCB1OCAqcmF3KQoreworCXU4IHZhbDsKKwlpbnQgcmV0OworCisJc3dpdGNoICh0LT5jZmctPmFk ZHIgJiAweEYwKSB7CisJCWNhc2UgMHg5MDoKKwkJCXJldCA9IGVudmN0cmxfaTJjX3JlYWRfODU5 MSgKKwkJCQl0LT5jZmctPmFkZHIsIHQtPmNmZy0+cG9ydCwgJnZhbCk7CisJCQlicmVhazsKKwkJ ZGVmYXVsdDoKKwkJCS8qIEJVRygpICovCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAocmV0KSB7 CisJCXByaW50ayhLRVJOX0VSUiAiJXM6IHVuYWJsZSB0byByZWFkIHRoZXJtaXN0ZXIgJXMlc1xu IiwKKwkJCUVOVjJfREVWTkFNRSwgdC0+Y2ZnLT5uYW1lLAorCQkJKHJldCA9PSAtRUlOVFIpPyIg KGxvc3QgYXJiaXRyYXRpb24tLSB0cmFuc2llbnQpIjoiIik7CisJCXJldHVybiAwOworCX0KKwlp ZiAocmF3KSB7CisJCSpyYXcgPSB2YWw7CisJfQorI2lmIEVOVjJfREVCVUdfVEhFUk1TCisJcHJp bnRrKCIlczogJXMgcmF3OiAldSAiLCBfX0ZVTkNUSU9OX18sIHQtPmNmZy0+bmFtZSwgdmFsKTsK KyNlbmRpZgorCWlmICh0LT50eXBlID09IHRoZXJtX3R5cGVfY3B1KSB7CisJCXZhbCA9IGVudjJf Y3B1X3RlbXBfdGFibGVbdmFsXTsKKwl9CisJZWxzZSBpZiAodC0+Y2ZnLT5udW0gJiYgdC0+Y2Zn LT5kZW4pIHsKKwkJdmFsID0gKHZhbCAqIHQtPmNmZy0+bnVtKSAvIHQtPmNmZy0+ZGVuOworCX0K KwllbHNlIHsKKwkJLyogcGVyaGFwcyByYXc/ICovCisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJ CSIlczogbm8gdGhlcm1pc3RlciB0cmFuc2xhdGlvbiBmb3IgJXMgKHZhbCAlaSlcbiIsCisJCQlF TlYyX0RFVk5BTUUsIHQtPmNmZy0+bmFtZSwgdmFsKTsKKwl9CisjaWYgRU5WMl9ERUJVR19USEVS TVMKKwlwcmludGsoImNvb2tlZDogJXVcbiIsIHZhbCk7CisjZW5kaWYKKwlyZXR1cm4gdmFsOwor fQorCisvKiBUT0RPOiBjaGFuZ2UgdG8gaW5jbHVkZSByZXR1cm4gdmFsdWUgKi8KK3N0YXRpYyB2 b2lkIGVudjJfc2V0X2ZhbnNwZWVkKHU4IGZhbnNwZWVkLCB1OCBmb3JjZWQpCit7CisJaWYgKCFm b3JjZWQgJiYgZW52Ml9mYW5zcGVlZF9mb3JjZWQpIHsKKwkJcmV0dXJuOworCX0KKwllbnZjdHJs X2kyY193cml0ZV84NTkxKEVOVjJfRkFOX0FERFIsIGZhbnNwZWVkKTsKK30KKworLyogVE9ETzog Y2hhbmdlIGZvciBtZWFuaW5nZnVsIHJldHVybiB2YWx1ZSAqLworc3RhdGljIHU4IGVudjJfZ2V0 X2ZhbnNwZWVkKHZvaWQpCit7CisJdTggcnY7CisJaW50IHZhbDsKKwkvKiBUT0RPOiByYXcgdmFs dWVzIHJlYWQgZnJvbSB0aGUgZmFuIGRvIG5vdCBjb3JyZXNwb25kIHRvCisgCSogdGhlIHZhbHVl cyB3cml0dGVuIChldmVuIGFmdGVyIHN1aXRhYmxlIHNldHRsaW5nIHRpbWUpLgorIAkqIFRoaXMg aXMgbGlrZWx5IGR1ZSB0byBhcHByb3hpbWF0aW9ucyBpbiB0aGUgRDJBLCBzbyB3ZSBtaWdodAor IAkqIGFzIHdlbGwgYXJ0aWZpY2lhbGx5IGluZmxhdGUgdGhlIHJlYWQgdmFsdWVzIGhlcmUuLi4K KwkqIAorCSogVWdoLS0gY29uc2lkZXIgd3JhcGFyb3VuZCBhdCBoaWdoIHNwZWVkcy4uLgorIAkq LworCWlmICghIGVudmN0cmxfaTJjX3JlYWRfODU5MShFTlYyX0ZBTl9BRERSLCBFTlYyX0ZBTl9Q T1JULCAmcnYpKSB7CisJCXZhbCA9IHJ2ICogMTA3IC8gMTAwOworCQlpZiAodmFsID4gMjU1IC8q IFVDSEFSX01BWCAqLykgeworCQkJcmV0dXJuIDI1NTsgLyogVUNIQVJfTUFYIG9yIEZBTl9NQVgg Ki8KKwkJfQorCQlyZXR1cm4gKHU4KSB2YWw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMg c3NpemVfdCBlbnYyX3Nob3dfZmFuc3BlZWQoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYp Cit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiRkFOOiBbJXVdJXNcbiIsIAorCQllbnYyX2dldF9m YW5zcGVlZCgpLCBlbnYyX2ZhbnNwZWVkX2ZvcmNlZCA/ICIgKGZvcmNlZCkiIDogIiIpOworfQor CisjaWYgRU5WMl9ERUJVR19GQU4KK3N0YXRpYyBzc2l6ZV90IGVudjJfc3RvcmVfZmFuc3BlZWQo c3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1 OCB2YWwgPSAodTgpIHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVMTCwgMCk7CisJaWYgKCF2YWwpIHsK KwkJLyogd3JpdGluZyAwIHVuLWZvcmNlcyBmYW4gc3BlZWQgKi8KKwkJZW52Ml9mYW5zcGVlZF9m b3JjZWQgPSAwOworCQlyZXR1cm4gY291bnQ7CisJfQorCisJZW52Ml9mYW5zcGVlZF9mb3JjZWQg PSAxOworCWVudjJfc2V0X2ZhbnNwZWVkKHZhbCwgMSk7CisKKwlyZXR1cm4gY291bnQ7Cit9Cisj ZW5kaWYgLyogRU5WMl9ERUJVR19GQU4gKi8KKworI2lmIEVOVjJfREVCVUdfVEVNUAorc3RhdGlj IHNzaXplX3QgZW52Ml9zdG9yZV90ZW1wKHN0cnVjdCBkZXZpY2UgKmQsIGNvbnN0IGNoYXIgKmJ1 Ziwgc2l6ZV90IGNvdW50KQoreworCXU4IHZhbCA9ICh1OCkgc2ltcGxlX3N0cnRvdWwoYnVmLCBO VUxMLCAwKTsKKwllbnYyX2ZvcmNlZF90ZW1wID0gdmFsOworCXJldHVybiBjb3VudDsKK30KKwor c3RhdGljIHNzaXplX3QgZW52Ml9zaG93X3RlbXAgKHN0cnVjdCBkZXZpY2UgKmQsIGNoYXIgKmJ1 ZikKK3sKKwlyZXR1cm4gc3ByaW50ZihidWYsICIlaVxuIiwgZW52Ml9mb3JjZWRfdGVtcCk7Cit9 CisjZW5kaWYKKworc3RhdGljIHNzaXplX3QgZW52Ml9zaG93X3RoZXJtaXN0ZXJzKHN0cnVjdCBk ZXZpY2UgKmRldiwgY2hhciAqYnVmKQoreworCXNzaXplX3QgcmV0ID0gMDsKKwlzdHJ1Y3QgdGhl cm0gKnQ7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wMSwgKnRtcDI7CQorCisJbGlzdF9mb3JfZWFj aF9zYWZlKHRtcDEsIHRtcDIsICZlbnYyX3RoZXJtcykgeworCQl0ID0gbGlzdF9lbnRyeSh0bXAx LCBzdHJ1Y3QgdGhlcm0sIGxpc3QpOworI2lmIEVOVjJfREVCVUdfVEhFUk1TCisJCXJldCArPSBz cHJpbnRmKGJ1ZiArIHJldCwgCisJCQkiJXM6XHQldSBDICgweCUwMnhbJXVdIG1pbiAlaSwgd2Fy biAlaSwgc2h1dCAlaSwgIgorCQkJIm51bSAlaSwgZGVuICVpLCB0eXBlICVpKVxuIiwKKwkJCXQt PmNmZy0+bmFtZSwgZW52Ml9yZWFkX3RoZXJtaXN0ZXIodCwgTlVMTCksCisJCQl0LT5jZmctPmFk ZHIsIHQtPmNmZy0+cG9ydCwgdC0+Y2ZnLT5taW5fdGVtcCwgCisJCQl0LT5jZmctPndhcm5fdGVt cCwgdC0+Y2ZnLT5zaHV0ZG93bl90ZW1wLCAKKwkJCXQtPmNmZy0+bnVtLCB0LT5jZmctPmRlbiwg dC0+dHlwZSk7CisjZWxzZQorCQlyZXQgKz0gc3ByaW50ZihidWYgKyByZXQsIAorCQkJIiVzOlx0 WyV1IENdIChtaW4gJWksIHdhcm4gJWksIHNodXQgJWkpXG4iLAorCQkJdC0+Y2ZnLT5uYW1lLCBl bnYyX3JlYWRfdGhlcm1pc3Rlcih0LCBOVUxMKSwKKwkJCXQtPmNmZy0+bWluX3RlbXAsIHQtPmNm Zy0+d2Fybl90ZW1wLCAKKwkJCXQtPmNmZy0+c2h1dGRvd25fdGVtcCk7CisjZW5kaWYKKwl9CisJ cmV0dXJuIHJldDsKK30KKworc3RhdGljIHU4IGVudjJfZ2V0X3Bvd2VyKHZvaWQpCit7CisJcmV0 dXJuIGVudmN0cmxfaTJjX3JlYWRfODU3NChFTlYyX1BTX0FERFIpOworfQorCitzdGF0aWMgc3Np emVfdCBlbnYyX3Nob3dfcG93ZXIoc3RydWN0IGRldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJ c3NpemVfdCByZXQgPSAwOworCXU4IHN0YXQgPSBlbnYyX2dldF9wb3dlcigpOworCisJcmV0ICs9 IHNwcmludGYoYnVmK3JldCwgIlBTMTogWyVzXVxuIiwKKwkJKEVOVjJfUFNfUFJFUyhzdGF0LDEp ID8gCisJCQkoRU5WMl9QU19FUlIoc3RhdCwxKSA/ICJGQUlMIiA6ICJPSyIpIDogIkFCU0VOVCIp KTsKKwlyZXQgKz0gc3ByaW50ZihidWYrcmV0LCAiUFMyOiBbJXNdXG4iLAorCQkoRU5WMl9QU19Q UkVTKHN0YXQsMikgPyAKKwkJCShFTlYyX1BTX0VSUihzdGF0LDIpID8gIkZBSUwiIDogIk9LIikg OiAiQUJTRU5UIikpOworCXJldHVybiByZXQ7CQorfQorCitzdGF0aWMgdTggZW52Ml9nZXRfZGlz a3ByZXModm9pZCkKK3sKKwlyZXR1cm4gZW52Y3RybF9pMmNfcmVhZF84NTc0KEVOVjJfRElTS1BS RVNfQUREUik7Cit9CisKK3N0YXRpYyB1OCBlbnYyX2dldF9kaXNrc3RhdCh2b2lkKQoreworCXJl dHVybiBlbnZjdHJsX2kyY19yZWFkXzg1NzQoRU5WMl9ESVNLU1RBVF9BRERSKTsKK30KKworc3Rh dGljIHNzaXplX3QgZW52Ml9zaG93X2Rpc2tzKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hhciAqYnVm KQoreworCXNzaXplX3QgcmV0ID0gMDsKKwl1OCBwcmVzID0gZW52Ml9nZXRfZGlza3ByZXMoKTsK Kwl1OCBzdGF0ID0gZW52Ml9nZXRfZGlza3N0YXQoKTsKKwlpbnQgaTsgCisJZm9yIChpID0gMTsg aSA8PSBFTlYyX0RJU0tfTUFYOyBpKyspIHsKKwkJcmV0ICs9IHNwcmludGYoYnVmK3JldCwgIkRJ U0slaTogWyVzXVxuIiwgaSwKKwkJCSghKHByZXMgJiAoMTw8KGktMSkpKSA/IAorCQkJCSgoIShz dGF0ICYgKDE8PChpLTEpKSkpID8gIkZBSUwiIDogIk9LIikgOiAKKwkJCQkoKCEoc3RhdCAmICgx PDwoaS0xKSkpKSA/ICJBQlNFTlQvQVRUTiIgIDogCisJCQkJIkFCU0VOVCIpKSk7CisJfQorCisJ cmV0dXJuIHJldDsJCit9CisKK3N0YXRpYyBzc2l6ZV90IGVudjJfc3RvcmVfZGlza3Moc3RydWN0 IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1OCBzdGF0 OworCisJLyogV2UgZG9uJ3QgZmlyc3QgY2hlY2sgdGhlIGRpc2sgaXMgcHJlc2VudC0tIHdlIGNv dWxkLCB0aG91Z2ggKi8KKwl1OCBkaXNrbm8gPSAodTgpIHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgTlVM TCwgMCk7CisJaWYgKGRpc2tubyAmJiBkaXNrbm8gPD0gRU5WMl9ESVNLX01BWCkgeworCQljaGFy ICp2YWwgPSBzdHJjaHIoYnVmLCAnPScpOworCQlpZiAodmFsKSB7CisJCQl2YWwrKzsKKwkJCWlm ICghc3RybmljbXAodmFsLCAiZmFpbCIsIHN0cmxlbigiZmFpbCIpKSkgeworCQkJCS8qIFRPRE86 IHRoaXMgbXVzdCBiZSBtYWRlIGJ1cy1hdG9taWMgKi8KKwkJCQlzcGluX2xvY2soJmVudmN0cmxf bG9jayk7CisJCQkJc3RhdCA9IAorCQkJCSAgX19lbnZjdHJsX2kyY19yZWFkXzg1NzQoRU5WMl9E SVNLU1RBVF9BRERSKTsKKwkJCQlzdGF0ICY9IH4oMSA8PCAoZGlza25vIC0gMSkpOworCQkJCV9f ZW52Y3RybF9pMmNfd3JpdGVfODU3NCgKKwkJCQkJRU5WMl9ESVNLU1RBVF9BRERSLCBzdGF0KTsK KwkJCQlzcGluX3VubG9jaygmZW52Y3RybF9sb2NrKTsKKwkJCX0KKwkJCWVsc2UgaWYgKCFzdHJu aWNtcCh2YWwsICJvayIsIHN0cmxlbigib2siKSkpIHsKKwkJCQkvKiBUT0RPOiB0aGlzIG11c3Qg YmUgbWFkZSBidXMtYXRvbWljICovCisJCQkJc3Bpbl9sb2NrKCZlbnZjdHJsX2xvY2spOworCQkJ CXN0YXQgPQorCQkJCSAgX19lbnZjdHJsX2kyY19yZWFkXzg1NzQoRU5WMl9ESVNLU1RBVF9BRERS KTsKKwkJCQlzdGF0IHw9ICgxIDw8IChkaXNrbm8gLSAxKSk7CisJCQkJX19lbnZjdHJsX2kyY193 cml0ZV84NTc0KAorCQkJCQlFTlYyX0RJU0tTVEFUX0FERFIsIHN0YXQpOworCQkJCXNwaW5fdW5s b2NrKCZlbnZjdHJsX2xvY2spOworCQkJfQorCQl9CisJfQorCXJldHVybiBjb3VudDsKK30KKwor c3RhdGljIHU4IGVudjJfZ2V0X2tleXN3aXRjaCh2b2lkKQoreworCXJldHVybiBlbnZjdHJsX2ky Y19yZWFkXzg1NzQoRU5WMl9GU1BfTEVEX0FERFIpICYgRU5WMl9GU1BfS0VZTVNLOworfQorCitz dGF0aWMgc3NpemVfdCBlbnYyX3Nob3dfa2V5c3dpdGNoKHN0cnVjdCBkZXZpY2UgKmRldiwgY2hh ciAqYnVmKQoreworCXNzaXplX3QgcmV0ID0gMDsKKwl1OCBzdGF0ID0gZW52Ml9nZXRfa2V5c3dp dGNoKCk7CisJY2hhciAqb3V0cHV0OworCisJc3dpdGNoIChzdGF0KSB7CisJCWNhc2UgRU5WMl9G U1BfS0VZX09GRjogCisJCQlvdXRwdXQgPSAiT0ZGIjsgCisJCQlicmVhazsKKwkJY2FzZSBFTlYy X0ZTUF9LRVlfRElBRzoKKwkJCW91dHB1dCA9ICJESUFHIjsKKwkJCWJyZWFrOworCQljYXNlIEVO VjJfRlNQX0tFWV9PTjoKKwkJCW91dHB1dCA9ICJPTiI7CisJCQlicmVhazsKKwkJY2FzZSBFTlYy X0ZTUF9LRVlfTE9DSzoKKwkJCW91dHB1dCA9ICJMT0NLRUQiOworCQkJYnJlYWs7CisJCWRlZmF1 bHQ6CisJCQlvdXRwdXQgPSAiVU5LTk9XTiI7CisJCQlicmVhazsKKwl9CisKKwlyZXQgKz0gc3By aW50ZihidWYgKyByZXQsICJLRVlTV0lUQ0g6IFslc11cbiIsIG91dHB1dCk7CisKKwlyZXR1cm4g cmV0OwkKK30KKworc3RhdGljIHU4IGVudjJfZ2V0X2ZzcGxlZHModm9pZCkKK3sKKwlyZXR1cm4g ZW52Y3RybF9pMmNfcmVhZF84NTc0KEVOVjJfRlNQX0xFRF9BRERSKSAmIEVOVjJfRlNQX0xFRE1T SzsKK30KKworLyogVE9ETzogZGlhZ25vc3RpYyByZXR1cm4gdmFsdWUgKi8KK3N0YXRpYyB2b2lk IGVudjJfc2V0X2ZzcGxlZHModTggbGVkc19vbiwgdTggbGVkc19vZmYpCit7CisJdTggcmQ7CisJ dW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIGRvbid0IHN0b21wIG9uIGtleXN3aXRjaCBiaXRz ICovCisJaWYgKChsZWRzX29uIHwgbGVkc19vZmYpICYgRU5WMl9GU1BfS0VZTVNLKSB7CisJCXJl dHVybjsKKwl9CisKKwkvKiBUT0RPOiB0aGlzIG11c3QgYmUgbWFkZSBpMmMtYXRvbWljLS0gbm90 IGp1c3Qgc3BpbmxvY2tlZCAqLworCXNwaW5fbG9ja19pcnFzYXZlKCZlbnZjdHJsX2xvY2ssIGZs YWdzKTsKKworCV9fZW52Y3RybF9pMmNfcmVhZF84NTc0KEVOVjJfRlNQX0xFRF9BRERSKTsKKwkv KiBhbHdheXMgd3JpdGUga2V5c3dpdGNoIG1hc2stLSBrZXkgYml0cyBjYW4gYmUgdW5zZXQsIGJ1 dCBub3Qgc2V0ISAqLworCXJkID0gKF9fZW52Y3RybF9pMmNfcmVhZF84NTc0KEVOVjJfRlNQX0xF RF9BRERSKSB8IAorCQlFTlYyX0ZTUF9LRVlNU0sgfCBsZWRzX29mZikgJiB+bGVkc19vbjsKKwlf X2VudmN0cmxfaTJjX3dyaXRlXzg1NzQoRU5WMl9GU1BfTEVEX0FERFIsIHJkKTsKKworCXNwaW5f dW5sb2NrX2lycXJlc3RvcmUoJmVudmN0cmxfbG9jaywgZmxhZ3MpOworfQorCitzdGF0aWMgc3Np emVfdCBlbnYyX3Nob3dfZnNwbGVkcyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGNoYXIgKmJ1ZikKK3sK Kwlzc2l6ZV90IHJldCA9IDA7CisJdTggc3RhdCA9IGVudjJfZ2V0X2ZzcGxlZHMoKTsKKworCXJl dCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIlBPV0VSOiAgICAgIFslc11cbiIsICJPTiIpOyAKKwly ZXQgKz0gc3ByaW50ZihidWYgKyByZXQsICJHRU4gRVJST1I6ICBbJXNdXG4iLCAKKwkJc3RhdCAm IEVOVjJfTEVEX0dFTkVSUiA/ICJPRkYiIDogIk9OIik7CisJcmV0ICs9IHNwcmludGYoYnVmICsg cmV0LCAiQUNUSVZJVFk6ICAgWyVzXVxuIiwgCisJCXN0YXQgJiBFTlYyX0xFRF9BQ1RJVkUgPyAi T0ZGIiA6ICJPTiIpOworCXJldCArPSBzcHJpbnRmKGJ1ZiArIHJldCwgIkRJU0sgRVJST1I6IFsl c11cbiIsIAorCQlzdGF0ICYgRU5WMl9MRURfRElTS0VSUiA/ICJPRkYiIDogIk9OIik7CisJcmV0 ICs9IHNwcmludGYoYnVmICsgcmV0LCAiVEVNUCBFUlJPUjogWyVzXVxuIiwgCisJCXN0YXQgJiBF TlYyX0xFRF9ESVNLRVJSID8gIk9GRiIgOiAiT04iKTsKKwlyZXQgKz0gc3ByaW50ZihidWYgKyBy ZXQsICJQUyBFUlJPUjogICBbJXNdXG4iLCAKKwkJc3RhdCAmIEVOVjJfTEVEX1BTRVJSID8gIk9G RiIgOiAiT04iKTsKKworCXJldHVybiByZXQ7CQorfQorCitzdGF0aWMgc3NpemVfdCBlbnYyX3N0 b3JlX2ZzcGxlZHMoc3RydWN0IGRldmljZSAqZGV2LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBj bnQpCit7CisJY2hhciBvbiA9IC0xOworCWNoYXIgbGVkPSAtMTsKKworCWNoYXIgKnZhbCA9IHN0 cmNocihidWYsICc9Jyk7CisJaWYgKCF2YWwpIHsKKwkJcmV0dXJuIGNudDsKKwl9CisJdmFsKys7 CisJCisJaWYgKCFzdHJuaWNtcCh2YWwsICJvbiIsIHN0cmxlbigib24iKSkpIHsKKwkJb24gPSAx OworCX0KKwllbHNlIGlmICghc3RybmljbXAodmFsLCAib2ZmIiwgc3RybGVuKCJvZmYiKSkpIHsK KwkJb24gPSAwOworCX0KKwllbHNlIHsKKwkJcmV0dXJuIGNudDsKKwl9CisKKwlpZiAoIXN0cm5p Y21wKGJ1ZiwgInRlbXA9Iiwgc3RybGVuKCJ0ZW1wPSIpKSkgeworCQlsZWQgPSBFTlYyX0xFRF9U RU1QRVJSOworCX0KKwllbHNlIGlmICghc3RybmljbXAoYnVmLCAiZGlzaz0iLCBzdHJsZW4oImRp c2s9IikpKSB7CisJCWxlZCA9IEVOVjJfTEVEX0RJU0tFUlI7CisJfQorCWVsc2UgaWYgKCFzdHJu aWNtcChidWYsICJwcz0iLCBzdHJsZW4oInBzPSIpKSkgeworCQlsZWQgPSBFTlYyX0xFRF9QU0VS UjsKKwl9CisJZWxzZSBpZiAoIXN0cm5pY21wKGJ1ZiwgImFsbD0iLCBzdHJsZW4oImFsbD0iKSkp IHsKKwkJbGVkID0gRU5WMl9MRURfUFNFUlIgfCBFTlYyX0xFRF9ESVNLRVJSIHwgRU5WMl9MRURf VEVNUEVSUjsKKwl9CisJZWxzZSB7CisJCXByaW50aygiJXM6IHVua25vd24gbGVkIHNwZWNpZmll ZFxuIiwgX19GVU5DVElPTl9fKTsKKwkJcmV0dXJuIGNudDsKKwl9CisKKwllbnYyX3NldF9mc3Bs ZWRzKChvbiA/IGxlZCA6IDApLCBvbiA/IDAgOiBsZWQpOworCisJcmV0dXJuIGNudDsKK30KKwor CitzdGF0aWMgdm9pZCBlbnYyX2RvX3Bvd2Vyb2ZmKHZvaWQpCit7CisJc3RhdGljIGludCBwb19p bnByb2cgPSAwOworCisJaWYgKHBvX2lucHJvZykgeworCQlyZXR1cm47CisJfQorCisJcG9faW5w cm9nID0gMTsKKwlwcmludGsoS0VSTl9DUklUICIlczogV0FSTklORzogUG93ZXJpbmctb2ZmIHRo ZSBzeXN0ZW0gbm93IVxuIiwKKwkJY3VycmVudC0+Y29tbSk7CisKKwkvKiBUT0RPOiBtYWNoaW5l X3Bvd2VyX29mZiB3aWxsIGdvIHRvIE9CUCBpbnN0ZWFkIGlmIHRoaXMgc3lzdGVtCisJICogaXMg c2VyaWFsLWNvbnNvbGUgYmFzZWQgYW5kIHNjb25zX3Bvd2Vyb2ZmIHN5c2N0bCBpcyBub3Qgc2V0 CisJICovCisJbWFjaGluZV9wb3dlcl9vZmYoKTsKK30KKworc3RhdGljIHZvaWQgZW52Ml9kb19z aHV0ZG93bih2b2lkKQoreworCXN0YXRpYyBpbnQgc2RfaW5wcm9nID0gMDsKKwlzdGF0aWMgY2hh ciAqZW52cFtdID0geworCQkiSE9NRT0vIiwgIlRFUk09bGludXgiLCAKKwkJIlBBVEg9L3NiaW46 L3Vzci9zYmluOi9iaW46L3Vzci9iaW4iLCBOVUxMIH07CisJY2hhciAqYXJndltdID0geyAiL3Ni aW4vc2h1dGRvd24iLCAiLWgiLCAibm93IiwgTlVMTCB9OworIAorCWlmIChzZF9pbnByb2cgIT0g MCkKKwkJcmV0dXJuOworIAorCXNkX2lucHJvZyA9IDE7CisKKwlwcmludGsoS0VSTl9DUklUICIl czogV0FSTklORzogU2h1dHRpbmcgZG93biB0aGUgc3lzdGVtIG5vdy5cbiIsCisJCWN1cnJlbnQt PmNvbW0pOworI2lmIDAKKwlpZiAoMCA+IGV4ZWN2ZSgiL3NiaW4vc2h1dGRvd24iLCBhcmd2LCBl bnZwKSkgeworI2Vsc2UKKwlpZiAoY2FsbF91c2VybW9kZWhlbHBlcigiL3NiaW4vc2h1dGRvd24i LCBhcmd2LCBlbnZwLCAwKSkgeworI2VuZGlmCisJCXByaW50ayhLRVJOX0NSSVQgIiVzOiBXQVJO SU5HOiBzeXN0ZW0gc2h1dGRvd24gZmFpbGVkIVxuIiwKKwkJCWN1cnJlbnQtPmNvbW0pOworCQkv KiB1bmxpa2VseSB0byBzdWNjZWVkLCBidXQgd2UgY291bGQgdHJ5IGFnYWluICovCisJCXNkX2lu cHJvZyA9IDA7ICAKKwl9Cit9CisKKyNkZWZpbmUgV0FSTl9JTlRFUlZBTCAoMzAgKiBIWikKK3N0 YXRpYyB2b2lkIGVudjJfY2hlY2tfdGhlcm1zKHZvaWQpCit7CisJdTggdGVtcGJ1ZjsKKwl1OCB0 ZW1wbWF4ID0gMDsKKwl1OCByYXdidWY7CisJdTggdGVtcG1heF9yYXcgID0gMDsKKworCXN0cnVj dCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgdGhlcm0gICAgICp0OworCisJbGlzdF9mb3JfZWFj aCh0bXAsICZlbnYyX3RoZXJtcykgeworCQl0ID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCB0aGVy bSwgbGlzdCk7CisJCXRlbXBidWYgPSBlbnYyX3JlYWRfdGhlcm1pc3Rlcih0LCAmcmF3YnVmKTsK KwkJaWYgKHQtPnR5cGUgPT0gdGhlcm1fdHlwZV9jcHUpIHsKKyNpZiBFTlYyX0RFQlVHX1RFTVAK KwkJCWlmIChlbnYyX2ZvcmNlZF90ZW1wKSAgeyAKKwkJCQl0ZW1wYnVmID0gZW52Ml9mb3JjZWRf dGVtcDsgCisJCQl9CisjZW5kaWYKKwkJCWlmICh0ZW1wYnVmID4gdGVtcG1heCkgeworCQkJCXRl bXBtYXggICAgICA9IHRlbXBidWY7CisJCQkJdGVtcG1heF9yYXcgID0gcmF3YnVmOworCQkJfQor CQl9CisJCWlmICh0LT5jZmctPnNodXRkb3duX3RlbXAgJiYgdGVtcGJ1ZiA+PSB0LT5jZmctPnNo dXRkb3duX3RlbXApIHsKKwkJCXByaW50ayhLRVJOX0NSSVQKKwkJCQkiJXM6IFdBUk5JTkc6ICVz IHRlbXBlcmF0dXJlICV1IEMgbWVldHMgb3IgIgorCQkJCSJleGNlZWRzIHNodXRkb3duIHRocmVz aG9sZCAldSBDXG4iLAorCQkJCUVOVjJfREVWTkFNRSwgdC0+Y2ZnLT5uYW1lLCAKKwkJCQl0ZW1w YnVmLCB0LT5jZmctPnNodXRkb3duX3RlbXApOyAKKworCQkJZW52Ml9zZXRfZnNwbGVkcyhFTlYy X0xFRF9HRU5FUlIsIDApOworCQkJZW52Ml9zZXRfZmFuc3BlZWQoRU5WMl9GQU5fTUFYLCAwKTsK KworCQkJaWYgKGVudjJfcG93ZXJvZmZfcGZuKSB7CisJCQkJZW52Ml9wb3dlcm9mZl9wZm4oKTsK KwkJCX0KKwkJCXJldHVybjsKKwkJfQorCQllbHNlIGlmICh0LT5jZmctPndhcm5fdGVtcCAmJiB0 ZW1wYnVmID49IHQtPmNmZy0+d2Fybl90ZW1wKSB7CisJCQkvKiBUT0RPOiBzZXQgdGhlcm1hbCB3 YXJuaW5nIExFRCBvciBnZW5fZXJyICovCisJCQlpZiAodGltZV9hZnRlcihqaWZmaWVzLCB0LT5s YXN0X3dhcm4gKyBXQVJOX0lOVEVSVkFMKSkgeworCQkJCXQtPmxhc3Rfd2FybiA9IGppZmZpZXM7 CisJCQkJcHJpbnRrKEtFUk5fQ1JJVAorCQkJCQkiJXM6IFdBUk5JTkc6ICVzIHRlbXBlcmF0dXJl ICV1IEMgIgorCQkJCQkibWVldHMgb3IgZXhjZWVkcyB3YXJuaW5nIHRocmVzaG9sZCAiCisJCQkJ CSIldSBDXG4iLAorCQkJCQlFTlYyX0RFVk5BTUUsIHQtPmNmZy0+bmFtZSwKKwkJCQkJdGVtcGJ1 ZiwgdC0+Y2ZnLT53YXJuX3RlbXApOworCQkJCXByaW50ayhLRVJOX0NSSVQKKwkJCQkJIiVzOiBX QVJOSU5HOiBzeXN0ZW0gd2lsbCBzaHV0IGRvd24gIgorCQkJCQkiYXQgJXMgdGVtcGVyYXR1cmUg JXUgQ1xuIiwKKwkJCQkJRU5WMl9ERVZOQU1FLCB0LT5jZmctPm5hbWUsCisJCQkJCXQtPmNmZy0+ c2h1dGRvd25fdGVtcCk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQkvKiBVc2UgbGFzdF93YXJu IGFzIGEgZmxhZyB0byByZWR1Y2UgSTJDIHRyYWZmaWMtLQorCQkJICogYmVjYXVzZSB0aGVyZSBp cyBubyBoeXN0ZXJlc2lzLCB0aGlzIGNvdWxkIGNhdXNlIAorCQkJICogdW5saW1pdGVkIHdhcm4g bWVzc2FnZXMgaWYgd2UgaG92ZXIgYXJvdW5kIHdhcm5fdGVtcAorCQkJICovCisJCQlpZiAodC0+ bGFzdF93YXJuKSB7CisJCQkJdC0+bGFzdF93YXJuID0gMDsKKwkJCQkvLyBUT0RPOiBlbnYyX3Nl dF9sZWQgZnVuY3Rpb25hbGl0eQorCQkJCS8vZW52Ml9zZXRfbGVkKEVOVlhfTEVEX1RZUEVfR0VO X0VSUiwgRU5WWF9MRURfT0ZGKTsKKwkJCQllbnYyX3NldF9mc3BsZWRzKDAsIEVOVjJfTEVEX0dF TkVSUik7CisJCQl9CisJCX0KKwl9CisJZW52Ml9zZXRfZmFuc3BlZWQoZW52Ml9jcHVfZmFuc3Bl ZWRfdGFibGVbdGVtcG1heF9yYXddLCAwKTsKK30KKworc3RhdGljIGludCBrZW52Y3RybGQodm9p ZCAqX191bnVzZWQpCit7CisJaW50IHBvbGxfaW50ZXJ2YWwgPSA1ICogSFo7CisKKwlkYWVtb25p emUoImtlbnZjdHJsZCIpOworCWFsbG93X3NpZ25hbChTSUdLSUxMKTsKKworCXByaW50ayhLRVJO X0lORk8gIiVzOiAlcyBzdGFydGluZ1xuIiwgRU5WMl9ERVZOQU1FLCBjdXJyZW50LT5jb21tKTsK Kwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgeworCQljdXJyZW50LT5zdGF0ZSA9IFRB U0tfSU5URVJSVVBUSUJMRTsKKwkJc2NoZWR1bGVfdGltZW91dChwb2xsX2ludGVydmFsKTsKKwkJ Y3VycmVudC0+c3RhdGUgPSBUQVNLX1JVTk5JTkc7CisKKwkJaWYgKHNpZ25hbF9wZW5kaW5nKGN1 cnJlbnQpKSB7CisJCQlicmVhazsKKwkJfQorCQkKKwkJZW52Ml9jaGVja190aGVybXMoKTsKKwl9 CisJcHJpbnRrKEtFUk5fSU5GTyAiJXM6ICVzIGV4aXRpbmdcbiIsIEVOVjJfREVWTkFNRSwgY3Vy cmVudC0+Y29tbSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVudjJf Y2xlYW51cCh2b2lkKQoreworCS8qIFhYWDogZW52Ml9jbGVhbnVwX3RoZXJtaXN0ZXJzKCksIGVu djJfY2xlYW51cF9mc3AoKSwgZXRjICovCisJc3RydWN0IHRoZXJtICp0aGVybTsKKwlzdHJ1Y3Qg bGlzdF9oZWFkICp0bXAxLCAqdG1wMjsJCisKKwlpZiAoZW52Ml9kZXZpY2UpIHsKKwkJZGV2aWNl X3JlbW92ZV9maWxlKCYoZW52Ml9kZXZpY2UtPmRldiksICZkZXZfYXR0cl9mYW5zcGVlZCk7CisJ CWRldmljZV9yZW1vdmVfZmlsZSgmKGVudjJfZGV2aWNlLT5kZXYpLCAmZGV2X2F0dHJfdGhlcm1p c3RlcnMpOworCQlkZXZpY2VfcmVtb3ZlX2ZpbGUoJihlbnYyX2RldmljZS0+ZGV2KSwgJmRldl9h dHRyX3Bvd2VyKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCYoZW52Ml9kZXZpY2UtPmRldiksICZk ZXZfYXR0cl9kaXNrcyk7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmKGVudjJfZGV2aWNlLT5kZXYp LCAmZGV2X2F0dHJfa2V5c3dpdGNoKTsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCYoZW52Ml9kZXZp Y2UtPmRldiksICZkZXZfYXR0cl9mc3BsZWRzKTsKKyNpZiBFTlYyX0RFQlVHX1RFTVAKKwkJZGV2 aWNlX3JlbW92ZV9maWxlKCYoZW52Ml9kZXZpY2UtPmRldiksICZkZXZfYXR0cl9mb3JjZWRfdGVt cCk7CisjZW5kaWYKKwkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIoZW52Ml9kZXZpY2UpOwor CQllbnYyX2RldmljZSA9IE5VTEw7CisJfQorCisJaWYgKGtlbnZjdHJsZF90YXNrKSB7CisJCSh2 b2lkKSBrdGhyZWFkX3N0b3Aoa2VudmN0cmxkX3Rhc2spOworCQlrZW52Y3RybGRfdGFzayA9IE5V TEw7CisJfQorCisJaWYgKGVudjJfZnNwX2lycSkgeworCQkvKiBkaXNhYmxlIEZTUCBpbnRlcnJ1 cHRzICovCisJCWVudmN0cmxfaTJjX3dyaXRlXzg1NzQoCisJCQlFTlYyX0ZTUF9DVFJMX0FERFIs IEVOVjJfRlNQX0lOVFJfTEFUQ0hfQ0xSKTsKKwkJZnJlZV9pcnEoZW52Ml9mc3BfaXJxLCAodm9p ZCAqKSAmZW52Ml9mc3BfYWN0X3RpbWVyKTsKKwkJZW52Ml9mc3BfaXJxID0gMDsKKwl9CisJZGVs X3RpbWVyX3N5bmMoJmVudjJfZnNwX2FjdF90aW1lcik7CisKKwlpZiAoZW52Ml90aGVybXNfZGF0 YSkgeworCQlrZnJlZShlbnYyX3RoZXJtc19kYXRhKTsKKwkJZW52Ml90aGVybXNfZGF0YSA9IE5V TEw7CisJfQorCWxpc3RfZm9yX2VhY2hfc2FmZSh0bXAxLCB0bXAyLCAmZW52Ml90aGVybXMpIHsK KwkJdGhlcm0gPSBsaXN0X2VudHJ5KHRtcDEsIHN0cnVjdCB0aGVybSwgbGlzdCk7CisJCWxpc3Rf ZGVsKHRtcDEpOworCQlrZnJlZSh0aGVybSk7CisJfQorCisJaWYgKGVudmN0cmxfYWRhcCkgewor CQlpMmNfcHV0X2FkYXB0ZXIoZW52Y3RybF9hZGFwKTsKKwkJZW52Y3RybF9hZGFwID0gTlVMTDsK Kwl9CisKKwlyZXR1cm47Cit9CisKKyNpZiBFTlYyX0RFQlVHX1RIRVJNUworc3RhdGljIHZvaWQg ZHVtcF90aGVybXModm9pZCkKK3sKKwlzdHJ1Y3QgdGhlcm0gKnQ7CisJc3RydWN0IGxpc3RfaGVh ZCAqdG1wMSwgKnRtcDI7CQorCisJbGlzdF9mb3JfZWFjaF9zYWZlKHRtcDEsIHRtcDIsICZlbnYy X3RoZXJtcykgeworCQl0ID0gbGlzdF9lbnRyeSh0bXAxLCBzdHJ1Y3QgdGhlcm0sIGxpc3QpOwor CQlwcmludGsoIjB4JTAyeFsldV0gbWluICVpLCB3YXJuICVpLCBzaHV0ICVpLCAiCisJCQkibnVt ICVpLCBkZW4gJWksICVzXG4iLAorCQkJdC0+Y2ZnLT5hZGRyLCB0LT5jZmctPnBvcnQsIHQtPmNm Zy0+bWluX3RlbXAsIAorCQkJdC0+Y2ZnLT53YXJuX3RlbXAsIHQtPmNmZy0+c2h1dGRvd25fdGVt cCwgCisJCQl0LT5jZmctPm51bSwgdC0+Y2ZnLT5kZW4sIHQtPmNmZy0+bmFtZSk7CisJfQorfQor I2VuZGlmCisKK3N0YXRpYyBpbnQgX19pbml0IGVudjJfaW5pdCh2b2lkKQoreworCWludCBlcnIg PSAwOworCisJZW52Ml9wYXJzZV9vdmVydGVtcF9vcHRpb24oZW52Y3RybF9vdmVydGVtcCk7CisK KwluZXggPSBwY2ZfZW52Y3RybF9nZXRfbmV4dXMoKTsKKwlpZiAobmV4LT50eXBlICE9IFRZUEVf RU5WQ1RSTFRXTykgeworCQlwcmludGsoIiVzOiBuZXh1cyB0eXBlICVpIGlzIG5vdCBFTlZDVFJM VFdPXG4iLCAKKwkJCV9fRlVOQ1RJT05fXywgbmV4LT50eXBlKTsKKwkJcmV0dXJuIC1FTk9ERVY7 CisJfQorCisJZW52Y3RybF9hZGFwID0gaTJjX2dldF9hZGFwdGVyKG5leC0+aTJjX2lkKTsKKwlp ZiAoIWVudmN0cmxfYWRhcCkgeworCQlwcmludGsoIiVzOiBpMmNfZ2V0X2FkYXB0ZXJfaWQoJWkp IHJldHVybmVkIE5VTExcbiIsCisJCQlfX0ZVTkNUSU9OX18sIG5leC0+aTJjX2lkKTsKKwkJcmV0 dXJuIC1FTk9ERVY7CisJfQorCisJaWYgKCEgZW52Ml9pbml0X3RoZXJtaXN0ZXJzKG5leC0+ZWRl dikpIHsKKwkJZXJyID0gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOworCX0KKworI2lmIEVOVjJf REVCVUdfVEhFUk1TCisJZHVtcF90aGVybXMoKTsKKyNlbmRpZgorCisJaWYgKCEgZW52Ml9pbml0 X2ZzcChuZXgtPmVkZXYpKSB7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKKwl9 CisKKwlrZW52Y3RybGRfdGFzayA9IGt0aHJlYWRfcnVuKGtlbnZjdHJsZCwgTlVMTCwgImtlbnZj dHJsZCIpOworCWlmIChJU19FUlIoa2VudmN0cmxkX3Rhc2spKSB7CisJCWVyciA9IFBUUl9FUlIo a2VudmN0cmxkX3Rhc2spOworCQlrZW52Y3RybGRfdGFzayA9IE5VTEw7CisJCWdvdG8gb3V0X2Vy cjsKKwl9CisKKwllbnYyX2RldmljZSA9IHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcl9zaW1wbGUo CisJCUVOVjJfREVWTkFNRSAiLSIsIDAsIE5VTEwsIDApOworCWlmIChJU19FUlIoZW52Ml9kZXZp Y2UpKSB7CisJCWVyciA9IFBUUl9FUlIoZW52Ml9kZXZpY2UpOworCQllbnYyX2RldmljZSA9IE5V TEw7CisJCWdvdG8gb3V0X2VycjsKKwl9CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoZW52Ml9kZXZp Y2UtPmRldiksICZkZXZfYXR0cl9mYW5zcGVlZCk7CisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoZW52 Ml9kZXZpY2UtPmRldiksICZkZXZfYXR0cl90aGVybWlzdGVycyk7CisJZGV2aWNlX2NyZWF0ZV9m aWxlKCYoZW52Ml9kZXZpY2UtPmRldiksICZkZXZfYXR0cl9wb3dlcik7CisJZGV2aWNlX2NyZWF0 ZV9maWxlKCYoZW52Ml9kZXZpY2UtPmRldiksICZkZXZfYXR0cl9kaXNrcyk7CisJZGV2aWNlX2Ny ZWF0ZV9maWxlKCYoZW52Ml9kZXZpY2UtPmRldiksICZkZXZfYXR0cl9rZXlzd2l0Y2gpOworCWRl dmljZV9jcmVhdGVfZmlsZSgmKGVudjJfZGV2aWNlLT5kZXYpLCAmZGV2X2F0dHJfZnNwbGVkcyk7 CisjaWYgRU5WMl9ERUJVR19URU1QCisJZGV2aWNlX2NyZWF0ZV9maWxlKCYoZW52Ml9kZXZpY2Ut PmRldiksICZkZXZfYXR0cl9mb3JjZWRfdGVtcCk7CisjZW5kaWYKKworCXByaW50ayhLRVJOX0lO Rk8gIiVzOiBkcml2ZXIgdmVyc2lvbiAlcyBpbml0aWFsaXplZFxuIiwgCisJCUVOVjJfREVWTkFN RSwgRU5WMl9WRVJTSU9OKTsKKworCXJldHVybiAwOworCitvdXRfZXJyOgorCWVudjJfY2xlYW51 cCgpOworCXJldHVybiBlcnI7Cit9CisKKworbW9kdWxlX2luaXQoZW52Ml9pbml0KTsKK21vZHVs ZV9leGl0KGVudjJfY2xlYW51cCk7CitNT0RVTEVfTElDRU5TRSgiR1BMIik7Cj09PT09IGFyY2gv c3BhcmM2NC9rZXJuZWwvZW52X2VudmN0cmx0d28uaCAxLjEgdnMgZWRpdGVkID09PT09Ci0tLSAx LjEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnZfZW52Y3RybHR3by5oCTIwMDUtMDItMDMgMTA6MTI6 NDIgLTA4OjAwCisrKyBlZGl0ZWQvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnZfZW52Y3RybHR3by5o CTIwMDUtMDItMTUgMDg6NDU6MDEgLTA4OjAwCkBAIC0wLDAgKzEsNTQgQEAKKworLyogJElkJAor ICogZW52X2VudmN0cmx0d28uaCAtIFNVTlcsZW52Y3RybHR3byBwcml2YXRlIGRlZmluaXRpb25z CisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBFcmljIEJyb3dlciAoZWJyb3dlckBnbWFpbC5j b20pCisgKi8KKworI2lmbmRlZiBfU1BBUkM2NF9FTlZfRU5WQ1RSTFRXT19ICisjZGVmaW5lIF9T UEFSQzY0X0VOVl9FTlZDVFJMVFdPX0gKKworLyogCisgKiBlbnZjdHJsdHdvIGRlZmluaXRpb25z IAorICovCisjZGVmaW5lIEVOVjJfRlNQX0xFRF9BRERSIAkweDdDCisjZGVmaW5lIEVOVjJfTEVE X0RJU0tFUlIgCSgxPDwwKQorI2RlZmluZSBFTlYyX0xFRF9QU0VSUiAgIAkoMTw8MSkKKyNkZWZp bmUgRU5WMl9MRURfVEVNUEVSUiAJKDE8PDIpCisjZGVmaW5lIEVOVjJfTEVEX0dFTkVSUiAgCSgx PDwzKQorI2RlZmluZSBFTlYyX0xFRF9BQ1RJVkUgIAkoMTw8NCkKKyNkZWZpbmUgRU5WMl9MRURf UE9XRVIgICAJKDE8PDUpCisjZGVmaW5lIEVOVjJfRlNQX0xFRE1TSyAJMHgzRgorCisjZGVmaW5l IEVOVjJfRlNQX0tFWV9PRkYJMHgwMAorI2RlZmluZSBFTlYyX0ZTUF9LRVlfRElBRyAgICAgICAw eDQwCisjZGVmaW5lIEVOVjJfRlNQX0tFWV9PTiAgICAgICAgIDB4ODAKKyNkZWZpbmUgRU5WMl9G U1BfS0VZX0xPQ0sgICAgICAgMHhDMAorI2RlZmluZSBFTlYyX0ZTUF9LRVlNU0sgICAgICAgICAw eEMwCisKKyNkZWZpbmUgRU5WMl9GU1BfQ1RSTF9BRERSICAgICAgMHg3MAorI2RlZmluZSBFTlYy X0ZTUF9ERkxPUF9JTklUMCAgICAweDc3CisjZGVmaW5lIEVOVjJfRlNQX0RGTE9QX0lOSVQxICAg IDB4N0YKKyNkZWZpbmUgRU5WMl9GU1BfREVWSU5UUl9JTklUMCAgMHhGNworI2RlZmluZSBFTlYy X0ZTUF9ERVZJTlRSX0lOSVQxICAweEZGCisjZGVmaW5lIEVOVjJfRlNQX0lOVFJfTEFUQ0hfQ0xS IDB4RkUKKworI2RlZmluZSBFTlYyX0ZBTl9BRERSIAkJMHg5NAorI2RlZmluZSBFTlYyX0ZBTl9Q T1JUIAkJMHgwMQorI2RlZmluZSBFTlYyX0ZBTl9NQVggIAkJMHhGRgorCisjZGVmaW5lIEVOVjJf RElTS1BSRVNfQUREUiAJMHg3QQorI2RlZmluZSBFTlYyX0RJU0tTVEFUX0FERFIgCTB4N0UKKyNk ZWZpbmUgRU5WMl9ESVNLX01BWCAgICAgIAk2CS8qIDEtYmFzZWQgKi8KKworI2RlZmluZSBFTlYy X1BTX0FERFIgCQkweDcyCisjZGVmaW5lIEVOVjJfUFNfUFJFU19NQVNLCTB4MDMKKyNkZWZpbmUg RU5WMl9QU19QUkVTX1NISUZUCTAKKyNkZWZpbmUgRU5WMl9QU19QUkVTKHN0YXQsIHBzKQlcCisJ KCEoKChzdGF0ICYgRU5WMl9QU19QUkVTX01BU0spID4+IChFTlYyX1BTX1BSRVNfU0hJRlQgKyBw cyAtIDEpKSAmIDB4MDEpKQorI2RlZmluZSBFTlYyX1BTX0VSUl9NQVNLCTB4MzAKKyNkZWZpbmUg RU5WMl9QU19FUlIoc3RhdCwgcHMpCVwKKwkoISgoKHN0YXQgJiBFTlYyX1BTX0VSUl9NQVNLKSA+ PiAoRU5WMl9QU19FUlJfU0hJRlQgKyBwcyAtIDEpKSAmIDB4MDEpKQorI2RlZmluZSBFTlYyX1BT X0VSUl9TSElGVAk0CisjZGVmaW5lIEVOVjJfUFNfTUFYCQkyCS8qIDEtYmFzZWQgKi8KKworI2Vu ZGlmIC8qICNpZm5kZWYgX1NQQVJDNjRfRU5WX0VOVkNUUkxUV09fSCAqLwo9PT09PSBhcmNoL3Nw YXJjNjQva2VybmVsL2Vudl9saWIuYyAxLjEgdnMgZWRpdGVkID09PT09Ci0tLSAxLjEvYXJjaC9z cGFyYzY0L2tlcm5lbC9lbnZfbGliLmMJMjAwNS0wMi0xNCAyMzo1NTo1MSAtMDg6MDAKKysrIGVk aXRlZC9hcmNoL3NwYXJjNjQva2VybmVsL2Vudl9saWIuYwkyMDA1LTAyLTE1IDA4OjQ1OjAxIC0w ODowMApAQCAtMCwwICsxLDE4MSBAQAorLyogJElkJAorICogZW52X2xpYi5jOiBFbnZpcm9ubWVu dGFsIG1vbml0b3JpbmcgbGlicmFyeSBjb2RlIGZvciAKKyAqICAgICAgICAgICAgYWNjZXNzaW5n IEkyQyBjbGllbnRzIChjaGlwcykgdmlhIGkyYy1lbnZjdHJsIAorICogICAgICAgICAgICBQQ0Y4 NTg0IGJ1cyBuZXh1cyBpbnRlcmZhY2UgCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUg RXJpYyBCcm93ZXIgKGVicm93ZXJAZ21haWwuY29tKQorICogCisgKiBUT0RPOiBmdW5jdGlvbnMg c2hvdWxkIGFsbCByZXR1cm4gZXhwbGljaXQgZXJyb3IgY29kZXMKKyAqLworCisjaW5jbHVkZSA8 bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlICJlbnZfbGliLmgiCisKKy8qIFRPRE8tLSBnZXQg cmVmZXJlbmNlcyBmcm9tIGFuIGVudl9saWJfaW5pdCgpIHJvdXRpbmUKKyAqLworZXh0ZXJuIHN0 cnVjdCBpMmNfYWRhcHRlciAqZW52Y3RybF9hZGFwOworZXh0ZXJuIHNwaW5sb2NrX3QgZW52Y3Ry bF9sb2NrOworCisvKiByZXR1cm5zIDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBmYWlsdXJl ICovCitpbnQgX19lbnYyX2kyY19yZWFkYih1OCBhZGRyLCB1OCAqcnYpCit7IAorCWludCByZXQ7 CisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciAgPSAoYWRkcj4+MSksCisJCS5mbGFn cyA9IEkyQ19NX1JELAorCQkubGVuICAgPSAxLAorCQkuYnVmICAgPSBydiwKKwl9OworCisJcmV0 ID0gaTJjX3RyYW5zZmVyKGVudmN0cmxfYWRhcCwgJm1zZywgMSk7CisJaWYgKHJldCA9PSAxKSB7 CisJCXJldCA9IDA7CisJfQorCXJldHVybiAocmV0ID09IDEpID8gMCA6IHJldDsKK30KKworaW50 IGVudjJfaTJjX3JlYWRiKHU4IGFkZHIsIHU4ICpydikKK3sgCisJaW50IHJldDsKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCXNwaW5fbG9ja19pcnFzYXZlKCZlbnZjdHJsX2xvY2ssIGZsYWdzKTsK KworCXJldCA9IF9fZW52Ml9pMmNfcmVhZGIoYWRkciwgcnYpOworCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJmVudmN0cmxfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBfX2Vu djJfaTJjX3dyaXRlYih1OCBhZGRyLCB1OCB2YWwpCit7IAorCXU4IHZhbGJ1ZiA9IHZhbDsKKwlp bnQgcmV0OworCisJc3RydWN0IGkyY19tc2cgbXNnID0geworCQkuYWRkciAgPSAoYWRkcj4+MSks CisJCS5mbGFncyA9IDAsCisJCS5sZW4gICA9IDEsCisJCS5idWYgICA9ICZ2YWxidWYsCisJfTsK KworCWlmICghZW52Y3RybF9hZGFwKSB7CisJCUJVRygpOworCX0KKworCXJldCA9IGkyY190cmFu c2ZlcihlbnZjdHJsX2FkYXAsICZtc2csIDEpOworCWlmIChyZXQgPT0gMSkgeworCQlyZXQgPSAw OworCX0KKwlyZXR1cm4gcmV0OworfQorCitpbnQgZW52Ml9pMmNfd3JpdGViKHU4IGFkZHIsIHU4 IHZhbCkKK3sgCisJaW50IHJldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2Nr X2lycXNhdmUoJmVudmN0cmxfbG9jaywgZmxhZ3MpOworCXJldCA9IF9fZW52Ml9pMmNfd3JpdGVi KGFkZHIsIHZhbCk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZW52Y3RybF9sb2NrLCBmbGFn cyk7CisJcmV0dXJuIHJldDsKK30KKwordTggX19lbnZjdHJsX2kyY19yZWFkXzg1NzQodTggYWRk cikgCit7CisJdTggYnVmOworCSh2b2lkKSBfX2VudjJfaTJjX3JlYWRiKGFkZHIsICZidWYpOwor CXJldHVybiBidWY7Cit9Cit1OCBlbnZjdHJsX2kyY19yZWFkXzg1NzQodTggYWRkcikgCit7CisJ dTggYnVmOworCSh2b2lkKSBlbnYyX2kyY19yZWFkYihhZGRyLCAmYnVmKTsKKwlyZXR1cm4gYnVm OworfQorCitpbnQgX19lbnZjdHJsX2kyY19yZWFkXzg1OTEodTggYWRkciwgdTggcG9ydCwgdTgg KnJ2KQoreworI2RlZmluZSBQQ0Y4NTkxX0FPRSAoMHg0MCkKKwlpbnQgcmV0OworCXU4IHRtcCA9 IHBvcnQgfCBQQ0Y4NTkxX0FPRTsKKworCXN0cnVjdCBpMmNfbXNnIG1zZ1tdID0geworCQl7CisJ CQkuYWRkciAgPSAoYWRkcj4+MSksCisJCQkuZmxhZ3MgPSAwLAorCQkJLmxlbiAgID0gMSwKKwkJ CS5idWYgICA9ICZ0bXAsCisJCX0sCisJCXsKKwkJCS8qIGR1bW15IHJlYWQtLSByZXN1bHQgb2Yg cHJldmlvdXMgY29udmVyc2lvbiBjeWNsZSAqLworCQkJLmFkZHIgID0gKGFkZHI+PjEpLAorCQkJ LmZsYWdzID0gSTJDX01fUkQsCisJCQkubGVuICAgPSAxLAorCQkJLmJ1ZiAgID0gJnRtcCwKKwkJ fSwKKwkJeworCQkJLmFkZHIgID0gKGFkZHI+PjEpLAorCQkJLmZsYWdzID0gSTJDX01fUkQsCisJ CQkubGVuICAgPSAxLAorCQkJLmJ1ZiAgID0gcnYsCisJCX0sCisJCisJfTsKKworCWludCBtc2dj bnQgPSBzaXplb2YobXNnKSAvIHNpemVvZihzdHJ1Y3QgaTJjX21zZyk7CisJaWYgKCFlbnZjdHJs X2FkYXApIHsKKwkJQlVHKCk7CisJfQorCXJldCA9IGkyY190cmFuc2ZlcihlbnZjdHJsX2FkYXAs IG1zZywgbXNnY250KTsKKwlpZiAocmV0ID09IG1zZ2NudCkgeworCQlyZXQgPSAwOworCX0KKwly ZXR1cm4gcmV0OworfQorCitpbnQgZW52Y3RybF9pMmNfcmVhZF84NTkxKHU4IGFkZHIsIHU4IHBv cnQsIHU4ICpydikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGlu X2xvY2tfaXJxc2F2ZSgmZW52Y3RybF9sb2NrLCBmbGFncyk7CisJcmV0ID0gX19lbnZjdHJsX2ky Y19yZWFkXzg1OTEoYWRkciwgcG9ydCwgcnYpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmVu dmN0cmxfbG9jaywgZmxhZ3MpOworCXJldHVybiByZXQ7Cit9CisKK3U4IF9fZW52Y3RybF9pMmNf d3JpdGVfODU5MSh1OCBhZGRyLCB1OCBkYXRhKQoreworCWludCByZXQ7CisJdTggdG1wW10gPSB7 IFBDRjg1OTFfQU9FLCBkYXRhIH07CisKKwlzdHJ1Y3QgaTJjX21zZyBtc2dbXSA9IHsKKwkJewor CQkJLmFkZHIgID0gKGFkZHI+PjEpLAorCQkJLmZsYWdzID0gMCwKKwkJCS5sZW4gICA9IDIsCisJ CQkuYnVmICAgPSB0bXAsCisJCX0KKwl9OworCisJaW50IG1zZ2NudCA9IHNpemVvZihtc2cpIC8g c2l6ZW9mKHN0cnVjdCBpMmNfbXNnKTsKKworCWlmICghZW52Y3RybF9hZGFwKSB7CisJCUJVRygp OworCX0KKwlyZXQgPSBpMmNfdHJhbnNmZXIoZW52Y3RybF9hZGFwLCBtc2csIG1zZ2NudCk7CisJ aWYgKHJldCA9PSBtc2djbnQpIHsKKwkJcmV0ID0gMDsKKwl9CisJcmV0dXJuIHJldDsKK30KKwor dTggZW52Y3RybF9pMmNfd3JpdGVfODU5MSh1OCBhZGRyLCB1OCBkYXRhKQoreworCXU4IHJldDsK Kwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmVudmN0cmxfbG9j aywgZmxhZ3MpOworCXJldCA9IF9fZW52Y3RybF9pMmNfd3JpdGVfODU5MShhZGRyLCBkYXRhKTsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZlbnZjdHJsX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4g cmV0OworfQo9PT09PSBhcmNoL3NwYXJjNjQva2VybmVsL2Vudl9saWIuaCAxLjEgdnMgZWRpdGVk ID09PT09Ci0tLSAxLjEvYXJjaC9zcGFyYzY0L2tlcm5lbC9lbnZfbGliLmgJMjAwNS0wMi0xNCAy Mzo1NjowMSAtMDg6MDAKKysrIGVkaXRlZC9hcmNoL3NwYXJjNjQva2VybmVsL2Vudl9saWIuaAky MDA1LTAyLTE1IDA4OjQ1OjAxIC0wODowMApAQCAtMCwwICsxLDU0IEBACisvKiAkSWQkCisgKiBl bnZfbGliLmM6IEVudmlyb25tZW50YWwgbW9uaXRvcmluZyBsaWJyYXJ5IGNvZGUgZm9yIAorICog ICAgICAgICAgICBhY2Nlc3NpbmcgSTJDIGNsaWVudHMgKGNoaXBzKSB2aWEgaTJjLWVudmN0cmwg CisgKiAgICAgICAgICAgIFBDRjg1ODQgYnVzIG5leHVzIGludGVyZmFjZSAKKyAqCisgKiBDb3B5 cmlnaHQgKEMpIDIwMDQtMjAwNSBFcmljIEJyb3dlciAoZWJyb3dlckBnbWFpbC5jb20pCisgKiAK KyAqIFRPRE86IGZ1bmN0aW9ucyBzaG91bGQgYWxsIHJldHVybiBleHBsaWNpdCBlcnJvciBjb2Rl cworICovCisKKyNpZm5kZWYgX1NQQVJDNjRfRU5WX0xJQl9ICisjZGVmaW5lIF9TUEFSQzY0X0VO Vl9MSUJfSAorCisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4K KyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKworLyogCisgKiAiY2hpcCIgYWNjZXNzIGZ1bmN0aW9u cy0tCisgKiBXZSB1c2Ugc3BpbmxvY2tzIGZvciB0d28gcmVhc29uczoKKyAqICAxKSBiZWNhdXNl IHRoZSBpMmMgY29yZSBkb2Vzbid0IHN1cHBvcnQgdXNlIHdoaWxlIGluX2ludGVycnVwdCgpCisg KiAgICAgc28gd2UgIndyYXAiIHRoZWlyIHNlbWFwaG9yZXMgd2l0aCBzcGlubG9ja3MgKHVnaCEp CisgKiAgMikgdG8gcHJldmVudCBjb25jdXJyZW50IGFjY2VzcyB0byBidXMgZnJvbSBpbnRlcnJ1 cHRzIG9yIHRpbWVycworICoKKyAqIFVubG9ja2VkIHJvdXRpbmVzIGFyZSBwcm92aWRlZCBmb3Ig d2hlbiBtdWx0aXBsZSBJMkMgbWVzc2FnZQorICogYXRvbWljaXR5IGlzIHJlcXVpcmVkLS0gdGhl IGkyYyBjb3JlIGRvZXMgbm90IGN1cnJlbnRseSBhbGxvdyB1cworICogdG8gaXNzdWUgbXVsdGlw bGUgbWVzc2FnZXMgd2l0aCBkeW5hbWljIGNvbnRlbnQgKGkuZS4gcmVhZCx4b3Isd3JpdGUpLgor ICogV2hlbiB1c2luZyB1bmxvY2tlZCBmdW5jdGlvbnMgKF9feHh4KCkgZnVuY3MpIHlvdSBtdXN0 IGFjcXVpcmUgYW5kCisgKiByZWxlYXNlIHRoZSBzcGlubG9jayB5b3Vyc2VsZi0tIHRoaXMgZ2l2 ZXMgdXMgYSBsZXZlbCBvZiBhdG9taWNpdHkKKyAqIGJ1dCBkb2VzIG5vdCBhZGRyZXNzIG11bHRp LW1hc3RlciBjb25jZXJucyBiZWNhdXNlIGFsbCBzdWNoIHRyYW5zYWN0aW9ucworICogYXJlIGRv bmUgYXMgc2VwYXJhdGUgU1RBUlQvU1RPUCBzZXF1ZW5jZXMgKEZJWE1FIGluIGkyYyBjb3JlKS4K KyAqLworCisvKiByZXR1cm5zIDAgb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBmYWlsdXJlICov CitpbnQgX19lbnYyX2kyY19yZWFkYih1OCBhZGRyLCB1OCAqcnYpOworaW50IGVudjJfaTJjX3Jl YWRiKHU4IGFkZHIsIHU4ICpydik7CisKK2ludCBfX2VudjJfaTJjX3dyaXRlYih1OCBhZGRyLCB1 OCB2YWwpOworaW50IGVudjJfaTJjX3dyaXRlYih1OCBhZGRyLCB1OCB2YWwpOworCisvKiBYWFgg VGVtcG9yYXJ5LS0gc2hvdWxkIGJlIGxpYiBjb2RlIG9yIHNvbWVzdWNoICovCisjZGVmaW5lIF9f ZW52Y3RybF9pMmNfd3JpdGVfODU3NChhZGRyLGRhdGEpIF9fZW52Ml9pMmNfd3JpdGViKGFkZHIs ZGF0YSk7CisjZGVmaW5lIGVudmN0cmxfaTJjX3dyaXRlXzg1NzQoYWRkcixkYXRhKSBlbnYyX2ky Y193cml0ZWIoYWRkcixkYXRhKTsKKwordTggX19lbnZjdHJsX2kyY19yZWFkXzg1NzQodTggYWRk cik7Cit1OCBlbnZjdHJsX2kyY19yZWFkXzg1NzQodTggYWRkcik7CisKK2ludCBfX2VudmN0cmxf aTJjX3JlYWRfODU5MSh1OCBhZGRyLCB1OCBwb3J0LCB1OCAqcnYpOworaW50IGVudmN0cmxfaTJj X3JlYWRfODU5MSh1OCBhZGRyLCB1OCBwb3J0LCB1OCAqcnYpOworCit1OCBfX2VudmN0cmxfaTJj X3dyaXRlXzg1OTEodTggYWRkciwgdTggZGF0YSk7Cit1OCBlbnZjdHJsX2kyY193cml0ZV84NTkx KHU4IGFkZHIsIHU4IGRhdGEpOworCisjZW5kaWYgLyogI2lmbmRlZiBfU1BBUkM2NF9FTlZfTElC X0ggKi8KPT09PT0gZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMgMS4xNiB2cyBlZGl0 ZWQgPT09PT0KLS0tIDEuMTYvZHJpdmVycy9pMmMvYWxnb3MvaTJjLWFsZ28tcGNmLmMJMjAwNC0x Mi0wNyAwMjoxNDo1OCAtMDg6MDAKKysrIGVkaXRlZC9kcml2ZXJzL2kyYy9hbGdvcy9pMmMtYWxn by1wY2YuYwkyMDA1LTAyLTExIDE3OjUwOjIwIC0wODowMApAQCAtNzgsNyArNzgsNiBAQAogCXNl dF9wY2YoYWRhcCwgMSwgSTJDX1BDRl9TVE9QKTsKIH0KIAotCiBzdGF0aWMgaW50IHdhaXRfZm9y X2JiKHN0cnVjdCBpMmNfYWxnb19wY2ZfZGF0YSAqYWRhcCkgewogCiAJaW50IHRpbWVvdXQgPSBE RUZfVElNRU9VVDsKQEAgLTEwOSw2ICsxMDgsMjYgQEAKIAkJYWRhcC0+d2FpdGZvcnBpbigpOwog CQkqc3RhdHVzID0gZ2V0X3BjZihhZGFwLCAxKTsKIAl9CisJaWYgKCpzdGF0dXMgJiBJMkNfUENG X0xBQikgeworCQlERUIyKHByaW50ayhLRVJOX0lORk8gCisJCQkiaTJjLWFsZ28tcGNmLm86IGxv c3QgYXJiaXRyYXRpb24gKENTUiAweCUwMngpXG4iLAorCQkJICpzdGF0dXMpKTsKKwkJLyogQ2xl YW51cCBmcm9tIExBQi0tIHJlc2V0IGFuZCBlbmFibGUgRVNPLgorCQkgKiBUaGlzIHJlc2V0cyB0 aGUgUENGODU4NDsgc2luY2Ugd2UndmUgbG9zdCB0aGUgYnVzLCBubworCQkgKiBmdXJ0aGVyIGF0 dGVtcHRzIHNob3VsZCBiZSBtYWRlIGJ5IGNhbGxlcnMgdG8gY2xlYW4gdXAgCisJCSAqIChubyBp MmNfc3RvcCgpIGV0Yy4pCisJCSAqLworCQlzZXRfcGNmKGFkYXAsIDEsIEkyQ19QQ0ZfUElOKTsK KwkJc2V0X3BjZihhZGFwLCAxLCBJMkNfUENGX0VTTyk7CisJCS8qIFRPRE86IHdlIHNob3VsZCBw YXVzZSBmb3IgYSB0aW1lIHBlcmlvZCBzdWZmaWNpZW50IGZvciBhbnkKKwkJICogcnVubmluZyBJ MkMgdHJhbnNhY3Rpb24gdG8gY29tcGxldGUtLSB0aGUgYXJiaXRyYXRpb24KKwkJICogbG9naWMg d29uJ3Qgd29yayBwcm9wZXJseSB1bnRpbCB0aGUgbmV4dCBTVEFSVCBpcyBzZWVuLgorCQkgKi8K KwkJREVCMihwcmludGsoS0VSTl9JTkZPIAorCQkJImkyYy1hbGdvLXBjZi5vOiByZXNldCBMQUIg Y29uZGl0aW9uIChDU1IgMHglMDJ4KVxuIiwgCisJCQlnZXRfcGNmKGFkYXAsMSkpKTsKKwkJcmV0 dXJuKC1FSU5UUik7CisJfQogI2VuZGlmCiAJaWYgKHRpbWVvdXQgPD0gMCkKIAkJcmV0dXJuKC0x KTsKQEAgLTE4OCwxNiArMjA3LDIyIEBACiAJCSAgICAgICB1bnNpZ25lZCBjaGFyIGFkZHIsIGlu dCByZXRyaWVzKQogewogCWludCBpLCBzdGF0dXMsIHJldCA9IC0xOworCWludCB3ZnA7CiAJZm9y IChpPTA7aTxyZXRyaWVzO2krKykgewogCQlpMmNfb3V0YihhZGFwLCBhZGRyKTsKIAkJaTJjX3N0 YXJ0KGFkYXApOwogCQlzdGF0dXMgPSBnZXRfcGNmKGFkYXAsIDEpOwotCQlpZiAod2FpdF9mb3Jf cGluKGFkYXAsICZzdGF0dXMpID49IDApIHsKKwkJaWYgKCh3ZnAgPSB3YWl0X2Zvcl9waW4oYWRh cCwgJnN0YXR1cykpID49IDApIHsKIAkJCWlmICgoc3RhdHVzICYgSTJDX1BDRl9MUkIpID09IDAp IHsgCiAJCQkJaTJjX3N0b3AoYWRhcCk7CiAJCQkJYnJlYWs7CS8qIHN1Y2Nlc3MhICovCiAJCQl9 CiAJCX0KKwkJaWYgKHdmcCA9PSAtRUlOVFIpIHsKKwkJCS8qIGFyYml0cmF0aW9uIGxvc3QgKi8K KwkJCXVkZWxheShhZGFwLT51ZGVsYXkpOworCQkJcmV0dXJuIC1FSU5UUjsKKwkJfQogCQlpMmNf c3RvcChhZGFwKTsKIAkJdWRlbGF5KGFkYXAtPnVkZWxheSk7CiAJfQpAQCAtMjE5LDYgKzI0NCwx MCBAQAogCQlpMmNfb3V0YihhZGFwLCBidWZbd3Jjb3VudF0pOwogCQl0aW1lb3V0ID0gd2FpdF9m b3JfcGluKGFkYXAsICZzdGF0dXMpOwogCQlpZiAodGltZW91dCkgeworCQkJaWYgKHRpbWVvdXQg PT0gLUVJTlRSKSB7CisJCQkJLyogYXJiaXRyYXRpb24gbG9zdCAqLworCQkJCXJldHVybiAtRUlO VFI7CisJCQl9CiAJCQlpMmNfc3RvcChhZGFwKTsKIAkJCWRldl9lcnIoJmkyY19hZGFwLT5kZXYs ICJpMmNfd3JpdGU6IGVycm9yIC0gdGltZW91dC5cbiIpOwogCQkJcmV0dXJuIC1FUkVNT1RFSU87 IC8qIGdvdCBhIGJldHRlciBvbmUgPz8gKi8KQEAgLTI0NywxMSArMjc2LDE2IEBACiB7CiAJaW50 IGksIHN0YXR1czsKIAlzdHJ1Y3QgaTJjX2FsZ29fcGNmX2RhdGEgKmFkYXAgPSBpMmNfYWRhcC0+ YWxnb19kYXRhOworCWludCB3ZnA7CiAKIAkvKiBpbmNyZW1lbnQgbnVtYmVyIG9mIGJ5dGVzIHRv IHJlYWQgYnkgb25lIC0tIHJlYWQgZHVtbXkgYnl0ZSAqLwogCWZvciAoaSA9IDA7IGkgPD0gY291 bnQ7IGkrKykgewogCi0JCWlmICh3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cykpIHsKKwkJaWYg KCh3ZnAgPSB3YWl0X2Zvcl9waW4oYWRhcCwgJnN0YXR1cykpKSB7CisJCQlpZiAod2ZwID09IC1F SU5UUikgeworCQkJCS8qIGFyYml0cmF0aW9uIGxvc3QgKi8KKwkJCQlyZXR1cm4gLUVJTlRSOwor CQkJfQogCQkJaTJjX3N0b3AoYWRhcCk7CiAJCQlkZXZfZXJyKCZpMmNfYWRhcC0+ZGV2LCAicGNm X3JlYWRieXRlcyB0aW1lZCBvdXQuXG4iKTsKIAkJCXJldHVybiAoLTEpOwpAQCAtMzY2LDYgKzQw MCwxMCBAQAogCQkvKiBXYWl0IGZvciBQSU4gKHBlbmRpbmcgaW50ZXJydXB0IE5PVCkgKi8KIAkJ dGltZW91dCA9IHdhaXRfZm9yX3BpbihhZGFwLCAmc3RhdHVzKTsKIAkJaWYgKHRpbWVvdXQpIHsK KwkJCWlmICh0aW1lb3V0ID09IC1FSU5UUikgeworCQkJCS8qIGFyYml0cmF0aW9uIGxvc3QgKi8K KwkJCQlyZXR1cm4gKC1FSU5UUik7CisJCQl9CiAJCQlpMmNfc3RvcChhZGFwKTsKIAkJCURFQjIo cHJpbnRrKEtFUk5fRVJSICJpMmMtYWxnby1wY2YubzogVGltZW91dCB3YWl0aW5nICIKIAkJCQkg ICAgImZvciBQSU4oMSkgaW4gcGNmX3hmZXJcbiIpOykKPT09PT0gZHJpdmVycy9pMmMvYnVzc2Vz L0tjb25maWcgMS42NyB2cyBlZGl0ZWQgPT09PT0KLS0tIDEuNjcvZHJpdmVycy9pMmMvYnVzc2Vz L0tjb25maWcJMjAwNS0wMS0xNyAxMjozMDo0MSAtMDg6MDAKKysrIGVkaXRlZC9kcml2ZXJzL2ky Yy9idXNzZXMvS2NvbmZpZwkyMDA1LTAyLTAyIDE4OjE2OjQzIC0wODowMApAQCAtNDc2LDQgKzQ3 NiwxNiBAQAogCSAgVGhpcyBkcml2ZXIgY2FuIGFsc28gYmUgYnVpbHQgYXMgYSBtb2R1bGUuICBJ ZiBzbywgdGhlIG1vZHVsZQogCSAgd2lsbCBiZSBjYWxsZWQgaTJjLXBjYS1pc2EuCiAKK2NvbmZp ZyBJMkNfRU5WQ1RSTAorCXRyaXN0YXRlICJTdW4gTWljcm9zeXN0ZW1zIGVudmN0cmwgSTJDIGJ1 cyBuZXh1cyBkcml2ZXIiCisJZGVwZW5kcyBvbiBTUEFSQzY0ICYmIFBDSQorCXNlbGVjdCBJMkNf QUxHT1BDRgorCWhlbHAKKwkgIFRoaXMgZHJpdmVyIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgUENG ODU4NCBJMkMgYnVzIG5leHVzCisJICB1c2VkIGZvciBlbnZpcm9ubWVudGFsIG1vbml0b3Jpbmcg b24gY2VydGFpbiBTdW4gTWljcm9zeXN0ZW1zCisJICBwbGF0Zm9ybXMuCisKKwkgIFRoaXMgZHJp dmVyIGNhbiBhbHNvIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiAgSWYgc28sIHRoZSBtb2R1bGUKKwkg IHdpbGwgYmUgY2FsbGVkIGkyYy1lbnZjdHJsLgorCiBlbmRtZW51Cj09PT09IGRyaXZlcnMvaTJj L2J1c3Nlcy9NYWtlZmlsZSAxLjQwIHZzIGVkaXRlZCA9PT09PQotLS0gMS40MC9kcml2ZXJzL2ky Yy9idXNzZXMvTWFrZWZpbGUJMjAwNC0xMS0xOCAyMDozOToyOSAtMDg6MDAKKysrIGVkaXRlZC9k cml2ZXJzL2kyYy9idXNzZXMvTWFrZWZpbGUJMjAwNS0wMi0wMiAxODoxMzo0MyAtMDg6MDAKQEAg LTksNiArOSw3IEBACiBvYmotJChDT05GSUdfSTJDX0FNRDc1Nl9TNDg4MikJKz0gaTJjLWFtZDc1 Ni1zNDg4Mi5vCiBvYmotJChDT05GSUdfSTJDX0FNRDgxMTEpCSs9IGkyYy1hbWQ4MTExLm8KIG9i ai0kKENPTkZJR19JMkNfRUxFS1RPUikJKz0gaTJjLWVsZWt0b3Iubworb2JqLSQoQ09ORklHX0ky Q19FTlZDVFJMKQkrPSBpMmMtZW52Y3RybC5vCiBvYmotJChDT05GSUdfSTJDX0hZRFJBKQkJKz0g aTJjLWh5ZHJhLm8KIG9iai0kKENPTkZJR19JMkNfSTgwMSkJCSs9IGkyYy1pODAxLm8KIG9iai0k KENPTkZJR19JMkNfSTgxMCkJCSs9IGkyYy1pODEwLm8KPT09PT0gZHJpdmVycy9pMmMvYnVzc2Vz L2kyYy1lbnZjdHJsLmMgMS4xIHZzIGVkaXRlZCA9PT09PQotLS0gMS4xL2RyaXZlcnMvaTJjL2J1 c3Nlcy9pMmMtZW52Y3RybC5jCTIwMDUtMDItMDMgMTA6MDY6MzYgLTA4OjAwCisrKyBlZGl0ZWQv ZHJpdmVycy9pMmMvYnVzc2VzL2kyYy1lbnZjdHJsLmMJMjAwNS0wMi0wMyAxMDowNjo1OCAtMDg6 MDAKQEAgLTAsMCArMSwyNTQgQEAKKy8qIGkyYy1lbnZjdHJsIC0gUENGODU4NCBJMkMgYnVzIG5l eHVzIGRyaXZlciBmb3Igc3VwcG9ydGVkIAorICogICAgICAgICAgICAgICBTdW4gTWljcm9zeXN0 ZW1zIHN5c3RlbXMKKyAqIAorICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDUgRXJpYyBCcm93ZXIg PGVicm93ZXJAZ21haWwuY29tPgorICoKKyAqIEFkYXB0ZWQgZnJvbSBpMmMtZWxla3Rvci5jIC0g cmVmZXJlbmNlIHRoYXQgZmlsZSBmb3IgY29weXJpZ2h0IGluZm9ybWF0aW9uCisgKi8KKworI2lu Y2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1 ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUg PGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4 L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9w Y2kuaD4KKyNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4K KyNpbmNsdWRlIDxsaW51eC9pMmMtYWxnby1wY2YuaD4KKworI2luY2x1ZGUgPGFzbS9lYnVzLmg+ CisjaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFz bS9pMmMtZW52Y3RybC5oPgorCisjaW5jbHVkZSAiLi4vYWxnb3MvaTJjLWFsZ28tcGNmLmgiCisK K3N0cnVjdCBwY2Y4NTg0X3JlZ3MgeworCXZvbGF0aWxlIHU4IGRhdGE7CisJdm9sYXRpbGUgdTgg Y3NyOworfTsKKworc3RhdGljIHN0cnVjdCBfX2lvbWVtIHBjZjg1ODRfcmVncyAqaTJjOworc3Rh dGljIGludCBpcnE7CitzdGF0aWMgaW50IGNsb2NrICA9IDB4MWM7CitzdGF0aWMgaW50IG93biAg ICA9IDB4NTU7CisKK3N0YXRpYyB3YWl0X3F1ZXVlX2hlYWRfdCBwY2Zfd2FpdDsKK3N0YXRpYyBp bnQgcGNmX3BlbmRpbmc7CitzdGF0aWMgc3BpbmxvY2tfdCBsb2NrOworCitzdGF0aWMgc3RydWN0 IHBjZl9lbnZjdHJsX25leHVzIG5leHVzID0geyAKKwkudHlwZSAgID0gVFlQRV9VTktOT1dOLCAK KwkuaTJjX2lkID0gLTEsCisJLmVkZXYgICA9IE5VTEwgCit9OworCisvKiAtLS0tLSBsb2NhbCBm dW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQkq LworCitzdGF0aWMgdm9pZCBwY2ZfZW52Y3RybF9zZXRieXRlKHZvaWQgKmRhdGEsIGludCBjdGws IGludCB2YWwpCit7CisJLyogZW5hYmxlIGlycSBpZiBhbnkgc3BlY2lmaWVkIGZvciBzZXJpYWwg b3BlcmF0aW9uICovCisJaWYgKGN0bCAmJiBpcnEgJiYgKHZhbCAmIEkyQ19QQ0ZfRVNPKSkgewor CQl2YWwgfD0gSTJDX1BDRl9FTkk7CisJfQorCisJcHJfZGVidWcoImkyYy1lbnZjdHJsOiBXcml0 ZSAweCVYIDB4JTAyWFxuIiwgYWRkcmVzcywgdmFsICYgMjU1KTsKKworCWlmIChjdGwpIHsKKwkJ d3JpdGViKHZhbCwgJmkyYy0+Y3NyKTsKKwl9CisJZWxzZSB7CisJCXdyaXRlYih2YWwsICZpMmMt PmRhdGEpOworCX0KK30KKworc3RhdGljIGludCBwY2ZfZW52Y3RybF9nZXRieXRlKHZvaWQgKmRh dGEsIGludCBjdGwpCit7CisJaW50IHZhbDsKKworCWlmIChjdGwpIHsKKwkJdmFsID0gcmVhZGIo JmkyYy0+Y3NyKTsKKwl9CisJZWxzZSB7CisJCXZhbCA9IHJlYWRiKCZpMmMtPmRhdGEpOworCX0K KworCXByX2RlYnVnKCJpMmMtZW52Y3RybDogUmVhZCAweCVYIDB4JTAyWFxuIiwgYWRkcmVzcywg dmFsKTsKKworCXJldHVybiAodmFsKTsKK30KKworc3RhdGljIGludCBwY2ZfZW52Y3RybF9nZXRv d24odm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gKG93bik7Cit9CisKKworc3RhdGljIGludCBwY2Zf ZW52Y3RybF9nZXRjbG9jayh2b2lkICpkYXRhKQoreworCXJldHVybiAoY2xvY2spOworfQorCitz dGF0aWMgdm9pZCBwY2ZfZW52Y3RybF93YWl0Zm9ycGluKHZvaWQpIHsKKworCWludCB0aW1lb3V0 ID0gMjsKKwlsb25nIGZsYWdzOworCisJaWYgKGlycSA+IDApIHsKKwkJc3Bpbl9sb2NrX2lycXNh dmUoJmxvY2ssIGZsYWdzKTsKKwkJaWYgKHBjZl9wZW5kaW5nID09IDApIHsKKwkJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJmxvY2ssIGZsYWdzKTsKKwkJCWlmIChpbnRlcnJ1cHRpYmxlX3NsZWVw X29uX3RpbWVvdXQoJnBjZl93YWl0LAorCQkJCQkJCQl0aW1lb3V0KkhaKSkgeworCQkJCXNwaW5f bG9ja19pcnFzYXZlKCZsb2NrLCBmbGFncyk7CisJCQkJaWYgKHBjZl9wZW5kaW5nID09IDEpIHsK KwkJCQkJcGNmX3BlbmRpbmcgPSAwOworCQkJCX0KKwkJCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZsb2NrLCBmbGFncyk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlwY2ZfcGVuZGluZyA9IDA7CisJ CQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZsb2NrLCBmbGFncyk7CisJCX0KKwl9IGVsc2Ugewor CQl1ZGVsYXkoMTAwKTsKKwl9Cit9CisKKworc3RhdGljIGlycXJldHVybl90IHBjZl9lbnZjdHJs X2hhbmRsZXIoaW50IHRoaXNfaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpyZWdz KSB7CisJc3Bpbl9sb2NrKCZsb2NrKTsKKwlwY2ZfcGVuZGluZyA9IDE7CisJc3Bpbl91bmxvY2so JmxvY2spOworCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGNmX3dhaXQpOworCXJldHVybiBJUlFf SEFORExFRDsKK30KKworCitzdGF0aWMgaW50IHBjZl9lbnZjdHJsX2luaXQodm9pZCkKK3sKKwlz cGluX2xvY2tfaW5pdCgmbG9jayk7CisJaWYgKGlycSA+IDApIHsKKwkJaWYgKHJlcXVlc3RfaXJx KGlycSwgcGNmX2VudmN0cmxfaGFuZGxlciwgMCwgIlBDRjg1ODQiLCBOVUxMKSA8IDApIHsKKwkJ CXByaW50ayhLRVJOX0VSUiAiaTJjLWVudmN0cmw6IFJlcXVlc3QgaXJxJWQgZmFpbGVkXG4iLCBp cnEpOworCQkJaXJxID0gMDsKKwkJfSAKKwkJZWxzZSB7CisJCQllbmFibGVfaXJxKGlycSk7CisJ CX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaTJjX2FsZ29fcGNmX2RhdGEg cGNmX2VudmN0cmxfZGF0YSA9IHsKKwkuc2V0cGNmCSAgICA9IHBjZl9lbnZjdHJsX3NldGJ5dGUs CisJLmdldHBjZgkgICAgPSBwY2ZfZW52Y3RybF9nZXRieXRlLAorCS5nZXRvd24JICAgID0gcGNm X2VudmN0cmxfZ2V0b3duLAorCS5nZXRjbG9jayAgID0gcGNmX2VudmN0cmxfZ2V0Y2xvY2ssCisJ LndhaXRmb3JwaW4gPSBwY2ZfZW52Y3RybF93YWl0Zm9ycGluLAorCS51ZGVsYXkJICAgID0gMTAs CisJLm1kZWxheQkgICAgPSAxMCwKKwkudGltZW91dCAgICA9IDEwMCwKK307CisKK3N0YXRpYyBz dHJ1Y3QgaTJjX2FkYXB0ZXIgcGNmX2VudmN0cmxfb3BzID0geworCS5vd25lcgkJPSBUSElTX01P RFVMRSwKKwkuaWQJCT0gSTJDX0hXX1BfRUxFSywKKwkuYWxnb19kYXRhCT0gJnBjZl9lbnZjdHJs X2RhdGEsCisJLm5hbWUJCT0gIlBDRjg1ODQgYnVzIG5leHVzIGFkYXB0ZXIiLAorfTsKKworc3Rh dGljIGludCBfX2luaXQgaTJjX2VudmN0cmxfaW5pdCh2b2lkKSAKK3sKKwlzdHJ1Y3QgbGludXhf ZWJ1cyAqZWJ1cyA9IE5VTEw7CisJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2ID0gTlVM TDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgCisJZm9yX2VhY2hfZWJ1cyhlYnVzKSB7CisJCWZv cl9lYWNoX2VidXNkZXYoZWRldiwgZWJ1cykgeworCQkJLyogVE9ETzogY2hhbmdlIHRoaXMgdG8g b3BlcmF0ZSBvZmYgYXJyYXkgKi8KKwkJCWlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgIlNV TlcsZW52Y3RybHR3byIpKSB7CisJCQkJbmV4dXMudHlwZSA9IFRZUEVfRU5WQ1RSTFRXTzsKKwkJ CQlnb3RvIGRvbmU7CisJCQl9CisJCQllbHNlIGlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwg IlNVTlcsZW52Y3RybCIpKSB7CisJCQkJbmV4dXMudHlwZSA9IFRZUEVfRU5WQ1RSTDsKKwkJCQln b3RvIGRvbmU7CisJCQl9CisJCQllbHNlIGlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgIlNV TlcscmFzY3RybCIpKSB7CisJCQkJbmV4dXMudHlwZSA9IFRZUEVfUkFTQ1RSTDsKKwkJCQlnb3Rv IGRvbmU7CisJCQl9CisJCQllbHNlIGlmICghc3RyY21wKGVkZXYtPnByb21fbmFtZSwgImkyYyIp KSB7CisJCQkJbmV4dXMudHlwZSA9IFRZUEVfSTJDOworCQkJCWdvdG8gZG9uZTsKKwkJCX0KKwkJ fQorCX0KK2RvbmU6CisJaWYgKCFlZGV2KSB7CisJCXJldHVybiAtRU5PREVWOworCX0KKwluZXh1 cy5lZGV2ID0gZWRldjsKKworCWkyYyA9IGlvcmVtYXAoZWRldi0+cmVzb3VyY2VbMF0uc3RhcnQs IHNpemVvZihzdHJ1Y3QgcGNmODU4NF9yZWdzKSk7CisJaWYgKCFpMmMpIHsKKwkJcmV0dXJuIC1F SU5WQUw7CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmcGNmX3dhaXQpOworCisJaWYgKHBj Zl9lbnZjdHJsX2luaXQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoKG5leHVzLmkyY19p ZCA9IGkyY19wY2ZfYWRkX2J1cygmcGNmX2VudmN0cmxfb3BzKSkgPCAwKQorCQlnb3RvIGZhaWw7 CisKKwlwcmludGsoS0VSTl9JTkZPICJpMmMtZW52Y3RybDogJXMgUENGODU4NCBidXMgbmV4dXMg YXQgMHglbHhcbiIsCisJCWVkZXYtPnByb21fbmFtZSwgKHVuc2lnbmVkIGxvbmcpaTJjKTsKKwkK KwlyZXR1cm4gMDsKKworIGZhaWw6CisJaWYgKGlycSA+IDApIHsKKwkJZGlzYWJsZV9pcnEoaXJx KTsKKwkJZnJlZV9pcnEoaXJxLCBOVUxMKTsKKwl9CisKKwlyZXR1cm4gLUVOT0RFVjsKK30KKwor c3RhdGljIHZvaWQgaTJjX2VudmN0cmxfZXhpdCh2b2lkKQoreworCWkyY19wY2ZfZGVsX2J1cygm cGNmX2VudmN0cmxfb3BzKTsKKworCWlmIChpcnEgPiAwKSB7CisJCWRpc2FibGVfaXJxKGlycSk7 CisJCWZyZWVfaXJxKGlycSwgTlVMTCk7CisJfQorCisJaWYgKGkyYykgeworCQlpb3VubWFwKGky Yyk7CisJfQorfQorCitzdHJ1Y3QgcGNmX2VudmN0cmxfbmV4dXMgKiBwY2ZfZW52Y3RybF9nZXRf bmV4dXModm9pZCkKK3sKKwlyZXR1cm4gJm5leHVzOworfQorCitFWFBPUlRfU1lNQk9MKHBjZl9l bnZjdHJsX2dldF9uZXh1cyk7CisKK01PRFVMRV9BVVRIT1IoIkVyaWMgQnJvd2VyIDxlYnJvd2Vy QGdtYWlsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiUENGODU4NCBJMkMgYnVzIG5leHVz IGRyaXZlciBmb3IgU3VuIE1pY3Jvc3lzdGVtcyBlbnZjdHJsIik7CitNT0RVTEVfTElDRU5TRSgi R1BMIik7CisKK21vZHVsZV9wYXJhbShpcnEsIGludCwgMCk7Cittb2R1bGVfcGFyYW0oY2xvY2ss IGludCwgMCk7Cittb2R1bGVfcGFyYW0ob3duLCBpbnQsIDApOworCittb2R1bGVfaW5pdChpMmNf ZW52Y3RybF9pbml0KTsKK21vZHVsZV9leGl0KGkyY19lbnZjdHJsX2V4aXQpOwo9PT09PSBpbmNs dWRlL2FzbS1zcGFyYzY0L2kyYy1lbnZjdHJsLmggMS4xIHZzIGVkaXRlZCA9PT09PQotLS0gMS4x L2luY2x1ZGUvYXNtLXNwYXJjNjQvaTJjLWVudmN0cmwuaAkyMDA1LTAyLTAzIDEwOjEwOjM4IC0w ODowMAorKysgZWRpdGVkL2luY2x1ZGUvYXNtLXNwYXJjNjQvaTJjLWVudmN0cmwuaAkyMDA1LTAy LTAzIDEwOjEwOjU2IC0wODowMApAQCAtMCwwICsxLDIxIEBACisjaWZuZGVmIF9TUEFSQzY0X0ky Q19FTlZDVFJMCisjZGVmaW5lIF9TUEFSQzY0X0kyQ19FTlZDVFJMCisKK2VudW0gcGNmX2VudmN0 cmxfdHlwZXMgeworCVRZUEVfVU5LTk9XTiA9IDAsCisJVFlQRV9FTlZDVFJMID0gMSwKKwlUWVBF X0VOVkNUUkxUV08sCisJVFlQRV9SQVNDVFJMLAorCVRZUEVfSTJDLAorfTsKK3R5cGVkZWYgZW51 bSBwY2ZfZW52Y3RybF90eXBlcyBwY2ZfZW52Y3RybF90eXBlX3Q7CisKK3N0cnVjdCBwY2ZfZW52 Y3RybF9uZXh1cyB7CisJcGNmX2VudmN0cmxfdHlwZV90CSB0eXBlOworCWludAkJCSBpMmNfaWQ7 CisJc3RydWN0IGxpbnV4X2VidXNfZGV2aWNlICplZGV2OworfTsKKworZXh0ZXJuIHN0cnVjdCBw Y2ZfZW52Y3RybF9uZXh1cyAqIHBjZl9lbnZjdHJsX2dldF9uZXh1cyh2b2lkKTsKKworI2VuZGlm IC8qIF9TUEFSQzY0X0kyQ19FTlZDVFJMICovCg== ------=_Part_716_11853718.1109095675419--