diff mbox series

[v2,18/31] OvmfPkg/XenPlatformPei: Setup HyperPages earlier

Message ID 20190409110844.14746-19-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
We are going to need to make an hypercall in order to retreive the E820
table from the hypervisor before been able to setup the memory.

Calling XenConnect earlier will allow to setup the XenHypercallLib
earlier to allow to make hypercalls.

While here, add some comments in XenConnect().

Contributed-under: TianoCore Contribution Agreement 1.1
Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
---
 OvmfPkg/XenPlatformPei/Platform.h |  5 +++++
 OvmfPkg/XenPlatformPei/Platform.c |  2 ++
 OvmfPkg/XenPlatformPei/Xen.c      | 23 ++++++++++----------
 3 files changed, 19 insertions(+), 11 deletions(-)

Comments

Laszlo Ersek April 12, 2019, 9:17 a.m. UTC | #1
On 04/09/19 13:08, Anthony PERARD wrote:
> We are going to need to make an hypercall in order to retreive the E820
> table from the hypervisor before been able to setup the memory.
> 
> Calling XenConnect earlier will allow to setup the XenHypercallLib
> earlier to allow to make hypercalls.
> 
> While here, add some comments in XenConnect().
> 
> Contributed-under: TianoCore Contribution Agreement 1.1
> Signed-off-by: Anthony PERARD <anthony.perard@citrix.com>
> ---
>  OvmfPkg/XenPlatformPei/Platform.h |  5 +++++
>  OvmfPkg/XenPlatformPei/Platform.c |  2 ++
>  OvmfPkg/XenPlatformPei/Xen.c      | 23 ++++++++++----------
>  3 files changed, 19 insertions(+), 11 deletions(-)
> 
> diff --git a/OvmfPkg/XenPlatformPei/Platform.h b/OvmfPkg/XenPlatformPei/Platform.h
> index 5565d47e34..a524c23a43 100644
> --- a/OvmfPkg/XenPlatformPei/Platform.h
> +++ b/OvmfPkg/XenPlatformPei/Platform.h
> @@ -85,6 +85,11 @@ InstallClearCacheCallback (
>    VOID
>    );
>  
> +EFI_STATUS
> +XenConnect (
> +  VOID
> +  );
> +
>  EFI_STATUS
>  InitializeXen (
>    VOID
> diff --git a/OvmfPkg/XenPlatformPei/Platform.c b/OvmfPkg/XenPlatformPei/Platform.c
> index 2d567a4760..5e6d553ad5 100644
> --- a/OvmfPkg/XenPlatformPei/Platform.c
> +++ b/OvmfPkg/XenPlatformPei/Platform.c
> @@ -421,6 +421,8 @@ InitializeXenPlatform (
>      CpuDeadLoop ();
>    }
>  
> +  XenConnect ();
> +
>    BootModeInitialization ();
>    AddressWidthInitialization ();
>  
> diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
> index 22c7a22c88..b36eff524d 100644
> --- a/OvmfPkg/XenPlatformPei/Xen.c
> +++ b/OvmfPkg/XenPlatformPei/Xen.c
> @@ -78,14 +78,11 @@ XenGetE820Map (
>  /**
>    Connects to the Hypervisor.
>   
> -  @param  XenLeaf     CPUID index used to connect.
> -
>    @return EFI_STATUS
>  
>  **/
>  EFI_STATUS
>  XenConnect (
> -  UINT32 XenLeaf
>    )
>  {
>    UINT32 Index;
> @@ -96,7 +93,13 @@ XenConnect (
>    CHAR8 Sig[sizeof (Info->Signature) + 1];
>    UINT32 *PVHResetVectorData;
>  
> -  AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);
> +  ASSERT (mXenLeaf != 0);
> +
> +  //
> +  // Prepare HyperPages to be able to make hypercalls
> +  //
> +
> +  AsmCpuid (mXenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);
>    mXenInfo.HyperPages = AllocatePages (TransferPages);
>    if (!mXenInfo.HyperPages) {
>      return EFI_OUT_OF_RESOURCES;
> @@ -108,7 +111,11 @@ XenConnect (
>                     (Index << EFI_PAGE_SHIFT) + Index);
>    }
>  
> -  AsmCpuid (XenLeaf + 1, &XenVersion, NULL, NULL, NULL);
> +  //
> +  // Find out the Xen version
> +  //
> +
> +  AsmCpuid (mXenLeaf + 1, &XenVersion, NULL, NULL, NULL);
>    DEBUG ((EFI_D_ERROR, "Detected Xen version %d.%d\n",
>            XenVersion >> 16, XenVersion & 0xFFFF));
>    mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);
> @@ -265,12 +272,6 @@ InitializeXen (
>  {
>    RETURN_STATUS PcdStatus;
>  
> -  if (mXenLeaf == 0) {
> -    return EFI_NOT_FOUND;
> -  }
> -
> -  XenConnect (mXenLeaf);
> -
>    //
>    // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).
>    // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.
> 

Acked-by: Laszlo Ersek <lersek@redhat.com>
diff mbox series

Patch

diff --git a/OvmfPkg/XenPlatformPei/Platform.h b/OvmfPkg/XenPlatformPei/Platform.h
index 5565d47e34..a524c23a43 100644
--- a/OvmfPkg/XenPlatformPei/Platform.h
+++ b/OvmfPkg/XenPlatformPei/Platform.h
@@ -85,6 +85,11 @@  InstallClearCacheCallback (
   VOID
   );
 
+EFI_STATUS
+XenConnect (
+  VOID
+  );
+
 EFI_STATUS
 InitializeXen (
   VOID
diff --git a/OvmfPkg/XenPlatformPei/Platform.c b/OvmfPkg/XenPlatformPei/Platform.c
index 2d567a4760..5e6d553ad5 100644
--- a/OvmfPkg/XenPlatformPei/Platform.c
+++ b/OvmfPkg/XenPlatformPei/Platform.c
@@ -421,6 +421,8 @@  InitializeXenPlatform (
     CpuDeadLoop ();
   }
 
+  XenConnect ();
+
   BootModeInitialization ();
   AddressWidthInitialization ();
 
diff --git a/OvmfPkg/XenPlatformPei/Xen.c b/OvmfPkg/XenPlatformPei/Xen.c
index 22c7a22c88..b36eff524d 100644
--- a/OvmfPkg/XenPlatformPei/Xen.c
+++ b/OvmfPkg/XenPlatformPei/Xen.c
@@ -78,14 +78,11 @@  XenGetE820Map (
 /**
   Connects to the Hypervisor.
  
-  @param  XenLeaf     CPUID index used to connect.
-
   @return EFI_STATUS
 
 **/
 EFI_STATUS
 XenConnect (
-  UINT32 XenLeaf
   )
 {
   UINT32 Index;
@@ -96,7 +93,13 @@  XenConnect (
   CHAR8 Sig[sizeof (Info->Signature) + 1];
   UINT32 *PVHResetVectorData;
 
-  AsmCpuid (XenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);
+  ASSERT (mXenLeaf != 0);
+
+  //
+  // Prepare HyperPages to be able to make hypercalls
+  //
+
+  AsmCpuid (mXenLeaf + 2, &TransferPages, &TransferReg, NULL, NULL);
   mXenInfo.HyperPages = AllocatePages (TransferPages);
   if (!mXenInfo.HyperPages) {
     return EFI_OUT_OF_RESOURCES;
@@ -108,7 +111,11 @@  XenConnect (
                    (Index << EFI_PAGE_SHIFT) + Index);
   }
 
-  AsmCpuid (XenLeaf + 1, &XenVersion, NULL, NULL, NULL);
+  //
+  // Find out the Xen version
+  //
+
+  AsmCpuid (mXenLeaf + 1, &XenVersion, NULL, NULL, NULL);
   DEBUG ((EFI_D_ERROR, "Detected Xen version %d.%d\n",
           XenVersion >> 16, XenVersion & 0xFFFF));
   mXenInfo.VersionMajor = (UINT16)(XenVersion >> 16);
@@ -265,12 +272,6 @@  InitializeXen (
 {
   RETURN_STATUS PcdStatus;
 
-  if (mXenLeaf == 0) {
-    return EFI_NOT_FOUND;
-  }
-
-  XenConnect (mXenLeaf);
-
   //
   // Reserve away HVMLOADER reserved memory [0xFC000000,0xFD000000).
   // This needs to match HVMLOADER RESERVED_MEMBASE/RESERVED_MEMSIZE.