Commit e42bebf6 authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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

Pull EFI fixes from Ard Biesheuvel:

 - Missing x86 patch for the runtime cleanup that was merged in -rc1

 - Kconfig tweak for kexec on x86 so EFI support does not get disabled
   inadvertently

 - Use the right EFI memory type for the unaccepted memory table so
   kexec/kdump exposes it to the crash kernel as well

 - Work around EFI implementations which do not implement
   QueryVariableInfo, which is now called by statfs() on efivarfs

* tag 'efi-fixes-for-v6.6-1' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  efivarfs: fix statfs() on efivarfs
  efi/unaccepted: Use ACPI reclaim memory for unaccepted memory table
  efi/x86: Ensure that EFI_RUNTIME_MAP is enabled for kexec
  efi/x86: Move EFI runtime call setup/teardown helpers out of line
parents 02e768c9 79b83606
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -1945,6 +1945,7 @@ config EFI
	select UCS2_STRING
	select UCS2_STRING
	select EFI_RUNTIME_WRAPPERS
	select EFI_RUNTIME_WRAPPERS
	select ARCH_USE_MEMREMAP_PROT
	select ARCH_USE_MEMREMAP_PROT
	select EFI_RUNTIME_MAP if KEXEC_CORE
	help
	help
	  This enables the kernel to use EFI runtime services that are
	  This enables the kernel to use EFI runtime services that are
	  available (such as the EFI variable services).
	  available (such as the EFI variable services).
@@ -2020,7 +2021,6 @@ config EFI_MAX_FAKE_MEM
config EFI_RUNTIME_MAP
config EFI_RUNTIME_MAP
	bool "Export EFI runtime maps to sysfs" if EXPERT
	bool "Export EFI runtime maps to sysfs" if EXPERT
	depends on EFI
	depends on EFI
	default KEXEC_CORE
	help
	help
	  Export EFI runtime memory regions to /sys/firmware/efi/runtime-map.
	  Export EFI runtime memory regions to /sys/firmware/efi/runtime-map.
	  That memory map is required by the 2nd kernel to set up EFI virtual
	  That memory map is required by the 2nd kernel to set up EFI virtual
+2 −30
Original line number Original line Diff line number Diff line
@@ -91,19 +91,6 @@ static inline void efi_fpu_end(void)


#ifdef CONFIG_X86_32
#ifdef CONFIG_X86_32
#define EFI_X86_KERNEL_ALLOC_LIMIT		(SZ_512M - 1)
#define EFI_X86_KERNEL_ALLOC_LIMIT		(SZ_512M - 1)

#define arch_efi_call_virt_setup()					\
({									\
	efi_fpu_begin();						\
	firmware_restrict_branch_speculation_start();			\
})

#define arch_efi_call_virt_teardown()					\
({									\
	firmware_restrict_branch_speculation_end();			\
	efi_fpu_end();							\
})

#else /* !CONFIG_X86_32 */
#else /* !CONFIG_X86_32 */
#define EFI_X86_KERNEL_ALLOC_LIMIT		EFI_ALLOC_LIMIT
#define EFI_X86_KERNEL_ALLOC_LIMIT		EFI_ALLOC_LIMIT


@@ -116,14 +103,6 @@ extern bool efi_disable_ibt_for_runtime;
	__efi_call(__VA_ARGS__);					\
	__efi_call(__VA_ARGS__);					\
})
})


#define arch_efi_call_virt_setup()					\
({									\
	efi_sync_low_kernel_mappings();					\
	efi_fpu_begin();						\
	firmware_restrict_branch_speculation_start();			\
	efi_enter_mm();							\
})

#undef arch_efi_call_virt
#undef arch_efi_call_virt
#define arch_efi_call_virt(p, f, args...) ({				\
#define arch_efi_call_virt(p, f, args...) ({				\
	u64 ret, ibt = ibt_save(efi_disable_ibt_for_runtime);		\
	u64 ret, ibt = ibt_save(efi_disable_ibt_for_runtime);		\
