/** @file C functions in SEC Copyright (c) 2008 - 2019, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include "SecMain.h" EFI_PEI_TEMPORARY_RAM_DONE_PPI gSecTemporaryRamDonePpi = { SecTemporaryRamDone }; EFI_SEC_PLATFORM_INFORMATION_PPI mSecPlatformInformationPpi = { SecPlatformInformation }; EFI_PEI_PPI_DESCRIPTOR mPeiSecPlatformInformationPpi[] = { { // // SecPerformance PPI notify descriptor. // EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK, &gPeiSecPerformancePpiGuid, (VOID *) (UINTN) SecPerformancePpiCallBack }, { EFI_PEI_PPI_DESCRIPTOR_PPI, &gEfiTemporaryRamDonePpiGuid, &gSecTemporaryRamDonePpi }, { (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST), &gEfiSecPlatformInformationPpiGuid, &mSecPlatformInformationPpi } }; // // These are IDT entries pointing to 10:FFFFFFE4h. // UINT64 mIdtEntryTemplate = 0xffff8e000010ffe4ULL; /** Caller provided function to be invoked at the end of InitializeDebugAgent(). Entry point to the C language phase of SEC. After the SEC assembly code has initialized some temporary memory and set up the stack, the control is transferred to this function. @param[in] Context The first input parameter of InitializeDebugAgent(). **/ VOID NORETURN EFIAPI SecStartupPhase2( IN VOID *Context ); /** Entry point of the notification callback function itself within the PEIM. It is to get SEC performance data and build HOB to convey the SEC performance data to DXE phase. @param PeiServices Indirect reference to the PEI Services Table. @param NotifyDescriptor Address of the notification descriptor data structure. @param Ppi Address of the PPI that was installed. @return Status of the notification. The status code returned from this function is ignored. **/ EFI_STATUS EFIAPI SecPerformancePpiCallBack ( IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_NOTIFY_DESCRIPTOR *NotifyDescriptor, IN VOID *Ppi ) { EFI_STATUS Status; PEI_SEC_PERFORMANCE_PPI *SecPerf; FIRMWARE_SEC_PERFORMANCE Performance; SecPerf = (PEI_SEC_PERFORMANCE_PPI *) Ppi; Status = SecPerf->GetPerformance ((CONST EFI_PEI_SERVICES **) PeiServices, SecPerf, &Performance); if (!EFI_ERROR (Status)) { BuildGuidDataHob ( &gEfiFirmwarePerformanceGuid, &Performance, sizeof (FIRMWARE_SEC_PERFORMANCE) ); DEBUG ((DEBUG_INFO, "FPDT: SEC Performance Hob ResetEnd = %ld\n", Performance.ResetEnd)); } return Status; } /** Entry point to the C language phase of SEC. After the SEC assembly code has initialized some temporary memory and set up the stack, the control is transferred to this function. @param SizeOfRam Size of the temporary memory available for use. @param TempRamBase Base address of temporary ram @param BootFirmwareVolume Base address of the Boot Firmware Volume. **/ VOID NORETURN EFIAPI SecStartup ( IN UINT32 SizeOfRam, IN UINT32 TempRamBase, IN VOID *BootFirmwareVolume ) { EFI_SEC_PEI_HAND_OFF SecCoreData; IA32_DESCRIPTOR IdtDescriptor; SEC_IDT_TABLE IdtTableInStack; UINT32 Index; UINT32 PeiStackSize; EFI_STATUS Status; // // Report Status Code to indicate entering SEC core // REPORT_STATUS_CODE ( EFI_PROGRESS_CODE, EFI_SOFTWARE_SEC | EFI_SW_SEC_PC_ENTRY_POINT ); PeiStackSize = PcdGet32 (PcdPeiTemporaryRamStackSize); if (PeiStackSize == 0) { PeiStackSize = (SizeOfRam >> 1); } ASSERT (PeiStackSize < SizeOfRam); // // Process all libraries constructor function linked to SecCore. // ProcessLibraryConstructorList (); // // Initialize floating point operating environment // to be compliant with UEFI spec. // InitializeFloatingPointUnits (); // |-------------------|----> // |IDT Table | // |-------------------| // |PeiService Pointer | PeiStackSize // |-------------------| // | | // | Stack | // |-------------------|----> // | | // | | // | Heap | PeiTemporayRamSize // | | // | | // |-------------------|----> TempRamBase IdtTableInStack.PeiService = 0; for (Index = 0; Index < SEC_IDT_ENTRY_COUNT; Index ++) { CopyMem ((VOID*)&IdtTableInStack.IdtTable[Index], (VOID*)&mIdtEntryTemplate, sizeof (UINT64)); } IdtDescriptor.Base = (UINTN) &IdtTableInStack.IdtTable; IdtDescriptor.Limit = (UINT16)(sizeof (IdtTableInStack.IdtTable) - 1); AsmWriteIdtr (&IdtDescriptor); // // Setup the default exception handlers // Status = InitializeCpuExceptionHandlers (NULL); ASSERT_EFI_ERROR (Status); // // Update the base address and length of Pei temporary memory // SecCoreData.DataSize = (UINT16) sizeof (EFI_SEC_PEI_HAND_OFF); SecCoreData.BootFirmwareVolumeBase = BootFirmwareVolume; SecCoreData.BootFirmwareVolumeSize = (UINTN)((EFI_FIRMWARE_VOLUME_HEADER *) BootFirmwareVolume)->FvLength; SecCoreData.T
BBLAYERS =+ "\
  ${METADIR}/meta-renesas-rcar-gen3/meta-rcar-gen3 \
  ${METADIR}/meta-agl/meta-agl-bsp/meta-rcar-gen3-adas \
  "
RAM could not be disabled. **/ EFI_STATUS EFIAPI SecTemporaryRamDone ( VOID ) { EFI_STATUS Status; EFI_STATUS Status2; UINTN Index; BOOLEAN State; EFI_PEI_PPI_DESCRIPTOR *PeiPpiDescriptor; REPUBLISH_SEC_PPI_PPI *RepublishSecPpiPpi; // // Republish Sec Platform Information(2) PPI // RepublishSecPlatformInformationPpi (); // // Re-install SEC PPIs using a PEIM produced service if published // for (Index = 0, Status = EFI_SUCCESS; Status == EFI_SUCCESS; Index++) { Status = PeiServicesLocatePpi ( &gRepublishSecPpiPpiGuid, Index, &PeiPpiDescriptor, (VOID **) &RepublishSecPpiPpi ); if (!EFI_ERROR (Status)) { DEBUG ((DEBUG_INFO, "Calling RepublishSecPpi instance %d.\n", Index)); Status2 = RepublishSecPpiPpi->RepublishSecPpis (); ASSERT_EFI_ERROR (Status2); } } // // Migrate DebugAgentContext. // InitializeDebugAgent (DEBUG_AGENT_INIT_POSTMEM_SEC, NULL, NULL); // // Disable interrupts and save current interrupt state // State = SaveAndDisableInterrupts (); // // Disable Temporary RAM after Stack and Heap have been migrated at this point. // SecPlatformDisableTemporaryMemory (); // // Restore original interrupt state // SetInterruptState (State); return EFI_SUCCESS; }