]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/QemuFwCfgLib: rewrite fw_cfg probe
authorGerd Hoffmann <kraxel@redhat.com>
Fri, 2 Dec 2022 13:10:08 +0000 (14:10 +0100)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Wed, 14 Dec 2022 17:45:41 +0000 (17:45 +0000)
Move the code to a new QemuFwCfgProbe() function.  Use direct Io*() calls
instead of indirect QemuFwCfg*() calls to make sure we don't get
recursive calls.  Also simplify CC guest detection.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Tom Lendacky <thomas.lendacky@amd.com>
Acked-by: Ard Biesheuvel <ardb@kernel.org>
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf

index 7ab7027af168eafe396271fa6a73e732a0bd1bab..a936fd103955f042d739aabc3d7d3f31b71cbd7b 100644 (file)
@@ -13,7 +13,6 @@
 #include <Library/IoLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/QemuFwCfgLib.h>\r
-#include <Library/MemEncryptSevLib.h>\r
 #include <WorkArea.h>\r
 \r
 #include "QemuFwCfgLibInternal.h"\r
@@ -27,15 +26,16 @@ STATIC BOOLEAN  mQemuFwCfgDmaSupported;
   @retval    TRUE   It is Tdx guest\r
   @retval    FALSE  It is not Tdx guest\r
 **/\r
+STATIC\r
 BOOLEAN\r
-QemuFwCfgIsTdxGuest (\r
+QemuFwCfgIsCcGuest (\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 == CcGuestTypeIntelTdx);\r
+  return (CcWorkAreaHeader != NULL && CcWorkAreaHeader->GuestType != CcGuestTypeNonEncrypted);\r
 }\r
 \r
 /**\r
@@ -57,62 +57,49 @@ QemuFwCfgIsAvailable (
   return InternalQemuFwCfgIsAvailable ();\r
 }\r
 \r
+STATIC\r
+VOID\r
+QemuFwCfgProbe (\r
+  BOOLEAN  *Supported,\r
+  BOOLEAN  *DmaSupported\r
+  )\r
+{\r
+  UINT32   Signature;\r
+  UINT32   Revision;\r
+  BOOLEAN  CcGuest;\r
+\r
+  // Use direct Io* calls for probing to avoid recursion.\r
+  IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)QemuFwCfgItemSignature);\r
+  IoReadFifo8 (FW_CFG_IO_DATA, sizeof Signature, &Signature);\r
+  IoWrite16 (FW_CFG_IO_SELECTOR, (UINT16)QemuFwCfgItemInterfaceVersion);\r
+  IoReadFifo8 (FW_CFG_IO_DATA, sizeof Revision, &Revision);\r
+  CcGuest = QemuFwCfgIsCcGuest ();\r
+\r
+  *Supported    = FALSE;\r
+  *DmaSupported = FALSE;\r
+  if ((Signature == SIGNATURE_32 ('Q', 'E', 'M', 'U')) && (Revision >= 1)) {\r
+    *Supported = TRUE;\r
+    if ((Revision & FW_CFG_F_DMA) && !CcGuest) {\r
+      *DmaSupported = TRUE;\r
+    }\r
+  }\r
+\r
+  DEBUG ((\r
+    DEBUG_INFO,\r
+    "%a: Supported %d, DMA %d\n",\r
+    __func__,\r
+    *Supported,\r
+    *DmaSupported\r
+    ));\r
+}\r
+\r
 RETURN_STATUS\r
 EFIAPI\r
 QemuFwCfgInitialize (\r
   VOID\r
   )\r
 {\r
-  UINT32  Signature;\r
-  UINT32  Revision;\r
-\r
-  //\r
-  // Enable the access routines while probing to see if it is supported.\r
-  // For probing we always use the IO Port (IoReadFifo8()) access method.\r
-  //\r
-  mQemuFwCfgSupported    = TRUE;\r
-  mQemuFwCfgDmaSupported = FALSE;\r
-\r
-  QemuFwCfgSelectItem (QemuFwCfgItemSignature);\r
-  Signature = QemuFwCfgRead32 ();\r
-  DEBUG ((DEBUG_INFO, "FW CFG Signature: 0x%x\n", Signature));\r
-  QemuFwCfgSelectItem (QemuFwCfgItemInterfaceVersion);\r
-  Revision = QemuFwCfgRead32 ();\r
-  DEBUG ((DEBUG_INFO, "FW CFG Revision: 0x%x\n", Revision));\r
-  if ((Signature != SIGNATURE_32 ('Q', 'E', 'M', 'U')) ||\r
-      (Revision < 1)\r
-      )\r
-  {\r
-    DEBUG ((DEBUG_INFO, "QemuFwCfg interface not supported.\n"));\r
-    mQemuFwCfgSupported = FALSE;\r
-    return RETURN_SUCCESS;\r
-  }\r
-\r
-  if ((Revision & FW_CFG_F_DMA) == 0) {\r
-    DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n"));\r
-  } else {\r
-    //\r
-    // If SEV is enabled then we do not support DMA operations in PEI phase.\r
-    // This is mainly because DMA in SEV 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
-    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
-    }\r
-  }\r
-\r
+  QemuFwCfgProbe (&mQemuFwCfgSupported, &mQemuFwCfgDmaSupported);\r
   return RETURN_SUCCESS;\r
 }\r
 \r
@@ -183,17 +170,11 @@ InternalQemuFwCfgDmaBytes (
     return;\r
   }\r
 \r
-  //\r
-  // SEV does not support DMA operations in PEI stage, we should\r
-  // not have reached here.\r
-  //\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
+  ASSERT (!QemuFwCfgIsCcGuest ());\r
 \r
   Access.Control = SwapBytes32 (Control);\r
   Access.Length  = SwapBytes32 (Size);\r
index 3910511880c93aec871bb0e74fbde12faafea44b..1d7543a7d40ff1e3303c46524e70528ba972b64d 100644 (file)
@@ -41,7 +41,6 @@
   DebugLib\r
   IoLib\r
   MemoryAllocationLib\r
-  MemEncryptSevLib\r
 \r
 [Pcd]\r
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfWorkAreaBase\r