]> git.proxmox.com Git - mirror_edk2.git/commitdiff
1) Call ProcessNotifyList() to process all Dispatch Notifications after the Memory...
authormdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 29 Jun 2010 06:08:14 +0000 (06:08 +0000)
committermdkinney <mdkinney@6f19259b-4bc3-4df7-8a09-765794883524>
Tue, 29 Jun 2010 06:08:14 +0000 (06:08 +0000)
2) Add ProcessLibraryConstructorList() call when OldCoreData != NULL and OldCoreData->ShadowedPeiCore == NULL.
3) Make sure no lib functions are used prior to the ProcessLibraryConstructorList() call.
4) Clean up comments

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@10611 6f19259b-4bc3-4df7-8a09-765794883524

MdeModulePkg/Core/Pei/PeiMain/PeiMain.c

index bf99e4bd4c2229e24b59e345a345e98a72cef003..0c0b270b3ab6b9fa50255551e5ed66657f34bb70 100644 (file)
@@ -143,39 +143,47 @@ PeiCore (
   PEI_CORE_INSTANCE           PrivateData;\r
   EFI_STATUS                  Status;\r
   PEI_CORE_TEMP_POINTERS      TempPtr;\r
   PEI_CORE_INSTANCE           PrivateData;\r
   EFI_STATUS                  Status;\r
   PEI_CORE_TEMP_POINTERS      TempPtr;\r
-  UINT64                      Tick;\r
   PEI_CORE_INSTANCE           *OldCoreData;\r
   EFI_PEI_CPU_IO_PPI          *CpuIo;\r
   EFI_PEI_PCI_CFG2_PPI        *PciCfg;\r
   EFI_HOB_HANDOFF_INFO_TABLE  *HandoffInformationTable;\r
 \r
   PEI_CORE_INSTANCE           *OldCoreData;\r
   EFI_PEI_CPU_IO_PPI          *CpuIo;\r
   EFI_PEI_PCI_CFG2_PPI        *PciCfg;\r
   EFI_HOB_HANDOFF_INFO_TABLE  *HandoffInformationTable;\r
 \r
-  Tick = 0;\r
+  //\r
+  // Retrieve context passed into PEI Core\r
+  //\r
   OldCoreData = (PEI_CORE_INSTANCE *)Data;\r
 \r
   //\r
   OldCoreData = (PEI_CORE_INSTANCE *)Data;\r
 \r
   //\r
-  // Record the system tick for first entering PeiCore.\r
-  // This tick is duration of executing platform seccore module.\r
-  // \r
-  if (PerformanceMeasurementEnabled()) {\r
-    if (OldCoreData == NULL) {\r
-      Tick = GetPerformanceCounter ();\r
-    }\r
-  }\r
-\r
-  if (OldCoreData != NULL) {\r
+  // Perform PEI Core phase specific actions.\r
+  //\r
+  if (OldCoreData == NULL) {\r
+    //\r
+    // If OldCoreData is NULL, means current is the first entry into the PEI Core before memory is available.\r
+    //\r
+    ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));\r
+    PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;\r
+    CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));\r
+  } else {\r
+    //\r
+    // Memory is available to the PEI Core.  See if the PEI Core has been shadowed to memory yet.\r
+    //\r
     if (OldCoreData->ShadowedPeiCore == NULL) {\r
     if (OldCoreData->ShadowedPeiCore == NULL) {\r
-      //\r
       //\r
       // Fixup the PeiCore's private data\r
       //\r
       //\r
       // Fixup the PeiCore's private data\r
       //\r
-      OldCoreData->Ps          = &OldCoreData->ServiceTableShadow;\r
-      OldCoreData->CpuIo       = &OldCoreData->ServiceTableShadow.CpuIo;\r
+      OldCoreData->Ps    = &OldCoreData->ServiceTableShadow;\r
+      OldCoreData->CpuIo = &OldCoreData->ServiceTableShadow.CpuIo;\r
       if (OldCoreData->HeapOffsetPositive) {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw + OldCoreData->HeapOffset);\r
       } else {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw - OldCoreData->HeapOffset);\r
       }\r
 \r
       if (OldCoreData->HeapOffsetPositive) {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw + OldCoreData->HeapOffset);\r
       } else {\r
         OldCoreData->HobList.Raw = (VOID *)(OldCoreData->HobList.Raw - OldCoreData->HeapOffset);\r
       }\r
 \r
+      //\r
+      // Initialize libraries that the PEI Core is linked against\r
+      //\r
+      ProcessLibraryConstructorList (NULL, (CONST EFI_PEI_SERVICES **)&OldCoreData->Ps);\r
+      \r
       //\r
       // Fixup for PeiService's address\r
       //\r
       //\r
       // Fixup for PeiService's address\r
       //\r
