From mboxrd@z Thu Jan  1 00:00:00 1970
Received: from mx2.freebsd.org (mx2.freebsd.org [96.47.72.81])
 by mx.groups.io with SMTP id smtpd.web11.56914.1683806579151176151
 for <devel@edk2.groups.io>;
 Thu, 11 May 2023 05:02:59 -0700
Authentication-Results: mx.groups.io;
 dkim=fail reason="body hash did not verify" header.i=@freebsd.org header.s=dkim header.b=BYV16xlQ;
 spf=pass (domain: freebsd.org, ip: 96.47.72.81, mailfrom: corvink@freebsd.org)
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits)
	 client-signature RSA-PSS (4096 bits))
	(Client CN "mx1.freebsd.org", Issuer "R3" (verified OK))
	by mx2.freebsd.org (Postfix) with ESMTPS id 4QH9Wk3fvVz3JBV;
	Thu, 11 May 2023 12:02:58 +0000 (UTC)
	(envelope-from corvink@FreeBSD.org)
Received: from smtp.freebsd.org (smtp.freebsd.org [96.47.72.83])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256
	 client-signature RSA-PSS (4096 bits) client-digest SHA256)
	(Client CN "smtp.freebsd.org", Issuer "R3" (verified OK))
	by mx1.freebsd.org (Postfix) with ESMTPS id 4QH9Wk2wxQz43tF;
	Thu, 11 May 2023 12:02:58 +0000 (UTC)
	(envelope-from corvink@FreeBSD.org)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim;
	t=1683806578;
	h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
	 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
	 content-transfer-encoding:content-transfer-encoding:
	 in-reply-to:in-reply-to:references:references;
	bh=r5AblXwKAtUHmI/jzB/OoQo/xienA+lenXhADl+6tVY=;
	b=BYV16xlQqvLS5Ih6rV4AX0rNY80mia4ad7WRegKridUy4Wux6VVW/cVD5iex0YXRGKvl8P
	R/I/Vfe2T8mgwZYgdqEum8MUOnqCjV8IcH2YRoh+F8V+ZW8MQc4z0LCWyegpGt027YSyaB
	CHc0SM5UCm/MuYKS2GqJ0tkcY0s9emqFwgmazzkMkJw9bcIX+40e5FWKy/5VOSMjAnXXpo
	OygD9NJfTOVwoEFUxn1QAq3G3R+pdoVg0caoI3/j8jzrb8y7mavYrhCoPBVEPmBLVFTsfq
	aXaVlYYzYe69AsjDQVTdmoew+OoyefvHdRGs1CKcA1PtgJ3VysRefay0rnpSiw==
ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org;
	s=dkim; t=1683806578;
	h=from:from:reply-to:subject:subject:date:date:message-id:message-id:
	 to:to:cc:cc:mime-version:mime-version:content-type:content-type:
	 content-transfer-encoding:content-transfer-encoding:
	 in-reply-to:in-reply-to:references:references;
	bh=r5AblXwKAtUHmI/jzB/OoQo/xienA+lenXhADl+6tVY=;
	b=HI0nQtcWCqUc4n12wZ8fOV9tezbVYQWLXfYyiDnFBsDt3IFUPQ55jUo7twi14+JO9htQyU
	tOS5j2YftXqmM7TdGsehgu9UdgRdQ5rlL+I5csJ569lD1atjMtt/mkt+4G8gZUIJehhzoM
	Qd0M3Vq+Dpge5Qq3C1EXcvIGA7GKZUZRINnhhGciOM0NsCXTGuegT1MSVEqNoOnkjKcu+o
	IddDy/7RHYHrys1y56ygClWW9fx4ixkcvtrtyWd81RmAKQ8JlyBeFTE8fovT3G15FmmKy9
	lyoj4rTiO7DTiw6lMAvddYDrOSt/2bZC8nZ34m208PBNTQjjcAYEoo5qPJ5xMw==
