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=-8.2 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,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 4BE7ECA9EA0 for ; Tue, 22 Oct 2019 03:32:02 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 1BF1D21783 for ; Tue, 22 Oct 2019 03:32:02 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2387525AbfJVDcB (ORCPT ); Mon, 21 Oct 2019 23:32:01 -0400 Received: from 59-120-53-16.HINET-IP.hinet.net ([59.120.53.16]:31949 "EHLO ATCSQR.andestech.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1730370AbfJVDcA (ORCPT ); Mon, 21 Oct 2019 23:32:00 -0400 Received: from mail.andestech.com (atcpcs16.andestech.com [10.0.1.222]) by ATCSQR.andestech.com with ESMTP id x9M3DoXs081015; Tue, 22 Oct 2019 11:13:50 +0800 (GMT-8) (envelope-from nickhu@andestech.com) Received: from andestech.com (10.0.15.65) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.123.3; Tue, 22 Oct 2019 11:30:51 +0800 Date: Tue, 22 Oct 2019 11:30:51 +0800 From: Nick Hu To: Greentime Hu CC: Greentime Hu , Alan Quey-Liang =?utf-8?B?S2FvKOmrmOmtgeiJryk=?= , Paul Walmsley , Palmer Dabbelt , Albert Ou , "aryabinin@virtuozzo.com" , "glider@google.com" , "dvyukov@google.com" , "corbet@lwn.net" , "alexios.zavras@intel.com" , "allison@lohutok.net" , "Anup.Patel@wdc.com" , "Thomas Gleixner" , "gregkh@linuxfoundation.org" , "atish.patra@wdc.com" , Kate Stewart , "linux-doc@vger.kernel.org" , "linux-riscv@lists.infradead.org" , Linux Kernel Mailing List , "kasan-dev@googlegroups.com" , "linux-mm@kvack.org" Subject: Re: [PATCH v3 2/3] riscv: Add KASAN support Message-ID: <20191022033051.GB29285@andestech.com> References: <8d86d53e904bece0623cb8969cdc70f782fa2bae.1570514544.git.nickhu@andestech.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Originating-IP: [10.0.15.65] X-DNSRBL: X-MAIL: ATCSQR.andestech.com x9M3DoXs081015 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, Oct 21, 2019 at 05:33:31PM +0800, Greentime Hu wrote: > Nick Hu 於 2019年10月8日 週二 下午2:17寫道: > > > > This patch ports the feature Kernel Address SANitizer (KASAN). > > > > Note: The start address of shadow memory is at the beginning of kernel > > space, which is 2^64 - (2^39 / 2) in SV39. The size of the kernel space is > > 2^38 bytes so the size of shadow memory should be 2^38 / 8. Thus, the > > shadow memory would not overlap with the fixmap area. > > > > There are currently two limitations in this port, > > > > 1. RV64 only: KASAN need large address space for extra shadow memory > > region. > > > > 2. KASAN can't debug the modules since the modules are allocated in VMALLOC > > area. We mapped the shadow memory, which corresponding to VMALLOC area, to > > the kasan_early_shadow_page because we don't have enough physical space for > > all the shadow memory corresponding to VMALLOC area. > > > > Signed-off-by: Nick Hu > > --- > > arch/riscv/Kconfig | 1 + > > arch/riscv/include/asm/kasan.h | 27 ++++++++ > > arch/riscv/include/asm/pgtable-64.h | 5 ++ > > arch/riscv/include/asm/string.h | 9 +++ > > arch/riscv/kernel/head.S | 3 + > > arch/riscv/kernel/riscv_ksyms.c | 2 + > > arch/riscv/kernel/setup.c | 5 ++ > > arch/riscv/kernel/vmlinux.lds.S | 1 + > > arch/riscv/lib/memcpy.S | 5 +- > > arch/riscv/lib/memset.S | 5 +- > > arch/riscv/mm/Makefile | 6 ++ > > arch/riscv/mm/kasan_init.c | 104 ++++++++++++++++++++++++++++ > > 12 files changed, 169 insertions(+), 4 deletions(-) > > create mode 100644 arch/riscv/include/asm/kasan.h > > create mode 100644 arch/riscv/mm/kasan_init.c > > > > diff --git a/arch/riscv/Kconfig b/arch/riscv/Kconfig > > index 8eebbc8860bb..ca2fc8ba8550 100644 > > --- a/arch/riscv/Kconfig > > +++ b/arch/riscv/Kconfig > > @@ -61,6 +61,7 @@ config RISCV > > select SPARSEMEM_STATIC if 32BIT > > select ARCH_WANT_DEFAULT_TOPDOWN_MMAP_LAYOUT if MMU > > select HAVE_ARCH_MMAP_RND_BITS > > + select HAVE_ARCH_KASAN if MMU && 64BIT > > > > config ARCH_MMAP_RND_BITS_MIN > > default 18 if 64BIT > > diff --git a/arch/riscv/include/asm/kasan.h b/arch/riscv/include/asm/kasan.h > > new file mode 100644 > > index 000000000000..eb9b1a2f641c > > --- /dev/null > > +++ b/arch/riscv/include/asm/kasan.h > > @@ -0,0 +1,27 @@ > > +/* SPDX-License-Identifier: GPL-2.0 */ > > +/* Copyright (C) 2019 Andes Technology Corporation */ > > + > > +#ifndef __ASM_KASAN_H > > +#define __ASM_KASAN_H > > + > > +#ifndef __ASSEMBLY__ > > + > > +#ifdef CONFIG_KASAN > > + > > +#include > > + > > +#define KASAN_SHADOW_SCALE_SHIFT 3 > > + > > +#define KASAN_SHADOW_SIZE (UL(1) << (38 - KASAN_SHADOW_SCALE_SHIFT)) > > +#define KASAN_SHADOW_START 0xffffffc000000000 // 2^64 - 2^38 > > +#define KASAN_SHADOW_END (KASAN_SHADOW_START + KASAN_SHADOW_SIZE) > > + > > +#define KASAN_SHADOW_OFFSET (KASAN_SHADOW_END - (1ULL << \ > > + (64 - KASAN_SHADOW_SCALE_SHIFT))) > > + > > +void kasan_init(void); > > +asmlinkage void kasan_early_init(void); > > + > > +#endif > > +#endif > > +#endif /* __ASM_KASAN_H */ > > diff --git a/arch/riscv/include/asm/pgtable-64.h b/arch/riscv/include/asm/pgtable-64.h > > index 7df8daa66cc8..777a1dddb3df 100644 > > --- a/arch/riscv/include/asm/pgtable-64.h > > +++ b/arch/riscv/include/asm/pgtable-64.h > > @@ -59,6 +59,11 @@ static inline unsigned long pud_page_vaddr(pud_t pud) > > return (unsigned long)pfn_to_virt(pud_val(pud) >> _PAGE_PFN_SHIFT); > > } > > > > +static inline struct page *pud_page(pud_t pud) > > +{ > > + return pfn_to_page(pud_val(pud) >> _PAGE_PFN_SHIFT); > > +} > > + > > #define pmd_index(addr) (((addr) >> PMD_SHIFT) & (PTRS_PER_PMD - 1)) > > > > static inline pmd_t *pmd_offset(pud_t *pud, unsigned long addr) > > diff --git a/arch/riscv/include/asm/string.h b/arch/riscv/include/asm/string.h > > index 1b5d44585962..a4451f768826 100644 > > --- a/arch/riscv/include/asm/string.h > > +++ b/arch/riscv/include/asm/string.h > > @@ -11,8 +11,17 @@ > > > > #define __HAVE_ARCH_MEMSET > > extern asmlinkage void *memset(void *, int, size_t); > > +extern asmlinkage void *__memset(void *, int, size_t); > > > > #define __HAVE_ARCH_MEMCPY > > extern asmlinkage void *memcpy(void *, const void *, size_t); > > +extern asmlinkage void *__memcpy(void *, const void *, size_t); > > > > +// For those files which don't want to check by kasan. > > +#if defined(CONFIG_KASAN) && !defined(__SANITIZE_ADDRESS__) > > + > > +#define memcpy(dst, src, len) __memcpy(dst, src, len) > > +#define memset(s, c, n) __memset(s, c, n) > > + > > +#endif > > #endif /* _ASM_RISCV_STRING_H */ > > diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S > > index 72f89b7590dd..95eca23cd811 100644 > > --- a/arch/riscv/kernel/head.S > > +++ b/arch/riscv/kernel/head.S > > @@ -102,6 +102,9 @@ clear_bss_done: > > sw zero, TASK_TI_CPU(tp) > > la sp, init_thread_union + THREAD_SIZE > > > > +#ifdef CONFIG_KASAN > > + call kasan_early_init > > +#endif > > /* Start the kernel */ > > call parse_dtb > > tail start_kernel > > diff --git a/arch/riscv/kernel/riscv_ksyms.c b/arch/riscv/kernel/riscv_ksyms.c > > index 4800cf703186..376bba7f65ce 100644 > > --- a/arch/riscv/kernel/riscv_ksyms.c > > +++ b/arch/riscv/kernel/riscv_ksyms.c > > @@ -14,3 +14,5 @@ EXPORT_SYMBOL(__asm_copy_to_user); > > EXPORT_SYMBOL(__asm_copy_from_user); > > EXPORT_SYMBOL(memset); > > EXPORT_SYMBOL(memcpy); > > +EXPORT_SYMBOL(__memset); > > +EXPORT_SYMBOL(__memcpy); > > diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c > > index a990a6cb184f..41f7eae9bc4d 100644 > > --- a/arch/riscv/kernel/setup.c > > +++ b/arch/riscv/kernel/setup.c > > @@ -23,6 +23,7 @@ > > #include > > #include > > #include > > +#include > > > > #ifdef CONFIG_DUMMY_CONSOLE > > struct screen_info screen_info = { > > @@ -70,6 +71,10 @@ void __init setup_arch(char **cmdline_p) > > swiotlb_init(1); > > #endif > > > > +#ifdef CONFIG_KASAN > > + kasan_init(); > > +#endif > > + > > #ifdef CONFIG_SMP > > setup_smp(); > > #endif > > diff --git a/arch/riscv/kernel/vmlinux.lds.S b/arch/riscv/kernel/vmlinux.lds.S > > index 23cd1a9e52a1..97009803ba9f 100644 > > --- a/arch/riscv/kernel/vmlinux.lds.S > > +++ b/arch/riscv/kernel/vmlinux.lds.S > > @@ -46,6 +46,7 @@ SECTIONS > > KPROBES_TEXT > > ENTRY_TEXT > > IRQENTRY_TEXT > > + SOFTIRQENTRY_TEXT > > *(.fixup) > > _etext = .; > > } > > diff --git a/arch/riscv/lib/memcpy.S b/arch/riscv/lib/memcpy.S > > index b4c477846e91..51ab716253fa 100644 > > --- a/arch/riscv/lib/memcpy.S > > +++ b/arch/riscv/lib/memcpy.S > > @@ -7,7 +7,8 @@ > > #include > > > > /* void *memcpy(void *, const void *, size_t) */ > > -ENTRY(memcpy) > > +ENTRY(__memcpy) > > +WEAK(memcpy) > > move t6, a0 /* Preserve return value */ > > > > /* Defer to byte-oriented copy for small sizes */ > > @@ -104,4 +105,4 @@ ENTRY(memcpy) > > bltu a1, a3, 5b > > 6: > > ret > > -END(memcpy) > > +END(__memcpy) > > diff --git a/arch/riscv/lib/memset.S b/arch/riscv/lib/memset.S > > index 5a7386b47175..34c5360c6705 100644 > > --- a/arch/riscv/lib/memset.S > > +++ b/arch/riscv/lib/memset.S > > @@ -8,7 +8,8 @@ > > #include > > > > /* void *memset(void *, int, size_t) */ > > -ENTRY(memset) > > +ENTRY(__memset) > > +WEAK(memset) > > move t0, a0 /* Preserve return value */ > > > > /* Defer to byte-oriented fill for small sizes */ > > @@ -109,4 +110,4 @@ ENTRY(memset) > > bltu t0, a3, 5b > > 6: > > ret > > -END(memset) > > +END(__memset) > > diff --git a/arch/riscv/mm/Makefile b/arch/riscv/mm/Makefile > > index 9d9a17335686..b8a8ca71f86e 100644 > > --- a/arch/riscv/mm/Makefile > > +++ b/arch/riscv/mm/Makefile > > @@ -17,3 +17,9 @@ ifeq ($(CONFIG_MMU),y) > > obj-$(CONFIG_SMP) += tlbflush.o > > endif > > obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o > > +obj-$(CONFIG_KASAN) += kasan_init.o > > + > > +ifdef CONFIG_KASAN > > +KASAN_SANITIZE_kasan_init.o := n > > +KASAN_SANITIZE_init.o := n > > +endif > > diff --git a/arch/riscv/mm/kasan_init.c b/arch/riscv/mm/kasan_init.c > > new file mode 100644 > > index 000000000000..c3152768cdbe > > --- /dev/null > > +++ b/arch/riscv/mm/kasan_init.c > > @@ -0,0 +1,104 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +// Copyright (C) 2019 Andes Technology Corporation > > + > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > +#include > > + > > +extern pgd_t early_pg_dir[PTRS_PER_PGD]; > > +asmlinkage void __init kasan_early_init(void) > > +{ > > + uintptr_t i; > > + pgd_t *pgd = early_pg_dir + pgd_index(KASAN_SHADOW_START); > > + > > + for (i = 0; i < PTRS_PER_PTE; ++i) > > + set_pte(kasan_early_shadow_pte + i, > > + mk_pte(virt_to_page(kasan_early_shadow_page), > > + PAGE_KERNEL)); > > + > > + for (i = 0; i < PTRS_PER_PMD; ++i) > > + set_pmd(kasan_early_shadow_pmd + i, > > + pfn_pmd(PFN_DOWN(__pa((uintptr_t)kasan_early_shadow_pte)), > > + __pgprot(_PAGE_TABLE))); > > + > > + for (i = KASAN_SHADOW_START; i < KASAN_SHADOW_END; > > + i += PGDIR_SIZE, ++pgd) > > + set_pgd(pgd, > > + pfn_pgd(PFN_DOWN(__pa(((uintptr_t)kasan_early_shadow_pmd))), > > + __pgprot(_PAGE_TABLE))); > > + > > + // init for swapper_pg_dir > > + pgd = pgd_offset_k(KASAN_SHADOW_START); > > + > > + for (i = KASAN_SHADOW_START; i < KASAN_SHADOW_END; > > + i += PGDIR_SIZE, ++pgd) > > + set_pgd(pgd, > > + pfn_pgd(PFN_DOWN(__pa(((uintptr_t)kasan_early_shadow_pmd))), > > + __pgprot(_PAGE_TABLE))); > > + > > + flush_tlb_all(); > > +} > > + > > +static void __init populate(void *start, void *end) > > +{ > > + unsigned long i; > > + unsigned long vaddr = (unsigned long)start & PAGE_MASK; > > + unsigned long vend = PAGE_ALIGN((unsigned long)end); > > + unsigned long n_pages = (vend - vaddr) / PAGE_SIZE; > > + unsigned long n_pmds = > > + (n_pages % PTRS_PER_PTE) ? n_pages / PTRS_PER_PTE + 1 : > > + n_pages / PTRS_PER_PTE; > > + pgd_t *pgd = pgd_offset_k(vaddr); > > + pmd_t *pmd = memblock_alloc(n_pmds * sizeof(pmd_t), PAGE_SIZE); > > + pte_t *pte = memblock_alloc(n_pages * sizeof(pte_t), PAGE_SIZE); > > + > > + for (i = 0; i < n_pages; i++) { > > + phys_addr_t phys = memblock_phys_alloc(PAGE_SIZE, PAGE_SIZE); > > + > > + set_pte(pte + i, pfn_pte(PHYS_PFN(phys), PAGE_KERNEL)); > > + } > > + > > + for (i = 0; i < n_pages; ++pmd, i += PTRS_PER_PTE) > > + set_pmd(pmd, pfn_pmd(PFN_DOWN(__pa((uintptr_t)(pte + i))), > > + __pgprot(_PAGE_TABLE))); > > + > > + for (i = vaddr; i < vend; i += PGDIR_SIZE, ++pgd) > > + set_pgd(pgd, pfn_pgd(PFN_DOWN(__pa(((uintptr_t)pmd))), > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ > > + __pgprot(_PAGE_TABLE))); > > + > > Hi Nick, > > I verify this patch in Qemu and Unleashed board. > I found it works well if DRAM size is less than 4GB. > It will get an access fault if the DRAM size is larger than 4GB. > > I spend some time to debug this case and I found it hang in the > following memset(). > It is because the mapping is not created correctly. I check the page > table creating logic again and I found it always sets the last pmd > here. Hi Greentime, Thanks! I would fix it in v4 patch. Nick. 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=-8.3 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 E149ACA9EA0 for ; Tue, 22 Oct 2019 03:31:42 +0000 (UTC) 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 mail.kernel.org (Postfix) with ESMTPS id AA33D217D7 for ; Tue, 22 Oct 2019 03:31:42 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="MMkhFckP" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org AA33D217D7 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=andestech.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-riscv-bounces+infradead-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=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=74FpY/U983vcqAspAakftdVG1Z2axrL2fmUIsysUB+4=; b=MMkhFckPCKPBFa VaxufGXSAj6TDTaU5V3MlEoP04/W/IviZ3g8agtXEz2OPw64lfGgfpkIcxRNgamuEWLZvusRA9Ev7 V48C1HukOjXzDm+X64kCf8syQ2D7+1MYvEB83TzXfBZDD81nLHf1QLTOkyfnYvoHXXyr+C/NOGCbM 7EP/msjqWBaSzlybgV85htAQfjbqneJrzY1MZTE6fq59RD7tdT///4lrC5zXRU8W1noXXQJxnF4oW GHrd/zndzxESsfdrTZt/g2iDS4f/XOr+MaR0sSXxvPYKSJOceGnt1B8+ZUD8MdMnBzd+y1VuCNnL9 qHP8j7KV8zeolDdVTJIQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iMktZ-0008Rl-3Y; Tue, 22 Oct 2019 03:31:41 +0000 Received: from 59-120-53-16.hinet-ip.hinet.net ([59.120.53.16] helo=ATCSQR.andestech.com) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iMktV-0008R6-7O for linux-riscv@lists.infradead.org; Tue, 22 Oct 2019 03:31:39 +0000 Received: from mail.andestech.com (atcpcs16.andestech.com [10.0.1.222]) by ATCSQR.andestech.com with ESMTP id x9M3DoXs081015; Tue, 22 Oct 2019 11:13:50 +0800 (GMT-8) (envelope-from nickhu@andestech.com) Received: from andestech.com (10.0.15.65) by ATCPCS16.andestech.com (10.0.1.222) with Microsoft SMTP Server id 14.3.123.3; Tue, 22 Oct 2019 11:30:51 +0800 Date: Tue, 22 Oct 2019 11:30:51 +0800 From: Nick Hu To: Greentime Hu Subject: Re: [PATCH v3 2/3] riscv: Add KASAN support Message-ID: <20191022033051.GB29285@andestech.com> References: <8d86d53e904bece0623cb8969cdc70f782fa2bae.1570514544.git.nickhu@andestech.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.24 (2015-08-30) X-Originating-IP: [10.0.15.65] X-DNSRBL: X-MAIL: ATCSQR.andestech.com x9M3DoXs081015 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20191021_203137_656393_E9C1073A X-CRM114-Status: GOOD ( 28.95 ) 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: Kate Stewart , Albert Ou , Alan Quey-Liang =?utf-8?B?S2FvKOmrmOmtgeiJryk=?= , "corbet@lwn.net" , "gregkh@linuxfoundation.org" , Palmer Dabbelt , "linux-doc@vger.kernel.org" , Linux Kernel Mailing List , "kasan-dev@googlegroups.com" , "linux-mm@kvack.org" , "alexios.zavras@intel.com" , "Anup.Patel@wdc.com" , "glider@google.com" , "allison@lohutok.net" , Paul Walmsley , "aryabinin@virtuozzo.com" , Greentime Hu , Thomas Gleixner , "atish.patra@wdc.com" , "linux-riscv@lists.infradead.org" , "dvyukov@google.com" Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org T24gTW9uLCBPY3QgMjEsIDIwMTkgYXQgMDU6MzM6MzFQTSArMDgwMCwgR3JlZW50aW1lIEh1IHdy b3RlOgo+IE5pY2sgSHUgPG5pY2todUBhbmRlc3RlY2guY29tPiDmlrwgMjAxOeW5tDEw5pyIOOaX pSDpgLHkuowg5LiL5Y2IMjoxN+Wvq+mBk++8mgo+ID4KPiA+IFRoaXMgcGF0Y2ggcG9ydHMgdGhl IGZlYXR1cmUgS2VybmVsIEFkZHJlc3MgU0FOaXRpemVyIChLQVNBTikuCj4gPgo+ID4gTm90ZTog VGhlIHN0YXJ0IGFkZHJlc3Mgb2Ygc2hhZG93IG1lbW9yeSBpcyBhdCB0aGUgYmVnaW5uaW5nIG9m IGtlcm5lbAo+ID4gc3BhY2UsIHdoaWNoIGlzIDJeNjQgLSAoMl4zOSAvIDIpIGluIFNWMzkuIFRo ZSBzaXplIG9mIHRoZSBrZXJuZWwgc3BhY2UgaXMKPiA+IDJeMzggYnl0ZXMgc28gdGhlIHNpemUg b2Ygc2hhZG93IG1lbW9yeSBzaG91bGQgYmUgMl4zOCAvIDguIFRodXMsIHRoZQo+ID4gc2hhZG93 IG1lbW9yeSB3b3VsZCBub3Qgb3ZlcmxhcCB3aXRoIHRoZSBmaXhtYXAgYXJlYS4KPiA+Cj4gPiBU aGVyZSBhcmUgY3VycmVudGx5IHR3byBsaW1pdGF0aW9ucyBpbiB0aGlzIHBvcnQsCj4gPgo+ID4g MS4gUlY2NCBvbmx5OiBLQVNBTiBuZWVkIGxhcmdlIGFkZHJlc3Mgc3BhY2UgZm9yIGV4dHJhIHNo YWRvdyBtZW1vcnkKPiA+IHJlZ2lvbi4KPiA+Cj4gPiAyLiBLQVNBTiBjYW4ndCBkZWJ1ZyB0aGUg bW9kdWxlcyBzaW5jZSB0aGUgbW9kdWxlcyBhcmUgYWxsb2NhdGVkIGluIFZNQUxMT0MKPiA+IGFy ZWEuIFdlIG1hcHBlZCB0aGUgc2hhZG93IG1lbW9yeSwgd2hpY2ggY29ycmVzcG9uZGluZyB0byBW TUFMTE9DIGFyZWEsIHRvCj4gPiB0aGUga2FzYW5fZWFybHlfc2hhZG93X3BhZ2UgYmVjYXVzZSB3 ZSBkb24ndCBoYXZlIGVub3VnaCBwaHlzaWNhbCBzcGFjZSBmb3IKPiA+IGFsbCB0aGUgc2hhZG93 IG1lbW9yeSBjb3JyZXNwb25kaW5nIHRvIFZNQUxMT0MgYXJlYS4KPiA+Cj4gPiBTaWduZWQtb2Zm LWJ5OiBOaWNrIEh1IDxuaWNraHVAYW5kZXN0ZWNoLmNvbT4KPiA+IC0tLQo+ID4gIGFyY2gvcmlz Y3YvS2NvbmZpZyAgICAgICAgICAgICAgICAgIHwgICAxICsKPiA+ICBhcmNoL3Jpc2N2L2luY2x1 ZGUvYXNtL2thc2FuLmggICAgICB8ICAyNyArKysrKysrKwo+ID4gIGFyY2gvcmlzY3YvaW5jbHVk ZS9hc20vcGd0YWJsZS02NC5oIHwgICA1ICsrCj4gPiAgYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9z dHJpbmcuaCAgICAgfCAgIDkgKysrCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwvaGVhZC5TICAgICAg ICAgICAgfCAgIDMgKwo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3Jpc2N2X2tzeW1zLmMgICAgIHwg ICAyICsKPiA+ICBhcmNoL3Jpc2N2L2tlcm5lbC9zZXR1cC5jICAgICAgICAgICB8ICAgNSArKwo+ ID4gIGFyY2gvcmlzY3Yva2VybmVsL3ZtbGludXgubGRzLlMgICAgIHwgICAxICsKPiA+ICBhcmNo L3Jpc2N2L2xpYi9tZW1jcHkuUyAgICAgICAgICAgICB8ICAgNSArLQo+ID4gIGFyY2gvcmlzY3Yv bGliL21lbXNldC5TICAgICAgICAgICAgIHwgICA1ICstCj4gPiAgYXJjaC9yaXNjdi9tbS9NYWtl ZmlsZSAgICAgICAgICAgICAgfCAgIDYgKysKPiA+ICBhcmNoL3Jpc2N2L21tL2thc2FuX2luaXQu YyAgICAgICAgICB8IDEwNCArKysrKysrKysrKysrKysrKysrKysrKysrKysrCj4gPiAgMTIgZmls ZXMgY2hhbmdlZCwgMTY5IGluc2VydGlvbnMoKyksIDQgZGVsZXRpb25zKC0pCj4gPiAgY3JlYXRl IG1vZGUgMTAwNjQ0IGFyY2gvcmlzY3YvaW5jbHVkZS9hc20va2FzYW4uaAo+ID4gIGNyZWF0ZSBt b2RlIDEwMDY0NCBhcmNoL3Jpc2N2L21tL2thc2FuX2luaXQuYwo+ID4KPiA+IGRpZmYgLS1naXQg YS9hcmNoL3Jpc2N2L0tjb25maWcgYi9hcmNoL3Jpc2N2L0tjb25maWcKPiA+IGluZGV4IDhlZWJi Yzg4NjBiYi4uY2EyZmM4YmE4NTUwIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9LY29uZmln Cj4gPiArKysgYi9hcmNoL3Jpc2N2L0tjb25maWcKPiA+IEBAIC02MSw2ICs2MSw3IEBAIGNvbmZp ZyBSSVNDVgo+ID4gICAgICAgICBzZWxlY3QgU1BBUlNFTUVNX1NUQVRJQyBpZiAzMkJJVAo+ID4g ICAgICAgICBzZWxlY3QgQVJDSF9XQU5UX0RFRkFVTFRfVE9QRE9XTl9NTUFQX0xBWU9VVCBpZiBN TVUKPiA+ICAgICAgICAgc2VsZWN0IEhBVkVfQVJDSF9NTUFQX1JORF9CSVRTCj4gPiArICAgICAg IHNlbGVjdCBIQVZFX0FSQ0hfS0FTQU4gaWYgTU1VICYmIDY0QklUCj4gPgo+ID4gIGNvbmZpZyBB UkNIX01NQVBfUk5EX0JJVFNfTUlOCj4gPiAgICAgICAgIGRlZmF1bHQgMTggaWYgNjRCSVQKPiA+ IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL2thc2FuLmggYi9hcmNoL3Jpc2N2 L2luY2x1ZGUvYXNtL2thc2FuLmgKPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4gPiBpbmRleCAw MDAwMDAwMDAwMDAuLmViOWIxYTJmNjQxYwo+ID4gLS0tIC9kZXYvbnVsbAo+ID4gKysrIGIvYXJj aC9yaXNjdi9pbmNsdWRlL2FzbS9rYXNhbi5oCj4gPiBAQCAtMCwwICsxLDI3IEBACj4gPiArLyog U1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAgKi8KPiA+ICsvKiBDb3B5cmlnaHQgKEMp IDIwMTkgQW5kZXMgVGVjaG5vbG9neSBDb3Jwb3JhdGlvbiAqLwo+ID4gKwo+ID4gKyNpZm5kZWYg X19BU01fS0FTQU5fSAo+ID4gKyNkZWZpbmUgX19BU01fS0FTQU5fSAo+ID4gKwo+ID4gKyNpZm5k ZWYgX19BU1NFTUJMWV9fCj4gPiArCj4gPiArI2lmZGVmIENPTkZJR19LQVNBTgo+ID4gKwo+ID4g KyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgo+ID4gKwo+ID4gKyNkZWZpbmUgS0FTQU5fU0hBRE9X X1NDQUxFX1NISUZUICAgICAgIDMKPiA+ICsKPiA+ICsjZGVmaW5lIEtBU0FOX1NIQURPV19TSVpF ICAgICAgKFVMKDEpIDw8ICgzOCAtIEtBU0FOX1NIQURPV19TQ0FMRV9TSElGVCkpCj4gPiArI2Rl ZmluZSBLQVNBTl9TSEFET1dfU1RBUlQgICAgIDB4ZmZmZmZmYzAwMDAwMDAwMCAvLyAyXjY0IC0g Ml4zOAo+ID4gKyNkZWZpbmUgS0FTQU5fU0hBRE9XX0VORCAgICAgICAoS0FTQU5fU0hBRE9XX1NU QVJUICsgS0FTQU5fU0hBRE9XX1NJWkUpCj4gPiArCj4gPiArI2RlZmluZSBLQVNBTl9TSEFET1df T0ZGU0VUICAgIChLQVNBTl9TSEFET1dfRU5EIC0gKDFVTEwgPDwgXAo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICg2NCAtIEtBU0FOX1NIQURPV19TQ0FMRV9TSElG VCkpKQo+ID4gKwo+ID4gK3ZvaWQga2FzYW5faW5pdCh2b2lkKTsKPiA+ICthc21saW5rYWdlIHZv aWQga2FzYW5fZWFybHlfaW5pdCh2b2lkKTsKPiA+ICsKPiA+ICsjZW5kaWYKPiA+ICsjZW5kaWYK PiA+ICsjZW5kaWYgLyogX19BU01fS0FTQU5fSCAqLwo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlz Y3YvaW5jbHVkZS9hc20vcGd0YWJsZS02NC5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3Rh YmxlLTY0LmgKPiA+IGluZGV4IDdkZjhkYWE2NmNjOC4uNzc3YTFkZGRiM2RmIDEwMDY0NAo+ID4g LS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLTY0LmgKPiA+ICsrKyBiL2FyY2gv cmlzY3YvaW5jbHVkZS9hc20vcGd0YWJsZS02NC5oCj4gPiBAQCAtNTksNiArNTksMTEgQEAgc3Rh dGljIGlubGluZSB1bnNpZ25lZCBsb25nIHB1ZF9wYWdlX3ZhZGRyKHB1ZF90IHB1ZCkKPiA+ICAg ICAgICAgcmV0dXJuICh1bnNpZ25lZCBsb25nKXBmbl90b192aXJ0KHB1ZF92YWwocHVkKSA+PiBf UEFHRV9QRk5fU0hJRlQpOwo+ID4gIH0KPiA+Cj4gPiArc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFn ZSAqcHVkX3BhZ2UocHVkX3QgcHVkKQo+ID4gK3sKPiA+ICsgICAgICAgcmV0dXJuIHBmbl90b19w YWdlKHB1ZF92YWwocHVkKSA+PiBfUEFHRV9QRk5fU0hJRlQpOwo+ID4gK30KPiA+ICsKPiA+ICAj ZGVmaW5lIHBtZF9pbmRleChhZGRyKSAoKChhZGRyKSA+PiBQTURfU0hJRlQpICYgKFBUUlNfUEVS X1BNRCAtIDEpKQo+ID4KPiA+ICBzdGF0aWMgaW5saW5lIHBtZF90ICpwbWRfb2Zmc2V0KHB1ZF90 ICpwdWQsIHVuc2lnbmVkIGxvbmcgYWRkcikKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2lu Y2x1ZGUvYXNtL3N0cmluZy5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zdHJpbmcuaAo+ID4g aW5kZXggMWI1ZDQ0NTg1OTYyLi5hNDQ1MWY3Njg4MjYgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jp c2N2L2luY2x1ZGUvYXNtL3N0cmluZy5oCj4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNt L3N0cmluZy5oCj4gPiBAQCAtMTEsOCArMTEsMTcgQEAKPiA+Cj4gPiAgI2RlZmluZSBfX0hBVkVf QVJDSF9NRU1TRVQKPiA+ICBleHRlcm4gYXNtbGlua2FnZSB2b2lkICptZW1zZXQodm9pZCAqLCBp bnQsIHNpemVfdCk7Cj4gPiArZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCAqX19tZW1zZXQodm9pZCAq LCBpbnQsIHNpemVfdCk7Cj4gPgo+ID4gICNkZWZpbmUgX19IQVZFX0FSQ0hfTUVNQ1BZCj4gPiAg ZXh0ZXJuIGFzbWxpbmthZ2Ugdm9pZCAqbWVtY3B5KHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXpl X3QpOwo+ID4gK2V4dGVybiBhc21saW5rYWdlIHZvaWQgKl9fbWVtY3B5KHZvaWQgKiwgY29uc3Qg dm9pZCAqLCBzaXplX3QpOwo+ID4KPiA+ICsvLyBGb3IgdGhvc2UgZmlsZXMgd2hpY2ggZG9uJ3Qg d2FudCB0byBjaGVjayBieSBrYXNhbi4KPiA+ICsjaWYgZGVmaW5lZChDT05GSUdfS0FTQU4pICYm ICFkZWZpbmVkKF9fU0FOSVRJWkVfQUREUkVTU19fKQo+ID4gKwo+ID4gKyNkZWZpbmUgbWVtY3B5 KGRzdCwgc3JjLCBsZW4pIF9fbWVtY3B5KGRzdCwgc3JjLCBsZW4pCj4gPiArI2RlZmluZSBtZW1z ZXQocywgYywgbikgX19tZW1zZXQocywgYywgbikKPiA+ICsKPiA+ICsjZW5kaWYKPiA+ICAjZW5k aWYgLyogX0FTTV9SSVNDVl9TVFJJTkdfSCAqLwo+ID4gZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yv a2VybmVsL2hlYWQuUyBiL2FyY2gvcmlzY3Yva2VybmVsL2hlYWQuUwo+ID4gaW5kZXggNzJmODli NzU5MGRkLi45NWVjYTIzY2Q4MTEgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9o ZWFkLlMKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL2hlYWQuUwo+ID4gQEAgLTEwMiw2ICsx MDIsOSBAQCBjbGVhcl9ic3NfZG9uZToKPiA+ICAgICAgICAgc3cgemVybywgVEFTS19USV9DUFUo dHApCj4gPiAgICAgICAgIGxhIHNwLCBpbml0X3RocmVhZF91bmlvbiArIFRIUkVBRF9TSVpFCj4g Pgo+ID4gKyNpZmRlZiBDT05GSUdfS0FTQU4KPiA+ICsgICAgICAgY2FsbCBrYXNhbl9lYXJseV9p bml0Cj4gPiArI2VuZGlmCj4gPiAgICAgICAgIC8qIFN0YXJ0IHRoZSBrZXJuZWwgKi8KPiA+ICAg ICAgICAgY2FsbCBwYXJzZV9kdGIKPiA+ICAgICAgICAgdGFpbCBzdGFydF9rZXJuZWwKPiA+IGRp ZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9yaXNjdl9rc3ltcy5jIGIvYXJjaC9yaXNjdi9r ZXJuZWwvcmlzY3Zfa3N5bXMuYwo+ID4gaW5kZXggNDgwMGNmNzAzMTg2Li4zNzZiYmE3ZjY1Y2Ug MTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9yaXNjdl9rc3ltcy5jCj4gPiArKysg Yi9hcmNoL3Jpc2N2L2tlcm5lbC9yaXNjdl9rc3ltcy5jCj4gPiBAQCAtMTQsMyArMTQsNSBAQCBF WFBPUlRfU1lNQk9MKF9fYXNtX2NvcHlfdG9fdXNlcik7Cj4gPiAgRVhQT1JUX1NZTUJPTChfX2Fz bV9jb3B5X2Zyb21fdXNlcik7Cj4gPiAgRVhQT1JUX1NZTUJPTChtZW1zZXQpOwo+ID4gIEVYUE9S VF9TWU1CT0wobWVtY3B5KTsKPiA+ICtFWFBPUlRfU1lNQk9MKF9fbWVtc2V0KTsKPiA+ICtFWFBP UlRfU1lNQk9MKF9fbWVtY3B5KTsKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2tlcm5lbC9z ZXR1cC5jIGIvYXJjaC9yaXNjdi9rZXJuZWwvc2V0dXAuYwo+ID4gaW5kZXggYTk5MGE2Y2IxODRm Li40MWY3ZWFlOWJjNGQgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9zZXR1cC5j Cj4gPiArKysgYi9hcmNoL3Jpc2N2L2tlcm5lbC9zZXR1cC5jCj4gPiBAQCAtMjMsNiArMjMsNyBA QAo+ID4gICNpbmNsdWRlIDxhc20vc21wLmg+Cj4gPiAgI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5o Pgo+ID4gICNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KPiA+ICsjaW5jbHVkZSA8YXNtL2th c2FuLmg+Cj4gPgo+ID4gICNpZmRlZiBDT05GSUdfRFVNTVlfQ09OU09MRQo+ID4gIHN0cnVjdCBz Y3JlZW5faW5mbyBzY3JlZW5faW5mbyA9IHsKPiA+IEBAIC03MCw2ICs3MSwxMCBAQCB2b2lkIF9f aW5pdCBzZXR1cF9hcmNoKGNoYXIgKipjbWRsaW5lX3ApCj4gPiAgICAgICAgIHN3aW90bGJfaW5p dCgxKTsKPiA+ICAjZW5kaWYKPiA+Cj4gPiArI2lmZGVmIENPTkZJR19LQVNBTgo+ID4gKyAgICAg ICBrYXNhbl9pbml0KCk7Cj4gPiArI2VuZGlmCj4gPiArCj4gPiAgI2lmZGVmIENPTkZJR19TTVAK PiA+ICAgICAgICAgc2V0dXBfc21wKCk7Cj4gPiAgI2VuZGlmCj4gPiBkaWZmIC0tZ2l0IGEvYXJj aC9yaXNjdi9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gvcmlzY3Yva2VybmVsL3ZtbGludXgu bGRzLlMKPiA+IGluZGV4IDIzY2QxYTllNTJhMS4uOTcwMDk4MDNiYTlmIDEwMDY0NAo+ID4gLS0t IGEvYXJjaC9yaXNjdi9rZXJuZWwvdm1saW51eC5sZHMuUwo+ID4gKysrIGIvYXJjaC9yaXNjdi9r ZXJuZWwvdm1saW51eC5sZHMuUwo+ID4gQEAgLTQ2LDYgKzQ2LDcgQEAgU0VDVElPTlMKPiA+ICAg ICAgICAgICAgICAgICBLUFJPQkVTX1RFWFQKPiA+ICAgICAgICAgICAgICAgICBFTlRSWV9URVhU Cj4gPiAgICAgICAgICAgICAgICAgSVJRRU5UUllfVEVYVAo+ID4gKyAgICAgICAgICAgICAgIFNP RlRJUlFFTlRSWV9URVhUCj4gPiAgICAgICAgICAgICAgICAgKiguZml4dXApCj4gPiAgICAgICAg ICAgICAgICAgX2V0ZXh0ID0gLjsKPiA+ICAgICAgICAgfQo+ID4gZGlmZiAtLWdpdCBhL2FyY2gv cmlzY3YvbGliL21lbWNweS5TIGIvYXJjaC9yaXNjdi9saWIvbWVtY3B5LlMKPiA+IGluZGV4IGI0 YzQ3Nzg0NmU5MS4uNTFhYjcxNjI1M2ZhIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9saWIv bWVtY3B5LlMKPiA+ICsrKyBiL2FyY2gvcmlzY3YvbGliL21lbWNweS5TCj4gPiBAQCAtNyw3ICs3 LDggQEAKPiA+ICAjaW5jbHVkZSA8YXNtL2FzbS5oPgo+ID4KPiA+ICAvKiB2b2lkICptZW1jcHko dm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCkgKi8KPiA+IC1FTlRSWShtZW1jcHkpCj4gPiAr RU5UUlkoX19tZW1jcHkpCj4gPiArV0VBSyhtZW1jcHkpCj4gPiAgICAgICAgIG1vdmUgdDYsIGEw ICAvKiBQcmVzZXJ2ZSByZXR1cm4gdmFsdWUgKi8KPiA+Cj4gPiAgICAgICAgIC8qIERlZmVyIHRv IGJ5dGUtb3JpZW50ZWQgY29weSBmb3Igc21hbGwgc2l6ZXMgKi8KPiA+IEBAIC0xMDQsNCArMTA1 LDQgQEAgRU5UUlkobWVtY3B5KQo+ID4gICAgICAgICBibHR1IGExLCBhMywgNWIKPiA+ICA2Ogo+ ID4gICAgICAgICByZXQKPiA+IC1FTkQobWVtY3B5KQo+ID4gK0VORChfX21lbWNweSkKPiA+IGRp ZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2xpYi9tZW1zZXQuUyBiL2FyY2gvcmlzY3YvbGliL21lbXNl dC5TCj4gPiBpbmRleCA1YTczODZiNDcxNzUuLjM0YzUzNjBjNjcwNSAxMDA2NDQKPiA+IC0tLSBh L2FyY2gvcmlzY3YvbGliL21lbXNldC5TCj4gPiArKysgYi9hcmNoL3Jpc2N2L2xpYi9tZW1zZXQu Uwo+ID4gQEAgLTgsNyArOCw4IEBACj4gPiAgI2luY2x1ZGUgPGFzbS9hc20uaD4KPiA+Cj4gPiAg Lyogdm9pZCAqbWVtc2V0KHZvaWQgKiwgaW50LCBzaXplX3QpICovCj4gPiAtRU5UUlkobWVtc2V0 KQo+ID4gK0VOVFJZKF9fbWVtc2V0KQo+ID4gK1dFQUsobWVtc2V0KQo+ID4gICAgICAgICBtb3Zl IHQwLCBhMCAgLyogUHJlc2VydmUgcmV0dXJuIHZhbHVlICovCj4gPgo+ID4gICAgICAgICAvKiBE ZWZlciB0byBieXRlLW9yaWVudGVkIGZpbGwgZm9yIHNtYWxsIHNpemVzICovCj4gPiBAQCAtMTA5 LDQgKzExMCw0IEBAIEVOVFJZKG1lbXNldCkKPiA+ICAgICAgICAgYmx0dSB0MCwgYTMsIDViCj4g PiAgNjoKPiA+ICAgICAgICAgcmV0Cj4gPiAtRU5EKG1lbXNldCkKPiA+ICtFTkQoX19tZW1zZXQp Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9tbS9NYWtlZmlsZSBiL2FyY2gvcmlzY3YvbW0v TWFrZWZpbGUKPiA+IGluZGV4IDlkOWExNzMzNTY4Ni4uYjhhOGNhNzFmODZlIDEwMDY0NAo+ID4g LS0tIGEvYXJjaC9yaXNjdi9tbS9NYWtlZmlsZQo+ID4gKysrIGIvYXJjaC9yaXNjdi9tbS9NYWtl ZmlsZQo+ID4gQEAgLTE3LDMgKzE3LDkgQEAgaWZlcSAoJChDT05GSUdfTU1VKSx5KQo+ID4gIG9i ai0kKENPTkZJR19TTVApICs9IHRsYmZsdXNoLm8KPiA+ICBlbmRpZgo+ID4gIG9iai0kKENPTkZJ R19IVUdFVExCX1BBR0UpICs9IGh1Z2V0bGJwYWdlLm8KPiA+ICtvYmotJChDT05GSUdfS0FTQU4p ICAgKz0ga2FzYW5faW5pdC5vCj4gPiArCj4gPiAraWZkZWYgQ09ORklHX0tBU0FOCj4gPiArS0FT QU5fU0FOSVRJWkVfa2FzYW5faW5pdC5vIDo9IG4KPiA+ICtLQVNBTl9TQU5JVElaRV9pbml0Lm8g Oj0gbgo+ID4gK2VuZGlmCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9tbS9rYXNhbl9pbml0 LmMgYi9hcmNoL3Jpc2N2L21tL2thc2FuX2luaXQuYwo+ID4gbmV3IGZpbGUgbW9kZSAxMDA2NDQK PiA+IGluZGV4IDAwMDAwMDAwMDAwMC4uYzMxNTI3NjhjZGJlCj4gPiAtLS0gL2Rldi9udWxsCj4g PiArKysgYi9hcmNoL3Jpc2N2L21tL2thc2FuX2luaXQuYwo+ID4gQEAgLTAsMCArMSwxMDQgQEAK PiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAo+ID4gKy8vIENvcHlyaWdo dCAoQykgMjAxOSBBbmRlcyBUZWNobm9sb2d5IENvcnBvcmF0aW9uCj4gPiArCj4gPiArI2luY2x1 ZGUgPGxpbnV4L3Bmbi5oPgo+ID4gKyNpbmNsdWRlIDxsaW51eC9pbml0X3Rhc2suaD4KPiA+ICsj aW5jbHVkZSA8bGludXgva2FzYW4uaD4KPiA+ICsjaW5jbHVkZSA8bGludXgva2VybmVsLmg+Cj4g PiArI2luY2x1ZGUgPGxpbnV4L21lbWJsb2NrLmg+Cj4gPiArI2luY2x1ZGUgPGFzbS90bGJmbHVz aC5oPgo+ID4gKyNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgo+ID4gKyNpbmNsdWRlIDxhc20vZml4 bWFwLmg+Cj4gPiArCj4gPiArZXh0ZXJuIHBnZF90IGVhcmx5X3BnX2RpcltQVFJTX1BFUl9QR0Rd Owo+ID4gK2FzbWxpbmthZ2Ugdm9pZCBfX2luaXQga2FzYW5fZWFybHlfaW5pdCh2b2lkKQo+ID4g K3sKPiA+ICsgICAgICAgdWludHB0cl90IGk7Cj4gPiArICAgICAgIHBnZF90ICpwZ2QgPSBlYXJs eV9wZ19kaXIgKyBwZ2RfaW5kZXgoS0FTQU5fU0hBRE9XX1NUQVJUKTsKPiA+ICsKPiA+ICsgICAg ICAgZm9yIChpID0gMDsgaSA8IFBUUlNfUEVSX1BURTsgKytpKQo+ID4gKyAgICAgICAgICAgICAg IHNldF9wdGUoa2FzYW5fZWFybHlfc2hhZG93X3B0ZSArIGksCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICBta19wdGUodmlydF90b19wYWdlKGthc2FuX2Vhcmx5X3NoYWRvd19wYWdlKSwKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgIFBBR0VfS0VSTkVMKSk7Cj4gPiArCj4gPiArICAgICAg IGZvciAoaSA9IDA7IGkgPCBQVFJTX1BFUl9QTUQ7ICsraSkKPiA+ICsgICAgICAgICAgICAgICBz ZXRfcG1kKGthc2FuX2Vhcmx5X3NoYWRvd19wbWQgKyBpLAo+ID4gKyAgICAgICAgICAgICAgICBw Zm5fcG1kKFBGTl9ET1dOKF9fcGEoKHVpbnRwdHJfdClrYXNhbl9lYXJseV9zaGFkb3dfcHRlKSks Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBfX3BncHJvdChfUEFHRV9UQUJMRSkpKTsKPiA+ ICsKPiA+ICsgICAgICAgZm9yIChpID0gS0FTQU5fU0hBRE9XX1NUQVJUOyBpIDwgS0FTQU5fU0hB RE9XX0VORDsKPiA+ICsgICAgICAgICAgICBpICs9IFBHRElSX1NJWkUsICsrcGdkKQo+ID4gKyAg ICAgICAgICAgICAgIHNldF9wZ2QocGdkLAo+ID4gKyAgICAgICAgICAgICAgICBwZm5fcGdkKFBG Tl9ET1dOKF9fcGEoKCh1aW50cHRyX3Qpa2FzYW5fZWFybHlfc2hhZG93X3BtZCkpKSwKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgIF9fcGdwcm90KF9QQUdFX1RBQkxFKSkpOwo+ID4gKwo+ID4g KyAgICAgICAvLyBpbml0IGZvciBzd2FwcGVyX3BnX2Rpcgo+ID4gKyAgICAgICBwZ2QgPSBwZ2Rf b2Zmc2V0X2soS0FTQU5fU0hBRE9XX1NUQVJUKTsKPiA+ICsKPiA+ICsgICAgICAgZm9yIChpID0g S0FTQU5fU0hBRE9XX1NUQVJUOyBpIDwgS0FTQU5fU0hBRE9XX0VORDsKPiA+ICsgICAgICAgICAg ICBpICs9IFBHRElSX1NJWkUsICsrcGdkKQo+ID4gKyAgICAgICAgICAgICAgIHNldF9wZ2QocGdk LAo+ID4gKyAgICAgICAgICAgICAgICBwZm5fcGdkKFBGTl9ET1dOKF9fcGEoKCh1aW50cHRyX3Qp a2FzYW5fZWFybHlfc2hhZG93X3BtZCkpKSwKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIF9f cGdwcm90KF9QQUdFX1RBQkxFKSkpOwo+ID4gKwo+ID4gKyAgICAgICBmbHVzaF90bGJfYWxsKCk7 Cj4gPiArfQo+ID4gKwo+ID4gK3N0YXRpYyB2b2lkIF9faW5pdCBwb3B1bGF0ZSh2b2lkICpzdGFy dCwgdm9pZCAqZW5kKQo+ID4gK3sKPiA+ICsgICAgICAgdW5zaWduZWQgbG9uZyBpOwo+ID4gKyAg ICAgICB1bnNpZ25lZCBsb25nIHZhZGRyID0gKHVuc2lnbmVkIGxvbmcpc3RhcnQgJiBQQUdFX01B U0s7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgdmVuZCA9IFBBR0VfQUxJR04oKHVuc2lnbmVk IGxvbmcpZW5kKTsKPiA+ICsgICAgICAgdW5zaWduZWQgbG9uZyBuX3BhZ2VzID0gKHZlbmQgLSB2 YWRkcikgLyBQQUdFX1NJWkU7Cj4gPiArICAgICAgIHVuc2lnbmVkIGxvbmcgbl9wbWRzID0KPiA+ ICsgICAgICAgICAgICAgICAobl9wYWdlcyAlIFBUUlNfUEVSX1BURSkgPyBuX3BhZ2VzIC8gUFRS U19QRVJfUFRFICsgMSA6Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBuX3BhZ2VzIC8gUFRSU19QRVJfUFRFOwo+ID4gKyAgICAgICBwZ2RfdCAqcGdk ID0gcGdkX29mZnNldF9rKHZhZGRyKTsKPiA+ICsgICAgICAgcG1kX3QgKnBtZCA9IG1lbWJsb2Nr X2FsbG9jKG5fcG1kcyAqIHNpemVvZihwbWRfdCksIFBBR0VfU0laRSk7Cj4gPiArICAgICAgIHB0 ZV90ICpwdGUgPSBtZW1ibG9ja19hbGxvYyhuX3BhZ2VzICogc2l6ZW9mKHB0ZV90KSwgUEFHRV9T SVpFKTsKPiA+ICsKPiA+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IG5fcGFnZXM7IGkrKykgewo+ ID4gKyAgICAgICAgICAgICAgIHBoeXNfYWRkcl90IHBoeXMgPSBtZW1ibG9ja19waHlzX2FsbG9j KFBBR0VfU0laRSwgUEFHRV9TSVpFKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICBzZXRfcHRl KHB0ZSArIGksIHBmbl9wdGUoUEhZU19QRk4ocGh5cyksIFBBR0VfS0VSTkVMKSk7Cj4gPiArICAg ICAgIH0KPiA+ICsKPiA+ICsgICAgICAgZm9yIChpID0gMDsgaSA8IG5fcGFnZXM7ICsrcG1kLCBp ICs9IFBUUlNfUEVSX1BURSkKPiA+ICsgICAgICAgICAgICAgICBzZXRfcG1kKHBtZCwgcGZuX3Bt ZChQRk5fRE9XTihfX3BhKCh1aW50cHRyX3QpKHB0ZSArIGkpKSksCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIF9fcGdwcm90KF9QQUdFX1RBQkxFKSkpOwo+ID4gKwo+ID4gKyAg ICAgICBmb3IgKGkgPSB2YWRkcjsgaSA8IHZlbmQ7IGkgKz0gUEdESVJfU0laRSwgKytwZ2QpCj4g PiArICAgICAgICAgICAgICAgc2V0X3BnZChwZ2QsIHBmbl9wZ2QoUEZOX0RPV04oX19wYSgoKHVp bnRwdHJfdClwbWQpKSksCj4gXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX19wZ3Byb3QoX1BBR0VfVEFCTEUpKSk7Cj4gPiArCj4gCj4gSGkgTmljaywKPiAK PiBJIHZlcmlmeSB0aGlzIHBhdGNoIGluIFFlbXUgYW5kIFVubGVhc2hlZCBib2FyZC4KPiBJIGZv dW5kIGl0IHdvcmtzIHdlbGwgaWYgRFJBTSBzaXplIGlzIGxlc3MgdGhhbiA0R0IuCj4gSXQgd2ls bCBnZXQgYW4gYWNjZXNzIGZhdWx0IGlmIHRoZSBEUkFNIHNpemUgaXMgbGFyZ2VyIHRoYW4gNEdC Lgo+IAo+IEkgc3BlbmQgc29tZSB0aW1lIHRvIGRlYnVnIHRoaXMgY2FzZSBhbmQgSSBmb3VuZCBp dCBoYW5nIGluIHRoZQo+IGZvbGxvd2luZyBtZW1zZXQoKS4KPiBJdCBpcyBiZWNhdXNlIHRoZSBt YXBwaW5nIGlzIG5vdCBjcmVhdGVkIGNvcnJlY3RseS4gSSBjaGVjayB0aGUgcGFnZQo+IHRhYmxl IGNyZWF0aW5nIGxvZ2ljIGFnYWluIGFuZCBJIGZvdW5kIGl0IGFsd2F5cyBzZXRzIHRoZSBsYXN0 IHBtZAo+IGhlcmUuCkhpIEdyZWVudGltZSwKClRoYW5rcyEgSSB3b3VsZCBmaXggaXQgaW4gdjQg cGF0Y2guCgpOaWNrLgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVh ZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1y aXNjdgo=