mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-12-27 12:21:22 -05:00
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 0x8
phdr->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 isn't page 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 SZ_64K, 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
Signed-off-by: Youling Tang <tangyouling@kylinos.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
83 lines
2.4 KiB
Makefile
83 lines
2.4 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# Makefile for the Linux/LoongArch kernel.
|
|
#
|
|
|
|
OBJECT_FILES_NON_STANDARD_head.o := y
|
|
|
|
always-$(KBUILD_BUILTIN) := vmlinux.lds
|
|
|
|
obj-y += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \
|
|
traps.o irq.o idle.o process.o dma.o mem.o reset.o switch.o \
|
|
elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o \
|
|
alternative.o kdebugfs.o unwind.o
|
|
|
|
obj-$(CONFIG_ACPI) += acpi.o
|
|
obj-$(CONFIG_EFI) += efi.o
|
|
|
|
obj-$(CONFIG_CPU_HAS_FPU) += fpu.o kfpu.o
|
|
|
|
obj-$(CONFIG_CPU_HAS_LBT) += lbt.o
|
|
|
|
obj-$(CONFIG_ARCH_STRICT_ALIGN) += unaligned.o
|
|
|
|
CFLAGS_module.o += $(call cc-disable-warning, override-init)
|
|
CFLAGS_syscall.o += $(call cc-disable-warning, override-init)
|
|
CFLAGS_traps.o += $(call cc-disable-warning, override-init)
|
|
CFLAGS_perf_event.o += $(call cc-disable-warning, override-init)
|
|
|
|
ifdef CONFIG_FUNCTION_TRACER
|
|
ifndef CONFIG_DYNAMIC_FTRACE
|
|
obj-y += mcount.o ftrace.o
|
|
CFLAGS_REMOVE_ftrace.o = $(CC_FLAGS_FTRACE)
|
|
else
|
|
obj-y += mcount_dyn.o ftrace_dyn.o
|
|
CFLAGS_REMOVE_ftrace_dyn.o = $(CC_FLAGS_FTRACE)
|
|
endif
|
|
CFLAGS_REMOVE_inst.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_time.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_perf_event.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_rethook.o = $(CC_FLAGS_FTRACE)
|
|
CFLAGS_REMOVE_rethook_trampoline.o = $(CC_FLAGS_FTRACE)
|
|
endif
|
|
|
|
KASAN_SANITIZE_efi.o := n
|
|
KASAN_SANITIZE_cpu-probe.o := n
|
|
KASAN_SANITIZE_traps.o := n
|
|
KASAN_SANITIZE_smp.o := n
|
|
KASAN_SANITIZE_vdso.o := n
|
|
|
|
obj-$(CONFIG_MODULES) += module.o module-sections.o
|
|
obj-$(CONFIG_STACKTRACE) += stacktrace.o
|
|
|
|
obj-$(CONFIG_PROC_FS) += proc.o
|
|
obj-$(CONFIG_PARAVIRT) += paravirt.o
|
|
|
|
obj-$(CONFIG_SMP) += smp.o
|
|
|
|
obj-$(CONFIG_NUMA) += numa.o
|
|
|
|
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 kexec_elf.o
|
|
obj-$(CONFIG_CRASH_DUMP) += crash_dump.o
|
|
|
|
obj-$(CONFIG_UNWINDER_GUESS) += unwind_guess.o
|
|
obj-$(CONFIG_UNWINDER_PROLOGUE) += unwind_prologue.o
|
|
obj-$(CONFIG_UNWINDER_ORC) += unwind_orc.o
|
|
|
|
obj-$(CONFIG_PERF_EVENTS) += perf_event.o perf_regs.o
|
|
obj-$(CONFIG_HAVE_HW_BREAKPOINT) += hw_breakpoint.o
|
|
|
|
obj-$(CONFIG_KGDB) += kgdb.o
|
|
obj-$(CONFIG_KPROBES) += kprobes.o
|
|
obj-$(CONFIG_RETHOOK) += rethook.o rethook_trampoline.o
|
|
obj-$(CONFIG_UPROBES) += uprobes.o
|
|
|
|
obj-$(CONFIG_JUMP_LABEL) += jump_label.o
|
|
|
|
CPPFLAGS_vmlinux.lds := $(KBUILD_CFLAGS)
|