* [PATCH v3 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib
2023-05-03 7:32 [PATCH v3 1/3] OvmfPkg/Xen: export search of RSDP into a library function Corvin Köhne
@ 2023-05-03 7:32 ` Corvin Köhne
2023-05-03 7:32 ` [PATCH v3 3/3] OvmfPkg/Bhyve: install ACPI tables from memory Corvin Köhne
2023-05-04 10:05 ` [PATCH v3 1/3] OvmfPkg/Xen: export search of RSDP into a library function Gerd Hoffmann
2 siblings, 0 replies; 6+ messages in thread
From: Corvin Köhne @ 2023-05-03 7:32 UTC (permalink / raw)
To: devel
Cc: Corvin Köhne, Ard Biesheuvel, Jiewen Yao, Jordan Justen,
Gerd Hoffmann, Anthony Perard, Julien Grall, Leif Lindholm,
Sami Mujawar
This makes the function reuseable by bhyve.
Signed-off-by: Corvin Köhne <corvink@FreeBSD.org>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Anthony Perard <anthony.perard@citrix.com>
Cc: Julien Grall <julien@xen.org>
Cc: Leif Lindholm <quic_llindhol@quicinc.com>
Cc: Sami Mujawar <sami.mujawar@arm.com>
---
.../XenAcpiPlatformDxe/XenAcpiPlatformDxe.inf | 1 -
OvmfPkg/Include/Library/AcpiPlatformLib.h | 26 ++
.../XenAcpiPlatformDxe/XenAcpiPlatformDxe.c | 2 +
.../AcpiPlatformLib/DxeAcpiPlatformLib.c | 195 ++++++++++++++
OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c | 12 +-
OvmfPkg/XenAcpiPlatformDxe/Xen.c | 237 ------------------
6 files changed, 233 insertions(+), 240 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 431ab1c54f5b..6ae44e42bec3 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.
@@ -23,3 +25,27 @@ 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
+InstallAcpiTablesFromMemory (
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
+ IN UINT64 StartAddress,
+ IN UINT64 EndAddress
+ );
diff --git a/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c b/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c
index 32c8b1e94ed2..caa1a510321e 100644
--- a/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c
+++ b/ArmVirtPkg/XenAcpiPlatformDxe/XenAcpiPlatformDxe.c
@@ -17,6 +17,8 @@
#include <IndustryStandard/Acpi.h>
+EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *XenAcpiRsdpStructurePtr = NULL;
+
/**
Get the address of Xen ACPI Root System Description Pointer (RSDP)
structure.
diff --git a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
index 80f9b5367b6d..48f2758231e7 100644
--- a/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
+++ b/OvmfPkg/Library/AcpiPlatformLib/DxeAcpiPlatformLib.c
@@ -88,3 +88,198 @@ GetAcpiRsdpFromMemory (
DEBUG ((DEBUG_WARN, "%a: RSDP not found\n", __func__));
return EFI_NOT_FOUND;
}
+
+EFI_STATUS
+EFIAPI
+InstallAcpiTablesFromMemory (
+ IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol,
+ IN UINT64 StartAddress,
+ IN UINT64 EndAddress
+ )
+{
+ EFI_STATUS Status;
+ UINTN TableHandle;
+
+ EFI_ACPI_2_0_ROOT_SYSTEM_DESCRIPTION_POINTER *Rsdp;
+ 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;
+
+ //
+ // Try to find Xen ACPI tables
+ //
+ Status = GetAcpiRsdpFromMemory (StartAddress, EndAddress, &Rsdp);
+ 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 (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..604a66877ef4 100644
--- a/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
+++ b/OvmfPkg/XenAcpiPlatformDxe/AcpiPlatform.c
@@ -7,10 +7,14 @@
**/
-#include <Library/XenPlatformLib.h> // XenDetected()
+#include <Library/AcpiPlatformLib.h> // InstallAcpiTablesFromMemory()
+#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.
@@ -31,7 +35,11 @@ InstallAcpiTables (
EFI_STATUS Status;
if (XenDetected ()) {
- Status = InstallXenTables (AcpiTable);
+ Status = InstallAcpiTablesFromMemory (
+ AcpiTable,
+ XEN_ACPI_PHYSICAL_ADDRESS,
+ XEN_BIOS_PHYSICAL_END
+ );
} else {
Status = EFI_UNSUPPORTED;
}
diff --git a/OvmfPkg/XenAcpiPlatformDxe/Xen.c b/OvmfPkg/XenAcpiPlatformDxe/Xen.c
deleted file mode 100644
index 28fa1d1e0e03..000000000000
--- a/OvmfPkg/XenAcpiPlatformDxe/Xen.c
+++ /dev/null
@@ -1,237 +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;
-
- Fadt2Table = NULL;
- Fadt1Table = NULL;
- Facs2Table = NULL;
- Facs1Table = NULL;
- DsdtTable = NULL;
- TableHandle = 0;
- NumberOfTableEntries = 0;
-
- //
- // Try to find Xen ACPI tables
- //
- 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] 6+ messages in thread
* [PATCH v3 3/3] OvmfPkg/Bhyve: install ACPI tables from memory
2023-05-03 7:32 [PATCH v3 1/3] OvmfPkg/Xen: export search of RSDP into a library function Corvin Köhne
2023-05-03 7:32 ` [PATCH v3 2/3] OvmfPkg/Xen: export AcpiTable installation into AcpiPlatformLib Corvin Köhne
@ 2023-05-03 7:32 ` Corvin Köhne
2023-05-05 14:43 ` Rebecca Cran
2023-05-04 10:05 ` [PATCH v3 1/3] OvmfPkg/Xen: export search of RSDP into a library function Gerd Hoffmann
2 siblings, 1 reply; 6+ messages in thread
From: Corvin Köhne @ 2023-05-03 7:32 UTC (permalink / raw)
To: devel
Cc: Corvin Köhne, Ard Biesheuvel, Jiewen Yao, Jordan Justen,
Gerd Hoffmann, Rebecca Cran, Peter Grehan
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>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: Gerd Hoffmann <kraxel@redhat.com>
Cc: Rebecca Cran <rebecca@bsdio.com>
Cc: Peter Grehan <grehan@freebsd.org>
---
OvmfPkg/Bhyve/BhyveX64.dsc | 1 +
.../Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf | 1 +
OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatform.c | 26 +++++++++++++++++++
3 files changed, 28 insertions(+)
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..a4498080cf7a 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 (
@@ -243,6 +248,27 @@ InstallAcpiTables (
{
EFI_STATUS Status;
+ Status = InstallAcpiTablesFromMemory (
+ AcpiTable,
+ BHYVE_ACPI_PHYSICAL_ADDRESS,
+ BHYVE_BIOS_PHYSICAL_END
+ );
+ 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);
return Status;
--
2.40.1
^ permalink raw reply related [flat|nested] 6+ messages in thread