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 X-Spam-Level: X-Spam-Status: No, score=-15.6 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 7FA48C433E0 for ; Fri, 26 Feb 2021 06:15:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 392A364EE1 for ; Fri, 26 Feb 2021 06:15:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229800AbhBZGP1 (ORCPT ); Fri, 26 Feb 2021 01:15:27 -0500 Received: from relay7-d.mail.gandi.net ([217.70.183.200]:37849 "EHLO relay7-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229554AbhBZGPZ (ORCPT ); Fri, 26 Feb 2021 01:15:25 -0500 X-Originating-IP: 2.7.49.219 Received: from [192.168.1.12] (lfbn-lyo-1-457-219.w2-7.abo.wanadoo.fr [2.7.49.219]) (Authenticated sender: alex@ghiti.fr) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 90ECF20003; Fri, 26 Feb 2021 06:14:37 +0000 (UTC) Subject: Re: [PATCH] riscv: Add KASAN_VMALLOC support To: Palmer Dabbelt Cc: aou@eecs.berkeley.edu, nickhu@andestech.com, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, nylon7@andestech.com, glider@google.com, Paul Walmsley , aryabinin@virtuozzo.com, linux-riscv@lists.infradead.org, dvyukov@google.com References: From: Alex Ghiti Message-ID: Date: Fri, 26 Feb 2021 01:14:36 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Palmer, Le 2/26/21 à 12:32 AM, Palmer Dabbelt a écrit : > On Wed, 24 Feb 2021 23:48:13 PST (-0800), alex@ghiti.fr wrote: >> Le 2/25/21 à 2:42 AM, Alexandre Ghiti a écrit : >>> Populate the top-level of the kernel page table to implement >>> KASAN_VMALLOC, >>> lower levels are filled dynamically upon memory allocation at runtime. >>> >>> Co-developed-by: Nylon Chen >>> Signed-off-by: Nylon Chen >>> Co-developed-by: Nick Hu >>> Signed-off-by: Nick Hu >>> Signed-off-by: Alexandre Ghiti >>> --- >>>   arch/riscv/Kconfig         |  1 + >>>   arch/riscv/mm/kasan_init.c | 35 ++++++++++++++++++++++++++++++++++- >>>   2 files changed, 35 insertions(+), 1 deletion(-) >>> >>> diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig >>> index 8eadd1cbd524..3832a537c5d6 100644 >>> --- a/arch/riscv/Kconfig >>> +++ b/arch/riscv/Kconfig >>> @@ -57,6 +57,7 @@ config RISCV >>>       select HAVE_ARCH_JUMP_LABEL >>>       select HAVE_ARCH_JUMP_LABEL_RELATIVE >>>       select HAVE_ARCH_KASAN if MMU && 64BIT >>> +    select HAVE_ARCH_KASAN_VMALLOC if MMU && 64BIT >>>       select HAVE_ARCH_KGDB >>>       select HAVE_ARCH_KGDB_QXFER_PKT >>>       select HAVE_ARCH_MMAP_RND_BITS if MMU >>> diff --git a/arch/riscv/mm/kasan_init.c b/arch/riscv/mm/kasan_init.c >>> index 719b6e4d6075..171569df4334 100644 >>> --- a/arch/riscv/mm/kasan_init.c >>> +++ b/arch/riscv/mm/kasan_init.c >>> @@ -142,6 +142,31 @@ static void __init kasan_populate(void *start, >>> void *end) >>>       memset(start, KASAN_SHADOW_INIT, end - start); >>>   } >>> >>> +void __init kasan_shallow_populate_pgd(unsigned long vaddr, unsigned >>> long end) >>> +{ >>> +    unsigned long next; >>> +    void *p; >>> +    pgd_t *pgd_k = pgd_offset_k(vaddr); >>> + >>> +    do { >>> +        next = pgd_addr_end(vaddr, end); >>> +        if (pgd_page_vaddr(*pgd_k) == (unsigned >>> long)lm_alias(kasan_early_shadow_pmd)) { >>> +            p = memblock_alloc(PAGE_SIZE, PAGE_SIZE); >>> +            set_pgd(pgd_k, pfn_pgd(PFN_DOWN(__pa(p)), PAGE_TABLE)); >>> +        } >>> +    } while (pgd_k++, vaddr = next, vaddr != end); >>> +} >>> + >>> +void __init kasan_shallow_populate(void *start, void *end) >>> +{ >>> +    unsigned long vaddr = (unsigned long)start & PAGE_MASK; >>> +    unsigned long vend = PAGE_ALIGN((unsigned long)end); >>> + >>> +    kasan_shallow_populate_pgd(vaddr, vend); >>> + >>> +    local_flush_tlb_all(); >>> +} >>> + >>>   void __init kasan_init(void) >>>   { >>>       phys_addr_t _start, _end; >>> @@ -149,7 +174,15 @@ void __init kasan_init(void) >>> >>>       kasan_populate_early_shadow((void *)KASAN_SHADOW_START, >>>                       (void *)kasan_mem_to_shadow((void *) >>> -                                VMALLOC_END)); >>> +                                VMEMMAP_END)); >>> +    if (IS_ENABLED(CONFIG_KASAN_VMALLOC)) >>> +        kasan_shallow_populate( >>> +            (void *)kasan_mem_to_shadow((void *)VMALLOC_START), >>> +            (void *)kasan_mem_to_shadow((void *)VMALLOC_END)); >>> +    else >>> +        kasan_populate_early_shadow( >>> +            (void *)kasan_mem_to_shadow((void *)VMALLOC_START), >>> +            (void *)kasan_mem_to_shadow((void *)VMALLOC_END)); >>> >>>       for_each_mem_range(i, &_start, &_end) { >>>           void *start = (void *)_start; >>> >> >> Palmer, this commit should replace (if everyone agrees) Nylon and Nick's >> Commit e178d670f251 ("riscv/kasan: add KASAN_VMALLOC support") that is >> already in for-next. > > Sorry, but it's way too late to be rebasing things.  I can get trying to > have > the history clean, but in this case we're better off having this as an > explicit > fix patch -- changing hashes this late in the process messes with all the > testing. > > I'm not sure what the issue actually is, so it'd be great if you could > send the > fix patch.  If not then LMK and I'll try to figure out what's going on. > Either > way, having the fix will make sure this gets tested properly as whatever's > going on isn't failing for me. > Nylon's patch is functional as is, but as I mentioned here https://patchwork.kernel.org/project/linux-riscv/patch/20210116055836.22366-2-nylon7@andestech.com/, it does unnecessary things (like trying to walk a user page table that does not exist at this point in the boot process). Anyway, I will send another patch rebased on top of Nylon's. Thanks, Alex > _______________________________________________ > linux-riscv mailing list > linux-riscv@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/linux-riscv 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 X-Spam-Level: X-Spam-Status: No, score=-15.6 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1BE40C433E0 for ; Fri, 26 Feb 2021 06:15:06 +0000 (UTC) Received: from merlin.infradead.org (merlin.infradead.org [205.233.59.134]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 18E2664EDB for ; Fri, 26 Feb 2021 06:15:05 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 18E2664EDB Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=ghiti.fr Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=merlin.20170209; h=Sender:Content-Type: Content-Transfer-Encoding:Cc:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=2n+BthEiP3nv9G/qB5nPbkHIrkm1W/OST3zQnMdW5m4=; b=LMvHY+8iojVqwBbOMWTmeSYlR w5Vos/rI4C9COPsGaYeO/13kRI8Z2ei5/TqLSAnp/0pQDYgxowS+vt9+Ey36mDAWVmIeE/Ko+Wbys m9t4OhSeoP5HVsyvq5AUdGGc9sY0p+nLgp72O3h1R9XYgl4gBCk55bi54TwP0i9pAZp6LX9OqJkrp qZVwRmN0jh88aHOTEkQZHdI6R/BWycm0FrBXADoWuKT/2lmr8nelYjfozRVMNnRx1cAhF4qgBLiDB 2+Tmbsi5QVUnK/vbWtdTKgkSONRbug74bMmy3lKwMGVP8eafmTLJ7YOvT8eomzfPwrvGFwYouqCmo SfDihXelw==; Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1lFWOo-0001fV-Uw; Fri, 26 Feb 2021 06:14:50 +0000 Received: from relay7-d.mail.gandi.net ([217.70.183.200]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1lFWOk-0001f4-Ts for linux-riscv@lists.infradead.org; Fri, 26 Feb 2021 06:14:48 +0000 X-Originating-IP: 2.7.49.219 Received: from [192.168.1.12] (lfbn-lyo-1-457-219.w2-7.abo.wanadoo.fr [2.7.49.219]) (Authenticated sender: alex@ghiti.fr) by relay7-d.mail.gandi.net (Postfix) with ESMTPSA id 90ECF20003; Fri, 26 Feb 2021 06:14:37 +0000 (UTC) Subject: Re: [PATCH] riscv: Add KASAN_VMALLOC support To: Palmer Dabbelt References: From: Alex Ghiti Message-ID: Date: Fri, 26 Feb 2021 01:14:36 -0500 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1 MIME-Version: 1.0 In-Reply-To: Content-Language: fr X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210226_011447_174060_DABDC31E X-CRM114-Status: GOOD ( 27.04 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: aou@eecs.berkeley.edu, nickhu@andestech.com, linux-kernel@vger.kernel.org, kasan-dev@googlegroups.com, nylon7@andestech.com, glider@google.com, Paul Walmsley , aryabinin@virtuozzo.com, linux-riscv@lists.infradead.org, dvyukov@google.com 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 SGkgUGFsbWVyLAoKTGUgMi8yNi8yMSDDoCAxMjozMiBBTSwgUGFsbWVyIERhYmJlbHQgYSDDqWNy aXTCoDoKPiBPbiBXZWQsIDI0IEZlYiAyMDIxIDIzOjQ4OjEzIFBTVCAoLTA4MDApLCBhbGV4QGdo aXRpLmZyIHdyb3RlOgo+PiBMZSAyLzI1LzIxIMOgIDI6NDIgQU0sIEFsZXhhbmRyZSBHaGl0aSBh IMOpY3JpdMKgOgo+Pj4gUG9wdWxhdGUgdGhlIHRvcC1sZXZlbCBvZiB0aGUga2VybmVsIHBhZ2Ug dGFibGUgdG8gaW1wbGVtZW50IAo+Pj4gS0FTQU5fVk1BTExPQywKPj4+IGxvd2VyIGxldmVscyBh cmUgZmlsbGVkIGR5bmFtaWNhbGx5IHVwb24gbWVtb3J5IGFsbG9jYXRpb24gYXQgcnVudGltZS4K Pj4+Cj4+PiBDby1kZXZlbG9wZWQtYnk6IE55bG9uIENoZW4gPG55bG9uN0BhbmRlc3RlY2guY29t Pgo+Pj4gU2lnbmVkLW9mZi1ieTogTnlsb24gQ2hlbiA8bnlsb243QGFuZGVzdGVjaC5jb20+Cj4+ PiBDby1kZXZlbG9wZWQtYnk6IE5pY2sgSHUgPG5pY2todUBhbmRlc3RlY2guY29tPgo+Pj4gU2ln bmVkLW9mZi1ieTogTmljayBIdSA8bmlja2h1QGFuZGVzdGVjaC5jb20+Cj4+PiBTaWduZWQtb2Zm LWJ5OiBBbGV4YW5kcmUgR2hpdGkgPGFsZXhAZ2hpdGkuZnI+Cj4+PiAtLS0KPj4+IMKgIGFyY2gv cmlzY3YvS2NvbmZpZ8KgwqDCoMKgwqDCoMKgwqAgfMKgIDEgKwo+Pj4gwqAgYXJjaC9yaXNjdi9t bS9rYXNhbl9pbml0LmMgfCAzNSArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLQo+ Pj4gwqAgMiBmaWxlcyBjaGFuZ2VkLCAzNSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4+ Pgo+Pj4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvS2NvbmZpZyBiL2FyY2gvcmlzY3YvS2NvbmZp Zwo+Pj4gaW5kZXggOGVhZGQxY2JkNTI0Li4zODMyYTUzN2M1ZDYgMTAwNjQ0Cj4+PiAtLS0gYS9h cmNoL3Jpc2N2L0tjb25maWcKPj4+ICsrKyBiL2FyY2gvcmlzY3YvS2NvbmZpZwo+Pj4gQEAgLTU3 LDYgKzU3LDcgQEAgY29uZmlnIFJJU0NWCj4+PiDCoMKgwqDCoMKgIHNlbGVjdCBIQVZFX0FSQ0hf SlVNUF9MQUJFTAo+Pj4gwqDCoMKgwqDCoCBzZWxlY3QgSEFWRV9BUkNIX0pVTVBfTEFCRUxfUkVM QVRJVkUKPj4+IMKgwqDCoMKgwqAgc2VsZWN0IEhBVkVfQVJDSF9LQVNBTiBpZiBNTVUgJiYgNjRC SVQKPj4+ICvCoMKgwqAgc2VsZWN0IEhBVkVfQVJDSF9LQVNBTl9WTUFMTE9DIGlmIE1NVSAmJiA2 NEJJVAo+Pj4gwqDCoMKgwqDCoCBzZWxlY3QgSEFWRV9BUkNIX0tHREIKPj4+IMKgwqDCoMKgwqAg c2VsZWN0IEhBVkVfQVJDSF9LR0RCX1FYRkVSX1BLVAo+Pj4gwqDCoMKgwqDCoCBzZWxlY3QgSEFW RV9BUkNIX01NQVBfUk5EX0JJVFMgaWYgTU1VCj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9t bS9rYXNhbl9pbml0LmMgYi9hcmNoL3Jpc2N2L21tL2thc2FuX2luaXQuYwo+Pj4gaW5kZXggNzE5 YjZlNGQ2MDc1Li4xNzE1NjlkZjQzMzQgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNoL3Jpc2N2L21tL2th c2FuX2luaXQuYwo+Pj4gKysrIGIvYXJjaC9yaXNjdi9tbS9rYXNhbl9pbml0LmMKPj4+IEBAIC0x NDIsNiArMTQyLDMxIEBAIHN0YXRpYyB2b2lkIF9faW5pdCBrYXNhbl9wb3B1bGF0ZSh2b2lkICpz dGFydCwgCj4+PiB2b2lkICplbmQpCj4+PiDCoMKgwqDCoMKgIG1lbXNldChzdGFydCwgS0FTQU5f U0hBRE9XX0lOSVQsIGVuZCAtIHN0YXJ0KTsKPj4+IMKgIH0KPj4+Cj4+PiArdm9pZCBfX2luaXQg a2FzYW5fc2hhbGxvd19wb3B1bGF0ZV9wZ2QodW5zaWduZWQgbG9uZyB2YWRkciwgdW5zaWduZWQg Cj4+PiBsb25nIGVuZCkKPj4+ICt7Cj4+PiArwqDCoMKgIHVuc2lnbmVkIGxvbmcgbmV4dDsKPj4+ ICvCoMKgwqAgdm9pZCAqcDsKPj4+ICvCoMKgwqAgcGdkX3QgKnBnZF9rID0gcGdkX29mZnNldF9r KHZhZGRyKTsKPj4+ICsKPj4+ICvCoMKgwqAgZG8gewo+Pj4gK8KgwqDCoMKgwqDCoMKgIG5leHQg PSBwZ2RfYWRkcl9lbmQodmFkZHIsIGVuZCk7Cj4+PiArwqDCoMKgwqDCoMKgwqAgaWYgKHBnZF9w YWdlX3ZhZGRyKCpwZ2RfaykgPT0gKHVuc2lnbmVkIAo+Pj4gbG9uZylsbV9hbGlhcyhrYXNhbl9l YXJseV9zaGFkb3dfcG1kKSkgewo+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcCA9IG1lbWJs b2NrX2FsbG9jKFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDC oMKgIHNldF9wZ2QocGdkX2ssIHBmbl9wZ2QoUEZOX0RPV04oX19wYShwKSksIFBBR0VfVEFCTEUp KTsKPj4+ICvCoMKgwqDCoMKgwqDCoCB9Cj4+PiArwqDCoMKgIH0gd2hpbGUgKHBnZF9rKyssIHZh ZGRyID0gbmV4dCwgdmFkZHIgIT0gZW5kKTsKPj4+ICt9Cj4+PiArCj4+PiArdm9pZCBfX2luaXQg a2FzYW5fc2hhbGxvd19wb3B1bGF0ZSh2b2lkICpzdGFydCwgdm9pZCAqZW5kKQo+Pj4gK3sKPj4+ ICvCoMKgwqAgdW5zaWduZWQgbG9uZyB2YWRkciA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0ICYgUEFH RV9NQVNLOwo+Pj4gK8KgwqDCoCB1bnNpZ25lZCBsb25nIHZlbmQgPSBQQUdFX0FMSUdOKCh1bnNp Z25lZCBsb25nKWVuZCk7Cj4+PiArCj4+PiArwqDCoMKgIGthc2FuX3NoYWxsb3dfcG9wdWxhdGVf cGdkKHZhZGRyLCB2ZW5kKTsKPj4+ICsKPj4+ICvCoMKgwqAgbG9jYWxfZmx1c2hfdGxiX2FsbCgp Owo+Pj4gK30KPj4+ICsKPj4+IMKgIHZvaWQgX19pbml0IGthc2FuX2luaXQodm9pZCkKPj4+IMKg IHsKPj4+IMKgwqDCoMKgwqAgcGh5c19hZGRyX3QgX3N0YXJ0LCBfZW5kOwo+Pj4gQEAgLTE0OSw3 ICsxNzQsMTUgQEAgdm9pZCBfX2luaXQga2FzYW5faW5pdCh2b2lkKQo+Pj4KPj4+IMKgwqDCoMKg wqAga2FzYW5fcG9wdWxhdGVfZWFybHlfc2hhZG93KCh2b2lkICopS0FTQU5fU0hBRE9XX1NUQVJU LAo+Pj4gwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh2b2lkICop a2FzYW5fbWVtX3RvX3NoYWRvdygodm9pZCAqKQo+Pj4gLcKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIFZNQUxMT0NfRU5EKSk7Cj4+ PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqAgVk1FTU1BUF9FTkQpKTsKPj4+ICvCoMKgwqAgaWYgKElTX0VOQUJMRUQoQ09ORklH X0tBU0FOX1ZNQUxMT0MpKQo+Pj4gK8KgwqDCoMKgwqDCoMKgIGthc2FuX3NoYWxsb3dfcG9wdWxh dGUoCj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodm9pZCAqKWthc2FuX21lbV90b19zaGFk b3coKHZvaWQgKilWTUFMTE9DX1NUQVJUKSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh2 b2lkICopa2FzYW5fbWVtX3RvX3NoYWRvdygodm9pZCAqKVZNQUxMT0NfRU5EKSk7Cj4+PiArwqDC oMKgIGVsc2UKPj4+ICvCoMKgwqDCoMKgwqDCoCBrYXNhbl9wb3B1bGF0ZV9lYXJseV9zaGFkb3co Cj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCAodm9pZCAqKWthc2FuX21lbV90b19zaGFkb3co KHZvaWQgKilWTUFMTE9DX1NUQVJUKSwKPj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgICh2b2lk ICopa2FzYW5fbWVtX3RvX3NoYWRvdygodm9pZCAqKVZNQUxMT0NfRU5EKSk7Cj4+Pgo+Pj4gwqDC oMKgwqDCoCBmb3JfZWFjaF9tZW1fcmFuZ2UoaSwgJl9zdGFydCwgJl9lbmQpIHsKPj4+IMKgwqDC oMKgwqDCoMKgwqDCoCB2b2lkICpzdGFydCA9ICh2b2lkICopX3N0YXJ0Owo+Pj4KPj4KPj4gUGFs bWVyLCB0aGlzIGNvbW1pdCBzaG91bGQgcmVwbGFjZSAoaWYgZXZlcnlvbmUgYWdyZWVzKSBOeWxv biBhbmQgTmljaydzCj4+IENvbW1pdCBlMTc4ZDY3MGYyNTEgKCJyaXNjdi9rYXNhbjogYWRkIEtB U0FOX1ZNQUxMT0Mgc3VwcG9ydCIpIHRoYXQgaXMKPj4gYWxyZWFkeSBpbiBmb3ItbmV4dC4KPiAK PiBTb3JyeSwgYnV0IGl0J3Mgd2F5IHRvbyBsYXRlIHRvIGJlIHJlYmFzaW5nIHRoaW5ncy7CoCBJ IGNhbiBnZXQgdHJ5aW5nIHRvIAo+IGhhdmUKPiB0aGUgaGlzdG9yeSBjbGVhbiwgYnV0IGluIHRo aXMgY2FzZSB3ZSdyZSBiZXR0ZXIgb2ZmIGhhdmluZyB0aGlzIGFzIGFuIAo+IGV4cGxpY2l0Cj4g Zml4IHBhdGNoIC0tIGNoYW5naW5nIGhhc2hlcyB0aGlzIGxhdGUgaW4gdGhlIHByb2Nlc3MgbWVz c2VzIHdpdGggYWxsIHRoZQo+IHRlc3RpbmcuCj4gCj4gSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGlz c3VlIGFjdHVhbGx5IGlzLCBzbyBpdCdkIGJlIGdyZWF0IGlmIHlvdSBjb3VsZCAKPiBzZW5kIHRo ZQo+IGZpeCBwYXRjaC7CoCBJZiBub3QgdGhlbiBMTUsgYW5kIEknbGwgdHJ5IHRvIGZpZ3VyZSBv dXQgd2hhdCdzIGdvaW5nIG9uLiAgCj4gRWl0aGVyCj4gd2F5LCBoYXZpbmcgdGhlIGZpeCB3aWxs IG1ha2Ugc3VyZSB0aGlzIGdldHMgdGVzdGVkIHByb3Blcmx5IGFzIHdoYXRldmVyJ3MKPiBnb2lu ZyBvbiBpc24ndCBmYWlsaW5nIGZvciBtZS4KPiAKCk55bG9uJ3MgcGF0Y2ggaXMgZnVuY3Rpb25h bCBhcyBpcywgYnV0IGFzIEkgbWVudGlvbmVkIGhlcmUgCmh0dHBzOi8vcGF0Y2h3b3JrLmtlcm5l bC5vcmcvcHJvamVjdC9saW51eC1yaXNjdi9wYXRjaC8yMDIxMDExNjA1NTgzNi4yMjM2Ni0yLW55 bG9uN0BhbmRlc3RlY2guY29tLywgCml0IGRvZXMgdW5uZWNlc3NhcnkgdGhpbmdzIChsaWtlIHRy eWluZyB0byB3YWxrIGEgdXNlciBwYWdlIHRhYmxlIHRoYXQgCmRvZXMgbm90IGV4aXN0IGF0IHRo aXMgcG9pbnQgaW4gdGhlIGJvb3QgcHJvY2VzcykuCgpBbnl3YXksIEkgd2lsbCBzZW5kIGFub3Ro ZXIgcGF0Y2ggcmViYXNlZCBvbiB0b3Agb2YgTnlsb24ncy4KClRoYW5rcywKCkFsZXgKCgo+IF9f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4gbGludXgtcmlz Y3YgbWFpbGluZyBsaXN0Cj4gbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwo+IGh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1h aWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5p bmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK