]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[efi] Include installed protocol list in unknown handle names
authorMichael Brown <mcb30@ipxe.org>
Thu, 27 Aug 2015 14:37:46 +0000 (15:37 +0100)
committerMichael Brown <mcb30@ipxe.org>
Thu, 27 Aug 2015 14:40:44 +0000 (15:40 +0100)
Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/interface/efi/efi_debug.c

index b48a2c6fd1039c4315f20a927faa574b2279de1d..ed8818137ed4e65310f7e6b7cbcf59ffd164efe3 100644 (file)
@@ -35,6 +35,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 #include <errno.h>
 #include <ipxe/uuid.h>
 #include <ipxe/base16.h>
+#include <ipxe/vsprintf.h>
 #include <ipxe/efi/efi.h>
 #include <ipxe/efi/efi_utils.h>
 #include <ipxe/efi/Protocol/ComponentName.h>
@@ -632,7 +633,10 @@ static struct efi_handle_name_type efi_handle_name_types[] = {
 const __attribute__ (( pure )) char * efi_handle_name ( EFI_HANDLE handle ) {
        EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
        struct efi_handle_name_type *type;
-       static char buf[32];
+       static char buf[256];
+       size_t used = 0;
+       EFI_GUID **protocols;
+       UINTN count;
        unsigned int i;
        void *interface;
        const char *name;
@@ -672,7 +676,19 @@ const __attribute__ (( pure )) char * efi_handle_name ( EFI_HANDLE handle ) {
                        return name;
        }
 
-       /* Use raw handle value if no name found */
-       snprintf ( buf, sizeof ( buf ), "UNKNOWN<%p>", handle );
+       /* If no name is found, then use the raw handle value and a
+        * list of installed protocols.
+        */
+       used = ssnprintf ( buf, sizeof ( buf ), "UNKNOWN<%p", handle );
+       if ( ( efirc = bs->ProtocolsPerHandle ( handle, &protocols,
+                                               &count ) ) == 0 ) {
+               for ( i = 0 ; i < count ; i++ ) {
+                       used += ssnprintf ( ( buf + used ),
+                                           ( sizeof ( buf ) - used ), ",%s",
+                                           efi_guid_ntoa ( protocols[i] ) );
+               }
+               bs->FreePool ( protocols );
+       }
+       used += ssnprintf ( ( buf + used ), ( sizeof ( buf ) - used ), ">" );
        return buf;
 }