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.3 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 160DBC07E95 for ; Fri, 16 Jul 2021 13:23:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E79C3613F7 for ; Fri, 16 Jul 2021 13:23:17 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S239886AbhGPN0L (ORCPT ); Fri, 16 Jul 2021 09:26:11 -0400 Received: from relay2-d.mail.gandi.net ([217.70.183.194]:49325 "EHLO relay2-d.mail.gandi.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S239391AbhGPN0I (ORCPT ); Fri, 16 Jul 2021 09:26:08 -0400 Received: (Authenticated sender: alex@ghiti.fr) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id D074040019; Fri, 16 Jul 2021 13:23:09 +0000 (UTC) From: Alex Ghiti Subject: Re: [PATCH RFC] riscv: Remove all XIP fixups by initializing MMU in memory To: Vitaly Wool Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , linux-riscv , LKML References: <20210618142353.2114854-1-alex@ghiti.fr> <23a3fc82-ecd9-4cdf-dc91-2d0fb996260a@ghiti.fr> Message-ID: <3a498433-1486-0968-3652-55b8ddb8f31e@ghiti.fr> Date: Fri, 16 Jul 2021 15:23:08 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 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 Vitaly, Le 8/07/2021 à 16:14, Vitaly Wool a écrit : > Hi Alex, > > On Thu, Jul 8, 2021 at 1:43 PM Alex Ghiti wrote: >> >> Le 18/06/2021 à 16:23, Alexandre Ghiti a écrit : >>> For XIP kernel, the variables that are accessed when the MMU is off must be >>> fixup and it is currently achieved by adding a preprocessor macro for all >>> those variables. This comes with a few drawbacks: >>> >>> - it adds a lot of code, especially in mm/init.c which gets overloaded, >>> - it easily breaks XIP kernels as anyone accessing a global variable before >>> the MMU is on must fixup this variable, >>> - it prevents the usage of those fixup variables anywhere outside >>> mm/init.c: kernel addresses conversion macros would benefit to switch >>> to inline functions. >>> >>> This patch makes the data fixups unnecessary by initializing the MMU in the >>> memory rather than in flash. Indeed, very soon in the boot process, the >>> kernel is copied to memory and the execution continues from there until >>> the kernel mapping is established where the execution jumps back in >>> flash. Then the offsets from the PC are preserved and no fixup is >>> necessary. And the kernel text in memory is never reserved so it is free >>> to use later on. >>> >>> This solution has the following drawbacks: >>> >>> - XIP kernel boot is longer because of the copy to memory, but can be >>> improved by copying only necessary parts, >>> - in the current implementation, it creates a hole at the beginning of >>> the memory which could prevent large contiguous allocation, >>> - it actually just inverts what needs to be fixup: now rodata and text >>> symbols accessed during the initialization of the MMU must be fixup >>> whereas it was data before. However, I found a single fixup to be >>> necessary and it is the dtb physical address in case CONFIG_BUILTIN_DTB >>> is set. >>> >> >> @Vitaly; Any thought about that? Could you take some time to review/test >> this approach? > > thanks for the heads-up. In my opinion, this thing with XIP on RISC-V > is currently going in the completely wrong direction. I would like to > see less data copying and less RAM usage, not more data copying and > more RAM usage. > In this patchset, there isn't more RAM usage but indeed more data copying, and as said, that can be largely improved by copying only the necessary parts, so we should evaluate/measure the time to copy those parts in RAM first. > I would also like to see kernel_mapping_pa_to_va / > kernel_mapping_va_to_pa simplified but that is a different story. I > might come up with something soon though. But I did not answer your message right away as your 'disapproval' made me start the implementation of another idea to circumvent all those issues. I'll submit the RFC soon, and from there, we'll discuss which approach is best (because I really want to see the code cleaned in mm/init.c :)). Alex > > Best regards, > Vitaly > >> Thanks! >> >> Alex >> >>> Signed-off-by: Alexandre Ghiti >>> --- >>> arch/riscv/include/asm/page.h | 12 ++--- >>> arch/riscv/include/asm/pgtable.h | 22 +------- >>> arch/riscv/kernel/head.S | 87 +++++++++++++++++++++++--------- >>> arch/riscv/kernel/setup.c | 2 +- >>> arch/riscv/mm/init.c | 59 +++------------------- >>> 5 files changed, 78 insertions(+), 104 deletions(-) >>> >>> diff --git a/arch/riscv/include/asm/page.h b/arch/riscv/include/asm/page.h >>> index 5d4622a44b09..97a950bbd3bf 100644 >>> --- a/arch/riscv/include/asm/page.h >>> +++ b/arch/riscv/include/asm/page.h >>> @@ -105,11 +105,11 @@ extern unsigned long kernel_virt_addr; >>> ((x) >= PAGE_OFFSET && (x) < kernel_virt_addr) >>> >>> #define linear_mapping_pa_to_va(x) ((void *)((unsigned long)(x) + va_pa_offset)) >>> -#define kernel_mapping_pa_to_va(y) ({ \ >>> - unsigned long _y = y; \ >>> - (_y >= CONFIG_PHYS_RAM_BASE) ? \ >>> - (void *)((unsigned long)(_y) + va_kernel_pa_offset + XIP_OFFSET) : \ >>> - (void *)((unsigned long)(_y) + va_kernel_xip_pa_offset); \ >>> +#define kernel_mapping_pa_to_va(y) ({ \ >>> + unsigned long _y = y; \ >>> + (_y >= CONFIG_PHYS_RAM_BASE) ? \ >>> + (void *)((unsigned long)(_y) + va_kernel_pa_offset) : \ >>> + (void *)((unsigned long)(_y) + va_kernel_xip_pa_offset); \ >>> }) >>> #define __pa_to_va_nodebug(x) linear_mapping_pa_to_va(x) >>> >>> @@ -118,7 +118,7 @@ extern unsigned long kernel_virt_addr; >>> unsigned long _y = y; \ >>> (_y < kernel_virt_addr + XIP_OFFSET) ? \ >>> ((unsigned long)(_y) - va_kernel_xip_pa_offset) : \ >>> - ((unsigned long)(_y) - va_kernel_pa_offset - XIP_OFFSET); \ >>> + ((unsigned long)(_y) - va_kernel_pa_offset); \ >>> }) >>> >>> #define __va_to_pa_nodebug(x) ({ \ >>> diff --git a/arch/riscv/include/asm/pgtable.h b/arch/riscv/include/asm/pgtable.h >>> index 3ccd2dc52e85..99ec99384bf0 100644 >>> --- a/arch/riscv/include/asm/pgtable.h >>> +++ b/arch/riscv/include/asm/pgtable.h >>> @@ -95,17 +95,6 @@ >>> #include >>> #endif /* CONFIG_64BIT */ >>> >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define XIP_FIXUP(addr) ({ \ >>> - uintptr_t __a = (uintptr_t)(addr); \ >>> - (__a >= CONFIG_XIP_PHYS_ADDR && __a < CONFIG_XIP_PHYS_ADDR + SZ_16M) ? \ >>> - __a - CONFIG_XIP_PHYS_ADDR + CONFIG_PHYS_RAM_BASE - XIP_OFFSET :\ >>> - __a; \ >>> - }) >>> -#else >>> -#define XIP_FIXUP(addr) (addr) >>> -#endif /* CONFIG_XIP_KERNEL */ >>> - >>> #ifdef CONFIG_MMU >>> /* Number of entries in the page global directory */ >>> #define PTRS_PER_PGD (PAGE_SIZE / sizeof(pgd_t)) >>> @@ -683,15 +672,8 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma, >>> #define kern_addr_valid(addr) (1) /* FIXME */ >>> >>> extern char _start[]; >>> -extern void *_dtb_early_va; >>> -extern uintptr_t _dtb_early_pa; >>> -#if defined(CONFIG_XIP_KERNEL) && defined(CONFIG_MMU) >>> -#define dtb_early_va (*(void **)XIP_FIXUP(&_dtb_early_va)) >>> -#define dtb_early_pa (*(uintptr_t *)XIP_FIXUP(&_dtb_early_pa)) >>> -#else >>> -#define dtb_early_va _dtb_early_va >>> -#define dtb_early_pa _dtb_early_pa >>> -#endif /* CONFIG_XIP_KERNEL */ >>> +extern void *dtb_early_va; >>> +extern uintptr_t dtb_early_pa; >>> >>> void paging_init(void); >>> void misc_mem_init(void); >>> diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S >>> index 89cc58ab52b4..7ac7d2bd1a53 100644 >>> --- a/arch/riscv/kernel/head.S >>> +++ b/arch/riscv/kernel/head.S >>> @@ -17,14 +17,33 @@ >>> >>> #ifdef CONFIG_XIP_KERNEL >>> .macro XIP_FIXUP_OFFSET reg >>> - REG_L t0, _xip_fixup >>> + li t0, CONFIG_PHYS_RAM_BASE - CONFIG_XIP_PHYS_ADDR >>> add \reg, \reg, t0 >>> .endm >>> -_xip_fixup: .dword CONFIG_PHYS_RAM_BASE - CONFIG_XIP_PHYS_ADDR - XIP_OFFSET >>> + >>> +.macro MEM_FIXUP_OFFSET reg >>> + li t0, CONFIG_XIP_PHYS_ADDR - CONFIG_PHYS_RAM_BASE >>> + add \reg, \reg, t0 >>> +.endm >>> + >>> +.macro XIP_JUMP_TO_MEM >>> + la t1, 0f >>> + XIP_FIXUP_OFFSET t1 >>> + jalr ra, t1, 0 >>> +0: >>> + /* Reload the global pointer: we are now in memory! */ >>> +.option push >>> +.option norelax >>> + la gp, __global_pointer$ >>> +.option pop >>> +.endm >>> #else >>> -.macro XIP_FIXUP_OFFSET reg >>> +.macro MEM_FIXUP_OFFSET reg >>> +.endm >>> + >>> +.macro XIP_JUMP_TO_MEM >>> .endm >>> -#endif /* CONFIG_XIP_KERNEL */ >>> +#endif >>> >>> __HEAD >>> ENTRY(_start) >>> @@ -82,7 +101,6 @@ pe_head_start: >>> relocate: >>> /* Relocate return address */ >>> la a1, kernel_virt_addr >>> - XIP_FIXUP_OFFSET a1 >>> REG_L a1, 0(a1) >>> la a2, _start >>> sub a1, a1, a2 >>> @@ -105,7 +123,6 @@ relocate: >>> * to ensure the new translations are in use. >>> */ >>> la a0, trampoline_pg_dir >>> - XIP_FIXUP_OFFSET a0 >>> srl a0, a0, PAGE_SHIFT >>> or a0, a0, a1 >>> sfence.vma >>> @@ -159,9 +176,7 @@ secondary_start_sbi: >>> >>> slli a3, a0, LGREG >>> la a4, __cpu_up_stack_pointer >>> - XIP_FIXUP_OFFSET a4 >>> la a5, __cpu_up_task_pointer >>> - XIP_FIXUP_OFFSET a5 >>> add a4, a3, a4 >>> add a5, a3, a5 >>> REG_L sp, (a4) >>> @@ -173,7 +188,6 @@ secondary_start_common: >>> #ifdef CONFIG_MMU >>> /* Enable virtual memory and relocate to virtual address */ >>> la a0, swapper_pg_dir >>> - XIP_FIXUP_OFFSET a0 >>> call relocate >>> #endif >>> call setup_trap_vector >>> @@ -253,14 +267,12 @@ pmp_done: >>> tail .Lsecondary_park >>> .Lgood_cores: >>> #endif >>> - >>> #ifndef CONFIG_XIP_KERNEL >>> /* Pick one hart to run the main boot sequence */ >>> la a3, hart_lottery >>> li a2, 1 >>> amoadd.w a3, a2, (a3) >>> bnez a3, .Lsecondary_start >>> - >>> #else >>> /* hart_lottery in flash contains a magic number */ >>> la a3, hart_lottery >>> @@ -270,17 +282,43 @@ pmp_done: >>> amoswap.w t0, t1, (a2) >>> /* first time here if hart_lottery in RAM is not set */ >>> beq t0, t1, .Lsecondary_start >>> - >>> - la sp, _end + THREAD_SIZE >>> - XIP_FIXUP_OFFSET sp >>> + /* >>> + * Copy the kernel text and data to memory: the virtual mapping will be >>> + * established from there, and then we will jump back to using flash >>> + * resident text. This avoids to fixup global symbols when the code >>> + * is executed from flash and targets data in memory before the MMU is >>> + * enabled. >>> + * We must preserve a0, a1 and we have no stack yet (__memcpy does not >>> + * spill anything). >>> + */ >>> mv s0, a0 >>> - call __copy_data >>> + mv s1, a1 >>> + >>> + li a0, CONFIG_PHYS_RAM_BASE >>> + la a1, _xiprom >>> + la a2, _exiprom >>> + sub a2, a2, a1 >>> + add a2, a2, 1 >>> + call __memcpy >>> + >>> + li a0, CONFIG_PHYS_RAM_BASE + XIP_OFFSET >>> + la a1, _sdata >>> + la a2, _end >>> + sub a2, a2, a1 >>> + add a2, a2, 1 >>> + call __memcpy >>> + >>> + fence.i >>> >>> - /* Restore a0 copy */ >>> mv a0, s0 >>> -#endif >>> + mv a1, s1 >>> >>> -#ifndef CONFIG_XIP_KERNEL >>> + /* >>> + * From here, the code will be executed from memory and we'll jump back >>> + * to flash once the MMU is enabled. >>> + */ >>> + XIP_JUMP_TO_MEM >>> +#endif >>> /* Clear BSS for flat non-ELF images */ >>> la a3, __bss_start >>> la a4, __bss_stop >>> @@ -290,27 +328,24 @@ clear_bss: >>> add a3, a3, RISCV_SZPTR >>> blt a3, a4, clear_bss >>> clear_bss_done: >>> -#endif >>> /* Save hart ID and DTB physical address */ >>> mv s0, a0 >>> mv s1, a1 >>> >>> la a2, boot_cpu_hartid >>> - XIP_FIXUP_OFFSET a2 >>> REG_S a0, (a2) >>> >>> /* Initialize page tables and relocate to virtual addresses */ >>> la sp, init_thread_union + THREAD_SIZE >>> - XIP_FIXUP_OFFSET sp >>> #ifdef CONFIG_BUILTIN_DTB >>> la a0, __dtb_start >>> + MEM_FIXUP_OFFSET a0 >>> #else >>> mv a0, s1 >>> #endif /* CONFIG_BUILTIN_DTB */ >>> call setup_vm >>> #ifdef CONFIG_MMU >>> la a0, early_pg_dir >>> - XIP_FIXUP_OFFSET a0 >>> call relocate >>> #endif /* CONFIG_MMU */ >>> >>> @@ -329,15 +364,19 @@ clear_bss_done: >>> >>> .Lsecondary_start: >>> #ifdef CONFIG_SMP >>> + /* >>> + * From here, XIP kernel will be executed from memory and we'll jump back >>> + * to flash once the MMU is enabled. >>> + */ >>> + XIP_JUMP_TO_MEM >>> + >>> /* Set trap vector to spin forever to help debug */ >>> la a3, .Lsecondary_park >>> csrw CSR_TVEC, a3 >>> >>> slli a3, a0, LGREG >>> la a1, __cpu_up_stack_pointer >>> - XIP_FIXUP_OFFSET a1 >>> la a2, __cpu_up_task_pointer >>> - XIP_FIXUP_OFFSET a2 >>> add a1, a3, a1 >>> add a2, a3, a2 >>> >>> diff --git a/arch/riscv/kernel/setup.c b/arch/riscv/kernel/setup.c >>> index 8b7f1c791821..8b7958b30a05 100644 >>> --- a/arch/riscv/kernel/setup.c >>> +++ b/arch/riscv/kernel/setup.c >>> @@ -279,7 +279,7 @@ void __init setup_arch(char **cmdline_p) >>> #if IS_ENABLED(CONFIG_BUILTIN_DTB) >>> unflatten_and_copy_device_tree(); >>> #else >>> - if (early_init_dt_verify(__va(XIP_FIXUP(dtb_early_pa)))) >>> + if (early_init_dt_verify(__va(dtb_early_pa))) >>> unflatten_device_tree(); >>> else >>> pr_err("No DTB found in kernel mappings\n"); >>> diff --git a/arch/riscv/mm/init.c b/arch/riscv/mm/init.c >>> index 3d77b04bec54..a70cdd77b2be 100644 >>> --- a/arch/riscv/mm/init.c >>> +++ b/arch/riscv/mm/init.c >>> @@ -33,7 +33,6 @@ >>> unsigned long kernel_virt_addr = KERNEL_LINK_ADDR; >>> EXPORT_SYMBOL(kernel_virt_addr); >>> #ifdef CONFIG_XIP_KERNEL >>> -#define kernel_virt_addr (*((unsigned long *)XIP_FIXUP(&kernel_virt_addr))) >>> extern char _xiprom[], _exiprom[]; >>> #endif >>> >>> @@ -43,8 +42,8 @@ EXPORT_SYMBOL(empty_zero_page); >>> >>> extern char _start[]; >>> #define DTB_EARLY_BASE_VA PGDIR_SIZE >>> -void *_dtb_early_va __initdata; >>> -uintptr_t _dtb_early_pa __initdata; >>> +void *dtb_early_va __initdata; >>> +uintptr_t dtb_early_pa __initdata; >>> >>> struct pt_alloc_ops { >>> pte_t *(*get_pte_virt)(phys_addr_t pa); >>> @@ -203,33 +202,18 @@ static void __init setup_bootmem(void) >>> } >>> >>> #ifdef CONFIG_MMU >>> -static struct pt_alloc_ops _pt_ops __initdata; >>> - >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define pt_ops (*(struct pt_alloc_ops *)XIP_FIXUP(&_pt_ops)) >>> -#else >>> -#define pt_ops _pt_ops >>> -#endif >>> +static struct pt_alloc_ops pt_ops __initdata; >>> >>> /* Offset between linear mapping virtual address and kernel load address */ >>> unsigned long va_pa_offset __ro_after_init; >>> EXPORT_SYMBOL(va_pa_offset); >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define va_pa_offset (*((unsigned long *)XIP_FIXUP(&va_pa_offset))) >>> -#endif >>> /* Offset between kernel mapping virtual address and kernel load address */ >>> #ifdef CONFIG_64BIT >>> unsigned long va_kernel_pa_offset __ro_after_init; >>> EXPORT_SYMBOL(va_kernel_pa_offset); >>> #endif >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define va_kernel_pa_offset (*((unsigned long *)XIP_FIXUP(&va_kernel_pa_offset))) >>> -#endif >>> unsigned long va_kernel_xip_pa_offset __ro_after_init; >>> EXPORT_SYMBOL(va_kernel_xip_pa_offset); >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define va_kernel_xip_pa_offset (*((unsigned long *)XIP_FIXUP(&va_kernel_xip_pa_offset))) >>> -#endif >>> unsigned long pfn_base __ro_after_init; >>> EXPORT_SYMBOL(pfn_base); >>> >>> @@ -239,12 +223,6 @@ static pte_t fixmap_pte[PTRS_PER_PTE] __page_aligned_bss; >>> >>> pgd_t early_pg_dir[PTRS_PER_PGD] __initdata __aligned(PAGE_SIZE); >>> >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define trampoline_pg_dir ((pgd_t *)XIP_FIXUP(trampoline_pg_dir)) >>> -#define fixmap_pte ((pte_t *)XIP_FIXUP(fixmap_pte)) >>> -#define early_pg_dir ((pgd_t *)XIP_FIXUP(early_pg_dir)) >>> -#endif /* CONFIG_XIP_KERNEL */ >>> - >>> void __set_fixmap(enum fixed_addresses idx, phys_addr_t phys, pgprot_t prot) >>> { >>> unsigned long addr = __fix_to_virt(idx); >>> @@ -320,12 +298,6 @@ static pmd_t fixmap_pmd[PTRS_PER_PMD] __page_aligned_bss; >>> static pmd_t early_pmd[PTRS_PER_PMD] __initdata __aligned(PAGE_SIZE); >>> static pmd_t early_dtb_pmd[PTRS_PER_PMD] __initdata __aligned(PAGE_SIZE); >>> >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define trampoline_pmd ((pmd_t *)XIP_FIXUP(trampoline_pmd)) >>> -#define fixmap_pmd ((pmd_t *)XIP_FIXUP(fixmap_pmd)) >>> -#define early_pmd ((pmd_t *)XIP_FIXUP(early_pmd)) >>> -#endif /* CONFIG_XIP_KERNEL */ >>> - >>> static pmd_t *__init get_pmd_virt_early(phys_addr_t pa) >>> { >>> /* Before MMU is enabled */ >>> @@ -442,19 +414,6 @@ static uintptr_t __init best_map_size(phys_addr_t base, phys_addr_t size) >>> return PMD_SIZE; >>> } >>> >>> -#ifdef CONFIG_XIP_KERNEL >>> -/* called from head.S with MMU off */ >>> -asmlinkage void __init __copy_data(void) >>> -{ >>> - void *from = (void *)(&_sdata); >>> - void *end = (void *)(&_end); >>> - void *to = (void *)CONFIG_PHYS_RAM_BASE; >>> - size_t sz = (size_t)(end - from + 1); >>> - >>> - memcpy(to, from, sz); >>> -} >>> -#endif >>> - >>> #ifdef CONFIG_STRICT_KERNEL_RWX >>> static __init pgprot_t pgprot_from_va(uintptr_t va) >>> { >>> @@ -511,16 +470,10 @@ static __init pgprot_t pgprot_from_va(uintptr_t va) >>> >>> static uintptr_t load_pa __initdata; >>> uintptr_t load_sz; >>> -#ifdef CONFIG_XIP_KERNEL >>> -#define load_pa (*((uintptr_t *)XIP_FIXUP(&load_pa))) >>> -#define load_sz (*((uintptr_t *)XIP_FIXUP(&load_sz))) >>> -#endif >>> >>> #ifdef CONFIG_XIP_KERNEL >>> static uintptr_t xiprom __initdata; >>> static uintptr_t xiprom_sz __initdata; >>> -#define xiprom_sz (*((uintptr_t *)XIP_FIXUP(&xiprom_sz))) >>> -#define xiprom (*((uintptr_t *)XIP_FIXUP(&xiprom))) >>> >>> static void __init create_kernel_page_table(pgd_t *pgdir, uintptr_t map_size, >>> __always_unused bool early) >>> @@ -538,7 +491,7 @@ static void __init create_kernel_page_table(pgd_t *pgdir, uintptr_t map_size, >>> end_va = kernel_virt_addr + XIP_OFFSET + load_sz; >>> for (va = kernel_virt_addr + XIP_OFFSET; va < end_va; va += map_size) >>> create_pgd_mapping(pgdir, va, >>> - load_pa + (va - (kernel_virt_addr + XIP_OFFSET)), >>> + load_pa + (va - kernel_virt_addr), >>> map_size, PAGE_KERNEL); >>> } >>> #else >>> @@ -648,7 +601,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) >>> * whereas dtb_early_va will be used before setup_vm_final installs >>> * the linear mapping. >>> */ >>> - dtb_early_va = kernel_mapping_pa_to_va(XIP_FIXUP(dtb_pa)); >>> + dtb_early_va = kernel_mapping_pa_to_va(dtb_pa); >>> #else >>> dtb_early_va = __va(dtb_pa); >>> #endif /* CONFIG_64BIT */ >>> @@ -664,7 +617,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) >>> dtb_early_va = (void *)DTB_EARLY_BASE_VA + (dtb_pa & (PGDIR_SIZE - 1)); >>> #else /* CONFIG_BUILTIN_DTB */ >>> #ifdef CONFIG_64BIT >>> - dtb_early_va = kernel_mapping_pa_to_va(XIP_FIXUP(dtb_pa)); >>> + dtb_early_va = kernel_mapping_pa_to_va(dtb_pa); >>> #else >>> dtb_early_va = __va(dtb_pa); >>> #endif /* CONFIG_64BIT */ >>> > > _______________________________________________ > 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=-16.0 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 95B70C12002 for ; Fri, 16 Jul 2021 13:23:36 +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 EEE4261026 for ; Fri, 16 Jul 2021 13:23:35 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org EEE4261026 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=bombadil.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:References: Cc:To:Subject:From:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=Lx7m4lCKacC99JSh51CoFjHZG+bydIjb1kiG6Am7ZaA=; b=VcnnK/gepSbCENEV9DlXSCjhr+ d+wg9Yan41VBbnqbBEUCbZF0sU+MaaxqcI7L9rESQerJk3E+2q+YmVJKX47fXyRVDxGyyObsO8Lov yEvr0cuEXy9FXTYGCI8ehXnvOGGoV4XFZHmkKUCNfA/OzEDZb+1FMnEkpmhoIZIy78mVPT849P6xL ztB9G10weOvo1p2DEJtDeuwg5skUwu5rGOu1jizxlLofmMnCk/VuGffWsq2zVKafHso3eTbI9pZ6J H7M1s3ebI5HKrlQAskGQwBiygSbc67TgHWkzCitRsaxYv7X2AoTTvWk/Qjy2/gHOOdndKslTLuHsO qtmogTYA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1m4NoF-004RtF-Ej; Fri, 16 Jul 2021 13:23:19 +0000 Received: from relay2-d.mail.gandi.net ([217.70.183.194]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1m4NoA-004Rrl-Og for linux-riscv@lists.infradead.org; Fri, 16 Jul 2021 13:23:17 +0000 Received: (Authenticated sender: alex@ghiti.fr) by relay2-d.mail.gandi.net (Postfix) with ESMTPSA id D074040019; Fri, 16 Jul 2021 13:23:09 +0000 (UTC) From: Alex Ghiti Subject: Re: [PATCH RFC] riscv: Remove all XIP fixups by initializing MMU in memory To: Vitaly Wool Cc: Paul Walmsley , Palmer Dabbelt , Albert Ou , linux-riscv , LKML References: <20210618142353.2114854-1-alex@ghiti.fr> <23a3fc82-ecd9-4cdf-dc91-2d0fb996260a@ghiti.fr> Message-ID: <3a498433-1486-0968-3652-55b8ddb8f31e@ghiti.fr> Date: Fri, 16 Jul 2021 15:23:08 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 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-20210716_062315_142039_29126A7E X-CRM114-Status: GOOD ( 35.36 ) 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: , 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 SGkgVml0YWx5LAoKTGUgOC8wNy8yMDIxIMOgIDE2OjE0LCBWaXRhbHkgV29vbCBhIMOpY3JpdMKg Ogo+IEhpIEFsZXgsCj4gCj4gT24gVGh1LCBKdWwgOCwgMjAyMSBhdCAxOjQzIFBNIEFsZXggR2hp dGkgPGFsZXhAZ2hpdGkuZnI+IHdyb3RlOgo+Pgo+PiBMZSAxOC8wNi8yMDIxIMOgIDE2OjIzLCBB bGV4YW5kcmUgR2hpdGkgYSDDqWNyaXQgOgo+Pj4gRm9yIFhJUCBrZXJuZWwsIHRoZSB2YXJpYWJs ZXMgdGhhdCBhcmUgYWNjZXNzZWQgd2hlbiB0aGUgTU1VIGlzIG9mZiBtdXN0IGJlCj4+PiBmaXh1 cCBhbmQgaXQgaXMgY3VycmVudGx5IGFjaGlldmVkIGJ5IGFkZGluZyBhIHByZXByb2Nlc3NvciBt YWNybyBmb3IgYWxsCj4+PiB0aG9zZSB2YXJpYWJsZXMuIFRoaXMgY29tZXMgd2l0aCBhIGZldyBk cmF3YmFja3M6Cj4+Pgo+Pj4gLSBpdCBhZGRzIGEgbG90IG9mIGNvZGUsIGVzcGVjaWFsbHkgaW4g bW0vaW5pdC5jIHdoaWNoIGdldHMgb3ZlcmxvYWRlZCwKPj4+IC0gaXQgZWFzaWx5IGJyZWFrcyBY SVAga2VybmVscyBhcyBhbnlvbmUgYWNjZXNzaW5nIGEgZ2xvYmFsIHZhcmlhYmxlIGJlZm9yZQo+ Pj4gICAgIHRoZSBNTVUgaXMgb24gbXVzdCBmaXh1cCB0aGlzIHZhcmlhYmxlLAo+Pj4gLSBpdCBw cmV2ZW50cyB0aGUgdXNhZ2Ugb2YgdGhvc2UgZml4dXAgdmFyaWFibGVzIGFueXdoZXJlIG91dHNp ZGUKPj4+ICAgICBtbS9pbml0LmM6IGtlcm5lbCBhZGRyZXNzZXMgY29udmVyc2lvbiBtYWNyb3Mg d291bGQgYmVuZWZpdCB0byBzd2l0Y2gKPj4+ICAgICB0byBpbmxpbmUgZnVuY3Rpb25zLgo+Pj4K Pj4+IFRoaXMgcGF0Y2ggbWFrZXMgdGhlIGRhdGEgZml4dXBzIHVubmVjZXNzYXJ5IGJ5IGluaXRp YWxpemluZyB0aGUgTU1VIGluIHRoZQo+Pj4gbWVtb3J5IHJhdGhlciB0aGFuIGluIGZsYXNoLiBJ bmRlZWQsIHZlcnkgc29vbiBpbiB0aGUgYm9vdCBwcm9jZXNzLCB0aGUKPj4+IGtlcm5lbCBpcyBj b3BpZWQgdG8gbWVtb3J5IGFuZCB0aGUgZXhlY3V0aW9uIGNvbnRpbnVlcyBmcm9tIHRoZXJlIHVu dGlsCj4+PiB0aGUga2VybmVsIG1hcHBpbmcgaXMgZXN0YWJsaXNoZWQgd2hlcmUgdGhlIGV4ZWN1 dGlvbiBqdW1wcyBiYWNrIGluCj4+PiBmbGFzaC4gVGhlbiB0aGUgb2Zmc2V0cyBmcm9tIHRoZSBQ QyBhcmUgcHJlc2VydmVkIGFuZCBubyBmaXh1cCBpcwo+Pj4gbmVjZXNzYXJ5LiBBbmQgdGhlIGtl cm5lbCB0ZXh0IGluIG1lbW9yeSBpcyBuZXZlciByZXNlcnZlZCBzbyBpdCBpcyBmcmVlCj4+PiB0 byB1c2UgbGF0ZXIgb24uCj4+Pgo+Pj4gVGhpcyBzb2x1dGlvbiBoYXMgdGhlIGZvbGxvd2luZyBk cmF3YmFja3M6Cj4+Pgo+Pj4gLSBYSVAga2VybmVsIGJvb3QgaXMgbG9uZ2VyIGJlY2F1c2Ugb2Yg dGhlIGNvcHkgdG8gbWVtb3J5LCBidXQgY2FuIGJlCj4+PiAgICAgaW1wcm92ZWQgYnkgY29weWlu ZyBvbmx5IG5lY2Vzc2FyeSBwYXJ0cywKPj4+IC0gaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRp b24sIGl0IGNyZWF0ZXMgYSBob2xlIGF0IHRoZSBiZWdpbm5pbmcgb2YKPj4+ICAgICB0aGUgbWVt b3J5IHdoaWNoIGNvdWxkIHByZXZlbnQgbGFyZ2UgY29udGlndW91cyBhbGxvY2F0aW9uLAo+Pj4g LSBpdCBhY3R1YWxseSBqdXN0IGludmVydHMgd2hhdCBuZWVkcyB0byBiZSBmaXh1cDogbm93IHJv ZGF0YSBhbmQgdGV4dAo+Pj4gICAgIHN5bWJvbHMgYWNjZXNzZWQgZHVyaW5nIHRoZSBpbml0aWFs aXphdGlvbiBvZiB0aGUgTU1VIG11c3QgYmUgZml4dXAKPj4+ICAgICB3aGVyZWFzIGl0IHdhcyBk YXRhIGJlZm9yZS4gSG93ZXZlciwgSSBmb3VuZCBhIHNpbmdsZSBmaXh1cCB0byBiZQo+Pj4gICAg IG5lY2Vzc2FyeSBhbmQgaXQgaXMgdGhlIGR0YiBwaHlzaWNhbCBhZGRyZXNzIGluIGNhc2UgQ09O RklHX0JVSUxUSU5fRFRCCj4+PiAgICAgaXMgc2V0Lgo+Pj4KPj4KPj4gQFZpdGFseTsgQW55IHRo b3VnaHQgYWJvdXQgdGhhdD8gQ291bGQgeW91IHRha2Ugc29tZSB0aW1lIHRvIHJldmlldy90ZXN0 Cj4+IHRoaXMgYXBwcm9hY2g/Cj4gCj4gdGhhbmtzIGZvciB0aGUgaGVhZHMtdXAuIEluIG15IG9w aW5pb24sIHRoaXMgdGhpbmcgd2l0aCBYSVAgb24gUklTQy1WCj4gaXMgY3VycmVudGx5IGdvaW5n IGluIHRoZSBjb21wbGV0ZWx5IHdyb25nIGRpcmVjdGlvbi4gSSB3b3VsZCBsaWtlIHRvCj4gc2Vl IGxlc3MgZGF0YSBjb3B5aW5nIGFuZCBsZXNzIFJBTSB1c2FnZSwgbm90IG1vcmUgZGF0YSBjb3B5 aW5nIGFuZAo+IG1vcmUgUkFNIHVzYWdlLgo+IAoKSW4gdGhpcyBwYXRjaHNldCwgdGhlcmUgaXNu J3QgbW9yZSBSQU0gdXNhZ2UgYnV0IGluZGVlZCBtb3JlIGRhdGEgCmNvcHlpbmcsIGFuZCBhcyBz YWlkLCB0aGF0IGNhbiBiZSBsYXJnZWx5IGltcHJvdmVkIGJ5IGNvcHlpbmcgb25seSB0aGUgCm5l Y2Vzc2FyeSBwYXJ0cywgc28gd2Ugc2hvdWxkIGV2YWx1YXRlL21lYXN1cmUgdGhlIHRpbWUgdG8g Y29weSB0aG9zZSAKcGFydHMgaW4gUkFNIGZpcnN0LgoKPiBJIHdvdWxkIGFsc28gbGlrZSB0byBz ZWUga2VybmVsX21hcHBpbmdfcGFfdG9fdmEgLwo+IGtlcm5lbF9tYXBwaW5nX3ZhX3RvX3BhIHNp bXBsaWZpZWQgYnV0IHRoYXQgaXMgYSBkaWZmZXJlbnQgc3RvcnkuIEkKPiBtaWdodCBjb21lIHVw IHdpdGggc29tZXRoaW5nIHNvb24gdGhvdWdoLgoKQnV0IEkgZGlkIG5vdCBhbnN3ZXIgeW91ciBt ZXNzYWdlIHJpZ2h0IGF3YXkgYXMgeW91ciAnZGlzYXBwcm92YWwnIG1hZGUgCm1lIHN0YXJ0IHRo ZSBpbXBsZW1lbnRhdGlvbiBvZiBhbm90aGVyIGlkZWEgdG8gY2lyY3VtdmVudCBhbGwgdGhvc2Ug Cmlzc3Vlcy4gSSdsbCBzdWJtaXQgdGhlIFJGQyBzb29uLCBhbmQgZnJvbSB0aGVyZSwgd2UnbGwg ZGlzY3VzcyB3aGljaCAKYXBwcm9hY2ggaXMgYmVzdCAoYmVjYXVzZSBJIHJlYWxseSB3YW50IHRv IHNlZSB0aGUgY29kZSBjbGVhbmVkIGluIAptbS9pbml0LmMgOikpLgoKQWxleAoKPiAKPiBCZXN0 IHJlZ2FyZHMsCj4gICAgIFZpdGFseQo+IAo+PiBUaGFua3MhCj4+Cj4+IEFsZXgKPj4KPj4+IFNp Z25lZC1vZmYtYnk6IEFsZXhhbmRyZSBHaGl0aSA8YWxleEBnaGl0aS5mcj4KPj4+IC0tLQo+Pj4g ICAgYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wYWdlLmggICAgfCAxMiArKy0tLQo+Pj4gICAgYXJj aC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmggfCAyMiArLS0tLS0tLQo+Pj4gICAgYXJjaC9y aXNjdi9rZXJuZWwvaGVhZC5TICAgICAgICAgfCA4NyArKysrKysrKysrKysrKysrKysrKysrKy0t LS0tLS0tLQo+Pj4gICAgYXJjaC9yaXNjdi9rZXJuZWwvc2V0dXAuYyAgICAgICAgfCAgMiArLQo+ Pj4gICAgYXJjaC9yaXNjdi9tbS9pbml0LmMgICAgICAgICAgICAgfCA1OSArKystLS0tLS0tLS0t LS0tLS0tLS0tCj4+PiAgICA1IGZpbGVzIGNoYW5nZWQsIDc4IGluc2VydGlvbnMoKyksIDEwNCBk ZWxldGlvbnMoLSkKPj4+Cj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9w YWdlLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BhZ2UuaAo+Pj4gaW5kZXggNWQ0NjIyYTQ0 YjA5Li45N2E5NTBiYmQzYmYgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNt L3BhZ2UuaAo+Pj4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wYWdlLmgKPj4+IEBAIC0x MDUsMTEgKzEwNSwxMSBAQCBleHRlcm4gdW5zaWduZWQgbG9uZyBrZXJuZWxfdmlydF9hZGRyOwo+ Pj4gICAgICAgICgoeCkgPj0gUEFHRV9PRkZTRVQgJiYgKHgpIDwga2VybmVsX3ZpcnRfYWRkcikK Pj4+Cj4+PiAgICAjZGVmaW5lIGxpbmVhcl9tYXBwaW5nX3BhX3RvX3ZhKHgpICAoKHZvaWQgKiko KHVuc2lnbmVkIGxvbmcpKHgpICsgdmFfcGFfb2Zmc2V0KSkKPj4+IC0jZGVmaW5lIGtlcm5lbF9t YXBwaW5nX3BhX3RvX3ZhKHkpICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAo+Pj4gLSAgICAgdW5zaWduZWQgbG9uZyBfeSA9IHk7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+PiAtICAg ICAoX3kgPj0gQ09ORklHX1BIWVNfUkFNX0JBU0UpID8gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4+IC0gICAgICAgICAgICAgKHZvaWQgKikoKHVu c2lnbmVkIGxvbmcpKF95KSArIHZhX2tlcm5lbF9wYV9vZmZzZXQgKyBYSVBfT0ZGU0VUKSA6ICAg ICAgXAo+Pj4gLSAgICAgICAgICAgICAodm9pZCAqKSgodW5zaWduZWQgbG9uZykoX3kpICsgdmFf a2VybmVsX3hpcF9wYV9vZmZzZXQpOyAgICAgICAgICAgICAgICBcCj4+PiArI2RlZmluZSBrZXJu ZWxfbWFwcGluZ19wYV90b192YSh5KSAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCj4+PiArICAgICB1bnNpZ25lZCBsb25nIF95ID0geTsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4+PiArICAgICAoX3kgPj0gQ09O RklHX1BIWVNfUkFNX0JBU0UpID8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCj4+PiArICAgICAgICAgICAgICh2b2lkICopKCh1bnNpZ25lZCBsb25nKShfeSkgKyB2 YV9rZXJuZWxfcGFfb2Zmc2V0KSA6ICAgICAgICAgICBcCj4+PiArICAgICAgICAgICAgICh2b2lk ICopKCh1bnNpZ25lZCBsb25nKShfeSkgKyB2YV9rZXJuZWxfeGlwX3BhX29mZnNldCk7ICAgICAg ICBcCj4+PiAgICAgICAgfSkKPj4+ICAgICNkZWZpbmUgX19wYV90b192YV9ub2RlYnVnKHgpICAg ICAgICAgICAgICAgbGluZWFyX21hcHBpbmdfcGFfdG9fdmEoeCkKPj4+Cj4+PiBAQCAtMTE4LDcg KzExOCw3IEBAIGV4dGVybiB1bnNpZ25lZCBsb25nIGtlcm5lbF92aXJ0X2FkZHI7Cj4+PiAgICAg ICAgdW5zaWduZWQgbG9uZyBfeSA9IHk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgXAo+Pj4gICAgICAgIChfeSA8IGtlcm5lbF92aXJ0X2FkZHIgKyBY SVBfT0ZGU0VUKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPj4+ICAgICAg ICAgICAgICAgICgodW5zaWduZWQgbG9uZykoX3kpIC0gdmFfa2VybmVsX3hpcF9wYV9vZmZzZXQp IDogICAgICAgICAgICAgICBcCj4+PiAtICAgICAgICAgICAgICgodW5zaWduZWQgbG9uZykoX3kp IC0gdmFfa2VybmVsX3BhX29mZnNldCAtIFhJUF9PRkZTRVQpOyAgICAgICBcCj4+PiArICAgICAg ICAgICAgICgodW5zaWduZWQgbG9uZykoX3kpIC0gdmFfa2VybmVsX3BhX29mZnNldCk7ICAgICAg ICAgICAgICAgICAgICBcCj4+PiAgICAgICAgfSkKPj4+Cj4+PiAgICAjZGVmaW5lIF9fdmFfdG9f cGFfbm9kZWJ1Zyh4KSAgICAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3Rh YmxlLmggYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3BndGFibGUuaAo+Pj4gaW5kZXggM2NjZDJk YzUyZTg1Li45OWVjOTkzODRiZjAgMTAwNjQ0Cj4+PiAtLS0gYS9hcmNoL3Jpc2N2L2luY2x1ZGUv YXNtL3BndGFibGUuaAo+Pj4gKysrIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgK Pj4+IEBAIC05NSwxNyArOTUsNiBAQAo+Pj4gICAgI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLTMyLmg+ Cj4+PiAgICAjZW5kaWYgLyogQ09ORklHXzY0QklUICovCj4+Pgo+Pj4gLSNpZmRlZiBDT05GSUdf WElQX0tFUk5FTAo+Pj4gLSNkZWZpbmUgWElQX0ZJWFVQKGFkZHIpICh7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+Pj4gLSAgICAgdWludHB0cl90 IF9fYSA9ICh1aW50cHRyX3QpKGFkZHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAo+Pj4gLSAgICAgKF9fYSA+PSBDT05GSUdfWElQX1BIWVNfQUREUiAmJiBfX2EgPCBD T05GSUdfWElQX1BIWVNfQUREUiArIFNaXzE2TSkgPyAgXAo+Pj4gLSAgICAgICAgICAgICBfX2Eg LSBDT05GSUdfWElQX1BIWVNfQUREUiArIENPTkZJR19QSFlTX1JBTV9CQVNFIC0gWElQX09GRlNF VCA6XAo+Pj4gLSAgICAgICAgICAgICBfX2E7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+Pj4gLSAgICAgfSkKPj4+IC0jZWxzZQo+ Pj4gLSNkZWZpbmUgWElQX0ZJWFVQKGFkZHIpICAgICAgICAgICAgICAoYWRkcikKPj4+IC0jZW5k aWYgLyogQ09ORklHX1hJUF9LRVJORUwgKi8KPj4+IC0KPj4+ICAgICNpZmRlZiBDT05GSUdfTU1V Cj4+PiAgICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcGFnZSBnbG9iYWwgZGlyZWN0b3J5 ICovCj4+PiAgICAjZGVmaW5lIFBUUlNfUEVSX1BHRCAgICAoUEFHRV9TSVpFIC8gc2l6ZW9mKHBn ZF90KSkKPj4+IEBAIC02ODMsMTUgKzY3Miw4IEBAIHN0YXRpYyBpbmxpbmUgcG1kX3QgcG1kcF9l c3RhYmxpc2goc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCj4+PiAgICAjZGVmaW5lIGtlcm5f YWRkcl92YWxpZChhZGRyKSAgICgxKSAvKiBGSVhNRSAqLwo+Pj4KPj4+ICAgIGV4dGVybiBjaGFy IF9zdGFydFtdOwo+Pj4gLWV4dGVybiB2b2lkICpfZHRiX2Vhcmx5X3ZhOwo+Pj4gLWV4dGVybiB1 aW50cHRyX3QgX2R0Yl9lYXJseV9wYTsKPj4+IC0jaWYgZGVmaW5lZChDT05GSUdfWElQX0tFUk5F TCkgJiYgZGVmaW5lZChDT05GSUdfTU1VKQo+Pj4gLSNkZWZpbmUgZHRiX2Vhcmx5X3ZhICgqKHZv aWQgKiopWElQX0ZJWFVQKCZfZHRiX2Vhcmx5X3ZhKSkKPj4+IC0jZGVmaW5lIGR0Yl9lYXJseV9w YSAoKih1aW50cHRyX3QgKilYSVBfRklYVVAoJl9kdGJfZWFybHlfcGEpKQo+Pj4gLSNlbHNlCj4+ PiAtI2RlZmluZSBkdGJfZWFybHlfdmEgX2R0Yl9lYXJseV92YQo+Pj4gLSNkZWZpbmUgZHRiX2Vh cmx5X3BhIF9kdGJfZWFybHlfcGEKPj4+IC0jZW5kaWYgLyogQ09ORklHX1hJUF9LRVJORUwgKi8K Pj4+ICtleHRlcm4gdm9pZCAqZHRiX2Vhcmx5X3ZhOwo+Pj4gK2V4dGVybiB1aW50cHRyX3QgZHRi X2Vhcmx5X3BhOwo+Pj4KPj4+ICAgIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7Cj4+PiAgICB2b2lk IG1pc2NfbWVtX2luaXQodm9pZCk7Cj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwv aGVhZC5TIGIvYXJjaC9yaXNjdi9rZXJuZWwvaGVhZC5TCj4+PiBpbmRleCA4OWNjNThhYjUyYjQu LjdhYzdkMmJkMWE1MyAxMDA2NDQKPj4+IC0tLSBhL2FyY2gvcmlzY3Yva2VybmVsL2hlYWQuUwo+ Pj4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvaGVhZC5TCj4+PiBAQCAtMTcsMTQgKzE3LDMzIEBA Cj4+Pgo+Pj4gICAgI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCj4+PiAgICAubWFjcm8gWElQX0ZJ WFVQX09GRlNFVCByZWcKPj4+IC0gICAgIFJFR19MIHQwLCBfeGlwX2ZpeHVwCj4+PiArICAgICBs aSB0MCwgQ09ORklHX1BIWVNfUkFNX0JBU0UgLSBDT05GSUdfWElQX1BIWVNfQUREUgo+Pj4gICAg ICAgIGFkZCBccmVnLCBccmVnLCB0MAo+Pj4gICAgLmVuZG0KPj4+IC1feGlwX2ZpeHVwOiAuZHdv cmQgQ09ORklHX1BIWVNfUkFNX0JBU0UgLSBDT05GSUdfWElQX1BIWVNfQUREUiAtIFhJUF9PRkZT RVQKPj4+ICsKPj4+ICsubWFjcm8gTUVNX0ZJWFVQX09GRlNFVCByZWcKPj4+ICsgICAgIGxpIHQw LCBDT05GSUdfWElQX1BIWVNfQUREUiAtIENPTkZJR19QSFlTX1JBTV9CQVNFCj4+PiArICAgICBh ZGQgXHJlZywgXHJlZywgdDAKPj4+ICsuZW5kbQo+Pj4gKwo+Pj4gKy5tYWNybyBYSVBfSlVNUF9U T19NRU0KPj4+ICsgICAgIGxhIHQxLCAwZgo+Pj4gKyAgICAgWElQX0ZJWFVQX09GRlNFVCB0MQo+ Pj4gKyAgICAgamFsciByYSwgdDEsIDAKPj4+ICswOgo+Pj4gKyAgICAgLyogUmVsb2FkIHRoZSBn bG9iYWwgcG9pbnRlcjogd2UgYXJlIG5vdyBpbiBtZW1vcnkhICovCj4+PiArLm9wdGlvbiBwdXNo Cj4+PiArLm9wdGlvbiBub3JlbGF4Cj4+PiArICAgICBsYSBncCwgX19nbG9iYWxfcG9pbnRlciQK Pj4+ICsub3B0aW9uIHBvcAo+Pj4gKy5lbmRtCj4+PiAgICAjZWxzZQo+Pj4gLS5tYWNybyBYSVBf RklYVVBfT0ZGU0VUIHJlZwo+Pj4gKy5tYWNybyBNRU1fRklYVVBfT0ZGU0VUIHJlZwo+Pj4gKy5l bmRtCj4+PiArCj4+PiArLm1hY3JvIFhJUF9KVU1QX1RPX01FTQo+Pj4gICAgLmVuZG0KPj4+IC0j ZW5kaWYgLyogQ09ORklHX1hJUF9LRVJORUwgKi8KPj4+ICsjZW5kaWYKPj4+Cj4+PiAgICBfX0hF QUQKPj4+ICAgIEVOVFJZKF9zdGFydCkKPj4+IEBAIC04Miw3ICsxMDEsNiBAQCBwZV9oZWFkX3N0 YXJ0Ogo+Pj4gICAgcmVsb2NhdGU6Cj4+PiAgICAgICAgLyogUmVsb2NhdGUgcmV0dXJuIGFkZHJl c3MgKi8KPj4+ICAgICAgICBsYSBhMSwga2VybmVsX3ZpcnRfYWRkcgo+Pj4gLSAgICAgWElQX0ZJ WFVQX09GRlNFVCBhMQo+Pj4gICAgICAgIFJFR19MIGExLCAwKGExKQo+Pj4gICAgICAgIGxhIGEy LCBfc3RhcnQKPj4+ICAgICAgICBzdWIgYTEsIGExLCBhMgo+Pj4gQEAgLTEwNSw3ICsxMjMsNiBA QCByZWxvY2F0ZToKPj4+ICAgICAgICAgKiB0byBlbnN1cmUgdGhlIG5ldyB0cmFuc2xhdGlvbnMg YXJlIGluIHVzZS4KPj4+ICAgICAgICAgKi8KPj4+ICAgICAgICBsYSBhMCwgdHJhbXBvbGluZV9w Z19kaXIKPj4+IC0gICAgIFhJUF9GSVhVUF9PRkZTRVQgYTAKPj4+ICAgICAgICBzcmwgYTAsIGEw LCBQQUdFX1NISUZUCj4+PiAgICAgICAgb3IgYTAsIGEwLCBhMQo+Pj4gICAgICAgIHNmZW5jZS52 bWEKPj4+IEBAIC0xNTksOSArMTc2LDcgQEAgc2Vjb25kYXJ5X3N0YXJ0X3NiaToKPj4+Cj4+PiAg ICAgICAgc2xsaSBhMywgYTAsIExHUkVHCj4+PiAgICAgICAgbGEgYTQsIF9fY3B1X3VwX3N0YWNr X3BvaW50ZXIKPj4+IC0gICAgIFhJUF9GSVhVUF9PRkZTRVQgYTQKPj4+ICAgICAgICBsYSBhNSwg X19jcHVfdXBfdGFza19wb2ludGVyCj4+PiAtICAgICBYSVBfRklYVVBfT0ZGU0VUIGE1Cj4+PiAg ICAgICAgYWRkIGE0LCBhMywgYTQKPj4+ICAgICAgICBhZGQgYTUsIGEzLCBhNQo+Pj4gICAgICAg IFJFR19MIHNwLCAoYTQpCj4+PiBAQCAtMTczLDcgKzE4OCw2IEBAIHNlY29uZGFyeV9zdGFydF9j b21tb246Cj4+PiAgICAjaWZkZWYgQ09ORklHX01NVQo+Pj4gICAgICAgIC8qIEVuYWJsZSB2aXJ0 dWFsIG1lbW9yeSBhbmQgcmVsb2NhdGUgdG8gdmlydHVhbCBhZGRyZXNzICovCj4+PiAgICAgICAg bGEgYTAsIHN3YXBwZXJfcGdfZGlyCj4+PiAtICAgICBYSVBfRklYVVBfT0ZGU0VUIGEwCj4+PiAg ICAgICAgY2FsbCByZWxvY2F0ZQo+Pj4gICAgI2VuZGlmCj4+PiAgICAgICAgY2FsbCBzZXR1cF90 cmFwX3ZlY3Rvcgo+Pj4gQEAgLTI1MywxNCArMjY3LDEyIEBAIHBtcF9kb25lOgo+Pj4gICAgICAg IHRhaWwgLkxzZWNvbmRhcnlfcGFyawo+Pj4gICAgLkxnb29kX2NvcmVzOgo+Pj4gICAgI2VuZGlm Cj4+PiAtCj4+PiAgICAjaWZuZGVmIENPTkZJR19YSVBfS0VSTkVMCj4+PiAgICAgICAgLyogUGlj ayBvbmUgaGFydCB0byBydW4gdGhlIG1haW4gYm9vdCBzZXF1ZW5jZSAqLwo+Pj4gICAgICAgIGxh IGEzLCBoYXJ0X2xvdHRlcnkKPj4+ICAgICAgICBsaSBhMiwgMQo+Pj4gICAgICAgIGFtb2FkZC53 IGEzLCBhMiwgKGEzKQo+Pj4gICAgICAgIGJuZXogYTMsIC5Mc2Vjb25kYXJ5X3N0YXJ0Cj4+PiAt Cj4+PiAgICAjZWxzZQo+Pj4gICAgICAgIC8qIGhhcnRfbG90dGVyeSBpbiBmbGFzaCBjb250YWlu cyBhIG1hZ2ljIG51bWJlciAqLwo+Pj4gICAgICAgIGxhIGEzLCBoYXJ0X2xvdHRlcnkKPj4+IEBA IC0yNzAsMTcgKzI4Miw0MyBAQCBwbXBfZG9uZToKPj4+ICAgICAgICBhbW9zd2FwLncgdDAsIHQx LCAoYTIpCj4+PiAgICAgICAgLyogZmlyc3QgdGltZSBoZXJlIGlmIGhhcnRfbG90dGVyeSBpbiBS QU0gaXMgbm90IHNldCAqLwo+Pj4gICAgICAgIGJlcSB0MCwgdDEsIC5Mc2Vjb25kYXJ5X3N0YXJ0 Cj4+PiAtCj4+PiAtICAgICBsYSBzcCwgX2VuZCArIFRIUkVBRF9TSVpFCj4+PiAtICAgICBYSVBf RklYVVBfT0ZGU0VUIHNwCj4+PiArICAgICAvKgo+Pj4gKyAgICAgICogQ29weSB0aGUga2VybmVs IHRleHQgYW5kIGRhdGEgdG8gbWVtb3J5OiB0aGUgdmlydHVhbCBtYXBwaW5nIHdpbGwgYmUKPj4+ ICsgICAgICAqIGVzdGFibGlzaGVkIGZyb20gdGhlcmUsIGFuZCB0aGVuIHdlIHdpbGwganVtcCBi YWNrIHRvIHVzaW5nIGZsYXNoCj4+PiArICAgICAgKiByZXNpZGVudCB0ZXh0LiBUaGlzIGF2b2lk cyB0byBmaXh1cCBnbG9iYWwgc3ltYm9scyB3aGVuIHRoZSBjb2RlCj4+PiArICAgICAgKiBpcyBl eGVjdXRlZCBmcm9tIGZsYXNoIGFuZCB0YXJnZXRzIGRhdGEgaW4gbWVtb3J5IGJlZm9yZSB0aGUg TU1VIGlzCj4+PiArICAgICAgKiBlbmFibGVkLgo+Pj4gKyAgICAgICogV2UgbXVzdCBwcmVzZXJ2 ZSBhMCwgYTEgYW5kIHdlIGhhdmUgbm8gc3RhY2sgeWV0IChfX21lbWNweSBkb2VzIG5vdAo+Pj4g KyAgICAgICogc3BpbGwgYW55dGhpbmcpLgo+Pj4gKyAgICAgICovCj4+PiAgICAgICAgbXYgczAs IGEwCj4+PiAtICAgICBjYWxsIF9fY29weV9kYXRhCj4+PiArICAgICBtdiBzMSwgYTEKPj4+ICsK Pj4+ICsgICAgIGxpIGEwLCBDT05GSUdfUEhZU19SQU1fQkFTRQo+Pj4gKyAgICAgbGEgYTEsIF94 aXByb20KPj4+ICsgICAgIGxhIGEyLCBfZXhpcHJvbQo+Pj4gKyAgICAgc3ViIGEyLCBhMiwgYTEK Pj4+ICsgICAgIGFkZCBhMiwgYTIsIDEKPj4+ICsgICAgIGNhbGwgX19tZW1jcHkKPj4+ICsKPj4+ ICsgICAgIGxpIGEwLCBDT05GSUdfUEhZU19SQU1fQkFTRSArIFhJUF9PRkZTRVQKPj4+ICsgICAg IGxhIGExLCBfc2RhdGEKPj4+ICsgICAgIGxhIGEyLCBfZW5kCj4+PiArICAgICBzdWIgYTIsIGEy LCBhMQo+Pj4gKyAgICAgYWRkIGEyLCBhMiwgMQo+Pj4gKyAgICAgY2FsbCBfX21lbWNweQo+Pj4g Kwo+Pj4gKyAgICAgZmVuY2UuaQo+Pj4KPj4+IC0gICAgIC8qIFJlc3RvcmUgYTAgY29weSAqLwo+ Pj4gICAgICAgIG12IGEwLCBzMAo+Pj4gLSNlbmRpZgo+Pj4gKyAgICAgbXYgYTEsIHMxCj4+Pgo+ Pj4gLSNpZm5kZWYgQ09ORklHX1hJUF9LRVJORUwKPj4+ICsgICAgIC8qCj4+PiArICAgICAgKiBG cm9tIGhlcmUsIHRoZSBjb2RlIHdpbGwgYmUgZXhlY3V0ZWQgZnJvbSBtZW1vcnkgYW5kIHdlJ2xs IGp1bXAgYmFjawo+Pj4gKyAgICAgICogdG8gZmxhc2ggb25jZSB0aGUgTU1VIGlzIGVuYWJsZWQu Cj4+PiArICAgICAgKi8KPj4+ICsgICAgIFhJUF9KVU1QX1RPX01FTQo+Pj4gKyNlbmRpZgo+Pj4g ICAgICAgIC8qIENsZWFyIEJTUyBmb3IgZmxhdCBub24tRUxGIGltYWdlcyAqLwo+Pj4gICAgICAg IGxhIGEzLCBfX2Jzc19zdGFydAo+Pj4gICAgICAgIGxhIGE0LCBfX2Jzc19zdG9wCj4+PiBAQCAt MjkwLDI3ICszMjgsMjQgQEAgY2xlYXJfYnNzOgo+Pj4gICAgICAgIGFkZCBhMywgYTMsIFJJU0NW X1NaUFRSCj4+PiAgICAgICAgYmx0IGEzLCBhNCwgY2xlYXJfYnNzCj4+PiAgICBjbGVhcl9ic3Nf ZG9uZToKPj4+IC0jZW5kaWYKPj4+ICAgICAgICAvKiBTYXZlIGhhcnQgSUQgYW5kIERUQiBwaHlz aWNhbCBhZGRyZXNzICovCj4+PiAgICAgICAgbXYgczAsIGEwCj4+PiAgICAgICAgbXYgczEsIGEx Cj4+Pgo+Pj4gICAgICAgIGxhIGEyLCBib290X2NwdV9oYXJ0aWQKPj4+IC0gICAgIFhJUF9GSVhV UF9PRkZTRVQgYTIKPj4+ICAgICAgICBSRUdfUyBhMCwgKGEyKQo+Pj4KPj4+ICAgICAgICAvKiBJ bml0aWFsaXplIHBhZ2UgdGFibGVzIGFuZCByZWxvY2F0ZSB0byB2aXJ0dWFsIGFkZHJlc3NlcyAq Lwo+Pj4gICAgICAgIGxhIHNwLCBpbml0X3RocmVhZF91bmlvbiArIFRIUkVBRF9TSVpFCj4+PiAt ICAgICBYSVBfRklYVVBfT0ZGU0VUIHNwCj4+PiAgICAjaWZkZWYgQ09ORklHX0JVSUxUSU5fRFRC Cj4+PiAgICAgICAgbGEgYTAsIF9fZHRiX3N0YXJ0Cj4+PiArICAgICBNRU1fRklYVVBfT0ZGU0VU IGEwCj4+PiAgICAjZWxzZQo+Pj4gICAgICAgIG12IGEwLCBzMQo+Pj4gICAgI2VuZGlmIC8qIENP TkZJR19CVUlMVElOX0RUQiAqLwo+Pj4gICAgICAgIGNhbGwgc2V0dXBfdm0KPj4+ICAgICNpZmRl ZiBDT05GSUdfTU1VCj4+PiAgICAgICAgbGEgYTAsIGVhcmx5X3BnX2Rpcgo+Pj4gLSAgICAgWElQ X0ZJWFVQX09GRlNFVCBhMAo+Pj4gICAgICAgIGNhbGwgcmVsb2NhdGUKPj4+ICAgICNlbmRpZiAv KiBDT05GSUdfTU1VICovCj4+Pgo+Pj4gQEAgLTMyOSwxNSArMzY0LDE5IEBAIGNsZWFyX2Jzc19k b25lOgo+Pj4KPj4+ICAgIC5Mc2Vjb25kYXJ5X3N0YXJ0Ogo+Pj4gICAgI2lmZGVmIENPTkZJR19T TVAKPj4+ICsgICAgIC8qCj4+PiArICAgICAgKiBGcm9tIGhlcmUsIFhJUCBrZXJuZWwgd2lsbCBi ZSBleGVjdXRlZCBmcm9tIG1lbW9yeSBhbmQgd2UnbGwganVtcCBiYWNrCj4+PiArICAgICAgKiB0 byBmbGFzaCBvbmNlIHRoZSBNTVUgaXMgZW5hYmxlZC4KPj4+ICsgICAgICAqLwo+Pj4gKyAgICAg WElQX0pVTVBfVE9fTUVNCj4+PiArCj4+PiAgICAgICAgLyogU2V0IHRyYXAgdmVjdG9yIHRvIHNw aW4gZm9yZXZlciB0byBoZWxwIGRlYnVnICovCj4+PiAgICAgICAgbGEgYTMsIC5Mc2Vjb25kYXJ5 X3BhcmsKPj4+ICAgICAgICBjc3J3IENTUl9UVkVDLCBhMwo+Pj4KPj4+ICAgICAgICBzbGxpIGEz LCBhMCwgTEdSRUcKPj4+ICAgICAgICBsYSBhMSwgX19jcHVfdXBfc3RhY2tfcG9pbnRlcgo+Pj4g LSAgICAgWElQX0ZJWFVQX09GRlNFVCBhMQo+Pj4gICAgICAgIGxhIGEyLCBfX2NwdV91cF90YXNr X3BvaW50ZXIKPj4+IC0gICAgIFhJUF9GSVhVUF9PRkZTRVQgYTIKPj4+ICAgICAgICBhZGQgYTEs IGEzLCBhMQo+Pj4gICAgICAgIGFkZCBhMiwgYTMsIGEyCj4+Pgo+Pj4gZGlmZiAtLWdpdCBhL2Fy Y2gvcmlzY3Yva2VybmVsL3NldHVwLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9zZXR1cC5jCj4+PiBp bmRleCA4YjdmMWM3OTE4MjEuLjhiNzk1OGIzMGEwNSAxMDA2NDQKPj4+IC0tLSBhL2FyY2gvcmlz Y3Yva2VybmVsL3NldHVwLmMKPj4+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL3NldHVwLmMKPj4+ IEBAIC0yNzksNyArMjc5LDcgQEAgdm9pZCBfX2luaXQgc2V0dXBfYXJjaChjaGFyICoqY21kbGlu ZV9wKQo+Pj4gICAgI2lmIElTX0VOQUJMRUQoQ09ORklHX0JVSUxUSU5fRFRCKQo+Pj4gICAgICAg IHVuZmxhdHRlbl9hbmRfY29weV9kZXZpY2VfdHJlZSgpOwo+Pj4gICAgI2Vsc2UKPj4+IC0gICAg IGlmIChlYXJseV9pbml0X2R0X3ZlcmlmeShfX3ZhKFhJUF9GSVhVUChkdGJfZWFybHlfcGEpKSkp Cj4+PiArICAgICBpZiAoZWFybHlfaW5pdF9kdF92ZXJpZnkoX192YShkdGJfZWFybHlfcGEpKSkK Pj4+ICAgICAgICAgICAgICAgIHVuZmxhdHRlbl9kZXZpY2VfdHJlZSgpOwo+Pj4gICAgICAgIGVs c2UKPj4+ICAgICAgICAgICAgICAgIHByX2VycigiTm8gRFRCIGZvdW5kIGluIGtlcm5lbCBtYXBw aW5nc1xuIik7Cj4+PiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9tbS9pbml0LmMgYi9hcmNoL3Jp c2N2L21tL2luaXQuYwo+Pj4gaW5kZXggM2Q3N2IwNGJlYzU0Li5hNzBjZGQ3N2IyYmUgMTAwNjQ0 Cj4+PiAtLS0gYS9hcmNoL3Jpc2N2L21tL2luaXQuYwo+Pj4gKysrIGIvYXJjaC9yaXNjdi9tbS9p bml0LmMKPj4+IEBAIC0zMyw3ICszMyw2IEBACj4+PiAgICB1bnNpZ25lZCBsb25nIGtlcm5lbF92 aXJ0X2FkZHIgPSBLRVJORUxfTElOS19BRERSOwo+Pj4gICAgRVhQT1JUX1NZTUJPTChrZXJuZWxf dmlydF9hZGRyKTsKPj4+ICAgICNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAo+Pj4gLSNkZWZpbmUg a2VybmVsX3ZpcnRfYWRkciAgICAgICAoKigodW5zaWduZWQgbG9uZyAqKVhJUF9GSVhVUCgma2Vy bmVsX3ZpcnRfYWRkcikpKQo+Pj4gICAgZXh0ZXJuIGNoYXIgX3hpcHJvbVtdLCBfZXhpcHJvbVtd Owo+Pj4gICAgI2VuZGlmCj4+Pgo+Pj4gQEAgLTQzLDggKzQyLDggQEAgRVhQT1JUX1NZTUJPTChl bXB0eV96ZXJvX3BhZ2UpOwo+Pj4KPj4+ICAgIGV4dGVybiBjaGFyIF9zdGFydFtdOwo+Pj4gICAg I2RlZmluZSBEVEJfRUFSTFlfQkFTRV9WQSAgICAgIFBHRElSX1NJWkUKPj4+IC12b2lkICpfZHRi X2Vhcmx5X3ZhIF9faW5pdGRhdGE7Cj4+PiAtdWludHB0cl90IF9kdGJfZWFybHlfcGEgX19pbml0 ZGF0YTsKPj4+ICt2b2lkICpkdGJfZWFybHlfdmEgX19pbml0ZGF0YTsKPj4+ICt1aW50cHRyX3Qg ZHRiX2Vhcmx5X3BhIF9faW5pdGRhdGE7Cj4+Pgo+Pj4gICAgc3RydWN0IHB0X2FsbG9jX29wcyB7 Cj4+PiAgICAgICAgcHRlX3QgKigqZ2V0X3B0ZV92aXJ0KShwaHlzX2FkZHJfdCBwYSk7Cj4+PiBA QCAtMjAzLDMzICsyMDIsMTggQEAgc3RhdGljIHZvaWQgX19pbml0IHNldHVwX2Jvb3RtZW0odm9p ZCkKPj4+ICAgIH0KPj4+Cj4+PiAgICAjaWZkZWYgQ09ORklHX01NVQo+Pj4gLXN0YXRpYyBzdHJ1 Y3QgcHRfYWxsb2Nfb3BzIF9wdF9vcHMgX19pbml0ZGF0YTsKPj4+IC0KPj4+IC0jaWZkZWYgQ09O RklHX1hJUF9LRVJORUwKPj4+IC0jZGVmaW5lIHB0X29wcyAoKihzdHJ1Y3QgcHRfYWxsb2Nfb3Bz ICopWElQX0ZJWFVQKCZfcHRfb3BzKSkKPj4+IC0jZWxzZQo+Pj4gLSNkZWZpbmUgcHRfb3BzIF9w dF9vcHMKPj4+IC0jZW5kaWYKPj4+ICtzdGF0aWMgc3RydWN0IHB0X2FsbG9jX29wcyBwdF9vcHMg X19pbml0ZGF0YTsKPj4+Cj4+PiAgICAvKiBPZmZzZXQgYmV0d2VlbiBsaW5lYXIgbWFwcGluZyB2 aXJ0dWFsIGFkZHJlc3MgYW5kIGtlcm5lbCBsb2FkIGFkZHJlc3MgKi8KPj4+ICAgIHVuc2lnbmVk IGxvbmcgdmFfcGFfb2Zmc2V0IF9fcm9fYWZ0ZXJfaW5pdDsKPj4+ICAgIEVYUE9SVF9TWU1CT0wo dmFfcGFfb2Zmc2V0KTsKPj4+IC0jaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKPj4+IC0jZGVmaW5l IHZhX3BhX29mZnNldCAgICgqKCh1bnNpZ25lZCBsb25nICopWElQX0ZJWFVQKCZ2YV9wYV9vZmZz ZXQpKSkKPj4+IC0jZW5kaWYKPj4+ICAgIC8qIE9mZnNldCBiZXR3ZWVuIGtlcm5lbCBtYXBwaW5n IHZpcnR1YWwgYWRkcmVzcyBhbmQga2VybmVsIGxvYWQgYWRkcmVzcyAqLwo+Pj4gICAgI2lmZGVm IENPTkZJR182NEJJVAo+Pj4gICAgdW5zaWduZWQgbG9uZyB2YV9rZXJuZWxfcGFfb2Zmc2V0IF9f cm9fYWZ0ZXJfaW5pdDsKPj4+ICAgIEVYUE9SVF9TWU1CT0wodmFfa2VybmVsX3BhX29mZnNldCk7 Cj4+PiAgICAjZW5kaWYKPj4+IC0jaWZkZWYgQ09ORklHX1hJUF9LRVJORUwKPj4+IC0jZGVmaW5l IHZhX2tlcm5lbF9wYV9vZmZzZXQgICAgKCooKHVuc2lnbmVkIGxvbmcgKilYSVBfRklYVVAoJnZh X2tlcm5lbF9wYV9vZmZzZXQpKSkKPj4+IC0jZW5kaWYKPj4+ICAgIHVuc2lnbmVkIGxvbmcgdmFf a2VybmVsX3hpcF9wYV9vZmZzZXQgX19yb19hZnRlcl9pbml0Owo+Pj4gICAgRVhQT1JUX1NZTUJP TCh2YV9rZXJuZWxfeGlwX3BhX29mZnNldCk7Cj4+PiAtI2lmZGVmIENPTkZJR19YSVBfS0VSTkVM Cj4+PiAtI2RlZmluZSB2YV9rZXJuZWxfeGlwX3BhX29mZnNldCAgICAgICAgKCooKHVuc2lnbmVk IGxvbmcgKilYSVBfRklYVVAoJnZhX2tlcm5lbF94aXBfcGFfb2Zmc2V0KSkpCj4+PiAtI2VuZGlm Cj4+PiAgICB1bnNpZ25lZCBsb25nIHBmbl9iYXNlIF9fcm9fYWZ0ZXJfaW5pdDsKPj4+ICAgIEVY UE9SVF9TWU1CT0wocGZuX2Jhc2UpOwo+Pj4KPj4+IEBAIC0yMzksMTIgKzIyMyw2IEBAIHN0YXRp YyBwdGVfdCBmaXhtYXBfcHRlW1BUUlNfUEVSX1BURV0gX19wYWdlX2FsaWduZWRfYnNzOwo+Pj4K Pj4+ICAgIHBnZF90IGVhcmx5X3BnX2RpcltQVFJTX1BFUl9QR0RdIF9faW5pdGRhdGEgX19hbGln bmVkKFBBR0VfU0laRSk7Cj4+Pgo+Pj4gLSNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAo+Pj4gLSNk ZWZpbmUgdHJhbXBvbGluZV9wZ19kaXIgICAgICAoKHBnZF90ICopWElQX0ZJWFVQKHRyYW1wb2xp bmVfcGdfZGlyKSkKPj4+IC0jZGVmaW5lIGZpeG1hcF9wdGUgICAgICAgICAgICAgKChwdGVfdCAq KVhJUF9GSVhVUChmaXhtYXBfcHRlKSkKPj4+IC0jZGVmaW5lIGVhcmx5X3BnX2RpciAgICAgICAg ICAgKChwZ2RfdCAqKVhJUF9GSVhVUChlYXJseV9wZ19kaXIpKQo+Pj4gLSNlbmRpZiAvKiBDT05G SUdfWElQX0tFUk5FTCAqLwo+Pj4gLQo+Pj4gICAgdm9pZCBfX3NldF9maXhtYXAoZW51bSBmaXhl ZF9hZGRyZXNzZXMgaWR4LCBwaHlzX2FkZHJfdCBwaHlzLCBwZ3Byb3RfdCBwcm90KQo+Pj4gICAg ewo+Pj4gICAgICAgIHVuc2lnbmVkIGxvbmcgYWRkciA9IF9fZml4X3RvX3ZpcnQoaWR4KTsKPj4+ IEBAIC0zMjAsMTIgKzI5OCw2IEBAIHN0YXRpYyBwbWRfdCBmaXhtYXBfcG1kW1BUUlNfUEVSX1BN RF0gX19wYWdlX2FsaWduZWRfYnNzOwo+Pj4gICAgc3RhdGljIHBtZF90IGVhcmx5X3BtZFtQVFJT X1BFUl9QTURdIF9faW5pdGRhdGEgX19hbGlnbmVkKFBBR0VfU0laRSk7Cj4+PiAgICBzdGF0aWMg cG1kX3QgZWFybHlfZHRiX3BtZFtQVFJTX1BFUl9QTURdIF9faW5pdGRhdGEgX19hbGlnbmVkKFBB R0VfU0laRSk7Cj4+Pgo+Pj4gLSNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAo+Pj4gLSNkZWZpbmUg dHJhbXBvbGluZV9wbWQgKChwbWRfdCAqKVhJUF9GSVhVUCh0cmFtcG9saW5lX3BtZCkpCj4+PiAt I2RlZmluZSBmaXhtYXBfcG1kICAgICAoKHBtZF90ICopWElQX0ZJWFVQKGZpeG1hcF9wbWQpKQo+ Pj4gLSNkZWZpbmUgZWFybHlfcG1kICAgICAgKChwbWRfdCAqKVhJUF9GSVhVUChlYXJseV9wbWQp KQo+Pj4gLSNlbmRpZiAvKiBDT05GSUdfWElQX0tFUk5FTCAqLwo+Pj4gLQo+Pj4gICAgc3RhdGlj IHBtZF90ICpfX2luaXQgZ2V0X3BtZF92aXJ0X2Vhcmx5KHBoeXNfYWRkcl90IHBhKQo+Pj4gICAg ewo+Pj4gICAgICAgIC8qIEJlZm9yZSBNTVUgaXMgZW5hYmxlZCAqLwo+Pj4gQEAgLTQ0MiwxOSAr NDE0LDYgQEAgc3RhdGljIHVpbnRwdHJfdCBfX2luaXQgYmVzdF9tYXBfc2l6ZShwaHlzX2FkZHJf dCBiYXNlLCBwaHlzX2FkZHJfdCBzaXplKQo+Pj4gICAgICAgIHJldHVybiBQTURfU0laRTsKPj4+ ICAgIH0KPj4+Cj4+PiAtI2lmZGVmIENPTkZJR19YSVBfS0VSTkVMCj4+PiAtLyogY2FsbGVkIGZy b20gaGVhZC5TIHdpdGggTU1VIG9mZiAqLwo+Pj4gLWFzbWxpbmthZ2Ugdm9pZCBfX2luaXQgX19j b3B5X2RhdGEodm9pZCkKPj4+IC17Cj4+PiAtICAgICB2b2lkICpmcm9tID0gKHZvaWQgKikoJl9z ZGF0YSk7Cj4+PiAtICAgICB2b2lkICplbmQgPSAodm9pZCAqKSgmX2VuZCk7Cj4+PiAtICAgICB2 b2lkICp0byA9ICh2b2lkICopQ09ORklHX1BIWVNfUkFNX0JBU0U7Cj4+PiAtICAgICBzaXplX3Qg c3ogPSAoc2l6ZV90KShlbmQgLSBmcm9tICsgMSk7Cj4+PiAtCj4+PiAtICAgICBtZW1jcHkodG8s IGZyb20sIHN6KTsKPj4+IC19Cj4+PiAtI2VuZGlmCj4+PiAtCj4+PiAgICAjaWZkZWYgQ09ORklH X1NUUklDVF9LRVJORUxfUldYCj4+PiAgICBzdGF0aWMgX19pbml0IHBncHJvdF90IHBncHJvdF9m cm9tX3ZhKHVpbnRwdHJfdCB2YSkKPj4+ICAgIHsKPj4+IEBAIC01MTEsMTYgKzQ3MCwxMCBAQCBz dGF0aWMgX19pbml0IHBncHJvdF90IHBncHJvdF9mcm9tX3ZhKHVpbnRwdHJfdCB2YSkKPj4+Cj4+ PiAgICBzdGF0aWMgdWludHB0cl90IGxvYWRfcGEgX19pbml0ZGF0YTsKPj4+ICAgIHVpbnRwdHJf dCBsb2FkX3N6Owo+Pj4gLSNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAo+Pj4gLSNkZWZpbmUgbG9h ZF9wYSAgICAgICAgKCooKHVpbnRwdHJfdCAqKVhJUF9GSVhVUCgmbG9hZF9wYSkpKQo+Pj4gLSNk ZWZpbmUgbG9hZF9zeiAgICAgICAgKCooKHVpbnRwdHJfdCAqKVhJUF9GSVhVUCgmbG9hZF9zeikp KQo+Pj4gLSNlbmRpZgo+Pj4KPj4+ICAgICNpZmRlZiBDT05GSUdfWElQX0tFUk5FTAo+Pj4gICAg c3RhdGljIHVpbnRwdHJfdCB4aXByb20gX19pbml0ZGF0YTsKPj4+ICAgIHN0YXRpYyB1aW50cHRy X3QgeGlwcm9tX3N6IF9faW5pdGRhdGE7Cj4+PiAtI2RlZmluZSB4aXByb21fc3ogICAgICAoKigo dWludHB0cl90ICopWElQX0ZJWFVQKCZ4aXByb21fc3opKSkKPj4+IC0jZGVmaW5lIHhpcHJvbSAg ICAgICAgICgqKCh1aW50cHRyX3QgKilYSVBfRklYVVAoJnhpcHJvbSkpKQo+Pj4KPj4+ICAgIHN0 YXRpYyB2b2lkIF9faW5pdCBjcmVhdGVfa2VybmVsX3BhZ2VfdGFibGUocGdkX3QgKnBnZGlyLCB1 aW50cHRyX3QgbWFwX3NpemUsCj4+PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgX19hbHdheXNfdW51c2VkIGJvb2wgZWFybHkpCj4+PiBAQCAtNTM4LDcgKzQ5MSw3 IEBAIHN0YXRpYyB2b2lkIF9faW5pdCBjcmVhdGVfa2VybmVsX3BhZ2VfdGFibGUocGdkX3QgKnBn ZGlyLCB1aW50cHRyX3QgbWFwX3NpemUsCj4+PiAgICAgICAgZW5kX3ZhID0ga2VybmVsX3ZpcnRf YWRkciArIFhJUF9PRkZTRVQgKyBsb2FkX3N6Owo+Pj4gICAgICAgIGZvciAodmEgPSBrZXJuZWxf dmlydF9hZGRyICsgWElQX09GRlNFVDsgdmEgPCBlbmRfdmE7IHZhICs9IG1hcF9zaXplKQo+Pj4g ICAgICAgICAgICAgICAgY3JlYXRlX3BnZF9tYXBwaW5nKHBnZGlyLCB2YSwKPj4+IC0gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfcGEgKyAodmEgLSAoa2VybmVsX3ZpcnRfYWRk ciArIFhJUF9PRkZTRVQpKSwKPj4+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxv YWRfcGEgKyAodmEgLSBrZXJuZWxfdmlydF9hZGRyKSwKPj4+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBtYXBfc2l6ZSwgUEFHRV9LRVJORUwpOwo+Pj4gICAgfQo+Pj4gICAgI2Vs c2UKPj4+IEBAIC02NDgsNyArNjAxLDcgQEAgYXNtbGlua2FnZSB2b2lkIF9faW5pdCBzZXR1cF92 bSh1aW50cHRyX3QgZHRiX3BhKQo+Pj4gICAgICAgICAqIHdoZXJlYXMgZHRiX2Vhcmx5X3ZhIHdp bGwgYmUgdXNlZCBiZWZvcmUgc2V0dXBfdm1fZmluYWwgaW5zdGFsbHMKPj4+ICAgICAgICAgKiB0 aGUgbGluZWFyIG1hcHBpbmcuCj4+PiAgICAgICAgICovCj4+PiAtICAgICBkdGJfZWFybHlfdmEg PSBrZXJuZWxfbWFwcGluZ19wYV90b192YShYSVBfRklYVVAoZHRiX3BhKSk7Cj4+PiArICAgICBk dGJfZWFybHlfdmEgPSBrZXJuZWxfbWFwcGluZ19wYV90b192YShkdGJfcGEpOwo+Pj4gICAgI2Vs c2UKPj4+ICAgICAgICBkdGJfZWFybHlfdmEgPSBfX3ZhKGR0Yl9wYSk7Cj4+PiAgICAjZW5kaWYg LyogQ09ORklHXzY0QklUICovCj4+PiBAQCAtNjY0LDcgKzYxNyw3IEBAIGFzbWxpbmthZ2Ugdm9p ZCBfX2luaXQgc2V0dXBfdm0odWludHB0cl90IGR0Yl9wYSkKPj4+ICAgICAgICBkdGJfZWFybHlf dmEgPSAodm9pZCAqKURUQl9FQVJMWV9CQVNFX1ZBICsgKGR0Yl9wYSAmIChQR0RJUl9TSVpFIC0g MSkpOwo+Pj4gICAgI2Vsc2UgLyogQ09ORklHX0JVSUxUSU5fRFRCICovCj4+PiAgICAjaWZkZWYg Q09ORklHXzY0QklUCj4+PiAtICAgICBkdGJfZWFybHlfdmEgPSBrZXJuZWxfbWFwcGluZ19wYV90 b192YShYSVBfRklYVVAoZHRiX3BhKSk7Cj4+PiArICAgICBkdGJfZWFybHlfdmEgPSBrZXJuZWxf bWFwcGluZ19wYV90b192YShkdGJfcGEpOwo+Pj4gICAgI2Vsc2UKPj4+ICAgICAgICBkdGJfZWFy bHlfdmEgPSBfX3ZhKGR0Yl9wYSk7Cj4+PiAgICAjZW5kaWYgLyogQ09ORklHXzY0QklUICovCj4+ Pgo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCj4g bGludXgtcmlzY3YgbWFpbGluZyBsaXN0Cj4gbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9y Zwo+IGh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlz Y3YKPiAKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxp bnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0 dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK