]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Memory/MemoryServices.c
Make sure the base address of stack base and base address of hob start is in page...
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Memory / MemoryServices.c
index e623c0109924d0e66308c17c0e6df8444d43f86f..3be63fb105fda195d4be5264dea3d8e0ab29f92a 100644 (file)
@@ -23,8 +23,8 @@ Abstract:
 \r
 VOID\r
 InitializeMemoryServices (\r
-  IN EFI_PEI_SERVICES            **PeiServices,\r
-  IN EFI_PEI_STARTUP_DESCRIPTOR  *PeiStartupDescriptor,\r
+  IN PEI_CORE_INSTANCE           *PrivateData,\r
+  IN CONST EFI_SEC_PEI_HAND_OFF  *SecCoreData,\r
   IN PEI_CORE_INSTANCE           *OldCoreData\r
   )\r
 /*++\r
@@ -36,7 +36,10 @@ Routine Description:
 Arguments:\r
 \r
   PeiServices          - The PEI core services table.\r
-  PeiStartupDescriptor - Information and services provided by SEC phase.\r
+  SecCoreData          - Points to a data structure containing information about the PEI core's operating\r
+                         environment, such as the size and location of temporary RAM, the stack location and\r
+                         the BFV location.\r
+\r
   OldCoreData          - Pointer to the PEI Core data.\r
                          NULL if being run in non-permament memory mode.\r
 \r
@@ -46,28 +49,20 @@ Returns:
 \r
 --*/\r
 {\r
-  PEI_CORE_INSTANCE                    *PrivateData;\r
-  UINT64                               SizeOfCarHeap;\r
-\r
-  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
   PrivateData->SwitchStackSignal = FALSE;\r
 \r
   if (OldCoreData == NULL) {\r
 \r
     PrivateData->PeiMemoryInstalled = FALSE;\r
 \r
-    PrivateData->BottomOfCarHeap = (VOID *) (((UINTN)(VOID *)(&PrivateData))\r
-                                   & (~((PeiStartupDescriptor->SizeOfCacheAsRam) - 1))); \r
-    PrivateData->TopOfCarHeap = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + PeiStartupDescriptor->SizeOfCacheAsRam);\r
-    //\r
-    // SizeOfCarHeap is 1/2 (arbitrary) of CacheAsRam Size.\r
-    //\r
-    SizeOfCarHeap = (UINT64) PeiStartupDescriptor->SizeOfCacheAsRam;\r
-    SizeOfCarHeap = RShiftU64 (SizeOfCarHeap, 1);\r
+    PrivateData->BottomOfCarHeap = SecCoreData->PeiTemporaryRamBase; \r
+    PrivateData->TopOfCarHeap = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + SecCoreData->PeiTemporaryRamSize);\r
  \r
     DEBUG_CODE_BEGIN ();\r
-      PrivateData->SizeOfCacheAsRam = PeiStartupDescriptor->SizeOfCacheAsRam;\r
-      PrivateData->MaxTopOfCarHeap  = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) SizeOfCarHeap);\r
+      PrivateData->SizeOfCacheAsRam = SecCoreData->PeiTemporaryRamSize + SecCoreData->StackSize;\r
+      PrivateData->MaxTopOfCarHeap  = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) PrivateData->SizeOfCacheAsRam);\r
+      PrivateData->StackBase        = (EFI_PHYSICAL_ADDRESS) (UINTN) SecCoreData->StackBase;\r
+      PrivateData->StackSize        = (UINT64) SecCoreData->StackSize;\r
     DEBUG_CODE_END ();\r
 \r
     PrivateData->HobList.Raw = PrivateData->BottomOfCarHeap;\r
@@ -75,32 +70,22 @@ Returns:
     PeiCoreBuildHobHandoffInfoTable (\r
       BOOT_WITH_FULL_CONFIGURATION,\r
       (EFI_PHYSICAL_ADDRESS) (UINTN) PrivateData->BottomOfCarHeap,\r
-      (UINTN) SizeOfCarHeap\r
+      (UINTN) SecCoreData->PeiTemporaryRamSize\r
       );\r
-    //\r
-    // Copy PeiServices from ROM to Cache in PrivateData\r
-    //\r
-    CopyMem (&(PrivateData->ServiceTableShadow), *PeiServices, sizeof (EFI_PEI_SERVICES));\r
 \r
     //\r
     // Set PS to point to ServiceTableShadow in Cache\r
     //\r
     PrivateData->PS = &(PrivateData->ServiceTableShadow);\r
-  } else {\r
-  //                                                                    \r
-  // Set PS to point to ServiceTableShadow in Cache one time after the  \r
-  // stack switched to main memory                                      \r
-  //                                                                    \r
-  PrivateData->PS = &(PrivateData->ServiceTableShadow);                 \r
-}                                                                       \r
-\r
+  }\r
+  \r
   return;\r
 }\r
 \r
 EFI_STATUS\r
 EFIAPI\r
 PeiInstallPeiMemory (\r
-  IN EFI_PEI_SERVICES      **PeiServices,\r
+  IN CONST EFI_PEI_SERVICES      **PeiServices,\r
   IN EFI_PHYSICAL_ADDRESS  MemoryBegin,\r
   IN UINT64                MemoryLength\r
   )\r
@@ -129,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_SIZE - 1)) & EFI_PAGE_SIZE;\r
+  \r
+  PeiStackSize = (RShiftU64 (MemoryLength, 1) + (EFI_PAGE_SIZE - 1)) & EFI_PAGE_SIZE;\r
   if (PEI_STACK_SIZE > PeiStackSize) {\r
     PrivateData->StackSize = PeiStackSize;\r
   } else {\r
@@ -146,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
@@ -170,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
@@ -182,7 +182,7 @@ Returns:
 EFI_STATUS\r
 EFIAPI\r
 PeiAllocatePages (\r
-  IN EFI_PEI_SERVICES           **PeiServices,\r
+  IN CONST EFI_PEI_SERVICES           **PeiServices,\r
   IN EFI_MEMORY_TYPE            MemoryType,\r
   IN UINTN                      Pages,\r
   OUT EFI_PHYSICAL_ADDRESS      *Memory\r
@@ -238,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
@@ -263,7 +264,7 @@ Returns:
     //\r
     BuildMemoryAllocationHob (\r
       Hob.HandoffInformationTable->EfiFreeMemoryTop,\r
-      Pages * EFI_PAGE_SIZE + Offset,\r
+      Pages * EFI_PAGE_SIZE,\r
       MemoryType\r
       );\r
 \r
@@ -275,7 +276,7 @@ Returns:
 EFI_STATUS\r
 EFIAPI\r
 PeiAllocatePool (\r
-  IN EFI_PEI_SERVICES           **PeiServices,\r
+  IN CONST EFI_PEI_SERVICES           **PeiServices,\r
   IN UINTN                      Size,\r
   OUT VOID                      **Buffer\r
   )\r