Re: [PATCH v4 5/5] RISC-V: Add crash kernel support
From: Geert Uytterhoeven <geert@linux-m68k.org>
Date: 2021-06-15 13:19:44
Also in:
linux-riscv, lkml
Hi Nick,
CC rob, dt
Thanks for your patch, which is now commit 5640975003d0234d ("RISC-V:
Add crash kernel support") in v5.13-rc1.
On Mon, Apr 19, 2021 at 2:56 AM Nick Kossifidis [off-list ref] wrote:This patch allows Linux to act as a crash kernel for use with kdump. Userspace will let the crash kernel know about the memory region it can use through linux,usable-memory property on the /memory node (overriding its reg property), and about the memory region where the elf core header of the previous kernel is saved, through a reserved-memory node with a compatible string of "linux,elfcorehdr". This approach is the least invasive and re-uses functionality already present.
This does not match https://github.com/devicetree-org/dt-schema/blob/master/schemas/chosen.yaml#L77: $ref: types.yaml#/definitions/uint64-array maxItems: 2 description: This property (currently used only on arm64) holds the memory range, the address and the size, of the elf core header which mainly describes the panicked kernel\'s memory layout as PT_LOAD segments of elf format. Hence "linux,elfcorehdr" should be a property of the /chosen node, instead of a memory node with a compatible value of "linux,elfcorehdr".
I tested this on riscv64 qemu and it works as expected, you may test it by retrieving the dmesg of the previous kernel through /proc/vmcore, using the vmcore-dmesg utility from kexec-tools. v4: * Rebase on top of "fixes" branch v3: * Rebase v2: * Use linux,usable-memory on /memory instead of a new binding
This part seems to have been removed in v3 and later? Note that "linux,usable-memory-range" should be a property of the /chosen node, too, cfr. https://github.com/devicetree-org/dt-schema/blob/master/schemas/chosen.yaml#L85
* Use a reserved-memory node for ELF core header Signed-off-by: Nick Kossifidis <redacted>
quoted hunk
--- a/arch/riscv/mm/init.c +++ b/arch/riscv/mm/init.c@@ -653,6 +666,26 @@ static void __init reserve_crashkernel(void) } #endif /* CONFIG_KEXEC_CORE */ +#ifdef CONFIG_CRASH_DUMP +/* + * We keep track of the ELF core header of the crashed + * kernel with a reserved-memory region with compatible + * string "linux,elfcorehdr". Here we register a callback + * to populate elfcorehdr_addr/size when this region is + * present. Note that this region will be marked as + * reserved once we call early_init_fdt_scan_reserved_mem() + * later on. + */ +static int elfcore_hdr_setup(struct reserved_mem *rmem) +{ + elfcorehdr_addr = rmem->base; + elfcorehdr_size = rmem->size; + return 0; +} + +RESERVEDMEM_OF_DECLARE(elfcorehdr, "linux,elfcorehdr", elfcore_hdr_setup); +#endif + void __init paging_init(void) { setup_vm_final(); --2.26.2
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds