x86: Use the same GDT when jumping to long mode
authorSimon Glass <sjg@chromium.org>
Sat, 15 Mar 2025 14:25:38 +0000 (14:25 +0000)
committerTom Rini <trini@konsulko.com>
Thu, 3 Apr 2025 17:41:55 +0000 (11:41 -0600)
Make use the existing GDT which now includes entries for 64-bit code.
Leave the interrupt descriptors alone. They can be tidied up once U-Boot
starts up.

With this, kvm mode works with QEMU.

Signed-off-by: Simon Glass <sjg@chromium.org>
Fixes: https://source.denx.de/u-boot/custodians/u-boot-dm/-/issues/31

arch/x86/cpu/i386/call64.S

index f979f9e..c722acb 100644 (file)
@@ -7,6 +7,7 @@
  */
 
 #include <asm/msr-index.h>
+#include <asm/processor.h>
 #include <asm/processor-flags.h>
 
 .code32
@@ -30,11 +31,6 @@ cpu_call64:
        andl    $~X86_CR0_PG, %eax
        movl    %eax, %cr0
 
-       /* Load new GDT with the 64bit segments using 32bit descriptor */
-       leal    gdt, %eax
-       movl    %eax, gdt+2
-       lgdt    gdt
-
        /* Enable PAE mode */
        movl    $(X86_CR4_PAE), %eax
        movl    %eax, %cr4
@@ -49,12 +45,6 @@ cpu_call64:
        btsl    $_EFER_LME, %eax
        wrmsr
 
-       /* After gdt is loaded */
-       xorl    %eax, %eax
-       lldt    %ax
-       movl    $0x20, %eax
-       ltr     %ax
-
        /*
         * Setup for the jump to 64bit mode
         *
@@ -67,7 +57,7 @@ cpu_call64:
         */
        pop     %esi                    /* setup_base */
 
-       pushl   $0x10
+       pushl   $(X86_GDT_ENTRY_64BIT_CS * X86_GDT_ENTRY_SIZE)
        leal    lret_target, %eax
        pushl   %eax