ARC-Authentication-Results: i=1;
	mx1.freebsd.org;
	none
ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1683806578; a=rsa-sha256; cv=none;
	b=NUZoDyEVnZYmlUw1jEHIBM3ww1U2krd+VbHwS28YTZT2Jcy63UXnu9Nf2wQvWNecTC8net
	D42zYLTYRcmp2AxCQ/kkcXSpmiaWbEBZjcjSjTrgiLeTzUo5KgAxEVwyOLp9+G2I/wC7/V
	FV22nmTPrePWGy2k0Msmdikaa8QVO4VuJW/PPw9u6kDIMYKAUH4Y9UzZtabRAGWGMuE7U8
	bJvJas/5guQj37Y08XwortzZMgRV5uI6QVQo536qU2sFkbjYVvKEi749g4mMVUTirn9PSa
	vsGknzQuQ5csU1YkL2e+FWIN0P75bHWHPJ80UBljCyzHQtMou9tO5LTLhnsdyw==
Received: from corvink-nb.beckhoff.com (unknown [IPv6:2001:9e8:da76:7b00:9ecd:454c:c57e:cada])
	(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)
	 key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256)
	(Client did not present a certificate)
	(Authenticated sender: corvink)
	by smtp.freebsd.org (Postfix) with ESMTPSA id 4QH9Wj1sDwzG8P;
	Thu, 11 May 2023 12:02:57 +0000 (UTC)
	(envelope-from corvink@FreeBSD.org)
From: =?UTF-8?B?Q29ydmluIEvDtmhuZQ==?= <corvink@FreeBSD.org>
To: devel@edk2.groups.io
Cc: =?UTF-8?q?Corvin=20K=C3=B6hne?= <corvink@FreeBSD.org>,
	Gerd Hoffmann <kraxel@redhat.com>,
	Ard Biesheuvel <ardb+tianocore@kernel.org>,
	Jiewen Yao <jiewen.yao@intel.com>,
	Jordan Justen <jordan.l.justen@intel.com>,
	Anthony Perard <anthony.perard@citrix.com>,
	Julien Grall <julien@xen.org>
