]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Gcd/Gcd.c
ShellPkg: Fix GCC build fail and code refine.
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Gcd / Gcd.c
index fdd2d40986b12216432936e779a3ba44e2f40c84..77586a9ac8f3adcb85d6e868fef3d7f6bdb0025f 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
@@ -107,7 +108,8 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 *mGcdMemoryTypeNames[] = {
   "Reserved ",  // EfiGcdMemoryTypeReserved\r
   "SystemMem",  // EfiGcdMemoryTypeSystemMemory\r
   "MMIO     ",  // EfiGcdMemoryTypeMemoryMappedIo\r
-  "PersistentMem",// EfiGcdMemoryTypePersistentMemory\r
+  "PersisMem",  // 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
@@ -2305,6 +2311,7 @@ CoreInitializeGcdServices (
   UINTN                              Index;\r
   UINT64                             Capabilities;\r
   EFI_HOB_CPU *                      CpuHob;\r
+  EFI_GCD_MEMORY_SPACE_DESCRIPTOR    *MemorySpaceMapHobList;\r
 \r
   //\r
   // Cache the PHIT HOB for later use\r
@@ -2358,7 +2365,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 +2432,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 +2466,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
@@ -2476,32 +2494,32 @@ CoreInitializeGcdServices (
     }\r
   }\r
 \r
-  //\r
-  // Relocate HOB List to an allocated pool buffer.\r
-  //\r
-  NewHobList = AllocateCopyPool (\r
-                 (UINTN)PhitHob->EfiFreeMemoryBottom - (UINTN)(*HobStart),\r
-                 *HobStart\r
-                 );\r
-  ASSERT (NewHobList != NULL);\r
-\r
-  *HobStart = NewHobList;\r
-  gHobList  = NewHobList;\r
-\r
   //\r
   // Add and allocate the remaining unallocated system memory to the memory services.\r
   //\r
   Status = CoreGetMemorySpaceMap (&NumberOfDescriptors, &MemorySpaceMap);\r
   ASSERT (Status == EFI_SUCCESS);\r
 \r
+  MemorySpaceMapHobList = NULL;\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
         if (Length == 0 || MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length < BaseAddress) {\r
           continue;\r
         }\r
+        if (((UINTN) MemorySpaceMap[Index].BaseAddress <= (UINTN) (*HobStart)) &&\r
+            ((UINTN) (MemorySpaceMap[Index].BaseAddress + MemorySpaceMap[Index].Length) >= (UINTN) PhitHob->EfiFreeMemoryBottom)) {\r
+          //\r
+          // Skip the memory space that covers HOB List, it should be processed\r
+          // after HOB List relocation to avoid the resources allocated by others\r
+          // to corrupt HOB List before its relocation.\r
+          //\r
+          MemorySpaceMapHobList = &MemorySpaceMap[Index];\r
+          continue;\r
+        }\r
         CoreAddMemoryDescriptor (\r
           EfiConventionalMemory,\r
           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
@@ -2520,6 +2538,47 @@ CoreInitializeGcdServices (
       }\r
     }\r
   }\r
+\r
+  //\r
+  // Relocate HOB List to an allocated pool buffer.\r
+  // The relocation should be at after all the tested memory resources added\r
+  // (except the memory space that covers HOB List) to the memory services,\r
+  // because the memory resource found in CoreInitializeMemoryServices()\r
+  // may have not enough remaining resource for HOB List.\r
+  //\r
+  NewHobList = AllocateCopyPool (\r
+                 (UINTN) PhitHob->EfiFreeMemoryBottom - (UINTN) (*HobStart),\r
+                 *HobStart\r
+                 );\r
+  ASSERT (NewHobList != NULL);\r
+\r
+  *HobStart = NewHobList;\r
+  gHobList  = NewHobList;\r
+\r
+  if (MemorySpaceMapHobList != NULL) {\r
+    //\r
+    // Add and allocate the memory space that covers HOB List to the memory services\r
+    // after HOB List relocation.\r
+    //\r
+    BaseAddress = PageAlignAddress (MemorySpaceMapHobList->BaseAddress);\r
+    Length      = PageAlignLength  (MemorySpaceMapHobList->BaseAddress + MemorySpaceMapHobList->Length - BaseAddress);\r
+    CoreAddMemoryDescriptor (\r
+      EfiConventionalMemory,\r
+      BaseAddress,\r
+      RShiftU64 (Length, EFI_PAGE_SHIFT),\r
+      MemorySpaceMapHobList->Capabilities & (~EFI_MEMORY_RUNTIME)\r
+      );\r
+    Status = CoreAllocateMemorySpace (\r
+               EfiGcdAllocateAddress,\r
+               MemorySpaceMapHobList->GcdMemoryType,\r
+               0,\r
+               Length,\r
+               &BaseAddress,\r
+               gDxeCoreImageHandle,\r
+               NULL\r
+               );\r
+  }\r
+\r
   CoreFreePool (MemorySpaceMap);\r
 \r
   return EFI_SUCCESS;\r