mirror of https://github.com/acidanthera/audk.git
OvmfPkg/PlatformPei: SEV: allocate pages of initial SMRAM save state map
In the next two patches, we'll temporarily decrypt the pages containing the initial SMRAM save state map, for SMBASE relocation. (Unlike the separate, relocated SMRAM save state map of each VCPU, the original, shared map behaves similarly to a "common buffer" between guest and host.) The decryption will occur near the beginning of the DXE phase, in AmdSevDxe, and the re-encryption will occur in PiSmmCpuDxeSmm, via OVMF's SmmCpuFeaturesLib instance. There is a non-trivial time gap between these two points, and the DXE phase might use the pages overlapping the initial SMRAM save state map for arbitrary purposes meanwhile. In order to prevent any information leak towards the hypervisor, make sure the DXE phase puts nothing in those pages until re-encryption is done. Creating a memalloc HOB for the area in question is safe: - the temporary SEC/PEI RAM (stack and heap) is based at PcdOvmfSecPeiTempRamBase, which is above 8MB, - the permanent PEI RAM (installed in PlatformPei's PublishPeiMemory() function) never starts below PcdOvmfDxeMemFvBase, which is also above 8MB. The allocated pages can be released to the DXE phase after SMBASE relocation and re-encryption are complete. Cc: Ard Biesheuvel <ard.biesheuvel@linaro.org> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: Jordan Justen <jordan.l.justen@intel.com> Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Tested-by: Brijesh Singh <brijesh.singh@amd.com> Reviewed-by: Brijesh Singh <brijesh.singh@amd.com>
This commit is contained in:
parent
61a044c6c1
commit
86defc2c25
|
@ -16,6 +16,7 @@
|
|||
// The package level header files this module uses
|
||||
//
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/MemEncryptSevLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <PiPei.h>
|
||||
|
@ -66,4 +67,32 @@ AmdSevInitialize (
|
|||
//
|
||||
PcdStatus = PcdSet32S (PcdOptionRomImageVerificationPolicy, 0x4);
|
||||
ASSERT_RETURN_ERROR (PcdStatus);
|
||||
|
||||
//
|
||||
// When SMM is required, cover the pages containing the initial SMRAM Save
|
||||
// State Map with a memory allocation HOB:
|
||||
//
|
||||
// There's going to be a time interval between our decrypting those pages for
|
||||
// SMBASE relocation and re-encrypting the same pages after SMBASE
|
||||
// relocation. We shall ensure that the DXE phase stay away from those pages
|
||||
// until after re-encryption, in order to prevent an information leak to the
|
||||
// hypervisor.
|
||||
//
|
||||
if (FeaturePcdGet (PcdSmmSmramRequire) && (mBootMode != BOOT_ON_S3_RESUME)) {
|
||||
RETURN_STATUS LocateMapStatus;
|
||||
UINTN MapPagesBase;
|
||||
UINTN MapPagesCount;
|
||||
|
||||
LocateMapStatus = MemEncryptSevLocateInitialSmramSaveStateMapPages (
|
||||
&MapPagesBase,
|
||||
&MapPagesCount
|
||||
);
|
||||
ASSERT_RETURN_ERROR (LocateMapStatus);
|
||||
|
||||
BuildMemoryAllocationHob (
|
||||
MapPagesBase, // BaseAddress
|
||||
EFI_PAGES_TO_SIZE (MapPagesCount), // Length
|
||||
EfiBootServicesData // MemoryType
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue