Re: [edk2] [RFC v4 10/13] OvmfPkg/QemuFwCfgLib: Implement SEV internal functions for PEI phase

2017-05-11 Thread Laszlo Ersek
On 05/11/17 00:09, Brijesh Singh wrote:
> Cc: Jordan Justen 
> Cc: Laszlo Ersek 
> Contributed-under: TianoCore Contribution Agreement 1.0
> Signed-off-by: Brijesh Singh 
> ---
>  OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf |  1 +
>  OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c  | 72 +++-
>  2 files changed, 71 insertions(+), 2 deletions(-)

Reviewed-by: Laszlo Ersek 

Thanks,
Laszlo

> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf 
> b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf
> index 4f966a85088a..b97b475c7cad 100644
> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf
> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf
> @@ -47,4 +47,5 @@ [LibraryClasses]
>DebugLib
>IoLib
>MemoryAllocationLib
> +  MemEncryptSevLib
>  
> diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c 
> b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
> index ac05f4c347f3..1696512bccaf 100644
> --- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
> +++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
> @@ -4,6 +4,7 @@
>  
>Copyright (C) 2013, Red Hat, Inc.
>Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.
> +  Copyright (c) 2017, Advanced Micro Devices. All rights reserved.
>  
>This program and the accompanying materials are licensed and made available
>under the terms and conditions of the BSD License which accompanies this
> @@ -14,8 +15,10 @@
>WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
>  **/
>  
> +#include 
>  #include 
>  #include 
> +#include 
>  
>  #include "QemuFwCfgLibInternal.h"
>  
> @@ -76,8 +79,18 @@ QemuFwCfgInitialize (
>if ((Revision & FW_CFG_F_DMA) == 0) {
>  DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n"));
>} else {
> -mQemuFwCfgDmaSupported = TRUE;
> -DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));
> +//
> +// If SEV is enabled then we do not support DMA operations in PEI phase.
> +// This is mainly because DMA in SEV guest requires using bounce buffer
> +// (which need to allocate dynamic memory and allocating a PAGE size'd
> +// buffer can be challenge in PEI phase)
> +//
> +if (InternalQemuFwCfgSevIsEnabled ()) {
> +  DEBUG ((DEBUG_INFO, "SEV: QemuFwCfg fallback to IO Port 
> interface.\n"));
> +} else {
> +  mQemuFwCfgDmaSupported = TRUE;
> +  DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));
> +}
>}
>return RETURN_SUCCESS;
>  }
> @@ -114,3 +127,58 @@ InternalQemuFwCfgDmaIsAvailable (
>  {
>return mQemuFwCfgDmaSupported;
>  }
> +
> +/**
> +
> + Returns a boolean indicating whether SEV is enabled
> +
> + @retvalTRUESEV is enabled
> + @retvalFALSE   SEV is disabled
> +**/
> +BOOLEAN
> +InternalQemuFwCfgSevIsEnabled (
> +  VOID
> +  )
> +{
> +  return MemEncryptSevIsEnabled ();
> +}
> +
> +/**
> + Allocate a bounce buffer for SEV DMA.
> +
> +  @param[in] NumPage  Number of pages.
> +  @param[out]Buffer   Allocated DMA Buffer pointer
> +
> +**/
> +VOID
> +InternalQemuFwCfgSevDmaAllocateBuffer (
> +  IN UINT32   NumPages,
> +  OUTVOID **Buffer
> +  )
> +{
> +  //
> +  // We should never reach here
> +  //
> +  ASSERT (FALSE);
> +  CpuDeadLoop ();
> +}
> +
> +/**
> + Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer
> +
> +  @param[in] NumPage  Number of pages.
> +  @param[in] Buffer   DMA Buffer pointer
> +
> +**/
> +VOID
> +InternalQemuFwCfgSevDmaFreeBuffer (
> +  IN VOID *Buffer,
> +  IN UINT32   NumPages
> +  )
> +{
> +  //
> +  // We should never reach here
> +  //
> +  ASSERT (FALSE);
> +  CpuDeadLoop ();
> +}
> 

___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel


[edk2] [RFC v4 10/13] OvmfPkg/QemuFwCfgLib: Implement SEV internal functions for PEI phase

2017-05-10 Thread Brijesh Singh
Cc: Jordan Justen 
Cc: Laszlo Ersek 
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Brijesh Singh 
---
 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf |  1 +
 OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c  | 72 +++-
 2 files changed, 71 insertions(+), 2 deletions(-)

diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf 
b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf
index 4f966a85088a..b97b475c7cad 100644
--- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf
+++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPeiLib.inf
@@ -47,4 +47,5 @@ [LibraryClasses]
   DebugLib
   IoLib
   MemoryAllocationLib
+  MemEncryptSevLib
 
diff --git a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c 
b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
index ac05f4c347f3..1696512bccaf 100644
--- a/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
+++ b/OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgPei.c
@@ -4,6 +4,7 @@
 
   Copyright (C) 2013, Red Hat, Inc.
   Copyright (c) 2011 - 2013, Intel Corporation. All rights reserved.
+  Copyright (c) 2017, Advanced Micro Devices. All rights reserved.
 
   This program and the accompanying materials are licensed and made available
   under the terms and conditions of the BSD License which accompanies this
@@ -14,8 +15,10 @@
   WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 **/
 
+#include 
 #include 
 #include 
+#include 
 
 #include "QemuFwCfgLibInternal.h"
 
@@ -76,8 +79,18 @@ QemuFwCfgInitialize (
   if ((Revision & FW_CFG_F_DMA) == 0) {
 DEBUG ((DEBUG_INFO, "QemuFwCfg interface (IO Port) is supported.\n"));
   } else {
-mQemuFwCfgDmaSupported = TRUE;
-DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));
+//
+// If SEV is enabled then we do not support DMA operations in PEI phase.
+// This is mainly because DMA in SEV guest requires using bounce buffer
+// (which need to allocate dynamic memory and allocating a PAGE size'd
+// buffer can be challenge in PEI phase)
+//
+if (InternalQemuFwCfgSevIsEnabled ()) {
+  DEBUG ((DEBUG_INFO, "SEV: QemuFwCfg fallback to IO Port interface.\n"));
+} else {
+  mQemuFwCfgDmaSupported = TRUE;
+  DEBUG ((DEBUG_INFO, "QemuFwCfg interface (DMA) is supported.\n"));
+}
   }
   return RETURN_SUCCESS;
 }
