[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