x86: efi: Add EFI loader support for x86
authorSimon Glass <sjg@chromium.org>
Sun, 25 Sep 2016 21:27:35 +0000 (15:27 -0600)
committerAlexander Graf <agraf@suse.de>
Wed, 19 Oct 2016 07:01:53 +0000 (09:01 +0200)
Add the required pieces to support the EFI loader on x86.

Since U-Boot only builds for 32-bit on x86, only a 32-bit EFI application
is supported. If a 64-bit kernel must be booted, U-Boot supports this
directly using FIT (see doc/uImage.FIT/kernel.its). U-Boot can act as a
payload for both 32-bit and 64-bit EFI.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
Signed-off-by: Alexander Graf <agraf@suse.de>
arch/x86/cpu/u-boot.lds
arch/x86/lib/Makefile
arch/x86/lib/sections.c [new file with mode: 0644]
lib/efi_loader/efi_boottime.c
lib/efi_loader/efi_runtime.c

index 36f59ea96db8663b9f44b7dd4a1acfc0a86635f4..cca536b27239e847a93eb7ad41ec82b5f1e1476f 100644 (file)
@@ -28,7 +28,10 @@ SECTIONS
        }
 
        . = ALIGN(4);
-       .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
+       .rodata : {
+               *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
+               KEEP(*(.rodata.efi.init));
+       }
 
        . = ALIGN(4);
        .data : { *(.data*) }
@@ -40,6 +43,37 @@ SECTIONS
        .got : { *(.got*) }
 
        . = ALIGN(4);
+
+       .__efi_runtime_start : {
+               *(.__efi_runtime_start)
+       }
+
+       .efi_runtime : {
+               *(efi_runtime_text)
+               *(efi_runtime_data)
+       }
+
+       .__efi_runtime_stop : {
+               *(.__efi_runtime_stop)
+       }
+
+       .efi_runtime_rel_start :
+       {
+               *(.__efi_runtime_rel_start)
+       }
+
+       .efi_runtime_rel : {
+               *(.relefi_runtime_text)
+               *(.relefi_runtime_data)
+       }
+
+       .efi_runtime_rel_stop :
+       {
+               *(.__efi_runtime_rel_stop)
+       }
+
+       . = ALIGN(4);
+
        __data_end = .;
        __init_end = .;
 
index 40ea6bffb74108c8bee64a8b8cc4a0700ce2ae0b..b9c29226bdb3a93928224c900d9cfa9298b86907 100644 (file)
@@ -28,6 +28,7 @@ obj-y += pirq_routing.o
 obj-y  += relocate.o
 obj-y += physmem.o
 obj-$(CONFIG_X86_RAMTEST) += ramtest.o
+obj-y  += sections.o
 obj-y += sfi.o
 obj-y  += string.o
 ifndef CONFIG_QEMU
diff --git a/arch/x86/lib/sections.c b/arch/x86/lib/sections.c
new file mode 100644 (file)
index 0000000..6455e0f
--- /dev/null
@@ -0,0 +1,12 @@
+/*
+ * Copyright 2013 Albert ARIBAUD <albert.u.boot@aribaud.net>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+char __efi_runtime_start[0] __attribute__((section(".__efi_runtime_start")));
+char __efi_runtime_stop[0] __attribute__((section(".__efi_runtime_stop")));
+char __efi_runtime_rel_start[0]
+               __attribute__((section(".__efi_runtime_rel_start")));
+char __efi_runtime_rel_stop[0]
+               __attribute__((section(".__efi_runtime_rel_stop")));
index ac26375072f0d941ad83633a552dad99d2f60e56..476ef1b88aaed3620b846b8a5c1db48aa359053d 100644 (file)
@@ -39,6 +39,7 @@ static bool efi_is_direct_boot = true;
  */
 static struct efi_configuration_table EFI_RUNTIME_DATA efi_conf_table[2];
 
+#ifdef CONFIG_ARM
 /*
  * The "gd" pointer lives in a register on ARM and AArch64 that we declare
  * fixed when compiling U-Boot. However, the payload does not know about that
@@ -46,16 +47,20 @@ static struct efi_configuration_table EFI_RUNTIME_DATA efi_conf_table[2];
  * EFI callback entry/exit.
  */
 static volatile void *efi_gd, *app_gd;
+#endif
 
 /* Called from do_bootefi_exec() */
 void efi_save_gd(void)
 {
+#ifdef CONFIG_ARM
        efi_gd = gd;
+#endif
 }
 
 /* Called on every callback entry */
 void efi_restore_gd(void)
 {
+#ifdef CONFIG_ARM
        /* Only restore if we're already in EFI context */
        if (!efi_gd)
                return;
@@ -63,12 +68,16 @@ void efi_restore_gd(void)
        if (gd != efi_gd)
                app_gd = gd;
        gd = efi_gd;
+#endif
 }
 
 /* Called on every callback exit */
 efi_status_t efi_exit_func(efi_status_t ret)
 {
+#ifdef CONFIG_ARM
        gd = app_gd;
+#endif
+
        return ret;
 }
 
index f73e6d97cbc359a482be0140cca3d096d810dcc6..f007ca640a35cea11b767e9f46c1558eae753d82 100644 (file)
@@ -44,6 +44,10 @@ static efi_status_t EFI_RUNTIME_TEXT EFIAPI efi_invalid_parameter(void);
 #elif defined(CONFIG_ARM)
 #define R_RELATIVE     23
 #define R_MASK         0xffULL
+#elif defined(CONFIG_X86)
+#include <asm/elf.h>
+#define R_RELATIVE     R_386_RELATIVE
+#define R_MASK         0xffULL
 #else
 #error Need to add relocation awareness
 #endif