summaryrefslogtreecommitdiff
path: root/arch/x86/cpu/efi
diff options
context:
space:
mode:
authorBin Meng <bmeng.cn@gmail.com>2018-08-23 08:24:10 -0700
committerBin Meng <bmeng.cn@gmail.com>2018-08-30 11:23:14 +0800
commit1fdeacd32c6335acb7bd5f00c3f177013d971d3d (patch)
tree9d9119d2eb2ec7dba56e35799fd95223708ad8c3 /arch/x86/cpu/efi
parentcbe503fbc11f36086482bfd7066c2e36b82f1544 (diff)
x86: zimage: Support booting Linux kernel from an EFI payload
At present Linux kernel loaded from U-Boot as an EFI payload does not boot. This fills in kernel's boot params structure with the required critical EFI information like system table address and memory map stuff so that kernel can obtain essential data like runtime services and ACPI table to boot. With this patch, now U-Boot as an EFI payload becomes much more practical: it is another option of kernel bootloader, ie, can be a replacement for grub. Signed-off-by: Bin Meng <bmeng.cn@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
Diffstat (limited to 'arch/x86/cpu/efi')
-rw-r--r--arch/x86/cpu/efi/payload.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/arch/x86/cpu/efi/payload.c b/arch/x86/cpu/efi/payload.c
index 0e7c7c1ba4..c323c7b19a 100644
--- a/arch/x86/cpu/efi/payload.c
+++ b/arch/x86/cpu/efi/payload.c
@@ -8,6 +8,7 @@
#include <efi.h>
#include <errno.h>
#include <usb.h>
+#include <asm/bootparam.h>
#include <asm/e820.h>
#include <asm/post.h>
@@ -250,3 +251,39 @@ unsigned int install_e820_map(unsigned int max_entries,
return num_entries;
}
+
+void setup_efi_info(struct efi_info *efi_info)
+{
+ struct efi_entry_systable *table;
+ struct efi_entry_memmap *map;
+ char *signature;
+ int size, ret;
+
+ memset(efi_info, 0, sizeof(struct efi_info));
+
+ ret = efi_info_get(EFIET_SYS_TABLE, (void **)&table, &size);
+ if (ret) {
+ printf("Cannot find EFI system table, ret=%d\n", ret);
+ return;
+ }
+ efi_info->efi_systab = (u32)(table->sys_table);
+
+ ret = efi_info_get(EFIET_MEMORY_MAP, (void **)&map, &size);
+ if (ret) {
+ printf("Cannot find EFI memory map tables, ret=%d\n", ret);
+ return;
+ }
+ efi_info->efi_memdesc_size = map->desc_size;
+ efi_info->efi_memdesc_version = map->version;
+ efi_info->efi_memmap = (u32)(map->desc);
+ efi_info->efi_memmap_size = size - sizeof(struct efi_entry_memmap);
+
+#ifdef CONFIG_EFI_STUB_64BIT
+ efi_info->efi_systab_hi = table->sys_table >> 32;
+ efi_info->efi_memmap_hi = (u64)(u32)(map->desc) >> 32;
+ signature = EFI64_LOADER_SIGNATURE;
+#else
+ signature = EFI32_LOADER_SIGNATURE;
+#endif
+ memcpy(&efi_info->efi_loader_signature, signature, 4);
+}