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

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