/** @file SEV-SNP Page Validation functions. Copyright (c) 2021 - 2024, AMD Incorporated. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #include #include #include #include #include "SnpPageStateChange.h" #include "VirtualMemory.h" STATIC VOID *mPscBuffer = NULL; /** Pre-validate the system RAM when SEV-SNP is enabled in the guest VM. @param[in] BaseAddress Base address @param[in] NumPages Number of pages starting from the base address **/ VOID EFIAPI MemEncryptSevSnpPreValidateSystemRam ( IN PHYSICAL_ADDRESS BaseAddress, IN UINTN NumPages ) { EFI_STATUS Status; if (!MemEncryptSevSnpIsEnabled ()) { return; } // DXE pre-validation may happen with the memory accept protocol. // The protocol should only be called outside the prevalidated ranges // that the PEI stage code explicitly skips. Specifically, only memory // ranges that are classified as unaccepted. if (BaseAddress >= SIZE_4GB) { Status = InternalMemEncryptSevCreateIdentityMap1G ( 0, BaseAddress, EFI_PAGES_TO_SIZE (NumPages) ); if (EFI_ERROR (Status)) { ASSERT (FALSE); CpuDeadLoop (); } } if (mPscBuffer == NULL) { mPscBuffer = AllocateReservedPages (1); ASSERT (mPscBuffer != NULL); } InternalSetPageState (BaseAddress, NumPages, SevSnpPagePrivate, TRUE, mPscBuffer, EFI_PAGE_SIZE); }