
On 2/26/23 02:33, Simon Glass wrote:
Add a command to display the tables provided by EFI.
Signed-off-by: Simon Glass sjg@chromium.org
cmd/efi.c | 40 +++++++++++++++++++++++++++++++++++++++- doc/usage/cmd/efi.rst | 22 ++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-)
diff --git a/cmd/efi.c b/cmd/efi.c index c0384e0db28..86988d9e9e2 100644 --- a/cmd/efi.c +++ b/cmd/efi.c @@ -7,10 +7,12 @@ #include <common.h> #include <command.h> #include <efi.h> +#include <efi_api.h> #include <errno.h> #include <log.h> #include <malloc.h> #include <sort.h> +#include <uuid.h> #include <asm/global_data.h>
DECLARE_GLOBAL_DATA_PTR; @@ -273,8 +275,43 @@ done: return ret ? CMD_RET_FAILURE : 0; }
+static int do_efi_tables(struct cmd_tbl *cmdtp, int flag, int argc,
char *const argv[])
We already have function do_efi_show_tables() to print the list of EFI configuration tables. Please, avoid code duplication.
+{
- struct efi_system_table *systab;
- int i;
- if (IS_ENABLED(CONFIG_EFI_APP)) {
systab = efi_get_sys_table();
if (!systab) {
printf("Cannot read system table\n");
return CMD_RET_FAILURE;
}
- } else {
int size;
int ret;
ret = efi_info_get(EFIET_SYS_TABLE, (void **)&systab, &size);
if (ret) {
printf("Cannot find EFI system table (err=%d)\n", ret);
return CMD_RET_FAILURE;
}
- }
- for (i = 0; i < systab->nr_tables; i++) {
struct efi_configuration_table *tab = &systab->tables[i];
char guid_str[37];
uuid_bin_to_str(tab->guid.b, guid_str, 1);
printf("%p %s %s\n", tab->table, guid_str,
uuid_guid_get_str(tab->guid.b));
do_efi_show_tables() does this with printf("%pUl (%pUs)\n",..).
- }
- return 0;
+}
static struct cmd_tbl efi_commands[] = { U_BOOT_CMD_MKENT(mem, 1, 1, do_efi_mem, "", ""),
U_BOOT_CMD_MKENT(tables, 1, 1, do_efi_tables, "", ""), };
static int do_efi(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
@@ -298,5 +335,6 @@ static int do_efi(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[]) U_BOOT_CMD( efi, 3, 1, do_efi, "EFI access",
- "mem [all] Dump memory information [include boot services]"
- "mem [all] Dump memory information [include boot services]\n"
- "tables Dump tables" );
diff --git a/doc/usage/cmd/efi.rst b/doc/usage/cmd/efi.rst index c029c423879..2424d3bb587 100644 --- a/doc/usage/cmd/efi.rst +++ b/doc/usage/cmd/efi.rst @@ -10,6 +10,7 @@ Synopsis ::
efi mem [all]
efi tables
Description
@@ -54,6 +55,14 @@ Attributes Shows a code for memory attributes. The key for this is shown below the table.
+efi tables +~~~~~~~~~~
+This shows a list of the EFI tables provided in the system table. These use +GUIDs so it is not possible in general to show the name of a table. But some +effort is made to provide a useful table, where the GUID is known by U-Boot.
Example
@@ -195,3 +204,16 @@ Example f: uncached, write-coalescing, write-through, write-back rf: uncached, write-coalescing, write-through, write-back, needs runtime mapping 1: uncached
- => efi tables
- 000000001f8eda98 ee4e5898-3914-4259-9d6e-dc7bd79403cf EFI_LZMA_COMPRESSED
- 000000001ff2ace0 05ad34ba-6f02-4214-952e-4da0398e2bb9 EFI_DXE_SERVICES
- 000000001f8ea018 7739f24c-93d7-11d4-9a3a-0090273fc14d EFI_HOB_LIST
- 000000001ff2bac0 4c19049f-4137-4dd3-9c10-8b97a83ffdfa EFI_MEMORY_TYPE
- 000000001ff2cb10 49152e77-1ada-4764-b7a2-7afefed95e8b <NULL>
This is what 'efi tables' / printf("%pUl (%pUs)\n",..). would output for an unknown table:
8868e871-e4f1-11d3-bc22-0080c73c8881 (8868e871-e4f1-11d3-bc22-0080c73c8881)
Maybe uuid_guid_get_str() should return an empty string in case of an unknown GUID.
- 000000001f9ac018 060cc026-4c0d-4dda-8f41-595fef00a502 EFI_MEM_STATUS_CODE_REC
- 000000001f9ab000 eb9d2d31-2d88-11d3-9a16-0090273fc14d EFI_SMBIOS
- 000000001fb7e000 eb9d2d30-2d88-11d3-9a16-0090273fc14d EFI_GUID_EFI_ACPI1
- 000000001fb7e014 8868e871-e4f1-11d3-bc22-0080c73c8881 EFI_GUID_EFI_ACPI2
- 000000001e550018 dcfa911d-26eb-469f-a220-38b7dc461220 <NULL>
Who would care about the address of the table?
Best regards
Heinrich