提交 81395481 编写于 作者: L Linus Torvalds

Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull EFI updates from Ingo Molnar:
 "Changes in this cycle are:

   - support module unload for efivarfs (Mathias Krause)

   - another attempt at moving x86 to libstub taking advantage of the
     __pure attribute (Ard Biesheuvel)

   - add EFI runtime services section to ptdump (Mathias Krause)"

* 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86, ptdump: Add section for EFI runtime services
  efi/x86: Move x86 back to libstub
  efivarfs: Allow unloading when build as module
...@@ -47,7 +47,8 @@ vmlinux-objs-$(CONFIG_RANDOMIZE_BASE) += $(obj)/aslr.o ...@@ -47,7 +47,8 @@ vmlinux-objs-$(CONFIG_RANDOMIZE_BASE) += $(obj)/aslr.o
$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone $(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
vmlinux-objs-$(CONFIG_EFI_STUB) += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o vmlinux-objs-$(CONFIG_EFI_STUB) += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o \
$(objtree)/drivers/firmware/efi/libstub/lib.a
$(obj)/vmlinux: $(vmlinux-objs-y) FORCE $(obj)/vmlinux: $(vmlinux-objs-y) FORCE
$(call if_changed,ld) $(call if_changed,ld)
......
...@@ -21,8 +21,10 @@ static efi_system_table_t *sys_table; ...@@ -21,8 +21,10 @@ static efi_system_table_t *sys_table;
static struct efi_config *efi_early; static struct efi_config *efi_early;
#define efi_call_early(f, ...) \ __pure const struct efi_config *__efi_early(void)
efi_early->call(efi_early->f, __VA_ARGS__); {
return efi_early;
}
#define BOOT_SERVICES(bits) \ #define BOOT_SERVICES(bits) \
static void setup_boot_services##bits(struct efi_config *c) \ static void setup_boot_services##bits(struct efi_config *c) \
...@@ -285,8 +287,6 @@ void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str) ...@@ -285,8 +287,6 @@ void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str)
} }
} }
#include "../../../../drivers/firmware/efi/libstub/efi-stub-helper.c"
static void find_bits(unsigned long mask, u8 *pos, u8 *size) static void find_bits(unsigned long mask, u8 *pos, u8 *size)
{ {
u8 first, len; u8 first, len;
......
...@@ -103,20 +103,4 @@ struct efi_uga_draw_protocol { ...@@ -103,20 +103,4 @@ struct efi_uga_draw_protocol {
void *blt; void *blt;
}; };
struct efi_config {
u64 image_handle;
u64 table;
u64 allocate_pool;
u64 allocate_pages;
u64 get_memory_map;
u64 free_pool;
u64 free_pages;
u64 locate_handle;
u64 handle_protocol;
u64 exit_boot_services;
u64 text_output;
efi_status_t (*call)(unsigned long, ...);
bool is64;
} __packed;
#endif /* BOOT_COMPRESSED_EBOOT_H */ #endif /* BOOT_COMPRESSED_EBOOT_H */
...@@ -158,6 +158,30 @@ static inline efi_status_t efi_thunk_set_virtual_address_map( ...@@ -158,6 +158,30 @@ static inline efi_status_t efi_thunk_set_virtual_address_map(
} }
#endif /* CONFIG_EFI_MIXED */ #endif /* CONFIG_EFI_MIXED */
/* arch specific definitions used by the stub code */
struct efi_config {
u64 image_handle;
u64 table;
u64 allocate_pool;
u64 allocate_pages;
u64 get_memory_map;
u64 free_pool;
u64 free_pages;
u64 locate_handle;
u64 handle_protocol;
u64 exit_boot_services;
u64 text_output;
efi_status_t (*call)(unsigned long, ...);
bool is64;
} __packed;
__pure const struct efi_config *__efi_early(void);
#define efi_call_early(f, ...) \
__efi_early()->call(__efi_early()->f, __VA_ARGS__);
extern bool efi_reboot_required(void); extern bool efi_reboot_required(void);
#else #else
......
...@@ -63,6 +63,8 @@ typedef struct { pteval_t pte; } pte_t; ...@@ -63,6 +63,8 @@ typedef struct { pteval_t pte; } pte_t;
#define MODULES_LEN (MODULES_END - MODULES_VADDR) #define MODULES_LEN (MODULES_END - MODULES_VADDR)
#define ESPFIX_PGD_ENTRY _AC(-2, UL) #define ESPFIX_PGD_ENTRY _AC(-2, UL)
#define ESPFIX_BASE_ADDR (ESPFIX_PGD_ENTRY << PGDIR_SHIFT) #define ESPFIX_BASE_ADDR (ESPFIX_PGD_ENTRY << PGDIR_SHIFT)
#define EFI_VA_START ( -4 * (_AC(1, UL) << 30))
#define EFI_VA_END (-68 * (_AC(1, UL) << 30))
#define EARLY_DYNAMIC_PAGE_TABLES 64 #define EARLY_DYNAMIC_PAGE_TABLES 64
......
...@@ -75,6 +75,9 @@ static struct addr_marker address_markers[] = { ...@@ -75,6 +75,9 @@ static struct addr_marker address_markers[] = {
{ VMEMMAP_START, "Vmemmap" }, { VMEMMAP_START, "Vmemmap" },
# ifdef CONFIG_X86_ESPFIX64 # ifdef CONFIG_X86_ESPFIX64
{ ESPFIX_BASE_ADDR, "ESPfix Area", 16 }, { ESPFIX_BASE_ADDR, "ESPfix Area", 16 },
# endif
# ifdef CONFIG_EFI
{ EFI_VA_END, "EFI Runtime Services" },
# endif # endif
{ __START_KERNEL_map, "High Kernel Mapping" }, { __START_KERNEL_map, "High Kernel Mapping" },
{ MODULES_VADDR, "Modules" }, { MODULES_VADDR, "Modules" },
......
...@@ -48,8 +48,7 @@ static unsigned long efi_flags __initdata; ...@@ -48,8 +48,7 @@ static unsigned long efi_flags __initdata;
* We allocate runtime services regions bottom-up, starting from -4G, i.e. * We allocate runtime services regions bottom-up, starting from -4G, i.e.
* 0xffff_ffff_0000_0000 and limit EFI VA mapping space to 64G. * 0xffff_ffff_0000_0000 and limit EFI VA mapping space to 64G.
*/ */
static u64 efi_va = -4 * (1UL << 30); static u64 efi_va = EFI_VA_START;
#define EFI_VA_END (-68 * (1UL << 30))
/* /*
* Scratch space used for switching the pagetable in the EFI stub * Scratch space used for switching the pagetable in the EFI stub
......
...@@ -7,4 +7,4 @@ obj-$(CONFIG_EFI_VARS_PSTORE) += efi-pstore.o ...@@ -7,4 +7,4 @@ obj-$(CONFIG_EFI_VARS_PSTORE) += efi-pstore.o
obj-$(CONFIG_UEFI_CPER) += cper.o obj-$(CONFIG_UEFI_CPER) += cper.o
obj-$(CONFIG_EFI_RUNTIME_MAP) += runtime-map.o obj-$(CONFIG_EFI_RUNTIME_MAP) += runtime-map.o
obj-$(CONFIG_EFI_RUNTIME_WRAPPERS) += runtime-wrappers.o obj-$(CONFIG_EFI_RUNTIME_WRAPPERS) += runtime-wrappers.o
obj-$(CONFIG_EFI_ARM_STUB) += libstub/ obj-$(CONFIG_EFI_STUB) += libstub/
...@@ -236,6 +236,7 @@ static void efivarfs_kill_sb(struct super_block *sb) ...@@ -236,6 +236,7 @@ static void efivarfs_kill_sb(struct super_block *sb)
} }
static struct file_system_type efivarfs_type = { static struct file_system_type efivarfs_type = {
.owner = THIS_MODULE,
.name = "efivarfs", .name = "efivarfs",
.mount = efivarfs_mount, .mount = efivarfs_mount,
.kill_sb = efivarfs_kill_sb, .kill_sb = efivarfs_kill_sb,
...@@ -244,17 +245,23 @@ static struct file_system_type efivarfs_type = { ...@@ -244,17 +245,23 @@ static struct file_system_type efivarfs_type = {
static __init int efivarfs_init(void) static __init int efivarfs_init(void)
{ {
if (!efi_enabled(EFI_RUNTIME_SERVICES)) if (!efi_enabled(EFI_RUNTIME_SERVICES))
return 0; return -ENODEV;
if (!efivars_kobject()) if (!efivars_kobject())
return 0; return -ENODEV;
return register_filesystem(&efivarfs_type); return register_filesystem(&efivarfs_type);
} }
static __exit void efivarfs_exit(void)
{
unregister_filesystem(&efivarfs_type);
}
MODULE_AUTHOR("Matthew Garrett, Jeremy Kerr"); MODULE_AUTHOR("Matthew Garrett, Jeremy Kerr");
MODULE_DESCRIPTION("EFI Variable Filesystem"); MODULE_DESCRIPTION("EFI Variable Filesystem");
MODULE_LICENSE("GPL"); MODULE_LICENSE("GPL");
MODULE_ALIAS_FS("efivarfs"); MODULE_ALIAS_FS("efivarfs");
module_init(efivarfs_init); module_init(efivarfs_init);
module_exit(efivarfs_exit);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册