Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <[email protected]>
Reviewed-by: Liming Gao <[email protected]>
---
 MdeModulePkg/Core/Dxe/Gcd/Gcd.c  | 78 ++++++++++++++++++++++++----------------
 MdeModulePkg/Core/Dxe/Mem/Page.c |  6 +++-
 2 files changed, 53 insertions(+), 31 deletions(-)

diff --git a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c
index bce01a0..6f4e810 100644
--- a/MdeModulePkg/Core/Dxe/Gcd/Gcd.c
+++ b/MdeModulePkg/Core/Dxe/Gcd/Gcd.c
@@ -82,19 +82,20 @@ EFI_GCD_MAP_ENTRY mGcdIoSpaceMapEntryTemplate = {
 };
 
 GCD_ATTRIBUTE_CONVERSION_ENTRY mAttributeConversionTable[] = {
-  { EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,             EFI_MEMORY_UC,          
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED,       EFI_MEMORY_UCE,         
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE,       EFI_MEMORY_WC,          
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE, EFI_MEMORY_WT,          
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE,    EFI_MEMORY_WB,          
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE,        EFI_MEMORY_RP,          
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE,       EFI_MEMORY_WP,          
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE,   EFI_MEMORY_XP,          
TRUE  },
-  { EFI_RESOURCE_ATTRIBUTE_PRESENT,                 EFI_MEMORY_PRESENT,     
FALSE },
-  { EFI_RESOURCE_ATTRIBUTE_INITIALIZED,             EFI_MEMORY_INITIALIZED, 
FALSE },
-  { EFI_RESOURCE_ATTRIBUTE_TESTED,                  EFI_MEMORY_TESTED,      
FALSE },
-  { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE,             EFI_MEMORY_NV,          
TRUE  },
-  { 0,                                              0,                      
FALSE }
+  { EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,             EFI_MEMORY_UC,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED,       EFI_MEMORY_UCE,            
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE,       EFI_MEMORY_WC,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE, EFI_MEMORY_WT,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE,    EFI_MEMORY_WB,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE,        EFI_MEMORY_RP,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE,       EFI_MEMORY_WP,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE,   EFI_MEMORY_XP,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_PRESENT,                 EFI_MEMORY_PRESENT,        
 FALSE },
+  { EFI_RESOURCE_ATTRIBUTE_INITIALIZED,             EFI_MEMORY_INITIALIZED,    
 FALSE },
+  { EFI_RESOURCE_ATTRIBUTE_TESTED,                  EFI_MEMORY_TESTED,         
 FALSE },
+  { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE,             EFI_MEMORY_NV,             
 TRUE  },
+  { EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE,           EFI_MEMORY_MORE_RELIABLE,  
 TRUE  },
+  { 0,                                              0,                         
 FALSE }
 };
 
 ///
@@ -106,6 +107,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 
*mGcdMemoryTypeNames[] = {
   "SystemMem",  // EfiGcdMemoryTypeSystemMemory
   "MMIO     ",  // EfiGcdMemoryTypeMemoryMappedIo
   "PersistentMem",// EfiGcdMemoryTypePersistentMemory
+  "MoreRelia",  // EfiGcdMemoryTypeMoreReliable
   "Unknown  "   // EfiGcdMemoryTypeMaximum
 };
 
