Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v10,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180503205943.30687-2-benh@kernel.crashing.org> Date: Fri, 4 May 2018 06:59:43 +1000 To: linux-usb@vger.kernel.org Cc: Felipe Balbi , Greg KH , Joel Stanley , Andrew Jeffery , Benjamin Herrenschmidt List-ID: VGhlIEFzcGVlZCBCTUMgU29DcyBzdXBwb3J0IGEgInZpcnR1YWwgaHViIiBmdW5jdGlvbi4gSXQg cHJvdmlkZXMgc29tZQpIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBiZWhpbmQg d2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCgpUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9y IHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKaHViIHN0YW5kYXJkIHJlcXVl c3RzIGFuZCBleHBvc2luZyA1IFVEQyBnYWRnZXQgZHJpdmVycyBjb3JyZXNwb25kaW5nCnRvIHRo ZSBwb3J0cy4KClRoZSBodWIgaXRzZWxmIGhhcyBIVyBwcm92aWRlZCBkZWRpY2F0ZWQgRVAwIGFu ZCBFUDEgKHRoZSBsYXR0ZXIgZm9yCmh1YiBpbnRlcnJ1cHRzKS4gSXQgYWxzbyBoYXMgZGVkaWNh dGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgpvdGhlciBlbmRwb2ludHMsIHRoZXJlJ3Mg YSBwb29sIG9mIDE1ICJnZW5lcmljIiBlbmRwb2ludHMgdGhhdCBhcmUKc2hhcmVkIGFtb25nIHRo ZSBwb3J0cy4KClRoZSBkcml2ZXIgcmVsaWVzIG9uIG15IHByZXZpb3VzIHBhdGNoIGFkZGluZyBh ICJkaXNwb3NlIiBFUCBvcCB0bwpoYW5kbGUgRVAgYWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBF UHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFyZWQKcG9vbCBpbiB0aGUgVURDICJtYXRjaF9l cCIgY2FsbGJhY2sgYW5kIGFzc2lnbmVkIHRvIHRoZSBVREMgaW5zdGFuY2UKKGFkZGVkIHRvIHRo ZSBnYWRnZXQgZXBfbGlzdCkuCgpXaGVuIHRoZSBjb21wb3NpdGUgZHJpdmVyIGdldHMgdW5ib3Vu ZCwgdGhlIG5ldyBob29rIHdpbGwgYWxsb3cgdGhlIFVEQwp0byBjbGVhbiB0aGluZ3MgdXAgYW5k IHJldHVybiB0aG9zZSBFUHMgdG8gdGhlIHNoYXJlZCBwb29sLgoKU2lnbmVkLW9mZi1ieTogQmVu amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjEwLiAt IFNldCB0aGUgcG9ydCBjb25uZWN0aW9uIGNoYW5nZWQgc3RhdGUgYWZ0ZXIgcG93ZXIgb24gb2Yg YQogICAgICAgZG93bnN0cmVhbSBwb3J0IGlmIGl0IGhhcyBhbiBhdHRhY2hlZCBnYWRnZXQgb3Ig c29tZSBPU2VzCiAgICAgICB3aWxsIGZhaWwgdG8gcmUtZW51bWVyYXRlIHByb3Blcmx5IGFmdGVy IGEgVVNCIHJlc2V0LgoKdjkuIC0gRml4IGxvY2sgcmVjdXJzaW9uIGlzc3VlcyB3aGVuIHJlcGx5 aW5nIHRvIHN0YW5kYXJkIFNFVFVQCiAgICAgIHBhY2tldHMKICAgIC0gRml4IGxpZmV0aW1lIG9m IHRoZSBwb3J0X2RldiBzdHJ1Y3QgZGV2aWNlCgp2OC4gLSBSZXdvcmsgYXN0X3ZodWJfcmVwX2Rl c2MoKSB0byBhdm9pZCBpbmNvcnJlY3QgYnVpbHQgZXJyb3IKICAgICAgd2hlbiBmb3J0aWZ5IGlz IGVuYWJsZWQKICAgIC0gUmV3b3JrIGFzdF92aHViX3JlcF9zdHJpbmcoKSB0byB1c2UgdXNiX2dh ZGdldF9nZXRfc3RyaW5nKCkKICAgICAgaW5zdGVhZCBvZiBhIGxvY2FsIGNvcHkgb2YgYXNjaWky ZGVzYwogICAgLSBXaGl0ZXNwYWNlIGZpeGVzCgp2Ny4gLSBGaXggT0YgbWF0Y2ggbGlzdAogICAg LSBSZW1vdmUgdW51c2VkIHZhcmlhYmxlIGluIGh1YiBjb2RlCgp2Ni4gLSBGaXggYnVnIHdpdGgg MC1sZW5ndGggcGFja2V0cyBvbiBJTiBlbmRwb2ludHMgaW4gZGVzYyBtb2RlCgp2NS4gLSBSZW1v dmUgI2lmZGVmJ3MgYW5kIGhhcmQgY29kZWQgdmFsdWVzCiAgICAtIFJlbW92ZSBtb2R1bGUgcGFy YW1ldGVycwogICAgLSBIb25vciBtYXhpbXVtIHNwZWVkIGRldmljZS10cmVlIHByb3BlcnR5CiAg ICAtIFJlbW92ZSB1c2VsZXNzIGxpc3RfZW1wdHkgdGVzdAogICAgLSBDb3NtZXRpYy9zcGFjZXMg Zml4ZXMKICAgIC0gQWRkIFNQRFggbGljZW5jZSBpZGVudGlmaWVycwoKdjQuIC0gRml4IG1pc3Np bmcgdW5sb2NrIGFzdF92aHViX3VkY193YWtldXAoKSBlcnJvciBwYXRoCiAgICAtIE1ha2UgImly cSIgc2lnbmVkIHRvIGRlYWwgd2l0aCBlcnJvciBmcm9tIHBsYXRmb3JtX2dldF9pcnEKICAgIC0g Rml4IE1ha2VmaWxlIGZvciBtb2R1bGUgYnVpbGRzCiAgICAtIEZpeCBhIG1pc3NpbmcgZW5kaWFu IGNvbnZlcnNpb24KCnYzLiAtIFJlYmFzZWQKICAgIC0gQWRkIGNsayBzdHVmZgoKdjIuIC0gQ29z bWV0aWMgZml4ZXMKICAgIC0gUHJvcGVybHkgImFsbG9jYXRlIiBkZXZpY2UgYWRkcmVzc2VzIGlu c3RlYWQgb2YgdXNpbmcgYSBuZXZlcgogICAgICByZXNldCBjb3VudGVyCiAgICAtIE1vdmUgLmR0 c2kgdXBkYXRlcyB0byBhIGRpZmZlcmVudCBwYXRjaAoKZm9vCgpmb28KLS0tCiBkcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL0tjb25maWcgICAgICAgICAgICAgIHwgICAyICsKIGRyaXZlcnMvdXNiL2dh ZGdldC91ZGMvTWFrZWZpbGUgICAgICAgICAgICAgfCAgIDEgKwogZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnICB8ICAgNyArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRj L2FzcGVlZC12aHViL01ha2VmaWxlIHwgICA0ICsKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNw ZWVkLXZodWIvY29yZS5jICAgfCA0MjUgKysrKysrKysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi9kZXYuYyAgICB8IDU4OSArKysrKysrKysrKysrKwogZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYyAgICB8IDQ4NiArKysrKysrKysrKwogZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4uYyAgICB8IDg0MyArKysrKysrKysrKysr KysrKysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYyAgICB8IDgy OSArKysrKysrKysrKysrKysrKysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L3ZodWIuaCAgIHwgNTE0ICsrKysrKysrKysrKwogMTAgZmlsZXMgY2hhbmdlZCwgMzcwMCBpbnNl cnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3Bl ZWQtdmh1Yi9LY29uZmlnCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi9NYWtlZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvdXNiL2dh ZGdldC91ZGMvYXNwZWVkLXZodWIvY29yZS5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYwogY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZl cnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXAwLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBk cml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5jCiBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYwogY3JlYXRlIG1vZGUg MTAwNjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvdmh1Yi5oCgpkaWZmIC0t Z2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9LY29uZmlnCmluZGV4IDA4NzVkMzg0NzZlZS4uYjgzOGNhZWFhYWExIDEwMDY0NAotLS0g YS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9LY29uZmlnCkBAIC00MzgsNiArNDM4LDggQEAgY29uZmlnIFVTQl9HQURHRVRfWElMSU5Y CiAJICBkeW5hbWljYWxseSBsaW5rZWQgbW9kdWxlIGNhbGxlZCAidWRjLXhpbGlueCIgYW5kIGZv cmNlIGFsbAogCSAgZ2FkZ2V0IGRyaXZlcnMgdG8gYWxzbyBiZSBkeW5hbWljYWxseSBsaW5rZWQu CiAKK3NvdXJjZSAiZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnIgor CiAjCiAjIExBU1QgLS0gZHVtbXkvZW11bGF0ZWQgY29udHJvbGxlcgogIwpkaWZmIC0tZ2l0IGEv ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZSBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMv TWFrZWZpbGUKaW5kZXggY2U4NjViMTI5ZmQ2Li44OTdmNjQ4ZjNjZjEgMTAwNjQ0Ci0tLSBhL2Ry aXZlcnMvdXNiL2dhZGdldC91ZGMvTWFrZWZpbGUKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9NYWtlZmlsZQpAQCAtMzksNCArMzksNSBAQCBvYmotJChDT05GSUdfVVNCX01WX1UzRCkJKz0g bXZfdTNkX2NvcmUubwogb2JqLSQoQ09ORklHX1VTQl9HUl9VREMpCSs9IGdyX3VkYy5vCiBvYmot JChDT05GSUdfVVNCX0dBREdFVF9YSUxJTlgpCSs9IHVkYy14aWxpbngubwogb2JqLSQoQ09ORklH X1VTQl9TTlBfVURDX1BMQVQpICs9IHNucHNfdWRjX3BsYXQubworb2JqLSQoQ09ORklHX1VTQl9B U1BFRURfVkhVQikJKz0gYXNwZWVkLXZodWIvCiBvYmotJChDT05GSUdfVVNCX0JEQ19VREMpCSs9 IGJkYy8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2Nv bmZpZyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZwpuZXcgZmls ZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLmYwY2RmODliODUwMwotLS0gL2Rldi9u dWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZwpAQCAt MCwwICsxLDcgQEAKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCitjb25maWcg VVNCX0FTUEVFRF9WSFVCCisJdHJpc3RhdGUgIkFzcGVlZCB2SHViIFVEQyBkcml2ZXIiCisJZGVw ZW5kcyBvbiBBUkNIX0FTUEVFRCB8fCBDT01QSUxFX1RFU1QKKwloZWxwCisJICBVU0IgcGVyaXBo ZXJhbCBjb250cm9sbGVyIGZvciB0aGUgQXNwZWVkIEFTVDI1MDAgZmFtaWx5CisJICBTb0NzIHN1 cHBvcnRpbmcgdGhlICJ2SHViIiBmdW5jdGlvbmFsaXR5IGFuZCBVU0IyLjAKZGlmZiAtLWdpdCBh L2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFrZWZpbGUgYi9kcml2ZXJzL3Vz Yi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0Cmlu ZGV4IDAwMDAwMDAwMDAwMC4uOWYzYWRkNjA1ZjhlCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVy cy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZQpAQCAtMCwwICsxLDQgQEAKKyMg U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCitvYmotJChDT05GSUdfVVNCX0FTUEVF RF9WSFVCKQkrPSBhc3BlZWQtdmh1Yi5vCithc3BlZWQtdmh1Yi15CTo9IGNvcmUubyBlcDAubyBl cG4ubyBkZXYubyBodWIubworCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL2NvcmUuYyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvY29y ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZGIzNjI4YmUzOGMw Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9j b3JlLmMKQEAgLTAsMCArMSw0MjUgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wKworLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIg VVNCIGdhZGdldAorICoKKyAqIGNvcmUuYyAtIFRvcCBsZXZlbCBzdXBwb3J0CisgKgorICogQ29w eXJpZ2h0IDIwMTcgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVu ZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlz aGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAy IG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9k dWxlLmg+CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGlu dXgvZGVsYXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9z bGFiLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+ CisjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5o PgorI2luY2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+Cisj aW5jbHVkZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5j bHVkZSA8bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1 ZGUgPGxpbnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJ2aHViLmgiCisKK3ZvaWQgYXN0 X3ZodWJfZG9uZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpy ZXEsCisJCSAgIGludCBzdGF0dXMpCit7CisJYm9vbCBpbnRlcm5hbCA9IHJlcS0+aW50ZXJuYWw7 CisKKwlFUFZEQkcoZXAsICJjb21wbGV0aW5nIHJlcXVlc3QgQCVwLCBzdGF0dXMgJWRcbiIsIHJl cSwgc3RhdHVzKTsKKworCWxpc3RfZGVsX2luaXQoJnJlcS0+cXVldWUpOworCisJaWYgKHJlcS0+ cmVxLnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJCXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsK KworCWlmIChyZXEtPnJlcS5kbWEpIHsKKwkJaWYgKCFXQVJOX09OKCFlcC0+ZGV2KSkKKwkJCXVz Yl9nYWRnZXRfdW5tYXBfcmVxdWVzdCgmZXAtPmRldi0+Z2FkZ2V0LAorCQkJCQkJICZyZXEtPnJl cSwgZXAtPmVwbi5pc19pbik7CisJCXJlcS0+cmVxLmRtYSA9IDA7CisJfQorCisJLyoKKwkgKiBJ ZiB0aGlzIGlzbid0IGFuIGludGVybmFsIEVQMCByZXF1ZXN0LCBjYWxsIHRoZSBjb3JlCisJICog dG8gY2FsbCB0aGUgZ2FkZ2V0IGNvbXBsZXRpb24uCisJICovCisJaWYgKCFpbnRlcm5hbCkgewor CQlzcGluX3VubG9jaygmZXAtPnZodWItPmxvY2spOworCQl1c2JfZ2FkZ2V0X2dpdmViYWNrX3Jl cXVlc3QoJmVwLT5lcCwgJnJlcS0+cmVxKTsKKwkJc3Bpbl9sb2NrKCZlcC0+dmh1Yi0+bG9jayk7 CisJfQorfQorCit2b2lkIGFzdF92aHViX251a2Uoc3RydWN0IGFzdF92aHViX2VwICplcCwgaW50 IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisKKwlFUERCRyhlcCwgIk51 a2luZ1xuIik7CisKKwkvKiBCZXdhcmUsIGxvY2sgd2lsbCBiZSBkcm9wcGVkICYgcmVxLWFjcXVp cmVkIGJ5IGRvbmUoKSAqLworCXdoaWxlICghbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgeworCQly ZXEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZlcC0+cXVldWUsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEsIHF1 ZXVlKTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCBzdGF0dXMpOworCX0KK30KKworc3RydWN0 IHVzYl9yZXF1ZXN0ICphc3Rfdmh1Yl9hbGxvY19yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKnVfZXAs CisJCQkJCSAgIGdmcF90IGdmcF9mbGFncykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7 CisKKwlyZXEgPSBremFsbG9jKHNpemVvZigqcmVxKSwgZ2ZwX2ZsYWdzKTsKKwlpZiAoIXJlcSkK KwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuICZyZXEtPnJlcTsKK30KKwordm9pZCBhc3Rfdmh1Yl9m cmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3Jl cSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEgPSB0b19hc3RfcmVxKHVfcmVxKTsKKwor CWtmcmVlKHJlcSk7Cit9CisKK3N0YXRpYyBpcnFyZXR1cm5fdCBhc3Rfdmh1Yl9pcnEoaW50IGly cSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBkYXRhOworCWlycXJl dHVybl90IGlyZXQgPSBJUlFfTk9ORTsKKwl1MzIgaXN0YXQ7CisKKwkvKiBTdGFsZSBpbnRlcnJ1 cHQgd2hpbGUgdGVhcmluZyBkb3duICovCisJaWYgKCF2aHViLT5lcDBfYnVmcykKKwkJcmV0dXJu IElSUV9OT05FOworCisJc3Bpbl9sb2NrKCZ2aHViLT5sb2NrKTsKKworCS8qIFJlYWQgYW5kIEFD SyBpbnRlcnJ1cHRzICovCisJaXN0YXQgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfSVNS KTsKKwlpZiAoIWlzdGF0KQorCQlnb3RvIGJhaWw7CisJd3JpdGVsKGlzdGF0LCB2aHViLT5yZWdz ICsgQVNUX1ZIVUJfSVNSKTsKKwlpcmV0ID0gSVJRX0hBTkRMRUQ7CisKKwlVRENWREJHKHZodWIs ICJpcnEgc3RhdHVzPSUwOHgsIGVwX2Fja3M9JTA4eCBlcF9uYWNrcz0lMDh4XG4iLAorCSAgICAg ICBpc3RhdCwKKwkgICAgICAgcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JU1Ip LAorCSAgICAgICByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfTkFDS19JU1IpKTsKKwor CS8qIEhhbmRsZSBnZW5lcmljIEVQcyBmaXJzdCAqLworCWlmIChpc3RhdCAmIFZIVUJfSVJRX0VQ X1BPT0xfQUNLX1NUQUxMKSB7CisJCXUzMiBpLCBlcF9hY2tzID0gcmVhZGwodmh1Yi0+cmVncyAr IEFTVF9WSFVCX0VQX0FDS19JU1IpOworCQl3cml0ZWwoZXBfYWNrcywgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0VQX0FDS19JU1IpOworCisJCWZvciAoaSA9IDA7IGVwX2Fja3MgJiYgaSA8IEFTVF9W SFVCX05VTV9HRU5fRVBzOyBpKyspIHsKKwkJCXUzMiBtYXNrID0gVkhVQl9FUF9JUlEoaSk7CisJ CQlpZiAoZXBfYWNrcyAmIG1hc2spIHsKKwkJCQlhc3Rfdmh1Yl9lcG5fYWNrX2lycSgmdmh1Yi0+ ZXBuc1tpXSk7CisJCQkJZXBfYWNrcyAmPSB+bWFzazsKKwkJCX0KKwkJfQorCX0KKworCS8qIEhh bmRsZSBkZXZpY2UgaW50ZXJydXB0cyAqLworCWlmIChpc3RhdCAmIChWSFVCX0lSUV9ERVZJQ0Ux IHwKKwkJICAgICBWSFVCX0lSUV9ERVZJQ0UyIHwKKwkJICAgICBWSFVCX0lSUV9ERVZJQ0UzIHwK KwkJICAgICBWSFVCX0lSUV9ERVZJQ0U0IHwKKwkJICAgICBWSFVCX0lSUV9ERVZJQ0U1KSkgewor CQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UxKQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1 Yi0+cG9ydHNbMF0uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFMikKKwkJCWFz dF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzFdLmRldik7CisJCWlmIChpc3RhdCAmIFZIVUJf SVJRX0RFVklDRTMpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1syXS5kZXYpOwor CQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0U0KQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1 Yi0+cG9ydHNbM10uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFNSkKKwkJCWFz dF92aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzRdLmRldik7CisJfQorCisJLyogSGFuZGxlIHRv cC1sZXZlbCB2SHViIEVQMCBpbnRlcnJ1cHRzICovCisJaWYgKGlzdGF0ICYgKFZIVUJfSVJRX0hV Ql9FUDBfT1VUX0FDS19TVEFMTCB8CisJCSAgICAgVkhVQl9JUlFfSFVCX0VQMF9JTl9BQ0tfU1RB TEwgfAorCQkgICAgIFZIVUJfSVJRX0hVQl9FUDBfU0VUVVApKSB7CisJCWlmIChpc3RhdCAmIFZI VUJfSVJRX0hVQl9FUDBfSU5fQUNLX1NUQUxMKQorCQkJYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2so JnZodWItPmVwMCwgdHJ1ZSk7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0hVQl9FUDBfT1VUX0FD S19TVEFMTCkKKwkJCWFzdF92aHViX2VwMF9oYW5kbGVfYWNrKCZ2aHViLT5lcDAsIGZhbHNlKTsK KwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfSFVCX0VQMF9TRVRVUCkKKwkJCWFzdF92aHViX2VwMF9o YW5kbGVfc2V0dXAoJnZodWItPmVwMCk7CisJfQorCisJLyogVmFyaW91cyB0b3AgbGV2ZWwgYnVz IGV2ZW50cyAqLworCWlmIChpc3RhdCAmIChWSFVCX0lSUV9CVVNfUkVTVU1FIHwKKwkJICAgICBW SFVCX0lSUV9CVVNfU1VTUEVORCB8CisJCSAgICAgVkhVQl9JUlFfQlVTX1JFU0VUKSkgeworCQlp ZiAoaXN0YXQgJiBWSFVCX0lSUV9CVVNfUkVTVU1FKQorCQkJYXN0X3ZodWJfaHViX3Jlc3VtZSh2 aHViKTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfQlVTX1NVU1BFTkQpCisJCQlhc3Rfdmh1Yl9o dWJfc3VzcGVuZCh2aHViKTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfQlVTX1JFU0VUKQorCQkJ YXN0X3ZodWJfaHViX3Jlc2V0KHZodWIpOworCX0KKworIGJhaWw6CisJc3Bpbl91bmxvY2soJnZo dWItPmxvY2spOworCXJldHVybiBpcmV0OworfQorCit2b2lkIGFzdF92aHViX2luaXRfaHcoc3Ry dWN0IGFzdF92aHViICp2aHViKQoreworCXUzMiBjdHJsOworCisJVURDREJHKHZodWIsIihSZSlT dGFydGluZyBIVyAuLi5cbiIpOworCisJLyogRW5hYmxlIFBIWSAqLworCWN0cmwgPSBWSFVCX0NU UkxfUEhZX0NMSyB8CisJCVZIVUJfQ1RSTF9QSFlfUkVTRVRfRElTOworCisgICAgICAgLyoKKwkq IFdlIGRvICpOT1QqIHNldCB0aGUgVkhVQl9DVFJMX0NMS19TVE9QX1NVU1BFTkQgYml0CisJKiB0 byBzdG9wIHRoZSBsb2dpYyBjbG9jayBkdXJpbmcgc3VzcGVuZCBiZWNhdXNlCisJKiBpdCBjYXVz ZXMgdGhlIHJlZ2lzdGVycyB0byBiZWNvbWUgaW5hY2Nlc3NpYmxlIGFuZAorCSogd2UgaGF2ZW4n dCB5ZXQgZmlndXJlZCBvdXQgYSBnb29kIHdheXQgdG8gYnJpbmcgdGhlCisJKiBjb250cm9sbGVy IGJhY2sgaW50byBsaWZlIHRvIGlzc3VlIGEgd2FrZXVwLgorCSovCisKKwkvKgorCSAqIFNldCBz b21lIElTTyAmIHNwbGl0IGNvbnRyb2wgYml0cyBhY2NvcmRpbmcgdG8gQXNwZWVkCisJICogcmVj b21tZW5kYXRpb24KKwkgKgorCSAqIFZIVUJfQ1RSTF9JU09fUlNQX0NUUkw6IFdoZW4gc2V0IHRl bGxzIHRoZSBIVyB0byByZXNwb25kCisJICogd2l0aCAwIGJ5dGVzIGRhdGEgcGFja2V0IHRvIElT TyBJTiBlbmRwb2ludHMgd2hlbiBubyBkYXRhCisJICogaXMgYXZhaWxhYmxlLgorCSAqCisJICog VkhVQl9DVFJMX1NQTElUX0lOOiBUaGlzIG1ha2VzIGEgU09GIGNvbXBsZXRlIGEgc3BsaXQgSU4K KwkgKiB0cmFuc2FjdGlvbi4KKwkgKi8KKwljdHJsIHw9IFZIVUJfQ1RSTF9JU09fUlNQX0NUUkwg fCBWSFVCX0NUUkxfU1BMSVRfSU47CisJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhV Ql9DVFJMKTsKKwl1ZGVsYXkoMSk7CisKKwkvKiBTZXQgZGVzY3JpcHRvciByaW5nIHNpemUgKi8K KwlpZiAoQVNUX1ZIVUJfREVTQ1NfQ09VTlQgPT0gMjU2KSB7CisJCWN0cmwgfD0gVkhVQl9DVFJM X0xPTkdfREVTQzsKKwkJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsK Kwl9IGVsc2UgeworCQlCVUlMRF9CVUdfT04oQVNUX1ZIVUJfREVTQ1NfQ09VTlQgIT0gMzIpOwor CX0KKworCS8qIFJlc2V0IGFsbCBkZXZpY2VzICovCisJd3JpdGVsKFZIVUJfU1dfUkVTRVRfQUxM LCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfU1dfUkVTRVQpOworCXVkZWxheSgxKTsKKwl3cml0ZWwo MCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX1NXX1JFU0VUKTsKKworCS8qIERpc2FibGUgYW5kIGNs ZWFudXAgRVAgQUNLL05BQ0sgaW50ZXJydXB0cyAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsg QVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9F UF9OQUNLX0lFUik7CisJd3JpdGVsKFZIVUJfRVBfSVJRX0FMTCwgdmh1Yi0+cmVncyArIEFTVF9W SFVCX0VQX0FDS19JU1IpOworCXdyaXRlbChWSFVCX0VQX0lSUV9BTEwsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9FUF9OQUNLX0lTUik7CisKKwkvKiBEZWZhdWx0IHNldHRpbmdzIGZvciBFUDAsIGVu YWJsZSBIVyBodWIgRVAxICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDBf Q1RSTCk7CisJd3JpdGVsKFZIVUJfRVAxX0NUUkxfUkVTRVRfVE9HR0xFIHwKKwkgICAgICAgVkhV Ql9FUDFfQ1RSTF9FTkFCTEUsCisJICAgICAgIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfQ1RS TCk7CisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDFfU1RTX0NIRyk7CisKKwkv KiBDb25maWd1cmUgRVAwIERNQSBidWZmZXIgKi8KKwl3cml0ZWwodmh1Yi0+ZXAwLmJ1Zl9kbWEs IHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUDBfREFUQSk7CisKKwkvKiBDbGVhciBhZGRyZXNzICov CisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DT05GKTsKKworCS8qIFB1bGx1cCBo dWIgKGFjdGl2YXRlIG9uIGhvc3QpICovCisJaWYgKHZodWItPmZvcmNlX3VzYjEpCisJCWN0cmwg fD0gVkhVQl9DVFJMX0ZVTExfU1BFRURfT05MWTsKKworCWN0cmwgfD0gVkhVQl9DVFJMX1VQU1RS RUFNX0NPTk5FQ1Q7CisJd3JpdGVsKGN0cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsK KworCS8qIEVuYWJsZSBzb21lIGludGVycnVwdHMgKi8KKwl3cml0ZWwoVkhVQl9JUlFfSFVCX0VQ MF9JTl9BQ0tfU1RBTEwgfAorCSAgICAgICBWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwg fAorCSAgICAgICBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQIHwKKwkgICAgICAgVkhVQl9JUlFfRVBf UE9PTF9BQ0tfU1RBTEwgfAorCSAgICAgICBWSFVCX0lSUV9CVVNfUkVTVU1FIHwKKwkgICAgICAg VkhVQl9JUlFfQlVTX1NVU1BFTkQgfAorCSAgICAgICBWSFVCX0lSUV9CVVNfUkVTRVQsCisJICAg ICAgIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworfQorCitzdGF0aWMgaW50IGFzdF92aHVi X3JlbW92ZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQoreworCXN0cnVjdCBhc3Rfdmh1 YiAqdmh1YiA9IHBsYXRmb3JtX2dldF9kcnZkYXRhKHBkZXYpOworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisJaW50IGk7CisKKwlpZiAoIXZodWIgfHwgIXZodWItPnJlZ3MpCisJCXJldHVybiAwOwor CisJLyogUmVtb3ZlIGRldmljZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX1BP UlRTOyBpKyspCisJCWFzdF92aHViX2RlbF9kZXYoJnZodWItPnBvcnRzW2ldLmRldik7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogTWFzayAmIGFjayBh bGwgaW50ZXJydXB0cyAgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7 CisJd3JpdGVsKFZIVUJfSVJRX0FDS19BTEwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOwor CisJLyogUHVsbCBkZXZpY2UsIGxlYXZlIFBIWSBlbmFibGVkICovCisJd3JpdGVsKFZIVUJfQ1RS TF9QSFlfQ0xLIHwKKwkgICAgICAgVkhVQl9DVFJMX1BIWV9SRVNFVF9ESVMsCisJICAgICAgIHZo dWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKKworCWlmICh2aHViLT5jbGspCisJCWNsa19kaXNh YmxlX3VucHJlcGFyZSh2aHViLT5jbGspOworCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdmh1 Yi0+bG9jaywgZmxhZ3MpOworCisJaWYgKHZodWItPmVwMF9idWZzKQorCQlkbWFfZnJlZV9jb2hl cmVudCgmcGRldi0+ZGV2LAorCQkJCSAgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKgorCQkJCSAg KEFTVF9WSFVCX05VTV9QT1JUUyArIDEpLAorCQkJCSAgdmh1Yi0+ZXAwX2J1ZnMsCisJCQkJICB2 aHViLT5lcDBfYnVmc19kbWEpOworCXZodWItPmVwMF9idWZzID0gTlVMTDsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2Ug KnBkZXYpCit7CisJZW51bSB1c2JfZGV2aWNlX3NwZWVkIG1heF9zcGVlZDsKKwlzdHJ1Y3QgYXN0 X3ZodWIgKnZodWI7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIHJjID0gMDsKKwor CXZodWIgPSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp2aHViKSwgR0ZQX0tFUk5F TCk7CisJaWYgKCF2aHViKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZ2 aHViLT5sb2NrKTsKKwl2aHViLT5wZGV2ID0gcGRldjsKKworCXJlcyA9IHBsYXRmb3JtX2dldF9y ZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJdmh1Yi0+cmVncyA9IGRldm1faW9y ZW1hcF9yZXNvdXJjZSgmcGRldi0+ZGV2LCByZXMpOworCWlmIChJU19FUlIodmh1Yi0+cmVncykp IHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIG1hcCByZXNvdXJjZXNcbiIpOwor CQlyZXR1cm4gUFRSX0VSUih2aHViLT5yZWdzKTsKKwl9CisJVURDREJHKHZodWIsICJ2SHViQCVw UiBtYXBwZWQgQCVwXG4iLCByZXMsIHZodWItPnJlZ3MpOworCisJcGxhdGZvcm1fc2V0X2RydmRh dGEocGRldiwgdmh1Yik7CisKKwl2aHViLT5jbGsgPSBkZXZtX2Nsa19nZXQoJnBkZXYtPmRldiwg TlVMTCk7CisJaWYgKElTX0VSUih2aHViLT5jbGspKSB7CisJCXJjID0gUFRSX0VSUih2aHViLT5j bGspOworCQlnb3RvIGVycjsKKwl9CisJcmMgPSBjbGtfcHJlcGFyZV9lbmFibGUodmh1Yi0+Y2xr KTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRXJyb3IgY291bGRuJ3QgZW5h YmxlIGNsb2NrICglZClcbiIsIHJjKTsKKwkJZ290byBlcnI7CisJfQorCisJLyogQ2hlY2sgaWYg d2UgbmVlZCB0byBsaW1pdCB0aGUgSFcgdG8gVVNCMSAqLworCW1heF9zcGVlZCA9IHVzYl9nZXRf bWF4aW11bV9zcGVlZCgmcGRldi0+ZGV2KTsKKwlpZiAobWF4X3NwZWVkICE9IFVTQl9TUEVFRF9V TktOT1dOICYmIG1heF9zcGVlZCA8IFVTQl9TUEVFRF9ISUdIKQorCQl2aHViLT5mb3JjZV91c2Ix ID0gdHJ1ZTsKKworCS8qIE1hc2sgJiBhY2sgYWxsIGludGVycnVwdHMgYmVmb3JlIGluc3RhbGxp bmcgdGhlIGhhbmRsZXIgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7 CisJd3JpdGVsKFZIVUJfSVJRX0FDS19BTEwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9JU1IpOwor CisJLyogRmluZCBpbnRlcnJ1cHQgYW5kIGluc3RhbGwgaGFuZGxlciAqLworCXZodWItPmlycSA9 IHBsYXRmb3JtX2dldF9pcnEocGRldiwgMCk7CisJaWYgKHZodWItPmlycSA8IDApIHsKKwkJZGV2 X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIGdldCBpbnRlcnJ1cHRcbiIpOworCQlyYyA9IHZo dWItPmlycTsKKwkJZ290byBlcnI7CisJfQorCXJjID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ ZGV2LCB2aHViLT5pcnEsIGFzdF92aHViX2lycSwgMCwKKwkJCSAgICAgIEtCVUlMRF9NT0ROQU1F LCB2aHViKTsKKwlpZiAocmMpIHsKKwkJZGV2X2VycigmcGRldi0+ZGV2LCAiRmFpbGVkIHRvIHJl cXVlc3QgaW50ZXJydXB0XG4iKTsKKwkJZ290byBlcnI7CisJfQorCisJLyoKKwkgKiBBbGxvY2F0 ZSBETUEgYnVmZmVycyBmb3IgYWxsIEVQMHMgaW4gb25lIGNodW5rLAorCSAqIG9uZSBwZXIgcG9y dCBhbmQgb25lIGZvciB0aGUgdkh1YiBpdHNlbGYKKwkgKi8KKwl2aHViLT5lcDBfYnVmcyA9IGRt YV9hbGxvY19jb2hlcmVudCgmcGRldi0+ZGV2LAorCQkJCQkgICAgQVNUX1ZIVUJfRVAwX01BWF9Q QUNLRVQgKgorCQkJCQkgICAgKEFTVF9WSFVCX05VTV9QT1JUUyArIDEpLAorCQkJCQkgICAgJnZo dWItPmVwMF9idWZzX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aHViLT5lcDBfYnVmcykgewor CQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gYWxsb2NhdGUgRVAwIERNQSBidWZmZXJz XG4iKTsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIGVycjsKKwl9CisJVURDVkRCRyh2aHViLCAi RVAwIERNQSBidWZmZXJzIEAlcCAoRE1BIDB4JTA4eClcbiIsCisJCXZodWItPmVwMF9idWZzLCAo dTMyKXZodWItPmVwMF9idWZzX2RtYSk7CisKKwkvKiBJbml0IHZIdWIgRVAwICovCisJYXN0X3Zo dWJfaW5pdF9lcDAodmh1YiwgJnZodWItPmVwMCwgTlVMTCk7CisKKwkvKiBJbml0IGRldmljZXMg Ki8KKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX1BPUlRTICYmIHJjID09IDA7IGkrKykK KwkJcmMgPSBhc3Rfdmh1Yl9pbml0X2Rldih2aHViLCBpKTsKKwlpZiAocmMpCisJCWdvdG8gZXJy OworCisJLyogSW5pdCBodWIgZW11bGF0aW9uICovCisJYXN0X3ZodWJfaW5pdF9odWIodmh1Yik7 CisKKwkvKiBJbml0aWFsaXplIEhXICovCisJYXN0X3ZodWJfaW5pdF9odyh2aHViKTsKKworCWRl dl9pbmZvKCZwZGV2LT5kZXYsICJJbml0aWFsaXplZCB2aXJ0dWFsIGh1YiBpbiBVU0IlZCBtb2Rl XG4iLAorCQkgdmh1Yi0+Zm9yY2VfdXNiMSA/IDEgOiAyKTsKKworCXJldHVybiAwOworIGVycjoK Kwlhc3Rfdmh1Yl9yZW1vdmUocGRldik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3Qg c3RydWN0IG9mX2RldmljZV9pZCBhc3Rfdmh1Yl9kdF9pZHNbXSA9IHsKKwl7CisJCS5jb21wYXRp YmxlID0gImFzcGVlZCxhc3QyNDAwLXVzYi12aHViIiwKKwl9LAorCXsKKwkJLmNvbXBhdGlibGUg PSAiYXNwZWVkLGFzdDI1MDAtdXNiLXZodWIiLAorCX0sCisJeyB9Cit9OworTU9EVUxFX0RFVklD RV9UQUJMRShvZiwgYXN0X3ZodWJfZHRfaWRzKTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9k cml2ZXIgYXN0X3ZodWJfZHJpdmVyID0geworCS5wcm9iZQkJPSBhc3Rfdmh1Yl9wcm9iZSwKKwku cmVtb3ZlCQk9IGFzdF92aHViX3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBLQlVJ TERfTU9ETkFNRSwKKwkJLm9mX21hdGNoX3RhYmxlCT0gYXN0X3ZodWJfZHRfaWRzLAorCX0sCit9 OworbW9kdWxlX3BsYXRmb3JtX2RyaXZlcihhc3Rfdmh1Yl9kcml2ZXIpOworCitNT0RVTEVfREVT Q1JJUFRJT04oIkFzcGVlZCB2SHViIHVkYyBkcml2ZXIiKTsKK01PRFVMRV9BVVRIT1IoIkJlbmph bWluIEhlcnJlbnNjaG1pZHQgPGJlbmhAa2VybmVsLmNyYXNoaW5nLm9yZz4iKTsKK01PRFVMRV9M SUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVk LXZodWIvZGV2LmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uZjAyMzM5MTJiYWNlCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYwpA QCAtMCwwICsxLDU4OSBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisv KgorICogYXNwZWVkLXZodWIgLS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2Fk Z2V0CisgKgorICogZGV2LmMgLSBJbmRpdmlkdWFsIGRldmljZS9nYWRnZXQgbWFuYWdlbWVudCAo aWUsIGEgcG9ydCA9IGEgZ2FkZ2V0KQorICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3Jh dGlvbgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlz dHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdO VSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29m dHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAq IChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxp bnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4 L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8 bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4 L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVm ZXRjaC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRn ZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4K KyNpbmNsdWRlIDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5o PgorI2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKwor I2luY2x1ZGUgInZodWIuaCIKKwordm9pZCBhc3Rfdmh1Yl9kZXZfaXJxKHN0cnVjdCBhc3Rfdmh1 Yl9kZXYgKmQpCit7CisJdTMyIGlzdGF0ID0gcmVhZGwoZC0+cmVncyArIEFTVF9WSFVCX0RFVl9J U1IpOworCisJd3JpdGVsKGlzdGF0LCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0lTUik7CisKKwlp ZiAoaXN0YXQgJiBWSFVWX0RFVl9JUlFfRVAwX0lOX0FDS19TVEFMTCkKKwkJYXN0X3ZodWJfZXAw X2hhbmRsZV9hY2soJmQtPmVwMCwgdHJ1ZSk7CisJaWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJRX0VQ MF9PVVRfQUNLX1NUQUxMKQorCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2FjaygmZC0+ZXAwLCBmYWxz ZSk7CisJaWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJRX0VQMF9TRVRVUCkKKwkJYXN0X3ZodWJfZXAw X2hhbmRsZV9zZXR1cCgmZC0+ZXAwKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X2Vu YWJsZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCXUzMiByZWcsIGhtc2s7CisKKwlpZiAo ZC0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJLyogRW5hYmxlIGRldmljZSBhbmQgaXRzIEVQMCBp bnRlcnJ1cHRzICovCisJcmVnID0gVkhVQl9ERVZfRU5fRU5BQkxFX1BPUlQgfAorCQlWSFVCX0RF Vl9FTl9FUDBfSU5fQUNLX0lSUUVOIHwKKwkJVkhVQl9ERVZfRU5fRVAwX09VVF9BQ0tfSVJRRU4g fAorCQlWSFVCX0RFVl9FTl9FUDBfU0VUVVBfSVJRRU47CisJaWYgKGQtPmdhZGdldC5zcGVlZCA9 PSBVU0JfU1BFRURfSElHSCkKKwkJcmVnIHw9IFZIVUJfREVWX0VOX1NQRUVEX1NFTF9ISUdIOwor CXdyaXRlbChyZWcsIGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRU5fQ1RSTCk7CisKKwkvKiBFbmFi bGUgZGV2aWNlIGludGVycnVwdCBpbiB0aGUgaHViIGFzIHdlbGwgKi8KKwlobXNrID0gVkhVQl9J UlFfREVWSUNFMSA8PCBkLT5pbmRleDsKKwlyZWcgPSByZWFkbChkLT52aHViLT5yZWdzICsgQVNU X1ZIVUJfSUVSKTsKKwlyZWcgfD0gaG1zazsKKwl3cml0ZWwocmVnLCBkLT52aHViLT5yZWdzICsg QVNUX1ZIVUJfSUVSKTsKKworCS8qIFNldCBFUDAgRE1BIGJ1ZmZlciBhZGRyZXNzICovCisJd3Jp dGVsKGQtPmVwMC5idWZfZG1hLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VQMF9EQVRBKTsKKwor CWQtPmVuYWJsZWQgPSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfZGlzYWJs ZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCXUzMiByZWcsIGhtc2s7CisKKwlpZiAoIWQt PmVuYWJsZWQpCisJCXJldHVybjsKKworCS8qIERpc2FibGUgZGV2aWNlIGludGVycnVwdCBpbiB0 aGUgaHViICovCisJaG1zayA9IFZIVUJfSVJRX0RFVklDRTEgPDwgZC0+aW5kZXg7CisJcmVnID0g cmVhZGwoZC0+dmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisJcmVnICY9IH5obXNrOworCXdy aXRlbChyZWcsIGQtPnZodWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworCisJLyogVGhlbiBkaXNh YmxlIGRldmljZSAqLworCXdyaXRlbCgwLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwp OworCWQtPmdhZGdldC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCWQtPmVuYWJsZWQgPSBm YWxzZTsKKwlkLT5zdXNwZW5kZWQgPSBmYWxzZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9k ZXZfZmVhdHVyZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJCXUxNiB3SW5kZXgsIHUxNiB3 VmFsdWUsCisJCQkJYm9vbCBpc19zZXQpCit7CisJRERCRyhkLCAiJXNfRkVBVFVSRShkZXYgdmFs PSUwMngpXG4iLAorCSAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xFQVIiLCB3VmFsdWUpOworCisJ aWYgKHdWYWx1ZSAhPSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApCisJCXJldHVybiBzdGRfcmVx X2RyaXZlcjsKKworCWQtPndha2V1cF9lbiA9IGlzX3NldDsKKworCXJldHVybiBzdGRfcmVxX2Nv bXBsZXRlOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2VwX2ZlYXR1cmUoc3RydWN0IGFzdF92 aHViX2RldiAqZCwKKwkJCSAgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLCBib29sIGlzX3Nl dCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwOworCWludCBlcF9udW07CisKKwllcF9udW0g PSB3SW5kZXggJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJRERCRyhkLCAiJXNfRkVBVFVS RShlcCVkIHZhbD0lMDJ4KVxuIiwKKwkgICAgIGlzX3NldCA/ICJTRVQiIDogIkNMRUFSIiwgZXBf bnVtLCB3VmFsdWUpOworCWlmIChlcF9udW0gPT0gMCkKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxl dGU7CisJaWYgKGVwX251bSA+PSBBU1RfVkhVQl9OVU1fR0VOX0VQcyB8fCAhZC0+ZXBuc1tlcF9u dW0gLSAxXSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKHdWYWx1ZSAhPSBVU0JfRU5E UE9JTlRfSEFMVCkKKwkJcmV0dXJuIHN0ZF9yZXFfZHJpdmVyOworCisJZXAgPSBkLT5lcG5zW2Vw X251bSAtIDFdOworCWlmIChXQVJOX09OKCFlcCkpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOwor CisJaWYgKCFlcC0+ZXBuLmVuYWJsZWQgfHwgIWVwLT5lcC5kZXNjIHx8IGVwLT5lcG4uaXNfaXNv IHx8CisJICAgIGVwLT5lcG4uaXNfaW4gIT0gISEod0luZGV4ICYgVVNCX0RJUl9JTikpCisJCXJl dHVybiBzdGRfcmVxX3N0YWxsOworCisJRERCRyhkLCAiJXMgc3RhbGwgb24gRVAgJWRcbiIsCisJ ICAgICBpc19zZXQgPyAic2V0dGluZyIgOiAiY2xlYXJpbmciLCBlcF9udW0pOworCWVwLT5lcG4u c3RhbGxlZCA9IGlzX3NldDsKKwlhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKGVwKTsKKworCXJl dHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Rldl9zdGF0 dXMoc3RydWN0IGFzdF92aHViX2RldiAqZCwKKwkJCSAgICAgICB1MTYgd0luZGV4LCB1MTYgd1Zh bHVlKQoreworCXU4IHN0MDsKKworCUREQkcoZCwgIkdFVF9TVEFUVVMoZGV2KVxuIik7CisKKwlz dDAgPSBkLT5nYWRnZXQuaXNfc2VsZnBvd2VyZWQgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQ7 CisJaWYgKGQtPndha2V1cF9lbikKKwkJc3QwIHw9IDEgPDwgVVNCX0RFVklDRV9SRU1PVEVfV0FL RVVQOworCisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseSgmZC0+ZXAwLCBzdDAsIDApOwor fQorCitzdGF0aWMgaW50IGFzdF92aHViX2VwX3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpk LAorCQkJICAgICAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sKKwlpbnQgZXBfbnVtID0gd0lu ZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7 CisJdTggc3QwID0gMDsKKworCUREQkcoZCwgIkdFVF9TVEFUVVMoZXAlZClcbiIsIGVwX251bSk7 CisKKwlpZiAoZXBfbnVtID49IEFTVF9WSFVCX05VTV9HRU5fRVBzKQorCQlyZXR1cm4gc3RkX3Jl cV9zdGFsbDsKKwlpZiAoZXBfbnVtICE9IDApIHsKKwkJZXAgPSBkLT5lcG5zW2VwX251bSAtIDFd OworCQlpZiAoIWVwKQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCWlmICghZXAtPmVwbi5l bmFibGVkIHx8ICFlcC0+ZXAuZGVzYyB8fCBlcC0+ZXBuLmlzX2lzbyB8fAorCQkgICAgZXAtPmVw bi5pc19pbiAhPSAhISh3SW5kZXggJiBVU0JfRElSX0lOKSkKKwkJCXJldHVybiBzdGRfcmVxX3N0 YWxsOworCQlpZiAoZXAtPmVwbi5zdGFsbGVkKQorCQkJc3QwIHw9IDEgPDwgVVNCX0VORFBPSU5U X0hBTFQ7CisJfQorCisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseSgmZC0+ZXAwLCBzdDAs IDApOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfc2V0X2FkZHJlc3Moc3RydWN0IGFz dF92aHViX2RldiAqZCwgdTggYWRkcikKK3sKKwl1MzIgcmVnOworCisJRERCRyhkLCAiU0VUX0FE RFJFU1M6IEdvdCBhZGRyZXNzICV4XG4iLCBhZGRyKTsKKworCXJlZyA9IHJlYWRsKGQtPnJlZ3Mg KyBBU1RfVkhVQl9ERVZfRU5fQ1RSTCk7CisJcmVnICY9IH5WSFVCX0RFVl9FTl9BRERSX01BU0s7 CisJcmVnIHw9IFZIVUJfREVWX0VOX1NFVF9BRERSKGFkZHIpOworCXdyaXRlbChyZWcsIGQtPnJl Z3MgKyBBU1RfVkhVQl9ERVZfRU5fQ1RSTCk7Cit9CisKK2ludCBhc3Rfdmh1Yl9zdGRfZGV2X3Jl cXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAgc3RydWN0IHVzYl9jdHJscmVx dWVzdCAqY3JxKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSBlcC0+ZGV2OworCXUxNiB3 VmFsdWUsIHdJbmRleDsKKworCS8qIE5vIGRyaXZlciwgd2Ugc2hvdWxkbid0IGJlIGVuYWJsZWQg Li4uICovCisJaWYgKCFkLT5kcml2ZXIgfHwgIWQtPmVuYWJsZWQgfHwgZC0+c3VzcGVuZGVkKSB7 CisJCUVQREJHKGVwLAorCQkgICAgICAiRGV2aWNlIGlzIHdyb25nIHN0YXRlIGRyaXZlcj0lcCBl bmFibGVkPSVkIgorCQkgICAgICAiIHN1c3BlbmRlZD0lZFxuIiwKKwkJICAgICAgZC0+ZHJpdmVy LCBkLT5lbmFibGVkLCBkLT5zdXNwZW5kZWQpOworCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwl9 CisKKwkvKiBGaXJzdCBwYWNrZXQsIGdyYWIgc3BlZWQgKi8KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVk ID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCWQtPmdhZGdldC5zcGVlZCA9IGVwLT52aHViLT5z cGVlZDsKKwkJaWYgKGQtPmdhZGdldC5zcGVlZCA+IGQtPmRyaXZlci0+bWF4X3NwZWVkKQorCQkJ ZC0+Z2FkZ2V0LnNwZWVkID0gZC0+ZHJpdmVyLT5tYXhfc3BlZWQ7CisJCUREQkcoZCwgImZpc3Qg cGFja2V0LCBjYXB0dXJlZCBzcGVlZCAlZFxuIiwKKwkJICAgICBkLT5nYWRnZXQuc3BlZWQpOwor CX0KKworCXdWYWx1ZSA9IGxlMTZfdG9fY3B1KGNycS0+d1ZhbHVlKTsKKwl3SW5kZXggPSBsZTE2 X3RvX2NwdShjcnEtPndJbmRleCk7CisKKwlzd2l0Y2ggKChjcnEtPmJSZXF1ZXN0VHlwZSA8PCA4 KSB8IGNycS0+YlJlcXVlc3QpIHsKKwkJLyogU0VUX0FERFJFU1MgKi8KKwljYXNlIERldmljZU91 dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9BRERSRVNTOgorCQlhc3Rfdmh1Yl9kZXZfc2V0X2FkZHJl c3MoZCwgd1ZhbHVlKTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX1NU QVRVUyAqLworCWNhc2UgRGV2aWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0 dXJuIGFzdF92aHViX2Rldl9zdGF0dXMoZCwgd0luZGV4LCB3VmFsdWUpOworCWNhc2UgSW50ZXJm YWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBs ZV9yZXBseShlcCwgMCwgMCk7CisJY2FzZSBFbmRwb2ludFJlcXVlc3QgfCBVU0JfUkVRX0dFVF9T VEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9lcF9zdGF0dXMoZCwgd0luZGV4LCB3VmFsdWUpOwor CisJCS8qIFNFVC9DTEVBUl9GRUFUVVJFICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNC X1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2Rldl9mZWF0dXJlKGQsIHdJbmRl eCwgd1ZhbHVlLCB0cnVlKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFS X0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9kZXZfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1 ZSwgZmFsc2UpOworCWNhc2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVS RToKKwkJcmV0dXJuIGFzdF92aHViX2VwX2ZlYXR1cmUoZCwgd0luZGV4LCB3VmFsdWUsIHRydWUp OworCWNhc2UgRW5kcG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQly ZXR1cm4gYXN0X3ZodWJfZXBfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCX0K KwlyZXR1cm4gc3RkX3JlcV9kcml2ZXI7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3dh a2V1cChzdHJ1Y3QgdXNiX2dhZGdldCogZ2FkZ2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYg KmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMg PSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsK KwlpZiAoIWQtPndha2V1cF9lbikKKwkJZ290byBlcnI7CisKKwlEREJHKGQsICJEZXZpY2UgaW5p dGlhdGVkIHdha2V1cFxuIik7CisKKwkvKiBXYWtldXAgdGhlIGhvc3QgKi8KKwlhc3Rfdmh1Yl9o dWJfd2FrZV9hbGwoZC0+dmh1Yik7CisJcmMgPSAwOworIGVycjoKKwlzcGluX3VubG9ja19pcnFy ZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMg aW50IGFzdF92aHViX3VkY19nZXRfZnJhbWUoc3RydWN0IHVzYl9nYWRnZXQqIGdhZGdldCkKK3sK KwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2RldihnYWRnZXQpOworCisJcmV0dXJu IChyZWFkbChkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfVVNCU1RTKSA+PiAxNikgJiAweDdmZjsK K30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X251a2Uoc3RydWN0IGFzdF92aHViX2RldiAq ZCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1f R0VOX0VQczsgaSsrKSB7CisJCWlmICghZC0+ZXBuc1tpXSkKKwkJCWNvbnRpbnVlOworCQlhc3Rf dmh1Yl9udWtlKGQtPmVwbnNbaV0sIC1FU0hVVERPV04pOworCX0KK30KKworc3RhdGljIGludCBh c3Rfdmh1Yl91ZGNfcHVsbHVwKHN0cnVjdCB1c2JfZ2FkZ2V0KiBnYWRnZXQsIGludCBvbikKK3sK KwlzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkID0gdG9fYXN0X2RldihnYWRnZXQpOworCXVuc2lnbmVk IGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3Mp OworCisJRERCRyhkLCAicHVsbHVwKCVkKVxuIiwgb24pOworCisJLyogTWFyayBkaXNjb25uZWN0 ZWQgaW4gdGhlIGh1YiAqLworCWFzdF92aHViX2RldmljZV9jb25uZWN0KGQtPnZodWIsIGQtPmlu ZGV4LCBvbik7CisKKwkvKgorCSAqIElmIGVuYWJsZWQsIG51a2UgYWxsIHJlcXVlc3RzIGlmIGFu eSAodGhlcmUgc2hvdWxkbid0IGJlKQorCSAqIGFuZCBkaXNhYmxlIHRoZSBwb3J0LiBUaGlzIHdp bGwgY2xlYXIgdGhlIGFkZHJlc3MgdG9vLgorCSAqLworCWlmIChkLT5lbmFibGVkKSB7CisJCWFz dF92aHViX2Rldl9udWtlKGQpOworCQlhc3Rfdmh1Yl9kZXZfZGlzYWJsZShkKTsKKwl9CisKKwlz cGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl91ZGNfc3RhcnQoc3RydWN0IHVzYl9nYWRnZXQg KmdhZGdldCwKKwkJCSAgICAgIHN0cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlciAqZHJpdmVyKQorewor CXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7 CisKKwlEREJHKGQsICJzdGFydFxuIik7CisKKwkvKiBXZSBkb24ndCBkbyBtdWNoIG1vcmUgdW50 aWwgdGhlIGh1YiBlbmFibGVzIHVzICovCisJZC0+ZHJpdmVyID0gZHJpdmVyOworCWQtPmdhZGdl dC5pc19zZWxmcG93ZXJlZCA9IDE7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHVi LT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCB1c2JfZXAg KmFzdF92aHViX3VkY19tYXRjaF9lcChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LAorCQkJCQkg ICAgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNjLAorCQkJCQkgICAgc3RydWN0 IHVzYl9zc19lcF9jb21wX2Rlc2NyaXB0b3IgKnNzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYg KmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJc3RydWN0IGFzdF92aHViX2VwICplcDsKKwlzdHJ1 Y3QgdXNiX2VwICp1X2VwOworCXVuc2lnbmVkIGludCBtYXgsIGFkZHIsIGk7CisKKwlEREJHKGQs ICJNYXRjaCBFUCB0eXBlICVkXG4iLCB1c2JfZW5kcG9pbnRfdHlwZShkZXNjKSk7CisKKwkvKgor CSAqIEZpcnN0IHdlIG5lZWQgdG8gbG9vayBmb3IgYW4gZXhpc3RpbmcgdW5jbGFpbWVkIEVQIGFz IGFub3RoZXIKKwkgKiBjb25maWd1cmF0aW9uIG1heSBoYXZlIGFscmVhZHkgYXNzb2NpYXRlZCBh IGJ1bmNoIG9mIEVQcyB3aXRoCisJICogdGhpcyBnYWRnZXQuIFRoaXMgZHVwbGljYXRlcyB0aGUg Y29kZSBpbiB1c2JfZXBfYXV0b2NvbmZpZ19zcygpCisJICogdW5mb3J0dW5hdGVseS4KKwkgKi8K KwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHVfZXAsICZnYWRnZXQtPmVwX2xpc3QsIGVwX2xpc3QpIHsK KwkJaWYgKHVzYl9nYWRnZXRfZXBfbWF0Y2hfZGVzYyhnYWRnZXQsIHVfZXAsIGRlc2MsIHNzKSkg eworCQkJRERCRyhkLCAiIC0+IHVzaW5nIGV4aXN0aW5nIEVQJWRcbiIsCisJCQkgICAgIHRvX2Fz dF9lcCh1X2VwKS0+ZF9pZHgpOworCQkJcmV0dXJuIHVfZXA7CisJCX0KKwl9CisKKwkvKgorCSAq IFdlIGRpZG4ndCBmaW5kIG9uZSwgd2UgbmVlZCB0byBncmFiIG9uZSBmcm9tIHRoZSBwb29sLgor CSAqCisJICogRmlyc3QgbGV0J3MgZG8gc29tZSBzYW5pdHkgY2hlY2tpbmcKKwkgKi8KKwlzd2l0 Y2godXNiX2VuZHBvaW50X3R5cGUoZGVzYykpIHsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0NP TlRST0w6CisJCS8qIE9ubHkgRVAwIGNhbiBiZSBhIGNvbnRyb2wgZW5kcG9pbnQgKi8KKwkJcmV0 dXJuIE5VTEw7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgorCQkvKiBJU086CSBsaW1p dCAxMDIzIGJ5dGVzIGZ1bGwgc3BlZWQsIDEwMjQgaGlnaC9zdXBlciBzcGVlZCAqLworCQlpZiAo Z2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpKQorCQkJbWF4ID0gMTAyNDsKKwkJZWxzZQorCQkJ bWF4ID0gMTAyMzsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxLOgorCQlp ZiAoZ2FkZ2V0X2lzX2R1YWxzcGVlZChnYWRnZXQpKQorCQkJbWF4ID0gNTEyOworCQllbHNlCisJ CQltYXggPSA2NDsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQ6CisJCWlm IChnYWRnZXRfaXNfZHVhbHNwZWVkKGdhZGdldCkpCisJCQltYXggPSAxMDI0OworCQllbHNlCisJ CQltYXggPSA2NDsKKwkJYnJlYWs7CisJfQorCWlmICh1c2JfZW5kcG9pbnRfbWF4cChkZXNjKSA+ IG1heCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKgorCSAqIEZpbmQgYSBmcmVlIEVQIGFkZHJlc3Mg Zm9yIHRoYXQgZGV2aWNlLiBXZSBjYW4ndAorCSAqIGxldCB0aGUgZ2VuZXJpYyBjb2RlIGFzc2ln biB0aGVzZSBhcyBpdCB3b3VsZAorCSAqIGNyZWF0ZSBvdmVybGFwcGluZyBudW1iZXJzIGZvciBJ TiBhbmQgT1VUIHdoaWNoCisJICogd2UgZG9uJ3Qgc3VwcG9ydCwgc28gYWxzbyBjcmVhdGUgYSBz dWl0YWJsZSBuYW1lCisJICogdGhhdCB3aWxsIGFsbG93IHRoZSBnZW5lcmljIGNvZGUgdG8gdXNl IG91cgorCSAqIGFzc2lnbmVkIGFkZHJlc3MuCisJICovCisJZm9yIChpID0gMDsgaSA8IEFTVF9W SFVCX05VTV9HRU5fRVBzOyBpKyspCisJCWlmIChkLT5lcG5zW2ldID09IE5VTEwpCisJCQlicmVh azsKKwlpZiAoaSA+PSBBU1RfVkhVQl9OVU1fR0VOX0VQcykKKwkJcmV0dXJuIE5VTEw7CisJYWRk ciA9IGkgKyAxOworCisJLyoKKwkgKiBOb3cgZ3JhYiBhbiBFUCBmcm9tIHRoZSBzaGFyZWQgcG9v bCBhbmQgYXNzb2NpYXRlCisJICogaXQgd2l0aCBvdXIgZGV2aWNlCisJICovCisJZXAgPSBhc3Rf dmh1Yl9hbGxvY19lcG4oZCwgYWRkcik7CisJaWYgKCFlcCkKKwkJcmV0dXJuIE5VTEw7CisJRERC RyhkLCAiQWxsb2NhdGVkIGVwbiMlZCBmb3IgcG9ydCBFUCVkXG4iLAorCSAgICAgZXAtPmVwbi5n X2lkeCwgYWRkcik7CisKKwlyZXR1cm4gJmVwLT5lcDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1 Yl91ZGNfc3RvcChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCBhc3Rfdmh1 Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwor CXNwaW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlEREJHKGQsICJz dG9wXG4iKTsKKworCWQtPmRyaXZlciA9IE5VTEw7CisJZC0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQ RUVEX1VOS05PV047CisKKwlhc3Rfdmh1Yl9kZXZfbnVrZShkKTsKKworCWlmIChkLT5lbmFibGVk KQorCQlhc3Rfdmh1Yl9kZXZfZGlzYWJsZShkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0 IHVzYl9nYWRnZXRfb3BzIGFzdF92aHViX3VkY19vcHMgPSB7CisJLmdldF9mcmFtZQk9IGFzdF92 aHViX3VkY19nZXRfZnJhbWUsCisJLndha2V1cAkJPSBhc3Rfdmh1Yl91ZGNfd2FrZXVwLAorCS5w dWxsdXAJCT0gYXN0X3ZodWJfdWRjX3B1bGx1cCwKKwkudWRjX3N0YXJ0CT0gYXN0X3ZodWJfdWRj X3N0YXJ0LAorCS51ZGNfc3RvcAk9IGFzdF92aHViX3VkY19zdG9wLAorCS5tYXRjaF9lcAk9IGFz dF92aHViX3VkY19tYXRjaF9lcCwKK307CisKK3ZvaWQgYXN0X3ZodWJfZGV2X3N1c3BlbmQoc3Ry dWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwlkLT5zdXNwZW5kZWQgPSB0cnVlOworCWlmIChkLT5k cml2ZXIpIHsKKwkJc3Bpbl91bmxvY2soJmQtPnZodWItPmxvY2spOworCQlkLT5kcml2ZXItPnN1 c3BlbmQoJmQtPmdhZGdldCk7CisJCXNwaW5fbG9jaygmZC0+dmh1Yi0+bG9jayk7CisJfQorfQor Cit2b2lkIGFzdF92aHViX2Rldl9yZXN1bWUoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwlk LT5zdXNwZW5kZWQgPSBmYWxzZTsKKwlpZiAoZC0+ZHJpdmVyKSB7CisJCXNwaW5fdW5sb2NrKCZk LT52aHViLT5sb2NrKTsKKwkJZC0+ZHJpdmVyLT5yZXN1bWUoJmQtPmdhZGdldCk7CisJCXNwaW5f bG9jaygmZC0+dmh1Yi0+bG9jayk7CisJfQorfQorCit2b2lkIGFzdF92aHViX2Rldl9yZXNldChz dHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCS8qCisJICogSWYgc3BlZWQgaXMgbm90IHNldCwg d2UgZW5hYmxlIHRoZSBwb3J0LiBJZiBpdCBpcywKKwkgKiBzZW5kIHJlc2V0IHRvIHRoZSBnYWRn ZXQgYW5kIHJlc2V0ICJzcGVlZCIuCisJICoKKwkgKiBTcGVlZCBpcyBhbiBpbmRpY2F0aW9uIHRo YXQgd2UgaGF2ZSBnb3QgdGhlIGZpcnN0CisJICogc2V0dXAgcGFja2V0IHRvIHRoZSBkZXZpY2Uu CisJICovCisJaWYgKGQtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTiAmJiAhZC0+ ZW5hYmxlZCkgeworCQlEREJHKGQsICJSZXNldCBhdCB1bmtub3duIHNwZWVkIG9mIGRpc2FibGVk IGRldmljZSwgZW5hYmxpbmcuLi5cbiIpOworCQlhc3Rfdmh1Yl9kZXZfZW5hYmxlKGQpOworCQlk LT5zdXNwZW5kZWQgPSBmYWxzZTsKKwl9CisJaWYgKGQtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BF RURfVU5LTk9XTiAmJiBkLT5kcml2ZXIpIHsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJRERCRyhk LCAiUmVzZXQgYXQga25vd24gc3BlZWQgb2YgYm91bmQgZGV2aWNlLCByZXNldHRpbmcuLi5cbiIp OworCQlzcGluX3VubG9jaygmZC0+dmh1Yi0+bG9jayk7CisJCWQtPmRyaXZlci0+cmVzZXQoJmQt PmdhZGdldCk7CisJCXNwaW5fbG9jaygmZC0+dmh1Yi0+bG9jayk7CisKKwkJLyoKKwkJICogRGlz YWJsZS9yZS1lbmFibGUgSFcsIHRoaXMgd2lsbCBjbGVhciB0aGUgYWRkcmVzcworCQkgKiBhbmQg c3BlZWQgc2V0dGluZy4KKwkJICovCisJCWFzdF92aHViX2Rldl9kaXNhYmxlKGQpOworCQlhc3Rf dmh1Yl9kZXZfZW5hYmxlKGQpOworCisJCS8qIENsZWFyIHN0YWxsIG9uIGFsbCBFUHMgKi8KKwkJ Zm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKyspIHsKKwkJCXN0cnVjdCBh c3Rfdmh1Yl9lcCAqZXAgPSBkLT5lcG5zW2ldOworCisJCQlpZiAoZXAgJiYgZXAtPmVwbi5zdGFs bGVkKSB7CisJCQkJZXAtPmVwbi5zdGFsbGVkID0gZmFsc2U7CisJCQkJYXN0X3ZodWJfdXBkYXRl X2Vwbl9zdGFsbChlcCk7CisJCQl9CisJCX0KKworCQkvKiBBZGRpdGlvbmFsIGNsZWFudXBzICov CisJCWQtPndha2V1cF9lbiA9IGZhbHNlOworCQlkLT5zdXNwZW5kZWQgPSBmYWxzZTsKKwl9Cit9 CisKK3ZvaWQgYXN0X3ZodWJfZGVsX2RldihzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCXVu c2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywg ZmxhZ3MpOworCWlmICghZC0+cmVnaXN0ZXJlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3Jl KCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJZC0+cmVnaXN0ZXJlZCA9 IGZhbHNlOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsK KworCXVzYl9kZWxfZ2FkZ2V0X3VkYygmZC0+Z2FkZ2V0KTsKKwlkZXZpY2VfdW5yZWdpc3Rlcihk LT5wb3J0X2Rldik7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Rldl9yZWxlYXNlKHN0cnVj dCBkZXZpY2UgKmRldikKK3sKKwlrZnJlZShkZXYpOworfQorCitpbnQgYXN0X3ZodWJfaW5pdF9k ZXYoc3RydWN0IGFzdF92aHViICp2aHViLCB1bnNpZ25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBh c3Rfdmh1Yl9kZXYgKmQgPSAmdmh1Yi0+cG9ydHNbaWR4XS5kZXY7CisJc3RydWN0IGRldmljZSAq cGFyZW50ID0gJnZodWItPnBkZXYtPmRldjsKKwlpbnQgcmM7CisKKwlkLT52aHViID0gdmh1YjsK KwlkLT5pbmRleCA9IGlkeDsKKwlkLT5uYW1lID0gZGV2bV9rYXNwcmludGYocGFyZW50LCBHRlBf S0VSTkVMLCAicG9ydCVkIiwgaWR4KzEpOworCWQtPnJlZ3MgPSB2aHViLT5yZWdzICsgMHgxMDAg KyAweDEwICogaWR4OworCisJYXN0X3ZodWJfaW5pdF9lcDAodmh1YiwgJmQtPmVwMCwgZCk7CisK KwkvKgorCSAqIFRoZSBVREMgY29yZSByZWFsbHkgbmVlZHMgdXMgdG8gaGF2ZSBzZXBhcmF0ZSBh bmQgdW5pcXVlbHkKKwkgKiBuYW1lZCAicGFyZW50IiBkZXZpY2VzIGZvciBlYWNoIHBvcnQgc28g d2UgY3JlYXRlIGEgc3ViIGRldmljZQorCSAqIGhlcmUgZm9yIHRoYXQgcHVycG9zZQorCSAqLwor CWQtPnBvcnRfZGV2ID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGRldmljZSksIEdGUF9LRVJORUwp OworCWlmICghZC0+cG9ydF9kZXYpCisJCXJldHVybiAtRU5PTUVNOworCWRldmljZV9pbml0aWFs aXplKGQtPnBvcnRfZGV2KTsKKwlkLT5wb3J0X2Rldi0+cmVsZWFzZSA9IGFzdF92aHViX2Rldl9y ZWxlYXNlOworCWQtPnBvcnRfZGV2LT5wYXJlbnQgPSBwYXJlbnQ7CisJZGV2X3NldF9uYW1lKGQt PnBvcnRfZGV2LCAiJXM6cCVkIiwgZGV2X25hbWUocGFyZW50KSwgaWR4ICsgMSk7CisJcmMgPSBk ZXZpY2VfYWRkKGQtPnBvcnRfZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZmFpbF9hZGQ7CisKKwkv KiBQb3B1bGF0ZSBnYWRnZXQgKi8KKwlJTklUX0xJU1RfSEVBRCgmZC0+Z2FkZ2V0LmVwX2xpc3Qp OworCWQtPmdhZGdldC5vcHMgPSAmYXN0X3ZodWJfdWRjX29wczsKKwlkLT5nYWRnZXQuZXAwID0g JmQtPmVwMC5lcDsKKwlkLT5nYWRnZXQubmFtZSA9IEtCVUlMRF9NT0ROQU1FOworCWlmICh2aHVi LT5mb3JjZV91c2IxKQorCQlkLT5nYWRnZXQubWF4X3NwZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisJ ZWxzZQorCQlkLT5nYWRnZXQubWF4X3NwZWVkID0gVVNCX1NQRUVEX0hJR0g7CisJZC0+Z2FkZ2V0 LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJZC0+Z2FkZ2V0LmRldi5vZl9ub2RlID0gdmh1 Yi0+cGRldi0+ZGV2Lm9mX25vZGU7CisKKwlyYyA9IHVzYl9hZGRfZ2FkZ2V0X3VkYyhkLT5wb3J0 X2RldiwgJmQtPmdhZGdldCk7CisJaWYgKHJjICE9IDApCisJCWdvdG8gZmFpbF91ZGM7CisJZC0+ cmVnaXN0ZXJlZCA9IHRydWU7CisKKwlyZXR1cm4gMDsKKyBmYWlsX3VkYzoKKwlkZXZpY2VfZGVs KGQtPnBvcnRfZGV2KTsKKyBmYWlsX2FkZDoKKwlwdXRfZGV2aWNlKGQtPnBvcnRfZGV2KTsKKwor CXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVk LXZodWIvZXAwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2VwMC5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMjBmZmIwM2ZmNmFjCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwpA QCAtMCwwICsxLDQ4NiBAQAorLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCisv KgorICogYXNwZWVkLXZodWIgLS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2Fk Z2V0CisgKgorICogZXAwLmMgLSBFbmRwb2ludCAwIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0 IDIwMTcgSUJNIENvcnBvcmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdh cmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRo ZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5 CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRo ZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAq LworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+ CisjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVs YXkuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5j bHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2lu Y2x1ZGUgPGxpbnV4L3ByZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVk ZSA8bGludXgvdXNiL2dhZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8 bGludXgvb2ZfZ3Bpby5oPgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxp bnV4L2RtYS1tYXBwaW5nLmg+CisKKyNpbmNsdWRlICJ2aHViLmgiCisKK2ludCBhc3Rfdmh1Yl9y ZXBseShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLCBjaGFyICpwdHIsIGludCBsZW4pCit7CisJc3Ry dWN0IHVzYl9yZXF1ZXN0ICpyZXEgPSAmZXAtPmVwMC5yZXEucmVxOworCWludCByYzsKKworCWlm IChXQVJOX09OKGVwLT5kX2lkeCAhPSAwKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYg KFdBUk5fT04oIWVwLT5lcDAuZGlyX2luKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYg KFdBUk5fT04obGVuID4gQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpKQorCQlyZXR1cm4gc3RkX3Jl cV9zdGFsbDsKKwlpZiAoV0FSTl9PTihyZXEtPnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpKQorCQly ZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCXJlcS0+YnVmID0gcHRyOworCXJlcS0+bGVuZ3RoID0g bGVuOworCXJlcS0+Y29tcGxldGUgPSBOVUxMOworCXJlcS0+emVybyA9IHRydWU7CisKKwkvKgor CSAqIENhbGwgaW50ZXJuYWwgcXVldWUgZGlyZWN0bHkgYWZ0ZXIgZHJvcHBpbmcgdGhlIGxvY2su IFRoaXMgaXMKKwkgKiBzYWZlIHRvIGRvIGFzIHRoZSByZXBseSBpcyBhbHdheXMgdGhlIGxhc3Qg dGhpbmcgZG9uZSB3aGVuCisJICogcHJvY2Vzc2luZyBhIFNFVFVQIHBhY2tldCwgdXN1YWxseSBh cyBhIHRhaWwgY2FsbAorCSAqLworCXNwaW5fdW5sb2NrKCZlcC0+dmh1Yi0+bG9jayk7CisJaWYg KGVwLT5lcC5vcHMtPnF1ZXVlKCZlcC0+ZXAsIHJlcSwgR0ZQX0FUT01JQykpCisJCXJjID0gc3Rk X3JlcV9zdGFsbDsKKwllbHNlCisJCXJjID0gc3RkX3JlcV9kYXRhOworCXNwaW5fbG9jaygmZXAt PnZodWItPmxvY2spOworCXJldHVybiByYzsKK30KKworaW50IF9fYXN0X3ZodWJfc2ltcGxlX3Jl cGx5KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBsZW4sIC4uLikKK3sKKwl1OCAqYnVmZmVy ID0gZXAtPmJ1ZjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFy dChhcmdzLCBsZW4pOworCisJLyogQ29weSBkYXRhIGRpcmVjdGx5IGludG8gRVAgYnVmZmVyICov CisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlidWZmZXJbaV0gPSB2YV9hcmcoYXJncywg aW50KTsKKwl2YV9lbmQoYXJncyk7CisKKwkvKiByZXEtPmJ1ZiBOVUxMIG1lYW5zIGRhdGEgaXMg YWxyZWFkeSB0aGVyZSAqLworCXJldHVybiBhc3Rfdmh1Yl9yZXBseShlcCwgTlVMTCwgbGVuKTsK K30KKwordm9pZCBhc3Rfdmh1Yl9lcDBfaGFuZGxlX3NldHVwKHN0cnVjdCBhc3Rfdmh1Yl9lcCAq ZXApCit7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCBjcnE7CisJZW51bSBzdGRfcmVxX3JjIHN0 ZF9yZXFfcmM7CisJaW50IHJjID0gLUVOT0RFVjsKKworCWlmIChXQVJOX09OKGVwLT5kX2lkeCAh PSAwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBHcmFiIHRoZSBzZXR1cCBwYWNrZXQgZnJvbSB0 aGUgY2hpcCBhbmQgYnl0ZXN3YXAKKwkgKiBpbnRlcmVzdGluZyBmaWVsZHMKKwkgKi8KKwltZW1j cHlfZnJvbWlvKCZjcnEsIGVwLT5lcDAuc2V0dXAsIHNpemVvZihjcnEpKTsKKworCUVQREJHKGVw LCAiU0VUVVAgcGFja2V0ICUwMngvJTAyeC8lMDR4LyUwNHgvJTA0eCBbJXNdIHN0PSVkXG4iLAor CSAgICAgIGNycS5iUmVxdWVzdFR5cGUsIGNycS5iUmVxdWVzdCwKKwkgICAgICAgbGUxNl90b19j cHUoY3JxLndWYWx1ZSksCisJICAgICAgIGxlMTZfdG9fY3B1KGNycS53SW5kZXgpLAorCSAgICAg ICBsZTE2X3RvX2NwdShjcnEud0xlbmd0aCksCisJICAgICAgIChjcnEuYlJlcXVlc3RUeXBlICYg VVNCX0RJUl9JTikgPyAiaW4iIDogIm91dCIsCisJICAgICAgIGVwLT5lcDAuc3RhdGUpOworCisJ LyogQ2hlY2sgb3VyIHN0YXRlLCBjYW5jZWwgcGVuZGluZyByZXF1ZXN0cyBpZiBuZWVkZWQgKi8K KwlpZiAoZXAtPmVwMC5zdGF0ZSAhPSBlcDBfc3RhdGVfdG9rZW4pIHsKKwkJRVBEQkcoZXAsICJ3 cm9uZyBzdGF0ZVxuIik7CisJCWFzdF92aHViX251a2UoZXAsIDApOworCQlnb3RvIHN0YWxsOwor CX0KKworCS8qIENhbGN1bGF0ZSBuZXh0IHN0YXRlIGZvciBFUDAgKi8KKwllcC0+ZXAwLnN0YXRl ID0gZXAwX3N0YXRlX2RhdGE7CisJZXAtPmVwMC5kaXJfaW4gPSAhIShjcnEuYlJlcXVlc3RUeXBl ICYgVVNCX0RJUl9JTik7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSB2SHViLCB3ZSBoYW5kbGUgcmVx dWVzdHMgZGlmZmVyZW50bHkgKi8KKwlzdGRfcmVxX3JjID0gc3RkX3JlcV9kcml2ZXI7CisJaWYg KGVwLT5kZXYgPT0gTlVMTCkgeworCQlpZiAoKGNycS5iUmVxdWVzdFR5cGUgJiBVU0JfVFlQRV9N QVNLKSA9PSBVU0JfVFlQRV9TVEFOREFSRCkKKwkJCXN0ZF9yZXFfcmMgPSBhc3Rfdmh1Yl9zdGRf aHViX3JlcXVlc3QoZXAsICZjcnEpOworCQllbHNlIGlmICgoY3JxLmJSZXF1ZXN0VHlwZSAmIFVT Ql9UWVBFX01BU0spID09IFVTQl9UWVBFX0NMQVNTKQorCQkJc3RkX3JlcV9yYyA9IGFzdF92aHVi X2NsYXNzX2h1Yl9yZXF1ZXN0KGVwLCAmY3JxKTsKKwkJZWxzZQorCQkJc3RkX3JlcV9yYyA9IHN0 ZF9yZXFfc3RhbGw7CisJfSBlbHNlIGlmICgoY3JxLmJSZXF1ZXN0VHlwZSAmIFVTQl9UWVBFX01B U0spID09IFVTQl9UWVBFX1NUQU5EQVJEKQorCQlzdGRfcmVxX3JjID0gYXN0X3ZodWJfc3RkX2Rl dl9yZXF1ZXN0KGVwLCAmY3JxKTsKKworCS8qIEFjdCB1cG9uIHJlc3VsdCAqLworCXN3aXRjaChz dGRfcmVxX3JjKSB7CisJY2FzZSBzdGRfcmVxX2NvbXBsZXRlOgorCQlnb3RvIGNvbXBsZXRlOwor CWNhc2Ugc3RkX3JlcV9zdGFsbDoKKwkJZ290byBzdGFsbDsKKwljYXNlIHN0ZF9yZXFfZHJpdmVy OgorCQlicmVhazsKKwljYXNlIHN0ZF9yZXFfZGF0YToKKwkJcmV0dXJuOworCX0KKworCS8qIFBh c3MgcmVxdWVzdCB1cCB0byB0aGUgZ2FkZ2V0IGRyaXZlciAqLworCWlmIChXQVJOX09OKCFlcC0+ ZGV2KSkKKwkJZ290byBzdGFsbDsKKwlpZiAoZXAtPmRldi0+ZHJpdmVyKSB7CisJCUVQREJHKGVw LCAiZm9yd2FyZGluZyB0byBnYWRnZXQuLi5cbiIpOworCQlzcGluX3VubG9jaygmZXAtPnZodWIt PmxvY2spOworCQlyYyA9IGVwLT5kZXYtPmRyaXZlci0+c2V0dXAoJmVwLT5kZXYtPmdhZGdldCwg JmNycSk7CisJCXNwaW5fbG9jaygmZXAtPnZodWItPmxvY2spOworCQlFUERCRyhlcCwgImRyaXZl ciByZXR1cm5lZCAlZFxuIiwgcmMpOworCX0gZWxzZSB7CisJCUVQREJHKGVwLCAibm8gZ2FkZ2V0 IGZvciByZXF1ZXN0ICFcbiIpOworCX0KKwlpZiAocmMgPj0gMCkKKwkJcmV0dXJuOworCisgc3Rh bGw6CisJRVBEQkcoZXAsICJzdGFsbGluZ1xuIik7CisJd3JpdGVsKFZIVUJfRVAwX0NUUkxfU1RB TEwsIGVwLT5lcDAuY3Rsc3RhdCk7CisJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7 CisJZXAtPmVwMC5kaXJfaW4gPSBmYWxzZTsKKwlyZXR1cm47CisKKyBjb21wbGV0ZToKKwlFUFZE QkcoZXAsICJzZW5kaW5nIFtpbl0gc3RhdHVzIHdpdGggbm8gZGF0YVxuIik7CisJd3JpdGVsKFZI VUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCWVwLT5lcDAuc3RhdGUgPSBl cDBfc3RhdGVfc3RhdHVzOworCWVwLT5lcDAuZGlyX2luID0gZmFsc2U7Cit9CisKKworc3RhdGlj IHZvaWQgYXN0X3ZodWJfZXAwX2RvX3NlbmQoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkg c3RydWN0IGFzdF92aHViX3JlcSAqcmVxKQoreworCXVuc2lnbmVkIGludCBjaHVuazsKKwl1MzIg cmVnOworCisJLyogSWYgdGhpcyBpcyBhIDAtbGVuZ3RoIHJlcXVlc3QsIGl0J3MgdGhlIGdhZGdl dCB0cnlpbmcgdG8KKwkgKiBzZW5kIGEgc3RhdHVzIG9uIG91ciBiZWhhbGYuIFdlIHRha2UgaXQg ZnJvbSBoZXJlLgorCSAqLworCWlmIChyZXEtPnJlcS5sZW5ndGggPT0gMCkKKwkJcmVxLT5sYXN0 X2Rlc2MgPSAxOworCisJLyogQXJlIHdlIGRvbmUgPyBDb21wbGV0ZSByZXF1ZXN0LCBvdGhlcndp c2Ugd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQgKi8KKwlpZiAocmVxLT5sYXN0X2Rlc2MgPj0gMCkg eworCQlFUFZEQkcoZXAsICJjb21wbGV0ZSBzZW5kICVkLyVkXG4iLAorCQkgICAgICAgcmVxLT5y ZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgpOworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRl X3N0YXR1czsKKwkJd3JpdGVsKFZIVUJfRVAwX1JYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQp OworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIDApOworCQlyZXR1cm47CisJfQorCisJLyoKKwkg KiBOZXh0IGNodW5rIGNyb3BwZWQgdG8gbWF4IHBhY2tldCBzaXplLiBBbHNvIGNoZWNrIGlmIHRo aXMKKwkgKiBpcyB0aGUgbGFzdCBwYWNrZXQKKwkgKi8KKwljaHVuayA9IHJlcS0+cmVxLmxlbmd0 aCAtIHJlcS0+cmVxLmFjdHVhbDsKKwlpZiAoY2h1bmsgPiBlcC0+ZXAubWF4cGFja2V0KQorCQlj aHVuayA9IGVwLT5lcC5tYXhwYWNrZXQ7CisJZWxzZSBpZiAoKGNodW5rIDwgZXAtPmVwLm1heHBh Y2tldCkgfHwgIXJlcS0+cmVxLnplcm8pCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCUVQVkRC RyhlcCwgInNlbmQgY2h1bms9JWQgbGFzdD0lZCwgcmVxLT5hY3Q9JWQgbXA9JWRcbiIsCisJICAg ICAgIGNodW5rLCByZXEtPmxhc3RfZGVzYywgcmVxLT5yZXEuYWN0dWFsLCBlcC0+ZXAubWF4cGFj a2V0KTsKKworCS8qCisJICogQ29weSBkYXRhIGlmIGFueSAoaW50ZXJuYWwgcmVxdWVzdHMgYWxy ZWFkeSBoYXZlIGRhdGEKKwkgKiBpbiB0aGUgRVAgYnVmZmVyKQorCSAqLworCWlmIChjaHVuayAm JiByZXEtPnJlcS5idWYpCisJCW1lbWNweShlcC0+YnVmLCByZXEtPnJlcS5idWYgKyByZXEtPnJl cS5hY3R1YWwsIGNodW5rKTsKKworCS8qIFJlbWVtYmVyIGNodW5rIHNpemUgYW5kIHRyaWdnZXIg c2VuZCAqLworCXJlZyA9IFZIVUJfRVAwX1NFVF9UWF9MRU4oY2h1bmspOworCXdyaXRlbChyZWcs IGVwLT5lcDAuY3Rsc3RhdCk7CisJd3JpdGVsKHJlZyB8IFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBl cC0+ZXAwLmN0bHN0YXQpOworCXJlcS0+cmVxLmFjdHVhbCArPSBjaHVuazsKK30KKworc3RhdGlj IHZvaWQgYXN0X3ZodWJfZXAwX3J4X3ByaW1lKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApCit7CisJ RVBWREJHKGVwLCAicnggcHJpbWVcbiIpOworCisJLyogUHJpbWUgZW5kcG9pbnQgZm9yIHJlY2Vp dmluZyBkYXRhICovCisJd3JpdGVsKFZIVUJfRVAwX1JYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0 YXQgKyBBU1RfVkhVQl9FUDBfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2VwMF9k b19yZWNlaXZlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJl cSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcmVtYWluOwor CWludCByYyA9IDA7CisKKwkvKiBXZSBhcmUgcmVjZWl2aW5nLi4uIGdyYWIgcmVxdWVzdCAqLwor CXJlbWFpbiA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKKworCUVQVkRCRyhl cCwgInJlY2VpdmUgZ290PSVkIHJlbWFpbj0lZFxuIiwgbGVuLCByZW1haW4pOworCisJLyogQXJl IHdlIGdldHRpbmcgbW9yZSB0aGFuIGFza2VkID8gKi8KKwlpZiAobGVuID4gcmVtYWluKSB7CisJ CUVQREJHKGVwLCAicmVjZWl2aW5nIHRvbyBtdWNoIChvdmY6ICVkKSAhXG4iLAorCQkgICAgICBs ZW4gLSByZW1haW4pOworCQlsZW4gPSByZW1haW47CisJCXJjID0gLUVPVkVSRkxPVzsKKwl9CisJ aWYgKGxlbiAmJiByZXEtPnJlcS5idWYpCisJCW1lbWNweShyZXEtPnJlcS5idWYgKyByZXEtPnJl cS5hY3R1YWwsIGVwLT5idWYsIGxlbik7CisJcmVxLT5yZXEuYWN0dWFsICs9IGxlbjsKKworCS8q IERvbmUgPyAqLworCWlmIChsZW4gPCBlcC0+ZXAubWF4cGFja2V0IHx8IGxlbiA9PSByZW1haW4p IHsKKwkJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJCXdyaXRlbChWSFVCX0VQ MF9UWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0KTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVx LCByYyk7CisJfSBlbHNlCisJCWFzdF92aHViX2VwMF9yeF9wcmltZShlcCk7Cit9CisKK3ZvaWQg YXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soc3RydWN0IGFzdF92aHViX2VwICplcCwgYm9vbCBpbl9h Y2spCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1 YiA9IGVwLT52aHViOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2aHViLT5wZGV2LT5kZXY7CisJ Ym9vbCBzdGFsbCA9IGZhbHNlOworCXUzMiBzdGF0OworCisJLyogUmVhZCBFUDAgc3RhdHVzICov CisJc3RhdCA9IHJlYWRsKGVwLT5lcDAuY3Rsc3RhdCk7CisKKwkvKiBHcmFiIGN1cnJlbnQgcmVx dWVzdCBpZiBhbnkgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwLT5xdWV1 ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCisJRVBWREJHKGVwLCAiQUNLIHN0YXR1 cz0lMDh4LHN0YXRlPSVkIGlzX2luPSVkIGluX2Fjaz0lZCByZXE9JXBcbiIsCisJCXN0YXQsIGVw LT5lcDAuc3RhdGUsIGVwLT5lcDAuZGlyX2luLCBpbl9hY2ssIHJlcSk7CisKKwlzd2l0Y2goZXAt PmVwMC5zdGF0ZSkgeworCWNhc2UgZXAwX3N0YXRlX3Rva2VuOgorCQkvKiBUaGVyZSBzaG91bGQg YmUgbm8gcmVxdWVzdCBxdWV1ZWQgaW4gdGhhdCBzdGF0ZS4uLiAqLworCQlpZiAocmVxKSB7CisJ CQlkZXZfd2FybihkZXYsICJyZXF1ZXN0IHByZXNlbnQgd2hpbGUgaW4gVE9LRU4gc3RhdGVcbiIp OworCQkJYXN0X3ZodWJfbnVrZShlcCwgLUVJTlZBTCk7CisJCX0KKwkJZGV2X3dhcm4oZGV2LCAi YWNrIHdoaWxlIGluIFRPS0VOIHN0YXRlXG4iKTsKKwkJc3RhbGwgPSB0cnVlOworCQlicmVhazsK KwljYXNlIGVwMF9zdGF0ZV9kYXRhOgorCQkvKiBDaGVjayB0aGUgc3RhdGUgYml0cyBjb3JyZXNw b25kaW5nIHRvIG91ciBkaXJlY3Rpb24gKi8KKwkJaWYgKChlcC0+ZXAwLmRpcl9pbiAmJiAoc3Rh dCAmIFZIVUJfRVAwX1RYX0JVRkZfUkRZKSkgfHwKKwkJICAgICghZXAtPmVwMC5kaXJfaW4gJiYg KHN0YXQgJiBWSFVCX0VQMF9SWF9CVUZGX1JEWSkpIHx8CisJCSAgICAoZXAtPmVwMC5kaXJfaW4g IT0gaW5fYWNrKSkgeworCQkJZGV2X3dhcm4oZGV2LCAiaXJxIHN0YXRlIG1pc21hdGNoIik7CisJ CQlzdGFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBXZSBhcmUgaW4gZGF0 YSBwaGFzZSBhbmQgdGhlcmUncyBubyByZXF1ZXN0LCBzb21ldGhpbmcgaXMKKwkJICogd3Jvbmcs IHN0YWxsCisJCSAqLworCQlpZiAoIXJlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAiZGF0YSBwaGFz ZSwgbm8gcmVxdWVzdFxuIik7CisJCQlzdGFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCisJ CS8qIFdlIGhhdmUgYSByZXF1ZXN0LCBoYW5kbGUgZGF0YSB0cmFuc2ZlcnMgKi8KKwkJaWYgKGVw LT5lcDAuZGlyX2luKQorCQkJYXN0X3ZodWJfZXAwX2RvX3NlbmQoZXAsIHJlcSk7CisJCWVsc2UK KwkJCWFzdF92aHViX2VwMF9kb19yZWNlaXZlKGVwLCByZXEsIFZIVUJfRVAwX1JYX0xFTihzdGF0 KSk7CisJCXJldHVybjsKKwljYXNlIGVwMF9zdGF0ZV9zdGF0dXM6CisJCS8qIE51a2Ugc3RhbGUg cmVxdWVzdHMgKi8KKwkJaWYgKHJlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAicmVxdWVzdCBwcmVz ZW50IHdoaWxlIGluIFNUQVRVUyBzdGF0ZVxuIik7CisJCQlhc3Rfdmh1Yl9udWtlKGVwLCAtRUlO VkFMKTsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBzdGF0dXMgcGhhc2UgY29tcGxldGVzIHdp dGggdGhlIHdyb25nIGFjaywgc3RhbGwKKwkJICogdGhlIGVuZHBvaW50IGp1c3QgaW4gY2FzZSwg dG8gYWJvcnQgd2hhdGV2ZXIgdGhlIGhvc3QKKwkJICogd2FzIGRvaW5nLgorCQkgKi8KKwkJaWYg KGVwLT5lcDAuZGlyX2luID09IGluX2FjaykgeworCQkJZGV2X3dhcm4oZGV2LCAic3RhdHVzIGRp cmVjdGlvbiBtaXNtYXRjaFxuIik7CisJCQlzdGFsbCA9IHRydWU7CisJCX0KKwl9CisKKwkvKiBS ZXNldCB0byB0b2tlbiBzdGF0ZSAqLworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfdG9rZW47 CisJaWYgKHN0YWxsKQorCQl3cml0ZWwoVkhVQl9FUDBfQ1RSTF9TVEFMTCwgZXAtPmVwMC5jdGxz dGF0KTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcDBfcXVldWUoc3RydWN0IHVzYl9lcCog dV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSwKKwkJCSAgICAgIGdmcF90IGdmcF9mbGFn cykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEgPSB0b19hc3RfcmVxKHVfcmVxKTsKKwlz dHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1 YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2aHViLT5wZGV2LT5k ZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFBhcmFub2lkIGNoZWtzICovCisJaWYg KCF1X3JlcSB8fCAoIXVfcmVxLT5jb21wbGV0ZSAmJiAhcmVxLT5pbnRlcm5hbCkpIHsKKwkJZGV2 X3dhcm4oZGV2LCAiQm9ndXMgRVAwIHJlcXVlc3QgISB1X3JlcT0lcFxuIiwgdV9yZXEpOworCQlp ZiAodV9yZXEpIHsKKwkJCWRldl93YXJuKGRldiwgImNvbXBsZXRlPSVwIGludGVybmFsPSVkXG4i LAorCQkJCSB1X3JlcS0+Y29tcGxldGUsIHJlcS0+aW50ZXJuYWwpOworCQl9CisJCXJldHVybiAt RUlOVkFMOworCX0KKworCS8qIE5vdCBlbmRwb2ludCAwID8gKi8KKwlpZiAoV0FSTl9PTihlcC0+ ZF9pZHggIT0gMCkpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRGlzYWJsZWQgZGV2aWNlICov CisJaWYgKGVwLT5kZXYgJiYgKCFlcC0+ZGV2LT5lbmFibGVkIHx8IGVwLT5kZXYtPnN1c3BlbmRl ZCkpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJLyogRGF0YSwgbm8gYnVmZmVyIGFuZCBub3Qg aW50ZXJuYWwgPyAqLworCWlmICh1X3JlcS0+bGVuZ3RoICYmICF1X3JlcS0+YnVmICYmICFyZXEt PmludGVybmFsKSB7CisJCWRldl93YXJuKGRldiwgIlJlcXVlc3Qgd2l0aCBubyBidWZmZXIgIVxu Iik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCUVQVkRCRyhlcCwgImVucXVldWUgcmVxIEAl cFxuIiwgcmVxKTsKKwlFUFZEQkcoZXAsICIgIGw9JWQgemVybz0lZCBub3Nob3J0PSVkIGlzX2lu PSVkXG4iLAorCSAgICAgICB1X3JlcS0+bGVuZ3RoLCB1X3JlcS0+emVybywKKwkgICAgICAgdV9y ZXEtPnNob3J0X25vdF9vaywgZXAtPmVwMC5kaXJfaW4pOworCisJLyogSW5pdGlhbGl6ZSByZXF1 ZXN0IHByb2dyZXNzIGZpZWxkcyAqLworCXVfcmVxLT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJ dV9yZXEtPmFjdHVhbCA9IDA7CisJcmVxLT5sYXN0X2Rlc2MgPSAtMTsKKwlyZXEtPmFjdGl2ZSA9 IGZhbHNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8q IEVQMCBjYW4gb25seSBzdXBwb3J0IGEgc2luZ2xlIHJlcXVlc3QgYXQgYSB0aW1lICovCisJaWYg KCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpIHx8IGVwLT5lcDAuc3RhdGUgPT0gZXAwX3N0YXRlX3Rv a2VuKSB7CisJCWRldl93YXJuKGRldiwgIkVQMDogUmVxdWVzdCBpbiB3cm9uZyBzdGF0ZVxuIik7 CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJu IC1FQlVTWTsKKwl9CisKKwkvKiBBZGQgcmVxdWVzdCB0byBsaXN0IGFuZCBraWNrIHByb2Nlc3Np bmcgaWYgZW1wdHkgKi8KKwlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsK KworCWlmIChlcC0+ZXAwLmRpcl9pbikgeworCQkvKiBJTiByZXF1ZXN0LCBzZW5kIGRhdGEgKi8K KwkJYXN0X3ZodWJfZXAwX2RvX3NlbmQoZXAsIHJlcSk7CisJfSBlbHNlIGlmICh1X3JlcS0+bGVu Z3RoID09IDApIHsKKwkJLyogMC1sZW4gcmVxdWVzdCwgc2VuZCBjb21wbGV0aW9uIGFzIHJ4ICov CisJCUVQVkRCRyhlcCwgIjAtbGVuZ3RoIHJ4IGNvbXBsZXRpb25cbiIpOworCQllcC0+ZXAwLnN0 YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJd3JpdGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBl cC0+ZXAwLmN0bHN0YXQpOworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIDApOworCX0gZWxzZSB7 CisJCS8qIE9VVCByZXF1ZXN0LCBzdGFydCByZWNlaXZlciAqLworCQlhc3Rfdmh1Yl9lcDBfcnhf cHJpbWUoZXApOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZs YWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2VwMF9kZXF1ZXVl KHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9yZXEpCit7CisJc3Ry dWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIg KnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5zaWduZWQg bG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZo dWItPmxvY2ssIGZsYWdzKTsKKworCS8qIE9ubHkgb25lIHJlcXVlc3QgY2FuIGJlIGluIHRoZSBx dWV1ZSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1 Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwkvKiBJcyBpdCBvdXJzID8gKi8KKwlpZiAocmVx ICYmIHVfcmVxID09ICZyZXEtPnJlcSkgeworCQlFUFZEQkcoZXAsICJkZXF1ZXVlIHJlcSBAJXBc biIsIHJlcSk7CisKKwkJLyoKKwkJICogV2UgZG9uJ3QgaGF2ZSB0byBkZWFsIHdpdGggImFjdGl2 ZSIgYXMgYWxsCisJCSAqIERNQXMgZ28gdG8gdGhlIEVQIGJ1ZmZlcnMsIG5vdCB0aGUgcmVxdWVz dC4KKwkJICovCisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgLUVDT05OUkVTRVQpOworCisJCS8q IFdlIGRvIHN0YWxsIHRoZSBFUCB0byBjbGVhbiB0aGluZ3MgdXAgaW4gSFcgKi8KKwkJd3JpdGVs KFZIVUJfRVAwX0NUUkxfU1RBTEwsIGVwLT5lcDAuY3Rsc3RhdCk7CisJCWVwLT5lcDAuc3RhdGUg PSBlcDBfc3RhdGVfc3RhdHVzOworCQllcC0+ZXAwLmRpcl9pbiA9IGZhbHNlOworCQlyYyA9IDA7 CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1 cm4gcmM7Cit9CisKKworc3RhdGljIGNvbnN0IHN0cnVjdCB1c2JfZXBfb3BzIGFzdF92aHViX2Vw MF9vcHMgPSB7CisJLnF1ZXVlCQk9IGFzdF92aHViX2VwMF9xdWV1ZSwKKwkuZGVxdWV1ZQk9IGFz dF92aHViX2VwMF9kZXF1ZXVlLAorCS5hbGxvY19yZXF1ZXN0CT0gYXN0X3ZodWJfYWxsb2NfcmVx dWVzdCwKKwkuZnJlZV9yZXF1ZXN0CT0gYXN0X3ZodWJfZnJlZV9yZXF1ZXN0LAorfTsKKwordm9p ZCBhc3Rfdmh1Yl9pbml0X2VwMChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXAsCisJCSAgICAgICBzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkZXYpCit7CisJbWVtc2V0 KGVwLCAwLCBzaXplb2YoKmVwKSk7CisKKwlJTklUX0xJU1RfSEVBRCgmZXAtPmVwLmVwX2xpc3Qp OworCUlOSVRfTElTVF9IRUFEKCZlcC0+cXVldWUpOworCWVwLT5lcC5vcHMgPSAmYXN0X3ZodWJf ZXAwX29wczsKKwllcC0+ZXAubmFtZSA9ICJlcDAiOworCWVwLT5lcC5jYXBzLnR5cGVfY29udHJv bCA9IHRydWU7CisJdXNiX2VwX3NldF9tYXhwYWNrZXRfbGltaXQoJmVwLT5lcCwgQVNUX1ZIVUJf RVAwX01BWF9QQUNLRVQpOworCWVwLT5kX2lkeCA9IDA7CisJZXAtPmRldiA9IGRldjsKKwllcC0+ dmh1YiA9IHZodWI7CisJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV90b2tlbjsKKwlJTklUX0xJ U1RfSEVBRCgmZXAtPmVwMC5yZXEucXVldWUpOworCWVwLT5lcDAucmVxLmludGVybmFsID0gdHJ1 ZTsKKworCS8qIFNtYWxsIGRpZmZlcmVuY2UgYmV0d2VlbiB2SHViIGFuZCBkZXZpY2VzICovCisJ aWYgKGRldikgeworCQllcC0+ZXAwLmN0bHN0YXQgPSBkZXYtPnJlZ3MgKyBBU1RfVkhVQl9ERVZf RVAwX0NUUkw7CisJCWVwLT5lcDAuc2V0dXAgPSB2aHViLT5yZWdzICsKKwkJCUFTVF9WSFVCX1NF VFVQMCArIDggKiAoZGV2LT5pbmRleCArIDEpOworCQllcC0+YnVmID0gdmh1Yi0+ZXAwX2J1ZnMg KworCQkJQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQgKiAoZGV2LT5pbmRleCArIDEpOworCQllcC0+ YnVmX2RtYSA9IHZodWItPmVwMF9idWZzX2RtYSArCisJCQlBU1RfVkhVQl9FUDBfTUFYX1BBQ0tF VCAqIChkZXYtPmluZGV4ICsgMSk7CisJfSBlbHNlIHsKKwkJZXAtPmVwMC5jdGxzdGF0ID0gdmh1 Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMOworCQllcC0+ZXAwLnNldHVwID0gdmh1Yi0+cmVn cyArIEFTVF9WSFVCX1NFVFVQMDsKKwkJZXAtPmJ1ZiA9IHZodWItPmVwMF9idWZzOworCQllcC0+ YnVmX2RtYSA9IHZodWItPmVwMF9idWZzX2RtYTsKKwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vwbi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi9lcG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MDAuLjgwYzlmZWFjNTE0NwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91 ZGMvYXNwZWVkLXZodWIvZXBuLmMKQEAgLTAsMCArMSw4NDMgQEAKKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNw ZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGVwbi5jIC0gR2VuZXJpYyBlbmRwb2lu dHMgbWFuYWdlbWVudAorICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoK KyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBp dCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFs IFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91 bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3Vy IG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5l bC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3Jt X2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9w b3J0Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+ CisjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgor I2luY2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgor I2luY2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNp bmNsdWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRl IDxsaW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5j bHVkZSAidmh1Yi5oIgorCisjZGVmaW5lIEVYVFJBX0NIRUNLUworCisjaWZkZWYgRVhUUkFfQ0hF Q0tTCisjZGVmaW5lIENIRUNLKGVwLCBleHByLCBmbXQuLi4pCQkJCQlcCisJZG8gewkJCQkJCQlc CisJCWlmICghKGV4cHIpKSBFUERCRyhlcCwgIkNIRUNLOiIgZm10KTsJCVwKKwl9IHdoaWxlKDAp CisjZWxzZQorI2RlZmluZSBDSEVDSyhlcCwgZXhwciwgZm10Li4uKQlkbyB7IH0gd2hpbGUoMCkK KyNlbmRpZgorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5fa2ljayhzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEpCit7CisJdW5zaWduZWQgaW50IGFjdCA9 IHJlcS0+cmVxLmFjdHVhbDsKKwl1bnNpZ25lZCBpbnQgbGVuID0gcmVxLT5yZXEubGVuZ3RoOwor CXVuc2lnbmVkIGludCBjaHVuazsKKworCS8qIFRoZXJlIHNob3VsZCBiZSBubyBETUEgb25nb2lu ZyAqLworCVdBUk5fT04ocmVxLT5hY3RpdmUpOworCisJLyogQ2FsY3VsYXRlIG5leHQgY2h1bmsg c2l6ZSAqLworCWNodW5rID0gbGVuIC0gYWN0OworCWlmIChjaHVuayA+IGVwLT5lcC5tYXhwYWNr ZXQpCisJCWNodW5rID0gZXAtPmVwLm1heHBhY2tldDsKKwllbHNlIGlmICgoY2h1bmsgPCBlcC0+ ZXAubWF4cGFja2V0KSB8fCAhcmVxLT5yZXEuemVybykKKwkJcmVxLT5sYXN0X2Rlc2MgPSAxOwor CisJRVBWREJHKGVwLCAia2ljayByZXEgJXAgYWN0PSVkLyVkIGNodW5rPSVkIGxhc3Q9JWRcbiIs CisJICAgICAgIHJlcSwgYWN0LCBsZW4sIGNodW5rLCByZXEtPmxhc3RfZGVzYyk7CisKKwkvKiBJ ZiBETUEgdW5hdmFpbGFibGUsIHVzaW5nIHN0YWdpbmcgRVAgYnVmZmVyICovCisJaWYgKCFyZXEt PnJlcS5kbWEpIHsKKworCQkvKiBGb3IgSU4gdHJhbnNmZXJzLCBjb3B5IGRhdGEgb3ZlciBmaXJz dCAqLworCQlpZiAoZXAtPmVwbi5pc19pbikKKwkJCW1lbWNweShlcC0+YnVmLCByZXEtPnJlcS5i dWYgKyBhY3QsIGNodW5rKTsKKwkJd3JpdGVsKGVwLT5idWZfZG1hLCBlcC0+ZXBuLnJlZ3MgKyBB U1RfVkhVQl9FUF9ERVNDX0JBU0UpOworCX0gZWxzZQorCQl3cml0ZWwocmVxLT5yZXEuZG1hICsg YWN0LCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX0JBU0UpOworCisJLyogU3RhcnQg RE1BICovCisJcmVxLT5hY3RpdmUgPSB0cnVlOworCXdyaXRlbChWSFVCX0VQX0RNQV9TRVRfVFhf U0laRShjaHVuayksCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RB VFVTKTsKKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VUX1RYX1NJWkUoY2h1bmspIHwgVkhVQl9FUF9E TUFfU0lOR0xFX0tJQ0ssCisJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0Nf U1RBVFVTKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2soc3RydWN0 IGFzdF92aHViX2VwICplcCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXE7CisJdW5zaWdu ZWQgaW50IGxlbjsKKwl1MzIgc3RhdDsKKworCS8qIFJlYWQgRVAgc3RhdHVzICovCisJc3RhdCA9 IHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCS8qIEdy YWIgY3VycmVudCByZXF1ZXN0IGlmIGFueSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50cnlfb3Jf bnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwlFUFZEQkco ZXAsICJBQ0sgc3RhdHVzPSUwOHggaXNfaW49JWQsIHJlcT0lcCAoYWN0aXZlPSVkKVxuIiwKKwkg ICAgICAgc3RhdCwgZXAtPmVwbi5pc19pbiwgcmVxLCByZXEgPyByZXEtPmFjdGl2ZSA6IDApOwor CisJLyogSW4gYWJzZW5jZSBvZiBhIHJlcXVlc3QsIGJhaWwgb3V0LCBtdXN0IGhhdmUgYmVlbiBk ZXF1ZXVlZCAqLworCWlmICghcmVxKQorCQlyZXR1cm47CisKKwkvKgorCSAqIFJlcXVlc3Qgbm90 IGFjdGl2ZSwgbW92ZSBvbiB0byBwcm9jZXNzaW5nIHF1ZXVlLCBhY3RpdmUgcmVxdWVzdAorCSAq IHdhcyBwcm9iYWJseSBkZXF1ZXVlZAorCSAqLworCWlmICghcmVxLT5hY3RpdmUpCisJCWdvdG8g bmV4dF9jaHVuazsKKworCS8qIENoZWNrIGlmIEhXIGhhcyBtb3ZlZCBvbiAqLworCWlmIChWSFVC X0VQX0RNQV9SUFRSKHN0YXQpICE9IDApIHsKKwkJRVBEQkcoZXAsICJETUEgcmVhZCBwb2ludGVy IG5vdCAwICFcbiIpOworCQlyZXR1cm47CisJfQorCisJLyogTm8gY3VycmVudCBETUEgb25nb2lu ZyAqLworCXJlcS0+YWN0aXZlID0gZmFsc2U7CisKKwkvKiBHcmFiIGxlbmdodCBvdXQgb2YgSFcg Ki8KKwlsZW4gPSBWSFVCX0VQX0RNQV9UWF9TSVpFKHN0YXQpOworCisJLyogSWYgbm90IHVzaW5n IERNQSwgY29weSBkYXRhIG91dCBpZiBuZWVkZWQgKi8KKwlpZiAoIXJlcS0+cmVxLmRtYSAmJiAh ZXAtPmVwbi5pc19pbiAmJiBsZW4pCisJCW1lbWNweShyZXEtPnJlcS5idWYgKyByZXEtPnJlcS5h Y3R1YWwsIGVwLT5idWYsIGxlbik7CisKKwkvKiBBZGp1c3Qgc2l6ZSAqLworCXJlcS0+cmVxLmFj dHVhbCArPSBsZW47CisKKwkvKiBDaGVjayBmb3Igc2hvcnQgcGFja2V0ICovCisJaWYgKGxlbiA8 IGVwLT5lcC5tYXhwYWNrZXQpCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCS8qIFRoYXQncyBp dCA/IGNvbXBsZXRlIHRoZSByZXF1ZXN0IGFuZCBwaWNrIGEgbmV3IG9uZSAqLworCWlmIChyZXEt Pmxhc3RfZGVzYyA+PSAwKSB7CisJCWFzdF92aHViX2RvbmUoZXAsIHJlcSwgMCk7CisJCXJlcSA9 IGxpc3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVx LAorCQkJCQkgICAgICAgcXVldWUpOworCisJCS8qCisJCSAqIER1ZSB0byBsb2NrIGRyb3BwaW5n IGluc2lkZSAiZG9uZSIgdGhlIG5leHQgcmVxdWVzdCBjb3VsZAorCQkgKiBhbHJlYWR5IGJlIGFj dGl2ZSwgc28gY2hlY2sgZm9yIHRoYXQgYW5kIGJhaWwgaWYgbmVlZGVkLgorCQkgKi8KKwkJaWYg KCFyZXEgfHwgcmVxLT5hY3RpdmUpCisJCQlyZXR1cm47CisJfQorCisgbmV4dF9jaHVuazoKKwlh c3Rfdmh1Yl9lcG5fa2ljayhlcCwgcmVxKTsKK30KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBp bnQgYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQorewor CS8qCisJICogZF9uZXh0ID09IGRfbGFzdCBtZWFucyBkZXNjcmlwdG9yIGxpc3QgZW1wdHkgdG8g SFcsCisJICogdGh1cyB3ZSBjYW4gb25seSBoYXZlIEFTVF9WSFVCX0RFU0NTX0NPVU5ULTEgZGVz Y3JpcHRvcnMKKwkgKiBpbiB0aGUgbGlzdAorCSAqLworCXJldHVybiAoZXAtPmVwbi5kX2xhc3Qg KyBBU1RfVkhVQl9ERVNDU19DT1VOVCAtIGVwLT5lcG4uZF9uZXh0IC0gMSkgJgorCQkoQVNUX1ZI VUJfREVTQ1NfQ09VTlQgLSAxKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2tpY2tf ZGVzYyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHN0cnVjdCBhc3Rfdmh1Yl9yZXEg KnJlcSkKK3sKKwl1bnNpZ25lZCBpbnQgYWN0ID0gcmVxLT5hY3RfY291bnQ7CisJdW5zaWduZWQg aW50IGxlbiA9IHJlcS0+cmVxLmxlbmd0aDsKKwl1bnNpZ25lZCBpbnQgY2h1bms7CisKKwkvKiBN YXJrIHJlcXVlc3QgYWN0aXZlIGlmIG5vdCBhbHJlYWR5ICovCisJcmVxLT5hY3RpdmUgPSB0cnVl OworCisJLyogSWYgdGhlIHJlcXVlc3Qgd2FzIGFscmVhZHkgY29tcGxldGVseSB3cml0dGVuLCBk byBub3RoaW5nICovCisJaWYgKHJlcS0+bGFzdF9kZXNjID49IDApCisJCXJldHVybjsKKworCUVQ VkRCRyhlcCwgImtpY2sgYWN0PSVkLyVkIGNodW5rX21heD0lZCBmcmVlX2Rlc2NzPSVkXG4iLAor CSAgICAgICBhY3QsIGxlbiwgZXAtPmVwbi5jaHVua19tYXgsIGFzdF92aHViX2NvdW50X2ZyZWVf ZGVzY3MoZXApKTsKKworCS8qIFdoaWxlIHdlIGNhbiBjcmVhdGUgZGVzY3JpcHRvcnMgKi8KKwl3 aGlsZSAoYXN0X3ZodWJfY291bnRfZnJlZV9kZXNjcyhlcCkgJiYgcmVxLT5sYXN0X2Rlc2MgPCAw KSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9kZXNjICpkZXNjOworCQl1bnNpZ25lZCBpbnQgZF9udW07 CisKKwkJLyogR3JhYiBuZXh0IGZyZWUgZGVzY3JpcHRvciAqLworCQlkX251bSA9IGVwLT5lcG4u ZF9uZXh0OworCQlkZXNjID0gJmVwLT5lcG4uZGVzY3NbZF9udW1dOworCQllcC0+ZXBuLmRfbmV4 dCA9IChkX251bSArIDEpICYgKEFTVF9WSFVCX0RFU0NTX0NPVU5UIC0gMSk7CisKKwkJLyogQ2Fs Y3VsYXRlIG5leHQgY2h1bmsgc2l6ZSAqLworCQljaHVuayA9IGxlbiAtIGFjdDsKKwkJaWYgKGNo dW5rIDw9IGVwLT5lcG4uY2h1bmtfbWF4KSB7CisJCQkvKgorCQkJICogSXMgdGhpcyB0aGUgbGFz dCBwYWNrZXQgPyBCZWNhdXNlIG9mIGhhdmluZyB1cCB0byA4CisJCQkgKiBwYWNrZXRzIGluIGEg ZGVzY3JpcHRvciB3ZSBjYW4ndCBqdXN0IGNvbXBhcmUgImNodW5rIgorCQkJICogd2l0aCBlcC5t YXhwYWNrZXQuIFdlIGhhdmUgdG8gc2VlIGlmIGl0J3MgYSBtdWx0aXBsZQorCQkJICogb2YgaXQg dG8ga25vdyBpZiB3ZSBoYXZlIHRvIHNlbmQgYSB6ZXJvIHBhY2tldC4KKwkJCSAqIFNhZGx5IHRo YXQgaW52b2x2ZXMgYSBtb2R1bG8gd2hpY2ggaXMgYSBiaXQgZXhwZW5zaXZlCisJCQkgKiBidXQg cHJvYmFibHkgc3RpbGwgYmV0dGVyIHRoYW4gbm90IGRvaW5nIGl0LgorCQkJICovCisJCQlpZiAo IWNodW5rIHx8ICFyZXEtPnJlcS56ZXJvIHx8IChjaHVuayAlIGVwLT5lcC5tYXhwYWNrZXQpICE9 IDApCisJCQkJcmVxLT5sYXN0X2Rlc2MgPSBkX251bTsKKwkJfSBlbHNlIHsKKwkJCWNodW5rID0g ZXAtPmVwbi5jaHVua19tYXg7CisJCX0KKworCQlFUFZEQkcoZXAsICIgY2h1bms6IGFjdD0lZC8l ZCBjaHVuaz0lZCBsYXN0PSVkIGRlc2M9JWQgZnJlZT0lZFxuIiwKKwkJICAgICAgIGFjdCwgbGVu LCBjaHVuaywgcmVxLT5sYXN0X2Rlc2MsIGRfbnVtLAorCQkgICAgICAgYXN0X3ZodWJfY291bnRf ZnJlZV9kZXNjcyhlcCkpOworCisJCS8qIFBvcHVsYXRlIGRlc2NyaXB0b3IgKi8KKwkJZGVzYy0+ dzAgPSBjcHVfdG9fbGUzMihyZXEtPnJlcS5kbWEgKyBhY3QpOworCisJCS8qIEludGVycnVwdCBp ZiBlbmQgb2YgcmVxdWVzdCBvciBubyBtb3JlIGRlc2NyaXB0b3JzICovCisKKwkJLyoKKwkJICog VE9ETzogQmUgc21hcnRlciBhYm91dCBpdCwgaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2gKKwkJICog ZGVzY3JpcHRvcnMgcmVxdWVzdCBhbiBpbnRlcnJ1cHQgYmVmb3JlIHF1ZXVlIGVtcHR5CisJCSAq IG9yIHNvIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gcG9wdWxhdGUgbW9yZSBiZWZvcmUKKwkJICog dGhlIEhXIHJ1bnMgb3V0LiBUaGlzIGlzbid0IGEgcHJvYmxlbSBhdCB0aGUgbW9tZW50CisJCSAq IGFzIHdlIHVzZSAyNTYgZGVzY3JpcHRvcnMgYW5kIG9ubHkgcHV0IGF0IG1vc3Qgb25lCisJCSAq IHJlcXVlc3QgaW4gdGhlIHJpbmcuCisJCSAqLworCQlkZXNjLT53MSA9IGNwdV90b19sZTMyKFZI VUJfRFNDMV9JTl9TRVRfTEVOKGNodW5rKSk7CisJCWlmIChyZXEtPmxhc3RfZGVzYyA+PSAwIHx8 ICFhc3Rfdmh1Yl9jb3VudF9mcmVlX2Rlc2NzKGVwKSkKKwkJCWRlc2MtPncxIHw9IGNwdV90b19s ZTMyKFZIVUJfRFNDMV9JTl9JTlRFUlJVUFQpOworCisJCS8qIEFjY291bnQgcGFja2V0ICovCisJ CXJlcS0+YWN0X2NvdW50ID0gYWN0ID0gYWN0ICsgY2h1bms7CisJfQorCisJLyogVGVsbCBIVyBh Ym91dCBuZXcgZGVzY3JpcHRvcnMgKi8KKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VUX0NQVV9XUFRS KGVwLT5lcG4uZF9uZXh0KSwKKwkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVT Q19TVEFUVVMpOworCisJRVBWREJHKGVwLCAiSFcga2lja2VkLCBkX25leHQ9JWQgZHN0YXQ9JTA4 eFxuIiwKKwkgICAgICAgZXAtPmVwbi5kX25leHQsIHJlYWRsKGVwLT5lcG4ucmVncyArIEFTVF9W SFVCX0VQX0RFU0NfU1RBVFVTKSk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9oYW5k bGVfYWNrX2Rlc2Moc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJf cmVxICpyZXE7CisJdW5zaWduZWQgaW50IGxlbiwgZF9sYXN0OworCXUzMiBzdGF0LCBzdGF0MTsK KworCS8qIFJlYWQgRVAgc3RhdHVzLCB3b3JrYXJvdW5kIEhXIHJhY2UgKi8KKwlkbyB7CisJCXN0 YXQgPSByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJCXN0 YXQxID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCX0g d2hpbGUoc3RhdCAhPSBzdGF0MSk7CisKKwkvKiBFeHRyYWN0IFJQVFIgKi8KKwlkX2xhc3QgPSBW SFVCX0VQX0RNQV9SUFRSKHN0YXQpOworCisJLyogR3JhYiBjdXJyZW50IHJlcXVlc3QgaWYgYW55 ICovCisJcmVxID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxsKCZlcC0+cXVldWUsIHN0cnVjdCBh c3Rfdmh1Yl9yZXEsIHF1ZXVlKTsKKworCUVQVkRCRyhlcCwgIkFDSyBzdGF0dXM9JTA4eCBpc19p bj0lZCBlcC0+ZF9sYXN0PSVkLi4lZFxuIiwKKwkgICAgICAgc3RhdCwgZXAtPmVwbi5pc19pbiwg ZXAtPmVwbi5kX2xhc3QsIGRfbGFzdCk7CisKKwkvKiBDaGVjayBhbGwgY29tcGxldGVkIGRlc2Ny aXB0b3JzICovCisJd2hpbGUgKGVwLT5lcG4uZF9sYXN0ICE9IGRfbGFzdCkgeworCQlzdHJ1Y3Qg YXN0X3ZodWJfZGVzYyAqZGVzYzsKKwkJdW5zaWduZWQgaW50IGRfbnVtOworCQlib29sIGlzX2xh c3RfZGVzYzsKKworCQkvKiBHcmFiIG5leHQgY29tcGxldGVkIGRlc2NyaXB0b3IgKi8KKwkJZF9u dW0gPSBlcC0+ZXBuLmRfbGFzdDsKKwkJZGVzYyA9ICZlcC0+ZXBuLmRlc2NzW2RfbnVtXTsKKwkJ ZXAtPmVwbi5kX2xhc3QgPSAoZF9udW0gKyAxKSAmIChBU1RfVkhVQl9ERVNDU19DT1VOVCAtIDEp OworCisJCS8qIEdyYWIgbGVuIG91dCBvZiBkZXNjcmlwdG9yICovCisJCWxlbiA9IFZIVUJfRFND MV9JTl9MRU4obGUzMl90b19jcHUoZGVzYy0+dzEpKTsKKworCQlFUFZEQkcoZXAsICIgZGVzYyAl ZCBsZW49JWQgcmVxPSVwIChhY3Q9JWQpXG4iLAorCQkgICAgICAgZF9udW0sIGxlbiwgcmVxLCBy ZXEgPyByZXEtPmFjdGl2ZSA6IDApOworCisJCS8qIElmIG5vIGFjdGl2ZSByZXF1ZXN0IHBlbmRp bmcsIG1vdmUgb24gKi8KKwkJaWYgKCFyZXEgfHwgIXJlcS0+YWN0aXZlKQorCQkJY29udGludWU7 CisKKwkJLyogQWRqdXN0IHNpemUgKi8KKwkJcmVxLT5yZXEuYWN0dWFsICs9IGxlbjsKKworCQkv KiBJcyB0aGF0IHRoZSBsYXN0IGNodW5rID8gKi8KKwkJaXNfbGFzdF9kZXNjID0gcmVxLT5sYXN0 X2Rlc2MgPT0gZF9udW07CisJCUNIRUNLKGVwLCBpc19sYXN0X2Rlc2MgPT0gKGxlbiA8IGVwLT5l cC5tYXhwYWNrZXQgfHwKKwkJCQkJICAgKHJlcS0+cmVxLmFjdHVhbCA+PSByZXEtPnJlcS5sZW5n dGggJiYKKwkJCQkJICAgICFyZXEtPnJlcS56ZXJvKSksCisJCSAgICAgICJMYXN0IHBhY2tldCBk aXNjcmVwYW5jeTogbGFzdF9kZXNjPSVkIGxlbj0lZCByLmFjdD0lZCAiCisJCSAgICAgICJyLmxl bj0lZCByLnplcm89JWQgbXA9JWRcbiIsCisJCSAgICAgIGlzX2xhc3RfZGVzYywgbGVuLCByZXEt PnJlcS5hY3R1YWwsIHJlcS0+cmVxLmxlbmd0aCwKKwkJICAgICAgcmVxLT5yZXEuemVybywgZXAt PmVwLm1heHBhY2tldCk7CisKKwkJaWYgKGlzX2xhc3RfZGVzYykgeworCQkJLyoKKwkJCSAqIEJl Y2F1c2Ugd2UgY2FuIG9ubHkgaGF2ZSBvbmUgcmVxdWVzdCBhdCBhIHRpbWUKKwkJCSAqIGluIG91 ciBkZXNjcmlwdG9yIGxpc3QgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwKKwkJCSAqIGRfbGFzdCBh bmQgZXAtPmRfbGFzdCBzaG91bGQgbm93IGJlIGVxdWFsCisJCQkgKi8KKwkJCUNIRUNLKGVwLCBk X2xhc3QgPT0gZXAtPmVwbi5kX2xhc3QsCisJCQkgICAgICAiRE1BIHJlYWQgcHRyIG1pc21hdGNo ICVkIHZzICVkXG4iLAorCQkJICAgICAgZF9sYXN0LCBlcC0+ZXBuLmRfbGFzdCk7CisKKwkJCS8q IE5vdGU6IGRvbmUgd2lsbCBkcm9wIGFuZCByZS1hY3F1aXJlIHRoZSBsb2NrICovCisJCQlhc3Rf dmh1Yl9kb25lKGVwLCByZXEsIDApOworCQkJcmVxID0gbGlzdF9maXJzdF9lbnRyeV9vcl9udWxs KCZlcC0+cXVldWUsCisJCQkJCQkgICAgICAgc3RydWN0IGFzdF92aHViX3JlcSwKKwkJCQkJCSAg ICAgICBxdWV1ZSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIE1vcmUgd29yayA/ICovCisJ aWYgKHJlcSkKKwkJYXN0X3ZodWJfZXBuX2tpY2tfZGVzYyhlcCwgcmVxKTsKK30KKwordm9pZCBh c3Rfdmh1Yl9lcG5fYWNrX2lycShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKQoreworCWlmIChlcC0+ ZXBuLmRlc2NfbW9kZSkKKwkJYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2tfZGVzYyhlcCk7CisJZWxz ZQorCQlhc3Rfdmh1Yl9lcG5faGFuZGxlX2FjayhlcCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3Zo dWJfZXBuX3F1ZXVlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1c2JfcmVxdWVzdCAqdV9y ZXEsCisJCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MpCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAq cmVxID0gdG9fYXN0X3JlcSh1X3JlcSk7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2Fz dF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCWJvb2wgZW1wdHk7CisJaW50IHJjOworCisJLyogUGFyYW5vaWQgY2hl Y2tzICovCisJaWYgKCF1X3JlcSB8fCAhdV9yZXEtPmNvbXBsZXRlIHx8ICF1X3JlcS0+YnVmKSB7 CisJCWRldl93YXJuKCZ2aHViLT5wZGV2LT5kZXYsICJCb2d1cyBFUG4gcmVxdWVzdCAhIHVfcmVx PSVwXG4iLCB1X3JlcSk7CisJCWlmICh1X3JlcSkgeworCQkJZGV2X3dhcm4oJnZodWItPnBkZXYt PmRldiwgImNvbXBsZXRlPSVwIGludGVybmFsPSVkXG4iLAorCQkJCSB1X3JlcS0+Y29tcGxldGUs IHJlcS0+aW50ZXJuYWwpOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuZHBv aW50IGVuYWJsZWQgPyAqLworCWlmICghZXAtPmVwbi5lbmFibGVkIHx8ICF1X2VwLT5kZXNjIHx8 ICFlcC0+ZGV2IHx8ICFlcC0+ZF9pZHggfHwKKwkgICAgIWVwLT5kZXYtPmVuYWJsZWQgfHwgZXAt PmRldi0+c3VzcGVuZGVkKSB7CisJCUVQREJHKGVwLCJFbnF1ZWluZyByZXF1ZXN0IG9uIHdyb25n IG9yIGRpc2FibGVkIEVQXG4iKTsKKwkJcmV0dXJuIC1FU0hVVERPV047CisJfQorCisJLyogTWFw IHJlcXVlc3QgZm9yIERNQSBpZiBwb3NzaWJsZS4gRm9yIG5vdywgdGhlIHJ1bGUgZm9yIERNQSBp cworCSAqIHRoYXQ6CisJICoKKwkgKiAgKiBGb3Igc2luZ2xlIHN0YWdlIG1vZGUgKG5vIGRlc2Ny aXB0b3JzKToKKwkgKgorCSAqICAgLSBUaGUgYnVmZmVyIGlzIGFsaWduZWQgdG8gYSA4IGJ5dGVz IGJvdW5kYXJ5IChIVyByZXF1aXJlbWVudCkKKwkgKiAgIC0gRm9yIGEgT1VUIGVuZHBvaW50LCB0 aGUgcmVxdWVzdCBzaXplIGlzIGEgbXVsdGlwbGUgb2YgdGhlIEVQCisJICogICAgIHBhY2tldCBz aXplIChvdGhlcndpc2UgdGhlIGNvbnRyb2xsZXIgd2lsbCBETUEgcGFzdCB0aGUgZW5kCisJICog ICAgIG9mIHRoZSBidWZmZXIgaWYgdGhlIGhvc3QgaXMgc2VuZGluZyBhIHRvbyBsb25nIHBhY2tl dCkuCisJICoKKwkgKiAgKiBGb3IgZGVzY3JpcHRvciBtb2RlICh0eCBvbmx5IGZvciBub3cpLCBh bHdheXMuCisJICoKKwkgKiBXZSBjb3VsZCByZWxheCB0aGUgbGF0dGVyIGJ5IG1ha2luZyB0aGUg ZGVjaXNpb24gdG8gdXNlIHRoZSBib3VuY2UKKwkgKiBidWZmZXIgYmFzZWQgb24gdGhlIHNpemUg b2YgYSBnaXZlbiAqc2VnbWVudCogb2YgdGhlIHJlcXVlc3QgcmF0aGVyCisJICogdGhhbiB0aGUg d2hvbGUgcmVxdWVzdC4KKwkgKi8KKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUgfHwKKwkgICAgKCgo KHVuc2lnbmVkIGxvbmcpdV9yZXEtPmJ1ZiAmIDcpID09IDApICYmCisJICAgICAoZXAtPmVwbi5p c19pbiB8fCAhKHVfcmVxLT5sZW5ndGggJiAodV9lcC0+bWF4cGFja2V0IC0gMSkpKSkpIHsKKwkJ cmMgPSB1c2JfZ2FkZ2V0X21hcF9yZXF1ZXN0KCZlcC0+ZGV2LT5nYWRnZXQsIHVfcmVxLAorCQkJ CQkgICAgZXAtPmVwbi5pc19pbik7CisJCWlmIChyYykgeworCQkJZGV2X3dhcm4oJnZodWItPnBk ZXYtPmRldiwKKwkJCQkgIlJlcXVlc3QgbWFwcGluZyBmYWlsdXJlICVkXG4iLCByYyk7CisJCQly ZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UKKwkJdV9yZXEtPmRtYSA9IDA7CisKKwlFUFZEQkcoZXAs ICJlbnF1ZXVlIHJlcSBAJXBcbiIsIHJlcSk7CisJRVBWREJHKGVwLCAiIGw9JWQgZG1hPTB4JXgg emVybz0lZCBub3Nob3J0PSVkIG5vaXJxPSVkIGlzX2luPSVkXG4iLAorCSAgICAgICB1X3JlcS0+ bGVuZ3RoLCAodTMyKXVfcmVxLT5kbWEsIHVfcmVxLT56ZXJvLAorCSAgICAgICB1X3JlcS0+c2hv cnRfbm90X29rLCB1X3JlcS0+bm9faW50ZXJydXB0LAorCSAgICAgICBlcC0+ZXBuLmlzX2luKTsK KworCS8qIEluaXRpYWxpemUgcmVxdWVzdCBwcm9ncmVzcyBmaWVsZHMgKi8KKwl1X3JlcS0+c3Rh dHVzID0gLUVJTlBST0dSRVNTOworCXVfcmVxLT5hY3R1YWwgPSAwOworCXJlcS0+YWN0X2NvdW50 ID0gMDsKKwlyZXEtPmFjdGl2ZSA9IGZhbHNlOworCXJlcS0+bGFzdF9kZXNjID0gLTE7CisJc3Bp bl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwllbXB0eSA9IGxpc3RfZW1wdHko JmVwLT5xdWV1ZSk7CisKKwkvKiBBZGQgcmVxdWVzdCB0byBsaXN0IGFuZCBraWNrIHByb2Nlc3Np bmcgaWYgZW1wdHkgKi8KKwlsaXN0X2FkZF90YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsK KwlpZiAoZW1wdHkpIHsKKwkJaWYgKGVwLT5lcG4uZGVzY19tb2RlKQorCQkJYXN0X3ZodWJfZXBu X2tpY2tfZGVzYyhlcCwgcmVxKTsKKwkJZWxzZQorCQkJYXN0X3ZodWJfZXBuX2tpY2soZXAsIHJl cSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9zdG9wX2FjdGl2ZV9yZXEoc3Ry dWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkgICAgIGJvb2wgcmVzdGFydF9lcCkKK3sKKwl1MzIg c3RhdGUsIHJlZywgbG9vcHM7CisKKwkvKiBTdG9wIERNQSBhY3Rpdml0eSAqLworCXdyaXRlbCgw LCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisKKwkvKiBXYWl0IGZv ciBpdCB0byBjb21wbGV0ZSAqLworCWZvciAobG9vcHMgPSAwOyBsb29wcyA8IDEwMDA7IGxvb3Bz KyspIHsKKwkJc3RhdGUgPSByZWFkbChlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RM U1RBVCk7CisJCXN0YXRlID0gVkhVQl9FUF9ETUFfUFJPQ19TVEFUVVMoc3RhdGUpOworCQlpZiAo c3RhdGUgPT0gRVBfRE1BX1BST0NfUlhfSURMRSB8fAorCQkgICAgc3RhdGUgPT0gRVBfRE1BX1BS T0NfVFhfSURMRSkKKwkJCWJyZWFrOworCQl1ZGVsYXkoMSk7CisJfQorCWlmIChsb29wcyA+PSAx MDAwKQorCQlkZXZfd2FybigmZXAtPnZodWItPnBkZXYtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBm b3IgRE1BXG4iKTsKKworCS8qIElmIHdlIGRvbid0IGhhdmUgdG8gcmVzdGFydCB0aGUgZW5kcG9p bnQsIHRoYXQncyBpdCAqLworCWlmICghcmVzdGFydF9lcCkKKwkJcmV0dXJuOworCisJLyogUmVz dGFydCB0aGUgZW5kcG9pbnQgKi8KKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpIHsKKwkJLyoKKwkJ ICogVGFrZSBvdXQgZGVzY3JpcHRvcnMgYnkgcmVzZXR0aW5nIHRoZSBETUEgcmVhZAorCQkgKiBw b2ludGVyIHRvIGJlIGVxdWFsIHRvIHRoZSBDUFUgd3JpdGUgcG9pbnRlci4KKwkJICoKKwkJICog Tm90ZTogSWYgd2UgZXZlciBzdXBwb3J0IGNyZWF0aW5nIGRlc2NyaXB0b3JzIGZvcgorCQkgKiBy ZXF1ZXN0cyB0aGF0IGFyZW4ndCB0aGUgaGVhZCBvZiB0aGUgcXVldWUsIHdlCisJCSAqIG1heSBo YXZlIHRvIGRvIHNvbWV0aGluZyBtb3JlIGNvbXBsZXggaGVyZSwKKwkJICogZXNwZWNpYWxseSBp ZiB0aGUgcmVxdWVzdCBiZWluZyB0YWtlbiBvdXQgaXMKKwkJICogbm90IHRoZSBjdXJyZW50IGhl YWQgZGVzY3JpcHRvcnMuCisJCSAqLworCQlyZWcgPSBWSFVCX0VQX0RNQV9TRVRfUlBUUihlcC0+ ZXBuLmRfbmV4dCkgfAorCQkJVkhVQl9FUF9ETUFfU0VUX0NQVV9XUFRSKGVwLT5lcG4uZF9uZXh0 KTsKKwkJd3JpdGVsKHJlZywgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMp OworCisJCS8qIFRoZW4gdHVybiBpdCBiYWNrIG9uICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9j b25mLAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOwor CX0gZWxzZSB7CisJCS8qIFNpbmdsZSBtb2RlOiBqdXN0IHR1cm4gaXQgYmFjayBvbiAqLworCQl3 cml0ZWwoZXAtPmVwbi5kbWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVC X0VQX0RNQV9DVExTVEFUKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX2RlcXVl dWUoc3RydWN0IHVzYl9lcCogdV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSkKK3sKKwlz dHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1 YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwl1bnNpZ25l ZCBsb25nIGZsYWdzOworCWludCByYyA9IC1FSU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgm dmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVk IG9uIHRoaXMgZW5kcG9pbnQgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVl dWUsIHF1ZXVlKSB7CisJCWlmICgmcmVxLT5yZXEgPT0gdV9yZXEpCisJCQlicmVhazsKKwl9CisK KwlpZiAoJnJlcS0+cmVxID09IHVfcmVxKSB7CisJCUVQVkRCRyhlcCwgImRlcXVldWUgcmVxIEAl cCBhY3RpdmU9JWRcbiIsCisJCSAgICAgICByZXEsIHJlcS0+YWN0aXZlKTsKKwkJaWYgKHJlcS0+ YWN0aXZlKQorCQkJYXN0X3ZodWJfc3RvcF9hY3RpdmVfcmVxKGVwLCB0cnVlKTsKKwkJYXN0X3Zo dWJfZG9uZShlcCwgcmVxLCAtRUNPTk5SRVNFVCk7CisJCXJjID0gMDsKKwl9CisKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCit2 b2lkIGFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sK Kwl1MzIgcmVnOworCisJaWYgKFdBUk5fT04oZXAtPmRfaWR4ID09IDApKQorCQlyZXR1cm47CisJ cmVnID0gcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsKKwlpZiAoZXAt PmVwbi5zdGFsbGVkIHx8IGVwLT5lcG4ud2VkZ2VkKQorCQlyZWcgfD0gVkhVQl9FUF9DRkdfU1RB TExfQ1RSTDsKKwllbHNlCisJCXJlZyAmPSB+VkhVQl9FUF9DRkdfU1RBTExfQ1RSTDsKKwl3cml0 ZWwocmVnLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9DT05GSUcpOworCisJaWYgKCFlcC0+ ZXBuLnN0YWxsZWQgJiYgIWVwLT5lcG4ud2VkZ2VkKQorCQl3cml0ZWwoVkhVQl9FUF9UT0dHTEVf U0VUX0VQTlVNKGVwLT5lcG4uZ19pZHgpLAorCQkgICAgICAgZXAtPnZodWItPnJlZ3MgKyBBU1Rf VkhVQl9FUF9UT0dHTEUpOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3NldF9oYWx0X2FuZF93 ZWRnZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBib29sIGhhbHQsCisJCQkJICAgICAgYm9vbCB3ZWRn ZSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVj dCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlF UERCRyhlcCwgIlNldCBoYWx0ICglZCkgJiB3ZWRnZSAoJWQpXG4iLCBoYWx0LCB3ZWRnZSk7CisK KwlpZiAoIXVfZXAgfHwgIXVfZXAtPmRlc2MpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChlcC0+ ZF9pZHggPT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKGVwLT5lcG4uaXNfaXNvKQorCQlyZXR1cm4g LUVPUE5PVFNVUFA7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOwor CisJLyogRmFpbCB3aXRoIHN0aWxsLWJ1c3kgSU4gZW5kcG9pbnRzICovCisJaWYgKGhhbHQgJiYg ZXAtPmVwbi5pc19pbiAmJiAhbGlzdF9lbXB0eSgmZXAtPnF1ZXVlKSkgeworCQlzcGluX3VubG9j a19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0K KwllcC0+ZXBuLnN0YWxsZWQgPSBoYWx0OworCWVwLT5lcG4ud2VkZ2VkID0gd2VkZ2U7CisJYXN0 X3ZodWJfdXBkYXRlX2Vwbl9zdGFsbChlcCk7CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2 aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1 Yl9lcG5fc2V0X2hhbHQoc3RydWN0IHVzYl9lcCAqdV9lcCwgaW50IHZhbHVlKQoreworCXJldHVy biBhc3Rfdmh1Yl9zZXRfaGFsdF9hbmRfd2VkZ2UodV9lcCwgdmFsdWUgIT0gMCwgZmFsc2UpOwor fQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9zZXRfd2VkZ2Uoc3RydWN0IHVzYl9lcCAqdV9l cCkKK3sKKwlyZXR1cm4gYXN0X3ZodWJfc2V0X2hhbHRfYW5kX3dlZGdlKHVfZXAsIHRydWUsIHRy dWUpOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9kaXNhYmxlKHN0cnVjdCB1c2JfZXAq IHVfZXApCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlz dHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CXUzMiBpbWFzaywgZXBfaWVyOworCisJRVBEQkcoZXAsICJEaXNhYmxpbmcgIVxuIik7CisKKwlz cGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJZXAtPmVwbi5lbmFibGVk ID0gZmFsc2U7CisKKwkvKiBTdG9wIGFjdGl2ZSBETUEgaWYgYW55ICovCisJYXN0X3ZodWJfc3Rv cF9hY3RpdmVfcmVxKGVwLCBmYWxzZSk7CisKKwkvKiBEaXNhYmxlIGVuZHBvaW50ICovCisJd3Jp dGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0NPTkZJRyk7CisKKwkvKiBEaXNhYmxl IEFDSyBpbnRlcnJ1cHQgKi8KKwlpbWFzayA9IFZIVUJfRVBfSVJRKGVwLT5lcG4uZ19pZHgpOwor CWVwX2llciA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKwllcF9p ZXIgJj0gfmltYXNrOworCXdyaXRlbChlcF9pZXIsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9B Q0tfSUVSKTsKKwl3cml0ZWwoaW1hc2ssIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNS KTsKKworCS8qIE51a2UgYWxsIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlhc3Rfdmh1Yl9udWtlKGVw LCAtRVNIVVRET1dOKTsKKworCS8qIE5vIG1vcmUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGgg cmVxdWVzdCAqLworCWVwLT5lcC5kZXNjID0gTlVMTDsKKworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFz dF92aHViX2Vwbl9lbmFibGUoc3RydWN0IHVzYl9lcCogdV9lcCwKKwkJCSAgICAgICBjb25zdCBz dHJ1Y3QgdXNiX2VuZHBvaW50X2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJc3RhdGljIGNvbnN0IGNo YXIgKmVwX3R5cGVfc3RyaW5nW10gX19tYXliZV91bnVzZWQgPSB7ICJjdHJsIiwKKwkJCQkJCQkg ICAgICAgImlzb2MiLAorCQkJCQkJCSAgICAgICAiYnVsayIsCisJCQkJCQkJICAgICAgICJpbnRy IiB9OworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJc3RydWN0 IGFzdF92aHViX2RldiAqZGV2OworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YjsKKwl1MTYgbWF4cGFj a2V0LCB0eXBlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGVwX2NvbmYsIGVwX2llciwg aW1hc2s7CisKKwkvKiBDaGVjayBhcmd1bWVudHMgKi8KKwlpZiAoIXVfZXAgfHwgIWRlc2MpCisJ CXJldHVybiAtRUlOVkFMOworCisJbWF4cGFja2V0ID0gdXNiX2VuZHBvaW50X21heHAoZGVzYyk7 CisJaWYgKCFlcC0+ZF9pZHggfHwgIWVwLT5kZXYgfHwKKwkgICAgZGVzYy0+YkRlc2NyaXB0b3JU eXBlICE9IFVTQl9EVF9FTkRQT0lOVCB8fAorCSAgICBtYXhwYWNrZXQgPT0gMCB8fCBtYXhwYWNr ZXQgPiBlcC0+ZXAubWF4cGFja2V0KSB7CisJCUVQREJHKGVwLCAiSW52YWxpZCBFUCBlbmFibGUs ZF9pZHg9JWQsZGV2PSVwLHR5cGU9JWQsbXA9JWQvJWRcbiIsCisJCSAgICAgIGVwLT5kX2lkeCwg ZXAtPmRldiwgZGVzYy0+YkRlc2NyaXB0b3JUeXBlLAorCQkgICAgICBtYXhwYWNrZXQsIGVwLT5l cC5tYXhwYWNrZXQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKGVwLT5kX2lkeCAhPSB1 c2JfZW5kcG9pbnRfbnVtKGRlc2MpKSB7CisJCUVQREJHKGVwLCAiRVAgbnVtYmVyIG1pc21hdGNo ICFcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZXAtPmVwbi5lbmFibGVkKSB7 CisJCUVQREJHKGVwLCAiQWxyZWFkeSBlbmFibGVkXG4iKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9 CisJZGV2ID0gZXAtPmRldjsKKwl2aHViID0gZXAtPnZodWI7CisKKwkvKiBDaGVjayBkZXZpY2Ug c3RhdGUgKi8KKwlpZiAoIWRldi0+ZHJpdmVyKSB7CisJCUVQREJHKGVwLCAiQm9ndXMgZGV2aWNl IHN0YXRlOiBkcml2ZXI9JXAgc3BlZWQ9JWRcbiIsCisJCSAgICAgICBkZXYtPmRyaXZlciwgZGV2 LT5nYWRnZXQuc3BlZWQpOworCQlyZXR1cm4gLUVTSFVURE9XTjsKKwl9CisKKwkvKiBHcmFiIHNv bWUgaW5mbyBmcm9tIHRoZSBkZXNjcmlwdG9yICovCisJZXAtPmVwbi5pc19pbiA9IHVzYl9lbmRw b2ludF9kaXJfaW4oZGVzYyk7CisJZXAtPmVwLm1heHBhY2tldCA9IG1heHBhY2tldDsKKwl0eXBl ID0gdXNiX2VuZHBvaW50X3R5cGUoZGVzYyk7CisJZXAtPmVwbi5kX25leHQgPSBlcC0+ZXBuLmRf bGFzdCA9IDA7CisJZXAtPmVwbi5pc19pc28gPSBmYWxzZTsKKwllcC0+ZXBuLnN0YWxsZWQgPSBm YWxzZTsKKwllcC0+ZXBuLndlZGdlZCA9IGZhbHNlOworCisJRVBEQkcoZXAsICJFbmFibGluZyBb JXNdICVzIG51bSAlZCBtYXhwYWNrZXQ9JWRcbiIsCisJICAgICAgZXAtPmVwbi5pc19pbiA/ICJp biIgOiAib3V0IiwgZXBfdHlwZV9zdHJpbmdbdHlwZV0sCisJICAgICAgdXNiX2VuZHBvaW50X251 bShkZXNjKSwgbWF4cGFja2V0KTsKKworCS8qIENhbiB3ZSB1c2UgRE1BIGRlc2NyaXB0b3IgbW9k ZSA/ICovCisJZXAtPmVwbi5kZXNjX21vZGUgPSBlcC0+ZXBuLmRlc2NzICYmIGVwLT5lcG4uaXNf aW47CisJaWYgKGVwLT5lcG4uZGVzY19tb2RlKQorCQltZW1zZXQoZXAtPmVwbi5kZXNjcywgMCwg OCAqIEFTVF9WSFVCX0RFU0NTX0NPVU5UKTsKKworCS8qCisJICogTGFyZ2Ugc2VuZCBmdW5jdGlv biBjYW4gc2VuZCB1cCB0byA4IHBhY2tldHMgZnJvbQorCSAqIG9uZSBkZXNjcmlwdG9yIHdpdGgg YSBsaW1pdCBvZiA0MDk1IGJ5dGVzLgorCSAqLworCWVwLT5lcG4uY2h1bmtfbWF4ID0gZXAtPmVw Lm1heHBhY2tldDsKKwlpZiAoZXAtPmVwbi5pc19pbikgeworCQllcC0+ZXBuLmNodW5rX21heCA8 PD0gMzsKKwkJd2hpbGUgKGVwLT5lcG4uY2h1bmtfbWF4ID4gNDA5NSkKKwkJCWVwLT5lcG4uY2h1 bmtfbWF4IC09IGVwLT5lcC5tYXhwYWNrZXQ7CisJfQorCisJc3dpdGNoKHR5cGUpIHsKKwljYXNl IFVTQl9FTkRQT0lOVF9YRkVSX0NPTlRST0w6CisJCUVQREJHKGVwLCAiT25seSBvbmUgY29udHJv bCBlbmRwb2ludFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCWNhc2UgVVNCX0VORFBPSU5UX1hG RVJfSU5UOgorCQllcF9jb25mID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9JTlQpOwor CQlicmVhazsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJCWVwX2NvbmYgPSBWSFVC X0VQX0NGR19TRVRfVFlQRShFUF9UWVBFX0JVTEspOworCQlicmVhazsKKwljYXNlIFVTQl9FTkRQ T0lOVF9YRkVSX0lTT0M6CisJCWVwX2NvbmYgPSBWSFVCX0VQX0NGR19TRVRfVFlQRShFUF9UWVBF X0lTTyk7CisJCWVwLT5lcG4uaXNfaXNvID0gdHJ1ZTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyogRW5jb2RlIHRoZSByZXN0IG9mIHRoZSBFUCBjb25m aWcgcmVnaXN0ZXIgKi8KKwlpZiAobWF4cGFja2V0IDwgMTAyNCkKKwkJZXBfY29uZiB8PSBWSFVC X0VQX0NGR19TRVRfTUFYX1BLVChtYXhwYWNrZXQpOworCWlmICghZXAtPmVwbi5pc19pbikKKwkJ ZXBfY29uZiB8PSBWSFVCX0VQX0NGR19ESVJfT1VUOworCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdf U0VUX0VQX05VTSh1c2JfZW5kcG9pbnRfbnVtKGRlc2MpKTsKKwllcF9jb25mIHw9IFZIVUJfRVBf Q0ZHX0VOQUJMRTsKKwllcF9jb25mIHw9IFZIVUJfRVBfQ0ZHX1NFVF9ERVYoZGV2LT5pbmRleCAr IDEpOworCUVQVkRCRyhlcCwgImNvbmZpZz0lMDh4XG4iLCBlcF9jb25mKTsKKworCXNwaW5fbG9j a19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwkvKiBEaXNhYmxlIEhXIGFuZCByZXNl dCBETUEgKi8KKwl3cml0ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsK Kwl3cml0ZWwoVkhVQl9FUF9ETUFfQ1RSTF9SRVNFVCwKKwkgICAgICAgZXAtPmVwbi5yZWdzICsg QVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCisJLyogQ29uZmlndXJlIGFuZCBlbmFibGUgKi8K Kwl3cml0ZWwoZXBfY29uZiwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfQ09ORklHKTsKKwor CWlmIChlcC0+ZXBuLmRlc2NfbW9kZSkgeworCQkvKiBDbGVhciBETUEgc3RhdHVzLCBpbmNsdWRp bmcgdGhlIERNQSByZWFkIHB0ciAqLworCQl3cml0ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZI VUJfRVBfREVTQ19TVEFUVVMpOworCisJCS8qIFNldCBkZXNjcmlwdG9yIGJhc2UgKi8KKwkJd3Jp dGVsKGVwLT5lcG4uZGVzY3NfZG1hLAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJf RVBfREVTQ19CQVNFKTsKKworCQkvKiBTZXQgYmFzZSBETUEgY29uZmlnIHZhbHVlICovCisJCWVw LT5lcG4uZG1hX2NvbmYgPSBWSFVCX0VQX0RNQV9ERVNDX01PREU7CisJCWlmIChlcC0+ZXBuLmlz X2luKQorCQkJZXAtPmVwbi5kbWFfY29uZiB8PSBWSFVCX0VQX0RNQV9JTl9MT05HX01PREU7CisK KwkJLyogRmlyc3QgcmVzZXQgYW5kIGRpc2FibGUgYWxsIG9wZXJhdGlvbnMgKi8KKwkJd3JpdGVs KGVwLT5lcG4uZG1hX2NvbmYgfCBWSFVCX0VQX0RNQV9DVFJMX1JFU0VULAorCQkgICAgICAgZXAt PmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCisJCS8qIEVuYWJsZSBkZXNj cmlwdG9yIG1vZGUgKi8KKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYsCisJCSAgICAgICBlcC0+ ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJfSBlbHNlIHsKKwkJLyogU2V0 IGJhc2UgRE1BIGNvbmZpZyB2YWx1ZSAqLworCQllcC0+ZXBuLmRtYV9jb25mID0gVkhVQl9FUF9E TUFfU0lOR0xFX1NUQUdFOworCisJCS8qIFJlc2V0IGFuZCBzd2l0Y2ggdG8gc2luZ2xlIHN0YWdl IG1vZGUgKi8KKwkJd3JpdGVsKGVwLT5lcG4uZG1hX2NvbmYgfCBWSFVCX0VQX0RNQV9DVFJMX1JF U0VULAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOwor CQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9W SFVCX0VQX0RNQV9DVExTVEFUKTsKKwkJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9WSFVC X0VQX0RFU0NfU1RBVFVTKTsKKwl9CisKKwkvKiBDbGVhbnVwIGRhdGEgdG9nZ2xlIGp1c3QgaW4g Y2FzZSAqLworCXdyaXRlbChWSFVCX0VQX1RPR0dMRV9TRVRfRVBOVU0oZXAtPmVwbi5nX2lkeCks CisJICAgICAgIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9UT0dHTEUpOworCisJLyogQ2xlYW51 cCBhbmQgZW5hYmxlIEFDSyBpbnRlcnJ1cHQgKi8KKwlpbWFzayA9IFZIVUJfRVBfSVJRKGVwLT5l cG4uZ19pZHgpOworCXdyaXRlbChpbWFzaywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19J U1IpOworCWVwX2llciA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsK KwllcF9pZXIgfD0gaW1hc2s7CisJd3JpdGVsKGVwX2llciwgdmh1Yi0+cmVncyArIEFTVF9WSFVC X0VQX0FDS19JRVIpOworCisJLyogV29vdCwgd2UgYXJlIG9ubGluZSAhICovCisJZXAtPmVwbi5l bmFibGVkID0gdHJ1ZTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZs YWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5fZGlzcG9z ZShzdHJ1Y3QgdXNiX2VwICp1X2VwKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19h c3RfZXAodV9lcCk7CisKKwlpZiAoV0FSTl9PTighZXAtPmRldiB8fCAhZXAtPmRfaWR4KSkKKwkJ cmV0dXJuOworCisJRVBEQkcoZXAsICJSZWxlYXNpbmcgZW5kcG9pbnRcbiIpOworCisJLyogVGFr ZSBpdCBvdXQgb2YgdGhlIEVQIGxpc3QgKi8KKwlsaXN0X2RlbF9pbml0KCZlcC0+ZXAuZXBfbGlz dCk7CisKKwkvKiBNYXJrIHRoZSBhZGRyZXNzIGZyZWUgaW4gdGhlIGRldmljZSAqLworCWVwLT5k ZXYtPmVwbnNbZXAtPmRfaWR4IC0gMV0gPSBOVUxMOworCisJLyogRnJlZSBuYW1lICYgRE1BIGJ1 ZmZlcnMgKi8KKwlrZnJlZShlcC0+ZXAubmFtZSk7CisJZXAtPmVwLm5hbWUgPSBOVUxMOworCWRt YV9mcmVlX2NvaGVyZW50KCZlcC0+dmh1Yi0+cGRldi0+ZGV2LAorCQkJICBBU1RfVkhVQl9FUG5f TUFYX1BBQ0tFVCArCisJCQkgIDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCSAgZXAtPmJ1 ZiwgZXAtPmJ1Zl9kbWEpOworCWVwLT5idWYgPSBOVUxMOworCWVwLT5lcG4uZGVzY3MgPSBOVUxM OworCisJLyogTWFyayBmcmVlICovCisJZXAtPmRldiA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgdXNiX2VwX29wcyBhc3Rfdmh1Yl9lcG5fb3BzID0geworCS5lbmFibGUJCT0gYXN0 X3ZodWJfZXBuX2VuYWJsZSwKKwkuZGlzYWJsZQk9IGFzdF92aHViX2Vwbl9kaXNhYmxlLAorCS5k aXNwb3NlCT0gYXN0X3ZodWJfZXBuX2Rpc3Bvc2UsCisJLnF1ZXVlCQk9IGFzdF92aHViX2Vwbl9x dWV1ZSwKKwkuZGVxdWV1ZQk9IGFzdF92aHViX2Vwbl9kZXF1ZXVlLAorCS5zZXRfaGFsdAk9IGFz dF92aHViX2Vwbl9zZXRfaGFsdCwKKwkuc2V0X3dlZGdlCT0gYXN0X3ZodWJfZXBuX3NldF93ZWRn ZSwKKwkuYWxsb2NfcmVxdWVzdAk9IGFzdF92aHViX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVx dWVzdAk9IGFzdF92aHViX2ZyZWVfcmVxdWVzdCwKK307CisKK3N0cnVjdCBhc3Rfdmh1Yl9lcCAq YXN0X3ZodWJfYWxsb2NfZXBuKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsIHU4IGFkZHIpCit7CisJ c3RydWN0IGFzdF92aHViICp2aHViID0gZC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGk7CisKKwkvKiBGaW5kIGEgZnJlZSBvbmUg KG5vIGRldmljZSkgKi8KKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOwor CWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fR0VOX0VQczsgaSsrKQorCQlpZiAodmh1Yi0+ ZXBuc1tpXS5kZXYgPT0gTlVMTCkKKwkJCWJyZWFrOworCWlmIChpID49IEFTVF9WSFVCX05VTV9H RU5fRVBzKSB7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsK KwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogU2V0IGl0IHVwICovCisJZXAgPSAmdmh1Yi0+ZXBu c1tpXTsKKwllcC0+ZGV2ID0gZDsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisKKwlEREJHKGQsICJBbGxvY2F0aW5nIGdlbiBFUCAlZCBmb3IgYWRkciAlZFxu IiwgaSwgYWRkcik7CisJSU5JVF9MSVNUX0hFQUQoJmVwLT5xdWV1ZSk7CisJZXAtPmRfaWR4ID0g YWRkcjsKKwllcC0+dmh1YiA9IHZodWI7CisJZXAtPmVwLm9wcyA9ICZhc3Rfdmh1Yl9lcG5fb3Bz OworCWVwLT5lcC5uYW1lID0ga2FzcHJpbnRmKEdGUF9LRVJORUwsICJlcCVkIiwgYWRkcik7CisJ ZC0+ZXBuc1thZGRyLTFdID0gZXA7CisJZXAtPmVwbi5nX2lkeCA9IGk7CisJZXAtPmVwbi5yZWdz ID0gdmh1Yi0+cmVncyArIDB4MjAwICsgKGkgKiAweDEwKTsKKworCWVwLT5idWYgPSBkbWFfYWxs b2NfY29oZXJlbnQoJnZodWItPnBkZXYtPmRldiwKKwkJCQkgICAgIEFTVF9WSFVCX0VQbl9NQVhf UEFDS0VUICsKKwkJCQkgICAgIDggKiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCQkgICAgICZl cC0+YnVmX2RtYSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlcC0+YnVmKSB7CisJCWtmcmVlKGVwLT5l cC5uYW1lKTsKKwkJZXAtPmVwLm5hbWUgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZXAt PmVwbi5kZXNjcyA9IGVwLT5idWYgKyBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVDsKKwllcC0+ZXBu LmRlc2NzX2RtYSA9IGVwLT5idWZfZG1hICsgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQ7CisKKwl1 c2JfZXBfc2V0X21heHBhY2tldF9saW1pdCgmZXAtPmVwLCBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tF VCk7CisJbGlzdF9hZGRfdGFpbCgmZXAtPmVwLmVwX2xpc3QsICZkLT5nYWRnZXQuZXBfbGlzdCk7 CisJZXAtPmVwLmNhcHMudHlwZV9pc28gPSB0cnVlOworCWVwLT5lcC5jYXBzLnR5cGVfYnVsayA9 IHRydWU7CisJZXAtPmVwLmNhcHMudHlwZV9pbnQgPSB0cnVlOworCWVwLT5lcC5jYXBzLmRpcl9p biA9IHRydWU7CisJZXAtPmVwLmNhcHMuZGlyX291dCA9IHRydWU7CisKKwlyZXR1cm4gZXA7Cit9 CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jIGIv ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9odWIuYwpuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjM1YmEwZTU1YTJlOQotLS0gL2Rldi9udWxsCisrKyBi L2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvaHViLmMKQEAgLTAsMCArMSw4Mjkg QEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKworLyoKKyAqIGFzcGVlZC12 aHViIC0tIERyaXZlciBmb3IgQXNwZWVkIFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGh1 Yi5jIC0gdmlydHVhbCBodWIgaGFuZGxpbmcKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29y cG9yYXRpb24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRo ZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVl IFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9y CisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRl IDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxs aW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1 ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxs aW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9p bnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgv cHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2Iv Z2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlv Lmg+CisjaW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBp bmcuaD4KKyNpbmNsdWRlIDxsaW51eC9iY2QuaD4KKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+ CisjaW5jbHVkZSA8bGludXgvdXNiLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2hjZC5oPgorCisj aW5jbHVkZSAidmh1Yi5oIgorCisvKiB1c2IgMi4wIGh1YiBkZXZpY2UgZGVzY3JpcHRvcgorICoK KyAqIEEgZmV3IHRoaW5ncyB3ZSBtYXkgd2FudCB0byBpbXByb3ZlIGhlcmU6CisgKgorICogICAg LSBXZSBtYXkgbmVlZCB0byBpbmRpY2F0ZSBUVCBzdXBwb3J0CisgKiAgICAtIFdlIG1heSBuZWVk IGEgZGV2aWNlIHF1YWxpZmllciBkZXNjcmlwdG9yCisgKglhcyBkZXZpY2VzIGNhbiBwcmV0ZW5k IHRvIGJlIHVzYjEgb3IgMgorICogICAgLSBNYWtlIHZpZC9kaWQgb3ZlcnJpZGFibGUKKyAqICAg IC0gbWFrZSBpdCBsb29rIGxpa2UgdXNiMSBpZiB1c2IxIG1vZGUgZm9yY2VkCisgKi8KKyNkZWZp bmUgS0VSTkVMX1JFTAliaW4yYmNkKCgoTElOVVhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4MGZm KSkKKyNkZWZpbmUgS0VSTkVMX1ZFUgliaW4yYmNkKCgoTElOVVhfVkVSU0lPTl9DT0RFID4+IDgp ICYgMHgwZmYpKQorCitlbnVtIHsKKwlBU1RfVkhVQl9TVFJfTUFOVUYgPSAzLAorCUFTVF9WSFVC X1NUUl9QUk9EVUNUID0gMiwKKwlBU1RfVkhVQl9TVFJfU0VSSUFMID0gMSwKK307CisKK3N0YXRp YyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGFzdF92aHViX2Rldl9kZXNjID0g eworCS5iTGVuZ3RoCQk9IFVTQl9EVF9ERVZJQ0VfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlCT0g VVNCX0RUX0RFVklDRSwKKwkuYmNkVVNCCQkJPSBjcHVfdG9fbGUxNigweDAyMDApLAorCS5iRGV2 aWNlQ2xhc3MJCT0gVVNCX0NMQVNTX0hVQiwKKwkuYkRldmljZVN1YkNsYXNzCT0gMCwKKwkuYkRl dmljZVByb3RvY29sCT0gMSwKKwkuYk1heFBhY2tldFNpemUwCT0gNjQsCisJLmlkVmVuZG9yCQk9 IGNwdV90b19sZTE2KDB4MWQ2YiksCisJLmlkUHJvZHVjdAkJPSBjcHVfdG9fbGUxNigweDAxMDcp LAorCS5iY2REZXZpY2UJCT0gY3B1X3RvX2xlMTYoMHgwMTAwKSwKKwkuaU1hbnVmYWN0dXJlcgkJ PSBBU1RfVkhVQl9TVFJfTUFOVUYsCisJLmlQcm9kdWN0CQk9IEFTVF9WSFVCX1NUUl9QUk9EVUNU LAorCS5pU2VyaWFsTnVtYmVyCQk9IEFTVF9WSFVCX1NUUl9TRVJJQUwsCisJLmJOdW1Db25maWd1 cmF0aW9ucwk9IDEsCit9OworCisvKiBQYXRjaGVzIHRvIHRoZSBhYm92ZSB3aGVuIGZvcmNpbmcg VVNCMSBtb2RlICovCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9wYXRjaF9kZXZfZGVzY191c2IxKHN0 cnVjdCB1c2JfZGV2aWNlX2Rlc2NyaXB0b3IgKmRlc2MpCit7CisJZGVzYy0+YmNkVVNCID0gY3B1 X3RvX2xlMTYoMHgwMTAwKTsKKwlkZXNjLT5iRGV2aWNlUHJvdG9jb2wgPSAwOworfQorCisvKgor ICogQ29uZmlndXJhdGlvbiBkZXNjcmlwdG9yOiBzYW1lIGNvbW1lbnRzIGFzIGFib3ZlCisgKiBy ZWdhcmRpbmcgaGFuZGxpbmcgVVNCMSBtb2RlLgorICovCisKKy8qCisgKiBXZSBkb24ndCB1c2Ug c2l6ZW9mKCkgYXMgTGludXggZGVmaW5pdGlvbiBvZgorICogc3RydWN0IHVzYl9lbmRwb2ludF9k ZXNjcmlwdG9yIGNvbnRhaW5zIDIKKyAqIGV4dHJhIGJ5dGVzCisgKi8KKyNkZWZpbmUgQVNUX1ZI VUJfQ09ORl9ERVNDX1NJWkUJKFVTQl9EVF9DT05GSUdfU0laRSArIFwKKwkJCQkgVVNCX0RUX0lO VEVSRkFDRV9TSVpFICsgXAorCQkJCSBVU0JfRFRfRU5EUE9JTlRfU0laRSkKKworc3RhdGljIGNv bnN0IHN0cnVjdCBhc3Rfdmh1Yl9mdWxsX2NkZXNjIHsKKwlzdHJ1Y3QgdXNiX2NvbmZpZ19kZXNj cmlwdG9yCWNmZzsKKwlzdHJ1Y3QgdXNiX2ludGVyZmFjZV9kZXNjcmlwdG9yIGludGY7CisJc3Ry dWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yCWVwOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2Vk KSkgYXN0X3ZodWJfY29uZl9kZXNjID0geworCS5jZmcgPSB7CisJCS5iTGVuZ3RoCQk9IFVTQl9E VF9DT05GSUdfU0laRSwKKwkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9DT05GSUcsCisJCS53 VG90YWxMZW5ndGgJCT0gY3B1X3RvX2xlMTYoQVNUX1ZIVUJfQ09ORl9ERVNDX1NJWkUpLAorCQku Yk51bUludGVyZmFjZXMJCT0gMSwKKwkJLmJDb25maWd1cmF0aW9uVmFsdWUJPSAxLAorCQkuaUNv bmZpZ3VyYXRpb24JCT0gMCwKKwkJLmJtQXR0cmlidXRlcwkJPSBVU0JfQ09ORklHX0FUVF9PTkUg fAorCQkJCQkgIFVTQl9DT05GSUdfQVRUX1NFTEZQT1dFUiB8CisJCQkJCSAgVVNCX0NPTkZJR19B VFRfV0FLRVVQLAorCQkuYk1heFBvd2VyCQk9IDAsCisJfSwKKwkuaW50ZiA9IHsKKwkJLmJMZW5n dGgJCT0gVVNCX0RUX0lOVEVSRkFDRV9TSVpFLAorCQkuYkRlc2NyaXB0b3JUeXBlCT0gVVNCX0RU X0lOVEVSRkFDRSwKKwkJLmJJbnRlcmZhY2VOdW1iZXIJPSAwLAorCQkuYkFsdGVybmF0ZVNldHRp bmcJPSAwLAorCQkuYk51bUVuZHBvaW50cwkJPSAxLAorCQkuYkludGVyZmFjZUNsYXNzCT0gVVNC X0NMQVNTX0hVQiwKKwkJLmJJbnRlcmZhY2VTdWJDbGFzcwk9IDAsCisJCS5iSW50ZXJmYWNlUHJv dG9jb2wJPSAwLAorCQkuaUludGVyZmFjZQkJPSAwLAorCX0sCisJLmVwID0geworCQkuYkxlbmd0 aAkJPSBVU0JfRFRfRU5EUE9JTlRfU0laRSwKKwkJLmJEZXNjcmlwdG9yVHlwZQk9IFVTQl9EVF9F TkRQT0lOVCwKKwkJLmJFbmRwb2ludEFkZHJlc3MJPSAweDgxLAorCQkuYm1BdHRyaWJ1dGVzCQk9 IFVTQl9FTkRQT0lOVF9YRkVSX0lOVCwKKwkJLndNYXhQYWNrZXRTaXplCQk9IGNwdV90b19sZTE2 KDEpLAorCQkuYkludGVydmFsCQk9IDB4MGMsCisJfSwKK307CisKKyNkZWZpbmUgQVNUX1ZIVUJf SFVCX0RFU0NfU0laRQkoVVNCX0RUX0hVQl9OT05WQVJfU0laRSArIDIpCisKK3N0YXRpYyBjb25z dCBzdHJ1Y3QgdXNiX2h1Yl9kZXNjcmlwdG9yIGFzdF92aHViX2h1Yl9kZXNjID0geworCS5iRGVz Y0xlbmd0aAkJCT0gQVNUX1ZIVUJfSFVCX0RFU0NfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBlCQk9 IFVTQl9EVF9IVUIsCisJLmJOYnJQb3J0cwkJCT0gQVNUX1ZIVUJfTlVNX1BPUlRTLAorCS53SHVi Q2hhcmFjdGVyaXN0aWNzCQk9IGNwdV90b19sZTE2KEhVQl9DSEFSX05PX0xQU00pLAorCS5iUHdy T24yUHdyR29vZAkJCT0gMTAsCisJLmJIdWJDb250ckN1cnJlbnQJCT0gMCwKKwkudS5ocy5EZXZp Y2VSZW1vdmFibGVbMF0JPSAwLAorCS51LmhzLkRldmljZVJlbW92YWJsZVsxXQk9IDB4ZmYsCit9 OworCisvKgorICogVGhlc2Ugc3RyaW5ncyBjb252ZXJ0ZWQgdG8gVVRGLTE2IG11c3QgYmUgc21h bGxlciB0aGFuCisgKiBvdXIgRVAwIGJ1ZmZlci4KKyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB1 c2Jfc3RyaW5nIGFzdF92aHViX3N0cl9hcnJheVtdID0geworCXsKKwkJLmlkID0gQVNUX1ZIVUJf U1RSX1NFUklBTCwKKwkJLnMgPSAiMDAwMDAwMDAiCisJfSwKKwl7CisJCS5pZCA9IEFTVF9WSFVC X1NUUl9QUk9EVUNULAorCQkucyA9ICJVU0IgVmlydHVhbCBIdWIiCisJfSwKKwl7CisJCS5pZCA9 IEFTVF9WSFVCX1NUUl9NQU5VRiwKKwkJLnMgPSAiQXNwZWVkIgorCX0sCisJeyB9Cit9OworCitz dGF0aWMgY29uc3Qgc3RydWN0IHVzYl9nYWRnZXRfc3RyaW5ncyBhc3Rfdmh1Yl9zdHJpbmdzID0g eworCS5sYW5ndWFnZSA9IDB4MDQwOSwKKwkuc3RyaW5ncyA9IChzdHJ1Y3QgdXNiX3N0cmluZyAq KWFzdF92aHViX3N0cl9hcnJheQorfTsKKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJfZGV2X3N0 YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3SW5kZXgsIHUxNiB3VmFs dWUpCit7CisJdTggc3QwOworCisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGRldilcbiIpOworCisJ LyoKKwkgKiBNYXJrIGl0IGFzIHNlbGYtcG93ZXJlZCwgSSBkb3VidCB0aGUgQk1DIGlzIHBvd2Vy ZWQgb2ZmCisJICogdGhlIFVTQiBidXMgLi4uCisJICovCisJc3QwID0gMSA8PCBVU0JfREVWSUNF X1NFTEZfUE9XRVJFRDsKKworCS8qCisJICogTmVlZCB0byBkb3VibGUgY2hlY2sgaG93IHJlbW90 ZSB3YWtldXAgYWN0dWFsbHkgd29ya3MKKwkgKiBvbiB0aGF0IGNoaXAgYW5kIHdoYXQgdHJpZ2dl cnMgaXQuCisJICovCisJaWYgKGVwLT52aHViLT53YWtldXBfZW4pCisJCXN0MCB8PSAxIDw8IFVT Ql9ERVZJQ0VfUkVNT1RFX1dBS0VVUDsKKworCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHko ZXAsIHN0MCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2VwX3N0YXR1cyhzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sKKwlp bnQgZXBfbnVtOworCXU4IHN0MCA9IDA7CisKKwllcF9udW0gPSB3SW5kZXggJiBVU0JfRU5EUE9J TlRfTlVNQkVSX01BU0s7CisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGVwJWQpXG4iLCBlcF9udW0p OworCisJLyogT24gdGhlIGh1YiB3ZSBoYXZlIG9ubHkgRVAgMCBhbmQgMSAqLworCWlmIChlcF9u dW0gPT0gMSkgeworCQlpZiAoZXAtPnZodWItPmVwMV9zdGFsbGVkKQorCQkJc3QwIHw9IDEgPDwg VVNCX0VORFBPSU5UX0hBTFQ7CisJfSBlbHNlIGlmIChlcF9udW0gIT0gMCkKKwkJcmV0dXJuIHN0 ZF9yZXFfc3RhbGw7CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCBzdDAsIDAp OworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2h1Yl9kZXZfZmVhdHVyZShzdHJ1Y3QgYXN0X3Zo dWJfZXAgKmVwLAorCQkJCSAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLAorCQkJCSAgICBib29s IGlzX3NldCkKK3sKKwlFUERCRyhlcCwgIiVzX0ZFQVRVUkUoZGV2IHZhbD0lMDJ4KVxuIiwKKwkg ICAgICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIHdWYWx1ZSk7CisKKwlpZiAod1ZhbHVlICE9 IFVTQl9ERVZJQ0VfUkVNT1RFX1dBS0VVUCkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwll cC0+dmh1Yi0+d2FrZXVwX2VuID0gaXNfc2V0OworCUVQREJHKGVwLCAiSHViIHJlbW90ZSB3YWtl dXAgJXNcbiIsCisJICAgICAgaXNfc2V0ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwly ZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJfZXBf ZmVhdHVyZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3SW5kZXgsIHUxNiB3 VmFsdWUsCisJCQkJICAgYm9vbCBpc19zZXQpCit7CisJaW50IGVwX251bTsKKwl1MzIgcmVnOwor CisJZXBfbnVtID0gd0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCUVQREJHKGVw LCAiJXNfRkVBVFVSRShlcCVkIHZhbD0lMDJ4KVxuIiwKKwkgICAgICBpc19zZXQgPyAiU0VUIiA6 ICJDTEVBUiIsIGVwX251bSwgd1ZhbHVlKTsKKworCWlmIChlcF9udW0gPiAxKQorCQlyZXR1cm4g c3RkX3JlcV9zdGFsbDsKKwlpZiAod1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUKQorCQlyZXR1 cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAoZXBfbnVtID09IDApCisJCXJldHVybiBzdGRfcmVxX2Nv bXBsZXRlOworCisJRVBEQkcoZXAsICIlcyBzdGFsbCBvbiBFUCAxXG4iLAorCSAgICAgIGlzX3Nl dCA/ICJzZXR0aW5nIiA6ICJjbGVhcmluZyIpOworCisJZXAtPnZodWItPmVwMV9zdGFsbGVkID0g aXNfc2V0OworCXJlZyA9IHJlYWRsKGVwLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NUUkwp OworCWlmIChpc19zZXQpIHsKKwkJcmVnIHw9IFZIVUJfRVAxX0NUUkxfU1RBTEw7CisJfSBlbHNl IHsKKwkJcmVnICY9IH5WSFVCX0VQMV9DVFJMX1NUQUxMOworCQlyZWcgfD0gVkhVQl9FUDFfQ1RS TF9SRVNFVF9UT0dHTEU7CisJfQorCXdyaXRlbChyZWcsIGVwLT52aHViLT5yZWdzICsgQVNUX1ZI VUJfRVAxX0NUUkwpOworCisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBp bnQgYXN0X3ZodWJfcmVwX2Rlc2Moc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAgdTgg ZGVzY190eXBlLCB1MTYgbGVuKQoreworCXNpemVfdCBkc2l6ZTsKKworCUVQREJHKGVwLCAiR0VU X0RFU0NSSVBUT1IodHlwZTolZClcbiIsIGRlc2NfdHlwZSk7CisKKwkvKgorCSAqIENvcHkgZmly c3QgdG8gRVAgYnVmZmVyIGFuZCBzZW5kIGZyb20gdGhlcmUsIHNvCisJICogd2UgY2FuIGRvIHNv bWUgaW4tcGxhY2UgcGF0Y2hpbmcgaWYgbmVlZGVkLiBXZSBrbm93CisJICogdGhlIEVQIGJ1ZmZl ciBpcyBiaWcgZW5vdWdoIGJ1dCBlbnN1cmUgdGhhdCBkb2Vzbid0CisJICogY2hhbmdlLiBXZSBk byB0aGF0IG5vdyByYXRoZXIgdGhhbiBsYXRlciBhZnRlciB3ZQorCSAqIGhhdmUgY2hlY2tlZCBz aXplcyBldGMuLi4gdG8gYXZvaWQgYSBnY2MgYnVnIHdoZXJlCisJICogaXQgdGhpbmtzIGxlbiBp cyBjb25zdGFudCBhbmQgYmFyZnMgYWJvdXQgcmVhZAorCSAqIG92ZXJmbG93cyBpbiBtZW1jcHku CisJICovCisJc3dpdGNoKGRlc2NfdHlwZSkgeworCWNhc2UgVVNCX0RUX0RFVklDRToKKwkJZHNp emUgPSBVU0JfRFRfREVWSUNFX1NJWkU7CisJCW1lbWNweShlcC0+YnVmLCAmYXN0X3ZodWJfZGV2 X2Rlc2MsIGRzaXplKTsKKwkJQlVJTERfQlVHX09OKGRzaXplID4gc2l6ZW9mKGFzdF92aHViX2Rl dl9kZXNjKSk7CisJCUJVSUxEX0JVR19PTihVU0JfRFRfREVWSUNFX1NJWkUgPj0gQVNUX1ZIVUJf RVAwX01BWF9QQUNLRVQpOworCQlicmVhazsKKwljYXNlIFVTQl9EVF9DT05GSUc6CisJCWRzaXpl ID0gQVNUX1ZIVUJfQ09ORl9ERVNDX1NJWkU7CisJCW1lbWNweShlcC0+YnVmLCAmYXN0X3ZodWJf Y29uZl9kZXNjLCBkc2l6ZSk7CisJCUJVSUxEX0JVR19PTihkc2l6ZSA+IHNpemVvZihhc3Rfdmh1 Yl9jb25mX2Rlc2MpKTsKKwkJQlVJTERfQlVHX09OKEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFID49 IEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRFRfSFVCOgor CQlkc2l6ZSA9IEFTVF9WSFVCX0hVQl9ERVNDX1NJWkU7CisJCW1lbWNweShlcC0+YnVmLCAmYXN0 X3ZodWJfaHViX2Rlc2MsIGRzaXplKTsKKwkJQlVJTERfQlVHX09OKGRzaXplID4gc2l6ZW9mKGFz dF92aHViX2h1Yl9kZXNjKSk7CisJQlVJTERfQlVHX09OKEFTVF9WSFVCX0hVQl9ERVNDX1NJWkUg Pj0gQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1 cm4gc3RkX3JlcV9zdGFsbDsKKwl9CisKKwkvKiBDcm9wIHJlcXVlc3RlZCBsZW5ndGggKi8KKwlp ZiAobGVuID4gZHNpemUpCisJCWxlbiA9IGRzaXplOworCisJLyogUGF0Y2ggaXQgaWYgZm9yY2lu ZyBVU0IxICovCisJaWYgKGRlc2NfdHlwZSA9PSBVU0JfRFRfREVWSUNFICYmIGVwLT52aHViLT5m b3JjZV91c2IxKQorCQlhc3Rfdmh1Yl9wYXRjaF9kZXZfZGVzY191c2IxKGVwLT5idWYpOworCisJ LyogU2hvb3QgaXQgZnJvbSB0aGUgRVAgYnVmZmVyICovCisJcmV0dXJuIGFzdF92aHViX3JlcGx5 KGVwLCBOVUxMLCBsZW4pOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX3JlcF9zdHJpbmcoc3Ry dWN0IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAgICB1OCBzdHJpbmdfaWQsIHUxNiBsYW5nX2lk LAorCQkJICAgICAgIHUxNiBsZW4pCit7CisJaW50IHJjID0gdXNiX2dhZGdldF9nZXRfc3RyaW5n ICgmYXN0X3ZodWJfc3RyaW5ncywgc3RyaW5nX2lkLCBlcC0+YnVmKTsKKworCS8qCisJICogVGhp cyBzaG91bGQgbmV2ZXIgaGFwcGVuIHVubGVzcyB3ZSBwdXQgdG9vIGJpZyBzdHJpbmdzIGluCisJ ICogdGhlIGFycmF5IGFib3ZlCisJICovCisJQlVHX09OKHJjID49IEFTVF9WSFVCX0VQMF9NQVhf UEFDS0VUKTsKKworCWlmIChyYyA8IDApCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJLyog U2hvb3QgaXQgZnJvbSB0aGUgRVAgYnVmZmVyICovCisJcmV0dXJuIGFzdF92aHViX3JlcGx5KGVw LCBOVUxMLCBtaW5fdCh1MTYsIHJjLCBsZW4pKTsKK30KKworZW51bSBzdGRfcmVxX3JjIGFzdF92 aHViX3N0ZF9odWJfcmVxdWVzdChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgc3RydWN0 IHVzYl9jdHJscmVxdWVzdCAqY3JxKQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52 aHViOworCXUxNiB3VmFsdWUsIHdJbmRleCwgd0xlbmd0aDsKKworCXdWYWx1ZSA9IGxlMTZfdG9f Y3B1KGNycS0+d1ZhbHVlKTsKKwl3SW5kZXggPSBsZTE2X3RvX2NwdShjcnEtPndJbmRleCk7CisJ d0xlbmd0aCA9IGxlMTZfdG9fY3B1KGNycS0+d0xlbmd0aCk7CisKKwkvKiBGaXJzdCBwYWNrZXQs IGdyYWIgc3BlZWQgKi8KKwlpZiAodmh1Yi0+c3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04pIHsK KwkJdTMyIHVzdGF0ID0gcmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX1VTQlNUUyk7CisJCWlm ICh1c3RhdCAmIFZIVUJfVVNCU1RTX0hJU1BFRUQpCisJCQl2aHViLT5zcGVlZCA9IFVTQl9TUEVF RF9ISUdIOworCQllbHNlCisJCQl2aHViLT5zcGVlZCA9IFVTQl9TUEVFRF9GVUxMOworCQlVRENE Qkcodmh1YiwgIlVTQiBzdGF0dXM9JTA4eCBzcGVlZD0lc1xuIiwgdXN0YXQsCisJCSAgICAgICB2 aHViLT5zcGVlZCA9PSBVU0JfU1BFRURfSElHSCA/ICJoaWdoIiA6ICJmdWxsIik7CisJfQorCisJ c3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEtPmJSZXF1ZXN0KSB7CisJCS8q IFNFVF9BRERSRVNTICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfQURE UkVTUzoKKwkJRVBEQkcoZXAsICJTRVRfQUREUkVTUzogR290IGFkZHJlc3MgJXhcbiIsIHdWYWx1 ZSk7CisJCXdyaXRlbCh3VmFsdWUsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DT05GKTsKKwkJcmV0 dXJuIHN0ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX1NUQVRVUyAqLworCWNhc2UgRGV2aWNl UmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX2h1Yl9kZXZf c3RhdHVzKGVwLCB3SW5kZXgsIHdWYWx1ZSk7CisJY2FzZSBJbnRlcmZhY2VSZXF1ZXN0IHwgVVNC X1JFUV9HRVRfU1RBVFVTOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAwLCAw KTsKKwljYXNlIEVuZHBvaW50UmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJu IGFzdF92aHViX2h1Yl9lcF9zdGF0dXMoZXAsIHdJbmRleCwgd1ZhbHVlKTsKKworCQkvKiBTRVQv Q0xFQVJfRkVBVFVSRSAqLworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0ZF QVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X2ZlYXR1cmUoZXAsIHdJbmRleCwgd1Zh bHVlLCB0cnVlKTsKKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRV UkU6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X2ZlYXR1cmUoZXAsIHdJbmRleCwgd1ZhbHVl LCBmYWxzZSk7CisJY2FzZSBFbmRwb2ludE91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9GRUFUVVJF OgorCQlyZXR1cm4gYXN0X3ZodWJfaHViX2VwX2ZlYXR1cmUoZXAsIHdJbmRleCwgd1ZhbHVlLCB0 cnVlKTsKKwljYXNlIEVuZHBvaW50T3V0UmVxdWVzdCB8IFVTQl9SRVFfQ0xFQVJfRkVBVFVSRToK KwkJcmV0dXJuIGFzdF92aHViX2h1Yl9lcF9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgZmFs c2UpOworCisJCS8qIEdFVC9TRVRfQ09ORklHVVJBVElPTiAqLworCWNhc2UgRGV2aWNlUmVxdWVz dCB8IFVTQl9SRVFfR0VUX0NPTkZJR1VSQVRJT046CisJCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVf cmVwbHkoZXAsIDEpOworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0NPTkZJ R1VSQVRJT046CisJCWlmICh3VmFsdWUgIT0gMSkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOwor CQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKworCQkvKiBHRVRfREVTQ1JJUFRPUiAqLworCWNh c2UgRGV2aWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX0RFU0NSSVBUT1I6CisJCXN3aXRjaCAod1Zh bHVlID4+IDgpIHsKKwkJY2FzZSBVU0JfRFRfREVWSUNFOgorCQljYXNlIFVTQl9EVF9DT05GSUc6 CisJCQlyZXR1cm4gYXN0X3ZodWJfcmVwX2Rlc2MoZXAsIHdWYWx1ZSA+PiA4LAorCQkJCQkJIHdM ZW5ndGgpOworCQljYXNlIFVTQl9EVF9TVFJJTkc6CisJCQlyZXR1cm4gYXN0X3ZodWJfcmVwX3N0 cmluZyhlcCwgd1ZhbHVlICYgMHhmZiwKKwkJCQkJCSAgIHdJbmRleCwgd0xlbmd0aCk7CisJCX0K KwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwkJLyogR0VUL1NFVF9JTlRFUkZBQ0UgKi8KKwlj YXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9JTlRFUkZBQ0U6CisJCXJldHVybiBhc3Rf dmh1Yl9zaW1wbGVfcmVwbHkoZXAsIDApOworCWNhc2UgRGV2aWNlT3V0UmVxdWVzdCB8IFVTQl9S RVFfU0VUX0lOVEVSRkFDRToKKwkJaWYgKHdWYWx1ZSAhPSAwIHx8IHdJbmRleCAhPSAwKQorCQkJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCX0KKwly ZXR1cm4gc3RkX3JlcV9zdGFsbDsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfdXBkYXRlX2h1 Yl9lcDEoc3RydWN0IGFzdF92aHViICp2aHViLAorCQkJCSAgICB1bnNpZ25lZCBpbnQgcG9ydCkK K3sKKwkvKiBVcGRhdGUgSFcgRVAxIHJlc3BvbnNlICovCisJdTMyIHJlZyA9IHJlYWRsKHZodWIt PnJlZ3MgKyBBU1RfVkhVQl9FUDFfU1RTX0NIRyk7CisJdTMyIHBtYXNrID0gKDEgPDwgKHBvcnQg KyAxKSk7CisJaWYgKHZodWItPnBvcnRzW3BvcnRdLmNoYW5nZSkKKwkJcmVnIHw9IHBtYXNrOwor CWVsc2UKKwkJcmVnICY9IH5wbWFzazsKKwl3cml0ZWwocmVnLCB2aHViLT5yZWdzICsgQVNUX1ZI VUJfRVAxX1NUU19DSEcpOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9z dGF0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwKKwkJCQkgICAgICB1bnNpZ25lZCBpbnQgcG9ydCwK KwkJCQkgICAgICB1MTYgY2xyX2ZsYWdzLAorCQkJCSAgICAgIHUxNiBzZXRfZmxhZ3MsCisJCQkJ ICAgICAgYm9vbCBzZXRfYykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5w b3J0c1twb3J0XTsKKwl1MTYgcHJldjsKKworCS8qIFVwZGF0ZSBwb3J0IHN0YXR1cyAqLworCXBy ZXYgPSBwLT5zdGF0dXM7CisJcC0+c3RhdHVzID0gKHByZXYgJiB+Y2xyX2ZsYWdzKSB8IHNldF9m bGFnczsKKwlEREJHKCZwLT5kZXYsICJwb3J0ICVkIHN0YXR1cyAlMDR4IC0+ICUwNHggKEM9JWQp XG4iLAorCSAgICAgcG9ydCArIDEsIHByZXYsIHAtPnN0YXR1cywgc2V0X2MpOworCisJLyogVXBk YXRlIGNoYW5nZSBiaXRzIGlmIG5lZWRlZCAqLworCWlmIChzZXRfYykgeworCQl1MTYgY2hnID0g cC0+c3RhdHVzIF4gcHJldjsKKworCQkvKiBPbmx5IHRoZXNlIGFyZSByZWxldmFudCBmb3IgY2hh bmdlICovCisJCWNoZyAmPSBVU0JfUE9SVF9TVEFUX0NfQ09OTkVDVElPTiB8CisJCSAgICAgICBV U0JfUE9SVF9TVEFUX0NfRU5BQkxFIHwKKwkJICAgICAgIFVTQl9QT1JUX1NUQVRfQ19TVVNQRU5E IHwKKwkJICAgICAgIFVTQl9QT1JUX1NUQVRfQ19PVkVSQ1VSUkVOVCB8CisJCSAgICAgICBVU0Jf UE9SVF9TVEFUX0NfUkVTRVQgfAorCQkgICAgICAgVVNCX1BPUlRfU1RBVF9DX0wxOworCQlwLT5j aGFuZ2UgfD0gY2hnOworCisJCWFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHZodWIsIHBvcnQpOwor CX0KK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfc2VuZF9ob3N0X3dha2V1cChzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIpCit7CisJdTMyIHJlZyA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9D VFJMKTsKKwlVRENEQkcodmh1YiwgIldha2luZyB1cCBob3N0ICFcbiIpOworCXJlZyB8PSBWSFVC X0NUUkxfTUFOVUFMX1JFTU9URV9XQUtFVVA7CisJd3JpdGVsKHJlZywgdmh1Yi0+cmVncyArIEFT VF9WSFVCX0NUUkwpOworfQorCit2b2lkIGFzdF92aHViX2RldmljZV9jb25uZWN0KHN0cnVjdCBh c3Rfdmh1YiAqdmh1YiwKKwkJCSAgICAgdW5zaWduZWQgaW50IHBvcnQsIGJvb2wgb24pCit7CisJ aWYgKG9uKQorCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIHBvcnQsIDAsCisJCQkJ CSAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OLCB0cnVlKTsKKwllbHNlCisJCWFzdF92aHViX2No YW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJICBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJ T04gfAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfRU5BQkxFLAorCQkJCQkgIDAsIHRydWUpOworCisJ LyoKKwkgKiBJZiB0aGUgaHViIGlzIHNldCB0byB3YWt1cCB0aGUgaG9zdCBvbiBjb25uZWN0aW9u IGV2ZW50cworCSAqIHRoZW4gc2VuZCBhIHdha2V1cC4KKwkgKi8KKwlpZiAodmh1Yi0+d2FrZXVw X2VuKQorCQlhc3Rfdmh1Yl9zZW5kX2hvc3Rfd2FrZXVwKHZodWIpOworfQorCitzdGF0aWMgdm9p ZCBhc3Rfdmh1Yl93YWtlX3dvcmsoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQoreworCXN0cnVj dCBhc3Rfdmh1YiAqdmh1YiA9IGNvbnRhaW5lcl9vZih3b3JrLAorCQkJCQkgICAgIHN0cnVjdCBh c3Rfdmh1YiwKKwkJCQkJICAgICB3YWtlX3dvcmspOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJ dW5zaWduZWQgaW50IGk7CisKKwkvKgorCSAqIFdha2UgYWxsIHNsZWVwaW5nIHBvcnRzLiBJZiBh IHBvcnQgaXMgc3VzcGVuZGVkIGJ5CisJICogdGhlIGhvc3Qgc3VzcGVuZCAod2l0aG91dCBleHBs aWNpdCBzdGF0ZSBzdXNwZW5kKSwKKwkgKiB3ZSBsZXQgdGhlIG5vcm1hbCBob3N0IHdha2UgcGF0 aCBkZWFsIHdpdGggaXQgbGF0ZXIuCisJICovCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxv Y2ssIGZsYWdzKTsKKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX1BPUlRTOyBpKyspIHsK KwkJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNbaV07CisKKwkJaWYgKCEo cC0+c3RhdHVzICYgVVNCX1BPUlRfU1RBVF9TVVNQRU5EKSkKKwkJCWNvbnRpbnVlOworCQlhc3Rf dmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIGksCisJCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQ RU5ELAorCQkJCQkgIDAsIHRydWUpOworCQlhc3Rfdmh1Yl9kZXZfcmVzdW1lKCZwLT5kZXYpOwor CX0KKwlhc3Rfdmh1Yl9zZW5kX2hvc3Rfd2FrZXVwKHZodWIpOworCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9odWJfd2FrZV9h bGwoc3RydWN0IGFzdF92aHViICp2aHViKQoreworCS8qCisJICogQSBkZXZpY2UgaXMgdHJ5aW5n IHRvIHdha2UgdGhlIHdvcmxkLCBiZWNhdXNlIHRoaXMKKwkgKiBjYW4gcmVjdXJzZSBpbnRvIHRo ZSBkZXZpY2UsIHdlIGJyZWFrIHRoZSBjYWxsIGNoYWluCisJICogdXNpbmcgYSB3b3JrIHF1ZXVl CisJICovCisJc2NoZWR1bGVfd29yaygmdmh1Yi0+d2FrZV93b3JrKTsKK30KKworc3RhdGljIHZv aWQgYXN0X3ZodWJfcG9ydF9yZXNldChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHU4IHBvcnQpCit7 CisJc3RydWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisJdTE2IHNl dCwgY2xyLCBzcGVlZDsKKworCS8qIEZpcnN0IG1hcmsgZGlzYWJsZWQgKi8KKwlhc3Rfdmh1Yl9j aGFuZ2VfcG9ydF9zdGF0KHZodWIsIHBvcnQsCisJCQkJICBVU0JfUE9SVF9TVEFUX0VOQUJMRSB8 CisJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsCisJCQkJICBVU0JfUE9SVF9TVEFUX1JFU0VU LAorCQkJCSAgZmFsc2UpOworCisJaWYgKCFwLT5kZXYuZHJpdmVyKQorCQlyZXR1cm47CisKKwkv KgorCSAqIFRoaXMgd2lsbCBlaXRoZXIgInN0YXJ0IiB0aGUgcG9ydCBvciByZXNldCB0aGUKKwkg KiBkZXZpY2UgaWYgYWxyZWFkeSBzdGFydGVkLi4uCisJICovCisJYXN0X3ZodWJfZGV2X3Jlc2V0 KCZwLT5kZXYpOworCisJLyogR3JhYiB0aGUgcmlnaHQgc3BlZWQgKi8KKwlzcGVlZCA9IHAtPmRl di5kcml2ZXItPm1heF9zcGVlZDsKKwlpZiAoc3BlZWQgPT0gVVNCX1NQRUVEX1VOS05PV04gfHwg c3BlZWQgPiB2aHViLT5zcGVlZCkKKwkJc3BlZWQgPSB2aHViLT5zcGVlZDsKKworCXN3aXRjaCAo c3BlZWQpIHsKKwljYXNlIFVTQl9TUEVFRF9MT1c6CisJCXNldCA9IFVTQl9QT1JUX1NUQVRfTE9X X1NQRUVEOworCQljbHIgPSBVU0JfUE9SVF9TVEFUX0hJR0hfU1BFRUQ7CisJCWJyZWFrOworCWNh c2UgVVNCX1NQRUVEX0ZVTEw6CisJCXNldCA9IDA7CisJCWNsciA9IFVTQl9QT1JUX1NUQVRfTE9X X1NQRUVEIHwKKwkJCVVTQl9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJYnJlYWs7CisJY2FzZSBV U0JfU1BFRURfSElHSDoKKwkJc2V0ID0gVVNCX1BPUlRfU1RBVF9ISUdIX1NQRUVEOworCQljbHIg PSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJVURDREJH KHZodWIsICJVbnN1cHBvcnRlZCBzcGVlZCAlZCB3aGVuIgorCQkgICAgICAgIiBjb25uZWN0aW5n IGRldmljZVxuIiwKKwkJICAgICAgIHNwZWVkKTsKKwkJcmV0dXJuOworCX0KKwljbHIgfD0gVVNC X1BPUlRfU1RBVF9SRVNFVDsKKwlzZXQgfD0gVVNCX1BPUlRfU1RBVF9FTkFCTEU7CisKKwkvKiBU aGlzIHNob3VsZCBpZGVhbGx5IGJlIGRlbGF5ZWQgLi4uICovCisJYXN0X3ZodWJfY2hhbmdlX3Bv cnRfc3RhdCh2aHViLCBwb3J0LCBjbHIsIHNldCwgdHJ1ZSk7Cit9CisKK3N0YXRpYyBlbnVtIHN0 ZF9yZXFfcmMgYXN0X3ZodWJfc2V0X3BvcnRfZmVhdHVyZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVw LAorCQkJCQkJIHU4IHBvcnQsIHUxNiBmZWF0KQoreworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9 IGVwLT52aHViOworCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpwOworCisJaWYgKHBvcnQgPT0gMCB8 fCBwb3J0ID4gQVNUX1ZIVUJfTlVNX1BPUlRTKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlw b3J0LS07CisJcCA9ICZ2aHViLT5wb3J0c1twb3J0XTsKKworCXN3aXRjaChmZWF0KSB7CisJY2Fz ZSBVU0JfUE9SVF9GRUFUX1NVU1BFTkQ6CisJCWlmICghKHAtPnN0YXR1cyAmIFVTQl9QT1JUX1NU QVRfRU5BQkxFKSkKKwkJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCQlhc3Rfdmh1Yl9jaGFu Z2VfcG9ydF9zdGF0KHZodWIsIHBvcnQsCisJCQkJCSAgMCwgVVNCX1BPUlRfU1RBVF9TVVNQRU5E LAorCQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRldik7CisJCXJl dHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9SRVNFVDoKKwkJRVBE QkcoZXAsICJQb3J0IHJlc2V0ICFcbiIpOworCQlhc3Rfdmh1Yl9wb3J0X3Jlc2V0KHZodWIsIHBv cnQpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVTQl9QT1JUX0ZFQVRfUE9X RVI6CisJCS8qCisJCSAqIE9uIFBvd2VyLW9uLCB3ZSBtYXJrIHRoZSBjb25uZWN0ZWQgZmxhZyBj aGFuZ2VkLAorCQkgKiBpZiB0aGVyZSdzIGEgY29ubmVjdGVkIGRldmljZSwgc29tZSBob3N0cyB3 aWxsCisJCSAqIG90aGVyd2lzZSBmYWlsIHRvIGRldGVjdCBpdC4KKwkJICovCisJCWlmIChwLT5z dGF0dXMgJiBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT04pIHsKKwkJCXAtPmNoYW5nZSB8PSBVU0Jf UE9SVF9TVEFUX0NfQ09OTkVDVElPTjsKKwkJCWFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHZodWIs IHBvcnQpOworCQl9CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRf RkVBVF9URVNUOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1I6CisJCS8qIFdlIGRvbid0 IGRvIGFueXRoaW5nIHdpdGggdGhlc2UgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJ fQorCXJldHVybiBzdGRfcmVxX3N0YWxsOworfQorCitzdGF0aWMgZW51bSBzdGRfcmVxX3JjIGFz dF92aHViX2Nscl9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJCSB1 OCBwb3J0LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsK KwlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IEFT VF9WSFVCX05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9ydC0tOworCXAg PSAmdmh1Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2UgVVNCX1BPUlRf RkVBVF9FTkFCTEU6CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJ CQkJICBVU0JfUE9SVF9TVEFUX0VOQUJMRSB8CisJCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQRU5E LCAwLAorCQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRldik7CisJ CXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgor CQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJcmV0dXJuIHN0 ZF9yZXFfY29tcGxldGU7CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwK KwkJCQkJICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsIDAsCisJCQkJCSAgZmFsc2UpOworCQlhc3Rf dmh1Yl9kZXZfcmVzdW1lKCZwLT5kZXYpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwlj YXNlIFVTQl9QT1JUX0ZFQVRfUE9XRVI6CisJCS8qIFdlIGRvbid0IGRvIHBvd2VyIGNvbnRyb2wg Ki8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX0lORElD QVRPUjoKKwkJLyogV2UgZG9uJ3QgaGF2ZSBpbmRpY2F0b3JzICovCisJCXJldHVybiBzdGRfcmVx X2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT046CisJY2FzZSBVU0Jf UE9SVF9GRUFUX0NfRU5BQkxFOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6CisJY2Fz ZSBVU0JfUE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JF U0VUOgorCQkvKiBDbGVhciBzdGF0ZS1jaGFuZ2UgZmVhdHVyZSAqLworCQlwLT5jaGFuZ2UgJj0g figxdSA8PCAoZmVhdCAtIDE2KSk7CisJCWFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHZodWIsIHBv cnQpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfc3Rh bGw7Cit9CisKK3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfZ2V0X3BvcnRfc3RhdChz dHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgICAgICB1OCBwb3J0KQoreworCXN0cnVjdCBh c3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXUxNiBzdGF0LCBjaGc7CisKKwlpZiAocG9ydCA9 PSAwIHx8IHBvcnQgPiBBU1RfVkhVQl9OVU1fUE9SVFMpCisJCXJldHVybiBzdGRfcmVxX3N0YWxs OworCXBvcnQtLTsKKworCXN0YXQgPSB2aHViLT5wb3J0c1twb3J0XS5zdGF0dXM7CisJY2hnID0g dmh1Yi0+cG9ydHNbcG9ydF0uY2hhbmdlOworCisJLyogV2UgYWx3YXlzIGhhdmUgcG93ZXIgKi8K KwlzdGF0IHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisKKwlFUERCRyhlcCwgIiBwb3J0IHN0YXR1 cz0lMDR4IGNoYW5nZT0lMDR4XG4iLCBzdGF0LCBjaGcpOworCisJcmV0dXJuIGFzdF92aHViX3Np bXBsZV9yZXBseShlcCwKKwkJCQkgICAgIHN0YXQgJiAweGZmLAorCQkJCSAgICAgc3RhdCA+PiA4 LAorCQkJCSAgICAgY2hnICYgMHhmZiwKKwkJCQkgICAgIGNoZyA+PiA4KTsKK30KKworZW51bSBz dGRfcmVxX3JjIGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAq ZXAsCisJCQkJCSAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwl1MTYgd1ZhbHVl LCB3SW5kZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEtPndWYWx1ZSk7 CisJd0luZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGggPSBsZTE2X3Rv X2NwdShjcnEtPndMZW5ndGgpOworCisJc3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkg fCBjcnEtPmJSZXF1ZXN0KSB7CisJY2FzZSBHZXRIdWJTdGF0dXM6CisJCUVQREJHKGVwLCAiR2V0 SHViU3RhdHVzXG4iKTsKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCwg MCwgMCk7CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlFUERCRyhlcCwgIkdldFBvcnRTdGF0dXMo JWQpXG4iLCB3SW5kZXggJiAweGZmKTsKKwkJcmV0dXJuIGFzdF92aHViX2dldF9wb3J0X3N0YXQo ZXAsIHdJbmRleCAmIDB4Zik7CisJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgorCQlpZiAod1ZhbHVl ICE9IChVU0JfRFRfSFVCIDw8IDgpKQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCUVQREJH KGVwLCAiR2V0SHViRGVzY3JpcHRvciglZClcbiIsIHdJbmRleCAmIDB4ZmYpOworCQlyZXR1cm4g YXN0X3ZodWJfcmVwX2Rlc2MoZXAsIFVTQl9EVF9IVUIsIHdMZW5ndGgpOworCWNhc2UgU2V0SHVi RmVhdHVyZToKKwljYXNlIENsZWFySHViRmVhdHVyZToKKwkJRVBEQkcoZXAsICJHZXQvU2V0SHVi RmVhdHVyZSglZClcbiIsIHdWYWx1ZSk7CisJCS8qIE5vIGZlYXR1cmUsIGp1c3QgY29tcGxldGUg dGhlIHJlcXVlc3RzICovCisJCWlmICh3VmFsdWUgPT0gQ19IVUJfTE9DQUxfUE9XRVIgfHwKKwkJ ICAgIHdWYWx1ZSA9PSBDX0hVQl9PVkVSX0NVUlJFTlQpCisJCQlyZXR1cm4gc3RkX3JlcV9jb21w bGV0ZTsKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJY2FzZSBTZXRQb3J0RmVhdHVyZToKKwkJ RVBEQkcoZXAsICJTZXRQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVl KTsKKwkJcmV0dXJuIGFzdF92aHViX3NldF9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwg d1ZhbHVlKTsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCUVQREJHKGVwLCAiQ2xlYXJQb3J0 RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJcmV0dXJuIGFzdF92 aHViX2Nscl9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwlkZWZhdWx0 OgorCQlFUERCRyhlcCwgIlVua25vd24gY2xhc3MgcmVxdWVzdFxuIik7CisJfQorCXJldHVybiBz dGRfcmVxX3N0YWxsOworfQorCit2b2lkIGFzdF92aHViX2h1Yl9zdXNwZW5kKHN0cnVjdCBhc3Rf dmh1YiAqdmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1 cyBzdXNwZW5kXG4iKTsKKworCWlmICh2aHViLT5zdXNwZW5kZWQpCisJCXJldHVybjsKKworCXZo dWItPnN1c3BlbmRlZCA9IHRydWU7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5zdXNwZW5kZWQg cG9ydHMgd2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3RhdHVzLgorCSAq LworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3Qg YXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0dXMg JiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRl dik7CisJfQorfQorCit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUoc3RydWN0IGFzdF92aHViICp2 aHViKQoreworCXVuc2lnbmVkIGludCBpOworCisJVURDREJHKHZodWIsICJVU0IgYnVzIHJlc3Vt ZVxuIik7CisKKwlpZiAoIXZodWItPnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJdmh1Yi0+c3Vz cGVuZGVkID0gZmFsc2U7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMg d2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3RhdHVzLgorCSAqLworCWZv ciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3Zo dWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0dXMgJiBVU0Jf UE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9 Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sK Kwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1cyByZXNldFxuIik7CisK KwkvKgorCSAqIElzIHRoZSBzcGVlZCBrbm93biA/IElmIG5vdCB3ZSBkb24ndCBjYXJlLCB3ZSBh cmVuJ3QKKwkgKiBpbml0aWFsaXplZCB5ZXQgYW5kIHBvcnRzIGhhdmVuJ3QgYmVlbiBlbmFibGVk LgorCSAqLworCWlmICh2aHViLT5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJu OworCisJLyogV2UgYXJlbid0IHN1c3BlbmRlZCBhbnltb3JlIG9idmlvdXNseSAqLworCXZodWIt PnN1c3BlbmRlZCA9IGZhbHNlOworCisJLyogTm8gc3BlZWQgc2V0ICovCisJdmh1Yi0+c3BlZWQg PSBVU0JfU1BFRURfVU5LTk9XTjsKKworCS8qIFdha2V1cCBub3QgZW5hYmxlZCBhbnltb3JlICov CisJdmh1Yi0+d2FrZXVwX2VuID0gZmFsc2U7CisKKwkvKgorCSAqIENsZWFyIGFsbCBwb3J0IHN0 YXR1cywgZGlzYWJsZSBnYWRnZXRzIGFuZCAic3VzcGVuZCIKKwkgKiB0aGVtLiBUaGV5IHdpbGwg YmUgd29rZW4gdXAgYnkgYSBwb3J0IHJlc2V0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1Rf VkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHVi LT5wb3J0c1tpXTsKKworCQkvKiBPbmx5IGtlZXAgdGhlIGNvbm5lY3RlZCBmbGFnICovCisJCXAt PnN0YXR1cyAmPSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJCXAtPmNoYW5nZSA9IDA7CisK KwkJLyogU3VzcGVuZCB0aGUgZ2FkZ2V0IGlmIGFueSAqLworCQlhc3Rfdmh1Yl9kZXZfc3VzcGVu ZCgmcC0+ZGV2KTsKKwl9CisKKwkvKiBDbGVhbnVwIEhXICovCisJd3JpdGVsKDAsIHZodWItPnJl Z3MgKyBBU1RfVkhVQl9DT05GKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQ MF9DVFJMKTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUgfAorCSAgICAgICBW SFVCX0VQMV9DVFJMX0VOQUJMRSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9D VFJMKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKK30K Kwordm9pZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdmh1 Yi0+c3BlZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlJTklUX1dPUksoJnZodWItPndha2Vfd29y aywgYXN0X3ZodWJfd2FrZV93b3JrKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2Fk Z2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVl ZC12aHViL3ZodWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjJi MDQwMjU3YmMxZgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNw ZWVkLXZodWIvdmh1Yi5oCkBAIC0wLDAgKzEsNTE0IEBACisvKiBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMCsgKi8KKyNpZm5kZWYgX19BU1BFRURfVkhVQl9ICisjZGVmaW5lIF9fQVNQ RUVEX1ZIVUJfSAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAg ICAgICAgICAgICAgICAgICAgKgorICogVkhVQiByZWdpc3RlciBkZWZpbml0aW9ucyAqCisgKiAg ICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq Ki8KKworI2RlZmluZQlBU1RfVkhVQl9DVFJMCQkweDAwCS8qIFJvb3QgRnVuY3Rpb24gQ29udHJv bCAmIFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9DT05GCQkweDA0CS8qIFJv b3QgQ29uZmlndXJhdGlvbiBTZXR0aW5nIFJlZ2lzdGVyICovCisjZGVmaW5lCUFTVF9WSFVCX0lF UgkJMHgwOAkvKiBJbnRlcnJ1cHQgQ3RybCBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhVQl9J U1IJCTB4MEMJLyogSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAqLworI2RlZmluZQlBU1RfVkhV Ql9FUF9BQ0tfSUVSCTB4MTAJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgQUNLIEludGVy cnVwdCBFbmFibGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfRVBfTkFDS19JRVIJMHgx NAkvKiBQcm9ncmFtbWFibGUgRW5kcG9pbnQgUG9vbCBOQUNLIEludGVycnVwdCBFbmFibGUgUmVn aXN0ZXIgICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX0FDS19JU1IJMHgxOAkvKiBQcm9ncmFtbWFi bGUgRW5kcG9pbnQgUG9vbCBBQ0sgSW50ZXJydXB0IFN0YXR1cyBSZWdpc3RlciAgKi8KKyNkZWZp bmUgQVNUX1ZIVUJfRVBfTkFDS19JU1IJMHgxQwkvKiBQcm9ncmFtbWFibGUgRW5kcG9pbnQgUG9v bCBOQUNLIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgICovCisjZGVmaW5lIEFTVF9WSFVCX1NX X1JFU0VUCTB4MjAJLyogRGV2aWNlIENvbnRyb2xsZXIgU29mdCBSZXNldCBFbmFibGUgUmVnaXN0 ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfVVNCU1RTCQkweDI0CS8qIFVTQiBTdGF0dXMgUmVnaXN0 ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVBfVE9HR0xFCTB4MjgJLyogUHJvZ3JhbW1hYmxlIEVu ZHBvaW50IFBvb2wgRGF0YSBUb2dnbGUgVmFsdWUgU2V0ICovCisjZGVmaW5lIEFTVF9WSFVCX0lT T19GQUlMX0FDQwkweDJDCS8qIElzb2Nocm9ub3VzIFRyYW5zYWN0aW9uIEZhaWwgQWNjdW11bGF0 b3IgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0NUUkwJMHgzMAkvKiBFbmRwb2ludCAwIENvbnRy bC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0RBVEEJMHgzNAkvKiBC YXNlIEFkZHJlc3Mgb2YgRW5kcG9pbnQgMCBJbi9PVVQgRGF0YSBCdWZmZXIgUmVnaXN0ZXIgKi8K KyNkZWZpbmUgQVNUX1ZIVUJfRVAxX0NUUkwJMHgzOAkvKiBFbmRwb2ludCAxIENvbnRybC9TdGF0 dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX1NUU19DSEcJMHgzQwkvKiBFbmRw b2ludCAxIFN0YXR1cyBDaGFuZ2UgQml0bWFwIERhdGEgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfU0VU VVAwCQkweDgwCS8qIFJvb3QgRGV2aWNlIFNldHVwIERhdGEgQnVmZmVyMCAqLworI2RlZmluZSBB U1RfVkhVQl9TRVRVUDEJCTB4ODQJLyogUm9vdCBEZXZpY2UgU2V0dXAgRGF0YSBCdWZmZXIxICov CisKKy8qIE1haW4gY29udHJvbCByZWcgKi8KKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9DTEsJCQko MSA8PCAzMSkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9MT09QX1RFU1QJCQkoMSA8PCAyNSkKKyNk ZWZpbmUgVkhVQl9DVFJMX0ROX1BXTgkJCSgxIDw8IDI0KQorI2RlZmluZSBWSFVCX0NUUkxfRFBf UFdOCQkJKDEgPDwgMjMpCisjZGVmaW5lIFZIVUJfQ1RSTF9MT05HX0RFU0MJCQkoMSA8PCAxOCkK KyNkZWZpbmUgVkhVQl9DVFJMX0lTT19SU1BfQ1RSTAkJCSgxIDw8IDE3KQorI2RlZmluZSBWSFVC X0NUUkxfU1BMSVRfSU4JCQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9DVFJMX0xPT1BfVF9SRVNV TFQJCQkoMSA8PCAxNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0xPT1BfVF9TVFMJCQkoMSA8PCAxNCkK KyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9CSVNUX1JFU1VMVAkJKDEgPDwgMTMpCisjZGVmaW5lIFZI VUJfQ1RSTF9QSFlfQklTVF9DVFJMCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfQ1RSTF9QSFlf UkVTRVRfRElTCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZIVUJfQ1RSTF9TRVRfVEVTVF9NT0RFKHgp CQkoKHgpIDw8IDgpCisjZGVmaW5lIFZIVUJfQ1RSTF9NQU5VQUxfUkVNT1RFX1dBS0VVUAkJKDEg PDwgNCkKKyNkZWZpbmUgVkhVQl9DVFJMX0FVVE9fUkVNT1RFX1dBS0VVUAkJKDEgPDwgMykKKyNk ZWZpbmUgVkhVQl9DVFJMX0NMS19TVE9QX1NVU1BFTkQJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJf Q1RSTF9GVUxMX1NQRUVEX09OTFkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfQ1RSTF9VUFNUUkVB TV9DT05ORUNUCQkoMSA8PCAwKQorCisvKiBJRVIgJiBJU1IgKi8KKyNkZWZpbmUgVkhVQl9JUlFf VVNCX0NNRF9ERUFETE9DSwkJKDEgPDwgMTgpCisjZGVmaW5lIFZIVUJfSVJRX0VQX1BPT0xfTkFL CQkJKDEgPDwgMTcpCisjZGVmaW5lIFZIVUJfSVJRX0VQX1BPT0xfQUNLX1NUQUxMCQkoMSA8PCAx NikKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFNQkJCSgxIDw8IDEzKQorI2RlZmluZSBWSFVCX0lS UV9ERVZJQ0U0CQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTMJCQkoMSA8PCAx MSkKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFMgkJCSgxIDw8IDEwKQorI2RlZmluZSBWSFVCX0lS UV9ERVZJQ0UxCQkJKDEgPDwgOSkKKyNkZWZpbmUgVkhVQl9JUlFfQlVTX1JFU1VNRQkJCSgxIDw8 IDgpCisjZGVmaW5lIFZIVUJfSVJRX0JVU19TVVNQRU5EIAkJCSgxIDw8IDcpCisjZGVmaW5lIFZI VUJfSVJRX0JVU19SRVNFVCAJCQkoMSA8PCA2KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAxX0lO X0RBVEFfQUNLCQkoMSA8PCA1KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lOX0RBVEFfTkFL CQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTAkJKDEgPDwg MykKKyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9PVVRfTkFLCQkoMSA8PCAyKQorI2RlZmluZSBW SFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfSVJR X0hVQl9FUDBfU0VUVVAJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX0lSUV9BQ0tfQUxMCQkJMHgx ZmYKKworLyogU1cgcmVzZXQgcmVnICovCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfRVBfUE9PTAkJ CSgxIDw8IDkpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfRE1BX0NPTlRST0xMRVIJCSgxIDw8IDgp CisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFNQkJCSgxIDw8IDUpCisjZGVmaW5lIFZIVUJf U1dfUkVTRVRfREVWSUNFNAkJCSgxIDw8IDQpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNF MwkJCSgxIDw8IDMpCisjZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMgkJCSgxIDw8IDIpCisj ZGVmaW5lIFZIVUJfU1dfUkVTRVRfREVWSUNFMQkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfU1df UkVTRVRfUk9PVF9IVUIJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX1NXX1JFU0VUX0FMTAkJCShW SFVCX1NXX1JFU0VUX0VQX1BPT0wgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9ETUFfQ09OVFJP TExFUiB8IFwKKwkJCQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTUgfCBcCisJCQkJCQkgVkhVQl9T V19SRVNFVF9ERVZJQ0U0IHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfREVWSUNFMyB8IFwKKwkJ CQkJCSBWSFVCX1NXX1JFU0VUX0RFVklDRTIgfCBcCisJCQkJCQkgVkhVQl9TV19SRVNFVF9ERVZJ Q0UxIHwgXAorCQkJCQkJIFZIVUJfU1dfUkVTRVRfUk9PVF9IVUIpCisvKiBFUCBBQ0svTkFDSyBJ UlEgbWFza3MgKi8KKyNkZWZpbmUgVkhVQl9FUF9JUlEobikJCQkJKDEgPDwgKG4pKQorI2RlZmlu ZSBWSFVCX0VQX0lSUV9BTEwJCQkJMHg3ZmZmCS8qIDE1IEVQcyAqLworCisvKiBVU0Igc3RhdHVz IHJlZyAqLworI2RlZmluZSBWSFVCX1VTQlNUU19ISVNQRUVECQkJKDEgPDwgMjcpCisKKy8qIEVQ IHRvZ2dsZSAqLworI2RlZmluZSBWSFVCX0VQX1RPR0dMRV9WQUxVRQkJCSgxIDw8IDgpCisjZGVm aW5lIFZIVUJfRVBfVE9HR0xFX1NFVF9FUE5VTSh4KQkJKCh4KSAmIDB4MWYpCisKKy8qIEhVQiBF UDAgY29udHJvbCAqLworI2RlZmluZSBWSFVCX0VQMF9DVFJMX1NUQUxMCQkJKDEgPDwgMCkKKyNk ZWZpbmUgVkhVQl9FUDBfVFhfQlVGRl9SRFkJCQkoMSA8PCAxKQorI2RlZmluZSBWSFVCX0VQMF9S WF9CVUZGX1JEWQkJCSgxIDw8IDIpCisjZGVmaW5lIFZIVUJfRVAwX1JYX0xFTih4KQkJCSgoKHgp ID4+IDE2KSAmIDB4N2YpCisjZGVmaW5lIFZIVUJfRVAwX1NFVF9UWF9MRU4oeCkJCQkoKCh4KSAm IDB4N2YpIDw8IDgpCisKKy8qIEhVQiBFUDEgY29udHJvbCAqLworI2RlZmluZSBWSFVCX0VQMV9D VFJMX1JFU0VUX1RPR0dMRQkJKDEgPDwgMikKKyNkZWZpbmUgVkhVQl9FUDFfQ1RSTF9TVEFMTAkJ CSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfRVAxX0NUUkxfRU5BQkxFCQkJKDEgPDwgMCkKKworLyoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICoKKyAqIHBlci1kZXZpY2UgcmVnaXN0ZXIgZGVmaW5pdGlvbnMgKgorICog ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovCisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FTl9DVFJMCQkweDAwCisjZGVm aW5lIEFTVF9WSFVCX0RFVl9JU1IJCTB4MDQKKyNkZWZpbmUgQVNUX1ZIVUJfREVWX0VQMF9DVFJM CQkweDA4CisjZGVmaW5lIEFTVF9WSFVCX0RFVl9FUDBfREFUQQkJMHgwYworCisvKiBEZXZpY2Ug ZW5hYmxlIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9ERVZfRU5fU0VUX0FERFIoeCkJCQkoKHgp IDw8IDgpCisjZGVmaW5lIFZIVUJfREVWX0VOX0FERFJfTUFTSwkJCSgoMHhmZikgPDwgOCkKKyNk ZWZpbmUgVkhVQl9ERVZfRU5fRVAwX05BS19JUlFFTgkJKDEgPDwgNikKKyNkZWZpbmUgVkhVQl9E RVZfRU5fRVAwX0lOX0FDS19JUlFFTgkJKDEgPDwgNSkKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRVAw X09VVF9OQUtfSVJRRU4JCSgxIDw8IDQpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQMF9PVVRfQUNL X0lSUUVOCQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0RFVl9FTl9FUDBfU0VUVVBfSVJRRU4JCSgx IDw8IDIpCisjZGVmaW5lIFZIVUJfREVWX0VOX1NQRUVEX1NFTF9ISUdICQkoMSA8PCAxKQorI2Rl ZmluZSBWSFVCX0RFVl9FTl9FTkFCTEVfUE9SVAkJCSgxIDw8IDApCisKKy8qIEludGVycnVwdCBz dGF0dXMgKi8KKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9JTl9EQVRBX05BQ0sJCSgxIDw8IDQp CisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfSU5fQUNLX1NUQUxMCQkoMSA8PCAzKQorI2RlZmlu ZSBWSFVWX0RFVl9JUlFfRVAwX09VVF9EQVRBX05BQ0sJCSgxIDw8IDIpCisjZGVmaW5lIFZIVVZf REVWX0lSUV9FUDBfT1VUX0FDS19TVEFMTAkJKDEgPDwgMSkKKyNkZWZpbmUgVkhVVl9ERVZfSVJR X0VQMF9TRVRVUAkJCSgxIDw8IDApCisKKy8qIENvbnRyb2wgYml0cy4KKyAqCisgKiBOb3RlOiBU aGUgZHJpdmVyIHJlbGllcyBvbiB0aGUgYnVsayBvZiB0aG9zZSBiaXRzCisgKiAgICAgICBtYXRj aGluZyBjb3JyZXNwb25kaW5nIHZIdWIgRVAwIGNvbnRyb2wgYml0cworICovCisjZGVmaW5lIFZI VUJfREVWX0VQMF9DVFJMX1NUQUxMCQkJVkhVQl9FUDBfQ1RSTF9TVEFMTAorI2RlZmluZSBWSFVC X0RFVl9FUDBfVFhfQlVGRl9SRFkJCVZIVUJfRVAwX1RYX0JVRkZfUkRZCisjZGVmaW5lIFZIVUJf REVWX0VQMF9SWF9CVUZGX1JEWQkJVkhVQl9FUDBfUlhfQlVGRl9SRFkKKyNkZWZpbmUgVkhVQl9E RVZfRVAwX1JYX0xFTih4KQkJCVZIVUJfRVAwX1JYX0xFTih4KQorI2RlZmluZSBWSFVCX0RFVl9F UDBfU0VUX1RYX0xFTih4KQkJVkhVQl9FUDBfU0VUX1RYX0xFTih4KQorCisvKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICoKKyAqIHBlci1lbmRwb2ludCByZWdpc3RlciBkZWZpbml0aW9ucyAqCisgKiAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKiovCisKKyNkZWZpbmUgQVNUX1ZIVUJfRVBfQ09ORklHCQkweDAwCisjZGVm aW5lIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUCQkweDA0CisjZGVmaW5lIEFTVF9WSFVCX0VQX0RF U0NfQkFTRQkJMHgwOAorI2RlZmluZSBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUwkJMHgwQworCisv KiBFUCBjb25maWcgcmVnICovCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9NQVhfUEtUKHgpCSgo KHgpICYgMHgzZmYpIDw8IDE2KQorI2RlZmluZSBWSFVCX0VQX0NGR19BVVRPX0RBVEFfRElTQUJM RQkoMSA8PCAxMykKKyNkZWZpbmUgVkhVQl9FUF9DRkdfU1RBTExfQ1RSTAkJKDEgPDwgMTIpCisj ZGVmaW5lIFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0oeCkJKCgoeCkgJiAweGYpIDw8IDgpCisjZGVm aW5lIFZIVUJfRVBfQ0ZHX1NFVF9UWVBFKHgpCQkoKHgpIDw8IDUpCisjZGVmaW5lICAgRVBfVFlQ RV9PRkYJCQkwCisjZGVmaW5lICAgRVBfVFlQRV9CVUxLCQkJMQorI2RlZmluZSAgIEVQX1RZUEVf SU5UCQkJMgorI2RlZmluZSAgIEVQX1RZUEVfSVNPCQkJMworI2RlZmluZSBWSFVCX0VQX0NGR19E SVJfT1VUCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfREVWKHgpCQkoKHgpIDw8 IDEpCisjZGVmaW5lIFZIVUJfRVBfQ0ZHX0VOQUJMRQkJKDEgPDwgMCkKKworLyogRVAgRE1BIGNv bnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9FUF9ETUFfUFJPQ19TVEFUVVMoeCkJKCgoeCkgPj4gNCkg JiAweGYpCisjZGVmaW5lICAgRVBfRE1BX1BST0NfUlhfSURMRQkJMAorI2RlZmluZSAgIEVQX0RN QV9QUk9DX1RYX0lETEUJCTgKKyNkZWZpbmUgVkhVQl9FUF9ETUFfSU5fTE9OR19NT0RFCSgxIDw8 IDMpCisjZGVmaW5lIFZIVUJfRVBfRE1BX09VVF9DT05USUdfTU9ERQkoMSA8PCAzKQorI2RlZmlu ZSBWSFVCX0VQX0RNQV9DVFJMX1JFU0VUCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0VQX0RNQV9T SU5HTEVfU1RBR0UJKDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9FUF9ETUFfREVTQ19NT0RFCQkoMSA8 PCAwKQorCisvKiBFUCBETUEgc3RhdHVzICovCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9UWF9T SVpFKHgpCSgoeCkgPDwgMTYpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1RYX1NJWkUoeCkJCSgoKHgp ID4+IDE2KSAmIDB4N2ZmKQorI2RlZmluZSBWSFVCX0VQX0RNQV9SUFRSKHgpCQkoKCh4KSA+PiA4 KSAmIDB4ZmYpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9SUFRSKHgpCQkoKCh4KSAmIDB4ZmYp IDw8IDgpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NFVF9DUFVfV1BUUih4KQkoeCkKKyNkZWZpbmUg VkhVQl9FUF9ETUFfU0lOR0xFX0tJQ0sJCSgxIDw8IDApIC8qIFdQVFIgPSAxIGZvciBzaW5nbGUg bW9kZSAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICoKKyAqIERNQSBkZXNjcmlwdG9ycyBkZWZpbml0aW9ucyAqCisg KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKiovCisKKy8qIERlc2MgVzEgSU4gKi8KKyNkZWZpbmUgVkhVQl9EU0MxX0lOX0lOVEVS UlVQVAkJKDEgPDwgMzEpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElEX0RBVEEwCQkoMCA8PCAx NCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NQSURfREFUQTIJCSgxIDw8IDE0KQorI2RlZmluZSBW SFVCX0RTQzFfSU5fU1BJRF9EQVRBMQkJKDIgPDwgMTQpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9T UElEX01EQVRBCQkoMyA8PCAxNCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NFVF9MRU4oeCkJCSgo eCkgJiAweGZmZikKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX0xFTih4KQkJKCh4KSAmIDB4ZmZmKQor CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIERhdGEgc3RydWN0dXJlcyBhbmQgbWlz YyBkZWZpbml0aW9ucyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg KgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUg QVNUX1ZIVUJfTlVNX0dFTl9FUHMJMTUJLyogR2VuZXJpYyBub24tMCBFUHMgKi8KKyNkZWZpbmUg QVNUX1ZIVUJfTlVNX1BPUlRTCTUJLyogdkh1YiBwb3J0cyAqLworI2RlZmluZSBBU1RfVkhVQl9F UDBfTUFYX1BBQ0tFVAk2NAkvKiBFUDAncyBtYXggcGFja2V0IHNpemUgKi8KKyNkZWZpbmUgQVNU X1ZIVUJfRVBuX01BWF9QQUNLRVQJMTAyNAkvKiBHZW5lcmljIEVQcyBtYXggcGFja2V0IHNpemUg Ki8KKyNkZWZpbmUgQVNUX1ZIVUJfREVTQ1NfQ09VTlQJMjU2CS8qIFVzZSAyNTYgZGVzY3JpcHRv ciBtb2RlICh2YWxpZAorCQkJCQkgKiB2YWx1ZXMgYXJlIDI1NiBhbmQgMzIpCisJCQkJCSAqLwor CitzdHJ1Y3QgYXN0X3ZodWI7CitzdHJ1Y3QgYXN0X3ZodWJfZGV2OworCisvKgorICogRE1BIGRl c2NyaXB0b3IgKGdlbmVyaWMgRVBzIG9ubHksIGN1cnJlbnRseSBvbmx5IHVzZWQKKyAqIGZvciBJ TiBlbmRwb2ludHMKKyAqLworc3RydWN0IGFzdF92aHViX2Rlc2MgeworCV9fbGUzMgl3MDsKKwlf X2xlMzIJdzE7Cit9OworCisvKiBBIHRyYW5zZmVyIHJlcXVlc3QsIGVpdGhlciBjb3JlLW9yaWdp bmF0ZWQgb3IgaW50ZXJuYWwgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9yZXEgeworCXN0cnVjdCB1c2Jf cmVxdWVzdAlyZXE7CisJc3RydWN0IGxpc3RfaGVhZAlxdWV1ZTsKKworCS8qIEFjdHVhbCBjb3Vu dCB3cml0dGVuIHRvIGRlc2NyaXB0b3JzIChkZXNjIG1vZGUgb25seSkgKi8KKwl1bnNpZ25lZCBp bnQJCWFjdF9jb3VudDsKKworCS8qCisJICogRGVzYyBudW1iZXIgb2YgdGhlIGZpbmFsIHBhY2tl dCBvciAtMS4gRm9yIG5vbi1kZXNjCisJICogbW9kZSAob3IgZXAwKSwgYW55ID49IDAgdmFsdWUg bWVhbnMgImxhc3QgcGFja2V0IgorCSAqLworCWludAkJCWxhc3RfZGVzYzsKKworCS8qIFJlcXVl c3QgYWN0aXZlIChwZW5kaW5nIERNQXMpICovCisJYm9vbAkJCWFjdGl2ZSAgOiAxOworCisJLyog SW50ZXJuYWwgcmVxdWVzdCAoZG9uJ3QgY2FsbCBiYWNrIGNvcmUpICovCisJYm9vbAkJCWludGVy bmFsIDogMTsKK307CisjZGVmaW5lIHRvX2FzdF9yZXEoX191cmVxKSBjb250YWluZXJfb2YoX191 cmVxLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCByZXEpCisKKy8qIEN1cnJlbnQgc3RhdGUgb2YgYW4g RVAwICovCitlbnVtIGVwMF9zdGF0ZSB7CisJZXAwX3N0YXRlX3Rva2VuLAorCWVwMF9zdGF0ZV9k YXRhLAorCWVwMF9zdGF0ZV9zdGF0dXMsCit9OworCisvKgorICogQW4gZW5kcG9pbnQsIGVpdGhl ciBnZW5lcmljLCBlcDAsIGFjdHVhbCBnYWRnZXQgRVAKKyAqIG9yIGludGVybmFsIHVzZSB2aHVi IEVQMC4gdmh1YiBFUDEgZG9lc24ndCBoYXZlIGFuCisgKiBhc3NvY2lhdGVkIHN0cnVjdHVyZSBh cyBpdCdzIG1vc3RseSBIVyBtYW5hZ2VkLgorICovCitzdHJ1Y3QgYXN0X3ZodWJfZXAgeworCXN0 cnVjdCB1c2JfZXAJCWVwOworCisJLyogUmVxdWVzdCBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hl YWQJcXVldWU7CisKKwkvKiBFUCBpbmRleCBpbiB0aGUgZGV2aWNlLCAwIG1lYW5zIHRoaXMgaXMg YW4gRVAwICovCisJdW5zaWduZWQgaW50CQlkX2lkeDsKKworCS8qIERldiBwb2ludGVyIG9yIE5V TEwgZm9yIHZIdWIgRVAwICovCisJc3RydWN0IGFzdF92aHViX2RldgkqZGV2OworCisJLyogdkh1 YiBpdHNlbGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWIJCSp2aHViOworCisJLyoKKwkgKiBETUEgYnVm ZmVyIGZvciBFUDAsIGZhbGxiYWNrIERNQSBidWZmZXIgZm9yIG1pc2FsaWduZWQKKwkgKiBPVVQg dHJhbnNmZXJzIGZvciBnZW5lcmljIEVQcworCSAqLworCXZvaWQJCQkqYnVmOworCWRtYV9hZGRy X3QJCWJ1Zl9kbWE7CisKKwkvKiBUaGUgcmVzdCBkZXBlbmRzIG9uIHRoZSBFUCB0eXBlICovCisJ dW5pb24geworCQkvKiBFUDAgKGVpdGhlciBkZXZpY2Ugb3Igdmh1YikgKi8KKwkJc3RydWN0IHsK KwkJCS8qCisJCQkgKiBFUDAgcmVnaXN0ZXJzIGFyZSAic2ltaWxhciIgZm9yCisJCQkgKiB2SHVi IGFuZCBkZXZpY2VzIGJ1dCBsb2NhdGVkIGluCisJCQkgKiBkaWZmZXJlbnQgcGxhY2VzLgorCQkJ ICovCisJCQl2b2lkIF9faW9tZW0JCSpjdGxzdGF0OworCQkJdm9pZCBfX2lvbWVtCQkqc2V0dXA7 CisKKwkJCS8qIEN1cnJlbnQgc3RhdGUgJiBkaXJlY3Rpb24gKi8KKwkJCWVudW0gZXAwX3N0YXRl CQlzdGF0ZTsKKwkJCWJvb2wJCQlkaXJfaW47CisKKwkJCS8qIEludGVybmFsIHVzZSByZXF1ZXN0 ICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfcmVxCXJlcTsKKwkJfSBlcDA7CisKKwkJLyogR2VuZXJp YyBlbmRwb2ludCAoYWthIEVQbikgKi8KKwkJc3RydWN0IHsKKwkJCS8qIFJlZ2lzdGVycyAqLwor CQkJdm9pZCBfX2lvbWVtICAgCQkqcmVnczsKKworCQkJLyogSW5kZXggaW4gZ2xvYmFsIHBvb2wg KDAuLjE0KSAqLworCQkJdW5zaWduZWQgaW50CQlnX2lkeDsKKworCQkJLyogRE1BIERlc2NyaXB0 b3JzICovCisJCQlzdHJ1Y3QgYXN0X3ZodWJfZGVzYwkqZGVzY3M7CisJCQlkbWFfYWRkcl90CQlk ZXNjc19kbWE7CisJCQl1bnNpZ25lZCBpbnQJCWRfbmV4dDsKKwkJCXVuc2lnbmVkIGludAkJZF9s YXN0OworCQkJdW5zaWduZWQgaW50CQlkbWFfY29uZjsKKworCQkJLyogTWF4IGNodW5rIHNpemUg Zm9yIElOIEVQcyAqLworCQkJdW5zaWduZWQgaW50CQljaHVua19tYXg7CisKKwkJCS8qIFN0YXRl IGZsYWdzICovCisJCQlib29sCQkJaXNfaW4gOiAgMTsKKwkJCWJvb2wJCQlpc19pc28gOiAxOwor CQkJYm9vbAkJCXN0YWxsZWQgOiAxOworCQkJYm9vbAkJCXdlZGdlZCA6IDE7CisJCQlib29sCQkJ ZW5hYmxlZCA6IDE7CisJCQlib29sCQkJZGVzY19tb2RlIDogMTsKKwkJfSBlcG47CisJfTsKK307 CisjZGVmaW5lIHRvX2FzdF9lcChfX3VlcCkgY29udGFpbmVyX29mKF9fdWVwLCBzdHJ1Y3QgYXN0 X3ZodWJfZXAsIGVwKQorCisvKiBBIGRldmljZSBhdHRhY2hlZCB0byBhIHZIdWIgcG9ydCAqLwor c3RydWN0IGFzdF92aHViX2RldiB7CisJc3RydWN0IGFzdF92aHViCQkJKnZodWI7CisJdm9pZCBf X2lvbWVtCQkJKnJlZ3M7CisKKwkvKiBEZXZpY2UgaW5kZXggKDAuLi40KSBhbmQgbmFtZSBzdHJp bmcgKi8KKwl1bnNpZ25lZCBpbnQJCQlpbmRleDsKKwljb25zdCBjaGFyCQkJKm5hbWU7CisKKwkv KiBzeXNmcyBlbmNsb3N1cmUgZm9yIHRoZSBnYWRnZXQgZ3VuayAqLworCXN0cnVjdCBkZXZpY2UJ CQkqcG9ydF9kZXY7CisKKwkvKiBMaW5rIHRvIGdhZGdldCBjb3JlICovCisJc3RydWN0IHVzYl9n YWRnZXQJCWdhZGdldDsKKwlzdHJ1Y3QgdXNiX2dhZGdldF9kcml2ZXIJKmRyaXZlcjsKKwlib29s CQkJCXJlZ2lzdGVyZWQgOiAxOworCWJvb2wJCQkJd2FrZXVwX2VuIDogMTsKKwlib29sCQkJCXN1 c3BlbmRlZCA6IDE7CisJYm9vbAkJCQllbmFibGVkIDogMTsKKworCS8qIEVuZHBvaW50IHN0cnVj dHVyZXMgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwMDsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJ CSplcG5zW0FTVF9WSFVCX05VTV9HRU5fRVBzXTsKKworfTsKKyNkZWZpbmUgdG9fYXN0X2Rldihf X2cpIGNvbnRhaW5lcl9vZihfX2csIHN0cnVjdCBhc3Rfdmh1Yl9kZXYsIGdhZGdldCkKKworLyog UGVyIHZodWIgcG9ydCBzdGF0ZWluZm8gc3RydWN0dXJlICovCitzdHJ1Y3QgYXN0X3ZodWJfcG9y dCB7CisJLyogUG9ydCBzdGF0dXMgJiBzdGF0dXMgY2hhbmdlIHJlZ2lzdGVycyAqLworCXUxNgkJ CXN0YXR1czsKKwl1MTYJCQljaGFuZ2U7CisKKwkvKiBBc3NvY2lhdGVkIGRldmljZSBzbG90ICov CisJc3RydWN0IGFzdF92aHViX2RldglkZXY7Cit9OworCisvKiBHbG9iYWwgdmh1YiBzdHJ1Y3R1 cmUgKi8KK3N0cnVjdCBhc3Rfdmh1YiB7CisJc3RydWN0IHBsYXRmb3JtX2RldmljZQkJKnBkZXY7 CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisJaW50CQkJCWlycTsKKwlzcGlubG9ja190CQkJbG9j azsKKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJCXdha2Vfd29yazsKKwlzdHJ1Y3QgY2xrCQkJKmNsazsK KworCS8qIEVQMCBETUEgYnVmZmVycyBhbGxvY2F0ZWQgaW4gb25lIGNodW5rICovCisJdm9pZAkJ CQkqZXAwX2J1ZnM7CisJZG1hX2FkZHJfdAkJCWVwMF9idWZzX2RtYTsKKworCS8qIEVQMCBvZiB0 aGUgdmh1YiBpdHNlbGYgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwMDsKKworCS8qIFN0YXRl IG9mIHZodWIgZXAxICovCisJYm9vbAkJCQllcDFfc3RhbGxlZCA6IDE7CisKKwkvKiBQZXItcG9y dCBpbmZvICovCisJc3RydWN0IGFzdF92aHViX3BvcnQJCXBvcnRzW0FTVF9WSFVCX05VTV9QT1JU U107CisKKwkvKiBHZW5lcmljIEVQIGRhdGEgc3RydWN0dXJlcyAqLworCXN0cnVjdCBhc3Rfdmh1 Yl9lcAkJZXBuc1tBU1RfVkhVQl9OVU1fR0VOX0VQc107CisKKwkvKiBVcHN0cmVhbSBidXMgaXMg c3VzcGVuZGVkID8gKi8KKwlib29sCQkJCXN1c3BlbmRlZCA6IDE7CisKKwkvKiBIdWIgaXRzZWxm IGNhbiBzaWduYWwgcmVtb3RlIHdha2V1cCAqLworCWJvb2wJCQkJd2FrZXVwX2VuIDogMTsKKwor CS8qIEZvcmNlIGZ1bGwgc3BlZWQgb25seSAqLworCWJvb2wJCQkJZm9yY2VfdXNiMSA6IDE7CisK KwkvKiBVcHN0cmVhbSBidXMgc3BlZWQgY2FwdHVyZWQgYXQgYnVzIHJlc2V0ICovCisJdW5zaWdu ZWQgaW50CQkJc3BlZWQ7Cit9OworCisvKiBTdGFuZGFyZCByZXF1ZXN0IGhhbmRsZXJzIHJlc3Vs dCBjb2RlcyAqLworZW51bSBzdGRfcmVxX3JjIHsKKwlzdGRfcmVxX3N0YWxsID0gLTEsCS8qIFN0 YWxsIHJlcXVlc3RlZCAqLworCXN0ZF9yZXFfY29tcGxldGUgPSAwLAkvKiBSZXF1ZXN0IGNvbXBs ZXRlZCB3aXRoIG5vIGRhdGEgKi8KKwlzdGRfcmVxX2RhdGEgPSAxLAkvKiBSZXF1ZXN0IGNvbXBs ZXRlZCB3aXRoIGRhdGEgKi8KKwlzdGRfcmVxX2RyaXZlciA9IDIsCS8qIFBhc3MgdG8gZHJpdmVy IHBscyAqLworfTsKKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VUX1ZFUkJPU0UKKyNkZWZpbmUg VURDVkRCRyh1LCBmbXQuLi4pCWRldl9kYmcoJih1KS0+cGRldi0+ZGV2LCBmbXQpCisKKyNkZWZp bmUgRVBWREJHKGVwLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJnKCYoZXApLT52aHViLT5w ZGV2LT5kZXYsCQkJXAorCQkiJXM6RVAlZCAiIGZtdCwJCQkJXAorCQkoZXApLT5kZXYgPyAoZXAp LT5kZXYtPm5hbWUgOiAiaHViIiwJXAorCQkoZXApLT5kX2lkeCwgIyNfX1ZBX0FSR1NfXyk7CQlc CisJfSB3aGlsZSgwKQorCisjZGVmaW5lIERWREJHKGQsIGZtdCwgLi4uKQlkbyB7CQkJXAorCWRl dl9kYmcoJihkKS0+dmh1Yi0+cGRldi0+ZGV2LAkJCVwKKwkJIiVzICIgZm10LCAoZCktPm5hbWUs CQkJXAorCQkjI19fVkFfQVJHU19fKTsJCQkJXAorCX0gd2hpbGUoMCkKKworI2Vsc2UKKyNkZWZp bmUgVURDVkRCRyh1LCBmbXQuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBFUFZEQkcoZXAs IGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRFZEQkcoZCwgZm10LCAuLi4pCWRv IHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfVVNCX0dBREdFVF9ERUJVRwor I2RlZmluZSBVRENEQkcodSwgZm10Li4uKQlkZXZfZGJnKCYodSktPnBkZXYtPmRldiwgZm10KQor CisjZGVmaW5lIEVQREJHKGVwLCBmbXQsIC4uLikJZG8gewkJCVwKKwlkZXZfZGJnKCYoZXApLT52 aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXM6RVAlZCAiIGZtdCwJCQkJXAorCQkoZXApLT5kZXYg PyAoZXApLT5kZXYtPm5hbWUgOiAiaHViIiwJXAorCQkoZXApLT5kX2lkeCwgIyNfX1ZBX0FSR1Nf Xyk7CQlcCisJfSB3aGlsZSgwKQorCisjZGVmaW5lIEREQkcoZCwgZm10LCAuLi4pCWRvIHsJCQlc CisJZGV2X2RiZygmKGQpLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXMgIiBmbXQsIChkKS0+ bmFtZSwJCQlcCisJCSMjX19WQV9BUkdTX18pOwkJCQlcCisJfSB3aGlsZSgwKQorI2Vsc2UKKyNk ZWZpbmUgVURDREJHKHUsIGZtdC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEVQREJHKGVw LCBmbXQsIC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEREQkcoZCwgZm10LCAuLi4pCWRv IHsgfSB3aGlsZSgwKQorI2VuZGlmCisKKy8qIGNvcmUuYyAqLwordm9pZCBhc3Rfdmh1Yl9kb25l KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSwKKwkJICAg aW50IHN0YXR1cyk7Cit2b2lkIGFzdF92aHViX251a2Uoc3RydWN0IGFzdF92aHViX2VwICplcCwg aW50IHN0YXR1cyk7CitzdHJ1Y3QgdXNiX3JlcXVlc3QgKmFzdF92aHViX2FsbG9jX3JlcXVlc3Qo c3RydWN0IHVzYl9lcCAqdV9lcCwKKwkJCQkJICAgZ2ZwX3QgZ2ZwX2ZsYWdzKTsKK3ZvaWQgYXN0 X3ZodWJfZnJlZV9yZXF1ZXN0KHN0cnVjdCB1c2JfZXAgKnVfZXAsIHN0cnVjdCB1c2JfcmVxdWVz dCAqdV9yZXEpOwordm9pZCBhc3Rfdmh1Yl9pbml0X2h3KHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7 CisKKy8qIGVwMC5jICovCit2b2lkIGFzdF92aHViX2VwMF9oYW5kbGVfYWNrKHN0cnVjdCBhc3Rf dmh1Yl9lcCAqZXAsIGJvb2wgaW5fYWNrKTsKK3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1 cChzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwKTsKK3ZvaWQgYXN0X3ZodWJfaW5pdF9lcDAoc3RydWN0 IGFzdF92aHViICp2aHViLCBzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkgICAgICAgc3RydWN0 IGFzdF92aHViX2RldiAqZGV2KTsKK2ludCBhc3Rfdmh1Yl9yZXBseShzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLCBjaGFyICpwdHIsIGludCBsZW4pOworaW50IF9fYXN0X3ZodWJfc2ltcGxlX3JlcGx5 KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBsZW4sIC4uLik7CisjZGVmaW5lIGFzdF92aHVi X3NpbXBsZV9yZXBseSh1ZGMsIC4uLikJCQkJCSAgICAgICBcCisJX19hc3Rfdmh1Yl9zaW1wbGVf cmVwbHkoKHVkYyksCQkJCQkgICAgICAgXAorCQkJICAgICAgIHNpemVvZigodThbXSkgeyBfX1ZB X0FSR1NfXyB9KS9zaXplb2YodTgpLCAgICAgIFwKKwkJCSAgICAgICBfX1ZBX0FSR1NfXykKKwor LyogaHViLmMgKi8KK3ZvaWQgYXN0X3ZodWJfaW5pdF9odWIoc3RydWN0IGFzdF92aHViICp2aHVi KTsKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92 aHViX2VwICplcCwKKwkJCQkJIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSk7CitlbnVtIHN0 ZF9yZXFfcmMgYXN0X3ZodWJfY2xhc3NfaHViX3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICpl cCwKKwkJCQkJICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsKK3ZvaWQgYXN0X3ZodWJf ZGV2aWNlX2Nvbm5lY3Qoc3RydWN0IGFzdF92aHViICp2aHViLCB1bnNpZ25lZCBpbnQgcG9ydCwK KwkJCSAgICAgYm9vbCBvbik7Cit2b2lkIGFzdF92aHViX2h1Yl9zdXNwZW5kKHN0cnVjdCBhc3Rf dmh1YiAqdmh1Yik7Cit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUoc3RydWN0IGFzdF92aHViICp2 aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7Cit2 b2lkIGFzdF92aHViX2h1Yl93YWtlX2FsbChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpOworCisvKiBk ZXYuYyAqLworaW50IGFzdF92aHViX2luaXRfZGV2KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YiwgdW5z aWduZWQgaW50IGlkeCk7Cit2b2lkIGFzdF92aHViX2RlbF9kZXYoc3RydWN0IGFzdF92aHViX2Rl diAqZCk7Cit2b2lkIGFzdF92aHViX2Rldl9pcnEoc3RydWN0IGFzdF92aHViX2RldiAqZCk7Citp bnQgYXN0X3ZodWJfc3RkX2Rldl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCQkg ICAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSk7CisKKy8qIGVwbi5jICovCit2b2lkIGFz dF92aHViX2Vwbl9hY2tfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOwordm9pZCBhc3Rfdmh1 Yl91cGRhdGVfZXBuX3N0YWxsKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOworc3RydWN0IGFzdF92 aHViX2VwICphc3Rfdmh1Yl9hbGxvY19lcG4oc3RydWN0IGFzdF92aHViX2RldiAqZCwgdTggYWRk cik7Cit2b2lkIGFzdF92aHViX2Rldl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpOwor dm9pZCBhc3Rfdmh1Yl9kZXZfcmVzdW1lKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpOwordm9pZCBh c3Rfdmh1Yl9kZXZfcmVzZXQoc3RydWN0IGFzdF92aHViX2RldiAqZCk7CisKKyNlbmRpZiAvKiBf X0FTUEVFRF9WSFVCX0ggKi8K