Linux Audio

Check our new training course

Loading...
v5.4
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _ASM_EFI_H
  3#define _ASM_EFI_H
  4
  5#include <asm/boot.h>
  6#include <asm/cpufeature.h>
  7#include <asm/fpsimd.h>
  8#include <asm/io.h>
  9#include <asm/memory.h>
 10#include <asm/mmu_context.h>
 11#include <asm/neon.h>
 12#include <asm/ptrace.h>
 13#include <asm/tlbflush.h>
 14
 15#ifdef CONFIG_EFI
 16extern void efi_init(void);
 
 
 17#else
 18#define efi_init()
 
 
 
 
 
 
 19#endif
 20
 21int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md);
 22int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md);
 23
 24#define arch_efi_call_virt_setup()					\
 25({									\
 26	efi_virtmap_load();						\
 27	__efi_fpsimd_begin();						\
 28})
 29
 
 30#define arch_efi_call_virt(p, f, args...)				\
 31({									\
 32	efi_##f##_t *__f;						\
 33	__f = p->f;							\
 34	__efi_rt_asm_wrapper(__f, #f, args);				\
 35})
 36
 37#define arch_efi_call_virt_teardown()					\
 38({									\
 39	__efi_fpsimd_end();						\
 40	efi_virtmap_unload();						\
 41})
 42
 
 43efi_status_t __efi_rt_asm_wrapper(void *, const char *, ...);
 44
 
 
 
 
 
 
 
 
 
 
 
 45#define ARCH_EFI_IRQ_FLAGS_MASK (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT)
 46
 47/*
 48 * Even when Linux uses IRQ priorities for IRQ disabling, EFI does not.
 49 * And EFI shouldn't really play around with priority masking as it is not aware
 50 * which priorities the OS has assigned to its interrupts.
 51 */
 52#define arch_efi_save_flags(state_flags)		\
 53	((void)((state_flags) = read_sysreg(daif)))
 54
 55#define arch_efi_restore_flags(state_flags)	write_sysreg(state_flags, daif)
 56
 57
 58/* arch specific definitions used by the stub code */
 59
 60/*
 61 * AArch64 requires the DTB to be 8-byte aligned in the first 512MiB from
 62 * start of kernel and may not cross a 2MiB boundary. We set alignment to
 63 * 2MiB so we know it won't cross a 2MiB boundary.
 64 */
 65#define EFI_FDT_ALIGN	SZ_2M   /* used by allocate_new_fdt_and_exit_boot() */
 66
 67/*
 68 * In some configurations (e.g. VMAP_STACK && 64K pages), stacks built into the
 69 * kernel need greater alignment than we require the segments to be padded to.
 70 */
 71#define EFI_KIMG_ALIGN	\
 72	(SEGMENT_ALIGN > THREAD_ALIGN ? SEGMENT_ALIGN : THREAD_ALIGN)
 73
 74/* on arm64, the FDT may be located anywhere in system RAM */
 75static inline unsigned long efi_get_max_fdt_addr(unsigned long dram_base)
 76{
 77	return ULONG_MAX;
 78}
 79
 80/*
 81 * On arm64, we have to ensure that the initrd ends up in the linear region,
 82 * which is a 1 GB aligned region of size '1UL << (VA_BITS_MIN - 1)' that is
 83 * guaranteed to cover the kernel Image.
 84 *
 85 * Since the EFI stub is part of the kernel Image, we can relax the
 86 * usual requirements in Documentation/arm64/booting.rst, which still
 87 * apply to other bootloaders, and are required for some kernel
 88 * configurations.
 89 */
 90static inline unsigned long efi_get_max_initrd_addr(unsigned long dram_base,
 91						    unsigned long image_addr)
 92{
 93	return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
 94}
 95
 96#define efi_call_early(f, ...)		sys_table_arg->boottime->f(__VA_ARGS__)
 97#define __efi_call_early(f, ...)	f(__VA_ARGS__)
 98#define efi_call_runtime(f, ...)	sys_table_arg->runtime->f(__VA_ARGS__)
 99#define efi_is_64bit()			(true)
100
101#define efi_table_attr(table, attr, instance)				\
102	((table##_t *)instance)->attr
103
104#define efi_call_proto(protocol, f, instance, ...)			\
105	((protocol##_t *)instance)->f(instance, ##__VA_ARGS__)
106
107#define alloc_screen_info(x...)		&screen_info
108
109static inline void free_screen_info(efi_system_table_t *sys_table_arg,
110				    struct screen_info *si)
111{
112}
113
114/* redeclare as 'hidden' so the compiler will generate relative references */
115extern struct screen_info screen_info __attribute__((__visibility__("hidden")));
116
117static inline void efifb_setup_from_dmi(struct screen_info *si, const char *opt)
118{
 
 
 
 
 
 
 
119}
120
121#define EFI_ALLOC_ALIGN		SZ_64K
 
 
 
122
123/*
124 * On ARM systems, virtually remapped UEFI runtime services are set up in two
125 * distinct stages:
126 * - The stub retrieves the final version of the memory map from UEFI, populates
127 *   the virt_addr fields and calls the SetVirtualAddressMap() [SVAM] runtime
128 *   service to communicate the new mapping to the firmware (Note that the new
129 *   mapping is not live at this time)
130 * - During an early initcall(), the EFI system table is permanently remapped
131 *   and the virtual remapping of the UEFI Runtime Services regions is loaded
132 *   into a private set of page tables. If this all succeeds, the Runtime
133 *   Services are enabled and the EFI_RUNTIME_SERVICES bit set.
134 */
135
136static inline void efi_set_pgd(struct mm_struct *mm)
137{
138	__switch_mm(mm);
139
140	if (system_uses_ttbr0_pan()) {
141		if (mm != current->active_mm) {
142			/*
143			 * Update the current thread's saved ttbr0 since it is
144			 * restored as part of a return from exception. Enable
145			 * access to the valid TTBR0_EL1 and invoke the errata
146			 * workaround directly since there is no return from
147			 * exception when invoking the EFI run-time services.
148			 */
149			update_saved_ttbr0(current, mm);
150			uaccess_ttbr0_enable();
151			post_ttbr_update_workaround();
152		} else {
153			/*
154			 * Defer the switch to the current thread's TTBR0_EL1
155			 * until uaccess_enable(). Restore the current
156			 * thread's saved ttbr0 corresponding to its active_mm
157			 */
158			uaccess_ttbr0_disable();
159			update_saved_ttbr0(current, current->active_mm);
160		}
161	}
162}
163
164void efi_virtmap_load(void);
165void efi_virtmap_unload(void);
 
 
 
 
 
 
 
 
 
166
167#endif /* _ASM_EFI_H */
v6.8
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _ASM_EFI_H
  3#define _ASM_EFI_H
  4
  5#include <asm/boot.h>
  6#include <asm/cpufeature.h>
  7#include <asm/fpsimd.h>
  8#include <asm/io.h>
  9#include <asm/memory.h>
 10#include <asm/mmu_context.h>
 11#include <asm/neon.h>
 12#include <asm/ptrace.h>
 13#include <asm/tlbflush.h>
 14
 15#ifdef CONFIG_EFI
 16extern void efi_init(void);
 17
 18bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg);
 19#else
 20#define efi_init()
 21
 22static inline
 23bool efi_runtime_fixup_exception(struct pt_regs *regs, const char *msg)
 24{
 25	return false;
 26}
 27#endif
 28
 29int efi_create_mapping(struct mm_struct *mm, efi_memory_desc_t *md);
 30int efi_set_mapping_permissions(struct mm_struct *mm, efi_memory_desc_t *md,
 31				bool has_bti);
 
 
 
 
 
 32
 33#undef arch_efi_call_virt
 34#define arch_efi_call_virt(p, f, args...)				\
 35	__efi_rt_asm_wrapper((p)->f, #f, args)
 
 
 
 
 
 
 
 
 
 
 36
 37extern u64 *efi_rt_stack_top;
 38efi_status_t __efi_rt_asm_wrapper(void *, const char *, ...);
 39
 40void arch_efi_call_virt_setup(void);
 41void arch_efi_call_virt_teardown(void);
 42
 43/*
 44 * efi_rt_stack_top[-1] contains the value the stack pointer had before
 45 * switching to the EFI runtime stack.
 46 */
 47#define current_in_efi()						\
 48	(!preemptible() && efi_rt_stack_top != NULL &&			\
 49	 on_task_stack(current, READ_ONCE(efi_rt_stack_top[-1]), 1))
 50
 51#define ARCH_EFI_IRQ_FLAGS_MASK (PSR_D_BIT | PSR_A_BIT | PSR_I_BIT | PSR_F_BIT)
 52
 53/*
 54 * Even when Linux uses IRQ priorities for IRQ disabling, EFI does not.
 55 * And EFI shouldn't really play around with priority masking as it is not aware
 56 * which priorities the OS has assigned to its interrupts.
 57 */
 58#define arch_efi_save_flags(state_flags)		\
 59	((void)((state_flags) = read_sysreg(daif)))
 60
 61#define arch_efi_restore_flags(state_flags)	write_sysreg(state_flags, daif)
 62
 63
 64/* arch specific definitions used by the stub code */
 65
 66/*
 
 
 
 
 
 
 
 67 * In some configurations (e.g. VMAP_STACK && 64K pages), stacks built into the
 68 * kernel need greater alignment than we require the segments to be padded to.
 69 */
 70#define EFI_KIMG_ALIGN	\
 71	(SEGMENT_ALIGN > THREAD_ALIGN ? SEGMENT_ALIGN : THREAD_ALIGN)
 72
 
 
 
 
 
 
 73/*
 74 * On arm64, we have to ensure that the initrd ends up in the linear region,
 75 * which is a 1 GB aligned region of size '1UL << (VA_BITS_MIN - 1)' that is
 76 * guaranteed to cover the kernel Image.
 77 *
 78 * Since the EFI stub is part of the kernel Image, we can relax the
 79 * usual requirements in Documentation/arch/arm64/booting.rst, which still
 80 * apply to other bootloaders, and are required for some kernel
 81 * configurations.
 82 */
 83static inline unsigned long efi_get_max_initrd_addr(unsigned long image_addr)
 
 84{
 85	return (image_addr & ~(SZ_1G - 1UL)) + (1UL << (VA_BITS_MIN - 1));
 86}
 87
 88static inline unsigned long efi_get_kimg_min_align(void)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 89{
 90	extern bool efi_nokaslr;
 
 
 
 91
 92	/*
 93	 * Although relocatable kernels can fix up the misalignment with
 94	 * respect to MIN_KIMG_ALIGN, the resulting virtual text addresses are
 95	 * subtly out of sync with those recorded in the vmlinux when kaslr is
 96	 * disabled but the image required relocation anyway. Therefore retain
 97	 * 2M alignment if KASLR was explicitly disabled, even if it was not
 98	 * going to be activated to begin with.
 99	 */
100	return efi_nokaslr ? MIN_KIMG_ALIGN : EFI_KIMG_ALIGN;
101}
102
103#define EFI_ALLOC_ALIGN		SZ_64K
104#define EFI_ALLOC_LIMIT		((1UL << 48) - 1)
105
106extern unsigned long primary_entry_offset(void);
107
108/*
109 * On ARM systems, virtually remapped UEFI runtime services are set up in two
110 * distinct stages:
111 * - The stub retrieves the final version of the memory map from UEFI, populates
112 *   the virt_addr fields and calls the SetVirtualAddressMap() [SVAM] runtime
113 *   service to communicate the new mapping to the firmware (Note that the new
114 *   mapping is not live at this time)
115 * - During an early initcall(), the EFI system table is permanently remapped
116 *   and the virtual remapping of the UEFI Runtime Services regions is loaded
117 *   into a private set of page tables. If this all succeeds, the Runtime
118 *   Services are enabled and the EFI_RUNTIME_SERVICES bit set.
119 */
120
121static inline void efi_set_pgd(struct mm_struct *mm)
122{
123	__switch_mm(mm);
124
125	if (system_uses_ttbr0_pan()) {
126		if (mm != current->active_mm) {
127			/*
128			 * Update the current thread's saved ttbr0 since it is
129			 * restored as part of a return from exception. Enable
130			 * access to the valid TTBR0_EL1 and invoke the errata
131			 * workaround directly since there is no return from
132			 * exception when invoking the EFI run-time services.
133			 */
134			update_saved_ttbr0(current, mm);
135			uaccess_ttbr0_enable();
136			post_ttbr_update_workaround();
137		} else {
138			/*
139			 * Defer the switch to the current thread's TTBR0_EL1
140			 * until uaccess_enable(). Restore the current
141			 * thread's saved ttbr0 corresponding to its active_mm
142			 */
143			uaccess_ttbr0_disable();
144			update_saved_ttbr0(current, current->active_mm);
145		}
146	}
147}
148
149void efi_virtmap_load(void);
150void efi_virtmap_unload(void);
151
152static inline void efi_capsule_flush_cache_range(void *addr, int size)
153{
154	dcache_clean_inval_poc((unsigned long)addr, (unsigned long)addr + size);
155}
156
157efi_status_t efi_handle_corrupted_x18(efi_status_t s, const char *f);
158
159void efi_icache_sync(unsigned long start, unsigned long end);
160
161#endif /* _ASM_EFI_H */