Commit 12dc9e15 authored by Ard Biesheuvel's avatar Ard Biesheuvel Committed by Ingo Molnar
Browse files

efi/libstub: Fix boot argument handling in mixed mode entry code



The mixed mode refactor actually broke mixed mode by failing to
pass the bootparam structure to startup_32(). This went unnoticed
because it apparently has a high tolerance for being passed random
junk, and still boots fine in some cases. So let's fix this by
populating %esi as required when entering via efi32_stub_entry,
and while at it, preserve the arguments themselves instead of their
address in memory (via the stack pointer) since that memory could
be clobbered before we get to it.

Signed-off-by: default avatarArd Biesheuvel <ardb@kernel.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arvind Sankar <nivedita@alum.mit.edu>
Cc: Matthew Garrett <mjg59@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-efi@vger.kernel.org
Link: https://lkml.kernel.org/r/20200103113953.9571-2-ardb@kernel.org


Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent 57ad87dd
Loading
Loading
Loading
Loading
+10 −7
Original line number Diff line number Diff line
@@ -208,13 +208,12 @@ SYM_FUNC_START(startup_32)
	pushl	$__KERNEL_CS
	leal	startup_64(%ebp), %eax
#ifdef CONFIG_EFI_MIXED
	movl	efi32_boot_args(%ebp), %ebx
	cmp	$0, %ebx
	movl	efi32_boot_args(%ebp), %edi
	cmp	$0, %edi
	jz	1f
	leal	handover_entry(%ebp), %eax
	movl	0(%ebx), %edi
	movl	4(%ebx), %esi
	movl	8(%ebx), %edx
	movl	%esi, %edx
	movl	efi32_boot_args+4(%ebp), %esi
	movl	$0x0, %ecx
1:
#endif
@@ -232,12 +231,16 @@ SYM_FUNC_END(startup_32)
	.org 0x190
SYM_FUNC_START(efi32_stub_entry)
	add	$0x4, %esp		/* Discard return address */
	popl	%ecx
	popl	%edx
	popl	%esi

	call	1f
1:	pop	%ebp
	subl	$1b, %ebp

	movl	%esp, efi32_boot_args(%ebp)
	movl	%ecx, efi32_boot_args(%ebp)
	movl	%edx, efi32_boot_args+4(%ebp)
	sgdtl	efi32_boot_gdt(%ebp)

	/* Disable paging */
@@ -628,7 +631,7 @@ SYM_DATA_START_LOCAL(gdt)
SYM_DATA_END_LABEL(gdt, SYM_L_LOCAL, gdt_end)

#ifdef CONFIG_EFI_MIXED
SYM_DATA_LOCAL(efi32_boot_args, .long 0)
SYM_DATA_LOCAL(efi32_boot_args, .long 0, 0)
#endif

/*