OvmfPkg/Bhyve: install ACPI tables from memory

It's much easier to create configuration dependent 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>
This commit is contained in:
Corvin Köhne 2023-06-06 11:21:39 +02:00 committed by mergify[bot]
parent 1288c5415c
commit 4bd0849d81
3 changed files with 38 additions and 1 deletions

View File

@ -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);

View File

@ -35,6 +35,7 @@
UefiCpuPkg/UefiCpuPkg.dec
[LibraryClasses]
AcpiPlatformLib
BaseLib
BaseMemoryLib
BhyveFwCtlLib

View File

@ -341,6 +341,7 @@
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