Acked-by: Jiewen Yao <jiewen....@intel.com> Need AMD-SEV people to give Reviewed-by.
Thank you Yao, Jiewen > -----Original Message----- > From: Dionna Glaze <dionnagl...@google.com> > Sent: Tuesday, October 25, 2022 4:41 AM > To: devel@edk2.groups.io > Cc: Dionna Glaze <dionnagl...@google.com>; Gerd Hoffmann > <kra...@redhat.com>; James Bottomley <j...@linux.ibm.com>; Yao, > Jiewen <jiewen....@intel.com>; Tom Lendacky > <thomas.lenda...@amd.com> > Subject: [PATCH v8 1/7] OvmfPkg: Realize EfiMemoryAcceptProtocol in > AmdSevDxe > > From: Sophia Wolf <phiaw...@google.com> > > When a guest OS does not support unaccepted memory, the unaccepted > memory must be accepted before returning a memory map to the caller. > > EfiMemoryAcceptProtocol is defined in MdePkg and is implemented / > Installed in AmdSevDxe for AMD SEV-SNP memory acceptance. > > Cc: Gerd Hoffmann <kra...@redhat.com> > Cc: James Bottomley <j...@linux.ibm.com> > Cc: Jiewen Yao <jiewen....@intel.com> > Cc: Tom Lendacky <thomas.lenda...@amd.com> > Signed-off-by: Dionna Glaze <dionnagl...@google.com> > --- > OvmfPkg/AmdSevDxe/AmdSevDxe.c | 55 > ++++++++++++++++++-- > OvmfPkg/AmdSevDxe/AmdSevDxe.inf | 3 ++ > > OvmfPkg/Library/BaseMemEncryptSevLib/X64/DxeSnpSystemRamValidate. > c | 24 +++++++-- > 3 files changed, 74 insertions(+), 8 deletions(-) > > diff --git a/OvmfPkg/AmdSevDxe/AmdSevDxe.c > b/OvmfPkg/AmdSevDxe/AmdSevDxe.c > index 662d3c4ccb..f7600c3c81 100644 > --- a/OvmfPkg/AmdSevDxe/AmdSevDxe.c > +++ b/OvmfPkg/AmdSevDxe/AmdSevDxe.c > @@ -20,6 +20,7 @@ > #include <Library/UefiBootServicesTableLib.h> > #include <Guid/ConfidentialComputingSevSnpBlob.h> > #include <Library/PcdLib.h> > +#include <Protocol/MemoryAccept.h> > > STATIC CONFIDENTIAL_COMPUTING_SNP_BLOB_LOCATION > mSnpBootDxeTable = { > SIGNATURE_32 ('A', 'M', 'D', 'E'), > @@ -31,6 +32,40 @@ STATIC > CONFIDENTIAL_COMPUTING_SNP_BLOB_LOCATION mSnpBootDxeTable = { > FixedPcdGet32 (PcdOvmfCpuidSize), > }; > > +STATIC EFI_HANDLE mAmdSevDxeHandle = NULL; > + > +#define IS_ALIGNED(x, y) ((((x) & ((y) - 1)) == 0)) > + > +STATIC > +EFI_STATUS > +EFIAPI > +AmdSevMemoryAccept ( > + IN EDKII_MEMORY_ACCEPT_PROTOCOL *This, > + IN EFI_PHYSICAL_ADDRESS StartAddress, > + IN UINTN Size > + ) > +{ > + // > + // The StartAddress must be page-aligned, and the Size must be a > positive > + // multiple of SIZE_4KB. Use an assert instead of returning an erros since > + // this is an EDK2-internal protocol. > + // > + ASSERT (IS_ALIGNED (StartAddress, SIZE_4KB)); > + ASSERT (IS_ALIGNED (Size, SIZE_4KB)); > + ASSERT (Size != 0); > + > + MemEncryptSevSnpPreValidateSystemRam ( > + StartAddress, > + EFI_SIZE_TO_PAGES (Size) > + ); > + > + return EFI_SUCCESS; > +} > + > +STATIC EDKII_MEMORY_ACCEPT_PROTOCOL mMemoryAcceptProtocol = { > + AmdSevMemoryAccept > +}; > + > EFI_STATUS > EFIAPI > AmdSevDxeEntryPoint ( > @@ -147,11 +182,23 @@ AmdSevDxeEntryPoint ( > } > } > > - // > - // If its SEV-SNP active guest then install the > CONFIDENTIAL_COMPUTING_SEV_SNP_BLOB. > - // It contains the location for both the Secrets and CPUID page. > - // > if (MemEncryptSevSnpIsEnabled ()) { > + // > + // Memory acceptance began being required in SEV-SNP, so install the > + // memory accept protocol implementation for a SEV-SNP active guest. > + // > + Status = gBS->InstallProtocolInterface ( > + &mAmdSevDxeHandle, > + &gEdkiiMemoryAcceptProtocolGuid, > + EFI_NATIVE_INTERFACE, > + &mMemoryAcceptProtocol > + ); > + ASSERT_EFI_ERROR (Status); > + > + // > + // If its SEV-SNP active guest then install the > CONFIDENTIAL_COMPUTING_SEV_SNP_BLOB. > + // It contains the location for both the Secrets and CPUID page. > + // > return gBS->InstallConfigurationTable ( > &gConfidentialComputingSevSnpBlobGuid, > &mSnpBootDxeTable > diff --git a/OvmfPkg/AmdSevDxe/AmdSevDxe.inf > b/OvmfPkg/AmdSevDxe/AmdSevDxe.inf > index 9acf860cf2..cd1b686c53 100644 > --- a/OvmfPkg/AmdSevDxe/AmdSevDxe.inf > +++ b/OvmfPkg/AmdSevDxe/AmdSevDxe.inf > @@ -47,6 +47,9 @@ > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsBase > gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsSize > > +[Protocols] > + gEdkiiMemoryAcceptProtocolGuid > + > [Guids] > gConfidentialComputingSevSnpBlobGuid > > diff --git > a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/DxeSnpSystemRamValidat > e.c > b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/DxeSnpSystemRamValida > te.c > index d3a95e4913..cbcdd46f52 100644 > --- > a/OvmfPkg/Library/BaseMemEncryptSevLib/X64/DxeSnpSystemRamValidat > e.c > +++ > b/OvmfPkg/Library/BaseMemEncryptSevLib/X64/DxeSnpSystemRamValida > te.c > @@ -14,6 +14,7 @@ > #include <Library/MemEncryptSevLib.h> > > #include "SnpPageStateChange.h" > +#include "VirtualMemory.h" > > /** > Pre-validate the system RAM when SEV-SNP is enabled in the guest VM. > @@ -29,12 +30,27 @@ MemEncryptSevSnpPreValidateSystemRam ( > IN UINTN NumPages > ) > { > + EFI_STATUS Status; > + > if (!MemEncryptSevSnpIsEnabled ()) { > return; > } > > - // > - // All the pre-validation must be completed in the PEI phase. > - // > - ASSERT (FALSE); > + // 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 (); > + } > + } > + > + InternalSetPageState (BaseAddress, NumPages, SevSnpPagePrivate, > TRUE); > } > -- > 2.38.0.135.g90850a2211-goog -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#96081): https://edk2.groups.io/g/devel/message/96081 Mute This Topic: https://groups.io/mt/94544530/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-