[PATCH 1/1] efi_selftest: check system table pointer
Ilias Apalodimas
ilias.apalodimas at linaro.org
Mon Jul 7 10:02:41 CEST 2025
On Fri, 4 Jul 2025 at 17:22, Heinrich Schuchardt
<heinrich.schuchardt at canonical.com> wrote:
>
> Enhance the debug support unit test.
>
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> --
Acked-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>
> lib/efi_selftest/efi_selftest_debug_support.c | 68 ++++++++++++++++++-
> 1 file changed, 67 insertions(+), 1 deletion(-)
>
> 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) = {
> --
> 2.48.1
>
More information about the U-Boot
mailing list