From 38c7df9848811c2a6e6ed11fd78ba0e19215e77c Mon Sep 17 00:00:00 2001 From: jgong5 Date: Sat, 3 Apr 2010 05:34:16 +0000 Subject: [PATCH] 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 --- MdeModulePkg/Core/Dxe/Mem/Page.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c index b0cf1ece1e..9a78698df9 100644 --- a/MdeModulePkg/Core/Dxe/Mem/Page.c +++ b/MdeModulePkg/Core/Dxe/Mem/Page.c @@ -1,7 +1,7 @@ /** @file UEFI Memory page management functions. -Copyright (c) 2007 - 2008, Intel Corporation.
+Copyright (c) 2007 - 2010, Intel Corporation.
All rights reserved. This program and the accompanying materials 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 @@ -829,6 +829,9 @@ CoreConvertPages ( // Add our new range in // 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 @@ -1198,13 +1201,6 @@ CoreFreePages ( goto Done; } - // - // Destroy the contents - // - if (Memory < MAX_ADDRESS) { - DEBUG_CLEAR_MEMORY ((VOID *)(UINTN)Memory, NumberOfPages << EFI_PAGE_SHIFT); - } - Done: CoreReleaseMemoryLock (); return Status;