From 312ace56316eaca0bb447633dbd08b2b9088a428 Mon Sep 17 00:00:00 2001 From: Alexander von Gluck IV Date: Wed, 29 Jul 2020 22:03:42 -0500 Subject: [PATCH] bootloader/efi: Support 32-bit kernels Change-Id: I82465c3002cbf58fad79b9621074cafd8fbd16e5 Reviewed-on: https://review.haiku-os.org/c/haiku/+/3106 Reviewed-by: Alex von Gluck IV Reviewed-by: Adrien Destugues Reviewed-by: Fredrik Holmqvist --- src/system/boot/platform/efi/start.cpp | 27 ++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/system/boot/platform/efi/start.cpp b/src/system/boot/platform/efi/start.cpp index c0e535c66e..c63c663a01 100644 --- a/src/system/boot/platform/efi/start.cpp +++ b/src/system/boot/platform/efi/start.cpp @@ -84,6 +84,9 @@ convert_preloaded_image(preloaded_elf64_image* image) static void convert_kernel_args() { + if (gKernelArgs.kernel_image->elf_class != ELFCLASS64) + return; + fix_address(gKernelArgs.boot_volume); fix_address(gKernelArgs.vesa_modes); fix_address(gKernelArgs.edid_info); @@ -121,22 +124,34 @@ convert_kernel_args() } +static addr_t +get_kernel_entry(void) +{ + if (gKernelArgs.kernel_image->elf_class == ELFCLASS64) { + preloaded_elf64_image *image = static_cast( + gKernelArgs.kernel_image.Pointer()); + return image->elf_header.e_entry; + } else if (gKernelArgs.kernel_image->elf_class == ELFCLASS32) { + preloaded_elf32_image *image = static_cast( + gKernelArgs.kernel_image.Pointer()); + return image->elf_header.e_entry; + } + panic("Unknown kernel format! Not 32-bit or 64-bit!"); + return 0; +} + + extern "C" void platform_start_kernel(void) { - if (gKernelArgs.kernel_image->elf_class != ELFCLASS64) - panic("32-bit kernels not supported with EFI"); - smp_init_other_cpus(); - preloaded_elf64_image *image = static_cast( - gKernelArgs.kernel_image.Pointer()); + addr_t kernelEntry = get_kernel_entry(); arch_mmu_init(); convert_kernel_args(); // Save the kernel entry point address. - addr_t kernelEntry = image->elf_header.e_entry; dprintf("kernel entry at %#lx\n", kernelEntry); // map in a kernel stack