]> git.proxmox.com Git - mirror_edk2.git/blobdiff - OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
OvmfPkg: Check Tdx in QemuFwCfgPei to avoid DMA operation
[mirror_edk2.git] / OvmfPkg / Library / QemuFwCfgLib / QemuFwCfgPei.c
index f696fb7cacaab15ff4c07d188daa36a6af8c87ed..b8230613dcea2379d4f3b42789a532e79bdfd9b7 100644 (file)
 #include <Library/DebugLib.h>\r
 #include <Library/QemuFwCfgLib.h>\r
 #include <Library/MemEncryptSevLib.h>\r
+#include <WorkArea.h>\r
 \r
 #include "QemuFwCfgLibInternal.h"\r
 \r
 STATIC BOOLEAN  mQemuFwCfgSupported = FALSE;\r
 STATIC BOOLEAN  mQemuFwCfgDmaSupported;\r
 \r
+/**\r
+  Check if it is Tdx guest\r
+\r
+  @retval    TRUE   It is Tdx guest\r
+  @retval    FALSE  It is not Tdx guest\r
+**/\r
+BOOLEAN\r
+QemuFwCfgIsTdxGuest (\r
+  VOID\r
+  )\r
+{\r
+  CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER  *CcWorkAreaHeader;\r
+\r
+  CcWorkAreaHeader = (CONFIDENTIAL_COMPUTING_WORK_AREA_HEADER *)FixedPcdGet32 (PcdOvmfWorkAreaBase);\r
+  return (CcWorkAreaHeader != NULL && CcWorkAreaHeader->GuestType == GUEST_TYPE_INTEL_TDX);\r
+}\r
+\r
 /**\r
   Returns a boolean indicating if the firmware configuration interface\r
   is available or not.\r
@@ -81,6 +99,14 @@ QemuFwCfgInitialize (
     //\r
     if (MemEncryptSevIsEnabled ()) {\r
       DEBUG ((DEBUG_INFO, "SEV: QemuFwCfg fallback to IO Port interface.\n"));\r
+    } else if (QemuFwCfgIsTdxGuest ()) {\r
+      //\r
+      // If TDX is enabled then we do not support DMA operations in PEI phase.\r
+      // This is mainly because DMA in TDX guest requires using bounce buffer\r
+      // (which need to allocate dynamic memory and allocating a PAGE size'd\r
+      // buffer can be challenge in PEI phase)\r
+      //\r
+      DEBUG ((DEBUG_INFO, "TDX: QemuFwCfg fallback to IO Port interface.\n"));\r
     } else {\r
       mQemuFwCfgDmaSupported = TRUE;\r
       DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));\r
@@ -163,6 +189,12 @@ InternalQemuFwCfgDmaBytes (
   //\r
   ASSERT (!MemEncryptSevIsEnabled ());\r
 \r
+  //\r
+  // TDX does not support DMA operations in PEI stage, we should\r
+  // not have reached here.\r
+  //\r
+  ASSERT (!QemuFwCfgIsTdxGuest ());\r
+\r
   Access.Control = SwapBytes32 (Control);\r
   Access.Length  = SwapBytes32 (Size);\r
   Access.Address = SwapBytes64 ((UINTN)Buffer);\r