Add kexec_file support for LoongArch
Subsystems (4)
v4 cover Add kexec_file support for LoongArch
From: Youling Tang <[email protected]>
This patchset implement kexec_file_load() support on LoongArch.
This patch series enables us to load the LoongArch vmlinuz.efi(pez) or vmlinux.efi(pei) or vmlinux(elf) by specifying its file decriptor, instead of user-filled buffer via kexec_load() syscall.
To use kexec_file_load() system call, instead of kexec_load(), at kexec command, '-s' options must be specified. kexec-tools needs to apply the corresponding patches. These patches can be found in repository [1] and will be submitted to the kexec-tools community later.
The basic usage of kexec_file is:
1) Load second kernel image:
# kexec -s -l vmlinuz.efi --initrd=initrd.img --reuse-cmdline
2) Startup second kernel:
# kexec -e
For kdump:
1) Load capture kernel image:
# kexec -s -p vmlinuz.efi --initrd=initrd.img --reuse-cmdline
2) Do something to crash, like:
# echo c > /proc/sysrq-trigger
Link:
[1] https://github.com/tangyouling/kexec-tools/commits/main/
Changelog:
v4:
* Add the character "kexec_file" to the command-line parameter.
* Fixed the issue where kexec_file failed to load the KASLR kernel startup.
* Modify the member name of the loongarch_image_header structure.
* Modify the patch commit message.
v3:
* The ELF format kernel loading should not use loongarch_image_header.
* Separate patch2 into an infrastructure patch and an EFI support patch.
* Adding that kexec_file cannot load non-relocation kernel comments.
* Some minor modifications.
v2:
* Merge some patches.
* Add support for ELF format images.
* Rename kexec_image.c to kexec_efi.c .
* When KEXEC_FILE is enabled, RELOCATABLE is selected by default.
* Some minor modifications.
Youling Tang (7):
LoongArch: Add struct loongarch_image_header for kernel image
LoongArch: Add preparatory infrastructure for kexec_file LoongArch/kexec_file: Support loading EFI binary file LoongArch/kexec_file: Support loading ELF binary file LoongArch/kexec_file: Add crash dump support
LoongArch: Automatically disable kaslr when the kernel loads from
kexec_file
LoongArch: Enable CONFIG_KEXEC_FILE
arch/loongarch/Kconfig | 10 + arch/loongarch/configs/loongson3_defconfig | 1 + arch/loongarch/include/asm/image.h | 53 +++++ arch/loongarch/include/asm/kexec.h | 13 ++ arch/loongarch/kernel/Makefile | 1 + arch/loongarch/kernel/kexec_efi.c | 114 ++++++++++ arch/loongarch/kernel/kexec_elf.c | 105 +++++++++ arch/loongarch/kernel/machine_kexec.c | 37 ++-- arch/loongarch/kernel/machine_kexec_file.c | 244 +++++++++++++++++++++ arch/loongarch/kernel/relocate.c | 4 + 10 files changed, 569 insertions(+), 13 deletions(-) create mode 100644 arch/loongarch/include/asm/image.h create mode 100644 arch/loongarch/kernel/kexec_efi.c create mode 100644 arch/loongarch/kernel/kexec_elf.c create mode 100644 arch/loongarch/kernel/machine_kexec_file.c
Signature · 1 line
2.43.0
PATCH v4 1/7 LoongArch: Add struct loongarch_image_header for kernel image
From: Youling Tang <[email protected]>
Define a dedicated image header structure for LoongArch architecture to standardize kernel loading in bootloaders (primarily for kexec_file).
This header includes critical metadata such as PE signature, entry points, image size and load address offset, etc.
--- arch/loongarch/include/asm/image.h | 36 ++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 arch/loongarch/include/asm/image.h
arch/loongarch/include/asm/image.h new file +36 -0
@@ -0,0 +1,36 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* +* LoongArch binary image header for EFI(PE/COFF) format. +* +* Author: Youling Tang <[email protected]> +* Copyright (C) 2025 KylinSoft Corporation. +*/ + +#ifndef __ASM_IMAGE_H +#define __ASM_IMAGE_H +#ifndef __ASSEMBLER__ + +/** +* struct loongarch_image_header +* +* @dos_sig: Optional PE format 'MZ' signature. +* @padding_1: Reserved. +* @kernel_entry: Kernel image entry pointer. +* @kernel_asize: An estimated size of the memory image size in LSB byte order. +* @text_offset: The image load offset in LSB byte order. +* @padding_2: Reserved. +* @pe_header: Optional offset to a PE format header. +**/ + +struct loongarch_image_header { +uint8_t dos_sig[2 ]; +uint16_t padding_1[3 ]; +uint64_t kernel_entry; +uint64_t kernel_asize; +uint64_t text_offset; +uint32_t padding_2[7 ]; +uint32_t pe_header; +}; + +#endif /* __ASSEMBLER__ */ +#endif /* __ASM_IMAGE_H */
Signature · 1 line
2.43.0
PATCH v4 2/7 LoongArch: Add preparatory infrastructure for kexec_file
In reply to Youling TangFrom: Youling Tang <[email protected]>
Add some preparatory infrastructure:
- Add support for loading other segments.
- Add command line processing.
- Other minor modifications.
This initrd will be passed to the second kernel via the command line 'initrd=start,size'.
The 'kexec_file' command line parameter indicates that the kernel is loaded via kexec_file.
--- arch/loongarch/Kconfig | 9 ++ arch/loongarch/include/asm/kexec.h | 11 ++ arch/loongarch/kernel/Makefile | 1 + arch/loongarch/kernel/machine_kexec.c | 37 +++--- arch/loongarch/kernel/machine_kexec_file.c | 126 +++++++++++++++++++++ 5 files changed, 171 insertions(+), 13 deletions(-) create mode 100644 arch/loongarch/kernel/machine_kexec_file.c
arch/loongarch/Kconfig +9 -0
@@ -625,6 +625,15 @@ config CPU_HAS_PREFETCH config ARCH_SUPPORTS_KEXEC def_bool y +config ARCH_SUPPORTS_KEXEC_FILE + def_bool 64BIT + +config ARCH_SELECTS_KEXEC_FILE + def_bool y + depends on KEXEC_FILE + select HAVE_IMA_KEXEC if IMA + select RELOCATABLE + config ARCH_SUPPORTS_CRASH_DUMP def_bool y
arch/loongarch/include/asm/kexec.h +11 -0
@@ -41,6 +41,17 @@ struct kimage_arch {unsigned long systable_ptr; }; +#ifdef CONFIG_KEXEC_FILE + +int arch_kimage_file_post_load_cleanup (struct kimage *image); +#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup + +extern int load_other_segments (struct kimage *image, +unsigned long kernel_load_addr,unsigned long kernel_size, +char *initrd,unsigned long initrd_len, +char *cmdline,unsigned long cmdline_len); +#endif + typedef void (*do_kexec_t)(unsigned long efi_boot, unsigned long cmdline_ptr, unsigned long systable_ptr,
arch/loongarch/kernel/Makefile +1 -0
@@ -62,6 +62,7 @@ obj-$(CONFIG_MAGIC_SYSRQ) += sysrq.o obj-$(CONFIG_RELOCATABLE) += relocate.o obj-$(CONFIG_KEXEC_CORE) += machine_kexec.o relocate_kernel.o +obj-$(CONFIG_KEXEC_FILE) += machine_kexec_file.o obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o
arch/loongarch/kernel/machine_kexec.c +24 -13
@@ -70,18 +70,28 @@ int machine_kexec_prepare(struct kimage *kimage) kimage->arch.efi_boot = fw_arg0; kimage->arch.systable_ptr = fw_arg2; -/* Find the command line */ -for (i =0 ; i < kimage->nr_segments; i++) { -if (!strncmp (bootloader, (char __user *)kimage->segment[i].buf,strlen (bootloader))) { -if (!copy_from_user (cmdline_ptr, kimage->segment[i].buf,COMMAND_LINE_SIZE )) - kimage->arch.cmdline_ptr = (unsigned long )cmdline_ptr; -break ; +if (kimage->file_mode ==1 ) { +/* +* kimage->cmdline_buf will be released in kexec_file_load, so copy to +* the KEXEC_CMDLINE_ADDR safe area. +*/ +memcpy ((void *)KEXEC_CMDLINE_ADDR , (void *)kimage->arch.cmdline_ptr, +strlen ((char *)kimage->arch.cmdline_ptr) +1 ); + kimage->arch.cmdline_ptr = (unsigned long )KEXEC_CMDLINE_ADDR ; + }else { +/* Find the command line */ +for (i =0 ; i < kimage->nr_segments; i++) { +if (!strncmp (bootloader, (char __user *)kimage->segment[i].buf,strlen (bootloader))) { +if (!copy_from_user (cmdline_ptr, kimage->segment[i].buf,COMMAND_LINE_SIZE )) + kimage->arch.cmdline_ptr = (unsigned long )cmdline_ptr; +break ; + } } - } -if (!kimage->arch.cmdline_ptr) { -pr_err ("Command line not included in the provided image\n" ); -return -EINVAL ; +if (!kimage->arch.cmdline_ptr) { +pr_err ("Command line not included in the provided image\n" ); +return -EINVAL ; + } }/* kexec/kdump need a safe page to save reboot_code_buffer */
@@ -287,9 +297,10 @@ void machine_kexec(struct kimage *image)/* We do not want to be bothered. */ local_irq_disable (); -pr_notice ("EFI boot flag 0x%lx\n" , efi_boot); -pr_notice ("Command line at 0x%lx\n" , cmdline_ptr); -pr_notice ("System table at 0x%lx\n" , systable_ptr); +pr_notice ("EFI boot flag: 0x%lx\n" , efi_boot); +pr_notice ("Command line addr: 0x%lx\n" , cmdline_ptr); +pr_notice ("Command line string: %s\n" , (char *)cmdline_ptr); +pr_notice ("System table addr: 0x%lx\n" , systable_ptr);pr_notice ("We will call new kernel at 0x%lx\n" , start_addr);pr_notice ("Bye ...\n" );
arch/loongarch/kernel/machine_kexec_file.c new file +126 -0
126 lines not on this page · raw message
Signature · 1 line
2.43.0
PATCH v4 3/7 LoongArch/kexec_file: Support loading EFI binary file
In reply to Youling TangFrom: Youling Tang <[email protected]>
This patch creates kexec_efi_ops to load EFI binary file for kexec_file_load() syscall.
The efi_kexec_load() as two parts:
- the first part loads the kernel image (vmlinuz.efi or vmlinux.efi)
- the second part loads other segments (eg: initrd, cmdline)
Currently, pez(vmlinuz.efi) and pei(vmlinux.efi) format images are supported.
The basic usage (vmlinuz.efi or vmlinux.efi):
1) Load second kernel image:
# kexec -s -l vmlinuz.efi --initrd=initrd.img --reuse-cmdline
2) Startup second kernel:
# kexec -e
--- arch/loongarch/include/asm/image.h | 17 +++ arch/loongarch/include/asm/kexec.h | 1 + arch/loongarch/kernel/Makefile | 2 +- arch/loongarch/kernel/kexec_efi.c | 114 +++++++++++++++++++++ arch/loongarch/kernel/machine_kexec_file.c | 1 + 5 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 arch/loongarch/kernel/kexec_efi.c
arch/loongarch/include/asm/image.h +17 -0
@@ -32,5 +32,22 @@ struct loongarch_image_header {uint32_t pe_header; }; +static const uint8_t loongarch_image_dos_sig[2 ] = {'M' ,'Z' }; + +/** +* loongarch_header_check_dos_sig - Helper to check the loongarch image header. +* +* Returns non-zero if 'MZ' signature is found. +*/ + +static inline int loongarch_header_check_dos_sig (const struct loongarch_image_header *h) +{ +if (!h) +return 0 ; + +return (h->dos_sig[0 ] == loongarch_image_dos_sig[0 ] + && h->dos_sig[1 ] == loongarch_image_dos_sig[1 ]); +} +#endif /* __ASSEMBLER__ */ #endif /* __ASM_IMAGE_H */
arch/loongarch/include/asm/kexec.h +1 -0
@@ -42,6 +42,7 @@ struct kimage_arch { };#ifdef CONFIG_KEXEC_FILE +extern const struct kexec_file_ops kexec_efi_ops;int arch_kimage_file_post_load_cleanup (struct kimage *image);#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
arch/loongarch/kernel/Makefile +1 -1
@@ -62,7 +62,7 @@ obj-$(CONFIG_MAGIC_SYSRQ) += sysrq.o obj-$(CONFIG_RELOCATABLE) += relocate.o obj-$(CONFIG_KEXEC_CORE) += machine_kexec.o relocate_kernel.o -obj-$(CONFIG_KEXEC_FILE) += machine_kexec_file.o +obj-$(CONFIG_KEXEC_FILE) += machine_kexec_file.o kexec_efi.o obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o
arch/loongarch/kernel/kexec_efi.c new file +114 -0
114 lines not on this page · raw message
arch/loongarch/kernel/machine_kexec_file.c +1 -0
@@ -21,6 +21,7 @@#include <asm/bootinfo.h> const struct kexec_file_ops *const kexec_file_loaders[] = { + &kexec_efi_ops,NULL };
Signature · 1 line
2.43.0
PATCH v4 4/7 LoongArch/kexec_file: Support loading ELF binary file
In reply to Youling TangFrom: Youling Tang <[email protected]>
This patch creates kexec_elf_ops to load ELF binary file for kexec_file_load() syscall.
However, for kbuf->memsz and kbuf->buf_min, special handling is required, and the generic kexec_elf_load() cannot be used directly.
$ readelf -l vmlinux
...
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
LOAD 0x0000000000010000 0x9000000000200000 0x9000000000200000
0x0000000002747a00 0x000000000287a0d8 RWE 0x10000
NOTE 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 R 0x8phdr->p_paddr should have been a physical address, but it is a virtual address on the current LoongArch. This will cause kexec_file to fail when loading the kernel and need to be converted to a physical address.
From the above MemSiz, it can be seen that 0x287a0d8 has not been aligned. Although kexec_add_buffer() will perform PAGE_SIZE alignment on kbuf->memsz, there is still a stampeding in the loaded kernel space and initrd space. The initrd resolution failed when starting the second kernel.
It can be known from the link script vmlinux.lds.S that,
BSS_SECTION(0, SZ_64K, 8)
. = ALIGN(PECOFF_SEGMENT_ALIGN);It needs to be aligned according to the SZ_64K size, so that after alignment, its size is consistent with _kernel_asize.
The basic usage (vmlinux):
1) Load second kernel image:
# kexec -s -l vmlinux --initrd=initrd.img --reuse-cmdline
2) Startup second kernel:
# kexec -e
--- arch/loongarch/Kconfig | 1 + arch/loongarch/include/asm/kexec.h | 1 + arch/loongarch/kernel/Makefile | 2 +- arch/loongarch/kernel/kexec_elf.c | 105 +++++++++++++++++++++ arch/loongarch/kernel/machine_kexec_file.c | 1 + 5 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 arch/loongarch/kernel/kexec_elf.c
arch/loongarch/Kconfig +1 -0
@@ -632,6 +632,7 @@ config ARCH_SELECTS_KEXEC_FILE def_bool y depends on KEXEC_FILE select HAVE_IMA_KEXEC if IMA + select KEXEC_ELF select RELOCATABLE config ARCH_SUPPORTS_CRASH_DUMP
arch/loongarch/include/asm/kexec.h +1 -0
@@ -43,6 +43,7 @@ struct kimage_arch {#ifdef CONFIG_KEXEC_FILE extern const struct kexec_file_ops kexec_efi_ops; +extern const struct kexec_file_ops kexec_elf_ops;int arch_kimage_file_post_load_cleanup (struct kimage *image);#define arch_kimage_file_post_load_cleanup arch_kimage_file_post_load_cleanup
arch/loongarch/kernel/Makefile +1 -1
@@ -62,7 +62,7 @@ obj-$(CONFIG_MAGIC_SYSRQ) += sysrq.o obj-$(CONFIG_RELOCATABLE) += relocate.o obj-$(CONFIG_KEXEC_CORE) += machine_kexec.o relocate_kernel.o -obj-$(CONFIG_KEXEC_FILE) += machine_kexec_file.o kexec_efi.o +obj-$(CONFIG_KEXEC_FILE) += machine_kexec_file.o kexec_efi.o kexec_elf.o obj-$(CONFIG_CRASH_DUMP) += crash_dump.o obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o
arch/loongarch/kernel/kexec_elf.c new file +105 -0
105 lines not on this page · raw message
arch/loongarch/kernel/machine_kexec_file.c +1 -0
@@ -22,6 +22,7 @@const struct kexec_file_ops *const kexec_file_loaders[] = { &kexec_efi_ops, + &kexec_elf_ops,NULL };
Signature · 1 line
2.43.0
PATCH v4 5/7 LoongArch/kexec_file: Add crash dump support
In reply to Youling TangFrom: Youling Tang <[email protected]>
Enabling crash dump (kdump) includes:
- Prepare contents of ELF header of a core dump file, /proc/vmcore, using crash_prepare_elf64_headers().
- Add "elfcorehdr=size@start" to cmdline.
- Add the "mem=size@start" parameter to the command line and pass it to the capture kernel. Limit the runtime memory area of the captured kernel to avoid disrupting the production kernel's runtime state.
The basic usage for kdump(add the cmdline parameter crashkernel=512M to grub.cfg):
1) Load capture kernel image(vmlinux.efi or vmlinux can also be used):
# kexec -s -p vmlinuz.efi --initrd=initrd.img --reuse-cmdline
2) Do something to crash, like:
# echo c > /proc/sysrq-trigger
--- arch/loongarch/kernel/machine_kexec_file.c | 116 +++++++++++++++++++++ 1 file changed, 116 insertions(+)
arch/loongarch/kernel/machine_kexec_file.c +116 -0
@@ -35,6 +35,82 @@ int arch_kimage_file_post_load_cleanup(struct kimage *image)return kexec_image_post_load_cleanup_default (image); } +#ifdef CONFIG_CRASH_DUMP + +static int prepare_elf_headers (void **addr,unsigned long *sz) +{ +struct crash_mem *cmem; +unsigned int nr_ranges; +int ret; +u64 i; +phys_addr_t start, end; + + nr_ranges =2 ;/* for exclusion of crashkernel region */ +for_each_mem_range (i, &start, &end) + nr_ranges++; + + cmem =kmalloc (struct_size (cmem, ranges, nr_ranges),GFP_KERNEL ); +if (!cmem) +return -ENOMEM ; + + cmem->max_nr_ranges = nr_ranges; + cmem->nr_ranges =0 ; +for_each_mem_range (i, &start, &end) { + cmem->ranges[cmem->nr_ranges].start = start; + cmem->ranges[cmem->nr_ranges].end = end -1 ; + cmem->nr_ranges++; + } + +/* Exclude crashkernel region */ + ret =crash_exclude_mem_range (cmem, crashk_res.start, crashk_res.end); +if (ret) + goto out; + +if (crashk_low_res.end) { + ret =crash_exclude_mem_range (cmem, crashk_low_res.start, crashk_low_res.end); +if (ret) + goto out; + } + + ret =crash_prepare_elf64_headers (cmem, true, addr, sz); + +out: +kfree (cmem); +return ret; +} + +/* Adds the "elfcorehdr=size@start" command line parameter to command line. */ +static void cmdline_add_elfcorehdr (struct kimage *image,unsigned long *cmdline_tmplen, +char *modified_cmdline,unsigned long elfcorehdr_sz) +{ +int elfcorehdr_strlen =0 ; + + elfcorehdr_strlen =sprintf (modified_cmdline + (*cmdline_tmplen),"elfcorehdr=0x%lx@0x%lx " , + elfcorehdr_sz, image->elf_load_addr); + *cmdline_tmplen += elfcorehdr_strlen; +} + +/* +* Adds the "mem=size@start" command line parameter to command line, indicating the +* memory region the new kernel can use to boot into. +*/ +static void cmdline_add_mem (unsigned long *cmdline_tmplen,char *modified_cmdline) +{ +int mem_strlen =0 ; + + mem_strlen =sprintf (modified_cmdline + (*cmdline_tmplen),"mem=0x%llx@0x%llx " , + crashk_res.end - crashk_res.start +1 , crashk_res.start); + *cmdline_tmplen += mem_strlen; + +if (crashk_low_res.end) { + mem_strlen =sprintf (modified_cmdline + (*cmdline_tmplen),"mem=0x%llx@0x%llx " , + crashk_low_res.end - crashk_low_res.start +1 , crashk_low_res.start); + *cmdline_tmplen += mem_strlen; + } +} + +#endif +/* Adds the "initrd=start,size" command line parameter to command line. */ static void cmdline_add_initrd (struct kimage *image,unsigned long *cmdline_tmplen,char *modified_cmdline,unsigned long initrd)
@@ -86,6 +162,46 @@ int load_other_segments(struct kimage *image,/* Ensure it's null terminated */ modified_cmdline[COMMAND_LINE_SIZE -1 ] ='\0' ; +#ifdef CONFIG_CRASH_DUMP +/* load elf core header */ +void *headers; +unsigned long headers_sz; + +if (image->type ==KEXEC_TYPE_CRASH ) { + ret =prepare_elf_headers (&headers, &headers_sz); +if (ret) { +pr_err ("Preparing elf core header failed\n" ); + goto out_err; + } + + kbuf.buffer = headers; + kbuf.bufsz = headers_sz; + kbuf.mem =KEXEC_BUF_MEM_UNKNOWN ; + kbuf.memsz = headers_sz; + kbuf.buf_align =SZ_64K ;/* largest supported page size */ + kbuf.buf_max =ULONG_MAX ; + kbuf.top_down = true; + + ret =kexec_add_buffer (&kbuf); +if (ret) { +vfree (headers); + goto out_err; + } + image->elf_headers = headers; + image->elf_load_addr = kbuf.mem; + image->elf_headers_sz = headers_sz; + +kexec_dprintk ("Loaded elf core header at 0x%lx bufsz=0x%lx memsz=0x%lx\n" , + image->elf_load_addr, kbuf.bufsz, kbuf.memsz); + +/* Add the elfcorehdr=size@start parameter to the command line */ +cmdline_add_elfcorehdr (image, &cmdline_tmplen, modified_cmdline, headers_sz); + +/* Add the mem=size@start parameter to the command line */ +cmdline_add_mem (&cmdline_tmplen, modified_cmdline); + } +#endif +/* load initrd */ if (initrd) { kbuf.buffer = initrd;
Signature · 1 line
2.43.0
PATCH v4 6/7 LoongArch: Automatically disable kaslr when the kernel loads from kexec_file
In reply to Youling TangFrom: Youling Tang <[email protected]>
Automatically disable kaslr when the kernel loads from kexec_file.
kexec_file loads the secondary kernel image to a non-linked address, inherently providing KASLR-like randomization.
However, on LoongArch where System RAM may be non-contiguous, enabling KASLR for the second kernel could relocate it to an invalid memory region and cause boot failure. Thus, we disable KASLR when "kexec_file" is detected in the command line.
To ensure compatibility with older kernels loaded via kexec_file, this patch need be backported to stable branches.
--- arch/loongarch/kernel/relocate.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/loongarch/kernel/relocate.c +4 -0
@@ -140,6 +140,10 @@ static inline __init bool kaslr_disabled(void)if (str == boot_command_line || (str > boot_command_line && *(str -1 ) ==' ' ))return true; + str =strstr (boot_command_line,"kexec_file" ); +if (str == boot_command_line || (str > boot_command_line && *(str -1 ) ==' ' )) +return true; +#ifdef CONFIG_HIBERNATION str =strstr (builtin_cmdline,"nohibernate" );if (str == builtin_cmdline || (str > builtin_cmdline && *(str -1 ) ==' ' ))
Signature · 1 line
2.43.0
PATCH v4 7/7 LoongArch: Enable CONFIG_KEXEC_FILE
In reply to Youling TangFrom: Youling Tang <[email protected]>
This patch enables config KEXEC_FILE by default in the loongson3_defconfig, so that user-space tools like kexec-tools can use the same as the default interface for kexec/kdump on LoongArch.
--- arch/loongarch/configs/loongson3_defconfig | 1 + 1 file changed, 1 insertion(+)
arch/loongarch/configs/loongson3_defconfig +1 -0
@@ -45,6 +45,7 @@ CONFIG_EXPERT=y CONFIG_KALLSYMS_ALL=y CONFIG_PERF_EVENTS=y CONFIG_KEXEC=y +CONFIG_KEXEC_FILE=y CONFIG_CRASH_DUMP=y CONFIG_LOONGARCH=y CONFIG_64BIT=y
Signature · 1 line
2.43.0
Huacai Chen
maintainerApplied with some modifications. You may need to test whether everything is OK.
https://github.com/chenhuacai/linux/commits/loongarch-next
Huacai
Quoted 82 lines · Youling Tang
From: Youling Tang <[email protected]>
This patchset implement
kexec_file_load()support on LoongArch.This patch series enables us to load the LoongArch
vmlinuz.efi(pez)orvmlinux.efi(pei)or vmlinux(elf) by specifying its file decriptor, instead of user-filled buffer viakexec_load()syscall.To use
kexec_file_load()system call, instead ofkexec_load(), at kexec command, '-s' options must be specified. kexec-tools needs to apply the corresponding patches. These patches can be found in repository [1] and will be submitted to the kexec-tools community later.The basic usage of
kexec_fileis:
1) Load second kernel image:# kexec -s -l vmlinuz.efi --initrd=initrd.img --reuse-cmdline2) Startup second kernel:
# kexec -eFor kdump:
1) Load capture kernel image:# kexec -s -p vmlinuz.efi --initrd=initrd.img --reuse-cmdline2) Do something to crash, like:
# echo c > /proc/sysrq-triggerLink:
[1] https://github.com/tangyouling/kexec-tools/commits/main/Changelog:
v4:
* Add the character "kexec_file" to the command-line parameter.
* Fixed the issue wherekexec_filefailed to load the KASLR kernel startup.
* Modify the member name of theloongarch_image_headerstructure.
* Modify the patch commit message.v3:
* The ELF format kernel loading should not useloongarch_image_header.
* Separate patch2 into an infrastructure patch and an EFI support patch.
* Adding thatkexec_filecannot load non-relocation kernel comments.
* Some minor modifications.v2:
* Merge some patches.
* Add support for ELF format images.
* Renamekexec_image.ctokexec_efi.c.
* WhenKEXEC_FILEis enabled, RELOCATABLE is selected by default.
* Some minor modifications.Youling Tang (7):
LoongArch: Add structloongarch_image_headerfor kernel image
LoongArch: Add preparatory infrastructure forkexec_fileLoongArch/kexec_file: Support loading EFI binary file LoongArch/kexec_file: Support loading ELF binary file LoongArch/kexec_file: Add crash dump support
LoongArch: Automatically disable kaslr when the kernel loads from
kexec_file
LoongArch: EnableCONFIG_KEXEC_FILEarch/loongarch/Kconfig | 10 + arch/loongarch/configs/loongson3_defconfig | 1 + arch/loongarch/include/asm/image.h | 53 +++++ arch/loongarch/include/asm/kexec.h | 13 ++ arch/loongarch/kernel/Makefile | 1 + arch/loongarch/kernel/kexec_efi.c | 114 ++++++++++ arch/loongarch/kernel/kexec_elf.c | 105 +++++++++ arch/loongarch/kernel/machine_kexec.c | 37 ++-- arch/loongarch/kernel/machine_kexec_file.c | 244 +++++++++++++++++++++ arch/loongarch/kernel/relocate.c | 4 + 10 files changed, 569 insertions(+), 13 deletions(-) create mode 100644 arch/loongarch/include/asm/image.h create mode 100644 arch/loongarch/kernel/kexec_efi.c create mode 100644 arch/loongarch/kernel/kexec_elf.c create mode 100644 arch/loongarch/kernel/machine_kexec_file.c--
2.43.0