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 CA4D33222 for ; Tue, 22 Nov 2022 19:08:32 +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 7B5D91FB; Tue, 22 Nov 2022 11:08:38 -0800 (PST) Received: from [10.57.71.118] (unknown [10.57.71.118]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9865B3F73B; Tue, 22 Nov 2022 11:08:30 -0800 (PST) Message-ID: Date: Tue, 22 Nov 2022 19:08:23 +0000 Precedence: bulk X-Mailing-List: llvm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Thunderbird/102.5.0 Subject: Re: [PATCH] arm64/mm: Drop redundant BUG_ON(!pgtable_alloc) Content-Language: en-GB To: Anshuman Khandual , 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> <05b6ea24-1135-bcaf-a24e-c0bcbf14101e@arm.com> From: Robin Murphy In-Reply-To: <05b6ea24-1135-bcaf-a24e-c0bcbf14101e@arm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit On 2022-11-22 03:13, Anshuman Khandual wrote: > > > 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. Hmm, I dunno, it seems clear enough to me that the callers which do not intend to allocate indicate that by passing a NULL allocator callback. Personally I don't see the benefit in adding code to make all those callers redundantly encode their intent twice over just so that we can also add code to catch them out and crash if they don't. Weren't you trying to clean up redundancy? As I say I think any BUG_ON() has very limited value as documentation where the only way to proceed is by dereferencing NULL in an identifiable manner anyway, but that's largely a matter of taste and I know others might disagree. Thanks, Robin. 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 3DB04C4332F for ; Tue, 22 Nov 2022 19:09:46 +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: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=1pR7hqw9IL33J+NTikTb9KSBYvRO47m9rfs/HdEdzxE=; b=RtQutd97p6KTlF u7ft4KHbXRFtPf4Lek7umOsTdVSUuf31+/pG8SelNi6bL4+PR1IjUUQjTk4rSEcmLgoeWjcZxwQHn pN3m7HvUX1gJjhsHdEIGgpuq5hDIIUdclpS1RNdHMCSyG01btdunN+2mdNPrkpFERlwDqprW175gf 9sGTolPLTcnE2IVPRpwdr1YGz8UQ6A7lewwhAxFVKH44VIV8NeBfwbqUrT1gpvICfqVSgN5dOmxD9 tGF9tW56B+JJFb8RBcJsLdu6M6LC72W4+2ORqlnduN/uT7GqLClfJn5ukoPPVNHx6BxEezpYz0a24 98SFWrKl7zdncDZCeF/g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1oxYdO-00BVI3-LY; Tue, 22 Nov 2022 19:08:42 +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 1oxYdK-00BVFd-KQ for linux-arm-kernel@lists.infradead.org; Tue, 22 Nov 2022 19:08:40 +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 7B5D91FB; Tue, 22 Nov 2022 11:08:38 -0800 (PST) Received: from [10.57.71.118] (unknown [10.57.71.118]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 9865B3F73B; Tue, 22 Nov 2022 11:08:30 -0800 (PST) Message-ID: Date: Tue, 22 Nov 2022 19:08:23 +0000 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; rv:102.0) Gecko/20100101 Thunderbird/102.5.0 Subject: Re: [PATCH] arm64/mm: Drop redundant BUG_ON(!pgtable_alloc) Content-Language: en-GB To: Anshuman Khandual , 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> <05b6ea24-1135-bcaf-a24e-c0bcbf14101e@arm.com> From: Robin Murphy In-Reply-To: <05b6ea24-1135-bcaf-a24e-c0bcbf14101e@arm.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20221122_110838_796805_BF511E14 X-CRM114-Status: GOOD ( 25.94 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjAyMi0xMS0yMiAwMzoxMywgQW5zaHVtYW4gS2hhbmR1YWwgd3JvdGU6Cj4gCj4gCj4gT24g MTEvMjEvMjIgMTk6MjYsIFJvYmluIE11cnBoeSB3cm90ZToKPj4gT24gMjAyMi0xMS0yMSAxMjoy NywgTWFyayBSdXRsYW5kIHdyb3RlOgo+Pj4gT24gTW9uLCBOb3YgMjEsIDIwMjIgYXQgMTE6MDA6 NDJBTSArMDUzMCwgQW5zaHVtYW4gS2hhbmR1YWwgd3JvdGU6Cj4+Pj4gSGVsbG8gTmF0aGFuLAo+ Pj4+Cj4+Pj4gVGhhbmtzIGZvciB0aGUgcmVwb3J0Lgo+Pj4+Cj4+Pj4gT24gMTEvMjAvMjIgMjE6 NDYsIE5hdGhhbiBDaGFuY2VsbG9yIHdyb3RlOgo+Pj4+PiBIaSBBbnNodW1hbiwKPj4+Cj4+Pj4+ IEkganVzdCBiaXNlY3RlZCBhIGJvb3QgZmFpbHVyZSBpbiBvdXIgUUVNVS1iYXNlZCBjb250aW51 b3VzIGludGVncmF0aW9uCj4+Pj4+IHNldHVwIHRvIHRoaXMgY2hhbmdlIGFzIGNvbW1pdCA5ZWQy YjQ2MTZkNGUgKCJhcm02NC9tbTogRHJvcCByZWR1bmRhbnQKPj4+Pj4gQlVHX09OKCFwZ3RhYmxl X2FsbG9jKSIpIGluIHRoZSBhcm02NCB0cmVlLiBUaGVyZSBpcyBubyBvdXRwdXQgc28gdGhlCj4+ Pj4+IHBhbmljIGNsZWFybHkgaGFwcGVucyBlYXJseSBhdCBib290LiBJZiBJIG1vdmUgYmFjayB0 byB0aGUgcHJldmlvdXMKPj4+Pj4gY29tbWl0IGFuZCBhZGQgYSBXQVJOX09OKCkgbGlrZSBzbzoK Pj4+Pj4KPj4+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvYXJtNjQvbW0vbW11LmMgYi9hcmNoL2FybTY0 L21tL21tdS5jCj4+Pj4+IGluZGV4IGQzODYwMzNhMDc0Yy4uOTI4MGE5MmZmOTIwIDEwMDY0NAo+ Pj4+PiAtLS0gYS9hcmNoL2FybTY0L21tL21tdS5jCj4+Pj4+ICsrKyBiL2FyY2gvYXJtNjQvbW0v bW11LmMKPj4+Pj4gQEAgLTM4Myw2ICszODMsNyBAQCBzdGF0aWMgdm9pZCBfX2NyZWF0ZV9wZ2Rf bWFwcGluZ19sb2NrZWQocGdkX3QgKnBnZGlyLCBwaHlzX2FkZHJfdCBwaHlzLAo+Pj4+PiAgwqDC oMKgwqDCoCBwaHlzICY9IFBBR0VfTUFTSzsKPj4+Pj4gIMKgwqDCoMKgwqAgYWRkciA9IHZpcnQg JiBQQUdFX01BU0s7Cj4+Pj4+ICDCoMKgwqDCoMKgIGVuZCA9IFBBR0VfQUxJR04odmlydCArIHNp emUpOwo+Pj4+PiArwqDCoMKgIFdBUk5fT04oIXBndGFibGVfYWxsb2MpOwo+Pj4+PiAgwqAgwqDC oMKgwqDCoCBkbyB7Cj4+Pj4+ICDCoMKgwqDCoMKgwqDCoMKgwqAgbmV4dCA9IHBnZF9hZGRyX2Vu ZChhZGRyLCBlbmQpOwo+Pj4+Pgo+Pj4+PiBJIGRvIHNlZSBzb21lIHN0YWNrdHJhY2VzLiBJIGhh dmUgYXR0YWNoZWQgdGhlIGJvb3QgbG9nIGZyb20gUUVNVS4KPj4+Pj4KPj4+Pj4gSWYgdGhlcmUg aXMgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gSSBjYW4gcHJvdmlkZSBvciBwYXRjaGVzIEkg Y2FuCj4+Pj4+IHRlc3QsIEkgYW0gbW9yZSB0aGFuIGhhcHB5IHRvIGRvIHNvLgo+Pj4+Cj4+Pj4g VGhlcmUgYXJlIGNvdXBsZSBvZiBpbnN0YW5jZXMsIHdoZXJlIF9fY3JlYXRlX3BnZF9tYXBwaW5n KCkgZnVuY3Rpb24gZ2V0cyBjYWxsZWQKPj4+PiB3aXRob3V0IGEgdmFsaWQgcGd0YWJsZSBhbGxv YyBmdW5jdGlvbiAoTlVMTCBpcyBwYXNzZWQgb24gaW5zdGVhZCksIGFzIGl0IGlzIG5vdAo+Pj4+ IGV4cGVjdGVkIHRvIGFsbG9jYXRlIHBhZ2UgdGFibGUgcGFnZXMsIGR1cmluZyB0aGUgbWFwcGlu ZyBwcm9jZXNzLiBUaGUgZm9sbG93aW5nCj4+Pj4gY2hhbmdlIGFmdGVyIHRoaXMgcGF0Y2ggc2hv dWxkIHNvbHZlIHRoZSByZXBvcnRlZCBwcm9ibGVtLgo+Pj4+Cj4+Pj4gZGlmZiAtLWdpdCBhL2Fy Y2gvYXJtNjQvbW0vbW11LmMgYi9hcmNoL2FybTY0L21tL21tdS5jCj4+Pj4gaW5kZXggOWVhOGU5 MDM5OTkyLi5hMDA1NjMxMjJmY2IgMTAwNjQ0Cj4+Pj4gLS0tIGEvYXJjaC9hcm02NC9tbS9tbXUu Ywo+Pj4+ICsrKyBiL2FyY2gvYXJtNjQvbW0vbW11LmMKPj4+PiBAQCAtNDIsNiArNDIsNyBAQAo+ Pj4+ICDCoCAjZGVmaW5lIE5PX0JMT0NLX01BUFBJTkdTwqDCoMKgwqDCoCBCSVQoMCkKPj4+PiAg wqAgI2RlZmluZSBOT19DT05UX01BUFBJTkdTwqDCoMKgwqDCoMKgIEJJVCgxKQo+Pj4+ICDCoCAj ZGVmaW5lIE5PX0VYRUNfTUFQUElOR1PCoMKgwqDCoMKgwqAgQklUKDIpwqAgLyogYXNzdW1lcyBG RUFUX0hQRFMgaXMgbm90IHVzZWQgKi8KPj4+PiArI2RlZmluZSBOT19BTExPQ19NQVBQSU5HU8Kg wqDCoMKgwqAgQklUKDMpwqAgLyogZG9lcyBub3QgYWxsb2NhdGUgcGFnZSB0YWJsZSBwYWdlcyAq Lwo+Pj4+ICDCoCDCoCBpbnQgaWRtYXBfdDBzeiBfX3JvX2FmdGVyX2luaXQ7Cj4+Pj4gIMKgIEBA IC0zODAsNyArMzgxLDcgQEAgc3RhdGljIHZvaWQgX19jcmVhdGVfcGdkX21hcHBpbmdfbG9ja2Vk KHBnZF90ICpwZ2RpciwgcGh5c19hZGRyX3QgcGh5cywKPj4+PiAgwqDCoMKgwqDCoMKgwqDCoCBw aHlzICY9IFBBR0VfTUFTSzsKPj4+PiAgwqDCoMKgwqDCoMKgwqDCoCBhZGRyID0gdmlydCAmIFBB R0VfTUFTSzsKPj4+PiAgwqDCoMKgwqDCoMKgwqDCoCBlbmQgPSBQQUdFX0FMSUdOKHZpcnQgKyBz aXplKTsKPj4+PiAtwqDCoMKgwqDCoMKgIEJVR19PTighcGd0YWJsZV9hbGxvYyk7Cj4+Pj4gK8Kg wqDCoMKgwqDCoCBCVUdfT04oIShmbGFncyAmIE5PX0FMTE9DX01BUFBJTkdTKSAmJiAhcGd0YWJs ZV9hbGxvYyk7Cj4+Pj4gIMKgIMKgwqDCoMKgwqDCoMKgwqAgZG8gewo+Pj4+ICDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBuZXh0ID0gcGdkX2FkZHJfZW5kKGFkZHIsIGVuZCk7Cj4+ Pj4gQEAgLTQ1Myw3ICs0NTQsNyBAQCBzdGF0aWMgdm9pZCBfX2luaXQgY3JlYXRlX21hcHBpbmdf bm9hbGxvYyhwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHZpcnQsCj4+Pj4gIMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybjsKPj4+PiAgwqDCoMKgwqDCoMKgwqDC oCB9Cj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqAgX19jcmVhdGVfcGdkX21hcHBpbmcoaW5pdF9tbS5w Z2QsIHBoeXMsIHZpcnQsIHNpemUsIHByb3QsIE5VTEwsCj4+Pj4gLcKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBOT19DT05UX01BUFBJTkdTKTsK Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIE5PX0NPTlRfTUFQUElOR1MgfCBOT19BTExPQ19NQVBQSU5HUyk7Cj4+Pj4gIMKgIH0KPj4+ PiAgwqAgwqAgdm9pZCBfX2luaXQgY3JlYXRlX3BnZF9tYXBwaW5nKHN0cnVjdCBtbV9zdHJ1Y3Qg Km1tLCBwaHlzX2FkZHJfdCBwaHlzLAo+Pj4+IEBAIC00ODEsNyArNDgyLDcgQEAgc3RhdGljIHZv aWQgdXBkYXRlX21hcHBpbmdfcHJvdChwaHlzX2FkZHJfdCBwaHlzLCB1bnNpZ25lZCBsb25nIHZp cnQsCj4+Pj4gIMKgwqDCoMKgwqDCoMKgwqAgfQo+Pj4+ICDCoCDCoMKgwqDCoMKgwqDCoMKgIF9f Y3JlYXRlX3BnZF9tYXBwaW5nKGluaXRfbW0ucGdkLCBwaHlzLCB2aXJ0LCBzaXplLCBwcm90LCBO VUxMLAo+Pj4+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgTk9fQ09OVF9NQVBQSU5HUyk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBOT19DT05UX01BUFBJTkdTIHwgTk9fQUxM T0NfTUFQUElOR1MpOwo+Pj4+ICDCoCDCoMKgwqDCoMKgwqDCoMKgIC8qIGZsdXNoIHRoZSBUTEJz IGFmdGVyIHVwZGF0aW5nIGxpdmUga2VybmVsIG1hcHBpbmdzICovCj4+Pj4gIMKgwqDCoMKgwqDC oMKgwqAgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh2aXJ0LCB2aXJ0ICsgc2l6ZSk7Cj4+Pgo+Pj4g VGhpcyBpcyBub3cgbW9yZSBjb21wbGljYXRlZCB0aGFuIHdoYXQgd2UgaGFkIG9yaWdpbmFsbHks IGFuZCBpdCBkb2Vzbid0IGNhdGNoCj4+PiB0aGUgY2FzZSB3aGVyZSB0aGUgY2FsbGVyIHNldHMg Tk9fQUxMT0NfTUFQUElOR1MgYnV0IHRoZSBjYWxsZWUgZW5kcyB1cCBuZWVkaW5nCj4+PiB0byBw ZXJmb3JtIGFuIGFsbG9jYXRpb24sIHdoaWNoIHRoZSBvbGQgY29kZSB3b3VsZCBoYXZlIGNhdWdo dC4KPj4KPj4gV2VsbCwgaXQncyBzdGlsbCAiY2F1Z2h0IiBhcyBzdWNoIC0gYWxsIHRoYXQgQlVH X09OKCFwZ3RhYmxlX2FsbG9jKSBkb2VzIGluIHRoZXNlIGNhc2VzIGlzIGVuY29kZSB0aGUgc291 cmNlIGxvY2F0aW9uIGluIHRoZSBiYWNrdHJhY2UsIHZzLiBoYXZpbmcgdG8gZGVjb2RlIGl0IChp ZiBuZWNlc3NhcnkpIGZyb20gdGhlIExSIGluIGEgYmFja3RyYWNlIGZyb20gaW1tZWRpYXRlbHkg ZGVyZWZlcmVuY2luZyBwZ3RhYmxlX2FsbG9jKCkuIElmIHRoYXQgaGFwcGVucyBiZWZvcmUgdGhl IHVzZXIgaGFzIGEgY29uc29sZSB1cCB0aGVuIHRoZSBkaWZmZXJlbmNlIGlzIG1vb3QgYW55d2F5 Lgo+IAo+IEFncmVlZCwgYWxzbyB0aGUgZmFjdCB0aGF0IGNlcnRhaW4gY2FsbGVycyBhcmUgc3Vy ZSBhYm91dCBubyBwYWdlIHRhYmxlIHBhZ2UgYWxsb2NhdGlvbgo+IHdvdWxkIGJlIHJlcXVpcmVk IChoZW5jZSB0aGV5IGp1c3QgcGFzcyAiTlVMTCIgZm9yIHBndGFibGVfYWxsb2MgZnVuY3Rpb24p LCBuZWVkcyB0byBiZQo+IG5vdGlmaWVkIGFwcHJvcHJpYXRlbHkgd2hlbiBwYWdlIHBhZ2UgdGFi bGUgY3JlYXRpb24gc3R1bWJsZXMgdXBvbiBhIHB4ZF9ub25lKCkuCj4gCj4gaWYgKHB4ZF9ub25l KHBtZCkpIHsKPiAJQlVHX09OKGZsYWdzICYgTk9fQUxMT0NfTUFQUElOR1MpOwo+IH0KPiAKPiBB bHRob3VnaCB0aGVyZSBhcmUgbWlnaHQgYmUgYW4gYXJndW1lbnQgdGhhdCBhbGwgZXJzdHdoaWxl IEJVR19PTighcGd0YWJsZV9hbGxvYykgaGFzCj4gcmVwbGFjZW1lbnRzIHdpdGggQlVHX09OKGZs YWdzICYgTk9fQUxMT0NfTUFQUElOR1MpLCBidXQgdGhlcmUgaXMgYSBzdWJ0bGUgZGlmZmVyZW5j ZS4KPiBJdCBjYXB0dXJlcyB0aGUgZmFjdCAoaW4gYSByYXRoZXIgc3RydWN0dXJlZCBtYW5uZXIp LCB0aGF0IGNhbGxlciBtYWRlIGEgY2hvaWNlIHdpdGgKPiBOT19BTExPQ19NQVBQSU5HUyBidXQg Y2FsbGVkIF9fY3JlYXRlX3BnZF9tYXBwaW5nKCkgb24gYSBwYWdlIHRhYmxlLCB3aGVyZSBpbnRl cm1lZGlhdGUKPiBwYWdlIHRhYmxlIHBhZ2UgYWxsb2Mgd291bGQgc3RpbGwgYmUgcmVxdWlyZWQu IElNSE8gYWRkaW5nIHRoYXQgZXhwbGljaXQgc3RydWN0dXJlIGhlcmUKPiB2aWEgdGhlIG5ldyBm bGFnIE5PX0FMTE9DX01BUFBJTkdTIG1ha2VzIHNlbnNlLgoKSG1tLCBJIGR1bm5vLCBpdCBzZWVt cyBjbGVhciBlbm91Z2ggdG8gbWUgdGhhdCB0aGUgY2FsbGVycyB3aGljaCBkbyBub3QgCmludGVu ZCB0byBhbGxvY2F0ZSBpbmRpY2F0ZSB0aGF0IGJ5IHBhc3NpbmcgYSBOVUxMIGFsbG9jYXRvciBj YWxsYmFjay4gClBlcnNvbmFsbHkgSSBkb24ndCBzZWUgdGhlIGJlbmVmaXQgaW4gYWRkaW5nIGNv ZGUgdG8gbWFrZSBhbGwgdGhvc2UgCmNhbGxlcnMgcmVkdW5kYW50bHkgZW5jb2RlIHRoZWlyIGlu dGVudCB0d2ljZSBvdmVyIGp1c3Qgc28gdGhhdCB3ZSBjYW4gCmFsc28gYWRkIGNvZGUgdG8gY2F0 Y2ggdGhlbSBvdXQgYW5kIGNyYXNoIGlmIHRoZXkgZG9uJ3QuIFdlcmVuJ3QgeW91IAp0cnlpbmcg dG8gY2xlYW4gdXAgcmVkdW5kYW5jeT8KCkFzIEkgc2F5IEkgdGhpbmsgYW55IEJVR19PTigpIGhh cyB2ZXJ5IGxpbWl0ZWQgdmFsdWUgYXMgZG9jdW1lbnRhdGlvbiAKd2hlcmUgdGhlIG9ubHkgd2F5 IHRvIHByb2NlZWQgaXMgYnkgZGVyZWZlcmVuY2luZyBOVUxMIGluIGFuIAppZGVudGlmaWFibGUg bWFubmVyIGFueXdheSwgYnV0IHRoYXQncyBsYXJnZWx5IGEgbWF0dGVyIG9mIHRhc3RlIGFuZCBJ IAprbm93IG90aGVycyBtaWdodCBkaXNhZ3JlZS4KClRoYW5rcywKUm9iaW4uCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1h aWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xp c3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==