On Tue, Aug 19, 2025 at 11:22:44PM +0000, Evangelos Petrongonas wrote: > This patch series fixes a kernel panic that occurs when booting with > both EFI and KHO (Kexec HandOver) enabled. > > The issue arises because EFI's `reserve_regions()` clears all memory > regions with `memblock_remove(0, PHYS_ADDR_MAX)` before rebuilding them > from EFI data. This destroys KHO scratch regions that were set up early > during device tree scanning, causing a panic as the kernel has no valid > memory regions for early allocations. > > The first patch introduces `is_kho_boot()` to allow early boot > components to reliably detect if the kernel was booted via KHO-enabled > kexec. The existing `kho_is_enabled()` only checks the command line and > doesn't verify if an actual KHO FDT was passed. > > The second patch modifies EFI's `reserve_regions()` to selectively > remove only non-KHO memory regions when KHO is active, preserving the > critical scratch regions while still allowing EFI to rebuild its memory > map. > > The patchset was developed/tested on arm64. > > On a side note, I have noticed that `kho_populate()` calls > `memblock_set_kho_scratch_only()`, but the `kho` cmdline option is > not checked until much later. Therefore, memblock will use only the > scratch regions that were passed from the outgoing kernel, even if the > incoming kernel doesn't explicitly want that. I am not sure if this is > done on purpose, but in any case we can discuss this in another patch, > as it is orthogonal to this one.
kho_populate runs earlier than we parse the command line, so there is an implicit assumption that we are going through KHO-enabled kexec if FDT was passed to the new kernel. I believe the best way is to document that and make it more explicit that kho command line parameter only affects the "out" part. > Main Changes in v2 (smaller changes can be found in individual patches): > - Introduce is_kho_boot() > - Replaced manual loop with for_each_mem_region macro > > Evangelos Petrongonas (2): > kexec: introduce is_kho_boot() > efi: Support booting with kexec handover (KHO) > > drivers/firmware/efi/efi-init.c | 28 ++++++++++++++++++++++++---- > include/linux/kexec_handover.h | 6 ++++++ > kernel/kexec_handover.c | 20 ++++++++++++++++++++ > 3 files changed, 50 insertions(+), 4 deletions(-) > > -- > 2.47.3 -- Sincerely yours, Mike.