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