cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

efi_64.c (22831B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * x86_64 specific EFI support functions
      4 * Based on Extensible Firmware Interface Specification version 1.0
      5 *
      6 * Copyright (C) 2005-2008 Intel Co.
      7 *	Fenghua Yu <fenghua.yu@intel.com>
      8 *	Bibo Mao <bibo.mao@intel.com>
      9 *	Chandramouli Narayanan <mouli@linux.intel.com>
     10 *	Huang Ying <ying.huang@intel.com>
     11 *
     12 * Code to convert EFI to E820 map has been implemented in elilo bootloader
     13 * based on a EFI patch by Edgar Hucek. Based on the E820 map, the page table
     14 * is setup appropriately for EFI runtime code.
     15 * - mouli 06/14/2007.
     16 *
     17 */
     18
     19#define pr_fmt(fmt) "efi: " fmt
     20
     21#include <linux/kernel.h>
     22#include <linux/init.h>
     23#include <linux/mm.h>
     24#include <linux/types.h>
     25#include <linux/spinlock.h>
     26#include <linux/memblock.h>
     27#include <linux/ioport.h>
     28#include <linux/mc146818rtc.h>
     29#include <linux/efi.h>
     30#include <linux/export.h>
     31#include <linux/uaccess.h>
     32#include <linux/io.h>
     33#include <linux/reboot.h>
     34#include <linux/slab.h>
     35#include <linux/ucs2_string.h>
     36#include <linux/cc_platform.h>
     37#include <linux/sched/task.h>
     38
     39#include <asm/setup.h>
     40#include <asm/page.h>
     41#include <asm/e820/api.h>
     42#include <asm/tlbflush.h>
     43#include <asm/proto.h>
     44#include <asm/efi.h>
     45#include <asm/cacheflush.h>
     46#include <asm/fixmap.h>
     47#include <asm/realmode.h>
     48#include <asm/time.h>
     49#include <asm/pgalloc.h>
     50#include <asm/sev.h>
     51
     52/*
     53 * We allocate runtime services regions top-down, starting from -4G, i.e.
     54 * 0xffff_ffff_0000_0000 and limit EFI VA mapping space to 64G.
     55 */
     56static u64 efi_va = EFI_VA_START;
     57static struct mm_struct *efi_prev_mm;
     58
     59/*
     60 * We need our own copy of the higher levels of the page tables
     61 * because we want to avoid inserting EFI region mappings (EFI_VA_END
     62 * to EFI_VA_START) into the standard kernel page tables. Everything
     63 * else can be shared, see efi_sync_low_kernel_mappings().
     64 *
     65 * We don't want the pgd on the pgd_list and cannot use pgd_alloc() for the
     66 * allocation.
     67 */
     68int __init efi_alloc_page_tables(void)
     69{
     70	pgd_t *pgd, *efi_pgd;
     71	p4d_t *p4d;
     72	pud_t *pud;
     73	gfp_t gfp_mask;
     74
     75	gfp_mask = GFP_KERNEL | __GFP_ZERO;
     76	efi_pgd = (pgd_t *)__get_free_pages(gfp_mask, PGD_ALLOCATION_ORDER);
     77	if (!efi_pgd)
     78		goto fail;
     79
     80	pgd = efi_pgd + pgd_index(EFI_VA_END);
     81	p4d = p4d_alloc(&init_mm, pgd, EFI_VA_END);
     82	if (!p4d)
     83		goto free_pgd;
     84
     85	pud = pud_alloc(&init_mm, p4d, EFI_VA_END);
     86	if (!pud)
     87		goto free_p4d;
     88
     89	efi_mm.pgd = efi_pgd;
     90	mm_init_cpumask(&efi_mm);
     91	init_new_context(NULL, &efi_mm);
     92
     93	return 0;
     94
     95free_p4d:
     96	if (pgtable_l5_enabled())
     97		free_page((unsigned long)pgd_page_vaddr(*pgd));
     98free_pgd:
     99	free_pages((unsigned long)efi_pgd, PGD_ALLOCATION_ORDER);
    100fail:
    101	return -ENOMEM;
    102}
    103
    104/*
    105 * Add low kernel mappings for passing arguments to EFI functions.
    106 */
    107void efi_sync_low_kernel_mappings(void)
    108{
    109	unsigned num_entries;
    110	pgd_t *pgd_k, *pgd_efi;
    111	p4d_t *p4d_k, *p4d_efi;
    112	pud_t *pud_k, *pud_efi;
    113	pgd_t *efi_pgd = efi_mm.pgd;
    114
    115	pgd_efi = efi_pgd + pgd_index(PAGE_OFFSET);
    116	pgd_k = pgd_offset_k(PAGE_OFFSET);
    117
    118	num_entries = pgd_index(EFI_VA_END) - pgd_index(PAGE_OFFSET);
    119	memcpy(pgd_efi, pgd_k, sizeof(pgd_t) * num_entries);
    120
    121	pgd_efi = efi_pgd + pgd_index(EFI_VA_END);
    122	pgd_k = pgd_offset_k(EFI_VA_END);
    123	p4d_efi = p4d_offset(pgd_efi, 0);
    124	p4d_k = p4d_offset(pgd_k, 0);
    125
    126	num_entries = p4d_index(EFI_VA_END);
    127	memcpy(p4d_efi, p4d_k, sizeof(p4d_t) * num_entries);
    128
    129	/*
    130	 * We share all the PUD entries apart from those that map the
    131	 * EFI regions. Copy around them.
    132	 */
    133	BUILD_BUG_ON((EFI_VA_START & ~PUD_MASK) != 0);
    134	BUILD_BUG_ON((EFI_VA_END & ~PUD_MASK) != 0);
    135
    136	p4d_efi = p4d_offset(pgd_efi, EFI_VA_END);
    137	p4d_k = p4d_offset(pgd_k, EFI_VA_END);
    138	pud_efi = pud_offset(p4d_efi, 0);
    139	pud_k = pud_offset(p4d_k, 0);
    140
    141	num_entries = pud_index(EFI_VA_END);
    142	memcpy(pud_efi, pud_k, sizeof(pud_t) * num_entries);
    143
    144	pud_efi = pud_offset(p4d_efi, EFI_VA_START);
    145	pud_k = pud_offset(p4d_k, EFI_VA_START);
    146
    147	num_entries = PTRS_PER_PUD - pud_index(EFI_VA_START);
    148	memcpy(pud_efi, pud_k, sizeof(pud_t) * num_entries);
    149}
    150
    151/*
    152 * Wrapper for slow_virt_to_phys() that handles NULL addresses.
    153 */
    154static inline phys_addr_t
    155virt_to_phys_or_null_size(void *va, unsigned long size)
    156{
    157	phys_addr_t pa;
    158
    159	if (!va)
    160		return 0;
    161
    162	if (virt_addr_valid(va))
    163		return virt_to_phys(va);
    164
    165	pa = slow_virt_to_phys(va);
    166
    167	/* check if the object crosses a page boundary */
    168	if (WARN_ON((pa ^ (pa + size - 1)) & PAGE_MASK))
    169		return 0;
    170
    171	return pa;
    172}
    173
    174#define virt_to_phys_or_null(addr)				\
    175	virt_to_phys_or_null_size((addr), sizeof(*(addr)))
    176
    177int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
    178{
    179	unsigned long pfn, text, pf, rodata;
    180	struct page *page;
    181	unsigned npages;
    182	pgd_t *pgd = efi_mm.pgd;
    183
    184	/*
    185	 * It can happen that the physical address of new_memmap lands in memory
    186	 * which is not mapped in the EFI page table. Therefore we need to go
    187	 * and ident-map those pages containing the map before calling
    188	 * phys_efi_set_virtual_address_map().
    189	 */
    190	pfn = pa_memmap >> PAGE_SHIFT;
    191	pf = _PAGE_NX | _PAGE_RW | _PAGE_ENC;
    192	if (kernel_map_pages_in_pgd(pgd, pfn, pa_memmap, num_pages, pf)) {
    193		pr_err("Error ident-mapping new memmap (0x%lx)!\n", pa_memmap);
    194		return 1;
    195	}
    196
    197	/*
    198	 * Certain firmware versions are way too sentimental and still believe
    199	 * they are exclusive and unquestionable owners of the first physical page,
    200	 * even though they explicitly mark it as EFI_CONVENTIONAL_MEMORY
    201	 * (but then write-access it later during SetVirtualAddressMap()).
    202	 *
    203	 * Create a 1:1 mapping for this page, to avoid triple faults during early
    204	 * boot with such firmware. We are free to hand this page to the BIOS,
    205	 * as trim_bios_range() will reserve the first page and isolate it away
    206	 * from memory allocators anyway.
    207	 */
    208	if (kernel_map_pages_in_pgd(pgd, 0x0, 0x0, 1, pf)) {
    209		pr_err("Failed to create 1:1 mapping for the first page!\n");
    210		return 1;
    211	}
    212
    213	/*
    214	 * When SEV-ES is active, the GHCB as set by the kernel will be used
    215	 * by firmware. Create a 1:1 unencrypted mapping for each GHCB.
    216	 */
    217	if (sev_es_efi_map_ghcbs(pgd)) {
    218		pr_err("Failed to create 1:1 mapping for the GHCBs!\n");
    219		return 1;
    220	}
    221
    222	/*
    223	 * When making calls to the firmware everything needs to be 1:1
    224	 * mapped and addressable with 32-bit pointers. Map the kernel
    225	 * text and allocate a new stack because we can't rely on the
    226	 * stack pointer being < 4GB.
    227	 */
    228	if (!efi_is_mixed())
    229		return 0;
    230
    231	page = alloc_page(GFP_KERNEL|__GFP_DMA32);
    232	if (!page) {
    233		pr_err("Unable to allocate EFI runtime stack < 4GB\n");
    234		return 1;
    235	}
    236
    237	efi_mixed_mode_stack_pa = page_to_phys(page + 1); /* stack grows down */
    238
    239	npages = (_etext - _text) >> PAGE_SHIFT;
    240	text = __pa(_text);
    241	pfn = text >> PAGE_SHIFT;
    242
    243	pf = _PAGE_ENC;
    244	if (kernel_map_pages_in_pgd(pgd, pfn, text, npages, pf)) {
    245		pr_err("Failed to map kernel text 1:1\n");
    246		return 1;
    247	}
    248
    249	npages = (__end_rodata - __start_rodata) >> PAGE_SHIFT;
    250	rodata = __pa(__start_rodata);
    251	pfn = rodata >> PAGE_SHIFT;
    252
    253	pf = _PAGE_NX | _PAGE_ENC;
    254	if (kernel_map_pages_in_pgd(pgd, pfn, rodata, npages, pf)) {
    255		pr_err("Failed to map kernel rodata 1:1\n");
    256		return 1;
    257	}
    258
    259	return 0;
    260}
    261
    262static void __init __map_region(efi_memory_desc_t *md, u64 va)
    263{
    264	unsigned long flags = _PAGE_RW;
    265	unsigned long pfn;
    266	pgd_t *pgd = efi_mm.pgd;
    267
    268	/*
    269	 * EFI_RUNTIME_SERVICES_CODE regions typically cover PE/COFF
    270	 * executable images in memory that consist of both R-X and
    271	 * RW- sections, so we cannot apply read-only or non-exec
    272	 * permissions just yet. However, modern EFI systems provide
    273	 * a memory attributes table that describes those sections
    274	 * with the appropriate restricted permissions, which are
    275	 * applied in efi_runtime_update_mappings() below. All other
    276	 * regions can be mapped non-executable at this point, with
    277	 * the exception of boot services code regions, but those will
    278	 * be unmapped again entirely in efi_free_boot_services().
    279	 */
    280	if (md->type != EFI_BOOT_SERVICES_CODE &&
    281	    md->type != EFI_RUNTIME_SERVICES_CODE)
    282		flags |= _PAGE_NX;
    283
    284	if (!(md->attribute & EFI_MEMORY_WB))
    285		flags |= _PAGE_PCD;
    286
    287	if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT) &&
    288	    md->type != EFI_MEMORY_MAPPED_IO)
    289		flags |= _PAGE_ENC;
    290
    291	pfn = md->phys_addr >> PAGE_SHIFT;
    292	if (kernel_map_pages_in_pgd(pgd, pfn, va, md->num_pages, flags))
    293		pr_warn("Error mapping PA 0x%llx -> VA 0x%llx!\n",
    294			   md->phys_addr, va);
    295}
    296
    297void __init efi_map_region(efi_memory_desc_t *md)
    298{
    299	unsigned long size = md->num_pages << PAGE_SHIFT;
    300	u64 pa = md->phys_addr;
    301
    302	/*
    303	 * Make sure the 1:1 mappings are present as a catch-all for b0rked
    304	 * firmware which doesn't update all internal pointers after switching
    305	 * to virtual mode and would otherwise crap on us.
    306	 */
    307	__map_region(md, md->phys_addr);
    308
    309	/*
    310	 * Enforce the 1:1 mapping as the default virtual address when
    311	 * booting in EFI mixed mode, because even though we may be
    312	 * running a 64-bit kernel, the firmware may only be 32-bit.
    313	 */
    314	if (efi_is_mixed()) {
    315		md->virt_addr = md->phys_addr;
    316		return;
    317	}
    318
    319	efi_va -= size;
    320
    321	/* Is PA 2M-aligned? */
    322	if (!(pa & (PMD_SIZE - 1))) {
    323		efi_va &= PMD_MASK;
    324	} else {
    325		u64 pa_offset = pa & (PMD_SIZE - 1);
    326		u64 prev_va = efi_va;
    327
    328		/* get us the same offset within this 2M page */
    329		efi_va = (efi_va & PMD_MASK) + pa_offset;
    330
    331		if (efi_va > prev_va)
    332			efi_va -= PMD_SIZE;
    333	}
    334
    335	if (efi_va < EFI_VA_END) {
    336		pr_warn(FW_WARN "VA address range overflow!\n");
    337		return;
    338	}
    339
    340	/* Do the VA map */
    341	__map_region(md, efi_va);
    342	md->virt_addr = efi_va;
    343}
    344
    345/*
    346 * kexec kernel will use efi_map_region_fixed to map efi runtime memory ranges.
    347 * md->virt_addr is the original virtual address which had been mapped in kexec
    348 * 1st kernel.
    349 */
    350void __init efi_map_region_fixed(efi_memory_desc_t *md)
    351{
    352	__map_region(md, md->phys_addr);
    353	__map_region(md, md->virt_addr);
    354}
    355
    356void __init parse_efi_setup(u64 phys_addr, u32 data_len)
    357{
    358	efi_setup = phys_addr + sizeof(struct setup_data);
    359}
    360
    361static int __init efi_update_mappings(efi_memory_desc_t *md, unsigned long pf)
    362{
    363	unsigned long pfn;
    364	pgd_t *pgd = efi_mm.pgd;
    365	int err1, err2;
    366
    367	/* Update the 1:1 mapping */
    368	pfn = md->phys_addr >> PAGE_SHIFT;
    369	err1 = kernel_map_pages_in_pgd(pgd, pfn, md->phys_addr, md->num_pages, pf);
    370	if (err1) {
    371		pr_err("Error while updating 1:1 mapping PA 0x%llx -> VA 0x%llx!\n",
    372			   md->phys_addr, md->virt_addr);
    373	}
    374
    375	err2 = kernel_map_pages_in_pgd(pgd, pfn, md->virt_addr, md->num_pages, pf);
    376	if (err2) {
    377		pr_err("Error while updating VA mapping PA 0x%llx -> VA 0x%llx!\n",
    378			   md->phys_addr, md->virt_addr);
    379	}
    380
    381	return err1 || err2;
    382}
    383
    384static int __init efi_update_mem_attr(struct mm_struct *mm, efi_memory_desc_t *md)
    385{
    386	unsigned long pf = 0;
    387
    388	if (md->attribute & EFI_MEMORY_XP)
    389		pf |= _PAGE_NX;
    390
    391	if (!(md->attribute & EFI_MEMORY_RO))
    392		pf |= _PAGE_RW;
    393
    394	if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT))
    395		pf |= _PAGE_ENC;
    396
    397	return efi_update_mappings(md, pf);
    398}
    399
    400void __init efi_runtime_update_mappings(void)
    401{
    402	efi_memory_desc_t *md;
    403
    404	/*
    405	 * Use the EFI Memory Attribute Table for mapping permissions if it
    406	 * exists, since it is intended to supersede EFI_PROPERTIES_TABLE.
    407	 */
    408	if (efi_enabled(EFI_MEM_ATTR)) {
    409		efi_memattr_apply_permissions(NULL, efi_update_mem_attr);
    410		return;
    411	}
    412
    413	/*
    414	 * EFI_MEMORY_ATTRIBUTES_TABLE is intended to replace
    415	 * EFI_PROPERTIES_TABLE. So, use EFI_PROPERTIES_TABLE to update
    416	 * permissions only if EFI_MEMORY_ATTRIBUTES_TABLE is not
    417	 * published by the firmware. Even if we find a buggy implementation of
    418	 * EFI_MEMORY_ATTRIBUTES_TABLE, don't fall back to
    419	 * EFI_PROPERTIES_TABLE, because of the same reason.
    420	 */
    421
    422	if (!efi_enabled(EFI_NX_PE_DATA))
    423		return;
    424
    425	for_each_efi_memory_desc(md) {
    426		unsigned long pf = 0;
    427
    428		if (!(md->attribute & EFI_MEMORY_RUNTIME))
    429			continue;
    430
    431		if (!(md->attribute & EFI_MEMORY_WB))
    432			pf |= _PAGE_PCD;
    433
    434		if ((md->attribute & EFI_MEMORY_XP) ||
    435			(md->type == EFI_RUNTIME_SERVICES_DATA))
    436			pf |= _PAGE_NX;
    437
    438		if (!(md->attribute & EFI_MEMORY_RO) &&
    439			(md->type != EFI_RUNTIME_SERVICES_CODE))
    440			pf |= _PAGE_RW;
    441
    442		if (cc_platform_has(CC_ATTR_GUEST_MEM_ENCRYPT))
    443			pf |= _PAGE_ENC;
    444
    445		efi_update_mappings(md, pf);
    446	}
    447}
    448
    449void __init efi_dump_pagetable(void)
    450{
    451#ifdef CONFIG_EFI_PGT_DUMP
    452	ptdump_walk_pgd_level(NULL, &efi_mm);
    453#endif
    454}
    455
    456/*
    457 * Makes the calling thread switch to/from efi_mm context. Can be used
    458 * in a kernel thread and user context. Preemption needs to remain disabled
    459 * while the EFI-mm is borrowed. mmgrab()/mmdrop() is not used because the mm
    460 * can not change under us.
    461 * It should be ensured that there are no concurrent calls to this function.
    462 */
    463void efi_enter_mm(void)
    464{
    465	efi_prev_mm = current->active_mm;
    466	current->active_mm = &efi_mm;
    467	switch_mm(efi_prev_mm, &efi_mm, NULL);
    468}
    469
    470void efi_leave_mm(void)
    471{
    472	current->active_mm = efi_prev_mm;
    473	switch_mm(&efi_mm, efi_prev_mm, NULL);
    474}
    475
    476static DEFINE_SPINLOCK(efi_runtime_lock);
    477
    478/*
    479 * DS and ES contain user values.  We need to save them.
    480 * The 32-bit EFI code needs a valid DS, ES, and SS.  There's no
    481 * need to save the old SS: __KERNEL_DS is always acceptable.
    482 */
    483#define __efi_thunk(func, ...)						\
    484({									\
    485	unsigned short __ds, __es;					\
    486	efi_status_t ____s;						\
    487									\
    488	savesegment(ds, __ds);						\
    489	savesegment(es, __es);						\
    490									\
    491	loadsegment(ss, __KERNEL_DS);					\
    492	loadsegment(ds, __KERNEL_DS);					\
    493	loadsegment(es, __KERNEL_DS);					\
    494									\
    495	____s = efi64_thunk(efi.runtime->mixed_mode.func, __VA_ARGS__);	\
    496									\
    497	loadsegment(ds, __ds);						\
    498	loadsegment(es, __es);						\
    499									\
    500	____s ^= (____s & BIT(31)) | (____s & BIT_ULL(31)) << 32;	\
    501	____s;								\
    502})
    503
    504/*
    505 * Switch to the EFI page tables early so that we can access the 1:1
    506 * runtime services mappings which are not mapped in any other page
    507 * tables.
    508 *
    509 * Also, disable interrupts because the IDT points to 64-bit handlers,
    510 * which aren't going to function correctly when we switch to 32-bit.
    511 */
    512#define efi_thunk(func...)						\
    513({									\
    514	efi_status_t __s;						\
    515									\
    516	arch_efi_call_virt_setup();					\
    517									\
    518	__s = __efi_thunk(func);					\
    519									\
    520	arch_efi_call_virt_teardown();					\
    521									\
    522	__s;								\
    523})
    524
    525static efi_status_t __init __no_sanitize_address
    526efi_thunk_set_virtual_address_map(unsigned long memory_map_size,
    527				  unsigned long descriptor_size,
    528				  u32 descriptor_version,
    529				  efi_memory_desc_t *virtual_map)
    530{
    531	efi_status_t status;
    532	unsigned long flags;
    533
    534	efi_sync_low_kernel_mappings();
    535	local_irq_save(flags);
    536
    537	efi_enter_mm();
    538
    539	status = __efi_thunk(set_virtual_address_map, memory_map_size,
    540			     descriptor_size, descriptor_version, virtual_map);
    541
    542	efi_leave_mm();
    543	local_irq_restore(flags);
    544
    545	return status;
    546}
    547
    548static efi_status_t efi_thunk_get_time(efi_time_t *tm, efi_time_cap_t *tc)
    549{
    550	return EFI_UNSUPPORTED;
    551}
    552
    553static efi_status_t efi_thunk_set_time(efi_time_t *tm)
    554{
    555	return EFI_UNSUPPORTED;
    556}
    557
    558static efi_status_t
    559efi_thunk_get_wakeup_time(efi_bool_t *enabled, efi_bool_t *pending,
    560			  efi_time_t *tm)
    561{
    562	return EFI_UNSUPPORTED;
    563}
    564
    565static efi_status_t
    566efi_thunk_set_wakeup_time(efi_bool_t enabled, efi_time_t *tm)
    567{
    568	return EFI_UNSUPPORTED;
    569}
    570
    571static unsigned long efi_name_size(efi_char16_t *name)
    572{
    573	return ucs2_strsize(name, EFI_VAR_NAME_LEN) + 1;
    574}
    575
    576static efi_status_t
    577efi_thunk_get_variable(efi_char16_t *name, efi_guid_t *vendor,
    578		       u32 *attr, unsigned long *data_size, void *data)
    579{
    580	u8 buf[24] __aligned(8);
    581	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
    582	efi_status_t status;
    583	u32 phys_name, phys_vendor, phys_attr;
    584	u32 phys_data_size, phys_data;
    585	unsigned long flags;
    586
    587	spin_lock_irqsave(&efi_runtime_lock, flags);
    588
    589	*vnd = *vendor;
    590
    591	phys_data_size = virt_to_phys_or_null(data_size);
    592	phys_vendor = virt_to_phys_or_null(vnd);
    593	phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
    594	phys_attr = virt_to_phys_or_null(attr);
    595	phys_data = virt_to_phys_or_null_size(data, *data_size);
    596
    597	if (!phys_name || (data && !phys_data))
    598		status = EFI_INVALID_PARAMETER;
    599	else
    600		status = efi_thunk(get_variable, phys_name, phys_vendor,
    601				   phys_attr, phys_data_size, phys_data);
    602
    603	spin_unlock_irqrestore(&efi_runtime_lock, flags);
    604
    605	return status;
    606}
    607
    608static efi_status_t
    609efi_thunk_set_variable(efi_char16_t *name, efi_guid_t *vendor,
    610		       u32 attr, unsigned long data_size, void *data)
    611{
    612	u8 buf[24] __aligned(8);
    613	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
    614	u32 phys_name, phys_vendor, phys_data;
    615	efi_status_t status;
    616	unsigned long flags;
    617
    618	spin_lock_irqsave(&efi_runtime_lock, flags);
    619
    620	*vnd = *vendor;
    621
    622	phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
    623	phys_vendor = virt_to_phys_or_null(vnd);
    624	phys_data = virt_to_phys_or_null_size(data, data_size);
    625
    626	if (!phys_name || (data && !phys_data))
    627		status = EFI_INVALID_PARAMETER;
    628	else
    629		status = efi_thunk(set_variable, phys_name, phys_vendor,
    630				   attr, data_size, phys_data);
    631
    632	spin_unlock_irqrestore(&efi_runtime_lock, flags);
    633
    634	return status;
    635}
    636
    637static efi_status_t
    638efi_thunk_set_variable_nonblocking(efi_char16_t *name, efi_guid_t *vendor,
    639				   u32 attr, unsigned long data_size,
    640				   void *data)
    641{
    642	u8 buf[24] __aligned(8);
    643	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
    644	u32 phys_name, phys_vendor, phys_data;
    645	efi_status_t status;
    646	unsigned long flags;
    647
    648	if (!spin_trylock_irqsave(&efi_runtime_lock, flags))
    649		return EFI_NOT_READY;
    650
    651	*vnd = *vendor;
    652
    653	phys_name = virt_to_phys_or_null_size(name, efi_name_size(name));
    654	phys_vendor = virt_to_phys_or_null(vnd);
    655	phys_data = virt_to_phys_or_null_size(data, data_size);
    656
    657	if (!phys_name || (data && !phys_data))
    658		status = EFI_INVALID_PARAMETER;
    659	else
    660		status = efi_thunk(set_variable, phys_name, phys_vendor,
    661				   attr, data_size, phys_data);
    662
    663	spin_unlock_irqrestore(&efi_runtime_lock, flags);
    664
    665	return status;
    666}
    667
    668static efi_status_t
    669efi_thunk_get_next_variable(unsigned long *name_size,
    670			    efi_char16_t *name,
    671			    efi_guid_t *vendor)
    672{
    673	u8 buf[24] __aligned(8);
    674	efi_guid_t *vnd = PTR_ALIGN((efi_guid_t *)buf, sizeof(*vnd));
    675	efi_status_t status;
    676	u32 phys_name_size, phys_name, phys_vendor;
    677	unsigned long flags;
    678
    679	spin_lock_irqsave(&efi_runtime_lock, flags);
    680
    681	*vnd = *vendor;
    682
    683	phys_name_size = virt_to_phys_or_null(name_size);
    684	phys_vendor = virt_to_phys_or_null(vnd);
    685	phys_name = virt_to_phys_or_null_size(name, *name_size);
    686
    687	if (!phys_name)
    688		status = EFI_INVALID_PARAMETER;
    689	else
    690		status = efi_thunk(get_next_variable, phys_name_size,
    691				   phys_name, phys_vendor);
    692
    693	spin_unlock_irqrestore(&efi_runtime_lock, flags);
    694
    695	*vendor = *vnd;
    696	return status;
    697}
    698
    699static efi_status_t
    700efi_thunk_get_next_high_mono_count(u32 *count)
    701{
    702	return EFI_UNSUPPORTED;
    703}
    704
    705static void
    706efi_thunk_reset_system(int reset_type, efi_status_t status,
    707		       unsigned long data_size, efi_char16_t *data)
    708{
    709	u32 phys_data;
    710	unsigned long flags;
    711
    712	spin_lock_irqsave(&efi_runtime_lock, flags);
    713
    714	phys_data = virt_to_phys_or_null_size(data, data_size);
    715
    716	efi_thunk(reset_system, reset_type, status, data_size, phys_data);
    717
    718	spin_unlock_irqrestore(&efi_runtime_lock, flags);
    719}
    720
    721static efi_status_t
    722efi_thunk_update_capsule(efi_capsule_header_t **capsules,
    723			 unsigned long count, unsigned long sg_list)
    724{
    725	/*
    726	 * To properly support this function we would need to repackage
    727	 * 'capsules' because the firmware doesn't understand 64-bit
    728	 * pointers.
    729	 */
    730	return EFI_UNSUPPORTED;
    731}
    732
    733static efi_status_t
    734efi_thunk_query_variable_info(u32 attr, u64 *storage_space,
    735			      u64 *remaining_space,
    736			      u64 *max_variable_size)
    737{
    738	efi_status_t status;
    739	u32 phys_storage, phys_remaining, phys_max;
    740	unsigned long flags;
    741
    742	if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
    743		return EFI_UNSUPPORTED;
    744
    745	spin_lock_irqsave(&efi_runtime_lock, flags);
    746
    747	phys_storage = virt_to_phys_or_null(storage_space);
    748	phys_remaining = virt_to_phys_or_null(remaining_space);
    749	phys_max = virt_to_phys_or_null(max_variable_size);
    750
    751	status = efi_thunk(query_variable_info, attr, phys_storage,
    752			   phys_remaining, phys_max);
    753
    754	spin_unlock_irqrestore(&efi_runtime_lock, flags);
    755
    756	return status;
    757}
    758
    759static efi_status_t
    760efi_thunk_query_variable_info_nonblocking(u32 attr, u64 *storage_space,
    761					  u64 *remaining_space,
    762					  u64 *max_variable_size)
    763{
    764	efi_status_t status;
    765	u32 phys_storage, phys_remaining, phys_max;
    766	unsigned long flags;
    767
    768	if (efi.runtime_version < EFI_2_00_SYSTEM_TABLE_REVISION)
    769		return EFI_UNSUPPORTED;
    770
    771	if (!spin_trylock_irqsave(&efi_runtime_lock, flags))
    772		return EFI_NOT_READY;
    773
    774	phys_storage = virt_to_phys_or_null(storage_space);
    775	phys_remaining = virt_to_phys_or_null(remaining_space);
    776	phys_max = virt_to_phys_or_null(max_variable_size);
    777
    778	status = efi_thunk(query_variable_info, attr, phys_storage,
    779			   phys_remaining, phys_max);
    780
    781	spin_unlock_irqrestore(&efi_runtime_lock, flags);
    782
    783	return status;
    784}
    785
    786static efi_status_t
    787efi_thunk_query_capsule_caps(efi_capsule_header_t **capsules,
    788			     unsigned long count, u64 *max_size,
    789			     int *reset_type)
    790{
    791	/*
    792	 * To properly support this function we would need to repackage
    793	 * 'capsules' because the firmware doesn't understand 64-bit
    794	 * pointers.
    795	 */
    796	return EFI_UNSUPPORTED;
    797}
    798
    799void __init efi_thunk_runtime_setup(void)
    800{
    801	if (!IS_ENABLED(CONFIG_EFI_MIXED))
    802		return;
    803
    804	efi.get_time = efi_thunk_get_time;
    805	efi.set_time = efi_thunk_set_time;
    806	efi.get_wakeup_time = efi_thunk_get_wakeup_time;
    807	efi.set_wakeup_time = efi_thunk_set_wakeup_time;
    808	efi.get_variable = efi_thunk_get_variable;
    809	efi.get_next_variable = efi_thunk_get_next_variable;
    810	efi.set_variable = efi_thunk_set_variable;
    811	efi.set_variable_nonblocking = efi_thunk_set_variable_nonblocking;
    812	efi.get_next_high_mono_count = efi_thunk_get_next_high_mono_count;
    813	efi.reset_system = efi_thunk_reset_system;
    814	efi.query_variable_info = efi_thunk_query_variable_info;
    815	efi.query_variable_info_nonblocking = efi_thunk_query_variable_info_nonblocking;
    816	efi.update_capsule = efi_thunk_update_capsule;
    817	efi.query_capsule_caps = efi_thunk_query_capsule_caps;
    818}
    819
    820efi_status_t __init __no_sanitize_address
    821efi_set_virtual_address_map(unsigned long memory_map_size,
    822			    unsigned long descriptor_size,
    823			    u32 descriptor_version,
    824			    efi_memory_desc_t *virtual_map,
    825			    unsigned long systab_phys)
    826{
    827	const efi_system_table_t *systab = (efi_system_table_t *)systab_phys;
    828	efi_status_t status;
    829	unsigned long flags;
    830
    831	if (efi_is_mixed())
    832		return efi_thunk_set_virtual_address_map(memory_map_size,
    833							 descriptor_size,
    834							 descriptor_version,
    835							 virtual_map);
    836	efi_enter_mm();
    837
    838	efi_fpu_begin();
    839
    840	/* Disable interrupts around EFI calls: */
    841	local_irq_save(flags);
    842	status = efi_call(efi.runtime->set_virtual_address_map,
    843			  memory_map_size, descriptor_size,
    844			  descriptor_version, virtual_map);
    845	local_irq_restore(flags);
    846
    847	efi_fpu_end();
    848
    849	/* grab the virtually remapped EFI runtime services table pointer */
    850	efi.runtime = READ_ONCE(systab->runtime);
    851
    852	efi_leave_mm();
    853
    854	return status;
    855}