]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Memory/MemoryServices.c
Modify all file header to follow doxygen format
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Memory / MemoryServices.c
index 728b963afafd2e9bbd6fa4ff1bdb3edf720069f7..f4212c849eb5819d8ea508dc44d3cc3048688032 100644 (file)
@@ -1,4 +1,4 @@
-/*++\r
+/** @file\r
 \r
 Copyright (c) 2006, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials                          \r
@@ -17,7 +17,7 @@ Abstract:
 \r
   EFI PEI Core memory services\r
 \r
---*/\r
+**/\r
 \r
 #include <PeiMain.h>\r
 \r
@@ -49,15 +49,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 +88,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,57 +112,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
-  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
-  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)(MemoryBegin + 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
-\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
-  ConvertPpiPointers (PeiServices, OldHandOffHob, NewHandOffHob);\r
+  DEBUG ((EFI_D_INFO, "PeiInstallPeiMemory MemoryBegin 0x%LX, MemoryLength 0x%LX\n", MemoryBegin, MemoryLength));\r
+  PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\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
@@ -199,55 +160,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
+  \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