summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/soc/amd/common/block/pi/heapmanager.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/src/soc/amd/common/block/pi/heapmanager.c b/src/soc/amd/common/block/pi/heapmanager.c
index cea3171aa5..862ba3d524 100644
--- a/src/soc/amd/common/block/pi/heapmanager.c
+++ b/src/soc/amd/common/block/pi/heapmanager.c
@@ -77,8 +77,8 @@ AGESA_STATUS agesa_AllocateBuffer (UINT32 Func, UINTN Data, VOID *ConfigPtr)
FreedNodePtr = (BIOS_BUFFER_NODE *)(BiosHeapBaseAddr
+ FreedNodeOffset);
FreedNodePtr->BufferSize = AvailableHeapSize
- - sizeof(BIOS_BUFFER_NODE)
- - CurrNodePtr->BufferSize;
+ - (FreedNodeOffset - CurrNodeOffset)
+ - sizeof(BIOS_BUFFER_NODE);
FreedNodePtr->NextNodeOffset = 0;
/* Update the offsets for Allocated and Freed nodes */
@@ -250,13 +250,13 @@ AGESA_STATUS agesa_DeallocateBuffer (UINT32 Func, UINTN Data, VOID *ConfigPtr)
memset((UINT8 *)AllocNodePtr + sizeof(BIOS_BUFFER_NODE), 0,
AllocNodePtr->BufferSize);
AllocNodePtr->BufferHandle = 0;
- AllocNodePtr->BufferSize += sizeof(BIOS_BUFFER_NODE);
/* Add deallocated node in order to the list of freed nodes */
FreedNodeOffset = BiosHeapBasePtr->StartOfFreedNodes;
FreedNodePtr = (BIOS_BUFFER_NODE *)(BiosHeapBaseAddr + FreedNodeOffset);
- EndNodeOffset = AllocNodeOffset + AllocNodePtr->BufferSize;
+ EndNodeOffset = AllocNodeOffset + AllocNodePtr->BufferSize +
+ sizeof(BIOS_BUFFER_NODE);
if (AllocNodeOffset < FreedNodeOffset) {
/* Add to the start of the freed list */
@@ -264,16 +264,14 @@ AGESA_STATUS agesa_DeallocateBuffer (UINT32 Func, UINTN Data, VOID *ConfigPtr)
/* If the freed node is adjacent to the first node in
* the list, concatenate both nodes
*/
- AllocNodePtr->BufferSize += FreedNodePtr->BufferSize;
+ AllocNodePtr->BufferSize += FreedNodePtr->BufferSize +
+ sizeof(BIOS_BUFFER_NODE);
AllocNodePtr->NextNodeOffset =
FreedNodePtr->NextNodeOffset;
- /* Clear the BufferSize and NextNodeOffset of the
- * previous first node
- */
- FreedNodePtr->BufferSize = 0;
- FreedNodePtr->NextNodeOffset = 0;
-
+ /* Zero out the FreedNode header */
+ memset((UINT8 *)FreedNodePtr, 0,
+ sizeof(BIOS_BUFFER_NODE));
} else {
/* Otherwise, add freed node to the start of the list
* Update NextNodeOffset and BufferSize to include the
@@ -304,12 +302,14 @@ AGESA_STATUS agesa_DeallocateBuffer (UINT32 Func, UINTN Data, VOID *ConfigPtr)
if (NextNodeOffset == EndNodeOffset) {
NextNodePtr = (BIOS_BUFFER_NODE *)(BiosHeapBaseAddr
+ NextNodeOffset);
- AllocNodePtr->BufferSize += NextNodePtr->BufferSize;
+ AllocNodePtr->BufferSize += NextNodePtr->BufferSize +
+ sizeof(BIOS_BUFFER_NODE);
AllocNodePtr->NextNodeOffset =
NextNodePtr->NextNodeOffset;
- NextNodePtr->BufferSize = 0;
- NextNodePtr->NextNodeOffset = 0;
+ /* Zero out the NextNode header */
+ memset((UINT8 *)NextNodePtr, 0,
+ sizeof(BIOS_BUFFER_NODE));
} else {
/*AllocNodePtr->NextNodeOffset =
* FreedNodePtr->NextNodeOffset; */
@@ -321,14 +321,18 @@ AGESA_STATUS agesa_DeallocateBuffer (UINT32 Func, UINTN Data, VOID *ConfigPtr)
*/
PrevNodePtr = (BIOS_BUFFER_NODE *)(BiosHeapBaseAddr
+ PrevNodeOffset);
- EndNodeOffset = PrevNodeOffset + PrevNodePtr->BufferSize;
+ EndNodeOffset = PrevNodeOffset + PrevNodePtr->BufferSize +
+ sizeof(BIOS_BUFFER_NODE);
+
if (AllocNodeOffset == EndNodeOffset) {
PrevNodePtr->NextNodeOffset =
AllocNodePtr->NextNodeOffset;
- PrevNodePtr->BufferSize += AllocNodePtr->BufferSize;
+ PrevNodePtr->BufferSize += AllocNodePtr->BufferSize +
+ sizeof(BIOS_BUFFER_NODE);
- AllocNodePtr->BufferSize = 0;
- AllocNodePtr->NextNodeOffset = 0;
+ /* Zero out the AllocNode header */
+ memset((UINT8 *)AllocNodePtr, 0,
+ sizeof(BIOS_BUFFER_NODE));
} else {
PrevNodePtr->NextNodeOffset = AllocNodeOffset;
}