EFI: Initial test EFI application

* Only set HAIKU_BOOT_PLATFORM to bios_ia32 if not defined
* Add gnuefi build feature
* Introduce BOOT_LDFLAGS, and move options for passing to linker
  into ArchitectureSetup
* x86_64 compile fixes for warnings in boot loader
* loader/elf.cpp: don't include ELF32 support when targeting EFI
* relocation_func.cpp: copy of the relocation code from gnuefi
  to make _relocate extern "C", and avoid including <efilib.h>
* boot_loader_efi.ld: copy of gnuefi's elf_x86_64_efi.lds,
  modified to include support for C++ constructors, etc. Keep in
  sync with the gnuefi package

Signed-off-by: Jessica Hamilton <[email protected]>
This commit is contained in:
Fredrik Holmqvist
2016-09-02 19:02:29 +12:00
committed by Jessica Hamilton
parent 20e11028aa
commit 211483cb51
27 changed files with 474 additions and 59 deletions
+27 -12
View File
@@ -279,7 +279,7 @@ rule KernelArchitectureSetup architecture
HAIKU_BOOT_ARCHIVE_IMAGE_OFFSET = 192 ; # in kB - unused yet
case x86 :
HAIKU_BOOT_PLATFORM = bios_ia32 ;
HAIKU_BOOT_PLATFORM ?= bios_ia32 ;
HAIKU_BOOT_FLOPPY_IMAGE_SIZE = 2880 ; # in kB
# offset in floppy image (>= sizeof(haiku_loader))
HAIKU_BOOT_ARCHIVE_IMAGE_OFFSET = 320 ; # in kB
@@ -291,7 +291,7 @@ rule KernelArchitectureSetup architecture
case x86_64 :
# x86_64 completely shares the x86 bootloader.
HAIKU_BOOT_PLATFORM = bios_ia32 ;
HAIKU_BOOT_PLATFORM ?= bios_ia32 ;
HAIKU_BOOT_FLOPPY_IMAGE_SIZE = 2880 ; # in kB
# offset in floppy image (>= sizeof(haiku_loader))
HAIKU_BOOT_ARCHIVE_IMAGE_OFFSET = 320 ; # in kB
@@ -326,12 +326,6 @@ rule KernelArchitectureSetup architecture
Exit "Currently unsupported target CPU:" $(cpu) ;
}
# Include embedded board-specific file.
if $(HAIKU_BOOT_BOARD) {
include [ FDirName $(HAIKU_BUILD_RULES_DIR) board $(HAIKU_BOOT_BOARD)
BoardSetup ] ;
}
# private kernel headers to be used when compiling kernel code
HAIKU_PRIVATE_KERNEL_HEADERS =
[ PrivateHeaders $(DOT) kernel libroot shared
@@ -361,6 +355,7 @@ rule KernelArchitectureSetup architecture
HAIKU_BOOT_CCFLAGS = $(HAIKU_CCFLAGS_$(architecture)) $(gccBaseFlags) ;
HAIKU_BOOT_C++FLAGS = $(HAIKU_C++FLAGS_$(architecture)) $(g++BaseFlags) ;
HAIKU_BOOT_LINKFLAGS = ;
HAIKU_BOOT_LDFLAGS = -Bstatic ;
if $(gccVersion[1]) >= 4 {
HAIKU_KERNEL_C++FLAGS += -std=gnu++11 ;
@@ -370,6 +365,16 @@ rule KernelArchitectureSetup architecture
HAIKU_KERNEL_PIC_LINKFLAGS = ;
HAIKU_KERNEL_ADDON_LINKFLAGS = ;
# Include embedded board-specific file.
if $(HAIKU_BOOT_BOARD) {
include [ FDirName $(HAIKU_BUILD_RULES_DIR) board $(HAIKU_BOOT_BOARD)
BoardSetup ] ;
if $(HAIKU_BOARD_LOADER_BASE) {
HAIKU_BOOT_LDFLAGS +=
--defsym BOARD_LOADER_BASE=$(HAIKU_BOARD_LOADER_BASE) ;
}
}
switch $(cpu) {
case ppc :
# Build a position independent PPC kernel. We need to be able to
@@ -401,10 +406,20 @@ rule KernelArchitectureSetup architecture
HAIKU_KERNEL_PIC_LINKFLAGS += -z max-page-size=0x1000 ;
HAIKU_KERNEL_ADDON_LINKFLAGS += -z max-page-size=0x1000 ;
# Bootloader is 32-bit.
HAIKU_BOOT_LINKFLAGS += -m elf_i386_haiku ;
HAIKU_BOOT_CCFLAGS += -m32 -march=pentium ;
HAIKU_BOOT_C++FLAGS += -m32 -march=pentium ;
# BIOS Bootloader is 32-bit.
if $(HAIKU_BOOT_PLATFORM) = bios_ia32 {
HAIKU_BOOT_LINKFLAGS += -m elf_i386_haiku ;
HAIKU_BOOT_CCFLAGS += -m32 -march=pentium ;
HAIKU_BOOT_C++FLAGS += -m32 -march=pentium ;
}
}
if $(HAIKU_BOOT_PLATFORM) = efi {
HAIKU_BOOT_CCFLAGS += -fpic -fno-stack-protector -fPIC -fshort-wchar -mno-red-zone
-maccumulate-outgoing-args -Wno-error=unused-variable ;
HAIKU_BOOT_C++FLAGS += -fpic -fno-stack-protector -fPIC -fshort-wchar -mno-red-zone
-maccumulate-outgoing-args -Wno-error=unused-variable ;
HAIKU_BOOT_LDFLAGS = -Bstatic -Bsymbolic -shared -nostdlib -znocombreloc -nostartfiles ;
}
# warning flags
+1 -1
View File
@@ -47,7 +47,7 @@ rule BootLd
LINK on $(1) = $(TARGET_LD_$(TARGET_PACKAGING_ARCH)) ;
LINKFLAGS on $(1) = $(4) ;
LINKFLAGS on $(1) = $(TARGET_BOOT_LINKFLAGS) $(4) ;
if $(3) { LINKFLAGS on $(1) += --script=$(3) ; }
# Remove any preset LINKLIBS, but link against libgcc.a. Linking against
+17
View File
@@ -571,6 +571,23 @@ if [ IsPackageAvailable expat_devel ] {
}
# gnu-efi
if $(TARGET_PACKAGING_ARCH) = x86_64 {
if [ IsPackageAvailable gnuefi ] {
ExtractBuildFeatureArchives gnuefi :
file: base gnuefi
headers: $(developHeadersDir)/gnuefi
headersProtocol: $(developHeadersDir)/gnuefi/protocol
headersArch: $(developHeadersDir)/gnuefi/$(TARGET_ARCH)
libdir: $(libDir)/gnuefi
;
EnableBuildFeatures gnuefi ;
} else {
Echo "gnuefi support not available on $(TARGET_PACKAGING_ARCH)" ;
}
}
# GPL add-ons
if $(HAIKU_INCLUDE_GPL_ADDONS) = 1 {
EnableBuildFeatures gpl ;
+1 -1
View File
@@ -649,7 +649,7 @@ local buildVars =
KERNEL_CCFLAGS KERNEL_C++FLAGS
KERNEL_PIC_CCFLAGS KERNEL_PIC_LINKFLAGS KERNEL_ADDON_LINKFLAGS
BOOT_CCFLAGS BOOT_C++FLAGS BOOT_LINKFLAGS
BOOT_CCFLAGS BOOT_C++FLAGS BOOT_LINKFLAGS BOOT_LDFLAGS
KERNEL_WARNING_CCFLAGS KERNEL_WARNING_C++FLAGS
View File