-/*++
-
-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;
-}
-
+/*++\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
+ // 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