OvmfPkg/QemuFwCfgLib: Implement SEV internal functions for PEI phase
authorBrijesh Singh <brijesh.singh@amd.com>
Thu, 6 Jul 2017 13:29:03 +0000 (09:29 -0400)
committerJordan Justen <jordan.l.justen@intel.com>
Tue, 11 Jul 2017 04:17:28 +0000 (21:17 -0700)
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Laszlo Ersek <lersek@redhat.com>
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brijesh Singh <brijesh.singh@amd.com>
Reviewed-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Jordan Justen <jordan.l.justen@intel.com>
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf

index ac05f4c347f38986ad474373dfa19bef3512b0ca..40f89c3b53e2bf0c4c8c455a972a5c24249e02f4 100644 (file)
@@ -4,6 +4,7 @@
 \r
   Copyright (C) 2013, Red Hat, Inc.\r
   Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2017, Advanced Micro Devices. All rights reserved.<BR>\r
 \r
   This program and the accompanying materials are licensed and made available\r
   under the terms and conditions of the BSD License which accompanies this\r
   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
 **/\r
 \r
+#include <Library/BaseLib.h>\r
 #include <Library/DebugLib.h>\r
 #include <Library/QemuFwCfgLib.h>\r
+#include <Library/MemEncryptSevLib.h>\r
 \r
 #include "QemuFwCfgLibInternal.h"\r
 \r
@@ -76,8 +79,18 @@ QemuFwCfgInitialize (
   if ((Revision & FW_CFG_F_DMA) == 0) {\r
     DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n"));\r
   } else {\r
-    mQemuFwCfgDmaSupported = TRUE;\r
-    DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));\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 (InternalQemuFwCfgSevIsEnabled ()) {\r
+      DEBUG ((DEBUG_INFO, "SEV: 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
   return RETURN_SUCCESS;\r
 }\r
@@ -114,3 +127,58 @@ InternalQemuFwCfgDmaIsAvailable (
 {\r
   return mQemuFwCfgDmaSupported;\r
 }\r
+\r
+/**\r
+\r
+ Returns a boolean indicating whether SEV is enabled\r
+\r
+ @retval    TRUE    SEV is enabled\r
+ @retval    FALSE   SEV is disabled\r
+**/\r
+BOOLEAN\r
+InternalQemuFwCfgSevIsEnabled (\r
+  VOID\r
+  )\r
+{\r
+  return MemEncryptSevIsEnabled ();\r
+}\r
+\r
+/**\r
+ Allocate a bounce buffer for SEV DMA.\r
+\r
+  @param[in]     NumPage  Number of pages.\r
+  @param[out]    Buffer   Allocated DMA Buffer pointer\r
+\r
+**/\r
+VOID\r
+InternalQemuFwCfgSevDmaAllocateBuffer (\r
+  OUT    VOID     **Buffer,\r
+  IN     UINT32   NumPages\r
+  )\r
+{\r
+  //\r
+  // We should never reach here\r
+  //\r
+  ASSERT (FALSE);\r
+  CpuDeadLoop ();\r
+}\r
+\r
+/**\r
+ Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer\r
+\r
+  @param[in]     NumPage  Number of pages.\r
+  @param[in]     Buffer   DMA Buffer pointer\r
+\r
+**/\r
+VOID\r
+InternalQemuFwCfgSevDmaFreeBuffer (\r
+  IN     VOID     *Buffer,\r
+  IN     UINT32   NumPages\r
+  )\r
+{\r
+  //\r
+  // We should never reach here\r
+  //\r
+  ASSERT (FALSE);\r
+  CpuDeadLoop ();\r
+}\r
index 47e23b97eccf5b2898904ce8c913dfbd348ad4a4..7e51c3f160ac768c021f8e5aebca57e48c382680 100644 (file)
@@ -47,4 +47,5 @@
   DebugLib\r
   IoLib\r
   MemoryAllocationLib\r
+  MemEncryptSevLib\r
 \r