/** @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 ;
}