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:
committed by
Alexander Graf
parent
e275458c2f
commit
65e4c0b168
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user