From mboxrd@z Thu Jan 1 00:00:00 1970 From: "Geoffrey D. Bennett" Subject: [PATCH V7] ALSA: usb-audio: Scarlett Gen 2 mixer interface Date: Mon, 29 Jul 2019 00:42:45 +0930 Message-ID: <20190728151245.GA5735@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 7B6ECF800E4 for ; Sun, 28 Jul 2019 17:12:53 +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 ZSB0aGVpciB1c2Ugc28gcHJlLWRlY2xhcmF0aW9uIGlzbid0CiAgbmVjZXNzYXJ5LgoKQ2hhbmdl cyBzaW5jZSB2NjoKLSBJbXBsZW1lbnRlZCBmZWVkYmFjayBmcm9tIFRha2FzaGkncyBlbWFpbCAx OC9KdWwvMjAxOTogdXNlCiAgc25kX3VzYl9waXBlX3Nhbml0eV9jaGVjaygpIHRvIHZlcmlmeSBw aXBlLCBhbmQgaW5pdGlhbGlzZSBwb2ludGVycwogIGFzICJOVUxMIiBub3QgIjAiLgoKZGlmZiAt LWdpdCBhL3NvdW5kL3VzYi9NYWtlZmlsZSBiL3NvdW5kL3VzYi9NYWtlZmlsZQppbmRleCBlMWNl MjU3YWI3MDUuLmY0YjczODRjYWE5ZCAxMDA2NDQKLS0tIGEvc291bmQvdXNiL01ha2VmaWxlCisr KyBiL3NvdW5kL3VzYi9NYWtlZmlsZQpAQCAtMTEsNiArMTEsNyBAQCBzbmQtdXNiLWF1ZGlvLW9i anMgOj0gCWNhcmQubyBcCiAJCQltaXhlci5vIFwKIAkJCW1peGVyX3F1aXJrcy5vIFwKIAkJCW1p eGVyX3NjYXJsZXR0Lm8gXAorCQkJbWl4ZXJfc2NhcmxldHRfZ2VuMi5vIFwKIAkJCW1peGVyX3Vz MTZ4MDgubyBcCiAJCQlwY20ubyBcCiAJCQlwb3dlci5vIFwKZGlmZiAtLWdpdCBhL3NvdW5kL3Vz Yi9taXhlci5jIGIvc291bmQvdXNiL21peGVyLmMKaW5kZXggNzQ5OGI1MTkxYjY4Li43YjUxYWI0 YzM1YjAgMTAwNjQ0Ci0tLSBhL3NvdW5kL3VzYi9taXhlci5jCisrKyBiL3NvdW5kL3VzYi9taXhl ci5jCkBAIC0zNTA5LDYgKzM1MDksOCBAQCB2b2lkIHNuZF91c2JfbWl4ZXJfZGlzY29ubmVjdChz dHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCiAJCXVzYl9raWxsX3VyYihtaXhlci0+ dXJiKTsKIAlpZiAobWl4ZXItPnJjX3VyYikKIAkJdXNiX2tpbGxfdXJiKG1peGVyLT5yY191cmIp OworCWlmIChtaXhlci0+cHJpdmF0ZV9mcmVlKQorCQltaXhlci0+cHJpdmF0ZV9mcmVlKG1peGVy KTsKIAltaXhlci0+ZGlzY29ubmVjdGVkID0gdHJ1ZTsKIH0KIApAQCAtMzUzNiw2ICszNTM4LDgg 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 MDAwMDAwMDAwMC4uN2Q0NjBiMWYxNzM1Ci0tLSAvZGV2L251bGwKKysrIGIvc291bmQvdXNiL21p eGVyX3NjYXJsZXR0X2dlbjIuYwpAQCAtMCwwICsxLDIwNzUgQEAKKy8vIFNQRFgtTGljZW5zZS1J 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 OworCXN0cnVjdCBzY2FybGV0dDJfdXNiX3BhY2tldCAqcmVxID0gTlVMTCwgKnJlc3AgPSBOVUxM OworCWludCBlcnIgPSAwOworCisJcmVxID0ga21hbGxvYyhyZXFfYnVmX3NpemUsIEdGUF9LRVJO RUwpOworCWlmICghcmVxKSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQor CisJcmVzcCA9IGttYWxsb2MocmVzcF9idWZfc2l6ZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFyZXNw KSB7CisJCWVyciA9IC1FTk9NRU07CisJCWdvdG8gZXJyb3I7CisJfQorCisJbXV0ZXhfbG9jaygm cHJpdmF0ZS0+dXNiX211dGV4KTsKKworCS8qIGJ1aWxkIHJlcXVlc3QgbWVzc2FnZSBhbmQgc2Vu ZCBpdCAqLworCisJc2NhcmxldHQyX2ZpbGxfcmVxdWVzdF9oZWFkZXIocHJpdmF0ZSwgcmVxLCBj bWQsIHJlcV9zaXplKTsKKworCWlmIChyZXFfc2l6ZSkKKwkJbWVtY3B5KHJlcS0+ZGF0YSwgcmVx X2RhdGEsIHJlcV9zaXplKTsKKworCWVyciA9IHNuZF91c2JfY3RsX21zZyhtaXhlci0+Y2hpcC0+ ZGV2LAorCQkJdXNiX3NuZGN0cmxwaXBlKG1peGVyLT5jaGlwLT5kZXYsIDApLAorCQkJU0NBUkxF VFQyX1VTQl9WRU5ET1JfU1BFQ0lGSUNfQ01EX1JFUSwKKwkJCVVTQl9SRUNJUF9JTlRFUkZBQ0Ug fCBVU0JfVFlQRV9DTEFTUyB8IFVTQl9ESVJfT1VULAorCQkJMCwKKwkJCVNDQVJMRVRUMl9VU0Jf VkVORE9SX1NQRUNJRklDX0lOVEVSRkFDRSwKKwkJCXJlcSwKKwkJCXJlcV9idWZfc2l6ZSk7CisK KwlpZiAoZXJyICE9IHJlcV9idWZfc2l6ZSkgeworCQl1c2JfYXVkaW9fZXJyKAorCQkJbWl4ZXIt PmNoaXAsCisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIHJlcXVlc3QgcmVzdWx0IGNtZCAleCB3YXMg JWRcbiIsCisJCQljbWQsIGVycik7CisJCWVyciA9IC1FSU5WQUw7CisJCWdvdG8gdW5sb2NrOwor CX0KKworCS8qIHNlbmQgYSBzZWNvbmQgbWVzc2FnZSB0byBnZXQgdGhlIHJlc3BvbnNlICovCisK KwllcnIgPSBzbmRfdXNiX2N0bF9tc2cobWl4ZXItPmNoaXAtPmRldiwKKwkJCXVzYl9zbmRjdHJs cGlwZShtaXhlci0+Y2hpcC0+ZGV2LCAwKSwKKwkJCVNDQVJMRVRUMl9VU0JfVkVORE9SX1NQRUNJ RklDX0NNRF9SRVNQLAorCQkJVVNCX1JFQ0lQX0lOVEVSRkFDRSB8IFVTQl9UWVBFX0NMQVNTIHwg VVNCX0RJUl9JTiwKKwkJCTAsCisJCQlTQ0FSTEVUVDJfVVNCX1ZFTkRPUl9TUEVDSUZJQ19JTlRF UkZBQ0UsCisJCQlyZXNwLAorCQkJcmVzcF9idWZfc2l6ZSk7CisKKwkvKiB2YWxpZGF0ZSB0aGUg cmVzcG9uc2UgKi8KKworCWlmIChlcnIgIT0gcmVzcF9idWZfc2l6ZSkgeworCQl1c2JfYXVkaW9f ZXJyKAorCQkJbWl4ZXItPmNoaXAsCisJCQkiU2NhcmxldHQgR2VuIDIgVVNCIHJlc3BvbnNlIHJl c3VsdCBjbWQgJXggd2FzICVkXG4iLAorCQkJY21kLCBlcnIpOworCQllcnIgPSAtRUlOVkFMOwor CQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAocmVzcC0+Y21kICE9IHJlcS0+Y21kIHx8CisJICAg IHJlc3AtPnNlcSAhPSByZXEtPnNlcSB8fAorCSAgICByZXNwX3NpemUgIT0gbGUxNl90b19jcHUo cmVzcC0+c2l6ZSkgfHwKKwkgICAgcmVzcC0+ZXJyb3IgfHwKKwkgICAgcmVzcC0+cGFkKSB7CisJ CXVzYl9hdWRpb19lcnIoCisJCQltaXhlci0+Y2hpcCwKKwkJCSJTY2FybGV0dCBHZW4gMiBVU0Ig aW52YWxpZCByZXNwb25zZTsgIgorCQkJICAgImNtZCB0eC9yeCAlZC8lZCBzZXEgJWQvJWQgc2l6 ZSAlZC8lZCAiCisJCQkgICAiZXJyb3IgJWQgcGFkICVkXG4iLAorCQkJbGUxNl90b19jcHUocmVx LT5jbWQpLCBsZTE2X3RvX2NwdShyZXNwLT5jbWQpLAorCQkJbGUxNl90b19jcHUocmVxLT5zZXEp LCBsZTE2X3RvX2NwdShyZXNwLT5zZXEpLAorCQkJcmVzcF9zaXplLCBsZTE2X3RvX2NwdShyZXNw LT5zaXplKSwKKwkJCWxlMTZfdG9fY3B1KHJlc3AtPmVycm9yKSwKKwkJCWxlMTZfdG9fY3B1KHJl c3AtPnBhZCkpOworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlpZiAo cmVzcF9zaXplID4gMCkKKwkJbWVtY3B5KHJlc3BfZGF0YSwgcmVzcC0+ZGF0YSwgcmVzcF9zaXpl KTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+dXNiX211dGV4KTsKK2Vycm9y OgorCWtmcmVlKHJlcSk7CisJa2ZyZWUocmVzcCk7CisJcmV0dXJuIGVycjsKK30KKworLyogU2Vu ZCBTQ0FSTEVUVDJfVVNCX0RBVEFfQ01EIFNDQVJMRVRUMl9VU0JfQ09ORklHX1NBVkUgKi8KK3N0 YXRpYyB2b2lkIHNjYXJsZXR0Ml9jb25maWdfc2F2ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFj ZSAqbWl4ZXIpCit7CisJdTMyIHJlcSA9IGNwdV90b19sZTMyKFNDQVJMRVRUMl9VU0JfQ09ORklH X1NBVkUpOworCisJc2NhcmxldHQyX3VzYihtaXhlciwgU0NBUkxFVFQyX1VTQl9EQVRBX0NNRCwK KwkJICAgICAgJnJlcSwgc2l6ZW9mKHUzMiksCisJCSAgICAgIE5VTEwsIDApOworfQorCisvKiBE ZWxheWVkIHdvcmsgdG8gc2F2ZSBjb25maWcgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9jb25m aWdfc2F2ZV93b3JrKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKK3sKKwlzdHJ1Y3Qgc2Nhcmxl dHQyX21peGVyX2RhdGEgKnByaXZhdGUgPQorCQljb250YWluZXJfb2Yod29yaywgc3RydWN0IHNj YXJsZXR0Ml9taXhlcl9kYXRhLCB3b3JrLndvcmspOworCisJc2NhcmxldHQyX2NvbmZpZ19zYXZl KHByaXZhdGUtPm1peGVyKTsKK30KKworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIHNldCBhIGNv bmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2b2x1bWUgbGV2ZWwsCisgKiBzdy9odyB2b2x1bWUgc3dp dGNoLCBsaW5lL2luc3QgbGV2ZWwgc3dpdGNoLCBvciBwYWQgc3dpdGNoKQorICovCitzdGF0aWMg aW50IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZygKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFj ZSAqbWl4ZXIsCisJaW50IGNvbmZpZ19pdGVtX251bSwgaW50IGluZGV4LCBpbnQgdmFsdWUpCit7 CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9jb25maWcgY29uZmlnX2l0ZW0gPQorCSAgICAgICBz Y2FybGV0dDJfY29uZmlnX2l0ZW1zW2NvbmZpZ19pdGVtX251bV07CisJc3RydWN0IHsKKwkJdTMy IG9mZnNldDsKKwkJdTMyIGJ5dGVzOworCQlzMzIgdmFsdWU7CisJfSBfX3BhY2tlZCByZXE7CisJ dTMyIHJlcTI7CisJaW50IGVycjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZh dGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCisJLyogQ2FuY2VsIGFueSBwZW5kaW5nIE5WUkFN IHNhdmUgKi8KKwljYW5jZWxfZGVsYXllZF93b3JrX3N5bmMoJnByaXZhdGUtPndvcmspOworCisJ LyogU2VuZCB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgZGF0YSAqLworCXJlcS5vZmZzZXQg PSBjcHVfdG9fbGUzMihjb25maWdfaXRlbS5vZmZzZXQgKyBpbmRleCAqIGNvbmZpZ19pdGVtLnNp emUpOworCXJlcS5ieXRlcyA9IGNwdV90b19sZTMyKGNvbmZpZ19pdGVtLnNpemUpOworCXJlcS52 YWx1ZSA9IGNwdV90b19sZTMyKHZhbHVlKTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBT Q0FSTEVUVDJfVVNCX1NFVF9EQVRBLAorCQkJICAgICZyZXEsIHNpemVvZih1MzIpICogMiArIGNv bmZpZ19pdGVtLnNpemUsCisJCQkgICAgTlVMTCwgMCk7CisJaWYgKGVyciA8IDApCisJCXJldHVy biBlcnI7CisKKwkvKiBBY3RpdmF0ZSB0aGUgY2hhbmdlICovCisJcmVxMiA9IGNwdV90b19sZTMy KGNvbmZpZ19pdGVtLmFjdGl2YXRlKTsKKwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FS TEVUVDJfVVNCX0RBVEFfQ01ELAorCQkJICAgICZyZXEyLCBzaXplb2YocmVxMiksIE5VTEwsIDAp OworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogU2NoZWR1bGUgdGhlIGNoYW5n ZSB0byBiZSB3cml0dGVuIHRvIE5WUkFNICovCisJc2NoZWR1bGVfZGVsYXllZF93b3JrKCZwcml2 YXRlLT53b3JrLCBtc2Vjc190b19qaWZmaWVzKDIwMDApKTsKKworCXJldHVybiAwOworfQorCisv KiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8gZ2V0IGRhdGE7IHJlc3VsdCBwbGFjZWQgaW4gKmJ1ZiAq Lworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX2dldCgKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVy ZmFjZSAqbWl4ZXIsCisJaW50IG9mZnNldCwgdm9pZCAqYnVmLCBpbnQgc2l6ZSkKK3sKKwlzdHJ1 Y3QgeworCQl1MzIgb2Zmc2V0OworCQl1MzIgc2l6ZTsKKwl9IF9fcGFja2VkIHJlcTsKKworCXJl cS5vZmZzZXQgPSBjcHVfdG9fbGUzMihvZmZzZXQpOworCXJlcS5zaXplID0gY3B1X3RvX2xlMzIo c2l6ZSk7CisJcmV0dXJuIHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfR0VUX0RB VEEsCisJCQkgICAgICZyZXEsIHNpemVvZihyZXEpLCBidWYsIHNpemUpOworfQorCisvKiBTZW5k IGEgVVNCIG1lc3NhZ2UgdG8gZ2V0IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczsgcmVzdWx0IHBs YWNlZCBpbiAqYnVmICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml91c2JfZ2V0X2NvbmZpZygKKwlz dHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJaW50IGNvbmZpZ19pdGVtX251bSwg aW50IGNvdW50LCB2b2lkICpidWYpCit7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9jb25maWcg Y29uZmlnX2l0ZW0gPQorCSAgICAgICBzY2FybGV0dDJfY29uZmlnX2l0ZW1zW2NvbmZpZ19pdGVt X251bV07CisJaW50IHNpemUgPSBjb25maWdfaXRlbS5zaXplICogY291bnQ7CisKKwlyZXR1cm4g c2NhcmxldHQyX3VzYl9nZXQobWl4ZXIsIGNvbmZpZ19pdGVtLm9mZnNldCwgYnVmLCBzaXplKTsK K30KKworLyogU2VuZCBhIFVTQiBtZXNzYWdlIHRvIGdldCB2b2x1bWUgc3RhdHVzOyByZXN1bHQg cGxhY2VkIGluICpidWYgKi8KK3N0YXRpYyBpbnQgc2NhcmxldHQyX3VzYl9nZXRfdm9sdW1lX3N0 YXR1cygKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIsCisJc3RydWN0IHNjYXJs ZXR0Ml91c2Jfdm9sdW1lX3N0YXR1cyAqYnVmKQoreworCXJldHVybiBzY2FybGV0dDJfdXNiX2dl dChtaXhlciwgU0NBUkxFVFQyX1VTQl9WT0xVTUVfU1RBVFVTX09GRlNFVCwKKwkJCQkgYnVmLCBz aXplb2YoKmJ1ZikpOworfQorCisvKiBTZW5kIGEgVVNCIG1lc3NhZ2UgdG8gc2V0IHRoZSB2b2x1 bWVzIGZvciBhbGwgaW5wdXRzIG9mIG9uZSBtaXgKKyAqICh2YWx1ZXMgb2J0YWluZWQgZnJvbSBw cml2YXRlLT5taXhbXSkKKyAqLworc3RhdGljIGludCBzY2FybGV0dDJfdXNiX3NldF9taXgoc3Ry dWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyLAorCQkJCSAgICAgaW50IG1peF9udW0pCit7 CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVf ZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZvID0gcHJpdmF0 ZS0+aW5mbzsKKworCXN0cnVjdCB7CisJCXUxNiBtaXhfbnVtOworCQl1MTYgZGF0YVtTQ0FSTEVU VDJfSU5QVVRfTUlYX01BWF07CisJfSBfX3BhY2tlZCByZXE7CisKKwlpbnQgaSwgajsKKwlpbnQg bnVtX21peGVyX2luID0KKwkJaW5mby0+cG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVhdLm51 bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCisJcmVxLm1peF9udW0gPSBjcHVfdG9fbGUxNihtaXhf bnVtKTsKKworCWZvciAoaSA9IDAsIGogPSBtaXhfbnVtICogbnVtX21peGVyX2luOyBpIDwgbnVt X21peGVyX2luOyBpKyssIGorKykKKwkJcmVxLmRhdGFbaV0gPSBjcHVfdG9fbGUxNigKKwkJCXNj YXJsZXR0Ml9taXhlcl92YWx1ZXNbcHJpdmF0ZS0+bWl4W2pdXQorCQkpOworCisJcmV0dXJuIHNj YXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfU0VUX01JWCwKKwkJCSAgICAgJnJlcSwg KG51bV9taXhlcl9pbiArIDEpICogc2l6ZW9mKHUxNiksCisJCQkgICAgIE5VTEwsIDApOworfQor CisvKiBDb252ZXJ0IGEgcG9ydCBudW1iZXIgaW5kZXggKHBlciBpbmZvLT5wb3J0cykgdG8gYSBo YXJkd2FyZSBJRCAqLworc3RhdGljIHUzMiBzY2FybGV0dDJfbXV4X3NyY19udW1fdG9faWQoY29u c3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMsCisJCQkJICAgICAgIGludCBudW0pCit7 CisJaW50IHBvcnRfdHlwZTsKKworCWZvciAocG9ydF90eXBlID0gMDsKKwkgICAgIHBvcnRfdHlw ZSA8IFNDQVJMRVRUMl9QT1JUX1RZUEVfQ09VTlQ7CisJICAgICBwb3J0X3R5cGUrKykgeworCQlp ZiAobnVtIDwgcG9ydHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dKQorCQkJcmV0 dXJuIHBvcnRzW3BvcnRfdHlwZV0uaWQgfCBudW07CisJCW51bSAtPSBwb3J0c1twb3J0X3R5cGVd Lm51bVtTQ0FSTEVUVDJfUE9SVF9JTl07CisJfQorCisJLyogT29wcyAqLworCXJldHVybiAwOwor fQorCisvKiBTZW5kIFVTQiBtZXNzYWdlcyB0byBzZXQgbXV4IGlucHV0cyAqLworc3RhdGljIGlu dCBzY2FybGV0dDJfdXNiX3NldF9tdXgoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVy KQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2 YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9kZXZpY2VfaW5mbyAqaW5mbyA9IHBy aXZhdGUtPmluZm87CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBpbmZv LT5wb3J0czsKKwlpbnQgcmF0ZSwgcG9ydF9kaXJfcmF0ZTsKKworCXN0YXRpYyBjb25zdCBpbnQg YXNzaWdubWVudF9vcmRlcltTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UXSA9IHsKKwkJU0NBUkxF VFQyX1BPUlRfVFlQRV9QQ00sCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUUsCisJCVND QVJMRVRUMl9QT1JUX1RZUEVfU1BESUYsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQURBVCwKKwkJ U0NBUkxFVFQyX1BPUlRfVFlQRV9NSVgsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfTk9ORSwKKwl9 OworCisJc3RydWN0IHsKKwkJdTE2IHBhZDsKKwkJdTE2IG51bTsKKwkJdTMyIGRhdGFbU0NBUkxF VFQyX01VWF9NQVhdOworCX0gX19wYWNrZWQgcmVxOworCisJcmVxLnBhZCA9IDA7CisKKwkvKiBt dXggc2V0dGluZ3MgZm9yIGVhY2ggcmF0ZSAqLworCWZvciAocmF0ZSA9IDAsIHBvcnRfZGlyX3Jh dGUgPSBTQ0FSTEVUVDJfUE9SVF9PVVRfNDQ7CisJICAgICBwb3J0X2Rpcl9yYXRlIDw9IFNDQVJM RVRUMl9QT1JUX09VVF8xNzY7CisJICAgICByYXRlKyssIHBvcnRfZGlyX3JhdGUrKykgeworCQlp bnQgb3JkZXJfbnVtLCBpLCBlcnI7CisKKwkJcmVxLm51bSA9IGNwdV90b19sZTE2KHJhdGUpOwor CisJCWZvciAob3JkZXJfbnVtID0gMCwgaSA9IDA7CisJCSAgICAgb3JkZXJfbnVtIDwgU0NBUkxF VFQyX1BPUlRfVFlQRV9DT1VOVDsKKwkJICAgICBvcmRlcl9udW0rKykgeworCQkJaW50IHBvcnRf dHlwZSA9IGFzc2lnbm1lbnRfb3JkZXJbb3JkZXJfbnVtXTsKKwkJCWludCBqID0gc2NhcmxldHQy X2dldF9wb3J0X3N0YXJ0X251bShwb3J0cywKKwkJCQkJCQkgICAgIFNDQVJMRVRUMl9QT1JUX09V VCwKKwkJCQkJCQkgICAgIHBvcnRfdHlwZSk7CisJCQlpbnQgcG9ydF9pZCA9IHBvcnRzW3BvcnRf dHlwZV0uaWQ7CisJCQlpbnQgY2hhbm5lbDsKKworCQkJZm9yIChjaGFubmVsID0gMDsKKwkJCSAg ICAgY2hhbm5lbCA8IHBvcnRzW3BvcnRfdHlwZV0ubnVtW3BvcnRfZGlyX3JhdGVdOworCQkJICAg ICBjaGFubmVsKyssIGkrKywgaisrKQorCQkJCS8qIGxvd2VyIDEyIGJpdHMgZm9yIHRoZSBkZXN0 aW5hdGlvbiBhbmQKKwkJCQkgKiBuZXh0IDEyIGJpdHMgZm9yIHRoZSBzb3VyY2UKKwkJCQkgKi8K KwkJCQlyZXEuZGF0YVtpXSA9ICFwb3J0X2lkCisJCQkJCT8gMAorCQkJCQk6IGNwdV90b19sZTMy KAorCQkJCQkJcG9ydF9pZCB8CisJCQkJCQljaGFubmVsIHwKKwkJCQkJCXNjYXJsZXR0Ml9tdXhf c3JjX251bV90b19pZCgKKwkJCQkJCQlwb3J0cywgcHJpdmF0ZS0+bXV4W2pdCisJCQkJCQkpIDw8 IDEyCisJCQkJCSAgKTsKKworCQkJLyogc2tpcCBwcml2YXRlLT5tdXhbal0gZW50cmllcyBub3Qg b3V0cHV0ICovCisJCQlqICs9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJMRVRUMl9QT1JUX09V VF0gLQorCQkJICAgICBwb3J0c1twb3J0X3R5cGVdLm51bVtwb3J0X2Rpcl9yYXRlXTsKKwkJfQor CisJCWVyciA9IHNjYXJsZXR0Ml91c2IobWl4ZXIsIFNDQVJMRVRUMl9VU0JfU0VUX01VWCwKKwkJ CQkgICAgJnJlcSwgKGkgKyAxKSAqIHNpemVvZih1MzIpLAorCQkJCSAgICBOVUxMLCAwKTsKKwkJ aWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOworCX0KKworCXJldHVybiAwOworfQorCisvKiBT ZW5kIFVTQiBtZXNzYWdlIHRvIGdldCBtZXRlciBsZXZlbHMgKi8KK3N0YXRpYyBpbnQgc2Nhcmxl dHQyX3VzYl9nZXRfbWV0ZXJfbGV2ZWxzKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhl ciwKKwkJCQkJICB1MTYgKmxldmVscykKK3sKKwlzdHJ1Y3QgeworCQl1MTYgcGFkOworCQl1MTYg bnVtX21ldGVyczsKKwkJdTMyIG1hZ2ljOworCX0gX19wYWNrZWQgcmVxOworCXUzMiByZXNwW1ND QVJMRVRUMl9OVU1fTUVURVJTXTsKKwlpbnQgaSwgZXJyOworCisJcmVxLnBhZCA9IDA7CisJcmVx Lm51bV9tZXRlcnMgPSBjcHVfdG9fbGUxNihTQ0FSTEVUVDJfTlVNX01FVEVSUyk7CisJcmVxLm1h Z2ljID0gY3B1X3RvX2xlMzIoU0NBUkxFVFQyX1VTQl9NRVRFUl9MRVZFTFNfR0VUX01BR0lDKTsK KwllcnIgPSBzY2FybGV0dDJfdXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0dFVF9NRVRFUl9MRVZF TFMsCisJCQkgICAgJnJlcSwgc2l6ZW9mKHJlcSksIHJlc3AsIHNpemVvZihyZXNwKSk7CisJaWYg KGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBjb3B5LCBjb252ZXJ0IHRvIHUxNiAqLwor CWZvciAoaSA9IDA7IGkgPCBTQ0FSTEVUVDJfTlVNX01FVEVSUzsgaSsrKQorCQlsZXZlbHNbaV0g PSByZXNwW2ldOworCisJcmV0dXJuIDA7Cit9CisKKy8qKiogQ29udHJvbCBGdW5jdGlvbnMgKioq LworCisvKiBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGNvbnRyb2wgKi8KK3N0YXRp YyBpbnQgc2NhcmxldHQyX2FkZF9uZXdfY3RsKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICpt aXhlciwKKwkJCQkgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgKm5jb250cm9sLAorCQkJ CSBpbnQgaW5kZXgsIGludCBjaGFubmVscywgY29uc3QgY2hhciAqbmFtZSwKKwkJCQkgc3RydWN0 IHNuZF9rY29udHJvbCAqKmtjdGxfcmV0dXJuKQoreworCXN0cnVjdCBzbmRfa2NvbnRyb2wgKmtj dGw7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW07CisJaW50IGVycjsKKworCWVs ZW0gPSBremFsbG9jKHNpemVvZigqZWxlbSksIEdGUF9LRVJORUwpOworCWlmICghZWxlbSkKKwkJ cmV0dXJuIC1FTk9NRU07CisKKwllbGVtLT5oZWFkLm1peGVyID0gbWl4ZXI7CisJZWxlbS0+Y29u dHJvbCA9IGluZGV4OworCWVsZW0tPmhlYWQuaWQgPSBpbmRleDsKKwllbGVtLT5jaGFubmVscyA9 IGNoYW5uZWxzOworCisJa2N0bCA9IHNuZF9jdGxfbmV3MShuY29udHJvbCwgZWxlbSk7CisJaWYg KCFrY3RsKSB7CisJCWtmcmVlKGVsZW0pOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisJa2N0bC0+ cHJpdmF0ZV9mcmVlID0gc25kX3VzYl9taXhlcl9lbGVtX2ZyZWU7CisKKwlzdHJsY3B5KGtjdGwt PmlkLm5hbWUsIG5hbWUsIHNpemVvZihrY3RsLT5pZC5uYW1lKSk7CisKKwllcnIgPSBzbmRfdXNi X21peGVyX2FkZF9jb250cm9sKCZlbGVtLT5oZWFkLCBrY3RsKTsKKwlpZiAoZXJyIDwgMCkKKwkJ cmV0dXJuIGVycjsKKworCWlmIChrY3RsX3JldHVybikKKwkJKmtjdGxfcmV0dXJuID0ga2N0bDsK KworCXJldHVybiAwOworfQorCisvKioqIEFuYWxvZ3VlIExpbmUgT3V0IFZvbHVtZSBDb250cm9s cyAqKiovCisKKy8qIFVwZGF0ZSBoYXJkd2FyZSB2b2x1bWUgY29udHJvbHMgYWZ0ZXIgcmVjZWl2 aW5nIG5vdGlmaWNhdGlvbiB0aGF0CisgKiB0aGV5IGhhdmUgY2hhbmdlZAorICovCitzdGF0aWMg aW50IHNjYXJsZXR0Ml91cGRhdGVfdm9sdW1lcyhzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAq bWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXIt PnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cyA9IHBy aXZhdGUtPmluZm8tPnBvcnRzOworCXN0cnVjdCBzY2FybGV0dDJfdXNiX3ZvbHVtZV9zdGF0dXMg dm9sdW1lX3N0YXR1czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQyX1BP UlRfVFlQRV9BTkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGVyciwgaTsK KworCXByaXZhdGUtPnZvbF91cGRhdGVkID0gMDsKKworCWVyciA9IHNjYXJsZXR0Ml91c2JfZ2V0 X3ZvbHVtZV9zdGF0dXMobWl4ZXIsICZ2b2x1bWVfc3RhdHVzKTsKKwlpZiAoZXJyIDwgMCkKKwkJ cmV0dXJuIGVycjsKKworCXByaXZhdGUtPm1hc3Rlcl92b2wgPSBjbGFtcCgKKwkJdm9sdW1lX3N0 YXR1cy5tYXN0ZXJfdm9sICsgU0NBUkxFVFQyX1ZPTFVNRV9CSUFTLAorCQkwLCBTQ0FSTEVUVDJf Vk9MVU1FX0JJQVMpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9saW5lX291dDsgaSsrKSB7CisJ CWlmIChwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ldKQorCQkJcHJpdmF0ZS0+dm9sW2ldID0g cHJpdmF0ZS0+bWFzdGVyX3ZvbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJpdmF0ZS0+aW5m by0+YnV0dG9uX2NvdW50OyBpKyspCisJCXByaXZhdGUtPmJ1dHRvbnNbaV0gPSAhIXZvbHVtZV9z dGF0dXMuYnV0dG9uc1tpXTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0 Ml92b2x1bWVfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICAgIHN0 cnVjdCBzbmRfY3RsX2VsZW1faW5mbyAqdWluZm8pCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVt X2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisKKwl1aW5mby0+dHlwZSA9IFNORFJW X0NUTF9FTEVNX1RZUEVfSU5URUdFUjsKKwl1aW5mby0+Y291bnQgPSBlbGVtLT5jaGFubmVsczsK Kwl1aW5mby0+dmFsdWUuaW50ZWdlci5taW4gPSAwOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1h eCA9IFNDQVJMRVRUMl9WT0xVTUVfQklBUzsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0g MTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9j dGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJCSAgIHN0cnVjdCBzbmRfY3Rs X2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpl bGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICpt aXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpw cml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlmIChwcml2YXRlLT52b2xfdXBkYXRl ZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwkJc2NhcmxldHQyX3Vw ZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4 KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuaW50ZWdlci52YWx1ZVswXSA9IHByaXZhdGUtPm1h c3Rlcl92b2w7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3ZvbHVtZV9j dGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJICAgIHN0cnVjdCBzbmRfY3Rs X2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICpl bGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICpt aXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpw cml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQgaW5kZXggPSBlbGVtLT5jb250cm9s OworCisJaWYgKHByaXZhdGUtPnZvbF91cGRhdGVkKSB7CisJCW11dGV4X2xvY2soJnByaXZhdGUt PmRhdGFfbXV0ZXgpOworCQlzY2FybGV0dDJfdXBkYXRlX3ZvbHVtZXMobWl4ZXIpOworCQltdXRl eF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCX0KKworCXVjb250cm9sLT52YWx1ZS5p bnRlZ2VyLnZhbHVlWzBdID0gcHJpdmF0ZS0+dm9sW2luZGV4XTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIGludCBzY2FybGV0dDJfdm9sdW1lX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAq a2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJ c3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJ c3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlz dHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRh OworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsK KworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCisJb3ZhbCA9IHByaXZhdGUt PnZvbFtpbmRleF07CisJdmFsID0gdWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisK KwlpZiAob3ZhbCA9PSB2YWwpCisJCWdvdG8gdW5sb2NrOworCisJcHJpdmF0ZS0+dm9sW2luZGV4 XSA9IHZhbDsKKwllcnIgPSBzY2FybGV0dDJfdXNiX3NldF9jb25maWcobWl4ZXIsIFNDQVJMRVRU Ml9DT05GSUdfTElORV9PVVRfVk9MVU1FLAorCQkJCSAgICAgICBpbmRleCwgdmFsIC0gU0NBUkxF VFQyX1ZPTFVNRV9CSUFTKTsKKwlpZiAoZXJyID09IDApCisJCWVyciA9IDE7CisKK3VubG9jazoK KwltdXRleF91bmxvY2soJnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisK K3N0YXRpYyBjb25zdCBERUNMQVJFX1RMVl9EQl9NSU5NQVgoCisJZGJfc2NhbGVfc2NhcmxldHQy X2dhaW4sIC1TQ0FSTEVUVDJfVk9MVU1FX0JJQVMgKiAxMDAsIDAKKyk7CisKK3N0YXRpYyBjb25z dCBzdHJ1Y3Qgc25kX2tjb250cm9sX25ldyBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGwgPSB7 CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJW X0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwKKwkJICBTTkRSVl9DVExfRUxFTV9BQ0NFU1NfVExWX1JF QUQsCisJLm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml92b2x1bWVfY3RsX2luZm8sCisJ LmdldCAgPSBzY2FybGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGxfZ2V0LAorCS5wcml2YXRlX3ZhbHVl ID0gMCwgLyogbWF4IHZhbHVlICovCisJLnRsdiA9IHsgLnAgPSBkYl9zY2FsZV9zY2FybGV0dDJf Z2FpbiB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2Nhcmxl dHQyX2xpbmVfb3V0X3ZvbHVtZV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZB Q0VfTUlYRVIsCisJLmFjY2VzcyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAor CQkgIFNORFJWX0NUTF9FTEVNX0FDQ0VTU19UTFZfUkVBRCwKKwkubmFtZSA9ICIiLAorCS5pbmZv ID0gc2NhcmxldHQyX3ZvbHVtZV9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml92b2x1bWVf Y3RsX2dldCwKKwkucHV0ICA9IHNjYXJsZXR0Ml92b2x1bWVfY3RsX3B1dCwKKwkucHJpdmF0ZV92 YWx1ZSA9IDAsIC8qIG1heCB2YWx1ZSAqLworCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfc2Nhcmxl dHQyX2dhaW4gfQorfTsKKworLyoqKiBIVy9TVyBWb2x1bWUgU3dpdGNoIENvbnRyb2xzICoqKi8K Kworc3RhdGljIGludCBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tj b250cm9sICprY3RsLAorCQkJCQkgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sK KwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFsdWVzWzJdID0geworCQkiU1ciLCAiSFciCisJ fTsKKworCXJldHVybiBzbmRfY3RsX2VudW1faW5mbyh1aW5mbywgMSwgMiwgdmFsdWVzKTsKK30K Kworc3RhdGljIGludCBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfZ2V0KHN0cnVjdCBzbmRfa2Nv bnRyb2wgKmtjdGwsCisJCQkJCXN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQor eworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRh OworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4 ZXItPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1bMF0g PQorCQlwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAw OworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9wdXQoc3RydWN0IHNu ZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRy b2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRl X2RhdGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5t aXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJp dmF0ZV9kYXRhOworCisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKwlpbnQgb3ZhbCwgdmFs LCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFs ID0gcHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpbmRleF07CisJdmFsID0gISF1Y29udHJvbC0+ dmFsdWUuaW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxv Y2s7CisKKwlwcml2YXRlLT52b2xfc3dfaHdfc3dpdGNoW2luZGV4XSA9IHZhbDsKKworCS8qIENo YW5nZSBhY2Nlc3MgbW9kZSB0byBSTyAoaGFyZHdhcmUgY29udHJvbGxlZCB2b2x1bWUpCisJICog b3IgUlcgKHNvZnR3YXJlIGNvbnRyb2xsZWQgdm9sdW1lKQorCSAqLworCWlmICh2YWwpCisJCXBy aXZhdGUtPnZvbF9jdGxzW2luZGV4XS0+dmRbMF0uYWNjZXNzICY9CisJCQl+U05EUlZfQ1RMX0VM RU1fQUNDRVNTX1dSSVRFOworCWVsc2UKKwkJcHJpdmF0ZS0+dm9sX2N0bHNbaW5kZXhdLT52ZFsw XS5hY2Nlc3MgfD0KKwkJCVNORFJWX0NUTF9FTEVNX0FDQ0VTU19XUklURTsKKworCS8qIFJlc2V0 IHZvbHVtZSB0byBtYXN0ZXIgdm9sdW1lICovCisJcHJpdmF0ZS0+dm9sW2luZGV4XSA9IHByaXZh dGUtPm1hc3Rlcl92b2w7CisKKwkvKiBTZXQgU1cgdm9sdW1lIHRvIGN1cnJlbnQgSFcgdm9sdW1l ICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKAorCQltaXhlciwgU0NBUkxFVFQy X0NPTkZJR19MSU5FX09VVF9WT0xVTUUsCisJCWluZGV4LCBwcml2YXRlLT5tYXN0ZXJfdm9sIC0g U0NBUkxFVFQyX1ZPTFVNRV9CSUFTKTsKKwlpZiAoZXJyIDwgMCkKKwkJZ290byB1bmxvY2s7CisK KwkvKiBOb3RpZnkgb2YgUk8vUlcgY2hhbmdlICovCisJc25kX2N0bF9ub3RpZnkobWl4ZXItPmNo aXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX0lORk8sCisJCSAgICAgICAmcHJpdmF0ZS0+ dm9sX2N0bHNbaW5kZXhdLT5pZCk7CisKKwkvKiBTZW5kIFNXL0hXIHN3aXRjaCBjaGFuZ2UgdG8g dGhlIGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NB UkxFVFQyX0NPTkZJR19TV19IV19TV0lUQ0gsCisJCQkJICAgICAgIGluZGV4LCB2YWwpOworCit1 bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJy OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX3N3 X2h3X2VudW1fY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAor CS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfc3dfaHdfZW51bV9jdGxfaW5mbywKKwku Z2V0ICA9IHNjYXJsZXR0Ml9zd19od19lbnVtX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJf c3dfaHdfZW51bV9jdGxfcHV0LAorfTsKKworLyoqKiBMaW5lIExldmVsL0luc3RydW1lbnQgTGV2 ZWwgU3dpdGNoIENvbnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2FybGV0dDJfbGV2ZWxfZW51 bV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkgc3RydWN0IHNuZF9j dGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmFsdWVz WzJdID0geworCQkiTGluZSIsICJJbnN0IgorCX07CisKKwlyZXR1cm4gc25kX2N0bF9lbnVtX2lu Zm8odWluZm8sIDEsIDIsIHZhbHVlcyk7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2xldmVs X2VudW1fY3RsX2dldChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQlzdHJ1Y3Qgc25k X2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5m byAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2Rh dGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRlX2RhdGE7CisKKwl1Y29udHJv bC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0KKwkJcHJpdmF0ZS0+bGV2ZWxfc3dpdGNoW2Vs ZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9sZXZl bF9lbnVtX2N0bF9wdXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkJc3RydWN0IHNu ZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2lu Zm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2Rh dGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCisJaW50IGluZGV4ID0gZWxlbS0+ Y29udHJvbDsKKwlpbnQgb3ZhbCwgdmFsLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0 ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+bGV2ZWxfc3dpdGNoW2luZGV4XTsK Kwl2YWwgPSAhIXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCisJaWYgKG92YWwg PT0gdmFsKQorCQlnb3RvIHVubG9jazsKKworCXByaXZhdGUtPmxldmVsX3N3aXRjaFtpbmRleF0g PSB2YWw7CisKKwkvKiBTZW5kIHN3aXRjaCBjaGFuZ2UgdG8gdGhlIGRldmljZSAqLworCWVyciA9 IHNjYXJsZXR0Ml91c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NBUkxFVFQyX0NPTkZJR19MRVZFTF9T V0lUQ0gsCisJCQkJICAgICAgIGluZGV4LCB2YWwpOworCit1bmxvY2s6CisJbXV0ZXhfdW5sb2Nr KCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgY29uc3Qg c3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX2xldmVsX2VudW1fY3RsID0geworCS5p ZmFjZSA9IFNORFJWX0NUTF9FTEVNX0lGQUNFX01JWEVSLAorCS5uYW1lID0gIiIsCisJLmluZm8g PSBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxfaW5mbywKKwkuZ2V0ICA9IHNjYXJsZXR0Ml9sZXZl bF9lbnVtX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfbGV2ZWxfZW51bV9jdGxfcHV0LAor fTsKKworLyoqKiBQYWQgU3dpdGNoIENvbnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2FybGV0 dDJfcGFkX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgc3RydWN0IHNu ZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2lu Zm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9k YXRhICpwcml2YXRlID0gZWxlbS0+aGVhZC5taXhlci0+cHJpdmF0ZV9kYXRhOworCisJdWNvbnRy b2wtPnZhbHVlLmVudW1lcmF0ZWQuaXRlbVswXSA9CisJCXByaXZhdGUtPnBhZF9zd2l0Y2hbZWxl bS0+Y29udHJvbF07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX3BhZF9j dGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGwsCisJCQkJIHN0cnVjdCBzbmRfY3RsX2Vs ZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVt ID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhl ciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2 YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWludCBpbmRleCA9IGVsZW0tPmNvbnRyb2w7 CisJaW50IG92YWwsIHZhbCwgZXJyID0gMDsKKworCW11dGV4X2xvY2soJnByaXZhdGUtPmRhdGFf bXV0ZXgpOworCisJb3ZhbCA9IHByaXZhdGUtPnBhZF9zd2l0Y2hbaW5kZXhdOworCXZhbCA9ICEh dWNvbnRyb2wtPnZhbHVlLmludGVnZXIudmFsdWVbMF07CisKKwlpZiAob3ZhbCA9PSB2YWwpCisJ CWdvdG8gdW5sb2NrOworCisJcHJpdmF0ZS0+cGFkX3N3aXRjaFtpbmRleF0gPSB2YWw7CisKKwkv KiBTZW5kIHN3aXRjaCBjaGFuZ2UgdG8gdGhlIGRldmljZSAqLworCWVyciA9IHNjYXJsZXR0Ml91 c2Jfc2V0X2NvbmZpZyhtaXhlciwgU0NBUkxFVFQyX0NPTkZJR19QQURfU1dJVENILAorCQkJCSAg ICAgICBpbmRleCwgdmFsKTsKKwordW5sb2NrOgorCW11dGV4X3VubG9jaygmcHJpdmF0ZS0+ZGF0 YV9tdXRleCk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2Nv bnRyb2xfbmV3IHNjYXJsZXR0Ml9wYWRfY3RsID0geworCS5pZmFjZSA9IFNORFJWX0NUTF9FTEVN X0lGQUNFX01JWEVSLAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzbmRfY3RsX2Jvb2xlYW5fbW9u b19pbmZvLAorCS5nZXQgID0gc2NhcmxldHQyX3BhZF9jdGxfZ2V0LAorCS5wdXQgID0gc2Nhcmxl dHQyX3BhZF9jdGxfcHV0LAorfTsKKworLyoqKiBNdXRlL0RpbSBDb250cm9scyAqKiovCisKK3N0 YXRpYyBpbnQgc2NhcmxldHQyX2J1dHRvbl9jdGxfZ2V0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtj dGwsCisJCQkJICAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0 cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0 cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3Ry dWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsK KworCWlmIChwcml2YXRlLT52b2xfdXBkYXRlZCkgeworCQltdXRleF9sb2NrKCZwcml2YXRlLT5k YXRhX211dGV4KTsKKwkJc2NhcmxldHQyX3VwZGF0ZV92b2x1bWVzKG1peGVyKTsKKwkJbXV0ZXhf dW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwl9CisKKwl1Y29udHJvbC0+dmFsdWUuZW51 bWVyYXRlZC5pdGVtWzBdID0gcHJpdmF0ZS0+YnV0dG9uc1tlbGVtLT5jb250cm9sXTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfYnV0dG9uX2N0bF9wdXQoc3RydWN0IHNu ZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNv bnRyb2wpCit7CisJc3RydWN0IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2 YXRlX2RhdGE7CisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVh ZC5taXhlcjsKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+ cHJpdmF0ZV9kYXRhOworCisJaW50IGluZGV4ID0gZWxlbS0+Y29udHJvbDsKKwlpbnQgb3ZhbCwg dmFsLCBlcnIgPSAwOworCisJbXV0ZXhfbG9jaygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlv dmFsID0gcHJpdmF0ZS0+YnV0dG9uc1tpbmRleF07CisJdmFsID0gISF1Y29udHJvbC0+dmFsdWUu aW50ZWdlci52YWx1ZVswXTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisK Kwlwcml2YXRlLT5idXR0b25zW2luZGV4XSA9IHZhbDsKKworCS8qIFNlbmQgc3dpdGNoIGNoYW5n ZSB0byB0aGUgZGV2aWNlICovCisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfY29uZmlnKG1peGVy LCBTQ0FSTEVUVDJfQ09ORklHX0JVVFRPTlMsCisJCQkJICAgICAgIGluZGV4LCB2YWwpOworCit1 bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJy OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX2J1 dHRvbl9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLm5h bWUgPSAiIiwKKwkuaW5mbyA9IHNuZF9jdGxfYm9vbGVhbl9tb25vX2luZm8sCisJLmdldCAgPSBz Y2FybGV0dDJfYnV0dG9uX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0dDJfYnV0dG9uX2N0bF9w dXQKK307CisKKy8qKiogQ3JlYXRlIHRoZSBhbmFsb2d1ZSBvdXRwdXQgY29udHJvbHMgKioqLwor CitzdGF0aWMgaW50IHNjYXJsZXR0Ml9hZGRfbGluZV9vdXRfY3RscyhzdHJ1Y3QgdXNiX21peGVy X2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2 YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2Rldmlj ZV9pbmZvICppbmZvID0gcHJpdmF0ZS0+aW5mbzsKKwljb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX3Bv cnRzICpwb3J0cyA9IGluZm8tPnBvcnRzOworCWludCBudW1fbGluZV9vdXQgPQorCQlwb3J0c1tT Q0FSTEVUVDJfUE9SVF9UWVBFX0FOQUxPR1VFXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwlp bnQgZXJyLCBpOworCWNoYXIgc1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01BWExFTl07CisKKwkv KiBBZGQgUi9PIEhXIHZvbHVtZSBjb250cm9sICovCisJaWYgKGluZm8tPmxpbmVfb3V0X2h3X3Zv bCkgeworCQlzbnByaW50ZihzLCBzaXplb2YocyksICJNYXN0ZXIgSFcgUGxheWJhY2sgVm9sdW1l Iik7CisJCWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwKKwkJCQkJICAgICZzY2Fy bGV0dDJfbWFzdGVyX3ZvbHVtZV9jdGwsCisJCQkJCSAgICAwLCAxLCBzLCAmcHJpdmF0ZS0+bWFz dGVyX3ZvbF9jdGwpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJLyog QWRkIHZvbHVtZSBjb250cm9scyAqLworCWZvciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkr KykgeworCisJCS8qIEZhZGVyICovCisJCWlmIChpbmZvLT5saW5lX291dF9kZXNjcnNbaV0pCisJ CQlzbnByaW50ZihzLCBzaXplb2YocyksCisJCQkJICJMaW5lICUwMmQgKCVzKSBQbGF5YmFjayBW b2x1bWUiLAorCQkJCSBpICsgMSwgaW5mby0+bGluZV9vdXRfZGVzY3JzW2ldKTsKKwkJZWxzZQor CQkJc25wcmludGYocywgc2l6ZW9mKHMpLAorCQkJCSAiTGluZSAlMDJkIFBsYXliYWNrIFZvbHVt ZSIsCisJCQkJIGkgKyAxKTsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9uZXdfY3RsKG1peGVyLAor CQkJCQkgICAgJnNjYXJsZXR0Ml9saW5lX291dF92b2x1bWVfY3RsLAorCQkJCQkgICAgaSwgMSwg cywgJnByaXZhdGUtPnZvbF9jdGxzW2ldKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJy OworCisJCS8qIE1ha2UgdGhlIGZhZGVyIHJlYWQtb25seSBpZiB0aGUgU1cvSFcgc3dpdGNoIGlz IHNldCB0byBIVyAqLworCQlpZiAocHJpdmF0ZS0+dm9sX3N3X2h3X3N3aXRjaFtpXSkKKwkJCXBy aXZhdGUtPnZvbF9jdGxzW2ldLT52ZFswXS5hY2Nlc3MgJj0KKwkJCQl+U05EUlZfQ1RMX0VMRU1f QUNDRVNTX1dSSVRFOworCisJCS8qIFNXL0hXIFN3aXRjaCAqLworCQlpZiAoaW5mby0+bGluZV9v dXRfaHdfdm9sKSB7CisJCQlzbnByaW50ZihzLCBzaXplb2YocyksCisJCQkJICJMaW5lIE91dCAl MDJkIFZvbHVtZSBDb250cm9sIFBsYXliYWNrIEVudW0iLAorCQkJCSBpICsgMSk7CisJCQllcnIg PSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsCisJCQkJCQkgICAgJnNjYXJsZXR0Ml9zd19o d19lbnVtX2N0bCwKKwkJCQkJCSAgICBpLCAxLCBzLCBOVUxMKTsKKwkJCWlmIChlcnIgPCAwKQor CQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwkvKiBBZGQgSFcgYnV0dG9uIGNvbnRyb2xzICov CisJZm9yIChpID0gMDsgaSA8IHByaXZhdGUtPmluZm8tPmJ1dHRvbl9jb3VudDsgaSsrKSB7CisJ CWVyciA9IHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9idXR0b25fY3Rs LAorCQkJCQkgICAgaSwgMSwgc2NhcmxldHQyX2J1dHRvbl9uYW1lc1tpXSwKKwkJCQkJICAgICZw cml2YXRlLT5idXR0b25fY3Rsc1tpXSk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsK Kwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKiBDcmVhdGUgdGhlIGFuYWxvZ3VlIGlucHV0IGNv bnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2FybGV0dDJfYWRkX2xpbmVfaW5fY3RscyhzdHJ1 Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhl cl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBzdHJ1Y3Qgc2Nh cmxldHQyX2RldmljZV9pbmZvICppbmZvID0gcHJpdmF0ZS0+aW5mbzsKKwlpbnQgZXJyLCBpOwor CWNoYXIgc1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01BWExFTl07CisKKwkvKiBBZGQgaW5wdXQg bGV2ZWwgKGxpbmUvaW5zdCkgY29udHJvbHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bGV2 ZWxfaW5wdXRfY291bnQ7IGkrKykgeworCQlzbnByaW50ZihzLCBzaXplb2YocyksICJMaW5lIElu ICVkIExldmVsIENhcHR1cmUgRW51bSIsIGkgKyAxKTsKKwkJZXJyID0gc2NhcmxldHQyX2FkZF9u ZXdfY3RsKG1peGVyLCAmc2NhcmxldHQyX2xldmVsX2VudW1fY3RsLAorCQkJCQkgICAgaSwgMSwg cywgTlVMTCk7CisJCWlmIChlcnIgPCAwKQorCQkJcmV0dXJuIGVycjsKKwl9CisKKwkvKiBBZGQg aW5wdXQgcGFkIGNvbnRyb2xzICovCisJZm9yIChpID0gMDsgaSA8IGluZm8tPnBhZF9pbnB1dF9j b3VudDsgaSsrKSB7CisJCXNucHJpbnRmKHMsIHNpemVvZihzKSwgIkxpbmUgSW4gJWQgUGFkIENh cHR1cmUgU3dpdGNoIiwgaSArIDEpOworCQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4 ZXIsICZzY2FybGV0dDJfcGFkX2N0bCwKKwkJCQkJICAgIGksIDEsIHMsIE5VTEwpOworCQlpZiAo ZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qKiogTWl4 ZXIgVm9sdW1lIENvbnRyb2xzICoqKi8KKworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJfY3Rs X2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxf ZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9 IGtjdGwtPnByaXZhdGVfZGF0YTsKKworCXVpbmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQ RV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9IGVsZW0tPmNoYW5uZWxzOworCXVpbmZvLT52YWx1 ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8tPnZhbHVlLmludGVnZXIubWF4ID0gU0NBUkxFVFQy X01JWEVSX01BWF9WQUxVRTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0gMTsKKwlyZXR1 cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWl4ZXJfY3RsX2dldChzdHJ1Y3Qgc25k X2tjb250cm9sICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250 cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0 ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhl YWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKworCXVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVl WzBdID0gcHJpdmF0ZS0+bWl4W2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0 aWMgaW50IHNjYXJsZXR0Ml9taXhlcl9jdGxfcHV0KHN0cnVjdCBzbmRfa2NvbnRyb2wgKmtjdGws CisJCQkJICAgc3RydWN0IHNuZF9jdGxfZWxlbV92YWx1ZSAqdWNvbnRyb2wpCit7CisJc3RydWN0 IHVzYl9taXhlcl9lbGVtX2luZm8gKmVsZW0gPSBrY3RsLT5wcml2YXRlX2RhdGE7CisJc3RydWN0 IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyID0gZWxlbS0+aGVhZC5taXhlcjsKKwlzdHJ1Y3Qg c2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNv bnN0IHN0cnVjdCBzY2FybGV0dDJfZGV2aWNlX2luZm8gKmluZm8gPSBwcml2YXRlLT5pbmZvOwor CWNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gaW5mby0+cG9ydHM7CisJaW50 IG92YWwsIHZhbCwgbnVtX21peGVyX2luLCBtaXhfbnVtLCBlcnIgPSAwOworCisJbXV0ZXhfbG9j aygmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisKKwlvdmFsID0gcHJpdmF0ZS0+bWl4W2VsZW0tPmNv bnRyb2xdOworCXZhbCA9IHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdOworCW51bV9t aXhlcl9pbiA9IHBvcnRzW1NDQVJMRVRUMl9QT1JUX1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BP UlRfT1VUXTsKKwltaXhfbnVtID0gZWxlbS0+Y29udHJvbCAvIG51bV9taXhlcl9pbjsKKworCWlm IChvdmFsID09IHZhbCkKKwkJZ290byB1bmxvY2s7CisKKwlwcml2YXRlLT5taXhbZWxlbS0+Y29u dHJvbF0gPSB2YWw7CisJZXJyID0gc2NhcmxldHQyX3VzYl9zZXRfbWl4KG1peGVyLCBtaXhfbnVt KTsKKwlpZiAoZXJyID09IDApCisJCWVyciA9IDE7CisKK3VubG9jazoKKwltdXRleF91bmxvY2so JnByaXZhdGUtPmRhdGFfbXV0ZXgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBjb25zdCBE RUNMQVJFX1RMVl9EQl9NSU5NQVgoCisJZGJfc2NhbGVfc2NhcmxldHQyX21peGVyLAorCVNDQVJM RVRUMl9NSVhFUl9NSU5fREIgKiAxMDAsCisJU0NBUkxFVFQyX01JWEVSX01BWF9EQiAqIDEwMAor KTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzbmRfa2NvbnRyb2xfbmV3IHNjYXJsZXR0Ml9taXhl cl9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJLmFjY2Vz cyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEV1JJVEUgfAorCQkgIFNORFJWX0NUTF9FTEVN X0FDQ0VTU19UTFZfUkVBRCwKKwkubmFtZSA9ICIiLAorCS5pbmZvID0gc2NhcmxldHQyX21peGVy X2N0bF9pbmZvLAorCS5nZXQgID0gc2NhcmxldHQyX21peGVyX2N0bF9nZXQsCisJLnB1dCAgPSBz Y2FybGV0dDJfbWl4ZXJfY3RsX3B1dCwKKwkucHJpdmF0ZV92YWx1ZSA9IFNDQVJMRVRUMl9NSVhF Ul9NQVhfREIsIC8qIG1heCB2YWx1ZSAqLworCS50bHYgPSB7IC5wID0gZGJfc2NhbGVfc2Nhcmxl dHQyX21peGVyIH0KK307CisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX2FkZF9taXhlcl9jdGxzKHN0 cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21p eGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNvbnN0IHN0cnVjdCBz Y2FybGV0dDJfcG9ydHMgKnBvcnRzID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7CisJaW50IGVyciwg aSwgajsKKwlpbnQgaW5kZXg7CisJY2hhciBzW1NORFJWX0NUTF9FTEVNX0lEX05BTUVfTUFYTEVO XTsKKworCWludCBudW1faW5wdXRzID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9NSVhdLm51 bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCWludCBudW1fb3V0cHV0cyA9IHBvcnRzW1NDQVJMRVRU Ml9QT1JUX1RZUEVfTUlYXS5udW1bU0NBUkxFVFQyX1BPUlRfSU5dOworCisJZm9yIChpID0gMCwg aW5kZXggPSAwOyBpIDwgbnVtX291dHB1dHM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgbnVt X2lucHV0czsgaisrLCBpbmRleCsrKSB7CisJCQlzbnByaW50ZihzLCBzaXplb2YocyksCisJCQkJ ICJNaXggJWMgSW5wdXQgJTAyZCBQbGF5YmFjayBWb2x1bWUiLAorCQkJCSAnQScgKyBpLCBqICsg MSk7CisJCQllcnIgPSBzY2FybGV0dDJfYWRkX25ld19jdGwobWl4ZXIsICZzY2FybGV0dDJfbWl4 ZXJfY3RsLAorCQkJCQkJICAgIGluZGV4LCAxLCBzLCBOVUxMKTsKKwkJCWlmIChlcnIgPCAwKQor CQkJCXJldHVybiBlcnI7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyoqKiBNdXggU291 cmNlIFNlbGVjdGlvbiBDb250cm9scyAqKiovCisKK3N0YXRpYyBpbnQgc2NhcmxldHQyX211eF9z cmNfZW51bV9jdGxfaW5mbyhzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkgICBzdHJ1 Y3Qgc25kX2N0bF9lbGVtX2luZm8gKnVpbmZvKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9p bmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJf ZGF0YSAqcHJpdmF0ZSA9IGVsZW0tPmhlYWQubWl4ZXItPnByaXZhdGVfZGF0YTsKKwljb25zdCBz dHJ1Y3Qgc2NhcmxldHQyX3BvcnRzICpwb3J0cyA9IHByaXZhdGUtPmluZm8tPnBvcnRzOworCXVu c2lnbmVkIGludCBpdGVtID0gdWluZm8tPnZhbHVlLmVudW1lcmF0ZWQuaXRlbTsKKwlpbnQgaXRl bXMgPSBwcml2YXRlLT5udW1fbXV4X3NyY3M7CisJaW50IHBvcnRfdHlwZTsKKworCXVpbmZvLT50 eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9FTlVNRVJBVEVEOworCXVpbmZvLT5jb3VudCA9IGVs ZW0tPmNoYW5uZWxzOworCXVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0ZW1zID0gaXRlbXM7CisK KwlpZiAoaXRlbSA+PSBpdGVtcykKKwkJaXRlbSA9IHVpbmZvLT52YWx1ZS5lbnVtZXJhdGVkLml0 ZW0gPSBpdGVtcyAtIDE7CisKKwlmb3IgKHBvcnRfdHlwZSA9IDA7CisJICAgICBwb3J0X3R5cGUg PCBTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAgcG9ydF90eXBlKyspIHsKKwkJaWYg KGl0ZW0gPCBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9JTl0pIHsKKwkJCXNw cmludGYodWluZm8tPnZhbHVlLmVudW1lcmF0ZWQubmFtZSwKKwkJCQlwb3J0c1twb3J0X3R5cGVd LnNyY19kZXNjciwKKwkJCQlpdGVtICsgcG9ydHNbcG9ydF90eXBlXS5zcmNfbnVtX29mZnNldCk7 CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpdGVtIC09IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJM RVRUMl9QT1JUX0lOXTsKKwl9CisKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBz Y2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bF9nZXQoc3RydWN0IHNuZF9rY29udHJvbCAqa2N0bCwK KwkJCQkJICBzdHJ1Y3Qgc25kX2N0bF9lbGVtX3ZhbHVlICp1Y29udHJvbCkKK3sKKwlzdHJ1Y3Qg dXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3Qg c2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBlbGVtLT5oZWFkLm1peGVyLT5wcml2YXRl X2RhdGE7CisKKwl1Y29udHJvbC0+dmFsdWUuZW51bWVyYXRlZC5pdGVtWzBdID0gcHJpdmF0ZS0+ bXV4W2VsZW0tPmNvbnRyb2xdOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjYXJsZXR0 Ml9tdXhfc3JjX2VudW1fY3RsX3B1dChzdHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCQkg IHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFsdWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4 ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0bC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB1c2JfbWl4 ZXJfaW50ZXJmYWNlICptaXhlciA9IGVsZW0tPmhlYWQubWl4ZXI7CisJc3RydWN0IHNjYXJsZXR0 Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKwlpbnQgaW5kZXgg PSBlbGVtLT5jb250cm9sOworCWludCBvdmFsLCB2YWwsIGVyciA9IDA7CisKKwltdXRleF9sb2Nr KCZwcml2YXRlLT5kYXRhX211dGV4KTsKKworCW92YWwgPSBwcml2YXRlLT5tdXhbaW5kZXhdOwor CXZhbCA9IGNsYW1wKHVjb250cm9sLT52YWx1ZS5pbnRlZ2VyLnZhbHVlWzBdLAorCQkgICAgMEws IHByaXZhdGUtPm51bV9tdXhfc3JjcyAtIDFMKTsKKworCWlmIChvdmFsID09IHZhbCkKKwkJZ290 byB1bmxvY2s7CisKKwlwcml2YXRlLT5tdXhbaW5kZXhdID0gdmFsOworCWVyciA9IHNjYXJsZXR0 Ml91c2Jfc2V0X211eChtaXhlcik7CisJaWYgKGVyciA9PSAwKQorCQllcnIgPSAxOworCit1bmxv Y2s6CisJbXV0ZXhfdW5sb2NrKCZwcml2YXRlLT5kYXRhX211dGV4KTsKKwlyZXR1cm4gZXJyOwor fQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX211eF9z cmNfZW51bV9jdGwgPSB7CisJLmlmYWNlID0gU05EUlZfQ1RMX0VMRU1fSUZBQ0VfTUlYRVIsCisJ Lm5hbWUgPSAiIiwKKwkuaW5mbyA9IHNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsX2luZm8sCisJ LmdldCAgPSBzY2FybGV0dDJfbXV4X3NyY19lbnVtX2N0bF9nZXQsCisJLnB1dCAgPSBzY2FybGV0 dDJfbXV4X3NyY19lbnVtX2N0bF9wdXQsCit9OworCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9hZGRf bXV4X2VudW1zKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qg c2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUgPSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCWNv bnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzID0gcHJpdmF0ZS0+aW5mby0+cG9ydHM7 CisJaW50IHBvcnRfdHlwZSwgY2hhbm5lbCwgaTsKKworCWZvciAoaSA9IDAsIHBvcnRfdHlwZSA9 IDA7CisJICAgICBwb3J0X3R5cGUgPCBTQ0FSTEVUVDJfUE9SVF9UWVBFX0NPVU5UOworCSAgICAg cG9ydF90eXBlKyspIHsKKwkJZm9yIChjaGFubmVsID0gMDsKKwkJICAgICBjaGFubmVsIDwgcG9y dHNbcG9ydF90eXBlXS5udW1bU0NBUkxFVFQyX1BPUlRfT1VUXTsKKwkJICAgICBjaGFubmVsKyss IGkrKykgeworCQkJaW50IGVycjsKKwkJCWNoYXIgc1tTTkRSVl9DVExfRUxFTV9JRF9OQU1FX01B WExFTl07CisJCQljb25zdCBjaGFyICpjb25zdCBkZXNjciA9IHBvcnRzW3BvcnRfdHlwZV0uZHN0 X2Rlc2NyOworCisJCQlzbnByaW50ZihzLCBzaXplb2YocykgLSA1LCBkZXNjciwgY2hhbm5lbCAr IDEpOworCQkJc3RyY2F0KHMsICIgRW51bSIpOworCisJCQllcnIgPSBzY2FybGV0dDJfYWRkX25l d19jdGwobWl4ZXIsCisJCQkJCQkgICAgJnNjYXJsZXR0Ml9tdXhfc3JjX2VudW1fY3RsLAorCQkJ CQkJICAgIGksIDEsIHMsIE5VTEwpOworCQkJaWYgKGVyciA8IDApCisJCQkJcmV0dXJuIGVycjsK KwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKioqIE1ldGVyIENvbnRyb2xzICoqKi8KKwor c3RhdGljIGludCBzY2FybGV0dDJfbWV0ZXJfY3RsX2luZm8oc3RydWN0IHNuZF9rY29udHJvbCAq a2N0bCwKKwkJCQkgICAgc3RydWN0IHNuZF9jdGxfZWxlbV9pbmZvICp1aW5mbykKK3sKKwlzdHJ1 Y3QgdXNiX21peGVyX2VsZW1faW5mbyAqZWxlbSA9IGtjdGwtPnByaXZhdGVfZGF0YTsKKworCXVp bmZvLT50eXBlID0gU05EUlZfQ1RMX0VMRU1fVFlQRV9JTlRFR0VSOworCXVpbmZvLT5jb3VudCA9 IGVsZW0tPmNoYW5uZWxzOworCXVpbmZvLT52YWx1ZS5pbnRlZ2VyLm1pbiA9IDA7CisJdWluZm8t PnZhbHVlLmludGVnZXIubWF4ID0gNDA5NTsKKwl1aW5mby0+dmFsdWUuaW50ZWdlci5zdGVwID0g MTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzY2FybGV0dDJfbWV0ZXJfY3RsX2dldChz dHJ1Y3Qgc25kX2tjb250cm9sICprY3RsLAorCQkJCSAgIHN0cnVjdCBzbmRfY3RsX2VsZW1fdmFs dWUgKnVjb250cm9sKQoreworCXN0cnVjdCB1c2JfbWl4ZXJfZWxlbV9pbmZvICplbGVtID0ga2N0 bC0+cHJpdmF0ZV9kYXRhOworCXUxNiBtZXRlcl9sZXZlbHNbU0NBUkxFVFQyX05VTV9NRVRFUlNd OworCWludCBpLCBlcnI7CisKKwllcnIgPSBzY2FybGV0dDJfdXNiX2dldF9tZXRlcl9sZXZlbHMo ZWxlbS0+aGVhZC5taXhlciwgbWV0ZXJfbGV2ZWxzKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJu IGVycjsKKworCWZvciAoaSA9IDA7IGkgPCBlbGVtLT5jaGFubmVsczsgaSsrKQorCQl1Y29udHJv bC0+dmFsdWUuaW50ZWdlci52YWx1ZVtpXSA9IG1ldGVyX2xldmVsc1tpXTsKKworCXJldHVybiAw OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHNuZF9rY29udHJvbF9uZXcgc2NhcmxldHQyX21l dGVyX2N0bCA9IHsKKwkuaWZhY2UgPSBTTkRSVl9DVExfRUxFTV9JRkFDRV9QQ00sCisJLmFjY2Vz cyA9IFNORFJWX0NUTF9FTEVNX0FDQ0VTU19SRUFEIHwgU05EUlZfQ1RMX0VMRU1fQUNDRVNTX1ZP TEFUSUxFLAorCS5uYW1lID0gIiIsCisJLmluZm8gPSBzY2FybGV0dDJfbWV0ZXJfY3RsX2luZm8s CisJLmdldCAgPSBzY2FybGV0dDJfbWV0ZXJfY3RsX2dldAorfTsKKworc3RhdGljIGludCBzY2Fy bGV0dDJfYWRkX21ldGVyX2N0bChzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7 CisJcmV0dXJuIHNjYXJsZXR0Ml9hZGRfbmV3X2N0bChtaXhlciwgJnNjYXJsZXR0Ml9tZXRlcl9j dGwsCisJCQkJICAgICAwLCBTQ0FSTEVUVDJfTlVNX01FVEVSUywKKwkJCQkgICAgICJMZXZlbCBN ZXRlciIsIE5VTEwpOworfQorCisvKioqIENsZWFudXAvU3VzcGVuZCBDYWxsYmFja3MgKioqLwor CitzdGF0aWMgdm9pZCBzY2FybGV0dDJfcHJpdmF0ZV9mcmVlKHN0cnVjdCB1c2JfbWl4ZXJfaW50 ZXJmYWNlICptaXhlcikKK3sKKwlzdHJ1Y3Qgc2NhcmxldHQyX21peGVyX2RhdGEgKnByaXZhdGUg PSBtaXhlci0+cHJpdmF0ZV9kYXRhOworCisJY2FuY2VsX2RlbGF5ZWRfd29ya19zeW5jKCZwcml2 YXRlLT53b3JrKTsKKwlrZnJlZShwcml2YXRlKTsKKwltaXhlci0+cHJpdmF0ZV9kYXRhID0gTlVM TDsKK30KKworc3RhdGljIHZvaWQgc2NhcmxldHQyX3ByaXZhdGVfc3VzcGVuZChzdHJ1Y3QgdXNi X21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3RydWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRh ICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsKKworCWlmIChjYW5jZWxfZGVsYXllZF93 b3JrX3N5bmMoJnByaXZhdGUtPndvcmspKQorCQlzY2FybGV0dDJfY29uZmlnX3NhdmUocHJpdmF0 ZS0+bWl4ZXIpOworfQorCisvKioqIEluaXRpYWxpc2F0aW9uICoqKi8KKworc3RhdGljIGludCBz Y2FybGV0dDJfY291bnRfbXV4X3NyY3MoY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9y dHMpCit7CisJaW50IHBvcnRfdHlwZSwgY291bnQgPSAwOworCisJZm9yIChwb3J0X3R5cGUgPSAw OworCSAgICAgcG9ydF90eXBlIDwgU0NBUkxFVFQyX1BPUlRfVFlQRV9DT1VOVDsKKwkgICAgIHBv cnRfdHlwZSsrKQorCQljb3VudCArPSBwb3J0c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9S VF9JTl07CisKKwlyZXR1cm4gY291bnQ7Cit9CisKKy8qIERlZmF1bHQgcm91dGluZyBjb25uZWN0 cyBQQ00gb3V0cHV0cyBhbmQgaW5wdXRzIHRvIEFuYWxvZ3VlLAorICogUy9QRElGLCB0aGVuIEFE QVQKKyAqLworc3RhdGljIHZvaWQgc2NhcmxldHQyX2luaXRfcm91dGluZyh1OCAqbXV4LAorCQkJ CSAgIGNvbnN0IHN0cnVjdCBzY2FybGV0dDJfcG9ydHMgKnBvcnRzKQoreworCWludCBpLCBpbnB1 dF9udW0sIGlucHV0X2NvdW50LCBwb3J0X3R5cGU7CisJaW50IG91dHB1dF9udW0sIG91dHB1dF9j b3VudCwgcG9ydF90eXBlX2Nvbm5lY3RfbnVtOworCisJc3RhdGljIGNvbnN0IGludCBjb25uZWN0 X29yZGVyW10gPSB7CisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQU5BTE9HVUUsCisJCVNDQVJMRVRU Ml9QT1JUX1RZUEVfU1BESUYsCisJCVNDQVJMRVRUMl9QT1JUX1RZUEVfQURBVCwKKwkJLTEKKwl9 OworCisJLyogQXNzaWduIFBDTSBpbnB1dHMgKHJvdXRpbmcgb3V0cHV0cykgKi8KKwlvdXRwdXRf bnVtID0gc2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251bShwb3J0cywKKwkJCQkJCSAgU0NBUkxF VFQyX1BPUlRfT1VULAorCQkJCQkJICBTQ0FSTEVUVDJfUE9SVF9UWVBFX1BDTSk7CisJb3V0cHV0 X2NvdW50ID0gcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9QQ01dLm51bVtTQ0FSTEVUVDJfUE9S VF9PVVRdOworCisJZm9yIChwb3J0X3R5cGUgPSBjb25uZWN0X29yZGVyW3BvcnRfdHlwZV9jb25u ZWN0X251bSA9IDBdOworCSAgICAgcG9ydF90eXBlID49IDA7CisJICAgICBwb3J0X3R5cGUgPSBj b25uZWN0X29yZGVyWysrcG9ydF90eXBlX2Nvbm5lY3RfbnVtXSkgeworCQlpbnB1dF9udW0gPSBz Y2FybGV0dDJfZ2V0X3BvcnRfc3RhcnRfbnVtKAorCQkJcG9ydHMsIFNDQVJMRVRUMl9QT1JUX0lO LCBwb3J0X3R5cGUpOworCQlpbnB1dF9jb3VudCA9IHBvcnRzW3BvcnRfdHlwZV0ubnVtW1NDQVJM RVRUMl9QT1JUX0lOXTsKKwkJZm9yIChpID0gMDsKKwkJICAgICBpIDwgaW5wdXRfY291bnQgJiYg b3V0cHV0X2NvdW50OworCQkgICAgIGkrKywgb3V0cHV0X2NvdW50LS0pCisJCQltdXhbb3V0cHV0 X251bSsrXSA9IGlucHV0X251bSsrOworCX0KKworCS8qIEFzc2lnbiBQQ00gb3V0cHV0cyAocm91 dGluZyBpbnB1dHMpICovCisJaW5wdXRfbnVtID0gc2NhcmxldHQyX2dldF9wb3J0X3N0YXJ0X251 bShwb3J0cywKKwkJCQkJCSBTQ0FSTEVUVDJfUE9SVF9JTiwKKwkJCQkJCSBTQ0FSTEVUVDJfUE9S VF9UWVBFX1BDTSk7CisJaW5wdXRfY291bnQgPSBwb3J0c1tTQ0FSTEVUVDJfUE9SVF9UWVBFX1BD TV0ubnVtW1NDQVJMRVRUMl9QT1JUX0lOXTsKKworCWZvciAocG9ydF90eXBlID0gY29ubmVjdF9v cmRlcltwb3J0X3R5cGVfY29ubmVjdF9udW0gPSAwXTsKKwkgICAgIHBvcnRfdHlwZSA+PSAwOwor CSAgICAgcG9ydF90eXBlID0gY29ubmVjdF9vcmRlclsrK3BvcnRfdHlwZV9jb25uZWN0X251bV0p IHsKKwkJb3V0cHV0X251bSA9IHNjYXJsZXR0Ml9nZXRfcG9ydF9zdGFydF9udW0oCisJCQlwb3J0 cywgU0NBUkxFVFQyX1BPUlRfT1VULCBwb3J0X3R5cGUpOworCQlvdXRwdXRfY291bnQgPSBwb3J0 c1twb3J0X3R5cGVdLm51bVtTQ0FSTEVUVDJfUE9SVF9PVVRdOworCQlmb3IgKGkgPSAwOworCQkg ICAgIGkgPCBvdXRwdXRfY291bnQgJiYgaW5wdXRfY291bnQ7CisJCSAgICAgaSsrLCBpbnB1dF9j b3VudC0tKQorCQkJbXV4W291dHB1dF9udW0rK10gPSBpbnB1dF9udW0rKzsKKwl9Cit9CisKKy8q IEluaXRpYWxpc2UgcHJpdmF0ZSBkYXRhLCByb3V0aW5nLCBzZXF1ZW5jZSBudW1iZXIgKi8KK3N0 YXRpYyBpbnQgc2NhcmxldHQyX2luaXRfcHJpdmF0ZShzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFj ZSAqbWl4ZXIsCisJCQkJICBjb25zdCBzdHJ1Y3Qgc2NhcmxldHQyX2RldmljZV9pbmZvICppbmZv KQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9CisJCWt6YWxsb2Mo c2l6ZW9mKHN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSksIEdGUF9LRVJORUwpOworCisJaWYg KCFwcml2YXRlKQorCQlyZXR1cm4gLUVOT01FTTsKKworCW11dGV4X2luaXQoJnByaXZhdGUtPnVz Yl9tdXRleCk7CisJbXV0ZXhfaW5pdCgmcHJpdmF0ZS0+ZGF0YV9tdXRleCk7CisJSU5JVF9ERUxB WUVEX1dPUksoJnByaXZhdGUtPndvcmssIHNjYXJsZXR0Ml9jb25maWdfc2F2ZV93b3JrKTsKKwlw cml2YXRlLT5pbmZvID0gaW5mbzsKKwlwcml2YXRlLT5udW1fbXV4X3NyY3MgPSBzY2FybGV0dDJf Y291bnRfbXV4X3NyY3MoaW5mby0+cG9ydHMpOworCXByaXZhdGUtPnNjYXJsZXR0Ml9zZXEgPSAw OworCXByaXZhdGUtPm1peGVyID0gbWl4ZXI7CisJbWl4ZXItPnByaXZhdGVfZGF0YSA9IHByaXZh dGU7CisJbWl4ZXItPnByaXZhdGVfZnJlZSA9IHNjYXJsZXR0Ml9wcml2YXRlX2ZyZWU7CisJbWl4 ZXItPnByaXZhdGVfc3VzcGVuZCA9IHNjYXJsZXR0Ml9wcml2YXRlX3N1c3BlbmQ7CisKKwkvKiBT ZXR1cCBkZWZhdWx0IHJvdXRpbmcgKi8KKwlzY2FybGV0dDJfaW5pdF9yb3V0aW5nKHByaXZhdGUt Pm11eCwgaW5mby0+cG9ydHMpOworCisJLyogSW5pdGlhbGlzZSB0aGUgc2VxdWVuY2UgbnVtYmVy IHVzZWQgZm9yIHRoZSBwcm9wcmlldGFyeSBjb21tYW5kcyAqLworCXJldHVybiBzY2FybGV0dDJf dXNiKG1peGVyLCBTQ0FSTEVUVDJfVVNCX0lOSVRfU0VRLCBOVUxMLCAwLCBOVUxMLCAwKTsKK30K KworLyogUmVhZCBsaW5lLWluIGNvbmZpZyBhbmQgbGluZS1vdXQgdm9sdW1lIHNldHRpbmdzIG9u IHN0YXJ0ICovCitzdGF0aWMgaW50IHNjYXJsZXR0Ml9yZWFkX2NvbmZpZ3Moc3RydWN0IHVzYl9t aXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVjdCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAq cHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9k ZXZpY2VfaW5mbyAqaW5mbyA9IHByaXZhdGUtPmluZm87CisJY29uc3Qgc3RydWN0IHNjYXJsZXR0 Ml9wb3J0cyAqcG9ydHMgPSBpbmZvLT5wb3J0czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9y dHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9BTkFMT0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07 CisJdTggbGV2ZWxfc3dpdGNoZXNbU0NBUkxFVFQyX0xFVkVMX1NXSVRDSF9NQVhdOworCXU4IHBh ZF9zd2l0Y2hlc1tTQ0FSTEVUVDJfUEFEX1NXSVRDSF9NQVhdOworCXN0cnVjdCBzY2FybGV0dDJf dXNiX3ZvbHVtZV9zdGF0dXMgdm9sdW1lX3N0YXR1czsKKwlpbnQgZXJyLCBpOworCisJaWYgKGlu Zm8tPmxldmVsX2lucHV0X2NvdW50KSB7CisJCWVyciA9IHNjYXJsZXR0Ml91c2JfZ2V0X2NvbmZp ZygKKwkJCW1peGVyLAorCQkJU0NBUkxFVFQyX0NPTkZJR19MRVZFTF9TV0lUQ0gsCisJCQlpbmZv LT5sZXZlbF9pbnB1dF9jb3VudCwKKwkJCWxldmVsX3N3aXRjaGVzKTsKKwkJaWYgKGVyciA8IDAp CisJCQlyZXR1cm4gZXJyOworCQlmb3IgKGkgPSAwOyBpIDwgaW5mby0+bGV2ZWxfaW5wdXRfY291 bnQ7IGkrKykKKwkJCXByaXZhdGUtPmxldmVsX3N3aXRjaFtpXSA9IGxldmVsX3N3aXRjaGVzW2ld OworCX0KKworCWlmIChpbmZvLT5wYWRfaW5wdXRfY291bnQpIHsKKwkJZXJyID0gc2NhcmxldHQy X3VzYl9nZXRfY29uZmlnKAorCQkJbWl4ZXIsCisJCQlTQ0FSTEVUVDJfQ09ORklHX1BBRF9TV0lU Q0gsCisJCQlpbmZvLT5wYWRfaW5wdXRfY291bnQsCisJCQlwYWRfc3dpdGNoZXMpOworCQlpZiAo ZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJCWZvciAoaSA9IDA7IGkgPCBpbmZvLT5wYWRfaW5w dXRfY291bnQ7IGkrKykKKwkJCXByaXZhdGUtPnBhZF9zd2l0Y2hbaV0gPSBwYWRfc3dpdGNoZXNb aV07CisJfQorCisJZXJyID0gc2NhcmxldHQyX3VzYl9nZXRfdm9sdW1lX3N0YXR1cyhtaXhlciwg JnZvbHVtZV9zdGF0dXMpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJcHJpdmF0 ZS0+bWFzdGVyX3ZvbCA9IGNsYW1wKAorCQl2b2x1bWVfc3RhdHVzLm1hc3Rlcl92b2wgKyBTQ0FS TEVUVDJfVk9MVU1FX0JJQVMsCisJCTAsIFNDQVJMRVRUMl9WT0xVTUVfQklBUyk7CisKKwlmb3Ig KGkgPSAwOyBpIDwgbnVtX2xpbmVfb3V0OyBpKyspIHsKKwkJaW50IHZvbHVtZTsKKworCQlwcml2 YXRlLT52b2xfc3dfaHdfc3dpdGNoW2ldID0KKwkJCWluZm8tPmxpbmVfb3V0X2h3X3ZvbAorCQkJ CSYmIHZvbHVtZV9zdGF0dXMuc3dfaHdfc3dpdGNoW2ldOworCisJCXZvbHVtZSA9IHByaXZhdGUt PnZvbF9zd19od19zd2l0Y2hbaV0KKwkJCSAgID8gdm9sdW1lX3N0YXR1cy5tYXN0ZXJfdm9sCisJ CQkgICA6IHZvbHVtZV9zdGF0dXMuc3dfdm9sW2ldOworCQl2b2x1bWUgPSBjbGFtcCh2b2x1bWUg KyBTQ0FSTEVUVDJfVk9MVU1FX0JJQVMsCisJCQkgICAgICAgMCwgU0NBUkxFVFQyX1ZPTFVNRV9C SUFTKTsKKwkJcHJpdmF0ZS0+dm9sW2ldID0gdm9sdW1lOworCX0KKworCWZvciAoaSA9IDA7IGkg PCBpbmZvLT5idXR0b25fY291bnQ7IGkrKykKKwkJcHJpdmF0ZS0+YnV0dG9uc1tpXSA9ICEhdm9s dW1lX3N0YXR1cy5idXR0b25zW2ldOworCisJcmV0dXJuIDA7Cit9CisKKy8qIE5vdGlmeSBvbiB2 b2x1bWUgY2hhbmdlICovCitzdGF0aWMgdm9pZCBzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3Zv bF9jaGFuZ2UoCisJc3RydWN0IHVzYl9taXhlcl9pbnRlcmZhY2UgKm1peGVyKQoreworCXN0cnVj dCBzY2FybGV0dDJfbWl4ZXJfZGF0YSAqcHJpdmF0ZSA9IG1peGVyLT5wcml2YXRlX2RhdGE7CisJ Y29uc3Qgc3RydWN0IHNjYXJsZXR0Ml9wb3J0cyAqcG9ydHMgPSBwcml2YXRlLT5pbmZvLT5wb3J0 czsKKwlpbnQgbnVtX2xpbmVfb3V0ID0KKwkJcG9ydHNbU0NBUkxFVFQyX1BPUlRfVFlQRV9BTkFM T0dVRV0ubnVtW1NDQVJMRVRUMl9QT1JUX09VVF07CisJaW50IGk7CisKKwlwcml2YXRlLT52b2xf dXBkYXRlZCA9IDE7CisKKwlzbmRfY3RsX25vdGlmeShtaXhlci0+Y2hpcC0+Y2FyZCwgU05EUlZf Q1RMX0VWRU5UX01BU0tfVkFMVUUsCisJCSAgICAgICAmcHJpdmF0ZS0+bWFzdGVyX3ZvbF9jdGwt PmlkKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fbGluZV9vdXQ7IGkrKykgeworCQlpZiAoIXBy aXZhdGUtPnZvbF9zd19od19zd2l0Y2hbaV0pCisJCQljb250aW51ZTsKKwkJc25kX2N0bF9ub3Rp ZnkobWl4ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAg ICAgICZwcml2YXRlLT52b2xfY3Rsc1tpXS0+aWQpOworCX0KK30KKworLyogTm90aWZ5IG9uIGJ1 dHRvbiBjaGFuZ2UgKi8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHRfYnV0 dG9uX2NoYW5nZSgKKwlzdHJ1Y3QgdXNiX21peGVyX2ludGVyZmFjZSAqbWl4ZXIpCit7CisJc3Ry dWN0IHNjYXJsZXR0Ml9taXhlcl9kYXRhICpwcml2YXRlID0gbWl4ZXItPnByaXZhdGVfZGF0YTsK KwlpbnQgaTsKKworCXByaXZhdGUtPnZvbF91cGRhdGVkID0gMTsKKworCWZvciAoaSA9IDA7IGkg PCBwcml2YXRlLT5pbmZvLT5idXR0b25fY291bnQ7IGkrKykKKwkJc25kX2N0bF9ub3RpZnkobWl4 ZXItPmNoaXAtPmNhcmQsIFNORFJWX0NUTF9FVkVOVF9NQVNLX1ZBTFVFLAorCQkJICAgICAgICZw cml2YXRlLT5idXR0b25fY3Rsc1tpXS0+aWQpOworfQorCisvKiBJbnRlcnJ1cHQgY2FsbGJhY2sg Ki8KK3N0YXRpYyB2b2lkIHNjYXJsZXR0Ml9taXhlcl9pbnRlcnJ1cHQoc3RydWN0IHVyYiAqdXJi KQoreworCXN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlciA9IHVyYi0+Y29udGV4dDsK KwlpbnQgbGVuID0gdXJiLT5hY3R1YWxfbGVuZ3RoOworCWludCB1c3RhdHVzID0gdXJiLT5zdGF0 dXM7CisJdTMyIGRhdGE7CisKKwlpZiAodXN0YXR1cyAhPSAwKQorCQlnb3RvIHJlcXVldWU7CisK KwlpZiAobGVuID09IDgpIHsKKwkJZGF0YSA9IGxlMzJfdG9fY3B1KCoodTMyICopdXJiLT50cmFu c2Zlcl9idWZmZXIpOworCQlpZiAoZGF0YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX1ZPTF9D SEFOR0UpCisJCQlzY2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X3ZvbF9jaGFuZ2UobWl4ZXIpOwor CQlpZiAoZGF0YSAmIFNDQVJMRVRUMl9VU0JfSU5URVJSVVBUX0JVVFRPTl9DSEFOR0UpCisJCQlz Y2FybGV0dDJfbWl4ZXJfaW50ZXJydXB0X2J1dHRvbl9jaGFuZ2UobWl4ZXIpOworCX0gZWxzZSB7 CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkgICAgICAic2NhcmxldHQgbWl4ZXIg aW50ZXJydXB0IGxlbmd0aCAlZFxuIiwgbGVuKTsKKwl9CisKK3JlcXVldWU6CisJaWYgKHVzdGF0 dXMgIT0gLUVOT0VOVCAmJgorCSAgICB1c3RhdHVzICE9IC1FQ09OTlJFU0VUICYmCisJICAgIHVz dGF0dXMgIT0gLUVTSFVURE9XTikgeworCQl1cmItPmRldiA9IG1peGVyLT5jaGlwLT5kZXY7CisJ CXVzYl9zdWJtaXRfdXJiKHVyYiwgR0ZQX0FUT01JQyk7CisJfQorfQorCitzdGF0aWMgaW50IHNj YXJsZXR0Ml9taXhlcl9zdGF0dXNfY3JlYXRlKHN0cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICpt aXhlcikKK3sKKwlzdHJ1Y3QgdXNiX2RldmljZSAqZGV2ID0gbWl4ZXItPmNoaXAtPmRldjsKKwl1 bnNpZ25lZCBpbnQgcGlwZSA9IHVzYl9yY3ZpbnRwaXBlKGRldiwKKwkJCQkJICAgU0NBUkxFVFQy X1VTQl9JTlRFUlJVUFRfRU5EUE9JTlQpOworCXZvaWQgKnRyYW5zZmVyX2J1ZmZlcjsKKworCWlm IChtaXhlci0+dXJiKSB7CisJCXVzYl9hdWRpb19lcnIobWl4ZXItPmNoaXAsCisJCQkgICAgICAi JXM6IG1peGVyIHVyYiBhbHJlYWR5IGluIHVzZSFcbiIsIF9fZnVuY19fKTsKKwkJcmV0dXJuIDA7 CisJfQorCisJaWYgKHNuZF91c2JfcGlwZV9zYW5pdHlfY2hlY2soZGV2LCBwaXBlKSkKKwkJcmV0 dXJuIC1FSU5WQUw7CisKKwltaXhlci0+dXJiID0gdXNiX2FsbG9jX3VyYigwLCBHRlBfS0VSTkVM KTsKKwlpZiAoIW1peGVyLT51cmIpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhbnNmZXJfYnVm ZmVyID0ga21hbGxvYyhTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9NQVhfREFUQSwgR0ZQX0tFUk5F TCk7CisJaWYgKCF0cmFuc2Zlcl9idWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJdXNiX2Zp bGxfaW50X3VyYihtaXhlci0+dXJiLCBkZXYsIHBpcGUsCisJCQkgdHJhbnNmZXJfYnVmZmVyLCBT Q0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9NQVhfREFUQSwKKwkJCSBzY2FybGV0dDJfbWl4ZXJfaW50 ZXJydXB0LCBtaXhlciwKKwkJCSBTQ0FSTEVUVDJfVVNCX0lOVEVSUlVQVF9JTlRFUlZBTCk7CisK KwlyZXR1cm4gdXNiX3N1Ym1pdF91cmIobWl4ZXItPnVyYiwgR0ZQX0tFUk5FTCk7Cit9CisKKy8q IEVudHJ5IHBvaW50ICovCitpbnQgc25kX3NjYXJsZXR0X2dlbjJfY29udHJvbHNfY3JlYXRlKHN0 cnVjdCB1c2JfbWl4ZXJfaW50ZXJmYWNlICptaXhlcikKK3sKKwljb25zdCBzdHJ1Y3Qgc2Nhcmxl dHQyX2RldmljZV9pbmZvICppbmZvOworCWludCBlcnI7CisKKwkvKiBvbmx5IHVzZSBVQUNfVkVS U0lPTl8yICovCisJaWYgKCFtaXhlci0+cHJvdG9jb2wpCisJCXJldHVybiAwOworCisJc3dpdGNo IChtaXhlci0+Y2hpcC0+dXNiX2lkKSB7CisJY2FzZSBVU0JfSUQoMHgxMjM1LCAweDgyMDMpOgor CQlpbmZvID0gJnM2aTZfZ2VuMl9pbmZvOworCQlicmVhazsKKwljYXNlIFVTQl9JRCgweDEyMzUs IDB4ODIwNCk6CisJCWluZm8gPSAmczE4aThfZ2VuMl9pbmZvOworCQlicmVhazsKKwljYXNlIFVT Ql9JRCgweDEyMzUsIDB4ODIwMSk6CisJCWluZm8gPSAmczE4aTIwX2dlbjJfaW5mbzsKKwkJYnJl YWs7CisJZGVmYXVsdDogLyogZGV2aWNlIG5vdCAoeWV0KSBzdXBwb3J0ZWQgKi8KKwkJcmV0dXJu IC1FSU5WQUw7CisJfQorCisJaWYgKCEobWl4ZXItPmNoaXAtPnNldHVwICYgU0NBUkxFVFQyX0VO QUJMRSkpIHsKKwkJdXNiX2F1ZGlvX2VycihtaXhlci0+Y2hpcCwKKwkJCSJGb2N1c3JpdGUgU2Nh cmxldHQgR2VuIDIgTWl4ZXIgRHJpdmVyIGRpc2FibGVkOyAiCisJCQkidXNlIG9wdGlvbnMgc25k X3VzYl9hdWRpbyBkZXZpY2Vfc2V0dXA9MSAiCisJCQkidG8gZW5hYmxlIGFuZCByZXBvcnQgYW55 IGlzc3VlcyB0byBnQGI0LnZ1Iik7CisJCXJldHVybiAwOworCX0KKworCS8qIEluaXRpYWxpc2Ug cHJpdmF0ZSBkYXRhLCByb3V0aW5nLCBzZXF1ZW5jZSBudW1iZXIgKi8KKwllcnIgPSBzY2FybGV0 dDJfaW5pdF9wcml2YXRlKG1peGVyLCBpbmZvKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVy cjsKKworCS8qIFJlYWQgdm9sdW1lIGxldmVscyBhbmQgY29udHJvbHMgZnJvbSB0aGUgaW50ZXJm YWNlICovCisJZXJyID0gc2NhcmxldHQyX3JlYWRfY29uZmlncyhtaXhlcik7CisJaWYgKGVyciA8 IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhlIGFuYWxvZ3VlIG91dHB1dCBjb250 cm9scyAqLworCWVyciA9IHNjYXJsZXR0Ml9hZGRfbGluZV9vdXRfY3RscyhtaXhlcik7CisJaWYg KGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkvKiBDcmVhdGUgdGhlIGFuYWxvZ3VlIGlucHV0 IGNvbnRyb2xzICovCisJZXJyID0gc2NhcmxldHQyX2FkZF9saW5lX2luX2N0bHMobWl4ZXIpOwor CWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyogQ3JlYXRlIHRoZSBpbnB1dCwgb3V0 cHV0LCBhbmQgbWl4ZXIgbXV4IGlucHV0IHNlbGVjdGlvbnMgKi8KKwllcnIgPSBzY2FybGV0dDJf YWRkX211eF9lbnVtcyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkv KiBDcmVhdGUgdGhlIG1hdHJpeCBtaXhlciBjb250cm9scyAqLworCWVyciA9IHNjYXJsZXR0Ml9h ZGRfbWl4ZXJfY3RscyhtaXhlcik7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwkv KiBDcmVhdGUgdGhlIGxldmVsIG1ldGVyIGNvbnRyb2xzICovCisJZXJyID0gc2NhcmxldHQyX2Fk ZF9tZXRlcl9jdGwobWl4ZXIpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJLyog U2V0IHVwIHRoZSBpbnRlcnJ1cHQgcG9sbGluZyBpZiB0aGVyZSBhcmUgaGFyZHdhcmUgYnV0dG9u cyAqLworCWlmIChpbmZvLT5idXR0b25fY291bnQpIHsKKwkJZXJyID0gc2NhcmxldHQyX21peGVy X3N0YXR1c19jcmVhdGUobWl4ZXIpOworCQlpZiAoZXJyIDwgMCkKKwkJCXJldHVybiBlcnI7CisJ fQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zb3VuZC91c2IvbWl4ZXJfc2NhcmxldHRf Z2VuMi5oIGIvc291bmQvdXNiL21peGVyX3NjYXJsZXR0X2dlbjIuaApuZXcgZmlsZSBtb2RlIDEw MDY0NAppbmRleCAwMDAwMDAwMDAwMDAuLjUyZTFkYWQ3N2FmZAotLS0gL2Rldi9udWxsCisrKyBi L3NvdW5kL3VzYi9taXhlcl9zY2FybGV0dF9nZW4yLmgKQEAgLTAsMCArMSw3IEBACisvKiBTUERY LUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCAqLworI2lmbmRlZiBfX1VTQl9NSVhFUl9TQ0FS TEVUVF9HRU4yX0gKKyNkZWZpbmUgX19VU0JfTUlYRVJfU0NBUkxFVFRfR0VOMl9ICisKK2ludCBz bmRfc2NhcmxldHRfZ2VuMl9jb250cm9sc19jcmVhdGUoc3RydWN0IHVzYl9taXhlcl9pbnRlcmZh Y2UgKm1peGVyKTsKKworI2VuZGlmIC8qIF9fVVNCX01JWEVSX1NDQVJMRVRUX0dFTjJfSCAqLwpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpBbHNhLWRldmVs IG1haWxpbmcgbGlzdApBbHNhLWRldmVsQGFsc2EtcHJvamVjdC5vcmcKaHR0cHM6Ly9tYWlsbWFu LmFsc2EtcHJvamVjdC5vcmcvbWFpbG1hbi9saXN0aW5mby9hbHNhLWRldmVsCg==