[efi] Add efi_path_prev() utility function

Signed-off-by: Michael Brown <mcb30@ipxe.org>
diff --git a/src/include/ipxe/efi/efi_path.h b/src/include/ipxe/efi/efi_path.h
index 98b922a..e75ae42 100644
--- a/src/include/ipxe/efi/efi_path.h
+++ b/src/include/ipxe/efi/efi_path.h
@@ -37,6 +37,9 @@
 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 );
diff --git a/src/interface/efi/efi_path.c b/src/interface/efi/efi_path.c
index 50027b7..b28ecdd 100644
--- a/src/interface/efi/efi_path.c
+++ b/src/interface/efi/efi_path.c
@@ -66,20 +66,33 @@
 }
 
 /**
+ * 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
  *
  * @v path		Device path, or NULL
  * @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 );
 }
 
 /**