]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Add efi_path_prev() utility function
authorMichael Brown <mcb30@ipxe.org>
Mon, 23 Jan 2023 19:12:49 +0000 (19:12 +0000)
committerMichael Brown <mcb30@ipxe.org>
Mon, 23 Jan 2023 19:27:13 +0000 (19:27 +0000)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/include/ipxe/efi/efi_path.h
src/interface/efi/efi_path.c

index 98b922ac1bb7d5bd7b488e430f429828503f8d02..e75ae42c4840119cdfe990bb510f1441a91b7960 100644 (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 );
index 50027b75a681bc01c08960b5ea9170f47ef7d4bb..b28ecddbb417f1e366c17548aac2cb230a7c6fdc 100644 (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 );
 }
 
 /**