\r
/**\r
Return if this memory type needs to be recorded into memory profile.\r
- If BIOS memory type (0 ~ EfiMaxMemoryType), it checks bit (1 << MemoryType).\r
- If OS memory type (0x80000000 ~ 0xFFFFFFFF), it checks bit63 - 0x8000000000000000.\r
+ Only need to record EfiRuntimeServicesCode and EfiRuntimeServicesData for SMRAM profile.\r
\r
@param MemoryType Memory type.\r
\r
{\r
UINT64 TestBit;\r
\r
- if ((UINT32) MemoryType >= 0x80000000) {\r
- TestBit = BIT63;\r
- } else {\r
- TestBit = LShiftU64 (1, MemoryType);\r
+ if (MemoryType != EfiRuntimeServicesCode &&\r
+ MemoryType != EfiRuntimeServicesData) {\r
+ return FALSE;\r
}\r
\r
+ TestBit = LShiftU64 (1, MemoryType);\r
+\r
if ((PcdGet64 (PcdMemoryProfileMemoryType) & TestBit) != 0) {\r
return TRUE;\r
} else {\r
\r
/**\r
Convert EFI memory type to profile memory index. The rule is:\r
- If BIOS memory type (0 ~ EfiMaxMemoryType), ProfileMemoryIndex = MemoryType.\r
- If OS memory type (0x80000000 ~ 0xFFFFFFFF), ProfileMemoryIndex = EfiMaxMemoryType.\r
+ If BIOS memory type (0 ~ EfiMaxMemoryType - 1), ProfileMemoryIndex = MemoryType.\r
+ As SMRAM profile is only to record EfiRuntimeServicesCode and EfiRuntimeServicesData,\r
+ so return input memory type directly.\r
\r
@param MemoryType Memory type.\r
\r
IN EFI_MEMORY_TYPE MemoryType\r
)\r
{\r
- if ((UINT32) MemoryType >= 0x80000000) {\r
- return EfiMaxMemoryType;\r
- } else {\r
- return MemoryType;\r
- }\r
+ return MemoryType;\r
}\r
\r
/**\r
L"FreePool",\r
};\r
\r
-GLOBAL_REMOVE_IF_UNREFERENCED CHAR16 *mMemoryTypeString[] = {\r
- L"EfiReservedMemoryType",\r
- L"EfiLoaderCode",\r
- L"EfiLoaderData",\r
- L"EfiBootServicesCode",\r
- L"EfiBootServicesData",\r
- L"EfiRuntimeServicesCode",\r
- L"EfiRuntimeServicesData",\r
- L"EfiConventionalMemory",\r
- L"EfiUnusableMemory",\r
- L"EfiACPIReclaimMemory",\r
- L"EfiACPIMemoryNVS",\r
- L"EfiMemoryMappedIO",\r
- L"EfiMemoryMappedIOPortSpace",\r
- L"EfiPalCode",\r
- L"EfiPersistentMemory",\r
- L"EfiOSReserved",\r
+typedef struct {\r
+ EFI_MEMORY_TYPE MemoryType;\r
+ CHAR16 *MemoryTypeStr;\r
+} PROFILE_MEMORY_TYPE_STRING;\r
+\r
+GLOBAL_REMOVE_IF_UNREFERENCED PROFILE_MEMORY_TYPE_STRING mMemoryTypeString[] = {\r
+ {EfiRuntimeServicesCode, L"EfiRuntimeServicesCode"},\r
+ {EfiRuntimeServicesData, L"EfiRuntimeServicesData"}\r
};\r
\r
+/**\r
+ Memory type to string.\r
+\r
+ @param[in] MemoryType Memory type.\r
+\r
+ @return Pointer to string.\r
+\r
+**/\r
+CHAR16 *\r
+ProfileMemoryTypeToStr (\r
+ IN EFI_MEMORY_TYPE MemoryType\r
+ )\r
+{\r
+ UINTN Index;\r
+ for (Index = 0; Index < sizeof (mMemoryTypeString) / sizeof (mMemoryTypeString[0]); Index++) {\r
+ if (mMemoryTypeString[Index].MemoryType == MemoryType) {\r
+ return mMemoryTypeString[Index].MemoryTypeStr;\r
+ }\r
+ }\r
+\r
+ return L"UnexpectedMemoryType";\r
+}\r
\r
/**\r
Dump SMRAM profile.\r
\r
DEBUG ((EFI_D_INFO, " CurrentTotalUsage - 0x%016lx\n", Context->CurrentTotalUsage));\r
DEBUG ((EFI_D_INFO, " PeakTotalUsage - 0x%016lx\n", Context->PeakTotalUsage));\r
- for (TypeIndex = 0; TypeIndex <= EfiMaxMemoryType; TypeIndex++) {\r
+ for (TypeIndex = 0; TypeIndex < sizeof (Context->CurrentTotalUsageByType) / sizeof (Context->CurrentTotalUsageByType[0]); TypeIndex++) {\r
if ((Context->CurrentTotalUsageByType[TypeIndex] != 0) ||\r
(Context->PeakTotalUsageByType[TypeIndex] != 0)) {\r
- DEBUG ((EFI_D_INFO, " CurrentTotalUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, Context->CurrentTotalUsageByType[TypeIndex], mMemoryTypeString[TypeIndex]));\r
- DEBUG ((EFI_D_INFO, " PeakTotalUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, Context->PeakTotalUsageByType[TypeIndex], mMemoryTypeString[TypeIndex]));\r
+ DEBUG ((EFI_D_INFO, " CurrentTotalUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, Context->CurrentTotalUsageByType[TypeIndex], ProfileMemoryTypeToStr (TypeIndex)));\r
+ DEBUG ((EFI_D_INFO, " PeakTotalUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, Context->PeakTotalUsageByType[TypeIndex], ProfileMemoryTypeToStr (TypeIndex)));\r
}\r
}\r
DEBUG ((EFI_D_INFO, " TotalImageSize - 0x%016lx\n", Context->TotalImageSize));\r
DEBUG ((EFI_D_INFO, " FileType - 0x%02x\n", DriverInfo->FileType));\r
DEBUG ((EFI_D_INFO, " CurrentUsage - 0x%016lx\n", DriverInfo->CurrentUsage));\r
DEBUG ((EFI_D_INFO, " PeakUsage - 0x%016lx\n", DriverInfo->PeakUsage));\r
- for (TypeIndex = 0; TypeIndex <= EfiMaxMemoryType; TypeIndex++) {\r
+ for (TypeIndex = 0; TypeIndex < sizeof (DriverInfo->CurrentUsageByType) / sizeof (DriverInfo->CurrentUsageByType[0]); TypeIndex++) {\r
if ((DriverInfo->CurrentUsageByType[TypeIndex] != 0) ||\r
(DriverInfo->PeakUsageByType[TypeIndex] != 0)) {\r
- DEBUG ((EFI_D_INFO, " CurrentUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, DriverInfo->CurrentUsageByType[TypeIndex], mMemoryTypeString[TypeIndex]));\r
- DEBUG ((EFI_D_INFO, " PeakUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, DriverInfo->PeakUsageByType[TypeIndex], mMemoryTypeString[TypeIndex]));\r
+ DEBUG ((EFI_D_INFO, " CurrentUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, DriverInfo->CurrentUsageByType[TypeIndex], ProfileMemoryTypeToStr (TypeIndex)));\r
+ DEBUG ((EFI_D_INFO, " PeakUsage[0x%02x] - 0x%016lx (%s)\n", TypeIndex, DriverInfo->PeakUsageByType[TypeIndex], ProfileMemoryTypeToStr (TypeIndex)));\r
}\r
}\r
DEBUG ((EFI_D_INFO, " AllocRecordCount - 0x%08x\n", DriverInfo->AllocRecordCount));\r