From 89c8c7d4eb14754f2a513d025aa0309b566c6f59 Mon Sep 17 00:00:00 2001 From: Michael Brown Date: Thu, 31 Jul 2014 23:44:43 +0100 Subject: [efi] Improve debugging of the debugging facilities Signed-off-by: Michael Brown --- src/interface/efi/efi_debug.c | 58 ++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/interface/efi/efi_debug.c b/src/interface/efi/efi_debug.c index 1c865f82..e5ecfe37 100644 --- a/src/interface/efi/efi_debug.c +++ b/src/interface/efi/efi_debug.c @@ -356,41 +356,50 @@ efi_pecoff_debug_name ( EFI_LOADED_IMAGE_PROTOCOL *loaded ) { EFI_IMAGE_OPTIONAL_HEADER64 *opt64; EFI_IMAGE_DATA_DIRECTORY *datadir; EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *debug; - EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *codeview; + EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *codeview_nb10; + EFI_IMAGE_DEBUG_CODEVIEW_RSDS_ENTRY *codeview_rsds; + EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY *codeview_mtoc; + uint16_t dos_magic; + uint32_t pe_magic; + uint16_t opt_magic; + uint32_t codeview_magic; size_t max_len; char *name; char *tmp; /* Parse DOS header */ if ( ! dos ) { - DBGC ( loaded, "Missing DOS header\n" ); + DBG ( "[Missing DOS header]" ); return NULL; } - if ( dos->e_magic != EFI_IMAGE_DOS_SIGNATURE ) { - DBGC ( loaded, "Bad DOS signature\n" ); + dos_magic = dos->e_magic; + if ( dos_magic != EFI_IMAGE_DOS_SIGNATURE ) { + DBG ( "[Bad DOS signature %#04x]", dos_magic ); return NULL; } pe = ( loaded->ImageBase + dos->e_lfanew ); /* Parse PE header */ - if ( pe->Pe32.Signature != EFI_IMAGE_NT_SIGNATURE ) { - DBGC ( loaded, "Bad PE signature\n" ); + pe_magic = pe->Pe32.Signature; + if ( pe_magic != EFI_IMAGE_NT_SIGNATURE ) { + DBG ( "[Bad PE signature %#08x]", pe_magic ); return NULL; } opt32 = &pe->Pe32.OptionalHeader; opt64 = &pe->Pe32Plus.OptionalHeader; - if ( opt32->Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC ) { + opt_magic = opt32->Magic; + if ( opt_magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC ) { datadir = opt32->DataDirectory; - } else if ( opt64->Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC ) { + } else if ( opt_magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC ) { datadir = opt64->DataDirectory; } else { - DBGC ( loaded, "Bad optional header signature\n" ); + DBG ( "[Bad optional header signature %#04x]", opt_magic ); return NULL; } /* Parse data directory entry */ if ( ! datadir[EFI_IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress ) { - DBGC ( loaded, "Empty debug directory entry\n" ); + DBG ( "[Empty debug directory entry]" ); return NULL; } debug = ( loaded->ImageBase + @@ -398,22 +407,31 @@ efi_pecoff_debug_name ( EFI_LOADED_IMAGE_PROTOCOL *loaded ) { /* Parse debug directory entry */ if ( debug->Type != EFI_IMAGE_DEBUG_TYPE_CODEVIEW ) { - DBGC ( loaded, "Not a CodeView debug directory entry\n" ); + DBG ( "[Not a CodeView debug directory entry (type %d)]", + debug->Type ); return NULL; } - codeview = ( loaded->ImageBase + debug->RVA ); + codeview_nb10 = ( loaded->ImageBase + debug->RVA ); + codeview_rsds = ( loaded->ImageBase + debug->RVA ); + codeview_mtoc = ( loaded->ImageBase + debug->RVA ); + codeview_magic = codeview_nb10->Signature; /* Parse CodeView entry */ - if ( codeview->Signature != CODEVIEW_SIGNATURE_NB10 ) { - DBGC ( loaded, "Bad CodeView signature\n" ); + if ( codeview_magic == CODEVIEW_SIGNATURE_NB10 ) { + name = ( ( void * ) ( codeview_nb10 + 1 ) ); + } else if ( codeview_magic == CODEVIEW_SIGNATURE_RSDS ) { + name = ( ( void * ) ( codeview_rsds + 1 ) ); + } else if ( codeview_magic == CODEVIEW_SIGNATURE_MTOC ) { + name = ( ( void * ) ( codeview_mtoc + 1 ) ); + } else { + DBG ( "[Bad CodeView signature %#08x]", codeview_magic ); return NULL; } - name = ( ( ( void * ) codeview ) + sizeof ( *codeview ) ); /* Sanity check - avoid scanning endlessly through memory */ max_len = EFI_PAGE_SIZE; /* Reasonably sane */ if ( strnlen ( name, max_len ) == max_len ) { - DBGC ( loaded, "Excessively long or invalid CodeView name\n" ); + DBG ( "[Excessively long or invalid CodeView name]" ); return NULL; } @@ -528,20 +546,26 @@ const char * efi_handle_name ( EFI_HANDLE handle ) { for ( i = 0 ; i < ( sizeof ( efi_handle_name_types ) / sizeof ( efi_handle_name_types[0] ) ) ; i++ ) { type = &efi_handle_name_types[i]; + DBG2 ( "<%d", i ); /* Try to open the applicable protocol */ efirc = bs->OpenProtocol ( handle, type->protocol, &interface, efi_image_handle, handle, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); - if ( efirc != 0 ) + if ( efirc != 0 ) { + DBG2 ( ">" ); continue; + } /* Try to get name from this protocol */ + DBG2 ( "-" ); name = type->name ( interface ); + DBG2 ( "%c", ( name ? ( name[0] ? 'Y' : 'E' ) : 'N' ) ); /* Close protocol */ bs->CloseProtocol ( handle, type->protocol, efi_image_handle, handle ); + DBG2 ( ">" ); /* Use this name, if possible */ if ( name && name[0] ) -- cgit v1.2.3-55-g7522