x86/boot/compressed: Move 32-bit entrypoint code into .text section
authorArd Biesheuvel <ardb@kernel.org>
Tue, 22 Nov 2022 16:10:02 +0000 (17:10 +0100)
committerBorislav Petkov <bp@suse.de>
Tue, 22 Nov 2022 18:03:56 +0000 (19:03 +0100)
Move the code that stores the arguments passed to the EFI entrypoint
into the .text section, so that it can be moved into a separate
compilation unit in a subsequent patch.

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

index d33f060900d235169f05fdfaff4c7c7bbbae6cc1..5d07ef750def3b7233efebfb1a4a5e06cbf276d3 100644 (file)
@@ -303,24 +303,41 @@ SYM_FUNC_START(efi32_stub_entry)
        popl    %ecx
        popl    %edx
        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     %ebp
-       subl    $ rva(1b), %ebp
-
-       movl    %esi, rva(efi32_boot_args+8)(%ebp)
-SYM_INNER_LABEL(efi32_pe_stub_entry, SYM_L_LOCAL)
-       movl    %ecx, rva(efi32_boot_args)(%ebp)
-       movl    %edx, rva(efi32_boot_args+4)(%ebp)
-       movb    $0, rva(efi_is64)(%ebp)
+1:     pop     %ebx
 
        /* Save firmware GDTR and code/data selectors */
-       sgdtl   rva(efi32_boot_gdt)(%ebp)
-       movw    %cs, rva(efi32_boot_cs)(%ebp)
-       movw    %ds, rva(efi32_boot_ds)(%ebp)
+       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   rva(efi32_boot_idt)(%ebp)
+       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
@@ -328,7 +345,8 @@ SYM_INNER_LABEL(efi32_pe_stub_entry, SYM_L_LOCAL)
        movl    %eax, %cr0
 
        jmp     startup_32
-SYM_FUNC_END(efi32_stub_entry)
+SYM_FUNC_END(efi32_entry)
+       __HEAD
 #endif
 
        .code64
@@ -831,7 +849,9 @@ SYM_FUNC_START(efi32_pe_entry)
         */
        subl    %esi, %ebx
        movl    %ebx, rva(image_offset)(%ebp)   // save image_offset
-       jmp     efi32_pe_stub_entry
+       xorl    %esi, %esi
+       jmp     efi32_entry                     // pass %ecx, %edx, %esi
+                                               // no other registers remain live
 
 2:     popl    %edi                            // restore callee-save registers
        popl    %ebx