]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Mem/Page.c
MdeModulePkg/Core: add freed-memory guard feature
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Mem / Page.c
index 3b4cc08e7cec9d60454540443635994440fd26d4..961c5b833546b73a13d7e12511874d7681f09fd4 100644 (file)
@@ -401,9 +401,12 @@ PromoteMemoryResource (
   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
@@ -451,6 +454,24 @@ PromoteMemoryResource (
 \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
@@ -896,9 +917,15 @@ CoreConvertPagesEx (
     }\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
@@ -1514,6 +1541,7 @@ CoreFreePages (
 \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
@@ -1908,9 +1936,7 @@ Done:
   *MemoryMapSize = BufferSize;\r
 \r
   DEBUG_CODE (\r
-    if (PcdGet8 (PcdHeapGuardPropertyMask) & (BIT1|BIT0)) {\r
-      DumpGuardedMemoryBitmap ();\r
-    }\r
+    DumpGuardedMemoryBitmap ();\r
   );\r
 \r
   return Status;\r