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