]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/Memory/MemoryServices.c
Fix a bug that Pages*EFI_PAGES_SIZE might be a negative number.
[mirror_edk2.git] / MdeModulePkg / Core / Pei / Memory / MemoryServices.c
index de32b69bd2ce868a80a1797ad12dfb1796c3d89c..3e424ad1a5262b5062991b8603bc2d401bdc7414 100644 (file)
@@ -12,14 +12,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 \r
 **/\r
 \r
-#include <PeiMain.h>\r
+#include "PeiMain.h"\r
 \r
 /**\r
 \r
   Initialize the memory services.\r
 \r
-\r
-  @param PrivateData     Add parameter description\r
+  @param PrivateData     Points to PeiCore's private instance data.\r
   @param 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
@@ -35,7 +34,7 @@ InitializeMemoryServices (
   )\r
 {\r
   \r
-  PrivateData->SwitchStackSignal      = FALSE;\r
+  PrivateData->SwitchStackSignal    = FALSE;\r
 \r
   //\r
   // First entering PeiCore, following code will initialized some field\r
@@ -44,24 +43,11 @@ InitializeMemoryServices (
   if (OldCoreData == NULL) {\r
 \r
     PrivateData->PeiMemoryInstalled = FALSE;\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
-      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
+    PrivateData->HobList.Raw        = SecCoreData->PeiTemporaryRamBase;\r
     \r
     PeiCoreBuildHobHandoffInfoTable (\r
       BOOT_WITH_FULL_CONFIGURATION,\r
-      (EFI_PHYSICAL_ADDRESS) (UINTN) PrivateData->BottomOfCarHeap,\r
+      (EFI_PHYSICAL_ADDRESS) (UINTN) SecCoreData->PeiTemporaryRamBase,\r
       (UINTN) SecCoreData->PeiTemporaryRamSize\r
       );\r
 \r
@@ -76,12 +62,16 @@ InitializeMemoryServices (
 \r
 /**\r
 \r
-  Install the permanent memory is now available.\r
-  Creates HOB (PHIT and Stack).\r
+  This function registers the found memory configuration with the PEI Foundation.\r
 \r
-  @param PeiServices     - The PEI core services table.\r
-  @param MemoryBegin     - Start of memory address.\r
-  @param MemoryLength    - Length of memory.\r
+  The usage model is that the PEIM that discovers the permanent memory shall invoke this service.\r
+  This routine will hold discoveried memory information into PeiCore's private data,\r
+  and set SwitchStackSignal flag. After PEIM who discovery memory is dispatched,\r
+  PeiDispatcher will migrate temporary memory to permenement memory.\r
+  \r
+  @param PeiServices        An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
+  @param MemoryBegin        Start of memory address.\r
+  @param MemoryLength       Length of memory.\r
 \r
   @return EFI_SUCCESS Always success.\r
 \r
@@ -114,13 +104,12 @@ PeiInstallPeiMemory (
   not usable prior to the memory installation.\r
 \r
 \r
-  @param PeiServices     - The PEI core services table.\r
-  @param MemoryType      Type of memory to allocate.\r
-  @param Pages           Number of pages to allocate.\r
-  @param Memory          Pointer of memory allocated.\r
+  @param PeiServices     An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
+  @param MemoryType      Type of memory to allocate.\r
+  @param Pages           Number of pages to allocate.\r
+  @param Memory          Pointer of memory allocated.\r
 \r
   @retval EFI_SUCCESS              The allocation was successful\r
-  @retval EFI_INVALID_PARAMETER    Only AllocateAnyAddress is supported.\r
   @retval EFI_NOT_AVAILABLE_YET    Called with permanent memory not available\r
   @retval EFI_OUT_OF_RESOURCES     There is not enough HOB heap to satisfy the requirement\r
                                    to allocate the number of pages.\r
@@ -129,17 +118,17 @@ PeiInstallPeiMemory (
 EFI_STATUS\r
 EFIAPI\r
 PeiAllocatePages (\r
-  IN CONST EFI_PEI_SERVICES           **PeiServices,\r
-  IN EFI_MEMORY_TYPE            MemoryType,\r
-  IN UINTN                      Pages,\r
-  OUT EFI_PHYSICAL_ADDRESS      *Memory\r
+  IN CONST EFI_PEI_SERVICES     **PeiServices,\r
+  IN       EFI_MEMORY_TYPE      MemoryType,\r
+  IN       UINTN                Pages,\r
+  OUT      EFI_PHYSICAL_ADDRESS *Memory\r
   )\r
 {\r
   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
+  UINTN                                   RemainingPages;\r
 \r
   PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (PeiServices);\r
   Hob.Raw     = PrivateData->HobList.Raw;\r
@@ -150,7 +139,7 @@ PeiAllocatePages (
   if (!PrivateData->PeiMemoryInstalled) {\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
+    // the AllocatePage will depend on the field of PEI_CORE_INSTANCE structure.\r
     //\r
     if (!PrivateData->SwitchStackSignal) {\r
       return EFI_NOT_AVAILABLE_YET;\r
@@ -164,25 +153,17 @@ PeiAllocatePages (
   }\r
 \r
   //\r
-  // Check to see if on 4k boundary\r
+  // Check to see if on 4k boundary, If not aligned, make the allocation aligned.\r
   //\r
-  Offset = *(FreeMemoryTop) & 0xFFF;\r
-  \r
-  //\r
-  // If not aligned, make the allocation aligned.\r
-  //\r
-  if (Offset != 0) {\r
-    *(FreeMemoryTop) -= Offset;\r
-  }\r
+  *(FreeMemoryTop) -= *(FreeMemoryTop) & 0xFFF;\r
   \r
   //\r
   // Verify that there is sufficient memory to satisfy the allocation\r
   //\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) (*(FreeMemoryTop) - *(FreeMemoryBottom)))));\r
+  RemainingPages = EFI_SIZE_TO_PAGES ((UINTN) (*FreeMemoryTop - *FreeMemoryBottom));\r
+  if ((INTN) (RemainingPages - EFI_SIZE_TO_PAGES (sizeof (EFI_HOB_MEMORY_ALLOCATION))) < Pages) {\r
+    DEBUG ((EFI_D_ERROR, "AllocatePages failed: No 0x%lx Pages is available.\n", (UINT64) Pages));\r
+    DEBUG ((EFI_D_ERROR, "There is only left 0x%lx pages memory resource to be allocated.\n", (UINT64) RemainingPages));\r
     return  EFI_OUT_OF_RESOURCES;\r
   } else {\r
     //\r
@@ -210,12 +191,14 @@ PeiAllocatePages (
 \r
 /**\r
 \r
-  Memory allocation service on the CAR.\r
+  Pool allocation service. Before permenent memory is discoveried, the pool will \r
+  be allocated the heap in the CAR. Genenrally, the size of heap in temporary \r
+  memory does not exceed to 64K, so the biggest pool size could be allocated is \r
+  64K.\r
 \r
-\r
-  @param PeiServices     - The PEI core services table.\r
-  @param Size            - Amount of memory required\r
-  @param Buffer          - Address of pointer to the buffer\r
+  @param PeiServices               An indirect pointer to the EFI_PEI_SERVICES table published by the PEI Foundation.\r
+  @param Size                      Amount of memory required\r
+  @param Buffer                    Address of pointer to the buffer\r
 \r
   @retval EFI_SUCCESS              The allocation was successful\r
   @retval EFI_OUT_OF_RESOURCES     There is not enough heap to satisfy the requirement\r
@@ -225,26 +208,30 @@ PeiAllocatePages (
 EFI_STATUS\r
 EFIAPI\r
 PeiAllocatePool (\r
-  IN CONST EFI_PEI_SERVICES           **PeiServices,\r
-  IN UINTN                      Size,\r
-  OUT VOID                      **Buffer\r
+  IN CONST EFI_PEI_SERVICES     **PeiServices,\r
+  IN       UINTN                Size,\r
+  OUT      VOID                 **Buffer\r
   )\r
 {\r
   EFI_STATUS               Status;\r
   EFI_HOB_MEMORY_POOL      *Hob;\r
 \r
- //\r
- // If some "post-memory" PEIM wishes to allocate larger pool,\r
- // it should use AllocatePages service instead.\r
- //\r
- ASSERT (Size < 0x10000 - sizeof (EFI_HOB_MEMORY_POOL));\r
- Status = PeiServicesCreateHob (\r
+  //\r
+  // If some "post-memory" PEIM wishes to allocate larger pool,\r
+  // it should use AllocatePages service instead.\r
+  //\r
+  \r
+  //\r
+  // Generally, the size of heap in temporary memory does not exceed to 64K,\r
+  // so the maxmium size of pool is 0x10000 - sizeof (EFI_HOB_MEMORY_POOL)\r
+  //\r
+  ASSERT (Size < 0x10000 - sizeof (EFI_HOB_MEMORY_POOL));\r
+  Status = PeiServicesCreateHob (\r
              EFI_HOB_TYPE_MEMORY_POOL,\r
              (UINT16)(sizeof (EFI_HOB_MEMORY_POOL) + Size),\r
              (VOID **)&Hob\r
              );\r
   *Buffer = Hob+1;  \r
 \r
-\r
   return Status;\r
 }\r