@@ -114,3 +127,58 @@ InternalQemuFwCfgDmaIsAvailable (
 {
   return mQemuFwCfgDmaSupported;
 }
+
+/**
+
+ Returns a boolean indicating whether SEV is enabled
+
+ @retvalTRUESEV is enabled
+ @retvalFALSE   SEV is disabled
+**/
+BOOLEAN
+InternalQemuFwCfgSevIsEnabled (
+  VOID
+  )
+{
+  return MemEncryptSevIsEnabled ();
+}
+
+/**
+ Allocate a bounce buffer for SEV DMA.
+
+  @param[in] NumPage  Number of pages.
+  @param[out]Buffer   Allocated DMA Buffer pointer
+
+**/
+VOID
+InternalQemuFwCfgSevDmaAllocateBuffer (
+  IN UINT32   NumPages,
+  OUTVOID **Buffer
+  )
+{
+  //
+  // We should never reach here
+  //
+  ASSERT (FALSE);
+  CpuDeadLoop ();
+}
+
+/**
+ Free the DMA buffer allocated using InternalQemuFwCfgSevDmaAllocateBuffer
+
+  @param[in] NumPage  Number of pages.
+  @param[in] Buffer   DMA Buffer pointer
+
+**/
+VOID
+InternalQemuFwCfgSevDmaFreeBuffer (
+  IN VOID *Buffer,
+  IN UINT32   NumPages
+  )
+{
+  //
+  // We should never reach here
+  //
+  ASSERT (FALSE);
+  CpuDeadLoop ();
+}
-- 
2.7.4

___
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel