[efi] Add efi_path_prev() utility function

Signed-off-by: Michael Brown <mcb30@ipxe.org>
pull/858/head
Michael Brown 2023-01-23 19:12:49 +00:00
parent 204d39222a
commit 1cd0a248cc
2 changed files with 23 additions and 7 deletions

View File

@ -37,6 +37,9 @@ static inline void efi_path_terminate ( EFI_DEVICE_PATH_PROTOCOL *end ) {
extern EFI_DEVICE_PATH_PROTOCOL *
efi_path_next ( EFI_DEVICE_PATH_PROTOCOL *path );
extern EFI_DEVICE_PATH_PROTOCOL *
efi_path_prev ( EFI_DEVICE_PATH_PROTOCOL *path,
EFI_DEVICE_PATH_PROTOCOL *curr );
extern EFI_DEVICE_PATH_PROTOCOL *
efi_path_end ( EFI_DEVICE_PATH_PROTOCOL *path );
extern size_t efi_path_len ( EFI_DEVICE_PATH_PROTOCOL *path );
extern unsigned int efi_path_vlan ( EFI_DEVICE_PATH_PROTOCOL *path );

View File

@ -65,6 +65,25 @@ EFI_DEVICE_PATH_PROTOCOL * efi_path_next ( EFI_DEVICE_PATH_PROTOCOL *path ) {
return path;
}
/**
* Find previous element of device path
*
* @v path Device path, or NULL for no path
* @v curr Current element in device path, or NULL for end of path
* @ret prev Previous element in device path, or NULL
*/
EFI_DEVICE_PATH_PROTOCOL * efi_path_prev ( EFI_DEVICE_PATH_PROTOCOL *path,
EFI_DEVICE_PATH_PROTOCOL *curr ) {
EFI_DEVICE_PATH_PROTOCOL *tmp;
/* Find immediately preceding element */
while ( ( tmp = efi_path_next ( path ) ) != curr ) {
path = tmp;
}
return path;
}
/**
* Find end of device path
*
@ -72,14 +91,8 @@ EFI_DEVICE_PATH_PROTOCOL * efi_path_next ( EFI_DEVICE_PATH_PROTOCOL *path ) {
* @ret path_end End of device path, or NULL
*/
EFI_DEVICE_PATH_PROTOCOL * efi_path_end ( EFI_DEVICE_PATH_PROTOCOL *path ) {
EFI_DEVICE_PATH_PROTOCOL *next;
/* Find end of device path */
while ( ( next = efi_path_next ( path ) ) != NULL ) {
path = next;
}
return path;
return efi_path_prev ( path, NULL );
}
/**