From nobody Tue Oct 20 22:07:00 2026 X-Original-To: dev-commits-src-main@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4j8RN43Zspz6wTq7 for ; Tue, 20 Oct 2026 22:07:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange x25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by mx1.freebsd.org (Postfix) with ESMTPS id 4j8RN434b2z4NTb for ; Tue, 20 Oct 2026 22:07:00 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792534020; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=40/oTGSBdI6BX94wAY0JrGVuFLR+wLXu0opRYppbfS0=; b=nLusD+ie16LaG8eXesB/2EGatwoh5IF2+pD5/bpoANUkvNiJVPczYKz4SXtes4CYtE+b4r UnOaiE1Zu+HfRrZuzrikSor3LJCqWMulmbkCu1dpj7x6aiyMvpcTHNIQR3GSgz77DDk16m ZBH6t887qTGGk6uFw8RSM9xuysbaL5L58LkP7Q1rCOdFMRIV+5BMDF7pdtG95vzpVpoR8c P2qAoyd4Zt0+MS15JlzUM/Z9BznJOHJNc9j4RcuDxPaF4WODhIrPtWKI3dEZSqyAsaa1Rk V4dZfqaoT99Xve3YJNdjRt1aot8ENQQinIjw8InsOqwUAMiQdpJbjWi/jcO8TA== ARC-Seal: i=1; a=rsa-sha256; d=freebsd.org; s=dkim; cv=none; t=1792534020; b=vHmTiD/Sr0lRDAU1zjlJIradEQI28x2HJdkd2oGVt38fNd2f/ixUo92yv20FhMUWXcXCrT MCSQSVyMZNSKhpPA9OXP1iSz5vLuodNHj+nTxZoaVuHKwQP0FAqagWGOmh2B1qkMBbPU8U x5TfYpJsp7yTcQqWKiCEH4ki0vdb98pyzq5Jcn4iPdWVQhifEkgqnGXe+rVin38/F6eoUZ 6ISW8ZIgeb/ajhzTuuz/9b2VTLwyHzxf7lzw9Y8FPLcclXQ+nwTjvvwZlDlZs2nq8ZhIoI fSp7GM5uPmbdUjU28fOQLptNk/jYaKWDWyO8qdcqOvtumpx6U3xkFhARlkkSmQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1792534020; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=40/oTGSBdI6BX94wAY0JrGVuFLR+wLXu0opRYppbfS0=; b=El1ac4NBHYKxA0XSK/p0qjIzRGKYnrv8ovrxseQe15qRDG26Xx7pKG2cUGgR5u8S7+eFSP iyMybXrfi+VVNGMaewSB8z6M+qhq8pv3oSEW8EziVKYfIth2sgWKa1jgA/W/5Zh3yLnho0 RTFFPodF4Um8GA4v1xBLCA/jyaEV4XcdDXdQ/3Kf9uUKsnIlkxlsngQoivEKQ79fxVyNDz Um8tOa/rFfrGM19sZUSS82TgKcwZAHNfkHHmc02auMzOP2sxwwZ8BpwPWAvK6z/qjxfdPj oVxjp1F9kFJfg+Xc/pOydpLCDx55rQYx5b1UJTgop96yt3jbnz4dycbvAPPshg== ARC-Authentication-Results: i=1; mx1.freebsd.org; none Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) by mxrelay.nyi.freebsd.org (Postfix) with ESMTP id 4j8RN42NnszQjp for ; Tue, 20 Oct 2026 22:07:00 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from git (uid 1279) (envelope-from git@FreeBSD.org) id 24ba0 by gitrepo.freebsd.org (DragonFly Mail Agent v0.13+ on gitrepo.freebsd.org); Tue, 20 Oct 2026 22:07:00 +0000 To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Mark Johnston Subject: git: 6f051f0e56fe - main - bhyve: Treat BAR registration failures as non-fatal List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org List-Id: Commit messages for the main branch of the src repository List-Post: List-Help: List-Subscribe: List-Unsubscribe: List-Owner: Precedence: list MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: markj X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 6f051f0e56feba19731adfa6f6bd2a098b5091de Auto-Submitted: auto-generated Date: Tue, 20 Oct 2026 22:07:00 +0000 Message-Id: <6ad7e604.24ba0.777c2c8c@gitrepo.freebsd.org> The branch main has been updated by markj: URL: https://cgit.FreeBSD.org/src/commit/?id=6f051f0e56feba19731adfa6f6bd2a098b5091de commit 6f051f0e56feba19731adfa6f6bd2a098b5091de Author: Mark Johnston AuthorDate: 2026-10-20 15:41:21 +0000 Commit: Mark Johnston CommitDate: 2026-10-20 22:04:55 +0000 bhyve: Treat BAR registration failures as non-fatal Some guest operating systems (at least 9front) will leave device I/O space decoding enabled while probing BAR sizes. In this case, a sufficiently large 32-bit BAR can overlap with the HPET MMIO region fixed at 0xfed00000. This results in an assertion failure in modify_bar_registration(), even though the collision is transient, i.e., the guest will promptly map the BAR elsewhere. Tolerate such overlaps. Keep track of a BAR's registration state and make sure that modify_bar_registration() doesn't try to unregister an I/O space if registration failed. This fixes a problem where a 32MB framebuffer ends up overlapping with the HPET MMIO region, causing some guests to crash with an assertion failure when probing BARs during boot. PR: 290098 Reviewed by: bnovkov MFC after: 2 weeks Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D60748 --- usr.sbin/bhyve/pci_emul.c | 46 +++++++++++++++++++++++++++++++--------------- usr.sbin/bhyve/pci_emul.h | 2 ++ 2 files changed, 33 insertions(+), 15 deletions(-) diff --git a/usr.sbin/bhyve/pci_emul.c b/usr.sbin/bhyve/pci_emul.c index 9170e0b6b93c..60128a735de1 100644 --- a/usr.sbin/bhyve/pci_emul.c +++ b/usr.sbin/bhyve/pci_emul.c @@ -639,12 +639,16 @@ static void modify_bar_registration(struct pci_devinst *pi, int idx, int registration) { struct pci_devemu *pe; + struct pcibar *bar; int error; - enum pcibar_type type; pe = pi->pi_d; - type = pi->pi_bar[idx].type; - switch (type) { + bar = &pi->pi_bar[idx]; + + if (!registration && !bar->registered) + return; + + switch (bar->type) { case PCIBAR_IO: { #ifdef __amd64__ @@ -652,30 +656,34 @@ modify_bar_registration(struct pci_devinst *pi, int idx, int registration) bzero(&iop, sizeof(struct inout_port)); iop.name = pi->pi_name; - iop.port = pi->pi_bar[idx].addr; - iop.size = pi->pi_bar[idx].size; + iop.port = bar->addr; + iop.size = bar->size; if (registration) { iop.flags = IOPORT_F_INOUT; iop.handler = pci_emul_io_handler; iop.arg = pi; error = register_inout(&iop); - } else + } else { error = unregister_inout(&iop); + assert(error == 0); + } #else struct mem_range mr; bzero(&mr, sizeof(struct mem_range)); mr.name = pi->pi_name; - mr.base = pi->pi_bar[idx].addr; - mr.size = pi->pi_bar[idx].size; + mr.base = bar->addr; + mr.size = bar->size; if (registration) { mr.flags = MEM_F_RW; mr.handler = pci_emul_iomem_handler; mr.arg1 = pi; mr.arg2 = idx; error = register_mem(&mr); - } else + } else { error = unregister_mem(&mr); + assert(error == 0); + } #endif break; } @@ -686,16 +694,18 @@ modify_bar_registration(struct pci_devinst *pi, int idx, int registration) bzero(&mr, sizeof(struct mem_range)); mr.name = pi->pi_name; - mr.base = pi->pi_bar[idx].addr; - mr.size = pi->pi_bar[idx].size; + mr.base = bar->addr; + mr.size = bar->size; if (registration) { mr.flags = MEM_F_RW; mr.handler = pci_emul_mem_handler; mr.arg1 = pi; mr.arg2 = idx; error = register_mem(&mr); - } else + } else { error = unregister_mem(&mr); + assert(error == 0); + } break; } case PCIBAR_ROM: @@ -705,10 +715,16 @@ modify_bar_registration(struct pci_devinst *pi, int idx, int registration) error = EINVAL; break; } - assert(error == 0); - if (pe->pe_baraddr != NULL) - (*pe->pe_baraddr)(pi, idx, registration, pi->pi_bar[idx].addr); + /* + * An error may legitimately occur if the guest is probing BARs and + * leaves decoding enabled. Keep track of this if it happens so that we + * can skip unregistration. + */ + bar->registered = (registration && error == 0); + + if (error == 0 && pe->pe_baraddr != NULL) + (*pe->pe_baraddr)(pi, idx, registration, bar->addr); } static void diff --git a/usr.sbin/bhyve/pci_emul.h b/usr.sbin/bhyve/pci_emul.h index 9aeb11496943..b7ddfd73bda1 100644 --- a/usr.sbin/bhyve/pci_emul.h +++ b/usr.sbin/bhyve/pci_emul.h @@ -39,6 +39,7 @@ #include #include +#include #include "pci_irq.h" @@ -99,6 +100,7 @@ struct pcibar { uint64_t size; uint64_t addr; uint8_t lobits; + bool registered; /* io region is registered */ }; #define PI_NAMESZ 40