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

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
...@@ -15,10 +15,12 @@ ...@@ -15,10 +15,12 @@
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
#include <asm/asm-offsets.h>
#include <asm/msr.h> #include <asm/msr.h>
#include <asm/page_types.h> #include <asm/page_types.h>
#include <asm/processor-flags.h> #include <asm/processor-flags.h>
#include <asm/segment.h> #include <asm/segment.h>
#include <asm/setup.h>
.code64 .code64
.text .text
...@@ -149,6 +151,7 @@ SYM_FUNC_END(__efi64_thunk) ...@@ -149,6 +151,7 @@ SYM_FUNC_END(__efi64_thunk)
SYM_FUNC_START(efi32_stub_entry) SYM_FUNC_START(efi32_stub_entry)
call 1f call 1f
1: popl %ecx 1: popl %ecx
leal (efi32_boot_args - 1b)(%ecx), %ebx
/* Clear BSS */ /* Clear BSS */
xorl %eax, %eax xorl %eax, %eax
...@@ -163,6 +166,7 @@ SYM_FUNC_START(efi32_stub_entry) ...@@ -163,6 +166,7 @@ SYM_FUNC_START(efi32_stub_entry)
popl %ecx popl %ecx
popl %edx popl %edx
popl %esi popl %esi
movl %esi, 8(%ebx)
jmp efi32_entry jmp efi32_entry
SYM_FUNC_END(efi32_stub_entry) SYM_FUNC_END(efi32_stub_entry)
#endif #endif
...@@ -239,8 +243,6 @@ SYM_FUNC_END(efi_enter32) ...@@ -239,8 +243,6 @@ SYM_FUNC_END(efi_enter32)
* *
* Arguments: %ecx image handle * Arguments: %ecx image handle
* %edx EFI system table pointer * %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 * 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 * are considered live except for the function parameters. [Note that the EFI
...@@ -266,9 +268,18 @@ SYM_FUNC_START_LOCAL(efi32_entry) ...@@ -266,9 +268,18 @@ SYM_FUNC_START_LOCAL(efi32_entry)
leal (efi32_boot_args - 1b)(%ebx), %ebx leal (efi32_boot_args - 1b)(%ebx), %ebx
movl %ecx, 0(%ebx) movl %ecx, 0(%ebx)
movl %edx, 4(%ebx) movl %edx, 4(%ebx)
movl %esi, 8(%ebx)
movb $0x0, 12(%ebx) // efi_is64 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 */ /* Disable paging */
movl %cr0, %eax movl %cr0, %eax
btrl $X86_CR0_PG_BIT, %eax btrl $X86_CR0_PG_BIT, %eax
...@@ -294,8 +305,7 @@ SYM_FUNC_START(efi32_pe_entry) ...@@ -294,8 +305,7 @@ SYM_FUNC_START(efi32_pe_entry)
movl 8(%ebp), %ecx // image_handle movl 8(%ebp), %ecx // image_handle
movl 12(%ebp), %edx // sys_table movl 12(%ebp), %edx // sys_table
xorl %esi, %esi jmp efi32_entry // pass %ecx, %edx
jmp efi32_entry // pass %ecx, %edx, %esi
// no other registers remain live // no other registers remain live
2: popl %edi // restore callee-save registers 2: popl %edi // restore callee-save registers
......
...@@ -120,7 +120,7 @@ efi_status_t efi_random_alloc(unsigned long size, ...@@ -120,7 +120,7 @@ efi_status_t efi_random_alloc(unsigned long size,
continue; 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; pages = size / EFI_PAGE_SIZE;
status = efi_bs_call(allocate_pages, EFI_ALLOCATE_ADDRESS, status = efi_bs_call(allocate_pages, EFI_ALLOCATE_ADDRESS,
......
...@@ -496,6 +496,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle, ...@@ -496,6 +496,7 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
hdr->vid_mode = 0xffff; hdr->vid_mode = 0xffff;
hdr->type_of_loader = 0x21; hdr->type_of_loader = 0x21;
hdr->initrd_addr_max = INT_MAX;
/* Convert unicode cmdline to ascii */ /* Convert unicode cmdline to ascii */
cmdline_ptr = efi_convert_cmdline(image, &options_size); cmdline_ptr = efi_convert_cmdline(image, &options_size);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment