mirror of https://github.com/acidanthera/audk.git
OvmfPkg/BaseMemEncryptSevLib: skip the pre-validated system RAM
BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=3275 The MemEncryptSevSnpPreValidateSystemRam() is used for pre-validating the system RAM. As the boot progress, each phase validates a fixed region of the RAM. In the PEI phase, the PlatformPei detects all the available RAM and calls to pre-validate the detected system RAM. While validating the system RAM in PEI phase, we must skip previously validated system RAM to avoid the double validation. Cc: Michael Roth <michael.roth@amd.com> Cc: James Bottomley <jejb@linux.ibm.com> Cc: Min Xu <min.m.xu@intel.com> Cc: Jiewen Yao <jiewen.yao@intel.com> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Erdem Aktas <erdemaktas@google.com> Cc: Gerd Hoffmann <kraxel@redhat.com> Acked-by: Jiewen Yao <Jiewen.yao@intel.com> Acked-by: Gerd Hoffmann <kraxel@redhat.com> Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
This commit is contained in:
parent
d706f8fec2
commit
11b15336f0
|
@ -58,3 +58,5 @@
|
||||||
|
|
||||||
[FixedPcd]
|
[FixedPcd]
|
||||||
gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase
|
gUefiCpuPkgTokenSpaceGuid.PcdSevEsWorkAreaBase
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase
|
||||||
|
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSecPageTablesBase
|
||||||
|
|
|
@ -14,6 +14,46 @@
|
||||||
|
|
||||||
#include "SnpPageStateChange.h"
|
#include "SnpPageStateChange.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
UINT64 StartAddress;
|
||||||
|
UINT64 EndAddress;
|
||||||
|
} SNP_PRE_VALIDATED_RANGE;
|
||||||
|
|
||||||
|
STATIC SNP_PRE_VALIDATED_RANGE mPreValidatedRange[] = {
|
||||||
|
// The below address range was part of the SEV OVMF metadata, and range
|
||||||
|
// should be pre-validated by the Hypervisor.
|
||||||
|
{
|
||||||
|
FixedPcdGet32 (PcdOvmfSecPageTablesBase),
|
||||||
|
FixedPcdGet32 (PcdOvmfPeiMemFvBase),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
STATIC
|
||||||
|
BOOLEAN
|
||||||
|
DetectPreValidatedOverLap (
|
||||||
|
IN PHYSICAL_ADDRESS StartAddress,
|
||||||
|
IN PHYSICAL_ADDRESS EndAddress,
|
||||||
|
OUT SNP_PRE_VALIDATED_RANGE *OverlapRange
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN i;
|
||||||
|
|
||||||
|
//
|
||||||
|
// Check if the specified address range exist in pre-validated array.
|
||||||
|
//
|
||||||
|
for (i = 0; i < ARRAY_SIZE (mPreValidatedRange); i++) {
|
||||||
|
if ((mPreValidatedRange[i].StartAddress < EndAddress) &&
|
||||||
|
(StartAddress < mPreValidatedRange[i].EndAddress))
|
||||||
|
{
|
||||||
|
OverlapRange->StartAddress = mPreValidatedRange[i].StartAddress;
|
||||||
|
OverlapRange->EndAddress = mPreValidatedRange[i].EndAddress;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Pre-validate the system RAM when SEV-SNP is enabled in the guest VM.
|
Pre-validate the system RAM when SEV-SNP is enabled in the guest VM.
|
||||||
|
|
||||||
|
@ -28,9 +68,34 @@ MemEncryptSevSnpPreValidateSystemRam (
|
||||||
IN UINTN NumPages
|
IN UINTN NumPages
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
PHYSICAL_ADDRESS EndAddress;
|
||||||
|
SNP_PRE_VALIDATED_RANGE OverlapRange;
|
||||||
|
|
||||||
if (!MemEncryptSevSnpIsEnabled ()) {
|
if (!MemEncryptSevSnpIsEnabled ()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
InternalSetPageState (BaseAddress, NumPages, SevSnpPagePrivate, TRUE);
|
EndAddress = BaseAddress + EFI_PAGES_TO_SIZE (NumPages);
|
||||||
|
|
||||||
|
while (BaseAddress < EndAddress) {
|
||||||
|
//
|
||||||
|
// Check if the range overlaps with the pre-validated ranges.
|
||||||
|
//
|
||||||
|
if (DetectPreValidatedOverLap (BaseAddress, EndAddress, &OverlapRange)) {
|
||||||
|
// Validate the non-overlap regions.
|
||||||
|
if (BaseAddress < OverlapRange.StartAddress) {
|
||||||
|
NumPages = EFI_SIZE_TO_PAGES (OverlapRange.StartAddress - BaseAddress);
|
||||||
|
|
||||||
|
InternalSetPageState (BaseAddress, NumPages, SevSnpPagePrivate, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseAddress = OverlapRange.EndAddress;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Validate the remaining pages.
|
||||||
|
NumPages = EFI_SIZE_TO_PAGES (EndAddress - BaseAddress);
|
||||||
|
InternalSetPageState (BaseAddress, NumPages, SevSnpPagePrivate, TRUE);
|
||||||
|
BaseAddress = EndAddress;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue