]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkModulePkg/Core/Pei/PeiMain/PeiMain.c
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@319 6f19259b...
[mirror_edk2.git] / EdkModulePkg / Core / Pei / PeiMain / PeiMain.c
index 014c571c05eaf208a228463f6ccc95e1868b28d2..7b4c2f99a6326733556ac1c7f50b9ddf4a730fb7 100644 (file)
-/*++\r
-\r
-Copyright (c) 2006, Intel Corporation\r
-All rights reserved. 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
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
-\r
-Module Name:\r
-\r
-  PeiMain.c\r
-\r
-Abstract:\r
-\r
-  Pei Core Main Entry Point\r
-\r
-Revision History\r
-\r
---*/\r
-\r
-#include <PeiMain.h>\r
-\r
-//\r
-//CAR is filled with this initial value during SEC phase\r
-//\r
-#define INIT_CAR_VALUE 0x5AA55AA5\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
-//\r
-// Pei Core Module Variables\r
-//\r
-//\r
-static EFI_PEI_SERVICES  mPS = {\r
-  {\r
-    PEI_SERVICES_SIGNATURE,\r
-    PEI_SERVICES_REVISION,\r
-    sizeof (EFI_PEI_SERVICES),\r
-    0,\r
-    0\r
-  },\r
-  PeiInstallPpi,\r
-  PeiReInstallPpi,\r
-  PeiLocatePpi,\r
-  PeiNotifyPpi,\r
-\r
-  PeiGetBootMode,\r
-  PeiSetBootMode,\r
-\r
-  PeiGetHobList,\r
-  PeiCreateHob,\r
-\r
-  PeiFvFindNextVolume,\r
-  PeiFfsFindNextFile,\r
-  PeiFfsFindSectionData,\r
-\r
-  PeiInstallPeiMemory,\r
-  PeiAllocatePages,\r
-  PeiAllocatePool,\r
-  (EFI_PEI_COPY_MEM)CopyMem,\r
-  (EFI_PEI_SET_MEM)SetMem,\r
-\r
-  PeiReportStatusCode,\r
-\r
-  PeiResetSystem\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-PeiCore (\r
-  IN EFI_PEI_STARTUP_DESCRIPTOR  *PeiStartupDescriptor,\r
-  IN PEI_CORE_INSTANCE           *OldCoreData\r
-  )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  The entry routine to Pei Core, invoked by PeiMain during transition\r
-  from SEC to PEI. After switching stack in the PEI core, it will restart\r
-  with the old core data.\r
-\r
-Arguments:\r
-\r
-  PeiStartupDescriptor - Information and services provided by SEC phase.\r
-  OldCoreData          - Pointer to old core data that is used to initialize the\r
-                         core's data areas.\r
-\r
-Returns:\r
-\r
-  This function never returns\r
-  EFI_NOT_FOUND        - Never reach\r
-\r
---*/\r
-{\r
-  PEI_CORE_INSTANCE                                     PrivateData;\r
-  EFI_STATUS                                            Status;\r
-  PEI_CORE_TEMP_POINTERS                                TempPtr;\r
-  PEI_CORE_DISPATCH_DATA                                *DispatchData;\r
-  UINT64                                                mTick;\r
-\r
-  mTick = 0;\r
-\r
-#ifdef EFI_PEI_PERFORMANCE\r
-  if (OldCoreData == NULL) {\r
-    mTick = GetPerformanceCounter ();\r
-  }\r
-#endif\r
-\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 (OldCoreData);\r
-\r
-  if (OldCoreData != NULL) {\r
-    CopyMem (&PrivateData, OldCoreData, sizeof (PEI_CORE_INSTANCE));\r
-  } else {\r
-    ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));\r
-  }\r
-\r
-  PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;\r
-  PrivateData.PS = &mPS;\r
-\r
-  //\r
-  // Initialize libraries that the PeiCore is linked against\r
-  // BUGBUG: The FfsHeader is passed in as NULL.  Do we look it up or remove it from the lib init?\r
-  //\r
-  ProcessLibraryConstructorList (NULL, &PrivateData.PS);\r
-\r
-  InitializeMemoryServices (&PrivateData.PS, PeiStartupDescriptor, OldCoreData);\r
-\r
-  InitializePpiServices (&PrivateData.PS, OldCoreData);\r
-\r
-  InitializeSecurityServices (&PrivateData.PS, OldCoreData);\r
-\r
-  InitializeDispatcherData (&PrivateData.PS, OldCoreData, PeiStartupDescriptor);\r
-\r
-  if (OldCoreData != NULL) {\r
-\r
-    PERF_END (NULL,"PreMem", NULL, 0);\r
-    PERF_START (NULL,"PostMem", NULL, 0);\r
-\r
-    //\r
-    // The following code dumps out interesting cache as RAM usage information\r
-    // so we can keep tabs on how the cache as RAM is being utilized.  The\r
-    // DEBUG_CODE macro is used to prevent this code from being compiled\r
-    // on a debug build.\r
-    //\r
-    DEBUG_CODE (\r
-      UINTN  *StackPointer;\r
-      UINTN  StackValue;\r
-\r
-      StackValue = INIT_CAR_VALUE;\r
-      for (StackPointer = (UINTN *) OldCoreData->MaxTopOfCarHeap;\r
-           ((UINTN) StackPointer < ((UINTN) OldCoreData->BottomOfCarHeap + OldCoreData->SizeOfCacheAsRam))\r
-           && StackValue == INIT_CAR_VALUE;\r
-           StackPointer++) {\r
-        StackValue = *StackPointer;\r
-      }\r
-\r
-      DEBUG ((EFI_D_INFO, "Total Cache as RAM:    %d bytes.\n", OldCoreData->SizeOfCacheAsRam));\r
-      DEBUG ((EFI_D_INFO, "  CAR stack ever used: %d bytes.\n",\r
-        ((UINTN) OldCoreData->TopOfCarHeap - (UINTN) StackPointer)\r
-        ));\r
-      DEBUG ((EFI_D_INFO, "  CAR heap used:       %d bytes.\n",\r
-        ((UINTN) OldCoreData->HobList.HandoffInformationTable->EfiFreeMemoryBottom -\r
-        (UINTN) OldCoreData->HobList.Raw)\r
-        ));\r
-    );\r
-\r
-    //\r
-    // Alert any listeners that there is permanent memory available\r
-    //\r
-    PERF_START (NULL,"DisMem", NULL, 0);\r
-    Status = PeiCoreInstallPpi (&mMemoryDiscoveredPpi);\r
-    PERF_END (NULL,"DisMem", NULL, 0);\r
-\r
-  } else {\r
-\r
-    //\r
-    // Report Status Code EFI_SW_PC_INIT\r
-    //\r
-    REPORT_STATUS_CODE (\r
-      EFI_PROGRESS_CODE,\r
-      EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT\r
-      );\r
-\r
-    //\r
-    // If first pass, start performance measurement.\r
-    //\r
-    PERF_START (NULL,"PreMem", NULL, mTick);\r
-\r
-    //\r
-    // If SEC provided any PPI services to PEI, install them.\r
-    //\r
-    if (PeiStartupDescriptor->DispatchTable != NULL) {\r
-      Status = PeiCoreInstallPpi (PeiStartupDescriptor->DispatchTable);\r
-      ASSERT_EFI_ERROR (Status);\r
-    }\r
-  }\r
-\r
-  DispatchData = &PrivateData.DispatchData;\r
-\r
-  //\r
-  // Call PEIM dispatcher\r
-  //\r
-  PeiDispatcher (PeiStartupDescriptor, &PrivateData, DispatchData);\r
-\r
-  //\r
-  // Check if InstallPeiMemory service was called.\r
-  //\r
-  ASSERT(PrivateData.PeiMemoryInstalled == TRUE);\r
-\r
-  PERF_END (NULL, "PostMem", NULL, 0);\r
-\r
-  Status = PeiCoreLocatePpi (\r
-             &gEfiDxeIplPpiGuid,\r
-             0,\r
-             NULL,\r
-             (VOID **)&TempPtr.DxeIpl\r
-             );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  DEBUG ((EFI_D_INFO, "DXE IPL Entry\n"));\r
-  Status = TempPtr.DxeIpl->Entry (\r
-                             TempPtr.DxeIpl,\r
-                             &PrivateData.PS,\r
-                             PrivateData.HobList\r
-                             );\r
-\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
-  return EFI_NOT_FOUND;\r
-}\r
-\r
+/*++
+
+Copyright (c) 2006, Intel Corporation
+All rights reserved. This program and the accompanying materials
+are licensed and made available under the terms and conditions of the BSD License
+which accompanies this distribution.  The full text of the license may be found at
+http://opensource.org/licenses/bsd-license.php
+
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+Module Name:
+
+  PeiMain.c
+
+Abstract:
+
+  Pei Core Main Entry Point
+
+Revision History
+
+--*/
+
+#include <PeiMain.h>
+
+//
+//CAR is filled with this initial value during SEC phase
+//
+#define INIT_CAR_VALUE 0x5AA55AA5
+
+static EFI_PEI_PPI_DESCRIPTOR mMemoryDiscoveredPpi = {
+  (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST),
+  &gEfiPeiMemoryDiscoveredPpiGuid,
+  NULL
+};
+
+//
+// Pei Core Module Variables
+//
+//
+static EFI_PEI_SERVICES  mPS = {
+  {
+    PEI_SERVICES_SIGNATURE,
+    PEI_SERVICES_REVISION,
+    sizeof (EFI_PEI_SERVICES),
+    0,
+    0
+  },
+  PeiInstallPpi,
+  PeiReInstallPpi,
+  PeiLocatePpi,
+  PeiNotifyPpi,
+
+  PeiGetBootMode,
+  PeiSetBootMode,
+
+  PeiGetHobList,
+  PeiCreateHob,
+
+  PeiFvFindNextVolume,
+  PeiFfsFindNextFile,
+  PeiFfsFindSectionData,
+
+  PeiInstallPeiMemory,
+  PeiAllocatePages,
+  PeiAllocatePool,
+  (EFI_PEI_COPY_MEM)CopyMem,
+  (EFI_PEI_SET_MEM)SetMem,
+
+  PeiReportStatusCode,
+
+  PeiResetSystem
+};
+
+EFI_STATUS
+EFIAPI
+PeiCore (
+  IN EFI_PEI_STARTUP_DESCRIPTOR  *PeiStartupDescriptor,
+  IN PEI_CORE_INSTANCE           *OldCoreData
+  )
+/*++
+
+Routine Description:
+
+  Main entry point to Pei Core. After switching stack in the PEI core, 
+  it will restart with the old core data.
+
+Arguments:
+
+  PeiStartupDescriptor - Information and services provided by SEC phase.
+  OldCoreData          - Pointer to old core data that is used to initialize the
+                         core's data areas.
+
+Returns:
+
+  This function never returns
+  EFI_NOT_FOUND        - Never reach
+
+--*/
+{
+  PEI_CORE_INSTANCE                                     PrivateData;
+  EFI_STATUS                                            Status;
+  PEI_CORE_TEMP_POINTERS                                TempPtr;
+  PEI_CORE_DISPATCH_DATA                                *DispatchData;
+  UINT64                                                mTick;
+
+  mTick = 0;
+
+#ifdef EFI_PEI_PERFORMANCE
+  if (OldCoreData == NULL) {
+    mTick = GetPerformanceCounter ();
+  }
+#endif
+
+  //
+  // For IPF in CAR mode the real memory access is uncached,in InstallPeiMemory()
+  //  the 63-bit of address is set to 1.
+  //
+  SWITCH_TO_CACHE_MODE (OldCoreData);
+
+  if (OldCoreData != NULL) {
+    CopyMem (&PrivateData, OldCoreData, sizeof (PEI_CORE_INSTANCE));
+  } else {
+    ZeroMem (&PrivateData, sizeof (PEI_CORE_INSTANCE));
+  }
+
+  PrivateData.Signature = PEI_CORE_HANDLE_SIGNATURE;
+  PrivateData.PS = &mPS;
+
+  //
+  // Initialize libraries that the PeiCore is linked against
+  // BUGBUG: The FfsHeader is passed in as NULL.  Do we look it up or remove it from the lib init?
+  //
+  ProcessLibraryConstructorList (NULL, &PrivateData.PS);
+
+  InitializeMemoryServices (&PrivateData.PS, PeiStartupDescriptor, OldCoreData);
+
+  InitializePpiServices (&PrivateData.PS, OldCoreData);
+
+  InitializeSecurityServices (&PrivateData.PS, OldCoreData);
+
+  InitializeDispatcherData (&PrivateData.PS, OldCoreData, PeiStartupDescriptor);
+
+  if (OldCoreData != NULL) {
+
+    PERF_END (NULL,"PreMem", NULL, 0);
+    PERF_START (NULL,"PostMem", NULL, 0);
+
+    //
+    // The following code dumps out interesting cache as RAM usage information
+    // so we can keep tabs on how the cache as RAM is being utilized.  The
+    // DEBUG_CODE macro is used to prevent this code from being compiled
+    // on a debug build.
+    //
+    DEBUG_CODE (
+      UINTN  *StackPointer;
+      UINTN  StackValue;
+
+      StackValue = INIT_CAR_VALUE;
+      for (StackPointer = (UINTN *) OldCoreData->MaxTopOfCarHeap;
+           ((UINTN) StackPointer < ((UINTN) OldCoreData->BottomOfCarHeap + OldCoreData->SizeOfCacheAsRam))
+           && StackValue == INIT_CAR_VALUE;
+           StackPointer++) {
+        StackValue = *StackPointer;
+      }
+
+      DEBUG ((EFI_D_INFO, "Total Cache as RAM:    %d bytes.\n", OldCoreData->SizeOfCacheAsRam));
+      DEBUG ((EFI_D_INFO, "  CAR stack ever used: %d bytes.\n",
+        ((UINTN) OldCoreData->TopOfCarHeap - (UINTN) StackPointer)
+        ));
+      DEBUG ((EFI_D_INFO, "  CAR heap used:       %d bytes.\n",
+        ((UINTN) OldCoreData->HobList.HandoffInformationTable->EfiFreeMemoryBottom -
+        (UINTN) OldCoreData->HobList.Raw)
+        ));
+    );
+
+    //
+    // Alert any listeners that there is permanent memory available
+    //
+    PERF_START (NULL,"DisMem", NULL, 0);
+    Status = PeiCoreInstallPpi (&mMemoryDiscoveredPpi);
+    PERF_END (NULL,"DisMem", NULL, 0);
+
+  } else {
+
+    //
+    // Report Status Code EFI_SW_PC_INIT
+    //
+    REPORT_STATUS_CODE (
+      EFI_PROGRESS_CODE,
+      EFI_SOFTWARE_PEI_CORE | EFI_SW_PC_INIT
+      );
+
+    //
+    // If first pass, start performance measurement.
+    //
+    PERF_START (NULL,"PreMem", NULL, mTick);
+
+    //
+    // If SEC provided any PPI services to PEI, install them.
+    //
+    if (PeiStartupDescriptor->DispatchTable != NULL) {
+      Status = PeiCoreInstallPpi (PeiStartupDescriptor->DispatchTable);
+      ASSERT_EFI_ERROR (Status);
+    }
+  }
+
+  DispatchData = &PrivateData.DispatchData;
+
+  //
+  // Call PEIM dispatcher
+  //
+  PeiDispatcher (PeiStartupDescriptor, &PrivateData, DispatchData);
+
+  //
+  // Check if InstallPeiMemory service was called.
+  //
+  ASSERT(PrivateData.PeiMemoryInstalled == TRUE);
+
+  PERF_END (NULL, "PostMem", NULL, 0);
+
+  Status = PeiCoreLocatePpi (
+             &gEfiDxeIplPpiGuid,
+             0,
+             NULL,
+             (VOID **)&TempPtr.DxeIpl
+             );
+  ASSERT_EFI_ERROR (Status);
+
+  DEBUG ((EFI_D_INFO, "DXE IPL Entry\n"));
+  Status = TempPtr.DxeIpl->Entry (
+                             TempPtr.DxeIpl,
+                             &PrivateData.PS,
+                             PrivateData.HobList
+                             );
+
+  ASSERT_EFI_ERROR (Status);
+
+  return EFI_NOT_FOUND;
+}
+