/** Dump SMM loaded image information. **/ VOID DumpSmmLoadedImage( VOID ) { SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct; CHAR8 *PdbString; CHAR8 *NameString; ImageStruct = (VOID *)mSmiHandlerProfileDatabase; while ((UINTN)ImageStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) { if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) { NameString = GetDriverNameString (ImageStruct); Print(L" <Image Name=\"%a\"", NameString); Print(L" Base=\"0x%lx\" Size=\"0x%lx\"", ImageStruct->ImageBase, ImageStruct->ImageSize); if (ImageStruct->EntryPoint != 0) { Print(L" EntryPoint=\"0x%lx\"", ImageStruct->EntryPoint); } Print(L" FvFile=\"%g\"", &ImageStruct->FileGuid); Print(L" RefId=\"0x%x\"", ImageStruct->ImageRef); Print(L">\n"); if (ImageStruct->PdbStringOffset != 0) { PdbString = (CHAR8 *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset); Print(L" <Pdb>%a</Pdb>\n", PdbString); } Print(L" </Image>\n"); } ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length); } return; }
/** Dump SMI handler in HandlerCategory. @param HandlerCategory SMI handler category **/ VOID DumpSmiHandler( IN UINT32 HandlerCategory ) { SMM_CORE_SMI_DATABASE_STRUCTURE *SmiStruct; SMM_CORE_SMI_HANDLER_STRUCTURE *SmiHandlerStruct; UINTN Index; SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct; CHAR8 *NameString; SmiStruct = (VOID *)mSmiHandlerProfileDatabase; while ((UINTN)SmiStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) { if ((SmiStruct->Header.Signature == SMM_CORE_SMI_DATABASE_SIGNATURE) && (SmiStruct->HandlerCategory == HandlerCategory)) { SmiHandlerStruct = (VOID *)(SmiStruct + 1); Print(L" <SmiEntry"); if (!IsZeroGuid (&SmiStruct->HandlerType)) { Print(L" HandlerType=\"%g\"", &SmiStruct->HandlerType); } Print(L">\n"); for (Index = 0; Index < SmiStruct->HandlerCount; Index++) { Print(L" <SmiHandler"); if (SmiHandlerStruct->ContextBufferSize != 0) { DumpSmiChildContext (&SmiStruct->HandlerType, (UINT8 *)SmiHandlerStruct + SmiHandlerStruct->ContextBufferOffset, SmiHandlerStruct->ContextBufferSize); } Print(L">\n"); ImageStruct = GetImageFromRef((UINTN)SmiHandlerStruct->ImageRef); NameString = GetDriverNameString (ImageStruct); Print(L" <Module RefId=\"0x%x\" Name=\"%a\">\n", SmiHandlerStruct->ImageRef, NameString); if ((ImageStruct != NULL) && (ImageStruct->PdbStringOffset != 0)) { Print(L" <Pdb>%a</Pdb>\n", (UINT8 *)ImageStruct + ImageStruct->PdbStringOffset); } Print(L" </Module>\n"); Print(L" <Handler Address=\"0x%lx\">\n", SmiHandlerStruct->Handler); if (ImageStruct != NULL) { Print(L" <RVA>0x%x</RVA>\n", (UINTN) (SmiHandlerStruct->Handler - ImageStruct->ImageBase)); } Print(L" </Handler>\n", SmiHandlerStruct->Handler); Print(L" <Caller Address=\"0x%lx\">\n", SmiHandlerStruct->CallerAddr); if (ImageStruct != NULL) { Print(L" <RVA>0x%x</RVA>\n", (UINTN) (SmiHandlerStruct->CallerAddr - ImageStruct->ImageBase)); } Print(L" </Caller>\n", SmiHandlerStruct->Handler); SmiHandlerStruct = (VOID *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length); Print(L" </SmiHandler>\n"); } Print(L" </SmiEntry>\n"); } SmiStruct = (VOID *)((UINTN)SmiStruct + SmiStruct->Header.Length); } return; }
/** Dump memory profile driver information. @param[in] DriverIndex Memory profile driver info index. @param[in] DriverInfo Pointer to memory profile driver info. @return Pointer to next memory profile driver info. **/ MEMORY_PROFILE_DRIVER_INFO * DumpMemoryProfileDriverInfo ( IN UINTN DriverIndex, IN MEMORY_PROFILE_DRIVER_INFO *DriverInfo ) { UINTN TypeIndex; MEMORY_PROFILE_ALLOC_INFO *AllocInfo; UINTN AllocIndex; if (DriverInfo->Header.Signature != MEMORY_PROFILE_DRIVER_INFO_SIGNATURE) { return NULL; } Print (L" MEMORY_PROFILE_DRIVER_INFO (0x%x)\n", DriverIndex); Print (L" Signature - 0x%08x\n", DriverInfo->Header.Signature); Print (L" Length - 0x%04x\n", DriverInfo->Header.Length); Print (L" Revision - 0x%04x\n", DriverInfo->Header.Revision); GetDriverNameString (DriverInfo); Print (L" FileName - %s\n", &mNameString); Print (L" ImageBase - 0x%016lx\n", DriverInfo->ImageBase); Print (L" ImageSize - 0x%016lx\n", DriverInfo->ImageSize); Print (L" EntryPoint - 0x%016lx\n", DriverInfo->EntryPoint); Print (L" ImageSubsystem - 0x%04x (%s)\n", DriverInfo->ImageSubsystem, mSubsystemString[(DriverInfo->ImageSubsystem < sizeof(mSubsystemString)/sizeof(mSubsystemString[0])) ? DriverInfo->ImageSubsystem : 0]); Print (L" FileType - 0x%02x (%s)\n", DriverInfo->FileType, mFileTypeString[(DriverInfo->FileType < sizeof(mFileTypeString)/sizeof(mFileTypeString[0])) ? DriverInfo->FileType : 0]); Print (L" CurrentUsage - 0x%016lx\n", DriverInfo->CurrentUsage); Print (L" PeakUsage - 0x%016lx\n", DriverInfo->PeakUsage); for (TypeIndex = 0; TypeIndex < sizeof (DriverInfo->CurrentUsageByType) / sizeof (DriverInfo->CurrentUsageByType[0]); TypeIndex++) { if ((DriverInfo->CurrentUsageByType[TypeIndex] != 0) || (DriverInfo->PeakUsageByType[TypeIndex] != 0)) { Print (L" CurrentUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, DriverInfo->CurrentUsageByType[TypeIndex], mMemoryTypeString[TypeIndex]); Print (L" PeakUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, DriverInfo->PeakUsageByType[TypeIndex], mMemoryTypeString[TypeIndex]); } } Print (L" AllocRecordCount - 0x%08x\n", DriverInfo->AllocRecordCount); AllocInfo = (MEMORY_PROFILE_ALLOC_INFO *) ((UINTN) DriverInfo + DriverInfo->Header.Length); for (AllocIndex = 0; AllocIndex < DriverInfo->AllocRecordCount; AllocIndex++) { AllocInfo = DumpMemoryProfileAllocInfo (DriverInfo, AllocIndex, AllocInfo); if (AllocInfo == NULL) { return NULL; } } return (MEMORY_PROFILE_DRIVER_INFO *) AllocInfo; }