]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Dxe/Gcd/Gcd.c
MdeModulePkg DxeCore: Relocate HOB List after other tested memory resources added
[mirror_edk2.git] / MdeModulePkg / Core / Dxe / Gcd / Gcd.c
index a50fda2466da435b93808c970f6819388c546ebf..77586a9ac8f3adcb85d6e868fef3d7f6bdb0025f 100644 (file)
@@ -2311,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
@@ -2493,24 +2494,13 @@ 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
         (MemorySpaceMap[Index].GcdMemoryType == EfiGcdMemoryTypeMoreReliable)) {\r
@@ -2520,6 +2510,16 @@ CoreInitializeGcdServices (
         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
@@ -2538,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