/** @file
Copyright (c) 2017, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MEMORY_ATTRIBUTE_MASK (EFI_RESOURCE_ATTRIBUTE_PRESENT | \
EFI_RESOURCE_ATTRIBUTE_INITIALIZED | \
EFI_RESOURCE_ATTRIBUTE_TESTED | \
EFI_RESOURCE_ATTRIBUTE_16_BIT_IO | \
EFI_RESOURCE_ATTRIBUTE_32_BIT_IO | \
EFI_RESOURCE_ATTRIBUTE_64_BIT_IO \
)
#define TESTED_MEMORY_ATTRIBUTES (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED | EFI_RESOURCE_ATTRIBUTE_TESTED)
#define INITIALIZED_MEMORY_ATTRIBUTES (EFI_RESOURCE_ATTRIBUTE_PRESENT | EFI_RESOURCE_ATTRIBUTE_INITIALIZED)
#define PRESENT_MEMORY_ATTRIBUTES (EFI_RESOURCE_ATTRIBUTE_PRESENT)
CHAR8 *mMemoryTypeShortName[] = {
"Reserved",
"LoaderCode",
"LoaderData",
"BS_Code",
"BS_Data",
"RT_Code",
"RT_Data",
"Available",
"Unusable",
"ACPI_Recl",
"ACPI_NVS",
"MMIO",
"MMIO_Port",
"PalCode",
"Persistent",
};
CHAR8 *mResourceTypeShortName[] = {
"Mem",
"MMIO",
"I/O",
"FD",
"MM Port I/O",
"Reserved Mem",
"Reserved I/O",
};
STATIC CHAR8 mUnknownStr[11];
CHAR8 *
ShortNameOfMemoryType (
IN UINT32 Type
)
{
if (Type < sizeof(mMemoryTypeShortName) / sizeof(mMemoryTypeShortName[0])) {
return mMemoryTypeShortName[Type];
} else {
AsciiSPrint(mUnknownStr, sizeof(mUnknownStr), "%08x", Type);
return mUnknownStr;
}
}
CHAR8 *
ShortNameOfResourceType (
IN UINT32 Type
)
{
if (Type < sizeof(mResourceTypeShortName) / sizeof(mResourceTypeShortName[0])) {
return mResourceTypeShortName[Type];
} else {
AsciiSPrint(mUnknownStr, sizeof(mUnknownStr), "%08x", Type);
return mUnknownStr;
}
}
VOID
DumpPhitHob (
IN VOID *HobList
)
{
EFI_HOB_HANDOFF_INFO_TABLE *PhitHob;
PhitHob = HobList;
ASSERT(GET_HOB_TYPE(HobList) == EFI_HOB_TYPE_HANDOFF);
DEBUG ((DEBUG_INFO, "PHIT HOB\n"));
DEBUG ((DEBUG_INFO, " PhitHob - 0x%x\n", PhitHob));
DEBUG ((DEBUG_INFO, " BootMode - 0x%x\n", PhitHob->BootMode));
DEBUG ((DEBUG_INFO, " EfiMemoryTop - 0x%016lx\n", PhitHob->EfiMemoryTop));
DEBUG ((DEBUG_INFO, " EfiMemoryBottom - 0x%016lx\n", PhitHob->EfiMemoryBottom));
DEBUG ((DEBUG_INFO, " EfiFreeMemoryTop - 0x%016lx\n", PhitHob->EfiFreeMemoryTop));
DEBUG ((DEBUG_INFO, " EfiFreeMemoryBottom - 0x%016lx\n", PhitHob->EfiFreeMemoryBottom));
DEBUG ((DEBUG_INFO, " EfiEndOfHobList - 0x%lx\n", PhitHob->EfiEndOfHobList));
}
VOID
DumpCpuHob (
IN VOID *HobList
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_HOB_CPU *CpuHob;
DEBUG ((DEBUG_INFO, "CPU HOBs\n"));
for (Hob.Raw = HobList; !END_OF_HOB_LIST(Hob); Hob.Raw = GET_NEXT_HOB(Hob)) {
if (GET_HOB_TYPE(Hob) == EFI_HOB_TYPE_CPU) {
CpuHob = Hob.Cpu;
DEBUG ((DEBUG_INFO,
" SizeOfMemorySpace=%x SizeOfIoSpace=%x\n",
CpuHob->SizeOfMemorySpace,
CpuHob->SizeOfIoSpace
));
}
}
}
VOID
DumpResourceHob (
IN VOID *HobList
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
DEBUG ((DEBUG_INFO, "Resource Descriptor HOBs\n"));
for (Hob.Raw = HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
ResourceHob = Hob.ResourceDescriptor;
DEBUG ((DEBUG_INFO,
" BA=%016lx L=%016lx Attr=%08x ",
ResourceHob->PhysicalStart,
ResourceHob->ResourceLength,
ResourceHob->ResourceAttribute
));
DEBUG ((DEBUG_INFO, ShortNameOfResourceType(ResourceHob->ResourceType)));
switch (ResourceHob->ResourceType) {
case EFI_RESOURCE_SYSTEM_MEMORY:
if ((ResourceHob->ResourceAttribute & EFI_RESOURCE_ATTRIBUTE_PERSISTENT) != 0) {
DEBUG ((DEBUG_INFO, " (Persistent)"));
} else if ((ResourceHob->ResourceAttribute & EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) != 0) {
DEBUG ((DEBUG_INFO, " (MoreReliable)"));
} else if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == TESTED_MEMORY_ATTRIBUTES) {
DEBUG ((DEBUG_INFO, " (Tested)"));
} else if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == INITIALIZED_MEMORY_ATTRIBUTES) {
DEBUG ((DEBUG_INFO, " (Init)"));
} else if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == PRESENT_MEMORY_ATTRIBUTES) {
DEBUG ((DEBUG_INFO, " (Present)"));
} else {
DEBUG ((DEBUG_INFO, " (Unknown)"));
}
break;
default:
break;
}
DEBUG ((DEBUG_INFO, "\n"));
}
}
}
VOID
DumpFvHob (
IN VOID *HobList
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_HOB_FIRMWARE_VOLUME *FirmwareVolumeHob;
EFI_HOB_FIRMWARE_VOLUME2 *FirmwareVolume2Hob;
DEBUG ((DEBUG_INFO, "FV HOBs\n"));
for (Hob.Raw = HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV) {
FirmwareVolumeHob = Hob.FirmwareVolume;
DEBUG ((DEBUG_INFO,
" BA=%016lx L=%016lx\n",
FirmwareVolumeHob->BaseAddress,
FirmwareVolumeHob->Length
));
}
}
DEBUG ((DEBUG_INFO, "FV2 HOBs\n"));
for (Hob.Raw = HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_FV2) {
FirmwareVolume2Hob = Hob.FirmwareVolume2;
DEBUG ((DEBUG_INFO,
" BA=%016lx L=%016lx Fv={%g} File={%g}\n",
FirmwareVolume2Hob->BaseAddress,
FirmwareVolume2Hob->Length,
&FirmwareVolume2Hob->FvName,
&FirmwareVolume2Hob->FileName
));
}
}
}
VOID
DumpMemoryAllocationHob (
IN VOID *HobList
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_HOB_MEMORY_ALLOCATION *MemoryHob;
DEBUG ((DEBUG_INFO, "Memory Allocation HOBs\n"));
for (Hob.Raw = HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
if (GET_HOB_TYPE(Hob) == EFI_HOB_TYPE_MEMORY_ALLOCATION) {
MemoryHob = Hob.MemoryAllocation;
DEBUG ((DEBUG_INFO,
" BA=%016lx L=%016lx ",
MemoryHob->AllocDescriptor.MemoryBaseAddress,
MemoryHob->AllocDescriptor.MemoryLength
));
DEBUG ((DEBUG_INFO, ShortNameOfMemoryType(MemoryHob->AllocDescriptor.MemoryType)));
if (!IsZeroGuid(&MemoryHob->AllocDescriptor.Name)) {
if (CompareGuid(&gEfiHobMemoryAllocStackGuid, &MemoryHob->AllocDescriptor.Name)) {
DEBUG ((DEBUG_INFO,
" {Stack}",
&MemoryHob->AllocDescriptor.Name
));
} else if (CompareGuid(&gEfiHobMemoryAllocBspStoreGuid, &MemoryHob->AllocDescriptor.Name)) {
DEBUG ((DEBUG_INFO,
" {BspStore}",
&MemoryHob->AllocDescriptor.Name
));
} else if (CompareGuid(&gEfiHobMemoryAllocModuleGuid, &MemoryHob->AllocDescriptor.Name)) {
DEBUG ((DEBUG_INFO,
" {Module=%g,Entry=0x%lx}",
&((EFI_HOB_MEMORY_ALLOCATION_MODULE *)MemoryHob)->ModuleName,
((EFI_HOB_MEMORY_ALLOCATION_MODULE *)MemoryHob)->EntryPoint
));
} else {
DEBUG ((DEBUG_INFO,
" {%g}",
&MemoryHob->AllocDescriptor.Name
));
}
}
DEBUG ((DEBUG_INFO, "\n"));
}
}
}
VOID
DumpGuidHob (
IN VOID *HobList
)
{
EFI_PEI_HOB_POINTERS Hob;
EFI_HOB_GUID_TYPE *GuidHob;
DEBUG ((DEBUG_INFO, "GUID HOBs\n"));
for (Hob.Raw = HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_GUID_EXTENSION) {
GuidHob = Hob.Guid;
DEBUG ((DEBUG_INFO,
" GUID=%g DataSize=0x%x\n",
&GuidHob->Name,
GET_GUID_HOB_DATA_SIZE(GuidHob)
));
}
}
}
VOID
TestPointDumpHob (
IN BOOLEAN PhitHobOnly
)
{
VOID *HobList;
DEBUG ((DEBUG_INFO, "==== TestPointDumpHob - Enter\n"));
//
// Get Hob list
//
HobList = GetHobList ();
DumpPhitHob (HobList);
if (PhitHobOnly) {
goto Done ;
}
DumpCpuHob (HobList);
DumpResourceHob (HobList);
DumpFvHob (HobList);
DumpMemoryAllocationHob (HobList);
DumpGuidHob (HobList);
Done:
DEBUG ((DEBUG_INFO, "==== TestPointDumpHob - Exit\n"));
return ;
}
EFI_STATUS
TestPointCheckMemoryResource (
VOID
)
{
VOID *HobList;
EFI_PEI_HOB_POINTERS Hob;
EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob;
EFI_PEI_HOB_POINTERS Hob2;
EFI_HOB_RESOURCE_DESCRIPTOR *ResourceHob2;
HobList = GetHobList ();
//
// Check overlap
//
for (Hob.Raw = HobList; !END_OF_HOB_LIST (Hob); Hob.Raw = GET_NEXT_HOB (Hob)) {
if (GET_HOB_TYPE (Hob) == EFI_HOB_TYPE_RESOURCE_DESCRIPTOR) {
ResourceHob = Hob.ResourceDescriptor;
switch (ResourceHob->ResourceType) {
case EFI_RESOURCE_SYSTEM_MEMORY:
if (((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == TESTED_MEMORY_ATTRIBUTES) ||
((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == INITIALIZED_MEMORY_ATTRIBUTES)) {
DEBUG ((DEBUG_INFO, "Overlap Checking 0x%lx 0x%lx\n", ResourceHob->PhysicalStart, ResourceHob->ResourceLength));
for (Hob2.Raw = GET_NEXT_HOB (Hob); !END_OF_HOB_LIST (Hob2); Hob2.Raw = GET_NEXT_HOB (Hob2)) {
ResourceHob2 = Hob2.ResourceDescriptor;
switch (ResourceHob2->ResourceType) {
case EFI_RESOURCE_SYSTEM_MEMORY:
if (((ResourceHob2->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == TESTED_MEMORY_ATTRIBUTES) ||
((ResourceHob2->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == INITIALIZED_MEMORY_ATTRIBUTES)) {
if ((ResourceHob->PhysicalStart >= ResourceHob2->PhysicalStart && ResourceHob->PhysicalStart < ResourceHob2->PhysicalStart + ResourceHob2->ResourceLength) ||
(ResourceHob2->PhysicalStart >= ResourceHob->PhysicalStart && ResourceHob2->PhysicalStart < ResourceHob->PhysicalStart + ResourceHob->ResourceLength)) {
DEBUG ((DEBUG_INFO, " Overlap 0x%lx 0x%lx\n", ResourceHob2->PhysicalStart, ResourceHob2->ResourceLength));
return EFI_INVALID_PARAMETER;
}
}
break;
default:
break;
}
}
}
break;
default:
break;
}
}
}
return EFI_SUCCESS;
}