📄 efi.h
字号:
unsigned long sal_systab; /* SAL system table */ unsigned long boot_info; /* boot info table */ unsigned long hcdp; /* HCDP table */ unsigned long uga; /* UGA table */ efi_get_time_t *get_time; efi_set_time_t *set_time; efi_get_wakeup_time_t *get_wakeup_time; efi_set_wakeup_time_t *set_wakeup_time; efi_get_variable_t *get_variable; efi_get_next_variable_t *get_next_variable; efi_set_variable_t *set_variable; efi_get_next_high_mono_count_t *get_next_high_mono_count; efi_reset_system_t *reset_system; efi_set_virtual_address_map_t *set_virtual_address_map;} efi;static inline intefi_guidcmp (efi_guid_t left, efi_guid_t right){ return memcmp(&left, &right, sizeof (efi_guid_t));}static inline char *efi_guid_unparse(efi_guid_t *guid, char *out){#ifndef XEN sprintf(out, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",#else snprintf(out, 37, "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x",#endif guid->b[3], guid->b[2], guid->b[1], guid->b[0], guid->b[5], guid->b[4], guid->b[7], guid->b[6], guid->b[8], guid->b[9], guid->b[10], guid->b[11], guid->b[12], guid->b[13], guid->b[14], guid->b[15]); return out;}extern void efi_init (void);extern void *efi_get_pal_addr (void);extern void efi_map_pal_code (void);#ifdef XENextern void efi_unmap_pal_code (void);#endifextern void efi_map_memmap(void);extern void efi_memmap_walk (efi_freemem_callback_t callback, void *arg);extern void efi_gettimeofday (struct timespec *ts);extern void efi_enter_virtual_mode (void); /* switch EFI to virtual mode, if possible */extern u64 efi_get_iobase (void);extern u32 efi_mem_type (unsigned long phys_addr);extern u64 efi_mem_attributes (unsigned long phys_addr);extern u64 efi_mem_attribute (unsigned long phys_addr, unsigned long size);extern int efi_mem_attribute_range (unsigned long phys_addr, unsigned long size, u64 attr);extern int __init efi_uart_console_only (void);extern void efi_initialize_iomem_resources(struct resource *code_resource, struct resource *data_resource);extern unsigned long efi_get_time(void);extern int efi_set_rtc_mmss(unsigned long nowtime);extern int is_available_memory(efi_memory_desc_t * md);extern struct efi_memory_map memmap;/** * efi_range_is_wc - check the WC bit on an address range * @start: starting kvirt address * @len: length of range * * Consult the EFI memory map and make sure it's ok to set this range WC. * Returns true or false. */static inline int efi_range_is_wc(unsigned long start, unsigned long len){ unsigned long i; for (i = 0; i < len; i += (1UL << EFI_PAGE_SHIFT)) { unsigned long paddr = __pa(start + i); if (!(efi_mem_attributes(paddr) & EFI_MEMORY_WC)) return 0; } /* The range checked out */ return 1;}#ifdef CONFIG_EFI_PCDPextern int __init efi_setup_pcdp_console(char *);#endif/* * We play games with efi_enabled so that the compiler will, if possible, remove * EFI-related code altogether. */#ifdef CONFIG_EFI# ifdef CONFIG_X86 extern int efi_enabled;# else# define efi_enabled 1# endif#else# define efi_enabled 0#endif/* * Variable Attributes */#define EFI_VARIABLE_NON_VOLATILE 0x0000000000000001#define EFI_VARIABLE_BOOTSERVICE_ACCESS 0x0000000000000002#define EFI_VARIABLE_RUNTIME_ACCESS 0x0000000000000004/* * EFI Device Path information */#define EFI_DEV_HW 0x01#define EFI_DEV_PCI 1#define EFI_DEV_PCCARD 2#define EFI_DEV_MEM_MAPPED 3#define EFI_DEV_VENDOR 4#define EFI_DEV_CONTROLLER 5#define EFI_DEV_ACPI 0x02#define EFI_DEV_BASIC_ACPI 1#define EFI_DEV_EXPANDED_ACPI 2#define EFI_DEV_MSG 0x03#define EFI_DEV_MSG_ATAPI 1#define EFI_DEV_MSG_SCSI 2#define EFI_DEV_MSG_FC 3#define EFI_DEV_MSG_1394 4#define EFI_DEV_MSG_USB 5#define EFI_DEV_MSG_USB_CLASS 15#define EFI_DEV_MSG_I20 6#define EFI_DEV_MSG_MAC 11#define EFI_DEV_MSG_IPV4 12#define EFI_DEV_MSG_IPV6 13#define EFI_DEV_MSG_INFINIBAND 9#define EFI_DEV_MSG_UART 14#define EFI_DEV_MSG_VENDOR 10#define EFI_DEV_MEDIA 0x04#define EFI_DEV_MEDIA_HARD_DRIVE 1#define EFI_DEV_MEDIA_CDROM 2#define EFI_DEV_MEDIA_VENDOR 3#define EFI_DEV_MEDIA_FILE 4#define EFI_DEV_MEDIA_PROTOCOL 5#define EFI_DEV_BIOS_BOOT 0x05#define EFI_DEV_END_PATH 0x7F#define EFI_DEV_END_PATH2 0xFF#define EFI_DEV_END_INSTANCE 0x01#define EFI_DEV_END_ENTIRE 0xFFstruct efi_generic_dev_path { u8 type; u8 sub_type; u16 length;} __attribute ((packed));#ifdef XEN/* * According to xen/arch/ia64/xen/regionreg.c the RID space is broken up * into large-blocks. Each block belongs to a domain, except 0th block, * which is broken up into small-blocks. The small-blocks are used for * metaphysical mappings, again one per domain, except for the 0th * small-block which is unused other than very early on in the * hypervisor boot. * * By default each large-block is 18 bits wide, which is also the minimum * allowed width for a block. Each small-block is by default 1/64 the width * of a large-block, which is the maximum division allowed. In other words * each small-block is at least 12 bits wide. * * The portion of the 0th small-block that is used early on during * the hypervisor boot relates to IA64_REGION_ID_KERNEL, which is * used to form an RID using the following scheme which seems to be * have been inherited from Linux: * * a: bits 0-2: Region Number (0-7) * b: 3-N: IA64_REGION_ID_KERNEL (0) * c: N-23: reserved (0) * * N is defined by the platform. * * For EFI we use the following RID: * * a: bits 0-2: Region Number (0-7) * e: bits 3-N: IA64_REGION_ID_KERNEL (1) * f: bits N-53: reserved (0) * * + Only 0 is used as we only need one RID. Its not really important * what this number is, so long as its between 0 and 7. * * The nice thing about this is that we are only using 4 bits of RID * space, so it shouldn't have any chance of running into an adjacent * small-block since small-blocks are at least 12 bits wide. * * It would actually be possible to just use a IA64_REGION_ID_KERNEL * based RID for EFI use. The important thing is that it is in the 0th * small block, and thus not available to domains. But as we have * lots of space, its seems to be nice and clean to just use a separate * RID for EFI. * * This can be trivially changed by updating the definition of XEN_EFI_RR. * * For reference, the RID is used to produce the value inserted * in to a region register in the following way: * * A: bit 0: VHPT (0 = off, 1 = on) * B: bit 1: reserved (0) * C: bits 2-7: log 2 page_size * D: bits 8-N: RID * E: bits N-53: reserved (0) *//* rr7 (and rr6) may already be set to XEN_EFI_RR, which * would indicate a nested EFI, SAL or PAL call, such * as from an MCA. This may have occured during a call * to set_one_rr_efi(). To be safe, repin everything anyway. */#define XEN_EFI_RR_ENTER(rr6, rr7) do { \ rr6 = ia64_get_rr(6UL << 61); \ rr7 = ia64_get_rr(7UL << 61); \ set_one_rr_efi(6UL << 61, XEN_EFI_RR); \ set_one_rr_efi(7UL << 61, XEN_EFI_RR); \ efi_map_pal_code(); \} while (0)/* There is no need to do anything if the saved rr7 (and rr6) * is XEN_EFI_RR, as it would just switch them from XEN_EFI_RR to XEN_EFI_RR * Furthermore, if this is a nested call it is important not * to unpin efi_unmap_pal_code() until the outermost call is finished */#define XEN_EFI_RR_LEAVE(rr6, rr7) do { \ if (rr7 != XEN_EFI_RR) { \ efi_unmap_pal_code(); \ set_one_rr_efi(6UL << 61, rr6); \ set_one_rr_efi(7UL << 61, rr7); \ } \} while (0)#else/* Just use rr6 and rr7 in a dummy fashion here to get * rid of compiler warnings - a better solution should * be found if this code is ever actually used */#define XEN_EFI_RR_ENTER(rr6, rr7) do { rr6 = 0; rr7 = 0; } while (0)#define XEN_EFI_RR_LEAVE(rr6, rr7) do {} while (0)#endif /* XEN */#define XEN_EFI_RR_DECLARE(rr6, rr7) unsigned long rr6, rr7;#endif /* !__ASSEMBLY__ */#ifdef XEN#include <asm/mmu_context.h> /* For IA64_REGION_ID_EFI and ia64_rid() */#include <asm/pgtable.h> /* IA64_GRANULE_SHIFT */#define XEN_EFI_REGION_NO __IA64_UL_CONST(0)#define XEN_EFI_RR ((ia64_rid(XEN_IA64_REGION_ID_EFI, \ XEN_EFI_REGION_NO) << 8) | \ (IA64_GRANULE_SHIFT << 2))#endif /* XEN */#endif /* _LINUX_EFI_H */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -