load_elfcorehdr_segment() builds the elf core header from the powerpc crash memory ranges and places it as a segment. The header needs powerpc specific post processing, so keep building it here, but use kexec_add_elf_core_header() to place it.
elf64_load() also loads the initrd by hand, use kexec_add_initrd() for it. Cc: Michael Ellerman <[email protected]> Cc: Nicholas Piggin <[email protected]> Cc: Christophe Leroy <[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/powerpc/kexec/elf_64.c | 9 ++------- arch/powerpc/kexec/file_load_64.c | 14 ++++---------- 2 files changed, 6 insertions(+), 17 deletions(-) diff --git a/arch/powerpc/kexec/elf_64.c b/arch/powerpc/kexec/elf_64.c index d9a466cd602e..1ef444494641 100644 --- a/arch/powerpc/kexec/elf_64.c +++ b/arch/powerpc/kexec/elf_64.c @@ -96,18 +96,13 @@ static void *elf64_load(struct kimage *image, char *kernel_buf, kexec_dprintk("Command line: %s", cmdline ? cmdline : ""); - if (initrd != NULL) { - kbuf.buffer = initrd; - kbuf.bufsz = kbuf.memsz = initrd_len; + if (initrd) { kbuf.buf_align = PAGE_SIZE; kbuf.top_down = false; - kbuf.mem = KEXEC_BUF_MEM_UNKNOWN; - ret = kexec_add_buffer(&kbuf); + ret = kexec_add_initrd(image, &kbuf); if (ret) goto out; initrd_load_addr = kbuf.mem; - - kexec_dprintk("Loaded initrd at 0x%lx\n", initrd_load_addr); } ret = get_reserved_memory_ranges(&rmem); diff --git a/arch/powerpc/kexec/file_load_64.c b/arch/powerpc/kexec/file_load_64.c index 0cf03cee35a7..77652db7d1ca 100644 --- a/arch/powerpc/kexec/file_load_64.c +++ b/arch/powerpc/kexec/file_load_64.c @@ -416,9 +416,8 @@ static int load_elfcorehdr_segment(struct kimage *image, struct kexec_buf *kbuf) /* Fix the offset for backup region in the ELF header */ sync_backup_region_phdr(image, headers, false); - kbuf->buffer = headers; - kbuf->mem = KEXEC_BUF_MEM_UNKNOWN; - kbuf->bufsz = headers_sz; + image->elf_headers = headers; + image->elf_headers_sz = headers_sz; /* * Account for extra space required to accommodate additional memory @@ -427,13 +426,9 @@ static int load_elfcorehdr_segment(struct kimage *image, struct kexec_buf *kbuf) kbuf->memsz = headers_sz + kdump_extra_elfcorehdr_size(cmem); kbuf->top_down = false; - ret = kexec_add_buffer(kbuf); - if (ret) { - vfree(headers); + ret = kexec_add_elf_core_header(image, kbuf); + if (ret) goto out; - } - - image->elf_load_addr = kbuf->mem; /* * If CONFIG_CRASH_HOTPLUG is enabled, the elfcorehdr kexec segment @@ -442,7 +437,6 @@ static int load_elfcorehdr_segment(struct kimage *image, struct kexec_buf *kbuf) * memory in the FDT prepared for kdump. */ image->elf_headers_sz = kbuf->memsz; - image->elf_headers = headers; out: kfree(cmem); return ret; -- 2.34.1
