forked from Minki/linux
Revert "efi/x86: efistub: Move shared dependencies to <asm/efi.h>"
This reverts commitf23cf8bd5c
("efi/x86: efistub: Move shared dependencies to <asm/efi.h>") as well as the x86 parts of commitf4f75ad574
("efi: efistub: Convert into static library"). The road leading to these two reverts is long and winding. The above two commits were merged during the v3.17 merge window and turned the common EFI boot stub code into a static library. This necessitated making some symbols global in the x86 boot stub which introduced new entries into the early boot GOT. The problem was that we weren't fixing up the newly created GOT entries before invoking the EFI boot stub, which sometimes resulted in hangs or resets. This failure was reported by Maarten on his Macbook pro. The proposed fix was commit9cb0e39423
("x86/efi: Fixup GOT in all boot code paths"). However, that caused issues for Linus when booting his Sony Vaio Pro 11. It was subsequently reverted in commitf3670394c2
. So that leaves us back with Maarten's Macbook pro not booting. At this stage in the release cycle the least risky option is to revert the x86 EFI boot stub to the pre-merge window code structure where we explicitly #include efi-stub-helper.c instead of linking with the static library. The arm64 code remains unaffected. We can take another swing at the x86 parts for v3.18. Conflicts: arch/x86/include/asm/efi.h Tested-by: Josh Boyer <jwboyer@fedoraproject.org> Tested-by: Maarten Lankhorst <maarten.lankhorst@canonical.com> Tested-by: Leif Lindholm <leif.lindholm@linaro.org> [arm64] Tested-by: Linus Torvalds <torvalds@linux-foundation.org> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org>, Cc: Ingo Molnar <mingo@kernel.org> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
This commit is contained in:
parent
3eddc69ffe
commit
84be880560
@ -33,8 +33,7 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
|
|||||||
$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
|
$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
|
||||||
|
|
||||||
ifeq ($(CONFIG_EFI_STUB), y)
|
ifeq ($(CONFIG_EFI_STUB), y)
|
||||||
VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o \
|
VMLINUX_OBJS += $(obj)/eboot.o $(obj)/efi_stub_$(BITS).o
|
||||||
$(objtree)/drivers/firmware/efi/libstub/lib.a
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(obj)/vmlinux: $(VMLINUX_OBJS) FORCE
|
$(obj)/vmlinux: $(VMLINUX_OBJS) FORCE
|
||||||
|
@ -19,7 +19,10 @@
|
|||||||
|
|
||||||
static efi_system_table_t *sys_table;
|
static efi_system_table_t *sys_table;
|
||||||
|
|
||||||
struct efi_config *efi_early;
|
static struct efi_config *efi_early;
|
||||||
|
|
||||||
|
#define efi_call_early(f, ...) \
|
||||||
|
efi_early->call(efi_early->f, __VA_ARGS__);
|
||||||
|
|
||||||
#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) \
|
||||||
@ -280,6 +283,8 @@ 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,4 +103,20 @@ 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 */
|
||||||
|
@ -159,30 +159,6 @@ 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;
|
|
||||||
|
|
||||||
extern struct efi_config *efi_early;
|
|
||||||
|
|
||||||
#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
|
||||||
|
@ -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_STUB) += libstub/
|
obj-$(CONFIG_EFI_ARM_STUB) += libstub/
|
||||||
|
Loading…
Reference in New Issue
Block a user