Commit 46d1907d authored by Linus Torvalds's avatar Linus Torvalds
Browse files

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

Pull EFI fixes from Ard Biesheuvel:
 "Another small set of EFI fixes. Only the x86 one is likely to affect
  any actual users (and has a cc:stable), but the issue it fixes was
  only observed in an unusual context (kexec in a confidential VM).

   - Ensure that EFI runtime services are not unmapped by PAN on ARM

   - Avoid freeing the memory holding the EFI memory map inadvertently
     on x86

   - Avoid a false positive kmemleak warning on arm64"

* tag 'efi-fixes-for-v6.10-3' of git://git.kernel.org/pub/scm/linux/kernel/git/efi/efi:
  efi/arm64: Fix kmemleak false positive in arm64_efi_rt_init()
  efi/x86: Free EFI memory map only when installing a new one.
  efi/arm: Disable LPAE PAN when calling EFI runtime services
parents 3d54351c 46e27b99
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@
#include <asm/mach/map.h>
#include <asm/mmu_context.h>
#include <asm/ptrace.h>
#include <asm/uaccess.h>

#ifdef CONFIG_EFI
void efi_init(void);
@@ -25,6 +26,18 @@ int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md, boo
#define arch_efi_call_virt_setup()	efi_virtmap_load()
#define arch_efi_call_virt_teardown()	efi_virtmap_unload()

#ifdef CONFIG_CPU_TTBR0_PAN
#undef arch_efi_call_virt
#define arch_efi_call_virt(p, f, args...) ({				\
	unsigned int flags = uaccess_save_and_enable();			\
	efi_status_t res = _Generic((p)->f(args),			\
			efi_status_t:	(p)->f(args),			\
			default:	((p)->f(args), EFI_ABORTED));	\
	uaccess_restore(flags);						\
	res;								\
})
#endif

#define ARCH_EFI_IRQ_FLAGS_MASK \
	(PSR_J_BIT | PSR_E_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT | \
	 PSR_T_BIT | MODE_MASK)
+2 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@

#include <linux/efi.h>
#include <linux/init.h>
#include <linux/kmemleak.h>
#include <linux/screen_info.h>
#include <linux/vmalloc.h>

@@ -213,6 +214,7 @@ l: if (!p) {
		return -ENOMEM;
	}

	kmemleak_not_leak(p);
	efi_rt_stack_top = p + THREAD_SIZE;
	return 0;
}
+0 −1
Original line number Diff line number Diff line
@@ -401,7 +401,6 @@ extern int __init efi_memmap_alloc(unsigned int num_entries,
				   struct efi_memory_map_data *data);
extern void __efi_memmap_free(u64 phys, unsigned long size,
			      unsigned long flags);
#define __efi_memmap_free __efi_memmap_free

extern int __init efi_memmap_install(struct efi_memory_map_data *data);
extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
+11 −1
Original line number Diff line number Diff line
@@ -92,12 +92,22 @@ int __init efi_memmap_alloc(unsigned int num_entries,
 */
int __init efi_memmap_install(struct efi_memory_map_data *data)
{
	unsigned long size = efi.memmap.desc_size * efi.memmap.nr_map;
	unsigned long flags = efi.memmap.flags;
	u64 phys = efi.memmap.phys_map;
	int ret;

	efi_memmap_unmap();

	if (efi_enabled(EFI_PARAVIRT))
		return 0;

	return __efi_memmap_init(data);
	ret = __efi_memmap_init(data);
	if (ret)
		return ret;

	__efi_memmap_free(phys, size, flags);
	return 0;
}

/**
+0 −9
Original line number Diff line number Diff line
@@ -15,10 +15,6 @@
#include <asm/early_ioremap.h>
#include <asm/efi.h>

#ifndef __efi_memmap_free
#define __efi_memmap_free(phys, size, flags) do { } while (0)
#endif

/**
 * __efi_memmap_init - Common code for mapping the EFI memory map
 * @data: EFI memory map data
@@ -51,11 +47,6 @@ int __init __efi_memmap_init(struct efi_memory_map_data *data)
		return -ENOMEM;
	}

	if (efi.memmap.flags & (EFI_MEMMAP_MEMBLOCK | EFI_MEMMAP_SLAB))
		__efi_memmap_free(efi.memmap.phys_map,
				  efi.memmap.desc_size * efi.memmap.nr_map,
				  efi.memmap.flags);

	map.phys_map = data->phys_map;
	map.nr_map = data->size / data->desc_size;
	map.map_end = map.map + data->size;