Subject: [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
Date: Thu, 11 May 2023 14:02:38 +0200
Message-Id: <20230511120239.695237-2-corvink@FreeBSD.org>
X-Mailer: git-send-email 2.40.1
In-Reply-To: <20230511120239.695237-1-corvink@FreeBSD.org>
References: <20230511120239.695237-1-corvink@FreeBSD.org>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

This makes the function reuseable by bhyve.

Signed-off-by: Corvin K=C3=B6hne <corvink@FreeBSD.org>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Anthony Perard <anthony.perard@citrix.com>
Cc: Julien Grall <julien@xen.org>
---
 .../XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf |   1 -
 OvmfPkg/Include/Library/AcpiPlatformLib.h     |  25 ++
 .../AcpiPlatformLib/DxeAcpiPlatformLib.c      | 185 +++++++++++++
 OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c     |  47 +++-
 OvmfPkg/XenAcpiPlatformDxe/Xen.c              | 257 ------------------
 5 files changed, 254 insertions(+), 261 deletions(-)
 delete mode 100644 OvmfPkg/XenAcpiPlatformDxe/Xen.c

diff --git a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf b/OvmfPkg/=
XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf
index 65374569ddc2..be175d290f92 100644
--- a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf
+++ b/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf
@@ -25,7 +25,6 @@ [Sources]
   AcpiPlatform.c
   AcpiPlatform.h
   EntryPoint.c
-  Xen.c
=20
 [Packages]
   MdePkg/MdePkg.dec
diff --git a/OvmfPkg/Include/Library/AcpiPlatformLib.h b/OvmfPkg/Include/=
Library/AcpiPlatformLib.h
index b0a3c5bd0048..73a170636032 100644
--- a/OvmfPkg/Include/Library/AcpiPlatformLib.h
+++ b/OvmfPkg/Include/Library/AcpiPlatformLib.h
@@ -4,6 +4,8 @@
   SPDX-License-Identifier: BSD-2-Clause-Patent
 **/
=20
+#include <Protocol/AcpiTable.h>
+
 /**
   Searches and returns the address of the ACPI Root System Description P=
ointer (RSDP) in system memory.
=20
@@ -22,3 +24,26 @@ GetAcpiRsdpFromMemory (
   IN UINT64                                         EndAddress,
   OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  **RsdpPtr
   );
+
+/**
+  Get Acpi tables from the RSDP structure. And installs ACPI tables
+  into the RSDT/XSDT using InstallAcpiTable. Some signature of the insta=
lled
+  ACPI tables are: FACP, APIC, HPET, WAET, SSDT, FACS, DSDT.
+
+  @param  AcpiProtocol           Protocol instance pointer.
+
+  @return EFI_SUCCESS            The table was successfully inserted.
+  @return EFI_INVALID_PARAMETER  Either AcpiTableBuffer is NULL, TableHa=
ndle is
+                                 NULL, or AcpiTableBufferSize and the si=
ze
+                                 field embedded in the ACPI table pointe=
d to
+                                 by AcpiTableBuffer are not in sync.
+  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to complet=
e the
+request.
+
+**/
+EFI_STATUS
+EFIAPI
+InstallAcpiTablesFromRsdp (
+  IN EFI_ACPI_TABLE_PROTOCOL                       *AcpiProtocol,
+  IN EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp
+  );
diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfP=
kg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
index ce52ad31cf25..06b9b88eb347 100644
--- a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
+++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
@@ -60,3 +60,188 @@ GetAcpiRsdpFromMemory (
=20
   return EFI_NOT_FOUND;
 }
+
+EFI_STATUS
+EFIAPI
+InstallAcpiTablesFromRsdp (
+  IN EFI_ACPI_TABLE_PROTOCOL                       *AcpiProtocol,
+  IN EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp
+  )
+{
+  EFI_STATUS  Status;
+  UINTN       TableHandle;
+
+  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
+  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
+  VOID                                          *CurrentTableEntry;
+  UINTN                                         CurrentTablePointer;
+  EFI_ACPI_DESCRIPTION_HEADER                   *CurrentTable;
+  UINTN                                         Index;
+  UINTN                                         NumberOfTableEntries;
+  EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt2Table;
+  EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt1Table;
+  EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs2Table;
+  EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs1Table;
+  EFI_ACPI_DESCRIPTION_HEADER                   *DsdtTable;
+
+  Fadt2Table           =3D NULL;
+  Fadt1Table           =3D NULL;
+  Facs2Table           =3D NULL;
+  Facs1Table           =3D NULL;
+  DsdtTable            =3D NULL;
+  TableHandle          =3D 0;
+  NumberOfTableEntries =3D 0;
+
+  //
+  // If XSDT table is find, just install its tables.
+  // Otherwise, try to find and install the RSDT tables.
+  //
+  if (Rsdp->XsdtAddress) {
+    //
+    // Retrieve the addresses of XSDT and
+    // calculate the number of its table entries.
+    //
+    Xsdt                 =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp-=
>XsdtAddress;
+    NumberOfTableEntries =3D
+      (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UI=
NT64);
+
+    //
+    // Install ACPI tables found in XSDT.
+    //
+    for (Index =3D 0; Index < NumberOfTableEntries; Index++) {
+      //
+      // Get the table entry from XSDT
+      //
+      CurrentTableEntry =3D
+        (VOID *)((UINT8 *)Xsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
+                 Index * sizeof (UINT64));
+      CurrentTablePointer =3D (UINTN)*(UINT64 *)CurrentTableEntry;
+      CurrentTable        =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl=
ePointer;
+
+      //
+      // Install the XSDT tables
+      //
+      Status =3D AcpiProtocol->InstallAcpiTable (
+                               AcpiProtocol,
+                               CurrentTable,
+                               CurrentTable->Length,
+                               &TableHandle
+                               );
+
+      if (EFI_ERROR (Status)) {
+        return Status;
+      }
+
+      //
+      // Get the FACS and DSDT table address from the table FADT
+      //
+      if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) =
{
+        Fadt2Table =3D (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UIN=
TN)
+                     CurrentTablePointer;
+        Facs2Table =3D (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(=
UINTN)
+                     Fadt2Table->FirmwareCtrl;
+        DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt2Table->=
Dsdt;
+      }
+    }
+  } else if (Rsdp->RsdtAddress) {
+    //
+    // Retrieve the addresses of RSDT and
+    // calculate the number of its table entries.
+    //
+    Rsdt                 =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp-=
>RsdtAddress;
+    NumberOfTableEntries =3D
+      (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UI=
NT32);
+
+    //
+    // Install ACPI tables found in XSDT.
+    //
+    for (Index =3D 0; Index < NumberOfTableEntries; Index++) {
+      //
+      // Get the table entry from RSDT
+      //
+      CurrentTableEntry =3D
+        (UINT32 *)((UINT8 *)Rsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) =
+
+                   Index * sizeof (UINT32));
+      CurrentTablePointer =3D *(UINT32 *)CurrentTableEntry;
+      CurrentTable        =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl=
ePointer;
+
+      //
+      // Install the RSDT tables
+      //
+      Status =3D AcpiProtocol->InstallAcpiTable (
+                               AcpiProtocol,
+                               CurrentTable,
+                               CurrentTable->Length,
+                               &TableHandle
+                               );
+
+      if (EFI_ERROR (Status)) {
+        return Status;
+      }
+
+      //
+      // Get the FACS and DSDT table address from the table FADT
+      //
+      if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) =
{
+        Fadt1Table =3D (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UIN=
TN)
+                     CurrentTablePointer;
+        Facs1Table =3D (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(=
UINTN)
+                     Fadt1Table->FirmwareCtrl;
+        DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->=
Dsdt;
+      }
+    }
+  }
+
+  //
+  // Install the FACS table.
+  //
+  if (Fadt2Table) {
+    //
+    // FACS 2.0
+    //
+    Status =3D AcpiProtocol->InstallAcpiTable (
+                             AcpiProtocol,
+                             Facs2Table,
+                             Facs2Table->Length,
+                             &TableHandle
+                             );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+  } else if (Fadt1Table) {
+    //
+    // FACS 1.0
+    //
+    Status =3D AcpiProtocol->InstallAcpiTable (
+                             AcpiProtocol,
+                             Facs1Table,
+                             Facs1Table->Length,
+                             &TableHandle
+                             );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+  }
+
+  //
+  // Install DSDT table. If we reached this point without finding the DS=
DT,
+  // then we're out of sync with the hypervisor, and cannot continue.
+  //
+  if (DsdtTable =3D=3D NULL) {
+    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
+    ASSERT (FALSE);
+    CpuDeadLoop ();
+  }
+
+  Status =3D AcpiProtocol->InstallAcpiTable (
+                           AcpiProtocol,
+                           DsdtTable,
+                           DsdtTable->Length,
+                           &TableHandle
+                           );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  return EFI_SUCCESS;
+}
diff --git a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c b/OvmfPkg/XenAcpiP=
latformDxe/AcpiPlatform.c
index e06bb25dfc15..2dbc812953d2 100644
--- a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
+++ b/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
@@ -7,10 +7,15 @@
=20
 **/