@@ -132,13 +111,6 @@ extern bool efi_disable_ibt_for_runtime;
	ret;								\
	ret;								\
})
})


#define arch_efi_call_virt_teardown()					\
({									\
	efi_leave_mm();							\
	firmware_restrict_branch_speculation_end();			\
	efi_fpu_end();							\
})

#ifdef CONFIG_KASAN
#ifdef CONFIG_KASAN
/*
/*
 * CONFIG_KASAN may redefine memset to __memset.  __memset function is present
 * CONFIG_KASAN may redefine memset to __memset.  __memset function is present
@@ -168,8 +140,8 @@ extern void efi_delete_dummy_variable(void);
extern void efi_crash_gracefully_on_page_fault(unsigned long phys_addr);
extern void efi_crash_gracefully_on_page_fault(unsigned long phys_addr);
extern void efi_free_boot_services(void);
extern void efi_free_boot_services(void);


void efi_enter_mm(void);
void arch_efi_call_virt_setup(void);
void efi_leave_mm(void);
void arch_efi_call_virt_teardown(void);


/* kexec external ABI */
/* kexec external ABI */
struct efi_setup_data {
struct efi_setup_data {
+12 −0
Original line number Original line Diff line number Diff line
@@ -140,3 +140,15 @@ void __init efi_runtime_update_mappings(void)
		}
		}
	}
	}
}
}

void arch_efi_call_virt_setup(void)
{
	efi_fpu_begin();
	firmware_restrict_branch_speculation_start();
}

void arch_efi_call_virt_teardown(void)
{
	firmware_restrict_branch_speculation_end();
	efi_fpu_end();
}
+17 −2
Original line number Original line Diff line number Diff line
@@ -474,19 +474,34 @@ void __init efi_dump_pagetable(void)
 * can not change under us.
 * can not change under us.
 * It should be ensured that there are no concurrent calls to this function.
 * It should be ensured that there are no concurrent calls to this function.
 */
 */
void efi_enter_mm(void)
static void efi_enter_mm(void)
{
{
	efi_prev_mm = current->active_mm;
	efi_prev_mm = current->active_mm;
	current->active_mm = &efi_mm;
	current->active_mm = &efi_mm;
	switch_mm(efi_prev_mm, &efi_mm, NULL);
	switch_mm(efi_prev_mm, &efi_mm, NULL);
}
}


void efi_leave_mm(void)
static void efi_leave_mm(void)
{
{
	current->active_mm = efi_prev_mm;
	current->active_mm = efi_prev_mm;
	switch_mm(&efi_mm, efi_prev_mm, NULL);
	switch_mm(&efi_mm, efi_prev_mm, NULL);
}
}


void arch_efi_call_virt_setup(void)
{
	efi_sync_low_kernel_mappings();
	efi_fpu_begin();
	firmware_restrict_branch_speculation_start();
	efi_enter_mm();
}

void arch_efi_call_virt_teardown(void)
{
	efi_leave_mm();
	firmware_restrict_branch_speculation_end();
	efi_fpu_end();
}

static DEFINE_SPINLOCK(efi_runtime_lock);
static DEFINE_SPINLOCK(efi_runtime_lock);


/*
/*
+1 −1
Original line number Original line Diff line number Diff line
@@ -62,7 +62,7 @@ efi_status_t allocate_unaccepted_bitmap(__u32 nr_desc,
	bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
	bitmap_size = DIV_ROUND_UP(unaccepted_end - unaccepted_start,
				   EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);
				   EFI_UNACCEPTED_UNIT_SIZE * BITS_PER_BYTE);


	status = efi_bs_call(allocate_pool, EFI_LOADER_DATA,
	status = efi_bs_call(allocate_pool, EFI_ACPI_RECLAIM_MEMORY,
			     sizeof(*unaccepted_table) + bitmap_size,
			     sizeof(*unaccepted_table) + bitmap_size,
			     (void **)&unaccepted_table);
			     (void **)&unaccepted_table);
	if (status != EFI_SUCCESS) {
	if (status != EFI_SUCCESS) {
Loading