@@ -163,9 +163,14 @@ void setup_multiboot(struct mbi_bootinfo *bi)
#ifdef TARGET_EFI
+/* From x86/efi/efistart64.S */
+extern void load_idt(void);
+
void setup_efi(void)
{
reset_apic();
+ setup_idt();
+ load_idt();
mask_pic_interrupts();
enable_apic();
enable_x2apic();
@@ -5,7 +5,7 @@ ifeq ($(TARGET_EFI),y)
exe = efi
bin = so
FORMAT = efi-app-x86_64
-cstart.o = x86/efi/crt0-efi-x86_64.o
+cstart.o = $(TEST_DIR)/efi/efistart64.o
else
exe = flat
bin = elf
@@ -22,13 +22,13 @@ To build:
To run a test case with UEFI:
- ./x86/efi/run ./x86/dummy.efi
+ ./x86/efi/run ./x86/msr.efi
By default the runner script loads the UEFI firmware `/usr/share/ovmf/OVMF.fd`;
please install UEFI firmware to this path, or specify the correct path through
the env variable `EFI_UEFI`:
- EFI_UEFI=/path/to/OVMF.fd ./x86/efi/run ./x86/dummy.efi
+ EFI_UEFI=/path/to/OVMF.fd ./x86/efi/run ./x86/msr.efi
## Code structure
new file mode 100644
@@ -0,0 +1,12 @@
+/* Startup code and pre-defined data structures */
+
+#include "crt0-efi-x86_64.S"
+
+.section .init
+.code64
+.text
+
+.globl load_idt
+load_idt:
+ lidtq idt_descr(%rip)
+ retq
@@ -1,4 +1,4 @@
-/* Copied from GNU-EFI/gnuefi/elf_x86_64_efi.lds, licensed under GNU GPL */
+/* Developed based on GNU-EFI/gnuefi/elf_x86_64_efi.lds, licensed under GNU GPL */
/* Same as elf_x86_64_fbsd_efi.lds, except for OUTPUT_FORMAT below - KEEP IN SYNC */
OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64")
OUTPUT_ARCH(i386:x86-64)
@@ -38,6 +38,10 @@ SECTIONS
*(.rodata*)
*(.got.plt)
*(.got)
+ /* Expected by lib/x86/desc.c to store exception_table */
+ exception_table_start = .;
+ *(.data.ex)
+ exception_table_end = .;
*(.data*)
*(.sdata)
/* the EFI loader doesn't seem to like a .bss section, so we stick