public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function
@ 2023-05-11 12:02 Corvin Köhne
  2023-05-11 12:02 ` [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Corvin Köhne
                   ` (2 more replies)
  0 siblings, 3 replies; 11+ messages in thread
From: Corvin Köhne @ 2023-05-11 12:02 UTC (permalink / raw)
  To: devel
  Cc: Corvin Köhne, Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao,
	Jordan Justen, Anthony Perard, Julien Grall

Xen and bhyve are placing ACPI tables into system memory. So, they can
share the same code. Therefore, create a new library which searches and
installs ACPI tables from system memory.

Signed-off-by: Corvin Köhne <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>
---
 OvmfPkg/OvmfPkg.dec                           |   4 +
 OvmfPkg/OvmfXen.dsc                           |   1 +
 .../AcpiPlatformLib/DxeAcpiPlatformLib.inf    |  26 ++++
 .../XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf |   1 +
 OvmfPkg/Include/Library/AcpiPlatformLib.h     |  24 ++++
 .../AcpiPlatformLib/DxeAcpiPlatformLib.c      |  62 +++++++++
 OvmfPkg/XenAcpiPlatformDxe/Xen.c              | 119 +++++-------------
 7 files changed, 147 insertions(+), 90 deletions(-)
 create mode 100644 OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
 create mode 100644 OvmfPkg/Include/Library/AcpiPlatformLib.h
 create mode 100644 OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c

diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index 03ae29e7b034..7b321ba01d72 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -20,6 +20,10 @@ [Includes]
   Csm/Include
 
 [LibraryClasses]
+  ##  @libraryclass  Search and install ACPI tables.
+  #
+  AcpiPlatformLib|Include/Library/AcpiPlatformLib.h
+
   ##  @libraryclass  Access bhyve's firmware control interface.
   BhyveFwCtlLib|Include/Library/BhyveFwCtlLib.h
 
diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc
index 1f44ec86c9c7..ddcf8a36f513 100644
--- a/OvmfPkg/OvmfXen.dsc
+++ b/OvmfPkg/OvmfXen.dsc
@@ -321,6 +321,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   ResetSystemLib|OvmfPkg/Library/ResetSystemLib/DxeResetSystemLib.inf
   HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
new file mode 100644
index 000000000000..dfe0e5623d32
--- /dev/null
+++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
@@ -0,0 +1,26 @@
+## @file
+#  ACPI Platform Library Instance.
+#
+#  Copyright (C) 2023, Corvin Köhne <corvink@FreeBSD.org>
+#
+#  SPDX-License-Identifier: BSD-2-Clause-Patent
+##
+
+[Defines]
+  INF_VERSION    = 0x00010005
+  BASE_NAME      = DxeAcpiPlatformLib
+  FILE_GUID      = 578F441A-4A4C-4D24-B9BE-F783152B46F6
+  MODULE_TYPE    = DXE_DRIVER
+  VERSION_STRING = 1.0
+  LIBRARY_CLASS  = AcpiPlatformLib
+
+[Sources]
+  DxeAcpiPlatformLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  OvmfPkg/OvmfPkg.dec
+
+[LibraryClasses]
+  BaseLib
+  DebugLib
diff --git a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf b/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf
index d3a6353a50a6..65374569ddc2 100644
--- a/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf
+++ b/OvmfPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf
@@ -32,6 +32,7 @@ [Packages]
   OvmfPkg/OvmfPkg.dec
 
 [LibraryClasses]
+  AcpiPlatformLib
   BaseLib
   DebugLib
   UefiBootServicesTableLib
diff --git a/OvmfPkg/Include/Library/AcpiPlatformLib.h b/OvmfPkg/Include/Library/AcpiPlatformLib.h
new file mode 100644
index 000000000000..b0a3c5bd0048
--- /dev/null
+++ b/OvmfPkg/Include/Library/AcpiPlatformLib.h
@@ -0,0 +1,24 @@
+/** @file
+  Copyright (c) 2023, Corvin Köhne <corvink@FreeBSD.org>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+/**
+  Searches and returns the address of the ACPI Root System Description Pointer (RSDP) in system memory.
+
+  @param  StartAddress        Start address of search range.
+  @param  EndAddress          End address of search range.
+  @param  RsdpPtr             Return pointer to RSDP.
+
+  @retval EFI_SUCCESS         RSDP successfully found.
+  @retval EFI_NOT_FOUND       Couldn't find RSDP.
+  @retval EFI_ABORTED         Invalid RSDP found.
+**/
+EFI_STATUS
+EFIAPI
+GetAcpiRsdpFromMemory (
+  IN UINT64                                         StartAddress,
+  IN UINT64                                         EndAddress,
+  OUT EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  **RsdpPtr
+  );
diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
new file mode 100644
index 000000000000..ce52ad31cf25
--- /dev/null
+++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
@@ -0,0 +1,62 @@
+/** @file
+  Copyright (c) 2023, Corvin Köhne <corvink@FreeBSD.org>
+
+  SPDX-License-Identifier: BSD-2-Clause-Patent
+**/
+
+#include <Library/AcpiPlatformLib.h>
+#include <Library/BaseLib.h>
+#include <Library/DebugLib.h>
+
+EFI_STATUS
+EFIAPI
+GetAcpiRsdpFromMemory (
+  IN UINTN                                            StartAddress,
+  IN UINTN                                            EndAddress,
+  OUT   EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  **RsdpPtr
+  )
+{
+  EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *RsdpStructurePtr;
+  UINT8                                         *AcpiPtr;
+  UINT8                                         Sum;
+
+  for (AcpiPtr = (UINT8 *)StartAddress;
+       AcpiPtr < (UINT8 *)EndAddress;
+       AcpiPtr += 0x10)
+  {
+    RsdpStructurePtr = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)
+                       (UINTN)AcpiPtr;
+
+    if (!AsciiStrnCmp ((CHAR8 *)&RsdpStructurePtr->Signature, "RSD PTR ", 8)) {
+      //
+      // RSDP ACPI 1.0 checksum for 1.0/2.0/3.0 table.
+      // This is only the first 20 bytes of the structure
+      //
+      Sum = CalculateSum8 (
+              (CONST UINT8 *)RsdpStructurePtr,
+              sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER)
+              );
+      if (Sum != 0) {
+        return EFI_ABORTED;
+      }
+
+      if (RsdpStructurePtr->Revision >= 2) {
+        //
+        // RSDP ACPI 2.0/3.0 checksum, this is the entire table
+        //
+        Sum = CalculateSum8 (
+                (CONST UINT8 *)RsdpStructurePtr,
+                sizeof (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER)
+                );
+        if (Sum != 0) {
+          return EFI_ABORTED;
+        }
+      }
+
+      *RsdpPtr = RsdpStructurePtr;
+      return EFI_SUCCESS;
+    }
+  }
+
+  return EFI_NOT_FOUND;
+}
diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDxe/Xen.c
index a80a24628c08..a3812cb8d6d9 100644
--- a/OvmfPkg/XenAcpiPlatformDxe/Xen.c
+++ b/OvmfPkg/XenAcpiPlatformDxe/Xen.c
@@ -9,6 +9,7 @@
 
 **/
 
+#include <Library/AcpiPlatformLib.h>
 #include <Library/BaseLib.h>        // CpuDeadLoop()
 #include <Library/DebugLib.h>       // DEBUG()
 #include <Library/XenPlatformLib.h> // XenGetInfoHOB()
@@ -20,92 +21,6 @@
 
 EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *XenAcpiRsdpStructurePtr = NULL;
 
