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 <[email protected]> Reviewed-by: Adrien Destugues <[email protected]> Reviewed-by: Fredrik Holmqvist <[email protected]>
This commit is contained in:
committed by
Alex von Gluck IV
parent
fa5c8097c9
commit
312ace5631
@@ -84,6 +84,9 @@ convert_preloaded_image(preloaded_elf64_image* image)
|
|||||||
static void
|
static void
|
||||||
convert_kernel_args()
|
convert_kernel_args()
|
||||||
{
|
{
|
||||||
|
if (gKernelArgs.kernel_image->elf_class != ELFCLASS64)
|
||||||
|
return;
|
||||||
|
|
||||||
fix_address(gKernelArgs.boot_volume);
|
fix_address(gKernelArgs.boot_volume);
|
||||||
fix_address(gKernelArgs.vesa_modes);
|
fix_address(gKernelArgs.vesa_modes);
|
||||||
fix_address(gKernelArgs.edid_info);
|
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<preloaded_elf64_image *>(
|
||||||
|
gKernelArgs.kernel_image.Pointer());
|
||||||
|
return image->elf_header.e_entry;
|
||||||
|
} else if (gKernelArgs.kernel_image->elf_class == ELFCLASS32) {
|
||||||
|
preloaded_elf32_image *image = static_cast<preloaded_elf32_image *>(
|
||||||
|
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
|
extern "C" void
|
||||||
platform_start_kernel(void)
|
platform_start_kernel(void)
|
||||||
{
|
{
|
||||||
if (gKernelArgs.kernel_image->elf_class != ELFCLASS64)
|
|
||||||
panic("32-bit kernels not supported with EFI");
|
|
||||||
|
|
||||||
smp_init_other_cpus();
|
smp_init_other_cpus();
|
||||||
|
|
||||||
preloaded_elf64_image *image = static_cast<preloaded_elf64_image *>(
|
addr_t kernelEntry = get_kernel_entry();
|
||||||
gKernelArgs.kernel_image.Pointer());
|
|
||||||
|
|
||||||
arch_mmu_init();
|
arch_mmu_init();
|
||||||
convert_kernel_args();
|
convert_kernel_args();
|
||||||
|
|
||||||
// Save the kernel entry point address.
|
// Save the kernel entry point address.
|
||||||
addr_t kernelEntry = image->elf_header.e_entry;
|
|
||||||
dprintf("kernel entry at %#lx\n", kernelEntry);
|
dprintf("kernel entry at %#lx\n", kernelEntry);
|
||||||
|
|
||||||
// map in a kernel stack
|
// map in a kernel stack
|
||||||
|
|||||||
Reference in New Issue
Block a user