diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Kconfig | 2 | ||||
-rw-r--r-- | lib/Makefile | 2 | ||||
-rw-r--r-- | lib/efi/Kconfig | 83 | ||||
-rw-r--r-- | lib/efi_client/Kconfig | 80 | ||||
-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/Kconfig | 3 | ||||
-rw-r--r-- | lib/efi_loader/efi_debug_support.c | 2 | ||||
-rw-r--r-- | lib/efi_loader/efi_firmware.c | 2 | ||||
-rw-r--r-- | lib/efi_loader/efi_memory.c | 2 | ||||
-rw-r--r-- | lib/efi_selftest/efi_selftest_debug_support.c | 68 | ||||
-rw-r--r-- | lib/efi_selftest/efi_selftest_esrt.c | 6 | ||||
-rw-r--r-- | lib/uuid.c | 4 |
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 }, |