From 1cd0a248cc54a8b2fadc0d2c287d2f3528b749b4 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Mon, 23 Jan 2023 19:12:49 +0000 Subject: [efi] Add efi_path_prev() utility function Signed-off-by: Michael Brown --- src/interface/efi/efi_path.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'src/interface') diff --git a/src/interface/efi/efi_path.c b/src/interface/efi/efi_path.c index 50027b75a..b28ecddbb 100644 --- a/src/interface/efi/efi_path.c +++ b/src/interface/efi/efi_path.c @@ -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 ); } /** -- cgit v1.2.3-55-g7522