From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Geoffrey D. Bennett" Subject: [PATCH V6] ALSA: usb-audio: Scarlett Gen 2 mixer interface Date: Thu, 11 Jul 2019 00:30:23 +0930 Message-ID: <20190710150023.GA29550@b4.vu> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from b4.vu (b4.vu [203.16.231.147]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 282C5F802A1 for ; Wed, 10 Jul 2019 17:00:28 +0200 (CEST) Content-Disposition: inline List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" To: alsa-devel@alsa-project.org Cc: Takashi Iwai List-Id: alsa-devel@alsa-project.org QWRkIG1peGVyIHF1aXJrIGZvciB0aGUgRm9jdXNyaXRlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5k IDE4aTIwIEdlbiAyCmF1ZGlvIGludGVyZmFjZXMuIEFsdGhvdWdoIHRoZSBpbnRlcmZhY2VzIGFy ZSBVU0IgY29tcGxpYW50LAphZGRpdGlvbmFsIGlucHV0L291dHB1dCBsZXZlbCBjb250cm9scyBh bmQgaGFyZHdhcmUgcm91dGluZy9taXhpbmcKZnVuY3Rpb25hbGl0eSBhcmUgYXZhaWxhYmxlIHVz aW5nIHByb3ByaWV0YXJ5IFVTQiByZXF1ZXN0cy4KClNpZ25lZC1vZmYtYnk6IEdlb2ZmcmV5IEQu IEJlbm5ldHQgPGdAYjQudnU+Ci0tLQpIaSBhbGwsCgpUaGlzIHBhdGNoIGFkZHMgdGhlIGZvbGxv d2luZyBjb250cm9scyBmb3IgdGhlIFNjYXJsZXR0IDZpNiwgMThpOCwgYW5kCjE4aTIwIEdlbiAy OgotIE1hc3RlciB2b2x1bWUga25vYiBpbmRpY2F0b3IgKDE4aTIwIG9ubHkpCi0gTXV0ZSBhbmQg ZGltIHN3aXRjaGVzICgxOGkyMCBvbmx5KQotIFZvbHVtZSBjb250cm9scyBmb3IgdGhlIGFuYWxv Z3VlIEhXIG91dHB1dHMKLSBIVy9TVyB2b2x1bWUgc3dpdGNoZXMgZm9yIHRoZSAxMCBhbmFsb2d1 ZSBIVyBvdXRwdXRzICgxOGkyMCBvbmx5KQotIExpbmUgTGV2ZWwvSW5zdHJ1bWVudCBMZXZlbCBh bmQgUGFkIGNvbnRyb2xzICg2aTYgYW5kIDE4aTggb25seSkKLSBPdXRwdXQgbXV4ICh3aGVyZSB0 aGUgc291bmQgZm9yIHRoZSBIVyBvdXRwdXRzIGNvbWVzIGZyb207IGRlZmF1bHRzCiAgdG8gUENN IG91dHB1dHMpCi0gQ2FwdHVyZSBtdXggKHdoZXJlIHRoZSBzb3VuZCBmb3IgUENNIHJlY29yZGlu ZyBjb21lcyBmcm9tOyBkZWZhdWx0cwogIHRvIEhXIGlucHV0cykKLSBNYXRyaXggbXV4ICh3aGVy ZSB0aGUgc291bmQgZ29pbmcgaW50byB0aGUgbWl4ZXIgY29tZXMgZnJvbTsgMTgKICBpbnB1dHMg ZGVmYXVsdCBvZmYpCi0gTWl4ZXIgbWF0cml4ICgxOCBpbnB1dHMgKiAxMCBvdXRwdXRzID0gMTgw IGNvbnRyb2xzKQotIExldmVsIG1ldGVycwoKQ2hhbmdlcyBzaW5jZSB2MToKLSBBZGQgc3VwcG9y dCBmb3IgdGhlIFNjYXJsZXR0IDE4aTggR2VuIDIKLSBTYXZlIGNvbmZpZ3VyYXRpb24gcGFyYW1l dGVycyB0byBOVlJBTQotIEltcGxlbWVudGVkIGZlZWRiYWNrIGZyb20gVGFrYXNoaSdzIGVtYWls IDI0L0Fwci8yMDE5Ci0gTW92ZWQgcHJpdmF0ZSBmaWVsZCBmcm9tIHN0cnVjdCBzbmRfdXNiX2F1 ZGlvIHRvIHN0cnVjdAogIHVzYl9taXhlcl9pbnRlcmZhY2UKLSBBZGRlZCB0aW1lciBhbmQgYnVm ZmVyIGZpZWxkcyB0byBzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZQotIE90aGVyIHNtYWxsIGNv ZGUgZml4ZXMvY2xlYW51cHMvaW1wcm92ZW1lbnRzCgpDaGFuZ2VzIHNpbmNlIHYyOgotIEFkZCBz dXBwb3J0IGZvciB0aGUgU2NhcmxldHQgNmk2IEdlbiAyCi0gQWRkIHN1cHBvcnQgZm9yIGNvbnRy b2xsaW5nIHRoZSBtdXRlL2RpbSBzd2l0Y2hlcyAoMThpMjAgb25seSkKLSBJbXBsZW1lbnRlZCBm ZWVkYmFjayBmcm9tIFRha2FzaGkncyBlbWFpbCAyOS9BcHIvMjAxOTogT25lIHBvaW50ZXIKICBm aWVsZCBwcml2YXRlX2RhdGEgYW5kIG9uZSBmdW5jdGlvbiBwb2ludGVyIHByaXZhdGVfZnJlZS4g UmVwbGFjZWQKICB0aW1lciB3aXRoIGRlbGF5ZWQgd29yayAodGhhbmtzIGZvciB0aGF0IHN1Z2dl c3Rpb247IGl0IG1ha2VzIHRoZQogIGNvZGUgYSAqbG90KiBzaW1wbGVyISkuCi0gVGhlIG5ldyBm dW5jdGlvbmFsaXR5IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYXMgdGhlcmUgd2VyZSByZXBvcnRz CiAgb2Ygc29tZSBHZW4gMiBkZXZpY2VzIG5vdCByZXNwb25kaW5nIHRvIHRoZSBpbml0aWFsaXNh dGlvbiBzZXF1ZW5jZQogIGFuZCBoYW5naW5nLiBBZGRlZCBtb2R1bGUgcGFyYW1ldGVyICJzY2Fy bGV0dF9nZW4yX21peGVyX2VuYWJsZSIuCiAgSWYgdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHNldCwg bG9ncyBhIG1lc3NhZ2UgIkZvY3Vzcml0ZSBTY2FybGV0dCBHZW4KICAyIE1peGVyIERyaXZlciBk aXNhYmxlZDsgdXNlIG9wdGlvbnMgc25kX3VzYl9hdWRpbwogIHNjYXJsZXR0X2dlbjJfbWl4ZXJf ZW5hYmxlPTEgdG8gZW5hYmxlIGFuZCByZXBvcnQgYW55IGlzc3VlcyB0bwogIGdAYjQudnUiLgoK Q2hhbmdlcyBzaW5jZSB2MzoKLSBObyBmdW5jdGlvbmFsIGNoYW5nZXM7IGZpeCBjaGVja3BhdGNo LnBsIGVycm9yIGFuZCB0eXBvIGluCiAgZGVjbGFyYXRpb24uCgpDaGFuZ2VzIHNpbmNlIHY0Ogot IEltcGxlbWVudGVkIGZlZWRiYWNrIGZyb20gVGFrYXNoaSdzIGVtYWlsIDkvSnVsLzIwMTk6IGNh bmNlbAogIGRlbGF5ZWQgd29yayBvbiBzdXNwZW5kLCBkcm9wIGNvcHlyaWdodCB0ZXh0cywgcmVt b3ZlIHVubmVjZXNzYXJ5CiAgYmxhbmsgbGluZXMsIGFuZCBydW4ga21hbGxvYyBvdXRzaWRlIHRo ZSBtdXRleC4KCkNoYW5nZXMgc2luY2UgdjU6Ci0gSW1wbGVtZW50ZWQgZmVlZGJhY2sgZnJvbSBU YWthc2hpJ3MgZW1haWxzIDktMTAvSnVsLzIwMTk6IHVzZQogIGNoaXAtPnNldHVwIHZhbHVlIChk ZXZpY2Vfc2V0dXAgb3B0aW9uKSBpbnN0ZWFkIG9mIHRoZQogIHNjYXJsZXR0X2dlbjJfbWl4ZXJf ZW5hYmxlIG9wdGlvbiBhbmQgc3luYyBjb25maWcgdG8gTlZSQU0KICBpbW1lZGlhdGVseSBvbiBz dXNwZW5kLgotIEZpeGVkIGlzc3VlIHdoZXJlIHRoZSBjb25maWcgc2F2ZSBkZWxheWVkIHdvcmsg d291bGQgYmUgY2FuY2VsbGVkCiAgYW5kIG5vdCByZXN0YXJ0ZWQgaWYgYSBzY2FybGV0dDJfKl9j dGxfcHV0KCkgZnVuY3Rpb24gd2FzIGNhbGxlZCBhbmQKICB0aGUgcGFyYW1ldGVyIHZhbHVlIHdh cyBub3QgY2hhbmdlZC4KLSBSZW5hbWluZyBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIGZvciBj b25zaXN0ZW5jeSBhbmQgbW92ZSBwcml2YXRlCiAgZnJlZS9zdXNwZW5kIGZ1bmN0aW9ucyBhYm92 ZSB0aGVpciB1c2Ugc28gcHJlLWRlY2xhcmF0aW9uIGlzbid0CiAgbmVjZXNzYXJ5LgoKZGlmZiAt LWdpdCBhL3NvdW5kL3VzYi9NYWtlZmlsZSBiL3NvdW5kL3VzYi9NYWtlZmlsZQppbmRleCBlMWNl MjU3YWI3MDUuLmY0YjczODRjYWE5ZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL01ha2VmaWxlCisr KyBiL3NvdW5kL3VzYi9NYWtlZmlsZQpAQCAtMTEsNiArMTEsNyBAQCBzbmQtdXNiLWF1ZGlvLW9i anMgOj0gCWNhcmQubyBcCiAJCQltaXhlci5vIFwKIAkJCW1peGVyX3F1aXJrcy5vIFwKIAkJCW1p eGVyX3NjYXJsZXR0Lm8gXAorCQkJbWl4ZXJfc2NhcmxldHRfZ2VuMi5vIFwKIAkJCW1peGVyX3Vz MTZ4MDgubyBcCiAJCQlwY20ubyBcCiAJCQlwb3dlci5vIFwKZGlmZiAtLWdpdCBhL3NvdW5kL3Vz Yi9taXhlci5jIGIvc291bmQvdXNiL21peGVyLmMKaW5kZXggYzcwM2Y4NTM0YjA3Li43MzQ4NDZm YWVlN2EgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5jCisrKyBiL3NvdW5kL3VzYi9taXhl ci5jCkBAIC0zNTA1LDYgKzM1MDUsOCBAQCB2b2lkIHNuZF91c2JfbWl4ZXJfZGlzY29ubmVjdChz dHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCiAJCXVzYl9raWxsX3VyYihtaXhlci0+ dXJiKTsKIAlpZiAobWl4ZXItPnJjX3VyYikKIAkJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIp OworCWlmIChtaXhlci0+cHJpdmF0ZV9mcmVlKQorCQltaXhlci0+cHJpdmF0ZV9mcmVlKG1peGVy KTsKIAltaXhlci0+ZGlzY29ubmVjdGVkID0gdHJ1ZTsKIH0KIApAQCAtMzUzMiw2ICszNTM0LDgg QEAgc3RhdGljIGludCBzbmRfdXNiX21peGVyX2FjdGl2YXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlcikKIGludCBzbmRfdXNiX21peGVyX3N1c3BlbmQoc3RydWN0IHVzYl9taXhl cl9pbnRlcmZhY2UgKm1peGVyKQogewogCXNuZF91c2JfbWl4ZXJfaW5hY3RpdmF0ZShtaXhlcik7 CisJaWYgKG1peGVyLT5wcml2YXRlX3N1c3BlbmQpCisJCW1peGVyLT5wcml2YXRlX3N1c3BlbmQo bWl4ZXIpOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXIuaCBi L3NvdW5kL3VzYi9taXhlci5oCmluZGV4IDM5NGNkOTEwNzUwNy4uMzdlMWIyMzRjODAyIDEwMDY0 NAotLS0gYS9zb3VuZC91c2IvbWl4ZXIuaAorKysgYi9zb3VuZC91c2IvbWl4ZXIuaApAQCAtMjgs NiArMjgsMTAgQEAgc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgewogCXN0cnVjdCBtZWRpYV9t aXhlcl9jdGwgKm1lZGlhX21peGVyX2N0bDsKIAogCWJvb2wgZGlzY29ubmVjdGVkOworCisJdm9p ZCAqcHJpdmF0ZV9kYXRhOworCXZvaWQgKCpwcml2YXRlX2ZyZWUpKHN0cnVjdCB1c2JfbWl4ZXJf aW50ZXJmYWNlICptaXhlcik7CisJdm9pZCAoKnByaXZhdGVfc3VzcGVuZCkoc3RydWN0IHVzYl9t aXhlcl9pbnRlcmZhY2UgKm1peGVyKTsKIH07CiAKICNkZWZpbmUgTUFYX0NIQU5ORUxTCTE2CS8q IG1heCBsb2dpY2FsIGNoYW5uZWxzICovCmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfcXVp cmtzLmMgYi9zb3VuZC91c2IvbWl4ZXJfcXVpcmtzLmMKaW5kZXggMTk5ZmExNTdhNDExLi43MDgw NWMxNWIwYjUgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlcl9xdWlya3MuYworKysgYi9zb3Vu ZC91c2IvbWl4ZXJfcXVpcmtzLmMKQEAgLTMyLDYgKzMyLDcgQEAKICNpbmNsdWRlICJtaXhlci5o IgogI2luY2x1ZGUgIm1peGVyX3F1aXJrcy5oIgogI2luY2x1ZGUgIm1peGVyX3NjYXJsZXR0Lmgi CisjaW5jbHVkZSAibWl4ZXJfc2NhcmxldHRfZ2VuMi5oIgogI2luY2x1ZGUgIm1peGVyX3VzMTZ4 MDguaCIKICNpbmNsdWRlICJoZWxwZXIuaCIKIApAQCAtMjI1OCw2ICsyMjU5LDEyIEBAIGludCBz bmRfdXNiX21peGVyX2FwcGx5X2NyZWF0ZV9xdWlyayhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFj ZSAqbWl4ZXIpCiAJCWVyciA9IHNuZF9zY2FybGV0dF9jb250cm9sc19jcmVhdGUobWl4ZXIpOwog CQlicmVhazsKIAorCWNhc2UgVVNCX0lEKDB4MTIzNSwgMHg4MjAzKTogLyogRm9jdXNyaXRlIFNj YXJsZXR0IDZpNiAybmQgR2VuICovCisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDQpOiAvKiBG b2N1c3JpdGUgU2NhcmxldHQgMThpOCAybmQgR2VuICovCisJY2FzZSBVU0JfSUQoMHgxMjM1LCAw eDgyMDEpOiAvKiBGb2N1c3JpdGUgU2NhcmxldHQgMThpMjAgMm5kIEdlbiAqLworCQllcnIgPSBz bmRfc2NhcmxldHRfZ2VuMl9jb250cm9sc19jcmVhdGUobWl4ZXIpOworCQlicmVhazsKKwogCWNh c2UgVVNCX0lEKDB4MDQxZSwgMHgzMjNiKTogLyogQ3JlYXRpdmUgU291bmQgQmxhc3RlciBFMSAq LwogCQllcnIgPSBzbmRfc291bmRibGFzdGVyX2UxX3N3aXRjaF9jcmVhdGUobWl4ZXIpOwogCQli cmVhazsKZGlmZiAtLWdpdCBhL3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmMgYi9zb3Vu ZC91c2IvbWl4ZXJfc2NhcmxldHRfZ2VuMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAw MDAwMDAwMDAwMC4uYTc3MmUyMWJkZGFhCi0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL21p eGVyX3NjYXJsZXR0X2dlbjIuYwpAQCAtMCwwICsxLDIwNzYgQEAKKy8vIFNQRFgtTGljZW5zZS1J ZGVudGlmaWVyOiBHUEwtMi4wCisvKgorICogICBGb2N1c3JpdGUgU2NhcmxldHQgNmk2LzE4aTgv MThpMjAgR2VuIDIgRHJpdmVyIGZvciBBTFNBCisgKgorICogICBDb3B5cmlnaHQgKGMpIDIwMTgt MjAxOSBieSBHZW9mZnJleSBELiBCZW5uZXR0IDxnIGF0IGI0LnZ1PgorICoKKyAqICAgQmFzZWQg b24gdGhlIFNjYXJsZXR0IChHZW4gMSkgRHJpdmVyIGZvciBBTFNBOgorICoKKyAqICAgQ29weXJp Z2h0IChjKSAyMDEzIGJ5IFRvYmlhcyBIb2ZmbWFubgorICogICBDb3B5cmlnaHQgKGMpIDIwMTMg YnkgUm9iaW4gR2FyZXVzIDxyb2JpbiBhdCBnYXJldXMub3JnPgorICogICBDb3B5cmlnaHQgKGMp IDIwMDIgYnkgVGFrYXNoaSBJd2FpIDx0aXdhaSBhdCBzdXNlLmRlPgorICogICBDb3B5cmlnaHQg KGMpIDIwMTQgYnkgQ2hyaXMgSiBBcmdlcyA8Y2hyaXMuai5hcmdlcyBhdCBjYW5vbmljYWwuY29t PgorICoKKyAqICAgTWFueSBjb2RlcyBib3Jyb3dlZCBmcm9tIGF1ZGlvLmMgYnkKKyAqICAgICBB bGFuIENveCAoYWxhbiBhdCBseG9yZ3VrLnVrdXUub3JnLnVrKQorICogICAgIFRob21hcyBTYWls ZXIgKHNhaWxlciBhdCBpZmUuZWUuZXRoei5jaCkKKyAqCisgKiAgIENvZGUgY2xlYW51cDoKKyAq ICAgRGF2aWQgSGVubmluZ3Nzb24gPGRhdmlkLmhlbm5pbmdzc29uIGF0IGNhbm9uaWNhbC5jb20+ CisgKi8KKworLyogTWl4ZXIgSW50ZXJmYWNlIGZvciB0aGUgRm9jdXNyaXRlIFNjYXJsZXR0IDZp Ni8xOGk4LzE4aTIwIEdlbiAyIGF1ZGlvCisgKiBpbnRlcmZhY2UuIEJhc2VkIG9uIHRoZSBHZW4g MSBkcml2ZXIgYW5kIHJld3JpdHRlbi4KKyAqLworCisvKiBUaGUgcHJvdG9jb2wgd2FzIHJldmVy c2UgZW5naW5lZXJlZCBieSBsb29raW5nIGF0IHRoZSBjb21tdW5pY2F0aW9uCisgKiBiZXR3ZWVu IEZvY3Vzcml0ZSBDb250cm9sIDIuMy40IGFuZCB0aGUgRm9jdXNyaXRlKFIpIFNjYXJsZXR0IDE4 aTIwCisgKiAoZmlybXdhcmUgMTA4MykgdXNpbmcgdXNibW9uIGluIEp1bHktQXVndXN0IDIwMTgu CisgKgorICogU2NhcmxldHQgMThpOCBzdXBwb3J0IGFkZGVkIGluIEFwcmlsIDIwMTkuCisgKgor ICogU2NhcmxldHQgNmk2IHN1cHBvcnQgYWRkZWQgaW4gSnVuZSAyMDE5ICh0aGFua3MgdG8gTWFy dGluIFdpdHRtYW5uCisgKiBmb3IgcHJvdmlkaW5nIHVzYm1vbiBvdXRwdXQgYW5kIHRlc3Rpbmcp LgorICoKKyAqIFRoaXMgQUxTQSBtaXhlciBnaXZlcyBhY2Nlc3MgdG86CisgKiAgLSBpbnB1dCwg b3V0cHV0LCBtaXhlci1tYXRyaXggbXV4ZXMKKyAqICAtIDE4eDEwIG1peGVyLW1hdHJpeCBnYWlu IHN0YWdlcworICogIC0gZ2Fpbi92b2x1bWUgY29udHJvbHMKKyAqICAtIGxldmVsIG1ldGVycwor ICogIC0gbGluZS9pbnN0IGxldmVsIGFuZCBwYWQgY29udHJvbHMKKyAqCisgKiA8ZGl0YWE+Cisg KiAgICAvLS0tLS0tLS0tLS0tLS1cICAgIDE4Y2huICAgICAgICAgICAgMjBjaG4gICAgIC8tLS0t LS0tLS0tLS0tLVwKKyAqICAgIHwgSGFyZHdhcmUgIGluICstLSstLS0tLS1cICAgIC8tLS0tLS0t LS0tLS0tKy0tKyBBTFNBIFBDTSBvdXQgfAorICogICAgXC0tLS0tLS0tLS0tLS0tLyAgfCAgICAg IHwgICAgfCAgICAgICAgICAgICB8ICBcLS0tLS0tLS0tLS0tLS0vCisgKiAgICAgICAgICAgICAg ICAgICAgICB8ICAgICAgfCAgICB8ICAgIC8tLS0tLVwgIHwKKyAqICAgICAgICAgICAgICAgICAg ICAgIHwgICAgICB8ICAgIHwgICAgfCAgICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAg fCAgICAgIHYgICAgdiAgICB2ICAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAg Ky0tLS0tLS0tLS0tLS0tLSsgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgXCBN YXRyaXggIE11eCAvICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgKy0tLS0t Ky0tLS0tKyAgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAg ICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwxOGNobiAg ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAgICAgICB8 ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICAxMGNobnwgIHwK KyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHYgICAgICAgICAgfCAgfAorICog ICAgICAgICAgICAgICAgICAgICAgfCAgICAgKy0tLS0tLS0tLS0tLSsgICB8ICB8CisgKiAgICAg ICAgICAgICAgICAgICAgICB8ICAgICB8IE1peGVyICAgICAgfCAgIHwgIHwKKyAqICAgICAgICAg ICAgICAgICAgICAgIHwgICAgIHwgICAgIE1hdHJpeCB8ICAgfCAgfAorICogICAgICAgICAgICAg ICAgICAgICAgfCAgICAgfCAgICAgICAgICAgIHwgICB8ICB8CisgKiAgICAgICAgICAgICAgICAg ICAgICB8ICAgICB8IDE4eDEwIEdhaW4gfCAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAg IHwgICAgIHwgICBzdGFnZXMgICB8ICAgfCAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAg ICAgKy0tLS0tKy0tLS0tLSsgICB8ICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAg ICAgICB8ICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwxOGNobiAgICAg IHwxMGNobiAgICAgfCAgfDIwY2huCisgKiAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAg ICB8ICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICst LS0tLS0tLS0tLyAgfAorICogICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICAg ICAgICAgICB8CisgKiAgICAgICAgICAgICAgICAgICAgICB2ICAgICAgICAgICB2ICAgICAgICAg ICAgIHYKKyAqICAgICAgICAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09 PQorICogICAgICAgICAgICAgICArLS0tLS0tLS0tLS0tLS0tKyAgICAgICArLS3igJQtLS0tLS0t LS0tLS0rCisgKiAgICAgICAgICAgICAgICBcIE91dHB1dCAgTXV4IC8gICAgICAgICBcIENhcHR1 cmUgTXV4IC8KKyAqICAgICAgICAgICAgICAgICArLS0tKy0tLSstLS0rICAgICAgICAgICArLS0t LS0rLS0tLS0rCisgKiAgICAgICAgICAgICAgICAgICAgIHwgICB8ICAgICAgICAgICAgICAgICAg ICAgfAorICogICAgICAgICAgICAgICAgMTBjaG58ICAgfCAgICAgICAgICAgICAgICAgICAgIHwx OGNobgorICogICAgICAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICAgICAgICAgIHwK KyAqICAvLS0tLS0tLS0tLS0tLS1cICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICB8ICAgLy0t LS0tLS0tLS0tLS0tXAorICogIHwgUy9QRElGLCBBREFUIHw8LS0vICAgfDEwY2huICAgICAgICAg ICAgICAgIFwtLT58IEFMU0EgUENNIGluICB8CisgKiAgfCBIYXJkd2FyZSBvdXQgfCAgICAgICB8 ICAgICAgICAgICAgICAgICAgICAgICAgIFwtLS0tLS0tLS0tLS0tLS8KKyAqICBcLS0tLS0tLS0t LS0tLS0vICAgICAgIHwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgIHYKKyAqICAgICAgICAg ICAgICAgICAgKy0tLS0tLS0tLS0tLS0rICAgIFNvZnR3YXJlIGdhaW4gcGVyIGNoYW5uZWwuCisg KiAgICAgICAgICAgICAgICAgIHwgTWFzdGVyIEdhaW4gfDwtLSAxOGkyMCBvbmx5OiBTd2l0Y2gg cGVyIGNoYW5uZWwKKyAqICAgICAgICAgICAgICAgICAgKy0tLS0tLSstLS0tLS0rICAgIHRvIHNl bGVjdCBIVyBvciBTVyBnYWluIGNvbnRyb2wuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICB8 CisgKiAgICAgICAgICAgICAgICAgICAgICAgICB8MTBjaG4KKyAqICAvLS0tLS0tLS0tLS0tLS1c ICAgICAgIHwKKyAqICB8IEFuYWxvZ3VlICAgICB8PC0tLS0tLS8KKyAqICB8IEhhcmR3YXJlIG91 dCB8CisgKiAgXC0tLS0tLS0tLS0tLS0tLworICogPC9kaXRhYT4KKyAqCisgKi8KKworI2luY2x1 ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC91c2IuaD4KKyNpbmNsdWRlIDxsaW51 eC9tb2R1bGVwYXJhbS5oPgorCisjaW5jbHVkZSA8c291bmQvY29udHJvbC5oPgorI2luY2x1ZGUg PHNvdW5kL3Rsdi5oPgorCisjaW5jbHVkZSAidXNiYXVkaW8uaCIKKyNpbmNsdWRlICJtaXhlci5o IgorI2luY2x1ZGUgImhlbHBlci5oIgorCisjaW5jbHVkZSAibWl4ZXJfc2NhcmxldHRfZ2VuMi5o IgorCisvKiBkZXZpY2Vfc2V0dXAgdmFsdWUgdG8gZW5hYmxlICovCisjZGVmaW5lIFNDQVJMRVRU Ml9FTkFCTEUgMHgwMQorCisvKiBzb21lIGd1aSBtaXhlcnMgY2FuJ3QgaGFuZGxlIG5lZ2F0aXZl IGN0bCB2YWx1ZXMgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX1ZPTFVNRV9CSUFTIDEyNworCisvKiBt aXhlciByYW5nZSBmcm9tIC04MGRCIHRvICs2ZEIgaW4gMC41ZEIgc3RlcHMgKi8KKyNkZWZpbmUg U0NBUkxFVFQyX01JWEVSX01JTl9EQiAtODAKKyNkZWZpbmUgU0NBUkxFVFQyX01JWEVSX0JJQVMg KC1TQ0FSTEVUVDJfTUlYRVJfTUlOX0RCICogMikKKyNkZWZpbmUgU0NBUkxFVFQyX01JWEVSX01B WF9EQiA2CisjZGVmaW5lIFNDQVJMRVRUMl9NSVhFUl9NQVhfVkFMVUUgXAorCSgoU0NBUkxFVFQy X01JWEVSX01BWF9EQiAtIFNDQVJMRVRUMl9NSVhFUl9NSU5fREIpICogMikKKworLyogbWFwIGZy b20gKGRCICsgODApICogMiB0byBtaXhlciB2YWx1ZQorICogZm9yIGRCIGluIDAgLi4gMTcyOiBp bnQoODE5MiAqIHBvdygxMCwgKChkQiAtIDE2MCkgLyAyIC8gMjApKSkKKyAqLworc3RhdGljIGNv bnN0IHUxNiBzY2FybGV0dDJfbWl4ZXJfdmFsdWVzWzE3M10gPSB7CisJMCwgMCwgMCwgMCwgMSwg MSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMiwgMiwgMiwgMiwgMiwKKwkyLCAyLCAz LCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2LCA3LCA3LCA4LCA4LAor CTksIDksIDEwLCAxMCwgMTEsIDEyLCAxMiwgMTMsIDE0LCAxNSwgMTYsIDE3LCAxOCwgMTksIDIw LCAyMSwKKwkyMywgMjQsIDI1LCAyNywgMjksIDMwLCAzMiwgMzQsIDM2LCAzOCwgNDEsIDQzLCA0 NiwgNDgsIDUxLAorCTU0LCA1NywgNjEsIDY1LCA2OCwgNzMsIDc3LCA4MSwgODYsIDkxLCA5Nywg MTAzLCAxMDksIDExNSwKKwkxMjIsIDEyOSwgMTM3LCAxNDUsIDE1NCwgMTYzLCAxNzMsIDE4Mywg MTk0LCAyMDUsIDIxNywgMjMwLAorCTI0NCwgMjU5LCAyNzQsIDI5MCwgMzA3LCAzMjYsIDM0NSwg MzY1LCAzODcsIDQxMCwgNDM0LCA0NjAsCisJNDg3LCA1MTYsIDU0NywgNTc5LCA2MTQsIDY1MCwg Njg5LCA3MzAsIDc3MywgODE5LCA4NjcsIDkxOSwKKwk5NzMsIDEwMzEsIDEwOTIsIDExNTcsIDEy MjUsIDEyOTgsIDEzNzUsIDE0NTYsIDE1NDMsIDE2MzQsCisJMTczMSwgMTgzMywgMTk0MiwgMjA1 NywgMjE3OSwgMjMwOCwgMjQ0NSwgMjU5MCwgMjc0NCwgMjkwNiwKKwkzMDc4LCAzMjYxLCAzNDU0 LCAzNjU5LCAzODc2LCA0MTA1LCA0MzQ5LCA0NjA2LCA0ODc5LCA1MTY4LAorCTU0NzUsIDU3OTks IDYxNDMsIDY1MDcsIDY4OTIsIDczMDEsIDc3MzMsIDgxOTIsIDg2NzcsIDkxOTEsCisJOTczNiwg MTAzMTMsIDEwOTI0LCAxMTU3MSwgMTIyNTcsIDEyOTgzLCAxMzc1MiwgMTQ1NjcsIDE1NDMwLAor CTE2MzQ1Cit9OworCisvKiBNYXhpbXVtIG51bWJlciBvZiBhbmFsb2d1ZSBvdXRwdXRzICovCisj ZGVmaW5lIFNDQVJMRVRUMl9BTkFMT0dVRV9NQVggMTAKKworLyogTWF4aW11bSBudW1iZXIgb2Yg bGV2ZWwgYW5kIHBhZCBzd2l0Y2hlcyAqLworI2RlZmluZSBTQ0FSTEVUVDJfTEVWRUxfU1dJVENI X01BWCAyCisjZGVmaW5lIFNDQVJMRVRUMl9QQURfU1dJVENIX01BWCA0CisKKy8qIE1heGltdW0g bnVtYmVyIG9mIGlucHV0cyB0byB0aGUgbWl4ZXIgKi8KKyNkZWZpbmUgU0NBUkxFVFQyX0lOUFVU X01JWF9NQVggMTgKKworLyogTWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0cyBmcm9tIHRoZSBtaXhl ciAqLworI2RlZmluZSBTQ0FSTEVUVDJfT1VUUFVUX01JWF9NQVggMTAKKworLyogTWF4aW11bSBz aXplIG9mIHRoZSBkYXRhIGluIHRoZSBVU0IgbXV4IGFzc2lnbm1lbnQgbWVzc2FnZToKKyAqIDE4 IGlucHV0cywgMjAgb3V0cHV0cywgMTggbWF0cml4IGlucHV0cywgOCBzcGFyZQorICovCisjZGVm aW5lIFNDQVJMRVRUMl9NVVhfTUFYIDY0CisKKy8qIE51bWJlciBvZiBtZXRlcnM6CisgKiAxOCBp bnB1dHMsIDIwIG91dHB1dHMsIDE4IG1hdHJpeCBpbnB1dHMKKyAqLworI2RlZmluZSBTQ0FSTEVU VDJfTlVNX01FVEVSUyA1NgorCisvKiBIYXJkd2FyZSBwb3J0IHR5cGVzOgorICogLSBOb25lIChu byBpbnB1dCB0byBtdXgpCisgKiAtIEFuYWxvZ3VlIEkvTworICogLSBTL1BESUYgSS9PCisgKiAt IEFEQVQgSS9PCisgKiAtIE1peGVyIEkvTworICogLSBQQ00gSS9PCisgKi8KK2VudW0geworCVND QVJMRVRUMl9QT1JUX1RZUEVfTk9ORSA9IDAsCisJU0NBUkxFVFQyX1BPUlRfVFlQRV9BTkFMT0dV RSA9IDEsCisJU0NBUkxFVFQyX1BPUlRfVFlQRV9TUERJRiA9IDIsCisJU0NBUkxFVFQyX1BPUlRf VFlQRV9BREFUID0gMywKKwlTQ0FSTEVUVDJfUE9SVF9UWVBFX01JWCA9IDQsCisJU0NBUkxFVFQy X1BPUlRfVFlQRV9QQ00gPSA1LAorCVNDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlQgPSA2LAorfTsK KworLyogQ291bnQgb2YgdG90YWwgSS9PIGFuZCBudW1iZXIgYXZhaWxhYmxlIGF0IGVhY2ggc2Ft cGxlIHJhdGUgKi8KK2VudW0geworCVNDQVJMRVRUMl9QT1JUX0lOID0gMCwKKwlTQ0FSTEVUVDJf UE9SVF9PVVQgPSAxLAorCVNDQVJMRVRUMl9QT1JUX09VVF80NCA9IDIsCisJU0NBUkxFVFQyX1BP UlRfT1VUXzg4ID0gMywKKwlTQ0FSTEVUVDJfUE9SVF9PVVRfMTc2ID0gNCwKKwlTQ0FSTEVUVDJf UE9SVF9ESVJFQ1RJT05TID0gNSwKK307CisKKy8qIEhhcmR3YXJlIGJ1dHRvbnMgb24gdGhlIDE4 aTIwICovCisjZGVmaW5lIFNDQVJMRVRUMl9CVVRUT05fTUFYIDIKKworc3RhdGljIGNvbnN0IGNo YXIgKmNvbnN0IHNjYXJsZXR0Ml9idXR0b25fbmFtZXNbU0NBUkxFVFQyX0JVVFRPTl9NQVhdID0g eworCSJNdXRlIiwgIkRpbSIKK307CisKKy8qIERlc2NyaXB0aW9uIG9mIGVhY2ggaGFyZHdhcmUg cG9ydCB0eXBlOgorICogLSBpZDogaGFyZHdhcmUgSUQgZm9yIHRoaXMgcG9ydCB0eXBlCisgKiAt IG51bTogbnVtYmVyIG9mIHNvdXJjZXMvZGVzdGluYXRpb25zIG9mIHRoaXMgcG9ydCB0eXBlCisg KiAtIHNyY19kZXNjcjogcHJpbnRmIGZvcm1hdCBzdHJpbmcgZm9yIG11eCBpbnB1dCBzZWxlY3Rp b25zCisgKiAtIHNyY19udW1fb2Zmc2V0OiBhZGRlZCB0byBjaGFubmVsIG51bWJlciBmb3IgdGhl IGZwcmludGYKKyAqIC0gZHN0X2Rlc2NyOiBwcmludGYgZm9ybWF0IHN0cmluZyBmb3IgbWl4ZXIg Y29udHJvbHMKKyAqLworc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyB7CisJdTE2IGlkOworCWludCBu dW1bU0NBUkxFVFQyX1BPUlRfRElSRUNUSU9OU107CisJY29uc3QgY2hhciAqIGNvbnN0IHNyY19k ZXNjcjsKKwlpbnQgc3JjX251bV9vZmZzZXQ7CisJY29uc3QgY2hhciAqIGNvbnN0IGRzdF9kZXNj cjsKK307CisKK3N0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8geworCXU4IGxpbmVfb3V0X2h3 X3ZvbDsgLyogbGluZSBvdXQgaHcgdm9sdW1lIGlzIHN3IGNvbnRyb2xsZWQgKi8KKwl1OCBidXR0 b25fY291bnQ7IC8qIG51bWJlciBvZiBidXR0b25zICovCisJdTggbGV2ZWxfaW5wdXRfY291bnQ7 IC8qIGlucHV0cyB3aXRoIGxldmVsIHNlbGVjdGFibGUgKi8KKwl1OCBwYWRfaW5wdXRfY291bnQ7 IC8qIGlucHV0cyB3aXRoIHBhZCBzZWxlY3RhYmxlICovCisJY29uc3QgY2hhciAqIGNvbnN0IGxp bmVfb3V0X2Rlc2Nyc1tTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYXTsKKwlzdHJ1Y3Qgc2NhcmxldHQy X3BvcnRzIHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlRdOworfTsKKworc3RydWN0IHNj YXJsZXR0Ml9taXhlcl9kYXRhIHsKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXI7 CisJc3RydWN0IG11dGV4IHVzYl9tdXRleDsgLyogcHJldmVudCBzZW5kaW5nIGNvbmN1cnJlbnQg VVNCIHJlcXVlc3RzICovCisJc3RydWN0IG11dGV4IGRhdGFfbXV0ZXg7IC8qIGxvY2sgYWNjZXNz IHRvIHRoaXMgZGF0YSAqLworCXN0cnVjdCBkZWxheWVkX3dvcmsgd29yazsKKwljb25zdCBzdHJ1 Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZvOworCWludCBudW1fbXV4X3NyY3M7CisJdTE2 IHNjYXJsZXR0Ml9zZXE7CisJdTggdm9sX3VwZGF0ZWQ7CisJdTggbWFzdGVyX3ZvbDsKKwl1OCB2 b2xbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisJdTggdm9sX3N3X2h3X3N3aXRjaFtTQ0FSTEVU VDJfQU5BTE9HVUVfTUFYXTsKKwl1OCBsZXZlbF9zd2l0Y2hbU0NBUkxFVFQyX0xFVkVMX1NXSVRD SF9NQVhdOworCXU4IHBhZF9zd2l0Y2hbU0NBUkxFVFQyX1BBRF9TV0lUQ0hfTUFYXTsKKwl1OCBi dXR0b25zW1NDQVJMRVRUMl9CVVRUT05fTUFYXTsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICptYXN0 ZXJfdm9sX2N0bDsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICp2b2xfY3Rsc1tTQ0FSTEVUVDJfQU5B TE9HVUVfTUFYXTsKKwlzdHJ1Y3Qgc25kX2tjb250cm9sICpidXR0b25fY3Rsc1tTQ0FSTEVUVDJf QlVUVE9OX01BWF07CisJdTggbXV4W1NDQVJMRVRUMl9NVVhfTUFYXTsKKwl1OCBtaXhbU0NBUkxF VFQyX0lOUFVUX01JWF9NQVggKiBTQ0FSTEVUVDJfT1VUUFVUX01JWF9NQVhdOworfTsKKworLyoq KiBNb2RlbC1zcGVjaWZpYyBkYXRhICoqKi8KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2FybGV0 dDJfZGV2aWNlX2luZm8gczZpNl9nZW4yX2luZm8gPSB7CisJLyogVGhlIGZpcnN0IHR3byBhbmFs b2d1ZSBpbnB1dHMgY2FuIGJlIHN3aXRjaGVkIGJldHdlZW4gbGluZQorCSAqIGFuZCBpbnN0cnVt ZW50IGxldmVscy4KKwkgKi8KKwkubGV2ZWxfaW5wdXRfY291bnQgPSAyLAorCisJLyogVGhlIGZp cnN0IHR3byBhbmFsb2d1ZSBpbnB1dHMgaGF2ZSBhbiBvcHRpb25hbCBwYWQuICovCisJLnBhZF9p bnB1dF9jb3VudCA9IDIsCisKKwkubGluZV9vdXRfZGVzY3JzID0geworCQkiTW9uaXRvciBMIiwK KwkJIk1vbml0b3IgUiIsCisJCSJIZWFkcGhvbmVzIEwiLAorCQkiSGVhZHBob25lcyBSIiwKKwl9 LAorCisJLnBvcnRzID0geworCQl7CisJCQkuaWQgPSAweDAwMCwKKwkJCS5udW0gPSB7IDEsIDAs IDgsIDgsIDggfSwKKwkJCS5zcmNfZGVzY3IgPSAiT2ZmIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9 IDAsCisJCX0sCisJCXsKKwkJCS5pZCA9IDB4MDgwLAorCQkJLm51bSA9IHsgNCwgNCwgNCwgNCwg NCB9LAorCQkJLnNyY19kZXNjciA9ICJBbmFsb2d1ZSAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQg PSAxLAorCQkJLmRzdF9kZXNjciA9ICJBbmFsb2d1ZSBPdXRwdXQgJTAyZCBQbGF5YmFjayIKKwkJ fSwKKwkJeworCQkJLmlkID0gMHgxODAsCisJCQkubnVtID0geyAyLCAyLCAyLCAyLCAyIH0sCisJ CQkuc3JjX2Rlc2NyID0gIlMvUERJRiAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJ LmRzdF9kZXNjciA9ICJTL1BESUYgT3V0cHV0ICVkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQku aWQgPSAweDMwMCwKKwkJCS5udW0gPSB7IDEwLCAxOCwgMTgsIDE4LCAxOCB9LAorCQkJLnNyY19k ZXNjciA9ICJNaXggJWMiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gNjUsCisJCQkuZHN0X2Rlc2Ny ID0gIk1peGVyIElucHV0ICUwMmQgQ2FwdHVyZSIKKwkJfSwKKwkJeworCQkJLmlkID0gMHg2MDAs CisJCQkubnVtID0geyA2LCA2LCA2LCA2LCA2IH0sCisJCQkuc3JjX2Rlc2NyID0gIlBDTSAlZCIs CisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJQQ00gJTAyZCBDYXB0 dXJlIgorCQl9LAorCX0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZp Y2VfaW5mbyBzMThpOF9nZW4yX2luZm8gPSB7CisJLyogVGhlIGZpcnN0IHR3byBhbmFsb2d1ZSBp bnB1dHMgY2FuIGJlIHN3aXRjaGVkIGJldHdlZW4gbGluZQorCSAqIGFuZCBpbnN0cnVtZW50IGxl dmVscy4KKwkgKi8KKwkubGV2ZWxfaW5wdXRfY291bnQgPSAyLAorCisJLyogVGhlIGZpcnN0IGZv dXIgYW5hbG9ndWUgaW5wdXRzIGhhdmUgYW4gb3B0aW9uYWwgcGFkLiAqLworCS5wYWRfaW5wdXRf Y291bnQgPSA0LAorCisJLmxpbmVfb3V0X2Rlc2NycyA9IHsKKwkJIk1vbml0b3IgTCIsCisJCSJN b25pdG9yIFIiLAorCQkiSGVhZHBob25lcyAxIEwiLAorCQkiSGVhZHBob25lcyAxIFIiLAorCQki SGVhZHBob25lcyAyIEwiLAorCQkiSGVhZHBob25lcyAyIFIiLAorCX0sCisKKwkucG9ydHMgPSB7 CisJCXsKKwkJCS5pZCA9IDB4MDAwLAorCQkJLm51bSA9IHsgMSwgMCwgOCwgOCwgNCB9LAorCQkJ LnNyY19kZXNjciA9ICJPZmYiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gMCwKKwkJfSwKKwkJewor CQkJLmlkID0gMHgwODAsCisJCQkubnVtID0geyA4LCA2LCA2LCA2LCA2IH0sCisJCQkuc3JjX2Rl c2NyID0gIkFuYWxvZ3VlICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rl c2NyID0gIkFuYWxvZ3VlIE91dHB1dCAlMDJkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkvKiBT L1BESUYgb3V0cHV0cyBhcmVuJ3QgYXZhaWxhYmxlIGF0IDE5MktIegorCQkJICogYnV0IGFyZSBp bmNsdWRlZCBpbiB0aGUgVVNCIG11eCBJL08KKwkJCSAqIGFzc2lnbm1lbnQgbWVzc2FnZSBhbnl3 YXkKKwkJCSAqLworCQkJLmlkID0gMHgxODAsCisJCQkubnVtID0geyAyLCAyLCAyLCAyLCAyIH0s CisJCQkuc3JjX2Rlc2NyID0gIlMvUERJRiAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAor CQkJLmRzdF9kZXNjciA9ICJTL1BESUYgT3V0cHV0ICVkIFBsYXliYWNrIgorCQl9LAorCQl7CisJ CQkuaWQgPSAweDIwMCwKKwkJCS5udW0gPSB7IDgsIDAsIDAsIDAsIDAgfSwKKwkJCS5zcmNfZGVz Y3IgPSAiQURBVCAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQl9LAorCQl7CisJCQku aWQgPSAweDMwMCwKKwkJCS5udW0gPSB7IDEwLCAxOCwgMTgsIDE4LCAxOCB9LAorCQkJLnNyY19k ZXNjciA9ICJNaXggJWMiLAorCQkJLnNyY19udW1fb2Zmc2V0ID0gNjUsCisJCQkuZHN0X2Rlc2Ny ID0gIk1peGVyIElucHV0ICUwMmQgQ2FwdHVyZSIKKwkJfSwKKwkJeworCQkJLmlkID0gMHg2MDAs CisJCQkubnVtID0geyAyMCwgMTgsIDE4LCAxNCwgMTAgfSwKKwkJCS5zcmNfZGVzY3IgPSAiUENN ICVkIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIlBDTSAlMDJk IENhcHR1cmUiCisJCX0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NhcmxldHQy X2RldmljZV9pbmZvIHMxOGkyMF9nZW4yX2luZm8gPSB7CisJLyogVGhlIGFuYWxvZ3VlIGxpbmUg b3V0cHV0cyBvbiB0aGUgMThpMjAgY2FuIGJlIHN3aXRjaGVkCisJICogYmV0d2VlbiBzb2Z0d2Fy ZSBhbmQgaGFyZHdhcmUgdm9sdW1lIGNvbnRyb2wKKwkgKi8KKwkubGluZV9vdXRfaHdfdm9sID0g MSwKKworCS8qIE11dGUgYW5kIGRpbSBidXR0b25zICovCisJLmJ1dHRvbl9jb3VudCA9IDIsCisK KwkubGluZV9vdXRfZGVzY3JzID0geworCQkiTW9uaXRvciBMIiwKKwkJIk1vbml0b3IgUiIsCisJ CU5VTEwsCisJCU5VTEwsCisJCU5VTEwsCisJCU5VTEwsCisJCSJIZWFkcGhvbmVzIDEgTCIsCisJ CSJIZWFkcGhvbmVzIDEgUiIsCisJCSJIZWFkcGhvbmVzIDIgTCIsCisJCSJIZWFkcGhvbmVzIDIg UiIsCisJfSwKKworCS5wb3J0cyA9IHsKKwkJeworCQkJLmlkID0gMHgwMDAsCisJCQkubnVtID0g eyAxLCAwLCA4LCA4LCA2IH0sCisJCQkuc3JjX2Rlc2NyID0gIk9mZiIsCisJCQkuc3JjX251bV9v ZmZzZXQgPSAwLAorCQl9LAorCQl7CisJCQkuaWQgPSAweDA4MCwKKwkJCS5udW0gPSB7IDgsIDEw LCAxMCwgMTAsIDEwIH0sCisJCQkuc3JjX2Rlc2NyID0gIkFuYWxvZ3VlICVkIiwKKwkJCS5zcmNf bnVtX29mZnNldCA9IDEsCisJCQkuZHN0X2Rlc2NyID0gIkFuYWxvZ3VlIE91dHB1dCAlMDJkIFBs YXliYWNrIgorCQl9LAorCQl7CisJCQkvKiBTL1BESUYgb3V0cHV0cyBhcmVuJ3QgYXZhaWxhYmxl IGF0IDE5MktIegorCQkJICogYnV0IGFyZSBpbmNsdWRlZCBpbiB0aGUgVVNCIG11eCBJL08KKwkJ CSAqIGFzc2lnbm1lbnQgbWVzc2FnZSBhbnl3YXkKKwkJCSAqLworCQkJLmlkID0gMHgxODAsCisJ CQkubnVtID0geyAyLCAyLCAyLCAyLCAyIH0sCisJCQkuc3JjX2Rlc2NyID0gIlMvUERJRiAlZCIs CisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJTL1BESUYgT3V0cHV0 ICVkIFBsYXliYWNrIgorCQl9LAorCQl7CisJCQkuaWQgPSAweDIwMCwKKwkJCS5udW0gPSB7IDgs IDgsIDgsIDQsIDAgfSwKKwkJCS5zcmNfZGVzY3IgPSAiQURBVCAlZCIsCisJCQkuc3JjX251bV9v ZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNjciA9ICJBREFUIE91dHB1dCAlZCBQbGF5YmFjayIKKwkJ fSwKKwkJeworCQkJLmlkID0gMHgzMDAsCisJCQkubnVtID0geyAxMCwgMTgsIDE4LCAxOCwgMTgg fSwKKwkJCS5zcmNfZGVzY3IgPSAiTWl4ICVjIiwKKwkJCS5zcmNfbnVtX29mZnNldCA9IDY1LAor CQkJLmRzdF9kZXNjciA9ICJNaXhlciBJbnB1dCAlMDJkIENhcHR1cmUiCisJCX0sCisJCXsKKwkJ CS5pZCA9IDB4NjAwLAorCQkJLm51bSA9IHsgMjAsIDE4LCAxOCwgMTQsIDEwIH0sCisJCQkuc3Jj X2Rlc2NyID0gIlBDTSAlZCIsCisJCQkuc3JjX251bV9vZmZzZXQgPSAxLAorCQkJLmRzdF9kZXNj ciA9ICJQQ00gJTAyZCBDYXB0dXJlIgorCQl9LAorCX0sCit9OworCisvKiBnZXQgdGhlIHN0YXJ0 aW5nIHBvcnQgaW5kZXggbnVtYmVyIGZvciBhIGdpdmVuIHBvcnQgdHlwZS9kaXJlY3Rpb24gKi8K K3N0YXRpYyBpbnQgc2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShjb25zdCBzdHJ1Y3Qgc2Nh cmxldHQyX3BvcnRzICpwb3J0cywKKwkJCQkJaW50IGRpcmVjdGlvbiwgaW50IHBvcnRfdHlwZSkK K3sKKwlpbnQgaSwgbnVtID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCBwb3J0X3R5cGU7IGkrKykK KwkJbnVtICs9IHBvcnRzW2ldLm51bVtkaXJlY3Rpb25dOworCisJcmV0dXJuIG51bTsKK30KKwor LyoqKiBVU0IgSW50ZXJhY3Rpb25zICoqKi8KKworLyogVmVuZG9yLVNwZWNpZmljIEludGVyZmFj ZSwgRW5kcG9pbnQsIE1heFBhY2tldFNpemUsIEludGVydmFsICovCisjZGVmaW5lIFNDQVJMRVRU Ml9VU0JfVkVORE9SX1NQRUNJRklDX0lOVEVSRkFDRSA1CisjZGVmaW5lIFNDQVJMRVRUMl9VU0Jf SU5URVJSVVBUX0VORFBPSU5UIDQKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfTUFY X0RBVEEgNjQKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfSU5URVJWQUwgMworCisv KiBJbnRlcnJ1cHQgZmxhZ3MgZm9yIHZvbHVtZSBhbmQgbXV0ZS9kaW0gYnV0dG9uIGNoYW5nZXMg Ki8KKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9JTlRFUlJVUFRfVk9MX0NIQU5HRSAweDQwMDAwMAor I2RlZmluZSBTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9CVVRUT05fQ0hBTkdFIDB4MjAwMDAwCisK Ky8qIENvbW1hbmRzIGZvciBzZW5kaW5nL3JlY2VpdmluZyByZXF1ZXN0cy9yZXNwb25zZXMgKi8K KyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFUSAyCisjZGVmaW5l IFNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0NNRF9SRVNQIDMKKworI2RlZmluZSBTQ0FS TEVUVDJfVVNCX0lOSVRfU0VRIDB4MDAwMDAwMDAKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9HRVRf TUVURVJfTEVWRUxTIDB4MDAwMDEwMDEKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9TRVRfTUlYIDB4 MDAwMDIwMDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9TRVRfTVVYIDB4MDAwMDMwMDIKKyNkZWZp bmUgU0NBUkxFVFQyX1VTQl9HRVRfREFUQSAweDAwODAwMDAwCisjZGVmaW5lIFNDQVJMRVRUMl9V U0JfU0VUX0RBVEEgMHgwMDgwMDAwMQorI2RlZmluZSBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01EIDB4 MDA4MDAwMDIKKyNkZWZpbmUgU0NBUkxFVFQyX1VTQl9DT05GSUdfU0FWRSA2CisKKyNkZWZpbmUg U0NBUkxFVFQyX1VTQl9WT0xVTUVfU1RBVFVTX09GRlNFVCAweDMxCisjZGVmaW5lIFNDQVJMRVRU Ml9VU0JfTUVURVJfTEVWRUxTX0dFVF9NQUdJQyAxCisKKy8qIHZvbHVtZSBzdGF0dXMgaXMgcmVh ZCB0b2dldGhlciAobWF0Y2hlcyBzY2FybGV0dDJfY29uZmlnX2l0ZW1zW10pICovCitzdHJ1Y3Qg c2NhcmxldHQyX3VzYl92b2x1bWVfc3RhdHVzIHsKKwkvKiBtdXRlICYgZGltIGJ1dHRvbnMgKi8K Kwl1OCBidXR0b25zW1NDQVJMRVRUMl9CVVRUT05fTUFYXTsKKworCXU4IHBhZDE7CisKKwkvKiBz b2Z0d2FyZSB2b2x1bWUgc2V0dGluZyAqLworCXMxNiBzd192b2xbU0NBUkxFVFQyX0FOQUxPR1VF X01BWF07CisKKwkvKiBhY3R1YWwgdm9sdW1lIG9mIG91dHB1dCBpbmMuIGRpbSAoLTE4ZEIpICov CisJczE2IGh3X3ZvbFtTQ0FSTEVUVDJfQU5BTE9HVUVfTUFYXTsKKworCXU4IHBhZDJbU0NBUkxF VFQyX0FOQUxPR1VFX01BWF07CisKKwkvKiBzdyAoMCkgb3IgaHcgKDEpIGNvbnRyb2xsZWQgKi8K Kwl1OCBzd19od19zd2l0Y2hbU0NBUkxFVFQyX0FOQUxPR1VFX01BWF07CisKKwl1OCBwYWQzWzZd OworCisJLyogZnJvbnQgcGFuZWwgdm9sdW1lIGtub2IgKi8KKwlzMTYgbWFzdGVyX3ZvbDsKK30g X19wYWNrZWQ7CisKKy8qIENvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyB0aGF0IGNhbiBiZSByZWFk IGFuZCB3cml0dGVuICovCitlbnVtIHsKKwlTQ0FSTEVUVDJfQ09ORklHX0JVVFRPTlMgPSAwLAor CVNDQVJMRVRUMl9DT05GSUdfTElORV9PVVRfVk9MVU1FID0gMSwKKwlTQ0FSTEVUVDJfQ09ORklH X1NXX0hXX1NXSVRDSCA9IDIsCisJU0NBUkxFVFQyX0NPTkZJR19MRVZFTF9TV0lUQ0ggPSAzLAor CVNDQVJMRVRUMl9DT05GSUdfUEFEX1NXSVRDSCA9IDQsCisJU0NBUkxFVFQyX0NPTkZJR19DT1VO VCA9IDUKK307CisKKy8qIExvY2F0aW9uLCBzaXplLCBhbmQgYWN0aXZhdGlvbiBjb21tYW5kIG51 bWJlciBmb3IgdGhlIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFtZXRlcnMKKyAqLworc3RydWN0IHNj YXJsZXR0Ml9jb25maWcgeworCXU4IG9mZnNldDsKKwl1OCBzaXplOworCXU4IGFjdGl2YXRlOwor fTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfY29uZmlnCisJCXNjYXJsZXR0Ml9j b25maWdfaXRlbXNbU0NBUkxFVFQyX0NPTkZJR19DT1VOVF0gPSB7CisJLyogTXV0ZS9EaW0gQnV0 dG9ucyAqLworCXsKKwkJLm9mZnNldCA9IDB4MzEsCisJCS5zaXplID0gMSwKKwkJLmFjdGl2YXRl ID0gMgorCX0sCisKKwkvKiBMaW5lIE91dCBWb2x1bWUgKi8KKwl7CisJCS5vZmZzZXQgPSAweDM0 LAorCQkuc2l6ZSA9IDIsCisJCS5hY3RpdmF0ZSA9IDEKKwl9LAorCisJLyogU1cvSFcgVm9sdW1l IFN3aXRjaCAqLworCXsKKwkJLm9mZnNldCA9IDB4NjYsCisJCS5zaXplID0gMSwKKwkJLmFjdGl2 YXRlID0gMworCX0sCisKKwkvKiBMZXZlbCBTd2l0Y2ggKi8KKwl7CisJCS5vZmZzZXQgPSAweDdj LAorCQkuc2l6ZSA9IDEsCisJCS5hY3RpdmF0ZSA9IDcKKwl9LAorCisJLyogUGFkIFN3aXRjaCAq LworCXsKKwkJLm9mZnNldCA9IDB4ODQsCisJCS5zaXplID0gMSwKKwkJLmFjdGl2YXRlID0gOAor CX0KK307CisKKy8qIHByb3ByaWV0YXJ5IHJlcXVlc3QvcmVzcG9uc2UgZm9ybWF0ICovCitzdHJ1 Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQgeworCXUzMiBjbWQ7CisJdTE2IHNpemU7CisJdTE2IHNl cTsKKwl1MzIgZXJyb3I7CisJdTMyIHBhZDsKKwl1OCBkYXRhW107Cit9OworCisjZGVmaW5lIFND QVJMRVRUMl9VU0JfUEFDS0VUX0xFTiAoc2l6ZW9mKHN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tl dCkpCisKK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9maWxsX3JlcXVlc3RfaGVhZGVyKHN0cnVjdCBz Y2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSwKKwkJCQkJICBzdHJ1Y3Qgc2NhcmxldHQyX3Vz Yl9wYWNrZXQgKnJlcSwKKwkJCQkJICB1MzIgY21kLCB1MTYgcmVxX3NpemUpCit7CisJLyogc2Vx dWVuY2UgbXVzdCBnbyB1cCBieSAxIGZvciBlYWNoIHJlcXVlc3QgKi8KKwl1MTYgc2VxID0gcHJp dmF0ZS0+c2NhcmxldHQyX3NlcSsrOworCisJcmVxLT5jbWQgPSBjcHVfdG9fbGUzMihjbWQpOwor CXJlcS0+c2l6ZSA9IGNwdV90b19sZTE2KHJlcV9zaXplKTsKKwlyZXEtPnNlcSA9IGNwdV90b19s ZTE2KHNlcSk7CisJcmVxLT5lcnJvciA9IDA7CisJcmVxLT5wYWQgPSAwOworfQorCisvKiBTZW5k IGEgcHJvcHJpZXRhcnkgZm9ybWF0IHJlcXVlc3QgdG8gdGhlIFNjYXJsZXR0IGludGVyZmFjZSAq Lworc3RhdGljIGludCBzY2FybGV0dDJfdXNiKAorCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNl ICptaXhlciwgdTMyIGNtZCwKKwl2b2lkICpyZXFfZGF0YSwgdTE2IHJlcV9zaXplLCB2b2lkICpy ZXNwX2RhdGEsIHUxNiByZXNwX3NpemUpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRh ICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwl1MTYgcmVxX2J1Zl9zaXplID0gc2l6 ZW9mKHN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCkgKyByZXFfc2l6ZTsKKwl1MTYgcmVzcF9i dWZfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NhcmxldHQyX3VzYl9wYWNrZXQpICsgcmVzcF9zaXpl OworCXN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCAqcmVxID0gMCwgKnJlc3AgPSAwOworCWlu dCBlcnIgPSAwOworCisJcmVxID0ga21hbGxvYyhyZXFfYnVmX3NpemUsIEdGUF9LRVJORUwpOwor CWlmICghcmVxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJcmVz cCA9IGttYWxsb2MocmVzcF9idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNwKSB7CisJ CWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJbXV0ZXhfbG9jaygmcHJpdmF0 ZS0+dXNiX211dGV4KTsKKworCS8qIGJ1aWxkIHJlcXVlc3QgbWVzc2FnZSBhbmQgc2VuZCBpdCAq LworCisJc2NhcmxldHQyX2ZpbGxfcmVxdWVzdF9oZWFkZXIocHJpdmF0ZSwgcmVxLCBjbWQsIHJl cV9zaXplKTsKKworCWlmIChyZXFfc2l6ZSkKKwkJbWVtY3B5KHJlcS0+ZGF0YSwgcmVxX2RhdGEs IHJlcV9zaXplKTsKKworCWVyciA9IHNuZF91c2JfY3RsX21zZyhtaXhlci0+Y2hpcC0+ZGV2LAor CQkJdXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5kZXYsIDApLAorCQkJU0NBUkxFVFQyX1VT Ql9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFUSwKKwkJCVVTQl9SRUNJUF9JTlRFUkZBQ0UgfCBVU0Jf VFlQRV9DTEFTUyB8IFVTQl9ESVJfT1VULAorCQkJMCwKKwkJCVNDQVJMRVRUMl9VU0JfVkVORE9S X1NQRUNJRklDX0lOVEVSRkFDRSwKKwkJCXJlcSwKKwkJCXJlcV9idWZfc2l6ZSk7CisKKwlpZiAo ZXJyICE9IHJlcV9idWZfc2l6ZSkgeworCQl1c2JfYXVkaW9fZXJyKAorCQkJbWl4ZXItPmNoaXAs CisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIHJlcXVlc3QgcmVzdWx0IGNtZCAleCB3YXMgJWRcbiIs CisJCQljbWQsIGVycik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOworCX0KKwor CS8qIHNlbmQgYSBzZWNvbmQgbWVzc2FnZSB0byBnZXQgdGhlIHJlc3BvbnNlICovCisKKwllcnIg PSBzbmRfdXNiX2N0bF9tc2cobWl4ZXItPmNoaXAtPmRldiwKKwkJCXVzYl9zbmRjdHJscGlwZSht aXhlci0+Y2hpcC0+ZGV2LCAwKSwKKwkJCVNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJRklDX0NN RF9SRVNQLAorCQkJVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwgVVNCX0RJ Ul9JTiwKKwkJCTAsCisJCQlTQ0FSTEVUVDJfVVNCX1ZFTkRPUl9TUEVDSUZJQ19JTlRFUkZBQ0Us CisJCQlyZXNwLAorCQkJcmVzcF9idWZfc2l6ZSk7CisKKwkvKiB2YWxpZGF0ZSB0aGUgcmVzcG9u c2UgKi8KKworCWlmIChlcnIgIT0gcmVzcF9idWZfc2l6ZSkgeworCQl1c2JfYXVkaW9fZXJyKAor CQkJbWl4ZXItPmNoaXAsCisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIHJlc3BvbnNlIHJlc3VsdCBj bWQgJXggd2FzICVkXG4iLAorCQkJY21kLCBlcnIpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3Rv IHVubG9jazsKKwl9CisKKwlpZiAocmVzcC0+Y21kICE9IHJlcS0+Y21kIHx8CisJICAgIHJlc3At PnNlcSAhPSByZXEtPnNlcSB8fAorCSAgICByZXNwX3NpemUgIT0gbGUxNl90b19jcHUocmVzcC0+ c2l6ZSkgfHwKKwkgICAgcmVzcC0+ZXJyb3IgfHwKKwkgICAgcmVzcC0+cGFkKSB7CisJCXVzYl9h dWRpb19lcnIoCisJCQltaXhlci0+Y2hpcCwKKwkJCSJTY2FybGV0dCBHZW4gMiBVU0IgaW52YWxp ZCByZXNwb25zZTsgIgorCQkJICAgImNtZCB0eC9yeCAlZC8lZCBzZXEgJWQvJWQgc2l6ZSAlZC8l ZCAiCisJCQkgICAiZXJyb3IgJWQgcGFkICVkXG4iLAorCQkJbGUxNl90b19jcHUocmVxLT5jbWQp LCBsZTE2X3RvX2NwdShyZXNwLT5jbWQpLAorCQkJbGUxNl90b19jcHUocmVxLT5zZXEpLCBsZTE2 X3RvX2NwdShyZXNwLT5zZXEpLAorCQkJcmVzcF9zaXplLCBsZTE2X3RvX2NwdShyZXNwLT5zaXpl KSwKKwkJCWxlMTZfdG9fY3B1KHJlc3AtPmVycm9yKSwKKwkJCWxlMTZfdG9fY3B1KHJlc3AtPnBh ZCkpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAocmVzcF9z aXplID4gMCkKKwkJbWVtY3B5KHJlc3BfZGF0YSwgcmVzcC0+ZGF0YSwgcmVzcF9zaXplKTsKKwor dW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+dXNiX211dGV4KTsKK2Vycm9yOgorCWtm cmVlKHJlcSk7CisJa2ZyZWUocmVzcCk7CisJcmV0dXJuIGVycjsKK30KKworLyogU2VuZCBTQ0FS TEVUVDJfVVNCX0RBVEFfQ01EIFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUgKi8KK3N0YXRpYyB2 b2lkIHNjYXJsZXR0Ml9jb25maWdfc2F2ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4 ZXIpCit7CisJdTMyIHJlcSA9IGNwdV90b19sZTMyKFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUp OworCisJc2NhcmxldHQyX3VzYihtaXhlciwgU0NBUkxFVFQyX1VTQl9EQVRBX0NNRCwKKwkJICAg ICAgJnJlcSwgc2l6ZW9mKHUzMiksCisJCSAgICAgIE5VTEwsIDApOworfQorCisvKiBEZWxheWVk IHdvcmsgdG8gc2F2ZSBjb25maWcgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9jb25maWdfc2F2 ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21p eGVyX2RhdGEgKnByaXZhdGUgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNjYXJsZXR0 Ml9taXhlcl9kYXRhLCB3b3JrLndvcmspOworCisJc2NhcmxldHQyX2NvbmZpZ19zYXZlKHByaXZh dGUtPm1peGVyKTsKK30KKworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIHNldCBhIGNvbmZpZ3Vy YXRpb24gcGFyYW1ldGVyICh2b2x1bWUgbGV2ZWwsCisgKiBzdy9odyB2b2x1bWUgc3dpdGNoLCBs aW5lL2luc3QgbGV2ZWwgc3dpdGNoLCBvciBwYWQgc3dpdGNoKQorICovCitzdGF0aWMgaW50IHNj YXJsZXR0Ml91c2Jfc2V0X2NvbmZpZygKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4 ZXIsCisJaW50IGNvbmZpZ19pdGVtX251bSwgaW50IGluZGV4LCBpbnQgdmFsdWUpCit7CisJY29u c3Qgc3RydWN0IHNjYXJsZXR0Ml9jb25maWcgY29uZmlnX2l0ZW0gPQorCSAgICAgICBzY2FybGV0 dDJfY29uZmlnX2l0ZW1zW2NvbmZpZ19pdGVtX251bV07CisJc3RydWN0IHsKKwkJdTMyIG9mZnNl dDsKKwkJdTMyIGJ5dGVzOworCQlzMzIgdmFsdWU7CisJfSBfX3BhY2tlZCByZXE7CisJdTMyIHJl cTI7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBt aXhlci0+cHJpdmF0ZV9kYXRhOworCisJLyogQ2FuY2VsIGFueSBwZW5kaW5nIE5WUkFNIHNhdmUg Ki8KKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXZhdGUtPndvcmspOworCisJLyogU2Vu ZCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZGF0YSAqLworCXJlcS5vZmZzZXQgPSBjcHVf dG9fbGUzMihjb25maWdfaXRlbS5vZmZzZXQgKyBpbmRleCAqIGNvbmZpZ19pdGVtLnNpemUpOwor CXJlcS5ieXRlcyA9IGNwdV90b19sZTMyKGNvbmZpZ19pdGVtLnNpemUpOworCXJlcS52YWx1ZSA9 IGNwdV90b19sZTMyKHZhbHVlKTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVU VDJfVVNCX1NFVF9EQVRBLAorCQkJICAgICZyZXEsIHNpemVvZih1MzIpICogMiArIGNvbmZpZ19p dGVtLnNpemUsCisJCQkgICAgTlVMTCwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7 CisKKwkvKiBBY3RpdmF0ZSB0aGUgY2hhbmdlICovCisJcmVxMiA9IGNwdV90b19sZTMyKGNvbmZp Z19pdGVtLmFjdGl2YXRlKTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJf VVNCX0RBVEFfQ01ELAorCQkJICAgICZyZXEyLCBzaXplb2YocmVxMiksIE5VTEwsIDApOworCWlm IChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogU2NoZWR1bGUgdGhlIGNoYW5nZSB0byBi ZSB3cml0dGVuIHRvIE5WUkFNICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2YXRlLT53 b3JrLCBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKKworCXJldHVybiAwOworfQorCisvKiBTZW5k IGEgVVNCIG1lc3NhZ2UgdG8gZ2V0IGRhdGE7IHJlc3VsdCBwbGFjZWQgaW4gKmJ1ZiAqLworc3Rh dGljIGludCBzY2FybGV0dDJfdXNiX2dldCgKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAq bWl4ZXIsCisJaW50IG9mZnNldCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1Y3Qgewor CQl1MzIgb2Zmc2V0OworCQl1MzIgc2l6ZTsKKwl9IF9fcGFja2VkIHJlcTsKKworCXJlcS5vZmZz ZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpOworCXJlcS5zaXplID0gY3B1X3RvX2xlMzIoc2l6ZSk7 CisJcmV0dXJuIHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfR0VUX0RBVEEsCisJ CQkgICAgICZyZXEsIHNpemVvZihyZXEpLCBidWYsIHNpemUpOworfQorCisvKiBTZW5kIGEgVVNC IG1lc3NhZ2UgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczsgcmVzdWx0IHBsYWNlZCBp biAqYnVmICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml91c2JfZ2V0X2NvbmZpZygKKwlzdHJ1Y3Qg dXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJaW50IGNvbmZpZ19pdGVtX251bSwgaW50IGNv dW50LCB2b2lkICpidWYpCit7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9jb25maWcgY29uZmln X2l0ZW0gPQorCSAgICAgICBzY2FybGV0dDJfY29uZmlnX2l0ZW1zW2NvbmZpZ19pdGVtX251bV07 CisJaW50IHNpemUgPSBjb25maWdfaXRlbS5zaXplICogY291bnQ7CisKKwlyZXR1cm4gc2Nhcmxl dHQyX3VzYl9nZXQobWl4ZXIsIGNvbmZpZ19pdGVtLm9mZnNldCwgYnVmLCBzaXplKTsKK30KKwor LyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIGdldCB2b2x1bWUgc3RhdHVzOyByZXN1bHQgcGxhY2Vk IGluICpidWYgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9nZXRfdm9sdW1lX3N0YXR1cygK KwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJc3RydWN0IHNjYXJsZXR0Ml91 c2Jfdm9sdW1lX3N0YXR1cyAqYnVmKQoreworCXJldHVybiBzY2FybGV0dDJfdXNiX2dldChtaXhl ciwgU0NBUkxFVFQyX1VTQl9WT0xVTUVfU1RBVFVTX09GRlNFVCwKKwkJCQkgYnVmLCBzaXplb2Yo KmJ1ZikpOworfQorCisvKiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8gc2V0IHRoZSB2b2x1bWVzIGZv ciBhbGwgaW5wdXRzIG9mIG9uZSBtaXgKKyAqICh2YWx1ZXMgb2J0YWluZWQgZnJvbSBwcml2YXRl LT5taXhbXSkKKyAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX3NldF9taXgoc3RydWN0IHVz Yl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCQkJCSAgICAgaW50IG1peF9udW0pCit7CisJc3Ry dWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsK Kwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZvID0gcHJpdmF0ZS0+aW5m bzsKKworCXN0cnVjdCB7CisJCXUxNiBtaXhfbnVtOworCQl1MTYgZGF0YVtTQ0FSTEVUVDJfSU5Q VVRfTUlYX01BWF07CisJfSBfX3BhY2tlZCByZXE7CisKKwlpbnQgaSwgajsKKwlpbnQgbnVtX21p eGVyX2luID0KKwkJaW5mby0+cG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVhdLm51bVtTQ0FS TEVUVDJfUE9SVF9PVVRdOworCisJcmVxLm1peF9udW0gPSBjcHVfdG9fbGUxNihtaXhfbnVtKTsK KworCWZvciAoaSA9IDAsIGogPSBtaXhfbnVtICogbnVtX21peGVyX2luOyBpIDwgbnVtX21peGVy X2luOyBpKyssIGorKykKKwkJcmVxLmRhdGFbaV0gPSBjcHVfdG9fbGUxNigKKwkJCXNjYXJsZXR0 Ml9taXhlcl92YWx1ZXNbcHJpdmF0ZS0+bWl4W2pdXQorCQkpOworCisJcmV0dXJuIHNjYXJsZXR0 Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfU0VUX01JWCwKKwkJCSAgICAgJnJlcSwgKG51bV9t aXhlcl9pbiArIDEpICogc2l6ZW9mKHUxNiksCisJCQkgICAgIE5VTEwsIDApOworfQorCisvKiBD b252ZXJ0IGEgcG9ydCBudW1iZXIgaW5kZXggKHBlciBpbmZvLT5wb3J0cykgdG8gYSBoYXJkd2Fy ZSBJRCAqLworc3RhdGljIHUzMiBzY2FybGV0dDJfbXV4X3NyY19udW1fdG9faWQoY29uc3Qgc3Ry dWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMsCisJCQkJICAgICAgIGludCBudW0pCit7CisJaW50 IHBvcnRfdHlwZTsKKworCWZvciAocG9ydF90eXBlID0gMDsKKwkgICAgIHBvcnRfdHlwZSA8IFND QVJMRVRUMl9QT1JUX1RZUEVfQ09VTlQ7CisJICAgICBwb3J0X3R5cGUrKykgeworCQlpZiAobnVt IDwgcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dKQorCQkJcmV0dXJuIHBv cnRzW3BvcnRfdHlwZV0uaWQgfCBudW07CisJCW51bSAtPSBwb3J0c1twb3J0X3R5cGVdLm51bVtT Q0FSTEVUVDJfUE9SVF9JTl07CisJfQorCisJLyogT29wcyAqLworCXJldHVybiAwOworfQorCisv KiBTZW5kIFVTQiBtZXNzYWdlcyB0byBzZXQgbXV4IGlucHV0cyAqLworc3RhdGljIGludCBzY2Fy bGV0dDJfdXNiX3NldF9tdXgoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQorewor CXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2Rh dGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZhdGUt PmluZm87CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBpbmZvLT5wb3J0 czsKKwlpbnQgcmF0ZSwgcG9ydF9kaXJfcmF0ZTsKKworCXN0YXRpYyBjb25zdCBpbnQgYXNzaWdu bWVudF9vcmRlcltTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UXSA9IHsKKwkJU0NBUkxFVFQyX1BP UlRfVFlQRV9QQ00sCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUUsCisJCVNDQVJMRVRU Ml9QT1JUX1RZUEVfU1BESUYsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQURBVCwKKwkJU0NBUkxF VFQyX1BPUlRfVFlQRV9NSVgsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfTk9ORSwKKwl9OworCisJ c3RydWN0IHsKKwkJdTE2IHBhZDsKKwkJdTE2IG51bTsKKwkJdTMyIGRhdGFbU0NBUkxFVFQyX01V WF9NQVhdOworCX0gX19wYWNrZWQgcmVxOworCisJcmVxLnBhZCA9IDA7CisKKwkvKiBtdXggc2V0 dGluZ3MgZm9yIGVhY2ggcmF0ZSAqLworCWZvciAocmF0ZSA9IDAsIHBvcnRfZGlyX3JhdGUgPSBT Q0FSTEVUVDJfUE9SVF9PVVRfNDQ7CisJICAgICBwb3J0X2Rpcl9yYXRlIDw9IFNDQVJMRVRUMl9Q T1JUX09VVF8xNzY7CisJICAgICByYXRlKyssIHBvcnRfZGlyX3JhdGUrKykgeworCQlpbnQgb3Jk ZXJfbnVtLCBpLCBlcnI7CisKKwkJcmVxLm51bSA9IGNwdV90b19sZTE2KHJhdGUpOworCisJCWZv ciAob3JkZXJfbnVtID0gMCwgaSA9IDA7CisJCSAgICAgb3JkZXJfbnVtIDwgU0NBUkxFVFQyX1BP UlRfVFlQRV9DT1VOVDsKKwkJICAgICBvcmRlcl9udW0rKykgeworCQkJaW50IHBvcnRfdHlwZSA9 IGFzc2lnbm1lbnRfb3JkZXJbb3JkZXJfbnVtXTsKKwkJCWludCBqID0gc2NhcmxldHQyX2dldF9w b3J0X3N0YXJ0X251bShwb3J0cywKKwkJCQkJCQkgICAgIFNDQVJMRVRUMl9QT1JUX09VVCwKKwkJ CQkJCQkgICAgIHBvcnRfdHlwZSk7CisJCQlpbnQgcG9ydF9pZCA9IHBvcnRzW3BvcnRfdHlwZV0u aWQ7CisJCQlpbnQgY2hhbm5lbDsKKworCQkJZm9yIChjaGFubmVsID0gMDsKKwkJCSAgICAgY2hh bm5lbCA8IHBvcnRzW3BvcnRfdHlwZV0ubnVtW3BvcnRfZGlyX3JhdGVdOworCQkJICAgICBjaGFu bmVsKyssIGkrKywgaisrKQorCQkJCS8qIGxvd2VyIDEyIGJpdHMgZm9yIHRoZSBkZXN0aW5hdGlv biBhbmQKKwkJCQkgKiBuZXh0IDEyIGJpdHMgZm9yIHRoZSBzb3VyY2UKKwkJCQkgKi8KKwkJCQly ZXEuZGF0YVtpXSA9ICFwb3J0X2lkCisJCQkJCT8gMAorCQkJCQk6IGNwdV90b19sZTMyKAorCQkJ CQkJcG9ydF9pZCB8CisJCQkJCQljaGFubmVsIHwKKwkJCQkJCXNjYXJsZXR0Ml9tdXhfc3JjX251 bV90b19pZCgKKwkJCQkJCQlwb3J0cywgcHJpdmF0ZS0+bXV4W2pdCisJCQkJCQkpIDw8IDEyCisJ CQkJCSAgKTsKKworCQkJLyogc2tpcCBwcml2YXRlLT5tdXhbal0gZW50cmllcyBub3Qgb3V0cHV0 ICovCisJCQlqICs9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF0gLQor CQkJICAgICBwb3J0c1twb3J0X3R5cGVdLm51bVtwb3J0X2Rpcl9yYXRlXTsKKwkJfQorCisJCWVy ciA9IHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfU0VUX01VWCwKKwkJCQkgICAg JnJlcSwgKGkgKyAxKSAqIHNpemVvZih1MzIpLAorCQkJCSAgICBOVUxMLCAwKTsKKwkJaWYgKGVy ciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisvKiBTZW5kIFVT QiBtZXNzYWdlIHRvIGdldCBtZXRlciBsZXZlbHMgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3Vz Yl9nZXRfbWV0ZXJfbGV2ZWxzKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwKKwkJ CQkJICB1MTYgKmxldmVscykKK3sKKwlzdHJ1Y3QgeworCQl1MTYgcGFkOworCQl1MTYgbnVtX21l dGVyczsKKwkJdTMyIG1hZ2ljOworCX0gX19wYWNrZWQgcmVxOworCXUzMiByZXNwW1NDQVJMRVRU Ml9OVU1fTUVURVJTXTsKKwlpbnQgaSwgZXJyOworCisJcmVxLnBhZCA9IDA7CisJcmVxLm51bV9t ZXRlcnMgPSBjcHVfdG9fbGUxNihTQ0FSTEVUVDJfTlVNX01FVEVSUyk7CisJcmVxLm1hZ2ljID0g Y3B1X3RvX2xlMzIoU0NBUkxFVFQyX1VTQl9NRVRFUl9MRVZFTFNfR0VUX01BR0lDKTsKKwllcnIg PSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0dFVF9NRVRFUl9MRVZFTFMsCisJ CQkgICAgJnJlcSwgc2l6ZW9mKHJlcSksIHJlc3AsIHNpemVvZihyZXNwKSk7CisJaWYgKGVyciA8 IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBjb3B5LCBjb252ZXJ0IHRvIHUxNiAqLworCWZvciAo aSA9IDA7IGkgPCBTQ0FSTEVUVDJfTlVNX01FVEVSUzsgaSsrKQorCQlsZXZlbHNbaV0gPSByZXNw W2ldOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiogQ29udHJvbCBGdW5jdGlvbnMgKioqLworCisv KiBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGNvbnRyb2wgKi8KK3N0YXRpYyBpbnQg c2NhcmxldHQyX2FkZF9uZXdfY3RsKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciwK KwkJCQkgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm5jb250cm9sLAorCQkJCSBpbnQg aW5kZXgsIGludCBjaGFubmVscywgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgc3RydWN0IHNuZF9r Y29udHJvbCAqKmtjdGxfcmV0dXJuKQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGw7CisJ c3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW07CisJaW50IGVycjsKKworCWVsZW0gPSBr emFsbG9jKHNpemVvZigqZWxlbSksIEdGUF9LRVJORUwpOworCWlmICghZWxlbSkKKwkJcmV0dXJu IC1FTk9NRU07CisKKwllbGVtLT5oZWFkLm1peGVyID0gbWl4ZXI7CisJZWxlbS0+Y29udHJvbCA9 IGluZGV4OworCWVsZW0tPmhlYWQuaWQgPSBpbmRleDsKKwllbGVtLT5jaGFubmVscyA9IGNoYW5u ZWxzOworCisJa2N0bCA9IHNuZF9jdGxfbmV3MShuY29udHJvbCwgZWxlbSk7CisJaWYgKCFrY3Rs KSB7CisJCWtmcmVlKGVsZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJa2N0bC0+cHJpdmF0 ZV9mcmVlID0gc25kX3VzYl9taXhlcl9lbGVtX2ZyZWU7CisKKwlzdHJsY3B5KGtjdGwtPmlkLm5h bWUsIG5hbWUsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CisKKwllcnIgPSBzbmRfdXNiX21peGVy X2FkZF9jb250cm9sKCZlbGVtLT5oZWFkLCBrY3RsKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJu IGVycjsKKworCWlmIChrY3RsX3JldHVybikKKwkJKmtjdGxfcmV0dXJuID0ga2N0bDsKKworCXJl dHVybiAwOworfQorCisvKioqIEFuYWxvZ3VlIExpbmUgT3V0IFZvbHVtZSBDb250cm9scyAqKiov CisKKy8qIFVwZGF0ZSBoYXJkd2FyZSB2b2x1bWUgY29udHJvbHMgYWZ0ZXIgcmVjZWl2aW5nIG5v dGlmaWNhdGlvbiB0aGF0CisgKiB0aGV5IGhhdmUgY2hhbmdlZAorICovCitzdGF0aWMgaW50IHNj YXJsZXR0Ml91cGRhdGVfdm9sdW1lcyhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIp Cit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZh dGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cyA9IHByaXZhdGUt PmluZm8tPnBvcnRzOworCXN0cnVjdCBzY2FybGV0dDJfdXNiX3ZvbHVtZV9zdGF0dXMgdm9sdW1l X3N0YXR1czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQ RV9BTkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGVyciwgaTsKKworCXBy aXZhdGUtPnZvbF91cGRhdGVkID0gMDsKKworCWVyciA9IHNjYXJsZXR0Ml91c2JfZ2V0X3ZvbHVt ZV9zdGF0dXMobWl4ZXIsICZ2b2x1bWVfc3RhdHVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJu IGVycjsKKworCXByaXZhdGUtPm1hc3Rlcl92b2wgPSBjbGFtcCgKKwkJdm9sdW1lX3N0YXR1cy5t YXN0ZXJfdm9sICsgU0NBUkxFVFQyX1ZPTFVNRV9CSUFTLAorCQkwLCBTQ0FSTEVUVDJfVk9MVU1F X0JJQVMpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9saW5lX291dDsgaSsrKSB7CisJCWlmIChw cml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ldKQorCQkJcHJpdmF0ZS0+dm9sW2ldID0gcHJpdmF0 ZS0+bWFzdGVyX3ZvbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdmF0ZS0+aW5mby0+YnV0 dG9uX2NvdW50OyBpKyspCisJCXByaXZhdGUtPmJ1dHRvbnNbaV0gPSAhIXZvbHVtZV9zdGF0dXMu YnV0dG9uc1tpXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml92b2x1 bWVfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICAgIHN0cnVjdCBz bmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8g KmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisKKwl1aW5mby0+dHlwZSA9IFNORFJWX0NUTF9F TEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSBlbGVtLT5jaGFubmVsczsKKwl1aW5m by0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1heCA9IFND QVJMRVRUMl9WT0xVTUVfQklBUzsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0gMTsKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGxfZ2V0 KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1f dmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0g a2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9 IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRl ID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlmIChwcml2YXRlLT52b2xfdXBkYXRlZCkgewor CQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwkJc2NhcmxldHQyX3VwZGF0ZV92 b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwl9 CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHByaXZhdGUtPm1hc3Rlcl92 b2w7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3ZvbHVtZV9jdGxfZ2V0 KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1f dmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0g a2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9 IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRl ID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQgaW5kZXggPSBlbGVtLT5jb250cm9sOworCisJ aWYgKHByaXZhdGUtPnZvbF91cGRhdGVkKSB7CisJCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFf bXV0ZXgpOworCQlzY2FybGV0dDJfdXBkYXRlX3ZvbHVtZXMobWl4ZXIpOworCQltdXRleF91bmxv Y2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCX0KKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2Vy LnZhbHVlWzBdID0gcHJpdmF0ZS0+dm9sW2luZGV4XTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGlj IGludCBzY2FybGV0dDJfdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwK KwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0 IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0 IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qg c2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWlu dCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsKKworCW11 dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHByaXZhdGUtPnZvbFtp bmRleF07CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAo b3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2NrOworCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9IHZh bDsKKwllcnIgPSBzY2FybGV0dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRUMl9DT05G SUdfTElORV9PVVRfVk9MVU1FLAorCQkJCSAgICAgICBpbmRleCwgdmFsIC0gU0NBUkxFVFQyX1ZP TFVNRV9CSUFTKTsKKwlpZiAoZXJyID09IDApCisJCWVyciA9IDE7CisKK3VubG9jazoKKwltdXRl eF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRp YyBjb25zdCBERUNMQVJFX1RMVl9EQl9NSU5NQVgoCisJZGJfc2NhbGVfc2NhcmxldHQyX2dhaW4s IC1TQ0FSTEVUVDJfVk9MVU1FX0JJQVMgKiAxMDAsIDAKKyk7CisKK3N0YXRpYyBjb25zdCBzdHJ1 Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGwgPSB7CisJLmlm YWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9F TEVNX0FDQ0VTU19SRUFEIHwKKwkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JFQUQsCisJ Lm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml92b2x1bWVfY3RsX2luZm8sCisJLmdldCAg PSBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGxfZ2V0LAorCS5wcml2YXRlX3ZhbHVlID0gMCwg LyogbWF4IHZhbHVlICovCisJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9zY2FybGV0dDJfZ2FpbiB9 Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX2xp bmVfb3V0X3ZvbHVtZV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlY RVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAorCQkgIFNO RFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2Nh cmxldHQyX3ZvbHVtZV9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml92b2x1bWVfY3RsX2dl dCwKKwkucHV0ICA9IHNjYXJsZXR0Ml92b2x1bWVfY3RsX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9 IDAsIC8qIG1heCB2YWx1ZSAqLworCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfc2NhcmxldHQyX2dh aW4gfQorfTsKKworLyoqKiBIVy9TVyBWb2x1bWUgU3dpdGNoIENvbnRyb2xzICoqKi8KKworc3Rh dGljIGludCBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9s ICprY3RsLAorCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0 aWMgY29uc3QgY2hhciAqY29uc3QgdmFsdWVzWzJdID0geworCQkiU1ciLCAiSFciCisJfTsKKwor CXJldHVybiBzbmRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgMiwgdmFsdWVzKTsKK30KKworc3Rh dGljIGludCBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wg KmtjdGwsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0 cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0 cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnBy aXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0gPQorCQlw cml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQor CitzdGF0aWMgaW50IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9wdXQoc3RydWN0IHNuZF9rY29u dHJvbCAqa2N0bCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7 CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7 CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsK KwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9k YXRhOworCisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIg PSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJp dmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpbmRleF07CisJdmFsID0gISF1Y29udHJvbC0+dmFsdWUu aW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisK Kwlwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2luZGV4XSA9IHZhbDsKKworCS8qIENoYW5nZSBh Y2Nlc3MgbW9kZSB0byBSTyAoaGFyZHdhcmUgY29udHJvbGxlZCB2b2x1bWUpCisJICogb3IgUlcg KHNvZnR3YXJlIGNvbnRyb2xsZWQgdm9sdW1lKQorCSAqLworCWlmICh2YWwpCisJCXByaXZhdGUt PnZvbF9jdGxzW2luZGV4XS0+dmRbMF0uYWNjZXNzICY9CisJCQl+U05EUlZfQ1RMX0VMRU1fQUND RVNTX1dSSVRFOworCWVsc2UKKwkJcHJpdmF0ZS0+dm9sX2N0bHNbaW5kZXhdLT52ZFswXS5hY2Nl c3MgfD0KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKKworCS8qIFJlc2V0IHZvbHVt ZSB0byBtYXN0ZXIgdm9sdW1lICovCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9IHByaXZhdGUtPm1h c3Rlcl92b2w7CisKKwkvKiBTZXQgU1cgdm9sdW1lIHRvIGN1cnJlbnQgSFcgdm9sdW1lICovCisJ ZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKAorCQltaXhlciwgU0NBUkxFVFQyX0NPTkZJ R19MSU5FX09VVF9WT0xVTUUsCisJCWluZGV4LCBwcml2YXRlLT5tYXN0ZXJfdm9sIC0gU0NBUkxF VFQyX1ZPTFVNRV9CSUFTKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CisKKwkvKiBO b3RpZnkgb2YgUk8vUlcgY2hhbmdlICovCisJc25kX2N0bF9ub3RpZnkobWl4ZXItPmNoaXAtPmNh cmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sCisJCSAgICAgICAmcHJpdmF0ZS0+dm9sX2N0 bHNbaW5kZXhdLT5pZCk7CisKKwkvKiBTZW5kIFNXL0hXIHN3aXRjaCBjaGFuZ2UgdG8gdGhlIGRl dmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NBUkxFVFQy X0NPTkZJR19TV19IV19TV0lUQ0gsCisJCQkJICAgICAgIGluZGV4LCB2YWwpOworCit1bmxvY2s6 CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX3N3X2h3X2Vu dW1fY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1l ID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfaW5mbywKKwkuZ2V0ICA9 IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfc3dfaHdf ZW51bV9jdGxfcHV0LAorfTsKKworLyoqKiBMaW5lIExldmVsL0luc3RydW1lbnQgTGV2ZWwgU3dp dGNoIENvbnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxf aW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxl bV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFsdWVzWzJdID0g eworCQkiTGluZSIsICJJbnN0IgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2luZm8odWlu Zm8sIDEsIDIsIHZhbHVlcyk7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2xldmVsX2VudW1f Y3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQlzdHJ1Y3Qgc25kX2N0bF9l bGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxl bSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnBy aXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7CisKKwl1Y29udHJvbC0+dmFs dWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJcHJpdmF0ZS0+bGV2ZWxfc3dpdGNoW2VsZW0tPmNv bnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9sZXZlbF9lbnVt X2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJc3RydWN0IHNuZF9jdGxf ZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVs ZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1p eGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnBy aXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJv bDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0 YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+bGV2ZWxfc3dpdGNoW2luZGV4XTsKKwl2YWwg PSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJaWYgKG92YWwgPT0gdmFs KQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPmxldmVsX3N3aXRjaFtpbmRleF0gPSB2YWw7 CisKKwkvKiBTZW5kIHN3aXRjaCBjaGFuZ2UgdG8gdGhlIGRldmljZSAqLworCWVyciA9IHNjYXJs ZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NBUkxFVFQyX0NPTkZJR19MRVZFTF9TV0lUQ0gs CisJCQkJICAgICAgIGluZGV4LCB2YWwpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2 YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0 IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX2xldmVsX2VudW1fY3RsID0geworCS5pZmFjZSA9 IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2Fy bGV0dDJfbGV2ZWxfZW51bV9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9sZXZlbF9lbnVt X2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxfcHV0LAorfTsKKwor LyoqKiBQYWQgU3dpdGNoIENvbnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2FybGV0dDJfcGFk X2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgc3RydWN0IHNuZF9jdGxf ZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVs ZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpw cml2YXRlID0gZWxlbS0+aGVhZC5taXhlci0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRyb2wtPnZh bHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCXByaXZhdGUtPnBhZF9zd2l0Y2hbZWxlbS0+Y29u dHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3BhZF9jdGxfcHV0 KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFs dWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0 bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IGVs ZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0g bWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50 IG92YWwsIHZhbCwgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgp OworCisJb3ZhbCA9IHByaXZhdGUtPnBhZF9zd2l0Y2hbaW5kZXhdOworCXZhbCA9ICEhdWNvbnRy b2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8g dW5sb2NrOworCisJcHJpdmF0ZS0+cGFkX3N3aXRjaFtpbmRleF0gPSB2YWw7CisKKwkvKiBTZW5k IHN3aXRjaCBjaGFuZ2UgdG8gdGhlIGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0 X2NvbmZpZyhtaXhlciwgU0NBUkxFVFQyX0NPTkZJR19QQURfU1dJVENILAorCQkJCSAgICAgICBp bmRleCwgdmFsKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRl eCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xf bmV3IHNjYXJsZXR0Ml9wYWRfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNF X01JWEVSLAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9ub19pbmZv LAorCS5nZXQgID0gc2NhcmxldHQyX3BhZF9jdGxfZ2V0LAorCS5wdXQgID0gc2NhcmxldHQyX3Bh ZF9jdGxfcHV0LAorfTsKKworLyoqKiBNdXRlL0RpbSBDb250cm9scyAqKiovCisKK3N0YXRpYyBp bnQgc2NhcmxldHQyX2J1dHRvbl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJ CQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1 c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1 c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNj YXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlm IChwcml2YXRlLT52b2xfdXBkYXRlZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211 dGV4KTsKKwkJc2NhcmxldHQyX3VwZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2Nr KCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRl ZC5pdGVtWzBdID0gcHJpdmF0ZS0+YnV0dG9uc1tlbGVtLT5jb250cm9sXTsKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBzY2FybGV0dDJfYnV0dG9uX2N0bF9wdXQoc3RydWN0IHNuZF9rY29u dHJvbCAqa2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wp Cit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2Rh dGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhl cjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0 ZV9kYXRhOworCisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKwlpbnQgb3ZhbCwgdmFsLCBl cnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0g cHJpdmF0ZS0+YnV0dG9uc1tpbmRleF07CisJdmFsID0gISF1Y29udHJvbC0+dmFsdWUuaW50ZWdl ci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2 YXRlLT5idXR0b25zW2luZGV4XSA9IHZhbDsKKworCS8qIFNlbmQgc3dpdGNoIGNoYW5nZSB0byB0 aGUgZGV2aWNlICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKG1peGVyLCBTQ0FS TEVUVDJfQ09ORklHX0JVVFRPTlMsCisJCQkJICAgICAgIGluZGV4LCB2YWwpOworCit1bmxvY2s6 CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX2J1dHRvbl9j dGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUgPSAi IiwKKwkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJLmdldCAgPSBzY2FybGV0 dDJfYnV0dG9uX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfYnV0dG9uX2N0bF9wdXQKK307 CisKKy8qKiogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBvdXRwdXQgY29udHJvbHMgKioqLworCitzdGF0 aWMgaW50IHNjYXJsZXR0Ml9hZGRfbGluZV9vdXRfY3RscyhzdHJ1Y3QgdXNiX21peGVyX2ludGVy ZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0g bWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZv ICppbmZvID0gcHJpdmF0ZS0+aW5mbzsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpw b3J0cyA9IGluZm8tPnBvcnRzOworCWludCBudW1fbGluZV9vdXQgPQorCQlwb3J0c1tTQ0FSTEVU VDJfUE9SVF9UWVBFX0FOQUxPR1VFXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwlpbnQgZXJy LCBpOworCWNoYXIgc1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01BWExFTl07CisKKwkvKiBBZGQg Ui9PIEhXIHZvbHVtZSBjb250cm9sICovCisJaWYgKGluZm8tPmxpbmVfb3V0X2h3X3ZvbCkgewor CQlzbnByaW50ZihzLCBzaXplb2YocyksICJNYXN0ZXIgSFcgUGxheWJhY2sgVm9sdW1lIik7CisJ CWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwKKwkJCQkJICAgICZzY2FybGV0dDJf bWFzdGVyX3ZvbHVtZV9jdGwsCisJCQkJCSAgICAwLCAxLCBzLCAmcHJpdmF0ZS0+bWFzdGVyX3Zv bF9jdGwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyogQWRkIHZv bHVtZSBjb250cm9scyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkrKykgewor CisJCS8qIEZhZGVyICovCisJCWlmIChpbmZvLT5saW5lX291dF9kZXNjcnNbaV0pCisJCQlzbnBy aW50ZihzLCBzaXplb2YocyksCisJCQkJICJMaW5lICUwMmQgKCVzKSBQbGF5YmFjayBWb2x1bWUi LAorCQkJCSBpICsgMSwgaW5mby0+bGluZV9vdXRfZGVzY3JzW2ldKTsKKwkJZWxzZQorCQkJc25w cmludGYocywgc2l6ZW9mKHMpLAorCQkJCSAiTGluZSAlMDJkIFBsYXliYWNrIFZvbHVtZSIsCisJ CQkJIGkgKyAxKTsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdfY3RsKG1peGVyLAorCQkJCQkg ICAgJnNjYXJsZXR0Ml9saW5lX291dF92b2x1bWVfY3RsLAorCQkJCQkgICAgaSwgMSwgcywgJnBy aXZhdGUtPnZvbF9jdGxzW2ldKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCisJ CS8qIE1ha2UgdGhlIGZhZGVyIHJlYWQtb25seSBpZiB0aGUgU1cvSFcgc3dpdGNoIGlzIHNldCB0 byBIVyAqLworCQlpZiAocHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpXSkKKwkJCXByaXZhdGUt PnZvbF9jdGxzW2ldLT52ZFswXS5hY2Nlc3MgJj0KKwkJCQl+U05EUlZfQ1RMX0VMRU1fQUNDRVNT X1dSSVRFOworCisJCS8qIFNXL0hXIFN3aXRjaCAqLworCQlpZiAoaW5mby0+bGluZV9vdXRfaHdf dm9sKSB7CisJCQlzbnByaW50ZihzLCBzaXplb2YocyksCisJCQkJICJMaW5lIE91dCAlMDJkIFZv bHVtZSBDb250cm9sIFBsYXliYWNrIEVudW0iLAorCQkJCSBpICsgMSk7CisJCQllcnIgPSBzY2Fy bGV0dDJfYWRkX25ld19jdGwobWl4ZXIsCisJCQkJCQkgICAgJnNjYXJsZXR0Ml9zd19od19lbnVt X2N0bCwKKwkJCQkJCSAgICBpLCAxLCBzLCBOVUxMKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJl dHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBBZGQgSFcgYnV0dG9uIGNvbnRyb2xzICovCisJZm9y IChpID0gMDsgaSA8IHByaXZhdGUtPmluZm8tPmJ1dHRvbl9jb3VudDsgaSsrKSB7CisJCWVyciA9 IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9idXR0b25fY3RsLAorCQkJ CQkgICAgaSwgMSwgc2NhcmxldHQyX2J1dHRvbl9uYW1lc1tpXSwKKwkJCQkJICAgICZwcml2YXRl LT5idXR0b25fY3Rsc1tpXSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisK KwlyZXR1cm4gMDsKK30KKworLyoqKiBDcmVhdGUgdGhlIGFuYWxvZ3VlIGlucHV0IGNvbnRyb2xz ICoqKi8KKworc3RhdGljIGludCBzY2FybGV0dDJfYWRkX2xpbmVfaW5fY3RscyhzdHJ1Y3QgdXNi X21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRh ICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQy X2RldmljZV9pbmZvICppbmZvID0gcHJpdmF0ZS0+aW5mbzsKKwlpbnQgZXJyLCBpOworCWNoYXIg c1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01BWExFTl07CisKKwkvKiBBZGQgaW5wdXQgbGV2ZWwg KGxpbmUvaW5zdCkgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bGV2ZWxfaW5w dXRfY291bnQ7IGkrKykgeworCQlzbnByaW50ZihzLCBzaXplb2YocyksICJMaW5lIEluICVkIExl dmVsIENhcHR1cmUgRW51bSIsIGkgKyAxKTsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdfY3Rs KG1peGVyLCAmc2NhcmxldHQyX2xldmVsX2VudW1fY3RsLAorCQkJCQkgICAgaSwgMSwgcywgTlVM TCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBBZGQgaW5wdXQg cGFkIGNvbnRyb2xzICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPnBhZF9pbnB1dF9jb3VudDsg aSsrKSB7CisJCXNucHJpbnRmKHMsIHNpemVvZihzKSwgIkxpbmUgSW4gJWQgUGFkIENhcHR1cmUg U3dpdGNoIiwgaSArIDEpOworCQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZz Y2FybGV0dDJfcGFkX2N0bCwKKwkJCQkJICAgIGksIDEsIHMsIE5VTEwpOworCQlpZiAoZXJyIDwg MCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiogTWl4ZXIgVm9s dW1lIENvbnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJfY3RsX2luZm8o c3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9p bmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwt PnByaXZhdGVfZGF0YTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRF R0VSOworCXVpbmZvLT5jb3VudCA9IGVsZW0tPmNoYW5uZWxzOworCXVpbmZvLT52YWx1ZS5pbnRl Z2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gU0NBUkxFVFQyX01JWEVS X01BWF9WQUxVRTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0gMTsKKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJfY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250 cm9sICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQor eworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRh OworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4 ZXItPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdID0g cHJpdmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50 IHNjYXJsZXR0Ml9taXhlcl9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJ ICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9t aXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9t aXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2Nhcmxl dHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0 cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRlLT5pbmZvOworCWNvbnN0 IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9ydHM7CisJaW50IG92YWws IHZhbCwgbnVtX21peGVyX2luLCBtaXhfbnVtLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJp dmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xd OworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW51bV9taXhlcl9p biA9IHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VU XTsKKwltaXhfbnVtID0gZWxlbS0+Y29udHJvbCAvIG51bV9taXhlcl9pbjsKKworCWlmIChvdmFs ID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT5taXhbZWxlbS0+Y29udHJvbF0g PSB2YWw7CisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfbWl4KG1peGVyLCBtaXhfbnVtKTsKKwlp ZiAoZXJyID09IDApCisJCWVyciA9IDE7CisKK3VubG9jazoKKwltdXRleF91bmxvY2soJnByaXZh dGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBERUNMQVJF X1RMVl9EQl9NSU5NQVgoCisJZGJfc2NhbGVfc2NhcmxldHQyX21peGVyLAorCVNDQVJMRVRUMl9N SVhFUl9NSU5fREIgKiAxMDAsCisJU0NBUkxFVFQyX01JWEVSX01BWF9EQiAqIDEwMAorKTsKKwor c3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9taXhlcl9jdGwg PSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNO RFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAorCQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VT U19UTFZfUkVBRCwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX21peGVyX2N0bF9p bmZvLAorCS5nZXQgID0gc2NhcmxldHQyX21peGVyX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0 dDJfbWl4ZXJfY3RsX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IFNDQVJMRVRUMl9NSVhFUl9NQVhf REIsIC8qIG1heCB2YWx1ZSAqLworCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfc2NhcmxldHQyX21p eGVyIH0KK307CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9taXhlcl9jdGxzKHN0cnVjdCB1 c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2Rh dGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBzY2FybGV0 dDJfcG9ydHMgKnBvcnRzID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7CisJaW50IGVyciwgaSwgajsK KwlpbnQgaW5kZXg7CisJY2hhciBzW1NORFJWX0NUTF9FTEVNX0lEX05BTUVfTUFYTEVOXTsKKwor CWludCBudW1faW5wdXRzID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVhdLm51bVtTQ0FS TEVUVDJfUE9SVF9PVVRdOworCWludCBudW1fb3V0cHV0cyA9IHBvcnRzW1NDQVJMRVRUMl9QT1JU X1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCisJZm9yIChpID0gMCwgaW5kZXgg PSAwOyBpIDwgbnVtX291dHB1dHM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgbnVtX2lucHV0 czsgaisrLCBpbmRleCsrKSB7CisJCQlzbnByaW50ZihzLCBzaXplb2YocyksCisJCQkJICJNaXgg JWMgSW5wdXQgJTAyZCBQbGF5YmFjayBWb2x1bWUiLAorCQkJCSAnQScgKyBpLCBqICsgMSk7CisJ CQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZzY2FybGV0dDJfbWl4ZXJfY3Rs LAorCQkJCQkJICAgIGluZGV4LCAxLCBzLCBOVUxMKTsKKwkJCWlmIChlcnIgPCAwKQorCQkJCXJl dHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKiBNdXggU291cmNlIFNl bGVjdGlvbiBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX211eF9zcmNfZW51 bV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkgICBzdHJ1Y3Qgc25k X2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpl bGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAq cHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qg c2NhcmxldHQyX3BvcnRzICpwb3J0cyA9IHByaXZhdGUtPmluZm8tPnBvcnRzOworCXVuc2lnbmVk IGludCBpdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKKwlpbnQgaXRlbXMgPSBw cml2YXRlLT5udW1fbXV4X3NyY3M7CisJaW50IHBvcnRfdHlwZTsKKworCXVpbmZvLT50eXBlID0g U05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IGVsZW0tPmNo YW5uZWxzOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gaXRlbXM7CisKKwlpZiAo aXRlbSA+PSBpdGVtcykKKwkJaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW0gPSBp dGVtcyAtIDE7CisKKwlmb3IgKHBvcnRfdHlwZSA9IDA7CisJICAgICBwb3J0X3R5cGUgPCBTQ0FS TEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBlKyspIHsKKwkJaWYgKGl0ZW0g PCBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl0pIHsKKwkJCXNwcmludGYo dWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJCQlwb3J0c1twb3J0X3R5cGVdLnNyY19k ZXNjciwKKwkJCQlpdGVtICsgcG9ydHNbcG9ydF90eXBlXS5zcmNfbnVtX29mZnNldCk7CisJCQly ZXR1cm4gMDsKKwkJfQorCQlpdGVtIC09IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9Q T1JUX0lOXTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBzY2FybGV0 dDJfbXV4X3NyY19lbnVtX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJ ICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21p eGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2Nhcmxl dHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7 CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcHJpdmF0ZS0+bXV4W2Vs ZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9tdXhf c3JjX2VudW1fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkgIHN0cnVj dCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxl bV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhl cl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQgaW5kZXggPSBlbGVt LT5jb250cm9sOworCWludCBvdmFsLCB2YWwsIGVyciA9IDA7CisKKwltdXRleF9sb2NrKCZwcml2 YXRlLT5kYXRhX211dGV4KTsKKworCW92YWwgPSBwcml2YXRlLT5tdXhbaW5kZXhdOworCXZhbCA9 IGNsYW1wKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQkgICAgMEwsIHByaXZh dGUtPm51bV9tdXhfc3JjcyAtIDFMKTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxv Y2s7CisKKwlwcml2YXRlLT5tdXhbaW5kZXhdID0gdmFsOworCWVyciA9IHNjYXJsZXR0Ml91c2Jf c2V0X211eChtaXhlcik7CisJaWYgKGVyciA9PSAwKQorCQllcnIgPSAxOworCit1bmxvY2s6CisJ bXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitz dGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX211eF9zcmNfZW51 bV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5hbWUg PSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX2luZm8sCisJLmdldCAg PSBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfbXV4 X3NyY19lbnVtX2N0bF9wdXQsCit9OworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9hZGRfbXV4X2Vu dW1zKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2Nhcmxl dHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0 cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7CisJaW50 IHBvcnRfdHlwZSwgY2hhbm5lbCwgaTsKKworCWZvciAoaSA9IDAsIHBvcnRfdHlwZSA9IDA7CisJ ICAgICBwb3J0X3R5cGUgPCBTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90 eXBlKyspIHsKKwkJZm9yIChjaGFubmVsID0gMDsKKwkJICAgICBjaGFubmVsIDwgcG9ydHNbcG9y dF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwkJICAgICBjaGFubmVsKyssIGkrKykg eworCQkJaW50IGVycjsKKwkJCWNoYXIgc1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01BWExFTl07 CisJCQljb25zdCBjaGFyICpjb25zdCBkZXNjciA9IHBvcnRzW3BvcnRfdHlwZV0uZHN0X2Rlc2Ny OworCisJCQlzbnByaW50ZihzLCBzaXplb2YocykgLSA1LCBkZXNjciwgY2hhbm5lbCArIDEpOwor CQkJc3RyY2F0KHMsICIgRW51bSIpOworCisJCQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwo bWl4ZXIsCisJCQkJCQkgICAgJnNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsLAorCQkJCQkJICAg IGksIDEsIHMsIE5VTEwpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsKKwkJfQor CX0KKworCXJldHVybiAwOworfQorCisvKioqIE1ldGVyIENvbnRyb2xzICoqKi8KKworc3RhdGlj IGludCBzY2FybGV0dDJfbWV0ZXJfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwK KwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgdXNi X21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKworCXVpbmZvLT50 eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IGVsZW0t PmNoYW5uZWxzOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVl LmludGVnZXIubWF4ID0gNDA5NTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0gMTsKKwly ZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWV0ZXJfY3RsX2dldChzdHJ1Y3Qg c25kX2tjb250cm9sICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVj b250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJp dmF0ZV9kYXRhOworCXUxNiBtZXRlcl9sZXZlbHNbU0NBUkxFVFQyX05VTV9NRVRFUlNdOworCWlu dCBpLCBlcnI7CisKKwllcnIgPSBzY2FybGV0dDJfdXNiX2dldF9tZXRlcl9sZXZlbHMoZWxlbS0+ aGVhZC5taXhlciwgbWV0ZXJfbGV2ZWxzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsK KworCWZvciAoaSA9IDA7IGkgPCBlbGVtLT5jaGFubmVsczsgaSsrKQorCQl1Y29udHJvbC0+dmFs dWUuaW50ZWdlci52YWx1ZVtpXSA9IG1ldGVyX2xldmVsc1tpXTsKKworCXJldHVybiAwOworfQor CitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX21ldGVyX2N0 bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLmFjY2VzcyA9IFNO RFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZPTEFUSUxF LAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfbWV0ZXJfY3RsX2luZm8sCisJLmdl dCAgPSBzY2FybGV0dDJfbWV0ZXJfY3RsX2dldAorfTsKKworc3RhdGljIGludCBzY2FybGV0dDJf YWRkX21ldGVyX2N0bChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJcmV0 dXJuIHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9tZXRlcl9jdGwsCisJ CQkJICAgICAwLCBTQ0FSTEVUVDJfTlVNX01FVEVSUywKKwkJCQkgICAgICJMZXZlbCBNZXRlciIs IE5VTEwpOworfQorCisvKioqIENsZWFudXAvU3VzcGVuZCBDYWxsYmFja3MgKioqLworCitzdGF0 aWMgdm9pZCBzY2FybGV0dDJfcHJpdmF0ZV9mcmVlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNl ICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhl ci0+cHJpdmF0ZV9kYXRhOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2YXRlLT53 b3JrKTsKKwlrZnJlZShwcml2YXRlKTsKKwltaXhlci0+cHJpdmF0ZV9kYXRhID0gTlVMTDsKK30K Kworc3RhdGljIHZvaWQgc2NhcmxldHQyX3ByaXZhdGVfc3VzcGVuZChzdHJ1Y3QgdXNiX21peGVy X2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2 YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlmIChjYW5jZWxfZGVsYXllZF93b3JrX3N5 bmMoJnByaXZhdGUtPndvcmspKQorCQlzY2FybGV0dDJfY29uZmlnX3NhdmUocHJpdmF0ZS0+bWl4 ZXIpOworfQorCisvKioqIEluaXRpYWxpc2F0aW9uICoqKi8KKworc3RhdGljIGludCBzY2FybGV0 dDJfY291bnRfbXV4X3NyY3MoY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMpCit7 CisJaW50IHBvcnRfdHlwZSwgY291bnQgPSAwOworCisJZm9yIChwb3J0X3R5cGUgPSAwOworCSAg ICAgcG9ydF90eXBlIDwgU0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VOVDsKKwkgICAgIHBvcnRfdHlw ZSsrKQorCQljb3VudCArPSBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl07 CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIERlZmF1bHQgcm91dGluZyBjb25uZWN0cyBQQ00g b3V0cHV0cyBhbmQgaW5wdXRzIHRvIEFuYWxvZ3VlLAorICogUy9QRElGLCB0aGVuIEFEQVQKKyAq Lworc3RhdGljIHZvaWQgc2NhcmxldHQyX2luaXRfcm91dGluZyh1OCAqbXV4LAorCQkJCSAgIGNv bnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzKQoreworCWludCBpLCBpbnB1dF9udW0s IGlucHV0X2NvdW50LCBwb3J0X3R5cGU7CisJaW50IG91dHB1dF9udW0sIG91dHB1dF9jb3VudCwg cG9ydF90eXBlX2Nvbm5lY3RfbnVtOworCisJc3RhdGljIGNvbnN0IGludCBjb25uZWN0X29yZGVy W10gPSB7CisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUUsCisJCVNDQVJMRVRUMl9QT1JU X1RZUEVfU1BESUYsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQURBVCwKKwkJLTEKKwl9OworCisJ LyogQXNzaWduIFBDTSBpbnB1dHMgKHJvdXRpbmcgb3V0cHV0cykgKi8KKwlvdXRwdXRfbnVtID0g c2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShwb3J0cywKKwkJCQkJCSAgU0NBUkxFVFQyX1BP UlRfT1VULAorCQkJCQkJICBTQ0FSTEVUVDJfUE9SVF9UWVBFX1BDTSk7CisJb3V0cHV0X2NvdW50 ID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ01dLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRd OworCisJZm9yIChwb3J0X3R5cGUgPSBjb25uZWN0X29yZGVyW3BvcnRfdHlwZV9jb25uZWN0X251 bSA9IDBdOworCSAgICAgcG9ydF90eXBlID49IDA7CisJICAgICBwb3J0X3R5cGUgPSBjb25uZWN0 X29yZGVyWysrcG9ydF90eXBlX2Nvbm5lY3RfbnVtXSkgeworCQlpbnB1dF9udW0gPSBzY2FybGV0 dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKAorCQkJcG9ydHMsIFNDQVJMRVRUMl9QT1JUX0lOLCBwb3J0 X3R5cGUpOworCQlpbnB1dF9jb3VudCA9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9Q T1JUX0lOXTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgaW5wdXRfY291bnQgJiYgb3V0cHV0 X2NvdW50OworCQkgICAgIGkrKywgb3V0cHV0X2NvdW50LS0pCisJCQltdXhbb3V0cHV0X251bSsr XSA9IGlucHV0X251bSsrOworCX0KKworCS8qIEFzc2lnbiBQQ00gb3V0cHV0cyAocm91dGluZyBp bnB1dHMpICovCisJaW5wdXRfbnVtID0gc2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShwb3J0 cywKKwkJCQkJCSBTQ0FSTEVUVDJfUE9SVF9JTiwKKwkJCQkJCSBTQ0FSTEVUVDJfUE9SVF9UWVBF X1BDTSk7CisJaW5wdXRfY291bnQgPSBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX1BDTV0ubnVt W1NDQVJMRVRUMl9QT1JUX0lOXTsKKworCWZvciAocG9ydF90eXBlID0gY29ubmVjdF9vcmRlcltw b3J0X3R5cGVfY29ubmVjdF9udW0gPSAwXTsKKwkgICAgIHBvcnRfdHlwZSA+PSAwOworCSAgICAg cG9ydF90eXBlID0gY29ubmVjdF9vcmRlclsrK3BvcnRfdHlwZV9jb25uZWN0X251bV0pIHsKKwkJ b3V0cHV0X251bSA9IHNjYXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9udW0oCisJCQlwb3J0cywgU0NB UkxFVFQyX1BPUlRfT1VULCBwb3J0X3R5cGUpOworCQlvdXRwdXRfY291bnQgPSBwb3J0c1twb3J0 X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCQlmb3IgKGkgPSAwOworCQkgICAgIGkg PCBvdXRwdXRfY291bnQgJiYgaW5wdXRfY291bnQ7CisJCSAgICAgaSsrLCBpbnB1dF9jb3VudC0t KQorCQkJbXV4W291dHB1dF9udW0rK10gPSBpbnB1dF9udW0rKzsKKwl9Cit9CisKKy8qIEluaXRp YWxpc2UgcHJpdmF0ZSBkYXRhLCByb3V0aW5nLCBzZXF1ZW5jZSBudW1iZXIgKi8KK3N0YXRpYyBp bnQgc2NhcmxldHQyX2luaXRfcHJpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4 ZXIsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZvKQorewor CXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9CisJCWt6YWxsb2Moc2l6ZW9m KHN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYgKCFwcml2 YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJnByaXZhdGUtPnVzYl9tdXRl eCk7CisJbXV0ZXhfaW5pdCgmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJSU5JVF9ERUxBWUVEX1dP UksoJnByaXZhdGUtPndvcmssIHNjYXJsZXR0Ml9jb25maWdfc2F2ZV93b3JrKTsKKwlwcml2YXRl LT5pbmZvID0gaW5mbzsKKwlwcml2YXRlLT5udW1fbXV4X3NyY3MgPSBzY2FybGV0dDJfY291bnRf bXV4X3NyY3MoaW5mby0+cG9ydHMpOworCXByaXZhdGUtPnNjYXJsZXR0Ml9zZXEgPSAwOworCXBy aXZhdGUtPm1peGVyID0gbWl4ZXI7CisJbWl4ZXItPnByaXZhdGVfZGF0YSA9IHByaXZhdGU7CisJ bWl4ZXItPnByaXZhdGVfZnJlZSA9IHNjYXJsZXR0Ml9wcml2YXRlX2ZyZWU7CisJbWl4ZXItPnBy aXZhdGVfc3VzcGVuZCA9IHNjYXJsZXR0Ml9wcml2YXRlX3N1c3BlbmQ7CisKKwkvKiBTZXR1cCBk ZWZhdWx0IHJvdXRpbmcgKi8KKwlzY2FybGV0dDJfaW5pdF9yb3V0aW5nKHByaXZhdGUtPm11eCwg aW5mby0+cG9ydHMpOworCisJLyogSW5pdGlhbGlzZSB0aGUgc2VxdWVuY2UgbnVtYmVyIHVzZWQg Zm9yIHRoZSBwcm9wcmlldGFyeSBjb21tYW5kcyAqLworCXJldHVybiBzY2FybGV0dDJfdXNiKG1p eGVyLCBTQ0FSTEVUVDJfVVNCX0lOSVRfU0VRLAorCQkJICAgICBOVUxMLCAwLCBOVUxMLCAwKTsK K30KKworLyogUmVhZCBsaW5lLWluIGNvbmZpZyBhbmQgbGluZS1vdXQgdm9sdW1lIHNldHRpbmdz IG9uIHN0YXJ0ICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9yZWFkX2NvbmZpZ3Moc3RydWN0IHVz Yl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0 YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0 Ml9kZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZhdGUtPmluZm87CisJY29uc3Qgc3RydWN0IHNjYXJs ZXR0Ml9wb3J0cyAqcG9ydHMgPSBpbmZvLT5wb3J0czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJ cG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9BTkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09V VF07CisJdTggbGV2ZWxfc3dpdGNoZXNbU0NBUkxFVFQyX0xFVkVMX1NXSVRDSF9NQVhdOworCXU4 IHBhZF9zd2l0Y2hlc1tTQ0FSTEVUVDJfUEFEX1NXSVRDSF9NQVhdOworCXN0cnVjdCBzY2FybGV0 dDJfdXNiX3ZvbHVtZV9zdGF0dXMgdm9sdW1lX3N0YXR1czsKKwlpbnQgZXJyLCBpOworCisJaWYg KGluZm8tPmxldmVsX2lucHV0X2NvdW50KSB7CisJCWVyciA9IHNjYXJsZXR0Ml91c2JfZ2V0X2Nv bmZpZygKKwkJCW1peGVyLAorCQkJU0NBUkxFVFQyX0NPTkZJR19MRVZFTF9TV0lUQ0gsCisJCQlp bmZvLT5sZXZlbF9pbnB1dF9jb3VudCwKKwkJCWxldmVsX3N3aXRjaGVzKTsKKwkJaWYgKGVyciA8 IDApCisJCQlyZXR1cm4gZXJyOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bGV2ZWxfaW5wdXRf Y291bnQ7IGkrKykKKwkJCXByaXZhdGUtPmxldmVsX3N3aXRjaFtpXSA9IGxldmVsX3N3aXRjaGVz W2ldOworCX0KKworCWlmIChpbmZvLT5wYWRfaW5wdXRfY291bnQpIHsKKwkJZXJyID0gc2Nhcmxl dHQyX3VzYl9nZXRfY29uZmlnKAorCQkJbWl4ZXIsCisJCQlTQ0FSTEVUVDJfQ09ORklHX1BBRF9T V0lUQ0gsCisJCQlpbmZvLT5wYWRfaW5wdXRfY291bnQsCisJCQlwYWRfc3dpdGNoZXMpOworCQlp ZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5wYWRf aW5wdXRfY291bnQ7IGkrKykKKwkJCXByaXZhdGUtPnBhZF9zd2l0Y2hbaV0gPSBwYWRfc3dpdGNo ZXNbaV07CisJfQorCisJZXJyID0gc2NhcmxldHQyX3VzYl9nZXRfdm9sdW1lX3N0YXR1cyhtaXhl ciwgJnZvbHVtZV9zdGF0dXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcHJp dmF0ZS0+bWFzdGVyX3ZvbCA9IGNsYW1wKAorCQl2b2x1bWVfc3RhdHVzLm1hc3Rlcl92b2wgKyBT Q0FSTEVUVDJfVk9MVU1FX0JJQVMsCisJCTAsIFNDQVJMRVRUMl9WT0xVTUVfQklBUyk7CisKKwlm b3IgKGkgPSAwOyBpIDwgbnVtX2xpbmVfb3V0OyBpKyspIHsKKwkJaW50IHZvbHVtZTsKKworCQlw cml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ldID0KKwkJCWluZm8tPmxpbmVfb3V0X2h3X3ZvbAor CQkJCSYmIHZvbHVtZV9zdGF0dXMuc3dfaHdfc3dpdGNoW2ldOworCisJCXZvbHVtZSA9IHByaXZh dGUtPnZvbF9zd19od19zd2l0Y2hbaV0KKwkJCSAgID8gdm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9s CisJCQkgICA6IHZvbHVtZV9zdGF0dXMuc3dfdm9sW2ldOworCQl2b2x1bWUgPSBjbGFtcCh2b2x1 bWUgKyBTQ0FSTEVUVDJfVk9MVU1FX0JJQVMsCisJCQkgICAgICAgMCwgU0NBUkxFVFQyX1ZPTFVN RV9CSUFTKTsKKwkJcHJpdmF0ZS0+dm9sW2ldID0gdm9sdW1lOworCX0KKworCWZvciAoaSA9IDA7 IGkgPCBpbmZvLT5idXR0b25fY291bnQ7IGkrKykKKwkJcHJpdmF0ZS0+YnV0dG9uc1tpXSA9ICEh dm9sdW1lX3N0YXR1cy5idXR0b25zW2ldOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vdGlmeSBv biB2b2x1bWUgY2hhbmdlICovCitzdGF0aWMgdm9pZCBzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0 X3ZvbF9jaGFuZ2UoCisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0 cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7 CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5w b3J0czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9B TkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGk7CisKKwlwcml2YXRlLT52 b2xfdXBkYXRlZCA9IDE7CisKKwlzbmRfY3RsX25vdGlmeShtaXhlci0+Y2hpcC0+Y2FyZCwgU05E UlZfQ1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCSAgICAgICAmcHJpdmF0ZS0+bWFzdGVyX3ZvbF9j dGwtPmlkKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkrKykgeworCQlpZiAo IXByaXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0pCisJCQljb250aW51ZTsKKwkJc25kX2N0bF9u b3RpZnkobWl4ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJ ICAgICAgICZwcml2YXRlLT52b2xfY3Rsc1tpXS0+aWQpOworCX0KK30KKworLyogTm90aWZ5IG9u IGJ1dHRvbiBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHRf YnV0dG9uX2NoYW5nZSgKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJ c3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0 YTsKKwlpbnQgaTsKKworCXByaXZhdGUtPnZvbF91cGRhdGVkID0gMTsKKworCWZvciAoaSA9IDA7 IGkgPCBwcml2YXRlLT5pbmZvLT5idXR0b25fY291bnQ7IGkrKykKKwkJc25kX2N0bF9ub3RpZnko bWl4ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAg ICZwcml2YXRlLT5idXR0b25fY3Rsc1tpXS0+aWQpOworfQorCisvKiBJbnRlcnJ1cHQgY2FsbGJh Y2sgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHQoc3RydWN0IHVyYiAq dXJiKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IHVyYi0+Y29udGV4 dDsKKwlpbnQgbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCWludCB1c3RhdHVzID0gdXJiLT5z dGF0dXM7CisJdTMyIGRhdGE7CisKKwlpZiAodXN0YXR1cyAhPSAwKQorCQlnb3RvIHJlcXVldWU7 CisKKwlpZiAobGVuID09IDgpIHsKKwkJZGF0YSA9IGxlMzJfdG9fY3B1KCoodTMyICopdXJiLT50 cmFuc2Zlcl9idWZmZXIpOworCQlpZiAoZGF0YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX1ZP TF9DSEFOR0UpCisJCQlzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3ZvbF9jaGFuZ2UobWl4ZXIp OworCQlpZiAoZGF0YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0JVVFRPTl9DSEFOR0UpCisJ CQlzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X2J1dHRvbl9jaGFuZ2UobWl4ZXIpOworCX0gZWxz ZSB7CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkgICAgICAic2NhcmxldHQgbWl4 ZXIgaW50ZXJydXB0IGxlbmd0aCAlZFxuIiwgbGVuKTsKKwl9CisKK3JlcXVldWU6CisJaWYgKHVz dGF0dXMgIT0gLUVOT0VOVCAmJgorCSAgICB1c3RhdHVzICE9IC1FQ09OTlJFU0VUICYmCisJICAg IHVzdGF0dXMgIT0gLUVTSFVURE9XTikgeworCQl1cmItPmRldiA9IG1peGVyLT5jaGlwLT5kZXY7 CisJCXVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJfQorfQorCitzdGF0aWMgaW50 IHNjYXJsZXR0Ml9taXhlcl9zdGF0dXNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNl ICptaXhlcikKK3sKKwl2b2lkICp0cmFuc2Zlcl9idWZmZXI7CisKKwlpZiAobWl4ZXItPnVyYikg eworCQl1c2JfYXVkaW9fZXJyKG1peGVyLT5jaGlwLAorCQkJICAgICAgIiVzOiBtaXhlciB1cmIg YWxyZWFkeSBpbiB1c2UhXG4iLCBfX2Z1bmNfXyk7CisJCXJldHVybiAwOworCX0KKworCW1peGVy LT51cmIgPSB1c2JfYWxsb2NfdXJiKDAsIEdGUF9LRVJORUwpOworCWlmICghbWl4ZXItPnVyYikK KwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cmFuc2Zlcl9idWZmZXIgPSBrbWFsbG9jKFNDQVJMRVRU Ml9VU0JfSU5URVJSVVBUX01BWF9EQVRBLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXRyYW5zZmVyX2J1 ZmZlcikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl1c2JfZmlsbF9pbnRfdXJiKAorCQltaXhlci0+ dXJiLAorCQltaXhlci0+Y2hpcC0+ZGV2LAorCQl1c2JfcmN2aW50cGlwZShtaXhlci0+Y2hpcC0+ ZGV2LAorCQkJICAgICAgIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0VORFBPSU5UKSwKKwkJdHJh bnNmZXJfYnVmZmVyLAorCQlTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9NQVhfREFUQSwKKwkJc2Nh cmxldHQyX21peGVyX2ludGVycnVwdCwKKwkJbWl4ZXIsCisJCVNDQVJMRVRUMl9VU0JfSU5URVJS VVBUX0lOVEVSVkFMKTsKKworCXJldHVybiB1c2Jfc3VibWl0X3VyYihtaXhlci0+dXJiLCBHRlBf S0VSTkVMKTsKK30KKworLyogRW50cnkgcG9pbnQgKi8KK2ludCBzbmRfc2NhcmxldHRfZ2VuMl9j b250cm9sc19jcmVhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCWNv bnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm87CisJaW50IGVycjsKKworCS8q IG9ubHkgdXNlIFVBQ19WRVJTSU9OXzIgKi8KKwlpZiAoIW1peGVyLT5wcm90b2NvbCkKKwkJcmV0 dXJuIDA7CisKKwlzd2l0Y2ggKG1peGVyLT5jaGlwLT51c2JfaWQpIHsKKwljYXNlIFVTQl9JRCgw eDEyMzUsIDB4ODIwMyk6CisJCWluZm8gPSAmczZpNl9nZW4yX2luZm87CisJCWJyZWFrOworCWNh c2UgVVNCX0lEKDB4MTIzNSwgMHg4MjA0KToKKwkJaW5mbyA9ICZzMThpOF9nZW4yX2luZm87CisJ CWJyZWFrOworCWNhc2UgVVNCX0lEKDB4MTIzNSwgMHg4MjAxKToKKwkJaW5mbyA9ICZzMThpMjBf Z2VuMl9pbmZvOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBkZXZpY2Ugbm90ICh5ZXQpIHN1cHBv cnRlZCAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoIShtaXhlci0+Y2hpcC0+c2V0 dXAgJiBTQ0FSTEVUVDJfRU5BQkxFKSkgeworCQl1c2JfYXVkaW9fZXJyKG1peGVyLT5jaGlwLAor CQkJIkZvY3Vzcml0ZSBTY2FybGV0dCBHZW4gMiBNaXhlciBEcml2ZXIgZGlzYWJsZWQ7ICIKKwkJ CSJ1c2Ugb3B0aW9ucyBzbmRfdXNiX2F1ZGlvIGRldmljZV9zZXR1cD0xICIKKwkJCSJ0byBlbmFi bGUgYW5kIHJlcG9ydCBhbnkgaXNzdWVzIHRvIGdAYjQudnUiKTsKKwkJcmV0dXJuIDA7CisJfQor CisJLyogSW5pdGlhbGlzZSBwcml2YXRlIGRhdGEsIHJvdXRpbmcsIHNlcXVlbmNlIG51bWJlciAq LworCWVyciA9IHNjYXJsZXR0Ml9pbml0X3ByaXZhdGUobWl4ZXIsIGluZm8pOworCWlmIChlcnIg PCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogUmVhZCB2b2x1bWUgbGV2ZWxzIGFuZCBjb250cm9s cyBmcm9tIHRoZSBpbnRlcmZhY2UgKi8KKwllcnIgPSBzY2FybGV0dDJfcmVhZF9jb25maWdzKG1p eGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSB0aGUgYW5h bG9ndWUgb3V0cHV0IGNvbnRyb2xzICovCisJZXJyID0gc2NhcmxldHQyX2FkZF9saW5lX291dF9j dGxzKG1peGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSB0 aGUgYW5hbG9ndWUgaW5wdXQgY29udHJvbHMgKi8KKwllcnIgPSBzY2FybGV0dDJfYWRkX2xpbmVf aW5fY3RscyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDcmVh dGUgdGhlIGlucHV0LCBvdXRwdXQsIGFuZCBtaXhlciBtdXggaW5wdXQgc2VsZWN0aW9ucyAqLwor CWVyciA9IHNjYXJsZXR0Ml9hZGRfbXV4X2VudW1zKG1peGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJ cmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSB0aGUgbWF0cml4IG1peGVyIGNvbnRyb2xzICovCisJ ZXJyID0gc2NhcmxldHQyX2FkZF9taXhlcl9jdGxzKG1peGVyKTsKKwlpZiAoZXJyIDwgMCkKKwkJ cmV0dXJuIGVycjsKKworCS8qIENyZWF0ZSB0aGUgbGV2ZWwgbWV0ZXIgY29udHJvbHMgKi8KKwll cnIgPSBzY2FybGV0dDJfYWRkX21ldGVyX2N0bChtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJl dHVybiBlcnI7CisKKwkvKiBTZXQgdXAgdGhlIGludGVycnVwdCBwb2xsaW5nIGlmIHRoZXJlIGFy ZSBoYXJkd2FyZSBidXR0b25zICovCisJaWYgKGluZm8tPmJ1dHRvbl9jb3VudCkgeworCQllcnIg PSBzY2FybGV0dDJfbWl4ZXJfc3RhdHVzX2NyZWF0ZShtaXhlcik7CisJCWlmIChlcnIgPCAwKQor CQkJcmV0dXJuIGVycjsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NvdW5kL3Vz Yi9taXhlcl9zY2FybGV0dF9nZW4yLmggYi9zb3VuZC91c2IvbWl4ZXJfc2NhcmxldHRfZ2VuMi5o Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uNTJlMWRhZDc3YWZkCi0t LSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL21peGVyX3NjYXJsZXR0X2dlbjIuaApAQCAtMCww ICsxLDcgQEAKKy8qIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wICovCisjaWZuZGVm IF9fVVNCX01JWEVSX1NDQVJMRVRUX0dFTjJfSAorI2RlZmluZSBfX1VTQl9NSVhFUl9TQ0FSTEVU VF9HRU4yX0gKKworaW50IHNuZF9zY2FybGV0dF9nZW4yX2NvbnRyb2xzX2NyZWF0ZShzdHJ1Y3Qg dXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpOworCisjZW5kaWYgLyogX19VU0JfTUlYRVJfU0NB UkxFVFRfR0VOMl9IICovCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fCkFsc2EtZGV2ZWwgbWFpbGluZyBsaXN0CkFsc2EtZGV2ZWxAYWxzYS1wcm9qZWN0Lm9y ZwpodHRwczovL21haWxtYW4uYWxzYS1wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL2Fsc2Et ZGV2ZWwK