From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v3,2/2] usb/gadget: Add driver for Aspeed SoC virtual hub From: Benjamin Herrenschmidt Message-Id: <20180122222716.7039-2-benh@kernel.crashing.org> Date: Tue, 23 Jan 2018 09:27:16 +1100 To: linux-usb@vger.kernel.org Cc: Greg KH , Joel Stanley , Andrew Jeffery , Felipe Balbi , Benjamin Herrenschmidt List-ID: VGhlIEFzcGVlZCBCTUMgU29DcyBzdXBwb3J0IGEgInZpcnR1YWwgaHViIiBmdW5jdGlvbi4gSXQg cHJvdmlkZXMgc29tZQpIVyBzdXBwb3J0IGZvciBhIHRvcC1sZXZlbCBVU0IyIGh1YiBiZWhpbmQg d2hpY2ggc2l0IDUgZ2FkZ2V0ICJwb3J0cyIuCgpUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9y IHRoZSBmdWxsIGZ1bmN0aW9uYWxpdHksIGVtdWxhdGluZyB0aGUKaHViIHN0YW5kYXJkIHJlcXVl c3RzIGFuZCBleHBvc2luZyA1IFVEQyBnYWRnZXQgZHJpdmVycyBjb3JyZXNwb25kaW5nCnRvIHRo ZSBwb3J0cy4KClRoZSBodWIgaXRzZWxmIGhhcyBIVyBwcm92aWRlZCBkZWRpY2F0ZWQgRVAwIGFu ZCBFUDEgKHRoZSBsYXR0ZXIgZm9yCmh1YiBpbnRlcnJ1cHRzKS4gSXQgYWxzbyBoYXMgZGVkaWNh dGVkIEVQMHMgZm9yIGVhY2ggZnVuY3Rpb24uIEZvcgpvdGhlciBlbmRwb2ludHMsIHRoZXJlJ3Mg YSBwb29sIG9mIDE1ICJnZW5lcmljIiBlbmRwb2ludHMgdGhhdCBhcmUKc2hhcmVkIGFtb25nIHRo ZSBwb3J0cy4KClRoZSBkcml2ZXIgcmVsaWVzIG9uIG15IHByZXZpb3VzIHBhdGNoIGFkZGluZyBh ICJkaXNwb3NlIiBFUCBvcCB0bwpoYW5kbGUgRVAgYWxsb2NhdGlvbiBiZXR3ZWVuIHBvcnRzLiBF UHMgYXJlIGFsbG9jYXRlZCBmcm9tIHRoZSBzaGFyZWQKcG9vbCBpbiB0aGUgVURDICJtYXRjaF9l cCIgY2FsbGJhY2sgYW5kIGFzc2lnbmVkIHRvIHRoZSBVREMgaW5zdGFuY2UKKGFkZGVkIHRvIHRo ZSBnYWRnZXQgZXBfbGlzdCkuCgpXaGVuIHRoZSBjb21wb3NpdGUgZHJpdmVyIGdldHMgdW5ib3Vu ZCwgdGhlIG5ldyBob29rIHdpbGwgYWxsb3cgdGhlIFVEQwp0byBjbGVhbiB0aGluZ3MgdXAgYW5k IHJldHVybiB0aG9zZSBFUHMgdG8gdGhlIHNoYXJlZCBwb29sLgoKU2lnbmVkLW9mZi1ieTogQmVu amFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwuY3Jhc2hpbmcub3JnPgotLS0KdjMuIC0g UmViYXNlZAogICAgLSBBZGQgY2xrIHN0dWZmCgp2Mi4gLSBDb3NtZXRpYyBmaXhlcwogICAgLSBQ cm9wZXJseSAiYWxsb2NhdGUiIGRldmljZSBhZGRyZXNzZXMgaW5zdGVhZCBvZiB1c2luZyBhIG5l dmVyCiAgICAgIHJlc2V0IGNvdW50ZXIKICAgIC0gTW92ZSAuZHRzaSB1cGRhdGVzIHRvIGEgZGlm ZmVyZW50IHBhdGNoCi0tLQogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9LY29uZmlnICAgICAgICAg ICAgICB8ICAgMiArCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlICAgICAgICAgICAg IHwgICAxICsKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvS2NvbmZpZyAgfCAg IDYgKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmlsZSB8ICAgMiAr CiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2NvcmUuYyAgIHwgNDI5ICsrKysr KysrKysrKysrCiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jICAgIHwg NTgxICsrKysrKysrKysrKysrKysrKysKIGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvZXAwLmMgICAgfCA0NzQgKysrKysrKysrKysrKysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi9lcG4uYyAgICB8IDg0MCArKysrKysrKysrKysrKysrKysrKysrKysrKysr CiBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jICAgIHwgODIyICsrKysr KysrKysrKysrKysrKysrKysrKysrKwogZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1 Yi92aHViLmggICB8IDQ5NiArKysrKysrKysrKysrKysrCiAxMCBmaWxlcyBjaGFuZ2VkLCAzNjUz IGluc2VydGlvbnMoKykKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRj L2FzcGVlZC12aHViL0tjb25maWcKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL01ha2VmaWxlCiBjcmVhdGUgbW9kZSAxMDA2NDQgZHJpdmVycy91 c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMKIGNyZWF0ZSBtb2RlIDEwMDY0NCBkcml2 ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQg ZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwogY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXBuLmMKIGNyZWF0ZSBtb2Rl IDEwMDY0NCBkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jCiBjcmVhdGUg bW9kZSAxMDA2NDQgZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi92aHViLmgKCmRp ZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL0tjb25maWcgYi9kcml2ZXJzL3VzYi9n YWRnZXQvdWRjL0tjb25maWcKaW5kZXggMWU5NTY3MDkxZDg2Li4xNGNmMzFhMjcwM2EgMTAwNjQ0 Ci0tLSBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvS2NvbmZpZworKysgYi9kcml2ZXJzL3VzYi9n YWRnZXQvdWRjL0tjb25maWcKQEAgLTQzOSw2ICs0MzksOCBAQCBjb25maWcgVVNCX0dBREdFVF9Y SUxJTlgKIAkgIGR5bmFtaWNhbGx5IGxpbmtlZCBtb2R1bGUgY2FsbGVkICJ1ZGMteGlsaW54IiBh bmQgZm9yY2UgYWxsCiAJICBnYWRnZXQgZHJpdmVycyB0byBhbHNvIGJlIGR5bmFtaWNhbGx5IGxp bmtlZC4KIAorc291cmNlICJkcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL0tjb25m aWciCisKICMKICMgTEFTVCAtLSBkdW1teS9lbXVsYXRlZCBjb250cm9sbGVyCiAjCmRpZmYgLS1n aXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0 L3VkYy9NYWtlZmlsZQppbmRleCBjZTg2NWIxMjlmZDYuLjg5N2Y2NDhmM2NmMSAxMDA2NDQKLS0t IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9NYWtlZmlsZQorKysgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL01ha2VmaWxlCkBAIC0zOSw0ICszOSw1IEBAIG9iai0kKENPTkZJR19VU0JfTVZfVTNE KQkrPSBtdl91M2RfY29yZS5vCiBvYmotJChDT05GSUdfVVNCX0dSX1VEQykJKz0gZ3JfdWRjLm8K IG9iai0kKENPTkZJR19VU0JfR0FER0VUX1hJTElOWCkJKz0gdWRjLXhpbGlueC5vCiBvYmotJChD T05GSUdfVVNCX1NOUF9VRENfUExBVCkgKz0gc25wc191ZGNfcGxhdC5vCitvYmotJChDT05GSUdf VVNCX0FTUEVFRF9WSFVCKQkrPSBhc3BlZWQtdmh1Yi8KIG9iai0kKENPTkZJR19VU0JfQkRDX1VE QykJKz0gYmRjLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1 Yi9LY29uZmlnIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmlnCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uY2IwMjJjODg1NDI1Ci0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9LY29uZmln CkBAIC0wLDAgKzEsNiBAQAorY29uZmlnIFVTQl9BU1BFRURfVkhVQgorCXRyaXN0YXRlICJBc3Bl ZWQgdkh1YiBVREMgZHJpdmVyIgorCWRlcGVuZHMgb24gQVJDSF9BU1BFRUQgfHwgQ09NUElMRV9U RVNUCisJaGVscAorCSAgVVNCIHBlcmlwaGVyYWwgY29udHJvbGxlciBmb3IgdGhlIEFzcGVlZCBB U1QyNTAwIGZhbWlseQorCSAgU29DcyBzdXBwb3J0aW5nIHRoZSAidkh1YiIgZnVuY3Rpb25hbGl0 eSBhbmQgVVNCMi4wCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12 aHViL01ha2VmaWxlIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9NYWtlZmls ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjYxNGIxYWRlMzcwNAot LS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvTWFr ZWZpbGUKQEAgLTAsMCArMSwyIEBACitvYmotJChDT05GSUdfVVNCX0FTUEVFRF9WSFVCKQkrPSBj b3JlLm8gZXAwLm8gZXBuLm8gZGV2Lm8gaHViLm8KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2Iv Z2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9jb3JlLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2Fz cGVlZC12aHViL2NvcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAu LjMxZWQyYjZlMjQxYgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMv YXNwZWVkLXZodWIvY29yZS5jCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogYXNwZWVkLXZodWIg LS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICogY29yZS5j IC0gVG9wIGxldmVsIHN1cHBvcnQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRp b24KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3Ry aWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUg R2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3 YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAo YXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51 eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9w bGF0Zm9ybV9kZXZpY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxp bnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9l cnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1 cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0 Y2guaD4KKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0 Lmg+CisjaW5jbHVkZSA8bGludXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+Cisj aW5jbHVkZSA8bGludXgvcmVnbWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4K KworI2luY2x1ZGUgInZodWIuaCIKKworc3RhdGljIGJvb2wgZm9yY2VfdXNiMSA9IGZhbHNlOwor c3RhdGljIGJvb2wgbm9fZG1hX2Rlc2MgPSBmYWxzZTsKKworbW9kdWxlX3BhcmFtX25hbWVkKGZv cmNlX3VzYjEsIGZvcmNlX3VzYjEsIGJvb2wsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhmb3Jj ZV91c2IxLCAiU2V0IHRvIHRydWUgdG8gZm9yY2UgdG8gVVNCMSBzcGVlZCIpOworbW9kdWxlX3Bh cmFtX25hbWVkKG5vX2RtYV9kZXNjLCBub19kbWFfZGVzYywgYm9vbCwgMDY0NCk7CitNT0RVTEVf UEFSTV9ERVNDKG5vX2RtYV9kZXNjLCAiU2V0IHRvIHRydWUgdG8gZGlzYWJsZSB1c2Ugb2YgRE1B IGRlc2NyaXB0b3JzIik7CisKK3ZvaWQgYXN0X3ZodWJfZG9uZShzdHJ1Y3QgYXN0X3ZodWJfZXAg KmVwLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEsCisJCSAgIGludCBzdGF0dXMpCit7CisJYm9v bCBpbnRlcm5hbCA9IHJlcS0+aW50ZXJuYWw7CisKKwlFUFZEQkcoZXAsICJjb21wbGV0aW5nIHJl cXVlc3QgQCVwLCBzdGF0dXMgJWRcbiIsIHJlcSwgc3RhdHVzKTsKKworCWxpc3RfZGVsX2luaXQo JnJlcS0+cXVldWUpOworCisJaWYgKHJlcS0+cmVxLnN0YXR1cyA9PSAtRUlOUFJPR1JFU1MpCisJ CXJlcS0+cmVxLnN0YXR1cyA9IHN0YXR1czsKKworCWlmIChyZXEtPnJlcS5kbWEpIHsKKwkJaWYg KCFXQVJOX09OKCFlcC0+ZGV2KSkKKwkJCXVzYl9nYWRnZXRfdW5tYXBfcmVxdWVzdCgmZXAtPmRl di0+Z2FkZ2V0LAorCQkJCQkJICZyZXEtPnJlcSwgZXAtPmVwbi5pc19pbik7CisJCXJlcS0+cmVx LmRtYSA9IDA7CisJfQorCisJLyoKKwkgKiBJZiB0aGlzIGlzbid0IGFuIGludGVybmFsIEVQMCBy ZXF1ZXN0LCBjYWxsIHRoZSBjb3JlCisJICogdG8gY2FsbCB0aGUgZ2FkZ2V0IGNvbXBsZXRpb24u CisJICovCisJaWYgKCFpbnRlcm5hbCkgeworCQlzcGluX3VubG9jaygmZXAtPnZodWItPmxvY2sp OworCQl1c2JfZ2FkZ2V0X2dpdmViYWNrX3JlcXVlc3QoJmVwLT5lcCwgJnJlcS0+cmVxKTsKKwkJ c3Bpbl9sb2NrKCZlcC0+dmh1Yi0+bG9jayk7CisJfQorfQorCit2b2lkIGFzdF92aHViX251a2Uo c3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IHN0YXR1cykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJf cmVxICpyZXE7CisKKwlFUERCRyhlcCwgIk51a2luZ1xuIik7CisKKwkvKiB0ZXJtaW5hdGUgYW55 IHJlcXVlc3QgaW4gdGhlIHF1ZXVlICovCisJaWYgKGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSkpCisJ CXJldHVybjsKKworCS8qIEJld2FyZSwgbG9jayB3aWxsIGJlIGRyb3BwZWQgJiByZXEtYWNxdWly ZWQgYnkgZG9uZSgpICovCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpKSB7CisJCXJl cSA9IGxpc3RfZmlyc3RfZW50cnkoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVl dWUpOworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIHN0YXR1cyk7CisJfQorfQorCitzdHJ1Y3Qg dXNiX3JlcXVlc3QgKmFzdF92aHViX2FsbG9jX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwK KwkJCQkJICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsK KworCXJlcSA9IGt6YWxsb2Moc2l6ZW9mKCpyZXEpLCBnZnBfZmxhZ3MpOworCWlmICghcmVxKQor CQlyZXR1cm4gTlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmcmVxLT5xdWV1ZSk7CisJcmV0dXJuICZy ZXEtPnJlcTsKK30KKwordm9pZCBhc3Rfdmh1Yl9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAq dV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVx ICpyZXEgPSB0b19hc3RfcmVxKHVfcmVxKTsKKworCWtmcmVlKHJlcSk7Cit9CisKK3N0YXRpYyBp cnFyZXR1cm5fdCBhc3Rfdmh1Yl9pcnEgKGludCBpcnEsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0 IGFzdF92aHViICp2aHViID0gZGF0YTsKKwlpcnFyZXR1cm5fdCBpcmV0ID0gSVJRX05PTkU7CisJ dTMyIGlzdGF0OworCisJLyogU3RhbGUgaW50ZXJydXB0IHdoaWxlIHRlYXJpbmcgZG93biAqLwor CWlmICghdmh1Yi0+ZXAwX2J1ZnMpCisJCXJldHVybiBJUlFfTk9ORTsKKworCXNwaW5fbG9jaygm dmh1Yi0+bG9jayk7CisKKwkvKiBSZWFkIGFuZCBBQ0sgaW50ZXJydXB0cyAqLworCWlzdGF0ID0g cmVhZGwodmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisJaWYgKCFpc3RhdCkKKwkJZ290byBi YWlsOworCXdyaXRlbChpc3RhdCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lTUik7CisJaXJldCA9 IElSUV9IQU5ETEVEOworCisJVURDVkRCRyh2aHViLCAiaXJxIHN0YXR1cz0lMDh4LCBlcF9hY2tz PSUwOHggZXBfbmFja3M9JTA4eFxuIiwKKwkgICAgICAgaXN0YXQsCisJICAgICAgIHJlYWRsKHZo dWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKSwKKwkgICAgICAgcmVhZGwodmh1Yi0+cmVn cyArIEFTVF9WSFVCX0VQX05BQ0tfSVNSKSk7CisKKwkvKiBIYW5kbGUgZ2VuZXJpYyBFUHMgZmly c3QgKi8KKwlpZiAoaXN0YXQgJiBWSFVCX0lSUV9FUF9QT09MX0FDS19TVEFMTCkgeworCQl1MzIg aSwgZXBfYWNrcyA9IHJlYWRsKHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKwkJ d3JpdGVsKGVwX2Fja3MsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKworCQkv KiBDaGVjayBpZiB3ZSBoYXZlIGEgdXNlZnVsIGZmcyBvbiBhcm0gLi4uICovCisJCWZvciAoaSA9 IDA7IGVwX2Fja3MgJiYgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKyspIHsKKwkJCXUzMiBt YXNrID0gMSA8PCBpOworCQkJaWYgKGVwX2Fja3MgJiBtYXNrKSB7CisJCQkJYXN0X3ZodWJfZXBu X2Fja19pcnEoJnZodWItPmVwbnNbaV0pOworCQkJCWVwX2Fja3MgJj0gfm1hc2s7CisJCQl9CisJ CX0KKwl9CisKKwkvKiBIYW5kbGUgZGV2aWNlIGludGVycnVwdHMgKi8KKwlpZiAoaXN0YXQgJiAo VkhVQl9JUlFfREVWSUNFMSB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNFMiB8CisJCSAgICAgVkhV Ql9JUlFfREVWSUNFMyB8CisJCSAgICAgVkhVQl9JUlFfREVWSUNFNCB8CisJCSAgICAgVkhVQl9J UlFfREVWSUNFNSkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFMSkKKwkJCWFzdF92 aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzBdLmRldik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJR X0RFVklDRTIpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1sxXS5kZXYpOworCQlp ZiAoaXN0YXQgJiBWSFVCX0lSUV9ERVZJQ0UzKQorCQkJYXN0X3ZodWJfZGV2X2lycSgmdmh1Yi0+ cG9ydHNbMl0uZGV2KTsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfREVWSUNFNCkKKwkJCWFzdF92 aHViX2Rldl9pcnEoJnZodWItPnBvcnRzWzNdLmRldik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJR X0RFVklDRTUpCisJCQlhc3Rfdmh1Yl9kZXZfaXJxKCZ2aHViLT5wb3J0c1s0XS5kZXYpOworCX0K KworCS8qIEhhbmRsZSB0b3AtbGV2ZWwgdkh1YiBFUDAgaW50ZXJydXB0cyAqLworCWlmIChpc3Rh dCAmIChWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwgfAorCQkgICAgIFZIVUJfSVJRX0hV Ql9FUDBfSU5fQUNLX1NUQUxMIHwKKwkJICAgICBWSFVCX0lSUV9IVUJfRVAwX1NFVFVQKSkgewor CQlpZiAoaXN0YXQgJiBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCkKKwkJCWFzdF92aHVi X2VwMF9oYW5kbGVfYWNrKCZ2aHViLT5lcDAsIHRydWUpOworCQlpZiAoaXN0YXQgJiBWSFVCX0lS UV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwpCisJCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2Fjaygmdmh1 Yi0+ZXAwLCBmYWxzZSk7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0hVQl9FUDBfU0VUVVApCisJ CQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX3NldHVwKCZ2aHViLT5lcDApOworCX0KKworCS8qIFZhcmlv dXMgdG9wIGxldmVsIGJ1cyBldmVudHMgKi8KKwlpZiAoaXN0YXQgJiAoVkhVQl9JUlFfQlVTX1JF U1VNRSB8CisJCSAgICAgVkhVQl9JUlFfQlVTX1NVU1BFTkQgfAorCQkgICAgIFZIVUJfSVJRX0JV U19SRVNFVCkpIHsKKwkJaWYgKGlzdGF0ICYgVkhVQl9JUlFfQlVTX1JFU1VNRSkKKwkJCWFzdF92 aHViX2h1Yl9yZXN1bWUodmh1Yik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJRX0JVU19TVVNQRU5E KQorCQkJYXN0X3ZodWJfaHViX3N1c3BlbmQodmh1Yik7CisJCWlmIChpc3RhdCAmIFZIVUJfSVJR X0JVU19SRVNFVCkKKwkJCWFzdF92aHViX2h1Yl9yZXNldCh2aHViKTsKKwl9CisKKyBiYWlsOgor CXNwaW5fdW5sb2NrKCZ2aHViLT5sb2NrKTsKKwlyZXR1cm4gaXJldDsKK30KKwordm9pZCBhc3Rf dmh1Yl9pbml0X2h3KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1MzIgY3RybDsKKworCVVE Q0RCRyh2aHViLCIoUmUpU3RhcnRpbmcgSFcgLi4uXG4iKTsKKworCS8qIEVuYWJsZSBQSFkgKi8K KwljdHJsID0gVkhVQl9DVFJMX1BIWV9DTEsgfAorCQlWSFVCX0NUUkxfUEhZX1JFU0VUX0RJUzsK KworI2lmIDAgLyoKKyAgICAgICAqIFRoaXMgY2F1c2VzIHJlZ2lzdGVycyB0byBiZWNvbWUgaW5h Y2Nlc3NpYmxlIGR1cmluZworICAgICAgICogc3VzcGVuZC4gTmVlZCB0byBmaWd1cmUgb3V0IGhv dyB0byBicmluZyB0aGUgY29udHJvbGxlcgorICAgICAgICogYmFjayBpbnRvIGxpZmUgdG8gaXNz dWUgYSB3YWtldXAuCisgICAgICAgKi8KKwljdHJsIHw9IFZIVUJfQ1RSTF9DTEtfU1RPUF9TVVNQ RU5EOworI2VuZGlmCisKKwkvKgorCSAqIFNldCBzb21lIElTTyAmIHNwbGl0IGNvbnRyb2wgYml0 cyBhY2NvcmRpbmcgdG8gQXNwZWVkCisJICogcmVjb21tZW5kYXRpb24KKwkgKgorCSAqIFZIVUJf Q1RSTF9JU09fUlNQX0NUUkw6IFdoZW4gc2V0IHRlbGxzIHRoZSBIVyB0byByZXNwb25kCisJICog d2l0aCAwIGJ5dGVzIGRhdGEgcGFja2V0IHRvIElTTyBJTiBlbmRwb2ludHMgd2hlbiBubyBkYXRh CisJICogaXMgYXZhaWxhYmxlLgorCSAqCisJICogVkhVQl9DVFJMX1NQTElUX0lOOiBUaGlzIG1h a2VzIGEgU09GIGNvbXBsZXRlIGEgc3BsaXQgSU4KKwkgKiB0cmFuc2FjdGlvbi4KKwkgKi8KKwlj dHJsIHw9IFZIVUJfQ1RSTF9JU09fUlNQX0NUUkwgfCBWSFVCX0NUUkxfU1BMSVRfSU47CisJd3Jp dGVsKGN0cmwsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKKwl1ZGVsYXkoMSk7CisKKwkv KiBTZXQgZGVzY3JpcHRvciByaW5nIHNpemUgKi8KKyNpZiBBU1RfVkhVQl9ERVNDU19DT1VOVCA9 PSAyNTYKKwljdHJsIHw9IFZIVUJfQ1RSTF9MT05HX0RFU0M7CisJd3JpdGVsKGN0cmwsIHZodWIt PnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKKyNlbGlmIEFTVF9WSFVCX0RFU0NTX0NPVU5UICE9IDMy CisJI2Vycm9yIEludmFsaWQgQVNUX1ZIVUJfREVTQ1NfQ09VTlQKKyNlbmRpZgorCisJLyogUmVz ZXQgYWxsIGRldmljZXMgKi8KKwl3cml0ZWwoMHgzM2YsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9T V19SRVNUKTsKKwl1ZGVsYXkoMSk7CisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9T V19SRVNUKTsKKworCS8qIERpc2FibGUgYW5kIGNsZWFudXAgRVAgQUNLL05BQ0sgaW50ZXJydXB0 cyAqLworCXdyaXRlbCgwLCB2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJd3Jp dGVsKDAsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9OQUNLX0lFUik7CisJd3JpdGVsKDB4ZmZm ZmZmZmYsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSVNSKTsKKwl3cml0ZWwoMHhmZmZm ZmZmZiwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX05BQ0tfSVNSKTsKKworCS8qIERlZmF1bHQg c2V0dGluZ3MgZm9yIEVQMCwgZW5hYmxlIEhXIGh1YiBFUDEgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+ cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMKTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9U T0dHTEUgfAorCSAgICAgICBWSFVCX0VQMV9DVFJMX0VOQUJMRSwKKwkgICAgICAgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0VQMV9DVFJMKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVC X0VQMV9TVFNfQ0hHKTsKKworCS8qIENvbmZpZ3VyZSBFUDAgRE1BIGJ1ZmZlciAqLworCXdyaXRl bCh2aHViLT5lcDAuYnVmX2RtYSwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9EQVRBKTsKKwor CS8qIENsZWFyIGFkZHJlc3MgKi8KKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NP TkYpOworCisJLyogUHVsbHVwIGh1YiAoYWN0aXZhdGUgb24gaG9zdCkgKi8KKwlpZiAodmh1Yi0+ Zm9yY2VfdXNiMSkKKwkJY3RybCB8PSBWSFVCX0NUUkxfRlVMTF9TUEVFRF9PTkxZOworCisJY3Ry bCB8PSBWSFVCX0NUUkxfVVBTVFJFQU1fQ09OTkVDVDsKKwl3cml0ZWwoY3RybCwgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0NUUkwpOworCisJLyogRW5hYmxlIHNvbWUgaW50ZXJydXB0cyAqLworCXdy aXRlbChWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFMTCB8CisJICAgICAgIFZIVUJfSVJRX0hV Ql9FUDBfT1VUX0FDS19TVEFMTCB8CisJICAgICAgIFZIVUJfSVJRX0hVQl9FUDBfU0VUVVAgfAor CSAgICAgICBWSFVCX0lSUV9FUF9QT09MX0FDS19TVEFMTCB8CisJICAgICAgIFZIVUJfSVJRX0JV U19SRVNVTUUgfAorCSAgICAgICBWSFVCX0lSUV9CVVNfU1VTUEVORCB8CisJICAgICAgIFZIVUJf SVJRX0JVU19SRVNFVCwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7Cit9CisK K3N0YXRpYyBpbnQgYXN0X3ZodWJfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYp Cit7CisJc3RydWN0IGFzdF92aHViICp2aHViID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7 CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgaTsKKworCWlmICghdmh1YiB8fCAhdmh1Yi0+ cmVncykKKwkJcmV0dXJuIDA7CisKKwkvKiBSZW1vdmUgZGV2aWNlcyAqLworCWZvciAoaSA9IDA7 IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykKKwkJYXN0X3ZodWJfZGVsX2Rldigmdmh1Yi0+ cG9ydHNbaV0uZGV2KTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7 CisKKwkvKiBNYXNrICYgYWNrIGFsbCBpbnRlcnJ1cHRzICAqLworCXdyaXRlbCgwLCB2aHViLT5y ZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwl3cml0ZWwoVkhVQl9JUlFfQUNLX0FMTCwgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0lTUik7CisKKwkvKiBQdWxsIGRldmljZSwgbGVhdmUgUEhZIGVuYWJsZWQg Ki8KKwl3cml0ZWwoVkhVQl9DVFJMX1BIWV9DTEsgfAorCSAgICAgICBWSFVCX0NUUkxfUEhZX1JF U0VUX0RJUywKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0NUUkwpOworCisJaWYgKHZo dWItPmNsaykKKwkJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKHZodWItPmNsayk7CisKKwlzcGluX3Vu bG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlpZiAodmh1Yi0+ZXAwX2J1 ZnMpCisJCWRtYV9mcmVlX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJICBBU1RfVkhVQl9FUDBf TUFYX1BBQ0tFVCAqCisJCQkJICAoQVNUX1ZIVUJfTlVNX1BPUlRTICsgMSksCisJCQkJICB2aHVi LT5lcDBfYnVmcywKKwkJCQkgIHZodWItPmVwMF9idWZzX2RtYSk7CisJdmh1Yi0+ZXAwX2J1ZnMg PSBOVUxMOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfcHJvYmUoc3Ry dWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWI7CisJ c3RydWN0IHJlc291cmNlICpyZXM7CisJaW50IGksIHJjID0gMDsKKworCXZodWIgPSBkZXZtX2t6 YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCp2aHViKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCF2aHVi KQorCQlyZXR1cm4gLUVOT01FTTsKKworCXNwaW5fbG9ja19pbml0KCZ2aHViLT5sb2NrKTsKKwl2 aHViLT5wZGV2ID0gcGRldjsKKwl2aHViLT5mb3JjZV91c2IxID0gZm9yY2VfdXNiMTsKKwl2aHVi LT5ub19kbWFfZGVzYyA9IG5vX2RtYV9kZXNjOworCisJcmVzID0gcGxhdGZvcm1fZ2V0X3Jlc291 cmNlKHBkZXYsIElPUkVTT1VSQ0VfTUVNLCAwKTsKKwl2aHViLT5yZWdzID0gZGV2bV9pb3JlbWFw X3Jlc291cmNlKCZwZGV2LT5kZXYsIHJlcyk7CisJaWYgKElTX0VSUih2aHViLT5yZWdzKSkgewor CQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gbWFwIHJlc291cmNlc1xuIik7CisJCXJl dHVybiBQVFJfRVJSKHZodWItPnJlZ3MpOworCX0KKwlVRENEQkcodmh1YiwgInZIdWJAJXBSIG1h cHBlZCBAJXBcbiIsIHJlcywgdmh1Yi0+cmVncyk7CisKKwlwbGF0Zm9ybV9zZXRfZHJ2ZGF0YShw ZGV2LCB2aHViKTsKKworCXZodWItPmNsayA9IGRldm1fY2xrX2dldCgmcGRldi0+ZGV2LCBOVUxM KTsKKyAgICAgICAgaWYgKElTX0VSUih2aHViLT5jbGspKSB7CisgICAgICAgICAgICAgICAgcmMg PSBQVFJfRVJSKHZodWItPmNsayk7CisgICAgICAgICAgICAgICAgZ290byBlcnI7CisgICAgICAg IH0KKwlyYyA9IGNsa19wcmVwYXJlX2VuYWJsZSh2aHViLT5jbGspOworCWlmIChyYykgeworCQlk ZXZfZXJyKCZwZGV2LT5kZXYsICJFcnJvciBjb3VsZG4ndCBlbmFibGUgY2xvY2sgKCVkKVxuIiwg cmMpOworCQlnb3RvIGVycjsKKyAgICAgICAgfQorCisJLyogTWFzayAmIGFjayBhbGwgaW50ZXJy dXB0cyBiZWZvcmUgaW5zdGFsbGluZyB0aGUgaGFuZGxlciAqLworCXdyaXRlbCgwLCB2aHViLT5y ZWdzICsgQVNUX1ZIVUJfSUVSKTsKKwl3cml0ZWwoVkhVQl9JUlFfQUNLX0FMTCwgdmh1Yi0+cmVn cyArIEFTVF9WSFVCX0lTUik7CisKKwkvKiBGaW5kIGludGVycnVwdCBhbmQgaW5zdGFsbCBoYW5k bGVyICovCisJdmh1Yi0+aXJxID0gcGxhdGZvcm1fZ2V0X2lycShwZGV2LCAwKTsKKwlpZiAodmh1 Yi0+aXJxIDwgMCkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJGYWlsZWQgdG8gZ2V0IGludGVy cnVwdFxuIik7CisJCXJjID0gdmh1Yi0+aXJxOworCQlnb3RvIGVycjsKKwl9CisJcmMgPSBkZXZt X3JlcXVlc3RfaXJxKCZwZGV2LT5kZXYsIHZodWItPmlycSwgYXN0X3ZodWJfaXJxLCAwLAorCQkJ ICAgICAgS0JVSUxEX01PRE5BTUUsIHZodWIpOworCWlmIChyYykgeworCQlkZXZfZXJyKCZwZGV2 LT5kZXYsICJGYWlsZWQgdG8gcmVxdWVzdCBpbnRlcnJ1cHRcbiIpOworCQlnb3RvIGVycjsKKwl9 CisKKwkvKgorCSAqIEFsbG9jYXRlIERNQSBidWZmZXJzIGZvciBhbGwgRVAwcyBpbiBvbmUgY2h1 bmssCisJICogb25lIHBlciBwb3J0IGFuZCBvbmUgZm9yIHRoZSB2SHViIGl0c2VsZgorCSAqLwor CXZodWItPmVwMF9idWZzID0gZG1hX2FsbG9jX2NvaGVyZW50KCZwZGV2LT5kZXYsCisJCQkJCSAg ICBBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqCisJCQkJCSAgICAoQVNUX1ZIVUJfTlVNX1BPUlRT ICsgMSksCisJCQkJCSAgICAmdmh1Yi0+ZXAwX2J1ZnNfZG1hLCBHRlBfS0VSTkVMKTsKKwlpZiAo IXZodWItPmVwMF9idWZzKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgIkZhaWxlZCB0byBhbGxv Y2F0ZSBFUDAgRE1BIGJ1ZmZlcnNcbiIpOworCQlyYyA9IC1FTk9NRU07CisJCWdvdG8gZXJyOwor CX0KKwlVRENWREJHKHZodWIsICJFUDAgRE1BIGJ1ZmZlcnMgQCVwIChETUEgMHglMDh4KVxuIiwK KwkJdmh1Yi0+ZXAwX2J1ZnMsICh1MzIpdmh1Yi0+ZXAwX2J1ZnNfZG1hKTsKKworCS8qIEluaXQg dkh1YiBFUDAgKi8KKwlhc3Rfdmh1Yl9pbml0X2VwMCh2aHViLCAmdmh1Yi0+ZXAwLCBOVUxMKTsK KworCS8qIEluaXQgZGV2aWNlcyAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9S VFMgJiYgcmMgPT0gMDsgaSsrKQorCQlyYyA9IGFzdF92aHViX2luaXRfZGV2KHZodWIsIGkpOwor CWlmIChyYykKKwkJZ290byBlcnI7CisKKwkvKiBJbml0IGh1YiBlbXVsYXRpb24gKi8KKwlhc3Rf dmh1Yl9pbml0X2h1Yih2aHViKTsKKworCS8qIEluaXRpYWxpemUgSFcgKi8KKwlhc3Rfdmh1Yl9p bml0X2h3KHZodWIpOworCisJcmV0dXJuIDA7CisgZXJyOgorCWFzdF92aHViX3JlbW92ZShwZGV2 KTsKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIGFz dF92aHViX2R0X2lkc1tdID0geworCXsKKwkJLmNvbXBhdGlibGUgPSAiYXNwZWVkLGFzdDI0MDAt dXNiLXZodWIiLAorCQkuY29tcGF0aWJsZSA9ICJhc3BlZWQsYXN0MjUwMC11c2Itdmh1YiIsCisJ fSwKKwl7IH0KK307CitNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBhc3Rfdmh1Yl9kdF9pZHMpOwor CitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBhc3Rfdmh1Yl9kcml2ZXIgPSB7CisJLnBy b2JlCQk9IGFzdF92aHViX3Byb2JlLAorCS5yZW1vdmUJCT0gYXN0X3ZodWJfcmVtb3ZlLAorCS5k cml2ZXIJCT0geworCQkubmFtZQk9IEtCVUlMRF9NT0ROQU1FLAorCQkub2ZfbWF0Y2hfdGFibGUJ PSBhc3Rfdmh1Yl9kdF9pZHMsCisJfSwKK307Cittb2R1bGVfcGxhdGZvcm1fZHJpdmVyKGFzdF92 aHViX2RyaXZlcik7CisKK01PRFVMRV9ERVNDUklQVElPTigiQXNwZWVkIHZIdWIgdWRjIGRyaXZl ciIpOworTU9EVUxFX0FVVEhPUigiQmVuamFtaW4gSGVycmVuc2NobWlkdCA8YmVuaEBrZXJuZWwu Y3Jhc2hpbmcub3JnPiIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEvZHJp dmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9kZXYuYyBiL2RyaXZlcnMvdXNiL2dhZGdl dC91ZGMvYXNwZWVkLXZodWIvZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAw MDAwMDAwLi43N2EzNjRiMDFlNzYKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL3VzYi9nYWRn ZXQvdWRjL2FzcGVlZC12aHViL2Rldi5jCkBAIC0wLDAgKzEsNTgxIEBACisvKgorICogYXNwZWVk LXZodWIgLS0gRHJpdmVyIGZvciBBc3BlZWQgU29DICJ2SHViIiBVU0IgZ2FkZ2V0CisgKgorICog ZGV2LmMgLSBJbmRpdmlkdWFsIGRldmljZS9nYWRnZXQgbWFuYWdlbWVudCAoaWUsIGEgcG9ydCA9 IGEgZ2FkZ2V0KQorICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAq IFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBh bmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9w dGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5o PgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2Rl dmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0 Lmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Cisj aW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2lu Y2x1ZGUgPGxpbnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2lu Y2x1ZGUgPGxpbnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNs dWRlIDxsaW51eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxs aW51eC9yZWdtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorI2luY2x1ZGUg PGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKworI2luY2x1ZGUgInZo dWIuaCIKKwordm9pZCBhc3Rfdmh1Yl9kZXZfaXJxKHN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQpCit7 CisJdTMyIGlzdGF0ID0gcmVhZGwoZC0+cmVncyArIEFTVF9WSFVCX0RFVl9JU1IpOworCisJd3Jp dGVsKGlzdGF0LCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0lTUik7CisKKwlpZiAoaXN0YXQgJiBW SFVWX0RFVl9JUlFfRVAwX0lOX0FDS19TVEFMTCkKKwkJYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2so JmQtPmVwMCwgdHJ1ZSk7CisJaWYgKGlzdGF0ICYgVkhVVl9ERVZfSVJRX0VQMF9PVVRfQUNLX1NU QUxMKQorCQlhc3Rfdmh1Yl9lcDBfaGFuZGxlX2FjaygmZC0+ZXAwLCBmYWxzZSk7CisJaWYgKGlz dGF0ICYgVkhVVl9ERVZfSVJRX0VQMF9TRVRVUCkKKwkJYXN0X3ZodWJfZXAwX2hhbmRsZV9zZXR1 cCgmZC0+ZXAwKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZGV2X2VuYWJsZShzdHJ1Y3Qg YXN0X3ZodWJfZGV2ICpkKQoreworCXUzMiByZWcsIGhtc2s7CisKKwlpZiAoZC0+ZW5hYmxlZCkK KwkJcmV0dXJuOworCisJLyogRW5hYmxlIGRldmljZSBhbmQgaXRzIEVQMCBpbnRlcnJ1cHRzICov CisJcmVnID0gVkhVQl9ERVZfRU5fRU5BQkxFX1BPUlQgfAorCQlWSFVCX0RFVl9FTl9FUDBfSU5f QUNLX0lSUUVOIHwKKwkJVkhVQl9ERVZfRU5fRVAwX09VVF9BQ0tfSVJRRU4gfAorCQlWSFVCX0RF Vl9FTl9FUDBfU0VUVVBfSVJRRU47CisJaWYgKGQtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURf SElHSCkKKwkJcmVnIHw9IFZIVUJfREVWX0VOX1NQRUVEX1NFTF9ISUdIOworCXdyaXRlbChyZWcs IGQtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRU5fQ1RSTCk7CisKKwkvKiBFbmFibGUgZGV2aWNlIGlu dGVycnVwdCBpbiB0aGUgaHViIGFzIHdlbGwgKi8KKwlobXNrID0gVkhVQl9JUlFfREVWSUNFMSA8 PCBkLT5pbmRleDsKKwlyZWcgPSByZWFkbChkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVSKTsK KwlyZWcgfD0gaG1zazsKKwl3cml0ZWwocmVnLCBkLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfSUVS KTsKKworCS8qIFNldCBFUDAgRE1BIGJ1ZmZlciBhZGRyZXNzICovCisJd3JpdGVsKGQtPmVwMC5i dWZfZG1hLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VQMF9EQVRBKTsKKworCWQtPmVuYWJsZWQg PSB0cnVlOworfQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfZGlzYWJsZShzdHJ1Y3QgYXN0 X3ZodWJfZGV2ICpkKQoreworCXUzMiByZWcsIGhtc2s7CisKKwlpZiAoIWQtPmVuYWJsZWQpCisJ CXJldHVybjsKKworCS8qIERpc2FibGUgZGV2aWNlIGludGVycnVwdCBpbiB0aGUgaHViICovCisJ aG1zayA9IFZIVUJfSVJRX0RFVklDRTEgPDwgZC0+aW5kZXg7CisJcmVnID0gcmVhZGwoZC0+dmh1 Yi0+cmVncyArIEFTVF9WSFVCX0lFUik7CisJcmVnICY9IH5obXNrOworCXdyaXRlbChyZWcsIGQt PnZodWItPnJlZ3MgKyBBU1RfVkhVQl9JRVIpOworCisJLyogVGhlbiBkaXNhYmxlIGRldmljZSAq LworCXdyaXRlbCgwLCBkLT5yZWdzICsgQVNUX1ZIVUJfREVWX0VOX0NUUkwpOworCWQtPmdhZGdl dC5zcGVlZCA9IFVTQl9TUEVFRF9VTktOT1dOOworCWQtPmVuYWJsZWQgPSBmYWxzZTsKKwlkLT5z dXNwZW5kZWQgPSBmYWxzZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9kZXZfZmVhdHVyZShz dHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJCXUxNiB3SW5kZXgsIHUxNiB3VmFsdWUsCisJCQkJ Ym9vbCBpc19zZXQpCit7CisJRERCRyhkLCAiJXNfRkVBVFVSRShkZXYgdmFsPSUwMngpXG4iLAor CSAgICAgaXNfc2V0ID8gIlNFVCIgOiAiQ0xFQVIiLCB3VmFsdWUpOworCisJaWYgKHdWYWx1ZSAh PSBVU0JfREVWSUNFX1JFTU9URV9XQUtFVVApCisJCXJldHVybiBzdGRfcmVxX2RyaXZlcjsKKwor CWQtPndha2V1cF9lbiA9IGlzX3NldDsKKworCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworfQor CitzdGF0aWMgaW50IGFzdF92aHViX2VwX2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2RldiAqZCwK KwkJCSAgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLCBib29sIGlzX3NldCkKK3sKKwlzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwOworCWludCBlcF9udW07CisKKwllcF9udW0gPSB3SW5kZXggJiBV U0JfRU5EUE9JTlRfTlVNQkVSX01BU0s7CisJRERCRyhkLCAiJXNfRkVBVFVSRShlcCVkIHZhbD0l MDJ4KVxuIiwKKwkgICAgIGlzX3NldCA/ICJTRVQiIDogIkNMRUFSIiwgZXBfbnVtLCB3VmFsdWUp OworCWlmIChlcF9udW0gPT0gMCkKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJaWYgKGVw X251bSA+PSBBU1RfVkhVQl9OVU1fR0VOX0VQcyB8fCAhZC0+ZXBuc1tlcF9udW0gLSAxXSkKKwkJ cmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJaWYgKHdWYWx1ZSAhPSBVU0JfRU5EUE9JTlRfSEFMVCkK KwkJcmV0dXJuIHN0ZF9yZXFfZHJpdmVyOworCisJZXAgPSBkLT5lcG5zW2VwX251bSAtIDFdOwor CWlmIChXQVJOX09OKCFlcCkpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCisJaWYgKCFlcC0+ ZXBuLmVuYWJsZWQgfHwgIWVwLT5lcC5kZXNjIHx8IGVwLT5lcG4uaXNfaXNvIHx8CisJICAgIGVw LT5lcG4uaXNfaW4gIT0gISEod0luZGV4ICYgVVNCX0RJUl9JTikpCisJCXJldHVybiBzdGRfcmVx X3N0YWxsOworCisJRERCRyhkLCAiJXMgc3RhbGwgb24gRVAgJWRcbiIsCisJICAgICBpc19zZXQg PyAic2V0dGluZyIgOiAiY2xlYXJpbmciLCBlcF9udW0pOworCWVwLT5lcG4uc3RhbGxlZCA9IGlz X3NldDsKKwlhc3Rfdmh1Yl91cGRhdGVfZXBuX3N0YWxsKGVwKTsKKworCXJldHVybiBzdGRfcmVx X2NvbXBsZXRlOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Rldl9zdGF0dXMoc3RydWN0IGFz dF92aHViX2RldiAqZCwKKwkJCSAgICAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlKQoreworCXU4 IHN0MDsKKworCUREQkcoZCwgIkdFVF9TVEFUVVMoZGV2KVxuIik7CisKKwlzdDAgPSBkLT5nYWRn ZXQuaXNfc2VsZnBvd2VyZWQgPDwgVVNCX0RFVklDRV9TRUxGX1BPV0VSRUQ7CisJaWYgKGQtPndh a2V1cF9lbikKKwkJc3QwIHw9IDEgPDwgVVNCX0RFVklDRV9SRU1PVEVfV0FLRVVQOworCisJcmV0 dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseSgmZC0+ZXAwLCBzdDAsIDApOworfQorCitzdGF0aWMg aW50IGFzdF92aHViX2VwX3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkLAorCQkJICAgICAg dTE2IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sKKwlpbnQgZXBfbnVtID0gd0luZGV4ICYgVVNCX0VO RFBPSU5UX05VTUJFUl9NQVNLOworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXA7CisJdTggc3QwID0g MDsKKworCUREQkcoZCwgIkdFVF9TVEFUVVMoZXAlZClcbiIsIGVwX251bSk7CisKKwlpZiAoZXBf bnVtID49IEFTVF9WSFVCX05VTV9HRU5fRVBzKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwlp ZiAoZXBfbnVtICE9IDApIHsKKwkJZXAgPSBkLT5lcG5zW2VwX251bSAtIDFdOworCQlpZiAoIWVw KQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCWlmICghZXAtPmVwbi5lbmFibGVkIHx8ICFl cC0+ZXAuZGVzYyB8fCBlcC0+ZXBuLmlzX2lzbyB8fAorCQkgICAgZXAtPmVwbi5pc19pbiAhPSAh ISh3SW5kZXggJiBVU0JfRElSX0lOKSkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCQlpZiAo ZXAtPmVwbi5zdGFsbGVkKQorCQkJc3QwIHw9IDEgPDwgVVNCX0VORFBPSU5UX0hBTFQ7CisJfQor CisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseSgmZC0+ZXAwLCBzdDAsIDApOworfQorCitz dGF0aWMgdm9pZCBhc3Rfdmh1Yl9kZXZfc2V0X2FkZHJlc3Moc3RydWN0IGFzdF92aHViX2RldiAq ZCwgdTggYWRkcikKK3sKKwl1MzIgcmVnOworCisJRERCRyhkLCAiU0VUX0FERFJFU1M6IEdvdCBh ZGRyZXNzICV4XG4iLCBhZGRyKTsKKworCXJlZyA9IHJlYWRsKGQtPnJlZ3MgKyBBU1RfVkhVQl9E RVZfRU5fQ1RSTCk7CisJcmVnICY9IH5WSFVCX0RFVl9FTl9BRERSX01BU0s7CisJcmVnIHw9IFZI VUJfREVWX0VOX1NFVF9BRERSKGFkZHIpOworCXdyaXRlbChyZWcsIGQtPnJlZ3MgKyBBU1RfVkhV Ql9ERVZfRU5fQ1RSTCk7Cit9CisKK2ludCBhc3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3Qoc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKQor eworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSBlcC0+ZGV2OworCXUxNiB3VmFsdWUsIHdJbmRl eCwgd0xlbmd0aDsKKworCS8qIE5vIGRyaXZlciwgd2Ugc2hvdWxkbid0IGJlIGVuYWJsZWQgLi4u ICovCisJaWYgKCFkLT5kcml2ZXIgfHwgIWQtPmVuYWJsZWQgfHwgZC0+c3VzcGVuZGVkKSB7CisJ CUVQREJHKGVwLAorCQkgICAgICAiRGV2aWNlIGlzIHdyb25nIHN0YXRlIGRyaXZlcj0lcCBlbmFi bGVkPSVkIgorCQkgICAgICAiIHN1c3BlbmRlZD0lZFxuIiwKKwkJICAgICAgZC0+ZHJpdmVyLCBk LT5lbmFibGVkLCBkLT5zdXNwZW5kZWQpOworCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwl9CisK KwkvKiBGaXJzdCBwYWNrZXQsIGdyYWIgc3BlZWQgKi8KKwlpZiAoZC0+Z2FkZ2V0LnNwZWVkID09 IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCWQtPmdhZGdldC5zcGVlZCA9IGVwLT52aHViLT5zcGVl ZDsKKwkJaWYgKGQtPmdhZGdldC5zcGVlZCA+IGQtPmRyaXZlci0+bWF4X3NwZWVkKQorCQkJZC0+ Z2FkZ2V0LnNwZWVkID0gZC0+ZHJpdmVyLT5tYXhfc3BlZWQ7CisJCUREQkcoZCwgImZpc3QgcGFj a2V0LCBjYXB0dXJlZCBzcGVlZCAlZFxuIiwKKwkJICAgICBkLT5nYWRnZXQuc3BlZWQpOworCX0K KworCXdWYWx1ZSA9IGxlMTZfdG9fY3B1KGNycS0+d1ZhbHVlKTsKKwl3SW5kZXggPSBsZTE2X3Rv X2NwdShjcnEtPndJbmRleCk7CisJd0xlbmd0aCA9IGxlMTZfdG9fY3B1KGNycS0+d0xlbmd0aCk7 CisKKwlzd2l0Y2ggKChjcnEtPmJSZXF1ZXN0VHlwZSA8PCA4KSB8IGNycS0+YlJlcXVlc3QpIHsK KwkJLyogU0VUX0FERFJFU1MgKi8KKwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NF VF9BRERSRVNTOgorCQlhc3Rfdmh1Yl9kZXZfc2V0X2FkZHJlc3MoZCwgd1ZhbHVlKTsKKwkJcmV0 dXJuIHN0ZF9yZXFfY29tcGxldGU7CisKKwkJLyogR0VUX1NUQVRVUyAqLworCWNhc2UgRGV2aWNl UmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX2Rldl9zdGF0 dXMoZCwgd0luZGV4LCB3VmFsdWUpOworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8IFVTQl9SRVFf R0VUX1NUQVRVUzoKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCk7CisJ Y2FzZSBFbmRwb2ludFJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rf dmh1Yl9lcF9zdGF0dXMoZCwgd0luZGV4LCB3VmFsdWUpOworCisJCS8qIFNFVC9DTEVBUl9GRUFU VVJFICovCisJY2FzZSBEZXZpY2VPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJ cmV0dXJuIGFzdF92aHViX2Rldl9mZWF0dXJlKGQsIHdJbmRleCwgd1ZhbHVlLCB0cnVlKTsKKwlj YXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCXJldHVybiBh c3Rfdmh1Yl9kZXZfZmVhdHVyZShkLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCWNhc2UgRW5k cG9pbnRPdXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHVi X2VwX2ZlYXR1cmUoZCwgd0luZGV4LCB3VmFsdWUsIHRydWUpOworCWNhc2UgRW5kcG9pbnRPdXRS ZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfZXBfZmVh dHVyZShkLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCX0KKwlyZXR1cm4gc3RkX3JlcV9kcml2 ZXI7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX3dha2V1cChzdHJ1Y3QgdXNiX2dhZGdl dCogZ2FkZ2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdl dCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFMOworCisJc3Bpbl9s b2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwlpZiAoIWQtPndha2V1cF9lbikK KwkJZ290byBlcnI7CisKKwlEREJHKGQsICJEZXZpY2UgaW5pdGlhdGVkIHdha2V1cFxuIik7CisK KwkvKiBXYWtldXAgdGhlIGhvc3QgKi8KKwlhc3Rfdmh1Yl9odWJfd2FrZV9hbGwoZC0+dmh1Yik7 CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisJcmMg PSAwOworIGVycjoKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfdWRjX2dl dF9mcmFtZShzdHJ1Y3QgdXNiX2dhZGdldCogZ2FkZ2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9k ZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisKKwlyZXR1cm4gKHJlYWRsKGQtPnZodWItPnJl Z3MgKyBBU1RfVkhVQl9VU0JTVFMpID4+IDE2KSAmIDB4N2ZmOworfQorCitzdGF0aWMgdm9pZCBh c3Rfdmh1Yl9kZXZfbnVrZShzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCXVuc2lnbmVkIGlu dCBpOworCisJZm9yIChpID0gMDsgaSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKyspIHsKKwkJ aWYgKCFkLT5lcG5zW2ldKQorCQkJY29udGludWU7CisJCWFzdF92aHViX251a2UoZC0+ZXBuc1tp XSwgLUVTSFVURE9XTik7CisJfQorfQorCitzdGF0aWMgaW50IGFzdF92aHViX3VkY19wdWxsdXAo c3RydWN0IHVzYl9nYWRnZXQqIGdhZGdldCwgaW50IG9uKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9k ZXYgKmQgPSB0b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNw aW5fbG9ja19pcnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlEREJHKGQsICJwdWxs dXAoJWQpXG4iLCBvbik7CisKKwkvKiBNYXJrIGRpc2Nvbm5lY3RlZCBpbiB0aGUgaHViICovCisJ YXN0X3ZodWJfZGV2aWNlX2Nvbm5lY3QoZC0+dmh1YiwgZC0+aW5kZXgsIG9uKTsKKworCS8qCisJ ICogSWYgZW5hYmxlZCwgbnVrZSBhbGwgcmVxdWVzdHMgaWYgYW55ICh0aGVyZSBzaG91bGRuJ3Qg YmUpCisJICogYW5kIGRpc2FibGUgdGhlIHBvcnQuIFRoaXMgd2lsbCBjbGVhciB0aGUgYWRkcmVz cyB0b28uCisJICovCisJaWYgKGQtPmVuYWJsZWQpIHsKKwkJYXN0X3ZodWJfZGV2X251a2UoZCk7 CisJCWFzdF92aHViX2Rldl9kaXNhYmxlKGQpOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3Rv cmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IGFzdF92aHViX3VkY19zdGFydChzdHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0LAorCQkJICAgICAg c3RydWN0IHVzYl9nYWRnZXRfZHJpdmVyICpkcml2ZXIpCit7CisJc3RydWN0IGFzdF92aHViX2Rl diAqZCA9IHRvX2FzdF9kZXYoZ2FkZ2V0KTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bp bl9sb2NrX2lycXNhdmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCUREQkcoZCwgInN0YXJ0 XG4iKTsKKworCS8qIFdlIGRvbid0IGRvIG11Y2ggbW9yZSB1bnRpbCB0aGUgaHViIGVuYWJsZXMg dXMgKi8KKwlkLT5kcml2ZXIgPSBkcml2ZXI7CisJZC0+Z2FkZ2V0LmlzX3NlbGZwb3dlcmVkID0g MTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKwor CXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9lcCAqYXN0X3ZodWJfdWRjX21hdGNo X2VwKHN0cnVjdCB1c2JfZ2FkZ2V0ICpnYWRnZXQsCisJCQkJCSAgICBzdHJ1Y3QgdXNiX2VuZHBv aW50X2Rlc2NyaXB0b3IgKmRlc2MsCisJCQkJCSAgICBzdHJ1Y3QgdXNiX3NzX2VwX2NvbXBfZGVz Y3JpcHRvciAqc3MpCit7CisJc3RydWN0IGFzdF92aHViX2RldiAqZCA9IHRvX2FzdF9kZXYoZ2Fk Z2V0KTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwOworCXN0cnVjdCB1c2JfZXAgKnVfZXA7CisJ dW5zaWduZWQgaW50IG1heCwgYWRkciwgaTsKKworCUREQkcoZCwgIk1hdGNoIEVQIHR5cGUgJWRc biIsIHVzYl9lbmRwb2ludF90eXBlKGRlc2MpKTsKKworCS8qCisJICogRmlyc3Qgd2UgbmVlZCB0 byBsb29rIGZvciBhbiBleGlzdGluZyB1bmNsYWltZWQgRVAgYXMgYW5vdGhlcgorCSAqIGNvbmZp Z3VyYXRpb24gbWF5IGhhdmUgYWxyZWFkeSBhc3NvY2lhdGVkIGEgYnVuY2ggb2YgRVBzIHdpdGgK KwkgKiB0aGlzIGdhZGdldC4gVGhpcyBkdXBsaWNhdGVzIHRoZSBjb2RlIGluIHVzYl9lcF9hdXRv Y29uZmlnX3NzKCkKKwkgKiB1bmZvcnR1bmF0ZWx5LgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50 cnkodV9lcCwgJmdhZGdldC0+ZXBfbGlzdCwgZXBfbGlzdCkgeworCQlpZiAodXNiX2dhZGdldF9l cF9tYXRjaF9kZXNjKGdhZGdldCwgdV9lcCwgZGVzYywgc3MpKSB7CisJCQlEREJHKGQsICIgLT4g dXNpbmcgZXhpc3RpbmcgRVAlZFxuIiwKKwkJCSAgICAgdG9fYXN0X2VwKHVfZXApLT5kX2lkeCk7 CisJCQlyZXR1cm4gdV9lcDsKKwkJfQorCX0KKworCS8qCisJICogV2UgZGlkbid0IGZpbmQgb25l LCB3ZSBuZWVkIHRvIGdyYWIgb25lIGZyb20gdGhlIHBvb2wuCisJICoKKwkgKiBGaXJzdCBsZXQn cyBkbyBzb21lIHNhbml0eSBjaGVja2luZworCSAqLworCXN3aXRjaCh1c2JfZW5kcG9pbnRfdHlw ZShkZXNjKSkgeworCWNhc2UgVVNCX0VORFBPSU5UX1hGRVJfQ09OVFJPTDoKKwkJLyogT25seSBF UDAgY2FuIGJlIGEgY29udHJvbCBlbmRwb2ludCAqLworCQlyZXR1cm4gTlVMTDsKKwljYXNlIFVT Ql9FTkRQT0lOVF9YRkVSX0lTT0M6CisJCS8qIElTTzogIGxpbWl0IDEwMjMgYnl0ZXMgZnVsbCBz cGVlZCwgMTAyNCBoaWdoL3N1cGVyIHNwZWVkICovCisJCWlmIChnYWRnZXRfaXNfZHVhbHNwZWVk KGdhZGdldCkpCisJCQltYXggPSAxMDI0OworCQllbHNlCisJCQltYXggPSAxMDIzOworCQlicmVh azsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0JVTEs6CisJCWlmIChnYWRnZXRfaXNfZHVhbHNw ZWVkKGdhZGdldCkpCisJCQltYXggPSA1MTI7CisJCWVsc2UKKwkJCW1heCA9IDY0OworCQlicmVh azsKKwljYXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJaWYgKGdhZGdldF9pc19kdWFsc3Bl ZWQoZ2FkZ2V0KSkKKwkJCW1heCA9IDEwMjQ7CisJCWVsc2UKKwkJCW1heCA9IDY0OworCQlicmVh azsKKwl9CisJaWYgKHVzYl9lbmRwb2ludF9tYXhwKGRlc2MpID4gbWF4KQorCQlyZXR1cm4gTlVM TDsKKworCS8qCisJICogRmluZCBhIGZyZWUgRVAgYWRkcmVzcyBmb3IgdGhhdCBkZXZpY2UuIFdl IGNhbid0CisJICogbGV0IHRoZSBnZW5lcmljIGNvZGUgYXNzaWduIHRoZXNlIGFzIGl0IHdvdWxk CisJICogY3JlYXRlIG92ZXJsYXBwaW5nIG51bWJlcnMgZm9yIElOIGFuZCBPVVQgd2hpY2gKKwkg KiB3ZSBkb24ndCBzdXBwb3J0LCBzbyBhbHNvIGNyZWF0ZSBhIHN1aXRhYmxlIG5hbWUKKwkgKiB0 aGF0IHdpbGwgYWxsb3cgdGhlIGdlbmVyaWMgY29kZSB0byB1c2Ugb3VyCisJICogYXNzaWduZWQg YWRkcmVzcy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVNUX1ZIVUJfTlVNX0dFTl9FUHM7IGkr KykKKwkJaWYgKGQtPmVwbnNbaV0gPT0gTlVMTCkKKwkJCWJyZWFrOworCWlmIChpID49IEFTVF9W SFVCX05VTV9HRU5fRVBzKQorCQlyZXR1cm4gTlVMTDsKKwlhZGRyID0gaSArIDE7CisKKwkvKgor CSAqIE5vdyBncmFiIGFuIEVQIGZyb20gdGhlIHNoYXJlZCBwb29sIGFuZCBhc3NvY2lhdGUKKwkg KiBpdCB3aXRoIG91ciBkZXZpY2UKKwkgKi8KKyAgICAgICAJZXAgPSBhc3Rfdmh1Yl9hbGxvY19l cG4oZCwgYWRkcik7CisJaWYgKCFlcCkKKwkJcmV0dXJuIE5VTEw7CisJRERCRyhkLCAiQWxsb2Nh dGVkIGVwbiMlZCBmb3IgcG9ydCBFUCVkXG4iLAorCSAgICAgZXAtPmVwbi5nX2lkeCwgYWRkcik7 CisKKwlyZXR1cm4gJmVwLT5lcDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl91ZGNfc3RvcChz dHJ1Y3QgdXNiX2dhZGdldCAqZ2FkZ2V0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSB0 b19hc3RfZGV2KGdhZGdldCk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19p cnFzYXZlKCZkLT52aHViLT5sb2NrLCBmbGFncyk7CisKKwlEREJHKGQsICJzdG9wXG4iKTsKKwor CWQtPmRyaXZlciA9IE5VTEw7CisJZC0+Z2FkZ2V0LnNwZWVkID0gVVNCX1NQRUVEX1VOS05PV047 CisKKwlhc3Rfdmh1Yl9kZXZfbnVrZShkKTsKKworCWlmIChkLT5lbmFibGVkKQorCQlhc3Rfdmh1 Yl9kZXZfZGlzYWJsZShkKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxv Y2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHVzYl9nYWRnZXRf b3BzIGFzdF92aHViX3VkY19vcHMgPSB7CisJLmdldF9mcmFtZQk9IGFzdF92aHViX3VkY19nZXRf ZnJhbWUsCisJLndha2V1cAkJPSBhc3Rfdmh1Yl91ZGNfd2FrZXVwLAorCS5wdWxsdXAJCT0gYXN0 X3ZodWJfdWRjX3B1bGx1cCwKKwkudWRjX3N0YXJ0CT0gYXN0X3ZodWJfdWRjX3N0YXJ0LAorCS51 ZGNfc3RvcAk9IGFzdF92aHViX3VkY19zdG9wLAorCS5tYXRjaF9lcAk9IGFzdF92aHViX3VkY19t YXRjaF9lcCwKK307CisKK3ZvaWQgYXN0X3ZodWJfZGV2X3N1c3BlbmQoc3RydWN0IGFzdF92aHVi X2RldiAqZCkKK3sKKwlkLT5zdXNwZW5kZWQgPSB0cnVlOworCWlmIChkLT5kcml2ZXIpIHsKKwkJ c3Bpbl91bmxvY2soJmQtPnZodWItPmxvY2spOworCQlkLT5kcml2ZXItPnN1c3BlbmQoJmQtPmdh ZGdldCk7CisJCXNwaW5fbG9jaygmZC0+dmh1Yi0+bG9jayk7CisJfQorfQorCit2b2lkIGFzdF92 aHViX2Rldl9yZXN1bWUoc3RydWN0IGFzdF92aHViX2RldiAqZCkKK3sKKwlkLT5zdXNwZW5kZWQg PSBmYWxzZTsKKwlpZiAoZC0+ZHJpdmVyKSB7CisJCXNwaW5fdW5sb2NrKCZkLT52aHViLT5sb2Nr KTsKKwkJZC0+ZHJpdmVyLT5yZXN1bWUoJmQtPmdhZGdldCk7CisJCXNwaW5fbG9jaygmZC0+dmh1 Yi0+bG9jayk7CisJfQorfQorCit2b2lkIGFzdF92aHViX2Rldl9yZXNldChzdHJ1Y3QgYXN0X3Zo dWJfZGV2ICpkKQoreworCS8qCisJICogSWYgc3BlZWQgaXMgbm90IHNldCwgd2UgZW5hYmxlIHRo ZSBwb3J0LiBJZiBpdCBpcywKKwkgKiBzZW5kIHJlc2V0IHRvIHRoZSBnYWRnZXQgYW5kIHJlc2V0 ICJzcGVlZCIuCisJICoKKwkgKiBTcGVlZCBpcyBhbiBpbmRpY2F0aW9uIHRoYXQgd2UgaGF2ZSBn b3QgdGhlIGZpcnN0CisJICogc2V0dXAgcGFja2V0IHRvIHRoZSBkZXZpY2UuCisJICovCisJaWYg KGQtPmdhZGdldC5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTiAmJiAhZC0+ZW5hYmxlZCkgewor CQlEREJHKGQsICJSZXNldCBhdCB1bmtub3duIHNwZWVkIG9mIGRpc2FibGVkIGRldmljZSwgZW5h YmxpbmcuLi5cbiIpOworCQlhc3Rfdmh1Yl9kZXZfZW5hYmxlKGQpOworCQlkLT5zdXNwZW5kZWQg PSBmYWxzZTsKKwl9CisJaWYgKGQtPmdhZGdldC5zcGVlZCAhPSBVU0JfU1BFRURfVU5LTk9XTiAm JiBkLT5kcml2ZXIpIHsKKwkJdW5zaWduZWQgaW50IGk7CisKKwkJRERCRyhkLCAiUmVzZXQgYXQg a25vd24gc3BlZWQgb2YgYm91bmQgZGV2aWNlLCByZXNldHRpbmcuLi5cbiIpOworCQlzcGluX3Vu bG9jaygmZC0+dmh1Yi0+bG9jayk7CisJCWQtPmRyaXZlci0+cmVzZXQoJmQtPmdhZGdldCk7CisJ CXNwaW5fbG9jaygmZC0+dmh1Yi0+bG9jayk7CisKKwkJLyoKKwkJICogRGlzYWJsZS9yZS1lbmFi bGUgSFcsIHRoaXMgd2lsbCBjbGVhciB0aGUgYWRkcmVzcworCQkgKiBhbmQgc3BlZWQgc2V0dGlu Zy4KKwkJICovCisJCWFzdF92aHViX2Rldl9kaXNhYmxlKGQpOworCQlhc3Rfdmh1Yl9kZXZfZW5h YmxlKGQpOworCisJCS8qIENsZWFyIHN0YWxsIG9uIGFsbCBFUHMgKi8KKwkJZm9yIChpID0gMDsg aSA8IEFTVF9WSFVCX05VTV9HRU5fRVBzOyBpKyspIHsKKwkJCXN0cnVjdCBhc3Rfdmh1Yl9lcCAq ZXAgPSBkLT5lcG5zW2ldOworCisJCQlpZiAoZXAgJiYgZXAtPmVwbi5zdGFsbGVkKSB7CisJCQkJ ZXAtPmVwbi5zdGFsbGVkID0gZmFsc2U7CisJCQkJYXN0X3ZodWJfdXBkYXRlX2Vwbl9zdGFsbChl cCk7CisJCQl9CisJCX0KKworCQkvKiBBZGRpdGlvbmFsIGNsZWFudXBzICovCisJCWQtPndha2V1 cF9lbiA9IGZhbHNlOworCQlkLT5zdXNwZW5kZWQgPSBmYWxzZTsKKwl9Cit9CisKK3ZvaWQgYXN0 X3ZodWJfZGVsX2RldihzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKQoreworCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmZC0+dmh1Yi0+bG9jaywgZmxhZ3MpOworCWlm ICghZC0+cmVnaXN0ZXJlZCkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkLT52aHViLT5s b2NrLCBmbGFncyk7CisJCXJldHVybjsKKwl9CisJZC0+cmVnaXN0ZXJlZCA9IGZhbHNlOworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJmQtPnZodWItPmxvY2ssIGZsYWdzKTsKKworCXVzYl9kZWxf Z2FkZ2V0X3VkYygmZC0+Z2FkZ2V0KTsKKwlkZXZpY2VfdW5yZWdpc3RlcigmZC0+cG9ydF9kZXYp OworfQorCitpbnQgYXN0X3ZodWJfaW5pdF9kZXYoc3RydWN0IGFzdF92aHViICp2aHViLCB1bnNp Z25lZCBpbnQgaWR4KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmQgPSAmdmh1Yi0+cG9ydHNb aWR4XS5kZXY7CisJc3RydWN0IGRldmljZSAqcGFyZW50ID0gJnZodWItPnBkZXYtPmRldjsKKwlp bnQgcmM7CisKKwlkLT52aHViID0gdmh1YjsKKwlkLT5pbmRleCA9IGlkeDsKKwlkLT5uYW1lID0g ZGV2bV9rYXNwcmludGYocGFyZW50LCBHRlBfS0VSTkVMLCAicG9ydCVkIiwgaWR4KzEpOworCWQt PnJlZ3MgPSB2aHViLT5yZWdzICsgMHgxMDAgKyAweDEwICogaWR4OworCisJYXN0X3ZodWJfaW5p dF9lcDAodmh1YiwgJmQtPmVwMCwgZCk7CisKKwkvKgorCSAqIFRoZSBVREMgY29yZSByZWFsbHkg bmVlZHMgdXMgdG8gaGF2ZSBzZXBhcmF0ZSBhbmQgdW5pcXVlbHkKKwkgKiBuYW1lZCAicGFyZW50 IiBkZXZpY2VzIGZvciBlYWNoIHBvcnQgc28gd2UgY3JlYXRlIGEgc3ViIGRldmljZQorCSAqIGhl cmUgZm9yIHRoYXQgcHVycG9zZQorCSAqLworCWRldmljZV9pbml0aWFsaXplKCZkLT5wb3J0X2Rl dik7CisJZC0+cG9ydF9kZXYucGFyZW50ID0gcGFyZW50OworCWRldl9zZXRfbmFtZSgmZC0+cG9y dF9kZXYsICIlczpwJWQiLCBkZXZfbmFtZShwYXJlbnQpLCBpZHggKyAxKTsKKwlyYyA9IGRldmlj ZV9hZGQoJmQtPnBvcnRfZGV2KTsKKwlpZiAocmMpCisJCWdvdG8gZmFpbF9hZGQ7CisKKwkvKiBQ b3B1bGF0ZSBnYWRnZXQgKi8KKwlJTklUX0xJU1RfSEVBRCgmZC0+Z2FkZ2V0LmVwX2xpc3QpOwor CWQtPmdhZGdldC5vcHMgPSAmYXN0X3ZodWJfdWRjX29wczsKKwlkLT5nYWRnZXQuZXAwID0gJmQt PmVwMC5lcDsKKwlkLT5nYWRnZXQubmFtZSA9IEtCVUlMRF9NT0ROQU1FOworCWlmICh2aHViLT5m b3JjZV91c2IxKQorCQlkLT5nYWRnZXQubWF4X3NwZWVkID0gVVNCX1NQRUVEX0ZVTEw7CisJZWxz ZQorCQlkLT5nYWRnZXQubWF4X3NwZWVkID0gVVNCX1NQRUVEX0hJR0g7CisJZC0+Z2FkZ2V0LnNw ZWVkID0gVVNCX1NQRUVEX1VOS05PV047CisJZC0+Z2FkZ2V0LmRldi5vZl9ub2RlID0gdmh1Yi0+ cGRldi0+ZGV2Lm9mX25vZGU7CisKKwlyYyA9IHVzYl9hZGRfZ2FkZ2V0X3VkYygmZC0+cG9ydF9k ZXYsICZkLT5nYWRnZXQpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIGZhaWxfdWRjOworCWQtPnJl Z2lzdGVyZWQgPSB0cnVlOworCisJcmV0dXJuIDA7CisgZmFpbF91ZGM6CisJZGV2aWNlX2RlbCgm ZC0+cG9ydF9kZXYpOworIGZhaWxfYWRkOgorCXB1dF9kZXZpY2UoJmQtPnBvcnRfZGV2KTsKKwor CXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVk LXZodWIvZXAwLmMgYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2VwMC5jCm5l dyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uMDQ4MmE4NDYzZGMxCi0tLSAv ZGV2L251bGwKKysrIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcDAuYwpA QCAtMCwwICsxLDQ3NCBAQAorLyoKKyAqIGFzcGVlZC12aHViIC0tIERyaXZlciBmb3IgQXNwZWVk IFNvQyAidkh1YiIgVVNCIGdhZGdldAorICoKKyAqIGVwMC5jIC0gRW5kcG9pbnQgMCBoYW5kbGlu ZworICoKKyAqIENvcHlyaWdodCAyMDE3IElCTSBDb3Jwb3JhdGlvbgorICoKKyAqIFRoaXMgcHJv Z3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9k aWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNl bnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0 aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1 ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgor I2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CisjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5j bHVkZSA8bGludXgvc2xhYi5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8 bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxp bnV4L3Byb2NfZnMuaD4KKyNpbmNsdWRlIDxsaW51eC9wcmVmZXRjaC5oPgorI2luY2x1ZGUgPGxp bnV4L2Nsay5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9nYWRnZXQuaD4KKyNpbmNsdWRlIDxsaW51 eC9vZi5oPgorI2luY2x1ZGUgPGxpbnV4L29mX2dwaW8uaD4KKyNpbmNsdWRlIDxsaW51eC9yZWdt YXAuaD4KKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgorCisjaW5jbHVkZSAidmh1Yi5o IgorCitpbnQgYXN0X3ZodWJfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICplcCwgY2hhciAqcHRy LCBpbnQgbGVuKQoreworCXN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxID0gJmVwLT5lcDAucmVxLnJl cTsKKworCWlmIChXQVJOX09OKGVwLT5kX2lkeCAhPSAwKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3Rh bGw7CisJaWYgKFdBUk5fT04oIWVwLT5lcDAuZGlyX2luKSkKKwkJcmV0dXJuIHN0ZF9yZXFfc3Rh bGw7CisJaWYgKFdBUk5fT04obGVuID4gQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpKQorCQlyZXR1 cm4gc3RkX3JlcV9zdGFsbDsKKwlpZiAoV0FSTl9PTihyZXEtPnN0YXR1cyA9PSAtRUlOUFJPR1JF U1MpKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKworCXJlcS0+YnVmID0gcHRyOworCXJlcS0+ bGVuZ3RoID0gbGVuOworCXJlcS0+Y29tcGxldGUgPSBOVUxMOworCXJlcS0+emVybyA9IHRydWU7 CisKKwkvKiBDYWxsIGludGVybmFsIHF1ZXVlIGRpcmVjdGx5ICovCisJaWYgKGVwLT5lcC5vcHMt PnF1ZXVlKCZlcC0+ZXAsIHJlcSwgR0ZQX0FUT01JQykpCisJCXJldHVybiBzdGRfcmVxX3N0YWxs OworCWVsc2UKKwkJcmV0dXJuIHN0ZF9yZXFfZGF0YTsKK30KKworaW50IF9fYXN0X3ZodWJfc2lt cGxlX3JlcGx5KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIGludCBsZW4sIC4uLikKK3sKKwl1OCAq YnVmZmVyID0gZXAtPmJ1ZjsKKwl1bnNpZ25lZCBpbnQgaTsKKwl2YV9saXN0IGFyZ3M7CisKKwl2 YV9zdGFydChhcmdzLCBsZW4pOworCisJLyogQ29weSBkYXRhIGRpcmVjdGx5IGludG8gRVAgYnVm ZmVyICovCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQlidWZmZXJbaV0gPSB2YV9hcmco YXJncywgaW50KTsKKwl2YV9lbmQoYXJncyk7CisKKwkvKiByZXEtPmJ1ZiBOVUxMIG1lYW5zIGRh dGEgaXMgYWxyZWFkeSB0aGVyZSAqLworCXJldHVybiBhc3Rfdmh1Yl9yZXBseShlcCwgTlVMTCwg bGVuKTsKK30KKwordm9pZCBhc3Rfdmh1Yl9lcDBfaGFuZGxlX3NldHVwKHN0cnVjdCBhc3Rfdmh1 Yl9lcCAqZXApCit7CisJc3RydWN0IHVzYl9jdHJscmVxdWVzdCBjcnE7CisJZW51bSBzdGRfcmVx X3JjIHN0ZF9yZXFfcmM7CisJaW50IHJjID0gLUVOT0RFVjsKKworCWlmIChXQVJOX09OKGVwLT5k X2lkeCAhPSAwKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBHcmFiIHRoZSBzZXR1cCBwYWNrZXQg ZnJvbSB0aGUgY2hpcCBhbmQgYnl0ZXN3YXAKKwkgKiBpbnRlcmVzdGluZyBmaWVsZHMKKwkgKi8K KwltZW1jcHlfZnJvbWlvKCZjcnEsIGVwLT5lcDAuc2V0dXAsIHNpemVvZihjcnEpKTsKKworCUVQ REJHKGVwLCAiU0VUVVAgcGFja2V0ICUwMngvJTAyeC8lMDR4LyUwNHgvJTA0eCBbJXNdIHN0PSVk XG4iLAorCSAgICAgIGNycS5iUmVxdWVzdFR5cGUsIGNycS5iUmVxdWVzdCwKKwkgICAgICAgbGUx Nl90b19jcHUoY3JxLndWYWx1ZSksCisJICAgICAgIGxlMTZfdG9fY3B1KGNycS53SW5kZXgpLAor CSAgICAgICBsZTE2X3RvX2NwdShjcnEud0xlbmd0aCksCisJICAgICAgIChjcnEuYlJlcXVlc3RU eXBlICYgVVNCX0RJUl9JTikgPyAiaW4iIDogIm91dCIsCisJICAgICAgIGVwLT5lcDAuc3RhdGUp OworCisJLyogQ2hlY2sgb3VyIHN0YXRlLCBjYW5jZWwgcGVuZGluZyByZXF1ZXN0cyBpZiBuZWVk ZWQgKi8KKwlpZiAoZXAtPmVwMC5zdGF0ZSAhPSBlcDBfc3RhdGVfdG9rZW4pIHsKKwkJRVBEQkco ZXAsICJ3cm9uZyBzdGF0ZVxuIik7CisJCWFzdF92aHViX251a2UoZXAsIDApOworCQlnb3RvIHN0 YWxsOworCX0KKworCS8qIENhbGN1bGF0ZSBuZXh0IHN0YXRlIGZvciBFUDAgKi8KKwllcC0+ZXAw LnN0YXRlID0gZXAwX3N0YXRlX2RhdGE7CisJZXAtPmVwMC5kaXJfaW4gPSAhIShjcnEuYlJlcXVl c3RUeXBlICYgVVNCX0RJUl9JTik7CisKKwkvKiBJZiB0aGlzIGlzIHRoZSB2SHViLCB3ZSBoYW5k bGUgcmVxdWVzdHMgZGlmZmVyZW50bHkgKi8KKwlzdGRfcmVxX3JjID0gc3RkX3JlcV9kcml2ZXI7 CisJaWYgKGVwLT5kZXYgPT0gTlVMTCkgeworCQlpZiAoKGNycS5iUmVxdWVzdFR5cGUgJiBVU0Jf VFlQRV9NQVNLKSA9PSBVU0JfVFlQRV9TVEFOREFSRCkKKwkJCXN0ZF9yZXFfcmMgPSBhc3Rfdmh1 Yl9zdGRfaHViX3JlcXVlc3QoZXAsICZjcnEpOworCQllbHNlIGlmICgoY3JxLmJSZXF1ZXN0VHlw ZSAmIFVTQl9UWVBFX01BU0spID09IFVTQl9UWVBFX0NMQVNTKQorCQkJc3RkX3JlcV9yYyA9IGFz dF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0KGVwLCAmY3JxKTsKKwkJZWxzZQorCQkJc3RkX3JlcV9y YyA9IHN0ZF9yZXFfc3RhbGw7CisJfSBlbHNlIGlmICgoY3JxLmJSZXF1ZXN0VHlwZSAmIFVTQl9U WVBFX01BU0spID09IFVTQl9UWVBFX1NUQU5EQVJEKQorCQlzdGRfcmVxX3JjID0gYXN0X3ZodWJf c3RkX2Rldl9yZXF1ZXN0KGVwLCAmY3JxKTsKKworCS8qIEFjdCB1cG9uIHJlc3VsdCAqLworCXN3 aXRjaChzdGRfcmVxX3JjKSB7CisJY2FzZSBzdGRfcmVxX2NvbXBsZXRlOgorCQlnb3RvIGNvbXBs ZXRlOworCWNhc2Ugc3RkX3JlcV9zdGFsbDoKKwkJZ290byBzdGFsbDsKKwljYXNlIHN0ZF9yZXFf ZHJpdmVyOgorCQlicmVhazsKKwljYXNlIHN0ZF9yZXFfZGF0YToKKwkJcmV0dXJuOworCX0KKwor CS8qIFBhc3MgcmVxdWVzdCB1cCB0byB0aGUgZ2FkZ2V0IGRyaXZlciAqLworCWlmIChXQVJOX09O KCFlcC0+ZGV2KSkKKwkJZ290byBzdGFsbDsKKwlpZiAoZXAtPmRldi0+ZHJpdmVyKSB7CisJCUVQ REJHKGVwLCAiZm9yd2FyZGluZyB0byBnYWRnZXQuLi5cbiIpOworCQlzcGluX3VubG9jaygmZXAt PnZodWItPmxvY2spOworCQlyYyA9IGVwLT5kZXYtPmRyaXZlci0+c2V0dXAoJmVwLT5kZXYtPmdh ZGdldCwgJmNycSk7CisJCXNwaW5fbG9jaygmZXAtPnZodWItPmxvY2spOworCQlFUERCRyhlcCwg ImRyaXZlciByZXR1cm5lZCAlZFxuIiwgcmMpOworCX0gZWxzZSB7CisJCUVQREJHKGVwLCAibm8g Z2FkZ2V0IGZvciByZXF1ZXN0ICFcbiIpOworCX0KKwlpZiAocmMgPj0gMCkKKwkJcmV0dXJuOwor Cisgc3RhbGw6CisJRVBEQkcoZXAsICJzdGFsbGluZ1xuIik7CisJd3JpdGVsKFZIVUJfRVAwX0NU UkxfU1RBTEwsIGVwLT5lcDAuY3Rsc3RhdCk7CisJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9z dGF0dXM7CisJZXAtPmVwMC5kaXJfaW4gPSBmYWxzZTsKKwlyZXR1cm47CisKKyBjb21wbGV0ZToK KwlFUFZEQkcoZXAsICJzZW5kaW5nIFtpbl0gc3RhdHVzIHdpdGggbm8gZGF0YVxuIik7CisJd3Jp dGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCWVwLT5lcDAuc3Rh dGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCWVwLT5lcDAuZGlyX2luID0gZmFsc2U7Cit9CisKKwor c3RhdGljIHZvaWQgYXN0X3ZodWJfZXAwX2RvX3NlbmQoc3RydWN0IGFzdF92aHViX2VwICplcCwK KwkJCQkgc3RydWN0IGFzdF92aHViX3JlcSAqcmVxKQoreworCXVuc2lnbmVkIGludCBjaHVuazsK Kwl1MzIgcmVnOworCisJLyogSWYgdGhpcyBpcyBhIDAtbGVuZ3RoIHJlcXVlc3QsIGl0J3MgdGhl IGdhZGdldCB0cnlpbmcgdG8KKwkgKiBzZW5kIGEgc3RhdHVzIG9uIG91ciBiZWhhbGYuIFdlIHRh a2UgaXQgZnJvbSBoZXJlLgorCSAqLworCWlmIChyZXEtPnJlcS5sZW5ndGggPT0gMCkKKwkJcmVx LT5sYXN0X2Rlc2MgPSAxOworCisJLyogQXJlIHdlIGRvbmUgPyBDb21wbGV0ZSByZXF1ZXN0LCBv dGhlcndpc2Ugd2FpdCBmb3IgbmV4dCBpbnRlcnJ1cHQgKi8KKwlpZiAocmVxLT5sYXN0X2Rlc2Mg Pj0gMCkgeworCQlFUFZEQkcoZXAsICJjb21wbGV0ZSBzZW5kICVkLyVkXG4iLAorCQkgICAgICAg cmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgpOworCQllcC0+ZXAwLnN0YXRlID0gZXAw X3N0YXRlX3N0YXR1czsKKwkJd3JpdGVsKFZIVUJfRVAwX1JYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0 bHN0YXQpOworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIDApOworCQlyZXR1cm47CisJfQorCisJ LyoKKwkgKiBOZXh0IGNodW5rIGNyb3BwZWQgdG8gbWF4IHBhY2tldCBzaXplLiBBbHNvIGNoZWNr IGlmIHRoaXMKKwkgKiBpcyB0aGUgbGFzdCBwYWNrZXQKKwkgKi8KKwljaHVuayA9IHJlcS0+cmVx Lmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKKwlpZiAoY2h1bmsgPiBlcC0+ZXAubWF4cGFja2V0 KQorCQljaHVuayA9IGVwLT5lcC5tYXhwYWNrZXQ7CisJZWxzZSBpZiAoKGNodW5rIDwgZXAtPmVw Lm1heHBhY2tldCkgfHwgIXJlcS0+cmVxLnplcm8pCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKwor CUVQVkRCRyhlcCwgInNlbmQgY2h1bms9JWQgbGFzdD0lZCwgcmVxLT5hY3Q9JWQgbXA9JWRcbiIs CisJICAgICAgIGNodW5rLCByZXEtPmxhc3RfZGVzYywgcmVxLT5yZXEuYWN0dWFsLCBlcC0+ZXAu bWF4cGFja2V0KTsKKworCS8qCisJICogQ29weSBkYXRhIGlmIGFueSAoaW50ZXJuYWwgcmVxdWVz dHMgYWxyZWFkeSBoYXZlIGRhdGEKKwkgKiBpbiB0aGUgRVAgYnVmZmVyKQorCSAqLworCWlmIChj aHVuayAmJiByZXEtPnJlcS5idWYpCisJCW1lbWNweShlcC0+YnVmLCByZXEtPnJlcS5idWYgKyBy ZXEtPnJlcS5hY3R1YWwsIGNodW5rKTsKKworCS8qIFJlbWVtYmVyIGNodW5rIHNpemUgYW5kIHRy aWdnZXIgc2VuZCAqLworCXJlZyA9IFZIVUJfRVAwX1NFVF9UWF9MRU4oY2h1bmspOworCXdyaXRl bChyZWcsIGVwLT5lcDAuY3Rsc3RhdCk7CisJd3JpdGVsKHJlZyB8IFZIVUJfRVAwX1RYX0JVRkZf UkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCXJlcS0+cmVxLmFjdHVhbCArPSBjaHVuazsKK30KKwor c3RhdGljIHZvaWQgYXN0X3ZodWJfZXAwX3J4X3ByaW1lKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAp Cit7CisJRVBWREJHKGVwLCAicnggcHJpbWVcbiIpOworCisJLyogUHJpbWUgZW5kcG9pbnQgZm9y IHJlY2VpdmluZyBkYXRhICovCisJd3JpdGVsKFZIVUJfRVAwX1JYX0JVRkZfUkRZLCBlcC0+ZXAw LmN0bHN0YXQgKyBBU1RfVkhVQl9FUDBfQ1RSTCk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHVi X2VwMF9kb19yZWNlaXZlKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsIHN0cnVjdCBhc3Rfdmh1Yl9y ZXEgKnJlcSwKKwkJCQkgICAgdW5zaWduZWQgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgcmVt YWluOworCWludCByYyA9IDA7CisKKwkvKiBXZSBhcmUgcmVjZWl2aW5nLi4uIGdyYWIgcmVxdWVz dCAqLworCXJlbWFpbiA9IHJlcS0+cmVxLmxlbmd0aCAtIHJlcS0+cmVxLmFjdHVhbDsKKworCUVQ VkRCRyhlcCwgInJlY2VpdmUgZ290PSVkIHJlbWFpbj0lZFxuIiwgbGVuLCByZW1haW4pOworCisJ LyogQXJlIHdlIGdldHRpbmcgbW9yZSB0aGFuIGFza2VkID8gKi8KKwlpZiAobGVuID4gcmVtYWlu KSB7CisJCUVQREJHKGVwLCAicmVjZWl2aW5nIHRvbyBtdWNoIChvdmY6ICVkKSAhXG4iLAorCQkg ICAgICBsZW4gLSByZW1haW4pOworCQlsZW4gPSByZW1haW47CisJCXJjID0gLUVPVkVSRkxPVzsK Kwl9CisJaWYgKGxlbiAmJiByZXEtPnJlcS5idWYpCisJCW1lbWNweShyZXEtPnJlcS5idWYgKyBy ZXEtPnJlcS5hY3R1YWwsIGVwLT5idWYsIGxlbik7CisJcmVxLT5yZXEuYWN0dWFsICs9IGxlbjsK KworCS8qIERvbmUgPyAqLworCWlmIChsZW4gPCBlcC0+ZXAubWF4cGFja2V0IHx8IGxlbiA9PSBy ZW1haW4pIHsKKwkJZXAtPmVwMC5zdGF0ZSA9IGVwMF9zdGF0ZV9zdGF0dXM7CisJCXdyaXRlbChW SFVCX0VQMF9UWF9CVUZGX1JEWSwgZXAtPmVwMC5jdGxzdGF0KTsKKwkJYXN0X3ZodWJfZG9uZShl cCwgcmVxLCByYyk7CisJfSBlbHNlCisJCWFzdF92aHViX2VwMF9yeF9wcmltZShlcCk7Cit9CisK K3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soc3RydWN0IGFzdF92aHViX2VwICplcCwgYm9v bCBpbl9hY2spCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCXN0cnVjdCBhc3Rfdmh1 YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2aHViLT5wZGV2LT5k ZXY7CisJYm9vbCBzdGFsbCA9IGZhbHNlOworCXUzMiBzdGF0OworCisJLyogUmVhZCBFUDAgc3Rh dHVzICovCisJc3RhdCA9IHJlYWRsKGVwLT5lcDAuY3Rsc3RhdCk7CisKKwkvKiBHcmFiIGN1cnJl bnQgcmVxdWVzdCBpZiBhbnkgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVw LT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCisJRVBWREJHKGVwLCAiQUNL IHN0YXR1cz0lMDh4LHN0YXRlPSVkIGlzX2luPSVkIGluX2Fjaz0lZCByZXE9JXBcbiIsCisJCXN0 YXQsIGVwLT5lcDAuc3RhdGUsIGVwLT5lcDAuZGlyX2luLCBpbl9hY2ssIHJlcSk7CisKKwlzd2l0 Y2goZXAtPmVwMC5zdGF0ZSkgeworCWNhc2UgZXAwX3N0YXRlX3Rva2VuOgorCQkvKiBUaGVyZSBz aG91bGQgYmUgbm8gcmVxdWVzdCBxdWV1ZWQgaW4gdGhhdCBzdGF0ZS4uLiAqLworCQlpZiAocmVx KSB7CisJCQlkZXZfd2FybihkZXYsICJyZXF1ZXN0IHByZXNlbnQgd2hpbGUgaW4gVE9LRU4gc3Rh dGVcbiIpOworCQkJYXN0X3ZodWJfbnVrZShlcCwgLUVJTlZBTCk7CisJCX0KKwkJZGV2X3dhcm4o ZGV2LCAiYWNrIHdoaWxlIGluIFRPS0VOIHN0YXRlXG4iKTsKKwkJc3RhbGwgPSB0cnVlOworCQli cmVhazsKKwljYXNlIGVwMF9zdGF0ZV9kYXRhOgorCQkvKiBDaGVjayB0aGUgc3RhdGUgYml0cyBj b3JyZXNwb25kaW5nIHRvIG91ciBkaXJlY3Rpb24gKi8KKwkJaWYgKChlcC0+ZXAwLmRpcl9pbiAm JiAoc3RhdCAmIFZIVUJfRVAwX1RYX0JVRkZfUkRZKSkgfHwKKwkJICAgICghZXAtPmVwMC5kaXJf aW4gJiYgKHN0YXQgJiBWSFVCX0VQMF9SWF9CVUZGX1JEWSkpIHx8CisJCSAgICAoZXAtPmVwMC5k aXJfaW4gIT0gaW5fYWNrKSkgeworCQkJZGV2X3dhcm4oZGV2LCAiaXJxIHN0YXRlIG1pc21hdGNo Iik7CisJCQlzdGFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJfQorCQkvKgorCQkgKiBXZSBhcmUg aW4gZGF0YSBwaGFzZSBhbmQgdGhlcmUncyBubyByZXF1ZXN0LCBzb21ldGhpbmcgaXMKKwkJICog d3JvbmcsIHN0YWxsCisJCSAqLworCQlpZiAoIXJlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAiZGF0 YSBwaGFzZSwgbm8gcmVxdWVzdFxuIik7CisJCQlzdGFsbCA9IHRydWU7CisJCQlicmVhazsKKwkJ fQorCisJCS8qIFdlIGhhdmUgYSByZXF1ZXN0LCBoYW5kbGUgZGF0YSB0cmFuc2ZlcnMgKi8KKwkJ aWYgKGVwLT5lcDAuZGlyX2luKQorCQkJYXN0X3ZodWJfZXAwX2RvX3NlbmQoZXAsIHJlcSk7CisJ CWVsc2UKKwkJCWFzdF92aHViX2VwMF9kb19yZWNlaXZlKGVwLCByZXEsIFZIVUJfRVAwX1JYX0xF TihzdGF0KSk7CisJCXJldHVybjsKKwljYXNlIGVwMF9zdGF0ZV9zdGF0dXM6CisJCS8qIE51a2Ug c3RhbGUgcmVxdWVzdHMgKi8KKwkJaWYgKHJlcSkgeworCQkJZGV2X3dhcm4oZGV2LCAicmVxdWVz dCBwcmVzZW50IHdoaWxlIGluIFNUQVRVUyBzdGF0ZVxuIik7CisJCQlhc3Rfdmh1Yl9udWtlKGVw LCAtRUlOVkFMKTsKKwkJfQorCisJCS8qCisJCSAqIElmIHRoZSBzdGF0dXMgcGhhc2UgY29tcGxl dGVzIHdpdGggdGhlIHdyb25nIGFjaywgc3RhbGwKKwkJICogdGhlIGVuZHBvaW50IGp1c3QgaW4g Y2FzZSwgdG8gYWJvcnQgd2hhdGV2ZXIgdGhlIGhvc3QKKwkJICogd2FzIGRvaW5nLgorCQkgKi8K KwkJaWYgKGVwLT5lcDAuZGlyX2luID09IGluX2FjaykgeworCQkJZGV2X3dhcm4oZGV2LCAic3Rh dHVzIGRpcmVjdGlvbiBtaXNtYXRjaFxuIik7CisJCQlzdGFsbCA9IHRydWU7CisJCX0KKwl9CisK KwkvKiBSZXNldCB0byB0b2tlbiBzdGF0ZSAqLworCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVf dG9rZW47CisJaWYgKHN0YWxsKQorCQl3cml0ZWwoVkhVQl9FUDBfQ1RSTF9TVEFMTCwgZXAtPmVw MC5jdGxzdGF0KTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcDBfcXVldWUoc3RydWN0IHVz Yl9lcCogdV9lcCwgc3RydWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSwKKwkJCSAgICAgIGdmcF90IGdm cF9mbGFncykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEgPSB0b19hc3RfcmVxKHVfcmVx KTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBh c3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZ2aHViLT5w ZGV2LT5kZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCS8qIFBhcmFub2lkIGNoZWtzICov CisJaWYgKCF1X3JlcSB8fCAoIXVfcmVxLT5jb21wbGV0ZSAmJiAhcmVxLT5pbnRlcm5hbCkgfHwK KwkgICAgIWxpc3RfZW1wdHkoJnJlcS0+cXVldWUpKSB7CisJCWRldl93YXJuKGRldiwgIkJvZ3Vz IHJlcXVlc3QgIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIE5vdCBlbmRwb2lu dCAwID8gKi8KKwlpZiAoV0FSTl9PTihlcC0+ZF9pZHggIT0gMCkpCisJCXJldHVybiAtRUlOVkFM OworCisJLyogRGlzYWJsZWQgZGV2aWNlICovCisJaWYgKGVwLT5kZXYgJiYgKCFlcC0+ZGV2LT5l bmFibGVkIHx8IGVwLT5kZXYtPnN1c3BlbmRlZCkpCisJCXJldHVybiAtRVNIVVRET1dOOworCisJ LyogRGF0YSwgbm8gYnVmZmVyIGFuZCBub3QgaW50ZXJuYWwgPyAqLworCWlmICh1X3JlcS0+bGVu Z3RoICYmICF1X3JlcS0+YnVmICYmICFyZXEtPmludGVybmFsKSB7CisJCWRldl93YXJuKGRldiwg IlJlcXVlc3Qgd2l0aCBubyBidWZmZXIgIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwor CUVQVkRCRyhlcCwgImVucXVldWUgcmVxIEAlcFxuIiwgcmVxKTsKKwlFUFZEQkcoZXAsICIgIGw9 JWQgemVybz0lZCBub3Nob3J0PSVkIGlzX2luPSVkXG4iLAorCSAgICAgICB1X3JlcS0+bGVuZ3Ro LCB1X3JlcS0+emVybywKKwkgICAgICAgdV9yZXEtPnNob3J0X25vdF9vaywgZXAtPmVwMC5kaXJf aW4pOworCisJLyogSW5pdGlhbGl6ZSByZXF1ZXN0IHByb2dyZXNzIGZpZWxkcyAqLworCXVfcmVx LT5zdGF0dXMgPSAtRUlOUFJPR1JFU1M7CisJdV9yZXEtPmFjdHVhbCA9IDA7CisJcmVxLT5sYXN0 X2Rlc2MgPSAtMTsKKwlyZXEtPmFjdGl2ZSA9IGZhbHNlOworCisJc3Bpbl9sb2NrX2lycXNhdmUo JnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIEVQMCBjYW4gb25seSBzdXBwb3J0IGEgc2luZ2xl IHJlcXVlc3QgYXQgYSB0aW1lICovCisJaWYgKCFsaXN0X2VtcHR5KCZlcC0+cXVldWUpIHx8IGVw LT5lcDAuc3RhdGUgPT0gZXAwX3N0YXRlX3Rva2VuKSB7CisJCWRldl93YXJuKGRldiwgIkVQMDog UmVxdWVzdCBpbiB3cm9uZyBzdGF0ZVxuIik7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnZo dWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIC1FQlVTWTsKKwl9CisKKwkvKiBBZGQgcmVxdWVz dCB0byBsaXN0IGFuZCBraWNrIHByb2Nlc3NpbmcgaWYgZW1wdHkgKi8KKwlsaXN0X2FkZF90YWls KCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKworCWlmIChlcC0+ZXAwLmRpcl9pbikgeworCQkv KiBJTiByZXF1ZXN0LCBzZW5kIGRhdGEgKi8KKwkJYXN0X3ZodWJfZXAwX2RvX3NlbmQoZXAsIHJl cSk7CisJfSBlbHNlIGlmICh1X3JlcS0+bGVuZ3RoID09IDApIHsKKwkJLyogMC1sZW4gcmVxdWVz dCwgc2VuZCBjb21wbGV0aW9uIGFzIHJ4ICovCisJCUVQVkRCRyhlcCwgIjAtbGVuZ3RoIHJ4IGNv bXBsZXRpb25cbiIpOworCQllcC0+ZXAwLnN0YXRlID0gZXAwX3N0YXRlX3N0YXR1czsKKwkJd3Jp dGVsKFZIVUJfRVAwX1RYX0JVRkZfUkRZLCBlcC0+ZXAwLmN0bHN0YXQpOworCQlhc3Rfdmh1Yl9k b25lKGVwLCByZXEsIDApOworCX0gZWxzZSB7CisJCS8qIE9VVCByZXF1ZXN0LCBzdGFydCByZWNl aXZlciAqLworCQlhc3Rfdmh1Yl9lcDBfcnhfcHJpbWUoZXApOworCX0KKworCXNwaW5fdW5sb2Nr X2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX2VwMF9kZXF1ZXVlKHN0cnVjdCB1c2JfZXAqIHVfZXAsIHN0cnVjdCB1 c2JfcmVxdWVzdCAqdV9yZXEpCit7CisJc3RydWN0IGFzdF92aHViX2VwICplcCA9IHRvX2FzdF9l cCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0 X3ZodWJfcmVxICpyZXE7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgcmMgPSAtRUlOVkFM OworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCS8qIE9ubHkg b25lIHJlcXVlc3QgY2FuIGJlIGluIHRoZSBxdWV1ZSAqLworCXJlcSA9IGxpc3RfZmlyc3RfZW50 cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLCBzdHJ1Y3QgYXN0X3ZodWJfcmVxLCBxdWV1ZSk7CisKKwkv KiBJcyBpdCBvdXJzID8gKi8KKwlpZiAocmVxICYmIHVfcmVxID09ICZyZXEtPnJlcSkgeworCQlF UFZEQkcoZXAsICJkZXF1ZXVlIHJlcSBAJXBcbiIsIHJlcSk7CisKKwkJLyoKKwkJICogV2UgZG9u J3QgaGF2ZSB0byBkZWFsIHdpdGggImFjdGl2ZSIgYXMgYWxsCisJCSAqIERNQXMgZ28gdG8gdGhl IEVQIGJ1ZmZlcnMsIG5vdCB0aGUgcmVxdWVzdC4KKwkJICovCisJCWFzdF92aHViX2RvbmUoZXAs IHJlcSwgLUVDT05OUkVTRVQpOworCisJCS8qIFdlIGRvIHN0YWxsIHRoZSBFUCB0byBjbGVhbiB0 aGluZ3MgdXAgaW4gSFcgKi8KKwkJd3JpdGVsKFZIVUJfRVAwX0NUUkxfU1RBTEwsIGVwLT5lcDAu Y3Rsc3RhdCk7CisJCWVwLT5lcDAuc3RhdGUgPSBlcDBfc3RhdGVfc3RhdHVzOworCQllcC0+ZXAw LmRpcl9pbiA9IGZhbHNlOworCQlyYyA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUo JnZodWItPmxvY2ssIGZsYWdzKTsKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIGNvbnN0IHN0 cnVjdCB1c2JfZXBfb3BzIGFzdF92aHViX2VwMF9vcHMgPSB7CisJLnF1ZXVlCQk9IGFzdF92aHVi X2VwMF9xdWV1ZSwKKwkuZGVxdWV1ZQk9IGFzdF92aHViX2VwMF9kZXF1ZXVlLAorCS5hbGxvY19y ZXF1ZXN0CT0gYXN0X3ZodWJfYWxsb2NfcmVxdWVzdCwKKwkuZnJlZV9yZXF1ZXN0CT0gYXN0X3Zo dWJfZnJlZV9yZXF1ZXN0LAorfTsKKwordm9pZCBhc3Rfdmh1Yl9pbml0X2VwMChzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIsIHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCSAgICAgICBzdHJ1Y3QgYXN0 X3ZodWJfZGV2ICpkZXYpCit7CisJbWVtc2V0KGVwLCAwLCBzaXplb2YoKmVwKSk7CisKKwlJTklU X0xJU1RfSEVBRCgmZXAtPmVwLmVwX2xpc3QpOworCUlOSVRfTElTVF9IRUFEKCZlcC0+cXVldWUp OworCWVwLT5lcC5vcHMgPSAmYXN0X3ZodWJfZXAwX29wczsKKwllcC0+ZXAubmFtZSA9ICJlcDAi OworCWVwLT5lcC5jYXBzLnR5cGVfY29udHJvbCA9IHRydWU7CisJdXNiX2VwX3NldF9tYXhwYWNr ZXRfbGltaXQoJmVwLT5lcCwgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQpOworCWVwLT5kX2lkeCA9 IDA7CisJZXAtPmRldiA9IGRldjsKKwllcC0+dmh1YiA9IHZodWI7CisJZXAtPmVwMC5zdGF0ZSA9 IGVwMF9zdGF0ZV90b2tlbjsKKwlJTklUX0xJU1RfSEVBRCgmZXAtPmVwMC5yZXEucXVldWUpOwor CWVwLT5lcDAucmVxLmludGVybmFsID0gdHJ1ZTsKKworCS8qIFNtYWxsIGRpZmZlcmVuY2UgYmV0 d2VlbiB2SHViIGFuZCBkZXZpY2VzICovCisJaWYgKGRldikgeworCQllcC0+ZXAwLmN0bHN0YXQg PSBkZXYtPnJlZ3MgKyBBU1RfVkhVQl9ERVZfRVAwX0NUUkw7CisJCWVwLT5lcDAuc2V0dXAgPSB2 aHViLT5yZWdzICsKKwkJCUFTVF9WSFVCX1NFVFVQMCArIDggKiAoZGV2LT5pbmRleCArIDEpOwor CQllcC0+YnVmID0gdmh1Yi0+ZXAwX2J1ZnMgKworCQkJQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQg KiAoZGV2LT5pbmRleCArIDEpOworCQllcC0+YnVmX2RtYSA9IHZodWItPmVwMF9idWZzX2RtYSAr CisJCQlBU1RfVkhVQl9FUDBfTUFYX1BBQ0tFVCAqIChkZXYtPmluZGV4ICsgMSk7CisJfSBlbHNl IHsKKwkJZXAtPmVwMC5jdGxzdGF0ID0gdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJMOwor CQllcC0+ZXAwLnNldHVwID0gdmh1Yi0+cmVncyArIEFTVF9WSFVCX1NFVFVQMDsKKwkJZXAtPmJ1 ZiA9IHZodWItPmVwMF9idWZzOworCQllcC0+YnVmX2RtYSA9IHZodWItPmVwMF9idWZzX2RtYTsK Kwl9Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2Vw bi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3VkYy9hc3BlZWQtdmh1Yi9lcG4uYwpuZXcgZmlsZSBt b2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjMxMTM2NzAxNjBjOQotLS0gL2Rldi9udWxs CisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZodWIvZXBuLmMKQEAgLTAsMCAr MSw4NDAgQEAKKy8qCisgKiBhc3BlZWQtdmh1YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZI dWIiIFVTQiBnYWRnZXQKKyAqCisgKiBlcG4uYyAtIEdlbmVyaWMgZW5kcG9pbnRzIG1hbmFnZW1l bnQKKyAqCisgKiBDb3B5cmlnaHQgMjAxNyBJQk0gQ29ycG9yYXRpb24KKyAqCisgKiBUaGlzIHBy b2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1v ZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGlj ZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVp dGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFu eSBsYXRlciB2ZXJzaW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNs dWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4K KyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2lu Y2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUg PGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxs aW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcHJlZmV0Y2guaD4KKyNpbmNsdWRlIDxs aW51eC9jbGsuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IvZ2FkZ2V0Lmg+CisjaW5jbHVkZSA8bGlu dXgvb2YuaD4KKyNpbmNsdWRlIDxsaW51eC9vZl9ncGlvLmg+CisjaW5jbHVkZSA8bGludXgvcmVn bWFwLmg+CisjaW5jbHVkZSA8bGludXgvZG1hLW1hcHBpbmcuaD4KKworI2luY2x1ZGUgInZodWIu aCIKKworI2RlZmluZSBFWFRSQV9DSEVDS1MKKworI2lmZGVmIEVYVFJBX0NIRUNLUworI2RlZmlu ZSBDSEVDSyhlcCwgZXhwciwgZm10Li4uKSAJCQkJXAorCWRvIHsJCQkJCQkJXAorCQlpZiAoIShl eHByKSkgRVBEQkcoZXAsICJDSEVDSzoiIGZtdCk7CQlcCisJfSB3aGlsZSgwKQorI2Vsc2UKKyNk ZWZpbmUgQ0hFQ0soZXAsIGV4cHIsIGZtdC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKwor c3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2tpY2soc3RydWN0IGFzdF92aHViX2VwICplcCwgc3Ry dWN0IGFzdF92aHViX3JlcSAqcmVxKQoreworCXVuc2lnbmVkIGludCBhY3QgPSByZXEtPnJlcS5h Y3R1YWw7CisJdW5zaWduZWQgaW50IGxlbiA9IHJlcS0+cmVxLmxlbmd0aDsKKwl1bnNpZ25lZCBp bnQgY2h1bms7CisKKwkvKiBUaGVyZSBzaG91bGQgYmUgbm8gRE1BIG9uZ29pbmcgKi8KKwlXQVJO X09OKHJlcS0+YWN0aXZlKTsKKworCS8qIENhbGN1bGF0ZSBuZXh0IGNodW5rIHNpemUgKi8KKwlj aHVuayA9IGxlbiAtIGFjdDsKKwlpZiAoY2h1bmsgPiBlcC0+ZXAubWF4cGFja2V0KQorCQljaHVu ayA9IGVwLT5lcC5tYXhwYWNrZXQ7CisJZWxzZSBpZiAoKGNodW5rIDwgZXAtPmVwLm1heHBhY2tl dCkgfHwgIXJlcS0+cmVxLnplcm8pCisJCXJlcS0+bGFzdF9kZXNjID0gMTsKKworCUVQVkRCRyhl cCwgImtpY2sgcmVxICVwIGFjdD0lZC8lZCBjaHVuaz0lZCBsYXN0PSVkXG4iLAorCSAgICAgICBy ZXEsIGFjdCwgbGVuLCBjaHVuaywgcmVxLT5sYXN0X2Rlc2MpOworCisJLyogSWYgRE1BIHVuYXZh aWxhYmxlLCB1c2luZyBzdGFnaW5nIEVQIGJ1ZmZlciAqLworCWlmICghcmVxLT5yZXEuZG1hKSB7 CisKKwkJLyogRm9yIElOIHRyYW5zZmVycywgY29weSBkYXRhIG92ZXIgZmlyc3QgKi8KKwkJaWYg KGVwLT5lcG4uaXNfaW4pCisJCQltZW1jcHkoZXAtPmJ1ZiwgcmVxLT5yZXEuYnVmICsgYWN0LCBj aHVuayk7CisJCXdyaXRlbChlcC0+YnVmX2RtYSwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBf REVTQ19CQVNFKTsKKwl9IGVsc2UKKwkJd3JpdGVsKHJlcS0+cmVxLmRtYSArIGFjdCwgZXAtPmVw bi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19CQVNFKTsKKworCS8qIFN0YXJ0IERNQSAqLworCXJl cS0+YWN0aXZlID0gdHJ1ZTsKKwl3cml0ZWwoVkhVQl9FUF9ETUFfU0VUX1RYX1NJWkUoY2h1bmsp LAorCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJd3Jp dGVsKFZIVUJfRVBfRE1BX1NFVF9UWF9TSVpFKGNodW5rKSB8IFZIVUJfRVBfRE1BX1NJTkdMRV9L SUNLLAorCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7Cit9 CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9oYW5kbGVfYWNrKHN0cnVjdCBhc3Rfdmh1Yl9l cCAqZXApCit7CisJc3RydWN0IGFzdF92aHViX3JlcSAqcmVxOworCXVuc2lnbmVkIGludCBsZW47 CisJdTMyIHN0YXQ7CisKKwkvKiBSZWFkIEVQIHN0YXR1cyAqLworCXN0YXQgPSByZWFkbChlcC0+ ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisKKwkvKiBHcmFiIGN1cnJlbnQg cmVxdWVzdCBpZiBhbnkgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoJmVwLT5x dWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOworCisJRVBWREJHKGVwLCAiQUNLIHN0 YXR1cz0lMDh4IGlzX2luPSVkLCByZXE9JXAgKGFjdGl2ZT0lZClcbiIsCisJICAgICAgIHN0YXQs IGVwLT5lcG4uaXNfaW4sIHJlcSwgcmVxID8gcmVxLT5hY3RpdmUgOiAwKTsKKworCS8qIEluIGFi c2VuY2Ugb2YgYSByZXF1ZXN0LCBiYWlsIG91dCwgbXVzdCBoYXZlIGJlZW4gZGVxdWV1ZWQgKi8K KwlpZiAoIXJlcSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBSZXF1ZXN0IG5vdCBhY3RpdmUsIG1v dmUgb24gdG8gcHJvY2Vzc2luZyBxdWV1ZSwgYWN0aXZlIHJlcXVlc3QKKwkgKiB3YXMgcHJvYmFi bHkgZGVxdWV1ZWQKKwkgKi8KKwlpZiAoIXJlcS0+YWN0aXZlKQorCQlnb3RvIG5leHRfY2h1bms7 CisKKwkvKiBDaGVjayBpZiBIVyBoYXMgbW92ZWQgb24gKi8KKwlpZiAoVkhVQl9FUF9ETUFfUlBU UihzdGF0KSAhPSAwKSB7CisJCUVQREJHKGVwLCAiRE1BIHJlYWQgcG9pbnRlciBub3QgMCAhXG4i KTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5vIGN1cnJlbnQgRE1BIG9uZ29pbmcgKi8KKwlyZXEt PmFjdGl2ZSA9IGZhbHNlOworCisJLyogR3JhYiBsZW5naHQgb3V0IG9mIEhXICovCisJbGVuID0g VkhVQl9FUF9ETUFfVFhfU0laRShzdGF0KTsKKworCS8qIElmIG5vdCB1c2luZyBETUEsIGNvcHkg ZGF0YSBvdXQgaWYgbmVlZGVkICovCisJaWYgKCFyZXEtPnJlcS5kbWEgJiYgIWVwLT5lcG4uaXNf aW4gJiYgbGVuKQorCQltZW1jcHkocmVxLT5yZXEuYnVmICsgcmVxLT5yZXEuYWN0dWFsLCBlcC0+ YnVmLCBsZW4pOworCisJLyogQWRqdXN0IHNpemUgKi8KKwlyZXEtPnJlcS5hY3R1YWwgKz0gbGVu OworCisJLyogQ2hlY2sgZm9yIHNob3J0IHBhY2tldCAqLworCWlmIChsZW4gPCBlcC0+ZXAubWF4 cGFja2V0KQorCQlyZXEtPmxhc3RfZGVzYyA9IDE7CisKKwkvKiBUaGF0J3MgaXQgPyBjb21wbGV0 ZSB0aGUgcmVxdWVzdCBhbmQgcGljayBhIG5ldyBvbmUgKi8KKwlpZiAocmVxLT5sYXN0X2Rlc2Mg Pj0gMCkgeworCQlhc3Rfdmh1Yl9kb25lKGVwLCByZXEsIDApOworCQlyZXEgPSBsaXN0X2ZpcnN0 X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwKKwkJCQkJICAg ICAgIHF1ZXVlKTsKKworCQkvKgorCQkgKiBEdWUgdG8gbG9jayBkcm9wcGluZyBpbnNpZGUgImRv bmUiIHRoZSBuZXh0IHJlcXVlc3QgY291bGQKKwkJICogYWxyZWFkeSBiZSBhY3RpdmUsIHNvIGNo ZWNrIGZvciB0aGF0IGFuZCBiYWlsIGlmIG5lZWRlZC4KKwkJICovCisJCWlmICghcmVxIHx8IHJl cS0+YWN0aXZlKQorCQkJcmV0dXJuOworCX0KKworIG5leHRfY2h1bms6CisJYXN0X3ZodWJfZXBu X2tpY2soZXAsIHJlcSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGFzdF92aHVi X2NvdW50X2ZyZWVfZGVzY3Moc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwkvKgorCSAqIGRf bmV4dCA9PSBkX2xhc3QgbWVhbnMgZGVzY3JpcHRvciBsaXN0IGVtcHR5IHRvIEhXLAorCSAqIHRo dXMgd2UgY2FuIG9ubHkgaGF2ZSBBU1RfVkhVQl9ERVNDU19DT1VOVC0xIGRlc2NyaXB0b3JzCisJ ICogaW4gdGhlIGxpc3QKKwkgKi8KKwlyZXR1cm4gKGVwLT5lcG4uZF9sYXN0ICsgQVNUX1ZIVUJf REVTQ1NfQ09VTlQgLSBlcC0+ZXBuLmRfbmV4dCAtIDEpICYKKwkJKEFTVF9WSFVCX0RFU0NTX0NP VU5UIC0gMSk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX2Vwbl9raWNrX2Rlc2Moc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCQkgICBzdHJ1Y3QgYXN0X3ZodWJfcmVxICpyZXEpCit7CisJ dW5zaWduZWQgaW50IGFjdCA9IHJlcS0+YWN0X2NvdW50OworCXVuc2lnbmVkIGludCBsZW4gPSBy ZXEtPnJlcS5sZW5ndGg7CisJdW5zaWduZWQgaW50IGNodW5rOworCisJLyogTWFyayByZXF1ZXN0 IGFjdGl2ZSBpZiBub3QgYWxyZWFkeSAqLworCXJlcS0+YWN0aXZlID0gdHJ1ZTsKKworCS8qIElm IHRoZSByZXF1ZXN0IHdhcyBhbHJlYWR5IGNvbXBsZXRlbHkgd3JpdHRlbiwgZG8gbm90aGluZyAq LworCWlmIChyZXEtPmxhc3RfZGVzYyA+PSAwKQorCQlyZXR1cm47CisKKwlFUFZEQkcoZXAsICJr aWNrIGFjdD0lZC8lZCBjaHVua19tYXg9JWQgZnJlZV9kZXNjcz0lZFxuIiwKKwkgICAgICAgYWN0 LCBsZW4sIGVwLT5lcG4uY2h1bmtfbWF4LCBhc3Rfdmh1Yl9jb3VudF9mcmVlX2Rlc2NzKGVwKSk7 CisKKwkvKiBXaGlsZSB3ZSBjYW4gY3JlYXRlIGRlc2NyaXB0b3JzICovCisJd2hpbGUgKGFzdF92 aHViX2NvdW50X2ZyZWVfZGVzY3MoZXApICYmIHJlcS0+bGFzdF9kZXNjIDwgMCkgeworCQlzdHJ1 Y3QgYXN0X3ZodWJfZGVzYyAqZGVzYzsKKwkJdW5zaWduZWQgaW50IGRfbnVtOworCisJCS8qIEdy YWIgbmV4dCBmcmVlIGRlc2NyaXB0b3IgKi8KKwkJZF9udW0gPSBlcC0+ZXBuLmRfbmV4dDsKKwkJ ZGVzYyA9ICZlcC0+ZXBuLmRlc2NzW2RfbnVtXTsKKwkJZXAtPmVwbi5kX25leHQgPSAoZF9udW0g KyAxKSAmIChBU1RfVkhVQl9ERVNDU19DT1VOVCAtIDEpOworCisJCS8qIENhbGN1bGF0ZSBuZXh0 IGNodW5rIHNpemUgKi8KKwkJY2h1bmsgPSBsZW4gLSBhY3Q7CisJCWlmIChjaHVuayA8PSBlcC0+ ZXBuLmNodW5rX21heCkgeworCQkJLyoKKwkJCSAqIElzIHRoaXMgdGhlIGxhc3QgcGFja2V0ID8g QmVjYXVzZSBvZiBoYXZpbmcgdXAgdG8gOAorCQkJICogcGFja2VzIGluIGEgZGVzY3JpcHRvciB3 ZSBjYW4ndCBqdXN0IGNvbXBhcmUgImNodW5rIgorCQkJICogd2l0aCBlcC5tYXhwYWNrZXQuIFdl IGhhdmUgdG8gc2VlIGlmIGl0J3MgYSBtdWx0aXBsZQorCQkJICogb2YgaXQgdG8ga25vdyBpZiB3 ZSBoYXZlIHRvIHNlbmQgYSB6ZXJvIHBhY2tldC4KKwkJCSAqIFNhZGx5IHRoYXQgaW52b2x2ZXMg YSBtb2R1bG8gd2hpY2ggaXMgYSBiaXQgZXhwZW5zaXZlCisJCQkgKiBidXQgcHJvYmFibHkgc3Rp bGwgYmV0dGVyIHRoYW4gbm90IGRvaW5nIGl0LgorCQkJICovCisJCQlpZiAoIXJlcS0+cmVxLnpl cm8gfHwgKGNodW5rICUgZXAtPmVwLm1heHBhY2tldCkgIT0gMCkKKwkJCQlyZXEtPmxhc3RfZGVz YyA9IGRfbnVtOworCQl9IGVsc2UgeworCQkJY2h1bmsgPSBlcC0+ZXBuLmNodW5rX21heDsKKwkJ fQorCisJCUVQVkRCRyhlcCwgIiBjaHVuazogYWN0PSVkLyVkIGNodW5rPSVkIGxhc3Q9JWQgZGVz Yz0lZCBmcmVlPSVkXG4iLAorCQkgICAgICAgYWN0LCBsZW4sIGNodW5rLCByZXEtPmxhc3RfZGVz YywgZF9udW0sCisJCSAgICAgICBhc3Rfdmh1Yl9jb3VudF9mcmVlX2Rlc2NzKGVwKSk7CisKKwkJ LyogUG9wdWxhdGUgZGVzY3JpcHRvciAqLworCQlkZXNjLT53MCA9IGNwdV90b19sZTMyKHJlcS0+ cmVxLmRtYSArIGFjdCk7CisKKwkJLyogSW50ZXJydXB0IGlmIGVuZCBvZiByZXF1ZXN0IG9yIG5v IG1vcmUgZGVzY3JpcHRvcnMgKi8KKworCQkvKgorCQkgKiBUT0RPOiBCZSBzbWFydGVyIGFib3V0 IGl0LCBpZiB3ZSBkb24ndCBoYXZlIGVub3VnaAorCQkgKiBkZXNjcmlwdG9ycyByZXF1ZXN0IGFu IGludGVycnVwdCBiZWZvcmUgcXVldWUgZW1wdHkKKwkJICogb3Igc28gaW4gb3JkZXIgdG8gYmUg YWJsZSB0byBwb3B1bGF0ZSBtb3JlIGJlZm9yZQorCQkgKiB0aGUgSFcgcnVucyBvdXQuIFRoaXMg aXNuJ3QgYSBwcm9ibGVtIGF0IHRoZSBtb21lbnQKKwkJICogYXMgd2UgdXNlIDI1NiBkZXNjcmlw dG9ycyBhbmQgb25seSBwdXQgYXQgbW9zdCBvbmUKKwkJICogcmVxdWVzdCBpbiB0aGUgcmluZy4K KwkJICovCisJCWRlc2MtPncxID0gY3B1X3RvX2xlMzIoVkhVQl9EU0MxX0lOX1NFVF9MRU4oY2h1 bmspKTsKKwkJaWYgKHJlcS0+bGFzdF9kZXNjID49IDAgfHwgIWFzdF92aHViX2NvdW50X2ZyZWVf ZGVzY3MoZXApKQorCQkJZGVzYy0+dzEgfD0gY3B1X3RvX2xlMzIoVkhVQl9EU0MxX0lOX0lOVEVS UlVQVCk7CisKKwkJLyogQWNjb3VudCBwYWNrZXQgKi8KKwkJcmVxLT5hY3RfY291bnQgPSBhY3Qg PSBhY3QgKyBjaHVuazsKKwl9CisKKwkvKiBUZWxsIEhXIGFib3V0IG5ldyBkZXNjcmlwdG9ycyAq LworCXdyaXRlbChWSFVCX0VQX0RNQV9TRVRfQ1BVX1dQVFIoZXAtPmVwbi5kX25leHQpLAorCSAg ICAgICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisKKwlFUFZEQkco ZXAsICJIVyBraWNrZWQsIGRfbmV4dD0lZCBkc3RhdD0lMDh4XG4iLAorCSAgICAgICBlcC0+ZXBu LmRfbmV4dCwgcmVhZGwoZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpKTsK K30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2tfZGVzYyhzdHJ1Y3QgYXN0 X3ZodWJfZXAgKmVwKQoreworCXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwl1bnNpZ25lZCBp bnQgbGVuLCBkX2xhc3Q7CisJdTMyIHN0YXQsIHN0YXQxOworCisJLyogUmVhZCBFUCBzdGF0dXMs IHdvcmthcm91bmQgSFcgcmFjZSAqLworCWRvIHsKKwkJc3RhdCA9IHJlYWRsKGVwLT5lcG4ucmVn cyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKwkJc3RhdDEgPSByZWFkbChlcC0+ZXBuLnJl Z3MgKyBBU1RfVkhVQl9FUF9ERVNDX1NUQVRVUyk7CisJfSB3aGlsZShzdGF0ICE9IHN0YXQxKTsK KworCS8qIEV4dHJhY3QgUlBUUiAqLworCWRfbGFzdCA9IFZIVUJfRVBfRE1BX1JQVFIoc3RhdCk7 CisKKwkvKiBHcmFiIGN1cnJlbnQgcmVxdWVzdCBpZiBhbnkgKi8KKwlyZXEgPSBsaXN0X2ZpcnN0 X2VudHJ5X29yX251bGwoJmVwLT5xdWV1ZSwgc3RydWN0IGFzdF92aHViX3JlcSwgcXVldWUpOwor CisJRVBWREJHKGVwLCAiQUNLIHN0YXR1cz0lMDh4IGlzX2luPSVkIGVwLT5kX2xhc3Q9JWQuLiVk XG4iLAorCSAgICAgICBzdGF0LCBlcC0+ZXBuLmlzX2luLCBlcC0+ZXBuLmRfbGFzdCwgZF9sYXN0 KTsKKworCS8qIENoZWNrIGFsbCBjb21wbGV0ZWQgZGVzY3JpcHRvcnMgKi8KKwl3aGlsZSAoZXAt PmVwbi5kX2xhc3QgIT0gZF9sYXN0KSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9kZXNjICpkZXNjOwor CQl1bnNpZ25lZCBpbnQgZF9udW07CisJCWJvb2wgaXNfbGFzdF9kZXNjOworCisJCS8qIEdyYWIg bmV4dCBjb21wbGV0ZWQgZGVzY3JpcHRvciAqLworCQlkX251bSA9IGVwLT5lcG4uZF9sYXN0Owor CQlkZXNjID0gJmVwLT5lcG4uZGVzY3NbZF9udW1dOworCQllcC0+ZXBuLmRfbGFzdCA9IChkX251 bSArIDEpICYgKEFTVF9WSFVCX0RFU0NTX0NPVU5UIC0gMSk7CisKKwkJLyogR3JhYiBsZW4gb3V0 IG9mIGRlc2NyaXB0b3IgKi8KKwkJbGVuID0gVkhVQl9EU0MxX0lOX0xFTihkZXNjLT53MSk7CisK KwkJRVBWREJHKGVwLCAiIGRlc2MgJWQgbGVuPSVkIHJlcT0lcCAoYWN0PSVkKVxuIiwKKwkJICAg ICAgIGRfbnVtLCBsZW4sIHJlcSwgcmVxID8gcmVxLT5hY3RpdmUgOiAwKTsKKworCQkvKiBJZiBu byBhY3RpdmUgcmVxdWVzdCBwZW5kaW5nLCBtb3ZlIG9uICovCisJCWlmICghcmVxIHx8ICFyZXEt PmFjdGl2ZSkKKwkJCWNvbnRpbnVlOworCisJCS8qIEFkanVzdCBzaXplICovCisJCXJlcS0+cmVx LmFjdHVhbCArPSBsZW47CisKKwkJLyogSXMgdGhhdCB0aGUgbGFzdCBjaHVuayA/ICovCisJCWlz X2xhc3RfZGVzYyA9IHJlcS0+bGFzdF9kZXNjID09IGRfbnVtOworCQlDSEVDSyhlcCwgaXNfbGFz dF9kZXNjID09IChsZW4gPCBlcC0+ZXAubWF4cGFja2V0IHx8CisJCQkJCSAgIChyZXEtPnJlcS5h Y3R1YWwgPj0gcmVxLT5yZXEubGVuZ3RoICYmCisJCQkJCSAgICAhcmVxLT5yZXEuemVybykpLAor CQkgICAgICAiTGFzdCBwYWNrZXQgZGlzY3JlcGFuY3k6IGxhc3RfZGVzYz0lZCBsZW49JWQgci5h Y3Q9JWQgIgorCQkgICAgICAici5sZW49JWQgci56ZXJvPSVkIG1wPSVkXG4iLAorCQkgICAgICBp c19sYXN0X2Rlc2MsIGxlbiwgcmVxLT5yZXEuYWN0dWFsLCByZXEtPnJlcS5sZW5ndGgsCisJCSAg ICAgIHJlcS0+cmVxLnplcm8sIGVwLT5lcC5tYXhwYWNrZXQpOworCisJCWlmIChpc19sYXN0X2Rl c2MpIHsKKwkJCS8qCisJCQkgKiBCZWNhdXNlIHdlIGNhbiBvbmx5IGhhdmUgb25lIHJlcXVlc3Qg YXQgYSB0aW1lCisJCQkgKiBpbiBvdXIgZGVzY3JpcHRvciBsaXN0IGluIHRoaXMgaW1wbGVtZW50 YXRpb24sCisJCQkgKiBkX2xhc3QgYW5kIGVwLT5kX2xhc3Qgc2hvdWxkIG5vdyBiZSBlcXVhbAor CQkJICovCisJCQlDSEVDSyhlcCwgZF9sYXN0ID09IGVwLT5lcG4uZF9sYXN0LAorCQkJICAgICAg IkRNQSByZWFkIHB0ciBtaXNtYXRjaCAlZCB2cyAlZFxuIiwKKwkJCSAgICAgIGRfbGFzdCwgZXAt PmVwbi5kX2xhc3QpOworCisJCQkvKiBOb3RlOiBkb25lIHdpbGwgZHJvcCBhbmQgcmUtYWNxdWly ZSB0aGUgbG9jayAqLworCQkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAwKTsKKwkJCXJlcSA9IGxp c3RfZmlyc3RfZW50cnlfb3JfbnVsbCgmZXAtPnF1ZXVlLAorCQkJCQkJICAgICAgIHN0cnVjdCBh c3Rfdmh1Yl9yZXEsCisJCQkJCQkgICAgICAgcXVldWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisK KwkvKiBNb3JlIHdvcmsgPyAqLworCWlmIChyZXEpCisJCWFzdF92aHViX2Vwbl9raWNrX2Rlc2Mo ZXAsIHJlcSk7Cit9CisKK3ZvaWQgYXN0X3ZodWJfZXBuX2Fja19pcnEoc3RydWN0IGFzdF92aHVi X2VwICplcCkKK3sKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpCisJCWFzdF92aHViX2Vwbl9oYW5k bGVfYWNrX2Rlc2MoZXApOworCWVsc2UKKwkJYXN0X3ZodWJfZXBuX2hhbmRsZV9hY2soZXApOwor fQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vwbl9xdWV1ZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBz dHJ1Y3QgdXNiX3JlcXVlc3QgKnVfcmVxLAorCQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzKQorewor CXN0cnVjdCBhc3Rfdmh1Yl9yZXEgKnJlcSA9IHRvX2FzdF9yZXEodV9yZXEpOworCXN0cnVjdCBh c3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisJc3RydWN0IGFzdF92aHViICp2aHVi ID0gZXAtPnZodWI7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlib29sIGVtcHR5OworCWludCBy YzsKKworCS8qIFBhcmFub2lkIGNoZWNrcyAqLworCWlmICghdV9yZXEgfHwgIXVfcmVxLT5jb21w bGV0ZSB8fCAhdV9yZXEtPmJ1ZiB8fAorCSAgICAhbGlzdF9lbXB0eSgmcmVxLT5xdWV1ZSkpIHsK KwkJZGV2X3dhcm4oJnZodWItPnBkZXYtPmRldiwgIkJvZ3VzIHJlcXVlc3QgIVxuIik7CisJCXJl dHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuZHBvaW50IGVuYWJsZWQgPyAqLworCWlmICghZXAt PmVwbi5lbmFibGVkIHx8ICF1X2VwLT5kZXNjIHx8ICFlcC0+ZGV2IHx8ICFlcC0+ZF9pZHggfHwK KwkgICAgIWVwLT5kZXYtPmVuYWJsZWQgfHwgZXAtPmRldi0+c3VzcGVuZGVkKSB7CisJCUVQREJH KGVwLCJFbnF1ZWluZyByZXF1ZXN0IG9uIHdyb25nIG9yIGRpc2FibGVkIEVQXG4iKTsKKwkJcmV0 dXJuIC1FU0hVVERPV047CisJfQorCisJLyogTWFwIHJlcXVlc3QgZm9yIERNQSBpZiBwb3NzaWJs ZS4gRm9yIG5vdywgdGhlIHJ1bGUgZm9yIERNQSBpcworCSAqIHRoYXQ6CisJICoKKwkgKiAgKiBG b3Igc2luZ2xlIHN0YWdlIG1vZGUgKG5vIGRlc2NyaXB0b3JzKToKKwkgKgorCSAqICAgLSBUaGUg YnVmZmVyIGlzIGFsaWduZWQgdG8gYSA4IGJ5dGVzIGJvdW5kYXJ5IChIVyByZXF1aXJlbWVudCkK KwkgKiAgIC0gRm9yIGEgT1VUIGVuZHBvaW50LCB0aGUgcmVxdWVzdCBzaXplIGlzIGEgbXVsdGlw bGUgb2YgdGhlIEVQCisJICogICAgIHBhY2tldCBzaXplIChvdGhlcndpc2UgdGhlIGNvbnRyb2xs ZXIgd2lsbCBETUEgcGFzdCB0aGUgZW5kCisJICogICAgIG9mIHRoZSBidWZmZXIgaWYgdGhlIGhv c3QgaXMgc2VuZGluZyBhIHRvbyBsb25nIHBhY2tldCkuCisJICoKKwkgKiAgKiBGb3IgZGVzY3Jp cHRvciBtb2RlICh0eCBvbmx5IGZvciBub3cpLCBhbHdheXMuCisJICoKKwkgKiBXZSBjb3VsZCBy ZWxheCB0aGUgbGF0dGVyIGJ5IG1ha2luZyB0aGUgZGVjaXNpb24gdG8gdXNlIHRoZSBib3VuY2UK KwkgKiBidWZmZXIgYmFzZWQgb24gdGhlIHNpemUgb2YgYSBnaXZlbiAqc2VnbWVudCogb2YgdGhl IHJlcXVlc3QgcmF0aGVyCisJICogdGhhbiB0aGUgd2hvbGUgcmVxdWVzdC4KKwkgKi8KKwlpZiAo ZXAtPmVwbi5kZXNjX21vZGUgfHwKKwkgICAgKCgoKHVuc2lnbmVkIGxvbmcpdV9yZXEtPmJ1ZiAm IDcpID09IDApICYmCisJICAgICAoZXAtPmVwbi5pc19pbiB8fCAhKHVfcmVxLT5sZW5ndGggJiAo dV9lcC0+bWF4cGFja2V0IC0gMSkpKSkpIHsKKwkJcmMgPSB1c2JfZ2FkZ2V0X21hcF9yZXF1ZXN0 KCZlcC0+ZGV2LT5nYWRnZXQsIHVfcmVxLAorCQkJCQkgICAgZXAtPmVwbi5pc19pbik7CisJCWlm IChyYykgeworCQkJZGV2X3dhcm4oJnZodWItPnBkZXYtPmRldiwKKwkJCQkgIlJlcXVlc3QgbWFw cGluZyBmYWlsdXJlICVkXG4iLCByYyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwl9IGVsc2UKKwkJ dV9yZXEtPmRtYSA9IDA7CisKKwlFUFZEQkcoZXAsICJlbnF1ZXVlIHJlcSBAJXBcbiIsIHJlcSk7 CisJRVBWREJHKGVwLCAiIGw9JWQgZG1hPTB4JXggemVybz0lZCBub3Nob3J0PSVkIG5vaXJxPSVk IGlzX2luPSVkXG4iLAorCSAgICAgICB1X3JlcS0+bGVuZ3RoLCAodTMyKXVfcmVxLT5kbWEsIHVf cmVxLT56ZXJvLAorCSAgICAgICB1X3JlcS0+c2hvcnRfbm90X29rLCB1X3JlcS0+bm9faW50ZXJy dXB0LAorCSAgICAgICBlcC0+ZXBuLmlzX2luKTsKKworCS8qIEluaXRpYWxpemUgcmVxdWVzdCBw cm9ncmVzcyBmaWVsZHMgKi8KKwl1X3JlcS0+c3RhdHVzID0gLUVJTlBST0dSRVNTOworCXVfcmVx LT5hY3R1YWwgPSAwOworCXJlcS0+YWN0X2NvdW50ID0gMDsKKwlyZXEtPmFjdGl2ZSA9IGZhbHNl OworCXJlcS0+bGFzdF9kZXNjID0gLTE7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnZodWItPmxvY2ss IGZsYWdzKTsKKwllbXB0eSA9IGxpc3RfZW1wdHkoJmVwLT5xdWV1ZSk7CisKKwkvKiBBZGQgcmVx dWVzdCB0byBsaXN0IGFuZCBraWNrIHByb2Nlc3NpbmcgaWYgZW1wdHkgKi8KKwlsaXN0X2FkZF90 YWlsKCZyZXEtPnF1ZXVlLCAmZXAtPnF1ZXVlKTsKKwlpZiAoZW1wdHkpIHsKKwkJaWYgKGVwLT5l cG4uZGVzY19tb2RlKQorCQkJYXN0X3ZodWJfZXBuX2tpY2tfZGVzYyhlcCwgcmVxKTsKKwkJZWxz ZQorCQkJYXN0X3ZodWJfZXBuX2tpY2soZXAsIHJlcSk7CisJfQorCXNwaW5fdW5sb2NrX2lycXJl c3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBhc3Rfdmh1Yl9zdG9wX2FjdGl2ZV9yZXEoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkg ICAgIGJvb2wgcmVzdGFydF9lcCkKK3sKKwl1MzIgc3RhdGUsIHJlZywgbG9vcHM7CisKKwkvKiBT dG9wIERNQSBhY3Rpdml0eSAqLworCXdyaXRlbCgwLCBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9F UF9ETUFfQ1RMU1RBVCk7CisKKwkvKiBXYWl0IGZvciBpdCB0byBjb21wbGV0ZSAqLworCWZvciAo bG9vcHMgPSAwOyBsb29wcyA8IDEwMDA7IGxvb3BzKyspIHsKKwkJc3RhdGUgPSByZWFkbChlcC0+ ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJCXN0YXRlID0gVkhVQl9FUF9E TUFfUFJPQ19TVEFUVVMoc3RhdGUpOworCQlpZiAoc3RhdGUgPT0gRVBfRE1BX1BST0NfUlhfSURM RSB8fAorCQkgICAgc3RhdGUgPT0gRVBfRE1BX1BST0NfVFhfSURMRSkKKwkJCWJyZWFrOworCQl1 ZGVsYXkoMSk7CisJfQorCWlmIChsb29wcyA+PSAxMDAwKQorCQlkZXZfd2FybigmZXAtPnZodWIt PnBkZXYtPmRldiwgIlRpbWVvdXQgd2FpdGluZyBmb3IgRE1BXG4iKTsKKworCS8qIElmIHdlIGRv bid0IGhhdmUgdG8gcmVzdGFydCB0aGUgZW5kcG9pbnQsIHRoYXQncyBpdCAqLworCWlmICghcmVz dGFydF9lcCkKKwkJcmV0dXJuOworCisJLyogUmVzdGFydCB0aGUgZW5kcG9pbnQgKi8KKwlpZiAo ZXAtPmVwbi5kZXNjX21vZGUpIHsKKwkJLyoKKwkJICogVGFrZSBvdXQgZGVzY3JpcHRvcnMgYnkg cmVzZXR0aW5nIHRoZSBETUEgcmVhZAorCQkgKiBwb2ludGVyIHRvIGJlIGVxdWFsIHRvIHRoZSBD UFUgd3JpdGUgcG9pbnRlci4KKwkJICoKKwkJICogTm90ZTogSWYgd2UgZXZlciBzdXBwb3J0IGNy ZWF0aW5nIGRlc2NyaXB0b3JzIGZvcgorCQkgKiByZXF1ZXN0cyB0aGF0IGFyZW4ndCB0aGUgaGVh ZCBvZiB0aGUgcXVldWUsIHdlCisJCSAqIG1heSBoYXZlIHRvIGRvIHNvbWV0aGluZyBtb3JlIGNv bXBsZXggaGVyZSwKKwkJICogZXNwZWNpYWxseSBpZiB0aGUgcmVxdWVzdCBiZWluZyB0YWtlbiBv dXQgaXMKKwkJICogbm90IHRoZSBjdXJyZW50IGhlYWQgZGVzY3JpcHRvcnMuCisJCSAqLworCQly ZWcgPSBWSFVCX0VQX0RNQV9TRVRfUlBUUihlcC0+ZXBuLmRfbmV4dCkgfAorCQkJVkhVQl9FUF9E TUFfU0VUX0NQVV9XUFRSKGVwLT5lcG4uZF9uZXh0KTsKKwkJd3JpdGVsKHJlZywgZXAtPmVwbi5y ZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFUVVMpOworCisJCS8qIFRoZW4gdHVybiBpdCBiYWNr IG9uICovCisJCXdyaXRlbChlcC0+ZXBuLmRtYV9jb25mLAorCQkgICAgICAgZXAtPmVwbi5yZWdz ICsgQVNUX1ZIVUJfRVBfRE1BX0NUTFNUQVQpOworCX0gZWxzZSB7CisJCS8qIFNpbmdsZSBtb2Rl OiBqdXN0IHR1cm4gaXQgYmFjayBvbiAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiwKKwkJ ICAgICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKwl9Cit9CisK K3N0YXRpYyBpbnQgYXN0X3ZodWJfZXBuX2RlcXVldWUoc3RydWN0IHVzYl9lcCogdV9lcCwgc3Ry dWN0IHVzYl9yZXF1ZXN0ICp1X3JlcSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9f YXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHViOworCXN0cnVj dCBhc3Rfdmh1Yl9yZXEgKnJlcTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByYyA9IC1F SU5WQUw7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyog TWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgcXVldWVkIG9uIHRoaXMgZW5kcG9pbnQgKi8KKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5IChyZXEsICZlcC0+cXVldWUsIHF1ZXVlKSB7CisJCWlmICgmcmVxLT5y ZXEgPT0gdV9yZXEpCisJCQlicmVhazsKKwl9CisKKwlpZiAoJnJlcS0+cmVxID09IHVfcmVxKSB7 CisJCUVQVkRCRyhlcCwgImRlcXVldWUgcmVxIEAlcCBhY3RpdmU9JWRcbiIsCisJCSAgICAgICBy ZXEsIHJlcS0+YWN0aXZlKTsKKwkJaWYgKHJlcS0+YWN0aXZlKQorCQkJYXN0X3ZodWJfc3RvcF9h Y3RpdmVfcmVxKGVwLCB0cnVlKTsKKwkJYXN0X3ZodWJfZG9uZShlcCwgcmVxLCAtRUNPTk5SRVNF VCk7CisJCXJjID0gMDsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2Nr LCBmbGFncyk7CisJcmV0dXJuIHJjOworfQorCit2b2lkIGFzdF92aHViX3VwZGF0ZV9lcG5fc3Rh bGwoc3RydWN0IGFzdF92aHViX2VwICplcCkKK3sKKwl1MzIgcmVnOworCisJaWYgKFdBUk5fT04o ZXAtPmRfaWR4ID09IDApKQorCQlyZXR1cm47CisJcmVnID0gcmVhZGwoZXAtPmVwbi5yZWdzICsg QVNUX1ZIVUJfRVBfQ09ORklHKTsKKwlpZiAoZXAtPmVwbi5zdGFsbGVkIHx8IGVwLT5lcG4ud2Vk Z2VkKQorCQlyZWcgfD0gVkhVQl9FUF9DRkdfU1RBTExfQ1RSTDsKKwllbHNlCisJCXJlZyAmPSB+ VkhVQl9FUF9DRkdfU1RBTExfQ1RSTDsKKwl3cml0ZWwocmVnLCBlcC0+ZXBuLnJlZ3MgKyBBU1Rf VkhVQl9FUF9DT05GSUcpOworCisJaWYgKCFlcC0+ZXBuLnN0YWxsZWQgJiYgIWVwLT5lcG4ud2Vk Z2VkKQorCQl3cml0ZWwoVkhVQl9FUF9UT0dHTEVfU0VUX0VQTlVNKGVwLT5lcG4uZ19pZHgpLAor CQkgICAgICAgZXAtPnZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9UT0dHTEUpOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX3NldF9oYWx0X2FuZF93ZWRnZShzdHJ1Y3QgdXNiX2VwKiB1X2VwLCBi b29sIGhhbHQsCisJCQkJICAgICAgYm9vbCB3ZWRnZSkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAg KmVwID0gdG9fYXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1YiAqdmh1YiA9IGVwLT52aHVi OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlFUERCRyhlcCwgIlNldCBoYWx0ICglZCkgJiB3 ZWRnZSAoJWQpXG4iLCBoYWx0LCB3ZWRnZSk7CisKKwlpZiAoIXVfZXAgfHwgIXVfZXAtPmRlc2Mp CisJCXJldHVybiAtRUlOVkFMOworCWlmIChlcC0+ZF9pZHggPT0gMCkKKwkJcmV0dXJuIDA7CisJ aWYgKGVwLT5lcG4uaXNfaXNvKQorCQlyZXR1cm4gLUVPUE5PVFNVUFA7CisKKwlzcGluX2xvY2tf aXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyogRmFpbCB3aXRoIHN0aWxsLWJ1c3kg SU4gZW5kcG9pbnRzICovCisJaWYgKGhhbHQgJiYgZXAtPmVwbi5pc19pbiAmJiAhbGlzdF9lbXB0 eSgmZXAtPnF1ZXVlKSkgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBm bGFncyk7CisJCXJldHVybiAtRUFHQUlOOworCX0KKwllcC0+ZXBuLnN0YWxsZWQgPSBoYWx0Owor CWVwLT5lcG4ud2VkZ2VkID0gd2VkZ2U7CisJYXN0X3ZodWJfdXBkYXRlX2Vwbl9zdGFsbChlcCk7 CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fc2V0X2hhbHQoc3RydWN0IHVzYl9l cCAqdV9lcCwgaW50IHZhbHVlKQoreworCXJldHVybiBhc3Rfdmh1Yl9zZXRfaGFsdF9hbmRfd2Vk Z2UodV9lcCwgdmFsdWUgIT0gMCwgZmFsc2UpOworfQorCitzdGF0aWMgaW50IGFzdF92aHViX2Vw bl9zZXRfd2VkZ2Uoc3RydWN0IHVzYl9lcCAqdV9lcCkKK3sKKwlyZXR1cm4gYXN0X3ZodWJfc2V0 X2hhbHRfYW5kX3dlZGdlKHVfZXAsIHRydWUsIHRydWUpOworfQorCitzdGF0aWMgaW50IGFzdF92 aHViX2Vwbl9kaXNhYmxlKHN0cnVjdCB1c2JfZXAqIHVfZXApCit7CisJc3RydWN0IGFzdF92aHVi X2VwICplcCA9IHRvX2FzdF9lcCh1X2VwKTsKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+ dmh1YjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXUzMiBpbWFzaywgZXBfaWVyOworCisJRVBE QkcoZXAsICJEaXNhYmxpbmcgIVxuIik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9j aywgZmxhZ3MpOworCisJZXAtPmVwbi5lbmFibGVkID0gZmFsc2U7CisKKwkvKiBTdG9wIGFjdGl2 ZSBETUEgaWYgYW55ICovCisJYXN0X3ZodWJfc3RvcF9hY3RpdmVfcmVxKGVwLCBmYWxzZSk7CisK KwkvKiBEaXNhYmxlIGVuZHBvaW50ICovCisJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFTVF9W SFVCX0VQX0NPTkZJRyk7CisKKwkvKiBEaXNhYmxlIEFDSyBpbnRlcnJ1cHQgKi8KKwlpbWFzayA9 IDEgPDwgZXAtPmVwbi5nX2lkeDsKKwllcF9pZXIgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZI VUJfRVBfQUNLX0lFUik7CisJZXBfaWVyICY9IH5pbWFzazsKKwl3cml0ZWwoZXBfaWVyLCB2aHVi LT5yZWdzICsgQVNUX1ZIVUJfRVBfQUNLX0lFUik7CisJd3JpdGVsKGltYXNrLCB2aHViLT5yZWdz ICsgQVNUX1ZIVUJfRVBfQUNLX0lTUik7CisKKwkvKiBOdWtlIGFsbCBwZW5kaW5nIHJlcXVlc3Rz ICovCisJYXN0X3ZodWJfbnVrZShlcCwgLUVTSFVURE9XTik7CisKKwkvKiBObyBtb3JlIGRlc2Ny aXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlcXVlc3QgKi8KKwllcC0+ZXAuZGVzYyA9IE5VTEw7CisK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4g MDsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9lcG5fZW5hYmxlKHN0cnVjdCB1c2JfZXAqIHVf ZXAsCisJCQkgICAgICAgY29uc3Qgc3RydWN0IHVzYl9lbmRwb2ludF9kZXNjcmlwdG9yICpkZXNj KQoreworCXN0YXRpYyBjb25zdCBjaGFyICplcF90eXBlX3N0cmluZ1tdIF9fbWF5YmVfdW51c2Vk ID0geyAiY3RybCIsCisJCQkJCQkJICAgICAgICJpc29jIiwKKwkJCQkJCQkgICAgICAgImJ1bGsi LAorCQkJCQkJCSAgICAgICAiaW50ciIgfTsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwID0gdG9f YXN0X2VwKHVfZXApOworCXN0cnVjdCBhc3Rfdmh1Yl9kZXYgKmRldjsKKwlzdHJ1Y3QgYXN0X3Zo dWIgKnZodWI7CisJdTE2IG1heHBhY2tldCwgdHlwZTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOwor CXUzMiBlcF9jb25mLCBlcF9pZXIsIGltYXNrOworCisJLyogQ2hlY2sgYXJndW1lbnRzICovCisJ aWYgKCF1X2VwIHx8ICFkZXNjKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1heHBhY2tldCA9IHVz Yl9lbmRwb2ludF9tYXhwKGRlc2MpOworCWlmICghZXAtPmRfaWR4IHx8ICFlcC0+ZGV2IHx8CisJ ICAgIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSAhPSBVU0JfRFRfRU5EUE9JTlQgfHwKKwkgICAgbWF4 cGFja2V0ID09IDAgfHwgbWF4cGFja2V0ID4gZXAtPmVwLm1heHBhY2tldCkgeworCQlFUERCRyhl cCwgIkludmFsaWQgRVAgZW5hYmxlLGRfaWR4PSVkLGRldj0lcCx0eXBlPSVkLG1wPSVkLyVkXG4i LAorCQkgICAgICBlcC0+ZF9pZHgsIGVwLT5kZXYsIGRlc2MtPmJEZXNjcmlwdG9yVHlwZSwKKwkJ ICAgICAgbWF4cGFja2V0LCBlcC0+ZXAubWF4cGFja2V0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJ fQorCWlmIChlcC0+ZF9pZHggIT0gdXNiX2VuZHBvaW50X251bShkZXNjKSkgeworCQlFUERCRyhl cCwgIkVQIG51bWJlciBtaXNtYXRjaCAhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJ aWYgKGVwLT5lcG4uZW5hYmxlZCkgeworCQlFUERCRyhlcCwgIkFscmVhZHkgZW5hYmxlZFxuIik7 CisJCXJldHVybiAtRUJVU1k7CisJfQorCWRldiA9IGVwLT5kZXY7CisJdmh1YiA9IGVwLT52aHVi OworCisJLyogQ2hlY2sgZGV2aWNlIHN0YXRlICovCisJaWYgKCFkZXYtPmRyaXZlcikgeworCQlF UERCRyhlcCwgIkJvZ3VzIGRldmljZSBzdGF0ZTogZHJpdmVyPSVwIHNwZWVkPSVkXG4iLAorCQkg ICAgICAgZGV2LT5kcml2ZXIsIGRldi0+Z2FkZ2V0LnNwZWVkKTsKKwkJcmV0dXJuIC1FU0hVVERP V047CisJfQorCisJLyogR3JhYiBzb21lIGluZm8gZnJvbSB0aGUgZGVzY3JpcHRvciAqLworCWVw LT5lcG4uaXNfaW4gPSB1c2JfZW5kcG9pbnRfZGlyX2luKGRlc2MpOworCWVwLT5lcC5tYXhwYWNr ZXQgPSBtYXhwYWNrZXQ7CisJdHlwZSA9IHVzYl9lbmRwb2ludF90eXBlKGRlc2MpOworCWVwLT5l cG4uZF9uZXh0ID0gZXAtPmVwbi5kX2xhc3QgPSAwOworCWVwLT5lcG4uaXNfaXNvID0gZmFsc2U7 CisJZXAtPmVwbi5zdGFsbGVkID0gZmFsc2U7CisJZXAtPmVwbi53ZWRnZWQgPSBmYWxzZTsKKwor CUVQREJHKGVwLCAiRW5hYmxpbmcgWyVzXSAlcyBudW0gJWQgbWF4cGFja2V0PSVkXG4iLAorCSAg ICAgIGVwLT5lcG4uaXNfaW4gPyAiaW4iIDogIm91dCIsIGVwX3R5cGVfc3RyaW5nW3R5cGVdLAor CSAgICAgIHVzYl9lbmRwb2ludF9udW0oZGVzYyksIG1heHBhY2tldCk7CisKKwkvKiBDYW4gd2Ug dXNlIERNQSBkZXNjcmlwdG9yIG1vZGUgPyAqLworCWVwLT5lcG4uZGVzY19tb2RlID0gZXAtPmVw bi5kZXNjcyAmJiBlcC0+ZXBuLmlzX2luICYmCisJCSF2aHViLT5ub19kbWFfZGVzYzsKKwlpZiAo ZXAtPmVwbi5kZXNjX21vZGUpCisJCW1lbXNldChlcC0+ZXBuLmRlc2NzLCAwLCA4ICogQVNUX1ZI VUJfREVTQ1NfQ09VTlQpOworCisJLyoKKwkgKiBMYXJnZSBzZW5kIGZ1bmN0aW9uIGNhbiBzZW5k IHVwIHRvIDggcGFja2V0cyBmcm9tCisJICogb25lIGRlc2NyaXB0b3Igd2l0aCBhIGxpbWl0IG9m IDQwOTUgYnl0ZXMuCisJICovCisJZXAtPmVwbi5jaHVua19tYXggPSBlcC0+ZXAubWF4cGFja2V0 OworCWlmIChlcC0+ZXBuLmlzX2luICYmICFlcC0+dmh1Yi0+bm9fbGFyZ2Vfc2VuZHMpIHsKKwkJ ZXAtPmVwbi5jaHVua19tYXggPDw9IDM7CisJCXdoaWxlIChlcC0+ZXBuLmNodW5rX21heCA+IDQw OTUpCisJCQllcC0+ZXBuLmNodW5rX21heCAtPSBlcC0+ZXAubWF4cGFja2V0OworCX0KKworCXN3 aXRjaCh0eXBlKSB7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9DT05UUk9MOgorCQlFUERCRyhl cCwgIk9ubHkgb25lIGNvbnRyb2wgZW5kcG9pbnRcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwlj YXNlIFVTQl9FTkRQT0lOVF9YRkVSX0lOVDoKKwkJZXBfY29uZiA9IFZIVUJfRVBfQ0ZHX1NFVF9U WVBFKEVQX1RZUEVfSU5UKTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9CVUxL OgorCQllcF9jb25mID0gVkhVQl9FUF9DRkdfU0VUX1RZUEUoRVBfVFlQRV9CVUxLKTsKKwkJYnJl YWs7CisJY2FzZSBVU0JfRU5EUE9JTlRfWEZFUl9JU09DOgorCQllcF9jb25mID0gVkhVQl9FUF9D RkdfU0VUX1RZUEUoRVBfVFlQRV9JU08pOworCQllcC0+ZXBuLmlzX2lzbyA9IHRydWU7CisJCWJy ZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIEVuY29kZSB0aGUg cmVzdCBvZiB0aGUgRVAgY29uZmlnIHJlZ2lzdGVyICovCisJaWYgKG1heHBhY2tldCA8IDEwMjQp CisJCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfU0VUX01BWF9QS1QobWF4cGFja2V0KTsKKwlpZiAo IWVwLT5lcG4uaXNfaW4pCisJCWVwX2NvbmYgfD0gVkhVQl9FUF9DRkdfRElSX09VVDsKKwllcF9j b25mIHw9IFZIVUJfRVBfQ0ZHX1NFVF9FUF9OVU0odXNiX2VuZHBvaW50X251bShkZXNjKSk7CisJ ZXBfY29uZiB8PSBWSFVCX0VQX0NGR19FTkFCTEU7CisJZXBfY29uZiB8PSBWSFVCX0VQX0NGR19T RVRfREVWKGRldi0+aW5kZXggKyAxKTsKKwlFUFZEQkcoZXAsICJjb25maWc9JTA4eFxuIiwgZXBf Y29uZik7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCisJLyog RGlzYWJsZSBIVyBhbmQgcmVzZXQgRE1BICovCisJd3JpdGVsKDAsIGVwLT5lcG4ucmVncyArIEFT VF9WSFVCX0VQX0NPTkZJRyk7CisJd3JpdGVsKFZIVUJfRVBfRE1BX0NUUkxfUkVTRVQsCisJICAg ICAgIGVwLT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKworCS8qIENvbmZp Z3VyZSBhbmQgZW5hYmxlICovCisJd3JpdGVsKGVwX2NvbmYsIGVwLT5lcG4ucmVncyArIEFTVF9W SFVCX0VQX0NPTkZJRyk7CisKKwlpZiAoZXAtPmVwbi5kZXNjX21vZGUpIHsKKwkJLyogQ2xlYXIg RE1BIHN0YXR1cywgaW5jbHVkaW5nIHRoZSBETUEgcmVhZCBwdHIgKi8KKwkJd3JpdGVsKDAsIGVw LT5lcG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfU1RBVFVTKTsKKworCQkvKiBTZXQgZGVzY3Jp cHRvciBiYXNlICovCisJCXdyaXRlbChlcC0+ZXBuLmRlc2NzX2RtYSwKKwkJICAgICAgIGVwLT5l cG4ucmVncyArIEFTVF9WSFVCX0VQX0RFU0NfQkFTRSk7CisKKwkJLyogU2V0IGJhc2UgRE1BIGNv bmZpZyB2YWx1ZSAqLworCQllcC0+ZXBuLmRtYV9jb25mID0gVkhVQl9FUF9ETUFfREVTQ19NT0RF OworCQlpZiAoZXAtPmVwbi5pc19pbiAmJiAhdmh1Yi0+bm9fbGFyZ2Vfc2VuZHMpCisJCQllcC0+ ZXBuLmRtYV9jb25mIHw9IFZIVUJfRVBfRE1BX0lOX0xPTkdfTU9ERTsKKworCQkvKiBGaXJzdCBy ZXNldCBhbmQgZGlzYWJsZSBhbGwgb3BlcmF0aW9ucyAqLworCQl3cml0ZWwoZXAtPmVwbi5kbWFf Y29uZiB8IFZIVUJfRVBfRE1BX0NUUkxfUkVTRVQsCisJCSAgICAgICBlcC0+ZXBuLnJlZ3MgKyBB U1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisKKwkJLyogRW5hYmxlIGRlc2NyaXB0b3IgbW9kZSAq LworCQl3cml0ZWwoZXAtPmVwbi5kbWFfY29uZiwKKwkJICAgICAgIGVwLT5lcG4ucmVncyArIEFT VF9WSFVCX0VQX0RNQV9DVExTVEFUKTsKKwl9IGVsc2UgeworCQkvKiBTZXQgYmFzZSBETUEgY29u ZmlnIHZhbHVlICovCisJCWVwLT5lcG4uZG1hX2NvbmYgPSBWSFVCX0VQX0RNQV9TSU5HTEVfU1RB R0U7CisKKwkJLyogUmVzZXQgYW5kIHN3aXRjaCB0byBzaW5nbGUgc3RhZ2UgbW9kZSAqLworCQl3 cml0ZWwoZXAtPmVwbi5kbWFfY29uZiB8IFZIVUJfRVBfRE1BX0NUUkxfUkVTRVQsCisJCSAgICAg ICBlcC0+ZXBuLnJlZ3MgKyBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVCk7CisJCXdyaXRlbChlcC0+ ZXBuLmRtYV9jb25mLAorCQkgICAgICAgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfRE1BX0NU TFNUQVQpOworCQl3cml0ZWwoMCwgZXAtPmVwbi5yZWdzICsgQVNUX1ZIVUJfRVBfREVTQ19TVEFU VVMpOworCX0KKworCS8qIENsZWFudXAgZGF0YSB0b2dnbGUganVzdCBpbiBjYXNlICovCisJd3Jp dGVsKFZIVUJfRVBfVE9HR0xFX1NFVF9FUE5VTShlcC0+ZXBuLmdfaWR4KSwKKwkgICAgICAgdmh1 Yi0+cmVncyArIEFTVF9WSFVCX0VQX1RPR0dMRSk7CisKKwkvKiBDbGVhbnVwIGFuZCBlbmFibGUg QUNLIGludGVycnVwdCAqLworCWltYXNrID0gMSA8PCBlcC0+ZXBuLmdfaWR4OworCXdyaXRlbChp bWFzaywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JU1IpOworCWVwX2llciA9IHJlYWRs KHZodWItPnJlZ3MgKyBBU1RfVkhVQl9FUF9BQ0tfSUVSKTsKKwllcF9pZXIgfD0gaW1hc2s7CisJ d3JpdGVsKGVwX2llciwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQX0FDS19JRVIpOworCisJLyog V29vdCwgd2UgYXJlIG9ubGluZSAhICovCisJZXAtPmVwbi5lbmFibGVkID0gdHJ1ZTsKKworCXNw aW5fdW5sb2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOwor fQorCitzdGF0aWMgdm9pZCBhc3Rfdmh1Yl9lcG5fZGlzcG9zZShzdHJ1Y3QgdXNiX2VwICp1X2Vw KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAgPSB0b19hc3RfZXAodV9lcCk7CisKKwlpZiAo V0FSTl9PTighZXAtPmRldiB8fCAhZXAtPmRfaWR4KSkKKwkJcmV0dXJuOworCisJRVBEQkcoZXAs ICJSZWxlYXNpbmcgZW5kcG9pbnRcbiIpOworCisJLyogVGFrZSBpdCBvdXQgb2YgdGhlIEVQIGxp c3QgKi8KKwlsaXN0X2RlbF9pbml0KCZlcC0+ZXAuZXBfbGlzdCk7CisKKwkvKiBNYXJrIHRoZSBh ZGRyZXNzIGZyZWUgaW4gdGhlIGRldmljZSAqLworCWVwLT5kZXYtPmVwbnNbZXAtPmRfaWR4IC0g MV0gPSBOVUxMOworCisJLyogRnJlZSBuYW1lICYgRE1BIGJ1ZmZlcnMgKi8KKwlrZnJlZShlcC0+ ZXAubmFtZSk7CisJZXAtPmVwLm5hbWUgPSBOVUxMOworCWRtYV9mcmVlX2NvaGVyZW50KCZlcC0+ dmh1Yi0+cGRldi0+ZGV2LAorCQkJICBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVCArCisJCQkgIDgg KiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCSAgZXAtPmJ1ZiwgZXAtPmJ1Zl9kbWEpOworCWVw LT5idWYgPSBOVUxMOworCWVwLT5lcG4uZGVzY3MgPSBOVUxMOworCisJLyogTWFyayBmcmVlICov CisJZXAtPmRldiA9IE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2VwX29wcyBh c3Rfdmh1Yl9lcG5fb3BzID0geworCS5lbmFibGUJCT0gYXN0X3ZodWJfZXBuX2VuYWJsZSwKKwku ZGlzYWJsZQk9IGFzdF92aHViX2Vwbl9kaXNhYmxlLAorCS5kaXNwb3NlCT0gYXN0X3ZodWJfZXBu X2Rpc3Bvc2UsCisJLnF1ZXVlCQk9IGFzdF92aHViX2Vwbl9xdWV1ZSwKKwkuZGVxdWV1ZQk9IGFz dF92aHViX2Vwbl9kZXF1ZXVlLAorCS5zZXRfaGFsdAk9IGFzdF92aHViX2Vwbl9zZXRfaGFsdCwK Kwkuc2V0X3dlZGdlCT0gYXN0X3ZodWJfZXBuX3NldF93ZWRnZSwKKwkuYWxsb2NfcmVxdWVzdAk9 IGFzdF92aHViX2FsbG9jX3JlcXVlc3QsCisJLmZyZWVfcmVxdWVzdAk9IGFzdF92aHViX2ZyZWVf cmVxdWVzdCwKK307CisKK3N0cnVjdCBhc3Rfdmh1Yl9lcCAqYXN0X3ZodWJfYWxsb2NfZXBuKHN0 cnVjdCBhc3Rfdmh1Yl9kZXYgKmQsIHU4IGFkZHIpCit7CisJc3RydWN0IGFzdF92aHViICp2aHVi ID0gZC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwOworCXVuc2lnbmVkIGxvbmcgZmxh Z3M7CisJaW50IGk7CisKKwkvKiBGaW5kIGEgZnJlZSBvbmUgKG5vIGRldmljZSkgKi8KKwlzcGlu X2xvY2tfaXJxc2F2ZSgmdmh1Yi0+bG9jaywgZmxhZ3MpOworCWZvciAoaSA9IDA7IGkgPCBBU1Rf VkhVQl9OVU1fR0VOX0VQczsgaSsrKQorCQlpZiAodmh1Yi0+ZXBuc1tpXS5kZXYgPT0gTlVMTCkK KwkJCWJyZWFrOworCWlmIChpID49IEFTVF9WSFVCX05VTV9HRU5fRVBzKSB7CisJCXNwaW5fdW5s b2NrX2lycXJlc3RvcmUoJnZodWItPmxvY2ssIGZsYWdzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQor CisJLyogU2V0IGl0IHVwICovCisJZXAgPSAmdmh1Yi0+ZXBuc1tpXTsKKwllcC0+ZGV2ID0gZDsK KwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisKKwlEREJHKGQs ICJBbGxvY2F0aW5nIGdlbiBFUCAlZCBmb3IgYWRkciAlZFxuIiwgaSwgYWRkcik7CisJSU5JVF9M SVNUX0hFQUQoJmVwLT5xdWV1ZSk7CisJZXAtPmRfaWR4ID0gYWRkcjsKKwllcC0+dmh1YiA9IHZo dWI7CisJZXAtPmVwLm9wcyA9ICZhc3Rfdmh1Yl9lcG5fb3BzOworCWVwLT5lcC5uYW1lID0ga2Fz cHJpbnRmKEdGUF9LRVJORUwsICJlcCVkIiwgYWRkcik7CisJZC0+ZXBuc1thZGRyLTFdID0gZXA7 CisJZXAtPmVwbi5nX2lkeCA9IGk7CisJZXAtPmVwbi5yZWdzID0gdmh1Yi0+cmVncyArIDB4MjAw ICsgKGkgKiAweDEwKTsKKworCWVwLT5idWYgPSBkbWFfYWxsb2NfY29oZXJlbnQoJnZodWItPnBk ZXYtPmRldiwKKwkJCQkgICAgIEFTVF9WSFVCX0VQbl9NQVhfUEFDS0VUICsKKwkJCQkgICAgIDgg KiBBU1RfVkhVQl9ERVNDU19DT1VOVCwKKwkJCQkgICAgICZlcC0+YnVmX2RtYSwgR0ZQX0tFUk5F TCk7CisJaWYgKCFlcC0+YnVmKSB7CisJCWtmcmVlKGVwLT5lcC5uYW1lKTsKKwkJZXAtPmVwLm5h bWUgPSBOVUxMOworCQlyZXR1cm4gTlVMTDsKKwl9CisJZXAtPmVwbi5kZXNjcyA9IGVwLT5idWYg KyBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVDsKKwllcC0+ZXBuLmRlc2NzX2RtYSA9IGVwLT5idWZf ZG1hICsgQVNUX1ZIVUJfRVBuX01BWF9QQUNLRVQ7CisKKwl1c2JfZXBfc2V0X21heHBhY2tldF9s aW1pdCgmZXAtPmVwLCBBU1RfVkhVQl9FUG5fTUFYX1BBQ0tFVCk7CisJbGlzdF9hZGRfdGFpbCgm ZXAtPmVwLmVwX2xpc3QsICZkLT5nYWRnZXQuZXBfbGlzdCk7CisJZXAtPmVwLmNhcHMudHlwZV9p c28gPSB0cnVlOworCWVwLT5lcC5jYXBzLnR5cGVfYnVsayA9IHRydWU7CisJZXAtPmVwLmNhcHMu dHlwZV9pbnQgPSB0cnVlOworCWVwLT5lcC5jYXBzLmRpcl9pbiA9IHRydWU7CisJZXAtPmVwLmNh cHMuZGlyX291dCA9IHRydWU7CisKKwlyZXR1cm4gZXA7Cit9CmRpZmYgLS1naXQgYS9kcml2ZXJz L3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHViL2h1Yi5jIGIvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi9odWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAw MDAuLmYxMjQ4NjMzMWZlMgotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91 ZGMvYXNwZWVkLXZodWIvaHViLmMKQEAgLTAsMCArMSw4MjIgQEAKKy8qCisgKiBhc3BlZWQtdmh1 YiAtLSBEcml2ZXIgZm9yIEFzcGVlZCBTb0MgInZIdWIiIFVTQiBnYWRnZXQKKyAqCisgKiBodWIu YyAtIHZpcnR1YWwgaHViIGhhbmRsaW5nCisgKgorICogQ29weXJpZ2h0IDIwMTcgSUJNIENvcnBv cmF0aW9uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVk aXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUg R05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgor ICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworCisjaW5jbHVkZSA8 bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGlu dXgvcGxhdGZvcm1fZGV2aWNlLmg+CisjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KKyNpbmNsdWRl IDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGlu dXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvaW50 ZXJydXB0Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3By ZWZldGNoLmg+CisjaW5jbHVkZSA8bGludXgvY2xrLmg+CisjaW5jbHVkZSA8bGludXgvdXNiL2dh ZGdldC5oPgorI2luY2x1ZGUgPGxpbnV4L29mLmg+CisjaW5jbHVkZSA8bGludXgvb2ZfZ3Bpby5o PgorI2luY2x1ZGUgPGxpbnV4L3JlZ21hcC5oPgorI2luY2x1ZGUgPGxpbnV4L2RtYS1tYXBwaW5n Lmg+CisjaW5jbHVkZSA8bGludXgvYmNkLmg+CisjaW5jbHVkZSA8bGludXgvdmVyc2lvbi5oPgor I2luY2x1ZGUgPGxpbnV4L3VzYi5oPgorI2luY2x1ZGUgPGxpbnV4L3VzYi9oY2QuaD4KKworI2lu Y2x1ZGUgInZodWIuaCIKKworLyogdXNiIDIuMCBodWIgZGV2aWNlIGRlc2NyaXB0b3IKKyAqCisg KiBBIGZldyB0aGluZ3Mgd2UgbWF5IHdhbnQgdG8gaW1wcm92ZSBoZXJlOgorICoKKyAqICAgIC0g V2UgbWF5IG5lZWQgdG8gaW5kaWNhdGUgVFQgc3VwcG9ydAorICogICAgLSBXZSBtYXkgbmVlZCBh IGRldmljZSBxdWFsaWZpZXIgZGVzY3JpcHRvcgorICogICAgICBhcyBkZXZpY2VzIGNhbiBwcmV0 ZW5kIHRvIGJlIHVzYjEgb3IgMgorICogICAgLSBNYWtlIHZpZC9kaWQgb3ZlcnJpZGFibGUKKyAq ICAgIC0gbWFrZSBpdCBsb29rIGxpa2UgdXNiMSBpZiB1c2IxIG1vZGUgZm9yY2VkCisgKi8KKyNk ZWZpbmUgS0VSTkVMX1JFTAliaW4yYmNkKCgoTElOVVhfVkVSU0lPTl9DT0RFID4+IDE2KSAmIDB4 MGZmKSkKKyNkZWZpbmUgS0VSTkVMX1ZFUgliaW4yYmNkKCgoTElOVVhfVkVSU0lPTl9DT0RFID4+ IDgpICYgMHgwZmYpKQorCitlbnVtIHsKKwlBU1RfVkhVQl9TVFJfTUFOVUYgPSAzLAorCUFTVF9W SFVCX1NUUl9QUk9EVUNUID0gMiwKKwlBU1RfVkhVQl9TVFJfU0VSSUFMID0gMSwKK307CisKK3N0 YXRpYyBjb25zdCBzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yIGFzdF92aHViX2Rldl9kZXNj ID0geworCS5iTGVuZ3RoCQk9IFVTQl9EVF9ERVZJQ0VfU0laRSwKKwkuYkRlc2NyaXB0b3JUeXBl CT0gVVNCX0RUX0RFVklDRSwKKwkuYmNkVVNCCQkJPSBjcHVfdG9fbGUxNigweDAyMDApLAorCS5i RGV2aWNlQ2xhc3MJCT0gVVNCX0NMQVNTX0hVQiwKKwkuYkRldmljZVN1YkNsYXNzCT0gMCwKKwku YkRldmljZVByb3RvY29sCT0gMSwKKwkuYk1heFBhY2tldFNpemUwCT0gNjQsCisJLmlkVmVuZG9y CSAgICAgICAJPSBjcHVfdG9fbGUxNigweDFkNmIpLAorCS5pZFByb2R1Y3QJCT0gY3B1X3RvX2xl MTYoMHgwMTA3KSwKKwkuYmNkRGV2aWNlCQk9IGNwdV90b19sZTE2KDB4MDEwMCksCisJLmlNYW51 ZmFjdHVyZXIJCT0gQVNUX1ZIVUJfU1RSX01BTlVGLAorCS5pUHJvZHVjdAkJPSBBU1RfVkhVQl9T VFJfUFJPRFVDVCwKKwkuaVNlcmlhbE51bWJlcgkJPSBBU1RfVkhVQl9TVFJfU0VSSUFMLAorCS5i TnVtQ29uZmlndXJhdGlvbnMJPSAxLAorfTsKKworLyogUGF0Y2hlcyB0byB0aGUgYWJvdmUgd2hl biBmb3JjaW5nIFVTQjEgbW9kZSAqLworc3RhdGljIHZvaWQgYXN0X3ZodWJfcGF0Y2hfZGV2X2Rl c2NfdXNiMShzdHJ1Y3QgdXNiX2RldmljZV9kZXNjcmlwdG9yICpkZXNjKQoreworCWRlc2MtPmJj ZFVTQiA9IGNwdV90b19sZTE2KDB4MDEwMCk7CisJZGVzYy0+YkRldmljZVByb3RvY29sID0gMDsK K30KKworLyoKKyAqIENvbmZpZ3VyYXRpb24gZGVzY3JpcHRvcjogc2FtZSBjb21tZW50cyBhcyBh Ym92ZQorICogcmVnYXJkaW5nIGhhbmRsaW5nIFVTQjEgbW9kZS4KKyAqLworCisvKgorICogV2Ug ZG9uJ3QgdXNlIHNpemVvZigpIGFzIExpbnV4IGRlZmluaXRpb24gb2YKKyAqIHN0cnVjdCB1c2Jf ZW5kcG9pbnRfZGVzY3JpcHRvciBjb250YWlucyAyCisgKiBleHRyYSBieXRlcworICovCisjZGVm aW5lIEFTVF9WSFVCX0NPTkZfREVTQ19TSVpFCShVU0JfRFRfQ09ORklHX1NJWkUgKyBcCisJCQkJ IFVTQl9EVF9JTlRFUkZBQ0VfU0laRSArIFwKKwkJCQkgVVNCX0RUX0VORFBPSU5UX1NJWkUpCisK K3N0YXRpYyBjb25zdCBzdHJ1Y3QgYXN0X3ZodWJfZnVsbF9jZGVzYyB7CisJc3RydWN0IHVzYl9j b25maWdfZGVzY3JpcHRvcgljZmc7CisJc3RydWN0IHVzYl9pbnRlcmZhY2VfZGVzY3JpcHRvciBp bnRmOworCXN0cnVjdCB1c2JfZW5kcG9pbnRfZGVzY3JpcHRvcgllcDsKK30gX19hdHRyaWJ1dGVf XyAoKHBhY2tlZCkpIGFzdF92aHViX2NvbmZfZGVzYyA9IHsKKwkuY2ZnID0geworCQkuYkxlbmd0 aAkJPSBVU0JfRFRfQ09ORklHX1NJWkUsCisJCS5iRGVzY3JpcHRvclR5cGUJPSBVU0JfRFRfQ09O RklHLAorCQkud1RvdGFsTGVuZ3RoCQk9IGNwdV90b19sZTE2KEFTVF9WSFVCX0NPTkZfREVTQ19T SVpFKSwKKwkJLmJOdW1JbnRlcmZhY2VzCQk9IDEsCisJCS5iQ29uZmlndXJhdGlvblZhbHVlCT0g MSwKKwkJLmlDb25maWd1cmF0aW9uCQk9IDAsCisJCS5ibUF0dHJpYnV0ZXMJCT0gVVNCX0NPTkZJ R19BVFRfT05FIHwKKwkJCQkJICBVU0JfQ09ORklHX0FUVF9TRUxGUE9XRVIgfAorCQkJCQkgIFVT Ql9DT05GSUdfQVRUX1dBS0VVUCwKKwkJLmJNYXhQb3dlcgkJPSAwLAorCX0sCisJLmludGYgPSB7 CisJCS5iTGVuZ3RoCQk9IFVTQl9EVF9JTlRFUkZBQ0VfU0laRSwKKwkJLmJEZXNjcmlwdG9yVHlw ZQk9IFVTQl9EVF9JTlRFUkZBQ0UsCisJCS5iSW50ZXJmYWNlTnVtYmVyCT0gMCwKKwkJLmJBbHRl cm5hdGVTZXR0aW5nCT0gMCwKKwkJLmJOdW1FbmRwb2ludHMJCT0gMSwKKwkJLmJJbnRlcmZhY2VD bGFzcwk9IFVTQl9DTEFTU19IVUIsCisJCS5iSW50ZXJmYWNlU3ViQ2xhc3MJPSAwLAorCQkuYklu dGVyZmFjZVByb3RvY29sCT0gMCwKKwkJLmlJbnRlcmZhY2UJCT0gMCwKKwl9LAorCS5lcCA9IHsK KwkJLmJMZW5ndGgJCT0gVVNCX0RUX0VORFBPSU5UX1NJWkUsCisJCS5iRGVzY3JpcHRvclR5cGUJ PSBVU0JfRFRfRU5EUE9JTlQsCisJCS5iRW5kcG9pbnRBZGRyZXNzCT0gMHg4MSwKKwkJLmJtQXR0 cmlidXRlcwkJPSBVU0JfRU5EUE9JTlRfWEZFUl9JTlQsCisJCS53TWF4UGFja2V0U2l6ZQkJPSBj cHVfdG9fbGUxNigxKSwKKwkJLmJJbnRlcnZhbAkJPSAweDBjLAorCX0sCit9OworCisjZGVmaW5l IEFTVF9WSFVCX0hVQl9ERVNDX1NJWkUJKFVTQl9EVF9IVUJfTk9OVkFSX1NJWkUgKyAyKQorCitz dGF0aWMgY29uc3Qgc3RydWN0IHVzYl9odWJfZGVzY3JpcHRvciBhc3Rfdmh1Yl9odWJfZGVzYyA9 IHsKKwkuYkRlc2NMZW5ndGgJCQk9IEFTVF9WSFVCX0hVQl9ERVNDX1NJWkUsCisJLmJEZXNjcmlw dG9yVHlwZQkJPSBVU0JfRFRfSFVCLAorCS5iTmJyUG9ydHMJCQk9IEFTVF9WSFVCX05VTV9QT1JU UywKKwkud0h1YkNoYXJhY3RlcmlzdGljcwkJPSBjcHVfdG9fbGUxNihIVUJfQ0hBUl9OT19MUFNN KSwKKwkuYlB3ck9uMlB3ckdvb2QJCQk9IDEwLAorCS5iSHViQ29udHJDdXJyZW50CQk9IDAsCisJ LnUuaHMuRGV2aWNlUmVtb3ZhYmxlWzBdCT0gMCwKKwkudS5ocy5EZXZpY2VSZW1vdmFibGVbMV0J PSAweGZmLAorfTsKKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJfZGV2X3N0YXR1cyhzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUpCit7CisJdTgg c3QwOworCisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGRldilcbiIpOworCisJLyoKKwkgKiBNYXJr IGl0IGFzIHNlbGYtcG93ZXJlZCwgSSBkb3VidCB0aGUgQk1DIGlzIHBvd2VyZWQgb2ZmCisJICog dGhlIFVTQiBidXMgLi4uCisJICovCisJc3QwID0gMSA8PCBVU0JfREVWSUNFX1NFTEZfUE9XRVJF RDsKKworCS8qCisJICogTmVlZCB0byBkb3VibGUgY2hlY2sgaG93IHJlbW90ZSB3YWtldXAgYWN0 dWFsbHkgd29ya3MKKwkgKiBvbiB0aGF0IGNoaXAgYW5kIHdoYXQgdHJpZ2dlcnMgaXQuCisJICov CisJaWYgKGVwLT52aHViLT53YWtldXBfZW4pCisJCXN0MCB8PSAxIDw8IFVTQl9ERVZJQ0VfUkVN T1RFX1dBS0VVUDsKKworCXJldHVybiBhc3Rfdmh1Yl9zaW1wbGVfcmVwbHkoZXAsIHN0MCwgMCk7 Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJfaHViX2VwX3N0YXR1cyhzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLAorCQkJCSAgdTE2IHdJbmRleCwgdTE2IHdWYWx1ZSkKK3sKKwlpbnQgZXBfbnVtOwor CXU4IHN0MCA9IDA7CisKKwllcF9udW0gPSB3SW5kZXggJiBVU0JfRU5EUE9JTlRfTlVNQkVSX01B U0s7CisJRVBEQkcoZXAsICJHRVRfU1RBVFVTKGVwJWQpXG4iLCBlcF9udW0pOworCisJLyogT24g dGhlIGh1YiB3ZSBoYXZlIG9ubHkgRVAgMCBhbmQgMSAqLworCWlmIChlcF9udW0gPT0gMSkgewor CQlpZiAoZXAtPnZodWItPmVwMV9zdGFsbGVkKQorCQkJc3QwIHw9IDEgPDwgVVNCX0VORFBPSU5U X0hBTFQ7CisJfSBlbHNlIGlmIChlcF9udW0gIT0gMCkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7 CisKKwlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCBzdDAsIDApOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX2h1Yl9kZXZfZmVhdHVyZShzdHJ1Y3QgYXN0X3ZodWJfZXAgKmVwLAor CQkJCSAgICB1MTYgd0luZGV4LCB1MTYgd1ZhbHVlLAorCQkJCSAgICBib29sIGlzX3NldCkKK3sK KwlFUERCRyhlcCwgIiVzX0ZFQVRVUkUoZGV2IHZhbD0lMDJ4KVxuIiwKKwkgICAgICBpc19zZXQg PyAiU0VUIiA6ICJDTEVBUiIsIHdWYWx1ZSk7CisKKwlpZiAod1ZhbHVlICE9IFVTQl9ERVZJQ0Vf UkVNT1RFX1dBS0VVUCkKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisKKwllcC0+dmh1Yi0+d2Fr ZXVwX2VuID0gaXNfc2V0OworCUVQREJHKGVwLCAiSHViIHJlbW90ZSB3YWtldXAgJXNcbiIsCisJ ICAgICAgaXNfc2V0ID8gImVuYWJsZWQiIDogImRpc2FibGVkIik7CisKKwlyZXR1cm4gc3RkX3Jl cV9jb21wbGV0ZTsKK30KKworc3RhdGljIGludCBhc3Rfdmh1Yl9odWJfZXBfZmVhdHVyZShzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCSAgIHUxNiB3SW5kZXgsIHUxNiB3VmFsdWUsCisJCQkJ ICAgYm9vbCBpc19zZXQpCit7CisJaW50IGVwX251bTsKKwl1MzIgcmVnOworCisJZXBfbnVtID0g d0luZGV4ICYgVVNCX0VORFBPSU5UX05VTUJFUl9NQVNLOworCUVQREJHKGVwLCAiJXNfRkVBVFVS RShlcCVkIHZhbD0lMDJ4KVxuIiwKKwkgICAgICBpc19zZXQgPyAiU0VUIiA6ICJDTEVBUiIsIGVw X251bSwgd1ZhbHVlKTsKKworCWlmIChlcF9udW0gPiAxKQorCQlyZXR1cm4gc3RkX3JlcV9zdGFs bDsKKwlpZiAod1ZhbHVlICE9IFVTQl9FTkRQT0lOVF9IQUxUKQorCQlyZXR1cm4gc3RkX3JlcV9z dGFsbDsKKwlpZiAoZXBfbnVtID09IDApCisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCisJ RVBEQkcoZXAsICIlcyBzdGFsbCBvbiBFUCAxXG4iLAorCSAgICAgIGlzX3NldCA/ICJzZXR0aW5n IiA6ICJjbGVhcmluZyIpOworCisJZXAtPnZodWItPmVwMV9zdGFsbGVkID0gaXNfc2V0OworCXJl ZyA9IHJlYWRsKGVwLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NUUkwpOworCWlmIChpc19z ZXQpIHsKKwkJcmVnIHw9IFZIVUJfRVAxX0NUUkxfU1RBTEw7CisJfSBlbHNlIHsKKwkJcmVnICY9 IH5WSFVCX0VQMV9DVFJMX1NUQUxMOworCQlyZWcgfD0gVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dH TEU7CisJfQorCXdyaXRlbChyZWcsIGVwLT52aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX0NUUkwp OworCisJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7Cit9CisKK3N0YXRpYyBpbnQgYXN0X3ZodWJf cmVwX2Rlc2Moc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCSAgICAgdTggZGVzY190eXBlLCB1 MTYgbGVuKQoreworCWNvbnN0IHZvaWQgKmRlc2M7CisJc2l6ZV90IGRzaXplOworCisJRVBEQkco ZXAsICJHRVRfREVTQ1JJUFRPUih0eXBlOiVkKVxuIiwgZGVzY190eXBlKTsKKwlzd2l0Y2goZGVz Y190eXBlKSB7CisJY2FzZSBVU0JfRFRfREVWSUNFOgorCQlkZXNjID0gJmFzdF92aHViX2Rldl9k ZXNjOworCQlkc2l6ZSA9IFVTQl9EVF9ERVZJQ0VfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBVU0Jf RFRfQ09ORklHOgorCQlkZXNjID0gJmFzdF92aHViX2NvbmZfZGVzYzsKKwkJZHNpemUgPSBBU1Rf VkhVQl9DT05GX0RFU0NfU0laRTsKKwkJYnJlYWs7CisJY2FzZSBVU0JfRFRfSFVCOgorCQlkZXNj ID0gJmFzdF92aHViX2h1Yl9kZXNjOworCQlkc2l6ZSA9IEFTVF9WSFVCX0hVQl9ERVNDX1NJWkU7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCX0KKwlpZiAo ZHNpemUgPCBsZW4pCisJCWxlbiA9IGRzaXplOworCS8qCisJICogVGhpcyBpcyBvdXIgbGltaXQg Zm9yIGh1YiByZXBsaWVzIGluIG91ciBjdXJyZW50CisJICogaW1wbGVtZW50YXRpb24sIGtlZXBz IHRoaW5ncyBzaW1wbGVyLgorCSAqLworCWlmIChXQVJOX09OKGxlbiA+PSBBU1RfVkhVQl9FUDBf TUFYX1BBQ0tFVCkpCisJCWxlbiA9IEFTVF9WSFVCX0VQMF9NQVhfUEFDS0VUIC0gMTsKKworCS8q CisJICogQ29weSBmaXJzdCB0byBFUCBidWZmZXIgYW5kIHNlbmQgZnJvbSB0aGVyZSwgc28KKwkg KiB3ZSBjYW4gZG8gc29tZSBpbi1wbGFjZSBwYXRjaGluZyBpZiBuZWVkZWQKKwkgKi8KKwltZW1j cHkoZXAtPmJ1ZiwgZGVzYywgbGVuKTsKKworCS8qIFBhdGNoIGl0IGlmIGZvcmNpbmcgVVNCMSAq LworCWlmIChkZXNjX3R5cGUgPT0gVVNCX0RUX0RFVklDRSAmJiBlcC0+dmh1Yi0+Zm9yY2VfdXNi MSkKKwkJYXN0X3ZodWJfcGF0Y2hfZGV2X2Rlc2NfdXNiMShlcC0+YnVmKTsKKworCS8qIFNob290 IGl0IGZyb20gdGhlIEVQIGJ1ZmZlciAqLworCXJldHVybiBhc3Rfdmh1Yl9yZXBseShlcCwgTlVM TCwgbGVuKTsKK30KKworLyogY29waWVkIGZyb20gaGRjLmMgKi8KK3N0YXRpYyB1bnNpZ25lZAor YXNjaWkyZGVzYyhjaGFyIGNvbnN0ICpzLCB1OCAqYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJdW5z aWduZWQgbiwgdCA9IDIgKyAyKnN0cmxlbihzKTsKKworCWlmICh0ID4gMjU0KQorCQl0ID0gMjU0 OwkvKiBMb25nZXN0IHBvc3NpYmxlIFVURiBzdHJpbmcgZGVzY3JpcHRvciAqLworCWlmIChsZW4g PiB0KQorCQlsZW4gPSB0OworCisJdCArPSBVU0JfRFRfU1RSSU5HIDw8IDg7CS8qIE5vdyB0IGlz IGZpcnN0IDE2IGJpdHMgdG8gc3RvcmUgKi8KKworCW4gPSBsZW47CisJd2hpbGUgKG4tLSkgewor CQkqYnVmKysgPSB0OworCQlpZiAoIW4tLSkKKwkJCWJyZWFrOworCQkqYnVmKysgPSB0ID4+IDg7 CisJCXQgPSAodW5zaWduZWQgY2hhcikqcysrOworCX0KKwlyZXR1cm4gbGVuOworfQorCitzdGF0 aWMgaW50IGFzdF92aHViX3JlcF9zdHJpbmcoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCSAg ICAgICB1OCBzdHJpbmdfaWQsIHUxNiBsYW5nX2lkLAorCQkJICAgICAgIHUxNiBsZW4pCit7CisJ c3RhdGljIGNoYXIgY29uc3QgbGFuZ2lkc1s0XSA9IHs0LCBVU0JfRFRfU1RSSU5HLCAweDA5LCAw eDA0fTsKKworCXN3aXRjaCAoc3RyaW5nX2lkKSB7CisJY2FzZSAwOiAvKiBMYW5ndWFnZSBJRHMg YXJyYXkgKi8KKwkJaWYgKGxlbiA+IDQpCisJCQlsZW4gPSA0OworCQltZW1jcHkoZXAtPmJ1Ziwg bGFuZ2lkcywgbGVuKTsKKwkJYnJlYWs7CisJY2FzZSBBU1RfVkhVQl9TVFJfU0VSSUFMOgorCQls ZW4gPSBhc2NpaTJkZXNjKCIwMDAwMDAwMCIsIGVwLT5idWYsIGxlbik7CisJCWJyZWFrOworCWNh c2UgQVNUX1ZIVUJfU1RSX1BST0RVQ1Q6CisJCWxlbiA9IGFzY2lpMmRlc2MoIlVTQiBWaXJ0dWFs IEh1YiIsIGVwLT5idWYsIGxlbik7CisJCWJyZWFrOworCWNhc2UgQVNUX1ZIVUJfU1RSX01BTlVG OgorCQlsZW4gPSBhc2NpaTJkZXNjKCJBc3BlZWQiLCBlcC0+YnVmLCBsZW4pOworCQlicmVhazsK KwlkZWZhdWx0OgorCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwl9CisKKwkvKiBTaG9vdCBpdCBm cm9tIHRoZSBFUCBidWZmZXIgKi8KKwlyZXR1cm4gYXN0X3ZodWJfcmVwbHkoZXAsIE5VTEwsIGxl bik7Cit9CisKK2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9zdGRfaHViX3JlcXVlc3Qoc3RydWN0 IGFzdF92aHViX2VwICplcCwKKwkJCQkJIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sK KwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwl1MTYgd1ZhbHVlLCB3SW5kZXgs IHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEtPndWYWx1ZSk7CisJd0luZGV4 ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGggPSBsZTE2X3RvX2NwdShjcnEt PndMZW5ndGgpOworCisJLyogRmlyc3QgcGFja2V0LCBncmFiIHNwZWVkICovCisJaWYgKHZodWIt PnNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOKSB7CisJCXUzMiB1c3RhdCA9IHJlYWRsKHZodWIt PnJlZ3MgKyBBU1RfVkhVQl9VU0JTVFMpOworCQlpZiAodXN0YXQgJiBWSFVCX1VTQlNUU19ISVNQ RUVEKQorCQkJdmh1Yi0+c3BlZWQgPSBVU0JfU1BFRURfSElHSDsKKwkJZWxzZQorCQkJdmh1Yi0+ c3BlZWQgPSBVU0JfU1BFRURfRlVMTDsKKwkJVURDREJHKHZodWIsICJVU0Igc3RhdHVzPSUwOHgg c3BlZWQ9JXNcbiIsIHVzdGF0LAorCQkgICAgICAgdmh1Yi0+c3BlZWQgPT0gVVNCX1NQRUVEX0hJ R0ggPyAiaGlnaCIgOiAiZnVsbCIpOworCX0KKworCXN3aXRjaCAoKGNycS0+YlJlcXVlc3RUeXBl IDw8IDgpIHwgY3JxLT5iUmVxdWVzdCkgeworCQkvKiBTRVRfQUREUkVTUyAqLworCWNhc2UgRGV2 aWNlT3V0UmVxdWVzdCB8IFVTQl9SRVFfU0VUX0FERFJFU1M6CisJCUVQREJHKGVwLCAiU0VUX0FE RFJFU1M6IEdvdCBhZGRyZXNzICV4XG4iLCB3VmFsdWUpOworCQl3cml0ZWwod1ZhbHVlLCB2aHVi LT5yZWdzICsgQVNUX1ZIVUJfQ09ORik7CisJCXJldHVybiBzdGRfcmVxX2NvbXBsZXRlOworCisJ CS8qIEdFVF9TVEFUVVMgKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9TVEFU VVM6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZGV2X3N0YXR1cyhlcCwgd0luZGV4LCB3VmFsdWUp OworCWNhc2UgSW50ZXJmYWNlUmVxdWVzdCB8IFVTQl9SRVFfR0VUX1NUQVRVUzoKKwkJcmV0dXJu IGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCk7CisJY2FzZSBFbmRwb2ludFJlcXVlc3Qg fCBVU0JfUkVRX0dFVF9TVEFUVVM6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZXBfc3RhdHVzKGVw LCB3SW5kZXgsIHdWYWx1ZSk7CisKKwkJLyogU0VUL0NMRUFSX0ZFQVRVUkUgKi8KKwljYXNlIERl dmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJf aHViX2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1ZSk7CisJY2FzZSBEZXZpY2VP dXRSZXF1ZXN0IHwgVVNCX1JFUV9DTEVBUl9GRUFUVVJFOgorCQlyZXR1cm4gYXN0X3ZodWJfaHVi X2Rldl9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgZmFsc2UpOworCWNhc2UgRW5kcG9pbnRP dXRSZXF1ZXN0IHwgVVNCX1JFUV9TRVRfRkVBVFVSRToKKwkJcmV0dXJuIGFzdF92aHViX2h1Yl9l cF9mZWF0dXJlKGVwLCB3SW5kZXgsIHdWYWx1ZSwgdHJ1ZSk7CisJY2FzZSBFbmRwb2ludE91dFJl cXVlc3QgfCBVU0JfUkVRX0NMRUFSX0ZFQVRVUkU6CisJCXJldHVybiBhc3Rfdmh1Yl9odWJfZXBf ZmVhdHVyZShlcCwgd0luZGV4LCB3VmFsdWUsIGZhbHNlKTsKKworCQkvKiBHRVQvU0VUX0NPTkZJ R1VSQVRJT04gKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVRX0dFVF9DT05GSUdVUkFU SU9OOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAxKTsKKwljYXNlIERldmlj ZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9DT05GSUdVUkFUSU9OOgorCQlpZiAod1ZhbHVlICE9 IDEpCisJCQlyZXR1cm4gc3RkX3JlcV9zdGFsbDsKKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7 CisKKwkJLyogR0VUX0RFU0NSSVBUT1IgKi8KKwljYXNlIERldmljZVJlcXVlc3QgfCBVU0JfUkVR X0dFVF9ERVNDUklQVE9SOgorCQlzd2l0Y2ggKHdWYWx1ZSA+PiA4KSB7CisJCWNhc2UgVVNCX0RU X0RFVklDRToKKwkJY2FzZSBVU0JfRFRfQ09ORklHOgorCQkJcmV0dXJuIGFzdF92aHViX3JlcF9k ZXNjKGVwLCB3VmFsdWUgPj4gOCwKKwkJCQkJCSB3TGVuZ3RoKTsKKwkJY2FzZSBVU0JfRFRfU1RS SU5HOgorCQkJcmV0dXJuIGFzdF92aHViX3JlcF9zdHJpbmcoZXAsIHdWYWx1ZSAmIDB4ZmYsCisJ CQkJCQkgICB3SW5kZXgsIHdMZW5ndGgpOworCQl9CisJCXJldHVybiBzdGRfcmVxX3N0YWxsOwor CisJCS8qIEdFVC9TRVRfSU5URVJGQUNFICovCisJY2FzZSBEZXZpY2VSZXF1ZXN0IHwgVVNCX1JF UV9HRVRfSU5URVJGQUNFOgorCQlyZXR1cm4gYXN0X3ZodWJfc2ltcGxlX3JlcGx5KGVwLCAwKTsK KwljYXNlIERldmljZU91dFJlcXVlc3QgfCBVU0JfUkVRX1NFVF9JTlRFUkZBQ0U6CisJCWlmICh3 VmFsdWUgIT0gMCB8fCB3SW5kZXggIT0gMCkKKwkJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCQly ZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9CisK K3N0YXRpYyB2b2lkIGFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHN0cnVjdCBhc3Rfdmh1YiAqdmh1 YiwKKwkJCQkgICAgdW5zaWduZWQgaW50IHBvcnQpCit7CisJLyogVXBkYXRlIEhXIEVQMSByZXNw b25zZSAqLworCXUzMiByZWcgPSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfRVAxX1NUU19D SEcpOworCXUzMiBwbWFzayA9ICgxIDw8IChwb3J0ICsgMSkpOworCWlmICh2aHViLT5wb3J0c1tw b3J0XS5jaGFuZ2UpCisJCXJlZyB8PSBwbWFzazsKKwllbHNlCisJCXJlZyAmPSB+cG1hc2s7CisJ d3JpdGVsKHJlZywgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKK30KKworc3Rh dGljIHZvaWQgYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIs CisJCQkJICAgICAgdW5zaWduZWQgaW50IHBvcnQsCisJCQkJICAgICAgdTE2IGNscl9mbGFncywK KwkJCQkgICAgICB1MTYgc2V0X2ZsYWdzLAorCQkJCSAgICAgIGJvb2wgc2V0X2MpCit7CisJc3Ry dWN0IGFzdF92aHViX3BvcnQgKnAgPSAmdmh1Yi0+cG9ydHNbcG9ydF07CisJdTE2IHByZXY7CisK KwkvKiBVcGRhdGUgcG9ydCBzdGF0dXMgKi8KKwlwcmV2ID0gcC0+c3RhdHVzOworCXAtPnN0YXR1 cyA9IChwcmV2ICYgfmNscl9mbGFncykgfCBzZXRfZmxhZ3M7CisJRERCRygmcC0+ZGV2LCAicG9y dCAlZCBzdGF0dXMgJTA0eCAtPiAlMDR4IChDPSVkKVxuIiwKKwkgICAgIHBvcnQgKyAxLCBwcmV2 LCBwLT5zdGF0dXMsIHNldF9jKTsKKworCS8qIFVwZGF0ZSBjaGFuZ2UgYml0cyBpZiBuZWVkZWQg Ki8KKwlpZiAoc2V0X2MpIHsKKwkJdTE2IGNoZyA9IHAtPnN0YXR1cyBeIHByZXY7CisKKwkJLyog T25seSB0aGVzZSBhcmUgcmVsZXZhbnQgZm9yIGNoYW5nZSAqLworCQljaGcgJj0gVVNCX1BPUlRf U1RBVF9DX0NPTk5FQ1RJT04gfAorCQkgICAgICAgVVNCX1BPUlRfU1RBVF9DX0VOQUJMRSB8CisJ CSAgICAgICBVU0JfUE9SVF9TVEFUX0NfU1VTUEVORCB8CisJCSAgICAgICBVU0JfUE9SVF9TVEFU X0NfT1ZFUkNVUlJFTlQgfAorCQkgICAgICAgVVNCX1BPUlRfU1RBVF9DX1JFU0VUIHwKKwkJICAg ICAgIFVTQl9QT1JUX1NUQVRfQ19MMTsKKwkJcC0+Y2hhbmdlIHw9IGNoZzsKKworCQlhc3Rfdmh1 Yl91cGRhdGVfaHViX2VwMSh2aHViLCBwb3J0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92 aHViX3NlbmRfaG9zdF93YWtldXAoc3RydWN0IGFzdF92aHViICp2aHViKQoreworCXUzMiByZWcg PSByZWFkbCh2aHViLT5yZWdzICsgQVNUX1ZIVUJfQ1RSTCk7CisJVURDREJHKHZodWIsICJXYWtp bmcgdXAgaG9zdCAhXG4iKTsKKwlyZWcgfD0gVkhVQl9DVFJMX01BTlVBTF9SRU1PVEVfV0FLRVVQ OworCXdyaXRlbChyZWcsIHZodWItPnJlZ3MgKyBBU1RfVkhVQl9DVFJMKTsKK30KKwordm9pZCBh c3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsCisJCQkgICAgIHVu c2lnbmVkIGludCBwb3J0LCBib29sIG9uKQoreworCWlmIChvbikKKwkJYXN0X3ZodWJfY2hhbmdl X3BvcnRfc3RhdCh2aHViLCBwb3J0LCAwLAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfQ09OTkVDVElP TiwgdHJ1ZSk7CisJZWxzZQorCQlhc3Rfdmh1Yl9jaGFuZ2VfcG9ydF9zdGF0KHZodWIsIHBvcnQs CisJCQkJCSAgVVNCX1BPUlRfU1RBVF9DT05ORUNUSU9OIHwKKwkJCQkJICBVU0JfUE9SVF9TVEFU X0VOQUJMRSwKKwkJCQkJICAwLCB0cnVlKTsKKworCS8qCisJICogSWYgdGhlIGh1YiBpcyBzZXQg dG8gd2FrdXAgdGhlIGhvc3Qgb24gY29ubmVjdGlvbiBldmVudHMKKwkgKiB0aGVuIHNlbmQgYSB3 YWtldXAuCisJICovCisJaWYgKHZodWItPndha2V1cF9lbikKKwkJYXN0X3ZodWJfc2VuZF9ob3N0 X3dha2V1cCh2aHViKTsKK30KKworc3RhdGljIHZvaWQgYXN0X3ZodWJfd2FrZV93b3JrKHN0cnVj dCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBjb250YWlu ZXJfb2Yod29yaywKKwkJCQkJICAgICBzdHJ1Y3QgYXN0X3ZodWIsCisJCQkJCSAgICAgd2FrZV93 b3JrKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpOworCisJLyoKKwkg KiBXYWtlIGFsbCBzbGVlcGluZyBwb3J0cy4gSWYgYSBwb3J0IGlzIHN1c3BlbmRlZCBieQorCSAq IHRoZSBob3N0IHN1c3BlbmQgKHdpdGhvdXQgZXhwbGljaXQgc3RhdGUgc3VzcGVuZCksCisJICog d2UgbGV0IHRoZSBub3JtYWwgaG9zdCB3YWtlIHBhdGggZGVhbCB3aXRoIGl0IGxhdGVyLgorCSAq LworCXNwaW5fbG9ja19pcnFzYXZlKCZ2aHViLT5sb2NrLCBmbGFncyk7CisJZm9yIChpID0gMDsg aSA8IEFTVF9WSFVCX05VTV9QT1JUUzsgaSsrKSB7CisJCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpw ID0gJnZodWItPnBvcnRzW2ldOworCisJCWlmICghKHAtPnN0YXR1cyAmIFVTQl9QT1JUX1NUQVRf U1VTUEVORCkpCisJCQljb250aW51ZTsKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHVi LCBpLAorCQkJCQkgIFVTQl9QT1JUX1NUQVRfU1VTUEVORCwKKwkJCQkJICAwLCB0cnVlKTsKKwkJ YXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9CisJYXN0X3ZodWJfc2VuZF9ob3N0X3dh a2V1cCh2aHViKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ2aHViLT5sb2NrLCBmbGFncyk7 Cit9CisKK3ZvaWQgYXN0X3ZodWJfaHViX3dha2VfYWxsKHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikK K3sKKwkvKgorCSAqIEEgZGV2aWNlIGlzIHRyeWluZyB0byB3YWtlIHRoZSB3b3JsZCwgYmVjYXVz ZSB0aGlzCisJICogY2FuIHJlY3Vyc2UgaW50byB0aGUgZGV2aWNlLCB3ZSBicmVhayB0aGUgY2Fs bCBjaGFpbgorCSAqIHVzaW5nIGEgd29yayBxdWV1ZQorCSAqLworCXNjaGVkdWxlX3dvcmsoJnZo dWItPndha2Vfd29yayk7Cit9CisKK3N0YXRpYyB2b2lkIGFzdF92aHViX3BvcnRfcmVzZXQoc3Ry dWN0IGFzdF92aHViICp2aHViLCB1OCBwb3J0KQoreworCXN0cnVjdCBhc3Rfdmh1Yl9wb3J0ICpw ID0gJnZodWItPnBvcnRzW3BvcnRdOworCXUxNiBzZXQsIGNsciwgc3BlZWQ7CisKKwkvKiBGaXJz dCBtYXJrIGRpc2FibGVkICovCisJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0 LAorCQkJCSAgVVNCX1BPUlRfU1RBVF9FTkFCTEUgfAorCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQ RU5ELAorCQkJCSAgVVNCX1BPUlRfU1RBVF9SRVNFVCwKKwkJCQkgIGZhbHNlKTsKKworCWlmICgh cC0+ZGV2LmRyaXZlcikKKwkJcmV0dXJuOworCisJLyoKKwkgKiBUaGlzIHdpbGwgZWl0aGVyICJz dGFydCIgdGhlIHBvcnQgb3IgcmVzZXQgdGhlCisJICogZGV2aWNlIGlmIGFscmVhZHkgc3RhcnRl ZC4uLgorCSAqLworCWFzdF92aHViX2Rldl9yZXNldCgmcC0+ZGV2KTsKKworCS8qIEdyYWIgdGhl IHJpZ2h0IHNwZWVkICovCisJc3BlZWQgPSBwLT5kZXYuZHJpdmVyLT5tYXhfc3BlZWQ7CisJaWYg KHNwZWVkID09IFVTQl9TUEVFRF9VTktOT1dOIHx8IHNwZWVkID4gdmh1Yi0+c3BlZWQpCisJCXNw ZWVkID0gdmh1Yi0+c3BlZWQ7CisKKwlzd2l0Y2ggKHNwZWVkKSB7CisJY2FzZSBVU0JfU1BFRURf TE9XOgorCQlzZXQgPSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRDsKKwkJY2xyID0gVVNCX1BPUlRf U1RBVF9ISUdIX1NQRUVEOworCQlicmVhazsKKwljYXNlIFVTQl9TUEVFRF9GVUxMOgorCQlzZXQg PSAwOworCQljbHIgPSBVU0JfUE9SVF9TVEFUX0xPV19TUEVFRCB8CisJCQlVU0JfUE9SVF9TVEFU X0hJR0hfU1BFRUQ7CisJCWJyZWFrOworCWNhc2UgVVNCX1NQRUVEX0hJR0g6CisJCXNldCA9IFVT Ql9QT1JUX1NUQVRfSElHSF9TUEVFRDsKKwkJY2xyID0gVVNCX1BPUlRfU1RBVF9MT1dfU1BFRUQ7 CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVVEQ0RCRyh2aHViLCAiVW5zdXBwb3J0ZWQgc3BlZWQg JWQgd2hlbiIKKwkJICAgICAgICIgY29ubmVjdGluZyBkZXZpY2VcbiIsCisJCSAgICAgICBzcGVl ZCk7CisJCXJldHVybjsKKwl9CisJY2xyIHw9IFVTQl9QT1JUX1NUQVRfUkVTRVQ7CisJc2V0IHw9 IFVTQl9QT1JUX1NUQVRfRU5BQkxFOworCisJLyogVGhpcyBzaG91bGQgaWRlYWxseSBiZSBkZWxh eWVkIC4uLiAqLworCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwgY2xyLCBz ZXQsIHRydWUpOworfQorCitzdGF0aWMgZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX3NldF9wb3J0 X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJCSB1OCBwb3J0LCB1MTYgZmVh dCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1Y3QgYXN0X3Zo dWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IEFTVF9WSFVCX05VTV9QT1JU UykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9ydC0tOworCXAgPSAmdmh1Yi0+cG9ydHNb cG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgor CQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX0VOQUJMRSkpCisJCQlyZXR1cm4gc3Rk X3JlcV9jb21wbGV0ZTsKKwkJYXN0X3ZodWJfY2hhbmdlX3BvcnRfc3RhdCh2aHViLCBwb3J0LAor CQkJCQkgIDAsIFVTQl9QT1JUX1NUQVRfU1VTUEVORCwKKwkJCQkJICBmYWxzZSk7CisJCWFzdF92 aHViX2Rldl9zdXNwZW5kKCZwLT5kZXYpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwlj YXNlIFVTQl9QT1JUX0ZFQVRfUkVTRVQ6CisJCUVQREJHKGVwLCAiUG9ydCByZXNldCAhXG4iKTsK KwkJYXN0X3ZodWJfcG9ydF9yZXNldCh2aHViLCBwb3J0KTsKKwkJcmV0dXJuIHN0ZF9yZXFfY29t cGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX1BPV0VSOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9U RVNUOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9JTkRJQ0FUT1I6CisJCS8qIFdlIGRvbid0IGRvIGFu eXRoaW5nIHdpdGggdGhlc2UgKi8KKwkJcmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJfQorCXJl dHVybiBzdGRfcmVxX3N0YWxsOworfQorCitzdGF0aWMgZW51bSBzdGRfcmVxX3JjIGFzdF92aHVi X2Nscl9wb3J0X2ZlYXR1cmUoc3RydWN0IGFzdF92aHViX2VwICplcCwKKwkJCQkJCSB1OCBwb3J0 LCB1MTYgZmVhdCkKK3sKKwlzdHJ1Y3QgYXN0X3ZodWIgKnZodWIgPSBlcC0+dmh1YjsKKwlzdHJ1 Y3QgYXN0X3ZodWJfcG9ydCAqcDsKKworCWlmIChwb3J0ID09IDAgfHwgcG9ydCA+IEFTVF9WSFVC X05VTV9QT1JUUykKKwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJcG9ydC0tOworCXAgPSAmdmh1 Yi0+cG9ydHNbcG9ydF07CisKKwlzd2l0Y2goZmVhdCkgeworCWNhc2UgVVNCX1BPUlRfRkVBVF9F TkFCTEU6CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJICBV U0JfUE9SVF9TVEFUX0VOQUJMRSB8CisJCQkJCSAgVVNCX1BPUlRfU1RBVF9TVVNQRU5ELCAwLAor CQkJCQkgIGZhbHNlKTsKKwkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRldik7CisJCXJldHVy biBzdGRfcmVxX2NvbXBsZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9TVVNQRU5EOgorCQlpZiAo IShwLT5zdGF0dXMgJiBVU0JfUE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJcmV0dXJuIHN0ZF9yZXFf Y29tcGxldGU7CisJCWFzdF92aHViX2NoYW5nZV9wb3J0X3N0YXQodmh1YiwgcG9ydCwKKwkJCQkJ ICBVU0JfUE9SVF9TVEFUX1NVU1BFTkQsIDAsCisJCQkJCSAgZmFsc2UpOworCQlhc3Rfdmh1Yl9k ZXZfcmVzdW1lKCZwLT5kZXYpOworCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwljYXNlIFVT Ql9QT1JUX0ZFQVRfUE9XRVI6CisJCS8qIFdlIGRvbid0IGRvIHBvd2VyIGNvbnRyb2wgKi8KKwkJ cmV0dXJuIHN0ZF9yZXFfY29tcGxldGU7CisJY2FzZSBVU0JfUE9SVF9GRUFUX0lORElDQVRPUjoK KwkJLyogV2UgZG9uJ3QgaGF2ZSBpbmRpY2F0b3JzICovCisJCXJldHVybiBzdGRfcmVxX2NvbXBs ZXRlOworCWNhc2UgVVNCX1BPUlRfRkVBVF9DX0NPTk5FQ1RJT046CisJY2FzZSBVU0JfUE9SVF9G RUFUX0NfRU5BQkxFOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1NVU1BFTkQ6CisJY2FzZSBVU0Jf UE9SVF9GRUFUX0NfT1ZFUl9DVVJSRU5UOgorCWNhc2UgVVNCX1BPUlRfRkVBVF9DX1JFU0VUOgor CQkvKiBDbGVhciBzdGF0ZS1jaGFuZ2UgZmVhdHVyZSAqLworCQlwLT5jaGFuZ2UgJj0gfigxdSA8 PCAoZmVhdCAtIDE2KSk7CisJCWFzdF92aHViX3VwZGF0ZV9odWJfZXAxKHZodWIsIHBvcnQpOwor CQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsKKwl9CisJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7Cit9 CisKK3N0YXRpYyBlbnVtIHN0ZF9yZXFfcmMgYXN0X3ZodWJfZ2V0X3BvcnRfc3RhdChzdHJ1Y3Qg YXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgICAgICB1OCBwb3J0KQoreworCXN0cnVjdCBhc3Rfdmh1 YiAqdmh1YiA9IGVwLT52aHViOworCXUxNiBzdGF0LCBjaGc7CisKKwlpZiAocG9ydCA9PSAwIHx8 IHBvcnQgPiBBU1RfVkhVQl9OVU1fUE9SVFMpCisJCXJldHVybiBzdGRfcmVxX3N0YWxsOworCXBv cnQtLTsKKworCXN0YXQgPSB2aHViLT5wb3J0c1twb3J0XS5zdGF0dXM7CisJY2hnID0gdmh1Yi0+ cG9ydHNbcG9ydF0uY2hhbmdlOworCisJLyogV2UgYWx3YXlzIGhhdmUgcG93ZXIgKi8KKwlzdGF0 IHw9IFVTQl9QT1JUX1NUQVRfUE9XRVI7CisKKwlFUERCRyhlcCwgIiBwb3J0IHN0YXR1cz0lMDR4 IGNoYW5nZT0lMDR4XG4iLCBzdGF0LCBjaGcpOworCisJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9y ZXBseShlcCwKKwkJCQkgICAgIHN0YXQgJiAweGZmLAorCQkJCSAgICAgc3RhdCA+PiA4LAorCQkJ CSAgICAgY2hnICYgMHhmZiwKKwkJCQkgICAgIGNoZyA+PiA4KTsKK30KKworZW51bSBzdGRfcmVx X3JjIGFzdF92aHViX2NsYXNzX2h1Yl9yZXF1ZXN0KHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJ CQkJCSAgIHN0cnVjdCB1c2JfY3RybHJlcXVlc3QgKmNycSkKK3sKKwl1MTYgd1ZhbHVlLCB3SW5k ZXgsIHdMZW5ndGg7CisKKwl3VmFsdWUgPSBsZTE2X3RvX2NwdShjcnEtPndWYWx1ZSk7CisJd0lu ZGV4ID0gbGUxNl90b19jcHUoY3JxLT53SW5kZXgpOworCXdMZW5ndGggPSBsZTE2X3RvX2NwdShj cnEtPndMZW5ndGgpOworCisJc3dpdGNoICgoY3JxLT5iUmVxdWVzdFR5cGUgPDwgOCkgfCBjcnEt PmJSZXF1ZXN0KSB7CisJY2FzZSBHZXRIdWJTdGF0dXM6CisJCUVQREJHKGVwLCAiR2V0SHViU3Rh dHVzXG4iKTsKKwkJcmV0dXJuIGFzdF92aHViX3NpbXBsZV9yZXBseShlcCwgMCwgMCwgMCwgMCk7 CisJY2FzZSBHZXRQb3J0U3RhdHVzOgorCQlFUERCRyhlcCwgIkdldFBvcnRTdGF0dXMoJWQpXG4i LCB3SW5kZXggJiAweGZmKTsKKwkJcmV0dXJuIGFzdF92aHViX2dldF9wb3J0X3N0YXQoZXAsIHdJ bmRleCAmIDB4Zik7CisJY2FzZSBHZXRIdWJEZXNjcmlwdG9yOgorCQlpZiAod1ZhbHVlICE9IChV U0JfRFRfSFVCIDw8IDgpKQorCQkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJCUVQREJHKGVwLCAi R2V0SHViRGVzY3JpcHRvciglZClcbiIsIHdJbmRleCAmIDB4ZmYpOworCQlyZXR1cm4gYXN0X3Zo dWJfcmVwX2Rlc2MoZXAsIFVTQl9EVF9IVUIsIHdMZW5ndGgpOworCWNhc2UgU2V0SHViRmVhdHVy ZToKKwljYXNlIENsZWFySHViRmVhdHVyZToKKwkJRVBEQkcoZXAsICJHZXQvU2V0SHViRmVhdHVy ZSglZClcbiIsIHdWYWx1ZSk7CisJCS8qIE5vIGZlYXR1cmUsIGp1c3QgY29tcGxldGUgdGhlIHJl cXVlc3RzICovCisJCWlmICh3VmFsdWUgPT0gQ19IVUJfTE9DQUxfUE9XRVIgfHwKKwkJICAgIHdW YWx1ZSA9PSBDX0hVQl9PVkVSX0NVUlJFTlQpCisJCQlyZXR1cm4gc3RkX3JlcV9jb21wbGV0ZTsK KwkJcmV0dXJuIHN0ZF9yZXFfc3RhbGw7CisJY2FzZSBTZXRQb3J0RmVhdHVyZToKKwkJRVBEQkco ZXAsICJTZXRQb3J0RmVhdHVyZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJ cmV0dXJuIGFzdF92aHViX3NldF9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVl KTsKKwljYXNlIENsZWFyUG9ydEZlYXR1cmU6CisJCUVQREJHKGVwLCAiQ2xlYXJQb3J0RmVhdHVy ZSglZCwlZClcbiIsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwkJcmV0dXJuIGFzdF92aHViX2Ns cl9wb3J0X2ZlYXR1cmUoZXAsIHdJbmRleCAmIDB4Ziwgd1ZhbHVlKTsKKwlkZWZhdWx0OgorCQlF UERCRyhlcCwgIlVua25vd24gY2xhc3MgcmVxdWVzdFxuIik7CisJfQorCXJldHVybiBzdGRfcmVx X3N0YWxsOworfQorCit2b2lkIGFzdF92aHViX2h1Yl9zdXNwZW5kKHN0cnVjdCBhc3Rfdmh1YiAq dmh1YikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1cyBzdXNw ZW5kXG4iKTsKKworCWlmICh2aHViLT5zdXNwZW5kZWQpCisJCXJldHVybjsKKworCXZodWItPnN1 c3BlbmRlZCA9IHRydWU7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMg d2l0aG91dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3RhdHVzLgorCSAqLworCWZv ciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3Zo dWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0dXMgJiBVU0Jf UE9SVF9TVEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3N1c3BlbmQoJnAtPmRldik7CisJ fQorfQorCit2b2lkIGFzdF92aHViX2h1Yl9yZXN1bWUoc3RydWN0IGFzdF92aHViICp2aHViKQor eworCXVuc2lnbmVkIGludCBpOworCisJVURDREJHKHZodWIsICJVU0IgYnVzIHJlc3VtZVxuIik7 CisKKwlpZiAoIXZodWItPnN1c3BlbmRlZCkKKwkJcmV0dXJuOworCisJdmh1Yi0+c3VzcGVuZGVk ID0gZmFsc2U7CisKKwkvKgorCSAqIEZvcndhcmQgdG8gdW5zdXNwZW5kZWQgcG9ydHMgd2l0aG91 dCBjaGFuZ2luZworCSAqIHRoZWlyIGNvbm5lY3Rpb24gc3RhdHVzLgorCSAqLworCWZvciAoaSA9 IDA7IGkgPCBBU1RfVkhVQl9OVU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9y dCAqcCA9ICZ2aHViLT5wb3J0c1tpXTsKKworCQlpZiAoIShwLT5zdGF0dXMgJiBVU0JfUE9SVF9T VEFUX1NVU1BFTkQpKQorCQkJYXN0X3ZodWJfZGV2X3Jlc3VtZSgmcC0+ZGV2KTsKKwl9Cit9CisK K3ZvaWQgYXN0X3ZodWJfaHViX3Jlc2V0KHN0cnVjdCBhc3Rfdmh1YiAqdmh1YikKK3sKKwl1bnNp Z25lZCBpbnQgaTsKKworCVVEQ0RCRyh2aHViLCAiVVNCIGJ1cyByZXNldFxuIik7CisKKwkvKgor CSAqIElzIHRoZSBzcGVlZCBrbm93biA/IElmIG5vdCB3ZSBkb24ndCBjYXJlLCB3ZSBhcmVuJ3QK KwkgKiBpbml0aWFsaXplZCB5ZXQgYW5kIHBvcnRzIGhhdmVuJ3QgYmVlbiBlbmFibGVkLgorCSAq LworCWlmICh2aHViLT5zcGVlZCA9PSBVU0JfU1BFRURfVU5LTk9XTikKKwkJcmV0dXJuOworCisJ LyogV2UgYXJlbid0IHN1c3BlbmRlZCBhbnltb3JlIG9idmlvdXNseSAqLworCXZodWItPnN1c3Bl bmRlZCA9IGZhbHNlOworCisJLyogTm8gc3BlZWQgc2V0ICovCisJdmh1Yi0+c3BlZWQgPSBVU0Jf U1BFRURfVU5LTk9XTjsKKworCS8qIFdha2V1cCBub3QgZW5hYmxlZCBhbnltb3JlICovCisJdmh1 Yi0+d2FrZXVwX2VuID0gZmFsc2U7CisKKwkvKgorCSAqIENsZWFyIGFsbCBwb3J0IHN0YXR1cywg ZGlzYWJsZSBnYWRnZXRzIGFuZCAic3VzcGVuZCIKKwkgKiB0aGVtLiBUaGV5IHdpbGwgYmUgd29r ZW4gdXAgYnkgYSBwb3J0IHJlc2V0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBBU1RfVkhVQl9O VU1fUE9SVFM7IGkrKykgeworCQlzdHJ1Y3QgYXN0X3ZodWJfcG9ydCAqcCA9ICZ2aHViLT5wb3J0 c1tpXTsKKworCQkvKiBPbmx5IGtlZXAgdGhlIGNvbm5lY3RlZCBmbGFnICovCisJCXAtPnN0YXR1 cyAmPSBVU0JfUE9SVF9TVEFUX0NPTk5FQ1RJT047CisJCXAtPmNoYW5nZSA9IDA7CisKKwkJLyog U3VzcGVuZCB0aGUgZ2FkZ2V0IGlmIGFueSAqLworCQlhc3Rfdmh1Yl9kZXZfc3VzcGVuZCgmcC0+ ZGV2KTsKKwl9CisKKwkvKiBDbGVhbnVwIEhXICovCisJd3JpdGVsKDAsIHZodWItPnJlZ3MgKyBB U1RfVkhVQl9DT05GKTsKKwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMF9DVFJM KTsKKwl3cml0ZWwoVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUgfAorCSAgICAgICBWSFVCX0VQ MV9DVFJMX0VOQUJMRSwKKwkgICAgICAgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9DVFJMKTsK Kwl3cml0ZWwoMCwgdmh1Yi0+cmVncyArIEFTVF9WSFVCX0VQMV9TVFNfQ0hHKTsKK30KKwordm9p ZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3QgYXN0X3ZodWIgKnZodWIpCit7CisJdmh1Yi0+c3Bl ZWQgPSBVU0JfU1BFRURfVU5LTk9XTjsKKwlJTklUX1dPUksoJnZodWItPndha2Vfd29yaywgYXN0 X3ZodWJfd2FrZV93b3JrKTsKK30KKwpkaWZmIC0tZ2l0IGEvZHJpdmVycy91c2IvZ2FkZ2V0L3Vk Yy9hc3BlZWQtdmh1Yi92aHViLmggYi9kcml2ZXJzL3VzYi9nYWRnZXQvdWRjL2FzcGVlZC12aHVi L3ZodWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjAyZWJmZDlj MTA5MwotLS0gL2Rldi9udWxsCisrKyBiL2RyaXZlcnMvdXNiL2dhZGdldC91ZGMvYXNwZWVkLXZo dWIvdmh1Yi5oCkBAIC0wLDAgKzEsNDk2IEBACisjaWZuZGVmIF9fQVNQRUVEX1ZIVUJfSAorI2Rl ZmluZSBfX0FTUEVFRF9WSFVCX0gKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisg KiAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqIFZIVUIgcmVnaXN0ZXIgZGVmaW5pdGlv bnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCisKKyNkZWZpbmUJQVNUX1ZIVUJfQ1RSTAkJMHgwMAkvKiBSb290IEZ1bmN0 aW9uIENvbnRyb2wgJiBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJQVNUX1ZIVUJfQ09ORgkJ MHgwNAkvKiBSb290IENvbmZpZ3VyYXRpb24gU2V0dGluZyBSZWdpc3RlciAqLworI2RlZmluZQlB U1RfVkhVQl9JRVIJCTB4MDgJLyogSW50ZXJydXB0IEN0cmwgUmVnaXN0ZXIgKi8KKyNkZWZpbmUJ QVNUX1ZIVUJfSVNSCQkweDBDCS8qIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZp bmUJQVNUX1ZIVUJfRVBfQUNLX0lFUgkweDEwCS8qIFByb2dyYW1tYWJsZSBFbmRwb2ludCBQb29s IEFDSyBJbnRlcnJ1cHQgRW5hYmxlIFJlZ2lzdGVyICovCisjZGVmaW5lCUFTVF9WSFVCX0VQX05B Q0tfSUVSCTB4MTQJLyogUHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgTkFDSyBJbnRlcnJ1cHQg RW5hYmxlIFJlZ2lzdGVyICAqLworI2RlZmluZSBBU1RfVkhVQl9FUF9BQ0tfSVNSCTB4MTgJLyog UHJvZ3JhbW1hYmxlIEVuZHBvaW50IFBvb2wgQUNLIEludGVycnVwdCBTdGF0dXMgUmVnaXN0ZXIg ICovCisjZGVmaW5lIEFTVF9WSFVCX0VQX05BQ0tfSVNSCTB4MUMJLyogUHJvZ3JhbW1hYmxlIEVu ZHBvaW50IFBvb2wgTkFDSyBJbnRlcnJ1cHQgU3RhdHVzIFJlZ2lzdGVyICAqLworI2RlZmluZSBB U1RfVkhVQl9TV19SRVNUCTB4MjAJLyogRGV2aWNlIENvbnRyb2xsZXIgU29mdCBSZXNldCBFbmFi bGUgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfVVNCU1RTCQkweDI0CS8qIFVTQiBTdGF0 dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVBfVE9HR0xFCTB4MjgJLyogUHJvZ3Jh bW1hYmxlIEVuZHBvaW50IFBvb2wgRGF0YSBUb2dnbGUgVmFsdWUgU2V0ICovCisjZGVmaW5lIEFT VF9WSFVCX0lTT19GQUlMX0FDQwkweDJDCS8qIElzb2Nocm9ub3VzIFRyYW5zYWN0aW9uIEZhaWwg QWNjdW11bGF0b3IgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0NUUkwJMHgzMAkvKiBFbmRwb2lu dCAwIENvbnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX0RBVEEJ MHgzNAkvKiBCYXNlIEFkZHJlc3Mgb2YgRW5kcG9pbnQgMCBJbi9PVVQgRGF0YSBCdWZmZXIgUmVn aXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX0NUUkwJMHgzOAkvKiBFbmRwb2ludCAxIENv bnRybC9TdGF0dXMgUmVnaXN0ZXIgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAxX1NUU19DSEcJMHgz QwkvKiBFbmRwb2ludCAxIFN0YXR1cyBDaGFuZ2UgQml0bWFwIERhdGEgKi8KKyNkZWZpbmUgQVNU X1ZIVUJfU0VUVVAwCQkweDgwCS8qIFJvb3QgRGV2aWNlIFNldHVwIERhdGEgQnVmZmVyMCAqLwor I2RlZmluZSBBU1RfVkhVQl9TRVRVUDEJCTB4ODQJLyogUm9vdCBEZXZpY2UgU2V0dXAgRGF0YSBC dWZmZXIxICovCisKKy8qIE1haW4gY29udHJvbCByZWcgKi8KKyNkZWZpbmUgVkhVQl9DVFJMX1BI WV9DTEsJCQkoMSA8PCAzMSkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9MT09QX1RFU1QJCQkoMSA8 PCAyNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0ROX1BXTgkJCSgxIDw8IDI0KQorI2RlZmluZSBWSFVC X0NUUkxfRFBfUFdOCQkJKDEgPDwgMjMpCisjZGVmaW5lIFZIVUJfQ1RSTF9MT05HX0RFU0MJCQko MSA8PCAxOCkKKyNkZWZpbmUgVkhVQl9DVFJMX0lTT19SU1BfQ1RSTAkJCSgxIDw8IDE3KQorI2Rl ZmluZSBWSFVCX0NUUkxfU1BMSVRfSU4JCQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9DVFJMX0xP T1BfVF9SRVNVTFQJCQkoMSA8PCAxNSkKKyNkZWZpbmUgVkhVQl9DVFJMX0xPT1BfVF9TVFMJCQko MSA8PCAxNCkKKyNkZWZpbmUgVkhVQl9DVFJMX1BIWV9CSVNUX1JFU1VMVAkJKDEgPDwgMTMpCisj ZGVmaW5lIFZIVUJfQ1RSTF9QSFlfQklTVF9DVFJMCQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJf Q1RSTF9QSFlfUkVTRVRfRElTCQkJKDEgPDwgMTEpCisjZGVmaW5lIFZIVUJfQ1RSTF9TRVRfVEVT VF9NT0RFKHgpCQkoKHgpIDw8IDgpCisjZGVmaW5lIFZIVUJfQ1RSTF9NQU5VQUxfUkVNT1RFX1dB S0VVUAkJKDEgPDwgNCkKKyNkZWZpbmUgVkhVQl9DVFJMX0FVVE9fUkVNT1RFX1dBS0VVUAkJKDEg PDwgMykKKyNkZWZpbmUgVkhVQl9DVFJMX0NMS19TVE9QX1NVU1BFTkQJCSgxIDw8IDIpCisjZGVm aW5lIFZIVUJfQ1RSTF9GVUxMX1NQRUVEX09OTFkJCSgxIDw8IDEpCisjZGVmaW5lIFZIVUJfQ1RS TF9VUFNUUkVBTV9DT05ORUNUCQkoMSA8PCAwKQorCisvKiBJRVIgJiBJU1IgKi8KKyNkZWZpbmUg VkhVQl9JUlFfVVNCX0NNRF9ERUFETE9DSwkJKDEgPDwgMTgpCisjZGVmaW5lIFZIVUJfSVJRX0VQ X1BPT0xfTkFLCQkJKDEgPDwgMTcpCisjZGVmaW5lIFZIVUJfSVJRX0VQX1BPT0xfQUNLX1NUQUxM CQkoMSA8PCAxNikKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFNQkJCSgxIDw8IDEzKQorI2RlZmlu ZSBWSFVCX0lSUV9ERVZJQ0U0CQkJKDEgPDwgMTIpCisjZGVmaW5lIFZIVUJfSVJRX0RFVklDRTMJ CQkoMSA8PCAxMSkKKyNkZWZpbmUgVkhVQl9JUlFfREVWSUNFMgkJCSgxIDw8IDEwKQorI2RlZmlu ZSBWSFVCX0lSUV9ERVZJQ0UxCQkJKDEgPDwgOSkKKyNkZWZpbmUgVkhVQl9JUlFfQlVTX1JFU1VN RQkJCSgxIDw8IDgpCisjZGVmaW5lIFZIVUJfSVJRX0JVU19TVVNQRU5EIAkJCSgxIDw8IDcpCisj ZGVmaW5lIFZIVUJfSVJRX0JVU19SRVNFVCAJCQkoMSA8PCA2KQorI2RlZmluZSBWSFVCX0lSUV9I VUJfRVAxX0lOX0RBVEFfQUNLCQkoMSA8PCA1KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lO X0RBVEFfTkFLCQkoMSA8PCA0KQorI2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX0lOX0FDS19TVEFM TAkJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9JUlFfSFVCX0VQMF9PVVRfTkFLCQkoMSA8PCAyKQor I2RlZmluZSBWSFVCX0lSUV9IVUJfRVAwX09VVF9BQ0tfU1RBTEwJCSgxIDw8IDEpCisjZGVmaW5l IFZIVUJfSVJRX0hVQl9FUDBfU0VUVVAJCQkoMSA8PCAwKQorI2RlZmluZSBWSFVCX0lSUV9BQ0tf QUxMCQkJMHgxZmYKKworLyogVVNCIHN0YXR1cyByZWcgKi8KKyNkZWZpbmUgVkhVQl9VU0JTVFNf SElTUEVFRAkJCSgxIDw8IDI3KQorCisvKiBFUCB0b2dnbGUgKi8KKyNkZWZpbmUgVkhVQl9FUF9U T0dHTEVfVkFMVUUJCQkoMSA8PCA4KQorI2RlZmluZSBWSFVCX0VQX1RPR0dMRV9TRVRfRVBOVU0o eCkJCSgoeCkgJiAweDFmKQorCisvKiBIVUIgRVAwIGNvbnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9F UDBfQ1RSTF9TVEFMTAkJCSgxIDw8IDApCisjZGVmaW5lIFZIVUJfRVAwX1RYX0JVRkZfUkRZCQkJ KDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9FUDBfUlhfQlVGRl9SRFkJCQkoMSA8PCAyKQorI2RlZmlu ZSBWSFVCX0VQMF9SWF9MRU4oeCkJCQkoKCh4KSA+PiAxNikgJiAweDdmKQorI2RlZmluZSBWSFVC X0VQMF9TRVRfVFhfTEVOKHgpCQkJKCgoeCkgJiAweDdmKSA8PCA4KQorCisvKiBIVUIgRVAxIGNv bnRyb2wgKi8KKyNkZWZpbmUgVkhVQl9FUDFfQ1RSTF9SRVNFVF9UT0dHTEUJCSgxIDw8IDIpCisj ZGVmaW5lIFZIVUJfRVAxX0NUUkxfU1RBTEwJCQkoMSA8PCAxKQorI2RlZmluZSBWSFVCX0VQMV9D VFJMX0VOQUJMRQkJCSgxIDw8IDApCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwZXItZGV2aWNl IHJlZ2lzdGVyIGRlZmluaXRpb25zICoKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBBU1Rf VkhVQl9ERVZfRU5fQ1RSTAkJMHgwMAorI2RlZmluZSBBU1RfVkhVQl9ERVZfSVNSCQkweDA0Cisj ZGVmaW5lIEFTVF9WSFVCX0RFVl9FUDBfQ1RSTAkJMHgwOAorI2RlZmluZSBBU1RfVkhVQl9ERVZf RVAwX0RBVEEJCTB4MGMKKworLyogRGV2aWNlIGVuYWJsZSBjb250cm9sICovCisjZGVmaW5lIFZI VUJfREVWX0VOX1NFVF9BRERSKHgpCQkJKCh4KSA8PCA4KQorI2RlZmluZSBWSFVCX0RFVl9FTl9B RERSX01BU0sJCQkoKDB4ZmYpIDw8IDgpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQMF9OQUtfSVJR RU4JCSgxIDw8IDYpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQMF9JTl9BQ0tfSVJRRU4JCSgxIDw8 IDUpCisjZGVmaW5lIFZIVUJfREVWX0VOX0VQMF9PVVRfTkFLX0lSUUVOCQkoMSA8PCA0KQorI2Rl ZmluZSBWSFVCX0RFVl9FTl9FUDBfT1VUX0FDS19JUlFFTgkJKDEgPDwgMykKKyNkZWZpbmUgVkhV Ql9ERVZfRU5fRVAwX1NFVFVQX0lSUUVOCQkoMSA8PCAyKQorI2RlZmluZSBWSFVCX0RFVl9FTl9T UEVFRF9TRUxfSElHSAkJKDEgPDwgMSkKKyNkZWZpbmUgVkhVQl9ERVZfRU5fRU5BQkxFX1BPUlQJ CQkoMSA8PCAwKQorCisvKiBJbnRlcnJ1cHQgc3RhdHVzICovCisjZGVmaW5lIFZIVVZfREVWX0lS UV9FUDBfSU5fREFUQV9OQUNLCQkoMSA8PCA0KQorI2RlZmluZSBWSFVWX0RFVl9JUlFfRVAwX0lO X0FDS19TVEFMTAkJKDEgPDwgMykKKyNkZWZpbmUgVkhVVl9ERVZfSVJRX0VQMF9PVVRfREFUQV9O QUNLCQkoMSA8PCAyKQorI2RlZmluZSBWSFVWX0RFVl9JUlFfRVAwX09VVF9BQ0tfU1RBTEwJCSgx IDw8IDEpCisjZGVmaW5lIFZIVVZfREVWX0lSUV9FUDBfU0VUVVAJCQkoMSA8PCAwKQorCisvKiBD b250cm9sIGJpdHMuCisgKgorICogTm90ZTogVGhlIGRyaXZlciByZWxpZXMgb24gdGhlIGJ1bGsg b2YgdGhvc2UgYml0cworICogICAgICAgbWF0Y2hpbmcgY29ycmVzcG9uZGluZyB2SHViIEVQMCBj b250cm9sIGJpdHMKKyAqLworI2RlZmluZSBWSFVCX0RFVl9FUDBfQ1RSTF9TVEFMTAkJCVZIVUJf RVAwX0NUUkxfU1RBTEwKKyNkZWZpbmUgVkhVQl9ERVZfRVAwX1RYX0JVRkZfUkRZCQlWSFVCX0VQ MF9UWF9CVUZGX1JEWQorI2RlZmluZSBWSFVCX0RFVl9FUDBfUlhfQlVGRl9SRFkJCVZIVUJfRVAw X1JYX0JVRkZfUkRZCisjZGVmaW5lIFZIVUJfREVWX0VQMF9SWF9MRU4oeCkJCQlWSFVCX0VQMF9S WF9MRU4oeCkKKyNkZWZpbmUgVkhVQl9ERVZfRVAwX1NFVF9UWF9MRU4oeCkJCVZIVUJfRVAwX1NF VF9UWF9MRU4oeCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAq ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBwZXItZW5kcG9pbnQgcmVn aXN0ZXIgZGVmaW5pdGlvbnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFT VF9WSFVCX0VQX0NPTkZJRwkJMHgwMAorI2RlZmluZSBBU1RfVkhVQl9FUF9ETUFfQ1RMU1RBVAkJ MHgwNAorI2RlZmluZSBBU1RfVkhVQl9FUF9ERVNDX0JBU0UJCTB4MDgKKyNkZWZpbmUgQVNUX1ZI VUJfRVBfREVTQ19TVEFUVVMJCTB4MEMKKworLyogRVAgY29uZmlnIHJlZyAqLworI2RlZmluZSBW SFVCX0VQX0NGR19TRVRfTUFYX1BLVCh4KQkoKCh4KSAmIDB4M2ZmKSA8PCAxNikKKyNkZWZpbmUg VkhVQl9FUF9DRkdfQVVUT19EQVRBX0RJU0FCTEUJKDEgPDwgMTMpCisjZGVmaW5lIFZIVUJfRVBf Q0ZHX1NUQUxMX0NUUkwJCSgxIDw8IDEyKQorI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfRVBfTlVN KHgpCSgoKHgpICYgMHhmKSA8PCA4KQorI2RlZmluZSBWSFVCX0VQX0NGR19TRVRfVFlQRSh4KQkJ KCh4KSA8PCA1KQorI2RlZmluZSAgIEVQX1RZUEVfT0ZGCQkJMAorI2RlZmluZSAgIEVQX1RZUEVf QlVMSwkJCTEKKyNkZWZpbmUgICBFUF9UWVBFX0lOVAkJCTIKKyNkZWZpbmUgICBFUF9UWVBFX0lT TwkJCTMKKyNkZWZpbmUgVkhVQl9FUF9DRkdfRElSX09VVAkJKDEgPDwgNCkKKyNkZWZpbmUgVkhV Ql9FUF9DRkdfU0VUX0RFVih4KQkJKCh4KSA8PCAxKQorI2RlZmluZSBWSFVCX0VQX0NGR19FTkFC TEUJCSgxIDw8IDApCisKKy8qIEVQIERNQSBjb250cm9sICovCisjZGVmaW5lIFZIVUJfRVBfRE1B X1BST0NfU1RBVFVTKHgpCSgoKHgpID4+IDQpICYgMHhmKQorI2RlZmluZSAgIEVQX0RNQV9QUk9D X1JYX0lETEUJCTAKKyNkZWZpbmUgICBFUF9ETUFfUFJPQ19UWF9JRExFCQk4CisjZGVmaW5lIFZI VUJfRVBfRE1BX0lOX0xPTkdfTU9ERQkoMSA8PCAzKQorI2RlZmluZSBWSFVCX0VQX0RNQV9PVVRf Q09OVElHX01PREUJKDEgPDwgMykKKyNkZWZpbmUgVkhVQl9FUF9ETUFfQ1RSTF9SRVNFVAkJKDEg PDwgMikKKyNkZWZpbmUgVkhVQl9FUF9ETUFfU0lOR0xFX1NUQUdFCSgxIDw8IDEpCisjZGVmaW5l IFZIVUJfRVBfRE1BX0RFU0NfTU9ERQkJKDEgPDwgMCkKKworLyogRVAgRE1BIHN0YXR1cyAqLwor I2RlZmluZSBWSFVCX0VQX0RNQV9TRVRfVFhfU0laRSh4KQkoKHgpIDw8IDE2KQorI2RlZmluZSBW SFVCX0VQX0RNQV9UWF9TSVpFKHgpCQkoKCh4KSA+PiAxNikgJiAweDdmZikKKyNkZWZpbmUgVkhV Ql9FUF9ETUFfUlBUUih4KQkJKCgoeCkgPj4gOCkgJiAweGZmKQorI2RlZmluZSBWSFVCX0VQX0RN QV9TRVRfUlBUUih4KQkJKCgoeCkgJiAweGZmKSA8PCA4KQorI2RlZmluZSBWSFVCX0VQX0RNQV9T RVRfQ1BVX1dQVFIoeCkJKHgpCisjZGVmaW5lIFZIVUJfRVBfRE1BX1NJTkdMRV9LSUNLCQkoMSA8 PCAwKSAvKiBXUFRSID0gMSBmb3Igc2luZ2xlIG1vZGUgKi8KKworLyoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgKiBETUEg ZGVzY3JpcHRvcnMgZGVmaW5pdGlvbnMgKgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAg ICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBEZXNjIFcxIElOICov CisjZGVmaW5lIFZIVUJfRFNDMV9JTl9JTlRFUlJVUFQJCSgxIDw8IDMxKQorI2RlZmluZSBWSFVC X0RTQzFfSU5fU1BJRF9EQVRBMAkJKDAgPDwgMTQpCisjZGVmaW5lIFZIVUJfRFNDMV9JTl9TUElE X0RBVEEyCQkoMSA8PCAxNCkKKyNkZWZpbmUgVkhVQl9EU0MxX0lOX1NQSURfREFUQTEJCSgyIDw8 IDE0KQorI2RlZmluZSBWSFVCX0RTQzFfSU5fU1BJRF9NREFUQQkJKDMgPDwgMTQpCisjZGVmaW5l IFZIVUJfRFNDMV9JTl9TRVRfTEVOKHgpCQkoKHgpICYgMHhmZmYpCisjZGVmaW5lIFZIVUJfRFND MV9JTl9MRU4oeCkJCSgoeCkgJiAweGZmZikKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAq CisgKiBEYXRhIHN0cnVjdHVyZXMgYW5kIG1pc2MgZGVmaW5pdGlvbnMgKgorICogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqLworCisjZGVmaW5lIEFTVF9WSFVCX05VTV9HRU5fRVBzCTE1CS8qIEdl bmVyaWMgbm9uLTAgRVBzICovCisjZGVmaW5lIEFTVF9WSFVCX05VTV9QT1JUUwk1CS8qIHZIdWIg cG9ydHMgKi8KKyNkZWZpbmUgQVNUX1ZIVUJfRVAwX01BWF9QQUNLRVQJNjQJLyogRVAwJ3MgbWF4 IHBhY2tldCBzaXplICovCisjZGVmaW5lIEFTVF9WSFVCX0VQbl9NQVhfUEFDS0VUCTEwMjQJLyog R2VuZXJpYyBFUHMgbWF4IHBhY2tldCBzaXplICovCisjZGVmaW5lIEFTVF9WSFVCX0RFU0NTX0NP VU5UCTI1NgkvKiBVc2UgMjU2IGRlc2NyaXB0b3IgbW9kZSAqLworCitzdHJ1Y3QgYXN0X3ZodWI7 CitzdHJ1Y3QgYXN0X3ZodWJfZGV2OworCisvKgorICogRE1BIGRlc2NyaXB0b3IgKGdlbmVyaWMg RVBzIG9ubHksIGN1cnJlbnRseSBvbmx5IHVzZWQKKyAqIGZvciBJTiBlbmRwb2ludHMKKyAqLwor c3RydWN0IGFzdF92aHViX2Rlc2MgeworCV9fbGUzMgl3MDsKKwlfX2xlMzIJdzE7Cit9OworCisv KiBBIHRyYW5zZmVyIHJlcXVlc3QsIGVpdGhlciBjb3JlLW9yaWdpbmF0ZWQgb3IgaW50ZXJuYWwg Ki8KK3N0cnVjdCBhc3Rfdmh1Yl9yZXEgeworCXN0cnVjdCB1c2JfcmVxdWVzdAlyZXE7CisJc3Ry dWN0IGxpc3RfaGVhZAlxdWV1ZTsKKworCS8qIEFjdHVhbCBjb3VudCB3cml0dGVuIHRvIGRlc2Ny aXB0b3JzIChkZXNjIG1vZGUgb25seSkgKi8KKwl1bnNpZ25lZCBpbnQJCWFjdF9jb3VudDsKKwor CS8qCisJICogRGVzYyBudW1iZXIgb2YgdGhlIGZpbmFsIHBhY2tldCBvciAtMS4gRm9yIG5vbi1k ZXNjCisJICogbW9kZSAob3IgZXAwKSwgYW55ID49IDAgdmFsdWUgbWVhbnMgImxhc3QgcGFja2V0 IgorCSAqLworCWludAkJCWxhc3RfZGVzYzsKKworCS8qIFJlcXVlc3QgYWN0aXZlIChwZW5kaW5n IERNQXMpICovCisJYm9vbAkJCWFjdGl2ZSAgOiAxOworCisJLyogSW50ZXJuYWwgcmVxdWVzdCAo ZG9uJ3QgY2FsbCBiYWNrIGNvcmUpICovCisJYm9vbAkJCWludGVybmFsIDogMTsKK307CisjZGVm aW5lIHRvX2FzdF9yZXEoX191cmVxKSBjb250YWluZXJfb2YoX191cmVxLCBzdHJ1Y3QgYXN0X3Zo dWJfcmVxLCByZXEpCisKKy8qIEN1cnJlbnQgc3RhdGUgb2YgYW4gRVAwICovCitlbnVtIGVwMF9z dGF0ZSB7CisJZXAwX3N0YXRlX3Rva2VuLAorCWVwMF9zdGF0ZV9kYXRhLAorCWVwMF9zdGF0ZV9z dGF0dXMsCit9OworCisvKgorICogQW4gZW5kcG9pbnQsIGVpdGhlciBnZW5lcmljLCBlcDAsIGFj dHVhbCBnYWRnZXQgRVAKKyAqIG9yIGludGVybmFsIHVzZSB2aHViIEVQMC4gdmh1YiBFUDEgZG9l c24ndCBoYXZlIGFuCisgKiBhc3NvY2lhdGVkIHN0cnVjdHVyZSBhcyBpdCdzIG1vc3RseSBIVyBt YW5hZ2VkLgorICovCitzdHJ1Y3QgYXN0X3ZodWJfZXAgeworCXN0cnVjdCB1c2JfZXAJCWVwOwor CisJLyogUmVxdWVzdCBxdWV1ZSAqLworCXN0cnVjdCBsaXN0X2hlYWQJcXVldWU7CisKKwkvKiBF UCBpbmRleCBpbiB0aGUgZGV2aWNlLCAwIG1lYW5zIHRoaXMgaXMgYW4gRVAwICovCisJdW5zaWdu ZWQgaW50CQlkX2lkeDsKKworCS8qIERldiBwb2ludGVyIG9yIE5VTEwgZm9yIHZIdWIgRVAwICov CisJc3RydWN0IGFzdF92aHViX2RldgkqZGV2OworCisJLyogdkh1YiBpdHNlbGYgKi8KKwlzdHJ1 Y3QgYXN0X3ZodWIJCSp2aHViOworCisJLyoKKwkgKiBETUEgYnVmZmVyIGZvciBFUDAsIGZhbGxi YWNrIERNQSBidWZmZXIgZm9yIG1pc2FsaWduZWQKKwkgKiBPVVQgdHJhbnNmZXJzIGZvciBnZW5l cmljIEVQcworCSAqLworCXZvaWQJCQkqYnVmOworCWRtYV9hZGRyX3QJCWJ1Zl9kbWE7CisKKwkv KiBUaGUgcmVzdCBkZXBlbmRzIG9uIHRoZSBFUCB0eXBlICovCisJdW5pb24geworCQkvKiBFUDAg KGVpdGhlciBkZXZpY2Ugb3Igdmh1YikgKi8KKwkJc3RydWN0IHsKKwkJCS8qCisJCQkgKiBFUDAg cmVnaXN0ZXJzIGFyZSAic2ltaWxhciIgZm9yCisJCQkgKiB2SHViIGFuZCBkZXZpY2VzIGJ1dCBs b2NhdGVkIGluCisJCQkgKiBkaWZmZXJlbnQgcGxhY2VzLgorCQkJICovCisJCQl2b2lkIF9faW9t ZW0JCSpjdGxzdGF0OworCQkJdm9pZCBfX2lvbWVtCQkqc2V0dXA7CisKKwkJCS8qIEN1cnJlbnQg c3RhdGUgJiBkaXJlY3Rpb24gKi8KKwkJCWVudW0gZXAwX3N0YXRlCQlzdGF0ZTsKKwkJCWJvb2wJ CQlkaXJfaW47CisKKwkJCS8qIEludGVybmFsIHVzZSByZXF1ZXN0ICovCisJCQlzdHJ1Y3QgYXN0 X3ZodWJfcmVxCXJlcTsKKwkJfSBlcDA7CisKKwkJLyogR2VuZXJpYyBlbmRwb2ludCAoYWthIEVQ bikgKi8KKwkJc3RydWN0IHsKKwkJCS8qIFJlZ2lzdGVycyAqLworCQkJdm9pZCBfX2lvbWVtICAg CQkqcmVnczsKKworCQkJLyogSW5kZXggaW4gZ2xvYmFsIHBvb2wgKDAuLjE0KSAqLworCQkJdW5z aWduZWQgaW50CQlnX2lkeDsKKworCQkJLyogRE1BIERlc2NyaXB0b3JzICovCisJCQlzdHJ1Y3Qg YXN0X3ZodWJfZGVzYwkqZGVzY3M7CisJCQlkbWFfYWRkcl90CQlkZXNjc19kbWE7CisJCQl1bnNp Z25lZCBpbnQJCWRfbmV4dDsKKwkJCXVuc2lnbmVkIGludAkJZF9sYXN0OworCQkJdW5zaWduZWQg aW50CQlkbWFfY29uZjsKKworCQkJLyogTWF4IGNodW5rIHNpemUgZm9yIElOIEVQcyAqLworCQkJ dW5zaWduZWQgaW50CQljaHVua19tYXg7CisKKwkJCS8qIFN0YXRlIGZsYWdzICovCisJCQlib29s CQkJaXNfaW4gOiAgMTsKKwkJCWJvb2wJCQlpc19pc28gOiAxOworCQkJYm9vbAkJCXN0YWxsZWQg OiAxOworCQkJYm9vbAkJCXdlZGdlZCA6IDE7CisJCQlib29sCQkJZW5hYmxlZCA6IDE7CisJCQli b29sCQkJZGVzY19tb2RlIDogMTsKKwkJfSBlcG47CisJfTsKK307CisjZGVmaW5lIHRvX2FzdF9l cChfX3VlcCkgY29udGFpbmVyX29mKF9fdWVwLCBzdHJ1Y3QgYXN0X3ZodWJfZXAsIGVwKQorCisv KiBBIGRldmljZSBhdHRhY2hlZCB0byBhIHZIdWIgcG9ydCAqLworc3RydWN0IGFzdF92aHViX2Rl diB7CisJc3RydWN0IGFzdF92aHViCQkJKnZodWI7CisJdm9pZCBfX2lvbWVtCQkJKnJlZ3M7CisK KwkvKiBEZXZpY2UgaW5kZXggKDAuLi40KSBhbmQgbmFtZSBzdHJpbmcgKi8KKwl1bnNpZ25lZCBp bnQJCQlpbmRleDsKKwljb25zdCBjaGFyCQkJKm5hbWU7CisKKwkvKiBzeXNmcyBlbmNsb3N1cmUg Zm9yIHRoZSBnYWRnZXQgZ3VuayAqLworCXN0cnVjdCBkZXZpY2UJCQlwb3J0X2RldjsKKworCS8q IExpbmsgdG8gZ2FkZ2V0IGNvcmUgKi8KKwlzdHJ1Y3QgdXNiX2dhZGdldAkJZ2FkZ2V0OworCXN0 cnVjdCB1c2JfZ2FkZ2V0X2RyaXZlcgkqZHJpdmVyOworCWJvb2wJCQkJcmVnaXN0ZXJlZCA6IDE7 CisJYm9vbAkJCQl3YWtldXBfZW4gOiAxOworCWJvb2wJCQkJc3VzcGVuZGVkIDogMTsKKwlib29s CQkJCWVuYWJsZWQgOiAxOworCisJLyogRW5kcG9pbnQgc3RydWN0dXJlcyAqLworCXN0cnVjdCBh c3Rfdmh1Yl9lcAkJZXAwOworCXN0cnVjdCBhc3Rfdmh1Yl9lcAkJKmVwbnNbQVNUX1ZIVUJfTlVN X0dFTl9FUHNdOworCit9OworI2RlZmluZSB0b19hc3RfZGV2KF9fZykgY29udGFpbmVyX29mKF9f Zywgc3RydWN0IGFzdF92aHViX2RldiwgZ2FkZ2V0KQorCisvKiBQZXIgdmh1YiBwb3J0IHN0YXRl aW5mbyBzdHJ1Y3R1cmUgKi8KK3N0cnVjdCBhc3Rfdmh1Yl9wb3J0IHsKKwkvKiBQb3J0IHN0YXR1 cyAmIHN0YXR1cyBjaGFuZ2UgcmVnaXN0ZXJzICovCisJdTE2CQkJc3RhdHVzOworCXUxNgkJCWNo YW5nZTsKKworCS8qIEFzc29jaWF0ZWQgZGV2aWNlIHNsb3QgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJf ZGV2CWRldjsKK307CisKKy8qIEdsb2JhbCB2aHViIHN0cnVjdHVyZSAqLworc3RydWN0IGFzdF92 aHViIHsKKwlzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlCQkqcGRldjsKKwl2b2lkIF9faW9tZW0JCQkq cmVnczsKKwl1bnNpZ25lZCBpbnQJCQlpcnE7CisJc3BpbmxvY2tfdAkJCWxvY2s7CisJc3RydWN0 IHdvcmtfc3RydWN0CQl3YWtlX3dvcms7CisJc3RydWN0IGNsawkJCSpjbGs7CisKKwkvKiBFUDAg RE1BIGJ1ZmZlcnMgYWxsb2NhdGVkIGluIG9uZSBjaHVuayAqLworCXZvaWQJCQkJKmVwMF9idWZz OworCWRtYV9hZGRyX3QJCQllcDBfYnVmc19kbWE7CisKKwkvKiBFUDAgb2YgdGhlIHZodWIgaXRz ZWxmICovCisJc3RydWN0IGFzdF92aHViX2VwCQllcDA7CisKKwkvKiBTdGF0ZSBvZiB2aHViIGVw MSAqLworCWJvb2wJCQkJZXAxX3N0YWxsZWQgOiAxOworCisJLyogUGVyLXBvcnQgaW5mbyAqLwor CXN0cnVjdCBhc3Rfdmh1Yl9wb3J0CQlwb3J0c1tBU1RfVkhVQl9OVU1fUE9SVFNdOworCisJLyog R2VuZXJpYyBFUCBkYXRhIHN0cnVjdHVyZXMgKi8KKwlzdHJ1Y3QgYXN0X3ZodWJfZXAJCWVwbnNb QVNUX1ZIVUJfTlVNX0dFTl9FUHNdOworCisJLyogVXBzdHJlYW0gYnVzIGlzIHN1c3BlbmRlZCA/ ICovCisJYm9vbAkJCQlzdXNwZW5kZWQgOiAxOworCisJLyogSHViIGl0c2VsZiBjYW4gc2lnbmFs IHJlbW90ZSB3YWtldXAgKi8KKwlib29sCQkJCXdha2V1cF9lbiA6IDE7CisKKwkvKiBGb3JjZSBm dWxsIHNwZWVkIG9ubHkgKi8KKwlib29sCQkJCWZvcmNlX3VzYjEgOiAxOworCisJLyogRGlzYWJs ZSBETUEgZGVzY3JpcHRvciBtb2RlICovCisJYm9vbAkJCQlub19kbWFfZGVzYyA6IDE7CisKKwkv KiBEaXNhYmxlIERNQSBkZXNjcmlwdG9yIG1vZGUgKi8KKwlib29sCQkJCW5vX2xhcmdlX3NlbmRz IDogMTsKKworCS8qIFVwc3RyZWFtIGJ1cyBzcGVlZCBjYXB0dXJlZCBhdCBidXMgcmVzZXQgKi8K Kwl1bnNpZ25lZCBpbnQJCQlzcGVlZDsKK307CisKKy8qIFN0YW5kYXJkIHJlcXVlc3QgaGFuZGxl cnMgcmVzdWx0IGNvZGVzICovCitlbnVtIHN0ZF9yZXFfcmMgeworCXN0ZF9yZXFfc3RhbGwgPSAt MSwJLyogU3RhbGwgcmVxdWVzdGVkICovCisJc3RkX3JlcV9jb21wbGV0ZSA9IDAsCS8qIFJlcXVl c3QgY29tcGxldGVkIHdpdGggbm8gZGF0YSAqLworCXN0ZF9yZXFfZGF0YSA9IDEsCS8qIFJlcXVl c3QgY29tcGxldGVkIHdpdGggZGF0YSAqLworCXN0ZF9yZXFfZHJpdmVyID0gMiwJLyogUGFzcyB0 byBkcml2ZXIgcGxzICovCit9OworCisjaWZkZWYgQ09ORklHX1VTQl9HQURHRVRfVkVSQk9TRQor I2RlZmluZSBVRENWREJHKHUsIGZtdC4uLikJZGV2X2RiZygmKHUpLT5wZGV2LT5kZXYsIGZtdCkK KworI2RlZmluZSBFUFZEQkcoZXAsIGZtdCwgLi4uKQlkbyB7CQkJXAorCWRldl9kYmcoJihlcCkt PnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlczpFUCVkICIgZm10LAkJCQlcCisJCShlcCktPmRl diA/IChlcCktPmRldi0+bmFtZSA6ICJodWIiLAlcCisJCShlcCktPmRfaWR4LCAjI19fVkFfQVJH U19fKTsJCVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRFZEQkcoZCwgZm10LCAuLi4pCWRvIHsJ CQlcCisJZGV2X2RiZygmKGQpLT52aHViLT5wZGV2LT5kZXYsCQkJXAorCQkiJXMgIiBmbXQsIChk KS0+bmFtZSwJCQlcCisJCSMjX19WQV9BUkdTX18pOwkJCQlcCisJfSB3aGlsZSgwKQorCisjZWxz ZQorI2RlZmluZSBVRENWREJHKHUsIGZtdC4uLikJZG8geyB9IHdoaWxlKDApCisjZGVmaW5lIEVQ VkRCRyhlcCwgZm10LCAuLi4pCWRvIHsgfSB3aGlsZSgwKQorI2RlZmluZSBEVkRCRyhkLCBmbXQs IC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworI2lmZGVmIENPTkZJR19VU0JfR0FER0VU X0RFQlVHCisjZGVmaW5lIFVEQ0RCRyh1LCBmbXQuLi4pCWRldl9kYmcoJih1KS0+cGRldi0+ZGV2 LCBmbXQpCisKKyNkZWZpbmUgRVBEQkcoZXAsIGZtdCwgLi4uKQlkbyB7CQkJXAorCWRldl9kYmco JihlcCktPnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlczpFUCVkICIgZm10LAkJCQlcCisJCShl cCktPmRldiA/IChlcCktPmRldi0+bmFtZSA6ICJodWIiLAlcCisJCShlcCktPmRfaWR4LCAjI19f VkFfQVJHU19fKTsJCVwKKwl9IHdoaWxlKDApCisKKyNkZWZpbmUgRERCRyhkLCBmbXQsIC4uLikJ ZG8gewkJCVwKKwlkZXZfZGJnKCYoZCktPnZodWItPnBkZXYtPmRldiwJCQlcCisJCSIlcyAiIGZt dCwgKGQpLT5uYW1lLAkJCVwKKwkJIyNfX1ZBX0FSR1NfXyk7CQkJCVwKKwl9IHdoaWxlKDApCisj ZWxzZQorI2RlZmluZSBVRENEQkcodSwgZm10Li4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUg RVBEQkcoZXAsIGZtdCwgLi4uKQlkbyB7IH0gd2hpbGUoMCkKKyNkZWZpbmUgRERCRyhkLCBmbXQs IC4uLikJZG8geyB9IHdoaWxlKDApCisjZW5kaWYKKworLyogY29yZS5jICovCit2b2lkIGFzdF92 aHViX2RvbmUoc3RydWN0IGFzdF92aHViX2VwICplcCwgc3RydWN0IGFzdF92aHViX3JlcSAqcmVx LAorCQkgICBpbnQgc3RhdHVzKTsKK3ZvaWQgYXN0X3ZodWJfbnVrZShzdHJ1Y3QgYXN0X3ZodWJf ZXAgKmVwLCBpbnQgc3RhdHVzKTsKK3N0cnVjdCB1c2JfcmVxdWVzdCAqYXN0X3ZodWJfYWxsb2Nf cmVxdWVzdChzdHJ1Y3QgdXNiX2VwICp1X2VwLAorCQkJCQkgICBnZnBfdCBnZnBfZmxhZ3MpOwor dm9pZCBhc3Rfdmh1Yl9mcmVlX3JlcXVlc3Qoc3RydWN0IHVzYl9lcCAqdV9lcCwgc3RydWN0IHVz Yl9yZXF1ZXN0ICp1X3JlcSk7Cit2b2lkIGFzdF92aHViX2luaXRfaHcoc3RydWN0IGFzdF92aHVi ICp2aHViKTsKKworLyogZXAwLmMgKi8KK3ZvaWQgYXN0X3ZodWJfZXAwX2hhbmRsZV9hY2soc3Ry dWN0IGFzdF92aHViX2VwICplcCwgYm9vbCBpbl9hY2spOwordm9pZCBhc3Rfdmh1Yl9lcDBfaGFu ZGxlX3NldHVwKHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXApOwordm9pZCBhc3Rfdmh1Yl9pbml0X2Vw MChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHN0cnVjdCBhc3Rfdmh1Yl9lcCAqZXAsCisJCSAgICAg ICBzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkZXYpOworaW50IGFzdF92aHViX3JlcGx5KHN0cnVjdCBh c3Rfdmh1Yl9lcCAqZXAsIGNoYXIgKnB0ciwgaW50IGxlbik7CitpbnQgX19hc3Rfdmh1Yl9zaW1w bGVfcmVwbHkoc3RydWN0IGFzdF92aHViX2VwICplcCwgaW50IGxlbiwgLi4uKTsKKyNkZWZpbmUg YXN0X3ZodWJfc2ltcGxlX3JlcGx5KHVkYywgLi4uKQkJCQkJICAgICAgIFwKKwlfX2FzdF92aHVi X3NpbXBsZV9yZXBseSgodWRjKSwJCQkJCSAgICAgICBcCisJCQkgICAgICAgc2l6ZW9mKCh1OFtd KSB7IF9fVkFfQVJHU19fIH0pL3NpemVvZih1OCksICAgICAgXAorCQkJICAgICAgIF9fVkFfQVJH U19fKQorCisvKiBodWIuYyAqLwordm9pZCBhc3Rfdmh1Yl9pbml0X2h1YihzdHJ1Y3QgYXN0X3Zo dWIgKnZodWIpOworZW51bSBzdGRfcmVxX3JjIGFzdF92aHViX3N0ZF9odWJfcmVxdWVzdChzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmVwLAorCQkJCQkgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsK K2VudW0gc3RkX3JlcV9yYyBhc3Rfdmh1Yl9jbGFzc19odWJfcmVxdWVzdChzdHJ1Y3QgYXN0X3Zo dWJfZXAgKmVwLAorCQkJCQkgICBzdHJ1Y3QgdXNiX2N0cmxyZXF1ZXN0ICpjcnEpOwordm9pZCBh c3Rfdmh1Yl9kZXZpY2VfY29ubmVjdChzdHJ1Y3QgYXN0X3ZodWIgKnZodWIsIHVuc2lnbmVkIGlu dCBwb3J0LAorCQkJICAgICBib29sIG9uKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3N1c3BlbmQoc3Ry dWN0IGFzdF92aHViICp2aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3Jlc3VtZShzdHJ1Y3QgYXN0 X3ZodWIgKnZodWIpOwordm9pZCBhc3Rfdmh1Yl9odWJfcmVzZXQoc3RydWN0IGFzdF92aHViICp2 aHViKTsKK3ZvaWQgYXN0X3ZodWJfaHViX3dha2VfYWxsKHN0cnVjdCBhc3Rfdmh1YiAqdmh1Yik7 CisKKy8qIGRldi5jICovCitpbnQgYXN0X3ZodWJfaW5pdF9kZXYoc3RydWN0IGFzdF92aHViICp2 aHViLCB1bnNpZ25lZCBpbnQgaWR4KTsKK3ZvaWQgYXN0X3ZodWJfZGVsX2RldihzdHJ1Y3QgYXN0 X3ZodWJfZGV2ICpkKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X2lycShzdHJ1Y3QgYXN0X3ZodWJfZGV2 ICpkKTsKK2ludCBhc3Rfdmh1Yl9zdGRfZGV2X3JlcXVlc3Qoc3RydWN0IGFzdF92aHViX2VwICpl cCwKKwkJCSAgICAgc3RydWN0IHVzYl9jdHJscmVxdWVzdCAqY3JxKTsKKworLyogZXBuLmMgKi8K K3ZvaWQgYXN0X3ZodWJfZXBuX2Fja19pcnEoc3RydWN0IGFzdF92aHViX2VwICplcCk7Cit2b2lk IGFzdF92aHViX3VwZGF0ZV9lcG5fc3RhbGwoc3RydWN0IGFzdF92aHViX2VwICplcCk7CitzdHJ1 Y3QgYXN0X3ZodWJfZXAgKmFzdF92aHViX2FsbG9jX2VwbihzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpk LCB1OCBhZGRyKTsKK3ZvaWQgYXN0X3ZodWJfZGV2X3N1c3BlbmQoc3RydWN0IGFzdF92aHViX2Rl diAqZCk7Cit2b2lkIGFzdF92aHViX2Rldl9yZXN1bWUoc3RydWN0IGFzdF92aHViX2RldiAqZCk7 Cit2b2lkIGFzdF92aHViX2Rldl9yZXNldChzdHJ1Y3QgYXN0X3ZodWJfZGV2ICpkKTsKKworI2Vu ZGlmIC8qIF9fQVNQRUVEX1ZIVUJfSCAqLwo=