From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id E20BDC04FE1 for ; Wed, 16 Aug 2023 18:06:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:From:References:To:Subject:MIME-Version: Date:Message-ID:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=MKCJT5rYFHEleDJmLufhikI4VzaRpW77UafUwVFJHY8=; b=cFfPCyVophK0vooI6jYGZWKvn9 wF0hr0qYLV7a2aLwjtED5ikQMB9NsN9i3wkCwyqG/BpJCfte/9twfErNWM3cPO6++IKB+kRzBFDV0 e05OYW0uLy9si7AYygddNo1RrSEgXKMXbd6kt06rnsTdZS59VVtN3wZNWnEPOTYdz0jiW0JaRrgTW DZusbJ4/beJq4elJYDLqeff0a+1bukik2x72jXEPZaDhsGmuPCNLTKd3Pw9bMk6XHcDG3zvQ419pP MjaERB0HZK+hW+gPSvwjQS/NqALZ81p+DbB0TlDpmoghxLxW5NUF33EmWpbXiEZCVvionAqOChxU1 NBQ+7ODg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qWKuA-004l9o-05; Wed, 16 Aug 2023 18:06:02 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qWKu5-004l7W-0L for linux-riscv@lists.infradead.org; Wed, 16 Aug 2023 18:06:01 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 5DAD8D75; Wed, 16 Aug 2023 11:06:35 -0700 (PDT) Received: from [10.57.90.114] (unknown [10.57.90.114]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 8A7BC3F6C4; Wed, 16 Aug 2023 11:05:51 -0700 (PDT) Message-ID: <7e875daa-c2f3-7d03-d797-369762638897@arm.com> Date: Wed, 16 Aug 2023 19:05:47 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Thunderbird/102.14.0 Subject: Re: [PATCH 01/11] RISC-V: drivers/iommu: Add RISC-V IOMMU - Ziommu support. To: Tomasz Jeznach , Joerg Roedel , Will Deacon , Paul Walmsley References: Content-Language: en-GB From: Robin Murphy In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230816_110557_293157_56FF3D7A X-CRM114-Status: GOOD ( 35.09 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Anup Patel , Albert Ou , linux@rivosinc.com, linux-kernel@vger.kernel.org, Sebastien Boeuf , iommu@lists.linux.dev, Palmer Dabbelt , Nick Kossifidis , linux-riscv@lists.infradead.org Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org T24gMjAyMy0wNy0xOSAyMDozMywgVG9tYXN6IEplem5hY2ggd3JvdGU6Cj4gVGhlIHBhdGNoIGlu dHJvZHVjZXMgc2tlbGV0b24gSU9NTVUgZGV2aWNlIGRyaXZlciBpbXBsZW1lbnRhdGlvbiBhcyBk ZWZpbmVkCj4gYnkgUklTQy1WIElPTU1VIEFyY2hpdGVjdHVyZSBTcGVjaWZpY2F0aW9uLCBWZXJz aW9uIDEuMCBbMV0sIHdpdGggbWluaW1hbCBzdXBwb3J0Cj4gZm9yIHBhc3MtdGhyb3VnaCBtYXBw aW5nLCBiYXNpYyBpbml0aWFsaXphdGlvbiBhbmQgYmluZGluZ3MgZm9yIHBsYXRmb3JtIGFuZCBQ Q0llCj4gaGFyZHdhcmUgaW1wbGVtZW50YXRpb25zLgo+IAo+IFNlcmllcyBvZiBwYXRjaGVzIGZv bGxvd2luZyBzcGVjaWZpY2F0aW9uIGV2b2x1dGlvbiBoYXMgYmVlbiByZW9yZ2FuaXplZCB0byBw cm92aWRlCj4gZnVuY3Rpb25hbCBzZXBhcmF0aW9uIG9mIGltcGxlbWVudGVkIGJsb2NrcywgY29t cGxpYW50IHdpdGggcmF0aWZpZWQgc3BlY2lmaWNhdGlvbi4KPiAKPiBUaGlzIGFuZCBmb2xsb3dp bmcgcGF0Y2ggc2VyaWVzIGluY2x1ZGVzIGNvZGUgY29udHJpYnV0ZWQgYnk6IE5pY2sgS29zc2lm aWRpcwo+IDxtaWNrQGljcy5mb3J0aC5ncj4gKGlvbW11LXBsYXRmb3JtIGRldmljZSwgbnVtYmVy IG9mIHNwZWNpZmljYXRpb24gY2xhcmlmaWNhdGlvbgo+IGFuZCBidWdmaXhlcyBhbmQgcmVhZGFi aWxpdHkgaW1wcm92ZW1lbnRzKSwgU2ViYXN0aWVuIEJvZXVmIDxzZWJAcml2b3NpbmMuY29tPiAo cGFnZQo+IHRhYmxlIGNyZWF0aW9uLCBBVFMvUEdSIGZsb3cpLgo+IAo+IENvbXBsZXRlIGhpc3Rv cnkgY2FuIGJlIGZvdW5kIGF0IHRoZSBtYWludGFpbmVyJ3MgcmVwb3NpdG9yeSBicmFuY2ggWzJd Lgo+IAo+IERldmljZSBkcml2ZXIgZW5hYmxlcyBSSVNDLVYgMzIvNjQgc3VwcG9ydCBmb3IgbWVt b3J5IHRyYW5zbGF0aW9uIGZvciBETUEgY2FwYWJsZQo+IFBDSSBhbmQgcGxhdGZvcm0gZGV2aWNl cywgbXVsdGlsZXZlbCBkZXZpY2UgZGlyZWN0b3J5IHRhYmxlLCBwcm9jZXNzIGRpcmVjdG9yeSwK PiBzaGFyZWQgdmlydHVhbCBhZGRyZXNzIHN1cHBvcnQsIHdpcmVkIGFuZCBtZXNzYWdlIHNpZ25h bGVkIGludGVycnVwdCBmb3IgdHJhbnNsYXRpb24KPiBJL08gZmF1bHQsIHBhZ2UgcmVxdWVzdCBp bnRlcmZhY2UgYW5kIGNvbW1hbmQgcHJvY2Vzc2luZy4KPiAKPiBNYXRjaGluZyBSSVNDVi1WIElP TU1VIGRldmljZSBlbXVsYXRpb24gaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIGZvciBRRU1V IHByb2plY3QsCj4gYWxvbmcgd2l0aCBlZHVjYXRpb25hbCBkZXZpY2UgZXh0ZW5zaW9ucyBmb3Ig UEFTSUQgQVRTL1BSSSBzdXBwb3J0IFszXS4KPiAKPiBSZWZlcmVuY2VzOgo+ICAgLSBbMV0gaHR0 cHM6Ly9naXRodWIuY29tL3Jpc2N2LW5vbi1pc2EvcmlzY3YtaW9tbXUKPiAgIC0gWzJdIGh0dHBz Oi8vZ2l0aHViLmNvbS90amV6bmFjaC9saW51eC90cmVlL3RqZXpuYWNoL3Jpc2N2LWlvbW11Cj4g ICAtIFszXSBodHRwczovL2dpdGh1Yi5jb20vdGplem5hY2gvcWVtdS90cmVlL3RqZXpuYWNoL3Jp c2N2LWlvbW11Cj4gCj4gQ28tZGV2ZWxvcGVkLWJ5OiBOaWNrIEtvc3NpZmlkaXMgPG1pY2tAaWNz LmZvcnRoLmdyPgo+IFNpZ25lZC1vZmYtYnk6IE5pY2sgS29zc2lmaWRpcyA8bWlja0BpY3MuZm9y dGguZ3I+Cj4gQ28tZGV2ZWxvcGVkLWJ5OiBTZWJhc3RpZW4gQm9ldWYgPHNlYkByaXZvc2luYy5j b20+Cj4gU2lnbmVkLW9mZi1ieTogU2ViYXN0aWVuIEJvZXVmIDxzZWJAcml2b3NpbmMuY29tPgo+ IFNpZ25lZC1vZmYtYnk6IFRvbWFzeiBKZXpuYWNoIDx0amV6bmFjaEByaXZvc2luYy5jb20+Cj4g LS0tCj4gICBkcml2ZXJzL2lvbW11L0tjb25maWcgICAgICAgICAgICAgICAgfCAgIDEgKwo+ICAg ZHJpdmVycy9pb21tdS9NYWtlZmlsZSAgICAgICAgICAgICAgIHwgICAyICstCj4gICBkcml2ZXJz L2lvbW11L3Jpc2N2L0tjb25maWcgICAgICAgICAgfCAgMjIgKwo+ICAgZHJpdmVycy9pb21tdS9y aXNjdi9NYWtlZmlsZSAgICAgICAgIHwgICAxICsKPiAgIGRyaXZlcnMvaW9tbXUvcmlzY3YvaW9t bXUtYml0cy5oICAgICB8IDcwNCArKysrKysrKysrKysrKysrKysrKysrKysrKysKPiAgIGRyaXZl cnMvaW9tbXUvcmlzY3YvaW9tbXUtcGNpLmMgICAgICB8IDEzNCArKysrKwo+ICAgZHJpdmVycy9p b21tdS9yaXNjdi9pb21tdS1wbGF0Zm9ybS5jIHwgIDk0ICsrKysKPiAgIGRyaXZlcnMvaW9tbXUv cmlzY3YvaW9tbXUuYyAgICAgICAgICB8IDY2MCArKysrKysrKysrKysrKysrKysrKysrKysrCj4g ICBkcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LmggICAgICAgICAgfCAxMTUgKysrKysKPiAgIDkg ZmlsZXMgY2hhbmdlZCwgMTczMiBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4gICBjcmVh dGUgbW9kZSAxMDA2NDQgZHJpdmVycy9pb21tdS9yaXNjdi9LY29uZmlnCj4gICBjcmVhdGUgbW9k ZSAxMDA2NDQgZHJpdmVycy9pb21tdS9yaXNjdi9NYWtlZmlsZQo+ICAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUtYml0cy5oCj4gICBjcmVhdGUgbW9kZSAxMDA2 NDQgZHJpdmVycy9pb21tdS9yaXNjdi9pb21tdS1wY2kuYwo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0 IGRyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUtcGxhdGZvcm0uYwo+ICAgY3JlYXRlIG1vZGUgMTAw NjQ0IGRyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUuYwo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRy aXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUuaAo+IAo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11 L0tjb25maWcgYi9kcml2ZXJzL2lvbW11L0tjb25maWcKPiBpbmRleCAyYjEyYjU4M2VmNGIuLjM2 ZmNjNmZkNWI0ZSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2lvbW11L0tjb25maWcKPiArKysgYi9k cml2ZXJzL2lvbW11L0tjb25maWcKPiBAQCAtMTg3LDYgKzE4Nyw3IEBAIGNvbmZpZyBNU01fSU9N TVUKPiAgIHNvdXJjZSAiZHJpdmVycy9pb21tdS9hbWQvS2NvbmZpZyIKPiAgIHNvdXJjZSAiZHJp dmVycy9pb21tdS9pbnRlbC9LY29uZmlnIgo+ICAgc291cmNlICJkcml2ZXJzL2lvbW11L2lvbW11 ZmQvS2NvbmZpZyIKPiArc291cmNlICJkcml2ZXJzL2lvbW11L3Jpc2N2L0tjb25maWciCj4gICAK PiAgIGNvbmZpZyBJUlFfUkVNQVAKPiAgIAlib29sICJTdXBwb3J0IGZvciBJbnRlcnJ1cHQgUmVt YXBwaW5nIgo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L01ha2VmaWxlIGIvZHJpdmVycy9p b21tdS9NYWtlZmlsZQo+IGluZGV4IDc2OWU0M2Q3ODBjZS4uOGY1NzExMGE5ZmIxIDEwMDY0NAo+ IC0tLSBhL2RyaXZlcnMvaW9tbXUvTWFrZWZpbGUKPiArKysgYi9kcml2ZXJzL2lvbW11L01ha2Vm aWxlCj4gQEAgLTEsNSArMSw1IEBACj4gICAjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wCj4gLW9iai15ICs9IGFtZC8gaW50ZWwvIGFybS8gaW9tbXVmZC8KPiArb2JqLXkgKz0gYW1k LyBpbnRlbC8gYXJtLyBpb21tdWZkLyByaXNjdi8KPiAgIG9iai0kKENPTkZJR19JT01NVV9BUEkp ICs9IGlvbW11Lm8KPiAgIG9iai0kKENPTkZJR19JT01NVV9BUEkpICs9IGlvbW11LXRyYWNlcy5v Cj4gICBvYmotJChDT05GSUdfSU9NTVVfQVBJKSArPSBpb21tdS1zeXNmcy5vCj4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvaW9tbXUvcmlzY3YvS2NvbmZpZyBiL2RyaXZlcnMvaW9tbXUvcmlzY3YvS2Nv bmZpZwo+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gaW5kZXggMDAwMDAwMDAwMDAwLi4wMWQ0MDQz ODQ5ZDQKPiAtLS0gL2Rldi9udWxsCj4gKysrIGIvZHJpdmVycy9pb21tdS9yaXNjdi9LY29uZmln Cj4gQEAgLTAsMCArMSwyMiBAQAo+ICsjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4w LW9ubHkKPiArIyBSSVNDLVYgSU9NTVUgc3VwcG9ydAo+ICsKPiArY29uZmlnIFJJU0NWX0lPTU1V Cj4gKwlib29sICJSSVNDLVYgSU9NTVUgZHJpdmVyIgo+ICsJZGVwZW5kcyBvbiBSSVNDVgo+ICsJ c2VsZWN0IElPTU1VX0FQSQo+ICsJc2VsZWN0IElPTU1VX0RNQQoKTm8uIFNlZSBjb21taXQgZGU5 ZjhhOTFlYjMyLgoKPiArCXNlbGVjdCBJT01NVV9TVkEKPiArCXNlbGVjdCBJT01NVV9JT1ZBCgpO by4KCj4gKwlzZWxlY3QgSU9NTVVfSU9fUEdUQUJMRQoKRG8geW91IGFudGljaXBhdGUgbmVlZGlu ZyB0byBzdXBwb3J0IG11bHRpcGxlIHBhZ2V0YWJsZSBmb3JtYXRzLCBvciAKc2hhcmluZyB0aGlz IGZvcm1hdCB3aXRoIG90aGVyIGRyaXZlcnM/IElmIG5vdCwgSSdkIHVzdWFsbHkgc3VnZ2VzdCAK YXZvaWRpbmcgdGhlIG92ZXJoZWFkIG9mIGlvLXBndGFibGUuCgo+ICsJc2VsZWN0IElPQVNJRAoK RG9lc24ndCBleGlzdC4KCj4gKwlzZWxlY3QgUENJX01TSQoKQWxyZWFkeSBzZWxlY3RlZCBhdCB0 aGUgYXJjaCBsZXZlbCwgZG9lcyBpdCByZWFsbHkgbmVlZCByZXNlbGVjdGluZyBoZXJlPwoKPiAr CXNlbGVjdCBQQ0lfQVRTCj4gKwlzZWxlY3QgUENJX1BSSQo+ICsJc2VsZWN0IFBDSV9QQVNJRAo+ ICsJc2VsZWN0IE1NVV9OT1RJRklFUgo+ICsJaGVscAo+ICsJICBTdXBwb3J0IGZvciBkZXZpY2Vz IGZvbGxvd2luZyBSSVNDLVYgSU9NTVUgc3BlY2lmaWNhdGlvbi4KPiArCj4gKwkgIElmIHVuc3Vy ZSwgc2F5IE4gaGVyZS4KPiArClsuLi5dCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW9tbXUvcmlz Y3YvaW9tbXUtcGNpLmMgYi9kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LXBjaS5jCj4gbmV3IGZp bGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAwMDAuLmM5MWY5NjNkN2EyOQo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LXBjaS5jCj4gQEAgLTAs MCArMSwxMzQgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ ICsKPiArLyoKPiArICogQ29weXJpZ2h0IMKpIDIwMjItMjAyMyBSaXZvcyBJbmMuCj4gKyAqIENv cHlyaWdodCDCqSAyMDIzIEZPUlRILUlDUy9DQVJWCj4gKyAqCj4gKyAqIFJJU0NWIElPTU1VIGFz IGEgUENJZSBkZXZpY2UKPiArICoKPiArICogQXV0aG9ycwo+ICsgKglUb21hc3ogSmV6bmFjaCA8 dGplem5hY2hAcml2b3NpbmMuY29tPgo+ICsgKglOaWNrIEtvc3NpZmlkaXMgPG1pY2tAaWNzLmZv cnRoLmdyPgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1 ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L3BjaS5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ICsjaW5jbHVk ZSA8bGludXgvaW9tbXUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2JpdGZpZWxkLmg+Cj4gKwo+ICsj aW5jbHVkZSAiaW9tbXUuaCIKPiArCj4gKy8qIFJpdm9zIEluYy4gYXNzaWduZWQgUENJIFZlbmRv ciBhbmQgRGV2aWNlIElEcyAqLwo+ICsjaWZuZGVmIFBDSV9WRU5ET1JfSURfUklWT1MKPiArI2Rl ZmluZSBQQ0lfVkVORE9SX0lEX1JJVk9TICAgICAgICAgICAgIDB4MWVmZAo+ICsjZW5kaWYKPiAr Cj4gKyNpZm5kZWYgUENJX0RFVklDRV9JRF9SSVZPU19JT01NVQo+ICsjZGVmaW5lIFBDSV9ERVZJ Q0VfSURfUklWT1NfSU9NTVUgICAgICAgMHhlZGYxCj4gKyNlbmRpZgo+ICsKPiArc3RhdGljIGlu dCByaXNjdl9pb21tdV9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVj dCBwY2lfZGV2aWNlX2lkICplbnQpCj4gK3sKPiArCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZwZGV2 LT5kZXY7Cj4gKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfZGV2aWNlICppb21tdTsKPiArCWludCByZXQ7 Cj4gKwo+ICsJcmV0ID0gcGNpX2VuYWJsZV9kZXZpY2VfbWVtKHBkZXYpOwo+ICsJaWYgKHJldCA8 IDApCj4gKwkJcmV0dXJuIHJldDsKPiArCj4gKwlyZXQgPSBwY2lfcmVxdWVzdF9tZW1fcmVnaW9u cyhwZGV2LCBLQlVJTERfTU9ETkFNRSk7Cj4gKwlpZiAocmV0IDwgMCkKPiArCQlnb3RvIGZhaWw7 Cj4gKwo+ICsJcmV0ID0gLUVOT01FTTsKPiArCj4gKwlpb21tdSA9IGRldm1fa3phbGxvYyhkZXYs IHNpemVvZigqaW9tbXUpLCBHRlBfS0VSTkVMKTsKPiArCWlmICghaW9tbXUpCj4gKwkJZ290byBm YWlsOwo+ICsKPiArCWlmICghKHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCAwKSAmIElPUkVTT1VS Q0VfTUVNKSkKPiArCQlnb3RvIGZhaWw7Cj4gKwo+ICsJaWYgKHBjaV9yZXNvdXJjZV9sZW4ocGRl diwgMCkgPCBSSVNDVl9JT01NVV9SRUdfU0laRSkKPiArCQlnb3RvIGZhaWw7Cj4gKwo+ICsJaW9t bXUtPnJlZ19waHlzID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIDApOwo+ICsJaWYgKCFpb21t dS0+cmVnX3BoeXMpCj4gKwkJZ290byBmYWlsOwo+ICsKPiArCWlvbW11LT5yZWcgPSBkZXZtX2lv cmVtYXAoZGV2LCBpb21tdS0+cmVnX3BoeXMsIFJJU0NWX0lPTU1VX1JFR19TSVpFKTsKPiArCWlm ICghaW9tbXUtPnJlZykKPiArCQlnb3RvIGZhaWw7Cj4gKwo+ICsJaW9tbXUtPmRldiA9IGRldjsK PiArCWRldl9zZXRfZHJ2ZGF0YShkZXYsIGlvbW11KTsKPiArCj4gKwlkbWFfc2V0X21hc2tfYW5k X2NvaGVyZW50KGRldiwgRE1BX0JJVF9NQVNLKDY0KSk7Cj4gKwlwY2lfc2V0X21hc3RlcihwZGV2 KTsKPiArCj4gKwlyZXQgPSByaXNjdl9pb21tdV9pbml0KGlvbW11KTsKPiArCWlmICghcmV0KQo+ ICsJCXJldHVybiByZXQ7Cj4gKwo+ICsgZmFpbDoKPiArCXBjaV9jbGVhcl9tYXN0ZXIocGRldik7 Cj4gKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwo+ICsJcGNpX2Rpc2FibGVfZGV2aWNlKHBk ZXYpOwo+ICsJLyogTm90ZTogZGV2cmVzX3JlbGVhc2VfYWxsKCkgd2lsbCByZWxlYXNlIGlvbW11 IGFuZCBpb21tdS0+cmVnICovCj4gKwlyZXR1cm4gcmV0Owo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9p ZCByaXNjdl9pb21tdV9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQo+ICt7Cj4gKwly aXNjdl9pb21tdV9yZW1vdmUoZGV2X2dldF9kcnZkYXRhKCZwZGV2LT5kZXYpKTsKPiArCXBjaV9j bGVhcl9tYXN0ZXIocGRldik7Cj4gKwlwY2lfcmVsZWFzZV9yZWdpb25zKHBkZXYpOwo+ICsJcGNp X2Rpc2FibGVfZGV2aWNlKHBkZXYpOwo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJpc2N2X2lvbW11 X3N1c3BlbmQoc3RydWN0IGRldmljZSAqZGV2KQo+ICt7Cj4gKwlkZXZfd2FybihkZXYsICJSSVND LVYgSU9NTVUgUE0gbm90IGltcGxlbWVudGVkIik7Cj4gKwlyZXR1cm4gLUVOT0RFVjsKPiArfQo+ ICsKPiArc3RhdGljIGludCByaXNjdl9pb21tdV9yZXN1bWUoc3RydWN0IGRldmljZSAqZGV2KQo+ ICt7Cj4gKwlkZXZfd2FybihkZXYsICJSSVNDLVYgSU9NTVUgUE0gbm90IGltcGxlbWVudGVkIik7 Cj4gKwlyZXR1cm4gLUVOT0RFVjsKPiArfQo+ICsKPiArc3RhdGljIERFRklORV9TSU1QTEVfREVW X1BNX09QUyhyaXNjdl9pb21tdV9wbV9vcHMsIHJpc2N2X2lvbW11X3N1c3BlbmQsCj4gKwkJCQly aXNjdl9pb21tdV9yZXN1bWUpOwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNl X2lkIHJpc2N2X2lvbW11X3BjaV90YmxbXSA9IHsKPiArCXtQQ0lfVkVORE9SX0lEX1JJVk9TLCBQ Q0lfREVWSUNFX0lEX1JJVk9TX0lPTU1VLAo+ICsJIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIDAs IDAsIDB9LAo+ICsJezAsfQo+ICt9Owo+ICsKPiArTU9EVUxFX0RFVklDRV9UQUJMRShwY2ksIHJp c2N2X2lvbW11X3BjaV90YmwpOwo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf aWQgcmlzY3ZfaW9tbXVfb2ZfbWF0Y2hbXSA9IHsKPiArCXsuY29tcGF0aWJsZSA9ICJyaXNjdixw Y2ktaW9tbXUiLH0sCj4gKwl7fSwKPiArfTsKPiArCj4gK01PRFVMRV9ERVZJQ0VfVEFCTEUob2Ys IHJpc2N2X2lvbW11X29mX21hdGNoKTsKPiArCj4gK3N0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBy aXNjdl9pb21tdV9wY2lfZHJpdmVyID0gewo+ICsJLm5hbWUgPSBLQlVJTERfTU9ETkFNRSwKPiAr CS5pZF90YWJsZSA9IHJpc2N2X2lvbW11X3BjaV90YmwsCj4gKwkucHJvYmUgPSByaXNjdl9pb21t dV9wY2lfcHJvYmUsCj4gKwkucmVtb3ZlID0gcmlzY3ZfaW9tbXVfcGNpX3JlbW92ZSwKPiArCS5k cml2ZXIgPSB7Cj4gKwkJICAgLnBtID0gcG1fc2xlZXBfcHRyKCZyaXNjdl9pb21tdV9wbV9vcHMp LAo+ICsJCSAgIC5vZl9tYXRjaF90YWJsZSA9IHJpc2N2X2lvbW11X29mX21hdGNoLAoKRG9lcyB0 aGF0IGV2ZW4gZG8gYW55dGhpbmcgZm9yIGEgUENJIGRyaXZlcj8KCkFsc28geW91J3JlIG1pc3Np bmcgc3VwcHJlc3NfYmluZF9hdHRycyBoZXJlLgoKPiArCQkgICB9LAo+ICt9Owo+ICsKPiArbW9k dWxlX2RyaXZlcihyaXNjdl9pb21tdV9wY2lfZHJpdmVyLCBwY2lfcmVnaXN0ZXJfZHJpdmVyLCBw Y2lfdW5yZWdpc3Rlcl9kcml2ZXIpOwo+IGRpZmYgLS1naXQgYS9kcml2ZXJzL2lvbW11L3Jpc2N2 L2lvbW11LXBsYXRmb3JtLmMgYi9kcml2ZXJzL2lvbW11L3Jpc2N2L2lvbW11LXBsYXRmb3JtLmMK PiBuZXcgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IDAwMDAwMDAwMDAwMC4uZTRlOGNhNjcxMWU3 Cj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2RyaXZlcnMvaW9tbXUvcmlzY3YvaW9tbXUtcGxhdGZv cm0uYwo+IEBAIC0wLDAgKzEsOTQgQEAKPiArLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQ TC0yLjAtb25seQo+ICsvKgo+ICsgKiBSSVNDLVYgSU9NTVUgYXMgYSBwbGF0Zm9ybSBkZXZpY2UK PiArICoKPiArICogQ29weXJpZ2h0IMKpIDIwMjMgRk9SVEgtSUNTL0NBUlYKPiArICoKPiArICog QXV0aG9yOiBOaWNrIEtvc3NpZmlkaXMgPG1pY2tAaWNzLmZvcnRoLmdyPgo+ICsgKi8KPiArCj4g KyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ ICsjaW5jbHVkZSA8bGludXgvb2ZfcGxhdGZvcm0uaD4KPiArI2luY2x1ZGUgPGxpbnV4L2JpdGZp ZWxkLmg+Cj4gKwo+ICsjaW5jbHVkZSAiaW9tbXUtYml0cy5oIgo+ICsjaW5jbHVkZSAiaW9tbXUu aCIKPiArCj4gK3N0YXRpYyBpbnQgcmlzY3ZfaW9tbXVfcGxhdGZvcm1fcHJvYmUoc3RydWN0IHBs YXRmb3JtX2RldmljZSAqcGRldikKPiArewo+ICsJc3RydWN0IGRldmljZSAqZGV2ID0gJnBkZXYt PmRldjsKPiArCXN0cnVjdCByaXNjdl9pb21tdV9kZXZpY2UgKmlvbW11ID0gTlVMTDsKPiArCXN0 cnVjdCByZXNvdXJjZSAqcmVzID0gTlVMTDsKPiArCWludCByZXQgPSAwOwo+ICsKPiArCWlvbW11 ID0gZGV2bV9remFsbG9jKGRldiwgc2l6ZW9mKCppb21tdSksIEdGUF9LRVJORUwpOwo+ICsJaWYg KCFpb21tdSkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwlpb21tdS0+ZGV2ID0gZGV2Owo+ ICsJZGV2X3NldF9kcnZkYXRhKGRldiwgaW9tbXUpOwo+ICsKPiArCXJlcyA9IHBsYXRmb3JtX2dl dF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7Cj4gKwlpZiAoIXJlcykgewo+ICsJ CWRldl9lcnIoZGV2LCAiY291bGQgbm90IGZpbmQgcmVzb3VyY2UgZm9yIHJlZ2lzdGVyIHJlZ2lv blxuIik7Cj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4gKwl9Cj4gKwo+ICsJaW9tbXUtPnJlZyA9IGRl dm1fcGxhdGZvcm1fZ2V0X2FuZF9pb3JlbWFwX3Jlc291cmNlKHBkZXYsIDAsICZyZXMpOwo+ICsJ aWYgKElTX0VSUihpb21tdS0+cmVnKSkgewo+ICsJCXJldCA9IGRldl9lcnJfcHJvYmUoZGV2LCBQ VFJfRVJSKGlvbW11LT5yZWcpLAo+ICsJCQkJICAgICJjb3VsZCBub3QgbWFwIHJlZ2lzdGVyIHJl Z2lvblxuIik7Cj4gKwkJZ290byBmYWlsOwo+ICsJfTsKPiArCj4gKwlpb21tdS0+cmVnX3BoeXMg PSByZXMtPnN0YXJ0Owo+ICsKPiArCXJldCA9IC1FTk9ERVY7Cj4gKwo+ICsJLyogU2FuaXR5IGNo ZWNrOiBEaWQgd2UgZ2V0IHRoZSB3aG9sZSByZWdpc3RlciBzcGFjZSA/ICovCj4gKwlpZiAoKHJl cy0+ZW5kIC0gcmVzLT5zdGFydCArIDEpIDwgUklTQ1ZfSU9NTVVfUkVHX1NJWkUpIHsKPiArCQlk ZXZfZXJyKGRldiwgImRldmljZSByZWdpb24gc21hbGxlciB0aGFuIHJlZ2lzdGVyIGZpbGUgKDB4 JWxseClcbiIsCj4gKwkJCXJlcy0+ZW5kIC0gcmVzLT5zdGFydCk7Cj4gKwkJZ290byBmYWlsOwo+ ICsJfQo+ICsKPiArCWRtYV9zZXRfbWFza19hbmRfY29oZXJlbnQoJnBkZXYtPmRldiwgRE1BX0JJ VF9NQVNLKDY0KSk7Cj4gKwo+ICsJcmV0dXJuIHJpc2N2X2lvbW11X2luaXQoaW9tbXUpOwo+ICsK PiArIGZhaWw6Cj4gKwkvKiBOb3RlOiBkZXZyZXNfcmVsZWFzZV9hbGwoKSB3aWxsIHJlbGVhc2Ug aW9tbXUgYW5kIGlvbW11LT5yZWcgKi8KPiArCXJldHVybiByZXQ7Cj4gK307Cj4gKwo+ICtzdGF0 aWMgdm9pZCByaXNjdl9pb21tdV9wbGF0Zm9ybV9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2Rldmlj ZSAqcGRldikKPiArewo+ICsJcmlzY3ZfaW9tbXVfcmVtb3ZlKGRldl9nZXRfZHJ2ZGF0YSgmcGRl di0+ZGV2KSk7Cj4gK307Cj4gKwo+ICtzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9wbGF0Zm9ybV9z aHV0ZG93bihzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQo+ICt7Cj4gKwlyZXR1cm47CgpT dXJlbHkganVzdCBkb24ndCBpbXBsZW1lbnQgaXQgYXQgYWxsPwoKPiArfTsKPiArCj4gK3N0YXRp YyBjb25zdCBzdHJ1Y3Qgb2ZfZGV2aWNlX2lkIHJpc2N2X2lvbW11X29mX21hdGNoW10gPSB7Cj4g Kwl7LmNvbXBhdGlibGUgPSAicmlzY3YsaW9tbXUiLH0sCj4gKwl7fSwKPiArfTsKPiArCj4gK01P RFVMRV9ERVZJQ0VfVEFCTEUob2YsIHJpc2N2X2lvbW11X29mX21hdGNoKTsKPiArCj4gK3N0YXRp YyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIHJpc2N2X2lvbW11X3BsYXRmb3JtX2RyaXZlciA9IHsK PiArCS5kcml2ZXIgPSB7Cj4gKwkJICAgLm5hbWUgPSAicmlzY3YsaW9tbXUiLAo+ICsJCSAgIC5v Zl9tYXRjaF90YWJsZSA9IHJpc2N2X2lvbW11X29mX21hdGNoLAo+ICsJCSAgIC5zdXBwcmVzc19i aW5kX2F0dHJzID0gdHJ1ZSwKPiArCQkgICB9LAo+ICsJLnByb2JlID0gcmlzY3ZfaW9tbXVfcGxh dGZvcm1fcHJvYmUsCj4gKwkucmVtb3ZlX25ldyA9IHJpc2N2X2lvbW11X3BsYXRmb3JtX3JlbW92 ZSwKPiArCS5zaHV0ZG93biA9IHJpc2N2X2lvbW11X3BsYXRmb3JtX3NodXRkb3duLAo+ICt9Owo+ ICsKPiArbW9kdWxlX2RyaXZlcihyaXNjdl9pb21tdV9wbGF0Zm9ybV9kcml2ZXIsIHBsYXRmb3Jt X2RyaXZlcl9yZWdpc3RlciwKPiArCSAgICAgIHBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKTsK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9pb21tdS9yaXNjdi9pb21tdS5jIGIvZHJpdmVycy9pb21t dS9yaXNjdi9pb21tdS5jCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwMDAw MDAuLjhjMjM2MjQyZTJjYwo+IC0tLSAvZGV2L251bGwKPiArKysgYi9kcml2ZXJzL2lvbW11L3Jp c2N2L2lvbW11LmMKPiBAQCAtMCwwICsxLDY2MCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMC1vbmx5Cj4gKy8qCj4gKyAqIElPTU1VIEFQSSBmb3IgUklTQy1WIGFyY2hp dGVjdGVkIFppb21tdSBpbXBsZW1lbnRhdGlvbnMuCj4gKyAqCj4gKyAqIENvcHlyaWdodCDCqSAy MDIyLTIwMjMgUml2b3MgSW5jLgo+ICsgKiBDb3B5cmlnaHQgwqkgMjAyMyBGT1JUSC1JQ1MvQ0FS Vgo+ICsgKgo+ICsgKiBBdXRob3JzCj4gKyAqCVRvbWFzeiBKZXpuYWNoIDx0amV6bmFjaEByaXZv c2luYy5jb20+Cj4gKyAqCU5pY2sgS29zc2lmaWRpcyA8bWlja0BpY3MuZm9ydGguZ3I+Cj4gKyAq Lwo+ICsKPiArI2RlZmluZSBwcl9mbXQoZm10KSBLQlVJTERfTU9ETkFNRSAiOiAiIGZtdAo+ICsK PiArI2luY2x1ZGUgPGxpbnV4L2JpdGZpZWxkLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUu aD4KPiArI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgo+ICsjaW5jbHVkZSA8bGludXgvY29tcGls ZXIuaD4KPiArI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgo+ICsjaW5jbHVkZSA8bGludXgvcGNpLWF0 cy5oPgo+ICsjaW5jbHVkZSA8bGludXgvaW5pdC5oPgo+ICsjaW5jbHVkZSA8bGludXgvY29tcGxl dGlvbi5oPgo+ICsjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgo+ICsjaW5jbHVkZSA8bGludXgv aW9tbXUuaD4KPiArI2luY2x1ZGUgPGxpbnV4L2lycWRvbWFpbi5oPgo+ICsjaW5jbHVkZSA8bGlu dXgvcGxhdGZvcm1fZGV2aWNlLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwLW9wcy5oPgoK Tm8uIFRoaXMgaXMgYSBkZXZpY2UgZHJpdmVyLCBub3QgYSBETUEgb3BzIGltcGxlbWVubXRhdGlv bi4KCj4gKyNpbmNsdWRlIDxhc20vcGFnZS5oPgo+ICsKPiArI2luY2x1ZGUgIi4uL2RtYS1pb21t dS5oIgo+ICsjaW5jbHVkZSAiLi4vaW9tbXUtc3ZhLmgiCj4gKyNpbmNsdWRlICJpb21tdS5oIgo+ ICsKPiArI2luY2x1ZGUgPGFzbS9jc3IuaD4KPiArI2luY2x1ZGUgPGFzbS9kZWxheS5oPgo+ICsK PiArTU9EVUxFX0RFU0NSSVBUSU9OKCJJT01NVSBkcml2ZXIgZm9yIFJJU0MtViBhcmNoaXRlY3Rl ZCBaaW9tbXUgaW1wbGVtZW50YXRpb25zIik7Cj4gK01PRFVMRV9BVVRIT1IoIlRvbWFzeiBKZXpu YWNoIDx0amV6bmFjaEByaXZvc2luYy5jb20+Iik7Cj4gK01PRFVMRV9BVVRIT1IoIk5pY2sgS29z c2lmaWRpcyA8bWlja0BpY3MuZm9ydGguZ3I+Iik7Cj4gK01PRFVMRV9BTElBUygicmlzY3YtaW9t bXUiKTsKPiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+ICsKPiArLyogR2xvYmFsIElPTU1V IHBhcmFtcy4gKi8KPiArc3RhdGljIGludCBkZHRfbW9kZSA9IFJJU0NWX0lPTU1VX0REVFBfTU9E RV9CQVJFOwo+ICttb2R1bGVfcGFyYW0oZGR0X21vZGUsIGludCwgMDY0NCk7Cj4gK01PRFVMRV9Q QVJNX0RFU0MoZGR0X21vZGUsICJEZXZpY2UgRGlyZWN0b3J5IFRhYmxlIG1vZGUuIik7Cj4gKwo+ ICsvKiBJT01NVSBQU0NJRCBhbGxvY2F0aW9uIG5hbWVzcGFjZS4gKi8KPiArI2RlZmluZSBSSVND Vl9JT01NVV9NQVhfUFNDSUQJKDFVIDw8IDIwKQo+ICtzdGF0aWMgREVGSU5FX0lEQShyaXNjdl9p b21tdV9wc2NpZHMpOwo+ICsKPiArLyogMSBzZWNvbmQgKi8KPiArI2RlZmluZSBSSVNDVl9JT01N VV9USU1FT1VUCXJpc2N2X3RpbWViYXNlCj4gKwo+ICsvKiBSSVNDLVYgSU9NTVUgUFBOIDw+IFBI WVMgYWRkcmVzcyBjb252ZXJzaW9ucywgUEhZUyA8PT4gUFBOWzUzOjEwXSAqLwo+ICsjZGVmaW5l IHBoeXNfdG9fcHBuKHZhKSAgKCgodmEpID4+IDIpICYgKCgoMVVMTCA8PCA0NCkgLSAxKSA8PCAx MCkpCj4gKyNkZWZpbmUgcHBuX3RvX3BoeXMocG4pCSAoKChwbikgPDwgMikgJiAoKCgxVUxMIDw8 IDQ0KSAtIDEpIDw8IDEyKSkKPiArCj4gKyNkZWZpbmUgaW9tbXVfZG9tYWluX3RvX3Jpc2N2KGlv bW11X2RvbWFpbikgXAo+ICsgICAgY29udGFpbmVyX29mKGlvbW11X2RvbWFpbiwgc3RydWN0IHJp c2N2X2lvbW11X2RvbWFpbiwgZG9tYWluKQo+ICsKPiArI2RlZmluZSBpb21tdV9kZXZpY2VfdG9f cmlzY3YoaW9tbXVfZGV2aWNlKSBcCj4gKyAgICBjb250YWluZXJfb2YoaW9tbXVfZGV2aWNlLCBz dHJ1Y3QgcmlzY3ZfaW9tbXUsIGlvbW11KQo+ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpb21t dV9kb21haW5fb3BzIHJpc2N2X2lvbW11X2RvbWFpbl9vcHM7Cj4gK3N0YXRpYyBjb25zdCBzdHJ1 Y3QgaW9tbXVfb3BzIHJpc2N2X2lvbW11X29wczsKPiArCj4gKy8qCj4gKyAqIFJlZ2lzdGVyIGRl dmljZSBmb3IgSU9NTVUgdHJhY2tpbmcuCj4gKyAqLwo+ICtzdGF0aWMgdm9pZCByaXNjdl9pb21t dV9hZGRfZGV2aWNlKHN0cnVjdCByaXNjdl9pb21tdV9kZXZpY2UgKmlvbW11LCBzdHJ1Y3QgZGV2 aWNlICpkZXYpCj4gK3sKPiArCXN0cnVjdCByaXNjdl9pb21tdV9lbmRwb2ludCAqZXAsICpyYl9l cDsKPiArCXN0cnVjdCByYl9ub2RlICoqbmV3X25vZGUsICpwYXJlbnRfbm9kZSA9IE5VTEw7Cj4g Kwo+ICsJbXV0ZXhfbG9jaygmaW9tbXUtPmVwc19tdXRleCk7Cj4gKwo+ICsJZXAgPSBkZXZfaW9t bXVfcHJpdl9nZXQoZGV2KTsKPiArCj4gKwluZXdfbm9kZSA9ICYoaW9tbXUtPmVwcy5yYl9ub2Rl KTsKPiArCXdoaWxlICgqbmV3X25vZGUpIHsKPiArCQlyYl9lcCA9IHJiX2VudHJ5KCpuZXdfbm9k ZSwgc3RydWN0IHJpc2N2X2lvbW11X2VuZHBvaW50LCBub2RlKTsKPiArCQlwYXJlbnRfbm9kZSA9 ICpuZXdfbm9kZTsKPiArCQlpZiAocmJfZXAtPmRldmlkID4gZXAtPmRldmlkKSB7Cj4gKwkJCW5l d19ub2RlID0gJigoKm5ld19ub2RlKS0+cmJfbGVmdCk7Cj4gKwkJfSBlbHNlIGlmIChyYl9lcC0+ ZGV2aWQgPCBlcC0+ZGV2aWQpIHsKPiArCQkJbmV3X25vZGUgPSAmKCgqbmV3X25vZGUpLT5yYl9y aWdodCk7Cj4gKwkJfSBlbHNlIHsKPiArCQkJZGV2X3dhcm4oZGV2LCAiZGV2aWNlICV1IGFscmVh ZHkgaW4gdGhlIHRyZWVcbiIsIGVwLT5kZXZpZCk7Cj4gKwkJCWJyZWFrOwo+ICsJCX0KPiArCX0K PiArCj4gKwlyYl9saW5rX25vZGUoJmVwLT5ub2RlLCBwYXJlbnRfbm9kZSwgbmV3X25vZGUpOwo+ ICsJcmJfaW5zZXJ0X2NvbG9yKCZlcC0+bm9kZSwgJmlvbW11LT5lcHMpOwo+ICsKPiArCW11dGV4 X3VubG9jaygmaW9tbXUtPmVwc19tdXRleCk7Cj4gK30KPiArCj4gKy8qCj4gKyAqIEVuZHBvaW50 IG1hbmFnZW1lbnQKPiArICovCj4gKwo+ICtzdGF0aWMgaW50IHJpc2N2X2lvbW11X29mX3hsYXRl KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IG9mX3BoYW5kbGVfYXJncyAqYXJncykKPiArewo+ ICsJcmV0dXJuIGlvbW11X2Z3c3BlY19hZGRfaWRzKGRldiwgYXJncy0+YXJncywgMSk7Cj4gK30K PiArCj4gK3N0YXRpYyBib29sIHJpc2N2X2lvbW11X2NhcGFibGUoc3RydWN0IGRldmljZSAqZGV2 LCBlbnVtIGlvbW11X2NhcCBjYXApCj4gK3sKPiArCXN3aXRjaCAoY2FwKSB7Cj4gKwljYXNlIElP TU1VX0NBUF9DQUNIRV9DT0hFUkVOQ1k6Cj4gKwljYXNlIElPTU1VX0NBUF9QUkVfQk9PVF9QUk9U RUNUSU9OOgoKSSBkb24ndCB0aGluayB5b3UgY2FuIGV2ZXIgdW5jb25kaXRpb25hbGx5IGNsYWlt IHByZS1ib290IHByb3RlY3Rpb24uIApFdmVuIGlmIGFuIElPTU1VIGltcGxlbWVudGF0aW9uIGRv ZXMgY29tZSBvdXQgb2YgcmVzZXQgaW4gIk9mZiIgc3RhdGUgLSAKd2hpY2ggSSBzZWUgdGhlIHNw ZWMgb25seSByZWNvbW1lbmRzLCBub3QgcmVxdWlyZXMgLSBzb21ldGhpbmcgdGhhdCByYW4gCmJl Zm9yZSBMaW51eCBjb3VsZCBoYXZlIGRvbmUgc29tZXRoaW5nIGFuZCBsZWZ0IGl0IGluICJCYXJl IiBzdGF0ZS4KCj4gKwkJcmV0dXJuIHRydWU7Cj4gKwo+ICsJZGVmYXVsdDoKPiArCQlicmVhazsK PiArCX0KPiArCj4gKwlyZXR1cm4gZmFsc2U7Cj4gK30KPiArCj4gK3N0YXRpYyBzdHJ1Y3QgaW9t bXVfZGV2aWNlICpyaXNjdl9pb21tdV9wcm9iZV9kZXZpY2Uoc3RydWN0IGRldmljZSAqZGV2KQo+ ICt7Cj4gKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfZGV2aWNlICppb21tdTsKPiArCXN0cnVjdCByaXNj dl9pb21tdV9lbmRwb2ludCAqZXA7Cj4gKwlzdHJ1Y3QgaW9tbXVfZndzcGVjICpmd3NwZWM7Cj4g Kwo+ICsJZndzcGVjID0gZGV2X2lvbW11X2Z3c3BlY19nZXQoZGV2KTsKPiArCWlmICghZndzcGVj IHx8IGZ3c3BlYy0+b3BzICE9ICZyaXNjdl9pb21tdV9vcHMgfHwKPiArCSAgICAhZndzcGVjLT5p b21tdV9md25vZGUgfHwgIWZ3c3BlYy0+aW9tbXVfZndub2RlLT5kZXYpCgpJJ20gcHJldHR5IHN1 cmUgaXQgc2hvdWxkbid0IGJlIHBvc3NpYmxlIGZvciBhIGZ3c3BlYyB0byBoYXZlIG9wcyBzZXQg CndpdGhvdXQgYSB2YWxpZCBmd25vZGUsIGdpdmVuIHRoYXQgdGhlIGZ3bm9kZSBpcyB1c2VkIHRv IGZpbmQgdGhlIG9wcyA6LwoKPiArCQlyZXR1cm4gRVJSX1BUUigtRU5PREVWKTsKPiArCj4gKwlp b21tdSA9IGRldl9nZXRfZHJ2ZGF0YShmd3NwZWMtPmlvbW11X2Z3bm9kZS0+ZGV2KTsKPiArCWlm ICghaW9tbXUpCj4gKwkJcmV0dXJuIEVSUl9QVFIoLUVOT0RFVik7Cj4gKwo+ICsJaWYgKGRldl9p b21tdV9wcml2X2dldChkZXYpKQoKVGhhdCBzaG91bGQgbmV2ZXIgYmUgdHJ1ZSBhdCB0aGlzIHBv aW50LgoKPiArCQlyZXR1cm4gJmlvbW11LT5pb21tdTsKPiArCj4gKwllcCA9IGt6YWxsb2Moc2l6 ZW9mKCplcCksIEdGUF9LRVJORUwpOwo+ICsJaWYgKCFlcCkKPiArCQlyZXR1cm4gRVJSX1BUUigt RU5PTUVNKTsKPiArCj4gKwltdXRleF9pbml0KCZlcC0+bG9jayk7Cj4gKwlJTklUX0xJU1RfSEVB RCgmZXAtPmRvbWFpbik7Cj4gKwo+ICsJaWYgKGRldl9pc19wY2koZGV2KSkgewo+ICsJCWVwLT5k ZXZpZCA9IHBjaV9kZXZfaWQodG9fcGNpX2RldihkZXYpKTsKPiArCQllcC0+ZG9taWQgPSBwY2lf ZG9tYWluX25yKHRvX3BjaV9kZXYoZGV2KS0+YnVzKTsKPiArCX0gZWxzZSB7Cj4gKwkJLyogVE9E TzogTWFrZSB0aGlzIGdlbmVyaWMsIGZvciBub3cgaGFyZGNvZGUgZG9tYWluIGlkIHRvIDAgKi8K PiArCQllcC0+ZGV2aWQgPSBmd3NwZWMtPmlkc1swXTsKPiArCQllcC0+ZG9taWQgPSAwOwo+ICsJ fQo+ICsKPiArCWVwLT5pb21tdSA9IGlvbW11Owo+ICsJZXAtPmRldiA9IGRldjsKPiArCj4gKwlk ZXZfaW5mbyhpb21tdS0+ZGV2LCAiYWRkaW5nIGRldmljZSB0byBpb21tdSB3aXRoIGRldmlkICVp IGluIGRvbWFpbiAlaVxuIiwKPiArCQllcC0+ZGV2aWQsIGVwLT5kb21pZCk7CgpQbGVhc2UgY2xl YW4gdXAgYWxsIHRoZXNlIGRlYnVnZ2luZyBwcmludHMgYmVmb3JlIHN1Ym1pdHRpbmcgcGF0Y2hl cyAKdXBzdHJlYW0uIEkgZG8gc3RhcnQgdG8gd29uZGVyIGhvdyB3b3J0aHdoaWxlIGl0IGlzIHRv IHJldmlldyBjb2RlIHRoYXQgCmRvZXNuJ3QgZXZlbiBsb29rIGZpbmlzaGVkLi4uCgo+ICsKPiAr CWRldl9pb21tdV9wcml2X3NldChkZXYsIGVwKTsKPiArCXJpc2N2X2lvbW11X2FkZF9kZXZpY2Uo aW9tbXUsIGRldik7Cj4gKwo+ICsJcmV0dXJuICZpb21tdS0+aW9tbXU7Cj4gK30KPiArCj4gK3N0 YXRpYyB2b2lkIHJpc2N2X2lvbW11X3Byb2JlX2ZpbmFsaXplKHN0cnVjdCBkZXZpY2UgKmRldikK PiArewo+ICsJc2V0X2RtYV9vcHMoZGV2LCBOVUxMKTsKPiArCWlvbW11X3NldHVwX2RtYV9vcHMo ZGV2LCAwLCBVNjRfTUFYKTsKPiArfQoKcmlzY3YgYWxyZWFkeSBpbXBsZW1lbnRzIGFyY2hfc2V0 dXBfZG1hX29wcygpLCBzbyBwbGVhc2UgbWFrZSB1c2Ugb2YgCnRoYXQgZmxvdzsgdGhpcyBwcm9i ZV9maW5hbGl6ZSBib2RnZSBpcyBhbiB4ODYgdGhpbmcsIG1vc3RseSBmb3IgbGVnYWN5IApyZWFz b25zLgoKPiArCj4gK3N0YXRpYyB2b2lkIHJpc2N2X2lvbW11X3JlbGVhc2VfZGV2aWNlKHN0cnVj dCBkZXZpY2UgKmRldikKPiArewo+ICsJc3RydWN0IHJpc2N2X2lvbW11X2VuZHBvaW50ICplcCA9 IGRldl9pb21tdV9wcml2X2dldChkZXYpOwo+ICsJc3RydWN0IHJpc2N2X2lvbW11X2RldmljZSAq aW9tbXUgPSBlcC0+aW9tbXU7Cj4gKwo+ICsJZGV2X2luZm8oZGV2LCAiZGV2aWNlIHdpdGggZGV2 aWQgJWkgcmVsZWFzZWRcbiIsIGVwLT5kZXZpZCk7Cj4gKwo+ICsJbXV0ZXhfbG9jaygmZXAtPmxv Y2spOwo+ICsJbGlzdF9kZWwoJmVwLT5kb21haW4pOwo+ICsJbXV0ZXhfdW5sb2NrKCZlcC0+bG9j ayk7Cj4gKwo+ICsJLyogUmVtb3ZlIGVuZHBvaW50IGZyb20gSU9NTVUgdHJhY2tpbmcgc3RydWN0 dXJlcyAqLwo+ICsJbXV0ZXhfbG9jaygmaW9tbXUtPmVwc19tdXRleCk7Cj4gKwlyYl9lcmFzZSgm ZXAtPm5vZGUsICZpb21tdS0+ZXBzKTsKPiArCW11dGV4X3VubG9jaygmaW9tbXUtPmVwc19tdXRl eCk7Cj4gKwo+ICsJc2V0X2RtYV9vcHMoZGV2LCBOVUxMKTsKPiArCWRldl9pb21tdV9wcml2X3Nl dChkZXYsIE5VTEwpOwo+ICsKPiArCWtmcmVlKGVwKTsKPiArfQo+ICsKPiArc3RhdGljIHN0cnVj dCBpb21tdV9ncm91cCAqcmlzY3ZfaW9tbXVfZGV2aWNlX2dyb3VwKHN0cnVjdCBkZXZpY2UgKmRl dikKPiArewo+ICsJaWYgKGRldl9pc19wY2koZGV2KSkKPiArCQlyZXR1cm4gcGNpX2RldmljZV9n cm91cChkZXYpOwo+ICsJcmV0dXJuIGdlbmVyaWNfZGV2aWNlX2dyb3VwKGRldik7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIHJpc2N2X2lvbW11X2dldF9yZXN2X3JlZ2lvbnMoc3RydWN0IGRldmlj ZSAqZGV2LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQo+ICt7Cj4gKwlpb21tdV9kbWFfZ2V0X3Jl c3ZfcmVnaW9ucyhkZXYsIGhlYWQpOwoKSnVzdCBhc3NpZ24gaXQgYXMgdGhlIGNhbGxiYWNrIGRp cmVjdGx5IC0gdGhlIHdyYXBwZXIgZnVuY3Rpb24gc2VydmVzIG5vIApwdXJwb3NlLgoKPiArfQo+ ICsKPiArLyoKPiArICogRG9tYWluIG1hbmFnZW1lbnQKPiArICovCj4gKwo+ICtzdGF0aWMgc3Ry dWN0IGlvbW11X2RvbWFpbiAqcmlzY3ZfaW9tbXVfZG9tYWluX2FsbG9jKHVuc2lnbmVkIHR5cGUp Cj4gK3sKPiArCXN0cnVjdCByaXNjdl9pb21tdV9kb21haW4gKmRvbWFpbjsKPiArCj4gKwlpZiAo dHlwZSAhPSBJT01NVV9ET01BSU5fSURFTlRJVFkgJiYKPiArCSAgICB0eXBlICE9IElPTU1VX0RP TUFJTl9CTE9DS0VEKQoKV2hhdGV2ZXIncyBnb2luZyBvbiBoZXJlIEkgZG9uJ3QgdGhpbmsgcmVh bGx5IGZpdHMgdGhlIG1lYW5pbmcgb2YgCklPTU1VX0RPTUFJTl9CTE9DS0VELgoKPiArCQlyZXR1 cm4gTlVMTDsKPiArCj4gKwlkb21haW4gPSBremFsbG9jKHNpemVvZigqZG9tYWluKSwgR0ZQX0tF Uk5FTCk7Cj4gKwlpZiAoIWRvbWFpbikKPiArCQlyZXR1cm4gTlVMTDsKPiArCj4gKwltdXRleF9p bml0KCZkb21haW4tPmxvY2spOwo+ICsJSU5JVF9MSVNUX0hFQUQoJmRvbWFpbi0+ZW5kcG9pbnRz KTsKPiArCj4gKwlkb21haW4tPmRvbWFpbi5vcHMgPSAmcmlzY3ZfaW9tbXVfZG9tYWluX29wczsK PiArCWRvbWFpbi0+bW9kZSA9IFJJU0NWX0lPTU1VX0RDX0ZTQ19NT0RFX0JBUkU7Cj4gKwlkb21h aW4tPnBzY2lkID0gaWRhX2FsbG9jX3JhbmdlKCZyaXNjdl9pb21tdV9wc2NpZHMsIDEsCj4gKwkJ CQkJUklTQ1ZfSU9NTVVfTUFYX1BTQ0lELCBHRlBfS0VSTkVMKTsKCklmIHRoaXMgZmFpbHMsIGl0 IHNlZW1zIHlvdSAic3VjY2Vzc2Z1bGx5IiByZXR1cm4gYSBjb21wbGV0ZWx5IHVzZWxlc3MgCmRv bWFpbiB0byB3aGljaCBub3RoaW5nIGNhbiBhdHRhY2guIFdoeSBub3QganVzdCBmYWlsIHRoZSBh bGxvY2F0aW9uIApyaWdodCBoZXJlPwoKPiArCj4gKwlwcmludGsoImRvbWFpbiB0eXBlICV4IGFs bG9jICV1XG4iLCB0eXBlLCBkb21haW4tPnBzY2lkKTsKPiArCj4gKwlyZXR1cm4gJmRvbWFpbi0+ ZG9tYWluOwo+ICt9Cj4gKwo+ICtzdGF0aWMgdm9pZCByaXNjdl9pb21tdV9kb21haW5fZnJlZShz dHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW4pCj4gK3sKPiArCXN0cnVjdCByaXNjdl9p b21tdV9kb21haW4gKmRvbWFpbiA9IGlvbW11X2RvbWFpbl90b19yaXNjdihpb21tdV9kb21haW4p Owo+ICsKPiArCWlmICghbGlzdF9lbXB0eSgmZG9tYWluLT5lbmRwb2ludHMpKSB7Cj4gKwkJcHJf d2FybigiSU9NTVUgZG9tYWluIGlzIG5vdCBlbXB0eSFcbiIpOwo+ICsJfQo+ICsKPiArCWlmIChk b21haW4tPnBnZF9yb290KQo+ICsJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpZG9tYWluLT5w Z2Rfcm9vdCwgMCk7Cj4gKwo+ICsJaWYgKChpbnQpZG9tYWluLT5wc2NpZCA+IDApCj4gKwkJaWRh X2ZyZWUoJnJpc2N2X2lvbW11X3BzY2lkcywgZG9tYWluLT5wc2NpZCk7Cj4gKwo+ICsJcHJpbnRr KCJkb21haW4gZnJlZSAldVxuIiwgZG9tYWluLT5wc2NpZCk7Cj4gKwo+ICsJa2ZyZWUoZG9tYWlu KTsKPiArfQo+ICsKPiArc3RhdGljIGludCByaXNjdl9pb21tdV9kb21haW5fZmluYWxpemUoc3Ry dWN0IHJpc2N2X2lvbW11X2RvbWFpbiAqZG9tYWluLAo+ICsJCQkJICAgICAgIHN0cnVjdCByaXNj dl9pb21tdV9kZXZpY2UgKmlvbW11KQo+ICt7Cj4gKwlzdHJ1Y3QgaW9tbXVfZG9tYWluX2dlb21l dHJ5ICpnZW9tZXRyeTsKPiArCj4gKwkvKiBEb21haW4gYXNzaWduZWQgdG8gYW5vdGhlciBpb21t dSAqLwo+ICsJaWYgKGRvbWFpbi0+aW9tbXUgJiYgZG9tYWluLT5pb21tdSAhPSBpb21tdSkKPiAr CQlyZXR1cm4gLUVJTlZBTDsKPiArCS8qIERvbWFpbiBhbHJlYWR5IGluaXRpYWxpemVkICovCj4g KwllbHNlIGlmIChkb21haW4tPmlvbW11KQo+ICsJCXJldHVybiAwOwo+ICsKPiArCS8qCj4gKwkg KiBUT0RPOiBCZWZvcmUgdXNpbmcgVkFfQklUUyBhbmQgc2F0cF9tb2RlIGhlcmUsIHZlcmlmeSB0 aGV5Cj4gKwkgKiBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBpb21tdSwgdGhyb3VnaCB0aGUgY2FwYWJp bGl0aWVzIHJlZ2lzdGVyLgo+ICsJICovCgpZZXMsIGRvaW5nIHRoYXQgc291bmRzIGxpa2UgYSB2 ZXJ5IGdvb2QgaWRlYS4KCj4gKwo+ICsJZ2VvbWV0cnkgPSAmZG9tYWluLT5kb21haW4uZ2VvbWV0 cnk7Cj4gKwo+ICsJLyoKPiArCSAqIE5vdGU6IFJJU0MtViBQcml2aWxlZ2Ugc3BlYyBtYW5kYXRl cyB0aGF0IHZpcnR1YWwgYWRkcmVzc2VzCj4gKwkgKiBuZWVkIHRvIGJlIHNpZ24tZXh0ZW5kZWQs IHNvIGlmIChWQV9CSVRTIC0gMSkgaXMgc2V0LCBhbGwKPiArCSAqIGJpdHMgPj0gVkFfQklUUyBu ZWVkIHRvIGFsc28gYmUgc2V0IG9yIGVsc2Ugd2UnbGwgZ2V0IGEKPiArCSAqIHBhZ2UgZmF1bHQu IEhvd2V2ZXIgdGhlIGNvZGUgdGhhdCBjcmVhdGVzIHRoZSBtYXBwaW5ncwo+ICsJICogYWJvdmUg dXMgKGUuZy4gaW9tbXVfZG1hX2FsbG9jX2lvdmEoKSkgd29uJ3QgZG8gdGhhdCBmb3IgdXMKPiAr CSAqIGZvciBub3csIHNvIHdlJ2xsIGVuZCB1cCB3aXRoIGludmFsaWQgdmlydHVhbCBhZGRyZXNz ZXMKPiArCSAqIHRvIG1hcC4gQXMgYSB3b3JrYXJvdW5kIHVudGlsIHdlIGdldCB0aGlzIHNvcnRl ZCBvdXQKPiArCSAqIGxpbWl0IHRoZSBhdmFpbGFibGUgdmlydHVhbCBhZGRyZXNzZXMgdG8gVkFf QklUUyAtIDEuCj4gKwkgKi8KCldvdWxkIHlvdSBoYXZlIGEgcHJhY3RpY2FsIHVzZSBmb3IgYSBz aW5nbGUgNjQtYml0IFZBIHNwYWNlIHdpdGggYSAKbWFzc2l2ZSBob2xlIGluIHRoZSBtaWRkbGUg YW55d2F5PwoKPiArCWdlb21ldHJ5LT5hcGVydHVyZV9zdGFydCA9IDA7Cj4gKwlnZW9tZXRyeS0+ YXBlcnR1cmVfZW5kID0gRE1BX0JJVF9NQVNLKFZBX0JJVFMgLSAxKTsKPiArCWdlb21ldHJ5LT5m b3JjZV9hcGVydHVyZSA9IHRydWU7Cj4gKwo+ICsJZG9tYWluLT5pb21tdSA9IGlvbW11Owo+ICsK PiArCWlmIChkb21haW4tPmRvbWFpbi50eXBlID09IElPTU1VX0RPTUFJTl9JREVOVElUWSkKPiAr CQlyZXR1cm4gMDsKPiArCj4gKwkvKiBUT0RPOiBGaXggdGhpcyBmb3IgUlYzMiAqLwo+ICsJZG9t YWluLT5tb2RlID0gc2F0cF9tb2RlID4+IDYwOwo+ICsJZG9tYWluLT5wZ2Rfcm9vdCA9IChwZ2Rf dCAqKSBfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLCAwKTsKPiArCj4g KwlpZiAoIWRvbWFpbi0+cGdkX3Jvb3QpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gK30KPiArCj4gK3N0YXRpYyBpbnQgcmlzY3ZfaW9tbXVfYXR0YWNoX2RldihzdHJ1 Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW4sIHN0cnVjdCBkZXZpY2UgKmRldikKPiArewo+ ICsJc3RydWN0IHJpc2N2X2lvbW11X2RvbWFpbiAqZG9tYWluID0gaW9tbXVfZG9tYWluX3RvX3Jp c2N2KGlvbW11X2RvbWFpbik7Cj4gKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfZW5kcG9pbnQgKmVwID0g ZGV2X2lvbW11X3ByaXZfZ2V0KGRldik7Cj4gKwlpbnQgcmV0Owo+ICsKPiArCS8qIFBTQ0lEIG5v dCB2YWxpZCAqLwo+ICsJaWYgKChpbnQpZG9tYWluLT5wc2NpZCA8IDApCj4gKwkJcmV0dXJuIC1F Tk9NRU07Cj4gKwo+ICsJbXV0ZXhfbG9jaygmZG9tYWluLT5sb2NrKTsKPiArCW11dGV4X2xvY2so JmVwLT5sb2NrKTsKPiArCj4gKwlpZiAoIWxpc3RfZW1wdHkoJmVwLT5kb21haW4pKSB7Cj4gKwkJ ZGV2X3dhcm4oZGV2LCAiZW5kcG9pbnQgYWxyZWFkeSBhdHRhY2hlZCB0byBhIGRvbWFpbi4gZHJv cHBpbmdcbiIpOwoKVGhpcyBzaG91bGQgbm90IGJlIGEgd2FybmluZyBjb25kaXRpb24uIE90aGVy IHRoYW4gdGhlIHZlcnkgZmlyc3QgYXR0YWNoIAphdCBpb21tdV9wcm9iZV9kZXZpY2UoKSB0aW1l LCAuYXR0YWNoX2RldiB3aWxsIGFsd2F5cyBiZSBtb3ZpbmcgZGV2aWNlcyAKZGlyZWN0bHkgZnJv bSBvbmUgZG9tYWluIHRvIGFub3RoZXIuCgo+ICsJCWxpc3RfZGVsX2luaXQoJmVwLT5kb21haW4p Owo+ICsJfQo+ICsKPiArCS8qIGFsbG9jYXRlIHJvb3QgcGFnZXMsIGluaXRpYWxpemUgaW8tcGd0 YWJsZSBvcHMsIGV0Yy4gKi8KPiArCXJldCA9IHJpc2N2X2lvbW11X2RvbWFpbl9maW5hbGl6ZShk b21haW4sIGVwLT5pb21tdSk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCWRldl9lcnIoZGV2LCAi Y2FuIG5vdCBmaW5hbGl6ZSBkb21haW46ICVkXG4iLCByZXQpOwo+ICsJCW11dGV4X3VubG9jaygm ZXAtPmxvY2spOwo+ICsJCW11dGV4X3VubG9jaygmZG9tYWluLT5sb2NrKTsKPiArCQlyZXR1cm4g cmV0Owo+ICsJfQo+ICsKPiArCWlmIChlcC0+aW9tbXUtPmRkdF9tb2RlICE9IFJJU0NWX0lPTU1V X0REVFBfTU9ERV9CQVJFIHx8Cj4gKwkgICAgZG9tYWluLT5kb21haW4udHlwZSAhPSBJT01NVV9E T01BSU5fSURFTlRJVFkpIHsKPiArCQlkZXZfd2FybihkZXYsICJkb21haW4gdHlwZSAlZCBub3Qg c3VwcG9ydGVkXG4iLAo+ICsJCSAgICBkb21haW4tPmRvbWFpbi50eXBlKTsKPiArCQlyZXR1cm4g LUVOT0RFVjsKCk9LLCBzbyB5b3UgZG9uJ3QgYWN0dWFsbHkgc3VwcG9ydCBibG9ja2luZyBkb21h aW5zIGFueXdheT8gSW4gdGhhdCBjYXNlLCAKZG9uJ3QgYWNjZXB0IHRoZSBhbGxvY2F0aW9uIHJl cXVlc3QgaW4gdGhlIGZpcnN0IHBsYWNlLgoKPiArCX0KPiArCj4gKwlsaXN0X2FkZF90YWlsKCZl cC0+ZG9tYWluLCAmZG9tYWluLT5lbmRwb2ludHMpOwo+ICsJbXV0ZXhfdW5sb2NrKCZlcC0+bG9j ayk7Cj4gKwltdXRleF91bmxvY2soJmRvbWFpbi0+bG9jayk7Cj4gKwo+ICsJZGV2X2luZm8oZGV2 LCAiZG9tYWluIHR5cGUgJWQgYXR0YWNoZWQgdy8gUFNDSUQgJXVcbiIsCj4gKwkgICAgZG9tYWlu LT5kb21haW4udHlwZSwgZG9tYWluLT5wc2NpZCk7Cj4gKwo+ICsJcmV0dXJuIDA7Cj4gK30KPiAr Cj4gK3N0YXRpYyB2b2lkIHJpc2N2X2lvbW11X2ZsdXNoX2lvdGxiX3JhbmdlKHN0cnVjdCBpb21t dV9kb21haW4gKmlvbW11X2RvbWFpbiwKPiArCQkJCQkgIHVuc2lnbmVkIGxvbmcgKnN0YXJ0LCB1 bnNpZ25lZCBsb25nICplbmQsCj4gKwkJCQkJICBzaXplX3QgKnBnc2l6ZSkKPiArewo+ICsJLyog Q29tbWFuZCBpbnRlcmZhY2Ugbm90IGltcGxlbWVudGVkICovCj4gK30KPiArCj4gK3N0YXRpYyB2 b2lkIHJpc2N2X2lvbW11X2ZsdXNoX2lvdGxiX2FsbChzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21t dV9kb21haW4pCj4gK3sKPiArCXJpc2N2X2lvbW11X2ZsdXNoX2lvdGxiX3JhbmdlKGlvbW11X2Rv bWFpbiwgTlVMTCwgTlVMTCwgTlVMTCk7Cj4gK30KPiArCj4gK3N0YXRpYyB2b2lkIHJpc2N2X2lv bW11X2lvdGxiX3N5bmMoc3RydWN0IGlvbW11X2RvbWFpbiAqaW9tbXVfZG9tYWluLAo+ICsJCQkJ ICAgc3RydWN0IGlvbW11X2lvdGxiX2dhdGhlciAqZ2F0aGVyKQo+ICt7Cj4gKwlyaXNjdl9pb21t dV9mbHVzaF9pb3RsYl9yYW5nZShpb21tdV9kb21haW4sICZnYXRoZXItPnN0YXJ0LCAmZ2F0aGVy LT5lbmQsCj4gKwkJCQkgICAgICAmZ2F0aGVyLT5wZ3NpemUpOwo+ICt9Cj4gKwo+ICtzdGF0aWMg dm9pZCByaXNjdl9pb21tdV9pb3RsYl9zeW5jX21hcChzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21t dV9kb21haW4sCj4gKwkJCQkgICAgICAgdW5zaWduZWQgbG9uZyBpb3ZhLCBzaXplX3Qgc2l6ZSkK PiArewo+ICsJdW5zaWduZWQgbG9uZyBlbmQgPSBpb3ZhICsgc2l6ZSAtIDE7Cj4gKwkvKgo+ICsJ ICogR2l2ZW4gd2UgZG9uJ3Qga25vdyB0aGUgcGFnZSBzaXplIHVzZWQgYnkgdGhpcyByYW5nZSwg d2UgYXNzdW1lIHRoZQo+ICsJICogc21hbGxlc3QgcGFnZSBzaXplIHRvIGVuc3VyZSBhbGwgcG9z c2libGUgZW50cmllcyBhcmUgZmx1c2hlZCBmcm9tCj4gKwkgKiB0aGUgSU9BVEMuCj4gKwkgKi8K PiArCXNpemVfdCBwZ3NpemUgPSBQQUdFX1NJWkU7Cj4gKwlyaXNjdl9pb21tdV9mbHVzaF9pb3Rs Yl9yYW5nZShpb21tdV9kb21haW4sICZpb3ZhLCAmZW5kLCAmcGdzaXplKTsKClRoZSBzcGVjIHNh eXMgdGhlIElPTU1VIGlzIG5vdCBwZXJtaXR0ZWQgdG8gY2FjaGUgaW52YWxpZCBQVEVzLCBzbyB3 aHkgCmhhdmUgdGhpcz8gKEkgbWVhbiwgaXQncyBjbGVhcmx5IGEgY29tcGxldGVseSB1c2VsZXNz IG5vLW9wIGFueXdheSwgYnV0IApoZXkuLi4pCgo+ICt9Cj4gKwo+ICtzdGF0aWMgaW50IHJpc2N2 X2lvbW11X21hcF9wYWdlcyhzdHJ1Y3QgaW9tbXVfZG9tYWluICppb21tdV9kb21haW4sCj4gKwkJ CQkgdW5zaWduZWQgbG9uZyBpb3ZhLCBwaHlzX2FkZHJfdCBwaHlzLAo+ICsJCQkJIHNpemVfdCBw Z3NpemUsIHNpemVfdCBwZ2NvdW50LCBpbnQgcHJvdCwKPiArCQkJCSBnZnBfdCBnZnAsIHNpemVf dCAqbWFwcGVkKQo+ICt7Cj4gKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVfZG9tYWluICpkb21haW4gPSBp b21tdV9kb21haW5fdG9fcmlzY3YoaW9tbXVfZG9tYWluKTsKPiArCj4gKwlpZiAoZG9tYWluLT5k b21haW4udHlwZSA9PSBJT01NVV9ET01BSU5fSURFTlRJVFkpIHsKClRoYXQgY2FuJ3QgaGFwcGVu LiBOb3QgdG8gbWVudGlvbiB0aGF0IHByZXRlbmRpbmcgdG8gc3VjY2Vzc2Z1bGx5IG1hcCAKYW55 IElPVkEgdG8gYW55IFBBIGluIGFuIGlkZW50aXR5IGRvbWFpbiwgd2hpY2ggYnkgZGVmaW5pdGlv biBkb2Vzbid0IGRvIAp0aGF0LCB3b3VsZCBiZSBmdW5kYW1lbnRhbGx5IG5vbnNlbnNpY2FsIGFu eXdheS4KCj4gKwkJKm1hcHBlZCA9IHBnc2l6ZSAqIHBnY291bnQ7Cj4gKwkJcmV0dXJuIDA7Cj4g Kwl9Cj4gKwo+ICsJcmV0dXJuIC1FTk9ERVY7Cj4gK30KPiArCj4gK3N0YXRpYyBzaXplX3Qgcmlz Y3ZfaW9tbXVfdW5tYXBfcGFnZXMoc3RydWN0IGlvbW11X2RvbWFpbiAqaW9tbXVfZG9tYWluLAo+ ICsJCQkJICAgICAgdW5zaWduZWQgbG9uZyBpb3ZhLCBzaXplX3QgcGdzaXplLAo+ICsJCQkJICAg ICAgc2l6ZV90IHBnY291bnQsIHN0cnVjdCBpb21tdV9pb3RsYl9nYXRoZXIgKmdhdGhlcikKPiAr ewo+ICsJc3RydWN0IHJpc2N2X2lvbW11X2RvbWFpbiAqZG9tYWluID0gaW9tbXVfZG9tYWluX3Rv X3Jpc2N2KGlvbW11X2RvbWFpbik7Cj4gKwo+ICsJaWYgKGRvbWFpbi0+ZG9tYWluLnR5cGUgPT0g SU9NTVVfRE9NQUlOX0lERU5USVRZKQoKRGl0dG8uCgo+ICsJCXJldHVybiBwZ3NpemUgKiBwZ2Nv dW50Owo+ICsKPiArCXJldHVybiAwOwo+ICt9Cj4gKwo+ICtzdGF0aWMgcGh5c19hZGRyX3Qgcmlz Y3ZfaW9tbXVfaW92YV90b19waHlzKHN0cnVjdCBpb21tdV9kb21haW4gKmlvbW11X2RvbWFpbiwK PiArCQkJCQkgICAgZG1hX2FkZHJfdCBpb3ZhKQo+ICt7Cj4gKwlzdHJ1Y3QgcmlzY3ZfaW9tbXVf ZG9tYWluICpkb21haW4gPSBpb21tdV9kb21haW5fdG9fcmlzY3YoaW9tbXVfZG9tYWluKTsKPiAr Cj4gKwlpZiAoZG9tYWluLT5kb21haW4udHlwZSA9PSBJT01NVV9ET01BSU5fSURFTlRJVFkpCgpE aXR0by4gSGF2ZSB5b3Ugc2VlbiBpb21tdV9pb3ZhX3RvX3BoeXMoKT8KCj4gKwkJcmV0dXJuIChw aHlzX2FkZHJfdCkgaW92YTsKPiArCj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArLyoKPiArICog VHJhbnNsYXRpb24gbW9kZSBzZXR1cAo+ICsgKi8KPiArCj4gK3N0YXRpYyB1NjQgcmlzY3ZfaW9t bXVfZ2V0X2RkdHAoc3RydWN0IHJpc2N2X2lvbW11X2RldmljZSAqaW9tbXUpCj4gK3sKPiArCXU2 NCBkZHRwOwo+ICsJY3ljbGVzX3QgZW5kX2N5Y2xlcyA9IFJJU0NWX0lPTU1VX1RJTUVPVVQgKyBn ZXRfY3ljbGVzKCk7Cj4gKwo+ICsJLyogV2FpdCBmb3IgRERUUC5CVVNZIHRvIGJlIGNsZWFyZWQg YW5kIHJldHVybiBsYXRlc3QgdmFsdWUgKi8KPiArCWRvIHsKPiArCQlkZHRwID0gcmlzY3ZfaW9t bXVfcmVhZHEoaW9tbXUsIFJJU0NWX0lPTU1VX1JFR19ERFRQKTsKPiArCQlpZiAoIShkZHRwICYg UklTQ1ZfSU9NTVVfRERUUF9CVVNZKSkKPiArCQkJYnJlYWs7Cj4gKwkJY3B1X3JlbGF4KCk7Cj4g Kwl9IHdoaWxlIChnZXRfY3ljbGVzKCkgPCBlbmRfY3ljbGVzKTsKClNtZWxscyBsaWtlIHJlYWRx X3BvbGxfdGltZW91dCgpLgoKPiArCj4gKwlyZXR1cm4gZGR0cDsKPiArfQo+ICsKPiArc3RhdGlj IHZvaWQgcmlzY3ZfaW9tbXVfZGR0X2NsZWFudXAoc3RydWN0IHJpc2N2X2lvbW11X2RldmljZSAq aW9tbXUpCj4gK3sKPiArCS8qIFRPRE86IHRlYXJkb3duIHdob2xlIGRldmljZSBkaXJlY3Rvcnkg dHJlZS4gKi8KPiArCWlmIChpb21tdS0+ZGR0cCkgewo+ICsJCWlmIChpb21tdS0+ZGR0cF9pbl9p b21lbSkgewo+ICsJCQlpb3VubWFwKCh2b2lkICopaW9tbXUtPmRkdHApOwo+ICsJCX0gZWxzZQo+ ICsJCQlmcmVlX3BhZ2UoaW9tbXUtPmRkdHApOwo+ICsJCWlvbW11LT5kZHRwID0gMDsKPiArCX0K PiArfQo+ICsKPiArc3RhdGljIGludCByaXNjdl9pb21tdV9lbmFibGUoc3RydWN0IHJpc2N2X2lv bW11X2RldmljZSAqaW9tbXUsIHVuc2lnbmVkIHJlcXVlc3RlZF9tb2RlKQo+ICt7Cj4gKwlzdHJ1 Y3QgZGV2aWNlICpkZXYgPSBpb21tdS0+ZGV2Owo+ICsJdTY0IGRkdHAgPSAwOwo+ICsJdTY0IGRk dHBfcGFkZHIgPSAwOwo+ICsJdW5zaWduZWQgbW9kZSA9IHJlcXVlc3RlZF9tb2RlOwo+ICsJdW5z aWduZWQgbW9kZV9yZWFkYmFjayA9IDA7Cj4gKwo+ICsJZGR0cCA9IHJpc2N2X2lvbW11X2dldF9k ZHRwKGlvbW11KTsKPiArCWlmIChkZHRwICYgUklTQ1ZfSU9NTVVfRERUUF9CVVNZKQo+ICsJCXJl dHVybiAtRUJVU1k7Cj4gKwo+ICsJLyogRGlzYWxsb3cgc3RhdGUgdHJhbnN0aW9uIGZyb20geExW TCB0byB4TFZMLiAqLwo+ICsJc3dpdGNoIChGSUVMRF9HRVQoUklTQ1ZfSU9NTVVfRERUUF9NT0RF LCBkZHRwKSkgewo+ICsJY2FzZSBSSVNDVl9JT01NVV9ERFRQX01PREVfQkFSRToKPiArCWNhc2Ug UklTQ1ZfSU9NTVVfRERUUF9NT0RFX09GRjoKPiArCQlicmVhazsKPiArCWRlZmF1bHQ6Cj4gKwkJ aWYgKChtb2RlICE9IFJJU0NWX0lPTU1VX0REVFBfTU9ERV9CQVJFKQo+ICsJCSAgICAmJiAobW9k ZSAhPSBSSVNDVl9JT01NVV9ERFRQX01PREVfT0ZGKSkKPiArCQkJcmV0dXJuIC1FSU5WQUw7Cj4g KwkJYnJlYWs7Cj4gKwl9Cj4gKwo+ICsgcmV0cnk6Cj4gKwlzd2l0Y2ggKG1vZGUpIHsKPiArCWNh c2UgUklTQ1ZfSU9NTVVfRERUUF9NT0RFX0JBUkU6Cj4gKwljYXNlIFJJU0NWX0lPTU1VX0REVFBf TU9ERV9PRkY6Cj4gKwkJcmlzY3ZfaW9tbXVfZGR0X2NsZWFudXAoaW9tbXUpOwo+ICsJCWRkdHAg PSBGSUVMRF9QUkVQKFJJU0NWX0lPTU1VX0REVFBfTU9ERSwgbW9kZSk7Cj4gKwkJYnJlYWs7Cj4g KwljYXNlIFJJU0NWX0lPTU1VX0REVFBfTU9ERV8xTFZMOgo+ICsJY2FzZSBSSVNDVl9JT01NVV9E RFRQX01PREVfMkxWTDoKPiArCWNhc2UgUklTQ1ZfSU9NTVVfRERUUF9NT0RFXzNMVkw6Cj4gKwkJ aWYgKCFpb21tdS0+ZGR0cCkgewo+ICsJCQkvKgo+ICsJCQkgKiBXZSBoYXZlbid0IGluaXRpYWxp emVkIGRkdHAgeWV0LCBzaW5jZSBpdCdzIFdBUkwgbWFrZQo+ICsJCQkgKiBzdXJlIHRoYXQgd2Ug ZG9uJ3QgaGF2ZSBhIGhhcmR3aXJlZCBQUE4gZmllbGQgdGhlcmUKPiArCQkJICogdGhhdCBwb2lu dHMgdG8gaS9vIG1lbW9yeSBpbnN0ZWFkLgo+ICsJCQkgKi8KPiArCQkJcmlzY3ZfaW9tbXVfd3Jp dGVxKGlvbW11LCBSSVNDVl9JT01NVV9SRUdfRERUUCwgMCk7Cj4gKwkJCWRkdHAgPSByaXNjdl9p b21tdV9nZXRfZGR0cChpb21tdSk7Cj4gKwkJCWRkdHBfcGFkZHIgPSBwcG5fdG9fcGh5cyhkZHRw KTsKPiArCQkJaWYgKGRkdHBfcGFkZHIpIHsKPiArCQkJCWRldl93YXJuKGRldiwgImRkdHAgYXQg MHglbGx4XG4iLCBkZHRwX3BhZGRyKTsKPiArCQkJCWlvbW11LT5kZHRwID0KPiArCQkJCSAgICAo dW5zaWduZWQgbG9uZylpb3JlbWFwKGRkdHBfcGFkZHIsIFBBR0VfU0laRSk7Cj4gKwkJCQlpb21t dS0+ZGR0cF9pbl9pb21lbSA9IHRydWU7Cj4gKwkJCX0gZWxzZSB7Cj4gKwkJCQlpb21tdS0+ZGR0 cCA9IGdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKPiArCQkJfQo+ICsJCX0KPiArCQlpZiAo IWlvbW11LT5kZHRwKQo+ICsJCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwkJZGR0cCA9IEZJRUxE X1BSRVAoUklTQ1ZfSU9NTVVfRERUUF9NT0RFLCBtb2RlKSB8Cj4gKwkJICAgIHBoeXNfdG9fcHBu KF9fcGEoaW9tbXUtPmRkdHApKTsKPiArCj4gKwkJYnJlYWs7Cj4gKwlkZWZhdWx0Ogo+ICsJCXJl dHVybiAtRUlOVkFMOwo+ICsJfQo+ICsKPiArCXJpc2N2X2lvbW11X3dyaXRlcShpb21tdSwgUklT Q1ZfSU9NTVVfUkVHX0REVFAsIGRkdHApOwo+ICsJZGR0cCA9IHJpc2N2X2lvbW11X2dldF9kZHRw KGlvbW11KTsKPiArCWlmIChkZHRwICYgUklTQ1ZfSU9NTVVfRERUUF9CVVNZKSB7Cj4gKwkJZGV2 X3dhcm4oZGV2LCAidGltZW91dCB3aGVuIHNldHRpbmcgZGR0cCAoZGR0IG1vZGU6ICVpKVxuIiwg bW9kZSk7Cj4gKwkJcmV0dXJuIC1FQlVTWTsKPiArCX0KPiArCj4gKwltb2RlX3JlYWRiYWNrID0g RklFTERfR0VUKFJJU0NWX0lPTU1VX0REVFBfTU9ERSwgZGR0cCk7Cj4gKwlkZXZfaW5mbyhkZXYs ICJtb2RlX3JlYWRiYWNrOiAlaSwgbW9kZTogJWlcbiIsIG1vZGVfcmVhZGJhY2ssIG1vZGUpOwo+ ICsJaWYgKG1vZGVfcmVhZGJhY2sgIT0gbW9kZSkgewo+ICsJCS8qCj4gKwkJICogTW9kZSBmaWVs ZCBpcyBXQVJMLCBhbiBJL08gTU1VIG1heSBzdXBwb3J0IGEgc3Vic2V0IG9mCj4gKwkJICogZGly ZWN0b3J5IHRhYmxlIGxldmVscyBpbiB3aGljaCBjYXNlIGlmIHdlIHRyaWVkIHRvIHNldAo+ICsJ CSAqIGFuIHVuc3VwcG9ydGVkIG51bWJlciBvZiBsZXZlbHMgd2UnbGwgcmVhZGJhY2sgZWl0aGVy Cj4gKwkJICogYSB2YWxpZCB4TFZMIG9yIG9mZi9iYXJlLiBJZiB3ZSBnb3Qgb2ZmL2JhcmUsIHRy eSBhZ2Fpbgo+ICsJCSAqIHdpdGggYSBzbWFsbGVyIHhMVkwuCj4gKwkJICovCj4gKwkJaWYgKG1v ZGVfcmVhZGJhY2sgPCBSSVNDVl9JT01NVV9ERFRQX01PREVfMUxWTCAmJgo+ICsJCSAgICBtb2Rl ID4gUklTQ1ZfSU9NTVVfRERUUF9NT0RFXzFMVkwpIHsKPiArCQkJbW9kZS0tOwo+ICsJCQlnb3Rv IHJldHJ5Owo+ICsJCX0KPiArCj4gKwkJLyoKPiArCQkgKiBXZSB0cmllZCBhbGwgc3VwcG9ydGVk IHhMVkwgbW9kZXMgYW5kIHN0aWxsIGdvdCBvZmYvYmFyZSBpbnN0ZWFkLAo+ICsJCSAqIGFuIEkv TyBNTVUgbXVzdCBzdXBwb3J0IGF0IGxlYXN0IG9uZSBzdXBwb3J0ZWQgeExWTCBtb2RlIHNvIHNv bWV0aGluZwo+ICsJCSAqIHdlbnQgdmVyeSB3cm9uZy4KPiArCQkgKi8KPiArCQlpZiAobW9kZV9y ZWFkYmFjayA8IFJJU0NWX0lPTU1VX0REVFBfTU9ERV8xTFZMICYmCj4gKwkJICAgIG1vZGUgPT0g UklTQ1ZfSU9NTVVfRERUUF9NT0RFXzFMVkwpCj4gKwkJCWdvdG8gZmFpbDsKPiArCj4gKwkJLyoK PiArCQkgKiBXZSB0cmllZCBzZXR0aW5nIG9mZiBvciBiYXJlIGFuZCBnb3Qgc29tZXRoaW5nIGVs c2UgYmFjaywgc29tZXRoaW5nCj4gKwkJICogd2VudCB2ZXJ5IHdyb25nIHNpbmNlIG9mZi9iYXJl IGlzIGFsd2F5cyBsZWdhbC4KPiArCQkgKi8KPiArCQlpZiAobW9kZSA8IFJJU0NWX0lPTU1VX0RE VFBfTU9ERV8xTFZMKQo+ICsJCQlnb3RvIGZhaWw7Cj4gKwo+ICsJCS8qCj4gKwkJICogV2UgdHJp ZWQgc2V0dGluZyBhbiB4TFZMIG1vZGUgYnV0IGdvdCBhbm90aGVyIHhMVkwgbW9kZSB0aGF0Cj4g KwkJICogd2UgZG9uJ3Qgc3VwcG9ydCAoZS5nLiBhIGN1c3RvbSBvbmUpLgo+ICsJCSAqLwo+ICsJ CWlmIChtb2RlX3JlYWRiYWNrID4gUklTQ1ZfSU9NTVVfRERUUF9NT0RFX01BWCkKPiArCQkJZ290 byBmYWlsOwo+ICsKPiArCQkvKiBXZSB0cmllZCBzZXR0aW5nIGFuIHhMVkwgbW9kZSBidXQgZ290 IGFub3RoZXIgc3VwcG9ydGVkIHhMVkwgbW9kZSAqLwo+ICsJCW1vZGUgPSBtb2RlX3JlYWRiYWNr Owo+ICsJfQo+ICsKPiArCWlmIChtb2RlICE9IHJlcXVlc3RlZF9tb2RlKQo+ICsJCWRldl93YXJu KGRldiwgInVuc3VwcG9ydGVkIEREVCBtb2RlIHJlcXVlc3RlZCAoJWkpLCB1c2luZyAlaSBpbnN0 ZWFkXG4iLAo+ICsJCQkgcmVxdWVzdGVkX21vZGUsIG1vZGUpOwo+ICsKPiArCWlvbW11LT5kZHRf bW9kZSA9IG1vZGU7Cj4gKwlkZXZfaW5mbyhkZXYsICJkZHRfbW9kZTogJWlcbiIsIGlvbW11LT5k ZHRfbW9kZSk7Cj4gKwlyZXR1cm4gMDsKPiArCj4gKyBmYWlsOgo+ICsJZGV2X2VycihkZXYsICJm YWlsZWQgdG8gc2V0IEREVCBtb2RlLCB0cmllZDogJWkgYW5kIGdvdCAlaVxuIiwgbW9kZSwKPiAr CQltb2RlX3JlYWRiYWNrKTsKPiArCXJpc2N2X2lvbW11X2RkdF9jbGVhbnVwKGlvbW11KTsKPiAr CXJldHVybiAtRUlOVkFMOwo+ICt9Cj4gKwo+ICsvKgo+ICsgKiBDb21tb24gSS9PIE1NVSBkcml2 ZXIgcHJvYmUvdGVhcmRvd24KPiArICovCj4gKwo+ICtzdGF0aWMgY29uc3Qgc3RydWN0IGlvbW11 X2RvbWFpbl9vcHMgcmlzY3ZfaW9tbXVfZG9tYWluX29wcyA9IHsKPiArCS5mcmVlID0gcmlzY3Zf aW9tbXVfZG9tYWluX2ZyZWUsCj4gKwkuYXR0YWNoX2RldiA9IHJpc2N2X2lvbW11X2F0dGFjaF9k ZXYsCj4gKwkubWFwX3BhZ2VzID0gcmlzY3ZfaW9tbXVfbWFwX3BhZ2VzLAo+ICsJLnVubWFwX3Bh Z2VzID0gcmlzY3ZfaW9tbXVfdW5tYXBfcGFnZXMsCj4gKwkuaW92YV90b19waHlzID0gcmlzY3Zf aW9tbXVfaW92YV90b19waHlzLAo+ICsJLmlvdGxiX3N5bmMgPSByaXNjdl9pb21tdV9pb3RsYl9z eW5jLAo+ICsJLmlvdGxiX3N5bmNfbWFwID0gcmlzY3ZfaW9tbXVfaW90bGJfc3luY19tYXAsCj4g KwkuZmx1c2hfaW90bGJfYWxsID0gcmlzY3ZfaW9tbXVfZmx1c2hfaW90bGJfYWxsLAo+ICt9Owo+ ICsKPiArc3RhdGljIGNvbnN0IHN0cnVjdCBpb21tdV9vcHMgcmlzY3ZfaW9tbXVfb3BzID0gewo+ ICsJLm93bmVyID0gVEhJU19NT0RVTEUsCj4gKwkucGdzaXplX2JpdG1hcCA9IFNaXzRLIHwgU1pf Mk0gfCBTWl81MTJNLAo+ICsJLmNhcGFibGUgPSByaXNjdl9pb21tdV9jYXBhYmxlLAo+ICsJLmRv bWFpbl9hbGxvYyA9IHJpc2N2X2lvbW11X2RvbWFpbl9hbGxvYywKPiArCS5wcm9iZV9kZXZpY2Ug PSByaXNjdl9pb21tdV9wcm9iZV9kZXZpY2UsCj4gKwkucHJvYmVfZmluYWxpemUgPSByaXNjdl9p b21tdV9wcm9iZV9maW5hbGl6ZSwKPiArCS5yZWxlYXNlX2RldmljZSA9IHJpc2N2X2lvbW11X3Jl bGVhc2VfZGV2aWNlLAo+ICsJLmRldmljZV9ncm91cCA9IHJpc2N2X2lvbW11X2RldmljZV9ncm91 cCwKPiArCS5nZXRfcmVzdl9yZWdpb25zID0gcmlzY3ZfaW9tbXVfZ2V0X3Jlc3ZfcmVnaW9ucywK PiArCS5vZl94bGF0ZSA9IHJpc2N2X2lvbW11X29mX3hsYXRlLAo+ICsJLmRlZmF1bHRfZG9tYWlu X29wcyA9ICZyaXNjdl9pb21tdV9kb21haW5fb3BzLAo+ICt9Owo+ICsKPiArdm9pZCByaXNjdl9p b21tdV9yZW1vdmUoc3RydWN0IHJpc2N2X2lvbW11X2RldmljZSAqaW9tbXUpCj4gK3sKPiArCWlv bW11X2RldmljZV91bnJlZ2lzdGVyKCZpb21tdS0+aW9tbXUpOwo+ICsJcmlzY3ZfaW9tbXVfZW5h YmxlKGlvbW11LCBSSVNDVl9JT01NVV9ERFRQX01PREVfT0ZGKTsKPiArfQo+ICsKPiAraW50IHJp c2N2X2lvbW11X2luaXQoc3RydWN0IHJpc2N2X2lvbW11X2RldmljZSAqaW9tbXUpCj4gK3sKPiAr CXN0cnVjdCBkZXZpY2UgKmRldiA9IGlvbW11LT5kZXY7Cj4gKwl1MzIgZmN0bCA9IDA7Cj4gKwlp bnQgcmV0Owo+ICsKPiArCWlvbW11LT5lcHMgPSBSQl9ST09UOwo+ICsKPiArCWZjdGwgPSByaXNj dl9pb21tdV9yZWFkbChpb21tdSwgUklTQ1ZfSU9NTVVfUkVHX0ZDVEwpOwo+ICsKPiArI2lmZGVm IENPTkZJR19DUFVfQklHX0VORElBTgo+ICsJaWYgKCEoY2FwICYgUklTQ1ZfSU9NTVVfQ0FQX0VO RCkpIHsKPiArCQlkZXZfZXJyKGRldiwgIklPTU1VIGRvZXNuJ3Qgc3VwcG9ydCBCaWcgRW5kaWFu XG4iKTsKPiArCQlyZXR1cm4gLUVJTzsKPiArCX0gZWxzZSBpZiAoIShmY3RsICYgUklTQ1ZfSU9N TVVfRkNUTF9CRSkpIHsKPiArCQlmY3RsIHw9IEZJRUxEX1BSRVAoUklTQ1ZfSU9NTVVfRkNUTF9C RSwgMSk7Cj4gKwkJcmlzY3ZfaW9tbXVfd3JpdGVsKGlvbW11LCBSSVNDVl9JT01NVV9SRUdfRkNU TCwgZmN0bCk7Cj4gKwl9Cj4gKyNlbmRpZgo+ICsKPiArCS8qIENsZWFyIGFueSBwZW5kaW5nIGlu dGVycnVwdCBmbGFnLiAqLwo+ICsJcmlzY3ZfaW9tbXVfd3JpdGVsKGlvbW11LCBSSVNDVl9JT01N VV9SRUdfSVBTUiwKPiArCQkJICAgUklTQ1ZfSU9NTVVfSVBTUl9DSVAgfAo+ICsJCQkgICBSSVND Vl9JT01NVV9JUFNSX0ZJUCB8Cj4gKwkJCSAgIFJJU0NWX0lPTU1VX0lQU1JfUE1JUCB8IFJJU0NW X0lPTU1VX0lQU1JfUElQKTsKPiArCXNwaW5fbG9ja19pbml0KCZpb21tdS0+Y3FfbG9jayk7Cj4g KwltdXRleF9pbml0KCZpb21tdS0+ZXBzX211dGV4KTsKPiArCj4gKwlyZXQgPSByaXNjdl9pb21t dV9lbmFibGUoaW9tbXUsIFJJU0NWX0lPTU1VX0REVFBfTU9ERV9CQVJFKTsKClVtLCB5ZWFoLCB5 b3UgZGVmaW5pdGVseSBkb24ndCBzdXBwb3J0IGJsb2NraW5nIGRvbWFpbnMgaWYgeW91IGp1c3Qg cHV0IAp0aGUgd2hvbGUgdGhpbmcgaW4gYnlwYXNzIDovCgo+ICsKPiArCWlmIChyZXQpIHsKPiAr CQlkZXZfZXJyKGRldiwgImNhbm5vdCBlbmFibGUgaW9tbXUgZGV2aWNlICglZClcbiIsIHJldCk7 Cj4gKwkJZ290byBmYWlsOwo+ICsJfQo+ICsKPiArCXJldCA9IGlvbW11X2RldmljZV9yZWdpc3Rl cigmaW9tbXUtPmlvbW11LCAmcmlzY3ZfaW9tbXVfb3BzLCBkZXYpOwo+ICsJaWYgKHJldCkgewo+ ICsJCWRldl9lcnIoZGV2LCAiY2Fubm90IHJlZ2lzdGVyIGlvbW11IGludGVyZmFjZSAoJWQpXG4i LCByZXQpOwo+ICsJCWlvbW11X2RldmljZV9zeXNmc19yZW1vdmUoJmlvbW11LT5pb21tdSk7CgpC dXQgaXQgd2FzIG5ldmVyIGFkZGVkPwoKPiArCQlnb3RvIGZhaWw7Cj4gKwl9Cj4gKwo+ICsJcmV0 dXJuIDA7Cj4gKyBmYWlsOgo+ICsJcmlzY3ZfaW9tbXVfZW5hYmxlKGlvbW11LCBSSVNDVl9JT01N VV9ERFRQX01PREVfT0ZGKTsKPiArCXJldHVybiByZXQ7Cj4gK30KWy4uLl0KSSBhcHByZWNpYXRl IHRoZSBhdHRlbXB0IHRvIHNwbGl0IHRoZSBzZXJpZXMgdXAgYW5kIG5vdCBoYXZlIG9uZSBnaWFu dCAKNDAwMC1saW5lIHBhdGNoLCBidXQgSSBoYXZlIHRvIHNheSBpdCdzIGtpbmQgb2YgaGFyZCB0 byB1c2VmdWxseSByZXZpZXcgCmEgcGF0Y2ggbGlrZSB0aGlzIHdoZXJlIEknbSBzdHJ1Z2dsaW5n IHRvIHRlbGwgdGhlICJyZWFsIiBjb2RlIGZyb20gdGhlIAp1bmZpbmlzaGVkIGRlYWQgZW5kcyBh bmQgcGxhaW4gbm9uc2Vuc2UuIEknZCBzdWdnZXN0IHNwbGl0dGluZyBpdCB1cCAKc2xpZ2h0bHkg ZGlmZmVyZW50bHk6IHN0cmlwIG91dCBhbGwgdGhlIElPTU1VIEFQSSBzdHVmZiBoZXJlIGFuZCBq dXN0IApoYXZlIHRoaXMgcGF0Y2ggYWRkIHRoZSBiYXNpYyBwcm9iaW5nIGFuZCBoYXJkd2FyZSBp bml0aWFsaXNhdGlvbiwgdGhlbiAKYWRkIHRoZSBxdWV1ZXMsIGRldmljZSB0YWJsZXMgYW5kIHBh Z2V0YWJsZXMsICp0aGVuKiB3aXJlIGl0IGFsbCB1cCB0byAKdGhlIElPTU1VIEFQSSBvbmNlIGl0 IGNhbiBiZSBtZWFuaW5nZnVsbHkgZnVuY3Rpb25hbC4gSXQgb3VnaHQgdG8gYmUgCnBvc3NpYmxl IHRvIGhhdmUgZWFjaCBwYXRjaCBiZSBwdXJlbHkgYWRkaXRpb25zIG9mICJmaW5hbCIgY29kZSwg bm8gCnRlbXBvcmFyeSBwbGFjZWhvbGRlcnMgYW5kIHdlaXJkIGJvZGdlcyBqdXN0IHRvIGxldCBh IGJpc2VjdGlvbiBjb21waWxlIAphbmQvb3IgcHJldGVuZCB0byB3b3JrLiBUaGVuICJleHRyYSIg ZmVhdHVyZXMgbGlrZSBTVkEgY2FuIGJlIGJ1aWx0IG9uIAp0b3AgYXMgeW91IGhhdmUgYWxyZWFk eS4gQW5kIG9mIGNvdXJzZSB3ZSBsaWtlIHRoZSBkdCBiaW5kaW5nIHRvIGJlIApwYXRjaCAjMSA6 KQoKVGhhbmtzLApSb2Jpbi4KCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fCmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZy YWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGlu dXgtcmlzY3YK