efi/x86: Drop the special GDT for the EFI thunk
authorArvind Sankar <nivedita@alum.mit.edu>
Sat, 23 May 2020 22:15:13 +0000 (18:15 -0400)
committerArd Biesheuvel <ardb@kernel.org>
Sat, 23 May 2020 22:25:15 +0000 (00:25 +0200)
Instead of using efi_gdt64 to switch back to 64-bit mode and then
switching to the real boot-time GDT, just switch to the boot-time GDT
directly. The two GDT's are identical other than efi_gdt64 not including
the 32-bit code segment.

Signed-off-by: Arvind Sankar <nivedita@alum.mit.edu>
Link: https://lore.kernel.org/r/20200523221513.1642948-1-nivedita@alum.mit.edu
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
arch/x86/boot/compressed/efi_thunk_64.S

index 2b20492..c4bb0f9 100644 (file)
@@ -28,8 +28,6 @@ SYM_FUNC_START(__efi64_thunk)
        push    %rbx
 
        leaq    1f(%rip), %rbp
-       leaq    efi_gdt64(%rip), %rbx
-       movl    %ebx, 2(%rbx)           /* Fixup the gdt base address */
 
        movl    %ds, %eax
        push    %rax
@@ -48,7 +46,8 @@ SYM_FUNC_START(__efi64_thunk)
        movl    %r8d, 0xc(%rsp)
        movl    %r9d, 0x10(%rsp)
 
-       sgdt    0x14(%rsp)
+       leaq    0x14(%rsp), %rbx
+       sgdt    (%rbx)
 
        /*
         * Switch to gdt with 32-bit segments. This is the firmware GDT
@@ -68,8 +67,7 @@ SYM_FUNC_START(__efi64_thunk)
        pushq   %rax
        lretq
 
-1:     lgdt    0x14(%rsp)
-       addq    $32, %rsp
+1:     addq    $32, %rsp
        movq    %rdi, %rax
 
        pop     %rbx
@@ -175,14 +173,3 @@ SYM_DATA_END(efi32_boot_cs)
 SYM_DATA_START(efi32_boot_ds)
        .word   0
 SYM_DATA_END(efi32_boot_ds)
-
-SYM_DATA_START(efi_gdt64)
-       .word   efi_gdt64_end - efi_gdt64
-       .long   0                       /* Filled out by user */
-       .word   0
-       .quad   0x0000000000000000      /* NULL descriptor */
-       .quad   0x00af9a000000ffff      /* __KERNEL_CS */
-       .quad   0x00cf92000000ffff      /* __KERNEL_DS */
-       .quad   0x0080890000000000      /* TS descriptor */
-       .quad   0x0000000000000000      /* TS continued */
-SYM_DATA_END_LABEL(efi_gdt64, SYM_L_LOCAL, efi_gdt64_end)