From nobody Mon Feb 9 15:36:11 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) client-ip=66.175.222.12; envelope-from=bounce+27952+57448+1787277+3901457@groups.io; helo=web01.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+57448+1787277+3901457@groups.io ARC-Seal: i=1; a=rsa-sha256; t=1586992429; cv=none; d=zohomail.com; s=zohoarc; b=en8omdt4ax9CVWYa/I35MOugAlz3g143MpfRS4b07XTBSwWeIlFyHjdMWEHAswZIOObg8ocj/G33pZavNqUq/2RjxUlbNMJg/lZ3bGb3N5Yg84m58KE3OUKG4PvaRyJuBQzEPeTkr+rJ6vdBHiPTUX753zOhIflYTSnkBc2Cprc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1586992429; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Id:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=9wdArXB9pxst6unxDmZNdA/JxNsVpQ4W2vlLhJLi6JM=; b=etqRKrHRbbvi7/DKC6UdPz3YNY2tyYAYBFMd2hR0vm2d1TsoYIGoY1Gg3eIog1xFd4MtjVnzZBNbVgztqEf9lhKqqDbsT8r3wvi1RuCGSxbjgkAXMpd5DrJGLRB5DCPCF2AVX8JVyd/E90iOQRBNzhfDtcSYM7/FLZafiJTbnPI= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.12 as permitted sender) smtp.mailfrom=bounce+27952+57448+1787277+3901457@groups.io Received: from web01.groups.io (web01.groups.io [66.175.222.12]) by mx.zohomail.com with SMTPS id 1586992429992544.706685893149; Wed, 15 Apr 2020 16:13:49 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id rGtZYY1788612xywljuZFdNz; Wed, 15 Apr 2020 16:13:49 -0700 X-Received: from smic.int.bsdio.com (smic.int.bsdio.com [65.103.231.193]) by mx.groups.io with SMTP id smtpd.web11.846.1586992429039933429 for ; Wed, 15 Apr 2020 16:13:49 -0700 X-Received: from smic.int.bsdio.com (localhost [127.0.0.1]) by smic.int.bsdio.com (8.15.2/8.15.2) with ESMTPS id 03FNAAgD071922 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NO); Wed, 15 Apr 2020 17:10:10 -0600 (MDT) (envelope-from bcran@smic.int.bsdio.com) X-Received: (from bcran@localhost) by smic.int.bsdio.com (8.15.2/8.15.2/Submit) id 03FNAA2w071128; Wed, 15 Apr 2020 17:10:10 -0600 (MDT) (envelope-from bcran) From: "Rebecca Cran" To: devel@edk2.groups.io Cc: Jordan Justen , Laszlo Ersek , Ard Biesheuvel , Rebecca Cran Subject: [edk2-devel] [PATCH 10/13] OvmfPkg: Add bhyve support to AcpiPlatformDxe Date: Wed, 15 Apr 2020 17:09:36 -0600 Message-Id: <883772c5ab95df8397781f4ab7c790b396043c5c.1586991816.git.rebecca@bsdio.com> In-Reply-To: References: MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,rebecca@bsdio.com X-Gm-Message-State: NaUak3tKfrDvGxRQLIYvIml9x1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1586992429; bh=MxoiTZC9y0Qx6TLqqq9o3X37XgGKfGyJgyDW7k7pmbA=; h=Cc:Date:From:Reply-To:Subject:To; b=fpfQ2eykB0tvs83hJpRddwR81aqNeAJinfEiBg8nYiW+xuP1PmP0zoZe36qcvaf4phn vlu8GB6TiBAj2qcZPWMXeNAFGnq+UDTNj4dAE+UES9PgIRnSG46LWKy+t8OD7/PQ5yHI0 bEljmKb6P155ccWY8UnjJdeG6k6RURmzWYA= X-ZohoMail-DKIM: pass (identity @groups.io) Content-Type: text/plain; charset="utf-8" Add bhyve support to AcpiPlatformDxe. bhyve doesn't use QemuFwCfg and installs its own ACPI tables, so introduce a new AcpiPlatformDxeBhyve.inf that's customized for it. Signed-off-by: Rebecca Cran --- OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c | 8 +- OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h | 9 ++ OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf | 3 + .../AcpiPlatformDxe/AcpiPlatformDxeBhyve.inf | 81 ++++++++++ OvmfPkg/AcpiPlatformDxe/Bhyve.c | 138 ++++++++++++++++++ OvmfPkg/OvmfPkgIa32.dsc | 1 + OvmfPkg/OvmfPkgIa32X64.dsc | 1 + OvmfPkg/OvmfPkgX64.dsc | 1 + OvmfPkg/OvmfXen.dsc | 1 + 9 files changed, 240 insertions(+), 3 deletions(-) create mode 100644 OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxeBhyve.inf create mode 100644 OvmfPkg/AcpiPlatformDxe/Bhyve.c diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c b/OvmfPkg/AcpiPlatformD= xe/AcpiPlatform.c index f872d91aea..5f501c38bf 100644 --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.c @@ -157,8 +157,10 @@ InstallOvmfFvTables ( =20 if (QemuDetected ()) { TableInstallFunction =3D QemuInstallAcpiTable; - } else { + } else if (XenDetected()) { TableInstallFunction =3D InstallAcpiTable; + } else { + TableInstallFunction =3D BhyveInstallAcpiTable; } =20 // @@ -245,11 +247,11 @@ InstallAcpiTables ( IN EFI_ACPI_TABLE_PROTOCOL *AcpiTable ) { - EFI_STATUS Status; + EFI_STATUS Status =3D EFI_UNSUPPORTED; =20 if (XenDetected ()) { Status =3D InstallXenTables (AcpiTable); - } else { + } else if (QemuDetected()) { Status =3D InstallQemuFwCfgTables (AcpiTable); } =20 diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h b/OvmfPkg/AcpiPlatformD= xe/AcpiPlatform.h index 9597e028e4..160a541aee 100644 --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatform.h @@ -53,6 +53,15 @@ QemuInstallAcpiTable ( OUT UINTN *TableKey ); =20 +EFI_STATUS +EFIAPI +BhyveInstallAcpiTable( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, + IN VOID *AcpiTableBuffer, + IN UINTN AcpiTableBufferSize, + OUT UINTN *TableKey + ); + EFI_STATUS EFIAPI InstallXenTables ( diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf b/OvmfPkg/AcpiPlat= formDxe/AcpiPlatformDxe.inf index e486b8afa5..f3b5ab413b 100644 --- a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxe.inf @@ -30,11 +30,13 @@ QemuFwCfgAcpi.c QemuLoader.h Xen.c + Bhyve.c =20 [Packages] MdePkg/MdePkg.dec MdeModulePkg/MdeModulePkg.dec OvmfPkg/OvmfPkg.dec + BhyvePkg/BhyvePkg.dec UefiCpuPkg/UefiCpuPkg.dec =20 [LibraryClasses] @@ -46,6 +48,7 @@ UefiDriverEntryPoint QemuFwCfgLib QemuFwCfgS3Lib + BhyveFwCtlLib MemoryAllocationLib BaseLib DxeServicesTableLib diff --git a/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxeBhyve.inf b/OvmfPkg/Acp= iPlatformDxe/AcpiPlatformDxeBhyve.inf new file mode 100644 index 0000000000..b8bd8ad20e --- /dev/null +++ b/OvmfPkg/AcpiPlatformDxe/AcpiPlatformDxeBhyve.inf @@ -0,0 +1,81 @@ +## @file +# OVMF ACPI Platform Driver +# +# Copyright (c) 2008 - 2018, Intel Corporation. All rights reserved.
+# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the B= SD License +# which accompanies this distribution. The full text of the license may = be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IM= PLIED. +# +## + +[Defines] + INF_VERSION =3D 0x00010005 + BASE_NAME =3D AcpiPlatformBhyve + FILE_GUID =3D D5F92408-BAB5-44CA-8A60-C212F01D7E9D + MODULE_TYPE =3D DXE_DRIVER + VERSION_STRING =3D 1.0 + ENTRY_POINT =3D AcpiPlatformEntryPoint + +# +# The following information is for reference only and not required by the = build tools. +# +# VALID_ARCHITECTURES =3D IA32 X64 EBC +# + +[Sources] + AcpiPlatform.c + AcpiPlatform.h + BootScript.c + EntryPoint.c + PciDecoding.c + Qemu.c + QemuFwCfgAcpi.c + QemuLoader.h + Xen.c + Bhyve.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + BhyvePkg/BhyvePkg.dec + UefiCpuPkg/UefiCpuPkg.dec + PcAtChipsetPkg/PcAtChipsetPkg.dec + +[LibraryClasses] + UefiLib + PcdLib + BaseMemoryLib + DebugLib + UefiBootServicesTableLib + UefiDriverEntryPoint + HobLib + BhyveFwCtlLib + QemuFwCfgLib + QemuFwCfgS3Lib + MemoryAllocationLib + BaseLib + DxeServicesTableLib + OrderedCollectionLib + XenPlatformLib + +[Protocols] + gEfiAcpiTableProtocolGuid # PROTOCOL ALWAYS_CONSUMED + gEfiFirmwareVolume2ProtocolGuid # PROTOCOL SOMETIMES_CONSU= MED + gEfiPciIoProtocolGuid # PROTOCOL SOMETIMES_CONSU= MED + +[Guids] + gRootBridgesConnectedEventGroupGuid + +[Pcd] + gEfiMdeModulePkgTokenSpaceGuid.PcdAcpiTableStorageFile + gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration + gUefiCpuPkgTokenSpaceGuid.PcdCpuLocalApicBaseAddress + gUefiOvmfPkgTokenSpaceGuid.Pcd8259LegacyModeEdgeLevel + gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFdBaseAddress + +[Depex] + gEfiAcpiTableProtocolGuid diff --git a/OvmfPkg/AcpiPlatformDxe/Bhyve.c b/OvmfPkg/AcpiPlatformDxe/Bhyv= e.c new file mode 100644 index 0000000000..7f1a5fd664 --- /dev/null +++ b/OvmfPkg/AcpiPlatformDxe/Bhyve.c @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2008 - 2012, Intel Corporation. All rights reserved.
+ * Copyright (C) 2012, Red Hat, Inc. + * Copyright (c) 2014, Pluribus Networks, Inc. + * + * This program and the accompanying materials are licensed and made + * available under the terms and conditions of the BSD License which + * accompanies this distribution. The full text of the license may be + * found at http://opensource.org/licenses/bsd-license.php + * + * THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" + * BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER + * EXPRESS OR IMPLIED. + */ +#include "AcpiPlatform.h" + +#include +#include +#include + +STATIC +EFI_STATUS +EFIAPI +BhyveInstallAcpiMadtTable ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, + IN VOID *AcpiTableBuffer, + IN UINTN AcpiTableBufferSize, + OUT UINTN *TableKey + ) +{ + 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; + EFI_ACPI_1_0_IO_APIC_STRUCTURE *IoApic; + EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERRIDE_STRUCTURE *Iso; + VOID *Ptr; + UINTN Loop; + EFI_STATUS Status; + + ASSERT (AcpiTableBufferSize >=3D sizeof (EFI_ACPI_DESCRIPTION_HEADER)); + + // Query the host for the number of vCPUs + CpuCount =3D 0; + cSize =3D sizeof(CpuCount); + if (BhyveFwCtlGet ("hw.ncpu", &CpuCount, &cSize) =3D=3D RETURN_SUCCESS) { + DEBUG ((DEBUG_INFO, "Retrieved CpuCount %d\n", CpuCount)); + ASSERT (CpuCount >=3D 1); + } else { + DEBUG ((DEBUG_INFO, "CpuCount retrieval error\n")); + CpuCount =3D 1; + } + + NewBufferSize =3D 1 * sizeof (*Madt) + + CpuCount * sizeof (*LocalApic) + + 1 * sizeof (*IoApic) + + 1 * sizeof (*Iso); + + Madt =3D AllocatePool (NewBufferSize); + if (Madt =3D=3D NULL) { + return EFI_OUT_OF_RESOURCES; + } + + CopyMem (&(Madt->Header), AcpiTableBuffer, sizeof (EFI_ACPI_DESCRIPTION_= HEADER)); + Madt->Header.Length =3D (UINT32) NewBufferSize; + Madt->LocalApicAddress =3D 0xFEE00000; + Madt->Flags =3D EFI_ACPI_1_0_PCAT_COMPAT; + Ptr =3D Madt + 1; + + LocalApic =3D Ptr; + for (Loop =3D 0; Loop < CpuCount; ++Loop) { + LocalApic->Type =3D EFI_ACPI_1_0_PROCESSOR_LOCAL_APIC; + LocalApic->Length =3D sizeof (*LocalApic); + LocalApic->AcpiProcessorId =3D (UINT8) Loop; + LocalApic->ApicId =3D (UINT8) Loop; + LocalApic->Flags =3D 1; // enabled + ++LocalApic; + } + Ptr =3D LocalApic; + + IoApic =3D Ptr; + IoApic->Type =3D EFI_ACPI_1_0_IO_APIC; + IoApic->Length =3D sizeof (*IoApic); + IoApic->IoApicId =3D (UINT8) CpuCount; + IoApic->Reserved =3D EFI_ACPI_RESERVED_BYTE; + IoApic->IoApicAddress =3D 0xFEC00000; + IoApic->SystemVectorBase =3D 0x00000000; + Ptr =3D IoApic + 1; + + // + // IRQ0 (8254 Timer) =3D> IRQ2 (PIC) Interrupt Source Override Structure + // + Iso =3D Ptr; + Iso->Type =3D EFI_ACPI_1_0_INTERRUPT_SOURCE_OVERR= IDE; + Iso->Length =3D sizeof (*Iso); + Iso->Bus =3D 0x00; // ISA + Iso->Source =3D 0x00; // IRQ0 + Iso->GlobalSystemInterruptVector =3D 0x00000002; + Iso->Flags =3D 0x0000; // Conforms to specs of the= bus + Ptr =3D Iso + 1; + + ASSERT ((UINTN) ((UINT8 *)Ptr - (UINT8 *)Madt) =3D=3D NewBufferSize); + Status =3D InstallAcpiTable (AcpiProtocol, Madt, NewBufferSize, TableKey= ); + + FreePool (Madt); + + return Status; +} + +EFI_STATUS +EFIAPI +BhyveInstallAcpiTable ( + IN EFI_ACPI_TABLE_PROTOCOL *AcpiProtocol, + IN VOID *AcpiTableBuffer, + IN UINTN AcpiTableBufferSize, + OUT UINTN *TableKey + ) +{ + EFI_ACPI_DESCRIPTION_HEADER *Hdr; + EFI_ACPI_TABLE_INSTALL_ACPI_TABLE TableInstallFunction; + + Hdr =3D (EFI_ACPI_DESCRIPTION_HEADER*) AcpiTableBuffer; + switch (Hdr->Signature) { + case EFI_ACPI_1_0_APIC_SIGNATURE: + TableInstallFunction =3D BhyveInstallAcpiMadtTable; + break; + default: + TableInstallFunction =3D InstallAcpiTable; + } + + return TableInstallFunction ( + AcpiProtocol, + AcpiTableBuffer, + AcpiTableBufferSize, + TableKey + ); +} diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc index cbc5f0e583..3dd41e4f1c 100644 --- a/OvmfPkg/OvmfPkgIa32.dsc +++ b/OvmfPkg/OvmfPkgIa32.dsc @@ -159,6 +159,7 @@ UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVar= iablesLib.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf + BhyveFwCtlLib|BhyvePkg/Library/BhyveFwCtlLibNull/BhyveFwCtlLibNull.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc index 6d69cc6cb5..d246a96a1b 100644 --- a/OvmfPkg/OvmfPkgIa32X64.dsc +++ b/OvmfPkg/OvmfPkgIa32X64.dsc @@ -163,6 +163,7 @@ UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVar= iablesLib.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf + BhyveFwCtlLib|BhyvePkg/Library/BhyveFwCtlLibNull/BhyveFwCtlLibNull.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc index 5ad4f461ce..ff030ee502 100644 --- a/OvmfPkg/OvmfPkgX64.dsc +++ b/OvmfPkg/OvmfPkgX64.dsc @@ -163,6 +163,7 @@ UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVar= iablesLib.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf + BhyveFwCtlLib|BhyvePkg/Library/BhyveFwCtlLibNull/BhyveFwCtlLibNull.inf VirtioLib|OvmfPkg/Library/VirtioLib/VirtioLib.inf LoadLinuxLib|OvmfPkg/Library/LoadLinuxLib/LoadLinuxLib.inf MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf diff --git a/OvmfPkg/OvmfXen.dsc b/OvmfPkg/OvmfXen.dsc index 47ee8db8b8..b12abaeb0d 100644 --- a/OvmfPkg/OvmfXen.dsc +++ b/OvmfPkg/OvmfXen.dsc @@ -155,6 +155,7 @@ UefiUsbLib|MdePkg/Library/UefiUsbLib/UefiUsbLib.inf SerializeVariablesLib|OvmfPkg/Library/SerializeVariablesLib/SerializeVar= iablesLib.inf QemuFwCfgLib|OvmfPkg/Library/QemuFwCfgLib/QemuFwCfgDxeLib.inf + BhyveFwCtlLib|BhyvePkg/Library/BhyveFwCtlLibNull/BhyveFwCtlLibNull.inf QemuLoadImageLib|OvmfPkg/Library/GenericQemuLoadImageLib/GenericQemuLoad= ImageLib.inf MemEncryptSevLib|OvmfPkg/Library/BaseMemEncryptSevLib/BaseMemEncryptSevL= ib.inf LockBoxLib|OvmfPkg/Library/LockBoxLib/LockBoxBaseLib.inf --=20 2.26.1 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#57448): https://edk2.groups.io/g/devel/message/57448 Mute This Topic: https://groups.io/mt/73045190/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-