Profile Max Used Heap size at runtime

This records the maximum usage of heap at runtime. The Stage1/2 heap
sometimes reaches OUT OF RESOURCE even if it looks there is enough
usable space in the heap. This is because AllocateTemporaryMemory()
sometime exceeds the heap boundary. ex) IppCryptoLib
This would help identify proper heap size required in each stages.

Signed-off-by: Aiden Park <aiden.park@intel.com>
This commit is contained in:
Aiden Park 2021-10-22 15:58:53 -07:00 committed by Maurice Ma
parent 449309ff75
commit 18d16d44ff
5 changed files with 24 additions and 5 deletions

View File

@ -215,6 +215,7 @@ typedef struct {
BL_PERF_DATA PerfData;
UINT32 CarBase;
UINT32 CarSize;
UINT32 MemPoolMaxUsed;
} LOADER_GLOBAL_DATA;
/**

View File

@ -27,8 +27,14 @@ InternalUpdateMemPoolTop (
)
{
LOADER_GLOBAL_DATA *LdrGlobal;
UINT32 PoolUsed;
LdrGlobal = GetLoaderGlobalDataPointer();
PoolUsed = (LdrGlobal->MemPoolEnd - Top) +
(LdrGlobal->MemPoolCurrBottom - LdrGlobal->MemPoolStart);
if (LdrGlobal->MemPoolMaxUsed < PoolUsed) {
LdrGlobal->MemPoolMaxUsed = PoolUsed;
}
ASSERT (Top >= LdrGlobal->MemPoolCurrBottom);
LdrGlobal->MemPoolCurrTop = Top;
}
@ -44,8 +50,14 @@ InternalUpdateMemPoolBottom (
)
{
LOADER_GLOBAL_DATA *LdrGlobal;
UINT32 PoolUsed;
LdrGlobal = GetLoaderGlobalDataPointer();
PoolUsed = (LdrGlobal->MemPoolEnd - LdrGlobal->MemPoolCurrTop) +
(Bottom - LdrGlobal->MemPoolStart);
if (LdrGlobal->MemPoolMaxUsed < PoolUsed) {
LdrGlobal->MemPoolMaxUsed = PoolUsed;
}
ASSERT (LdrGlobal->MemPoolCurrTop >= Bottom);
LdrGlobal->MemPoolCurrBottom = Bottom;
}

View File

@ -463,6 +463,7 @@ SecStartup (
LdrGlobal->MemPoolStart = StackTop;
LdrGlobal->MemPoolCurrTop = LdrGlobal->MemPoolEnd;
LdrGlobal->MemPoolCurrBottom = LdrGlobal->MemPoolStart;
LdrGlobal->MemPoolMaxUsed = 0;
LdrGlobal->DebugPrintErrorLevel = 0;
LdrGlobal->PerfData.PerfIndex = 2;
LdrGlobal->PerfData.FreqKhz = GetTimeStampFrequency ();

View File

@ -446,6 +446,7 @@ SecStartup2 (
LdrGlobal->MemPoolStart = MemPoolStart;
LdrGlobal->MemPoolCurrTop = MemPoolCurrTop;
LdrGlobal->MemPoolCurrBottom = MemPoolStart;
LdrGlobal->MemPoolMaxUsed = 0;
LdrGlobal->MemUsableTop = (UINT32)(FspReservedMemBase + FspReservedMemSize);
if (FeaturePcdGet (PcdDmaProtectionEnabled)) {
@ -644,9 +645,11 @@ ContinueFunc (
));
DEBUG ((
DEBUG_INFO,
"Stage1 heap: 0x%X (0x%X used)\n",
"Stage1 heap: 0x%X (0x%X used, 0x%x max used)\n",
PcdGet32 (PcdStage1DataSize),
OldLdrGlobal->MemPoolEnd - OldLdrGlobal->MemPoolCurrTop
(OldLdrGlobal->MemPoolEnd - OldLdrGlobal->MemPoolCurrTop) +
(OldLdrGlobal->MemPoolCurrBottom - OldLdrGlobal->MemPoolStart),
OldLdrGlobal->MemPoolMaxUsed
));
DEBUG_CODE_END ();

View File

@ -136,10 +136,12 @@ PrintStackHeapInfo (
DEBUG ((
DEBUG_INFO,
"Stage2 heap: 0x%X (0x%X used, 0x%X free)\n",
"Stage2 heap: 0x%X (0x%X used, 0x%X free, 0x%x max used)\n",
LdrGlobal->MemPoolEnd - LdrGlobal->MemPoolStart,
LdrGlobal->MemPoolEnd - LdrGlobal->MemPoolCurrTop,
LdrGlobal->MemPoolCurrTop - LdrGlobal->MemPoolStart
(LdrGlobal->MemPoolEnd - LdrGlobal->MemPoolCurrTop) +
(LdrGlobal->MemPoolCurrBottom - LdrGlobal->MemPoolStart),
LdrGlobal->MemPoolCurrTop - LdrGlobal->MemPoolCurrBottom,
LdrGlobal->MemPoolMaxUsed
));
}