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.5 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 8894FC433E0 for ; Sat, 27 Jun 2020 06:43:39 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 60FDC20885 for ; Sat, 27 Jun 2020 06:43:39 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726079AbgF0Gn3 (ORCPT ); Sat, 27 Jun 2020 02:43:29 -0400 Received: from pegase1.c-s.fr ([93.17.236.30]:60521 "EHLO pegase1.c-s.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725861AbgF0Gn2 (ORCPT ); Sat, 27 Jun 2020 02:43:28 -0400 Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v41h3DNRz9txhn; Sat, 27 Jun 2020 08:42:32 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id mgMmTbUfWAEl; Sat, 27 Jun 2020 08:42:32 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 49v41h1Xskz9txhm; Sat, 27 Jun 2020 08:42:32 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 1F9BE8B772; Sat, 27 Jun 2020 08:42:33 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id VWAbaSaoVU_y; Sat, 27 Jun 2020 08:42:33 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id CA1FE8B75B; Sat, 27 Jun 2020 08:42:31 +0200 (CEST) Subject: Re: [PATCH 02/11] powerpc/kexec_file: mark PPC64 specific code To: Hari Bathini , Michael Ellerman , Andrew Morton Cc: Pingfan Liu , Kexec-ml , Petr Tesarik , Mahesh J Salgaonkar , Sourabh Jain , lkml , linuxppc-dev , Mimi Zohar , Vivek Goyal , Dave Young , Thiago Jung Bauermann , Eric Biederman References: <159319825403.16351.7253978047621755765.stgit@hbathini.in.ibm.com> <159319829236.16351.3935863082429593906.stgit@hbathini.in.ibm.com> From: Christophe Leroy Message-ID: <68d59c00-da02-b362-7bd9-a9631eca0fdd@csgroup.eu> Date: Sat, 27 Jun 2020 08:42:31 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <159319829236.16351.3935863082429593906.stgit@hbathini.in.ibm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Le 26/06/2020 à 21:04, Hari Bathini a écrit : > Some of the kexec_file_load code isn't PPC64 specific. Move PPC64 > specific code from kexec/file_load.c to kexec/file_load_64.c. Also, > rename purgatory/trampoline.S to purgatory/trampoline_64.S in the > same spirit. At the time being, CONFIG_KEXEC_FILE depends on PPC64. Are you planning to make it work on PPC32 as well ? Otherwise I don't understand the purpose of this patch. Also, what is being done in this patch seems to go far beyond what you describe above. It is propably worth splitting in several patches with proper explanation. Christophe > > Signed-off-by: Hari Bathini > --- > arch/powerpc/include/asm/kexec.h | 11 +++ > arch/powerpc/kexec/Makefile | 2 - > arch/powerpc/kexec/elf_64.c | 7 +- > arch/powerpc/kexec/file_load.c | 37 ++-------- > arch/powerpc/kexec/file_load_64.c | 108 ++++++++++++++++++++++++++++++ > arch/powerpc/purgatory/Makefile | 4 + > arch/powerpc/purgatory/trampoline.S | 117 -------------------------------- > arch/powerpc/purgatory/trampoline_64.S | 117 ++++++++++++++++++++++++++++++++ > 8 files changed, 248 insertions(+), 155 deletions(-) > create mode 100644 arch/powerpc/kexec/file_load_64.c > delete mode 100644 arch/powerpc/purgatory/trampoline.S > create mode 100644 arch/powerpc/purgatory/trampoline_64.S > > diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h > index c684768..7008ea1 100644 > --- a/arch/powerpc/include/asm/kexec.h > +++ b/arch/powerpc/include/asm/kexec.h > @@ -114,8 +114,17 @@ int setup_purgatory(struct kimage *image, const void *slave_code, > unsigned long fdt_load_addr); > int setup_new_fdt(const struct kimage *image, void *fdt, > unsigned long initrd_load_addr, unsigned long initrd_len, > - const char *cmdline); > + const char *cmdline, int *node); > int delete_fdt_mem_rsv(void *fdt, unsigned long start, unsigned long size); > + > +#ifdef CONFIG_PPC64 > +int setup_purgatory_ppc64(struct kimage *image, const void *slave_code, > + const void *fdt, unsigned long kernel_load_addr, > + unsigned long fdt_load_addr); > +int setup_new_fdt_ppc64(const struct kimage *image, void *fdt, > + unsigned long initrd_load_addr, > + unsigned long initrd_len, const char *cmdline); > +#endif /* CONFIG_PPC64 */ > #endif /* CONFIG_KEXEC_FILE */ > > #else /* !CONFIG_KEXEC_CORE */ > diff --git a/arch/powerpc/kexec/Makefile b/arch/powerpc/kexec/Makefile > index 86380c6..67c3553 100644 > --- a/arch/powerpc/kexec/Makefile > +++ b/arch/powerpc/kexec/Makefile > @@ -7,7 +7,7 @@ obj-y += core.o crash.o core_$(BITS).o > > obj-$(CONFIG_PPC32) += relocate_32.o > > -obj-$(CONFIG_KEXEC_FILE) += file_load.o elf_$(BITS).o > +obj-$(CONFIG_KEXEC_FILE) += file_load.o file_load_$(BITS).o elf_$(BITS).o > > ifdef CONFIG_HAVE_IMA_KEXEC > ifdef CONFIG_IMA > diff --git a/arch/powerpc/kexec/elf_64.c b/arch/powerpc/kexec/elf_64.c > index 3072fd6..23ad04c 100644 > --- a/arch/powerpc/kexec/elf_64.c > +++ b/arch/powerpc/kexec/elf_64.c > @@ -88,7 +88,8 @@ static void *elf64_load(struct kimage *image, char *kernel_buf, > goto out; > } > > - ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, cmdline); > + ret = setup_new_fdt_ppc64(image, fdt, initrd_load_addr, > + initrd_len, cmdline); > if (ret) > goto out; > > @@ -107,8 +108,8 @@ static void *elf64_load(struct kimage *image, char *kernel_buf, > pr_debug("Loaded device tree at 0x%lx\n", fdt_load_addr); > > slave_code = elf_info.buffer + elf_info.proghdrs[0].p_offset; > - ret = setup_purgatory(image, slave_code, fdt, kernel_load_addr, > - fdt_load_addr); > + ret = setup_purgatory_ppc64(image, slave_code, fdt, kernel_load_addr, > + fdt_load_addr); > if (ret) > pr_err("Error setting up the purgatory.\n"); > > diff --git a/arch/powerpc/kexec/file_load.c b/arch/powerpc/kexec/file_load.c > index 143c917..99a2c4d 100644 > --- a/arch/powerpc/kexec/file_load.c > +++ b/arch/powerpc/kexec/file_load.c > @@ -1,6 +1,6 @@ > // SPDX-License-Identifier: GPL-2.0-only > /* > - * ppc64 code to implement the kexec_file_load syscall > + * powerpc code to implement the kexec_file_load syscall > * > * Copyright (C) 2004 Adam Litke (agl@us.ibm.com) > * Copyright (C) 2004 IBM Corp. > @@ -16,26 +16,10 @@ > > #include > #include > -#include > #include > #include > > -#define SLAVE_CODE_SIZE 256 > - > -const struct kexec_file_ops * const kexec_file_loaders[] = { > - &kexec_elf64_ops, > - NULL > -}; > - > -int arch_kexec_kernel_image_probe(struct kimage *image, void *buf, > - unsigned long buf_len) > -{ > - /* We don't support crash kernels yet. */ > - if (image->type == KEXEC_TYPE_CRASH) > - return -EOPNOTSUPP; > - > - return kexec_image_probe_default(image, buf, buf_len); > -} > +#define SLAVE_CODE_SIZE 256 /* First 0x100 bytes */ > > /** > * setup_purgatory - initialize the purgatory's global variables > @@ -127,24 +111,17 @@ int delete_fdt_mem_rsv(void *fdt, unsigned long start, unsigned long size) > * @initrd_len: Size of the next initrd, or 0 if there will be none. > * @cmdline: Command line for the next kernel, or NULL if there will > * be none. > + * @chosen_node: Set this output parameter to chosen_node. > * > * Return: 0 on success, or negative errno on error. > */ > int setup_new_fdt(const struct kimage *image, void *fdt, > unsigned long initrd_load_addr, unsigned long initrd_len, > - const char *cmdline) > + const char *cmdline, int *node) > { > int ret, chosen_node; > const void *prop; > > - /* Remove memory reservation for the current device tree. */ > - ret = delete_fdt_mem_rsv(fdt, __pa(initial_boot_params), > - fdt_totalsize(initial_boot_params)); > - if (ret == 0) > - pr_debug("Removed old device tree reservation.\n"); > - else if (ret != -ENOENT) > - return ret; > - > chosen_node = fdt_path_offset(fdt, "/chosen"); > if (chosen_node == -FDT_ERR_NOTFOUND) { > chosen_node = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), > @@ -157,6 +134,8 @@ int setup_new_fdt(const struct kimage *image, void *fdt, > pr_err("Malformed device tree: error reading /chosen.\n"); > return -EINVAL; > } > + if (node) > + *node = chosen_node; > > /* Did we boot using an initrd? */ > prop = fdt_getprop(fdt, chosen_node, "linux,initrd-start", NULL); > @@ -242,10 +221,6 @@ int setup_new_fdt(const struct kimage *image, void *fdt, > return ret; > } > > - ret = fdt_setprop(fdt, chosen_node, "linux,booted-from-kexec", NULL, 0); > - if (ret) > - goto err; > - > return 0; > > err: > diff --git a/arch/powerpc/kexec/file_load_64.c b/arch/powerpc/kexec/file_load_64.c > new file mode 100644 > index 0000000..e6bff960 > --- /dev/null > +++ b/arch/powerpc/kexec/file_load_64.c > @@ -0,0 +1,108 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * ppc64 code to implement the kexec_file_load syscall > + * > + * Copyright (C) 2004 Adam Litke (agl@us.ibm.com) > + * Copyright (C) 2004 IBM Corp. > + * Copyright (C) 2004,2005 Milton D Miller II, IBM Corporation > + * Copyright (C) 2005 R Sharada (sharada@in.ibm.com) > + * Copyright (C) 2006 Mohan Kumar M (mohan@in.ibm.com) > + * Copyright (C) 2020 IBM Corporation > + * > + * Based on kexec-tools' kexec-ppc64.c, kexec-elf-rel-ppc64.c, fs2dt.c. > + * Heavily modified for the kernel by > + * Hari Bathini . > + */ > + > +#include > +#include > +#include > + > +const struct kexec_file_ops * const kexec_file_loaders[] = { > + &kexec_elf64_ops, > + NULL > +}; > + > +/** > + * setup_purgatory_ppc64 - initialize PPC64 specific purgatory's global > + * variables and call setup_purgatory() to initialize > + * common global variable. > + * @image: kexec image. > + * @slave_code: Slave code for the purgatory. > + * @fdt: Flattened device tree for the next kernel. > + * @kernel_load_addr: Address where the kernel is loaded. > + * @fdt_load_addr: Address where the flattened device tree is loaded. > + * > + * Returns 0 on success, negative errno on error. > + */ > +int setup_purgatory_ppc64(struct kimage *image, const void *slave_code, > + const void *fdt, unsigned long kernel_load_addr, > + unsigned long fdt_load_addr) > +{ > + int ret; > + > + ret = setup_purgatory(image, slave_code, fdt, kernel_load_addr, > + fdt_load_addr); > + if (ret) > + pr_err("Failed to setup purgatory symbols"); > + return ret; > +} > + > +/** > + * setup_new_fdt_ppc64 - Update the flattend device-tree of the kernel > + * being loaded. > + * @image: kexec image being loaded. > + * @fdt: Flattened device tree for the next kernel. > + * @initrd_load_addr: Address where the next initrd will be loaded. > + * @initrd_len: Size of the next initrd, or 0 if there will be none. > + * @cmdline: Command line for the next kernel, or NULL if there will > + * be none. > + * > + * Returns 0 on success, negative errno on error. > + */ > +int setup_new_fdt_ppc64(const struct kimage *image, void *fdt, > + unsigned long initrd_load_addr, > + unsigned long initrd_len, const char *cmdline) > +{ > + int chosen_node, ret; > + > + /* Remove memory reservation for the current device tree. */ > + ret = delete_fdt_mem_rsv(fdt, __pa(initial_boot_params), > + fdt_totalsize(initial_boot_params)); > + if (ret == 0) > + pr_debug("Removed old device tree reservation.\n"); > + else if (ret != -ENOENT) { > + pr_err("Failed to remove old device-tree reservation.\n"); > + return ret; > + } > + > + ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, > + cmdline, &chosen_node); > + if (ret) > + return ret; > + > + ret = fdt_setprop(fdt, chosen_node, "linux,booted-from-kexec", NULL, 0); > + if (ret) > + pr_err("Failed to update device-tree with linux,booted-from-kexec\n"); > + > + return ret; > +} > + > +/** > + * arch_kexec_kernel_image_probe - Does additional handling needed to setup > + * kexec segments. > + * @image: kexec image being loaded. > + * @buf: Buffer pointing to elf data. > + * @buf_len: Length of the buffer. > + * > + * Returns 0 on success, negative errno on error. > + */ > +int arch_kexec_kernel_image_probe(struct kimage *image, void *buf, > + unsigned long buf_len) > +{ > + /* We don't support crash kernels yet. */ > + if (image->type == KEXEC_TYPE_CRASH) > + return -EOPNOTSUPP; > + > + return kexec_image_probe_default(image, buf, buf_len); > +} > diff --git a/arch/powerpc/purgatory/Makefile b/arch/powerpc/purgatory/Makefile > index 7c6d8b1..348f5958 100644 > --- a/arch/powerpc/purgatory/Makefile > +++ b/arch/powerpc/purgatory/Makefile > @@ -2,11 +2,11 @@ > > KASAN_SANITIZE := n > > -targets += trampoline.o purgatory.ro kexec-purgatory.c > +targets += trampoline_$(BITS).o purgatory.ro kexec-purgatory.c > > LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined > > -$(obj)/purgatory.ro: $(obj)/trampoline.o FORCE > +$(obj)/purgatory.ro: $(obj)/trampoline_$(BITS).o FORCE > $(call if_changed,ld) > > quiet_cmd_bin2c = BIN2C $@ > diff --git a/arch/powerpc/purgatory/trampoline.S b/arch/powerpc/purgatory/trampoline.S > deleted file mode 100644 > index a5a83c3..0000000 > --- a/arch/powerpc/purgatory/trampoline.S > +++ /dev/null > @@ -1,117 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-only */ > -/* > - * kexec trampoline > - * > - * Based on code taken from kexec-tools and kexec-lite. > - * > - * Copyright (C) 2004 - 2005, Milton D Miller II, IBM Corporation > - * Copyright (C) 2006, Mohan Kumar M, IBM Corporation > - * Copyright (C) 2013, Anton Blanchard, IBM Corporation > - */ > - > -#include > - > - .machine ppc64 > - .balign 256 > - .globl purgatory_start > -purgatory_start: > - b master > - > - /* ABI: possible run_at_load flag at 0x5c */ > - .org purgatory_start + 0x5c > - .globl run_at_load > -run_at_load: > - .long 0 > - .size run_at_load, . - run_at_load > - > - /* ABI: slaves start at 60 with r3=phys */ > - .org purgatory_start + 0x60 > -slave: > - b . > - /* ABI: end of copied region */ > - .org purgatory_start + 0x100 > - .size purgatory_start, . - purgatory_start > - > -/* > - * The above 0x100 bytes at purgatory_start are replaced with the > - * code from the kernel (or next stage) by setup_purgatory(). > - */ > - > -master: > - or %r1,%r1,%r1 /* low priority to let other threads catchup */ > - isync > - mr %r17,%r3 /* save cpu id to r17 */ > - mr %r15,%r4 /* save physical address in reg15 */ > - > - or %r3,%r3,%r3 /* ok now to high priority, lets boot */ > - lis %r6,0x1 > - mtctr %r6 /* delay a bit for slaves to catch up */ > - bdnz . /* before we overwrite 0-100 again */ > - > - bl 0f /* Work out where we're running */ > -0: mflr %r18 > - > - /* load device-tree address */ > - ld %r3, (dt_offset - 0b)(%r18) > - mr %r16,%r3 /* save dt address in reg16 */ > - li %r4,20 > - LWZX_BE %r6,%r3,%r4 /* fetch __be32 version number at byte 20 */ > - cmpwi %cr0,%r6,2 /* v2 or later? */ > - blt 1f > - li %r4,28 > - STWX_BE %r17,%r3,%r4 /* Store my cpu as __be32 at byte 28 */ > -1: > - /* load the kernel address */ > - ld %r4,(kernel - 0b)(%r18) > - > - /* load the run_at_load flag */ > - /* possibly patched by kexec */ > - ld %r6,(run_at_load - 0b)(%r18) > - /* and patch it into the kernel */ > - stw %r6,(0x5c)(%r4) > - > - mr %r3,%r16 /* restore dt address */ > - > - li %r5,0 /* r5 will be 0 for kernel */ > - > - mfmsr %r11 > - andi. %r10,%r11,1 /* test MSR_LE */ > - bne .Little_endian > - > - mtctr %r4 /* prepare branch to */ > - bctr /* start kernel */ > - > -.Little_endian: > - mtsrr0 %r4 /* prepare branch to */ > - > - clrrdi %r11,%r11,1 /* clear MSR_LE */ > - mtsrr1 %r11 > - > - rfid /* update MSR and start kernel */ > - > - > - .balign 8 > - .globl kernel > -kernel: > - .8byte 0x0 > - .size kernel, . - kernel > - > - .balign 8 > - .globl dt_offset > -dt_offset: > - .8byte 0x0 > - .size dt_offset, . - dt_offset > - > - > - .data > - .balign 8 > -.globl purgatory_sha256_digest > -purgatory_sha256_digest: > - .skip 32 > - .size purgatory_sha256_digest, . - purgatory_sha256_digest > - > - .balign 8 > -.globl purgatory_sha_regions > -purgatory_sha_regions: > - .skip 8 * 2 * 16 > - .size purgatory_sha_regions, . - purgatory_sha_regions > diff --git a/arch/powerpc/purgatory/trampoline_64.S b/arch/powerpc/purgatory/trampoline_64.S > new file mode 100644 > index 0000000..a5a83c3 > --- /dev/null > +++ b/arch/powerpc/purgatory/trampoline_64.S > @@ -0,0 +1,117 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * kexec trampoline > + * > + * Based on code taken from kexec-tools and kexec-lite. > + * > + * Copyright (C) 2004 - 2005, Milton D Miller II, IBM Corporation > + * Copyright (C) 2006, Mohan Kumar M, IBM Corporation > + * Copyright (C) 2013, Anton Blanchard, IBM Corporation > + */ > + > +#include > + > + .machine ppc64 > + .balign 256 > + .globl purgatory_start > +purgatory_start: > + b master > + > + /* ABI: possible run_at_load flag at 0x5c */ > + .org purgatory_start + 0x5c > + .globl run_at_load > +run_at_load: > + .long 0 > + .size run_at_load, . - run_at_load > + > + /* ABI: slaves start at 60 with r3=phys */ > + .org purgatory_start + 0x60 > +slave: > + b . > + /* ABI: end of copied region */ > + .org purgatory_start + 0x100 > + .size purgatory_start, . - purgatory_start > + > +/* > + * The above 0x100 bytes at purgatory_start are replaced with the > + * code from the kernel (or next stage) by setup_purgatory(). > + */ > + > +master: > + or %r1,%r1,%r1 /* low priority to let other threads catchup */ > + isync > + mr %r17,%r3 /* save cpu id to r17 */ > + mr %r15,%r4 /* save physical address in reg15 */ > + > + or %r3,%r3,%r3 /* ok now to high priority, lets boot */ > + lis %r6,0x1 > + mtctr %r6 /* delay a bit for slaves to catch up */ > + bdnz . /* before we overwrite 0-100 again */ > + > + bl 0f /* Work out where we're running */ > +0: mflr %r18 > + > + /* load device-tree address */ > + ld %r3, (dt_offset - 0b)(%r18) > + mr %r16,%r3 /* save dt address in reg16 */ > + li %r4,20 > + LWZX_BE %r6,%r3,%r4 /* fetch __be32 version number at byte 20 */ > + cmpwi %cr0,%r6,2 /* v2 or later? */ > + blt 1f > + li %r4,28 > + STWX_BE %r17,%r3,%r4 /* Store my cpu as __be32 at byte 28 */ > +1: > + /* load the kernel address */ > + ld %r4,(kernel - 0b)(%r18) > + > + /* load the run_at_load flag */ > + /* possibly patched by kexec */ > + ld %r6,(run_at_load - 0b)(%r18) > + /* and patch it into the kernel */ > + stw %r6,(0x5c)(%r4) > + > + mr %r3,%r16 /* restore dt address */ > + > + li %r5,0 /* r5 will be 0 for kernel */ > + > + mfmsr %r11 > + andi. %r10,%r11,1 /* test MSR_LE */ > + bne .Little_endian > + > + mtctr %r4 /* prepare branch to */ > + bctr /* start kernel */ > + > +.Little_endian: > + mtsrr0 %r4 /* prepare branch to */ > + > + clrrdi %r11,%r11,1 /* clear MSR_LE */ > + mtsrr1 %r11 > + > + rfid /* update MSR and start kernel */ > + > + > + .balign 8 > + .globl kernel > +kernel: > + .8byte 0x0 > + .size kernel, . - kernel > + > + .balign 8 > + .globl dt_offset > +dt_offset: > + .8byte 0x0 > + .size dt_offset, . - dt_offset > + > + > + .data > + .balign 8 > +.globl purgatory_sha256_digest > +purgatory_sha256_digest: > + .skip 32 > + .size purgatory_sha256_digest, . - purgatory_sha256_digest > + > + .balign 8 > +.globl purgatory_sha_regions > +purgatory_sha_regions: > + .skip 8 * 2 * 16 > + .size purgatory_sha_regions, . - purgatory_sha_regions > 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.5 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=unavailable 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 59022C433E0 for ; Sat, 27 Jun 2020 06:44:23 +0000 (UTC) Received: from lists.ozlabs.org (lists.ozlabs.org [203.11.71.2]) (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 D6A6F207FC for ; Sat, 27 Jun 2020 06:44:22 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org D6A6F207FC Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=csgroup.eu Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Received: from bilbo.ozlabs.org (lists.ozlabs.org [IPv6:2401:3900:2:1::3]) by lists.ozlabs.org (Postfix) with ESMTP id 49v43m0ZymzDr0p for ; Sat, 27 Jun 2020 16:44:20 +1000 (AEST) Received: from ozlabs.org (bilbo.ozlabs.org [203.11.71.1]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 49v41r3nNRzDqyb for ; Sat, 27 Jun 2020 16:42:40 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dmarc=none (p=none dis=none) header.from=csgroup.eu Received: from ozlabs.org (bilbo.ozlabs.org [IPv6:2401:3900:2:1::2]) by bilbo.ozlabs.org (Postfix) with ESMTP id 49v41r2sxQz8t64 for ; Sat, 27 Jun 2020 16:42:40 +1000 (AEST) Received: by ozlabs.org (Postfix) id 49v41r2Nr4z9sSS; Sat, 27 Jun 2020 16:42:40 +1000 (AEST) Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=csgroup.eu (client-ip=93.17.236.30; helo=pegase1.c-s.fr; envelope-from=christophe.leroy@csgroup.eu; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=csgroup.eu Received: from pegase1.c-s.fr (pegase1.c-s.fr [93.17.236.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 49v41q3xtrz9sSF for ; Sat, 27 Jun 2020 16:42:36 +1000 (AEST) Received: from localhost (mailhub1-int [192.168.12.234]) by localhost (Postfix) with ESMTP id 49v41h3DNRz9txhn; Sat, 27 Jun 2020 08:42:32 +0200 (CEST) X-Virus-Scanned: Debian amavisd-new at c-s.fr Received: from pegase1.c-s.fr ([192.168.12.234]) by localhost (pegase1.c-s.fr [192.168.12.234]) (amavisd-new, port 10024) with ESMTP id mgMmTbUfWAEl; Sat, 27 Jun 2020 08:42:32 +0200 (CEST) Received: from messagerie.si.c-s.fr (messagerie.si.c-s.fr [192.168.25.192]) by pegase1.c-s.fr (Postfix) with ESMTP id 49v41h1Xskz9txhm; Sat, 27 Jun 2020 08:42:32 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by messagerie.si.c-s.fr (Postfix) with ESMTP id 1F9BE8B772; Sat, 27 Jun 2020 08:42:33 +0200 (CEST) X-Virus-Scanned: amavisd-new at c-s.fr Received: from messagerie.si.c-s.fr ([127.0.0.1]) by localhost (messagerie.si.c-s.fr [127.0.0.1]) (amavisd-new, port 10023) with ESMTP id VWAbaSaoVU_y; Sat, 27 Jun 2020 08:42:33 +0200 (CEST) Received: from [192.168.4.90] (unknown [192.168.4.90]) by messagerie.si.c-s.fr (Postfix) with ESMTP id CA1FE8B75B; Sat, 27 Jun 2020 08:42:31 +0200 (CEST) Subject: Re: [PATCH 02/11] powerpc/kexec_file: mark PPC64 specific code To: Hari Bathini , Michael Ellerman , Andrew Morton References: <159319825403.16351.7253978047621755765.stgit@hbathini.in.ibm.com> <159319829236.16351.3935863082429593906.stgit@hbathini.in.ibm.com> From: Christophe Leroy Message-ID: <68d59c00-da02-b362-7bd9-a9631eca0fdd@csgroup.eu> Date: Sat, 27 Jun 2020 08:42:31 +0200 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:68.0) Gecko/20100101 Thunderbird/68.9.0 MIME-Version: 1.0 In-Reply-To: <159319829236.16351.3935863082429593906.stgit@hbathini.in.ibm.com> Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: fr Content-Transfer-Encoding: 8bit X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Pingfan Liu , Kexec-ml , Petr Tesarik , Mahesh J Salgaonkar , Sourabh Jain , lkml , linuxppc-dev , Mimi Zohar , Thiago Jung Bauermann , Dave Young , Vivek Goyal , Eric Biederman Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" Le 26/06/2020 à 21:04, Hari Bathini a écrit : > Some of the kexec_file_load code isn't PPC64 specific. Move PPC64 > specific code from kexec/file_load.c to kexec/file_load_64.c. Also, > rename purgatory/trampoline.S to purgatory/trampoline_64.S in the > same spirit. At the time being, CONFIG_KEXEC_FILE depends on PPC64. Are you planning to make it work on PPC32 as well ? Otherwise I don't understand the purpose of this patch. Also, what is being done in this patch seems to go far beyond what you describe above. It is propably worth splitting in several patches with proper explanation. Christophe > > Signed-off-by: Hari Bathini > --- > arch/powerpc/include/asm/kexec.h | 11 +++ > arch/powerpc/kexec/Makefile | 2 - > arch/powerpc/kexec/elf_64.c | 7 +- > arch/powerpc/kexec/file_load.c | 37 ++-------- > arch/powerpc/kexec/file_load_64.c | 108 ++++++++++++++++++++++++++++++ > arch/powerpc/purgatory/Makefile | 4 + > arch/powerpc/purgatory/trampoline.S | 117 -------------------------------- > arch/powerpc/purgatory/trampoline_64.S | 117 ++++++++++++++++++++++++++++++++ > 8 files changed, 248 insertions(+), 155 deletions(-) > create mode 100644 arch/powerpc/kexec/file_load_64.c > delete mode 100644 arch/powerpc/purgatory/trampoline.S > create mode 100644 arch/powerpc/purgatory/trampoline_64.S > > diff --git a/arch/powerpc/include/asm/kexec.h b/arch/powerpc/include/asm/kexec.h > index c684768..7008ea1 100644 > --- a/arch/powerpc/include/asm/kexec.h > +++ b/arch/powerpc/include/asm/kexec.h > @@ -114,8 +114,17 @@ int setup_purgatory(struct kimage *image, const void *slave_code, > unsigned long fdt_load_addr); > int setup_new_fdt(const struct kimage *image, void *fdt, > unsigned long initrd_load_addr, unsigned long initrd_len, > - const char *cmdline); > + const char *cmdline, int *node); > int delete_fdt_mem_rsv(void *fdt, unsigned long start, unsigned long size); > + > +#ifdef CONFIG_PPC64 > +int setup_purgatory_ppc64(struct kimage *image, const void *slave_code, > + const void *fdt, unsigned long kernel_load_addr, > + unsigned long fdt_load_addr); > +int setup_new_fdt_ppc64(const struct kimage *image, void *fdt, > + unsigned long initrd_load_addr, > + unsigned long initrd_len, const char *cmdline); > +#endif /* CONFIG_PPC64 */ > #endif /* CONFIG_KEXEC_FILE */ > > #else /* !CONFIG_KEXEC_CORE */ > diff --git a/arch/powerpc/kexec/Makefile b/arch/powerpc/kexec/Makefile > index 86380c6..67c3553 100644 > --- a/arch/powerpc/kexec/Makefile > +++ b/arch/powerpc/kexec/Makefile > @@ -7,7 +7,7 @@ obj-y += core.o crash.o core_$(BITS).o > > obj-$(CONFIG_PPC32) += relocate_32.o > > -obj-$(CONFIG_KEXEC_FILE) += file_load.o elf_$(BITS).o > +obj-$(CONFIG_KEXEC_FILE) += file_load.o file_load_$(BITS).o elf_$(BITS).o > > ifdef CONFIG_HAVE_IMA_KEXEC > ifdef CONFIG_IMA > diff --git a/arch/powerpc/kexec/elf_64.c b/arch/powerpc/kexec/elf_64.c > index 3072fd6..23ad04c 100644 > --- a/arch/powerpc/kexec/elf_64.c > +++ b/arch/powerpc/kexec/elf_64.c > @@ -88,7 +88,8 @@ static void *elf64_load(struct kimage *image, char *kernel_buf, > goto out; > } > > - ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, cmdline); > + ret = setup_new_fdt_ppc64(image, fdt, initrd_load_addr, > + initrd_len, cmdline); > if (ret) > goto out; > > @@ -107,8 +108,8 @@ static void *elf64_load(struct kimage *image, char *kernel_buf, > pr_debug("Loaded device tree at 0x%lx\n", fdt_load_addr); > > slave_code = elf_info.buffer + elf_info.proghdrs[0].p_offset; > - ret = setup_purgatory(image, slave_code, fdt, kernel_load_addr, > - fdt_load_addr); > + ret = setup_purgatory_ppc64(image, slave_code, fdt, kernel_load_addr, > + fdt_load_addr); > if (ret) > pr_err("Error setting up the purgatory.\n"); > > diff --git a/arch/powerpc/kexec/file_load.c b/arch/powerpc/kexec/file_load.c > index 143c917..99a2c4d 100644 > --- a/arch/powerpc/kexec/file_load.c > +++ b/arch/powerpc/kexec/file_load.c > @@ -1,6 +1,6 @@ > // SPDX-License-Identifier: GPL-2.0-only > /* > - * ppc64 code to implement the kexec_file_load syscall > + * powerpc code to implement the kexec_file_load syscall > * > * Copyright (C) 2004 Adam Litke (agl@us.ibm.com) > * Copyright (C) 2004 IBM Corp. > @@ -16,26 +16,10 @@ > > #include > #include > -#include > #include > #include > > -#define SLAVE_CODE_SIZE 256 > - > -const struct kexec_file_ops * const kexec_file_loaders[] = { > - &kexec_elf64_ops, > - NULL > -}; > - > -int arch_kexec_kernel_image_probe(struct kimage *image, void *buf, > - unsigned long buf_len) > -{ > - /* We don't support crash kernels yet. */ > - if (image->type == KEXEC_TYPE_CRASH) > - return -EOPNOTSUPP; > - > - return kexec_image_probe_default(image, buf, buf_len); > -} > +#define SLAVE_CODE_SIZE 256 /* First 0x100 bytes */ > > /** > * setup_purgatory - initialize the purgatory's global variables > @@ -127,24 +111,17 @@ int delete_fdt_mem_rsv(void *fdt, unsigned long start, unsigned long size) > * @initrd_len: Size of the next initrd, or 0 if there will be none. > * @cmdline: Command line for the next kernel, or NULL if there will > * be none. > + * @chosen_node: Set this output parameter to chosen_node. > * > * Return: 0 on success, or negative errno on error. > */ > int setup_new_fdt(const struct kimage *image, void *fdt, > unsigned long initrd_load_addr, unsigned long initrd_len, > - const char *cmdline) > + const char *cmdline, int *node) > { > int ret, chosen_node; > const void *prop; > > - /* Remove memory reservation for the current device tree. */ > - ret = delete_fdt_mem_rsv(fdt, __pa(initial_boot_params), > - fdt_totalsize(initial_boot_params)); > - if (ret == 0) > - pr_debug("Removed old device tree reservation.\n"); > - else if (ret != -ENOENT) > - return ret; > - > chosen_node = fdt_path_offset(fdt, "/chosen"); > if (chosen_node == -FDT_ERR_NOTFOUND) { > chosen_node = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), > @@ -157,6 +134,8 @@ int setup_new_fdt(const struct kimage *image, void *fdt, > pr_err("Malformed device tree: error reading /chosen.\n"); > return -EINVAL; > } > + if (node) > + *node = chosen_node; > > /* Did we boot using an initrd? */ > prop = fdt_getprop(fdt, chosen_node, "linux,initrd-start", NULL); > @@ -242,10 +221,6 @@ int setup_new_fdt(const struct kimage *image, void *fdt, > return ret; > } > > - ret = fdt_setprop(fdt, chosen_node, "linux,booted-from-kexec", NULL, 0); > - if (ret) > - goto err; > - > return 0; > > err: > diff --git a/arch/powerpc/kexec/file_load_64.c b/arch/powerpc/kexec/file_load_64.c > new file mode 100644 > index 0000000..e6bff960 > --- /dev/null > +++ b/arch/powerpc/kexec/file_load_64.c > @@ -0,0 +1,108 @@ > +// SPDX-License-Identifier: GPL-2.0-only > +/* > + * ppc64 code to implement the kexec_file_load syscall > + * > + * Copyright (C) 2004 Adam Litke (agl@us.ibm.com) > + * Copyright (C) 2004 IBM Corp. > + * Copyright (C) 2004,2005 Milton D Miller II, IBM Corporation > + * Copyright (C) 2005 R Sharada (sharada@in.ibm.com) > + * Copyright (C) 2006 Mohan Kumar M (mohan@in.ibm.com) > + * Copyright (C) 2020 IBM Corporation > + * > + * Based on kexec-tools' kexec-ppc64.c, kexec-elf-rel-ppc64.c, fs2dt.c. > + * Heavily modified for the kernel by > + * Hari Bathini . > + */ > + > +#include > +#include > +#include > + > +const struct kexec_file_ops * const kexec_file_loaders[] = { > + &kexec_elf64_ops, > + NULL > +}; > + > +/** > + * setup_purgatory_ppc64 - initialize PPC64 specific purgatory's global > + * variables and call setup_purgatory() to initialize > + * common global variable. > + * @image: kexec image. > + * @slave_code: Slave code for the purgatory. > + * @fdt: Flattened device tree for the next kernel. > + * @kernel_load_addr: Address where the kernel is loaded. > + * @fdt_load_addr: Address where the flattened device tree is loaded. > + * > + * Returns 0 on success, negative errno on error. > + */ > +int setup_purgatory_ppc64(struct kimage *image, const void *slave_code, > + const void *fdt, unsigned long kernel_load_addr, > + unsigned long fdt_load_addr) > +{ > + int ret; > + > + ret = setup_purgatory(image, slave_code, fdt, kernel_load_addr, > + fdt_load_addr); > + if (ret) > + pr_err("Failed to setup purgatory symbols"); > + return ret; > +} > + > +/** > + * setup_new_fdt_ppc64 - Update the flattend device-tree of the kernel > + * being loaded. > + * @image: kexec image being loaded. > + * @fdt: Flattened device tree for the next kernel. > + * @initrd_load_addr: Address where the next initrd will be loaded. > + * @initrd_len: Size of the next initrd, or 0 if there will be none. > + * @cmdline: Command line for the next kernel, or NULL if there will > + * be none. > + * > + * Returns 0 on success, negative errno on error. > + */ > +int setup_new_fdt_ppc64(const struct kimage *image, void *fdt, > + unsigned long initrd_load_addr, > + unsigned long initrd_len, const char *cmdline) > +{ > + int chosen_node, ret; > + > + /* Remove memory reservation for the current device tree. */ > + ret = delete_fdt_mem_rsv(fdt, __pa(initial_boot_params), > + fdt_totalsize(initial_boot_params)); > + if (ret == 0) > + pr_debug("Removed old device tree reservation.\n"); > + else if (ret != -ENOENT) { > + pr_err("Failed to remove old device-tree reservation.\n"); > + return ret; > + } > + > + ret = setup_new_fdt(image, fdt, initrd_load_addr, initrd_len, > + cmdline, &chosen_node); > + if (ret) > + return ret; > + > + ret = fdt_setprop(fdt, chosen_node, "linux,booted-from-kexec", NULL, 0); > + if (ret) > + pr_err("Failed to update device-tree with linux,booted-from-kexec\n"); > + > + return ret; > +} > + > +/** > + * arch_kexec_kernel_image_probe - Does additional handling needed to setup > + * kexec segments. > + * @image: kexec image being loaded. > + * @buf: Buffer pointing to elf data. > + * @buf_len: Length of the buffer. > + * > + * Returns 0 on success, negative errno on error. > + */ > +int arch_kexec_kernel_image_probe(struct kimage *image, void *buf, > + unsigned long buf_len) > +{ > + /* We don't support crash kernels yet. */ > + if (image->type == KEXEC_TYPE_CRASH) > + return -EOPNOTSUPP; > + > + return kexec_image_probe_default(image, buf, buf_len); > +} > diff --git a/arch/powerpc/purgatory/Makefile b/arch/powerpc/purgatory/Makefile > index 7c6d8b1..348f5958 100644 > --- a/arch/powerpc/purgatory/Makefile > +++ b/arch/powerpc/purgatory/Makefile > @@ -2,11 +2,11 @@ > > KASAN_SANITIZE := n > > -targets += trampoline.o purgatory.ro kexec-purgatory.c > +targets += trampoline_$(BITS).o purgatory.ro kexec-purgatory.c > > LDFLAGS_purgatory.ro := -e purgatory_start -r --no-undefined > > -$(obj)/purgatory.ro: $(obj)/trampoline.o FORCE > +$(obj)/purgatory.ro: $(obj)/trampoline_$(BITS).o FORCE > $(call if_changed,ld) > > quiet_cmd_bin2c = BIN2C $@ > diff --git a/arch/powerpc/purgatory/trampoline.S b/arch/powerpc/purgatory/trampoline.S > deleted file mode 100644 > index a5a83c3..0000000 > --- a/arch/powerpc/purgatory/trampoline.S > +++ /dev/null > @@ -1,117 +0,0 @@ > -/* SPDX-License-Identifier: GPL-2.0-only */ > -/* > - * kexec trampoline > - * > - * Based on code taken from kexec-tools and kexec-lite. > - * > - * Copyright (C) 2004 - 2005, Milton D Miller II, IBM Corporation > - * Copyright (C) 2006, Mohan Kumar M, IBM Corporation > - * Copyright (C) 2013, Anton Blanchard, IBM Corporation > - */ > - > -#include > - > - .machine ppc64 > - .balign 256 > - .globl purgatory_start > -purgatory_start: > - b master > - > - /* ABI: possible run_at_load flag at 0x5c */ > - .org purgatory_start + 0x5c > - .globl run_at_load > -run_at_load: > - .long 0 > - .size run_at_load, . - run_at_load > - > - /* ABI: slaves start at 60 with r3=phys */ > - .org purgatory_start + 0x60 > -slave: > - b . > - /* ABI: end of copied region */ > - .org purgatory_start + 0x100 > - .size purgatory_start, . - purgatory_start > - > -/* > - * The above 0x100 bytes at purgatory_start are replaced with the > - * code from the kernel (or next stage) by setup_purgatory(). > - */ > - > -master: > - or %r1,%r1,%r1 /* low priority to let other threads catchup */ > - isync > - mr %r17,%r3 /* save cpu id to r17 */ > - mr %r15,%r4 /* save physical address in reg15 */ > - > - or %r3,%r3,%r3 /* ok now to high priority, lets boot */ > - lis %r6,0x1 > - mtctr %r6 /* delay a bit for slaves to catch up */ > - bdnz . /* before we overwrite 0-100 again */ > - > - bl 0f /* Work out where we're running */ > -0: mflr %r18 > - > - /* load device-tree address */ > - ld %r3, (dt_offset - 0b)(%r18) > - mr %r16,%r3 /* save dt address in reg16 */ > - li %r4,20 > - LWZX_BE %r6,%r3,%r4 /* fetch __be32 version number at byte 20 */ > - cmpwi %cr0,%r6,2 /* v2 or later? */ > - blt 1f > - li %r4,28 > - STWX_BE %r17,%r3,%r4 /* Store my cpu as __be32 at byte 28 */ > -1: > - /* load the kernel address */ > - ld %r4,(kernel - 0b)(%r18) > - > - /* load the run_at_load flag */ > - /* possibly patched by kexec */ > - ld %r6,(run_at_load - 0b)(%r18) > - /* and patch it into the kernel */ > - stw %r6,(0x5c)(%r4) > - > - mr %r3,%r16 /* restore dt address */ > - > - li %r5,0 /* r5 will be 0 for kernel */ > - > - mfmsr %r11 > - andi. %r10,%r11,1 /* test MSR_LE */ > - bne .Little_endian > - > - mtctr %r4 /* prepare branch to */ > - bctr /* start kernel */ > - > -.Little_endian: > - mtsrr0 %r4 /* prepare branch to */ > - > - clrrdi %r11,%r11,1 /* clear MSR_LE */ > - mtsrr1 %r11 > - > - rfid /* update MSR and start kernel */ > - > - > - .balign 8 > - .globl kernel > -kernel: > - .8byte 0x0 > - .size kernel, . - kernel > - > - .balign 8 > - .globl dt_offset > -dt_offset: > - .8byte 0x0 > - .size dt_offset, . - dt_offset > - > - > - .data > - .balign 8 > -.globl purgatory_sha256_digest > -purgatory_sha256_digest: > - .skip 32 > - .size purgatory_sha256_digest, . - purgatory_sha256_digest > - > - .balign 8 > -.globl purgatory_sha_regions > -purgatory_sha_regions: > - .skip 8 * 2 * 16 > - .size purgatory_sha_regions, . - purgatory_sha_regions > diff --git a/arch/powerpc/purgatory/trampoline_64.S b/arch/powerpc/purgatory/trampoline_64.S > new file mode 100644 > index 0000000..a5a83c3 > --- /dev/null > +++ b/arch/powerpc/purgatory/trampoline_64.S > @@ -0,0 +1,117 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * kexec trampoline > + * > + * Based on code taken from kexec-tools and kexec-lite. > + * > + * Copyright (C) 2004 - 2005, Milton D Miller II, IBM Corporation > + * Copyright (C) 2006, Mohan Kumar M, IBM Corporation > + * Copyright (C) 2013, Anton Blanchard, IBM Corporation > + */ > + > +#include > + > + .machine ppc64 > + .balign 256 > + .globl purgatory_start > +purgatory_start: > + b master > + > + /* ABI: possible run_at_load flag at 0x5c */ > + .org purgatory_start + 0x5c > + .globl run_at_load > +run_at_load: > + .long 0 > + .size run_at_load, . - run_at_load > + > + /* ABI: slaves start at 60 with r3=phys */ > + .org purgatory_start + 0x60 > +slave: > + b . > + /* ABI: end of copied region */ > + .org purgatory_start + 0x100 > + .size purgatory_start, . - purgatory_start > + > +/* > + * The above 0x100 bytes at purgatory_start are replaced with the > + * code from the kernel (or next stage) by setup_purgatory(). > + */ > + > +master: > + or %r1,%r1,%r1 /* low priority to let other threads catchup */ > + isync > + mr %r17,%r3 /* save cpu id to r17 */ > + mr %r15,%r4 /* save physical address in reg15 */ > + > + or %r3,%r3,%r3 /* ok now to high priority, lets boot */ > + lis %r6,0x1 > + mtctr %r6 /* delay a bit for slaves to catch up */ > + bdnz . /* before we overwrite 0-100 again */ > + > + bl 0f /* Work out where we're running */ > +0: mflr %r18 > + > + /* load device-tree address */ > + ld %r3, (dt_offset - 0b)(%r18) > + mr %r16,%r3 /* save dt address in reg16 */ > + li %r4,20 > + LWZX_BE %r6,%r3,%r4 /* fetch __be32 version number at byte 20 */ > + cmpwi %cr0,%r6,2 /* v2 or later? */ > + blt 1f > + li %r4,28 > + STWX_BE %r17,%r3,%r4 /* Store my cpu as __be32 at byte 28 */ > +1: > + /* load the kernel address */ > + ld %r4,(kernel - 0b)(%r18) > + > + /* load the run_at_load flag */ > + /* possibly patched by kexec */ > + ld %r6,(run_at_load - 0b)(%r18) > + /* and patch it into the kernel */ > + stw %r6,(0x5c)(%r4) > + > + mr %r3,%r16 /* restore dt address */ > + > + li %r5,0 /* r5 will be 0 for kernel */ > + > + mfmsr %r11 > + andi. %r10,%r11,1 /* test MSR_LE */ > + bne .Little_endian > + > + mtctr %r4 /* prepare branch to */ > + bctr /* start kernel */ > + > +.Little_endian: > + mtsrr0 %r4 /* prepare branch to */ > + > + clrrdi %r11,%r11,1 /* clear MSR_LE */ > + mtsrr1 %r11 > + > + rfid /* update MSR and start kernel */ > + > + > + .balign 8 > + .globl kernel > +kernel: > + .8byte 0x0 > + .size kernel, . - kernel > + > + .balign 8 > + .globl dt_offset > +dt_offset: > + .8byte 0x0 > + .size dt_offset, . - dt_offset > + > + > + .data > + .balign 8 > +.globl purgatory_sha256_digest > +purgatory_sha256_digest: > + .skip 32 > + .size purgatory_sha256_digest, . - purgatory_sha256_digest > + > + .balign 8 > +.globl purgatory_sha_regions > +purgatory_sha_regions: > + .skip 8 * 2 * 16 > + .size purgatory_sha_regions, . - purgatory_sha_regions > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from pegase1.c-s.fr ([93.17.236.30]) by merlin.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jp4Xw-0004xi-FN for kexec@lists.infradead.org; Sat, 27 Jun 2020 06:42:42 +0000 Subject: Re: [PATCH 02/11] powerpc/kexec_file: mark PPC64 specific code References: <159319825403.16351.7253978047621755765.stgit@hbathini.in.ibm.com> <159319829236.16351.3935863082429593906.stgit@hbathini.in.ibm.com> From: Christophe Leroy Message-ID: <68d59c00-da02-b362-7bd9-a9631eca0fdd@csgroup.eu> Date: Sat, 27 Jun 2020 08:42:31 +0200 MIME-Version: 1.0 In-Reply-To: <159319829236.16351.3935863082429593906.stgit@hbathini.in.ibm.com> Content-Language: fr 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: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: Hari Bathini , Michael Ellerman , Andrew Morton Cc: Pingfan Liu , Kexec-ml , Petr Tesarik , Mahesh J Salgaonkar , Sourabh Jain , lkml , linuxppc-dev , Mimi Zohar , Thiago Jung Bauermann , Dave Young , Vivek Goyal , Eric Biederman CgpMZSAyNi8wNi8yMDIwIMOgIDIxOjA0LCBIYXJpIEJhdGhpbmkgYSDDqWNyaXTCoDoKPiBTb21l IG9mIHRoZSBrZXhlY19maWxlX2xvYWQgY29kZSBpc24ndCBQUEM2NCBzcGVjaWZpYy4gTW92ZSBQ UEM2NAo+IHNwZWNpZmljIGNvZGUgZnJvbSBrZXhlYy9maWxlX2xvYWQuYyB0byBrZXhlYy9maWxl X2xvYWRfNjQuYy4gQWxzbywKPiByZW5hbWUgcHVyZ2F0b3J5L3RyYW1wb2xpbmUuUyB0byBwdXJn YXRvcnkvdHJhbXBvbGluZV82NC5TIGluIHRoZQo+IHNhbWUgc3Bpcml0LgoKQXQgdGhlIHRpbWUg YmVpbmcsIENPTkZJR19LRVhFQ19GSUxFIGRlcGVuZHMgb24gUFBDNjQuCkFyZSB5b3UgcGxhbm5p bmcgdG8gbWFrZSBpdCB3b3JrIG9uIFBQQzMyIGFzIHdlbGwgPwpPdGhlcndpc2UgSSBkb24ndCB1 bmRlcnN0YW5kIHRoZSBwdXJwb3NlIG9mIHRoaXMgcGF0Y2guCgpBbHNvLCB3aGF0IGlzIGJlaW5n IGRvbmUgaW4gdGhpcyBwYXRjaCBzZWVtcyB0byBnbyBmYXIgYmV5b25kIHdoYXQgeW91IApkZXNj cmliZSBhYm92ZS4gSXQgaXMgcHJvcGFibHkgd29ydGggc3BsaXR0aW5nIGluIHNldmVyYWwgcGF0 Y2hlcyB3aXRoIApwcm9wZXIgZXhwbGFuYXRpb24uCgpDaHJpc3RvcGhlCgo+IAo+IFNpZ25lZC1v ZmYtYnk6IEhhcmkgQmF0aGluaSA8aGJhdGhpbmlAbGludXguaWJtLmNvbT4KPiAtLS0KPiAgIGFy Y2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oICAgICAgIHwgICAxMSArKysKPiAgIGFyY2gv cG93ZXJwYy9rZXhlYy9NYWtlZmlsZSAgICAgICAgICAgIHwgICAgMiAtCj4gICBhcmNoL3Bvd2Vy cGMva2V4ZWMvZWxmXzY0LmMgICAgICAgICAgICB8ICAgIDcgKy0KPiAgIGFyY2gvcG93ZXJwYy9r ZXhlYy9maWxlX2xvYWQuYyAgICAgICAgIHwgICAzNyArKy0tLS0tLS0tCj4gICBhcmNoL3Bvd2Vy cGMva2V4ZWMvZmlsZV9sb2FkXzY0LmMgICAgICB8ICAxMDggKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrCj4gICBhcmNoL3Bvd2VycGMvcHVyZ2F0b3J5L01ha2VmaWxlICAgICAgICB8ICAg IDQgKwo+ICAgYXJjaC9wb3dlcnBjL3B1cmdhdG9yeS90cmFtcG9saW5lLlMgICAgfCAgMTE3IC0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gICBhcmNoL3Bvd2VycGMvcHVyZ2F0b3J5 L3RyYW1wb2xpbmVfNjQuUyB8ICAxMTcgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysK PiAgIDggZmlsZXMgY2hhbmdlZCwgMjQ4IGluc2VydGlvbnMoKyksIDE1NSBkZWxldGlvbnMoLSkK PiAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Bvd2VycGMva2V4ZWMvZmlsZV9sb2FkXzY0LmMK PiAgIGRlbGV0ZSBtb2RlIDEwMDY0NCBhcmNoL3Bvd2VycGMvcHVyZ2F0b3J5L3RyYW1wb2xpbmUu Uwo+ICAgY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvcG93ZXJwYy9wdXJnYXRvcnkvdHJhbXBvbGlu ZV82NC5TCj4gCj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5o IGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKPiBpbmRleCBjNjg0NzY4Li43MDA4 ZWExIDEwMDY0NAo+IC0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9rZXhlYy5oCj4gKysr IGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2tleGVjLmgKPiBAQCAtMTE0LDggKzExNCwxNyBA QCBpbnQgc2V0dXBfcHVyZ2F0b3J5KHN0cnVjdCBraW1hZ2UgKmltYWdlLCBjb25zdCB2b2lkICpz bGF2ZV9jb2RlLAo+ICAgCQkgICAgdW5zaWduZWQgbG9uZyBmZHRfbG9hZF9hZGRyKTsKPiAgIGlu dCBzZXR1cF9uZXdfZmR0KGNvbnN0IHN0cnVjdCBraW1hZ2UgKmltYWdlLCB2b2lkICpmZHQsCj4g ICAJCSAgdW5zaWduZWQgbG9uZyBpbml0cmRfbG9hZF9hZGRyLCB1bnNpZ25lZCBsb25nIGluaXRy ZF9sZW4sCj4gLQkJICBjb25zdCBjaGFyICpjbWRsaW5lKTsKPiArCQkgIGNvbnN0IGNoYXIgKmNt ZGxpbmUsIGludCAqbm9kZSk7Cj4gICBpbnQgZGVsZXRlX2ZkdF9tZW1fcnN2KHZvaWQgKmZkdCwg dW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKPiArCj4gKyNpZmRlZiBD T05GSUdfUFBDNjQKPiAraW50IHNldHVwX3B1cmdhdG9yeV9wcGM2NChzdHJ1Y3Qga2ltYWdlICpp bWFnZSwgY29uc3Qgdm9pZCAqc2xhdmVfY29kZSwKPiArCQkJICBjb25zdCB2b2lkICpmZHQsIHVu c2lnbmVkIGxvbmcga2VybmVsX2xvYWRfYWRkciwKPiArCQkJICB1bnNpZ25lZCBsb25nIGZkdF9s b2FkX2FkZHIpOwo+ICtpbnQgc2V0dXBfbmV3X2ZkdF9wcGM2NChjb25zdCBzdHJ1Y3Qga2ltYWdl ICppbWFnZSwgdm9pZCAqZmR0LAo+ICsJCQl1bnNpZ25lZCBsb25nIGluaXRyZF9sb2FkX2FkZHIs Cj4gKwkJCXVuc2lnbmVkIGxvbmcgaW5pdHJkX2xlbiwgY29uc3QgY2hhciAqY21kbGluZSk7Cj4g KyNlbmRpZiAvKiBDT05GSUdfUFBDNjQgKi8KPiAgICNlbmRpZiAvKiBDT05GSUdfS0VYRUNfRklM RSAqLwo+ICAgCj4gICAjZWxzZSAvKiAhQ09ORklHX0tFWEVDX0NPUkUgKi8KPiBkaWZmIC0tZ2l0 IGEvYXJjaC9wb3dlcnBjL2tleGVjL01ha2VmaWxlIGIvYXJjaC9wb3dlcnBjL2tleGVjL01ha2Vm aWxlCj4gaW5kZXggODYzODBjNi4uNjdjMzU1MyAxMDA2NDQKPiAtLS0gYS9hcmNoL3Bvd2VycGMv a2V4ZWMvTWFrZWZpbGUKPiArKysgYi9hcmNoL3Bvd2VycGMva2V4ZWMvTWFrZWZpbGUKPiBAQCAt Nyw3ICs3LDcgQEAgb2JqLXkJCQkJKz0gY29yZS5vIGNyYXNoLm8gY29yZV8kKEJJVFMpLm8KPiAg IAo+ICAgb2JqLSQoQ09ORklHX1BQQzMyKQkJKz0gcmVsb2NhdGVfMzIubwo+ICAgCj4gLW9iai0k KENPTkZJR19LRVhFQ19GSUxFKQkrPSBmaWxlX2xvYWQubyBlbGZfJChCSVRTKS5vCj4gK29iai0k KENPTkZJR19LRVhFQ19GSUxFKQkrPSBmaWxlX2xvYWQubyBmaWxlX2xvYWRfJChCSVRTKS5vIGVs Zl8kKEJJVFMpLm8KPiAgIAo+ICAgaWZkZWYgQ09ORklHX0hBVkVfSU1BX0tFWEVDCj4gICBpZmRl ZiBDT05GSUdfSU1BCj4gZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXhlYy9lbGZfNjQuYyBi L2FyY2gvcG93ZXJwYy9rZXhlYy9lbGZfNjQuYwo+IGluZGV4IDMwNzJmZDYuLjIzYWQwNGMgMTAw NjQ0Cj4gLS0tIGEvYXJjaC9wb3dlcnBjL2tleGVjL2VsZl82NC5jCj4gKysrIGIvYXJjaC9wb3dl cnBjL2tleGVjL2VsZl82NC5jCj4gQEAgLTg4LDcgKzg4LDggQEAgc3RhdGljIHZvaWQgKmVsZjY0 X2xvYWQoc3RydWN0IGtpbWFnZSAqaW1hZ2UsIGNoYXIgKmtlcm5lbF9idWYsCj4gICAJCWdvdG8g b3V0Owo+ICAgCX0KPiAgIAo+IC0JcmV0ID0gc2V0dXBfbmV3X2ZkdChpbWFnZSwgZmR0LCBpbml0 cmRfbG9hZF9hZGRyLCBpbml0cmRfbGVuLCBjbWRsaW5lKTsKPiArCXJldCA9IHNldHVwX25ld19m ZHRfcHBjNjQoaW1hZ2UsIGZkdCwgaW5pdHJkX2xvYWRfYWRkciwKPiArCQkJCSAgaW5pdHJkX2xl biwgY21kbGluZSk7Cj4gICAJaWYgKHJldCkKPiAgIAkJZ290byBvdXQ7Cj4gICAKPiBAQCAtMTA3 LDggKzEwOCw4IEBAIHN0YXRpYyB2b2lkICplbGY2NF9sb2FkKHN0cnVjdCBraW1hZ2UgKmltYWdl LCBjaGFyICprZXJuZWxfYnVmLAo+ICAgCXByX2RlYnVnKCJMb2FkZWQgZGV2aWNlIHRyZWUgYXQg MHglbHhcbiIsIGZkdF9sb2FkX2FkZHIpOwo+ICAgCj4gICAJc2xhdmVfY29kZSA9IGVsZl9pbmZv LmJ1ZmZlciArIGVsZl9pbmZvLnByb2doZHJzWzBdLnBfb2Zmc2V0Owo+IC0JcmV0ID0gc2V0dXBf cHVyZ2F0b3J5KGltYWdlLCBzbGF2ZV9jb2RlLCBmZHQsIGtlcm5lbF9sb2FkX2FkZHIsCj4gLQkJ CSAgICAgIGZkdF9sb2FkX2FkZHIpOwo+ICsJcmV0ID0gc2V0dXBfcHVyZ2F0b3J5X3BwYzY0KGlt YWdlLCBzbGF2ZV9jb2RlLCBmZHQsIGtlcm5lbF9sb2FkX2FkZHIsCj4gKwkJCQkgICAgZmR0X2xv YWRfYWRkcik7Cj4gICAJaWYgKHJldCkKPiAgIAkJcHJfZXJyKCJFcnJvciBzZXR0aW5nIHVwIHRo ZSBwdXJnYXRvcnkuXG4iKTsKPiAgIAo+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2V4ZWMv ZmlsZV9sb2FkLmMgYi9hcmNoL3Bvd2VycGMva2V4ZWMvZmlsZV9sb2FkLmMKPiBpbmRleCAxNDNj OTE3Li45OWEyYzRkIDEwMDY0NAo+IC0tLSBhL2FyY2gvcG93ZXJwYy9rZXhlYy9maWxlX2xvYWQu Ywo+ICsrKyBiL2FyY2gvcG93ZXJwYy9rZXhlYy9maWxlX2xvYWQuYwo+IEBAIC0xLDYgKzEsNiBA QAo+ICAgLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjAtb25seQo+ICAgLyoKPiAt ICogcHBjNjQgY29kZSB0byBpbXBsZW1lbnQgdGhlIGtleGVjX2ZpbGVfbG9hZCBzeXNjYWxsCj4g KyAqIHBvd2VycGMgY29kZSB0byBpbXBsZW1lbnQgdGhlIGtleGVjX2ZpbGVfbG9hZCBzeXNjYWxs Cj4gICAgKgo+ICAgICogQ29weXJpZ2h0IChDKSAyMDA0ICBBZGFtIExpdGtlIChhZ2xAdXMuaWJt LmNvbSkKPiAgICAqIENvcHlyaWdodCAoQykgMjAwNCAgSUJNIENvcnAuCj4gQEAgLTE2LDI2ICsx NiwxMCBAQAo+ICAgCj4gICAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+ICAgI2luY2x1ZGUgPGxp bnV4L2tleGVjLmg+Cj4gLSNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KPiAgICNpbmNsdWRlIDxs aW51eC9saWJmZHQuaD4KPiAgICNpbmNsdWRlIDxhc20vaW1hLmg+Cj4gICAKPiAtI2RlZmluZSBT TEFWRV9DT0RFX1NJWkUJCTI1Ngo+IC0KPiAtY29uc3Qgc3RydWN0IGtleGVjX2ZpbGVfb3BzICog Y29uc3Qga2V4ZWNfZmlsZV9sb2FkZXJzW10gPSB7Cj4gLQkma2V4ZWNfZWxmNjRfb3BzLAo+IC0J TlVMTAo+IC19Owo+IC0KPiAtaW50IGFyY2hfa2V4ZWNfa2VybmVsX2ltYWdlX3Byb2JlKHN0cnVj dCBraW1hZ2UgKmltYWdlLCB2b2lkICpidWYsCj4gLQkJCQkgIHVuc2lnbmVkIGxvbmcgYnVmX2xl bikKPiAtewo+IC0JLyogV2UgZG9uJ3Qgc3VwcG9ydCBjcmFzaCBrZXJuZWxzIHlldC4gKi8KPiAt CWlmIChpbWFnZS0+dHlwZSA9PSBLRVhFQ19UWVBFX0NSQVNIKQo+IC0JCXJldHVybiAtRU9QTk9U U1VQUDsKPiAtCj4gLQlyZXR1cm4ga2V4ZWNfaW1hZ2VfcHJvYmVfZGVmYXVsdChpbWFnZSwgYnVm LCBidWZfbGVuKTsKPiAtfQo+ICsjZGVmaW5lIFNMQVZFX0NPREVfU0laRQkJMjU2CS8qIEZpcnN0 IDB4MTAwIGJ5dGVzICovCj4gICAKPiAgIC8qKgo+ICAgICogc2V0dXBfcHVyZ2F0b3J5IC0gaW5p dGlhbGl6ZSB0aGUgcHVyZ2F0b3J5J3MgZ2xvYmFsIHZhcmlhYmxlcwo+IEBAIC0xMjcsMjQgKzEx MSwxNyBAQCBpbnQgZGVsZXRlX2ZkdF9tZW1fcnN2KHZvaWQgKmZkdCwgdW5zaWduZWQgbG9uZyBz dGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQo+ICAgICogQGluaXRyZF9sZW46CQlTaXplIG9mIHRo ZSBuZXh0IGluaXRyZCwgb3IgMCBpZiB0aGVyZSB3aWxsIGJlIG5vbmUuCj4gICAgKiBAY21kbGlu ZToJCUNvbW1hbmQgbGluZSBmb3IgdGhlIG5leHQga2VybmVsLCBvciBOVUxMIGlmIHRoZXJlIHdp bGwKPiAgICAqCQkJYmUgbm9uZS4KPiArICogQGNob3Nlbl9ub2RlOiAgICAgICAgU2V0IHRoaXMg b3V0cHV0IHBhcmFtZXRlciB0byBjaG9zZW5fbm9kZS4KPiAgICAqCj4gICAgKiBSZXR1cm46IDAg b24gc3VjY2Vzcywgb3IgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCj4gICAgKi8KPiAgIGludCBz ZXR1cF9uZXdfZmR0KGNvbnN0IHN0cnVjdCBraW1hZ2UgKmltYWdlLCB2b2lkICpmZHQsCj4gICAJ CSAgdW5zaWduZWQgbG9uZyBpbml0cmRfbG9hZF9hZGRyLCB1bnNpZ25lZCBsb25nIGluaXRyZF9s ZW4sCj4gLQkJICBjb25zdCBjaGFyICpjbWRsaW5lKQo+ICsJCSAgY29uc3QgY2hhciAqY21kbGlu ZSwgaW50ICpub2RlKQo+ICAgewo+ICAgCWludCByZXQsIGNob3Nlbl9ub2RlOwo+ICAgCWNvbnN0 IHZvaWQgKnByb3A7Cj4gICAKPiAtCS8qIFJlbW92ZSBtZW1vcnkgcmVzZXJ2YXRpb24gZm9yIHRo ZSBjdXJyZW50IGRldmljZSB0cmVlLiAqLwo+IC0JcmV0ID0gZGVsZXRlX2ZkdF9tZW1fcnN2KGZk dCwgX19wYShpbml0aWFsX2Jvb3RfcGFyYW1zKSwKPiAtCQkJCSBmZHRfdG90YWxzaXplKGluaXRp YWxfYm9vdF9wYXJhbXMpKTsKPiAtCWlmIChyZXQgPT0gMCkKPiAtCQlwcl9kZWJ1ZygiUmVtb3Zl ZCBvbGQgZGV2aWNlIHRyZWUgcmVzZXJ2YXRpb24uXG4iKTsKPiAtCWVsc2UgaWYgKHJldCAhPSAt RU5PRU5UKQo+IC0JCXJldHVybiByZXQ7Cj4gLQo+ICAgCWNob3Nlbl9ub2RlID0gZmR0X3BhdGhf b2Zmc2V0KGZkdCwgIi9jaG9zZW4iKTsKPiAgIAlpZiAoY2hvc2VuX25vZGUgPT0gLUZEVF9FUlJf Tk9URk9VTkQpIHsKPiAgIAkJY2hvc2VuX25vZGUgPSBmZHRfYWRkX3N1Ym5vZGUoZmR0LCBmZHRf cGF0aF9vZmZzZXQoZmR0LCAiLyIpLAo+IEBAIC0xNTcsNiArMTM0LDggQEAgaW50IHNldHVwX25l d19mZHQoY29uc3Qgc3RydWN0IGtpbWFnZSAqaW1hZ2UsIHZvaWQgKmZkdCwKPiAgIAkJcHJfZXJy KCJNYWxmb3JtZWQgZGV2aWNlIHRyZWU6IGVycm9yIHJlYWRpbmcgL2Nob3Nlbi5cbiIpOwo+ICAg CQlyZXR1cm4gLUVJTlZBTDsKPiAgIAl9Cj4gKwlpZiAobm9kZSkKPiArCQkqbm9kZSA9IGNob3Nl bl9ub2RlOwo+ICAgCj4gICAJLyogRGlkIHdlIGJvb3QgdXNpbmcgYW4gaW5pdHJkPyAqLwo+ICAg CXByb3AgPSBmZHRfZ2V0cHJvcChmZHQsIGNob3Nlbl9ub2RlLCAibGludXgsaW5pdHJkLXN0YXJ0 IiwgTlVMTCk7Cj4gQEAgLTI0MiwxMCArMjIxLDYgQEAgaW50IHNldHVwX25ld19mZHQoY29uc3Qg c3RydWN0IGtpbWFnZSAqaW1hZ2UsIHZvaWQgKmZkdCwKPiAgIAkJcmV0dXJuIHJldDsKPiAgIAl9 Cj4gICAKPiAtCXJldCA9IGZkdF9zZXRwcm9wKGZkdCwgY2hvc2VuX25vZGUsICJsaW51eCxib290 ZWQtZnJvbS1rZXhlYyIsIE5VTEwsIDApOwo+IC0JaWYgKHJldCkKPiAtCQlnb3RvIGVycjsKPiAt Cj4gICAJcmV0dXJuIDA7Cj4gICAKPiAgIGVycjoKPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBj L2tleGVjL2ZpbGVfbG9hZF82NC5jIGIvYXJjaC9wb3dlcnBjL2tleGVjL2ZpbGVfbG9hZF82NC5j Cj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5lNmJmZjk2MAo+IC0tLSAv ZGV2L251bGwKPiArKysgYi9hcmNoL3Bvd2VycGMva2V4ZWMvZmlsZV9sb2FkXzY0LmMKPiBAQCAt MCwwICsxLDEwOCBAQAo+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5 Cj4gKy8qCj4gKyAqIHBwYzY0IGNvZGUgdG8gaW1wbGVtZW50IHRoZSBrZXhlY19maWxlX2xvYWQg c3lzY2FsbAo+ICsgKgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIEFkYW0gTGl0a2UgKGFnbEB1 cy5pYm0uY29tKQo+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIElCTSBDb3JwLgo+ICsgKiBDb3B5 cmlnaHQgKEMpIDIwMDQsMjAwNSAgTWlsdG9uIEQgTWlsbGVyIElJLCBJQk0gQ29ycG9yYXRpb24K PiArICogQ29weXJpZ2h0IChDKSAyMDA1ICBSIFNoYXJhZGEgKHNoYXJhZGFAaW4uaWJtLmNvbSkK PiArICogQ29weXJpZ2h0IChDKSAyMDA2ICBNb2hhbiBLdW1hciBNIChtb2hhbkBpbi5pYm0uY29t KQo+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMjAgIElCTSBDb3Jwb3JhdGlvbgo+ICsgKgo+ICsgKiBC YXNlZCBvbiBrZXhlYy10b29scycga2V4ZWMtcHBjNjQuYywga2V4ZWMtZWxmLXJlbC1wcGM2NC5j LCBmczJkdC5jLgo+ICsgKiBIZWF2aWx5IG1vZGlmaWVkIGZvciB0aGUga2VybmVsIGJ5Cj4gKyAq IEhhcmkgQmF0aGluaSA8aGJhdGhpbmlAbGludXguaWJtLmNvbT4uCj4gKyAqLwo+ICsKPiArI2lu Y2x1ZGUgPGxpbnV4L2tleGVjLmg+Cj4gKyNpbmNsdWRlIDxsaW51eC9vZl9mZHQuaD4KPiArI2lu Y2x1ZGUgPGxpbnV4L2xpYmZkdC5oPgo+ICsKPiArY29uc3Qgc3RydWN0IGtleGVjX2ZpbGVfb3Bz ICogY29uc3Qga2V4ZWNfZmlsZV9sb2FkZXJzW10gPSB7Cj4gKwkma2V4ZWNfZWxmNjRfb3BzLAo+ ICsJTlVMTAo+ICt9Owo+ICsKPiArLyoqCj4gKyAqIHNldHVwX3B1cmdhdG9yeV9wcGM2NCAtIGlu aXRpYWxpemUgUFBDNjQgc3BlY2lmaWMgcHVyZ2F0b3J5J3MgZ2xvYmFsCj4gKyAqICAgICAgICAg ICAgICAgICAgICAgICAgIHZhcmlhYmxlcyBhbmQgY2FsbCBzZXR1cF9wdXJnYXRvcnkoKSB0byBp bml0aWFsaXplCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1vbiBnbG9iYWwgdmFy aWFibGUuCj4gKyAqIEBpbWFnZTogICAgICAgICAgICAgICAgIGtleGVjIGltYWdlLgo+ICsgKiBA c2xhdmVfY29kZTogICAgICAgICAgICBTbGF2ZSBjb2RlIGZvciB0aGUgcHVyZ2F0b3J5Lgo+ICsg KiBAZmR0OiAgICAgICAgICAgICAgICAgICBGbGF0dGVuZWQgZGV2aWNlIHRyZWUgZm9yIHRoZSBu ZXh0IGtlcm5lbC4KPiArICogQGtlcm5lbF9sb2FkX2FkZHI6ICAgICAgQWRkcmVzcyB3aGVyZSB0 aGUga2VybmVsIGlzIGxvYWRlZC4KPiArICogQGZkdF9sb2FkX2FkZHI6ICAgICAgICAgQWRkcmVz cyB3aGVyZSB0aGUgZmxhdHRlbmVkIGRldmljZSB0cmVlIGlzIGxvYWRlZC4KPiArICoKPiArICog UmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5lZ2F0aXZlIGVycm5vIG9uIGVycm9yLgo+ICsgKi8KPiAr aW50IHNldHVwX3B1cmdhdG9yeV9wcGM2NChzdHJ1Y3Qga2ltYWdlICppbWFnZSwgY29uc3Qgdm9p ZCAqc2xhdmVfY29kZSwKPiArCQkJICBjb25zdCB2b2lkICpmZHQsIHVuc2lnbmVkIGxvbmcga2Vy bmVsX2xvYWRfYWRkciwKPiArCQkJICB1bnNpZ25lZCBsb25nIGZkdF9sb2FkX2FkZHIpCj4gK3sK PiArCWludCByZXQ7Cj4gKwo+ICsJcmV0ID0gc2V0dXBfcHVyZ2F0b3J5KGltYWdlLCBzbGF2ZV9j b2RlLCBmZHQsIGtlcm5lbF9sb2FkX2FkZHIsCj4gKwkJCSAgICAgIGZkdF9sb2FkX2FkZHIpOwo+ ICsJaWYgKHJldCkKPiArCQlwcl9lcnIoIkZhaWxlZCB0byBzZXR1cCBwdXJnYXRvcnkgc3ltYm9s cyIpOwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIHNldHVwX25ld19mZHRf cHBjNjQgLSBVcGRhdGUgdGhlIGZsYXR0ZW5kIGRldmljZS10cmVlIG9mIHRoZSBrZXJuZWwKPiAr ICogICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIGxvYWRlZC4KPiArICogQGltYWdlOiAgICAg ICAgICAgICAgIGtleGVjIGltYWdlIGJlaW5nIGxvYWRlZC4KPiArICogQGZkdDogICAgICAgICAg ICAgICAgIEZsYXR0ZW5lZCBkZXZpY2UgdHJlZSBmb3IgdGhlIG5leHQga2VybmVsLgo+ICsgKiBA aW5pdHJkX2xvYWRfYWRkcjogICAgQWRkcmVzcyB3aGVyZSB0aGUgbmV4dCBpbml0cmQgd2lsbCBi ZSBsb2FkZWQuCj4gKyAqIEBpbml0cmRfbGVuOiAgICAgICAgICBTaXplIG9mIHRoZSBuZXh0IGlu aXRyZCwgb3IgMCBpZiB0aGVyZSB3aWxsIGJlIG5vbmUuCj4gKyAqIEBjbWRsaW5lOiAgICAgICAg ICAgICBDb21tYW5kIGxpbmUgZm9yIHRoZSBuZXh0IGtlcm5lbCwgb3IgTlVMTCBpZiB0aGVyZSB3 aWxsCj4gKyAqICAgICAgICAgICAgICAgICAgICAgICBiZSBub25lLgo+ICsgKgo+ICsgKiBSZXR1 cm5zIDAgb24gc3VjY2VzcywgbmVnYXRpdmUgZXJybm8gb24gZXJyb3IuCj4gKyAqLwo+ICtpbnQg c2V0dXBfbmV3X2ZkdF9wcGM2NChjb25zdCBzdHJ1Y3Qga2ltYWdlICppbWFnZSwgdm9pZCAqZmR0 LAo+ICsJCQl1bnNpZ25lZCBsb25nIGluaXRyZF9sb2FkX2FkZHIsCj4gKwkJCXVuc2lnbmVkIGxv bmcgaW5pdHJkX2xlbiwgY29uc3QgY2hhciAqY21kbGluZSkKPiArewo+ICsJaW50IGNob3Nlbl9u b2RlLCByZXQ7Cj4gKwo+ICsJLyogUmVtb3ZlIG1lbW9yeSByZXNlcnZhdGlvbiBmb3IgdGhlIGN1 cnJlbnQgZGV2aWNlIHRyZWUuICovCj4gKwlyZXQgPSBkZWxldGVfZmR0X21lbV9yc3YoZmR0LCBf X3BhKGluaXRpYWxfYm9vdF9wYXJhbXMpLAo+ICsJCQkJIGZkdF90b3RhbHNpemUoaW5pdGlhbF9i b290X3BhcmFtcykpOwo+ICsJaWYgKHJldCA9PSAwKQo+ICsJCXByX2RlYnVnKCJSZW1vdmVkIG9s ZCBkZXZpY2UgdHJlZSByZXNlcnZhdGlvbi5cbiIpOwo+ICsJZWxzZSBpZiAocmV0ICE9IC1FTk9F TlQpIHsKPiArCQlwcl9lcnIoIkZhaWxlZCB0byByZW1vdmUgb2xkIGRldmljZS10cmVlIHJlc2Vy dmF0aW9uLlxuIik7Cj4gKwkJcmV0dXJuIHJldDsKPiArCX0KPiArCj4gKwlyZXQgPSBzZXR1cF9u ZXdfZmR0KGltYWdlLCBmZHQsIGluaXRyZF9sb2FkX2FkZHIsIGluaXRyZF9sZW4sCj4gKwkJCSAg ICBjbWRsaW5lLCAmY2hvc2VuX25vZGUpOwo+ICsJaWYgKHJldCkKPiArCQlyZXR1cm4gcmV0Owo+ ICsKPiArCXJldCA9IGZkdF9zZXRwcm9wKGZkdCwgY2hvc2VuX25vZGUsICJsaW51eCxib290ZWQt ZnJvbS1rZXhlYyIsIE5VTEwsIDApOwo+ICsJaWYgKHJldCkKPiArCQlwcl9lcnIoIkZhaWxlZCB0 byB1cGRhdGUgZGV2aWNlLXRyZWUgd2l0aCBsaW51eCxib290ZWQtZnJvbS1rZXhlY1xuIik7Cj4g Kwo+ICsJcmV0dXJuIHJldDsKPiArfQo+ICsKPiArLyoqCj4gKyAqIGFyY2hfa2V4ZWNfa2VybmVs X2ltYWdlX3Byb2JlIC0gRG9lcyBhZGRpdGlvbmFsIGhhbmRsaW5nIG5lZWRlZCB0byBzZXR1cAo+ ICsgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleGVjIHNlZ21lbnRzLgo+ICsg KiBAaW1hZ2U6ICAgICAgICAgICAgICAgICAgICAgICAgIGtleGVjIGltYWdlIGJlaW5nIGxvYWRl ZC4KPiArICogQGJ1ZjogICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXIgcG9pbnRpbmcg dG8gZWxmIGRhdGEuCj4gKyAqIEBidWZfbGVuOiAgICAgICAgICAgICAgICAgICAgICAgTGVuZ3Ro IG9mIHRoZSBidWZmZXIuCj4gKyAqCj4gKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCBuZWdhdGl2 ZSBlcnJubyBvbiBlcnJvci4KPiArICovCj4gK2ludCBhcmNoX2tleGVjX2tlcm5lbF9pbWFnZV9w cm9iZShzdHJ1Y3Qga2ltYWdlICppbWFnZSwgdm9pZCAqYnVmLAo+ICsJCQkJICB1bnNpZ25lZCBs b25nIGJ1Zl9sZW4pCj4gK3sKPiArCS8qIFdlIGRvbid0IHN1cHBvcnQgY3Jhc2gga2VybmVscyB5 ZXQuICovCj4gKwlpZiAoaW1hZ2UtPnR5cGUgPT0gS0VYRUNfVFlQRV9DUkFTSCkKPiArCQlyZXR1 cm4gLUVPUE5PVFNVUFA7Cj4gKwo+ICsJcmV0dXJuIGtleGVjX2ltYWdlX3Byb2JlX2RlZmF1bHQo aW1hZ2UsIGJ1ZiwgYnVmX2xlbik7Cj4gK30KPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3B1 cmdhdG9yeS9NYWtlZmlsZSBiL2FyY2gvcG93ZXJwYy9wdXJnYXRvcnkvTWFrZWZpbGUKPiBpbmRl eCA3YzZkOGIxLi4zNDhmNTk1OCAxMDA2NDQKPiAtLS0gYS9hcmNoL3Bvd2VycGMvcHVyZ2F0b3J5 L01ha2VmaWxlCj4gKysrIGIvYXJjaC9wb3dlcnBjL3B1cmdhdG9yeS9NYWtlZmlsZQo+IEBAIC0y LDExICsyLDExIEBACj4gICAKPiAgIEtBU0FOX1NBTklUSVpFIDo9IG4KPiAgIAo+IC10YXJnZXRz ICs9IHRyYW1wb2xpbmUubyBwdXJnYXRvcnkucm8ga2V4ZWMtcHVyZ2F0b3J5LmMKPiArdGFyZ2V0 cyArPSB0cmFtcG9saW5lXyQoQklUUykubyBwdXJnYXRvcnkucm8ga2V4ZWMtcHVyZ2F0b3J5LmMK PiAgIAo+ICAgTERGTEFHU19wdXJnYXRvcnkucm8gOj0gLWUgcHVyZ2F0b3J5X3N0YXJ0IC1yIC0t bm8tdW5kZWZpbmVkCj4gICAKPiAtJChvYmopL3B1cmdhdG9yeS5ybzogJChvYmopL3RyYW1wb2xp bmUubyBGT1JDRQo+ICskKG9iaikvcHVyZ2F0b3J5LnJvOiAkKG9iaikvdHJhbXBvbGluZV8kKEJJ VFMpLm8gRk9SQ0UKPiAgIAkJJChjYWxsIGlmX2NoYW5nZWQsbGQpCj4gICAKPiAgIHF1aWV0X2Nt ZF9iaW4yYyA9IEJJTjJDICAgJEAKPiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3B1cmdhdG9y eS90cmFtcG9saW5lLlMgYi9hcmNoL3Bvd2VycGMvcHVyZ2F0b3J5L3RyYW1wb2xpbmUuUwo+IGRl bGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAo+IGluZGV4IGE1YTgzYzMuLjAwMDAwMDAKPiAtLS0gYS9h cmNoL3Bvd2VycGMvcHVyZ2F0b3J5L3RyYW1wb2xpbmUuUwo+ICsrKyAvZGV2L251bGwKPiBAQCAt MSwxMTcgKzAsMCBAQAo+IC0vKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMC1vbmx5 ICovCj4gLS8qCj4gLSAqIGtleGVjIHRyYW1wb2xpbmUKPiAtICoKPiAtICogQmFzZWQgb24gY29k ZSB0YWtlbiBmcm9tIGtleGVjLXRvb2xzIGFuZCBrZXhlYy1saXRlLgo+IC0gKgo+IC0gKiBDb3B5 cmlnaHQgKEMpIDIwMDQgLSAyMDA1LCBNaWx0b24gRCBNaWxsZXIgSUksIElCTSBDb3Jwb3JhdGlv bgo+IC0gKiBDb3B5cmlnaHQgKEMpIDIwMDYsIE1vaGFuIEt1bWFyIE0sIElCTSBDb3Jwb3JhdGlv bgo+IC0gKiBDb3B5cmlnaHQgKEMpIDIwMTMsIEFudG9uIEJsYW5jaGFyZCwgSUJNIENvcnBvcmF0 aW9uCj4gLSAqLwo+IC0KPiAtI2luY2x1ZGUgPGFzbS9hc20tY29tcGF0Lmg+Cj4gLQo+IC0JLm1h Y2hpbmUgcHBjNjQKPiAtCS5iYWxpZ24gMjU2Cj4gLQkuZ2xvYmwgcHVyZ2F0b3J5X3N0YXJ0Cj4g LXB1cmdhdG9yeV9zdGFydDoKPiAtCWIJbWFzdGVyCj4gLQo+IC0JLyogQUJJOiBwb3NzaWJsZSBy dW5fYXRfbG9hZCBmbGFnIGF0IDB4NWMgKi8KPiAtCS5vcmcgcHVyZ2F0b3J5X3N0YXJ0ICsgMHg1 Ywo+IC0JLmdsb2JsIHJ1bl9hdF9sb2FkCj4gLXJ1bl9hdF9sb2FkOgo+IC0JLmxvbmcgMAo+IC0J LnNpemUgcnVuX2F0X2xvYWQsIC4gLSBydW5fYXRfbG9hZAo+IC0KPiAtCS8qIEFCSTogc2xhdmVz IHN0YXJ0IGF0IDYwIHdpdGggcjM9cGh5cyAqLwo+IC0JLm9yZyBwdXJnYXRvcnlfc3RhcnQgKyAw eDYwCj4gLXNsYXZlOgo+IC0JYiAuCj4gLQkvKiBBQkk6IGVuZCBvZiBjb3BpZWQgcmVnaW9uICov Cj4gLQkub3JnIHB1cmdhdG9yeV9zdGFydCArIDB4MTAwCj4gLQkuc2l6ZSBwdXJnYXRvcnlfc3Rh cnQsIC4gLSBwdXJnYXRvcnlfc3RhcnQKPiAtCj4gLS8qCj4gLSAqIFRoZSBhYm92ZSAweDEwMCBi eXRlcyBhdCBwdXJnYXRvcnlfc3RhcnQgYXJlIHJlcGxhY2VkIHdpdGggdGhlCj4gLSAqIGNvZGUg ZnJvbSB0aGUga2VybmVsIChvciBuZXh0IHN0YWdlKSBieSBzZXR1cF9wdXJnYXRvcnkoKS4KPiAt ICovCj4gLQo+IC1tYXN0ZXI6Cj4gLQlvcgklcjEsJXIxLCVyMQkvKiBsb3cgcHJpb3JpdHkgdG8g bGV0IG90aGVyIHRocmVhZHMgY2F0Y2h1cCAqLwo+IC0JaXN5bmMKPiAtCW1yCSVyMTcsJXIzCS8q IHNhdmUgY3B1IGlkIHRvIHIxNyAqLwo+IC0JbXIJJXIxNSwlcjQJLyogc2F2ZSBwaHlzaWNhbCBh ZGRyZXNzIGluIHJlZzE1ICovCj4gLQo+IC0Jb3IJJXIzLCVyMywlcjMJLyogb2sgbm93IHRvIGhp Z2ggcHJpb3JpdHksIGxldHMgYm9vdCAqLwo+IC0JbGlzCSVyNiwweDEKPiAtCW10Y3RyCSVyNgkJ LyogZGVsYXkgYSBiaXQgZm9yIHNsYXZlcyB0byBjYXRjaCB1cCAqLwo+IC0JYmRuegkuCQkvKiBi ZWZvcmUgd2Ugb3ZlcndyaXRlIDAtMTAwIGFnYWluICovCj4gLQo+IC0JYmwJMGYJCS8qIFdvcmsg b3V0IHdoZXJlIHdlJ3JlIHJ1bm5pbmcgKi8KPiAtMDoJbWZscgklcjE4Cj4gLQo+IC0JLyogbG9h ZCBkZXZpY2UtdHJlZSBhZGRyZXNzICovCj4gLQlsZAklcjMsIChkdF9vZmZzZXQgLSAwYikoJXIx OCkKPiAtCW1yCSVyMTYsJXIzCS8qIHNhdmUgZHQgYWRkcmVzcyBpbiByZWcxNiAqLwo+IC0JbGkJ JXI0LDIwCj4gLQlMV1pYX0JFCSVyNiwlcjMsJXI0CS8qIGZldGNoIF9fYmUzMiB2ZXJzaW9uIG51 bWJlciBhdCBieXRlIDIwICovCj4gLQljbXB3aQklY3IwLCVyNiwyCS8qIHYyIG9yIGxhdGVyPyAq Lwo+IC0JYmx0CTFmCj4gLQlsaQklcjQsMjgKPiAtCVNUV1hfQkUJJXIxNywlcjMsJXI0CS8qIFN0 b3JlIG15IGNwdSBhcyBfX2JlMzIgYXQgYnl0ZSAyOCAqLwo+IC0xOgo+IC0JLyogbG9hZCB0aGUg a2VybmVsIGFkZHJlc3MgKi8KPiAtCWxkCSVyNCwoa2VybmVsIC0gMGIpKCVyMTgpCj4gLQo+IC0J LyogbG9hZCB0aGUgcnVuX2F0X2xvYWQgZmxhZyAqLwo+IC0JLyogcG9zc2libHkgcGF0Y2hlZCBi eSBrZXhlYyAqLwo+IC0JbGQJJXI2LChydW5fYXRfbG9hZCAtIDBiKSglcjE4KQo+IC0JLyogYW5k IHBhdGNoIGl0IGludG8gdGhlIGtlcm5lbCAqLwo+IC0Jc3R3CSVyNiwoMHg1YykoJXI0KQo+IC0K PiAtCW1yCSVyMywlcjE2CS8qIHJlc3RvcmUgZHQgYWRkcmVzcyAqLwo+IC0KPiAtCWxpCSVyNSww CQkvKiByNSB3aWxsIGJlIDAgZm9yIGtlcm5lbCAqLwo+IC0KPiAtCW1mbXNyCSVyMTEKPiAtCWFu ZGkuCSVyMTAsJXIxMSwxCS8qIHRlc3QgTVNSX0xFICovCj4gLQlibmUJLkxpdHRsZV9lbmRpYW4K PiAtCj4gLQltdGN0cgklcjQJCS8qIHByZXBhcmUgYnJhbmNoIHRvICovCj4gLQliY3RyCQkJLyog c3RhcnQga2VybmVsICovCj4gLQo+IC0uTGl0dGxlX2VuZGlhbjoKPiAtCW10c3JyMAklcjQJCS8q IHByZXBhcmUgYnJhbmNoIHRvICovCj4gLQo+IC0JY2xycmRpCSVyMTEsJXIxMSwxCS8qIGNsZWFy IE1TUl9MRSAqLwo+IC0JbXRzcnIxCSVyMTEKPiAtCj4gLQlyZmlkCQkJLyogdXBkYXRlIE1TUiBh bmQgc3RhcnQga2VybmVsICovCj4gLQo+IC0KPiAtCS5iYWxpZ24gOAo+IC0JLmdsb2JsIGtlcm5l bAo+IC1rZXJuZWw6Cj4gLQkuOGJ5dGUgIDB4MAo+IC0JLnNpemUga2VybmVsLCAuIC0ga2VybmVs Cj4gLQo+IC0JLmJhbGlnbiA4Cj4gLQkuZ2xvYmwgZHRfb2Zmc2V0Cj4gLWR0X29mZnNldDoKPiAt CS44Ynl0ZSAgMHgwCj4gLQkuc2l6ZSBkdF9vZmZzZXQsIC4gLSBkdF9vZmZzZXQKPiAtCj4gLQo+ IC0JLmRhdGEKPiAtCS5iYWxpZ24gOAo+IC0uZ2xvYmwgcHVyZ2F0b3J5X3NoYTI1Nl9kaWdlc3QK PiAtcHVyZ2F0b3J5X3NoYTI1Nl9kaWdlc3Q6Cj4gLQkuc2tpcAkzMgo+IC0JLnNpemUgcHVyZ2F0 b3J5X3NoYTI1Nl9kaWdlc3QsIC4gLSBwdXJnYXRvcnlfc2hhMjU2X2RpZ2VzdAo+IC0KPiAtCS5i YWxpZ24gOAo+IC0uZ2xvYmwgcHVyZ2F0b3J5X3NoYV9yZWdpb25zCj4gLXB1cmdhdG9yeV9zaGFf cmVnaW9uczoKPiAtCS5za2lwCTggKiAyICogMTYKPiAtCS5zaXplIHB1cmdhdG9yeV9zaGFfcmVn aW9ucywgLiAtIHB1cmdhdG9yeV9zaGFfcmVnaW9ucwo+IGRpZmYgLS1naXQgYS9hcmNoL3Bvd2Vy cGMvcHVyZ2F0b3J5L3RyYW1wb2xpbmVfNjQuUyBiL2FyY2gvcG93ZXJwYy9wdXJnYXRvcnkvdHJh bXBvbGluZV82NC5TCj4gbmV3IGZpbGUgbW9kZSAxMDA2NDQKPiBpbmRleCAwMDAwMDAwLi5hNWE4 M2MzCj4gLS0tIC9kZXYvbnVsbAo+ICsrKyBiL2FyY2gvcG93ZXJwYy9wdXJnYXRvcnkvdHJhbXBv bGluZV82NC5TCj4gQEAgLTAsMCArMSwxMTcgQEAKPiArLyogU1BEWC1MaWNlbnNlLUlkZW50aWZp ZXI6IEdQTC0yLjAtb25seSAqLwo+ICsvKgo+ICsgKiBrZXhlYyB0cmFtcG9saW5lCj4gKyAqCj4g KyAqIEJhc2VkIG9uIGNvZGUgdGFrZW4gZnJvbSBrZXhlYy10b29scyBhbmQga2V4ZWMtbGl0ZS4K PiArICoKPiArICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNSwgTWlsdG9uIEQgTWlsbGVyIElJ LCBJQk0gQ29ycG9yYXRpb24KPiArICogQ29weXJpZ2h0IChDKSAyMDA2LCBNb2hhbiBLdW1hciBN LCBJQk0gQ29ycG9yYXRpb24KPiArICogQ29weXJpZ2h0IChDKSAyMDEzLCBBbnRvbiBCbGFuY2hh cmQsIElCTSBDb3Jwb3JhdGlvbgo+ICsgKi8KPiArCj4gKyNpbmNsdWRlIDxhc20vYXNtLWNvbXBh dC5oPgo+ICsKPiArCS5tYWNoaW5lIHBwYzY0Cj4gKwkuYmFsaWduIDI1Ngo+ICsJLmdsb2JsIHB1 cmdhdG9yeV9zdGFydAo+ICtwdXJnYXRvcnlfc3RhcnQ6Cj4gKwliCW1hc3Rlcgo+ICsKPiArCS8q IEFCSTogcG9zc2libGUgcnVuX2F0X2xvYWQgZmxhZyBhdCAweDVjICovCj4gKwkub3JnIHB1cmdh dG9yeV9zdGFydCArIDB4NWMKPiArCS5nbG9ibCBydW5fYXRfbG9hZAo+ICtydW5fYXRfbG9hZDoK PiArCS5sb25nIDAKPiArCS5zaXplIHJ1bl9hdF9sb2FkLCAuIC0gcnVuX2F0X2xvYWQKPiArCj4g KwkvKiBBQkk6IHNsYXZlcyBzdGFydCBhdCA2MCB3aXRoIHIzPXBoeXMgKi8KPiArCS5vcmcgcHVy Z2F0b3J5X3N0YXJ0ICsgMHg2MAo+ICtzbGF2ZToKPiArCWIgLgo+ICsJLyogQUJJOiBlbmQgb2Yg Y29waWVkIHJlZ2lvbiAqLwo+ICsJLm9yZyBwdXJnYXRvcnlfc3RhcnQgKyAweDEwMAo+ICsJLnNp emUgcHVyZ2F0b3J5X3N0YXJ0LCAuIC0gcHVyZ2F0b3J5X3N0YXJ0Cj4gKwo+ICsvKgo+ICsgKiBU aGUgYWJvdmUgMHgxMDAgYnl0ZXMgYXQgcHVyZ2F0b3J5X3N0YXJ0IGFyZSByZXBsYWNlZCB3aXRo IHRoZQo+ICsgKiBjb2RlIGZyb20gdGhlIGtlcm5lbCAob3IgbmV4dCBzdGFnZSkgYnkgc2V0dXBf cHVyZ2F0b3J5KCkuCj4gKyAqLwo+ICsKPiArbWFzdGVyOgo+ICsJb3IJJXIxLCVyMSwlcjEJLyog bG93IHByaW9yaXR5IHRvIGxldCBvdGhlciB0aHJlYWRzIGNhdGNodXAgKi8KPiArCWlzeW5jCj4g KwltcgklcjE3LCVyMwkvKiBzYXZlIGNwdSBpZCB0byByMTcgKi8KPiArCW1yCSVyMTUsJXI0CS8q IHNhdmUgcGh5c2ljYWwgYWRkcmVzcyBpbiByZWcxNSAqLwo+ICsKPiArCW9yCSVyMywlcjMsJXIz CS8qIG9rIG5vdyB0byBoaWdoIHByaW9yaXR5LCBsZXRzIGJvb3QgKi8KPiArCWxpcwklcjYsMHgx Cj4gKwltdGN0cgklcjYJCS8qIGRlbGF5IGEgYml0IGZvciBzbGF2ZXMgdG8gY2F0Y2ggdXAgKi8K PiArCWJkbnoJLgkJLyogYmVmb3JlIHdlIG92ZXJ3cml0ZSAwLTEwMCBhZ2FpbiAqLwo+ICsKPiAr CWJsCTBmCQkvKiBXb3JrIG91dCB3aGVyZSB3ZSdyZSBydW5uaW5nICovCj4gKzA6CW1mbHIJJXIx OAo+ICsKPiArCS8qIGxvYWQgZGV2aWNlLXRyZWUgYWRkcmVzcyAqLwo+ICsJbGQJJXIzLCAoZHRf b2Zmc2V0IC0gMGIpKCVyMTgpCj4gKwltcgklcjE2LCVyMwkvKiBzYXZlIGR0IGFkZHJlc3MgaW4g cmVnMTYgKi8KPiArCWxpCSVyNCwyMAo+ICsJTFdaWF9CRQklcjYsJXIzLCVyNAkvKiBmZXRjaCBf X2JlMzIgdmVyc2lvbiBudW1iZXIgYXQgYnl0ZSAyMCAqLwo+ICsJY21wd2kJJWNyMCwlcjYsMgkv KiB2MiBvciBsYXRlcj8gKi8KPiArCWJsdAkxZgo+ICsJbGkJJXI0LDI4Cj4gKwlTVFdYX0JFCSVy MTcsJXIzLCVyNAkvKiBTdG9yZSBteSBjcHUgYXMgX19iZTMyIGF0IGJ5dGUgMjggKi8KPiArMToK PiArCS8qIGxvYWQgdGhlIGtlcm5lbCBhZGRyZXNzICovCj4gKwlsZAklcjQsKGtlcm5lbCAtIDBi KSglcjE4KQo+ICsKPiArCS8qIGxvYWQgdGhlIHJ1bl9hdF9sb2FkIGZsYWcgKi8KPiArCS8qIHBv c3NpYmx5IHBhdGNoZWQgYnkga2V4ZWMgKi8KPiArCWxkCSVyNiwocnVuX2F0X2xvYWQgLSAwYiko JXIxOCkKPiArCS8qIGFuZCBwYXRjaCBpdCBpbnRvIHRoZSBrZXJuZWwgKi8KPiArCXN0dwklcjYs KDB4NWMpKCVyNCkKPiArCj4gKwltcgklcjMsJXIxNgkvKiByZXN0b3JlIGR0IGFkZHJlc3MgKi8K PiArCj4gKwlsaQklcjUsMAkJLyogcjUgd2lsbCBiZSAwIGZvciBrZXJuZWwgKi8KPiArCj4gKwlt Zm1zcgklcjExCj4gKwlhbmRpLgklcjEwLCVyMTEsMQkvKiB0ZXN0IE1TUl9MRSAqLwo+ICsJYm5l CS5MaXR0bGVfZW5kaWFuCj4gKwo+ICsJbXRjdHIJJXI0CQkvKiBwcmVwYXJlIGJyYW5jaCB0byAq Lwo+ICsJYmN0cgkJCS8qIHN0YXJ0IGtlcm5lbCAqLwo+ICsKPiArLkxpdHRsZV9lbmRpYW46Cj4g KwltdHNycjAJJXI0CQkvKiBwcmVwYXJlIGJyYW5jaCB0byAqLwo+ICsKPiArCWNscnJkaQklcjEx LCVyMTEsMQkvKiBjbGVhciBNU1JfTEUgKi8KPiArCW10c3JyMQklcjExCj4gKwo+ICsJcmZpZAkJ CS8qIHVwZGF0ZSBNU1IgYW5kIHN0YXJ0IGtlcm5lbCAqLwo+ICsKPiArCj4gKwkuYmFsaWduIDgK PiArCS5nbG9ibCBrZXJuZWwKPiAra2VybmVsOgo+ICsJLjhieXRlICAweDAKPiArCS5zaXplIGtl cm5lbCwgLiAtIGtlcm5lbAo+ICsKPiArCS5iYWxpZ24gOAo+ICsJLmdsb2JsIGR0X29mZnNldAo+ ICtkdF9vZmZzZXQ6Cj4gKwkuOGJ5dGUgIDB4MAo+ICsJLnNpemUgZHRfb2Zmc2V0LCAuIC0gZHRf b2Zmc2V0Cj4gKwo+ICsKPiArCS5kYXRhCj4gKwkuYmFsaWduIDgKPiArLmdsb2JsIHB1cmdhdG9y eV9zaGEyNTZfZGlnZXN0Cj4gK3B1cmdhdG9yeV9zaGEyNTZfZGlnZXN0Ogo+ICsJLnNraXAJMzIK PiArCS5zaXplIHB1cmdhdG9yeV9zaGEyNTZfZGlnZXN0LCAuIC0gcHVyZ2F0b3J5X3NoYTI1Nl9k aWdlc3QKPiArCj4gKwkuYmFsaWduIDgKPiArLmdsb2JsIHB1cmdhdG9yeV9zaGFfcmVnaW9ucwo+ ICtwdXJnYXRvcnlfc2hhX3JlZ2lvbnM6Cj4gKwkuc2tpcAk4ICogMiAqIDE2Cj4gKwkuc2l6ZSBw dXJnYXRvcnlfc2hhX3JlZ2lvbnMsIC4gLSBwdXJnYXRvcnlfc2hhX3JlZ2lvbnMKPiAKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmtleGVjIG1haWxpbmcg bGlzdAprZXhlY0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3Jn L21haWxtYW4vbGlzdGluZm8va2V4ZWMK