summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Kconfig2
-rw-r--r--lib/Makefile2
-rw-r--r--lib/efi/Kconfig83
-rw-r--r--lib/efi_client/Kconfig80
-rw-r--r--lib/efi_client/Makefile (renamed from lib/efi/Makefile)0
-rw-r--r--lib/efi_client/efi.c (renamed from lib/efi/efi.c)0
-rw-r--r--lib/efi_client/efi_app.c (renamed from lib/efi/efi_app.c)0
-rw-r--r--lib/efi_client/efi_app_init.c (renamed from lib/efi/efi_app_init.c)0
-rw-r--r--lib/efi_client/efi_info.c (renamed from lib/efi/efi_info.c)0
-rw-r--r--lib/efi_client/efi_stub.c (renamed from lib/efi/efi_stub.c)0
-rw-r--r--lib/efi_loader/Kconfig3
-rw-r--r--lib/efi_loader/efi_debug_support.c2
-rw-r--r--lib/efi_loader/efi_firmware.c2
-rw-r--r--lib/efi_loader/efi_memory.c2
-rw-r--r--lib/efi_selftest/efi_selftest_debug_support.c68
-rw-r--r--lib/efi_selftest/efi_selftest_esrt.c6
-rw-r--r--lib/uuid.c4
17 files changed, 171 insertions, 83 deletions
diff --git a/lib/Kconfig b/lib/Kconfig
index 6a89f797bef..fbc9de90669 100644
--- a/lib/Kconfig
+++ b/lib/Kconfig
@@ -1096,7 +1096,7 @@ config VPL_OF_LIBFDT_ASSUME_MASK
unsafe execution. See FDT_ASSUME_PERFECT, etc. in libfdt_internal.h
menu "System tables"
- depends on (!EFI && !SYS_COREBOOT) || (ARM && EFI_LOADER)
+ depends on (!EFI_CLIENT && !SYS_COREBOOT) || (ARM && EFI_LOADER)
config BLOBLIST_TABLES
bool "Put tables in a bloblist"
diff --git a/lib/Makefile b/lib/Makefile
index 18ae0cd87bf..2643bfc867c 100644
--- a/lib/Makefile
+++ b/lib/Makefile
@@ -5,7 +5,7 @@
ifndef CONFIG_XPL_BUILD
-obj-$(CONFIG_EFI) += efi/
+obj-$(CONFIG_EFI_CLIENT) += efi_client/
obj-$(CONFIG_EFI_LOADER) += efi_driver/
obj-$(CONFIG_EFI_LOADER) += efi_loader/
obj-$(CONFIG_CMD_BOOTEFI_SELFTEST) += efi_selftest/
diff --git a/lib/efi/Kconfig b/lib/efi/Kconfig
index 81ed3e66b34..fc6d5b6d6c2 100644
--- a/lib/efi/Kconfig
+++ b/lib/efi/Kconfig
@@ -1,79 +1,12 @@
-menu "U-Boot as UEFI application"
- depends on X86
+# SPDX-License-Identifier: GPL-2.0-or-later
+#
+# Copyright 2025 Simon Glass <sjg@chromium.org>
+#
config EFI
- bool "Support running U-Boot from EFI"
- depends on X86
- imply X86_TSC_READ_BASE
+ bool
help
- U-Boot can be started from EFI on certain platforms. This allows
- EFI to perform most of the system init and then jump to U-Boot for
- final system boot. Another option is to run U-Boot as an EFI
- application, with U-Boot using EFI's drivers instead of its own.
+ Indicates that EFI functionality is enabled, either via EFI_CLIENT or
+ EFI_LOADER
-choice
- prompt "Select EFI mode to use"
- depends on X86 && EFI
-
-config EFI_APP
- bool "Support running as an EFI application"
- select CHARSET
- help
- Build U-Boot as an application which can be started from EFI. This
- is useful for examining a platform in the early stages of porting
- U-Boot to it. It allows only very basic functionality, such as a
- command prompt and memory and I/O functions. Use 'reset' to return
- to EFI.
-
-config EFI_STUB
- bool "Support running as an EFI payload"
-
-endchoice
-
-choice
- prompt "EFI app 32/64-bit selection"
- depends on EFI_APP
- help
- EFI does not support mixing 32-bit and 64-bit modes. This is a
- significant problem because it means that you must build a stub with
- the correct type for EFI to load it correctly. If you are using
- 32-bit EFI, select 32-bit here, else select 64-bit. Failure to do
- this may produce no error message - it just won't start!
-
-config EFI_APP_32BIT
- bool "Produce an app for running with 32-bit EFI"
-
-config EFI_APP_64BIT
- bool "Produce an app for running with 64-bit EFI"
-
-endchoice
-
-choice
- prompt "EFI stub 32/64-bit selection"
- depends on EFI_STUB
- help
- EFI does not support mixing 32-bit and 64-bit modes. This is a
- significant problem because it means that you must build a stub with
- the correct type for EFI to load it correctly. If you are using
- 32-bit EFI, select 32-bit here, else select 64-bit. Failure to do
- this may produce no error message - it just won't start!
-
-config EFI_STUB_32BIT
- bool "Produce a stub for running with 32-bit EFI"
-
-config EFI_STUB_64BIT
- bool "Produce a stub for running with 64-bit EFI"
-
-endchoice
-
-config EFI_RAM_SIZE
- hex "Amount of EFI RAM for U-Boot"
- depends on EFI_APP
- default 0x10000000
- help
- Set the amount of EFI RAM which is claimed by U-Boot for its own
- use. U-Boot allocates this from EFI on start-up (along with a few
- other smaller amounts) and it can never be increased after that.
- It is used as the RAM size in with U-Boot.
-
-endmenu
+ This is used to provide libraries shared by both.
diff --git a/lib/efi_client/Kconfig b/lib/efi_client/Kconfig
new file mode 100644
index 00000000000..723c98d2a75
--- /dev/null
+++ b/lib/efi_client/Kconfig
@@ -0,0 +1,80 @@
+menu "U-Boot as UEFI application"
+ depends on X86
+
+config EFI_CLIENT
+ bool "Support running U-Boot from EFI"
+ depends on X86
+ imply X86_TSC_READ_BASE
+ select EFI
+ help
+ U-Boot can be started from EFI on certain platforms. This allows
+ EFI to perform most of the system init and then jump to U-Boot for
+ final system boot. Another option is to run U-Boot as an EFI
+ application, with U-Boot using EFI's drivers instead of its own.
+
+choice
+ prompt "Select EFI mode to use"
+ depends on X86 && EFI_CLIENT
+
+config EFI_APP
+ bool "Support running as an EFI application"
+ select CHARSET
+ help
+ Build U-Boot as an application which can be started from EFI. This
+ is useful for examining a platform in the early stages of porting
+ U-Boot to it. It allows only very basic functionality, such as a
+ command prompt and memory and I/O functions. Use 'reset' to return
+ to EFI.
+
+config EFI_STUB
+ bool "Support running as an EFI payload"
+
+endchoice
+
+choice
+ prompt "EFI app 32/64-bit selection"
+ depends on EFI_APP
+ help
+ EFI does not support mixing 32-bit and 64-bit modes. This is a
+ significant problem because it means that you must build a stub with
+ the correct type for EFI to load it correctly. If you are using
+ 32-bit EFI, select 32-bit here, else select 64-bit. Failure to do
+ this may produce no error message - it just won't start!
+
+config EFI_APP_32BIT
+ bool "Produce an app for running with 32-bit EFI"
+
+config EFI_APP_64BIT
+ bool "Produce an app for running with 64-bit EFI"
+
+endchoice
+
+choice
+ prompt "EFI stub 32/64-bit selection"
+ depends on EFI_STUB
+ help
+ EFI does not support mixing 32-bit and 64-bit modes. This is a
+ significant problem because it means that you must build a stub with
+ the correct type for EFI to load it correctly. If you are using
+ 32-bit EFI, select 32-bit here, else select 64-bit. Failure to do
+ this may produce no error message - it just won't start!
+
+config EFI_STUB_32BIT
+ bool "Produce a stub for running with 32-bit EFI"
+
+config EFI_STUB_64BIT
+ bool "Produce a stub for running with 64-bit EFI"
+
+endchoice
+
+config EFI_RAM_SIZE
+ hex "Amount of EFI RAM for U-Boot"
+ depends on EFI_APP
+ default 0x10000000
+ help
+ Set the amount of EFI RAM which is claimed by U-Boot for its own
+ use. U-Boot allocates this from EFI on start-up (along with a few
+ other smaller amounts) and it can never be increased after that.
+ It is used as the RAM size in with U-Boot.
+
+endmenu
diff --git a/lib/efi/Makefile b/lib/efi_client/Makefile
index 232fa684360..232fa684360 100644
--- a/lib/efi/Makefile
+++ b/lib/efi_client/Makefile
diff --git a/lib/efi/efi.c b/lib/efi_client/efi.c
index bcb34d67465..bcb34d67465 100644
--- a/lib/efi/efi.c
+++ b/lib/efi_client/efi.c
diff --git a/lib/efi/efi_app.c b/lib/efi_client/efi_app.c
index 9b94a93ee4f..9b94a93ee4f 100644
--- a/lib/efi/efi_app.c
+++ b/lib/efi_client/efi_app.c
diff --git a/lib/efi/efi_app_init.c b/lib/efi_client/efi_app_init.c
index c5e4192fe06..c5e4192fe06 100644
--- a/lib/efi/efi_app_init.c
+++ b/lib/efi_client/efi_app_init.c
diff --git a/lib/efi/efi_info.c b/lib/efi_client/efi_info.c
index 5b564c5651d..5b564c5651d 100644
--- a/lib/efi/efi_info.c
+++ b/lib/efi_client/efi_info.c
diff --git a/lib/efi/efi_stub.c b/lib/efi_client/efi_stub.c
index a083c7f1e9b..a083c7f1e9b 100644
--- a/lib/efi/efi_stub.c
+++ b/lib/efi_client/efi_stub.c
diff --git a/lib/efi_loader/Kconfig b/lib/efi_loader/Kconfig
index 077466f01f0..c2aa88f59fb 100644
--- a/lib/efi_loader/Kconfig
+++ b/lib/efi_loader/Kconfig
@@ -16,6 +16,7 @@ config EFI_LOADER
depends on !EFI_STUB || !X86 || X86_64 || EFI_STUB_32BIT
depends on !EFI_APP
default y if !ARM || SYS_CPU = armv7 || SYS_CPU = armv8
+ select EFI
select CHARSET
# We need to send DM events, dynamically, in the EFI block driver
select DM_EVENT
@@ -595,6 +596,8 @@ config BOOTEFI_TESTAPP_COMPILE
endif
+source "lib/efi_client/Kconfig"
+
source "lib/efi/Kconfig"
endmenu
diff --git a/lib/efi_loader/efi_debug_support.c b/lib/efi_loader/efi_debug_support.c
index 186bdbce750..490b0bb7088 100644
--- a/lib/efi_loader/efi_debug_support.c
+++ b/lib/efi_loader/efi_debug_support.c
@@ -22,7 +22,7 @@ struct efi_debug_image_info_table_header efi_m_debug_info_table_header = {
*/
static u32 efi_m_max_table_entries;
-#define EFI_DEBUG_TABLE_ENTRY_SIZE (sizeof(union efi_debug_image_info *))
+#define EFI_DEBUG_TABLE_ENTRY_SIZE (sizeof(union efi_debug_image_info))
/**
* efi_initialize_system_table_pointer() - Initialize system table pointer
diff --git a/lib/efi_loader/efi_firmware.c b/lib/efi_loader/efi_firmware.c
index 75501e21557..216df83de67 100644
--- a/lib/efi_loader/efi_firmware.c
+++ b/lib/efi_loader/efi_firmware.c
@@ -332,6 +332,8 @@ static efi_status_t efi_fill_image_desc_array(
return EFI_BUFFER_TOO_SMALL;
}
+ if (!image_info)
+ return EFI_INVALID_PARAMETER;
*image_info_size = total_size;
ret = efi_gen_capsule_guids();
diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
index 6dfc698a247..b77c2f980cc 100644
--- a/lib/efi_loader/efi_memory.c
+++ b/lib/efi_loader/efi_memory.c
@@ -714,6 +714,8 @@ efi_status_t efi_realloc(void **ptr, size_t size)
sizeof(struct efi_pool_allocation);
new_ptr = efi_alloc(size);
+ if (!new_ptr)
+ return EFI_OUT_OF_RESOURCES;
/* copy old data to new alloced buffer */
memcpy(new_ptr, *ptr, min(size, old_size));
diff --git a/lib/efi_selftest/efi_selftest_debug_support.c b/lib/efi_selftest/efi_selftest_debug_support.c
index 9ca8b3f82f5..ac77caaf561 100644
--- a/lib/efi_selftest/efi_selftest_debug_support.c
+++ b/lib/efi_selftest/efi_selftest_debug_support.c
@@ -9,6 +9,7 @@
#include <efi_loader.h>
#include <efi_selftest.h>
+#include <linux/sizes.h>
/**
* efi_st_debug_support_execute() - execute test
@@ -21,6 +22,12 @@ static int efi_st_debug_support_execute(void)
{
struct efi_debug_image_info_table_header *efi_st_debug_info_table_header = NULL;
efi_guid_t efi_debug_image_info_table_guid = EFI_DEBUG_IMAGE_INFO_TABLE_GUID;
+ struct efi_mem_desc *memory_map;
+ efi_uintn_t map_size = 0;
+ efi_uintn_t map_key;
+ efi_uintn_t desc_size;
+ u32 desc_version;
+ efi_status_t ret;
/* get EFI_DEBUG_IMAGE_INFO_TABLE */
efi_st_debug_info_table_header = efi_st_get_config_table(&efi_debug_image_info_table_guid);
@@ -30,7 +37,66 @@ static int efi_st_debug_support_execute(void)
return EFI_ST_FAILURE;
}
- return EFI_ST_SUCCESS;
+ /* Load memory map */
+ ret = st_boottime->get_memory_map(&map_size, NULL, &map_key, &desc_size,
+ &desc_version);
+ if (ret != EFI_BUFFER_TOO_SMALL) {
+ efi_st_error
+ ("GetMemoryMap did not return EFI_BUFFER_TOO_SMALL\n");
+ return EFI_ST_FAILURE;
+ }
+ /* Allocate extra space for newly allocated memory */
+ map_size += sizeof(struct efi_mem_desc);
+ ret = st_boottime->allocate_pool(EFI_BOOT_SERVICES_DATA, map_size,
+ (void **)&memory_map);
+ if (ret != EFI_SUCCESS) {
+ efi_st_error("AllocatePool failed\n");
+ return EFI_ST_FAILURE;
+ }
+ ret = st_boottime->get_memory_map(&map_size, memory_map, &map_key,
+ &desc_size, &desc_version);
+ if (ret != EFI_SUCCESS) {
+ efi_st_error("GetMemoryMap failed\n");
+ return EFI_ST_FAILURE;
+ }
+ /* Find the system table pointer */
+ for (efi_uintn_t i = 0; map_size; ++i, map_size -= desc_size) {
+ struct efi_mem_desc *entry = &memory_map[i];
+ u64 end;
+
+ if (entry->type != EFI_RUNTIME_SERVICES_DATA)
+ continue;
+
+ end = entry->physical_start +
+ (entry->num_pages << EFI_PAGE_SHIFT);
+ for (u64 pos = ALIGN(entry->physical_start, SZ_4M);
+ pos <= end; pos += SZ_4M) {
+ struct efi_system_table_pointer *systab_pointer =
+ (void *)(uintptr_t)pos;
+
+ /* check for overflow */
+ if (pos < entry->physical_start)
+ break;
+ if (systab_pointer->signature ==
+ EFI_SYSTEM_TABLE_SIGNATURE) {
+ if (systab_pointer->efi_system_table_base !=
+ (uintptr_t)st_systable) {
+ efi_st_error("Wrong system table address\n");
+ ret = EFI_ST_FAILURE;
+ goto out;
+ }
+ ret = EFI_ST_SUCCESS;
+ goto out;
+ }
+ }
+ }
+ efi_st_error("System table pointer not found\n");
+ ret = EFI_ST_FAILURE;
+
+out:
+ st_boottime->free_pool(memory_map);
+
+ return ret;
}
EFI_UNIT_TEST(debug_support) = {
diff --git a/lib/efi_selftest/efi_selftest_esrt.c b/lib/efi_selftest/efi_selftest_esrt.c
index b7688deb496..7eadac90fbc 100644
--- a/lib/efi_selftest/efi_selftest_esrt.c
+++ b/lib/efi_selftest/efi_selftest_esrt.c
@@ -69,10 +69,12 @@ EFIAPI efi_test_fmp_get_image_info(struct efi_firmware_management_protocol *this
if (package_version_name)
*package_version_name = NULL;
- if (*image_info_size < sizeof(*image_info)) {
- *image_info_size = *descriptor_size * *descriptor_count;
+ if (*image_info_size < sizeof(*image_info) * TEST_ESRT_NUM_ENTRIES) {
+ *image_info_size = sizeof(*image_info) * TEST_ESRT_NUM_ENTRIES;
return EFI_BUFFER_TOO_SMALL;
}
+ if (!image_info)
+ return EFI_INVALID_PARAMETER;
for (int idx = 0; idx < TEST_ESRT_NUM_ENTRIES; idx++)
image_info[idx] = static_img_info[idx];
diff --git a/lib/uuid.c b/lib/uuid.c
index a1c88b9a622..8d99b540d9f 100644
--- a/lib/uuid.c
+++ b/lib/uuid.c
@@ -94,7 +94,7 @@ static const struct {
"system", "EFI System Partition",
PARTITION_SYSTEM_GUID,
},
-#if defined(CONFIG_CMD_EFIDEBUG) || defined(CONFIG_EFI)
+#if defined(CONFIG_CMD_EFIDEBUG) || defined(CONFIG_EFI_CLIENT)
{
NULL, "Device Path",
PARTITION_SYSTEM_GUID,
@@ -281,7 +281,7 @@ static const struct {
EFI_CERT_TYPE_PKCS7_GUID,
},
#endif
-#if defined(CONFIG_CMD_EFIDEBUG) || defined(CONFIG_EFI)
+#if defined(CONFIG_CMD_EFIDEBUG) || defined(CONFIG_EFI_CLIENT)
{ "EFI_LZMA_COMPRESSED", NULL, EFI_LZMA_COMPRESSED },
{ "EFI_DXE_SERVICES", NULL, EFI_DXE_SERVICES },
{ "EFI_HOB_LIST", NULL, EFI_HOB_LIST },