Commit 0eee99d9 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'efi-fixes-for-v6.9-3' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi

Pull EFI fixes from Ard Biesheuvel:
 "These address all the outstanding EFI/x86 boot related regressions:

   - Revert to the old initrd memory allocation soft limit of INT_MAX,
     which was dropped inadvertently

   - Ensure that startup_32() is entered with a valid boot_params
     pointer when using the new EFI mixed mode protocol

   - Fix a compiler warning introduced by a fix from the previous pull"

* tag 'efi-fixes-for-v6.9-3' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  x86/efistub: Reinstate soft limit for initrd loading
  efi/libstub: Cast away type warning in use of max()
  x86/efistub: Add missing boot_params for mixed mode compat entry
parents 033e8088 decd347c
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -15,10 +15,12 @@
 */

#include <linux/linkage.h>
#include <asm/asm-offsets.h>
#include <asm/msr.h>
#include <asm/page_types.h>
#include <asm/processor-flags.h>
#include <asm/segment.h>
#include <asm/setup.h>

	.code64
	.text
@@ -149,6 +151,7 @@ SYM_FUNC_END(__efi64_thunk)
SYM_FUNC_START(efi32_stub_entry)
	call	1f
1:	popl	%ecx
	leal	(efi32_boot_args - 1b)(%ecx), %ebx

	/* Clear BSS */
	xorl	%eax, %eax
@@ -163,6 +166,7 @@ SYM_FUNC_START(efi32_stub_entry)
	popl	%ecx
	popl	%edx
	popl	%esi
	movl	%esi, 8(%ebx)
	jmp	efi32_entry
SYM_FUNC_END(efi32_stub_entry)
#endif
@@ -239,8 +243,6 @@ SYM_FUNC_END(efi_enter32)
 *
 * 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
@@ -266,9 +268,18 @@ SYM_FUNC_START_LOCAL(efi32_entry)
	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

	/*
	 * Allocate some memory for a temporary struct boot_params, which only
	 * needs the minimal pieces that startup_32() relies on.
	 */
	subl	$PARAM_SIZE, %esp
	movl	%esp, %esi
	movl	$PAGE_SIZE, BP_kernel_alignment(%esi)
	movl	$_end - 1b, BP_init_size(%esi)
	subl	$startup_32 - 1b, BP_init_size(%esi)

	/* Disable paging */
	movl	%cr0, %eax
	btrl	$X86_CR0_PG_BIT, %eax
@@ -294,8 +305,7 @@ SYM_FUNC_START(efi32_pe_entry)

	movl	8(%ebp), %ecx			// image_handle
	movl	12(%ebp), %edx			// sys_table
	xorl	%esi, %esi
	jmp	efi32_entry			// pass %ecx, %edx, %esi
	jmp	efi32_entry			// pass %ecx, %edx
						// no other registers remain live

2:	popl	%edi				// restore callee-save registers
+1 −1
Original line number Diff line number Diff line
@@ -120,7 +120,7 @@ efi_status_t efi_random_alloc(unsigned long size,
			continue;
		}

		target = round_up(max(md->phys_addr, alloc_min), align) + target_slot * align;
		target = round_up(max_t(u64, md->phys_addr, alloc_min), align) + target_slot * align;
		pages = size / EFI_PAGE_SIZE;

		status = efi_bs_call(allocate_pages, EFI_ALLOCATE_ADDRESS,
+1 −0
Original line number Diff line number Diff line
@@ -496,6 +496,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
	hdr->vid_mode	= 0xffff;

	hdr->type_of_loader = 0x21;
	hdr->initrd_addr_max = INT_MAX;

	/* Convert unicode cmdline to ascii */
	cmdline_ptr = efi_convert_cmdline(image, &options_size);