]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Memory/MemoryServices.c
Rebuilt per the Hess's bug fixes
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Memory / MemoryServices.c
index 728b963afafd2e9bbd6fa4ff1bdb3edf720069f7..05e65ce75e00aa8389cdb8e46bad02c9e4b51f25 100644 (file)
@@ -114,15 +114,24 @@ Returns:
   UINT64                                PeiStackSize;\r
   UINT64                                EfiFreeMemorySize;\r
   EFI_PHYSICAL_ADDRESS                  PhysicalAddressOfOldHob;\r
+\r
+  if (MemoryLength > (MAX_ADDRESS - MemoryBegin + 1))\r
+    return EFI_INVALID_PARAMETER;\r
+    \r
+   \r
+  DEBUG ((EFI_D_INFO, "PeiInstallPeiMemory MemoryBegin 0x%LX, MemoryLength 0x%LX\n", MemoryBegin, MemoryLength));\r
   \r
   PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
 \r
   PrivateData->SwitchStackSignal = TRUE;\r
   PrivateData->PeiMemoryInstalled = TRUE;\r
-\r
-  PrivateData->StackBase = MemoryBegin;\r
   \r
-  PeiStackSize = RShiftU64 (MemoryLength, 1);\r
+  //\r
+  // Ensure the stack base is in page alignment \r
+  //\r
+  PrivateData->StackBase = ((UINTN)MemoryBegin + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;\r
+  PeiStackSize = (RShiftU64 (MemoryLength, 1) + EFI_PAGE_MASK) & ~EFI_PAGE_MASK;\r
+  \r
   if (PEI_STACK_SIZE > PeiStackSize) {\r
     PrivateData->StackSize = PeiStackSize;\r
   } else {\r
@@ -131,14 +140,14 @@ Returns:
 \r
   OldHandOffHob = PrivateData->HobList.HandoffInformationTable;\r
 \r
-  PrivateData->HobList.Raw = (VOID *)((UINTN)(MemoryBegin + PrivateData->StackSize));\r
+  PrivateData->HobList.Raw = (VOID *)((UINTN)(PrivateData->StackBase + PrivateData->StackSize));\r
   NewHandOffHob = PrivateData->HobList.HandoffInformationTable;\r
   PhysicalAddressOfOldHob = (EFI_PHYSICAL_ADDRESS) (UINTN) OldHandOffHob;\r
 \r
   EfiFreeMemorySize = OldHandOffHob->EfiFreeMemoryBottom - PhysicalAddressOfOldHob;\r
   \r
-  DEBUG ((EFI_D_INFO, "HOBLIST address before memory init = 0x%08x\n", OldHandOffHob));\r
-  DEBUG ((EFI_D_INFO, "HOBLIST address after memory init = 0x%08x\n", NewHandOffHob));\r
+  DEBUG ((EFI_D_INFO, "HOBLIST address before memory init = 0x%p\n",  OldHandOffHob));\r
+  DEBUG ((EFI_D_INFO, "HOBLIST address after memory init = 0x%p\n", NewHandOffHob));\r
 \r
   CopyMem (\r
     NewHandOffHob,\r
@@ -155,7 +164,13 @@ Returns:
   NewHandOffHob->EfiEndOfHobList     = (UINTN)NewHandOffHob +\r
                                        (OldHandOffHob->EfiEndOfHobList -\r
                                         PhysicalAddressOfOldHob);\r
-\r
+  \r
+  //\r
+  // For IPF in CAR mode the real memory access is uncached,in InstallPeiMemory()\r
+  //  the 63-bit of address is set to 1.\r
+  //\r
+  SWITCH_TO_CACHE_MODE (PrivateData);\r
+  \r
   ConvertPpiPointers (PeiServices, OldHandOffHob, NewHandOffHob);\r
 \r
   BuildStackHob (PrivateData->StackBase, PrivateData->StackSize);\r
@@ -223,6 +238,7 @@ Returns:
     Hob.HandoffInformationTable->EfiFreeMemoryTop -= Offset;\r
   }\r
 \r
+  ASSERT (Hob.HandoffInformationTable->EfiFreeMemoryTop >= Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
   //\r
   // Verify that there is sufficient memory to satisfy the allocation\r
   //\r