mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-29 08:00:26 +09:00
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: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
e275458c2f
commit
65e4c0b168
@ -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
|
|||||||
.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
|
|||||||
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
|
||||||
|
12
arch/x86/lib/sections.c
Normal file
12
arch/x86/lib/sections.c
Normal file
@ -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")));
|
@ -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];
|
|||||||
* 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)
|
|||||||
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);
|
|||||||
#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
|
||||||
|
Loading…
Reference in New Issue
Block a user