Switch the x86_64 build to the generic EFI loader, which exposes the initrd via the LoadFile2 protocol instead of the x86-specific setup header. This will launch the Linux kernel via its EFI stub, which performs its own initialization in the EFI boot services context before calling ExitBootServices() and performing the bare metal Linux boot.
Signed-off-by: Ard Biesheuvel <a...@kernel.org> --- grub-core/Makefile.core.def | 6 +----- grub-core/kern/efi/mm.c | 2 +- grub-core/loader/efi/linux.c | 12 ++++++++++++ include/grub/efi/efi.h | 2 ++ 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index c17d022195b3fdca..f9e89a0cc4389dd0 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -1822,7 +1822,6 @@ module = { module = { name = linux; - x86 = loader/i386/linux.c; i386_xen_pvh = loader/i386/linux.c; xen = loader/i386/xen.c; i386_pc = lib/i386/pc/vesa_modes_table.c; @@ -1832,11 +1831,8 @@ module = { sparc64_ieee1275 = loader/sparc64/ieee1275/linux.c; ia64_efi = loader/ia64/efi/linux.c; arm_coreboot = loader/arm/linux.c; - arm_efi = loader/efi/linux.c; + efi = loader/efi/linux.c; arm_uboot = loader/arm/linux.c; - arm64 = loader/efi/linux.c; - riscv32 = loader/efi/linux.c; - riscv64 = loader/efi/linux.c; emu = loader/emu/linux.c; common = loader/linux.c; common = lib/cmdline.c; diff --git a/grub-core/kern/efi/mm.c b/grub-core/kern/efi/mm.c index 09225a7c08e4d066..9ba0b8814fe16cc9 100644 --- a/grub-core/kern/efi/mm.c +++ b/grub-core/kern/efi/mm.c @@ -653,7 +653,7 @@ grub_efi_mm_init (void) grub_mm_add_region_fn = grub_efi_mm_add_regions; } -#if defined (__aarch64__) || defined (__arm__) || defined (__riscv) +#if defined (__aarch64__) || defined (__arm__) || defined (__riscv) || defined(__x86_64__) grub_err_t grub_efi_get_ram_base(grub_addr_t *base_addr) { diff --git a/grub-core/loader/efi/linux.c b/grub-core/loader/efi/linux.c index 15e0686549d7ecca..3cf596f56e8eac4f 100644 --- a/grub-core/loader/efi/linux.c +++ b/grub-core/loader/efi/linux.c @@ -125,6 +125,7 @@ grub_arch_efi_linux_load_image_header (grub_file_t file, return GRUB_ERR_NONE; } +#ifndef __x86_64__ static grub_err_t finalize_params_linux (void) { @@ -169,6 +170,7 @@ failure: grub_fdt_unload(); return grub_error(GRUB_ERR_BAD_OS, "failed to install/update FDT"); } +#endif grub_err_t grub_arch_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args) @@ -231,8 +233,10 @@ grub_arch_efi_linux_boot_image (grub_addr_t addr, grub_size_t size, char *args) static grub_err_t grub_linux_boot (void) { +#ifndef __x86_64__ if (finalize_params_linux () != GRUB_ERR_NONE) return grub_errno; +#endif return (grub_arch_efi_linux_boot_image((grub_addr_t)kernel_addr, kernel_size, linux_args)); @@ -253,7 +257,9 @@ grub_linux_unload (void) if (kernel_addr) grub_efi_free_pages ((grub_addr_t) kernel_addr, GRUB_EFI_BYTES_TO_PAGES (kernel_size)); +#ifndef __x86_64__ grub_fdt_unload (); +#endif if (initrd_lf2_handle != NULL) { @@ -391,6 +397,12 @@ grub_cmd_initrd (grub_command_t cmd __attribute__ ((unused)), return GRUB_ERR_NONE; } +#ifdef __x86_64__ + grub_error (GRUB_ERR_INVALID_COMMAND, + N_("selected Linux kernel does not support loadfile2 initrd loading")); + goto fail; +#endif + initrd_size = grub_get_initrd_size (&initrd_ctx); grub_dprintf ("linux", "Loading initrd\n"); diff --git a/include/grub/efi/efi.h b/include/grub/efi/efi.h index 444bf5b0b53e31fe..c56abfbd6ba45ab8 100644 --- a/include/grub/efi/efi.h +++ b/include/grub/efi/efi.h @@ -112,6 +112,8 @@ extern void (*EXPORT_VAR(grub_efi_net_config)) (grub_efi_handle_t hnd, #if defined(__arm__) || defined(__aarch64__) || defined(__riscv) void *EXPORT_FUNC(grub_efi_get_firmware_fdt)(void); +#endif +#if defined(__arm__) || defined(__aarch64__) || defined(__riscv) || defined(__x86_64__) grub_err_t EXPORT_FUNC(grub_efi_get_ram_base)(grub_addr_t *); #include <grub/file.h> grub_err_t grub_arch_efi_linux_load_image_header(grub_file_t file, -- 2.39.2 _______________________________________________ Grub-devel mailing list Grub-devel@gnu.org https://lists.gnu.org/mailman/listinfo/grub-devel