]> git.proxmox.com Git - mirror_edk2.git/commitdiff
MdeModulePkg DxeCore: Add memory more reliable support.
authorStar Zeng <star.zeng@intel.com>
Mon, 11 May 2015 05:16:48 +0000 (05:16 +0000)
committerlzeng14 <lzeng14@Edk2>
Mon, 11 May 2015 05:16:48 +0000 (05:16 +0000)
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Star Zeng <star.zeng@intel.com>
Reviewed-by: Liming Gao <liming.gao@intel.com>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@17400 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Dxe/Gcd/Gcd.c
MdeModulePkg/Core/Dxe/Mem/Page.c

index fdd2d40986b12216432936e779a3ba44e2f40c84..e4138c0e2d0996042dd6abec970ee7dc10a06187 100644 (file)
@@ -83,20 +83,21 @@ EFI_GCD_MAP_ENTRY mGcdIoSpaceMapEntryTemplate = {
 };\r
 \r
 GCD_ATTRIBUTE_CONVERSION_ENTRY mAttributeConversionTable[] = {\r
-  { EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,             EFI_MEMORY_UC,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED,       EFI_MEMORY_UCE,         TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE,       EFI_MEMORY_WC,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE, EFI_MEMORY_WT,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE,    EFI_MEMORY_WB,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE,        EFI_MEMORY_RP,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE,       EFI_MEMORY_WP,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE,   EFI_MEMORY_XP,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE,   EFI_MEMORY_RO,          TRUE  },\r
-  { EFI_RESOURCE_ATTRIBUTE_PRESENT,                 EFI_MEMORY_PRESENT,     FALSE },\r
-  { EFI_RESOURCE_ATTRIBUTE_INITIALIZED,             EFI_MEMORY_INITIALIZED, FALSE },\r
-  { EFI_RESOURCE_ATTRIBUTE_TESTED,                  EFI_MEMORY_TESTED,      FALSE },\r
-  { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE,             EFI_MEMORY_NV,          TRUE  },\r
-  { 0,                                              0,                      FALSE }\r
+  { EFI_RESOURCE_ATTRIBUTE_UNCACHEABLE,             EFI_MEMORY_UC,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_UNCACHED_EXPORTED,       EFI_MEMORY_UCE,             TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_COMBINEABLE,       EFI_MEMORY_WC,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_THROUGH_CACHEABLE, EFI_MEMORY_WT,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_BACK_CACHEABLE,    EFI_MEMORY_WB,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_READ_PROTECTABLE,        EFI_MEMORY_RP,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_WRITE_PROTECTABLE,       EFI_MEMORY_WP,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_EXECUTION_PROTECTABLE,   EFI_MEMORY_XP,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_READ_ONLY_PROTECTABLE,   EFI_MEMORY_RO,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_PRESENT,                 EFI_MEMORY_PRESENT,         FALSE },\r
+  { EFI_RESOURCE_ATTRIBUTE_INITIALIZED,             EFI_MEMORY_INITIALIZED,     FALSE },\r
+  { EFI_RESOURCE_ATTRIBUTE_TESTED,                  EFI_MEMORY_TESTED,          FALSE },\r
+  { EFI_RESOURCE_ATTRIBUTE_PERSISTABLE,             EFI_MEMORY_NV,              TRUE  },\r
+  { EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE,           EFI_MEMORY_MORE_RELIABLE,   TRUE  },\r
+  { 0,                                              0,                          FALSE }\r
 };\r
 \r
 ///\r
@@ -108,6 +109,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *mGcdMemoryTypeNames[] = {
   "SystemMem",  // EfiGcdMemoryTypeSystemMemory\r
   "MMIO     ",  // EfiGcdMemoryTypeMemoryMappedIo\r
   "PersistentMem",// EfiGcdMemoryTypePersistentMemory\r
+  "MoreRelia",  // EfiGcdMemoryTypeMoreReliable\r
   "Unknown  "   // EfiGcdMemoryTypeMaximum\r
 };\r
 \r
