From 34a6dd672874183fd407787167d6c521ea972f5c Mon Sep 17 00:00:00 2001 From: Henry Harrington Date: Wed, 22 Oct 2014 02:13:45 +0100 Subject: [PATCH] EFI: Initialize/load the GDT. Signed-off-by: Jessica Hamilton --- src/system/boot/platform/efi/entry.S | 9 ++++++--- src/system/boot/platform/efi/start.cpp | 2 +- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/system/boot/platform/efi/entry.S b/src/system/boot/platform/efi/entry.S index b432dc982c..5c5180df7a 100644 --- a/src/system/boot/platform/efi/entry.S +++ b/src/system/boot/platform/efi/entry.S @@ -27,9 +27,12 @@ FUNCTION(efi_enter_kernel): // Load 64-bit enabled GDT lgdtq long_gdtr(%rip) -/* + // Jump into the 64-bit code segment. - ljmp $KERNEL_CODE_SELECTOR, $.Llmode + push $KERNEL_CODE_SELECTOR + lea .Llmode(%rip), %rax + push %rax + lretq .align 8 .code64 .Llmode: @@ -41,7 +44,7 @@ FUNCTION(efi_enter_kernel): mov %ax, %es mov %ax, %fs mov %ax, %gs -*/ + // Set the stack pointer. movq %rdx, %rsp diff --git a/src/system/boot/platform/efi/start.cpp b/src/system/boot/platform/efi/start.cpp index 6ff215fb9b..d5b3219c1e 100644 --- a/src/system/boot/platform/efi/start.cpp +++ b/src/system/boot/platform/efi/start.cpp @@ -77,7 +77,7 @@ long_gdt_init() DPL_USER); // Used by long_enter_kernel(). - gLongGDT = fix_address((addr_t)gBootGDT); + gLongGDT = (addr_t)gBootGDT + 0xFFFFFF0000000000; dprintf("GDT at 0x%lx\n", gLongGDT); }