11921695e6461e699ebe12c91254a779ed221b96fMichael Kinney/** @file 21921695e6461e699ebe12c91254a779ed221b96fMichael Kinney C functions in SEC 31921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 41921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Copyright (c) 2008 - 2015, Intel Corporation. All rights reserved.<BR> 51921695e6461e699ebe12c91254a779ed221b96fMichael Kinney This program and the accompanying materials 61921695e6461e699ebe12c91254a779ed221b96fMichael Kinney are licensed and made available under the terms and conditions of the BSD License 71921695e6461e699ebe12c91254a779ed221b96fMichael Kinney which accompanies this distribution. The full text of the license may be found at 81921695e6461e699ebe12c91254a779ed221b96fMichael Kinney http://opensource.org/licenses/bsd-license.php 91921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 101921695e6461e699ebe12c91254a779ed221b96fMichael Kinney THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 111921695e6461e699ebe12c91254a779ed221b96fMichael Kinney WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 121921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 131921695e6461e699ebe12c91254a779ed221b96fMichael Kinney**/ 141921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 151921695e6461e699ebe12c91254a779ed221b96fMichael Kinney#include "SecMain.h" 161921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 171921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFI_PEI_TEMPORARY_RAM_DONE_PPI gSecTemporaryRamDonePpi = { 181921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecTemporaryRamDone 191921695e6461e699ebe12c91254a779ed221b96fMichael Kinney}; 201921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 211921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFI_SEC_PLATFORM_INFORMATION_PPI mSecPlatformInformationPpi = { SecPlatformInformation }; 221921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 231921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformationPpi[] = { 241921695e6461e699ebe12c91254a779ed221b96fMichael Kinney { 251921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_PEI_PPI_DESCRIPTOR_PPI, 261921695e6461e699ebe12c91254a779ed221b96fMichael Kinney &gEfiTemporaryRamDonePpiGuid, 271921695e6461e699ebe12c91254a779ed221b96fMichael Kinney &gSecTemporaryRamDonePpi 281921695e6461e699ebe12c91254a779ed221b96fMichael Kinney }, 291921695e6461e699ebe12c91254a779ed221b96fMichael Kinney { 301921695e6461e699ebe12c91254a779ed221b96fMichael Kinney (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), 311921695e6461e699ebe12c91254a779ed221b96fMichael Kinney &gEfiSecPlatformInformationPpiGuid, 321921695e6461e699ebe12c91254a779ed221b96fMichael Kinney &mSecPlatformInformationPpi 331921695e6461e699ebe12c91254a779ed221b96fMichael Kinney } 341921695e6461e699ebe12c91254a779ed221b96fMichael Kinney}; 351921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 361921695e6461e699ebe12c91254a779ed221b96fMichael Kinney// 371921695e6461e699ebe12c91254a779ed221b96fMichael Kinney// These are IDT entries pointing to 10:FFFFFFE4h. 381921695e6461e699ebe12c91254a779ed221b96fMichael Kinney// 391921695e6461e699ebe12c91254a779ed221b96fMichael KinneyUINT64 mIdtEntryTemplate = 0xffff8e000010ffe4ULL; 401921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 411921695e6461e699ebe12c91254a779ed221b96fMichael Kinney/** 421921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Caller provided function to be invoked at the end of InitializeDebugAgent(). 431921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 441921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Entry point to the C language phase of SEC. After the SEC assembly 451921695e6461e699ebe12c91254a779ed221b96fMichael Kinney code has initialized some temporary memory and set up the stack, 461921695e6461e699ebe12c91254a779ed221b96fMichael Kinney the control is transferred to this function. 471921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 481921695e6461e699ebe12c91254a779ed221b96fMichael Kinney @param[in] Context The first input parameter of InitializeDebugAgent(). 491921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 501921695e6461e699ebe12c91254a779ed221b96fMichael Kinney**/ 511921695e6461e699ebe12c91254a779ed221b96fMichael KinneyVOID 521921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFIAPI 531921695e6461e699ebe12c91254a779ed221b96fMichael KinneySecStartupPhase2( 541921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IN VOID *Context 551921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ); 561921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 571921695e6461e699ebe12c91254a779ed221b96fMichael Kinney/** 581921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 591921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Entry point to the C language phase of SEC. After the SEC assembly 601921695e6461e699ebe12c91254a779ed221b96fMichael Kinney code has initialized some temporary memory and set up the stack, 611921695e6461e699ebe12c91254a779ed221b96fMichael Kinney the control is transferred to this function. 621921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 631921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 641921695e6461e699ebe12c91254a779ed221b96fMichael Kinney @param SizeOfRam Size of the temporary memory available for use. 651921695e6461e699ebe12c91254a779ed221b96fMichael Kinney @param TempRamBase Base address of temporary ram 661921695e6461e699ebe12c91254a779ed221b96fMichael Kinney @param BootFirmwareVolume Base address of the Boot Firmware Volume. 671921695e6461e699ebe12c91254a779ed221b96fMichael Kinney**/ 681921695e6461e699ebe12c91254a779ed221b96fMichael KinneyVOID 691921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFIAPI 701921695e6461e699ebe12c91254a779ed221b96fMichael KinneySecStartup ( 711921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IN UINT32 SizeOfRam, 721921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IN UINT32 TempRamBase, 731921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IN VOID *BootFirmwareVolume 741921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ) 751921695e6461e699ebe12c91254a779ed221b96fMichael Kinney{ 761921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_SEC_PEI_HAND_OFF SecCoreData; 771921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IA32_DESCRIPTOR IdtDescriptor; 781921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SEC_IDT_TABLE IdtTableInStack; 791921695e6461e699ebe12c91254a779ed221b96fMichael Kinney UINT32 Index; 801921695e6461e699ebe12c91254a779ed221b96fMichael Kinney UINT32 PeiStackSize; 811921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_STATUS Status; 821921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 831921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 841921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Report Status Code to indicate entering SEC core 851921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 861921695e6461e699ebe12c91254a779ed221b96fMichael Kinney REPORT_STATUS_CODE ( 871921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_PROGRESS_CODE, 881921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_SOFTWARE_SEC | EFI_SW_SEC_PC_ENTRY_POINT 891921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ); 901921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 911921695e6461e699ebe12c91254a779ed221b96fMichael Kinney PeiStackSize = PcdGet32 (PcdPeiTemporaryRamStackSize); 921921695e6461e699ebe12c91254a779ed221b96fMichael Kinney if (PeiStackSize == 0) { 931921695e6461e699ebe12c91254a779ed221b96fMichael Kinney PeiStackSize = (SizeOfRam >> 1); 941921695e6461e699ebe12c91254a779ed221b96fMichael Kinney } 951921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 961921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ASSERT (PeiStackSize < SizeOfRam); 971921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 981921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 991921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Process all libraries constructor function linked to SecCore. 1001921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1011921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ProcessLibraryConstructorList (); 1021921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1031921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1041921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Initialize floating point operating environment 1051921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // to be compliant with UEFI spec. 1061921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1071921695e6461e699ebe12c91254a779ed221b96fMichael Kinney InitializeFloatingPointUnits (); 1081921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1091921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // |-------------------|----> 1101921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // |IDT Table | 1111921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // |-------------------| 1121921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // |PeiService Pointer | PeiStackSize 1131921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // |-------------------| 1141921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // | | 1151921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // | Stack | 1161921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // |-------------------|----> 1171921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // | | 1181921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // | | 1191921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // | Heap | PeiTemporayRamSize 1201921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // | | 1211921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // | | 1221921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // |-------------------|----> TempRamBase 1231921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1241921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IdtTableInStack.PeiService = 0; 1251921695e6461e699ebe12c91254a779ed221b96fMichael Kinney for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) { 1261921695e6461e699ebe12c91254a779ed221b96fMichael Kinney CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&mIdtEntryTemplate, sizeof (UINT64)); 1271921695e6461e699ebe12c91254a779ed221b96fMichael Kinney } 1281921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1291921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IdtDescriptor.Base = (UINTN) &IdtTableInStack.IdtTable; 1301921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1); 1311921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1321921695e6461e699ebe12c91254a779ed221b96fMichael Kinney AsmWriteIdtr (&IdtDescriptor); 1331921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1341921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1351921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Setup the default exception handlers 1361921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1371921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Status = InitializeCpuExceptionHandlers (NULL); 1381921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ASSERT_EFI_ERROR (Status); 1391921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1401921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1411921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Update the base address and length of Pei temporary memory 1421921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1431921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.DataSize = (UINT16) sizeof (EFI_SEC_PEI_HAND_OFF); 1441921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.BootFirmwareVolumeBase = BootFirmwareVolume; 1451921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.BootFirmwareVolumeSize = (UINTN)(0x100000000ULL - (UINTN) BootFirmwareVolume); 1461921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.TemporaryRamBase = (VOID*)(UINTN) TempRamBase; 1471921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.TemporaryRamSize = SizeOfRam; 1481921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.PeiTemporaryRamBase = SecCoreData.TemporaryRamBase; 1491921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.PeiTemporaryRamSize = SizeOfRam - PeiStackSize; 1501921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.StackBase = (VOID*)(UINTN)(TempRamBase + SecCoreData.PeiTemporaryRamSize); 1511921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData.StackSize = PeiStackSize; 1521921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1531921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1541921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Initialize Debug Agent to support source level debug in SEC/PEI phases before memory ready. 1551921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1561921695e6461e699ebe12c91254a779ed221b96fMichael Kinney InitializeDebugAgent (DEBUG_AGENT_INIT_PREMEM_SEC, &SecCoreData, SecStartupPhase2); 1571921695e6461e699ebe12c91254a779ed221b96fMichael Kinney} 1581921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1591921695e6461e699ebe12c91254a779ed221b96fMichael Kinney/** 1601921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Caller provided function to be invoked at the end of InitializeDebugAgent(). 1611921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1621921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Entry point to the C language phase of SEC. After the SEC assembly 1631921695e6461e699ebe12c91254a779ed221b96fMichael Kinney code has initialized some temporary memory and set up the stack, 1641921695e6461e699ebe12c91254a779ed221b96fMichael Kinney the control is transferred to this function. 1651921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1661921695e6461e699ebe12c91254a779ed221b96fMichael Kinney @param[in] Context The first input parameter of InitializeDebugAgent(). 1671921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1681921695e6461e699ebe12c91254a779ed221b96fMichael Kinney**/ 1691921695e6461e699ebe12c91254a779ed221b96fMichael KinneyVOID 1701921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFIAPI 1711921695e6461e699ebe12c91254a779ed221b96fMichael KinneySecStartupPhase2( 1721921695e6461e699ebe12c91254a779ed221b96fMichael Kinney IN VOID *Context 1731921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ) 1741921695e6461e699ebe12c91254a779ed221b96fMichael Kinney{ 1751921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_SEC_PEI_HAND_OFF *SecCoreData; 1761921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_PEI_PPI_DESCRIPTOR *PpiList; 1771921695e6461e699ebe12c91254a779ed221b96fMichael Kinney UINT32 Index; 1781921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_PEI_PPI_DESCRIPTOR *AllSecPpiList; 1791921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_PEI_CORE_ENTRY_POINT PeiCoreEntryPoint; 1801921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1811921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData = (EFI_SEC_PEI_HAND_OFF *) Context; 1821921695e6461e699ebe12c91254a779ed221b96fMichael Kinney AllSecPpiList = (EFI_PEI_PPI_DESCRIPTOR *) SecCoreData->PeiTemporaryRamBase; 1831921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1841921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Find Pei Core entry point. It will report SEC and Pei Core debug information if remote debug 1851921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // is enabled. 1861921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1871921695e6461e699ebe12c91254a779ed221b96fMichael Kinney FindAndReportEntryPoints ((EFI_FIRMWARE_VOLUME_HEADER *) SecCoreData->BootFirmwareVolumeBase, &PeiCoreEntryPoint); 1881921695e6461e699ebe12c91254a779ed221b96fMichael Kinney if (PeiCoreEntryPoint == NULL) 1891921695e6461e699ebe12c91254a779ed221b96fMichael Kinney { 1901921695e6461e699ebe12c91254a779ed221b96fMichael Kinney CpuDeadLoop (); 1911921695e6461e699ebe12c91254a779ed221b96fMichael Kinney } 1921921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 1931921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1941921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Perform platform specific initialization before entering PeiCore. 1951921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1961921695e6461e699ebe12c91254a779ed221b96fMichael Kinney PpiList = SecPlatformMain (SecCoreData); 1971921695e6461e699ebe12c91254a779ed221b96fMichael Kinney if (PpiList != NULL) { 1981921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 1991921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Remove the terminal flag from the terminal PPI 2001921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2011921695e6461e699ebe12c91254a779ed221b96fMichael Kinney CopyMem (AllSecPpiList, mPeiSecPlatformInformationPpi, sizeof (mPeiSecPlatformInformationPpi)); 2021921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Index = sizeof (mPeiSecPlatformInformationPpi) / sizeof (EFI_PEI_PPI_DESCRIPTOR) - 1; 2031921695e6461e699ebe12c91254a779ed221b96fMichael Kinney AllSecPpiList[Index].Flags = AllSecPpiList[Index].Flags & (~EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); 2041921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2051921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2061921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Append the platform additional PPI list 2071921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2081921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Index += 1; 2091921695e6461e699ebe12c91254a779ed221b96fMichael Kinney while (((PpiList->Flags & EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST) != EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST)) { 2101921695e6461e699ebe12c91254a779ed221b96fMichael Kinney CopyMem (&AllSecPpiList[Index], PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR)); 2111921695e6461e699ebe12c91254a779ed221b96fMichael Kinney Index++; 2121921695e6461e699ebe12c91254a779ed221b96fMichael Kinney PpiList++; 2131921695e6461e699ebe12c91254a779ed221b96fMichael Kinney } 2141921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2151921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2161921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Add the terminal PPI 2171921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2181921695e6461e699ebe12c91254a779ed221b96fMichael Kinney CopyMem (&AllSecPpiList[Index ++], PpiList, sizeof (EFI_PEI_PPI_DESCRIPTOR)); 2191921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2201921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2211921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Set PpiList to the total PPI 2221921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2231921695e6461e699ebe12c91254a779ed221b96fMichael Kinney PpiList = AllSecPpiList; 2241921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2251921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2261921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Adjust PEI TEMP RAM Range. 2271921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2281921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ASSERT (SecCoreData->PeiTemporaryRamSize > Index * sizeof (EFI_PEI_PPI_DESCRIPTOR)); 2291921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData->PeiTemporaryRamBase = (VOID *)((UINTN) SecCoreData->PeiTemporaryRamBase + Index * sizeof (EFI_PEI_PPI_DESCRIPTOR)); 2301921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecCoreData->PeiTemporaryRamSize = SecCoreData->PeiTemporaryRamSize - Index * sizeof (EFI_PEI_PPI_DESCRIPTOR); 2311921695e6461e699ebe12c91254a779ed221b96fMichael Kinney } else { 2321921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2331921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // No addition PPI, PpiList directly point to the common PPI list. 2341921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2351921695e6461e699ebe12c91254a779ed221b96fMichael Kinney PpiList = &mPeiSecPlatformInformationPpi[0]; 2361921695e6461e699ebe12c91254a779ed221b96fMichael Kinney } 2371921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2381921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2391921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Report Status Code to indicate transferring to PEI core 2401921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2411921695e6461e699ebe12c91254a779ed221b96fMichael Kinney REPORT_STATUS_CODE ( 2421921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_PROGRESS_CODE, 2431921695e6461e699ebe12c91254a779ed221b96fMichael Kinney EFI_SOFTWARE_SEC | EFI_SW_SEC_PC_HANDOFF_TO_NEXT 2441921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ); 2451921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2461921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2471921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Transfer the control to the PEI core 2481921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2491921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ASSERT (PeiCoreEntryPoint != NULL); 2501921695e6461e699ebe12c91254a779ed221b96fMichael Kinney (*PeiCoreEntryPoint) (SecCoreData, PpiList); 2511921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2521921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2531921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Should not come here. 2541921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2551921695e6461e699ebe12c91254a779ed221b96fMichael Kinney return; 2561921695e6461e699ebe12c91254a779ed221b96fMichael Kinney} 2571921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2581921695e6461e699ebe12c91254a779ed221b96fMichael Kinney/** 2591921695e6461e699ebe12c91254a779ed221b96fMichael Kinney TemporaryRamDone() disables the use of Temporary RAM. If present, this service is invoked 2601921695e6461e699ebe12c91254a779ed221b96fMichael Kinney by the PEI Foundation after the EFI_PEI_PERMANANT_MEMORY_INSTALLED_PPI is installed. 2611921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2621921695e6461e699ebe12c91254a779ed221b96fMichael Kinney @retval EFI_SUCCESS Use of Temporary RAM was disabled. 2631921695e6461e699ebe12c91254a779ed221b96fMichael Kinney @retval EFI_INVALID_PARAMETER Temporary RAM could not be disabled. 2641921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2651921695e6461e699ebe12c91254a779ed221b96fMichael Kinney**/ 2661921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFI_STATUS 2671921695e6461e699ebe12c91254a779ed221b96fMichael KinneyEFIAPI 2681921695e6461e699ebe12c91254a779ed221b96fMichael KinneySecTemporaryRamDone ( 2691921695e6461e699ebe12c91254a779ed221b96fMichael Kinney VOID 2701921695e6461e699ebe12c91254a779ed221b96fMichael Kinney ) 2711921695e6461e699ebe12c91254a779ed221b96fMichael Kinney{ 2721921695e6461e699ebe12c91254a779ed221b96fMichael Kinney BOOLEAN State; 2731921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2741921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2751921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Migrate DebugAgentContext. 2761921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2771921695e6461e699ebe12c91254a779ed221b96fMichael Kinney InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL); 2781921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2791921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2801921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Disable interrupts and save current interrupt state 2811921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2821921695e6461e699ebe12c91254a779ed221b96fMichael Kinney State = SaveAndDisableInterrupts(); 2831921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2841921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2851921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Disable Temporary RAM after Stack and Heap have been migrated at this point. 2861921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2871921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SecPlatformDisableTemporaryMemory (); 2881921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2891921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2901921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // Restore original interrupt state 2911921695e6461e699ebe12c91254a779ed221b96fMichael Kinney // 2921921695e6461e699ebe12c91254a779ed221b96fMichael Kinney SetInterruptState (State); 2931921695e6461e699ebe12c91254a779ed221b96fMichael Kinney 2941921695e6461e699ebe12c91254a779ed221b96fMichael Kinney return EFI_SUCCESS; 2951921695e6461e699ebe12c91254a779ed221b96fMichael Kinney} 296