root/arch/x86/include/asm/efi.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. efi_is_native
  2. efi_runtime_supported
  3. efi_thunk_runtime_setup
  4. efi_thunk_set_virtual_address_map
  5. efi_is_64bit
  6. parse_efi_setup
  7. efi_reboot_required
  8. efi_is_table_address

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _ASM_X86_EFI_H
   3 #define _ASM_X86_EFI_H
   4 
   5 #include <asm/fpu/api.h>
   6 #include <asm/pgtable.h>
   7 #include <asm/processor-flags.h>
   8 #include <asm/tlb.h>
   9 #include <asm/nospec-branch.h>
  10 #include <asm/mmu_context.h>
  11 
  12 /*
  13  * We map the EFI regions needed for runtime services non-contiguously,
  14  * with preserved alignment on virtual addresses starting from -4G down
  15  * for a total max space of 64G. This way, we provide for stable runtime
  16  * services addresses across kernels so that a kexec'd kernel can still
  17  * use them.
  18  *
  19  * This is the main reason why we're doing stable VA mappings for RT
  20  * services.
  21  *
  22  * This flag is used in conjunction with a chicken bit called
  23  * "efi=old_map" which can be used as a fallback to the old runtime
  24  * services mapping method in case there's some b0rkage with a
  25  * particular EFI implementation (haha, it is hard to hold up the
  26  * sarcasm here...).
  27  */
  28 #define EFI_OLD_MEMMAP          EFI_ARCH_1
  29 
  30 #define EFI32_LOADER_SIGNATURE  "EL32"
  31 #define EFI64_LOADER_SIGNATURE  "EL64"
  32 
  33 #define MAX_CMDLINE_ADDRESS     UINT_MAX
  34 
  35 #define ARCH_EFI_IRQ_FLAGS_MASK X86_EFLAGS_IF
  36 
  37 #ifdef CONFIG_X86_32
  38 
  39 extern asmlinkage unsigned long efi_call_phys(void *, ...);
  40 
  41 #define arch_efi_call_virt_setup()                                      \
  42 ({                                                                      \
  43         kernel_fpu_begin();                                             \
  44         firmware_restrict_branch_speculation_start();                   \
  45 })
  46 
  47 #define arch_efi_call_virt_teardown()                                   \
  48 ({                                                                      \
  49         firmware_restrict_branch_speculation_end();                     \
  50         kernel_fpu_end();                                               \
  51 })
  52 
  53 
  54 /*
  55  * Wrap all the virtual calls in a way that forces the parameters on the stack.
  56  */
  57 #define arch_efi_call_virt(p, f, args...)                               \
  58 ({                                                                      \
  59         ((efi_##f##_t __attribute__((regparm(0)))*) p->f)(args);        \
  60 })
  61 
  62 #define efi_ioremap(addr, size, type, attr)     ioremap_cache(addr, size)
  63 
  64 #else /* !CONFIG_X86_32 */
  65 
  66 #define EFI_LOADER_SIGNATURE    "EL64"
  67 
  68 extern asmlinkage u64 efi_call(void *fp, ...);
  69 
  70 #define efi_call_phys(f, args...)               efi_call((f), args)
  71 
  72 /*
  73  * struct efi_scratch - Scratch space used while switching to/from efi_mm
  74  * @phys_stack: stack used during EFI Mixed Mode
  75  * @prev_mm:    store/restore stolen mm_struct while switching to/from efi_mm
  76  */
  77 struct efi_scratch {
  78         u64                     phys_stack;
  79         struct mm_struct        *prev_mm;
  80 } __packed;
  81 
  82 #define arch_efi_call_virt_setup()                                      \
  83 ({                                                                      \
  84         efi_sync_low_kernel_mappings();                                 \
  85         kernel_fpu_begin();                                             \
  86         firmware_restrict_branch_speculation_start();                   \
  87                                                                         \
  88         if (!efi_enabled(EFI_OLD_MEMMAP))                               \
  89                 efi_switch_mm(&efi_mm);                                 \
  90 })
  91 
  92 #define arch_efi_call_virt(p, f, args...)                               \
  93         efi_call((void *)p->f, args)                                    \
  94 
  95 #define arch_efi_call_virt_teardown()                                   \
  96 ({                                                                      \
  97         if (!efi_enabled(EFI_OLD_MEMMAP))                               \
  98                 efi_switch_mm(efi_scratch.prev_mm);                     \
  99                                                                         \
 100         firmware_restrict_branch_speculation_end();                     \
 101         kernel_fpu_end();                                               \
 102 })
 103 
 104 extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
 105                                         u32 type, u64 attribute);
 106 
 107 #ifdef CONFIG_KASAN
 108 /*
 109  * CONFIG_KASAN may redefine memset to __memset.  __memset function is present
 110  * only in kernel binary.  Since the EFI stub linked into a separate binary it
 111  * doesn't have __memset().  So we should use standard memset from
 112  * arch/x86/boot/compressed/string.c.  The same applies to memcpy and memmove.
 113  */
 114 #undef memcpy
 115 #undef memset
 116 #undef memmove
 117 #endif
 118 
 119 #endif /* CONFIG_X86_32 */
 120 
 121 extern struct efi_scratch efi_scratch;
 122 extern void __init efi_set_executable(efi_memory_desc_t *md, bool executable);
 123 extern int __init efi_memblock_x86_reserve_range(void);
 124 extern pgd_t * __init efi_call_phys_prolog(void);
 125 extern void __init efi_call_phys_epilog(pgd_t *save_pgd);
 126 extern void __init efi_print_memmap(void);
 127 extern void __init efi_memory_uc(u64 addr, unsigned long size);
 128 extern void __init efi_map_region(efi_memory_desc_t *md);
 129 extern void __init efi_map_region_fixed(efi_memory_desc_t *md);
 130 extern void efi_sync_low_kernel_mappings(void);
 131 extern int __init efi_alloc_page_tables(void);
 132 extern int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages);
 133 extern void __init old_map_region(efi_memory_desc_t *md);
 134 extern void __init runtime_code_page_mkexec(void);
 135 extern void __init efi_runtime_update_mappings(void);
 136 extern void __init efi_dump_pagetable(void);
 137 extern void __init efi_apply_memmap_quirks(void);
 138 extern int __init efi_reuse_config(u64 tables, int nr_tables);
 139 extern void efi_delete_dummy_variable(void);
 140 extern void efi_switch_mm(struct mm_struct *mm);
 141 extern void efi_recover_from_page_fault(unsigned long phys_addr);
 142 extern void efi_free_boot_services(void);
 143 extern void efi_reserve_boot_services(void);
 144 
 145 struct efi_setup_data {
 146         u64 fw_vendor;
 147         u64 runtime;
 148         u64 tables;
 149         u64 smbios;
 150         u64 reserved[8];
 151 };
 152 
 153 extern u64 efi_setup;
 154 
 155 #ifdef CONFIG_EFI
 156 
 157 static inline bool efi_is_native(void)
 158 {
 159         return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT);
 160 }
 161 
 162 static inline bool efi_runtime_supported(void)
 163 {
 164         if (efi_is_native())
 165                 return true;
 166 
 167         if (IS_ENABLED(CONFIG_EFI_MIXED) && !efi_enabled(EFI_OLD_MEMMAP))
 168                 return true;
 169 
 170         return false;
 171 }
 172 
 173 extern void parse_efi_setup(u64 phys_addr, u32 data_len);
 174 
 175 extern void efifb_setup_from_dmi(struct screen_info *si, const char *opt);
 176 
 177 #ifdef CONFIG_EFI_MIXED
 178 extern void efi_thunk_runtime_setup(void);
 179 extern efi_status_t efi_thunk_set_virtual_address_map(
 180         void *phys_set_virtual_address_map,
 181         unsigned long memory_map_size,
 182         unsigned long descriptor_size,
 183         u32 descriptor_version,
 184         efi_memory_desc_t *virtual_map);
 185 #else
 186 static inline void efi_thunk_runtime_setup(void) {}
 187 static inline efi_status_t efi_thunk_set_virtual_address_map(
 188         void *phys_set_virtual_address_map,
 189         unsigned long memory_map_size,
 190         unsigned long descriptor_size,
 191         u32 descriptor_version,
 192         efi_memory_desc_t *virtual_map)
 193 {
 194         return EFI_SUCCESS;
 195 }
 196 #endif /* CONFIG_EFI_MIXED */
 197 
 198 
 199 /* arch specific definitions used by the stub code */
 200 
 201 struct efi_config {
 202         u64 image_handle;
 203         u64 table;
 204         u64 runtime_services;
 205         u64 boot_services;
 206         u64 text_output;
 207         efi_status_t (*call)(unsigned long, ...);
 208         bool is64;
 209 } __packed;
 210 
 211 __pure const struct efi_config *__efi_early(void);
 212 
 213 static inline bool efi_is_64bit(void)
 214 {
 215         if (!IS_ENABLED(CONFIG_X86_64))
 216                 return false;
 217 
 218         if (!IS_ENABLED(CONFIG_EFI_MIXED))
 219                 return true;
 220 
 221         return __efi_early()->is64;
 222 }
 223 
 224 #define efi_table_attr(table, attr, instance)                           \
 225         (efi_is_64bit() ?                                               \
 226                 ((table##_64_t *)(unsigned long)instance)->attr :       \
 227                 ((table##_32_t *)(unsigned long)instance)->attr)
 228 
 229 #define efi_call_proto(protocol, f, instance, ...)                      \
 230         __efi_early()->call(efi_table_attr(protocol, f, instance),      \
 231                 instance, ##__VA_ARGS__)
 232 
 233 #define efi_call_early(f, ...)                                          \
 234         __efi_early()->call(efi_table_attr(efi_boot_services, f,        \
 235                 __efi_early()->boot_services), __VA_ARGS__)
 236 
 237 #define __efi_call_early(f, ...)                                        \
 238         __efi_early()->call((unsigned long)f, __VA_ARGS__);
 239 
 240 #define efi_call_runtime(f, ...)                                        \
 241         __efi_early()->call(efi_table_attr(efi_runtime_services, f,     \
 242                 __efi_early()->runtime_services), __VA_ARGS__)
 243 
 244 extern bool efi_reboot_required(void);
 245 extern bool efi_is_table_address(unsigned long phys_addr);
 246 
 247 #else
 248 static inline void parse_efi_setup(u64 phys_addr, u32 data_len) {}
 249 static inline bool efi_reboot_required(void)
 250 {
 251         return false;
 252 }
 253 static inline  bool efi_is_table_address(unsigned long phys_addr)
 254 {
 255         return false;
 256 }
 257 #endif /* CONFIG_EFI */
 258 
 259 #endif /* _ASM_X86_EFI_H */

/* [<][>][^][v][top][bottom][index][help] */