]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg: Realize EfiMemoryAcceptProtocol in AmdSevDxe
authorSophia Wolf <phiawolf@google.com>
Tue, 8 Nov 2022 16:46:14 +0000 (16:46 +0000)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Thu, 12 Jan 2023 16:03:30 +0000 (16:03 +0000)
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 <kraxel@redhat.com>
Cc: James Bottomley <jejb@linux.ibm.com>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Tom Lendacky <thomas.lendacky@amd.com>
Reviewed-by: Tom Lendacky <thomas.lendacky@amd.com>
Acked-by: Jiewen Yao <Jiewen.yao@intel.com>
Signed-off-by: Dionna Glaze <dionnaglaze@google.com>
Message-Id: <20221108164616.3251967-2-dionnaglaze@google.com>

OvmfPkg/AmdSevDxe/AmdSevDxe.c
OvmfPkg/AmdSevDxe/AmdSevDxe.inf
OvmfPkg/Library/BaseMemEncryptSevLib/X64/DxeSnpSystemRamValidate.c

index 662d3c4ccb0f0dec2149d3ed67b168a27e809973..f7600c3c81e6206842df4afe3d3322b55f25c5cc 100644 (file)
@@ -20,6 +20,7 @@
 #include <Library/UefiBootServicesTableLib.h>\r
 #include <Guid/ConfidentialComputingSevSnpBlob.h>\r
 #include <Library/PcdLib.h>\r
+#include <Protocol/MemoryAccept.h>\r
 \r
 STATIC CONFIDENTIAL_COMPUTING_SNP_BLOB_LOCATION  mSnpBootDxeTable = {\r
   SIGNATURE_32 ('A',                                    'M', 'D', 'E'),\r
@@ -31,6 +32,40 @@ STATIC CONFIDENTIAL_COMPUTING_SNP_BLOB_LOCATION  mSnpBootDxeTable = {
   FixedPcdGet32 (PcdOvmfCpuidSize),\r
 };\r
 \r
+STATIC EFI_HANDLE  mAmdSevDxeHandle = NULL;\r
+\r
+#define IS_ALIGNED(x, y)  ((((x) & ((y) - 1)) == 0))\r
+\r
+STATIC\r
+EFI_STATUS\r
+EFIAPI\r
+AmdSevMemoryAccept (\r
+  IN EDKII_MEMORY_ACCEPT_PROTOCOL  *This,\r
+  IN EFI_PHYSICAL_ADDRESS          StartAddress,\r
+  IN UINTN                         Size\r
+  )\r
+{\r
+  //\r
+  // The StartAddress must be page-aligned, and the Size must be a positive\r
+  // multiple of SIZE_4KB. Use an assert instead of returning an erros since\r
+  // this is an EDK2-internal protocol.\r
+  //\r
+  ASSERT (IS_ALIGNED (StartAddress, SIZE_4KB));\r
+  ASSERT (IS_ALIGNED (Size, SIZE_4KB));\r
+  ASSERT (Size != 0);\r
+\r
+  MemEncryptSevSnpPreValidateSystemRam (\r
+    StartAddress,\r
+    EFI_SIZE_TO_PAGES (Size)\r
+    );\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+STATIC EDKII_MEMORY_ACCEPT_PROTOCOL  mMemoryAcceptProtocol = {\r
+  AmdSevMemoryAccept\r
+};\r
+\r
 EFI_STATUS\r
 EFIAPI\r
 AmdSevDxeEntryPoint (\r
@@ -147,11 +182,23 @@ AmdSevDxeEntryPoint (
     }\r
   }\r
 \r
-  //\r
-  // If its SEV-SNP active guest then install the CONFIDENTIAL_COMPUTING_SEV_SNP_BLOB.\r
-  // It contains the location for both the Secrets and CPUID page.\r
-  //\r
   if (MemEncryptSevSnpIsEnabled ()) {\r
+    //\r
+    // Memory acceptance began being required in SEV-SNP, so install the\r
+    // memory accept protocol implementation for a SEV-SNP active guest.\r
+    //\r
+    Status = gBS->InstallProtocolInterface (\r
+                    &mAmdSevDxeHandle,\r
+                    &gEdkiiMemoryAcceptProtocolGuid,\r
+                    EFI_NATIVE_INTERFACE,\r
+                    &mMemoryAcceptProtocol\r
+                    );\r
+    ASSERT_EFI_ERROR (Status);\r
+\r
+    //\r
+    // If its SEV-SNP active guest then install the CONFIDENTIAL_COMPUTING_SEV_SNP_BLOB.\r
+    // It contains the location for both the Secrets and CPUID page.\r
+    //\r
     return gBS->InstallConfigurationTable (\r
                   &gConfidentialComputingSevSnpBlobGuid,\r
                   &mSnpBootDxeTable\r
index 9acf860cf25ef8d8ed74f03ffc2fc8d9ebbc9563..cd1b686c5365f6ef3c14a71896895d1fd951c5fb 100644 (file)
@@ -47,6 +47,9 @@
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsBase\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfSnpSecretsSize\r
 \r
+[Protocols]\r
+  gEdkiiMemoryAcceptProtocolGuid\r
+\r
 [Guids]\r
   gConfidentialComputingSevSnpBlobGuid\r
 \r
index d3a95e4913b91091487637e1e64cb824a88bf5e4..cbcdd46f528f193ddfcd046c8db2d1067b54abbb 100644 (file)
@@ -14,6 +14,7 @@
 #include <Library/MemEncryptSevLib.h>\r
 \r
 #include "SnpPageStateChange.h"\r
+#include "VirtualMemory.h"\r
 \r
 /**\r
   Pre-validate the system RAM when SEV-SNP is enabled in the guest VM.\r
@@ -29,12 +30,27 @@ MemEncryptSevSnpPreValidateSystemRam (
   IN UINTN             NumPages\r
   )\r
 {\r
+  EFI_STATUS  Status;\r
+\r
   if (!MemEncryptSevSnpIsEnabled ()) {\r
     return;\r
   }\r
 \r
-  //\r
-  // All the pre-validation must be completed in the PEI phase.\r
-  //\r
-  ASSERT (FALSE);\r
+  // DXE pre-validation may happen with the memory accept protocol.\r
+  // The protocol should only be called outside the prevalidated ranges\r
+  // that the PEI stage code explicitly skips. Specifically, only memory\r
+  // ranges that are classified as unaccepted.\r
+  if (BaseAddress >= SIZE_4GB) {\r
+    Status = InternalMemEncryptSevCreateIdentityMap1G (\r
+               0,\r
+               BaseAddress,\r
+               EFI_PAGES_TO_SIZE (NumPages)\r
+               );\r
+    if (EFI_ERROR (Status)) {\r
+      ASSERT (FALSE);\r
+      CpuDeadLoop ();\r
+    }\r
+  }\r
+\r
+  InternalSetPageState (BaseAddress, NumPages, SevSnpPagePrivate, TRUE);\r
 }\r