~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/arch/x86/include/asm/efi.h

Version: ~ [ linux-5.14-rc1 ] ~ [ linux-5.13.1 ] ~ [ linux-5.12.16 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.49 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.131 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.197 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.239 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.275 ] ~ [ linux-4.8.17 ] ~ [ linux-4.7.10 ] ~ [ linux-4.6.7 ] ~ [ linux-4.5.7 ] ~ [ linux-4.4.275 ] ~ [ linux-4.3.6 ] ~ [ linux-4.2.8 ] ~ [ linux-4.1.52 ] ~ [ linux-4.0.9 ] ~ [ linux-3.18.140 ] ~ [ linux-3.16.85 ] ~ [ linux-3.14.79 ] ~ [ linux-3.12.74 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.5 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

  1 #ifndef _ASM_X86_EFI_H
  2 #define _ASM_X86_EFI_H
  3 
  4 #include <asm/i387.h>
  5 /*
  6  * We map the EFI regions needed for runtime services non-contiguously,
  7  * with preserved alignment on virtual addresses starting from -4G down
  8  * for a total max space of 64G. This way, we provide for stable runtime
  9  * services addresses across kernels so that a kexec'd kernel can still
 10  * use them.
 11  *
 12  * This is the main reason why we're doing stable VA mappings for RT
 13  * services.
 14  *
 15  * This flag is used in conjuction with a chicken bit called
 16  * "efi=old_map" which can be used as a fallback to the old runtime
 17  * services mapping method in case there's some b0rkage with a
 18  * particular EFI implementation (haha, it is hard to hold up the
 19  * sarcasm here...).
 20  */
 21 #define EFI_OLD_MEMMAP          EFI_ARCH_1
 22 
 23 #define EFI32_LOADER_SIGNATURE  "EL32"
 24 #define EFI64_LOADER_SIGNATURE  "EL64"
 25 
 26 #ifdef CONFIG_X86_32
 27 
 28 
 29 extern unsigned long asmlinkage efi_call_phys(void *, ...);
 30 
 31 /*
 32  * Wrap all the virtual calls in a way that forces the parameters on the stack.
 33  */
 34 
 35 /* Use this macro if your virtual returns a non-void value */
 36 #define efi_call_virt(f, args...) \
 37 ({                                                                      \
 38         efi_status_t __s;                                               \
 39         kernel_fpu_begin();                                             \
 40         __s = ((efi_##f##_t __attribute__((regparm(0)))*)               \
 41                 efi.systab->runtime->f)(args);                          \
 42         kernel_fpu_end();                                               \
 43         __s;                                                            \
 44 })
 45 
 46 /* Use this macro if your virtual call does not return any value */
 47 #define __efi_call_virt(f, args...) \
 48 ({                                                                      \
 49         kernel_fpu_begin();                                             \
 50         ((efi_##f##_t __attribute__((regparm(0)))*)                     \
 51                 efi.systab->runtime->f)(args);                          \
 52         kernel_fpu_end();                                               \
 53 })
 54 
 55 #define efi_ioremap(addr, size, type, attr)     ioremap_cache(addr, size)
 56 
 57 #else /* !CONFIG_X86_32 */
 58 
 59 #define EFI_LOADER_SIGNATURE    "EL64"
 60 
 61 extern u64 asmlinkage efi_call(void *fp, ...);
 62 
 63 #define efi_call_phys(f, args...)               efi_call((f), args)
 64 
 65 #define efi_call_virt(f, ...)                                           \
 66 ({                                                                      \
 67         efi_status_t __s;                                               \
 68                                                                         \
 69         efi_sync_low_kernel_mappings();                                 \
 70         preempt_disable();                                              \
 71         __kernel_fpu_begin();                                           \
 72         __s = efi_call((void *)efi.systab->runtime->f, __VA_ARGS__);    \
 73         __kernel_fpu_end();                                             \
 74         preempt_enable();                                               \
 75         __s;                                                            \
 76 })
 77 
 78 /*
 79  * All X86_64 virt calls return non-void values. Thus, use non-void call for
 80  * virt calls that would be void on X86_32.
 81  */
 82 #define __efi_call_virt(f, args...) efi_call_virt(f, args)
 83 
 84 extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size,
 85                                         u32 type, u64 attribute);
 86 
 87 #endif /* CONFIG_X86_32 */
 88 
 89 extern struct efi_scratch efi_scratch;
 90 extern void __init efi_set_executable(efi_memory_desc_t *md, bool executable);
 91 extern int __init efi_memblock_x86_reserve_range(void);
 92 extern void __init efi_call_phys_prolog(void);
 93 extern void __init efi_call_phys_epilog(void);
 94 extern void __init efi_unmap_memmap(void);
 95 extern void __init efi_memory_uc(u64 addr, unsigned long size);
 96 extern void __init efi_map_region(efi_memory_desc_t *md);
 97 extern void __init efi_map_region_fixed(efi_memory_desc_t *md);
 98 extern void efi_sync_low_kernel_mappings(void);
 99 extern int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages);
100 extern void __init efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages);
101 extern void __init old_map_region(efi_memory_desc_t *md);
102 extern void __init runtime_code_page_mkexec(void);
103 extern void __init efi_runtime_mkexec(void);
104 extern void __init efi_dump_pagetable(void);
105 extern void __init efi_apply_memmap_quirks(void);
106 extern int __init efi_reuse_config(u64 tables, int nr_tables);
107 extern void efi_delete_dummy_variable(void);
108 
109 struct efi_setup_data {
110         u64 fw_vendor;
111         u64 runtime;
112         u64 tables;
113         u64 smbios;
114         u64 reserved[8];
115 };
116 
117 extern u64 efi_setup;
118 
119 #ifdef CONFIG_EFI
120 
121 static inline bool efi_is_native(void)
122 {
123         return IS_ENABLED(CONFIG_X86_64) == efi_enabled(EFI_64BIT);
124 }
125 
126 static inline bool efi_runtime_supported(void)
127 {
128         if (efi_is_native())
129                 return true;
130 
131         if (IS_ENABLED(CONFIG_EFI_MIXED) && !efi_enabled(EFI_OLD_MEMMAP))
132                 return true;
133 
134         return false;
135 }
136 
137 extern struct console early_efi_console;
138 extern void parse_efi_setup(u64 phys_addr, u32 data_len);
139 
140 #ifdef CONFIG_EFI_MIXED
141 extern void efi_thunk_runtime_setup(void);
142 extern efi_status_t efi_thunk_set_virtual_address_map(
143         void *phys_set_virtual_address_map,
144         unsigned long memory_map_size,
145         unsigned long descriptor_size,
146         u32 descriptor_version,
147         efi_memory_desc_t *virtual_map);
148 #else
149 static inline void efi_thunk_runtime_setup(void) {}
150 static inline efi_status_t efi_thunk_set_virtual_address_map(
151         void *phys_set_virtual_address_map,
152         unsigned long memory_map_size,
153         unsigned long descriptor_size,
154         u32 descriptor_version,
155         efi_memory_desc_t *virtual_map)
156 {
157         return EFI_SUCCESS;
158 }
159 #endif /* CONFIG_EFI_MIXED */
160 
161 extern bool efi_reboot_required(void);
162 
163 #else
164 static inline void parse_efi_setup(u64 phys_addr, u32 data_len) {}
165 static inline bool efi_reboot_required(void)
166 {
167         return false;
168 }
169 #endif /* CONFIG_EFI */
170 
171 #endif /* _ASM_X86_EFI_H */
172 

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | Wiki (Japanese) | Wiki (English) | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

osdn.jp