EFI fixes for v6.9 #3
- 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 PR -----BEGIN PGP SIGNATURE----- iHUEABYIAB0WIQQQm/3uucuRGn1Dmh0wbglWLn0tXAUCZgWMHgAKCRAwbglWLn0t XI8TAQDVLH0N1DKirQk9LzOP1oVIoEwhUWaPK/kD+8b0lO9cRAEA9IQSPIGXM4d3 X1Gd7eZDojNOew+birQjGsWyPu1CuAk= =YlEy -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
0eee99d9eb
@ -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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
*
|
*
|
||||||
* 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)
|
|||||||
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)
|
|||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user