提交 65e4c0b1 编写于 作者: S Simon Glass 提交者: Alexander Graf

x86: efi: Add EFI loader support for x86

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: NSimon Glass <sjg@chromium.org>
Reviewed-by: NBin Meng <bmeng.cn@gmail.com>
Signed-off-by: NAlexander Graf <agraf@suse.de>
上级 e275458c
...@@ -28,7 +28,10 @@ SECTIONS ...@@ -28,7 +28,10 @@ SECTIONS
} }
. = ALIGN(4); . = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } .rodata : {
*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))
KEEP(*(.rodata.efi.init));
}
. = ALIGN(4); . = ALIGN(4);
.data : { *(.data*) } .data : { *(.data*) }
...@@ -40,6 +43,37 @@ SECTIONS ...@@ -40,6 +43,37 @@ SECTIONS
.got : { *(.got*) } .got : { *(.got*) }
. = ALIGN(4); . = 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 = .; __data_end = .;
__init_end = .; __init_end = .;
......
...@@ -28,6 +28,7 @@ obj-y += pirq_routing.o ...@@ -28,6 +28,7 @@ obj-y += pirq_routing.o
obj-y += relocate.o obj-y += relocate.o
obj-y += physmem.o obj-y += physmem.o
obj-$(CONFIG_X86_RAMTEST) += ramtest.o obj-$(CONFIG_X86_RAMTEST) += ramtest.o
obj-y += sections.o
obj-y += sfi.o obj-y += sfi.o
obj-y += string.o obj-y += string.o
ifndef CONFIG_QEMU ifndef CONFIG_QEMU
......
/*
* 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")));
...@@ -39,6 +39,7 @@ static bool efi_is_direct_boot = true; ...@@ -39,6 +39,7 @@ static bool efi_is_direct_boot = true;
*/ */
static struct efi_configuration_table EFI_RUNTIME_DATA efi_conf_table[2]; 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 * 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 * 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]; ...@@ -46,16 +47,20 @@ static struct efi_configuration_table EFI_RUNTIME_DATA efi_conf_table[2];
* EFI callback entry/exit. * EFI callback entry/exit.
*/ */
static volatile void *efi_gd, *app_gd; static volatile void *efi_gd, *app_gd;
#endif
/* Called from do_bootefi_exec() */ /* Called from do_bootefi_exec() */
void efi_save_gd(void) void efi_save_gd(void)
{ {
#ifdef CONFIG_ARM
efi_gd = gd; efi_gd = gd;
#endif
} }
/* Called on every callback entry */ /* Called on every callback entry */
void efi_restore_gd(void) void efi_restore_gd(void)
{ {
#ifdef CONFIG_ARM
/* Only restore if we're already in EFI context */ /* Only restore if we're already in EFI context */
if (!efi_gd) if (!efi_gd)
return; return;
...@@ -63,12 +68,16 @@ void efi_restore_gd(void) ...@@ -63,12 +68,16 @@ void efi_restore_gd(void)
if (gd != efi_gd) if (gd != efi_gd)
app_gd = gd; app_gd = gd;
gd = efi_gd; gd = efi_gd;
#endif
} }
/* Called on every callback exit */ /* Called on every callback exit */
efi_status_t efi_exit_func(efi_status_t ret) efi_status_t efi_exit_func(efi_status_t ret)
{ {
#ifdef CONFIG_ARM
gd = app_gd; gd = app_gd;
#endif
return ret; return ret;
} }
......
...@@ -44,6 +44,10 @@ static efi_status_t EFI_RUNTIME_TEXT EFIAPI efi_invalid_parameter(void); ...@@ -44,6 +44,10 @@ static efi_status_t EFI_RUNTIME_TEXT EFIAPI efi_invalid_parameter(void);
#elif defined(CONFIG_ARM) #elif defined(CONFIG_ARM)
#define R_RELATIVE 23 #define R_RELATIVE 23
#define R_MASK 0xffULL #define R_MASK 0xffULL
#elif defined(CONFIG_X86)
#include <asm/elf.h>
#define R_RELATIVE R_386_RELATIVE
#define R_MASK 0xffULL
#else #else
#error Need to add relocation awareness #error Need to add relocation awareness
#endif #endif
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册