]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg: Update Dxe to handle unaccepted memory type
authorMin M Xu <min.m.xu@intel.com>
Tue, 1 Nov 2022 05:13:44 +0000 (13:13 +0800)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Tue, 1 Nov 2022 10:08:10 +0000 (10:08 +0000)
RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3937

Unaccepted memory is a kind of new memory type,
CoreInitializeGcdServices() and CoreGetMemoryMap() are updated to handle
the unaccepted memory type.

Ref: microsoft/mu_basecore@97e9c31

Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Ray Ni <ray.ni@intel.com>
Cc: Erdem Aktas <erdemaktas@google.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
Signed-off-by: Min Xu <min.m.xu@intel.com>
MdeModulePkg/Core/Dxe/Gcd/Gcd.c
MdeModulePkg/Core/Dxe/Mem/Page.c

index 3763467bdbc0f9c51406301094840cbede7efa6e..792cd2e0af231e3963b59ff034b80996276edb00 100644 (file)
@@ -8,6 +8,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 \r
 **/\r
 \r
+#include <Pi/PrePiDxeCis.h>\r
+#include <Pi/PrePiHob.h>\r
 #include "DxeMain.h"\r
 #include "Gcd.h"\r
 #include "Mem/HeapGuard.h"\r
@@ -103,6 +105,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8  *mGcdMemoryTypeNames[] = {
   "MMIO     ",  // EfiGcdMemoryTypeMemoryMappedIo\r
   "PersisMem",  // EfiGcdMemoryTypePersistent\r
   "MoreRelia",  // EfiGcdMemoryTypeMoreReliable\r
+  "Unaccepte",  // EFI_GCD_MEMORY_TYPE_UNACCEPTED\r
   "Unknown  "   // EfiGcdMemoryTypeMaximum\r
 };\r
 \r
