Index: PrintLibInternal.c
===================================================================
--- PrintLibInternal.c	(revision 14602)
+++ PrintLibInternal.c	(working copy)
@@ -13,6 +13,9 @@
 **/
 
 #include "PrintLibInternal.h"
+#include <Uefi.h>
+#include <Library/DevicePathLib.h>
+#include <Library/MemoryAllocationLib.h>
 
 #define WARNING_STATUS_NUMBER         5
 #define ERROR_STATUS_NUMBER           33
@@ -345,6 +348,8 @@
   UINT16            GuidData2;
   UINT16            GuidData3;
   UINTN             LengthToReturn;
+  EFI_DEVICE_PATH_PROTOCOL *TmpDevPath;
+  CHAR8             *AllocatedString=NULL;
 
   //
   // If you change this code be sure to match the 2 versions of this function.
@@ -697,6 +702,28 @@
         }
         break;
 
+      case 'v':
+        if (BaseListMarker == NULL) {
+          TmpDevPath = VA_ARG (VaListMarker, EFI_DEVICE_PATH_PROTOCOL *);
+        } else {
+          TmpDevPath = BASE_ARG (BaseListMarker, EFI_DEVICE_PATH_PROTOCOL *);
+        }
+        if (TmpDevPath == NULL) {
+          ArgumentString = "<null devpath>";
+        } else if (!IsDevicePathValid(TmpDevPath, 0)) {
+          ArgumentString = "<invalid devpath>";
+        } else {
+          AllocatedString = (CHAR8*) ConvertDevicePathToText (TmpDevPath, TRUE, TRUE);
+          if (AllocatedString == NULL) {
+            ArgumentString = "<failed>";
+          }
+          else {
+            ArgumentString=AllocatedString;
+            Flags |= ARGUMENT_UNICODE;
+          }
+        }
+        break;
+
       case 't':
         if (BaseListMarker == NULL) {
           TmpTime = VA_ARG (VaListMarker, TIME *); 
@@ -939,12 +966,21 @@
     // Get the next character from the format string
     //
     FormatCharacter = ((*Format & 0xff) | (*(Format + 1) << 8)) & FormatMask;
+
+    //
+    // Clean up
+    //
+    if (AllocatedString) {
+      FreePool(AllocatedString);
+      AllocatedString = NULL;
+    }
   }
 
   if ((Flags & COUNT_ONLY_NO_PRINT) != 0) {
     return (LengthToReturn / BytesPerOutputCharacter);
   }
 
+  ASSERT (AllocatedString == NULL);
   ASSERT (Buffer != NULL);
   //
   // Null terminate the Unicode or ASCII string
