[PATCH 1/1] cmd: simplify command efidebug
AKASHI Takahiro
takahiro.akashi at linaro.org
Wed Oct 5 08:43:17 CEST 2022
On Wed, Oct 05, 2022 at 08:27:37AM +0200, Heinrich Schuchardt wrote:
> On 10/5/22 02:23, AKASHI Takahiro wrote:
> > Heinrich,
> >
> > On Tue, Oct 04, 2022 at 03:40:32PM +0200, Heinrich Schuchardt wrote:
> > > Currently we have subcommands 'efidebug dh' which shows protocols per
> > > handle and 'efidebug devices' which shows the device path. None shows which
> > > U-Boot device matches the handle.
> >
> > If you know how a device path display format is constructed,
> > you can identify it. For instance,
> > /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)
> > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -> efi_root
> > /VenHw(bbe4e671-5773-4ea1-9aab-3a7dbf40c482,00)
> > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> > -> host 0
> > /HD(1,GPT,7e5c17c5-3f5f-49d0-ae96-511b21d7f273,0x800,0x3f7df)
> > ^ -> partition 1
> >
> > > Change 'efidebug dh' to show the device path and the U-Boot device if any
> > > is associated with the handle.
> >
> > There is a good reason for two separate subcommands. While "dh" shows
> > all the handles which currently exist on the system, "devices" shows
> > only ones with device path protocol.
> > The number of handles can possibly be huge (try "dh" on EDK2).
>
> We only have to care about the low number of EFI handles in U-Boot which is
> block devices + 5.
Who knows the future.
> > For those who are interested in what devices are connected at some point,
> > "devices" subcommand is still useful.
>
> Having to look up information in two separate commands instead of one place
> is inconvenient.
I don't think so.
I sometimes felt comfortable only with the output from "devices" in my past development.
> The output of efidebug devices does not contain any information which will
> not be shown by modified efidebug dh command. So the devices command becomes
> superfluous.
That is why I suggested the same change be applied to "devices"
because such information is only meaningful for device paths.
-Takahiro Akashi
> >
> > The problem is not "devices" subcommand itself, but the display format
> > of device path. UEFI spec says, in "10.6 EFI Device Path Display Format Overview",
> > "This section describes the recommended conversion between an EFI Device
> > ^^^^^^^^^^^
> > Path Protocol and text."
> >
> > So if there is more readable/understandable format, we may want to use it
> > for U-Boot UEFI (at least, as an alternate option of format).
> > Say,
> > /VenHw(root)/VenHw(host, 0)/HD(1,GPT,....)
> > I believe that it is simple and unambiguous.
>
> This might be implemented subject to the DisplayOnly argument of
> EFI_DEVICE_PATH_TO_TEXT_PROTOCOL.ConvertDevicePathToText() in a separate
> patch.
>
> It would require adding the GUIDs to list_guid[] in lib/uuid.c and switching
> between '%pUl' and '%pUs' in efi_convert_device_node_to_text.
>
> >
> > > Remove 'efidebug devices'.
> >
> > So please don't remove "devices".
> > Instead, I recommend that the same change be applied to this subcommand,
> > displaying both formats at "devices".
>
> There is no benefit in having two sub-commands showing the same information.
> Instead we should reduce the code size.
>
> Best regards
>
> Heinrich
>
> >
> > -Takahiro Akashi
> >
> >
> > > Old output of 'efidebug dh':
> > >
> > > Handle Protocols
> > > ================ ====================
> > > 000000001b22e690 Device Path, Block IO
> > > 000000001b22e800 Device Path, Block IO, system, Simple File System
> > >
> > > New output of 'efidebug dh':
> > >
> > > 000000001b22e690 (host0)
> > > /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/VenHw(bbe4e671-5773-4ea1-9aab-3a7dbf40c482,00)
> > > Block IO
> > >
> > > 000000001b22e800 (host0:1)
> > > /VenHw(e61d73b9-a384-4acc-aeab-82e828f3628b)/VenHw(bbe4e671-5773-4ea1-9aab-3a7dbf40c482,00)/HD(1,GPT,7e5c17c5-3f5f-49d0-ae96-511b21d7f273,0x800,0x3f7df)
> > > Block IO
> > > system
> > > Simple File System
> > >
> > > Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> > > ---
> > > cmd/efidebug.c | 102 ++++++++-----------------------------------------
> > > 1 file changed, 15 insertions(+), 87 deletions(-)
> > >
> > > diff --git a/cmd/efidebug.c b/cmd/efidebug.c
> > > index 84e6ff5565..76a6b4d8eb 100644
> > > --- a/cmd/efidebug.c
> > > +++ b/cmd/efidebug.c
> > > @@ -8,6 +8,7 @@
> > > #include <charset.h>
> > > #include <common.h>
> > > #include <command.h>
> > > +#include <dm/device.h>
> > > #include <efi_dt_fixup.h>
> > > #include <efi_load_initrd.h>
> > > #include <efi_loader.h>
> > > @@ -344,79 +345,11 @@ static int do_efi_capsule(struct cmd_tbl *cmdtp, int flag,
> > > }
> > > #endif /* CONFIG_EFI_HAVE_CAPSULE_SUPPORT */
> > > -/**
> > > - * efi_get_device_path_text() - get device path text
> > > - *
> > > - * Return the text representation of the device path of a handle.
> > > - *
> > > - * @handle: handle of UEFI device
> > > - * Return:
> > > - * Pointer to the device path text or NULL.
> > > - * The caller is responsible for calling FreePool().
> > > - */
> > > -static u16 *efi_get_device_path_text(efi_handle_t handle)
> > > -{
> > > - struct efi_handler *handler;
> > > - efi_status_t ret;
> > > -
> > > - ret = efi_search_protocol(handle, &efi_guid_device_path, &handler);
> > > - if (ret == EFI_SUCCESS && handler->protocol_interface) {
> > > - struct efi_device_path *dp = handler->protocol_interface;
> > > -
> > > - return efi_dp_str(dp);
> > > - } else {
> > > - return NULL;
> > > - }
> > > -}
> > > -
> > > #define EFI_HANDLE_WIDTH ((int)sizeof(efi_handle_t) * 2)
> > > static const char spc[] = " ";
> > > static const char sep[] = "================";
> > > -/**
> > > - * do_efi_show_devices() - show UEFI devices
> > > - *
> > > - * @cmdtp: Command table
> > > - * @flag: Command flag
> > > - * @argc: Number of arguments
> > > - * @argv: Argument array
> > > - * Return: CMD_RET_SUCCESS on success, CMD_RET_RET_FAILURE on failure
> > > - *
> > > - * Implement efidebug "devices" sub-command.
> > > - * Show all UEFI devices and their information.
> > > - */
> > > -static int do_efi_show_devices(struct cmd_tbl *cmdtp, int flag,
> > > - int argc, char *const argv[])
> > > -{
> > > - efi_handle_t *handles;
> > > - efi_uintn_t num, i;
> > > - u16 *dev_path_text;
> > > - efi_status_t ret;
> > > -
> > > - ret = EFI_CALL(efi_locate_handle_buffer(ALL_HANDLES, NULL, NULL,
> > > - &num, &handles));
> > > - if (ret != EFI_SUCCESS)
> > > - return CMD_RET_FAILURE;
> > > -
> > > - if (!num)
> > > - return CMD_RET_SUCCESS;
> > > -
> > > - printf("Device%.*s Device Path\n", EFI_HANDLE_WIDTH - 6, spc);
> > > - printf("%.*s ====================\n", EFI_HANDLE_WIDTH, sep);
> > > - for (i = 0; i < num; i++) {
> > > - dev_path_text = efi_get_device_path_text(handles[i]);
> > > - if (dev_path_text) {
> > > - printf("%p %ls\n", handles[i], dev_path_text);
> > > - efi_free_pool(dev_path_text);
> > > - }
> > > - }
> > > -
> > > - efi_free_pool(handles);
> > > -
> > > - return CMD_RET_SUCCESS;
> > > -}
> > > -
> > > /**
> > > * efi_get_driver_handle_info() - get information of UEFI driver
> > > *
> > > @@ -535,26 +468,25 @@ static int do_efi_show_handles(struct cmd_tbl *cmdtp, int flag,
> > > if (!num)
> > > return CMD_RET_SUCCESS;
> > > - printf("Handle%.*s Protocols\n", EFI_HANDLE_WIDTH - 6, spc);
> > > - printf("%.*s ====================\n", EFI_HANDLE_WIDTH, sep);
> > > for (i = 0; i < num; i++) {
> > > - printf("%p", handles[i]);
> > > + struct efi_handler *handler;
> > > +
> > > + printf("\n%p", handles[i]);
> > > + if (handles[i]->dev)
> > > + printf(" (%s)", handles[i]->dev->name);
> > > + printf("\n");
> > > + /* Print device path */
> > > + ret = efi_search_protocol(handles[i], &efi_guid_device_path,
> > > + &handler);
> > > + if (ret == EFI_SUCCESS)
> > > + printf(" %pD\n", handler->protocol_interface);
> > > ret = EFI_CALL(BS->protocols_per_handle(handles[i], &guid,
> > > &count));
> > > - if (ret || !count) {
> > > - putc('\n');
> > > - continue;
> > > - }
> > > -
> > > + /* Print other protocols */
> > > for (j = 0; j < count; j++) {
> > > - if (j)
> > > - printf(", ");
> > > - else
> > > - putc(' ');
> > > -
> > > - printf("%pUs", guid[j]);
> > > + if (guidcmp(guid[j], &efi_guid_device_path))
> > > + printf(" %pUs\n", guid[j]);
> > > }
> > > - putc('\n');
> > > }
> > > efi_free_pool(handles);
> > > @@ -1539,8 +1471,6 @@ static struct cmd_tbl cmd_efidebug_sub[] = {
> > > U_BOOT_CMD_MKENT(capsule, CONFIG_SYS_MAXARGS, 1, do_efi_capsule,
> > > "", ""),
> > > #endif
> > > - U_BOOT_CMD_MKENT(devices, CONFIG_SYS_MAXARGS, 1, do_efi_show_devices,
> > > - "", ""),
> > > U_BOOT_CMD_MKENT(drivers, CONFIG_SYS_MAXARGS, 1, do_efi_show_drivers,
> > > "", ""),
> > > U_BOOT_CMD_MKENT(dh, CONFIG_SYS_MAXARGS, 1, do_efi_show_handles,
> > > @@ -1630,8 +1560,6 @@ static char efidebug_help_text[] =
> > > #endif
> > > "\n"
> > > #endif
> > > - "efidebug devices\n"
> > > - " - show UEFI devices\n"
> > > "efidebug drivers\n"
> > > " - show UEFI drivers\n"
> > > "efidebug dh\n"
> > > --
> > > 2.37.2
> > >
More information about the U-Boot
mailing list