Skip to content

Commit d6d5116

Browse files
vpetrogakpm00
authored andcommitted
kexec: introduce is_kho_boot()
Patch series "efi: Fix EFI boot with kexec handover (KHO)", v3. 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. This patch (of 3): During early initialisation, after a kexec, other components, like EFI need to know if a KHO enabled kexec is performed. The `kho_is_enabled` function is not enough as in the early stages, it only reflects whether the cmdline has KHO enabled, not if an actual KHO FDT exists. Extend the KHO API with `is_kho_boot()` to provide a way for components to check if a KHO enabled kexec is performed. Link: https://lkml.kernel.org/r/cover.1755721529.git.epetron@amazon.de Link: https://lkml.kernel.org/r/7dc6674a76bf6e68cca0222ccff32427699cc02e.1755721529.git.epetron@amazon.de Signed-off-by: Evangelos Petrongonas <epetron@amazon.de> Reviewed-by: Mike Rapoport (Microsoft) <rppt@kernel.org> Reviewed-by: Pratyush Yadav <pratyush@kernel.org> Cc: Alexander Graf <graf@amazon.com> Cc: Ard Biesheuvel <ardb@kernel.org> Cc: Baoquan He <bhe@redhat.com> Cc: Changyuan Lyu <changyuanl@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
1 parent c25822c commit d6d5116

2 files changed

Lines changed: 26 additions & 0 deletions

File tree

include/linux/kexec_handover.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct kho_serialization;
4040

4141
#ifdef CONFIG_KEXEC_HANDOVER
4242
bool kho_is_enabled(void);
43+
bool is_kho_boot(void);
4344

4445
int kho_preserve_folio(struct folio *folio);
4546
int kho_preserve_phys(phys_addr_t phys, size_t size);
@@ -60,6 +61,11 @@ static inline bool kho_is_enabled(void)
6061
return false;
6162
}
6263

64+
static inline bool is_kho_boot(void)
65+
{
66+
return false;
67+
}
68+
6369
static inline int kho_preserve_folio(struct folio *folio)
6470
{
6571
return -EOPNOTSUPP;

kernel/kexec_handover.c

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -951,6 +951,26 @@ static const void *kho_get_fdt(void)
951951
return kho_in.fdt_phys ? phys_to_virt(kho_in.fdt_phys) : NULL;
952952
}
953953

954+
/**
955+
* is_kho_boot - check if current kernel was booted via KHO-enabled
956+
* kexec
957+
*
958+
* This function checks if the current kernel was loaded through a kexec
959+
* operation with KHO enabled, by verifying that a valid KHO FDT
960+
* was passed.
961+
*
962+
* Note: This function returns reliable results only after
963+
* kho_populate() has been called during early boot. Before that,
964+
* it may return false even if KHO data is present.
965+
*
966+
* Return: true if booted via KHO-enabled kexec, false otherwise
967+
*/
968+
bool is_kho_boot(void)
969+
{
970+
return !!kho_get_fdt();
971+
}
972+
EXPORT_SYMBOL_GPL(is_kho_boot);
973+
954974
/**
955975
* kho_retrieve_subtree - retrieve a preserved sub FDT by its name.
956976
* @name: the name of the sub FDT passed to kho_add_subtree().

0 commit comments

Comments
 (0)