[PATCH 1/1] efi_loader: correct shortening of device-paths

Mark Kettenis mark.kettenis at xs4all.nl
Sun Mar 26 12:45:20 CEST 2023


> From: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> Date: Sun, 26 Mar 2023 12:25:54 +0200
> 
> We use short device-paths in boot options so that a file on a block device
> can be found independent of the port into which the device is plugged.
> 
> Usb() device-path nodes only contain port and interface information and
> therefore cannot identify a block device.
> UsbWwi() device-path nodes contain the serial number of USB devices.
> 
> Signed-off-by: Heinrich Schuchardt <heinrich.schuchardt at canonical.com>
> ---
>  include/efi_api.h                |  1 +
>  lib/efi_loader/efi_device_path.c | 21 ++++++---------------
>  2 files changed, 7 insertions(+), 15 deletions(-)
> 
> diff --git a/include/efi_api.h b/include/efi_api.h
> index c4512eeb86..dc6e5ce236 100644
> --- a/include/efi_api.h
> +++ b/include/efi_api.h
> @@ -604,6 +604,7 @@ struct efi_device_path_acpi_path {
>  #  define DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR	0x0b
>  #  define DEVICE_PATH_SUB_TYPE_MSG_UART		0x0e
>  #  define DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS	0x0f
> +#  define DEVICE_PATH_SUB_TYPE_MSG_USB_WWI	0x10
>  #  define DEVICE_PATH_SUB_TYPE_MSG_SATA		0x12
>  #  define DEVICE_PATH_SUB_TYPE_MSG_NVME		0x17
>  #  define DEVICE_PATH_SUB_TYPE_MSG_URI		0x18
> diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
> index 288baa1ca7..9ed5e6273d 100644
> --- a/lib/efi_loader/efi_device_path.c
> +++ b/lib/efi_loader/efi_device_path.c
> @@ -92,17 +92,13 @@ int efi_dp_match(const struct efi_device_path *a,
>  /**
>   * efi_dp_shorten() - shorten device-path
>   *
> - * We can have device paths that start with a USB WWID or a USB Class node,
> - * and a few other cases which don't encode the full device path with bus
> - * hierarchy:
> + * When creating a short boot option we want to use a device-path that is
> + * independent of the location where the block device is plugged in.
>   *
> - * * MESSAGING:USB_WWID
> - * * MESSAGING:USB_CLASS
> - * * MEDIA:FILE_PATH
> - * * MEDIA:HARD_DRIVE
> - * * MESSAGING:URI
> + * UsbWwi() nodes contain a serial number, hard drive paths a partition
> + * UUID. Both should be unique.

This sentence makes no sense.  Do they contain a serial number, a hard
drive path *and* a partition UUID?  But then all *three* should be
unique.

>   *
> - * See UEFI spec (section 3.1.2, about short-form device-paths)
> + * See UEFI spec, section 3.1.2 for "short-form device path".
>   *
>   * @dp:		original device-path
>   * @Return:	shortened device-path or NULL
> @@ -110,12 +106,7 @@ int efi_dp_match(const struct efi_device_path *a,
>  struct efi_device_path *efi_dp_shorten(struct efi_device_path *dp)
>  {
>  	while (dp) {
> -		/*
> -		 * TODO: Add MESSAGING:USB_WWID and MESSAGING:URI..
> -		 * in practice fallback.efi just uses MEDIA:HARD_DRIVE
> -		 * so not sure when we would see these other cases.
> -		 */
> -		if (EFI_DP_TYPE(dp, MESSAGING_DEVICE, MSG_USB) ||
> +		if (EFI_DP_TYPE(dp, MESSAGING_DEVICE, MSG_USB_WWI) ||
>  		    EFI_DP_TYPE(dp, MEDIA_DEVICE, HARD_DRIVE_PATH) ||
>  		    EFI_DP_TYPE(dp, MEDIA_DEVICE, FILE_PATH))
>  			return dp;
> -- 
> 2.39.2
> 
> 


More information about the U-Boot mailing list