x86/boot/compressed: Move 32-bit entrypoint code into .text section
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
This commit is contained in:
parent
cb8bda8ad4
commit
e2ab9eab32
1 changed files with 34 additions and 14 deletions
|
@ -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
|
||||||
|
@ -831,7 +849,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
|
||||||
|
|
Loading…
Add table
Reference in a new issue