forked from pool/u-boot
36c65f2eed
1 OBS-URL: https://build.opensuse.org/request/show/419605 OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/u-boot?expand=0&rev=78
94 lines
3.4 KiB
Diff
94 lines
3.4 KiB
Diff
From 5ce2f1f686c5e8ee5de054affc9ec48f7f782db5 Mon Sep 17 00:00:00 2001
|
|
From: Alexander Graf <agraf@suse.de>
|
|
Date: Sun, 7 Aug 2016 13:05:24 +0200
|
|
Subject: [PATCH] efi_loader: Expose efi_install_configuration_table
|
|
|
|
We want to be able to add configuration table entries from our own code as
|
|
well as from EFI payload code. Export the boot service function internally
|
|
too, so that we can reuse it.
|
|
|
|
Signed-off-by: Alexander Graf <agraf@suse.de>
|
|
---
|
|
include/efi_loader.h | 2 ++
|
|
lib/efi_loader/efi_boottime.c | 22 +++++++++++++---------
|
|
2 files changed, 15 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/include/efi_loader.h b/include/efi_loader.h
|
|
index 91d6a84..ac8b77a 100644
|
|
--- a/include/efi_loader.h
|
|
+++ b/include/efi_loader.h
|
|
@@ -130,6 +130,8 @@ uint64_t efi_add_memory_map(uint64_t start, uint64_t pages, int memory_type,
|
|
bool overlap_only_ram);
|
|
/* Called by board init to initialize the EFI memory map */
|
|
int efi_memory_init(void);
|
|
+/* Adds new or overrides configuration table entry to the system table */
|
|
+efi_status_t efi_install_configuration_table(efi_guid_t *guid, void *table);
|
|
|
|
#ifdef CONFIG_EFI_LOADER_BOUNCE_BUFFER
|
|
extern void *efi_bounce_buffer;
|
|
diff --git a/lib/efi_loader/efi_boottime.c b/lib/efi_loader/efi_boottime.c
|
|
index be6f5e8..3e7a48b 100644
|
|
--- a/lib/efi_loader/efi_boottime.c
|
|
+++ b/lib/efi_loader/efi_boottime.c
|
|
@@ -37,7 +37,7 @@ static bool efi_is_direct_boot = true;
|
|
* In most cases we want to pass an FDT to the payload, so reserve one slot of
|
|
* config table space for it. The pointer gets populated by do_bootefi_exec().
|
|
*/
|
|
-static struct efi_configuration_table EFI_RUNTIME_DATA efi_conf_table[1];
|
|
+static struct efi_configuration_table EFI_RUNTIME_DATA efi_conf_table[2];
|
|
|
|
/*
|
|
* The "gd" pointer lives in a register on ARM and AArch64 that we declare
|
|
@@ -375,31 +375,35 @@ static efi_status_t EFIAPI efi_locate_device_path(efi_guid_t *protocol,
|
|
return EFI_EXIT(EFI_NOT_FOUND);
|
|
}
|
|
|
|
-static efi_status_t EFIAPI efi_install_configuration_table(efi_guid_t *guid,
|
|
- void *table)
|
|
+efi_status_t efi_install_configuration_table(efi_guid_t *guid, void *table)
|
|
{
|
|
int i;
|
|
|
|
- EFI_ENTRY("%p, %p", guid, table);
|
|
-
|
|
/* Check for guid override */
|
|
for (i = 0; i < systab.nr_tables; i++) {
|
|
if (!guidcmp(guid, &efi_conf_table[i].guid)) {
|
|
efi_conf_table[i].table = table;
|
|
- return EFI_EXIT(EFI_SUCCESS);
|
|
+ return EFI_SUCCESS;
|
|
}
|
|
}
|
|
|
|
/* No override, check for overflow */
|
|
if (i >= ARRAY_SIZE(efi_conf_table))
|
|
- return EFI_EXIT(EFI_OUT_OF_RESOURCES);
|
|
+ return EFI_OUT_OF_RESOURCES;
|
|
|
|
/* Add a new entry */
|
|
memcpy(&efi_conf_table[i].guid, guid, sizeof(*guid));
|
|
efi_conf_table[i].table = table;
|
|
systab.nr_tables = i;
|
|
|
|
- return EFI_EXIT(EFI_SUCCESS);
|
|
+ return EFI_SUCCESS;
|
|
+}
|
|
+
|
|
+static efi_status_t EFIAPI efi_install_configuration_table_ext(efi_guid_t *guid,
|
|
+ void *table)
|
|
+{
|
|
+ EFI_ENTRY("%p, %p", guid, table);
|
|
+ return EFI_EXIT(efi_install_configuration_table(guid, table));
|
|
}
|
|
|
|
static efi_status_t EFIAPI efi_load_image(bool boot_policy,
|
|
@@ -750,7 +754,7 @@ static const struct efi_boot_services efi_boot_services = {
|
|
.register_protocol_notify = efi_register_protocol_notify,
|
|
.locate_handle = efi_locate_handle,
|
|
.locate_device_path = efi_locate_device_path,
|
|
- .install_configuration_table = efi_install_configuration_table,
|
|
+ .install_configuration_table = efi_install_configuration_table_ext,
|
|
.load_image = efi_load_image,
|
|
.start_image = efi_start_image,
|
|
.exit = efi_exit,
|