]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Core/Pei/PeiMain/PeiMain.c
MdeModulePkg PeiCore: Remove the using of PcdPeiCoreMaxPeimPerFv
[mirror_edk2.git] / MdeModulePkg / Core / Pei / PeiMain / PeiMain.c
index 27484bafc575390feeded22d53e0f274011a3e1e..52adefeb44b4cfc969c1138887a63eb061aff2ed 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Pei Core Main Entry Point\r
-  \r
-Copyright (c) 2006 - 2016, Intel Corporation. All rights reserved.<BR>\r
+\r
+Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>\r
 This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -46,7 +46,7 @@ EFI_PEI_SERVICES  gPs = {
   PeiFfsFindNextFile,\r
   PeiFfsFindSectionData,\r
 \r
-  PeiInstallPeiMemory,      \r
+  PeiInstallPeiMemory,\r
   PeiAllocatePages,\r
   PeiAllocatePool,\r
   (EFI_PEI_COPY_MEM)CopyMem,\r
@@ -64,12 +64,13 @@ EFI_PEI_SERVICES  gPs = {
   PeiRegisterForShadow,\r
   PeiFfsFindSectionData3,\r
   PeiFfsGetFileInfo2,\r
-  PeiResetSystem2\r
+  PeiResetSystem2,\r
+  PeiFreePages,\r
 };\r
 \r
 /**\r
   Shadow PeiCore module from flash to installed memory.\r
-  \r
+\r
   @param PrivateData    PeiCore's private data structure\r
 \r
   @return PeiCore function address after shadowing.\r
@@ -103,7 +104,7 @@ ShadowPeiCore (
   Status = PeiLoadImage (\r
               GetPeiServicesTablePointer (),\r
               *((EFI_PEI_FILE_HANDLE*)&PeiCoreFileHandle),\r
-              PEIM_STATE_REGISITER_FOR_SHADOW,\r
+              PEIM_STATE_REGISTER_FOR_SHADOW,\r
               &EntryPoint,\r
               &AuthenticationState\r
               );\r
@@ -154,7 +155,7 @@ PeiCore (
   EFI_HOB_HANDOFF_INFO_TABLE  *HandoffInformationTable;\r
   EFI_PEI_TEMPORARY_RAM_DONE_PPI *TemporaryRamDonePpi;\r
   UINTN                       Index;\r
-  \r
+\r
   //\r
   // Retrieve context passed into PEI Core\r
   //\r
@@ -184,27 +185,39 @@ PeiCore (
       if (OldCoreData->HeapOffsetPositive) {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw + OldCoreData->HeapOffset);\r
         OldCoreData->UnknownFvInfo        = (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData->UnknownFvInfo + OldCoreData->HeapOffset);\r
-        OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->CurrentFvFileHandles + OldCoreData->HeapOffset);\r
+        if (OldCoreData->CurrentFvFileHandles != NULL) {\r
+          OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->CurrentFvFileHandles + OldCoreData->HeapOffset);\r
+        }\r
         OldCoreData->PpiData.PpiListPtrs  = (PEI_PPI_LIST_POINTERS *) ((UINT8 *) OldCoreData->PpiData.PpiListPtrs + OldCoreData->HeapOffset);\r
         OldCoreData->Fv                   = (PEI_CORE_FV_HANDLE *) ((UINT8 *) OldCoreData->Fv + OldCoreData->HeapOffset);\r
         for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {\r
-          OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData->Fv[Index].PeimState + OldCoreData->HeapOffset;\r
-          OldCoreData->Fv[Index].FvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->Fv[Index].FvFileHandles + OldCoreData->HeapOffset);\r
+          if (OldCoreData->Fv[Index].PeimState != NULL) {\r
+            OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData->Fv[Index].PeimState + OldCoreData->HeapOffset;\r
+          }\r
+          if (OldCoreData->Fv[Index].FvFileHandles != NULL) {\r
+            OldCoreData->Fv[Index].FvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->Fv[Index].FvFileHandles + OldCoreData->HeapOffset);\r
+          }\r
         }\r
-        OldCoreData->FileGuid             = (EFI_GUID *) ((UINT8 *) OldCoreData->FileGuid + OldCoreData->HeapOffset);\r
-        OldCoreData->FileHandles          = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->FileHandles + OldCoreData->HeapOffset);\r
+        OldCoreData->TempFileGuid         = (EFI_GUID *) ((UINT8 *) OldCoreData->TempFileGuid + OldCoreData->HeapOffset);\r
+        OldCoreData->TempFileHandles      = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->TempFileHandles + OldCoreData->HeapOffset);\r
       } else {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw - OldCoreData->HeapOffset);\r
         OldCoreData->UnknownFvInfo        = (PEI_CORE_UNKNOW_FORMAT_FV_INFO *) ((UINT8 *) OldCoreData->UnknownFvInfo - OldCoreData->HeapOffset);\r
-        OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->CurrentFvFileHandles - OldCoreData->HeapOffset);\r
+        if (OldCoreData->CurrentFvFileHandles != NULL) {\r
+          OldCoreData->CurrentFvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->CurrentFvFileHandles - OldCoreData->HeapOffset);\r
+        }\r
         OldCoreData->PpiData.PpiListPtrs  = (PEI_PPI_LIST_POINTERS *) ((UINT8 *) OldCoreData->PpiData.PpiListPtrs - OldCoreData->HeapOffset);\r
         OldCoreData->Fv                   = (PEI_CORE_FV_HANDLE *) ((UINT8 *) OldCoreData->Fv - OldCoreData->HeapOffset);\r
         for (Index = 0; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {\r
-          OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData->Fv[Index].PeimState - OldCoreData->HeapOffset;\r
-          OldCoreData->Fv[Index].FvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->Fv[Index].FvFileHandles - OldCoreData->HeapOffset);\r
+          if (OldCoreData->Fv[Index].PeimState != NULL) {\r
+            OldCoreData->Fv[Index].PeimState     = (UINT8 *) OldCoreData->Fv[Index].PeimState - OldCoreData->HeapOffset;\r
+          }\r
+          if (OldCoreData->Fv[Index].FvFileHandles != NULL) {\r
+            OldCoreData->Fv[Index].FvFileHandles = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->Fv[Index].FvFileHandles - OldCoreData->HeapOffset);\r
+          }\r
         }\r
-        OldCoreData->FileGuid             = (EFI_GUID *) ((UINT8 *) OldCoreData->FileGuid - OldCoreData->HeapOffset);\r
-        OldCoreData->FileHandles          = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->FileHandles - OldCoreData->HeapOffset);\r
+        OldCoreData->TempFileGuid         = (EFI_GUID *) ((UINT8 *) OldCoreData->TempFileGuid - OldCoreData->HeapOffset);\r
+        OldCoreData->TempFileHandles      = (EFI_PEI_FILE_HANDLE *) ((UINT8 *) OldCoreData->TempFileHandles - OldCoreData->HeapOffset);\r
       }\r
 \r
       //\r
@@ -231,6 +244,11 @@ PeiCore (
       HandoffInformationTable->EfiFreeMemoryTop    = OldCoreData->FreePhysicalMemoryTop;\r
       HandoffInformationTable->EfiFreeMemoryBottom = HandoffInformationTable->EfiEndOfHobList + sizeof (EFI_HOB_GENERIC_HEADER);\r
 \r
+      //\r
+      // We need convert MemoryBaseAddress in memory allocation HOBs\r
+      //\r
+      ConvertMemoryAllocationHobs (OldCoreData);\r
+\r
       //\r
       // We need convert the PPI descriptor's pointer\r
       //\r
@@ -246,7 +264,7 @@ PeiCore (
       // Indicate that PeiCore reenter\r
       //\r
       OldCoreData->PeimDispatcherReenter = TRUE;\r
-      \r
+\r
       if (PcdGet64(PcdLoadModuleAtFixAddressEnable) != 0 && (OldCoreData->HobList.HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME)) {\r
         //\r
         // if Loading Module at Fixed Address is enabled, allocate the PEI code memory range usage bit map array.\r
@@ -264,12 +282,12 @@ PeiCore (
           || (HandoffInformationTable->BootMode != BOOT_ON_S3_RESUME && PcdGetBool (PcdShadowPeimOnBoot))) {\r
         OldCoreData->ShadowedPeiCore = ShadowPeiCore (OldCoreData);\r
       }\r
-      \r
+\r
       //\r
       // PEI Core has now been shadowed to memory.  Restart PEI Core in memory.\r
       //\r
       OldCoreData->ShadowedPeiCore (SecCoreData, PpiList, OldCoreData);\r
-      \r
+\r
       //\r
       // Should never reach here.\r
       //\r
@@ -289,13 +307,13 @@ PeiCore (
 \r
     CpuIo = (VOID*)PrivateData.ServiceTableShadow.CpuIo;\r
     PciCfg = (VOID*)PrivateData.ServiceTableShadow.PciCfg;\r
-    \r
+\r
     CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));\r
-    \r
+\r
     PrivateData.ServiceTableShadow.CpuIo  = CpuIo;\r
     PrivateData.ServiceTableShadow.PciCfg = PciCfg;\r
   }\r
-  \r
+\r
   //\r
   // Cache a pointer to the PEI Services Table that is either in temporary memory or permanent memory\r
   //\r
@@ -314,7 +332,7 @@ PeiCore (
   //\r
   // Initialize PEI Core Services\r
   //\r
-  InitializeMemoryServices   (&PrivateData,    SecCoreData, OldCoreData);\r
+  InitializeMemoryServices   (&PrivateData, SecCoreData, OldCoreData);\r
   if (OldCoreData == NULL) {\r
     //\r
     // Initialize PEI Core Private Data Buffer\r
@@ -323,53 +341,38 @@ PeiCore (
     ASSERT (PrivateData.PpiData.PpiListPtrs != NULL);\r
     PrivateData.Fv                   = AllocateZeroPool (sizeof (PEI_CORE_FV_HANDLE) * PcdGet32 (PcdPeiCoreMaxFvSupported));\r
     ASSERT (PrivateData.Fv != NULL);\r
-    PrivateData.Fv[0].PeimState      = AllocateZeroPool (sizeof (UINT8) * PcdGet32 (PcdPeiCoreMaxPeimPerFv) * PcdGet32 (PcdPeiCoreMaxFvSupported));\r
-    ASSERT (PrivateData.Fv[0].PeimState != NULL);\r
-    PrivateData.Fv[0].FvFileHandles  = AllocateZeroPool (sizeof (EFI_PEI_FILE_HANDLE) * PcdGet32 (PcdPeiCoreMaxPeimPerFv) * PcdGet32 (PcdPeiCoreMaxFvSupported));\r
-    ASSERT (PrivateData.Fv[0].FvFileHandles != NULL);\r
-    for (Index = 1; Index < PcdGet32 (PcdPeiCoreMaxFvSupported); Index ++) {\r
-      PrivateData.Fv[Index].PeimState     = PrivateData.Fv[Index - 1].PeimState + PcdGet32 (PcdPeiCoreMaxPeimPerFv);\r
-      PrivateData.Fv[Index].FvFileHandles = PrivateData.Fv[Index - 1].FvFileHandles + PcdGet32 (PcdPeiCoreMaxPeimPerFv);\r
-    }\r
     PrivateData.UnknownFvInfo        = AllocateZeroPool (sizeof (PEI_CORE_UNKNOW_FORMAT_FV_INFO) * PcdGet32 (PcdPeiCoreMaxFvSupported));\r
     ASSERT (PrivateData.UnknownFvInfo != NULL);\r
-    PrivateData.CurrentFvFileHandles = AllocateZeroPool (sizeof (EFI_PEI_FILE_HANDLE) * PcdGet32 (PcdPeiCoreMaxPeimPerFv));\r
-    ASSERT (PrivateData.CurrentFvFileHandles != NULL);\r
-    PrivateData.FileGuid             = AllocatePool (sizeof (EFI_GUID) * PcdGet32 (PcdPeiCoreMaxPeimPerFv));\r
-    ASSERT (PrivateData.FileGuid != NULL);\r
-    PrivateData.FileHandles          = AllocatePool (sizeof (EFI_PEI_FILE_HANDLE) * (PcdGet32 (PcdPeiCoreMaxPeimPerFv) + 1));\r
-    ASSERT (PrivateData.FileHandles != NULL);\r
   }\r
   InitializePpiServices      (&PrivateData,    OldCoreData);\r
-  \r
+\r
   //\r
-  // Update performance measurements \r
+  // Update performance measurements\r
   //\r
   if (OldCoreData == NULL) {\r
-    PERF_START (NULL, "SEC", NULL, 1);\r
-    PERF_END   (NULL, "SEC", NULL, 0);\r
+    PERF_EVENT ("SEC"); // Means the end of SEC phase.\r
 \r
     //\r
     // If first pass, start performance measurement.\r
     //\r
-    PERF_START (NULL,"PEI",    NULL, 0);\r
-    PERF_START (NULL,"PreMem", NULL, 0);\r
+    PERF_CROSSMODULE_BEGIN ("PEI");\r
+    PERF_INMODULE_BEGIN ("PreMem");\r
 \r
   } else {\r
-    PERF_END   (NULL,"PreMem",  NULL, 0);\r
-    PERF_START (NULL,"PostMem", NULL, 0);\r
+    PERF_INMODULE_END ("PreMem");\r
+    PERF_INMODULE_BEGIN ("PostMem");\r
   }\r
 \r
   //\r
   // Complete PEI Core Service initialization\r
-  //  \r
+  //\r
   InitializeSecurityServices (&PrivateData.Ps, OldCoreData);\r
   InitializeDispatcherData   (&PrivateData,    OldCoreData, SecCoreData);\r
   InitializeImageServices    (&PrivateData,    OldCoreData);\r
 \r
   //\r
   // Perform PEI Core Phase specific actions\r
-  //  \r
+  //\r
   if (OldCoreData == NULL) {\r
     //\r
     // Report Status Code EFI_SW_PC_INIT\r
@@ -378,13 +381,12 @@ PeiCore (
       EFI_PROGRESS_CODE,\r
       (EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT)\r
       );\r
-      \r
+\r
     //\r
-    // If SEC provided any PPI services to PEI, install them.\r
+    // If SEC provided the PpiList, process it.\r
     //\r
     if (PpiList != NULL) {\r
-      Status = PeiServicesInstallPpi (PpiList);\r
-      ASSERT_EFI_ERROR (Status);\r
+      ProcessPpiListFromSec ((CONST EFI_PEI_SERVICES **) &PrivateData.Ps, PpiList);\r
     }\r
   } else {\r
     //\r
@@ -406,7 +408,7 @@ PeiCore (
     //\r
     // Alert any listeners that there is permanent memory available\r
     //\r
-    PERF_START (NULL,"DisMem", NULL, 0);\r
+    PERF_INMODULE_BEGIN ("DisMem");\r
     Status = PeiServicesInstallPpi (&mMemoryDiscoveredPpi);\r
 \r
     //\r
@@ -414,7 +416,7 @@ PeiCore (
     //\r
     ProcessNotifyList (&PrivateData);\r
 \r
-    PERF_END (NULL,"DisMem", NULL, 0);\r
+    PERF_INMODULE_END ("DisMem");\r
   }\r
 \r
   //\r
@@ -432,7 +434,7 @@ PeiCore (
   //\r
   // Measure PEI Core execution time.\r
   //\r
-  PERF_END (NULL, "PostMem", NULL, 0);\r
+  PERF_INMODULE_END ("PostMem");\r
 \r
   //\r
   // Lookup DXE IPL PPI\r