/* SPDX-License-Identifier: GPL-2.0 */1#ifndef _ASM_EFI_H2#define _ASM_EFI_H34#include <asm/boot.h>5#include <asm/cpufeature.h>6#include <asm/fpsimd.h>7#include <asm/io.h>8#include <asm/memory.h>9#include <asm/mmu_context.h>10#include <asm/neon.h>11#include <asm/ptrace.h>12#include <asm/tlbflush.h>1314#ifdef CONFIG_EFI15extern void efi_init(void);1617bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg);18#else19#define efi_init()2021static inline22bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg)23{24return false;25}26#endif2728int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md);29int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md,30bool has_bti);3132#undef arch_efi_call_virt33#define arch_efi_call_virt(p, f, args...) \34__efi_rt_asm_wrapper((p)->f, #f, args)3536extern u64 *efi_rt_stack_top;37efi_status_t __efi_rt_asm_wrapper(void *, const char *, ...);3839void arch_efi_call_virt_setup(void);40void arch_efi_call_virt_teardown(void);4142/*43* efi_rt_stack_top[-1] contains the value the stack pointer had before44* switching to the EFI runtime stack.45*/46#define current_in_efi() \47(!preemptible() && efi_rt_stack_top != NULL && \48on_task_stack(current, READ_ONCE(efi_rt_stack_top[-1]), 1))4950#define ARCH_EFI_IRQ_FLAGS_MASK (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT)5152/*53* Even when Linux uses IRQ priorities for IRQ disabling, EFI does not.54* And EFI shouldn't really play around with priority masking as it is not aware55* which priorities the OS has assigned to its interrupts.56*/57#define arch_efi_save_flags(state_flags) \58((void)((state_flags) = read_sysreg(daif)))5960#define arch_efi_restore_flags(state_flags) write_sysreg(state_flags, daif)616263/* arch specific definitions used by the stub code */6465/*66* In some configurations (e.g. VMAP_STACK && 64K pages), stacks built into the67* kernel need greater alignment than we require the segments to be padded to.68*/69#define EFI_KIMG_ALIGN \70(SEGMENT_ALIGN > THREAD_ALIGN ? SEGMENT_ALIGN : THREAD_ALIGN)7172/*73* On arm64, we have to ensure that the initrd ends up in the linear region,74* which is a 1 GB aligned region of size '1UL << (VA_BITS_MIN - 1)' that is75* guaranteed to cover the kernel Image.76*77* Since the EFI stub is part of the kernel Image, we can relax the78* usual requirements in Documentation/arch/arm64/booting.rst, which still79* apply to other bootloaders, and are required for some kernel80* configurations.81*/82static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)83{84return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));85}8687static inline unsigned long efi_get_kimg_min_align(void)88{89extern bool efi_nokaslr;9091/*92* Although relocatable kernels can fix up the misalignment with93* respect to MIN_KIMG_ALIGN, the resulting virtual text addresses are94* subtly out of sync with those recorded in the vmlinux when kaslr is95* disabled but the image required relocation anyway. Therefore retain96* 2M alignment if KASLR was explicitly disabled, even if it was not97* going to be activated to begin with.98*/99return efi_nokaslr ? MIN_KIMG_ALIGN : EFI_KIMG_ALIGN;100}101102#define EFI_ALLOC_ALIGN SZ_64K103#define EFI_ALLOC_LIMIT ((1UL << 48) - 1)104105extern unsigned long primary_entry_offset(void);106107/*108* On ARM systems, virtually remapped UEFI runtime services are set up in two109* distinct stages:110* - The stub retrieves the final version of the memory map from UEFI, populates111* the virt_addr fields and calls the SetVirtualAddressMap() [SVAM] runtime112* service to communicate the new mapping to the firmware (Note that the new113* mapping is not live at this time)114* - During an early initcall(), the EFI system table is permanently remapped115* and the virtual remapping of the UEFI Runtime Services regions is loaded116* into a private set of page tables. If this all succeeds, the Runtime117* Services are enabled and the EFI_RUNTIME_SERVICES bit set.118*/119120static inline void efi_set_pgd(struct mm_struct *mm)121{122__switch_mm(mm);123124if (system_uses_ttbr0_pan()) {125if (mm != current->active_mm) {126/*127* Update the current thread's saved ttbr0 since it is128* restored as part of a return from exception. Enable129* access to the valid TTBR0_EL1 and invoke the errata130* workaround directly since there is no return from131* exception when invoking the EFI run-time services.132*/133update_saved_ttbr0(current, mm);134uaccess_ttbr0_enable();135post_ttbr_update_workaround();136} else {137/*138* Defer the switch to the current thread's TTBR0_EL1139* until uaccess_enable(). Restore the current140* thread's saved ttbr0 corresponding to its active_mm141*/142uaccess_ttbr0_disable();143update_saved_ttbr0(current, current->active_mm);144}145}146}147148void efi_virtmap_load(void);149void efi_virtmap_unload(void);150151static inline void efi_capsule_flush_cache_range(void *addr, int size)152{153dcache_clean_inval_poc((unsigned long)addr, (unsigned long)addr + size);154}155156efi_status_t efi_handle_corrupted_x18(efi_status_t s, const char *f);157158void efi_icache_sync(unsigned long start, unsigned long end);159160#endif /* _ASM_EFI_H */161162163