From nobody Tue Aug 5 14:03:17 2025 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 4bxFWW10G3z63Gy2; Tue, 05 Aug 2025 14:03:19 +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 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R10" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4bxFWV0WDnz3FT0; Tue, 05 Aug 2025 14:03:18 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754402598; 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=R7Q3pNCY9ynnkL3qtrb5PfAncx7zUyBgaMyoGEP0/Vw=; b=kLmn7i7bSClszFrXj4oOp/af1rH7PWdjZkZeM1nB0IrUic5ZQB+KJqN9Z7cIIULkaxUkmI JTO+STOxTviLcABbK6gEiRxm3dLkZRlvx4xpoUGq9UTY7tpYizINM0uIIwigEB2j9whxub 1/xThWl+AcGbRqe9e12E7EtNTHBb3Rgjnsia0mXI+po3EYW329oW/0IqYNNkIHqpAXq+uD E9WYUbz9R3kWKX/dvjo5gYmc+ZcjkpmmihlTzK0XURRFVkpz7kNYFLnSpXB6XR3TAcJoTa 6PwBlX1K/tlMCel/wCsstmMSUL35aDL/ri7CRnvHa95vq1lH6pxaAagcHTEWKA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1754402598; 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=R7Q3pNCY9ynnkL3qtrb5PfAncx7zUyBgaMyoGEP0/Vw=; b=qWswib9SaPoTqPJxsATbqyi7bQO2I5m/2CIQ/bSubmMX4kdiHenmCliDDsRmpwMmFfLNbi isMu6AYY43rbzajLsUolU6EqnEtN0greMz8S776zpAi8DRsHWLj3lxP5vOHJ8IeQJ/uiNw N4hktSWHctOfloYWqfknod+lC9+VYciIzYhD79niWbhbZuo25GNfVL5bqF7rL3jj0XbnW+ cjW2qeD8OkqdRNp+u4i05fxdVs+2ZA5zCJ1EjSD6iDg58auhHwZrVKREC2GgbTD7cXoF6v R57160GmGSjTldDLWqztfKkJnLd85cXy5ao+rHre6UJrErJFPO33IA3jzPgzOA== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1754402598; a=rsa-sha256; cv=none; b=hu/dhsXyNFhalhcBfFu33IsYyHwUjvw4XwD1JaJgbavPWKL0l9bh1PRALfH0uk6ZdxSpQr qY06rX+3bVeW1TZDdKSyeeUKocdiEP3rfhHCfeZeCcrwPqrKerSMeDgGfOx2YLzrOQ1yMB 7xUGcwfymld0MfbUABFVAId7mAH6szxd9XIEJCX5D2jfxfvdmsF6PuKs+HZCcaOofVDoxs IihltiMiKxUuncXgbIGr5XN60GjuGQdTTK1JmKpW3bugDSVoPVuOgogQKj5DLCMuGaD8Z+ 3tQDf3/SCwcdpsMtKIDDUPTvVHTDks/MQKpruwDtPbguoZ/aael8U2+sra4SxA== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (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) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4bxFWT71bDzfLC; Tue, 05 Aug 2025 14:03:17 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.18.1/8.18.1) with ESMTP id 575E3H4j070637; Tue, 5 Aug 2025 14:03:17 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.18.1/8.18.1/Submit) id 575E3Hrb070634; Tue, 5 Aug 2025 14:03:17 GMT (envelope-from git) Date: Tue, 5 Aug 2025 14:03:17 GMT Message-Id: <202508051403.575E3Hrb070634@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org From: Corvin =?utf-8?Q?K=C3=B6hne?= Subject: git: f841cb63687b - main - bhyve: trap protected BAR regions of passthru devices List-Id: Commit messages for the main branch of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-main List-Help: List-Post: List-Subscribe: List-Unsubscribe: X-BeenThere: dev-commits-src-main@freebsd.org Sender: owner-dev-commits-src-main@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: corvink X-Git-Repository: src X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: f841cb63687ba7d4285bcd35f3bdbb51253c41d8 Auto-Submitted: auto-generated The branch main has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=f841cb63687ba7d4285bcd35f3bdbb51253c41d8 commit f841cb63687ba7d4285bcd35f3bdbb51253c41d8 Author: Corvin Köhne AuthorDate: 2024-01-08 14:01:45 +0000 Commit: Corvin Köhne CommitDate: 2025-08-05 14:02:09 +0000 bhyve: trap protected BAR regions of passthru devices At the moment, the list of protected BAR regions is unused by the passthru emulation. Make use of it when mapping the BAR regions. This causes bhyve to trap those regions. Reviewed by: jhb MFC after: 1 week Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D45340 --- usr.sbin/bhyve/pci_passthru.c | 57 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 10 deletions(-) diff --git a/usr.sbin/bhyve/pci_passthru.c b/usr.sbin/bhyve/pci_passthru.c index 0cc5b777b842..2b84c561927a 100644 --- a/usr.sbin/bhyve/pci_passthru.c +++ b/usr.sbin/bhyve/pci_passthru.c @@ -1323,27 +1323,64 @@ passthru_msix_addr(struct pci_devinst *pi, int baridx, int enabled, } } -static void -passthru_mmio_addr(struct pci_devinst *pi, int baridx, int enabled, - uint64_t address) +static int +passthru_mmio_map(struct pci_devinst *pi, int baridx, int enabled, + uint64_t address, uint64_t off, uint64_t size) { struct passthru_softc *sc; sc = pi->pi_arg; if (!enabled) { if (vm_unmap_pptdev_mmio(pi->pi_vmctx, sc->psc_sel.pc_bus, - sc->psc_sel.pc_dev, - sc->psc_sel.pc_func, address, - sc->psc_bar[baridx].size) != 0) + sc->psc_sel.pc_dev, sc->psc_sel.pc_func, address + off, + size) != 0) { warnx("pci_passthru: unmap_pptdev_mmio failed"); + return (-1); + } } else { if (vm_map_pptdev_mmio(pi->pi_vmctx, sc->psc_sel.pc_bus, - sc->psc_sel.pc_dev, - sc->psc_sel.pc_func, address, - sc->psc_bar[baridx].size, - sc->psc_bar[baridx].addr) != 0) + sc->psc_sel.pc_dev, sc->psc_sel.pc_func, address + off, + size, sc->psc_bar[baridx].addr + off) != 0) { warnx("pci_passthru: map_pptdev_mmio failed"); + return (-1); + } + } + + return (0); +} + +static void +passthru_mmio_addr(struct pci_devinst *pi, int baridx, int enabled, + uint64_t address) +{ + struct passthru_softc *sc; + struct passthru_bar_handler *handler; + uint64_t off; + + sc = pi->pi_arg; + + off = 0; + + /* The queue is sorted by offset in ascending order. */ + TAILQ_FOREACH(handler, &sc->psc_bar_handler[baridx], chain) { + uint64_t handler_off = trunc_page(handler->off); + uint64_t handler_end = round_page(handler->off + handler->size); + + /* + * When two handlers point to the same page, handler_off can be + * lower than off. That's fine because we have nothing to do in + * that case. + */ + if (handler_off > off) { + passthru_mmio_map(pi, baridx, enabled, address, off, + handler_off - off); + } + + off = handler_end; } + + passthru_mmio_map(pi, baridx, enabled, address, off, + sc->psc_bar[baridx].size - off); } static void