Skip to content

Commit

Permalink
MdeModulePkg: Update DumpImageRecord() in ImagePropertiesRecordLib
Browse files Browse the repository at this point in the history
Update DumpImageRecord() to be DumpImageRecords(), and improve
the debug output. The function will output at DEBUG_INFO instead,
and the function will be run in DXE and SMM
MAT logic when the MAT is installed at EndOfDxe on DEBUG builds.

Cc: Jian J Wang <[email protected]>
Cc: Liming Gao <[email protected]>
Cc: Dandan Bi <[email protected]>
Cc: Jiaxin Wu <[email protected]>
Cc: Ray Ni <[email protected]>
Signed-off-by: Taylor Beebe <[email protected]>
Reviewed-by: Liming Gao <[email protected]>
  • Loading branch information
TaylorBeebe authored and mergify[bot] committed Nov 27, 2023
1 parent 3565ee6 commit 4ec2fab
Show file tree
Hide file tree
Showing 6 changed files with 137 additions and 23 deletions.
9 changes: 9 additions & 0 deletions MdeModulePkg/Core/Dxe/Misc/MemoryAttributesTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -284,6 +284,15 @@ InstallMemoryAttributesTableOnEndOfDxe (
{
mMemoryAttributesTableEndOfDxe = TRUE;
InstallMemoryAttributesTable ();

DEBUG_CODE_BEGIN ();
if ( mImagePropertiesPrivateData.ImageRecordCount > 0) {
DEBUG ((DEBUG_INFO, "DXE - Total Runtime Image Count: 0x%x\n", mImagePropertiesPrivateData.ImageRecordCount));
DEBUG ((DEBUG_INFO, "DXE - Dump Runtime Image Records:\n"));
DumpImageRecords (&mImagePropertiesPrivateData.ImageRecordList);
}

DEBUG_CODE_END ();
}

/**
Expand Down
11 changes: 8 additions & 3 deletions MdeModulePkg/Core/PiSmmCore/MemoryAttributesTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -496,9 +496,14 @@ SmmInstallMemoryAttributesTable (
return EFI_SUCCESS;
}

DEBUG ((DEBUG_VERBOSE, "SMM Total Image Count - 0x%x\n", mImagePropertiesPrivateData.ImageRecordCount));
DEBUG ((DEBUG_VERBOSE, "SMM Dump ImageRecord:\n"));
DumpImageRecord (&mImagePropertiesPrivateData.ImageRecordList);
DEBUG_CODE_BEGIN ();
if ( mImagePropertiesPrivateData.ImageRecordCount > 0) {
DEBUG ((DEBUG_INFO, "SMM - Total Runtime Image Count - 0x%x\n", mImagePropertiesPrivateData.ImageRecordCount));
DEBUG ((DEBUG_INFO, "SMM - Dump Runtime Image Records:\n"));
DumpImageRecords (&mImagePropertiesPrivateData.ImageRecordList);
}

DEBUG_CODE_END ();

PublishMemoryAttributesTable ();

Expand Down
6 changes: 3 additions & 3 deletions MdeModulePkg/Include/Library/ImagePropertiesRecordLib.h
Original file line number Diff line number Diff line change
Expand Up @@ -182,13 +182,13 @@ FindImageRecord (
);

/**
Dump image record.
Debug dumps the input list of IMAGE_PROPERTIES_RECORD structs.
@param[in] ImageRecordList A list of IMAGE_PROPERTIES_RECORD entries
@param[in] ImageRecordList Head of the IMAGE_PROPERTIES_RECORD list
**/
VOID
EFIAPI
DumpImageRecord (
DumpImageRecords (
IN LIST_ENTRY *ImageRecordList
);

Expand Down
132 changes: 115 additions & 17 deletions MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/PeCoffGetEntryPointLib.h>
#include <Library/ImagePropertiesRecordLib.h>

#define PREVIOUS_MEMORY_DESCRIPTOR(MemoryDescriptor, Size) \
Expand Down Expand Up @@ -785,31 +786,128 @@ SortImageRecord (
}

/**
Dump image record.
Extract the .efi filename out of the input PDB.
@param[in] ImageRecordList A list of IMAGE_PROPERTIES_RECORD entries
@param[in] PdbPointer Pointer to the PDB file path.
@param[out] EfiFileName Pointer to the .efi filename.
@param[in] EfiFileNameSize Size of the .efi filename buffer.
**/
STATIC
VOID
GetFilename (
IN CHAR8 *PdbPointer,
OUT CHAR8 *EfiFileName,
IN UINTN EfiFileNameSize
)
{
UINTN Index;
UINTN StartIndex;

if ((PdbPointer == NULL) || (EfiFileNameSize < 5)) {
return;
}

// Print Module Name by Pdb file path.
StartIndex = 0;
for (Index = 0; PdbPointer[Index] != 0; Index++) {
if ((PdbPointer[Index] == '\\') || (PdbPointer[Index] == '/')) {
StartIndex = Index + 1;
}
}

// Copy the PDB file name to EfiFileName and replace .pdb with .efi
for (Index = 0; Index < EfiFileNameSize - 4; Index++) {
EfiFileName[Index] = PdbPointer[Index + StartIndex];
if (EfiFileName[Index] == 0) {
EfiFileName[Index] = '.';
}

if (EfiFileName[Index] == '.') {
EfiFileName[Index + 1] = 'e';
EfiFileName[Index + 2] = 'f';
EfiFileName[Index + 3] = 'i';
EfiFileName[Index + 4] = 0;
break;
}
}

if (Index == sizeof (EfiFileName) - 4) {
EfiFileName[Index] = 0;
}
}

/**
Debug dumps the input list of IMAGE_PROPERTIES_RECORD structs.
@param[in] ImageRecordList Head of the IMAGE_PROPERTIES_RECORD list
**/
VOID
EFIAPI
DumpImageRecord (
DumpImageRecords (
IN LIST_ENTRY *ImageRecordList
)
{
IMAGE_PROPERTIES_RECORD *ImageRecord;
LIST_ENTRY *ImageRecordLink;
UINTN Index;
LIST_ENTRY *ImageRecordLink;
IMAGE_PROPERTIES_RECORD *CurrentImageRecord;
LIST_ENTRY *CodeSectionLink;
IMAGE_PROPERTIES_RECORD_CODE_SECTION *CurrentCodeSection;
CHAR8 *PdbPointer;
CHAR8 EfiFileName[256];

for (ImageRecordLink = ImageRecordList->ForwardLink, Index = 0;
ImageRecordLink != ImageRecordList;
ImageRecordLink = ImageRecordLink->ForwardLink, Index++)
{
ImageRecord = CR (
ImageRecordLink,
IMAGE_PROPERTIES_RECORD,
Link,
IMAGE_PROPERTIES_RECORD_SIGNATURE
);
DEBUG ((DEBUG_VERBOSE, "Image[%d]: 0x%016lx - 0x%016lx\n", Index, ImageRecord->ImageBase, ImageRecord->ImageSize));
if (ImageRecordList == NULL) {
return;
}

ImageRecordLink = ImageRecordList->ForwardLink;

while (ImageRecordLink != ImageRecordList) {
CurrentImageRecord = CR (
ImageRecordLink,
IMAGE_PROPERTIES_RECORD,
Link,
IMAGE_PROPERTIES_RECORD_SIGNATURE
);

PdbPointer = PeCoffLoaderGetPdbPointer ((VOID *)(UINTN)CurrentImageRecord->ImageBase);
if (PdbPointer != NULL) {
GetFilename (PdbPointer, EfiFileName, sizeof (EfiFileName));
DEBUG ((
DEBUG_INFO,
"%a: 0x%llx - 0x%llx\n",
EfiFileName,
CurrentImageRecord->ImageBase,
CurrentImageRecord->ImageBase + CurrentImageRecord->ImageSize
));
} else {
DEBUG ((
DEBUG_INFO,
"Unknown Image: 0x%llx - 0x%llx\n",
CurrentImageRecord->ImageBase,
CurrentImageRecord->ImageBase + CurrentImageRecord->ImageSize
));
}

CodeSectionLink = CurrentImageRecord->CodeSegmentList.ForwardLink;

while (CodeSectionLink != &CurrentImageRecord->CodeSegmentList) {
CurrentCodeSection = CR (
CodeSectionLink,
IMAGE_PROPERTIES_RECORD_CODE_SECTION,
Link,
IMAGE_PROPERTIES_RECORD_CODE_SECTION_SIGNATURE
);

DEBUG ((
DEBUG_INFO,
" Code Section: 0x%llx - 0x%llx\n",
CurrentCodeSection->CodeSegmentBase,
CurrentCodeSection->CodeSegmentBase + CurrentCodeSection->CodeSegmentSize
));

CodeSectionLink = CodeSectionLink->ForwardLink;
}

ImageRecordLink = ImageRecordLink->ForwardLink;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
BaseMemoryLib
DebugLib
MemoryAllocationLib
PeCoffGetEntryPointLib

[Packages]
MdePkg/MdePkg.dec
Expand Down
1 change: 1 addition & 0 deletions MdeModulePkg/Test/MdeModulePkgHostTest.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@
MdeModulePkg/Library/ImagePropertiesRecordLib/UnitTest/ImagePropertiesRecordLibUnitTestHost.inf {
<LibraryClasses>
ImagePropertiesRecordLib|MdeModulePkg/Library/ImagePropertiesRecordLib/ImagePropertiesRecordLib.inf
PeCoffGetEntryPointLib|MdePkg/Library/BasePeCoffGetEntryPointLib/BasePeCoffGetEntryPointLib.inf
}

#
Expand Down

0 comments on commit 4ec2fab

Please sign in to comment.