From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id DABFCEA8 for ; Tue, 22 Nov 2022 03:13:33 +0000 (UTC) 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 642C01FB; Mon, 21 Nov 2022 19:13:39 -0800 (PST) Received: from [10.162.40.16] (unknown [10.162.40.16]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 05A8C3F587; Mon, 21 Nov 2022 19:13:29 -0800 (PST) Message-ID: <05b6ea24-1135-bcaf-a24e-c0bcbf14101e@arm.com> Date: Tue, 22 Nov 2022 08:43:26 +0530 Precedence: bulk X-Mailing-List: llvm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.2 Subject: Re: [PATCH] arm64/mm: Drop redundant BUG_ON(!pgtable_alloc) Content-Language: en-US To: Robin Murphy , Mark Rutland Cc: Nathan Chancellor , linux-arm-kernel@lists.infradead.org, Catalin Marinas , Will Deacon , Andrew Morton , linux-kernel@vger.kernel.org, llvm@lists.linux.dev References: <20221118053102.500216-1-anshuman.khandual@arm.com> <5b69ff03-1694-bae6-3312-a63273be4073@arm.com> From: Anshuman Khandual In-Reply-To: <5b69ff03-1694-bae6-3312-a63273be4073@arm.com> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On 11/21/22 19:26, Robin Murphy wrote: > On 2022-11-21 12:27, Mark Rutland wrote: >> On Mon, Nov 21, 2022 at 11:00:42AM +0530, Anshuman Khandual wrote: >>> Hello Nathan, >>> >>> Thanks for the report. >>> >>> On 11/20/22 21:46, Nathan Chancellor wrote: >>>> Hi Anshuman, >> >>>> I just bisected a boot failure in our QEMU-based continuous integration >>>> setup to this change as commit 9ed2b4616d4e ("arm64/mm: Drop redundant >>>> BUG_ON(!pgtable_alloc)") in the arm64 tree. There is no output so the >>>> panic clearly happens early at boot. If I move back to the previous >>>> commit and add a WARN_ON() like so: >>>> >>>> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c >>>> index d386033a074c..9280a92ff920 100644 >>>> --- a/arch/arm64/mm/mmu.c >>>> +++ b/arch/arm64/mm/mmu.c >>>> @@ -383,6 +383,7 @@ static void __create_pgd_mapping_locked(pgd_t *pgdir, phys_addr_t phys, >>>>       phys &= PAGE_MASK; >>>>       addr = virt & PAGE_MASK; >>>>       end = PAGE_ALIGN(virt + size); >>>> +    WARN_ON(!pgtable_alloc); >>>>         do { >>>>           next = pgd_addr_end(addr, end); >>>> >>>> I do see some stacktraces. I have attached the boot log from QEMU. >>>> >>>> If there is any additional information I can provide or patches I can >>>> test, I am more than happy to do so. >>> >>> There are couple of instances, where __create_pgd_mapping() function gets called >>> without a valid pgtable alloc function (NULL is passed on instead), as it is not >>> expected to allocate page table pages, during the mapping process. The following >>> change after this patch should solve the reported problem. >>> >>> diff --git a/arch/arm64/mm/mmu.c b/arch/arm64/mm/mmu.c >>> index 9ea8e9039992..a00563122fcb 100644 >>> --- a/arch/arm64/mm/mmu.c >>> +++ b/arch/arm64/mm/mmu.c >>> @@ -42,6 +42,7 @@ >>>   #define NO_BLOCK_MAPPINGS      BIT(0) >>>   #define NO_CONT_MAPPINGS       BIT(1) >>>   #define NO_EXEC_MAPPINGS       BIT(2)  /* assumes FEAT_HPDS is not used */ >>> +#define NO_ALLOC_MAPPINGS      BIT(3)  /* does not allocate page table pages */ >>>     int idmap_t0sz __ro_after_init; >>>   @@ -380,7 +381,7 @@ static void __create_pgd_mapping_locked(pgd_t *pgdir, phys_addr_t phys, >>>          phys &= PAGE_MASK; >>>          addr = virt & PAGE_MASK; >>>          end = PAGE_ALIGN(virt + size); >>> -       BUG_ON(!pgtable_alloc); >>> +       BUG_ON(!(flags & NO_ALLOC_MAPPINGS) && !pgtable_alloc); >>>            do { >>>                  next = pgd_addr_end(addr, end); >>> @@ -453,7 +454,7 @@ static void __init create_mapping_noalloc(phys_addr_t phys, unsigned long virt, >>>                  return; >>>          } >>>          __create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, >>> -                            NO_CONT_MAPPINGS); >>> +                            NO_CONT_MAPPINGS | NO_ALLOC_MAPPINGS); >>>   } >>>     void __init create_pgd_mapping(struct mm_struct *mm, phys_addr_t phys, >>> @@ -481,7 +482,7 @@ static void update_mapping_prot(phys_addr_t phys, unsigned long virt, >>>          } >>>            __create_pgd_mapping(init_mm.pgd, phys, virt, size, prot, NULL, >>> -                            NO_CONT_MAPPINGS); >>> +                            NO_CONT_MAPPINGS | NO_ALLOC_MAPPINGS); >>>            /* flush the TLBs after updating live kernel mappings */ >>>          flush_tlb_kernel_range(virt, virt + size); >> >> This is now more complicated than what we had originally, and it doesn't catch >> the case where the caller sets NO_ALLOC_MAPPINGS but the callee ends up needing >> to perform an allocation, which the old code would have caught. > > Well, it's still "caught" as such - all that BUG_ON(!pgtable_alloc) does in these cases is encode the source location in the backtrace, vs. having to decode it (if necessary) from the LR in a backtrace from immediately dereferencing pgtable_alloc(). If that happens before the user has a console up then the difference is moot anyway. Agreed, also the fact that certain callers are sure about no page table page allocation would be required (hence they just pass "NULL" for pgtable_alloc function), needs to be notified appropriately when page page table creation stumbles upon a pxd_none(). if (pxd_none(pmd)) { BUG_ON(flags & NO_ALLOC_MAPPINGS); } Although there are might be an argument that all erstwhile BUG_ON(!pgtable_alloc) has replacements with BUG_ON(flags & NO_ALLOC_MAPPINGS), but there is a subtle difference. It captures the fact (in a rather structured manner), that caller made a choice with NO_ALLOC_MAPPINGS but called __create_pgd_mapping() on a page table, where intermediate page table page alloc would still be required. IMHO adding that explicit structure here via the new flag NO_ALLOC_MAPPINGS makes sense. 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 A68C2C433FE for ; Tue, 22 Nov 2022 03:15:19 +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-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc: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=e9fNbOlQIy5R6nZH5nYoPN6ibbLGoN0+DyZXCMOYw4Y=; b=OTIB+/QLeeOJJW R+QETwPcNjQvkWi2amtCPKEkowYyUw2qjoUrNaMBGWLhGmd6wi6R9djuse9Ltbq3Q/AHUSNJTPc77 d+TS4QMl5tA9Ftgpk/dM7S56bWm0iH11XJdG5kJPEjW/JsY3K0JU4S1q9FcsuLpZxfhdM43Rfbigx awfOnMfwdOFxzpzLlddF1gsA99QyzdXkxarZK2BHqS3ImGoxdxUoAccdfzSRjTywLm+p4n80sy8sp WKRcyaixiiscGpNWdoqZL/ekTGEv3FmaLs3/5p6zkSubfIOWqyB6d5T0TdNKi1Sfwmwy/MVbHqXvX UdPvzIJjpiqdZP/Gx22w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oxJjE-002xiS-SF; Tue, 22 Nov 2022 03:13:45 +0000 Received: from foss.arm.com ([217.140.110.172]) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oxJj9-002xeZ-UY for linux-arm-kernel@lists.infradead.org; Tue, 22 Nov 2022 03:13:42 +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 642C01FB; Mon, 21 Nov 2022 19:13:39 -0800 (PST) Received: from [10.162.40.16] (unknown [10.162.40.16]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 05A8C3F587; Mon, 21 Nov 2022 19:13:29 -0800 (PST) Message-ID: <05b6ea24-1135-bcaf-a24e-c0bcbf14101e@arm.com> Date: Tue, 22 Nov 2022 08:43:26 +0530 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.2.2 Subject: Re: [PATCH] arm64/mm: Drop redundant BUG_ON(!pgtable_alloc) Content-Language: en-US To: Robin Murphy , Mark Rutland Cc: Nathan Chancellor , linux-arm-kernel@lists.infradead.org, Catalin Marinas , Will Deacon , Andrew Morton , linux-kernel@vger.kernel.org, llvm@lists.linux.dev References: <20221118053102.500216-1-anshuman.khandual@arm.com> <5b69ff03-1694-bae6-3312-a63273be4073@arm.com> From: Anshuman Khandual In-Reply-To: <5b69ff03-1694-bae6-3312-a63273be4073@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221121_191340_100070_DAF34FAB X-CRM114-Status: GOOD ( 23.16 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CgpPbiAxMS8yMS8yMiAxOToyNiwgUm9iaW4gTXVycGh5IHdyb3RlOgo+IE9uIDIwMjItMTEtMjEg MTI6MjcsIE1hcmsgUnV0bGFuZCB3cm90ZToKPj4gT24gTW9uLCBOb3YgMjEsIDIwMjIgYXQgMTE6 MDA6NDJBTSArMDUzMCwgQW5zaHVtYW4gS2hhbmR1YWwgd3JvdGU6Cj4+PiBIZWxsbyBOYXRoYW4s Cj4+Pgo+Pj4gVGhhbmtzIGZvciB0aGUgcmVwb3J0Lgo+Pj4KPj4+IE9uIDExLzIwLzIyIDIxOjQ2 LCBOYXRoYW4gQ2hhbmNlbGxvciB3cm90ZToKPj4+PiBIaSBBbnNodW1hbiwKPj4KPj4+PiBJIGp1 c3QgYmlzZWN0ZWQgYSBib290IGZhaWx1cmUgaW4gb3VyIFFFTVUtYmFzZWQgY29udGludW91cyBp bnRlZ3JhdGlvbgo+Pj4+IHNldHVwIHRvIHRoaXMgY2hhbmdlIGFzIGNvbW1pdCA5ZWQyYjQ2MTZk NGUgKCJhcm02NC9tbTogRHJvcCByZWR1bmRhbnQKPj4+PiBCVUdfT04oIXBndGFibGVfYWxsb2Mp IikgaW4gdGhlIGFybTY0IHRyZWUuIFRoZXJlIGlzIG5vIG91dHB1dCBzbyB0aGUKPj4+PiBwYW5p YyBjbGVhcmx5IGhhcHBlbnMgZWFybHkgYXQgYm9vdC4gSWYgSSBtb3ZlIGJhY2sgdG8gdGhlIHBy ZXZpb3VzCj4+Pj4gY29tbWl0IGFuZCBhZGQgYSBXQVJOX09OKCkgbGlrZSBzbzoKPj4+Pgo+Pj4+ IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL21tdS5jIGIvYXJjaC9hcm02NC9tbS9tbXUuYwo+ Pj4+IGluZGV4IGQzODYwMzNhMDc0Yy4uOTI4MGE5MmZmOTIwIDEwMDY0NAo+Pj4+IC0tLSBhL2Fy Y2gvYXJtNjQvbW0vbW11LmMKPj4+PiArKysgYi9hcmNoL2FybTY0L21tL21tdS5jCj4+Pj4gQEAg LTM4Myw2ICszODMsNyBAQCBzdGF0aWMgdm9pZCBfX2NyZWF0ZV9wZ2RfbWFwcGluZ19sb2NrZWQo cGdkX3QgKnBnZGlyLCBwaHlzX2FkZHJfdCBwaHlzLAo+Pj4+IMKgwqDCoMKgwqAgcGh5cyAmPSBQ QUdFX01BU0s7Cj4+Pj4gwqDCoMKgwqDCoCBhZGRyID0gdmlydCAmIFBBR0VfTUFTSzsKPj4+PiDC oMKgwqDCoMKgIGVuZCA9IFBBR0VfQUxJR04odmlydCArIHNpemUpOwo+Pj4+ICvCoMKgwqAgV0FS Tl9PTighcGd0YWJsZV9hbGxvYyk7Cj4+Pj4gwqAgwqDCoMKgwqDCoCBkbyB7Cj4+Pj4gwqDCoMKg wqDCoMKgwqDCoMKgIG5leHQgPSBwZ2RfYWRkcl9lbmQoYWRkciwgZW5kKTsKPj4+Pgo+Pj4+IEkg ZG8gc2VlIHNvbWUgc3RhY2t0cmFjZXMuIEkgaGF2ZSBhdHRhY2hlZCB0aGUgYm9vdCBsb2cgZnJv bSBRRU1VLgo+Pj4+Cj4+Pj4gSWYgdGhlcmUgaXMgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24g SSBjYW4gcHJvdmlkZSBvciBwYXRjaGVzIEkgY2FuCj4+Pj4gdGVzdCwgSSBhbSBtb3JlIHRoYW4g aGFwcHkgdG8gZG8gc28uCj4+Pgo+Pj4gVGhlcmUgYXJlIGNvdXBsZSBvZiBpbnN0YW5jZXMsIHdo ZXJlIF9fY3JlYXRlX3BnZF9tYXBwaW5nKCkgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKPj4+IHdpdGhv dXQgYSB2YWxpZCBwZ3RhYmxlIGFsbG9jIGZ1bmN0aW9uIChOVUxMIGlzIHBhc3NlZCBvbiBpbnN0 ZWFkKSwgYXMgaXQgaXMgbm90Cj4+PiBleHBlY3RlZCB0byBhbGxvY2F0ZSBwYWdlIHRhYmxlIHBh Z2VzLCBkdXJpbmcgdGhlIG1hcHBpbmcgcHJvY2Vzcy4gVGhlIGZvbGxvd2luZwo+Pj4gY2hhbmdl IGFmdGVyIHRoaXMgcGF0Y2ggc2hvdWxkIHNvbHZlIHRoZSByZXBvcnRlZCBwcm9ibGVtLgo+Pj4K Pj4+IGRpZmYgLS1naXQgYS9hcmNoL2FybTY0L21tL21tdS5jIGIvYXJjaC9hcm02NC9tbS9tbXUu Ywo+Pj4gaW5kZXggOWVhOGU5MDM5OTkyLi5hMDA1NjMxMjJmY2IgMTAwNjQ0Cj4+PiAtLS0gYS9h cmNoL2FybTY0L21tL21tdS5jCj4+PiArKysgYi9hcmNoL2FybTY0L21tL21tdS5jCj4+PiBAQCAt NDIsNiArNDIsNyBAQAo+Pj4gwqAgI2RlZmluZSBOT19CTE9DS19NQVBQSU5HU8KgwqDCoMKgwqAg QklUKDApCj4+PiDCoCAjZGVmaW5lIE5PX0NPTlRfTUFQUElOR1PCoMKgwqDCoMKgwqAgQklUKDEp Cj4+PiDCoCAjZGVmaW5lIE5PX0VYRUNfTUFQUElOR1PCoMKgwqDCoMKgwqAgQklUKDIpwqAgLyog YXNzdW1lcyBGRUFUX0hQRFMgaXMgbm90IHVzZWQgKi8KPj4+ICsjZGVmaW5lIE5PX0FMTE9DX01B UFBJTkdTwqDCoMKgwqDCoCBCSVQoMynCoCAvKiBkb2VzIG5vdCBhbGxvY2F0ZSBwYWdlIHRhYmxl IHBhZ2VzICovCj4+PiDCoCDCoCBpbnQgaWRtYXBfdDBzeiBfX3JvX2FmdGVyX2luaXQ7Cj4+PiDC oCBAQCAtMzgwLDcgKzM4MSw3IEBAIHN0YXRpYyB2b2lkIF9fY3JlYXRlX3BnZF9tYXBwaW5nX2xv Y2tlZChwZ2RfdCAqcGdkaXIsIHBoeXNfYWRkcl90IHBoeXMsCj4+PiDCoMKgwqDCoMKgwqDCoMKg IHBoeXMgJj0gUEFHRV9NQVNLOwo+Pj4gwqDCoMKgwqDCoMKgwqDCoCBhZGRyID0gdmlydCAmIFBB R0VfTUFTSzsKPj4+IMKgwqDCoMKgwqDCoMKgwqAgZW5kID0gUEFHRV9BTElHTih2aXJ0ICsgc2l6 ZSk7Cj4+PiAtwqDCoMKgwqDCoMKgIEJVR19PTighcGd0YWJsZV9hbGxvYyk7Cj4+PiArwqDCoMKg wqDCoMKgIEJVR19PTighKGZsYWdzICYgTk9fQUxMT0NfTUFQUElOR1MpICYmICFwZ3RhYmxlX2Fs bG9jKTsKPj4+IMKgIMKgwqDCoMKgwqDCoMKgwqAgZG8gewo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqAgbmV4dCA9IHBnZF9hZGRyX2VuZChhZGRyLCBlbmQpOwo+Pj4gQEAgLTQ1 Myw3ICs0NTQsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgY3JlYXRlX21hcHBpbmdfbm9hbGxvYyhw aHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHZpcnQsCj4+PiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+PiDCoMKgwqDCoMKgwqDCoMKgIH0KPj4+IMKgwqDC oMKgwqDCoMKgwqAgX19jcmVhdGVfcGdkX21hcHBpbmcoaW5pdF9tbS5wZ2QsIHBoeXMsIHZpcnQs IHNpemUsIHByb3QsIE5VTEwsCj4+PiAtwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgIE5PX0NPTlRfTUFQUElOR1MpOwo+Pj4gK8KgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBOT19DT05UX01BUFBJ TkdTIHwgTk9fQUxMT0NfTUFQUElOR1MpOwo+Pj4gwqAgfQo+Pj4gwqAgwqAgdm9pZCBfX2luaXQg Y3JlYXRlX3BnZF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBwaHlzX2FkZHJfdCBwaHlz LAo+Pj4gQEAgLTQ4MSw3ICs0ODIsNyBAQCBzdGF0aWMgdm9pZCB1cGRhdGVfbWFwcGluZ19wcm90 KHBoeXNfYWRkcl90IHBoeXMsIHVuc2lnbmVkIGxvbmcgdmlydCwKPj4+IMKgwqDCoMKgwqDCoMKg wqAgfQo+Pj4gwqAgwqDCoMKgwqDCoMKgwqDCoCBfX2NyZWF0ZV9wZ2RfbWFwcGluZyhpbml0X21t LnBnZCwgcGh5cywgdmlydCwgc2l6ZSwgcHJvdCwgTlVMTCwKPj4+IC3CoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgTk9fQ09OVF9NQVBQSU5HUyk7 Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIE5PX0NPTlRfTUFQUElOR1MgfCBOT19BTExPQ19NQVBQSU5HUyk7Cj4+PiDCoCDCoMKgwqDC oMKgwqDCoMKgIC8qIGZsdXNoIHRoZSBUTEJzIGFmdGVyIHVwZGF0aW5nIGxpdmUga2VybmVsIG1h cHBpbmdzICovCj4+PiDCoMKgwqDCoMKgwqDCoMKgIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2Uodmly dCwgdmlydCArIHNpemUpOwo+Pgo+PiBUaGlzIGlzIG5vdyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4g d2hhdCB3ZSBoYWQgb3JpZ2luYWxseSwgYW5kIGl0IGRvZXNuJ3QgY2F0Y2gKPj4gdGhlIGNhc2Ug d2hlcmUgdGhlIGNhbGxlciBzZXRzIE5PX0FMTE9DX01BUFBJTkdTIGJ1dCB0aGUgY2FsbGVlIGVu ZHMgdXAgbmVlZGluZwo+PiB0byBwZXJmb3JtIGFuIGFsbG9jYXRpb24sIHdoaWNoIHRoZSBvbGQg Y29kZSB3b3VsZCBoYXZlIGNhdWdodC4KPiAKPiBXZWxsLCBpdCdzIHN0aWxsICJjYXVnaHQiIGFz IHN1Y2ggLSBhbGwgdGhhdCBCVUdfT04oIXBndGFibGVfYWxsb2MpIGRvZXMgaW4gdGhlc2UgY2Fz ZXMgaXMgZW5jb2RlIHRoZSBzb3VyY2UgbG9jYXRpb24gaW4gdGhlIGJhY2t0cmFjZSwgdnMuIGhh dmluZyB0byBkZWNvZGUgaXQgKGlmIG5lY2Vzc2FyeSkgZnJvbSB0aGUgTFIgaW4gYSBiYWNrdHJh Y2UgZnJvbSBpbW1lZGlhdGVseSBkZXJlZmVyZW5jaW5nIHBndGFibGVfYWxsb2MoKS4gSWYgdGhh dCBoYXBwZW5zIGJlZm9yZSB0aGUgdXNlciBoYXMgYSBjb25zb2xlIHVwIHRoZW4gdGhlIGRpZmZl cmVuY2UgaXMgbW9vdCBhbnl3YXkuCgpBZ3JlZWQsIGFsc28gdGhlIGZhY3QgdGhhdCBjZXJ0YWlu IGNhbGxlcnMgYXJlIHN1cmUgYWJvdXQgbm8gcGFnZSB0YWJsZSBwYWdlIGFsbG9jYXRpb24Kd291 bGQgYmUgcmVxdWlyZWQgKGhlbmNlIHRoZXkganVzdCBwYXNzICJOVUxMIiBmb3IgcGd0YWJsZV9h bGxvYyBmdW5jdGlvbiksIG5lZWRzIHRvIGJlCm5vdGlmaWVkIGFwcHJvcHJpYXRlbHkgd2hlbiBw YWdlIHBhZ2UgdGFibGUgY3JlYXRpb24gc3R1bWJsZXMgdXBvbiBhIHB4ZF9ub25lKCkuCgppZiAo cHhkX25vbmUocG1kKSkgewoJQlVHX09OKGZsYWdzICYgTk9fQUxMT0NfTUFQUElOR1MpOwp9CgpB bHRob3VnaCB0aGVyZSBhcmUgbWlnaHQgYmUgYW4gYXJndW1lbnQgdGhhdCBhbGwgZXJzdHdoaWxl IEJVR19PTighcGd0YWJsZV9hbGxvYykgaGFzCnJlcGxhY2VtZW50cyB3aXRoIEJVR19PTihmbGFn cyAmIE5PX0FMTE9DX01BUFBJTkdTKSwgYnV0IHRoZXJlIGlzIGEgc3VidGxlIGRpZmZlcmVuY2Uu Ckl0IGNhcHR1cmVzIHRoZSBmYWN0IChpbiBhIHJhdGhlciBzdHJ1Y3R1cmVkIG1hbm5lciksIHRo YXQgY2FsbGVyIG1hZGUgYSBjaG9pY2Ugd2l0aApOT19BTExPQ19NQVBQSU5HUyBidXQgY2FsbGVk IF9fY3JlYXRlX3BnZF9tYXBwaW5nKCkgb24gYSBwYWdlIHRhYmxlLCB3aGVyZSBpbnRlcm1lZGlh dGUKcGFnZSB0YWJsZSBwYWdlIGFsbG9jIHdvdWxkIHN0aWxsIGJlIHJlcXVpcmVkLiBJTUhPIGFk ZGluZyB0aGF0IGV4cGxpY2l0IHN0cnVjdHVyZSBoZXJlCnZpYSB0aGUgbmV3IGZsYWcgTk9fQUxM T0NfTUFQUElOR1MgbWFrZXMgc2Vuc2UuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0t a2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFp bG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==