-/**
-  Get the address of Xen ACPI Root System Description Pointer (RSDP)
-  structure.
-
-  @param  RsdpStructurePtr   Return pointer to RSDP structure
-
-  @return EFI_SUCCESS        Find Xen RSDP structure successfully.
-  @return EFI_NOT_FOUND      Don't find Xen RSDP structure.
-  @return EFI_ABORTED        Find Xen RSDP structure, but it's not integrated.
-
-**/
-EFI_STATUS
-EFIAPI
-GetXenAcpiRsdp (
-  OUT   EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  **RsdpPtr
-  )
-{
-  EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *RsdpStructurePtr;
-  UINT8                                         *XenAcpiPtr;
-  UINT8                                         Sum;
-  EFI_XEN_INFO                                  *XenInfo;
-
-  //
-  // Detect the RSDP structure
-  //
-
-  //
-  // First look for PVH one
-  //
-  XenInfo = XenGetInfoHOB ();
-  ASSERT (XenInfo != NULL);
-  if (XenInfo->RsdpPvh != NULL) {
-    DEBUG ((
-      DEBUG_INFO,
-      "%a: Use ACPI RSDP table at 0x%p\n",
-      gEfiCallerBaseName,
-      XenInfo->RsdpPvh
-      ));
-    *RsdpPtr = XenInfo->RsdpPvh;
-    return EFI_SUCCESS;
-  }
-
-  //
-  // Otherwise, look for the HVM one
-  //
-  for (XenAcpiPtr = (UINT8 *)(UINTN)XEN_ACPI_PHYSICAL_ADDRESS;
-       XenAcpiPtr < (UINT8 *)(UINTN)XEN_BIOS_PHYSICAL_END;
-       XenAcpiPtr += 0x10)
-  {
-    RsdpStructurePtr = (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *)
-                       (UINTN)XenAcpiPtr;
-
-    if (!AsciiStrnCmp ((CHAR8 *)&RsdpStructurePtr->Signature, "RSD PTR ", 8)) {
-      //
-      // RSDP ACPI 1.0 checksum for 1.0/2.0/3.0 table.
-      // This is only the first 20 bytes of the structure
-      //
-      Sum = CalculateSum8 (
-              (CONST UINT8 *)RsdpStructurePtr,
-              sizeof (EFI_ACPI_1_0_ROOT_SYSTEM_DESCRIPTION_POINTER)
-              );
-      if (Sum != 0) {
-        return EFI_ABORTED;
-      }
-
-      if (RsdpStructurePtr->Revision >= 2) {
-        //
-        // RSDP ACPI 2.0/3.0 checksum, this is the entire table
-        //
-        Sum = CalculateSum8 (
-                (CONST UINT8 *)RsdpStructurePtr,
-                sizeof (EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER)
-                );
-        if (Sum != 0) {
-          return EFI_ABORTED;
-        }
-      }
-
-      *RsdpPtr = RsdpStructurePtr;
-      return EFI_SUCCESS;
-    }
-  }
-
-  return EFI_NOT_FOUND;
-}
-
 /**
   Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI tables
   into the RSDT/XSDT using InstallAcpiTable. Some signature of the installed
@@ -142,6 +57,7 @@ InstallXenTables (
   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           = NULL;
   Fadt1Table           = NULL;
@@ -152,11 +68,34 @@ InstallXenTables (
   NumberOfTableEntries = 0;
 
   //
-  // Try to find Xen ACPI tables
+  // Detect the RSDP structure
   //
-  Status = GetXenAcpiRsdp (&XenAcpiRsdpStructurePtr);
-  if (EFI_ERROR (Status)) {
-    return Status;
+
+  //
+  // First look for PVH one
+  //
+  XenInfo = XenGetInfoHOB ();
+  ASSERT (XenInfo != NULL);
+  if (XenInfo->RsdpPvh != NULL) {
+    DEBUG ((
+      DEBUG_INFO,
+      "%a: Use ACPI RSDP table at 0x%p\n",
+      gEfiCallerBaseName,
+      XenInfo->RsdpPvh
+      ));
+    XenAcpiRsdpStructurePtr = XenInfo->RsdpPvh;
+  } else {
+    //
+    // Otherwise, look for the HVM one
+    //
+    Status = GetAcpiRsdpFromMemory (
+               XEN_ACPI_PHYSICAL_ADDRESS,
+               XEN_BIOS_PHYSICAL_END,
+               &XenAcpiRsdpStructurePtr
+               );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
   }
 
   //
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
  2023-05-11 12:02 [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Corvin Köhne
@ 2023-05-11 12:02 ` Corvin Köhne
  2023-05-11 13:04   ` [edk2-devel] " Rebecca Cran
  2023-05-11 13:45   ` Anthony PERARD
  2023-05-11 12:02 ` [PATCH v5 3/3] OvmfPkg/Bhyve: install ACPI tables from memory Corvin Köhne
  2023-05-11 13:30 ` [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Anthony PERARD
  2 siblings, 2 replies; 11+ messages in thread
From: Corvin Köhne @ 2023-05-11 12:02 UTC (permalink / raw)
  To: devel
  Cc: Corvin Köhne, Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao,
	Jordan Justen, Anthony Perard, Julien Grall

This makes the function reuseable by bhyve.

Signed-off-by: Corvin Köhne <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
 
 [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
 **/
 
+#include <Protocol/AcpiTable.h>
+
 /**
   Searches and returns the address of the ACPI Root System Description Pointer (RSDP) in system memory.
 
@@ -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 installed
+  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, TableHandle is
+                                 NULL, or AcpiTableBufferSize and the size
+                                 field embedded in the ACPI table pointed to
+                                 by AcpiTableBuffer are not in sync.
+  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to complete 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/OvmfPkg/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 (
 
   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           = NULL;
+  Fadt1Table           = NULL;
+  Facs2Table           = NULL;
+  Facs1Table           = NULL;
+  DsdtTable            = NULL;
+  TableHandle          = 0;
+  NumberOfTableEntries = 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                 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress;
+    NumberOfTableEntries =
+      (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT64);
+
+    //
+    // Install ACPI tables found in XSDT.
+    //
+    for (Index = 0; Index < NumberOfTableEntries; Index++) {
+      //
+      // Get the table entry from XSDT
+      //
+      CurrentTableEntry =
+        (VOID *)((UINT8 *)Xsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
+                 Index * sizeof (UINT64));
+      CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;
+      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
+
+      //
+      // Install the XSDT tables
+      //
+      Status = 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 = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)
+                     CurrentTablePointer;
+        Facs2Table = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)
+                     Fadt2Table->FirmwareCtrl;
+        DsdtTable = (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                 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress;
+    NumberOfTableEntries =
+      (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT32);
+
+    //
+    // Install ACPI tables found in XSDT.
+    //
+    for (Index = 0; Index < NumberOfTableEntries; Index++) {
+      //
+      // Get the table entry from RSDT
+      //
+      CurrentTableEntry =
+        (UINT32 *)((UINT8 *)Rsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
+                   Index * sizeof (UINT32));
+      CurrentTablePointer = *(UINT32 *)CurrentTableEntry;
+      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
+
+      //
+      // Install the RSDT tables
+      //
+      Status = 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 = (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)
+                     CurrentTablePointer;
+        Facs1Table = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)
+                     Fadt1Table->FirmwareCtrl;
+        DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->Dsdt;
+      }
+    }
+  }
+
+  //
+  // Install the FACS table.
+  //
+  if (Fadt2Table) {
+    //
+    // FACS 2.0
+    //
+    Status = AcpiProtocol->InstallAcpiTable (
+                             AcpiProtocol,
+                             Facs2Table,
+                             Facs2Table->Length,
+                             &TableHandle
+                             );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+  } else if (Fadt1Table) {
+    //
+    // FACS 1.0
+    //
+    Status = AcpiProtocol->InstallAcpiTable (
+                             AcpiProtocol,
+                             Facs1Table,
+                             Facs1Table->Length,
+                             &TableHandle
+                             );
+    if (EFI_ERROR (Status)) {
+      return Status;
+    }
+  }
+
+  //
+  // Install DSDT table. If we reached this point without finding the DSDT,
+  // then we're out of sync with the hypervisor, and cannot continue.
+  //
+  if (DsdtTable == NULL) {
+    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
+    ASSERT (FALSE);
+    CpuDeadLoop ();
+  }
+
+  Status = 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/XenAcpiPlatformDxe/AcpiPlatform.c
index e06bb25dfc15..2dbc812953d2 100644
--- a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
+++ b/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
@@ -7,10 +7,15 @@
 
 **/
 
