Message ID | 20230226013305.2251638-10-sjg@chromium.org |
---|---|
State | Superseded, archived |
Delegated to: | Heinrich Schuchardt |
Headers | show |
Series | efi: Improvements to booting and debugging | expand |
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
Hi Heinrich, On Mon, 6 Mar 2023 at 01:39, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote: > > 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. OK I created a separate file. Of course the 'efidebug' command cannot be used in the app or payload, since it did not create the systab. > > > +{ > > + 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. OK > > > + 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? Me when I am looking at them! Regards, Simon
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[]) +{ + 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)); + } + + 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> + 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>
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(-)