mirror of https://github.com/ipxe/ipxe.git
[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 <mcb30@ipxe.org>pull/1193/merge
parent
1a602c92ac
commit
7cda3dbf94
|
@ -38,6 +38,7 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
|||
#include <ipxe/efi/efi_path.h>
|
||||
#include <ipxe/efi/Protocol/ComponentName.h>
|
||||
#include <ipxe/efi/Protocol/ComponentName2.h>
|
||||
#include <ipxe/efi/Protocol/DriverBinding.h>
|
||||
#include <ipxe/efi/Protocol/DevicePathToText.h>
|
||||
#include <ipxe/efi/IndustryStandard/PeImage.h>
|
||||
|
||||
|
@ -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 ),
|
||||
|
|
Loading…
Reference in New Issue