Introduce efi_devpath_same_disk

This is like efi_devpath_match, but allows differing device media
paths. Those just specify the partition information.

Differential Revision: https://reviews.freebsd.org/D20513
This commit is contained in:
imp 2019-06-04 18:36:07 +00:00
parent bec7330290
commit 6f3c45cf47
2 changed files with 27 additions and 2 deletions

View File

@ -90,6 +90,7 @@ bool efi_devpath_match_node(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
bool efi_devpath_is_prefix(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
CHAR16 *efi_devpath_name(EFI_DEVICE_PATH *);
void efi_free_devpath_name(CHAR16 *);
bool efi_devpath_same_disk(EFI_DEVICE_PATH *, EFI_DEVICE_PATH *);
EFI_DEVICE_PATH *efi_devpath_to_media_path(EFI_DEVICE_PATH *);
UINTN efi_devpath_length(EFI_DEVICE_PATH *);
EFI_DEVICE_PATH *efi_name_to_devpath(const char *path);

View File

@ -197,14 +197,19 @@ efi_devpath_match_node(EFI_DEVICE_PATH *devpath1, EFI_DEVICE_PATH *devpath2)
return (true);
}
bool
efi_devpath_match(EFI_DEVICE_PATH *devpath1, EFI_DEVICE_PATH *devpath2)
static bool
_efi_devpath_match(EFI_DEVICE_PATH *devpath1, EFI_DEVICE_PATH *devpath2,
bool ignore_media)
{
if (devpath1 == NULL || devpath2 == NULL)
return (false);
while (true) {
if (ignore_media &&
IsDevicePathType(devpath1, MEDIA_DEVICE_PATH) &&
IsDevicePathType(devpath2, MEDIA_DEVICE_PATH))
return (true);
if (!efi_devpath_match_node(devpath1, devpath2))
return false;
if (IsDevicePathEnd(devpath1))
@ -214,6 +219,25 @@ efi_devpath_match(EFI_DEVICE_PATH *devpath1, EFI_DEVICE_PATH *devpath2)
}
return (true);
}
/*
* Are two devpaths identical?
*/
bool
efi_devpath_match(EFI_DEVICE_PATH *devpath1, EFI_DEVICE_PATH *devpath2)
{
return _efi_devpath_match(devpath1, devpath2, false);
}
/*
* Like efi_devpath_match, but stops at when we hit the media device
* path node that specifies the partition information. If we match
* up to that point, then we're on the same disk.
*/
bool
efi_devpath_same_disk(EFI_DEVICE_PATH *devpath1, EFI_DEVICE_PATH *devpath2)
{
return _efi_devpath_match(devpath1, devpath2, true);
}
bool
efi_devpath_is_prefix(EFI_DEVICE_PATH *prefix, EFI_DEVICE_PATH *path)