Avoid DEBUG_CLEAR_MEMORY clearing MemoryMap internal structure.

In CoreFreePages(), the following sequence might break the MemoryMap internal structure:
CoreConvertPages() -> CoreFreeMemoryMapStack() -> AllocateMemoryMapEntry() -> CoreAllocatePoolPages() -> DEBUG_CLEAR_MEMORY()

CoreConvertPages() will call CoreFreeMemoryMapStack() after it adds the freed memory range, so the latter might use the just freed memory range when calling AllocateMemoryMapEntry(). But CoreFreePages() will call DEBUG_CLEAR_MEMORY() after CoreConvertPages(). This might clear up the memory map entry structure.

The fix calls DEBUG_CLEAR_MEMORY() just after freed memory range is added in CoreConvertPages(), which is safe.


git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10335 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
jgong5 2010-04-03 05:34:16 +00:00
parent 969eba7b0d
commit 38c7df9848
1 changed files with 4 additions and 8 deletions

View File

@ -1,7 +1,7 @@
/** @file /** @file
UEFI Memory page management functions. UEFI Memory page management functions.
Copyright (c) 2007 - 2008, Intel Corporation. <BR> Copyright (c) 2007 - 2010, Intel Corporation. <BR>
All rights reserved. This program and the accompanying materials All rights reserved. This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at which accompanies this distribution. The full text of the license may be found at
@ -829,6 +829,9 @@ CoreConvertPages (
// Add our new range in // Add our new range in
// //
CoreAddRange (NewType, Start, RangeEnd, Attribute); CoreAddRange (NewType, Start, RangeEnd, Attribute);
if (NewType == EfiConventionalMemory) {
DEBUG_CLEAR_MEMORY ((VOID *)(UINTN)Start, RangeEnd - Start + 1);
}
// //
// Move any map descriptor stack to general pool // Move any map descriptor stack to general pool
@ -1198,13 +1201,6 @@ CoreFreePages (
goto Done; goto Done;
} }
//
// Destroy the contents
//
if (Memory < MAX_ADDRESS) {
DEBUG_CLEAR_MEMORY ((VOID *)(UINTN)Memory, NumberOfPages << EFI_PAGE_SHIFT);
}
Done: Done:
CoreReleaseMemoryLock (); CoreReleaseMemoryLock ();
return Status; return Status;