[efi] Split out dbg_efi_opener() as a standalone function

Allow external code to dump the information for an opened protocol
information entry via DBG_EFI_OPENER() et al.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
Michael Brown
2020-11-30 16:34:32 +00:00
parent 13a6d17296
commit be49380f55
2 changed files with 46 additions and 15 deletions

View File

@@ -242,9 +242,19 @@ efi_devpath_text ( EFI_DEVICE_PATH_PROTOCOL *path );
extern const __attribute__ (( pure )) char * extern const __attribute__ (( pure )) char *
efi_handle_name ( EFI_HANDLE handle ); efi_handle_name ( EFI_HANDLE handle );
extern void dbg_efi_opener ( EFI_HANDLE handle, EFI_GUID *protocol,
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *opener );
extern void dbg_efi_openers ( EFI_HANDLE handle, EFI_GUID *protocol ); extern void dbg_efi_openers ( EFI_HANDLE handle, EFI_GUID *protocol );
extern void dbg_efi_protocols ( EFI_HANDLE handle ); extern void dbg_efi_protocols ( EFI_HANDLE handle );
#define DBG_EFI_OPENER_IF( level, handle, protocol, \
opener ) do { \
if ( DBG_ ## level ) { \
dbg_efi_opener ( handle, protocol, \
opener ); \
} \
} while ( 0 )
#define DBG_EFI_OPENERS_IF( level, handle, protocol ) do { \ #define DBG_EFI_OPENERS_IF( level, handle, protocol ) do { \
if ( DBG_ ## level ) { \ if ( DBG_ ## level ) { \
dbg_efi_openers ( handle, protocol ); \ dbg_efi_openers ( handle, protocol ); \
@@ -257,6 +267,12 @@ extern void dbg_efi_protocols ( EFI_HANDLE handle );
} \ } \
} while ( 0 ) } while ( 0 )
#define DBGC_EFI_OPENER_IF( level, id, ... ) do { \
DBG_AC_IF ( level, id ); \
DBG_EFI_OPENER_IF ( level, __VA_ARGS__ ); \
DBG_DC_IF ( level ); \
} while ( 0 )
#define DBGC_EFI_OPENERS_IF( level, id, ... ) do { \ #define DBGC_EFI_OPENERS_IF( level, id, ... ) do { \
DBG_AC_IF ( level, id ); \ DBG_AC_IF ( level, id ); \
DBG_EFI_OPENERS_IF ( level, __VA_ARGS__ ); \ DBG_EFI_OPENERS_IF ( level, __VA_ARGS__ ); \
@@ -269,16 +285,22 @@ extern void dbg_efi_protocols ( EFI_HANDLE handle );
DBG_DC_IF ( level ); \ DBG_DC_IF ( level ); \
} while ( 0 ) } while ( 0 )
#define DBGC_EFI_OPENER( ... ) \
DBGC_EFI_OPENER_IF ( LOG, ##__VA_ARGS__ )
#define DBGC_EFI_OPENERS( ... ) \ #define DBGC_EFI_OPENERS( ... ) \
DBGC_EFI_OPENERS_IF ( LOG, ##__VA_ARGS__ ) DBGC_EFI_OPENERS_IF ( LOG, ##__VA_ARGS__ )
#define DBGC_EFI_PROTOCOLS( ... ) \ #define DBGC_EFI_PROTOCOLS( ... ) \
DBGC_EFI_PROTOCOLS_IF ( LOG, ##__VA_ARGS__ ) DBGC_EFI_PROTOCOLS_IF ( LOG, ##__VA_ARGS__ )
#define DBGC2_EFI_OPENER( ... ) \
DBGC_EFI_OPENER_IF ( EXTRA, ##__VA_ARGS__ )
#define DBGC2_EFI_OPENERS( ... ) \ #define DBGC2_EFI_OPENERS( ... ) \
DBGC_EFI_OPENERS_IF ( EXTRA, ##__VA_ARGS__ ) DBGC_EFI_OPENERS_IF ( EXTRA, ##__VA_ARGS__ )
#define DBGC2_EFI_PROTOCOLS( ... ) \ #define DBGC2_EFI_PROTOCOLS( ... ) \
DBGC_EFI_PROTOCOLS_IF ( EXTRA, ##__VA_ARGS__ ) DBGC_EFI_PROTOCOLS_IF ( EXTRA, ##__VA_ARGS__ )
#define DBGCP_EFI_OPENER( ... ) \
DBGC_EFI_OPENER_IF ( PROFILE, ##__VA_ARGS__ )
#define DBGCP_EFI_OPENERS( ... ) \ #define DBGCP_EFI_OPENERS( ... ) \
DBGC_EFI_OPENERS_IF ( PROFILE, ##__VA_ARGS__ ) DBGC_EFI_OPENERS_IF ( PROFILE, ##__VA_ARGS__ )
#define DBGCP_EFI_PROTOCOLS( ... ) \ #define DBGCP_EFI_PROTOCOLS( ... ) \

View File

@@ -262,6 +262,28 @@ efi_open_attributes_name ( unsigned int attributes ) {
return name; return name;
} }
/**
* Print opened protocol information
*
* @v handle EFI handle
* @V protocol Protocol GUID
* @v opener Opened protocol information
*/
void dbg_efi_opener ( EFI_HANDLE handle, EFI_GUID *protocol,
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *opener ) {
printf ( "HANDLE %s %s opened %dx (%s)", efi_handle_name ( handle ),
efi_guid_ntoa ( protocol ), opener->OpenCount,
efi_open_attributes_name ( opener->Attributes ) );
printf ( " by %s", efi_handle_name ( opener->AgentHandle ) );
if ( opener->ControllerHandle == handle ) {
printf ( "\n" );
} else {
printf ( " for %s\n",
efi_handle_name ( opener->ControllerHandle ) );
}
}
/** /**
* Print list of openers of a given protocol on a given handle * Print list of openers of a given protocol on a given handle
* *
@@ -271,7 +293,6 @@ efi_open_attributes_name ( unsigned int attributes ) {
void dbg_efi_openers ( EFI_HANDLE handle, EFI_GUID *protocol ) { void dbg_efi_openers ( EFI_HANDLE handle, EFI_GUID *protocol ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices; EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *openers; EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *openers;
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *opener;
UINTN count; UINTN count;
unsigned int i; unsigned int i;
EFI_STATUS efirc; EFI_STATUS efirc;
@@ -296,20 +317,8 @@ void dbg_efi_openers ( EFI_HANDLE handle, EFI_GUID *protocol ) {
} }
/* Dump list of openers */ /* Dump list of openers */
for ( i = 0 ; i < count ; i++ ) { for ( i = 0 ; i < count ; i++ )
opener = &openers[i]; dbg_efi_opener ( handle, protocol, &openers[i] );
printf ( "HANDLE %s %s opened %dx (%s)",
efi_handle_name ( handle ),
efi_guid_ntoa ( protocol ), opener->OpenCount,
efi_open_attributes_name ( opener->Attributes ) );
printf ( " by %s", efi_handle_name ( opener->AgentHandle ) );
if ( opener->ControllerHandle == handle ) {
printf ( "\n" );
} else {
printf ( " for %s\n",
efi_handle_name ( opener->ControllerHandle ) );
}
}
/* Free list */ /* Free list */
bs->FreePool ( openers ); bs->FreePool ( openers );