From 5897f7b6235d36a58582513ad5db270d9b1ce926 Mon Sep 17 00:00:00 2001 From: David Karoly Date: Thu, 22 Sep 2022 15:05:16 +0200 Subject: [PATCH] boot/efi/x86: enable support for 64-bit ELF Change-Id: Id3b207444b55041dc83ee1afdd61b467ce13ff70 Reviewed-on: https://review.haiku-os.org/c/haiku/+/5665 Tested-by: Commit checker robot Reviewed-by: Adrien Destugues --- src/system/boot/arch/x86/Jamfile | 14 ++++++-------- src/system/boot/loader/Jamfile | 13 ++++++------- src/system/boot/loader/elf.cpp | 24 ++++++++++++++---------- 3 files changed, 26 insertions(+), 25 deletions(-) diff --git a/src/system/boot/arch/x86/Jamfile b/src/system/boot/arch/x86/Jamfile index 08939d5c91..fa3ca7e483 100644 --- a/src/system/boot/arch/x86/Jamfile +++ b/src/system/boot/arch/x86/Jamfile @@ -10,15 +10,13 @@ for platform in [ MultiBootSubDirSetup bios_ia32 efi pxe_ia32 ] { DEFINES = $(defines) ; DEFINES += _BOOT_MODE ; - if $(TARGET_BOOT_PLATFORM) = efi { - if $(TARGET_ARCH) = x86_64 { - DEFINES += BOOT_SUPPORT_ELF64 ; - } else { - DEFINES += BOOT_SUPPORT_ELF32 ; - } - } else { + if $(TARGET_BOOT_PLATFORM) = efi && $(TARGET_ARCH) = x86_64 { DEFINES += BOOT_SUPPORT_ELF64 ; - DEFINES += BOOT_SUPPORT_ELF32 ; + } else { + DEFINES += + BOOT_SUPPORT_ELF32 + BOOT_SUPPORT_ELF64 + ; } local kernelArchSources = diff --git a/src/system/boot/loader/Jamfile b/src/system/boot/loader/Jamfile index 2f8c2d341f..49e2bc5c97 100644 --- a/src/system/boot/loader/Jamfile +++ b/src/system/boot/loader/Jamfile @@ -61,17 +61,16 @@ for platform in [ MultiBootSubDirSetup ] { ; if $(TARGET_BOOT_PLATFORM) != efi { + DEFINES += _BOOT_PLATFORM_BIOS ; + } + + if $(TARGET_BOOT_PLATFORM) = efi && $(TARGET_ARCH) = x86_64 { + DEFINES += BOOT_SUPPORT_ELF64 ; + } else { DEFINES += - _BOOT_PLATFORM_BIOS BOOT_SUPPORT_ELF32 BOOT_SUPPORT_ELF64 ; - } else { - if $(TARGET_ARCH) = x86_64 { - DEFINES += BOOT_SUPPORT_ELF64 ; - } else { - DEFINES += BOOT_SUPPORT_ELF32 ; - } } } case "sparc" : diff --git a/src/system/boot/loader/elf.cpp b/src/system/boot/loader/elf.cpp index 0923e5d4b2..d6ef3855b8 100644 --- a/src/system/boot/loader/elf.cpp +++ b/src/system/boot/loader/elf.cpp @@ -130,7 +130,7 @@ struct ELF64Class { AllocateRegion(AddrType* _address, AddrType size, uint8 protection, void **_mappedAddress) { -#if defined(_BOOT_PLATFORM_BIOS) +#if B_HAIKU_BITS == 32 // Assume the real 64-bit base address is KERNEL_LOAD_BASE_64_BIT and // the mappings in the loader address space are at KERNEL_LOAD_BASE. @@ -145,26 +145,30 @@ struct ELF64Class { return status; *_mappedAddress = address; -#if defined(_BOOT_PLATFORM_BIOS) - *_address = (AddrType)(addr_t)address + KERNEL_FIXUP_FOR_LONG_MODE; -#else - platform_bootloader_address_to_kernel_address(address, _address); + + addr_t result; + platform_bootloader_address_to_kernel_address(address, &result); + *_address = result; +#if B_HAIKU_BITS == 32 + *_address += KERNEL_FIXUP_FOR_LONG_MODE; #endif return B_OK; } static inline void* - Map(AddrType address) + Map(AddrType _address) { -#ifdef _BOOT_PLATFORM_BIOS - return (void*)(addr_t)(address - KERNEL_FIXUP_FOR_LONG_MODE); + addr_t address; +#if B_HAIKU_BITS == 32 + address = _address - KERNEL_FIXUP_FOR_LONG_MODE; #else + address = _address; +#endif void *result; if (platform_kernel_address_to_bootloader_address(address, &result) != B_OK) { - panic("Couldn't convert address %#" PRIx64, address); + panic("Couldn't convert address %#" PRIx64 "\n", _address); } return result; -#endif } };