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); }