Merge branch 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull EFI changes from Ingo Molnar:
"Main changes in this cycle are:
- arm64 efi stub fixes, preservation of FP/SIMD registers across
firmware calls, and conversion of the EFI stub code into a static
library - Ard Biesheuvel
- Xen EFI support - Daniel Kiper
- Support for autoloading the efivars driver - Lee, Chun-Yi
- Use the PE/COFF headers in the x86 EFI boot stub to request that
the stub be loaded with CONFIG_PHYSICAL_ALIGN alignment - Michael
Brown
- Consolidate all the x86 EFI quirks into one file - Saurabh Tangri
- Additional error logging in x86 EFI boot stub - Ulf Winkelvos
- Support loading initrd above 4G in EFI boot stub - Yinghai Lu
- EFI reboot patches for ACPI hardware reduced platforms"
* 'x86-efi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (31 commits)
efi/arm64: Handle missing virtual mapping for UEFI System Table
arch/x86/xen: Silence compiler warnings
xen: Silence compiler warnings
x86/efi: Request desired alignment via the PE/COFF headers
x86/efi: Add better error logging to EFI boot stub
efi: Autoload efivars
efi: Update stale locking comment for struct efivars
arch/x86: Remove efi_set_rtc_mmss()
arch/x86: Replace plain strings with constants
xen: Put EFI machinery in place
xen: Define EFI related stuff
arch/x86: Remove redundant set_bit(EFI_MEMMAP) call
arch/x86: Remove redundant set_bit(EFI_SYSTEM_TABLES) call
efi: Introduce EFI_PARAVIRT flag
arch/x86: Do not access EFI memory map if it is not available
efi: Use early_mem*() instead of early_io*()
arch/ia64: Define early_memunmap()
x86/reboot: Add EFI reboot quirk for ACPI Hardware Reduced flag
efi/reboot: Allow powering off machines using EFI
efi/reboot: Add generic wrapper around EfiResetSystem()
...
This commit is contained in:
@@ -33,7 +33,8 @@ VMLINUX_OBJS = $(obj)/vmlinux.lds $(obj)/head_$(BITS).o $(obj)/misc.o \
|
||||
$(obj)/eboot.o: KBUILD_CFLAGS += -fshort-wchar -mno-red-zone
|
||||
|
||||
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
|
||||
|
||||
$(obj)/vmlinux: $(VMLINUX_OBJS) FORCE
|
||||
|
||||
@@ -19,10 +19,7 @@
|
||||
|
||||
static efi_system_table_t *sys_table;
|
||||
|
||||
static struct efi_config *efi_early;
|
||||
|
||||
#define efi_call_early(f, ...) \
|
||||
efi_early->call(efi_early->f, __VA_ARGS__);
|
||||
struct efi_config *efi_early;
|
||||
|
||||
#define BOOT_SERVICES(bits) \
|
||||
static void setup_boot_services##bits(struct efi_config *c) \
|
||||
@@ -48,8 +45,7 @@ static void setup_boot_services##bits(struct efi_config *c) \
|
||||
BOOT_SERVICES(32);
|
||||
BOOT_SERVICES(64);
|
||||
|
||||
static void efi_printk(efi_system_table_t *, char *);
|
||||
static void efi_char16_printk(efi_system_table_t *, efi_char16_t *);
|
||||
void efi_char16_printk(efi_system_table_t *, efi_char16_t *);
|
||||
|
||||
static efi_status_t
|
||||
__file_size32(void *__fh, efi_char16_t *filename_16,
|
||||
@@ -156,7 +152,7 @@ grow:
|
||||
|
||||
return status;
|
||||
}
|
||||
static efi_status_t
|
||||
efi_status_t
|
||||
efi_file_size(efi_system_table_t *sys_table, void *__fh,
|
||||
efi_char16_t *filename_16, void **handle, u64 *file_sz)
|
||||
{
|
||||
@@ -166,7 +162,7 @@ efi_file_size(efi_system_table_t *sys_table, void *__fh,
|
||||
return __file_size32(__fh, filename_16, handle, file_sz);
|
||||
}
|
||||
|
||||
static inline efi_status_t
|
||||
efi_status_t
|
||||
efi_file_read(void *handle, unsigned long *size, void *addr)
|
||||
{
|
||||
unsigned long func;
|
||||
@@ -184,7 +180,7 @@ efi_file_read(void *handle, unsigned long *size, void *addr)
|
||||
}
|
||||
}
|
||||
|
||||
static inline efi_status_t efi_file_close(void *handle)
|
||||
efi_status_t efi_file_close(void *handle)
|
||||
{
|
||||
if (efi_early->is64) {
|
||||
efi_file_handle_64_t *fh = handle;
|
||||
@@ -249,7 +245,7 @@ static inline efi_status_t __open_volume64(void *__image, void **__fh)
|
||||
return status;
|
||||
}
|
||||
|
||||
static inline efi_status_t
|
||||
efi_status_t
|
||||
efi_open_volume(efi_system_table_t *sys_table, void *__image, void **__fh)
|
||||
{
|
||||
if (efi_early->is64)
|
||||
@@ -258,7 +254,7 @@ efi_open_volume(efi_system_table_t *sys_table, void *__image, void **__fh)
|
||||
return __open_volume32(__image, __fh);
|
||||
}
|
||||
|
||||
static void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str)
|
||||
void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str)
|
||||
{
|
||||
unsigned long output_string;
|
||||
size_t offset;
|
||||
@@ -284,8 +280,6 @@ static void efi_char16_printk(efi_system_table_t *table, efi_char16_t *str)
|
||||
}
|
||||
}
|
||||
|
||||
#include "../../../../drivers/firmware/efi/efi-stub-helper.c"
|
||||
|
||||
static void find_bits(unsigned long mask, u8 *pos, u8 *size)
|
||||
{
|
||||
u8 first, len;
|
||||
@@ -1038,6 +1032,7 @@ struct boot_params *make_boot_params(struct efi_config *c)
|
||||
int i;
|
||||
unsigned long ramdisk_addr;
|
||||
unsigned long ramdisk_size;
|
||||
unsigned long initrd_addr_max;
|
||||
|
||||
efi_early = c;
|
||||
sys_table = (efi_system_table_t *)(unsigned long)efi_early->table;
|
||||
@@ -1100,14 +1095,21 @@ struct boot_params *make_boot_params(struct efi_config *c)
|
||||
|
||||
memset(sdt, 0, sizeof(*sdt));
|
||||
|
||||
if (hdr->xloadflags & XLF_CAN_BE_LOADED_ABOVE_4G)
|
||||
initrd_addr_max = -1UL;
|
||||
else
|
||||
initrd_addr_max = hdr->initrd_addr_max;
|
||||
|
||||
status = handle_cmdline_files(sys_table, image,
|
||||
(char *)(unsigned long)hdr->cmd_line_ptr,
|
||||
"initrd=", hdr->initrd_addr_max,
|
||||
"initrd=", initrd_addr_max,
|
||||
&ramdisk_addr, &ramdisk_size);
|
||||
if (status != EFI_SUCCESS)
|
||||
goto fail2;
|
||||
hdr->ramdisk_image = ramdisk_addr;
|
||||
hdr->ramdisk_size = ramdisk_size;
|
||||
hdr->ramdisk_image = ramdisk_addr & 0xffffffff;
|
||||
hdr->ramdisk_size = ramdisk_size & 0xffffffff;
|
||||
boot_params->ext_ramdisk_image = (u64)ramdisk_addr >> 32;
|
||||
boot_params->ext_ramdisk_size = (u64)ramdisk_size >> 32;
|
||||
|
||||
return boot_params;
|
||||
fail2:
|
||||
@@ -1374,7 +1376,10 @@ struct boot_params *efi_main(struct efi_config *c,
|
||||
|
||||
setup_graphics(boot_params);
|
||||
|
||||
setup_efi_pci(boot_params);
|
||||
status = setup_efi_pci(boot_params);
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "setup_efi_pci() failed!\n");
|
||||
}
|
||||
|
||||
status = efi_call_early(allocate_pool, EFI_LOADER_DATA,
|
||||
sizeof(*gdt), (void **)&gdt);
|
||||
@@ -1401,16 +1406,20 @@ struct boot_params *efi_main(struct efi_config *c,
|
||||
hdr->init_size, hdr->init_size,
|
||||
hdr->pref_address,
|
||||
hdr->kernel_alignment);
|
||||
if (status != EFI_SUCCESS)
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "efi_relocate_kernel() failed!\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
hdr->pref_address = hdr->code32_start;
|
||||
hdr->code32_start = bzimage_addr;
|
||||
}
|
||||
|
||||
status = exit_boot(boot_params, handle, is64);
|
||||
if (status != EFI_SUCCESS)
|
||||
if (status != EFI_SUCCESS) {
|
||||
efi_printk(sys_table, "exit_boot() failed!\n");
|
||||
goto fail;
|
||||
}
|
||||
|
||||
memset((char *)gdt->address, 0x0, gdt->size);
|
||||
desc = (struct desc_struct *)gdt->address;
|
||||
@@ -1470,5 +1479,6 @@ struct boot_params *efi_main(struct efi_config *c,
|
||||
|
||||
return boot_params;
|
||||
fail:
|
||||
efi_printk(sys_table, "efi_main() failed!\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -103,20 +103,4 @@ struct efi_uga_draw_protocol {
|
||||
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 */
|
||||
|
||||
@@ -154,7 +154,7 @@ extra_header_fields:
|
||||
#else
|
||||
.quad 0 # ImageBase
|
||||
#endif
|
||||
.long 0x20 # SectionAlignment
|
||||
.long CONFIG_PHYSICAL_ALIGN # SectionAlignment
|
||||
.long 0x20 # FileAlignment
|
||||
.word 0 # MajorOperatingSystemVersion
|
||||
.word 0 # MinorOperatingSystemVersion
|
||||
|
||||
Reference in New Issue
Block a user