@@ -1379,9 +1381,9 @@ CoreAddMemorySpace (
 
   Status = CoreInternalAddMemorySpace (GcdMemoryType, BaseAddress, Length, 
Capabilities);
 
-  if (!EFI_ERROR (Status) && GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {
+  if (!EFI_ERROR (Status) && ((GcdMemoryType == EfiGcdMemoryTypeSystemMemory) 
|| (GcdMemoryType == EfiGcdMemoryTypeMoreReliable))) {
 
-    PageBaseAddress = PageAlignLength (BaseAddress);
+    PageBaseAddress = PageAlignAddress (BaseAddress);
     PageLength      = PageAlignLength (BaseAddress + Length - PageBaseAddress);
 
     Status = CoreAllocateMemorySpace (
@@ -1987,7 +1989,7 @@ CoreConvertResourceDescriptorHobAttributesToCapabilities (
   // Convert the Resource HOB Attributes to an EFI Memory Capabilities mask
   //
   for (Capabilities = 0, Conversion = mAttributeConversionTable; 
Conversion->Attribute != 0; Conversion++) {
-    if (Conversion->Memory || (GcdMemoryType != EfiGcdMemoryTypeSystemMemory)) 
{
+    if (Conversion->Memory || ((GcdMemoryType != EfiGcdMemoryTypeSystemMemory) 
&& (GcdMemoryType != EfiGcdMemoryTypeMoreReliable))) {
       if (Attributes & Conversion->Attribute) {
         Capabilities |= Conversion->Capability;
       }
@@ -2241,7 +2243,11 @@ CoreInitializeMemoryServices (
   //
   // Convert the Resource HOB Attributes to an EFI Memory Capabilities mask
   //
-  Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities 
(EfiGcdMemoryTypeSystemMemory, Attributes);
+  if ((Attributes & EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) == 
EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) {
+    Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities 
(EfiGcdMemoryTypeMoreReliable, Attributes);
+  } else {
+    Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities 
(EfiGcdMemoryTypeSystemMemory, Attributes);
+  }
 
   //
   // Declare the very first memory region, so the EFI Memory Services are 
available.
@@ -2354,7 +2360,11 @@ CoreInitializeGcdServices (
       switch (ResourceHob->ResourceType) {
       case EFI_RESOURCE_SYSTEM_MEMORY:
         if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == 
TESTED_MEMORY_ATTRIBUTES) {
-          GcdMemoryType = EfiGcdMemoryTypeSystemMemory;
+          if ((ResourceHob->ResourceAttribute & 
EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) == EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) {
+            GcdMemoryType = EfiGcdMemoryTypeMoreReliable;
+          } else {
+            GcdMemoryType = EfiGcdMemoryTypeSystemMemory;
+          }
         }
         if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == 
INITIALIZED_MEMORY_ATTRIBUTES) {
           GcdMemoryType = EfiGcdMemoryTypeReserved;
@@ -2417,15 +2427,20 @@ CoreInitializeGcdServices (
   //
   // Allocate first memory region from the GCD by the DXE core
   //
-  Status = CoreAllocateMemorySpace (
-             EfiGcdAllocateAddress,
-             EfiGcdMemoryTypeSystemMemory,
-             0,
-             MemoryLength,
-             &MemoryBaseAddress,
-             gDxeCoreImageHandle,
-             NULL
-             );
+  Status = CoreGetMemorySpaceDescriptor (MemoryBaseAddress, &Descriptor);
+  if (!EFI_ERROR (Status)) {
+    ASSERT ((Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||
+            (Descriptor.GcdMemoryType == EfiGcdMemoryTypeMoreReliable));
+    Status = CoreAllocateMemorySpace (
+               EfiGcdAllocateAddress,
+               Descriptor.GcdMemoryType,
+               0,
+               MemoryLength,
+               &MemoryBaseAddress,
+               gDxeCoreImageHandle,
+               NULL
+               );
+  }
 
   //
   // Walk the HOB list and allocate all memory space that is consumed by 
memory allocation HOBs,
@@ -2446,7 +2461,9 @@ CoreInitializeGcdServices (
                    gDxeCoreImageHandle,
                    NULL
                    );
-        if (!EFI_ERROR (Status) && Descriptor.GcdMemoryType == 
EfiGcdMemoryTypeSystemMemory) {
+        if (!EFI_ERROR (Status) &&
+            ((Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||
+             (Descriptor.GcdMemoryType == EfiGcdMemoryTypeMoreReliable))) {
           CoreAddMemoryDescriptor (
             MemoryHob->AllocDescriptor.MemoryType,
             MemoryHob->AllocDescriptor.MemoryBaseAddress,
@@ -2491,7 +2508,8 @@ CoreInitializeGcdServices (
   ASSERT (Status == EFI_SUCCESS);
 
   for (Index = 0; Index < NumberOfDescriptors; Index++) {
-    if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {
+    if ((MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) 
||
+        (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMoreReliable)) 
{
       if (MemorySpaceMap[Index].ImageHandle == NULL) {
         BaseAddress  = PageAlignAddress (MemorySpaceMap[Index].BaseAddress);
         Length       = PageAlignLength  (MemorySpaceMap[Index].BaseAddress + 
MemorySpaceMap[Index].Length - BaseAddress);
@@ -2506,7 +2524,7 @@ CoreInitializeGcdServices (
           );
         Status = CoreAllocateMemorySpace (
                    EfiGcdAllocateAddress,
-                   EfiGcdMemoryTypeSystemMemory,
+                   MemorySpaceMap[Index].GcdMemoryType,
                    0,
                    Length,
                    &BaseAddress,
diff --git a/MdeModulePkg/Core/Dxe/Mem/Page.c b/MdeModulePkg/Core/Dxe/Mem/Page.c
index abfb0b9..855ac89 100644
--- a/MdeModulePkg/Core/Dxe/Mem/Page.c
+++ b/MdeModulePkg/Core/Dxe/Mem/Page.c
@@ -416,7 +416,11 @@ PromoteMemoryResource (
       //
       // Update the GCD map
       //
-      Entry->GcdMemoryType = EfiGcdMemoryTypeSystemMemory;
+      if ((Entry->Capabilities & EFI_MEMORY_MORE_RELIABLE) == 
EFI_MEMORY_MORE_RELIABLE) {
+        Entry->GcdMemoryType = EfiGcdMemoryTypeMoreReliable;
+      } else {
+        Entry->GcdMemoryType = EfiGcdMemoryTypeSystemMemory;
+      }
       Entry->Capabilities |= EFI_MEMORY_TESTED;
       Entry->ImageHandle  = gDxeCoreImageHandle;
       Entry->DeviceHandle = NULL;
-- 
1.9.5.msysgit.0


------------------------------------------------------------------------------
One dashboard for servers and applications across Physical-Virtual-Cloud 
Widest out-of-the-box monitoring support with 50+ applications
Performance metrics, stats and reports that give you Actionable Insights
Deep dive visibility with transaction tracing using APM Insight.
http://ad.doubleclick.net/ddm/clk/290420510;117567292;y
_______________________________________________
edk2-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-devel

Reply via email to