@@ -1383,9 +1385,9 @@ CoreAddMemorySpace (
 \r
   Status = CoreInternalAddMemorySpace (GcdMemoryType, BaseAddress, Length, Capabilities);\r
 \r
-  if (!EFI_ERROR (Status) && GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {\r
+  if (!EFI_ERROR (Status) && ((GcdMemoryType == EfiGcdMemoryTypeSystemMemory) || (GcdMemoryType == EfiGcdMemoryTypeMoreReliable))) {\r
 \r
-    PageBaseAddress = PageAlignLength (BaseAddress);\r
+    PageBaseAddress = PageAlignAddress (BaseAddress);\r
     PageLength      = PageAlignLength (BaseAddress + Length - PageBaseAddress);\r
 \r
     Status = CoreAllocateMemorySpace (\r
@@ -1991,7 +1993,7 @@ CoreConvertResourceDescriptorHobAttributesToCapabilities (
   // Convert the Resource HOB Attributes to an EFI Memory Capabilities mask\r
   //\r
   for (Capabilities = 0, Conversion = mAttributeConversionTable; Conversion->Attribute != 0; Conversion++) {\r
-    if (Conversion->Memory || (GcdMemoryType != EfiGcdMemoryTypeSystemMemory)) {\r
+    if (Conversion->Memory || ((GcdMemoryType != EfiGcdMemoryTypeSystemMemory) && (GcdMemoryType != EfiGcdMemoryTypeMoreReliable))) {\r
       if (Attributes & Conversion->Attribute) {\r
         Capabilities |= Conversion->Capability;\r
       }\r
@@ -2245,7 +2247,11 @@ CoreInitializeMemoryServices (
   //\r
   // Convert the Resource HOB Attributes to an EFI Memory Capabilities mask\r
   //\r
-  Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities (EfiGcdMemoryTypeSystemMemory, Attributes);\r
+  if ((Attributes & EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) == EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) {\r
+    Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities (EfiGcdMemoryTypeMoreReliable, Attributes);\r
+  } else {\r
+    Capabilities = CoreConvertResourceDescriptorHobAttributesToCapabilities (EfiGcdMemoryTypeSystemMemory, Attributes);\r
+  }\r
 \r
   //\r
   // Declare the very first memory region, so the EFI Memory Services are available.\r
@@ -2358,7 +2364,11 @@ CoreInitializeGcdServices (
       switch (ResourceHob->ResourceType) {\r
       case EFI_RESOURCE_SYSTEM_MEMORY:\r
         if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == TESTED_MEMORY_ATTRIBUTES) {\r
-          GcdMemoryType = EfiGcdMemoryTypeSystemMemory;\r
+          if ((ResourceHob->ResourceAttribute & EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) == EFI_RESOURCE_ATTRIBUTE_MORE_RELIABLE) {\r
+            GcdMemoryType = EfiGcdMemoryTypeMoreReliable;\r
+          } else {\r
+            GcdMemoryType = EfiGcdMemoryTypeSystemMemory;\r
+          }\r
         }\r
         if ((ResourceHob->ResourceAttribute & MEMORY_ATTRIBUTE_MASK) == INITIALIZED_MEMORY_ATTRIBUTES) {\r
           GcdMemoryType = EfiGcdMemoryTypeReserved;\r
@@ -2421,15 +2431,20 @@ CoreInitializeGcdServices (
   //\r
   // Allocate first memory region from the GCD by the DXE core\r
   //\r
-  Status = CoreAllocateMemorySpace (\r
-             EfiGcdAllocateAddress,\r
-             EfiGcdMemoryTypeSystemMemory,\r
-             0,\r
-             MemoryLength,\r
-             &MemoryBaseAddress,\r
-             gDxeCoreImageHandle,\r
-             NULL\r
-             );\r
+  Status = CoreGetMemorySpaceDescriptor (MemoryBaseAddress, &Descriptor);\r
+  if (!EFI_ERROR (Status)) {\r
+    ASSERT ((Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||\r
+            (Descriptor.GcdMemoryType == EfiGcdMemoryTypeMoreReliable));\r
+    Status = CoreAllocateMemorySpace (\r
+               EfiGcdAllocateAddress,\r
+               Descriptor.GcdMemoryType,\r
+               0,\r
+               MemoryLength,\r
+               &MemoryBaseAddress,\r
+               gDxeCoreImageHandle,\r
+               NULL\r
+               );\r
+  }\r
 \r
   //\r
   // Walk the HOB list and allocate all memory space that is consumed by memory allocation HOBs,\r
@@ -2450,7 +2465,9 @@ CoreInitializeGcdServices (
                    gDxeCoreImageHandle,\r
                    NULL\r
                    );\r
-        if (!EFI_ERROR (Status) && Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {\r
+        if (!EFI_ERROR (Status) &&\r
+            ((Descriptor.GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||\r
+             (Descriptor.GcdMemoryType == EfiGcdMemoryTypeMoreReliable))) {\r
           CoreAddMemoryDescriptor (\r
             MemoryHob->AllocDescriptor.MemoryType,\r
             MemoryHob->AllocDescriptor.MemoryBaseAddress,\r
@@ -2495,7 +2512,8 @@ CoreInitializeGcdServices (
   ASSERT (Status == EFI_SUCCESS);\r
 \r
   for (Index = 0; Index < NumberOfDescriptors; Index++) {\r
-    if (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) {\r
+    if ((MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeSystemMemory) ||\r
+        (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMoreReliable)) {\r
       if (MemorySpaceMap[Index].ImageHandle == NULL) {\r
         BaseAddress  = PageAlignAddress (MemorySpaceMap[Index].BaseAddress);\r
         Length       = PageAlignLength  (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length - BaseAddress);\r
@@ -2510,7 +2528,7 @@ CoreInitializeGcdServices (
           );\r
         Status = CoreAllocateMemorySpace (\r
                    EfiGcdAllocateAddress,\r
-                   EfiGcdMemoryTypeSystemMemory,\r
+                   MemorySpaceMap[Index].GcdMemoryType,\r
                    0,\r
                    Length,\r
                    &BaseAddress,\r
index abfb0b9c7461a15e4ac5a2aae95b5088d66640ac..855ac8915f9a1804c30646c50ef6e994c398fb16 100644 (file)
@@ -416,7 +416,11 @@ PromoteMemoryResource (
       //\r
       // Update the GCD map\r
       //\r
-      Entry->GcdMemoryType = EfiGcdMemoryTypeSystemMemory;\r
+      if ((Entry->Capabilities & EFI_MEMORY_MORE_RELIABLE) == EFI_MEMORY_MORE_RELIABLE) {\r
+        Entry->GcdMemoryType = EfiGcdMemoryTypeMoreReliable;\r
+      } else {\r
+        Entry->GcdMemoryType = EfiGcdMemoryTypeSystemMemory;\r
+      }\r
       Entry->Capabilities |= EFI_MEMORY_TESTED;\r
       Entry->ImageHandle  = gDxeCoreImageHandle;\r
       Entry->DeviceHandle = NULL;\r