VOID\r
)\r
{\r
- LIST_ENTRY *Link;\r
- EFI_GCD_MAP_ENTRY *Entry;\r
- BOOLEAN Promoted;\r
+ LIST_ENTRY *Link;\r
+ EFI_GCD_MAP_ENTRY *Entry;\r
+ BOOLEAN Promoted;\r
+ EFI_PHYSICAL_ADDRESS StartAddress;\r
+ EFI_PHYSICAL_ADDRESS EndAddress;\r
+ EFI_GCD_MEMORY_SPACE_DESCRIPTOR Descriptor;\r
\r
DEBUG ((DEBUG_PAGE, "Promote the memory resource\n"));\r
\r
\r
CoreReleaseGcdMemoryLock ();\r
\r
+ if (!Promoted) {\r
+ //\r
+ // If freed-memory guard is enabled, we could promote pages from\r
+ // guarded free pages.\r
+ //\r
+ Promoted = PromoteGuardedFreePages (&StartAddress, &EndAddress);\r
+ if (Promoted) {\r
+ CoreGetMemorySpaceDescriptor (StartAddress, &Descriptor);\r
+ CoreAddRange (\r
+ EfiConventionalMemory,\r
+ StartAddress,\r
+ EndAddress,\r
+ Descriptor.Capabilities & ~(EFI_MEMORY_PRESENT | EFI_MEMORY_INITIALIZED |\r
+ EFI_MEMORY_TESTED | EFI_MEMORY_RUNTIME)\r
+ );\r
+ }\r
+ }\r
+\r
return Promoted;\r
}\r
/**\r
}\r
\r
//\r
- // Add our new range in\r
+ // Add our new range in. Don't do this for freed pages if freed-memory\r
+ // guard is enabled.\r
//\r
- CoreAddRange (MemType, Start, RangeEnd, Attribute);\r
+ if (!IsHeapGuardEnabled (GUARD_HEAP_TYPE_FREED) ||\r
+ !ChangingType ||\r
+ MemType != EfiConventionalMemory) {\r
+ CoreAddRange (MemType, Start, RangeEnd, Attribute);\r
+ }\r
+\r
if (ChangingType && (MemType == EfiConventionalMemory)) {\r
//\r
// Avoid calling DEBUG_CLEAR_MEMORY() for an address of 0 because this\r
\r
Status = CoreInternalFreePages (Memory, NumberOfPages, &MemoryType);\r
if (!EFI_ERROR (Status)) {\r
+ GuardFreedPagesChecked (Memory, NumberOfPages);\r
CoreUpdateProfile (\r
(EFI_PHYSICAL_ADDRESS) (UINTN) RETURN_ADDRESS (0),\r
MemoryProfileActionFreePages,\r
*MemoryMapSize = BufferSize;\r
\r
DEBUG_CODE (\r
- if (PcdGet8 (PcdHeapGuardPropertyMask) & (BIT1|BIT0)) {\r
- DumpGuardedMemoryBitmap ();\r
- }\r
+ DumpGuardedMemoryBitmap ();\r
);\r
\r
return Status;\r