-#include <Library/XenPlatformLib.h>           // XenDetected()
+#include <Library/AcpiPlatformLib.h> // InstallAcpiTablesFromMemory()
+#include <Library/DebugLib.h>        // DEBUG()
+#include <Library/XenPlatformLib.h>  // XenDetected()
 
 #include "AcpiPlatform.h"
 
+#define XEN_ACPI_PHYSICAL_ADDRESS  0x000EA020
+#define XEN_BIOS_PHYSICAL_END      0x000FFFFF
+
 /**
   Effective entrypoint of Acpi Platform driver.
 
@@ -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;
 
   if (XenDetected ()) {
-    Status = InstallXenTables (AcpiTable);
+    //
+    // Detect the RSDP structure
+    //
+
+    //
+    // First look for PVH one
+    //
+    XenInfo = XenGetInfoHOB ();
+    ASSERT (XenInfo != NULL);
+    if (XenInfo->RsdpPvh != NULL) {
+      DEBUG ((
+        DEBUG_INFO,
+        "%a: Use ACPI RSDP table at 0x%p\n",
+        gEfiCallerBaseName,
+        XenInfo->RsdpPvh
+        ));
+      RsdpStructurePtr = XenInfo->RsdpPvh;
+    } else {
+      //
+      // Otherwise, look for the HVM one
+      //
+      Status = GetAcpiRsdpFromMemory (
+                 XEN_ACPI_PHYSICAL_ADDRESS,
+                 XEN_BIOS_PHYSICAL_END,
+                 &RsdpStructurePtr
+                 );
+      if (EFI_ERROR (Status)) {
+        return Status;
+      }
+    }
+
+    Status = InstallAcpiTablesFromRsdp (
+               AcpiTable,
+               RsdpStructurePtr
+               );
   } else {
     Status = EFI_UNSUPPORTED;
   }
diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDxe/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 = NULL;
-
-/**
-  Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI tables
-  into the RSDT/XSDT using InstallAcpiTable. Some signature of the installed
-  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, TableHandle is
-                                 NULL, or AcpiTableBufferSize and the size
-                                 field embedded in the ACPI table pointed to
-                                 by AcpiTableBuffer are not in sync.
-  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to complete 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           = NULL;
-  Fadt1Table           = NULL;
-  Facs2Table           = NULL;
-  Facs1Table           = NULL;
-  DsdtTable            = NULL;
-  TableHandle          = 0;
-  NumberOfTableEntries = 0;
-
-  //
-  // Detect the RSDP structure
-  //
-
-  //
-  // First look for PVH one
-  //
-  XenInfo = XenGetInfoHOB ();
-  ASSERT (XenInfo != NULL);
-  if (XenInfo->RsdpPvh != NULL) {
-    DEBUG ((
-      DEBUG_INFO,
-      "%a: Use ACPI RSDP table at 0x%p\n",
-      gEfiCallerBaseName,
-      XenInfo->RsdpPvh
-      ));
-    XenAcpiRsdpStructurePtr = XenInfo->RsdpPvh;
-  } else {
-    //
-    // Otherwise, look for the HVM one
-    //
-    Status = 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 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
-           XenAcpiRsdpStructurePtr->XsdtAddress;
-    NumberOfTableEntries = (Xsdt->Length -
-                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
-                           sizeof (UINT64);
-
-    //
-    // Install ACPI tables found in XSDT.
-    //
-    for (Index = 0; Index < NumberOfTableEntries; Index++) {
-      //
-      // Get the table entry from XSDT
-      //
-      CurrentTableEntry = (VOID *)((UINT8 *)Xsdt +
-                                   sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
-                                   Index * sizeof (UINT64));
-      CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;
-      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
-
-      //
-      // Install the XSDT tables
-      //
-      Status = 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 = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)
-                     (UINTN)CurrentTablePointer;
-        Facs2Table = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)
-                     (UINTN)Fadt2Table->FirmwareCtrl;
-        DsdtTable = (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 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
-           XenAcpiRsdpStructurePtr->RsdtAddress;
-    NumberOfTableEntries = (Rsdt->Length -
-                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
-                           sizeof (UINT32);
-
-    //
-    // Install ACPI tables found in XSDT.
-    //
-    for (Index = 0; Index < NumberOfTableEntries; Index++) {
-      //
-      // Get the table entry from RSDT
-      //
-      CurrentTableEntry = (UINT32 *)((UINT8 *)Rsdt +
-                                     sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
-                                     Index * sizeof (UINT32));
-      CurrentTablePointer = *(UINT32 *)CurrentTableEntry;
-      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
-
-      //
-      // Install the RSDT tables
-      //
-      Status = 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 = (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)
-                     (UINTN)CurrentTablePointer;
-        Facs1Table = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)
-                     (UINTN)Fadt1Table->FirmwareCtrl;
-        DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->Dsdt;
-      }
-    }
-  }
-
-  //
-  // Install the FACS table.
-  //
-  if (Fadt2Table) {
-    //
-    // FACS 2.0
-    //
-    Status = AcpiProtocol->InstallAcpiTable (
-                             AcpiProtocol,
-                             Facs2Table,
-                             Facs2Table->Length,
-                             &TableHandle
-                             );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  } else if (Fadt1Table) {
-    //
-    // FACS 1.0
-    //
-    Status = AcpiProtocol->InstallAcpiTable (
-                             AcpiProtocol,
-                             Facs1Table,
-                             Facs1Table->Length,
-                             &TableHandle
-                             );
-    if (EFI_ERROR (Status)) {
-      return Status;
-    }
-  }
-
-  //
-  // Install DSDT table. If we reached this point without finding the DSDT,
-  // then we're out of sync with the hypervisor, and cannot continue.
-  //
-  if (DsdtTable == NULL) {
-    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
-    ASSERT (FALSE);
-    CpuDeadLoop ();
-  }
-
-  Status = AcpiProtocol->InstallAcpiTable (
-                           AcpiProtocol,
-                           DsdtTable,
-                           DsdtTable->Length,
-                           &TableHandle
-                           );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-
-  return EFI_SUCCESS;
-}
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* [PATCH v5 3/3] OvmfPkg/Bhyve: install ACPI tables from memory
  2023-05-11 12:02 [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Corvin Köhne
  2023-05-11 12:02 ` [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Corvin Köhne
@ 2023-05-11 12:02 ` Corvin Köhne
  2023-05-11 13:30 ` [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Anthony PERARD
  2 siblings, 0 replies; 11+ messages in thread
From: Corvin Köhne @ 2023-05-11 12:02 UTC (permalink / raw)
  To: devel
  Cc: Corvin Köhne, Rebecca Cran, Peter Grehan, Gerd Hoffmann,
	Ard Biesheuvel, Jiewen Yao, Jordan Justen

It's much easier to create configuration dependend ACPI tables for bhyve
than for OVMF. For this reason, don't use the statically created ACPI
tables provided by OVMF. Instead prefer the dynamically created ACPI
tables of bhyve. If bhyve provides no ACPI tables or we are unable to
detect those, fall back to OVMF tables.

Ideally, we use the qemu fwcfg interface to pass the ACPI tables from
bhyve to OVMF. bhyve will support this in the future. However, current
bhyve executables don't support passing ACPI tables by the qemu fwcfg
interface. They just copy the ACPI into main memory. For that reason,
pick up the ACPI tables from main memory.

Signed-off-by: Corvin Köhne <corvink@FreeBSD.org>
Reviewed-by: Rebecca Cran <rebecca@bsdio.com>
Acked-by: Peter Grehan <grehan@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>
---
 OvmfPkg/Bhyve/BhyveX64.dsc                    |  1 +
 .../Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf |  1 +
 OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.c  | 37 ++++++++++++++++++-
 3 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/Bhyve/BhyveX64.dsc b/OvmfPkg/Bhyve/BhyveX64.dsc
index d0d2712c5662..465b81ffcd51 100644
--- a/OvmfPkg/Bhyve/BhyveX64.dsc
+++ b/OvmfPkg/Bhyve/BhyveX64.dsc
@@ -341,6 +341,7 @@ [LibraryClasses.common.UEFI_DRIVER]
   PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
 
 [LibraryClasses.common.DXE_DRIVER]
+  AcpiPlatformLib|OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.inf
   PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
   HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf
   MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
diff --git a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf
index 94c65f32dcab..75ed8e4a7deb 100644
--- a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf
+++ b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf
@@ -35,6 +35,7 @@ [Packages]
   UefiCpuPkg/UefiCpuPkg.dec
 
 [LibraryClasses]
+  AcpiPlatformLib
   BaseLib
   BaseMemoryLib
   BhyveFwCtlLib
diff --git a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.c b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.c
index 999e9f151ebb..1e1c90614ea1 100644
--- a/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.c
+++ b/OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.c
@@ -10,6 +10,11 @@
 
 #include "AcpiPlatform.h"
 
+#include <Library/AcpiPlatformLib.h> // InstallAcpiTablesFromMemory()
+
+#define BHYVE_ACPI_PHYSICAL_ADDRESS  ((UINTN)0x000F2400)
+#define BHYVE_BIOS_PHYSICAL_END      ((UINTN)0x00100000)
+
 EFI_STATUS
 EFIAPI
 InstallAcpiTable (
@@ -241,7 +246,37 @@ InstallAcpiTables (
   IN   EFI_ACPI_TABLE_PROTOCOL  *AcpiTable
   )
 {
-  EFI_STATUS  Status;
+  EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER  *Rsdp;
+  EFI_STATUS                                    Status;
+
+  Status = GetAcpiRsdpFromMemory (
+             BHYVE_ACPI_PHYSICAL_ADDRESS,
+             BHYVE_BIOS_PHYSICAL_END,
+             &Rsdp
+             );
+  if (EFI_ERROR (Status)) {
+    return Status;
+  }
+
+  Status = InstallAcpiTablesFromRsdp (
+             AcpiTable,
+             Rsdp
+             );
+  if (!EFI_ERROR (Status)) {
+    return EFI_SUCCESS;
+  }
+
+  if (Status != EFI_NOT_FOUND) {
+    DEBUG (
+      (
+       DEBUG_WARN,
+       "%a: unable to install bhyve's ACPI tables (%r)\n",
+       __func__,
+       Status
+      )
+      );
+    return Status;
+  }
 
   Status = InstallOvmfFvTables (AcpiTable);
 
-- 
2.40.1


^ permalink raw reply related	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
  2023-05-11 12:02 ` [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Corvin Köhne
@ 2023-05-11 13:04   ` Rebecca Cran
  2023-05-11 13:16     ` Corvin Köhne
  2023-05-11 13:45   ` Anthony PERARD
  1 sibling, 1 reply; 11+ messages in thread
From: Rebecca Cran @ 2023-05-11 13:04 UTC (permalink / raw)
  To: devel, corvink
  Cc: Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao, Jordan Justen,
	Anthony Perard, Julien Grall

Could you cc me on _all_ of the patches in a series please?

I seem to have been missed on this one, and only cc'd on 3/3.


-- 

Rebecca Cran


On 5/11/23 06:02, Corvin Köhne wrote:
> This makes the function reuseable by bhyve.
>
> Signed-off-by: Corvin Köhne <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
>   
>   [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
>   **/
>   
> +#include <Protocol/AcpiTable.h>
> +
>   /**
>     Searches and returns the address of the ACPI Root System Description Pointer (RSDP) in system memory.
>   
> @@ -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 installed
> +  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, TableHandle is
> +                                 NULL, or AcpiTableBufferSize and the size
> +                                 field embedded in the ACPI table pointed to
> +                                 by AcpiTableBuffer are not in sync.
> +  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to complete 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/OvmfPkg/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 (
>   
>     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           = NULL;
> +  Fadt1Table           = NULL;
> +  Facs2Table           = NULL;
> +  Facs1Table           = NULL;
> +  DsdtTable            = NULL;
> +  TableHandle          = 0;
> +  NumberOfTableEntries = 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                 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->XsdtAddress;
> +    NumberOfTableEntries =
> +      (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT64);
> +
> +    //
> +    // Install ACPI tables found in XSDT.
> +    //
> +    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> +      //
> +      // Get the table entry from XSDT
> +      //
> +      CurrentTableEntry =
> +        (VOID *)((UINT8 *)Xsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
> +                 Index * sizeof (UINT64));
> +      CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;
> +      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
> +
> +      //
> +      // Install the XSDT tables
> +      //
> +      Status = 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 = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)
> +                     CurrentTablePointer;
> +        Facs2Table = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)
> +                     Fadt2Table->FirmwareCtrl;
> +        DsdtTable = (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                 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Rsdp->RsdtAddress;
> +    NumberOfTableEntries =
> +      (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof (UINT32);
> +
> +    //
> +    // Install ACPI tables found in XSDT.
> +    //
> +    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> +      //
> +      // Get the table entry from RSDT
> +      //
> +      CurrentTableEntry =
> +        (UINT32 *)((UINT8 *)Rsdt + sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
> +                   Index * sizeof (UINT32));
> +      CurrentTablePointer = *(UINT32 *)CurrentTableEntry;
> +      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
> +
> +      //
> +      // Install the RSDT tables
> +      //
> +      Status = 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 = (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)(UINTN)
> +                     CurrentTablePointer;
> +        Facs1Table = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)(UINTN)
> +                     Fadt1Table->FirmwareCtrl;
> +        DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->Dsdt;
> +      }
> +    }
> +  }
> +
> +  //
> +  // Install the FACS table.
> +  //
> +  if (Fadt2Table) {
> +    //
> +    // FACS 2.0
> +    //
> +    Status = AcpiProtocol->InstallAcpiTable (
> +                             AcpiProtocol,
> +                             Facs2Table,
> +                             Facs2Table->Length,
> +                             &TableHandle
> +                             );
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +  } else if (Fadt1Table) {
> +    //
> +    // FACS 1.0
> +    //
> +    Status = AcpiProtocol->InstallAcpiTable (
> +                             AcpiProtocol,
> +                             Facs1Table,
> +                             Facs1Table->Length,
> +                             &TableHandle
> +                             );
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +  }
> +
> +  //
> +  // Install DSDT table. If we reached this point without finding the DSDT,
> +  // then we're out of sync with the hypervisor, and cannot continue.
> +  //
> +  if (DsdtTable == NULL) {
> +    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
> +    ASSERT (FALSE);
> +    CpuDeadLoop ();
> +  }
> +
> +  Status = 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/XenAcpiPlatformDxe/AcpiPlatform.c
> index e06bb25dfc15..2dbc812953d2 100644
> --- a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
> +++ b/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
> @@ -7,10 +7,15 @@
>   
>   **/
>   
> -#include <Library/XenPlatformLib.h>           // XenDetected()
> +#include <Library/AcpiPlatformLib.h> // InstallAcpiTablesFromMemory()
> +#include <Library/DebugLib.h>        // DEBUG()
> +#include <Library/XenPlatformLib.h>  // XenDetected()
>   
>   #include "AcpiPlatform.h"
>   
> +#define XEN_ACPI_PHYSICAL_ADDRESS  0x000EA020
> +#define XEN_BIOS_PHYSICAL_END      0x000FFFFF
> +
>   /**
>     Effective entrypoint of Acpi Platform driver.
>   
> @@ -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;
>   
>     if (XenDetected ()) {
> -    Status = InstallXenTables (AcpiTable);
> +    //
> +    // Detect the RSDP structure
> +    //
> +
> +    //
> +    // First look for PVH one
> +    //
> +    XenInfo = XenGetInfoHOB ();
> +    ASSERT (XenInfo != NULL);
> +    if (XenInfo->RsdpPvh != NULL) {
> +      DEBUG ((
> +        DEBUG_INFO,
> +        "%a: Use ACPI RSDP table at 0x%p\n",
> +        gEfiCallerBaseName,
> +        XenInfo->RsdpPvh
> +        ));
> +      RsdpStructurePtr = XenInfo->RsdpPvh;
> +    } else {
> +      //
> +      // Otherwise, look for the HVM one
> +      //
> +      Status = GetAcpiRsdpFromMemory (
> +                 XEN_ACPI_PHYSICAL_ADDRESS,
> +                 XEN_BIOS_PHYSICAL_END,
> +                 &RsdpStructurePtr
> +                 );
> +      if (EFI_ERROR (Status)) {
> +        return Status;
> +      }
> +    }
> +
> +    Status = InstallAcpiTablesFromRsdp (
> +               AcpiTable,
> +               RsdpStructurePtr
> +               );
>     } else {
>       Status = EFI_UNSUPPORTED;
>     }
> diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDxe/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 = NULL;
> -
> -/**
> -  Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI tables
> -  into the RSDT/XSDT using InstallAcpiTable. Some signature of the installed
> -  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, TableHandle is
> -                                 NULL, or AcpiTableBufferSize and the size
> -                                 field embedded in the ACPI table pointed to
> -                                 by AcpiTableBuffer are not in sync.
> -  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to complete 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           = NULL;
> -  Fadt1Table           = NULL;
> -  Facs2Table           = NULL;
> -  Facs1Table           = NULL;
> -  DsdtTable            = NULL;
> -  TableHandle          = 0;
> -  NumberOfTableEntries = 0;
> -
> -  //
> -  // Detect the RSDP structure
> -  //
> -
> -  //
> -  // First look for PVH one
> -  //
> -  XenInfo = XenGetInfoHOB ();
> -  ASSERT (XenInfo != NULL);
> -  if (XenInfo->RsdpPvh != NULL) {
> -    DEBUG ((
> -      DEBUG_INFO,
> -      "%a: Use ACPI RSDP table at 0x%p\n",
> -      gEfiCallerBaseName,
> -      XenInfo->RsdpPvh
> -      ));
> -    XenAcpiRsdpStructurePtr = XenInfo->RsdpPvh;
> -  } else {
> -    //
> -    // Otherwise, look for the HVM one
> -    //
> -    Status = 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 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
> -           XenAcpiRsdpStructurePtr->XsdtAddress;
> -    NumberOfTableEntries = (Xsdt->Length -
> -                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
> -                           sizeof (UINT64);
> -
> -    //
> -    // Install ACPI tables found in XSDT.
> -    //
> -    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> -      //
> -      // Get the table entry from XSDT
> -      //
> -      CurrentTableEntry = (VOID *)((UINT8 *)Xsdt +
> -                                   sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
> -                                   Index * sizeof (UINT64));
> -      CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;
> -      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
> -
> -      //
> -      // Install the XSDT tables
> -      //
> -      Status = 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 = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)
> -                     (UINTN)CurrentTablePointer;
> -        Facs2Table = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)
> -                     (UINTN)Fadt2Table->FirmwareCtrl;
> -        DsdtTable = (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 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
> -           XenAcpiRsdpStructurePtr->RsdtAddress;
> -    NumberOfTableEntries = (Rsdt->Length -
> -                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
> -                           sizeof (UINT32);
> -
> -    //
> -    // Install ACPI tables found in XSDT.
> -    //
> -    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> -      //
> -      // Get the table entry from RSDT
> -      //
> -      CurrentTableEntry = (UINT32 *)((UINT8 *)Rsdt +
> -                                     sizeof (EFI_ACPI_DESCRIPTION_HEADER) +
> -                                     Index * sizeof (UINT32));
> -      CurrentTablePointer = *(UINT32 *)CurrentTableEntry;
> -      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER *)CurrentTablePointer;
> -
> -      //
> -      // Install the RSDT tables
> -      //
> -      Status = 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 = (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)
> -                     (UINTN)CurrentTablePointer;
> -        Facs1Table = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE *)
> -                     (UINTN)Fadt1Table->FirmwareCtrl;
> -        DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)Fadt1Table->Dsdt;
> -      }
> -    }
> -  }
> -
> -  //
> -  // Install the FACS table.
> -  //
> -  if (Fadt2Table) {
> -    //
> -    // FACS 2.0
> -    //
> -    Status = AcpiProtocol->InstallAcpiTable (
> -                             AcpiProtocol,
> -                             Facs2Table,
> -                             Facs2Table->Length,
> -                             &TableHandle
> -                             );
> -    if (EFI_ERROR (Status)) {
> -      return Status;
> -    }
> -  } else if (Fadt1Table) {
> -    //
> -    // FACS 1.0
> -    //
> -    Status = AcpiProtocol->InstallAcpiTable (
> -                             AcpiProtocol,
> -                             Facs1Table,
> -                             Facs1Table->Length,
> -                             &TableHandle
> -                             );
> -    if (EFI_ERROR (Status)) {
> -      return Status;
> -    }
> -  }
> -
> -  //
> -  // Install DSDT table. If we reached this point without finding the DSDT,
> -  // then we're out of sync with the hypervisor, and cannot continue.
> -  //
> -  if (DsdtTable == NULL) {
> -    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
> -    ASSERT (FALSE);
> -    CpuDeadLoop ();
> -  }
> -
> -  Status = AcpiProtocol->InstallAcpiTable (
> -                           AcpiProtocol,
> -                           DsdtTable,
> -                           DsdtTable->Length,
> -                           &TableHandle
> -                           );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  return EFI_SUCCESS;
> -}

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
  2023-05-11 13:04   ` [edk2-devel] " Rebecca Cran
@ 2023-05-11 13:16     ` Corvin Köhne
  2023-05-11 13:19       ` Ard Biesheuvel
  0 siblings, 1 reply; 11+ messages in thread
From: Corvin Köhne @ 2023-05-11 13:16 UTC (permalink / raw)
  To: devel, rebecca, grehan
  Cc: Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao, Jordan Justen,
	Anthony Perard, Julien Grall

[-- Attachment #1: Type: text/plain, Size: 22172 bytes --]

On Thu, 2023-05-11 at 07:04 -0600, Rebecca Cran wrote:
> Could you cc me on _all_ of the patches in a series please?
> 
> I seem to have been missed on this one, and only cc'd on 3/3.
> 
> 

Sry, I've updated my cc list. So, you'll be included in my next update.


-- 
Kind regards,
Corvin


On 5/11/23 06:02, Corvin Köhne wrote:
> This makes the function reuseable by bhyve.
>
> Signed-off-by: Corvin Köhne <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
>   
>   [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
>   **/
>   
> +#include <Protocol/AcpiTable.h>
> +
>   /**
>     Searches and returns the address of the ACPI Root System
Description Pointer (RSDP) in system memory.
>   
> @@ -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
installed
> +  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,
TableHandle is
> +                                 NULL, or AcpiTableBufferSize and
the size
> +                                 field embedded in the ACPI table
pointed to
> +                                 by AcpiTableBuffer are not in sync.
> +  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to
complete 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/OvmfPkg/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 (
>   
>     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           = NULL;
> +  Fadt1Table           = NULL;
> +  Facs2Table           = NULL;
> +  Facs1Table           = NULL;
> +  DsdtTable            = NULL;
> +  TableHandle          = 0;
> +  NumberOfTableEntries = 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                 = (EFI_ACPI_DESCRIPTION_HEADER
*)(UINTN)Rsdp->XsdtAddress;
> +    NumberOfTableEntries =
> +      (Xsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof
(UINT64);
> +
> +    //
> +    // Install ACPI tables found in XSDT.
> +    //
> +    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> +      //
> +      // Get the table entry from XSDT
> +      //
> +      CurrentTableEntry =
> +        (VOID *)((UINT8 *)Xsdt + sizeof
(EFI_ACPI_DESCRIPTION_HEADER) +
> +                 Index * sizeof (UINT64));
> +      CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;
> +      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER
*)CurrentTablePointer;
> +
> +      //
> +      // Install the XSDT tables
> +      //
> +      Status = 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 = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE
*)(UINTN)
> +                     CurrentTablePointer;
> +        Facs2Table = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE
*)(UINTN)
> +                     Fadt2Table->FirmwareCtrl;
> +        DsdtTable = (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                 = (EFI_ACPI_DESCRIPTION_HEADER
*)(UINTN)Rsdp->RsdtAddress;
> +    NumberOfTableEntries =
> +      (Rsdt->Length - sizeof (EFI_ACPI_DESCRIPTION_HEADER)) / sizeof
(UINT32);
> +
> +    //
> +    // Install ACPI tables found in XSDT.
> +    //
> +    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> +      //
> +      // Get the table entry from RSDT
> +      //
> +      CurrentTableEntry =
> +        (UINT32 *)((UINT8 *)Rsdt + sizeof
(EFI_ACPI_DESCRIPTION_HEADER) +
> +                   Index * sizeof (UINT32));
> +      CurrentTablePointer = *(UINT32 *)CurrentTableEntry;
> +      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER
*)CurrentTablePointer;
> +
> +      //
> +      // Install the RSDT tables
> +      //
> +      Status = 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 = (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE
*)(UINTN)
> +                     CurrentTablePointer;
> +        Facs1Table = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE
*)(UINTN)
> +                     Fadt1Table->FirmwareCtrl;
> +        DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER
*)(UINTN)Fadt1Table->Dsdt;
> +      }
> +    }
> +  }
> +
> +  //
> +  // Install the FACS table.
> +  //
> +  if (Fadt2Table) {
> +    //
> +    // FACS 2.0
> +    //
> +    Status = AcpiProtocol->InstallAcpiTable (
> +                             AcpiProtocol,
> +                             Facs2Table,
> +                             Facs2Table->Length,
> +                             &TableHandle
> +                             );
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +  } else if (Fadt1Table) {
> +    //
> +    // FACS 1.0
> +    //
> +    Status = AcpiProtocol->InstallAcpiTable (
> +                             AcpiProtocol,
> +                             Facs1Table,
> +                             Facs1Table->Length,
> +                             &TableHandle
> +                             );
> +    if (EFI_ERROR (Status)) {
> +      return Status;
> +    }
> +  }
> +
> +  //
> +  // Install DSDT table. If we reached this point without finding
the DSDT,
> +  // then we're out of sync with the hypervisor, and cannot
continue.
> +  //
> +  if (DsdtTable == NULL) {
> +    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
> +    ASSERT (FALSE);
> +    CpuDeadLoop ();
> +  }
> +
> +  Status = 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/XenAcpiPlatformDxe/AcpiPlatform.c
> index e06bb25dfc15..2dbc812953d2 100644
> --- a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
> +++ b/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
> @@ -7,10 +7,15 @@
>   
>   **/
>   
> -#include <Library/XenPlatformLib.h>           // XenDetected()
> +#include <Library/AcpiPlatformLib.h> //
InstallAcpiTablesFromMemory()
> +#include <Library/DebugLib.h>        // DEBUG()
> +#include <Library/XenPlatformLib.h>  // XenDetected()
>   
>   #include "AcpiPlatform.h"
>   
> +#define XEN_ACPI_PHYSICAL_ADDRESS  0x000EA020
> +#define XEN_BIOS_PHYSICAL_END      0x000FFFFF
> +
>   /**
>     Effective entrypoint of Acpi Platform driver.
>   
> @@ -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;
>   
>     if (XenDetected ()) {
> -    Status = InstallXenTables (AcpiTable);
> +    //
> +    // Detect the RSDP structure
> +    //
> +
> +    //
> +    // First look for PVH one
> +    //
> +    XenInfo = XenGetInfoHOB ();
> +    ASSERT (XenInfo != NULL);
> +    if (XenInfo->RsdpPvh != NULL) {
> +      DEBUG ((
> +        DEBUG_INFO,
> +        "%a: Use ACPI RSDP table at 0x%p\n",
> +        gEfiCallerBaseName,
> +        XenInfo->RsdpPvh
> +        ));
> +      RsdpStructurePtr = XenInfo->RsdpPvh;
> +    } else {
> +      //
> +      // Otherwise, look for the HVM one
> +      //
> +      Status = GetAcpiRsdpFromMemory (
> +                 XEN_ACPI_PHYSICAL_ADDRESS,
> +                 XEN_BIOS_PHYSICAL_END,
> +                 &RsdpStructurePtr
> +                 );
> +      if (EFI_ERROR (Status)) {
> +        return Status;
> +      }
> +    }
> +
> +    Status = InstallAcpiTablesFromRsdp (
> +               AcpiTable,
> +               RsdpStructurePtr
> +               );
>     } else {
>       Status = EFI_UNSUPPORTED;
>     }
> diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c
b/OvmfPkg/XenAcpiPlatformDxe/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 = NULL;
> -
> -/**
> -  Get Xen Acpi tables from the RSDP structure. And installs Xen ACPI
tables
> -  into the RSDT/XSDT using InstallAcpiTable. Some signature of the
installed
> -  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,
TableHandle is
> -                                 NULL, or AcpiTableBufferSize and
the size
> -                                 field embedded in the ACPI table
pointed to
> -                                 by AcpiTableBuffer are not in sync.
> -  @return EFI_OUT_OF_RESOURCES   Insufficient resources exist to
complete 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           = NULL;
> -  Fadt1Table           = NULL;
> -  Facs2Table           = NULL;
> -  Facs1Table           = NULL;
> -  DsdtTable            = NULL;
> -  TableHandle          = 0;
> -  NumberOfTableEntries = 0;
> -
> -  //
> -  // Detect the RSDP structure
> -  //
> -
> -  //
> -  // First look for PVH one
> -  //
> -  XenInfo = XenGetInfoHOB ();
> -  ASSERT (XenInfo != NULL);
> -  if (XenInfo->RsdpPvh != NULL) {
> -    DEBUG ((
> -      DEBUG_INFO,
> -      "%a: Use ACPI RSDP table at 0x%p\n",
> -      gEfiCallerBaseName,
> -      XenInfo->RsdpPvh
> -      ));
> -    XenAcpiRsdpStructurePtr = XenInfo->RsdpPvh;
> -  } else {
> -    //
> -    // Otherwise, look for the HVM one
> -    //
> -    Status = 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 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
> -           XenAcpiRsdpStructurePtr->XsdtAddress;
> -    NumberOfTableEntries = (Xsdt->Length -
> -                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
> -                           sizeof (UINT64);
> -
> -    //
> -    // Install ACPI tables found in XSDT.
> -    //
> -    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> -      //
> -      // Get the table entry from XSDT
> -      //
> -      CurrentTableEntry = (VOID *)((UINT8 *)Xsdt +
> -                                   sizeof
(EFI_ACPI_DESCRIPTION_HEADER) +
> -                                   Index * sizeof (UINT64));
> -      CurrentTablePointer = (UINTN)*(UINT64 *)CurrentTableEntry;
> -      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER
*)CurrentTablePointer;
> -
> -      //
> -      // Install the XSDT tables
> -      //
> -      Status = 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 = (EFI_ACPI_2_0_FIXED_ACPI_DESCRIPTION_TABLE *)
> -                     (UINTN)CurrentTablePointer;
> -        Facs2Table = (EFI_ACPI_2_0_FIRMWARE_ACPI_CONTROL_STRUCTURE
*)
> -                     (UINTN)Fadt2Table->FirmwareCtrl;
> -        DsdtTable = (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 = (EFI_ACPI_DESCRIPTION_HEADER *)(UINTN)
> -           XenAcpiRsdpStructurePtr->RsdtAddress;
> -    NumberOfTableEntries = (Rsdt->Length -
> -                            sizeof (EFI_ACPI_DESCRIPTION_HEADER)) /
> -                           sizeof (UINT32);
> -
> -    //
> -    // Install ACPI tables found in XSDT.
> -    //
> -    for (Index = 0; Index < NumberOfTableEntries; Index++) {
> -      //
> -      // Get the table entry from RSDT
> -      //
> -      CurrentTableEntry = (UINT32 *)((UINT8 *)Rsdt +
> -                                     sizeof
(EFI_ACPI_DESCRIPTION_HEADER) +
> -                                     Index * sizeof (UINT32));
> -      CurrentTablePointer = *(UINT32 *)CurrentTableEntry;
> -      CurrentTable        = (EFI_ACPI_DESCRIPTION_HEADER
*)CurrentTablePointer;
> -
> -      //
> -      // Install the RSDT tables
> -      //
> -      Status = 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 = (EFI_ACPI_1_0_FIXED_ACPI_DESCRIPTION_TABLE *)
> -                     (UINTN)CurrentTablePointer;
> -        Facs1Table = (EFI_ACPI_1_0_FIRMWARE_ACPI_CONTROL_STRUCTURE
*)
> -                     (UINTN)Fadt1Table->FirmwareCtrl;
> -        DsdtTable = (EFI_ACPI_DESCRIPTION_HEADER
*)(UINTN)Fadt1Table->Dsdt;
> -      }
> -    }
> -  }
> -
> -  //
> -  // Install the FACS table.
> -  //
> -  if (Fadt2Table) {
> -    //
> -    // FACS 2.0
> -    //
> -    Status = AcpiProtocol->InstallAcpiTable (
> -                             AcpiProtocol,
> -                             Facs2Table,
> -                             Facs2Table->Length,
> -                             &TableHandle
> -                             );
> -    if (EFI_ERROR (Status)) {
> -      return Status;
> -    }
> -  } else if (Fadt1Table) {
> -    //
> -    // FACS 1.0
> -    //
> -    Status = AcpiProtocol->InstallAcpiTable (
> -                             AcpiProtocol,
> -                             Facs1Table,
> -                             Facs1Table->Length,
> -                             &TableHandle
> -                             );
> -    if (EFI_ERROR (Status)) {
> -      return Status;
> -    }
> -  }
> -
> -  //
> -  // Install DSDT table. If we reached this point without finding
the DSDT,
> -  // then we're out of sync with the hypervisor, and cannot
continue.
> -  //
> -  if (DsdtTable == NULL) {
> -    DEBUG ((DEBUG_ERROR, "%a: no DSDT found\n", __func__));
> -    ASSERT (FALSE);
> -    CpuDeadLoop ();
> -  }
> -
> -  Status = AcpiProtocol->InstallAcpiTable (
> -                           AcpiProtocol,
> -                           DsdtTable,
> -                           DsdtTable->Length,
> -                           &TableHandle
> -                           );
> -  if (EFI_ERROR (Status)) {
> -    return Status;
> -  }
> -
> -  return EFI_SUCCESS;
> -}

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
  2023-05-11 13:16     ` Corvin Köhne
@ 2023-05-11 13:19       ` Ard Biesheuvel
  2023-05-11 13:47         ` Rebecca Cran
  0 siblings, 1 reply; 11+ messages in thread
From: Ard Biesheuvel @ 2023-05-11 13:19 UTC (permalink / raw)
  To: Corvin Köhne
  Cc: devel, rebecca, grehan, Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao,
	Jordan Justen, Anthony Perard, Julien Grall

On Thu, 11 May 2023 at 15:16, Corvin Köhne <corvink@freebsd.org> wrote:
>
> On Thu, 2023-05-11 at 07:04 -0600, Rebecca Cran wrote:
> > Could you cc me on _all_ of the patches in a series please?
> >
> > I seem to have been missed on this one, and only cc'd on 3/3.
> >
> >
>
> Sry, I've updated my cc list. So, you'll be included in my next update.
>

We're in the middle of a soft freeze so please don't resend this until
after the release - thanks.

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function
  2023-05-11 12:02 [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Corvin Köhne
  2023-05-11 12:02 ` [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Corvin Köhne
  2023-05-11 12:02 ` [PATCH v5 3/3] OvmfPkg/Bhyve: install ACPI tables from memory Corvin Köhne
@ 2023-05-11 13:30 ` Anthony PERARD
  2023-06-01 15:01   ` [edk2-devel] " Ard Biesheuvel
  2 siblings, 1 reply; 11+ messages in thread
From: Anthony PERARD @ 2023-05-11 13:30 UTC (permalink / raw)
  To: Corvin Köhne
  Cc: devel, Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao, Jordan Justen,
	Julien Grall

On Thu, May 11, 2023 at 02:02:37PM +0200, Corvin Köhne wrote:
> diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
> new file mode 100644
> index 000000000000..ce52ad31cf25
> --- /dev/null
> +++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
> @@ -0,0 +1,62 @@
> +/** @file
> +  Copyright (c) 2023, Corvin Köhne <corvink@FreeBSD.org>

As this new file move codes from OvmfPkg/XenAcpiPlatformDxe/Xen.c,
shouldn't you also copy the "Copyright" lines from that file as well?


Beside that, patch looks fine:
Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>

Thanks,

-- 
Anthony PERARD

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
  2023-05-11 12:02 ` [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Corvin Köhne
  2023-05-11 13:04   ` [edk2-devel] " Rebecca Cran
@ 2023-05-11 13:45   ` Anthony PERARD
  1 sibling, 0 replies; 11+ messages in thread
From: Anthony PERARD @ 2023-05-11 13:45 UTC (permalink / raw)
  To: Corvin Köhne
  Cc: devel, Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao, Jordan Justen,
	Julien Grall

On Thu, May 11, 2023 at 02:02:38PM +0200, Corvin Köhne wrote:
> This makes the function reuseable by bhyve.
> 
> Signed-off-by: Corvin Köhne <corvink@FreeBSD.org>
> Acked-by: Gerd Hoffmann <kraxel@redhat.com>

Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>

Thanks,

-- 
Anthony PERARD

^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
  2023-05-11 13:19       ` Ard Biesheuvel
@ 2023-05-11 13:47         ` Rebecca Cran
  2023-05-12  1:47           ` 回复: " gaoliming
  0 siblings, 1 reply; 11+ messages in thread
From: Rebecca Cran @ 2023-05-11 13:47 UTC (permalink / raw)
  To: devel, ardb, Corvin Köhne
  Cc: grehan, Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao, Jordan Justen,
	Anthony Perard, Julien Grall

Liming’s email appeared to say that patch reviews could continue even if they aren’t for the upcoming release?

“ We enter into Soft Feature Freeze phase on 2023-05-08. In this phase,

the feature under review will not be allowed to be pushed. The feature passed review can still be merged. 

 The patch review can continue without break in edk2 community. If the patch is sent before Soft Feature Freeze, and plans to catch this stable
tag, the patch contributor need reply to his patch and notify edk2 community. If the patch is sent after Soft Feature Freeze, and plans to catch this stable tag, please add edk2-stable202305 key words in the patch title and BZ, so the community know this patch target and give the feedback.

  To avoid the unnecessary changes to be merged in edk2 stable tag release, all edk2 maintainers' write access will be temporarily disabled until stable tag is released on 05-26. That means edk2 maintainer can't set push label in pull request after 2023-05-08. 

  If the change wants to catch this stable tag 202305, please follow above rules, then send the merge request to gaoliming@byosoft.com.cn or 

michael.d.kinney@intel.com or miki.demeter@intel.com.

 

  We will help merge the code change in soft feature freeze and hard feature freeze phase. 

Below is edk2-stable202305 tag planning Proposed Schedule

Date (00:00:00 UTC-8) Description

2023-02-24  Beginning of development
2023-05-08  Soft Feature Freeze
2023-05-12  Hard Feature Freeze
2023-05-26  Release”


On Thu, May 11, 2023, at 7:19 AM, Ard Biesheuvel wrote:
> On Thu, 11 May 2023 at 15:16, Corvin Köhne <corvink@freebsd.org> wrote:
>>
>> On Thu, 2023-05-11 at 07:04 -0600, Rebecca Cran wrote:
>> > Could you cc me on _all_ of the patches in a series please?
>> >
>> > I seem to have been missed on this one, and only cc'd on 3/3.
>> >
>> >
>>
>> Sry, I've updated my cc list. So, you'll be included in my next update.
>>
>
> We're in the middle of a soft freeze so please don't resend this until
> after the release - thanks.
>
>
> 

^ permalink raw reply	[flat|nested] 11+ messages in thread

* 回复: [edk2-devel] [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
  2023-05-11 13:47         ` Rebecca Cran
@ 2023-05-12  1:47           ` gaoliming
  0 siblings, 0 replies; 11+ messages in thread
From: gaoliming @ 2023-05-12  1:47 UTC (permalink / raw)
  To: devel, rebecca, ardb, 'Corvin Köhne'
  Cc: grehan, 'Gerd Hoffmann', 'Ard Biesheuvel',
	'Jiewen Yao', 'Jordan Justen',
	'Anthony Perard', 'Julien Grall'

Yes. Patch review and update are still as normal. But, the patch will be merged after the stable tag is created if this patch is not target for this stable tag. 

Thanks
Liming
> -----邮件原件-----
> 发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 Rebecca Cran
> 发送时间: 2023年5月11日 21:48
> 收件人: devel@edk2.groups.io; ardb@kernel.org; Corvin Köhne
> <corvink@freebsd.org>
> 抄送: grehan@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>
> 主题: Re: [edk2-devel] [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable
> installation into AcpiPlatformLib
> 
> Liming’s email appeared to say that patch reviews could continue even if they
> aren’t for the upcoming release?
> 
> “ We enter into Soft Feature Freeze phase on 2023-05-08. In this phase,
> 
> the feature under review will not be allowed to be pushed. The feature
> passed review can still be merged.
> 
>  The patch review can continue without break in edk2 community. If the
> patch is sent before Soft Feature Freeze, and plans to catch this stable
> tag, the patch contributor need reply to his patch and notify edk2 community.
> If the patch is sent after Soft Feature Freeze, and plans to catch this stable tag,
> please add edk2-stable202305 key words in the patch title and BZ, so the
> community know this patch target and give the feedback.
> 
>   To avoid the unnecessary changes to be merged in edk2 stable tag release,
> all edk2 maintainers' write access will be temporarily disabled until stable tag
> is released on 05-26. That means edk2 maintainer can't set push label in pull
> request after 2023-05-08.
> 
>   If the change wants to catch this stable tag 202305, please follow above
> rules, then send the merge request to gaoliming@byosoft.com.cn or
> 
> michael.d.kinney@intel.com or miki.demeter@intel.com.
> 
> 
> 
>   We will help merge the code change in soft feature freeze and hard feature
> freeze phase.
> 
> Below is edk2-stable202305 tag planning Proposed Schedule
> 
> Date (00:00:00 UTC-8) Description
> 
> 2023-02-24  Beginning of development
> 2023-05-08  Soft Feature Freeze
> 2023-05-12  Hard Feature Freeze
> 2023-05-26  Release”
> 
> 
> On Thu, May 11, 2023, at 7:19 AM, Ard Biesheuvel wrote:
> > On Thu, 11 May 2023 at 15:16, Corvin Köhne <corvink@freebsd.org> wrote:
> >>
> >> On Thu, 2023-05-11 at 07:04 -0600, Rebecca Cran wrote:
> >> > Could you cc me on _all_ of the patches in a series please?
> >> >
> >> > I seem to have been missed on this one, and only cc'd on 3/3.
> >> >
> >> >
> >>
> >> Sry, I've updated my cc list. So, you'll be included in my next update.
> >>
> >
> > We're in the middle of a soft freeze so please don't resend this until
> > after the release - thanks.
> >
> >
> >
> 
> 
> 
> 




^ permalink raw reply	[flat|nested] 11+ messages in thread

* Re: [edk2-devel] [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function
  2023-05-11 13:30 ` [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Anthony PERARD
@ 2023-06-01 15:01   ` Ard Biesheuvel
  0 siblings, 0 replies; 11+ messages in thread
From: Ard Biesheuvel @ 2023-06-01 15:01 UTC (permalink / raw)
  To: devel, anthony.perard
  Cc: Corvin Köhne, Gerd Hoffmann, Ard Biesheuvel, Jiewen Yao,
	Jordan Justen, Julien Grall

On Thu, 11 May 2023 at 15:30, Anthony PERARD via groups.io
<anthony.perard=citrix.com@groups.io> wrote:
>
> On Thu, May 11, 2023 at 02:02:37PM +0200, Corvin Köhne wrote:
> > diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
> > new file mode 100644
> > index 000000000000..ce52ad31cf25
> > --- /dev/null
> > +++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
> > @@ -0,0 +1,62 @@
> > +/** @file
> > +  Copyright (c) 2023, Corvin Köhne <corvink@FreeBSD.org>
>
> As this new file move codes from OvmfPkg/XenAcpiPlatformDxe/Xen.c,
> shouldn't you also copy the "Copyright" lines from that file as well?
>
>
> Beside that, patch looks fine:
> Reviewed-by: Anthony PERARD <anthony.perard@citrix.com>
>

Agreed

Doing a bit of amateur archaeology, I think we should retain these as well

Copyright (c) 2012, Bei Guan <gbtju85@gmail.com>
Copyright (C) 2021, Red Hat, Inc.


Also, please run this series through the CI (just send a PR to the
tiancore/edk2 github project - it will not get merged but it will tell
you if the CI spots any issues in the code)

^ permalink raw reply	[flat|nested] 11+ messages in thread

end of thread, other threads:[~2023-06-01 15:01 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-05-11 12:02 [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Corvin Köhne
2023-05-11 12:02 ` [PATCH v5 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Corvin Köhne
2023-05-11 13:04   ` [edk2-devel] " Rebecca Cran
2023-05-11 13:16     ` Corvin Köhne
2023-05-11 13:19       ` Ard Biesheuvel
2023-05-11 13:47         ` Rebecca Cran
2023-05-12  1:47           ` 回复: " gaoliming
2023-05-11 13:45   ` Anthony PERARD
2023-05-11 12:02 ` [PATCH v5 3/3] OvmfPkg/Bhyve: install ACPI tables from memory Corvin Köhne
2023-05-11 13:30 ` [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function Anthony PERARD
2023-06-01 15:01   ` [edk2-devel] " Ard Biesheuvel

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox