]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Mem/Page.c
MdeModulePkg: Add New Memory Attributes
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Mem / Page.c
index bd9e116aa59cb620045c8fbc2a9278d130da990e..2c2c9cd6c334ecaf3b143611f3793fa111699b5e 100644 (file)
@@ -1265,12 +1265,13 @@ CoreInternalAllocatePages (
   IN BOOLEAN                NeedGuard\r
   )\r
 {\r
-  EFI_STATUS      Status;\r
-  UINT64          Start;\r
-  UINT64          NumberOfBytes;\r
-  UINT64          End;\r
-  UINT64          MaxAddress;\r
-  UINTN           Alignment;\r
+  EFI_STATUS       Status;\r
+  UINT64           Start;\r
+  UINT64           NumberOfBytes;\r
+  UINT64           End;\r
+  UINT64           MaxAddress;\r
+  UINTN            Alignment;\r
+  EFI_MEMORY_TYPE  CheckType;\r
 \r
   if ((UINT32)Type >= MaxAllocateType) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -1321,6 +1322,7 @@ CoreInternalAllocatePages (
   // if (Start + NumberOfBytes) rolls over 0 or\r
   // if Start is above MAX_ALLOC_ADDRESS or\r
   // if End is above MAX_ALLOC_ADDRESS,\r
+  // if Start..End overlaps any tracked MemoryTypeStatistics range\r
   // return EFI_NOT_FOUND.\r
   //\r
   if (Type == AllocateAddress) {\r
@@ -1336,6 +1338,33 @@ CoreInternalAllocatePages (
         (End > MaxAddress)) {\r
       return EFI_NOT_FOUND;\r
     }\r
+\r
+    //\r
+    // A driver is allowed to call AllocatePages using an AllocateAddress type.  This type of\r
+    // AllocatePage request the exact physical address if it is not used.  The existing code\r
+    // will allow this request even in 'special' pages.  The problem with this is that the\r
+    // reason to have 'special' pages for OS hibernate/resume is defeated as memory is\r
+    // fragmented.\r
+    //\r
+\r
+    for (CheckType = (EFI_MEMORY_TYPE) 0; CheckType < EfiMaxMemoryType; CheckType++) {\r
+      if (MemoryType != CheckType &&\r
+          mMemoryTypeStatistics[CheckType].Special &&\r
+          mMemoryTypeStatistics[CheckType].NumberOfPages > 0) {\r
+        if (Start >= mMemoryTypeStatistics[CheckType].BaseAddress &&\r
+            Start <= mMemoryTypeStatistics[CheckType].MaximumAddress) {\r
+          return EFI_NOT_FOUND;\r
+        }\r
+        if (End >= mMemoryTypeStatistics[CheckType].BaseAddress &&\r
+            End <= mMemoryTypeStatistics[CheckType].MaximumAddress) {\r
+          return EFI_NOT_FOUND;\r
+        }\r
+        if (Start < mMemoryTypeStatistics[CheckType].BaseAddress &&\r
+            End   > mMemoryTypeStatistics[CheckType].MaximumAddress) {\r
+          return EFI_NOT_FOUND;\r
+        }\r
+      }\r
+    }\r
   }\r
 \r
   if (Type == AllocateMaxAddress) {\r
@@ -1828,8 +1857,7 @@ CoreGetMemoryMap (
       MemoryMap->VirtualStart  = 0;\r
       MemoryMap->NumberOfPages = RShiftU64 ((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1), EFI_PAGE_SHIFT);\r
       MemoryMap->Attribute     = (MergeGcdMapEntry.Attributes & ~EFI_MEMORY_PORT_IO) |\r
-                                (MergeGcdMapEntry.Capabilities & (EFI_MEMORY_RP | EFI_MEMORY_WP | EFI_MEMORY_XP | EFI_MEMORY_RO |\r
-                                EFI_MEMORY_UC | EFI_MEMORY_UCE | EFI_MEMORY_WC | EFI_MEMORY_WT | EFI_MEMORY_WB));\r
+                                (MergeGcdMapEntry.Capabilities & (EFI_CACHE_ATTRIBUTE_MASK | EFI_MEMORY_ATTRIBUTE_MASK));\r
 \r
       if (MergeGcdMapEntry.GcdMemoryType == EfiGcdMemoryTypeReserved) {\r
         MemoryMap->Type = EfiReservedMemoryType;\r
@@ -1863,8 +1891,7 @@ CoreGetMemoryMap (
       MemoryMap->VirtualStart  = 0;\r
       MemoryMap->NumberOfPages = RShiftU64 ((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1), EFI_PAGE_SHIFT);\r
       MemoryMap->Attribute     = MergeGcdMapEntry.Attributes | EFI_MEMORY_NV |\r
-                                (MergeGcdMapEntry.Capabilities & (EFI_MEMORY_RP | EFI_MEMORY_WP | EFI_MEMORY_XP | EFI_MEMORY_RO |\r
-                                EFI_MEMORY_UC | EFI_MEMORY_UCE | EFI_MEMORY_WC | EFI_MEMORY_WT | EFI_MEMORY_WB));\r
+                                (MergeGcdMapEntry.Capabilities & (EFI_CACHE_ATTRIBUTE_MASK | EFI_MEMORY_ATTRIBUTE_MASK));\r
       MemoryMap->Type          = EfiPersistentMemory;\r
 \r
       //\r
@@ -1906,8 +1933,7 @@ CoreGetMemoryMap (
   MemoryMapEnd = MemoryMap;\r
   MemoryMap = MemoryMapStart;\r
   while (MemoryMap < MemoryMapEnd) {\r
-    MemoryMap->Attribute &= ~(UINT64)(EFI_MEMORY_RP | EFI_MEMORY_RO |\r
-                                      EFI_MEMORY_XP);\r
+    MemoryMap->Attribute &= ~(UINT64)EFI_MEMORY_ATTRIBUTE_MASK;\r
     MemoryMap = NEXT_MEMORY_DESCRIPTOR (MemoryMap, Size);\r
   }\r
   MergeMemoryMap (MemoryMapStart, &BufferSize, Size);\r