From: "Corvin Köhne" <corvink@FreeBSD.org>
To: devel@edk2.groups.io
Cc: "Corvin Köhne" <corvink@FreeBSD.org>,
"Gerd Hoffmann" <kraxel@redhat.com>,
"Ard Biesheuvel" <ardb+tianocore@kernel.org>,
"Jiewen Yao" <jiewen.yao@intel.com>,
"Jordan Justen" <jordan.l.justen@intel.com>,
"Anthony Perard" <anthony.perard@citrix.com>,
"Julien Grall" <julien@xen.org>
Subject: [PATCH v5 1/3] OvmfPkg/Xen: export search of RSDP into a library function
Date: Thu, 11 May 2023 14:02:37 +0200 [thread overview]
Message-ID: <20230511120239.695237-1-corvink@FreeBSD.org> (raw)
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
next reply other threads:[~2023-05-11 12:02 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-11 12:02 Corvin Köhne [this message]
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
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230511120239.695237-1-corvink@FreeBSD.org \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox