From 7cda3dbf94936f265ab017841d0236bb62f51efa Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 20 Mar 2025 14:18:02 +0000 Subject: [PATCH] [efi] Attempt to retrieve driver name from image handle for debug messages Not all drivers will install the driver binding protocol on the image handle. Accommodate these drivers by attempting to retrieve the driver name via the component name protocol(s) located on the driver binding's ImageHandle, as well as on the driver handle itself. Signed-off-by: Michael Brown --- src/interface/efi/efi_debug.c | 91 +++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/src/interface/efi/efi_debug.c b/src/interface/efi/efi_debug.c index 030c6a93e..1b778805e 100644 --- a/src/interface/efi/efi_debug.c +++ b/src/interface/efi/efi_debug.c @@ -38,6 +38,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL ); #include #include #include +#include #include #include @@ -320,6 +321,90 @@ static const char * efi_driver_name2 ( EFI_COMPONENT_NAME2_PROTOCOL *wtf ) { return name; } +/** + * Get driver binding name + * + * @v binding Driver binding protocol + * @ret name Driver name, or NULL + */ +static const char * efi_binding_name ( EFI_DRIVER_BINDING_PROTOCOL *binding ) { + EFI_BOOT_SERVICES *bs = efi_systab->BootServices; + union { + EFI_COMPONENT_NAME_PROTOCOL *name; + void *interface; + } u; + EFI_HANDLE image; + const char *name; + EFI_STATUS efirc; + + /* Sanity check */ + if ( ! binding ) { + DBG ( "[NULL DriverBinding]" ); + return NULL; + } + + /* Try to open component name protocol on image handle */ + image = binding->ImageHandle; + if ( ( efirc = bs->OpenProtocol ( image, + &efi_component_name_protocol_guid, + &u.interface, efi_image_handle, image, + EFI_OPEN_PROTOCOL_GET_PROTOCOL)) !=0){ + DBG ( "[DriverBinding no ComponentName]" ); + return NULL; + } + + /* Try to get name from component name protocol */ + name = efi_driver_name ( u.name ); + + /* Close component name protocol */ + bs->CloseProtocol ( image, &efi_component_name_protocol_guid, + efi_image_handle, image ); + + return name; +} + +/** + * Get driver binding name + * + * @v binding Driver binding protocol + * @ret name Driver name, or NULL + */ +static const char * efi_binding_name2 ( EFI_DRIVER_BINDING_PROTOCOL *binding ){ + EFI_BOOT_SERVICES *bs = efi_systab->BootServices; + EFI_HANDLE image; + union { + EFI_COMPONENT_NAME2_PROTOCOL *name2; + void *interface; + } u; + const char *name; + EFI_STATUS efirc; + + /* Sanity check */ + if ( ! binding ) { + DBG ( "[NULL DriverBinding]" ); + return NULL; + } + + /* Try to open component name protocol on image handle */ + image = binding->ImageHandle; + if ( ( efirc = bs->OpenProtocol ( image, + &efi_component_name2_protocol_guid, + &u.interface, efi_image_handle, image, + EFI_OPEN_PROTOCOL_GET_PROTOCOL)) !=0){ + DBG ( "[DriverBinding no ComponentName2]" ); + return NULL; + } + + /* Try to get name from component name protocol */ + name = efi_driver_name2 ( u.name2 ); + + /* Close component name protocol */ + bs->CloseProtocol ( image, &efi_component_name2_protocol_guid, + efi_image_handle, image ); + + return name; +} + /** * Get PE/COFF debug filename * @@ -547,6 +632,12 @@ static struct efi_handle_name_type efi_handle_name_types[] = { /* Driver name (via obsolete original ComponentName protocol) */ EFI_HANDLE_NAME_TYPE ( &efi_component_name_protocol_guid, efi_driver_name ), + /* Driver name (for driver binding handles) */ + EFI_HANDLE_NAME_TYPE ( &efi_driver_binding_protocol_guid, + efi_binding_name2 ), + /* Driver name (via obsolete original ComponentName protocol) */ + EFI_HANDLE_NAME_TYPE ( &efi_driver_binding_protocol_guid, + efi_binding_name ), /* PE/COFF debug filename (for image handles) */ EFI_HANDLE_NAME_TYPE ( &efi_loaded_image_protocol_guid, efi_pecoff_debug_name ),