mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
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:
committed by
Greg Kroah-Hartman
parent
bad6e66d07
commit
3bad8dc0ae
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user