=20
-#include <Library/XenPlatformLib.h>           // XenDetected()
+#include <Library/AcpiPlatformLib.h> // InstallAcpiTablesFromMemory()
+#include <Library/DebugLib.h>        // DEBUG()
+#include <Library/XenPlatformLib.h>  // XenDetected()
=20
 #include "AcpiPlatform.h"
=20
+#define XEN_ACPI_PHYSICAL_ADDRESS  0x000EA020
+#define XEN_BIOS_PHYSICAL_END      0x000FFFFF
+
 /**
   Effective entrypoint of Acpi Platform driver.
=20
@@ -28,10 +33,46 @@ InstallAcpiTables (
   IN   EFI_ACPI_TABLE_PROTOCOL  *AcpiTable
   )
 {
-  EFI_STATUS  Status;
+  EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *RsdpStructurePtr;
+  EFI_XEN_INFO                                  *XenInfo;
+  EFI_STATUS                                    Status;
=20
   if (XenDetected ()) {
-    Status =3D InstallXenTables (AcpiTable);
+    //
+    // Detect the RSDP structure
+    //
+
+    //
+    // First look for PVH one
+    //
+    XenInfo =3D XenGetInfoHOB ();
+    ASSERT (XenInfo !=3D NULL);
+    if (XenInfo->RsdpPvh !=3D NULL) {
+      DEBUG ((
+        DEBUG_INFO,
+        "%a: Use ACPI RSDP table at 0x%p\n",
+        gEfiCallerBaseName,
+        XenInfo->RsdpPvh
+        ));
+      RsdpStructurePtr =3D XenInfo->RsdpPvh;
+    } else {
+      //
+      // Otherwise, look for the HVM one
+      //
+      Status =3D GetAcpiRsdpFromMemory (
+                 XEN_ACPI_PHYSICAL_ADDRESS,
+                 XEN_BIOS_PHYSICAL_END,
+                 &RsdpStructurePtr
+                 );
+      if (EFI_ERROR (Status)) {
+        return Status;
+      }
+    }
+
+    Status =3D InstallAcpiTablesFromRsdp (
+               AcpiTable,
+               RsdpStructurePtr
+               );
   } else {
     Status =3D EFI_UNSUPPORTED;
   }
diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDx=
e/Xen.c
deleted file mode 100644
index a3812cb8d6d9..000000000000
--- a/OvmfPkg/XenAcpiPlatformDxe/Xen.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/** @file
-  OVMF ACPI Xen support
-
-  Copyright (C) 2021, Red Hat, Inc.
-  Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.<BR>
-  Copyright (c) 2012, Bei Guan <gbtju85@gmail.com>
-
-  SPDX-License-Identifier: BSD-2-Clause-Patent
-
-**/
-
-#include <Library/AcpiPlatformLib.h>
-#include <Library/BaseLib.h>        // CpuDeadLoop()
-#include <Library/DebugLib.h>       // DEBUG()
-#include <Library/XenPlatformLib.h> // XenGetInfoHOB()
-
-#include "AcpiPlatform.h"
-
-#define XEN_ACPI_PHYSICAL_ADDRESS  0x000EA020
-#define XEN_BIOS_PHYSICAL_END      0x000FFFFF
-
-EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *XenAcpiRsdpStructurePtr =3D=
 NULL;
