efi_loader: correct shortening of device-paths

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@canonical.com>
This commit is contained in:
Heinrich Schuchardt 2023-03-26 12:22:40 +02:00
parent ffc1cfb8f4
commit a9203b0fef
2 changed files with 7 additions and 15 deletions

View file

@ -124,17 +124,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.
*
* 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
@ -142,12 +138,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;