]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Memory/MemoryServices.c
Merge Temporary Ram support patch.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Memory / MemoryServices.c
index 05e65ce75e00aa8389cdb8e46bad02c9e4b51f25..457804fef2b5197a661dbcdca63d3e10d6d52efc 100644 (file)
@@ -21,6 +21,12 @@ Abstract:
 \r
 #include <PeiMain.h>\r
 \r
+static EFI_PEI_PPI_DESCRIPTOR mMemoryDiscoveredPpi = {\r
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),\r
+  &gEfiPeiMemoryDiscoveredPpiGuid,\r
+  NULL\r
+};\r
+\r
 VOID\r
 InitializeMemoryServices (\r
   IN PEI_CORE_INSTANCE           *PrivateData,\r
@@ -49,15 +55,18 @@ Returns:
 \r
 --*/\r
 {\r
-  PrivateData->SwitchStackSignal = FALSE;\r
+  \r
+  PrivateData->SwitchStackSignal      = FALSE;\r
 \r
   if (OldCoreData == NULL) {\r
 \r
     PrivateData->PeiMemoryInstalled = FALSE;\r
 \r
-    PrivateData->BottomOfCarHeap = SecCoreData->PeiTemporaryRamBase; \r
-    PrivateData->TopOfCarHeap = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + SecCoreData->PeiTemporaryRamSize);\r
\r
+    PrivateData->BottomOfCarHeap        = SecCoreData->PeiTemporaryRamBase; \r
+    PrivateData->TopOfCarHeap           = (VOID *)((UINTN)(PrivateData->BottomOfCarHeap) + SecCoreData->PeiTemporaryRamSize);\r
+    PrivateData->SizeOfTemporaryMemory  = SecCoreData->TemporaryRamSize;\r
+    PrivateData->StackSize              = (UINT64) SecCoreData->StackSize;\r
+    \r
     DEBUG_CODE_BEGIN ();\r
       PrivateData->SizeOfCacheAsRam = SecCoreData->PeiTemporaryRamSize + SecCoreData->StackSize;\r
       PrivateData->MaxTopOfCarHeap  = (VOID *) ((UINTN) PrivateData->BottomOfCarHeap + (UINTN) PrivateData->SizeOfCacheAsRam);\r
@@ -85,9 +94,9 @@ Returns:
 EFI_STATUS\r
 EFIAPI\r
 PeiInstallPeiMemory (\r
-  IN CONST EFI_PEI_SERVICES      **PeiServices,\r
-  IN EFI_PHYSICAL_ADDRESS  MemoryBegin,\r
-  IN UINT64                MemoryLength\r
+  IN CONST EFI_PEI_SERVICES  **PeiServices,\r
+  IN EFI_PHYSICAL_ADDRESS    MemoryBegin,\r
+  IN UINT64                  MemoryLength\r
   )\r
 /*++\r
 \r
@@ -109,72 +118,15 @@ Returns:
 --*/\r
 {\r
   PEI_CORE_INSTANCE                     *PrivateData;\r
-  EFI_HOB_HANDOFF_INFO_TABLE            *OldHandOffHob;\r
-  EFI_HOB_HANDOFF_INFO_TABLE            *NewHandOffHob;\r
-  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
+\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
-  //\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
-    PrivateData->StackSize = PEI_STACK_SIZE;\r
-  }\r
-\r
-  OldHandOffHob = PrivateData->HobList.HandoffInformationTable;\r
-\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%p\n",  OldHandOffHob));\r
-  DEBUG ((EFI_D_INFO, "HOBLIST address after memory init = 0x%p\n", NewHandOffHob));\r
-\r
-  CopyMem (\r
-    NewHandOffHob,\r
-    OldHandOffHob,\r
-    (UINTN)EfiFreeMemorySize\r
-    );\r
-\r
-  NewHandOffHob->EfiMemoryTop     = MemoryBegin + MemoryLength;\r
-  NewHandOffHob->EfiFreeMemoryTop = NewHandOffHob->EfiMemoryTop;\r
-  NewHandOffHob->EfiMemoryBottom  = MemoryBegin;\r
-  \r
-  NewHandOffHob->EfiFreeMemoryBottom = (UINTN)NewHandOffHob + EfiFreeMemorySize;                                     \r
-                                       \r
-  NewHandOffHob->EfiEndOfHobList     = (UINTN)NewHandOffHob +\r
-                                       (OldHandOffHob->EfiEndOfHobList -\r
-                                        PhysicalAddressOfOldHob);\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
-  \r
+  PrivateData->PhysicalMemoryBegin   = MemoryBegin;\r
+  PrivateData->PhysicalMemoryLength  = MemoryLength;\r
+  PrivateData->FreePhysicalMemoryTop = MemoryBegin + MemoryLength;\r
+   \r
+  PrivateData->SwitchStackSignal      = TRUE;\r
 \r
   return EFI_SUCCESS;   \r
 }\r
@@ -214,56 +166,70 @@ Returns:
   PEI_CORE_INSTANCE                       *PrivateData;\r
   EFI_PEI_HOB_POINTERS                    Hob;\r
   EFI_PHYSICAL_ADDRESS                    Offset;\r
+  EFI_PHYSICAL_ADDRESS                    *FreeMemoryTop;\r
+  EFI_PHYSICAL_ADDRESS                    *FreeMemoryBottom;\r
 \r
   PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
-\r
+  Hob.Raw     = PrivateData->HobList.Raw;\r
+  \r
   //\r
   // Check if Hob already available\r
   //\r
   if (!PrivateData->PeiMemoryInstalled) {\r
-    return EFI_NOT_AVAILABLE_YET;\r
+    //\r
+    // When PeiInstallMemory is called but CAR has *not* been moved to temporary memory,\r
+    // the AllocatePage will dependent the field of PEI_CORE_INSTANCE structure.\r
+    //\r
+    if (!PrivateData->SwitchStackSignal) {\r
+      return EFI_NOT_AVAILABLE_YET;\r
+    } else {\r
+      FreeMemoryTop     = &(PrivateData->FreePhysicalMemoryTop);\r
+      FreeMemoryBottom  = &(PrivateData->PhysicalMemoryBegin);\r
+    }\r
+  } else {\r
+    FreeMemoryTop     = &(Hob.HandoffInformationTable->EfiFreeMemoryTop);\r
+    FreeMemoryBottom  = &(Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
   }\r
 \r
-  Hob.Raw = PrivateData->HobList.Raw;\r
+  \r
 \r
   //\r
   // Check to see if on 4k boundary\r
   //\r
-  Offset = Hob.HandoffInformationTable->EfiFreeMemoryTop & 0xFFF;\r
-\r
+  Offset = *(FreeMemoryTop) & 0xFFF;\r
+  \r
   //\r
   // If not aligned, make the allocation aligned.\r
   //\r
   if (Offset != 0) {\r
-    Hob.HandoffInformationTable->EfiFreeMemoryTop -= Offset;\r
+    *(FreeMemoryTop) -= Offset;\r
   }\r
-\r
-  ASSERT (Hob.HandoffInformationTable->EfiFreeMemoryTop >= Hob.HandoffInformationTable->EfiFreeMemoryBottom);\r
+  \r
   //\r
   // Verify that there is sufficient memory to satisfy the allocation\r
   //\r
-  if (Hob.HandoffInformationTable->EfiFreeMemoryTop - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < \r
-      Hob.HandoffInformationTable->EfiFreeMemoryBottom) {\r
+  if (*(FreeMemoryTop) - ((Pages * EFI_PAGE_SIZE) + sizeof (EFI_HOB_MEMORY_ALLOCATION)) < \r
+      *(FreeMemoryBottom)) {\r
     DEBUG ((EFI_D_ERROR, "AllocatePages failed: No 0x%x Pages is available.\n", Pages));\r
     DEBUG ((EFI_D_ERROR, "There is only left 0x%x pages memory resource to be allocated.\n", \\r
-    EFI_SIZE_TO_PAGES ((UINTN) (Hob.HandoffInformationTable->EfiFreeMemoryTop - Hob.HandoffInformationTable->EfiFreeMemoryBottom))));\r
+    EFI_SIZE_TO_PAGES ((UINTN) (*(FreeMemoryTop) - *(FreeMemoryBottom)))));\r
     return  EFI_OUT_OF_RESOURCES;\r
   } else {\r
     //\r
     // Update the PHIT to reflect the memory usage\r
     //\r
-    Hob.HandoffInformationTable->EfiFreeMemoryTop -= Pages * EFI_PAGE_SIZE;\r
+    *(FreeMemoryTop) -= Pages * EFI_PAGE_SIZE;\r
 \r
     //\r
     // Update the value for the caller\r
     //\r
-    *Memory = Hob.HandoffInformationTable->EfiFreeMemoryTop;\r
+    *Memory = *(FreeMemoryTop);\r
 \r
     //\r
     // Create a memory allocation HOB.\r
     //\r
     BuildMemoryAllocationHob (\r
-      Hob.HandoffInformationTable->EfiFreeMemoryTop,\r
+      *(FreeMemoryTop),\r
       Pages * EFI_PAGE_SIZE,\r
       MemoryType\r
       );\r