x86/boot/compressed: Move 32-bit entrypoint code into .text section

commit e2ab9eab32 upstream.

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
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Ard Biesheuvel
2022-11-22 17:10:02 +01:00
committed by Greg Kroah-Hartman
parent bad6e66d07
commit 3bad8dc0ae

View File

@@ -303,24 +303,41 @@ SYM_FUNC_START(efi32_stub_entry)
popl %ecx popl %ecx
popl %edx popl %edx
popl %esi 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 call 1f
1: pop %ebp 1: pop %ebx
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)
/* Save firmware GDTR and code/data selectors */ /* Save firmware GDTR and code/data selectors */
sgdtl rva(efi32_boot_gdt)(%ebp) sgdtl (efi32_boot_gdt - 1b)(%ebx)
movw %cs, rva(efi32_boot_cs)(%ebp) movw %cs, (efi32_boot_cs - 1b)(%ebx)
movw %ds, rva(efi32_boot_ds)(%ebp) movw %ds, (efi32_boot_ds - 1b)(%ebx)
/* Store firmware IDT descriptor */ /* 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 */ /* Disable paging */
movl %cr0, %eax movl %cr0, %eax
@@ -328,7 +345,8 @@ SYM_INNER_LABEL(efi32_pe_stub_entry, SYM_L_LOCAL)
movl %eax, %cr0 movl %eax, %cr0
jmp startup_32 jmp startup_32
SYM_FUNC_END(efi32_stub_entry) SYM_FUNC_END(efi32_entry)
__HEAD
#endif #endif
.code64 .code64
@@ -847,7 +865,9 @@ SYM_FUNC_START(efi32_pe_entry)
*/ */
subl %esi, %ebx subl %esi, %ebx
movl %ebx, rva(image_offset)(%ebp) // save image_offset 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 2: popl %edi // restore callee-save registers
popl %ebx popl %ebx