summaryrefslogtreecommitdiff
path: root/MdeModulePkg/Application/SmiHandlerProfileInfo
diff options
context:
space:
mode:
authorkx <kx@radix.pro>2024-06-04 06:43:08 +0300
committerkx <kx@radix.pro>2024-06-04 06:43:08 +0300
commit7e2ccccace24636f29ddc210b94606abd4c7e42b (patch)
tree545d43ea12671048956cafeb12303e84d601e571 /MdeModulePkg/Application/SmiHandlerProfileInfo
parent27b044605cd5f6b33a3d231576003850b3fe305b (diff)
downloadedk2-trunk.tar.xz
Renormalized end-of-lines from master@27b044605cd5f6b33a3d231576003850b3fe305btrunk
Diffstat (limited to 'MdeModulePkg/Application/SmiHandlerProfileInfo')
-rw-r--r--MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c1410
-rw-r--r--MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.inf116
-rw-r--r--MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.uni34
-rw-r--r--MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfoExtra.uni28
4 files changed, 794 insertions, 794 deletions
diff --git a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c
index 69baf1c51d..3b6936644c 100644
--- a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c
+++ b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.c
@@ -1,705 +1,705 @@
-/** @file
- Shell application to dump SMI handler profile information.
-
-Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <PiDxe.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PrintLib.h>
-#include <Library/UefiLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/DxeServicesLib.h>
-#include <Protocol/SmmCommunication.h>
-#include <Guid/PiSmmCommunicationRegionTable.h>
-
-#include <Guid/SmiHandlerProfile.h>
-
-#define PROFILE_NAME_STRING_LENGTH 64
-CHAR8 mNameString[PROFILE_NAME_STRING_LENGTH + 1];
-
-VOID *mSmiHandlerProfileDatabase;
-UINTN mSmiHandlerProfileDatabaseSize;
-
-/**
- This function dump raw data.
-
- @param Data raw data
- @param Size raw data size
-**/
-VOID
-InternalDumpData (
- IN UINT8 *Data,
- IN UINTN Size
- )
-{
- UINTN Index;
-
- for (Index = 0; Index < Size; Index++) {
- Print (L"%02x", (UINTN)Data[Index]);
- if ((Index + 1) != Size) {
- Print (L" ");
- }
- }
-}
-
-/**
- Get SMI handler profile database.
-**/
-VOID
-GetSmiHandlerProfileDatabase (
- VOID
- )
-{
- EFI_STATUS Status;
- UINTN CommSize;
- UINT8 *CommBuffer;
- EFI_SMM_COMMUNICATE_HEADER *CommHeader;
- SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *CommGetInfo;
- SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *CommGetData;
- EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;
- UINTN MinimalSizeNeeded;
- EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
- UINT32 Index;
- EFI_MEMORY_DESCRIPTOR *Entry;
- VOID *Buffer;
- UINTN Size;
- UINTN Offset;
-
- Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **)&SmmCommunication);
- if (EFI_ERROR (Status)) {
- Print (L"SmiHandlerProfile: Locate SmmCommunication protocol - %r\n", Status);
- return;
- }
-
- MinimalSizeNeeded = EFI_PAGE_SIZE;
-
- Status = EfiGetSystemConfigurationTable (
- &gEdkiiPiSmmCommunicationRegionTableGuid,
- (VOID **)&PiSmmCommunicationRegionTable
- );
- if (EFI_ERROR (Status)) {
- Print (L"SmiHandlerProfile: Get PiSmmCommunicationRegionTable - %r\n", Status);
- return;
- }
-
- ASSERT (PiSmmCommunicationRegionTable != NULL);
- Entry = (EFI_MEMORY_DESCRIPTOR *)(PiSmmCommunicationRegionTable + 1);
- Size = 0;
- for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {
- if (Entry->Type == EfiConventionalMemory) {
- Size = EFI_PAGES_TO_SIZE ((UINTN)Entry->NumberOfPages);
- if (Size >= MinimalSizeNeeded) {
- break;
- }
- }
-
- Entry = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Entry + PiSmmCommunicationRegionTable->DescriptorSize);
- }
-
- ASSERT (Index < PiSmmCommunicationRegionTable->NumberOfEntries);
- CommBuffer = (UINT8 *)(UINTN)Entry->PhysicalStart;
-
- //
- // Get Size
- //
- CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
- CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
- CommHeader->MessageLength = sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO);
-
- CommGetInfo = (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];
- CommGetInfo->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_INFO;
- CommGetInfo->Header.DataLength = sizeof (*CommGetInfo);
- CommGetInfo->Header.ReturnStatus = (UINT64)-1;
- CommGetInfo->DataSize = 0;
-
- CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
- Status = SmmCommunication->Communicate (SmmCommunication, CommBuffer, &CommSize);
- if (EFI_ERROR (Status)) {
- Print (L"SmiHandlerProfile: SmmCommunication - %r\n", Status);
- return;
- }
-
- if (CommGetInfo->Header.ReturnStatus != 0) {
- Print (L"SmiHandlerProfile: GetInfo - 0x%0x\n", CommGetInfo->Header.ReturnStatus);
- return;
- }
-
- mSmiHandlerProfileDatabaseSize = (UINTN)CommGetInfo->DataSize;
-
- //
- // Get Data
- //
- mSmiHandlerProfileDatabase = AllocateZeroPool (mSmiHandlerProfileDatabaseSize);
- if (mSmiHandlerProfileDatabase == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- Print (L"SmiHandlerProfile: AllocateZeroPool (0x%x) for dump buffer - %r\n", mSmiHandlerProfileDatabaseSize, Status);
- return;
- }
-
- CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
- CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
- CommHeader->MessageLength = sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET);
-
- CommGetData = (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];
- CommGetData->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_DATA_BY_OFFSET;
- CommGetData->Header.DataLength = sizeof (*CommGetData);
- CommGetData->Header.ReturnStatus = (UINT64)-1;
-
- CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
- Buffer = (UINT8 *)CommHeader + CommSize;
- Size -= CommSize;
-
- CommGetData->DataBuffer = (PHYSICAL_ADDRESS)(UINTN)Buffer;
- CommGetData->DataOffset = 0;
- while (CommGetData->DataOffset < mSmiHandlerProfileDatabaseSize) {
- Offset = (UINTN)CommGetData->DataOffset;
- if (Size <= (mSmiHandlerProfileDatabaseSize - CommGetData->DataOffset)) {
- CommGetData->DataSize = (UINT64)Size;
- } else {
- CommGetData->DataSize = (UINT64)(mSmiHandlerProfileDatabaseSize - CommGetData->DataOffset);
- }
-
- Status = SmmCommunication->Communicate (SmmCommunication, CommBuffer, &CommSize);
- ASSERT_EFI_ERROR (Status);
-
- if (CommGetData->Header.ReturnStatus != 0) {
- FreePool (mSmiHandlerProfileDatabase);
- mSmiHandlerProfileDatabase = NULL;
- Print (L"SmiHandlerProfile: GetData - 0x%x\n", CommGetData->Header.ReturnStatus);
- return;
- }
-
- CopyMem ((UINT8 *)mSmiHandlerProfileDatabase + Offset, (VOID *)(UINTN)CommGetData->DataBuffer, (UINTN)CommGetData->DataSize);
- }
-
- DEBUG ((DEBUG_INFO, "SmiHandlerProfileSize - 0x%x\n", mSmiHandlerProfileDatabaseSize));
-
- return;
-}
-
-/**
- Get the file name portion of the Pdb File Name.
-
- The portion of the Pdb File Name between the last backslash and
- either a following period or the end of the string is copied into
- AsciiBuffer. The name is truncated, if necessary, to ensure that
- AsciiBuffer is not overrun.
-
- @param[in] PdbFileName Pdb file name.
- @param[out] AsciiBuffer The resultant Ascii File Name.
-
-**/
-VOID
-GetShortPdbFileName (
- IN CHAR8 *PdbFileName,
- OUT CHAR8 *AsciiBuffer
- )
-{
- UINTN IndexPdb; // Current work location within a Pdb string.
- UINTN IndexBuffer; // Current work location within a Buffer string.
- UINTN StartIndex;
- UINTN EndIndex;
-
- ZeroMem (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1);
-
- if (PdbFileName == NULL) {
- AsciiStrnCpyS (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1, " ", 1);
- } else {
- StartIndex = 0;
- for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++) {
- }
-
- for (IndexPdb = 0; PdbFileName[IndexPdb] != 0; IndexPdb++) {
- if ((PdbFileName[IndexPdb] == '\\') || (PdbFileName[IndexPdb] == '/')) {
- StartIndex = IndexPdb + 1;
- }
-
- if (PdbFileName[IndexPdb] == '.') {
- EndIndex = IndexPdb;
- }
- }
-
- IndexBuffer = 0;
- for (IndexPdb = StartIndex; IndexPdb < EndIndex; IndexPdb++) {
- AsciiBuffer[IndexBuffer] = PdbFileName[IndexPdb];
- IndexBuffer++;
- if (IndexBuffer >= PROFILE_NAME_STRING_LENGTH) {
- AsciiBuffer[PROFILE_NAME_STRING_LENGTH] = 0;
- break;
- }
- }
- }
-}
-
-/**
- Get a human readable name for an image.
- The following methods will be tried orderly:
- 1. Image PDB
- 2. FFS UI section
- 3. Image GUID
-
- @param[in] ImageStruct Point to the image structure.
-
- @return The resulting Ascii name string is stored in the mNameString global array.
-
-**/
-CHAR8 *
-GetDriverNameString (
- IN SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct
- )
-{
- EFI_STATUS Status;
- CHAR16 *NameString;
- UINTN StringSize;
-
- if (ImageStruct == NULL) {
- return "???";
- }
-
- //
- // Method 1: Get the name string from image PDB
- //
- if (ImageStruct->PdbStringOffset != 0) {
- GetShortPdbFileName ((CHAR8 *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset), mNameString);
- return mNameString;
- }
-
- if (!IsZeroGuid (&ImageStruct->FileGuid)) {
- //
- // Try to get the image's FFS UI section by image GUID
- //
- NameString = NULL;
- StringSize = 0;
- Status = GetSectionFromAnyFv (
- &ImageStruct->FileGuid,
- EFI_SECTION_USER_INTERFACE,
- 0,
- (VOID **)&NameString,
- &StringSize
- );
- if (!EFI_ERROR (Status)) {
- //
- // Method 2: Get the name string from FFS UI section
- //
- if (StrLen (NameString) > PROFILE_NAME_STRING_LENGTH) {
- NameString[PROFILE_NAME_STRING_LENGTH] = 0;
- }
-
- UnicodeStrToAsciiStrS (NameString, mNameString, sizeof (mNameString));
- FreePool (NameString);
- return mNameString;
- }
- }
-
- //
- // Method 3: Get the name string from image GUID
- //
- AsciiSPrint (mNameString, sizeof (mNameString), "%g", &ImageStruct->FileGuid);
- return mNameString;
-}
-
-/**
- Get image structure from reference index.
-
- @param ImageRef the image reference index
-
- @return image structure
-**/
-SMM_CORE_IMAGE_DATABASE_STRUCTURE *
-GetImageFromRef (
- IN UINTN ImageRef
- )
-{
- SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct;
-
- ImageStruct = (VOID *)mSmiHandlerProfileDatabase;
- while ((UINTN)ImageStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) {
- if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) {
- if (ImageStruct->ImageRef == ImageRef) {
- return ImageStruct;
- }
- }
-
- ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length);
- }
-
- return NULL;
-}
-
-/**
- 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;
-}
-
-CHAR8 *mSxTypeString[] = {
- "SxS0",
- "SxS1",
- "SxS2",
- "SxS3",
- "SxS4",
- "SxS5",
-};
-
-/**
- Convert SxType to a string.
-
- @param Type SxType
-
- @return SxType string
-**/
-CHAR8 *
-SxTypeToString (
- IN EFI_SLEEP_TYPE Type
- )
-{
- if ((Type >= 0) && (Type < ARRAY_SIZE (mSxTypeString))) {
- return mSxTypeString[Type];
- } else {
- AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
- return mNameString;
- }
-}
-
-CHAR8 *mSxPhaseString[] = {
- "SxEntry",
- "SxExit",
-};
-
-/**
- Convert SxPhase to a string.
-
- @param Phase SxPhase
-
- @return SxPhase string
-**/
-CHAR8 *
-SxPhaseToString (
- IN EFI_SLEEP_PHASE Phase
- )
-{
- if ((Phase >= 0) && (Phase < ARRAY_SIZE (mSxPhaseString))) {
- return mSxPhaseString[Phase];
- } else {
- AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
- return mNameString;
- }
-}
-
-CHAR8 *mPowerButtonPhaseString[] = {
- "PowerButtonEntry",
- "PowerButtonExit",
-};
-
-/**
- Convert PowerButtonPhase to a string.
-
- @param Phase PowerButtonPhase
-
- @return PowerButtonPhase string
-**/
-CHAR8 *
-PowerButtonPhaseToString (
- IN EFI_POWER_BUTTON_PHASE Phase
- )
-{
- if ((Phase >= 0) && (Phase < ARRAY_SIZE (mPowerButtonPhaseString))) {
- return mPowerButtonPhaseString[Phase];
- } else {
- AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
- return mNameString;
- }
-}
-
-CHAR8 *mStandbyButtonPhaseString[] = {
- "StandbyButtonEntry",
- "StandbyButtonExit",
-};
-
-/**
- Convert StandbyButtonPhase to a string.
-
- @param Phase StandbyButtonPhase
-
- @return StandbyButtonPhase string
-**/
-CHAR8 *
-StandbyButtonPhaseToString (
- IN EFI_STANDBY_BUTTON_PHASE Phase
- )
-{
- if ((Phase >= 0) && (Phase < ARRAY_SIZE (mStandbyButtonPhaseString))) {
- return mStandbyButtonPhaseString[Phase];
- } else {
- AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
- return mNameString;
- }
-}
-
-CHAR8 *mIoTrapTypeString[] = {
- "WriteTrap",
- "ReadTrap",
- "ReadWriteTrap",
-};
-
-/**
- Convert IoTrapType to a string.
-
- @param Type IoTrapType
-
- @return IoTrapType string
-**/
-CHAR8 *
-IoTrapTypeToString (
- IN EFI_SMM_IO_TRAP_DISPATCH_TYPE Type
- )
-{
- if ((Type >= 0) && (Type < ARRAY_SIZE (mIoTrapTypeString))) {
- return mIoTrapTypeString[Type];
- } else {
- AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
- return mNameString;
- }
-}
-
-CHAR8 *mUsbTypeString[] = {
- "UsbLegacy",
- "UsbWake",
-};
-
-/**
- Convert UsbType to a string.
-
- @param Type UsbType
-
- @return UsbType string
-**/
-CHAR8 *
-UsbTypeToString (
- IN EFI_USB_SMI_TYPE Type
- )
-{
- if ((Type >= 0) && (Type < ARRAY_SIZE (mUsbTypeString))) {
- return mUsbTypeString[Type];
- } else {
- AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
- return mNameString;
- }
-}
-
-/**
- Dump SMI child context.
-
- @param HandlerType the handler type
- @param Context the handler context
- @param ContextSize the handler context size
-**/
-VOID
-DumpSmiChildContext (
- IN EFI_GUID *HandlerType,
- IN VOID *Context,
- IN UINTN ContextSize
- )
-{
- CHAR16 *Str;
-
- if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {
- Print (L" SwSmi=\"0x%lx\"", ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue);
- } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {
- Print (L" SxType=\"%a\"", SxTypeToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));
- Print (L" SxPhase=\"%a\"", SxPhaseToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));
- } else if (CompareGuid (HandlerType, &gEfiSmmPowerButtonDispatch2ProtocolGuid)) {
- Print (L" PowerButtonPhase=\"%a\"", PowerButtonPhaseToString (((EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
- } else if (CompareGuid (HandlerType, &gEfiSmmStandbyButtonDispatch2ProtocolGuid)) {
- Print (L" StandbyButtonPhase=\"%a\"", StandbyButtonPhaseToString (((EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
- } else if (CompareGuid (HandlerType, &gEfiSmmPeriodicTimerDispatch2ProtocolGuid)) {
- Print (L" PeriodicTimerPeriod=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->Period);
- Print (L" PeriodicTimerSmiTickInterval=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->SmiTickInterval);
- } else if (CompareGuid (HandlerType, &gEfiSmmGpiDispatch2ProtocolGuid)) {
- Print (L" GpiNum=\"0x%lx\"", ((EFI_SMM_GPI_REGISTER_CONTEXT *)Context)->GpiNum);
- } else if (CompareGuid (HandlerType, &gEfiSmmIoTrapDispatch2ProtocolGuid)) {
- Print (L" IoTrapAddress=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Address);
- Print (L" IoTrapLength=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Length);
- Print (L" IoTrapType=\"%a\"", IoTrapTypeToString (((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type));
- } else if (CompareGuid (HandlerType, &gEfiSmmUsbDispatch2ProtocolGuid)) {
- Print (L" UsbType=\"0x%x\"", UsbTypeToString (((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context)->Type));
- Str = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context) + 1), TRUE, TRUE);
- Print (L" UsbDevicePath=\"%s\"", Str);
- if (Str != NULL) {
- FreePool (Str);
- }
- } else {
- Print (L" Context=\"");
- InternalDumpData (Context, ContextSize);
- Print (L"\"");
- }
-}
-
-/**
- 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;
-}
-
-/**
- The Entry Point for SMI handler profile info application.
-
- @param ImageHandle The firmware allocated handle for the EFI image.
- @param SystemTable A pointer to the EFI System Table.
-
- @retval EFI_SUCCESS The entry point is executed successfully.
- @retval Other Some error occurred when executing this entry point.
-**/
-EFI_STATUS
-EFIAPI
-SmiHandlerProfileInfoEntrypoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- GetSmiHandlerProfileDatabase ();
-
- if (mSmiHandlerProfileDatabase == NULL) {
- return EFI_SUCCESS;
- }
-
- //
- // Dump all image
- //
- Print (L"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
- Print (L"<SmiHandlerProfile>\n");
- Print (L"<ImageDatabase>\n");
- Print (L" <!-- SMM image loaded -->\n");
- DumpSmmLoadedImage ();
- Print (L"</ImageDatabase>\n\n");
-
- //
- // Dump SMI Handler
- //
- Print (L"<SmiHandlerDatabase>\n");
- Print (L" <!-- SMI Handler registered -->\n\n");
- Print (L" <SmiHandlerCategory Name=\"RootSmi\">\n");
- Print (L" <!-- The root SMI Handler registered by SmmCore -->\n");
- DumpSmiHandler (SmmCoreSmiHandlerCategoryRootHandler);
- Print (L" </SmiHandlerCategory>\n\n");
-
- Print (L" <SmiHandlerCategory Name=\"GuidSmi\">\n");
- Print (L" <!-- The GUID SMI Handler registered by SmmCore -->\n");
- DumpSmiHandler (SmmCoreSmiHandlerCategoryGuidHandler);
- Print (L" </SmiHandlerCategory>\n\n");
-
- Print (L" <SmiHandlerCategory Name=\"HardwareSmi\">\n");
- Print (L" <!-- The hardware SMI Handler registered by SmmChildDispatcher -->\n");
- DumpSmiHandler (SmmCoreSmiHandlerCategoryHardwareHandler);
- Print (L" </SmiHandlerCategory>\n\n");
-
- Print (L"</SmiHandlerDatabase>\n");
- Print (L"</SmiHandlerProfile>\n");
-
- if (mSmiHandlerProfileDatabase != NULL) {
- FreePool (mSmiHandlerProfileDatabase);
- }
-
- return EFI_SUCCESS;
-}
+/** @file
+ Shell application to dump SMI handler profile information.
+
+Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <PiDxe.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/UefiRuntimeServicesTableLib.h>
+#include <Library/DebugLib.h>
+#include <Library/PrintLib.h>
+#include <Library/UefiLib.h>
+#include <Library/DevicePathLib.h>
+#include <Library/DxeServicesLib.h>
+#include <Protocol/SmmCommunication.h>
+#include <Guid/PiSmmCommunicationRegionTable.h>
+
+#include <Guid/SmiHandlerProfile.h>
+
+#define PROFILE_NAME_STRING_LENGTH 64
+CHAR8 mNameString[PROFILE_NAME_STRING_LENGTH + 1];
+
+VOID *mSmiHandlerProfileDatabase;
+UINTN mSmiHandlerProfileDatabaseSize;
+
+/**
+ This function dump raw data.
+
+ @param Data raw data
+ @param Size raw data size
+**/
+VOID
+InternalDumpData (
+ IN UINT8 *Data,
+ IN UINTN Size
+ )
+{
+ UINTN Index;
+
+ for (Index = 0; Index < Size; Index++) {
+ Print (L"%02x", (UINTN)Data[Index]);
+ if ((Index + 1) != Size) {
+ Print (L" ");
+ }
+ }
+}
+
+/**
+ Get SMI handler profile database.
+**/
+VOID
+GetSmiHandlerProfileDatabase (
+ VOID
+ )
+{
+ EFI_STATUS Status;
+ UINTN CommSize;
+ UINT8 *CommBuffer;
+ EFI_SMM_COMMUNICATE_HEADER *CommHeader;
+ SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *CommGetInfo;
+ SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *CommGetData;
+ EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;
+ UINTN MinimalSizeNeeded;
+ EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
+ UINT32 Index;
+ EFI_MEMORY_DESCRIPTOR *Entry;
+ VOID *Buffer;
+ UINTN Size;
+ UINTN Offset;
+
+ Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **)&SmmCommunication);
+ if (EFI_ERROR (Status)) {
+ Print (L"SmiHandlerProfile: Locate SmmCommunication protocol - %r\n", Status);
+ return;
+ }
+
+ MinimalSizeNeeded = EFI_PAGE_SIZE;
+
+ Status = EfiGetSystemConfigurationTable (
+ &gEdkiiPiSmmCommunicationRegionTableGuid,
+ (VOID **)&PiSmmCommunicationRegionTable
+ );
+ if (EFI_ERROR (Status)) {
+ Print (L"SmiHandlerProfile: Get PiSmmCommunicationRegionTable - %r\n", Status);
+ return;
+ }
+
+ ASSERT (PiSmmCommunicationRegionTable != NULL);
+ Entry = (EFI_MEMORY_DESCRIPTOR *)(PiSmmCommunicationRegionTable + 1);
+ Size = 0;
+ for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {
+ if (Entry->Type == EfiConventionalMemory) {
+ Size = EFI_PAGES_TO_SIZE ((UINTN)Entry->NumberOfPages);
+ if (Size >= MinimalSizeNeeded) {
+ break;
+ }
+ }
+
+ Entry = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Entry + PiSmmCommunicationRegionTable->DescriptorSize);
+ }
+
+ ASSERT (Index < PiSmmCommunicationRegionTable->NumberOfEntries);
+ CommBuffer = (UINT8 *)(UINTN)Entry->PhysicalStart;
+
+ //
+ // Get Size
+ //
+ CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
+ CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
+ CommHeader->MessageLength = sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO);
+
+ CommGetInfo = (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];
+ CommGetInfo->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_INFO;
+ CommGetInfo->Header.DataLength = sizeof (*CommGetInfo);
+ CommGetInfo->Header.ReturnStatus = (UINT64)-1;
+ CommGetInfo->DataSize = 0;
+
+ CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
+ Status = SmmCommunication->Communicate (SmmCommunication, CommBuffer, &CommSize);
+ if (EFI_ERROR (Status)) {
+ Print (L"SmiHandlerProfile: SmmCommunication - %r\n", Status);
+ return;
+ }
+
+ if (CommGetInfo->Header.ReturnStatus != 0) {
+ Print (L"SmiHandlerProfile: GetInfo - 0x%0x\n", CommGetInfo->Header.ReturnStatus);
+ return;
+ }
+
+ mSmiHandlerProfileDatabaseSize = (UINTN)CommGetInfo->DataSize;
+
+ //
+ // Get Data
+ //
+ mSmiHandlerProfileDatabase = AllocateZeroPool (mSmiHandlerProfileDatabaseSize);
+ if (mSmiHandlerProfileDatabase == NULL) {
+ Status = EFI_OUT_OF_RESOURCES;
+ Print (L"SmiHandlerProfile: AllocateZeroPool (0x%x) for dump buffer - %r\n", mSmiHandlerProfileDatabaseSize, Status);
+ return;
+ }
+
+ CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
+ CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
+ CommHeader->MessageLength = sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET);
+
+ CommGetData = (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];
+ CommGetData->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_DATA_BY_OFFSET;
+ CommGetData->Header.DataLength = sizeof (*CommGetData);
+ CommGetData->Header.ReturnStatus = (UINT64)-1;
+
+ CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
+ Buffer = (UINT8 *)CommHeader + CommSize;
+ Size -= CommSize;
+
+ CommGetData->DataBuffer = (PHYSICAL_ADDRESS)(UINTN)Buffer;
+ CommGetData->DataOffset = 0;
+ while (CommGetData->DataOffset < mSmiHandlerProfileDatabaseSize) {
+ Offset = (UINTN)CommGetData->DataOffset;
+ if (Size <= (mSmiHandlerProfileDatabaseSize - CommGetData->DataOffset)) {
+ CommGetData->DataSize = (UINT64)Size;
+ } else {
+ CommGetData->DataSize = (UINT64)(mSmiHandlerProfileDatabaseSize - CommGetData->DataOffset);
+ }
+
+ Status = SmmCommunication->Communicate (SmmCommunication, CommBuffer, &CommSize);
+ ASSERT_EFI_ERROR (Status);
+
+ if (CommGetData->Header.ReturnStatus != 0) {
+ FreePool (mSmiHandlerProfileDatabase);
+ mSmiHandlerProfileDatabase = NULL;
+ Print (L"SmiHandlerProfile: GetData - 0x%x\n", CommGetData->Header.ReturnStatus);
+ return;
+ }
+
+ CopyMem ((UINT8 *)mSmiHandlerProfileDatabase + Offset, (VOID *)(UINTN)CommGetData->DataBuffer, (UINTN)CommGetData->DataSize);
+ }
+
+ DEBUG ((DEBUG_INFO, "SmiHandlerProfileSize - 0x%x\n", mSmiHandlerProfileDatabaseSize));
+
+ return;
+}
+
+/**
+ Get the file name portion of the Pdb File Name.
+
+ The portion of the Pdb File Name between the last backslash and
+ either a following period or the end of the string is copied into
+ AsciiBuffer. The name is truncated, if necessary, to ensure that
+ AsciiBuffer is not overrun.
+
+ @param[in] PdbFileName Pdb file name.
+ @param[out] AsciiBuffer The resultant Ascii File Name.
+
+**/
+VOID
+GetShortPdbFileName (
+ IN CHAR8 *PdbFileName,
+ OUT CHAR8 *AsciiBuffer
+ )
+{
+ UINTN IndexPdb; // Current work location within a Pdb string.
+ UINTN IndexBuffer; // Current work location within a Buffer string.
+ UINTN StartIndex;
+ UINTN EndIndex;
+
+ ZeroMem (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1);
+
+ if (PdbFileName == NULL) {
+ AsciiStrnCpyS (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1, " ", 1);
+ } else {
+ StartIndex = 0;
+ for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++) {
+ }
+
+ for (IndexPdb = 0; PdbFileName[IndexPdb] != 0; IndexPdb++) {
+ if ((PdbFileName[IndexPdb] == '\\') || (PdbFileName[IndexPdb] == '/')) {
+ StartIndex = IndexPdb + 1;
+ }
+
+ if (PdbFileName[IndexPdb] == '.') {
+ EndIndex = IndexPdb;
+ }
+ }
+
+ IndexBuffer = 0;
+ for (IndexPdb = StartIndex; IndexPdb < EndIndex; IndexPdb++) {
+ AsciiBuffer[IndexBuffer] = PdbFileName[IndexPdb];
+ IndexBuffer++;
+ if (IndexBuffer >= PROFILE_NAME_STRING_LENGTH) {
+ AsciiBuffer[PROFILE_NAME_STRING_LENGTH] = 0;
+ break;
+ }
+ }
+ }
+}
+
+/**
+ Get a human readable name for an image.
+ The following methods will be tried orderly:
+ 1. Image PDB
+ 2. FFS UI section
+ 3. Image GUID
+
+ @param[in] ImageStruct Point to the image structure.
+
+ @return The resulting Ascii name string is stored in the mNameString global array.
+
+**/
+CHAR8 *
+GetDriverNameString (
+ IN SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct
+ )
+{
+ EFI_STATUS Status;
+ CHAR16 *NameString;
+ UINTN StringSize;
+
+ if (ImageStruct == NULL) {
+ return "???";
+ }
+
+ //
+ // Method 1: Get the name string from image PDB
+ //
+ if (ImageStruct->PdbStringOffset != 0) {
+ GetShortPdbFileName ((CHAR8 *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset), mNameString);
+ return mNameString;
+ }
+
+ if (!IsZeroGuid (&ImageStruct->FileGuid)) {
+ //
+ // Try to get the image's FFS UI section by image GUID
+ //
+ NameString = NULL;
+ StringSize = 0;
+ Status = GetSectionFromAnyFv (
+ &ImageStruct->FileGuid,
+ EFI_SECTION_USER_INTERFACE,
+ 0,
+ (VOID **)&NameString,
+ &StringSize
+ );
+ if (!EFI_ERROR (Status)) {
+ //
+ // Method 2: Get the name string from FFS UI section
+ //
+ if (StrLen (NameString) > PROFILE_NAME_STRING_LENGTH) {
+ NameString[PROFILE_NAME_STRING_LENGTH] = 0;
+ }
+
+ UnicodeStrToAsciiStrS (NameString, mNameString, sizeof (mNameString));
+ FreePool (NameString);
+ return mNameString;
+ }
+ }
+
+ //
+ // Method 3: Get the name string from image GUID
+ //
+ AsciiSPrint (mNameString, sizeof (mNameString), "%g", &ImageStruct->FileGuid);
+ return mNameString;
+}
+
+/**
+ Get image structure from reference index.
+
+ @param ImageRef the image reference index
+
+ @return image structure
+**/
+SMM_CORE_IMAGE_DATABASE_STRUCTURE *
+GetImageFromRef (
+ IN UINTN ImageRef
+ )
+{
+ SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct;
+
+ ImageStruct = (VOID *)mSmiHandlerProfileDatabase;
+ while ((UINTN)ImageStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) {
+ if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) {
+ if (ImageStruct->ImageRef == ImageRef) {
+ return ImageStruct;
+ }
+ }
+
+ ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length);
+ }
+
+ return NULL;
+}
+
+/**
+ 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;
+}
+
+CHAR8 *mSxTypeString[] = {
+ "SxS0",
+ "SxS1",
+ "SxS2",
+ "SxS3",
+ "SxS4",
+ "SxS5",
+};
+
+/**
+ Convert SxType to a string.
+
+ @param Type SxType
+
+ @return SxType string
+**/
+CHAR8 *
+SxTypeToString (
+ IN EFI_SLEEP_TYPE Type
+ )
+{
+ if ((Type >= 0) && (Type < ARRAY_SIZE (mSxTypeString))) {
+ return mSxTypeString[Type];
+ } else {
+ AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
+ return mNameString;
+ }
+}
+
+CHAR8 *mSxPhaseString[] = {
+ "SxEntry",
+ "SxExit",
+};
+
+/**
+ Convert SxPhase to a string.
+
+ @param Phase SxPhase
+
+ @return SxPhase string
+**/
+CHAR8 *
+SxPhaseToString (
+ IN EFI_SLEEP_PHASE Phase
+ )
+{
+ if ((Phase >= 0) && (Phase < ARRAY_SIZE (mSxPhaseString))) {
+ return mSxPhaseString[Phase];
+ } else {
+ AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
+ return mNameString;
+ }
+}
+
+CHAR8 *mPowerButtonPhaseString[] = {
+ "PowerButtonEntry",
+ "PowerButtonExit",
+};
+
+/**
+ Convert PowerButtonPhase to a string.
+
+ @param Phase PowerButtonPhase
+
+ @return PowerButtonPhase string
+**/
+CHAR8 *
+PowerButtonPhaseToString (
+ IN EFI_POWER_BUTTON_PHASE Phase
+ )
+{
+ if ((Phase >= 0) && (Phase < ARRAY_SIZE (mPowerButtonPhaseString))) {
+ return mPowerButtonPhaseString[Phase];
+ } else {
+ AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
+ return mNameString;
+ }
+}
+
+CHAR8 *mStandbyButtonPhaseString[] = {
+ "StandbyButtonEntry",
+ "StandbyButtonExit",
+};
+
+/**
+ Convert StandbyButtonPhase to a string.
+
+ @param Phase StandbyButtonPhase
+
+ @return StandbyButtonPhase string
+**/
+CHAR8 *
+StandbyButtonPhaseToString (
+ IN EFI_STANDBY_BUTTON_PHASE Phase
+ )
+{
+ if ((Phase >= 0) && (Phase < ARRAY_SIZE (mStandbyButtonPhaseString))) {
+ return mStandbyButtonPhaseString[Phase];
+ } else {
+ AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
+ return mNameString;
+ }
+}
+
+CHAR8 *mIoTrapTypeString[] = {
+ "WriteTrap",
+ "ReadTrap",
+ "ReadWriteTrap",
+};
+
+/**
+ Convert IoTrapType to a string.
+
+ @param Type IoTrapType
+
+ @return IoTrapType string
+**/
+CHAR8 *
+IoTrapTypeToString (
+ IN EFI_SMM_IO_TRAP_DISPATCH_TYPE Type
+ )
+{
+ if ((Type >= 0) && (Type < ARRAY_SIZE (mIoTrapTypeString))) {
+ return mIoTrapTypeString[Type];
+ } else {
+ AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
+ return mNameString;
+ }
+}
+
+CHAR8 *mUsbTypeString[] = {
+ "UsbLegacy",
+ "UsbWake",
+};
+
+/**
+ Convert UsbType to a string.
+
+ @param Type UsbType
+
+ @return UsbType string
+**/
+CHAR8 *
+UsbTypeToString (
+ IN EFI_USB_SMI_TYPE Type
+ )
+{
+ if ((Type >= 0) && (Type < ARRAY_SIZE (mUsbTypeString))) {
+ return mUsbTypeString[Type];
+ } else {
+ AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
+ return mNameString;
+ }
+}
+
+/**
+ Dump SMI child context.
+
+ @param HandlerType the handler type
+ @param Context the handler context
+ @param ContextSize the handler context size
+**/
+VOID
+DumpSmiChildContext (
+ IN EFI_GUID *HandlerType,
+ IN VOID *Context,
+ IN UINTN ContextSize
+ )
+{
+ CHAR16 *Str;
+
+ if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {
+ Print (L" SwSmi=\"0x%lx\"", ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue);
+ } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {
+ Print (L" SxType=\"%a\"", SxTypeToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));
+ Print (L" SxPhase=\"%a\"", SxPhaseToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));
+ } else if (CompareGuid (HandlerType, &gEfiSmmPowerButtonDispatch2ProtocolGuid)) {
+ Print (L" PowerButtonPhase=\"%a\"", PowerButtonPhaseToString (((EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
+ } else if (CompareGuid (HandlerType, &gEfiSmmStandbyButtonDispatch2ProtocolGuid)) {
+ Print (L" StandbyButtonPhase=\"%a\"", StandbyButtonPhaseToString (((EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
+ } else if (CompareGuid (HandlerType, &gEfiSmmPeriodicTimerDispatch2ProtocolGuid)) {
+ Print (L" PeriodicTimerPeriod=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->Period);
+ Print (L" PeriodicTimerSmiTickInterval=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->SmiTickInterval);
+ } else if (CompareGuid (HandlerType, &gEfiSmmGpiDispatch2ProtocolGuid)) {
+ Print (L" GpiNum=\"0x%lx\"", ((EFI_SMM_GPI_REGISTER_CONTEXT *)Context)->GpiNum);
+ } else if (CompareGuid (HandlerType, &gEfiSmmIoTrapDispatch2ProtocolGuid)) {
+ Print (L" IoTrapAddress=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Address);
+ Print (L" IoTrapLength=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Length);
+ Print (L" IoTrapType=\"%a\"", IoTrapTypeToString (((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type));
+ } else if (CompareGuid (HandlerType, &gEfiSmmUsbDispatch2ProtocolGuid)) {
+ Print (L" UsbType=\"0x%x\"", UsbTypeToString (((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context)->Type));
+ Str = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context) + 1), TRUE, TRUE);
+ Print (L" UsbDevicePath=\"%s\"", Str);
+ if (Str != NULL) {
+ FreePool (Str);
+ }
+ } else {
+ Print (L" Context=\"");
+ InternalDumpData (Context, ContextSize);
+ Print (L"\"");
+ }
+}
+
+/**
+ 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;
+}
+
+/**
+ The Entry Point for SMI handler profile info application.
+
+ @param ImageHandle The firmware allocated handle for the EFI image.
+ @param SystemTable A pointer to the EFI System Table.
+
+ @retval EFI_SUCCESS The entry point is executed successfully.
+ @retval Other Some error occurred when executing this entry point.
+**/
+EFI_STATUS
+EFIAPI
+SmiHandlerProfileInfoEntrypoint (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ GetSmiHandlerProfileDatabase ();
+
+ if (mSmiHandlerProfileDatabase == NULL) {
+ return EFI_SUCCESS;
+ }
+
+ //
+ // Dump all image
+ //
+ Print (L"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
+ Print (L"<SmiHandlerProfile>\n");
+ Print (L"<ImageDatabase>\n");
+ Print (L" <!-- SMM image loaded -->\n");
+ DumpSmmLoadedImage ();
+ Print (L"</ImageDatabase>\n\n");
+
+ //
+ // Dump SMI Handler
+ //
+ Print (L"<SmiHandlerDatabase>\n");
+ Print (L" <!-- SMI Handler registered -->\n\n");
+ Print (L" <SmiHandlerCategory Name=\"RootSmi\">\n");
+ Print (L" <!-- The root SMI Handler registered by SmmCore -->\n");
+ DumpSmiHandler (SmmCoreSmiHandlerCategoryRootHandler);
+ Print (L" </SmiHandlerCategory>\n\n");
+
+ Print (L" <SmiHandlerCategory Name=\"GuidSmi\">\n");
+ Print (L" <!-- The GUID SMI Handler registered by SmmCore -->\n");
+ DumpSmiHandler (SmmCoreSmiHandlerCategoryGuidHandler);
+ Print (L" </SmiHandlerCategory>\n\n");
+
+ Print (L" <SmiHandlerCategory Name=\"HardwareSmi\">\n");
+ Print (L" <!-- The hardware SMI Handler registered by SmmChildDispatcher -->\n");
+ DumpSmiHandler (SmmCoreSmiHandlerCategoryHardwareHandler);
+ Print (L" </SmiHandlerCategory>\n\n");
+
+ Print (L"</SmiHandlerDatabase>\n");
+ Print (L"</SmiHandlerProfile>\n");
+
+ if (mSmiHandlerProfileDatabase != NULL) {
+ FreePool (mSmiHandlerProfileDatabase);
+ }
+
+ return EFI_SUCCESS;
+}
diff --git a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.inf b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.inf
index eae4e6a87c..75fff79ded 100644
--- a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.inf
+++ b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.inf
@@ -1,58 +1,58 @@
-## @file
-# Shell application to dump SMI handler profile information.
-#
-# Note that if the feature is not enabled by setting PcdSmiHandlerProfilePropertyMask,
-# the application will not display SMI handler profile information.
-#
-# Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
-# SPDX-License-Identifier: BSD-2-Clause-Patent
-#
-##
-
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = SmiHandlerProfileInfo
- MODULE_UNI_FILE = SmiHandlerProfileInfo.uni
- FILE_GUID = 611EA796-8DF8-4BB6-91FE-6540ED70DC66
- MODULE_TYPE = UEFI_APPLICATION
- VERSION_STRING = 1.0
- ENTRY_POINT = SmiHandlerProfileInfoEntrypoint
-
-[Sources]
- SmiHandlerProfileInfo.c
-
-[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
-
-[LibraryClasses]
- UefiApplicationEntryPoint
- BaseLib
- BaseMemoryLib
- MemoryAllocationLib
- DebugLib
- UefiBootServicesTableLib
- UefiRuntimeServicesTableLib
- UefiLib
- PrintLib
- DevicePathLib
- DxeServicesLib
-
-[Protocols]
- gEfiSmmCommunicationProtocolGuid ## CONSUMES
- gEfiSmmSwDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiSmmSxDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiSmmPowerButtonDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiSmmStandbyButtonDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiSmmPeriodicTimerDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiSmmGpiDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiSmmIoTrapDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
- gEfiSmmUsbDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
-
-[Guids]
- gEdkiiPiSmmCommunicationRegionTableGuid ## CONSUMES ## SystemTable
- gSmiHandlerProfileGuid ## SOMETIMES_CONSUMES ## GUID # SmiHandlerRegister
-
-[UserExtensions.TianoCore."ExtraFiles"]
- SmiHandlerProfileInfoExtra.uni
-
+## @file
+# Shell application to dump SMI handler profile information.
+#
+# Note that if the feature is not enabled by setting PcdSmiHandlerProfilePropertyMask,
+# the application will not display SMI handler profile information.
+#
+# Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 0x00010005
+ BASE_NAME = SmiHandlerProfileInfo
+ MODULE_UNI_FILE = SmiHandlerProfileInfo.uni
+ FILE_GUID = 611EA796-8DF8-4BB6-91FE-6540ED70DC66
+ MODULE_TYPE = UEFI_APPLICATION
+ VERSION_STRING = 1.0
+ ENTRY_POINT = SmiHandlerProfileInfoEntrypoint
+
+[Sources]
+ SmiHandlerProfileInfo.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+ MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+ UefiApplicationEntryPoint
+ BaseLib
+ BaseMemoryLib
+ MemoryAllocationLib
+ DebugLib
+ UefiBootServicesTableLib
+ UefiRuntimeServicesTableLib
+ UefiLib
+ PrintLib
+ DevicePathLib
+ DxeServicesLib
+
+[Protocols]
+ gEfiSmmCommunicationProtocolGuid ## CONSUMES
+ gEfiSmmSwDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiSmmSxDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiSmmPowerButtonDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiSmmStandbyButtonDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiSmmPeriodicTimerDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiSmmGpiDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiSmmIoTrapDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+ gEfiSmmUsbDispatch2ProtocolGuid ## SOMETIMES_CONSUMES
+
+[Guids]
+ gEdkiiPiSmmCommunicationRegionTableGuid ## CONSUMES ## SystemTable
+ gSmiHandlerProfileGuid ## SOMETIMES_CONSUMES ## GUID # SmiHandlerRegister
+
+[UserExtensions.TianoCore."ExtraFiles"]
+ SmiHandlerProfileInfoExtra.uni
+
diff --git a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.uni b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.uni
index 71ec9c2237..1e39253eb4 100644
--- a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.uni
+++ b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfo.uni
@@ -1,17 +1,17 @@
-// /** @file
-// Shell application to dump SMI handler profile information.
-//
-// Note that if the feature is not enabled by setting PcdSmiHandlerProfilePropertyMask,
-// the application will not display SMI handler profile information.
-//
-// Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
-//
-// SPDX-License-Identifier: BSD-2-Clause-Patent
-//
-// **/
-
-
-#string STR_MODULE_ABSTRACT #language en-US "Shell application to dump SMI handler profile information."
-
-#string STR_MODULE_DESCRIPTION #language en-US "Note that if the feature is not enabled by setting PcdSmiHandlerProfilePropertyMask, the application will not display SMI handler profile information."
-
+// /** @file
+// Shell application to dump SMI handler profile information.
+//
+// Note that if the feature is not enabled by setting PcdSmiHandlerProfilePropertyMask,
+// the application will not display SMI handler profile information.
+//
+// Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+// **/
+
+
+#string STR_MODULE_ABSTRACT #language en-US "Shell application to dump SMI handler profile information."
+
+#string STR_MODULE_DESCRIPTION #language en-US "Note that if the feature is not enabled by setting PcdSmiHandlerProfilePropertyMask, the application will not display SMI handler profile information."
+
diff --git a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfoExtra.uni b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfoExtra.uni
index 449e6a1007..3be4f85c1a 100644
--- a/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfoExtra.uni
+++ b/MdeModulePkg/Application/SmiHandlerProfileInfo/SmiHandlerProfileInfoExtra.uni
@@ -1,14 +1,14 @@
-// /** @file
-// SmiHandlerProfileInfo Localized Strings and Content
-//
-// Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
-//
-// SPDX-License-Identifier: BSD-2-Clause-Patent
-//
-// **/
-
-#string STR_PROPERTIES_MODULE_NAME
-#language en-US
-"SMI Handler Profile Information Application"
-
-
+// /** @file
+// SmiHandlerProfileInfo Localized Strings and Content
+//
+// Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
+//
+// SPDX-License-Identifier: BSD-2-Clause-Patent
+//
+// **/
+
+#string STR_PROPERTIES_MODULE_NAME
+#language en-US
+"SMI Handler Profile Information Application"
+
+