x86/boot/compressed: Move efi32_entry out of head_64.S
authorArd Biesheuvel <ardb@kernel.org>
Tue, 22 Nov 2022 16:10:05 +0000 (17:10 +0100)
committerBorislav Petkov <bp@suse.de>
Tue, 22 Nov 2022 18:24:09 +0000 (19:24 +0100)
Move the efi32_entry() routine out of head_64.S and into efi-mixed.S,
which reduces clutter in the complicated startup routines. It also
permits linkage of some symbols used by code to be made local.

Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lore.kernel.org/r/20221122161017.2426828-6-ardb@kernel.org
arch/x86/boot/compressed/efi_mixed.S
arch/x86/boot/compressed/head_64.S

index 58ab2e1..3487484 100644 (file)
@@ -105,7 +105,7 @@ SYM_FUNC_START(__efi64_thunk)
        /*
         * Switch to IDT and GDT with 32-bit segments. This is the firmware GDT
         * and IDT that was installed when the kernel started executing. The
-        * pointers were saved at the EFI stub entry point in head_64.S.
+        * pointers were saved by the efi32_entry() routine below.
         *
         * Pass the saved DS selector to the 32-bit code, and use far return to
         * restore the saved CS selector.
@@ -217,22 +217,59 @@ SYM_FUNC_START_LOCAL(efi_enter32)
        lret
 SYM_FUNC_END(efi_enter32)
 
+/*
+ * This is the common EFI stub entry point for mixed mode.
+ *
+ * Arguments:  %ecx    image handle
+ *             %edx    EFI system table pointer
+ *             %esi    struct bootparams pointer (or NULL when not using
+ *                     the EFI handover protocol)
+ *
+ * Since this is the point of no return for ordinary execution, no registers
+ * are considered live except for the function parameters. [Note that the EFI
+ * stub may still exit and return to the firmware using the Exit() EFI boot
+ * service.]
+ */
+SYM_FUNC_START(efi32_entry)
+       call    1f
+1:     pop     %ebx
+
+       /* Save firmware GDTR and code/data selectors */
+       sgdtl   (efi32_boot_gdt - 1b)(%ebx)
+       movw    %cs, (efi32_boot_cs - 1b)(%ebx)
+       movw    %ds, (efi32_boot_ds - 1b)(%ebx)
+
+       /* Store firmware IDT descriptor */
+       sidtl   (efi32_boot_idt - 1b)(%ebx)
+
+       /* Store boot arguments */
+       leal    (efi32_boot_args - 1b)(%ebx), %ebx
+       movl    %ecx, 0(%ebx)
+       movl    %edx, 4(%ebx)
+       movl    %esi, 8(%ebx)
+       movb    $0x0, 12(%ebx)          // efi_is64
+
+       /* Disable paging */
+       movl    %cr0, %eax
+       btrl    $X86_CR0_PG_BIT, %eax
+       movl    %eax, %cr0
+
+       jmp     startup_32
+SYM_FUNC_END(efi32_entry)
+
        .data
        .balign 8
-SYM_DATA_START(efi32_boot_gdt)
+SYM_DATA_START_LOCAL(efi32_boot_gdt)
        .word   0
        .quad   0
 SYM_DATA_END(efi32_boot_gdt)
 
-SYM_DATA_START(efi32_boot_idt)
+SYM_DATA_START_LOCAL(efi32_boot_idt)
        .word   0
        .quad   0
 SYM_DATA_END(efi32_boot_idt)
 
-SYM_DATA_START(efi32_boot_cs)
-       .word   0
-SYM_DATA_END(efi32_boot_cs)
-
-SYM_DATA_START(efi32_boot_ds)
-       .word   0
-SYM_DATA_END(efi32_boot_ds)
+SYM_DATA_LOCAL(efi32_boot_cs, .word 0)
+SYM_DATA_LOCAL(efi32_boot_ds, .word 0)
+SYM_DATA_LOCAL(efi32_boot_args, .long 0, 0, 0)
+SYM_DATA(efi_is64, .byte 1)
index 9dd9010..9cd2a28 100644 (file)
@@ -289,48 +289,6 @@ SYM_FUNC_START(efi32_stub_entry)
        popl    %esi
        jmp     efi32_entry
 SYM_FUNC_END(efi32_stub_entry)
-
-       .text
-/*
- * This is the common EFI stub entry point for mixed mode.
- *
- * Arguments:  %ecx    image handle
- *             %edx    EFI system table pointer
- *             %esi    struct bootparams pointer (or NULL when not using
- *                     the EFI handover protocol)
- *
- * Since this is the point of no return for ordinary execution, no registers
- * are considered live except for the function parameters. [Note that the EFI
- * stub may still exit and return to the firmware using the Exit() EFI boot
- * service.]
- */
-SYM_FUNC_START_LOCAL(efi32_entry)
-       call    1f
-1:     pop     %ebx
-
-       /* Save firmware GDTR and code/data selectors */
-       sgdtl   (efi32_boot_gdt - 1b)(%ebx)
-       movw    %cs, (efi32_boot_cs - 1b)(%ebx)
-       movw    %ds, (efi32_boot_ds - 1b)(%ebx)
-
-       /* Store firmware IDT descriptor */
-       sidtl   (efi32_boot_idt - 1b)(%ebx)
-
-       /* Store boot arguments */
-       leal    (efi32_boot_args - 1b)(%ebx), %ebx
-       movl    %ecx, 0(%ebx)
-       movl    %edx, 4(%ebx)
-       movl    %esi, 8(%ebx)
-       movb    $0x0, 12(%ebx)          // efi_is64
-
-       /* Disable paging */
-       movl    %cr0, %eax
-       btrl    $X86_CR0_PG_BIT, %eax
-       movl    %eax, %cr0
-
-       jmp     startup_32
-SYM_FUNC_END(efi32_entry)
-       __HEAD
 #endif
 
        .code64
@@ -763,9 +721,6 @@ SYM_DATA_END_LABEL(boot32_idt, SYM_L_GLOBAL, boot32_idt_end)
 SYM_DATA(image_offset, .long 0)
 #endif
 #ifdef CONFIG_EFI_MIXED
-SYM_DATA(efi32_boot_args, .long 0, 0, 0)
-SYM_DATA(efi_is64, .byte 1)
-
 #define ST32_boottime          60 // offsetof(efi_system_table_32_t, boottime)
 #define BS32_handle_protocol   88 // offsetof(efi_boot_services_32_t, handle_protocol)
 #define LI32_image_base                32 // offsetof(efi_loaded_image_32_t, image_base)