x86: Add 64-bit entries to the GDT
authorSimon Glass <sjg@chromium.org>
Sat, 15 Mar 2025 14:25:31 +0000 (14:25 +0000)
committerTom Rini <trini@konsulko.com>
Thu, 3 Apr 2025 17:41:55 +0000 (11:41 -0600)
At present it is not possible to execution 64-bit code without
installing an entire new Global Descriptor Table. This is inconvenient
since kvm does not seem to like switching into long mode with a new
table.

It isn't actually necessary, since we can just extend the existing
table. Add some new entries to this effect.

Signed-off-by: Simon Glass <sjg@chromium.org>
arch/x86/cpu/i386/cpu.c
arch/x86/include/asm/processor.h

index a51a244..3bbad3b 100644 (file)
@@ -160,6 +160,9 @@ void arch_setup_gd(gd_t *new_gd)
 
        gdt_addr[X86_GDT_ENTRY_16BIT_FLAT_CS] = GDT_ENTRY(0x809b, 0, 0xfffff);
        gdt_addr[X86_GDT_ENTRY_16BIT_FLAT_DS] = GDT_ENTRY(0x8093, 0, 0xfffff);
+       gdt_addr[X86_GDT_ENTRY_64BIT_CS] = GDT_ENTRY(0xaf9b, 0, 0xfffff);
+       gdt_addr[X86_GDT_ENTRY_64BIT_TS1] = GDT_ENTRY(0x8980, 0, 0xfffff);
+       gdt_addr[X86_GDT_ENTRY_64BIT_TS2] = 0;
 
        load_gdt(gdt_addr, X86_GDT_NUM_ENTRIES);
        load_ds(X86_GDT_ENTRY_32BIT_DS);
index d7b6836..ad8240b 100644 (file)
 #define X86_GDT_ENTRY_16BIT_DS         6
 #define X86_GDT_ENTRY_16BIT_FLAT_CS    7
 #define X86_GDT_ENTRY_16BIT_FLAT_DS    8
-#define X86_GDT_NUM_ENTRIES            9
+#define X86_GDT_ENTRY_64BIT_CS         9
+#define X86_GDT_ENTRY_64BIT_TS1                10
+#define X86_GDT_ENTRY_64BIT_TS2                11
+#define X86_GDT_NUM_ENTRIES            12
 
 #define X86_GDT_SIZE           (X86_GDT_NUM_ENTRIES * X86_GDT_ENTRY_SIZE)