Re: [PATCH v3 02/12] powerpc/kexec_file: mark PPC64 specific code
Hari Bathini writes: > On 16/07/20 7:19 am, Thiago Jung Bauermann wrote: >> >> I didn't forget about this patch. I just wanted to see more of the >> changes before comenting on it. >> >> Hari Bathini writes: >> >>> 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. >> >> There's only a 64 bit implementation of kexec_file_load() so this is a >> somewhat theoretical exercise, but there's no harm in getting the code >> organized, so: >> >> Reviewed-by: Thiago Jung Bauermann >> >> I have just one question below. > > > >>> +/** >>> + * 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; >>> +} >> >> For setup_purgatory_ppc64() you start with an empty function and build >> from there, but for setup_new_fdt_ppc64() you moved some code here. Is >> the code above 64 bit specific? > > Actually, I was not quiet sure if fdt updates like in patch 6 & patch 9 can be > done after setup_ima_buffer() call. If you can confirm, I will move them back > to setup_purgatory() Hari and I discussed this off-line and we came to the conclusion that theis code can be moved back to setup_new_fdt(). -- Thiago Jung Bauermann IBM Linux Technology Center
Re: [PATCH v3 02/12] powerpc/kexec_file: mark PPC64 specific code
On 16/07/20 7:19 am, Thiago Jung Bauermann wrote: > > I didn't forget about this patch. I just wanted to see more of the > changes before comenting on it. > > Hari Bathini writes: > >> 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. > > There's only a 64 bit implementation of kexec_file_load() so this is a > somewhat theoretical exercise, but there's no harm in getting the code > organized, so: > > Reviewed-by: Thiago Jung Bauermann > > I have just one question below. >> +/** >> + * 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; >> +} > > For setup_purgatory_ppc64() you start with an empty function and build > from there, but for setup_new_fdt_ppc64() you moved some code here. Is > the code above 64 bit specific? Actually, I was not quiet sure if fdt updates like in patch 6 & patch 9 can be done after setup_ima_buffer() call. If you can confirm, I will move them back to setup_purgatory() Thanks Hari
Re: [PATCH v3 02/12] powerpc/kexec_file: mark PPC64 specific code
I didn't forget about this patch. I just wanted to see more of the changes before comenting on it. Hari Bathini writes: > 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. There's only a 64 bit implementation of kexec_file_load() so this is a somewhat theoretical exercise, but there's no harm in getting the code organized, so: Reviewed-by: Thiago Jung Bauermann I have just one question below. > Signed-off-by: Hari Bathini > Tested-by: Pingfan Liu > --- > > v2 -> v3: > * Unchanged. Added Tested-by tag from Pingfan. > > v1 -> v2: > * No changes. > > > 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/kexec/file_load_64.c > b/arch/powerpc/kexec/file_load_64.c > new file mode 100644 > index 000..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 (a...@us.ibm.com) > + * Copyright (C) 2004 IBM Corp. > + * Copyright (C) 2004,2005 Milton D Miller II, IBM Corporation > + * Copyright (C) 2005 R Sharada (shar...@in.ibm.com) > + * Copyright (C) 2006 Mohan Kumar M (mo...@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,boo
[PATCH v3 02/12] powerpc/kexec_file: mark PPC64 specific code
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. Signed-off-by: Hari Bathini Tested-by: Pingfan Liu --- v2 -> v3: * Unchanged. Added Tested-by tag from Pingfan. v1 -> v2: * No changes. 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 (a...@us.ibm.com) * Copyright (C) 2004 IBM Corp. @@ -16,26 +16,10 @@ #include #include -#include #include #include -#define SLAVE_CODE_SIZE256 - -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_SIZE256 /* First 0x100 bytes */ /** * setup_purgatory - initialize the purgatory's global variables @@ -127,24 +111,17 @@ int delete_fdt_mem_rsv(void *