123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- /** @file
- Sample to provide SecTemporaryRamDone function.
- @copyright
- Copyright (c) 2017 - 2021, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #include <PiPei.h>
- #include <Ppi/TemporaryRamDone.h>
- #include <Ppi/PlatformInitTempRamExitPpi.h>
- #include <Library/DebugLib.h>
- #include <Library/PcdLib.h>
- #include <Library/FspWrapperPlatformLib.h>
- #include <Library/FspWrapperApiLib.h>
- #include <Library/PeiServicesTablePointerLib.h>
- #include <Guid/FspHeaderFile.h>
- #include <Register/ArchitecturalMsr.h>
- #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 ;
- }
|