@@ -219,12 +227,6 @@ PeiCore (
         OldCoreData->PeiCodeMemoryRangeUsageBitMap = AllocateZeroPool (((PcdGet32(PcdLoadFixAddressPeiCodePageNumber)>>6) + 1)*sizeof(UINT64));\r
       }\r
 \r
         OldCoreData->PeiCodeMemoryRangeUsageBitMap = AllocateZeroPool (((PcdGet32(PcdLoadFixAddressPeiCodePageNumber)>>6) + 1)*sizeof(UINT64));\r
       }\r
 \r
-      //\r
-      // Process the Notify list and dispatch any notifies for\r
-      // newly installed PPIs.\r
-      //\r
-      ProcessNotifyList (OldCoreData);\r
-\r
       //\r
       // Shadow PEI Core. When permanent memory is avaiable, shadow\r
       // PEI Core and PEIMs to get high performance.\r
       //\r
       // Shadow PEI Core. When permanent memory is avaiable, shadow\r
       // PEI Core and PEIMs to get high performance.\r
@@ -232,12 +234,21 @@ PeiCore (
       OldCoreData->ShadowedPeiCore = ShadowPeiCore (OldCoreData);\r
       \r
       //\r
       OldCoreData->ShadowedPeiCore = ShadowPeiCore (OldCoreData);\r
       \r
       //\r
-      // PeiCore has been shadowed to memory for first entering, so\r
-      // just jump to PeiCore in memory here.\r
+      // PEI Core has now been shadowed to memory.  Restart PEI Core in memory.\r
       //\r
       OldCoreData->ShadowedPeiCore (SecCoreData, PpiList, OldCoreData);\r
       //\r
       OldCoreData->ShadowedPeiCore (SecCoreData, PpiList, OldCoreData);\r
+      \r
+      //\r
+      // Should never reach here.\r
+      //\r
+      ASSERT (FALSE);\r
+      CpuDeadLoop();\r
     }\r
 \r
     }\r
 \r
+    //\r
+    // Memory is available to the PEI Core and the PEI Core has been shadowed to memory.\r
+    //\r
+    \r
     CopyMem (&PrivateData, OldCoreData, sizeof (PrivateData));\r
     \r
     CpuIo = (VOID*)PrivateData.ServiceTableShadow.CpuIo;\r
     CopyMem (&PrivateData, OldCoreData, sizeof (PrivateData));\r
     \r
     CpuIo = (VOID*)PrivateData.ServiceTableShadow.CpuIo;\r
@@ -247,47 +258,58 @@ PeiCore (
     \r
     PrivateData.ServiceTableShadow.CpuIo  = CpuIo;\r
     PrivateData.ServiceTableShadow.PciCfg = PciCfg;\r
     \r
     PrivateData.ServiceTableShadow.CpuIo  = CpuIo;\r
     PrivateData.ServiceTableShadow.PciCfg = PciCfg;\r
-  } else {\r
-    //\r
-    // If OldCoreData is NULL, means current is first Peicore's entering.\r
-    //\r
-    \r
-    ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));\r
-    PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;\r
-    CopyMem (&PrivateData.ServiceTableShadow, &gPs, sizeof (gPs));\r
   }\r
   }\r
-\r
+  \r
+  //\r
+  // Cache a pointer to the PEI Services Table that is either in temporary memory or permanent memory\r
+  //\r
   PrivateData.Ps = &PrivateData.ServiceTableShadow;\r
 \r
   //\r
   PrivateData.Ps = &PrivateData.ServiceTableShadow;\r
 \r
   //\r
-  // Initialize libraries that the PeiCore is linked against\r
+  // Initialize libraries that the PEI Core is linked against\r
   //\r
   ProcessLibraryConstructorList (NULL, (CONST EFI_PEI_SERVICES **)&PrivateData.Ps);\r
 \r
   //\r
   ProcessLibraryConstructorList (NULL, (CONST EFI_PEI_SERVICES **)&PrivateData.Ps);\r
 \r
-  InitializeMemoryServices (&PrivateData, SecCoreData, OldCoreData);\r
-\r
-  InitializePpiServices (&PrivateData, OldCoreData);\r
-\r
   //\r
   // Save PeiServicePointer so that it can be retrieved anywhere.\r
   //\r
   //\r
   // Save PeiServicePointer so that it can be retrieved anywhere.\r
   //\r
