git: 5775540d36dd - stable/13 - bhyve: add more slop to 64 bit BARs
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 17 Jan 2022 16:22:16 UTC
The branch stable/13 has been updated by manu: URL: https://cgit.FreeBSD.org/src/commit/?id=5775540d36ddb7d4d5d0cd26d2365ca84060aec5 commit 5775540d36ddb7d4d5d0cd26d2365ca84060aec5 Author: Corvin Köhne <CorvinK@beckhoff.com> AuthorDate: 2022-01-03 13:19:39 +0000 Commit: Emmanuel Vadot <manu@FreeBSD.org> CommitDate: 2022-01-17 12:53:22 +0000 bhyve: add more slop to 64 bit BARs Bhyve allocates small 64 bit BARs below 4 GB and generates ACPI tables based on this allocation. If the guest decides to relocate those BARs above 4 GB, it could lead to mismatching ACPI tables. Especially when using OVMF with enabled bus enumeration it could cause issues. OVMF relocates all 64 bit BARs above 4 GB. The guest OS may be unable to recover from this situation and disables some PCI devices because their BARs are located outside of the MMIO space reported by ACPI. Avoid this situation by giving the guest more space for relocating BARs. Let's be paranoid. The available space for BARs below 4 GB is 512 MB large. Use a slop of 512 MB. It'll allow the guest to relocate all BARs below 4 GB to an address above 4 GB. We could run into issues when we exceeding the memlimit above 4 GB. However, this space has a size of 32 GB. Even when using many PCI device with large BARs like framebuffer or when using multiple PCI busses, it's very unlikely that we run out of space due to the large slop. Additionally, this situation will occur on startup and not at runtime which is much better. Reviewed by: markj MFC after: 2 weeks Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D33118 (cherry picked from commit 7d55d295086e0f568b42c89604fad3e47633b2ed) --- usr.sbin/bhyve/pci_emul.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/usr.sbin/bhyve/pci_emul.c b/usr.sbin/bhyve/pci_emul.c index 4365cda234b3..e9c88922b0ef 100644 --- a/usr.sbin/bhyve/pci_emul.c +++ b/usr.sbin/bhyve/pci_emul.c @@ -1218,7 +1218,8 @@ pci_ecfg_base(void) } #define BUSIO_ROUNDUP 32 -#define BUSMEM_ROUNDUP (1024 * 1024) +#define BUSMEM32_ROUNDUP (1024 * 1024) +#define BUSMEM64_ROUNDUP (512 * 1024 * 1024) int init_pci(struct vmctx *ctx) @@ -1320,14 +1321,14 @@ init_pci(struct vmctx *ctx) pci_emul_iobase = roundup2(pci_emul_iobase, BUSIO_ROUNDUP); bi->iolimit = pci_emul_iobase; - pci_emul_membase32 += BUSMEM_ROUNDUP; + pci_emul_membase32 += BUSMEM32_ROUNDUP; pci_emul_membase32 = roundup2(pci_emul_membase32, - BUSMEM_ROUNDUP); + BUSMEM32_ROUNDUP); bi->memlimit32 = pci_emul_membase32; - pci_emul_membase64 += BUSMEM_ROUNDUP; + pci_emul_membase64 += BUSMEM64_ROUNDUP; pci_emul_membase64 = roundup2(pci_emul_membase64, - BUSMEM_ROUNDUP); + BUSMEM64_ROUNDUP); bi->memlimit64 = pci_emul_membase64; }