]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Print raw device path when we have no DevicePathToTextProtocol
authorMichael Brown <mcb30@ipxe.org>
Fri, 1 Aug 2014 09:51:15 +0000 (10:51 +0100)
committerMichael Brown <mcb30@ipxe.org>
Fri, 1 Aug 2014 09:51:38 +0000 (10:51 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_debug.c

index da8efb1ec7e504ba4e49ef9697289d1131f7c244..ea0a71de6a3386dfd3faf34a6754f279d878909c 100644 (file)
@@ -30,6 +30,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
 #include <string.h>
 #include <errno.h>
 #include <ipxe/uuid.h>
+#include <ipxe/base16.h>
 #include <ipxe/efi/efi.h>
 #include <ipxe/efi/efi_driver.h>
 #include <ipxe/efi/Protocol/BlockIo.h>
@@ -316,18 +317,31 @@ void dbg_efi_protocols ( EFI_HANDLE handle ) {
 const char * efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path ) {
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        static char text[256];
+       void *start;
+       void *end;
+       size_t max_len;
+       size_t len;
        CHAR16 *wtext;
 
        /* Sanity checks */
-       if ( ! efidpt ) {
-               DBG ( "[No DevicePathToText]" );
-               return NULL;
-       }
        if ( ! path ) {
                DBG ( "[NULL DevicePath]" );
                return NULL;
        }
 
+       /* If we have no DevicePathToText protocol then use a raw hex string */
+       if ( ! efidpt ) {
+               DBG ( "[No DevicePathToText]" );
+               start = path;
+               end = efi_devpath_end ( path );
+               len = ( end - start );
+               max_len = ( ( sizeof ( text ) - 1 /* NUL */ ) / 2 /* "xx" */ );
+               if ( len > max_len )
+                       len = max_len;
+               base16_encode ( start, len, text );
+               return text;
+       }
+
        /* Convert path to a textual representation */
        wtext = efidpt->ConvertDevicePathToText ( path, TRUE, FALSE );
        if ( ! wtext )