Replace load_extra_segments() with the common helper. The purgatory, DTB and kdump command line move to the setup hook. And the elf core header is now 64K aligned.
Cc: Palmer Dabbelt <[email protected]> Cc: Alexandre Ghiti <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Baoquan He <[email protected]> Cc: Mike Rapoport <[email protected]> Signed-off-by: Jinjie Ruan <[email protected]> --- arch/riscv/include/asm/kexec.h | 4 -- arch/riscv/kernel/kexec_elf.c | 11 ++++- arch/riscv/kernel/kexec_image.c | 11 ++++- arch/riscv/kernel/machine_kexec_file.c | 65 ++++++-------------------- 4 files changed, 31 insertions(+), 60 deletions(-) diff --git a/arch/riscv/include/asm/kexec.h b/arch/riscv/include/asm/kexec.h index b9ee8346cc8c..b0400de9acfd 100644 --- a/arch/riscv/include/asm/kexec.h +++ b/arch/riscv/include/asm/kexec.h @@ -69,10 +69,6 @@ struct kimage; int arch_kimage_file_post_load_cleanup(struct kimage *image); #define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup -int load_extra_segments(struct kimage *image, unsigned long kernel_start, - unsigned long kernel_len, char *initrd, - unsigned long initrd_len, char *cmdline, - unsigned long cmdline_len); #endif #endif diff --git a/arch/riscv/kernel/kexec_elf.c b/arch/riscv/kernel/kexec_elf.c index 3e9a32acb8f2..202600760f91 100644 --- a/arch/riscv/kernel/kexec_elf.c +++ b/arch/riscv/kernel/kexec_elf.c @@ -110,6 +110,12 @@ static void *elf_kexec_load(struct kimage *image, char *kernel_buf, unsigned long new_kernel_pbase = 0UL; struct elfhdr ehdr; struct kexec_elf_info elf_info; + struct kexec_load_params params = { + .initrd = initrd, + .initrd_len = initrd_len, + .cmdline = cmdline, + .cmdline_len = cmdline_len, + }; ret = kexec_build_elf_info(kernel_buf, kernel_len, &ehdr, &elf_info); if (ret) @@ -126,8 +132,9 @@ static void *elf_kexec_load(struct kimage *image, char *kernel_buf, if (ret) goto out; - ret = load_extra_segments(image, image->start, kernel_len, - initrd, initrd_len, cmdline, cmdline_len); + params.kernel_load_addr = image->start; + params.kernel_size = kernel_len; + ret = kexec_load_other_segments(image, ¶ms, true); out: kexec_free_elf_info(&elf_info); return ret ? ERR_PTR(ret) : NULL; diff --git a/arch/riscv/kernel/kexec_image.c b/arch/riscv/kernel/kexec_image.c index 51dc89259f16..e0d0aa912a76 100644 --- a/arch/riscv/kernel/kexec_image.c +++ b/arch/riscv/kernel/kexec_image.c @@ -42,6 +42,12 @@ static void *image_load(struct kimage *image, u64 flags; bool be_image, be_kernel; struct kexec_buf kbuf = {}; + struct kexec_load_params params = { + .initrd = initrd, + .initrd_len = initrd_len, + .cmdline = cmdline, + .cmdline_len = cmdline_len, + }; int ret; /* Check Image header */ @@ -83,8 +89,9 @@ static void *image_load(struct kimage *image, pr_info("Loaded kernel at 0x%lx bufsz=0x%lx memsz=0x%lx\n", kbuf.mem, kbuf.bufsz, kbuf.memsz); - ret = load_extra_segments(image, kbuf.mem, kbuf.memsz, - initrd, initrd_len, cmdline, cmdline_len); + params.kernel_load_addr = kbuf.mem; + params.kernel_size = kbuf.memsz; + ret = kexec_load_other_segments(image, ¶ms, true); out: return ret ? ERR_PTR(ret) : NULL; diff --git a/arch/riscv/kernel/machine_kexec_file.c b/arch/riscv/kernel/machine_kexec_file.c index d191351c6055..e79b71a8b7aa 100644 --- a/arch/riscv/kernel/machine_kexec_file.c +++ b/arch/riscv/kernel/machine_kexec_file.c @@ -234,51 +234,26 @@ int arch_kexec_apply_relocations_add(struct purgatory_info *pi, return 0; } - -int load_extra_segments(struct kimage *image, unsigned long kernel_start, - unsigned long kernel_len, char *initrd, - unsigned long initrd_len, char *cmdline, - unsigned long cmdline_len) +int arch_kexec_setup_other_segments(struct kimage *image, + struct kexec_load_params *params, + unsigned long initrd_load_addr) { - int ret; - void *fdt; - unsigned long initrd_pbase = 0UL; - char *modified_cmdline = NULL; + unsigned long kernel_start = params->kernel_load_addr; + char *cmdline = params->cmdline; struct kexec_buf kbuf = { .image = image, - .buf_min = kernel_start + kernel_len, + .buf_min = kernel_start + params->kernel_size, .buf_max = PFN_PHYS(max_low_pfn), }; + char *modified_cmdline = NULL; + void *fdt; + int ret; #ifdef CONFIG_CRASH_DUMP - /* Add elfcorehdr */ + /* Setup cmdline for kdump kernel case */ if (image->type == KEXEC_TYPE_CRASH) { - ret = crash_prepare_headers(true, &kbuf.buffer, &kbuf.bufsz, NULL); - if (ret) { - pr_err("Preparing elf core header failed\n"); - goto out; - } - - image->elf_headers = kbuf.buffer; - image->elf_headers_sz = kbuf.bufsz; - - kbuf.mem = KEXEC_BUF_MEM_UNKNOWN; - kbuf.memsz = kbuf.bufsz; - kbuf.buf_align = ELF_CORE_HEADER_ALIGN; - kbuf.top_down = true; - - ret = kexec_add_buffer(&kbuf); - if (ret) - goto out; - - image->elf_load_addr = kbuf.mem; - - kexec_dprintk("Loaded elf core header at 0x%lx bufsz=0x%lx memsz=0x%lx\n", - image->elf_load_addr, kbuf.bufsz, kbuf.memsz); - - /* Setup cmdline for kdump kernel case */ modified_cmdline = setup_kdump_cmdline(image, cmdline, - cmdline_len); + params->cmdline_len); if (!modified_cmdline) { pr_err("Setting up cmdline for kdump kernel failed\n"); ret = -EINVAL; @@ -306,23 +281,9 @@ int load_extra_segments(struct kimage *image, unsigned long kernel_start, pr_err("Error update purgatory ret=%d\n", ret); #endif /* CONFIG_ARCH_SUPPORTS_KEXEC_PURGATORY */ - /* Add the initrd to the image */ - if (initrd != NULL) { - kbuf.buffer = initrd; - kbuf.bufsz = kbuf.memsz = initrd_len; - kbuf.buf_align = PAGE_SIZE; - kbuf.top_down = true; - kbuf.mem = KEXEC_BUF_MEM_UNKNOWN; - ret = kexec_add_buffer(&kbuf); - if (ret) - goto out; - initrd_pbase = kbuf.mem; - kexec_dprintk("Loaded initrd at 0x%lx\n", initrd_pbase); - } - /* Add the DTB to the image */ - fdt = of_kexec_alloc_and_setup_fdt(image, initrd_pbase, - initrd_len, cmdline, 0); + fdt = of_kexec_alloc_and_setup_fdt(image, initrd_load_addr, + params->initrd_len, cmdline, 0); if (!fdt) { pr_err("Error setting up the new device tree.\n"); ret = -EINVAL; -- 2.34.1