-
-/**
-  Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI tab=
les
-  into the RSDT/XSDT using InstallAcpiTable. Some signature of the insta=
lled
-  ACPI tables are: FACP, APIC, HPET, WAET, SSDT, FACS, DSDT.
-
-  @param  AcpiProtocol           Protocol instance pointer.
-
-  @return EFI_SUCCESS            The table was successfully inserted.
-  @return EFI_INVALID_PARAMETER  Either AcpiTableBuffer is NULL, TableHa=
ndle is
-                                 NULL, or AcpiTableBufferSize and the si=
ze
-                                 field embedded in the ACPI table pointe=
d to
-                                 by AcpiTableBuffer are not in sync.
-  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to complet=
e the request.
-
-**/
-EFI_STATUS
-EFIAPI
-InstallXenTables (
-  IN   EFI_ACPI_TABLE_PROTOCOL  *AcpiProtocol
-  )
-{
-  EFI_STATUS  Status;
-  UINTN       TableHandle;
-
-  EFI_ACPI_DESCRIPTION_HEADER                   *Rsdt;
-  EFI_ACPI_DESCRIPTION_HEADER                   *Xsdt;
-  VOID                                          *CurrentTableEntry;
-  UINTN                                         CurrentTablePointer;
-  EFI_ACPI_DESCRIPTION_HEADER                   *CurrentTable;
-  UINTN                                         Index;
-  UINTN                                         NumberOfTableEntries;
-  EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt2Table;
-  EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE     *Fadt1Table;
-  EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs2Table;
-  EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE  *Facs1Table;
-  EFI_ACPI_DESCRIPTION_HEADER                   *DsdtTable;
-  EFI_XEN_INFO                                  *XenInfo;
-
-  Fadt2Table           =3D NULL;
-  Fadt1Table           =3D NULL;
-  Facs2Table           =3D NULL;
-  Facs1Table           =3D NULL;
-  DsdtTable            =3D NULL;
-  TableHandle          =3D 0;
-  NumberOfTableEntries =3D 0;
-
-  //
-  // Detect the RSDP structure
-  //
-
-  //
-  // First look for PVH one
-  //
-  XenInfo =3D XenGetInfoHOB ();
-  ASSERT (XenInfo !=3D NULL);
-  if (XenInfo->RsdpPvh !=3D NULL) {
-    DEBUG ((
-      DEBUG_INFO,
-      "%a: Use ACPI RSDP table at 0x%p\n",
-      gEfiCallerBaseName,
-      XenInfo->RsdpPvh
-      ));
-    XenAcpiRsdpStructurePtr =3D XenInfo->RsdpPvh;
-  } else {
-    //
-    // Otherwise, look for the HVM one
-    //
-    Status =3D GetAcpiRsdpFromMemory (
-               XEN_ACPI_PHYSICAL_ADDRESS,
-               XEN_BIOS_PHYSICAL_END,
-               &XenAcpiRsdpStructurePtr
-               );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  //
-  // If XSDT table is find, just install its tables.
-  // Otherwise, try to find and install the RSDT tables.
-  //
-  if (XenAcpiRsdpStructurePtr->XsdtAddress) {
-    //
-    // Retrieve the addresses of XSDT and
-    // calculate the number of its table entries.
-    //
-    Xsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
-           XenAcpiRsdpStructurePtr->XsdtAddress;
-    NumberOfTableEntries =3D (Xsdt->Length -
-                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
-                           sizeof (UINT64);
-
-    //
-    // Install ACPI tables found in XSDT.
-    //
-    for (Index =3D 0; Index < NumberOfTableEntries; Index++) {
-      //
-      // Get the table entry from XSDT
-      //
-      CurrentTableEntry =3D (VOID *)((UINT8 *)Xsdt +
-                                   sizeof (EFI_ACPI_DESCRIPTION_HEADER) =
+
-                                   Index * sizeof (UINT64));
-      CurrentTablePointer =3D (UINTN)*(UINT64 *)CurrentTableEntry;
-      CurrentTable        =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl=
ePointer;
-
-      //
-      // Install the XSDT tables
-      //
-      Status =3D AcpiProtocol->InstallAcpiTable (
-                               AcpiProtocol,
-                               CurrentTable,
-                               CurrentTable->Length,
-                               &TableHandle
-                               );
-
-      if (EFI_ERROR (Status)) {
-        return Status;
-      }
-
-      //
-      // Get the FACS and DSDT table address from the table FADT
-      //
-      if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) =
{
-        Fadt2Table =3D (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)
-                     (UINTN)CurrentTablePointer;
-        Facs2Table =3D (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)
-                     (UINTN)Fadt2Table->FirmwareCtrl;
-        DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt2Table->=
Dsdt;
-      }
-    }
-  } else if (XenAcpiRsdpStructurePtr->RsdtAddress) {
-    //
-    // Retrieve the addresses of RSDT and
-    // calculate the number of its table entries.
-    //
-    Rsdt =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
-           XenAcpiRsdpStructurePtr->RsdtAddress;
-    NumberOfTableEntries =3D (Rsdt->Length -
-                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
-                           sizeof (UINT32);
-
-    //
-    // Install ACPI tables found in XSDT.
-    //
-    for (Index =3D 0; Index < NumberOfTableEntries; Index++) {
-      //
-      // Get the table entry from RSDT
-      //
-      CurrentTableEntry =3D (UINT32 *)((UINT8 *)Rsdt +
-                                     sizeof (EFI_ACPI_DESCRIPTION_HEADER=
) +
-                                     Index * sizeof (UINT32));
-      CurrentTablePointer =3D *(UINT32 *)CurrentTableEntry;
-      CurrentTable        =3D (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTabl=
ePointer;
-
-      //
-      // Install the RSDT tables
-      //
-      Status =3D AcpiProtocol->InstallAcpiTable (
-                               AcpiProtocol,
-                               CurrentTable,
-                               CurrentTable->Length,
-                               &TableHandle
-                               );
-
-      if (EFI_ERROR (Status)) {
-        return Status;
-      }
-
-      //
-      // Get the FACS and DSDT table address from the table FADT
-      //
-      if (!AsciiStrnCmp ((CHAR8 *)&CurrentTable->Signature, "FACP", 4)) =
{
-        Fadt1Table =3D (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)
-                     (UINTN)CurrentTablePointer;
-        Facs1Table =3D (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)
-                     (UINTN)Fadt1Table->FirmwareCtrl;
-        DsdtTable =3D (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->=
Dsdt;
-      }
-    }
-  }
-
-  //
-  // Install the FACS table.
-  //
-  if (Fadt2Table) {
-    //
-    // FACS 2.0
-    //
-    Status =3D AcpiProtocol->InstallAcpiTable (
-                             AcpiProtocol,
-                             Facs2Table,
-                             Facs2Table->Length,
-                             &TableHandle
-                             );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  } else if (Fadt1Table) {
-    //
-    // FACS 1.0
-    //
-    Status =3D AcpiProtocol->InstallAcpiTable (
-                             AcpiProtocol,
-                             Facs1Table,
-                             Facs1Table->Length,
-                             &TableHandle
-                             );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  //
-  // Install DSDT table. If we reached this point without finding the DS=
DT,
-  // then we're out of sync with the hypervisor, and cannot continue.
-  //
-  if (DsdtTable =3D=3D NULL) {
-    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
-    ASSERT (FALSE);
-    CpuDeadLoop ();
-  }
-
-  Status =3D AcpiProtocol->InstallAcpiTable (
-                           AcpiProtocol,
-                           DsdtTable,
-                           DsdtTable->Length,
-                           &TableHandle
-                           );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
--=20
2.40.1