/** @file Sample to provide SecTemporaryRamDone function. @copyright Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include #include #include #include #include #include #define MSR_NEM 0x000002E0 /** This interface disables temporary memory in SEC Phase. This is for dispatch mode use. We should properly produce the FSP_TEMP_RAM_EXIT_PPI and then call that instead, but the FSP does not produce that PPI **/ VOID EFIAPI SecPlatformDisableTemporaryMemoryDispatchHack ( VOID ) { UINT64 MsrValue; UINT64 MtrrDefaultType; MSR_IA32_MTRR_DEF_TYPE_REGISTER DefType; // // Force and INVD. // AsmInvd (); // // Disable MTRRs. // DefType.Uint64 = AsmReadMsr64 (MSR_IA32_MTRR_DEF_TYPE); MtrrDefaultType = DefType.Uint64; DefType.Bits.E = 0; AsmWriteMsr64 (MSR_IA32_MTRR_DEF_TYPE, DefType.Uint64); // // Force and INVD to prevent MCA error. // AsmInvd (); // // Clear NEM Run and NEM Setup bits individually. // MsrValue = AsmReadMsr64 (MSR_NEM); MsrValue &= ~((UINT64) BIT1); AsmWriteMsr64 (MSR_NEM, MsrValue); MsrValue &= ~((UINT64) BIT0); AsmWriteMsr64 (MSR_NEM, MsrValue); // // Restore MTRR default setting // AsmWriteMsr64 (MSR_IA32_MTRR_DEF_TYPE, MtrrDefaultType); } /** This interface disables temporary memory in SEC Phase. **/ VOID EFIAPI SecPlatformDisableTemporaryMemory ( VOID ) { EFI_STATUS Status; VOID *TempRamExitParam; CONST EFI_PEI_SERVICES **PeiServices; PLATFORM_INIT_TEMP_RAM_EXIT_PPI *PlatformInitTempRamExitPpi; DEBUG ((DEBUG_INFO, "SecPlatformDisableTemporaryMemory enter\n")); PeiServices = GetPeiServicesTablePointer (); ASSERT (PeiServices != NULL); if (PeiServices == NULL) { return ; } ASSERT ((*PeiServices) != NULL); if ((*PeiServices) == NULL) { return; } Status = (*PeiServices)->LocatePpi ( PeiServices, &gPlatformInitTempRamExitPpiGuid, 0, NULL, (VOID **) &PlatformInitTempRamExitPpi ); ASSERT_EFI_ERROR (Status); if (EFI_ERROR (Status)) { return; } Status = PlatformInitTempRamExitPpi->PlatformInitBeforeTempRamExit (); ASSERT_EFI_ERROR (Status); if (PcdGet8 (PcdFspModeSelection) == 1) { // // FSP API mode // TempRamExitParam = UpdateTempRamExitParam (); Status = CallTempRamExit (TempRamExitParam); DEBUG ((DEBUG_INFO, "TempRamExit status: 0x%x\n", Status)); ASSERT_EFI_ERROR (Status); } else { SecPlatformDisableTemporaryMemoryDispatchHack (); } Status = PlatformInitTempRamExitPpi->PlatformInitAfterTempRamExit (); ASSERT_EFI_ERROR(Status); return ; }