-  SetPeiServicesTablePointer((CONST EFI_PEI_SERVICES **) &PrivateData.Ps);\r
-  \r
-  if (OldCoreData != NULL) {\r
+  SetPeiServicesTablePointer ((CONST EFI_PEI_SERVICES **)&PrivateData.Ps);\r
 \r
 \r
-    PERF_END (NULL,"PreMem", NULL, 0);\r
-    PERF_START (NULL,"PostMem", NULL, 0);\r
+  //\r
+  // Initialize PEI Core Services\r
+  //  \r
+  InitializeMemoryServices   (&PrivateData,    SecCoreData, OldCoreData);\r
+  InitializePpiServices      (&PrivateData,    OldCoreData);\r
+  \r
+  //\r
+  // Update performance measurements \r
+  //\r
+  if (OldCoreData == NULL) {\r
+    PERF_START (NULL, "SEC", NULL, 1);\r
+    PERF_END   (NULL, "SEC", NULL, 0);\r
 \r
     //\r
 \r
     //\r
-    // Alert any listeners that there is permanent memory available\r
+    // If first pass, start performance measurement.\r
     //\r
     //\r
-    \r
-    PERF_START (NULL,"DisMem", NULL, 0);\r
-    Status = PeiServicesInstallPpi (&mMemoryDiscoveredPpi);\r
-    PERF_END (NULL,"DisMem", NULL, 0);\r
+    PERF_START (NULL,"PEI",    NULL, 0);\r
+    PERF_START (NULL,"PreMem", NULL, 0);\r
 \r
   } else {\r
 \r
   } else {\r
+    PERF_END   (NULL,"PreMem",  NULL, 0);\r
+    PERF_START (NULL,"PostMem", NULL, 0);\r
+  }\r
+\r
+  //\r
+  // Complete PEI Core Service initialization\r
+  //  \r
+  InitializeSecurityServices (&PrivateData.Ps, OldCoreData);\r
+  InitializeDispatcherData   (&PrivateData,    OldCoreData, SecCoreData);\r
+  InitializeImageServices    (&PrivateData,    OldCoreData);\r
 \r
 \r
+  //\r
+  // Perform PEI Core Phase specific actions\r
+  //  \r
+  if (OldCoreData == NULL) {\r
     //\r
     // Report Status Code EFI_SW_PC_INIT\r
     //\r
     //\r
     // Report Status Code EFI_SW_PC_INIT\r
     //\r
@@ -296,15 +318,6 @@ PeiCore (
       (EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT)\r
       );\r
       \r
       (EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT)\r
       );\r
       \r
-    PERF_START (NULL, "SEC", NULL, 1);\r
-    PERF_END (NULL, "SEC", NULL, Tick);\r
-\r
-    PERF_START (NULL,"PEI", NULL, Tick);\r
-    //\r
-    // If first pass, start performance measurement.\r
-    //\r
-    PERF_START (NULL,"PreMem", NULL, Tick);\r
-\r
     //\r
     // If SEC provided any PPI services to PEI, install them.\r
     //\r
     //\r
     // If SEC provided any PPI services to PEI, install them.\r
     //\r
@@ -312,16 +325,20 @@ PeiCore (
       Status = PeiServicesInstallPpi (PpiList);\r
       ASSERT_EFI_ERROR (Status);\r
     }\r
       Status = PeiServicesInstallPpi (PpiList);\r
       ASSERT_EFI_ERROR (Status);\r
     }\r
-  }\r
-\r
-  InitializeSecurityServices (&PrivateData.Ps, OldCoreData);\r
+  } else {\r
+    //\r
+    // Alert any listeners that there is permanent memory available\r
+    //\r
+    PERF_START (NULL,"DisMem", NULL, 0);\r
+    Status = PeiServicesInstallPpi (&mMemoryDiscoveredPpi);\r
 \r
 \r
-  InitializeDispatcherData (&PrivateData, OldCoreData, SecCoreData);\r
+    //\r
+    // Process the Notify list and dispatch any notifies for the Memory Discovered PPI\r
+    //\r
+    ProcessNotifyList (&PrivateData);\r
 \r
 \r
-  //\r
-  // Install Pei Load File PPI. \r
-  //\r
-  InitializeImageServices (&PrivateData, OldCoreData);\r
+    PERF_END (NULL,"DisMem", NULL, 0);\r
+  }\r
 \r
   //\r
   // Call PEIM dispatcher\r
 \r
   //\r
   // Call PEIM dispatcher\r
@@ -334,11 +351,13 @@ PeiCore (
   ASSERT(PrivateData.PeiMemoryInstalled == TRUE);\r
 \r
   //\r
   ASSERT(PrivateData.PeiMemoryInstalled == TRUE);\r
 \r
   //\r
-  // Till now, PEI phase will be finished, get performace count\r
-  // for computing duration of PEI phase\r
+  // Measure PEI Core execution time.\r
   //\r
   PERF_END (NULL, "PostMem", NULL, 0);\r
 \r
   //\r
   PERF_END (NULL, "PostMem", NULL, 0);\r
 \r
+  //\r
+  // Lookup DXE IPL PPI\r
+  //\r
   Status = PeiServicesLocatePpi (\r
              &gEfiDxeIplPpiGuid,\r
              0,\r
   Status = PeiServicesLocatePpi (\r
              &gEfiDxeIplPpiGuid,\r
              0,\r
@@ -362,5 +381,3 @@ PeiCore (
   ASSERT_EFI_ERROR (Status);\r
   CpuDeadLoop();\r
 }\r
   ASSERT_EFI_ERROR (Status);\r
   CpuDeadLoop();\r
 }\r
-\r
-\r