Skip to content

Commit

Permalink
Merge tag 'efi-fixes-for-v6.9-2' of git:https://git.kernel.org/pub/scm/linu…
Browse files Browse the repository at this point in the history
…x/kernel/git/efi/efi

Pull EFI fixes from Ard Biesheuvel:

 - Fix logic that is supposed to prevent placement of the kernel image
   below LOAD_PHYSICAL_ADDR

 - Use the firmware stack in the EFI stub when running in mixed mode

 - Clear BSS only once when using mixed mode

 - Check efi.get_variable() function pointer for NULL before trying to
   call it

* tag 'efi-fixes-for-v6.9-2' of git:https://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  efi: fix panic in kdump kernel
  x86/efistub: Don't clear BSS twice in mixed mode
  x86/efistub: Call mixed mode boot services on the firmware's stack
  efi/libstub: fix efi_random_alloc() to allocate memory at alloc_min or higher address
  • Loading branch information
torvalds committed Mar 24, 2024
2 parents 5e74df2 + 62b71cd commit ab8de2d
Show file tree
Hide file tree
Showing 4 changed files with 14 additions and 2 deletions.
9 changes: 9 additions & 0 deletions arch/x86/boot/compressed/efi_mixed.S
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,11 @@ SYM_FUNC_START(startup_64_mixed_mode)
lea efi32_boot_args(%rip), %rdx
mov 0(%rdx), %edi
mov 4(%rdx), %esi

/* Switch to the firmware's stack */
movl efi32_boot_sp(%rip), %esp
andl $~7, %esp

#ifdef CONFIG_EFI_HANDOVER_PROTOCOL
mov 8(%rdx), %edx // saved bootparams pointer
test %edx, %edx
Expand Down Expand Up @@ -254,6 +259,9 @@ SYM_FUNC_START_LOCAL(efi32_entry)
/* Store firmware IDT descriptor */
sidtl (efi32_boot_idt - 1b)(%ebx)

/* Store firmware stack pointer */
movl %esp, (efi32_boot_sp - 1b)(%ebx)

/* Store boot arguments */
leal (efi32_boot_args - 1b)(%ebx), %ebx
movl %ecx, 0(%ebx)
Expand Down Expand Up @@ -318,5 +326,6 @@ SYM_DATA_END(efi32_boot_idt)

SYM_DATA_LOCAL(efi32_boot_cs, .word 0)
SYM_DATA_LOCAL(efi32_boot_ds, .word 0)
SYM_DATA_LOCAL(efi32_boot_sp, .long 0)
SYM_DATA_LOCAL(efi32_boot_args, .long 0, 0, 0)
SYM_DATA(efi_is64, .byte 1)
2 changes: 2 additions & 0 deletions drivers/firmware/efi/efi.c
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,8 @@ static bool generic_ops_supported(void)

name_size = sizeof(name);

if (!efi.get_next_variable)
return false;
status = efi.get_next_variable(&name_size, &name, &guid);
if (status == EFI_UNSUPPORTED)
return false;
Expand Down
2 changes: 1 addition & 1 deletion drivers/firmware/efi/libstub/randomalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ efi_status_t efi_random_alloc(unsigned long size,
continue;
}

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

status = efi_bs_call(allocate_pages, EFI_ALLOCATE_ADDRESS,
Expand Down
3 changes: 2 additions & 1 deletion drivers/firmware/efi/libstub/x86-stub.c
Original file line number Diff line number Diff line change
Expand Up @@ -476,7 +476,8 @@ efi_status_t __efiapi efi_pe_entry(efi_handle_t handle,
efi_status_t status;
char *cmdline_ptr;

memset(_bss, 0, _ebss - _bss);
if (efi_is_native())
memset(_bss, 0, _ebss - _bss);

efi_system_table = sys_table_arg;

Expand Down

0 comments on commit ab8de2d

Please sign in to comment.