-/*++\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:
+
+ The entry routine to Pei Core, invoked by PeiMain during transition
+ from SEC to PEI. 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;
+}
+