From: Christopher Koch <chrisko@xxxxxxxxxx> An EFI-booted Linux kernel will commit a virtual memory map in efi_enter_virtual_mode, which is only done if efi_enabled(EFI_RUNTIME_SERVICES). This can be disabled by adding noefi to the command line. kexec's setup_efi_state will then pass a memmap_size of 0 to the next kernel. A Linux kernel cannot handle a memmap_size of 0 given by its bootloader: efi_memblock_x86_reserve_range divides by the memmap_size and hits a divide by 0 error. When the 1st kernel is booted with noefi, it should not even attempt to pass EFI information to any kexec'd kernel. Signed-off-by: Christopher Koch <chrisko@xxxxxxxxxx> --- arch/x86/kernel/kexec-bzimage64.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/x86/kernel/kexec-bzimage64.c b/arch/x86/kernel/kexec-bzimage64.c index 278cd07228dd..8ab4ffb901ce 100644 --- a/arch/x86/kernel/kexec-bzimage64.c +++ b/arch/x86/kernel/kexec-bzimage64.c @@ -179,6 +179,14 @@ setup_efi_state(struct boot_params *params, unsigned long params_load_addr, if (efi_enabled(EFI_OLD_MEMMAP)) return 0; + /* + * If we booted with noefi on the command line, we never committed a + * virtual memory map. It makes no sense to act as an EFI chainloader in + * that case. + */ + if (!efi_enabled(EFI_RUNTIME_SERVICES)) + return 0; + ei->efi_loader_signature = current_ei->efi_loader_signature; ei->efi_systab = current_ei->efi_systab; ei->efi_systab_hi = current_ei->efi_systab_hi; -- 2.19.1.331.ge82ca0e54c-goog _______________________________________________ kexec mailing list kexec@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/kexec