diff mbox series

[v2,15/31] OvmfPkg/XenHypercallLib: Enable it in PEIM

Message ID 20190409110844.14746-16-anthony.perard@citrix.com (mailing list archive)
State New, archived
Headers show
Series Specific platform to run OVMF in Xen PVH and HVM guests | expand

Commit Message

Anthony PERARD April 9, 2019, 11:08 a.m. UTC
Allow to use Xen hypercalls earlier, during the PEIM stage, but
XenHypercallLibReInit() must be called once the XenInfo HOB is created
with the HyperPage setup.

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf |  2 +-
 OvmfPkg/XenPlatformPei/XenPlatformPei.inf           |  1 +
 OvmfPkg/Include/Library/XenHypercallLib.h           | 12 ++++++++++++
 OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c   | 11 +++++++++++
 OvmfPkg/XenPlatformPei/Xen.c                        |  7 +++++++
 5 files changed, 32 insertions(+), 1 deletion(-)

Comments

Laszlo Ersek April 12, 2019, 9:07 a.m. UTC | #1
On 04/09/19 13:08, Anthony PERARD wrote:
> Allow to use Xen hypercalls earlier, during the PEIM stage, but
> XenHypercallLibReInit() must be called once the XenInfo HOB is created
> with the HyperPage setup.
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf |  2 +-
>  OvmfPkg/XenPlatformPei/XenPlatformPei.inf           |  1 +
>  OvmfPkg/Include/Library/XenHypercallLib.h           | 12 ++++++++++++
>  OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c   | 11 +++++++++++
>  OvmfPkg/XenPlatformPei/Xen.c                        |  7 +++++++
>  5 files changed, 32 insertions(+), 1 deletion(-)
> 
> diff --git a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
> index d268e540fe..e0a1889171 100644
> --- a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
> +++ b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
> @@ -21,7 +21,7 @@ [Defines]
>    CONSTRUCTOR                    = XenHypercallLibInit
>  
>  [Defines.IA32, Defines.X64]
> -  LIBRARY_CLASS                  = XenHypercallLib|DXE_DRIVER UEFI_DRIVER
> +  LIBRARY_CLASS                  = XenHypercallLib|PEIM DXE_DRIVER UEFI_DRIVER
>  
>  [Defines.ARM, Defines.AARCH64]
>    LIBRARY_CLASS                  = XenHypercallLib
> diff --git a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
> index 1870e39208..bc6065a709 100644
> --- a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
> +++ b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
> @@ -66,6 +66,7 @@ [LibraryClasses]
>    MtrrLib
>    MemEncryptSevLib
>    PcdLib
> +  XenHypercallLib
>  
>  [Pcd]
>    gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase
> diff --git a/OvmfPkg/Include/Library/XenHypercallLib.h b/OvmfPkg/Include/Library/XenHypercallLib.h
> index 36e3344e2f..38e64ab108 100644
> --- a/OvmfPkg/Include/Library/XenHypercallLib.h
> +++ b/OvmfPkg/Include/Library/XenHypercallLib.h
> @@ -16,6 +16,18 @@
>  #ifndef __XEN_HYPERCALL_LIB_H__
>  #define __XEN_HYPERCALL_LIB_H__
>  
> +/**
> +  To call when the gEfiXenInfoGuid HOB became available after the library init
> +  function has already been executed.
> +
> +  This allow to make hypercall in the PEIM stage.
> +**/
> +VOID
> +EFIAPI
> +XenHypercallLibReInit (
> +  VOID
> +  );
> +
>  /**
>    Check if the Xen Hypercall library is able to make calls to the Xen
>    hypervisor.
> diff --git a/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c b/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c
> index 7cb7f46c9b..2ac7254759 100644
> --- a/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c
> +++ b/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c
> @@ -78,6 +78,17 @@ XenHypercallLibInit (
>    return RETURN_SUCCESS;
>  }
>  
> +VOID
> +EFIAPI
> +XenHypercallLibReInit (
> +  VOID
> +  )
> +{
> +  if (HyperPage == NULL) {
> +    XenHypercallLibInit();
> +  }
> +}
> +
>  /**
>    This function will put the two arguments in the right place (registers) and
>    invoke the hypercall identified by HypercallID.
> diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
> index fb01094ba9..9d9e9f8020 100644
> --- a/OvmfPkg/XenPlatformPei/Xen.c
> +++ b/OvmfPkg/XenPlatformPei/Xen.c
> @@ -32,6 +32,7 @@
>  #include <Library/ResourcePublicationLib.h>
>  #include <Library/MtrrLib.h>
>  #include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>
> +#include <Library/XenHypercallLib.h>
>  
>  #include "Platform.h"
>  #include "Xen.h"
> @@ -157,6 +158,12 @@ XenConnect (
>      sizeof(mXenInfo)
>      );
>  
> +  //
> +  // Initialize the XenHypercall library, now that the XenInfo HOB is
> +  // available
> +  //
> +  XenHypercallLibReInit ();
> +
>    return EFI_SUCCESS;
>  }
>  
> 

Please rework this patch as follows. We're going to need two patches.

First patch:

(1) In "X86XenHypercall.c", change XenHypercallLibInit() to return
RETURN_NOT_FOUND, when it doesn't find the HOB. Remove the comment about
constructors.

(2) Add the prototype of the existing XenHypercallLibInit() function to
"XenHypercallLib.h".

(3) In "XenHypercall.c", introduce a new function called
XenHypercallLibConstruct(). This function should have identical return
type, calling convention, and parameter list, to XenHypercallLibInit().

The new function should call XenHypercallLibInit(), ignore its return
value, and always return RETURN_SUCCESS. Reinstate the comment here that
you removed in (1).

(4) Update the CONSTRUCTOR define in the INF file to
XenHypercallLibConstruct.

(5) Don't touch XenPlatformPei.

Second patch:

(6) Make XenPlatformPei call XenHypercallLibInit(), and then assert success:

  RETURN_STATUS XenHypercallInitStatus;

  XenHypercallInitStatus = XenHypercallLibInit ();
  ASSERT_RETURN_ERROR (XenHypercallInitStatus);

Thanks,
Laszlo
diff mbox series

Patch

diff --git a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
index d268e540fe..e0a1889171 100644
--- a/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
+++ b/OvmfPkg/Library/XenHypercallLib/XenHypercallLib.inf
@@ -21,7 +21,7 @@  [Defines]
   CONSTRUCTOR                    = XenHypercallLibInit
 
 [Defines.IA32, Defines.X64]
-  LIBRARY_CLASS                  = XenHypercallLib|DXE_DRIVER UEFI_DRIVER
+  LIBRARY_CLASS                  = XenHypercallLib|PEIM DXE_DRIVER UEFI_DRIVER
 
 [Defines.ARM, Defines.AARCH64]
   LIBRARY_CLASS                  = XenHypercallLib
diff --git a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
index 1870e39208..bc6065a709 100644
--- a/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
+++ b/OvmfPkg/XenPlatformPei/XenPlatformPei.inf
@@ -66,6 +66,7 @@  [LibraryClasses]
   MtrrLib
   MemEncryptSevLib
   PcdLib
+  XenHypercallLib
 
 [Pcd]
   gUefiOvmfPkgTokenSpaceGuid.PcdOvmfPeiMemFvBase
diff --git a/OvmfPkg/Include/Library/XenHypercallLib.h b/OvmfPkg/Include/Library/XenHypercallLib.h
index 36e3344e2f..38e64ab108 100644
--- a/OvmfPkg/Include/Library/XenHypercallLib.h
+++ b/OvmfPkg/Include/Library/XenHypercallLib.h
@@ -16,6 +16,18 @@ 
 #ifndef __XEN_HYPERCALL_LIB_H__
 #define __XEN_HYPERCALL_LIB_H__
 
+/**
+  To call when the gEfiXenInfoGuid HOB became available after the library init
+  function has already been executed.
+
+  This allow to make hypercall in the PEIM stage.
+**/
+VOID
+EFIAPI
+XenHypercallLibReInit (
+  VOID
+  );
+
 /**
   Check if the Xen Hypercall library is able to make calls to the Xen
   hypervisor.
diff --git a/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c b/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c
index 7cb7f46c9b..2ac7254759 100644
--- a/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c
+++ b/OvmfPkg/Library/XenHypercallLib/X86XenHypercall.c
@@ -78,6 +78,17 @@  XenHypercallLibInit (
   return RETURN_SUCCESS;
 }
 
+VOID
+EFIAPI
+XenHypercallLibReInit (
+  VOID
+  )
+{
+  if (HyperPage == NULL) {
+    XenHypercallLibInit();
+  }
+}
+
 /**
   This function will put the two arguments in the right place (registers) and
   invoke the hypercall identified by HypercallID.
diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
index fb01094ba9..9d9e9f8020 100644
--- a/OvmfPkg/XenPlatformPei/Xen.c
+++ b/OvmfPkg/XenPlatformPei/Xen.c
@@ -32,6 +32,7 @@ 
 #include <Library/ResourcePublicationLib.h>
 #include <Library/MtrrLib.h>
 #include <IndustryStandard/Xen/arch-x86/hvm/start_info.h>
+#include <Library/XenHypercallLib.h>
 
 #include "Platform.h"
 #include "Xen.h"
@@ -157,6 +158,12 @@  XenConnect (
     sizeof(mXenInfo)
     );
 
+  //
+  // Initialize the XenHypercall library, now that the XenInfo HOB is
+  // available
+  //
+  XenHypercallLibReInit ();
+
   return EFI_SUCCESS;
 }