Skip to content

Commit

Permalink
OvmfPkg/Bhyve: add support for QemuFwCfg
Browse files Browse the repository at this point in the history
QemuFwCfg is much more powerful than BhyveFwCtl. Sadly, BhyveFwCtl
decided to use the same IO ports as QemuFwCfg. It's not possible to use
both interfaces simultaneously. So, prefer QemuFwCfg over BhyveFwCtl.

Signed-off-by: Corvin Köhne <c.koehne@beckhoff.com>
Reviewed-by: Rebecca Cran <rebecca@bsdio.com>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Acked-by: Peter Grehan <grehan@freebsd.org>
Acked-by: Jiewen Yao <jiewen.yao@intel.com>
Cc: Ard Biesheuvel <ardb+tianocore@kernel.org>
Cc: Jordan Justen <jordan.l.justen@intel.com>
Cc: EDKII devel group <devel@edk2.groups.io>
Cc: FreeBSD Virtualization <freebsd-virtualization@freebsd.org>
  • Loading branch information
ckoehne committed Apr 27, 2022
1 parent 916f90b commit e3bc7e1
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 6 deletions.
1 change: 1 addition & 0 deletions OvmfPkg/Bhyve/AcpiPlatformDxe/AcpiPlatformDxe.inf
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
MemoryAllocationLib
OrderedCollectionLib
PcdLib
QemuFwCfgLib
UefiBootServicesTableLib
UefiDriverEntryPoint
UefiLib
Expand Down
41 changes: 37 additions & 4 deletions OvmfPkg/Bhyve/AcpiPlatformDxe/Bhyve.c
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,41 @@
#include <Library/BaseMemoryLib.h>
#include <Library/BhyveFwCtlLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/QemuFwCfgLib.h> // QemuFwCfgFindFile()

STATIC
EFI_STATUS
EFIAPI
BhyveGetCpuCount (
OUT UINT32 *CpuCount
)
{
FIRMWARE_CONFIG_ITEM Item;
UINTN Size;

if (QemuFwCfgIsAvailable ()) {
if (EFI_ERROR (QemuFwCfgFindFile ("opt/bhyve/hw.ncpu", &Item, &Size))) {
return EFI_NOT_FOUND;
} else if (Size != sizeof (*CpuCount)) {
return EFI_BAD_BUFFER_SIZE;
}

QemuFwCfgSelectItem (Item);
QemuFwCfgReadBytes (Size, CpuCount);

return EFI_SUCCESS;
}

//
// QemuFwCfg not available, try BhyveFwCtl.
//
Size = sizeof (*CpuCount);
if (BhyveFwCtlGet ("hw.ncpu", CpuCount, &Size) == RETURN_SUCCESS) {
return EFI_SUCCESS;
}

return EFI_UNSUPPORTED;
}

STATIC
EFI_STATUS
Expand All @@ -23,7 +58,6 @@ BhyveInstallAcpiMadtTable (
)
{
UINT32 CpuCount;
UINTN cSize;
UINTN NewBufferSize;
EFI_ACPI_1_0_MULTIPLE_APIC_DESCRIPTION_TABLE_HEADER *Madt;
EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC_STRUCTURE *LocalApic;
Expand All @@ -36,9 +70,8 @@ BhyveInstallAcpiMadtTable (
ASSERT (AcpiTableBufferSize >= sizeof (EFI_ACPI_DESCRIPTION_HEADER));

// Query the host for the number of vCPUs
CpuCount = 0;
cSize = sizeof (CpuCount);
if (BhyveFwCtlGet ("hw.ncpu", &CpuCount, &cSize) == RETURN_SUCCESS) {
Status = BhyveGetCpuCount (&CpuCount);
if (!EFI_ERROR (Status)) {
DEBUG ((DEBUG_INFO, "Retrieved CpuCount %d\n", CpuCount));
ASSERT (CpuCount >= 1);
} else {
Expand Down
4 changes: 2 additions & 2 deletions OvmfPkg/Bhyve/BhyveX64.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -164,8 +164,7 @@
SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf
SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVariablesLib.inf
QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgLibNull.inf
QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/BaseQemuFwCfgS3LibNull.inf
QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf
BhyveFwCtlLib|OvmfPkg/Library/BhyveFwCtlLib/BhyveFwCtlLib.inf
VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf
MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/DxeMemEncryptSevLib.inf
Expand Down Expand Up @@ -358,6 +357,7 @@
!endif
PciLib|OvmfPkg/Library/DxePciLibI440FxQ35/DxePciLibI440FxQ35.inf
MpInitLib|UefiCpuPkg/Library/MpInitLibUp/MpInitLibUp.inf
QemuFwCfgS3Lib|OvmfPkg/Library/QemuFwCfgS3Lib/DxeQemuFwCfgS3LibFwCfg.inf

[LibraryClasses.common.UEFI_APPLICATION]
PcdLib|MdePkg/Library/DxePcdLib/DxePcdLib.inf
Expand Down

0 comments on commit e3bc7e1

Please sign in to comment.