+++ /dev/null
-/*++\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 VOID *Data\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
- PEI_CORE_INSTANCE *OldCoreData;\r
-\r
- mTick = 0;\r
- OldCoreData = (PEI_CORE_INSTANCE *) Data;\r
-\r
- if (PerformanceMeasurementEnabled()) {\r
- if (OldCoreData == NULL) {\r
- mTick = GetPerformanceCounter ();\r
- }\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_BEGIN macro is used to prevent this code from being compiled\r
- // on a debug build.\r
- //\r
- DEBUG_CODE_BEGIN ();\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
- DEBUG_CODE_END ();\r
-\r
- //\r
- // Alert any listeners that there is permanent memory available\r
- //\r
- \r
- PERF_START (NULL,"DisMem", NULL, 0);\r
- Status = PeiServicesInstallPpi (&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
- PERF_START (NULL,"PEI", NULL, mTick);\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 = PeiServicesInstallPpi (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 = PeiServicesLocatePpi (\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