@@ -2600,6 +2603,9 @@ CoreInitializeGcdServices (
         case EFI_RESOURCE_MEMORY_RESERVED:\r
           GcdMemoryType = EfiGcdMemoryTypeReserved;\r
           break;\r
+        case BZ3937_EFI_RESOURCE_MEMORY_UNACCEPTED:\r
+          GcdMemoryType = EFI_GCD_MEMORY_TYPE_UNACCEPTED;\r
+          break;\r
         case EFI_RESOURCE_IO:\r
           GcdIoType = EfiGcdIoTypeIo;\r
           break;\r
index cc0b90ac0df53e35b2c58db57e55c4a51cb65c1c..160289c1f9ecc80dd054654746e9a611668c8793 100644 (file)
@@ -9,6 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include "DxeMain.h"\r
 #include "Imem.h"\r
 #include "HeapGuard.h"\r
+#include <Pi/PrePiDxeCis.h>\r
 \r
 //\r
 // Entry for tracking the memory regions for each memory type to coalesce similar memory types\r
@@ -61,6 +62,7 @@ EFI_MEMORY_TYPE_STATISTICS  mMemoryTypeStatistics[EfiMaxMemoryType + 1] = {
   { 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE },  // EfiMemoryMappedIOPortSpace\r
   { 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, TRUE,  TRUE  },  // EfiPalCode\r
   { 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE },  // EfiPersistentMemory\r
+  { 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, TRUE,  FALSE },  // EfiUnacceptedMemoryType\r
   { 0, MAX_ALLOC_ADDRESS, 0, 0, EfiMaxMemoryType, FALSE, FALSE }   // EfiMaxMemoryType\r
 };\r
 \r
@@ -68,22 +70,23 @@ EFI_PHYSICAL_ADDRESS  mDefaultMaximumAddress = MAX_ALLOC_ADDRESS;
 EFI_PHYSICAL_ADDRESS  mDefaultBaseAddress    = MAX_ALLOC_ADDRESS;\r
 \r
 EFI_MEMORY_TYPE_INFORMATION  gMemoryTypeInformation[EfiMaxMemoryType + 1] = {\r
-  { EfiReservedMemoryType,      0 },\r
-  { EfiLoaderCode,              0 },\r
-  { EfiLoaderData,              0 },\r
-  { EfiBootServicesCode,        0 },\r
-  { EfiBootServicesData,        0 },\r
-  { EfiRuntimeServicesCode,     0 },\r
-  { EfiRuntimeServicesData,     0 },\r
-  { EfiConventionalMemory,      0 },\r
-  { EfiUnusableMemory,          0 },\r
-  { EfiACPIReclaimMemory,       0 },\r
-  { EfiACPIMemoryNVS,           0 },\r
-  { EfiMemoryMappedIO,          0 },\r
-  { EfiMemoryMappedIOPortSpace, 0 },\r
-  { EfiPalCode,                 0 },\r
-  { EfiPersistentMemory,        0 },\r
-  { EfiMaxMemoryType,           0 }\r
+  { EfiReservedMemoryType,          0 },\r
+  { EfiLoaderCode,                  0 },\r
+  { EfiLoaderData,                  0 },\r
+  { EfiBootServicesCode,            0 },\r
+  { EfiBootServicesData,            0 },\r
+  { EfiRuntimeServicesCode,         0 },\r
+  { EfiRuntimeServicesData,         0 },\r
+  { EfiConventionalMemory,          0 },\r
+  { EfiUnusableMemory,              0 },\r
+  { EfiACPIReclaimMemory,           0 },\r
+  { EfiACPIMemoryNVS,               0 },\r
+  { EfiMemoryMappedIO,              0 },\r
+  { EfiMemoryMappedIOPortSpace,     0 },\r
+  { EfiPalCode,                     0 },\r
+  { EfiPersistentMemory,            0 },\r
+  { EFI_GCD_MEMORY_TYPE_UNACCEPTED, 0 },\r
+  { EfiMaxMemoryType,               0 }\r
 };\r
 //\r
 // Only used when load module at fixed address feature is enabled. True means the memory is alreay successfully allocated\r
@@ -1286,7 +1289,7 @@ CoreInternalAllocatePages (
   }\r
 \r
   if (((MemoryType >= EfiMaxMemoryType) && (MemoryType < MEMORY_TYPE_OEM_RESERVED_MIN)) ||\r
-      (MemoryType == EfiConventionalMemory) || (MemoryType == EfiPersistentMemory))\r
+      (MemoryType == EfiConventionalMemory) || (MemoryType == EfiPersistentMemory) || (MemoryType == EfiUnacceptedMemoryType))\r
   {\r
     return EFI_INVALID_PARAMETER;\r
   }\r
@@ -1961,6 +1964,32 @@ CoreGetMemoryMap (
       MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size);\r
     }\r
 \r
+    if (MergeGcdMapEntry.GcdMemoryType == EFI_GCD_MEMORY_TYPE_UNACCEPTED) {\r
+      //\r
+      // Page Align GCD range is required. When it is converted to EFI_MEMORY_DESCRIPTOR,\r
+      // it will be recorded as page PhysicalStart and NumberOfPages.\r
+      //\r
+      ASSERT ((MergeGcdMapEntry.BaseAddress & EFI_PAGE_MASK) == 0);\r
+      ASSERT (((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1) & EFI_PAGE_MASK) == 0);\r
+\r
+      //\r
+      // Create EFI_MEMORY_DESCRIPTOR for every Unaccepted GCD entries\r
+      //\r
+      MemoryMap->PhysicalStart = MergeGcdMapEntry.BaseAddress;\r
+      MemoryMap->VirtualStart  = 0;\r
+      MemoryMap->NumberOfPages = RShiftU64 ((MergeGcdMapEntry.EndAddress - MergeGcdMapEntry.BaseAddress + 1), EFI_PAGE_SHIFT);\r
+      MemoryMap->Attribute     = MergeGcdMapEntry.Attributes |\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
+      MemoryMap->Type = EfiUnacceptedMemoryType;\r
+\r
+      //\r
+      // Check to see if the new Memory Map Descriptor can be merged with an\r
+      // existing descriptor if they are adjacent and have the same attributes\r
+      //\r
+      MemoryMap = MergeMemoryMapDescriptor (MemoryMapStart, MemoryMap, Size);\r
+    }\r
+\r
     if (Link == &mGcdMemorySpaceMap) {\r
       //\r
       // break loop when arrive at head.\r