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 <s...@chromium.org>
Fixes: https://source.denx.de/u-boot/custodians/u-boot-dm/-/issues/31
---

(no changes since v1)

 arch/x86/cpu/i386/call64.S | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/arch/x86/cpu/i386/call64.S b/arch/x86/cpu/i386/call64.S
index e5a0420d1ba..3137ec17d31 100644
--- a/arch/x86/cpu/i386/call64.S
+++ b/arch/x86/cpu/i386/call64.S
@@ -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
 
-- 
2.43.0

Reply via email to