From owner-dev-commits-ports-main@freebsd.org Mon Sep 13 00:35:11 2021 Return-Path: Delivered-To: dev-commits-ports-main@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id A4FDD67220A; Mon, 13 Sep 2021 00:35:11 +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 "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4H76vM4CG5z4WVj; Mon, 13 Sep 2021 00:35:11 +0000 (UTC) (envelope-from git@FreeBSD.org) 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 7029E1D645; Mon, 13 Sep 2021 00:35:11 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.16.1/8.16.1) with ESMTP id 18D0ZB6q013744; Mon, 13 Sep 2021 00:35:11 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.16.1/8.16.1/Submit) id 18D0ZBOa013743; Mon, 13 Sep 2021 00:35:11 GMT (envelope-from git) Date: Mon, 13 Sep 2021 00:35:11 GMT Message-Id: <202109130035.18D0ZBOa013743@gitrepo.freebsd.org> To: ports-committers@FreeBSD.org, dev-commits-ports-all@FreeBSD.org, dev-commits-ports-main@FreeBSD.org From: Ashish SHUKLA Subject: git: 2d9c75cb9829 - main - sysutils/bhyve+: New Port: bhyve with unofficial extensions MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: ashish X-Git-Repository: ports X-Git-Refname: refs/heads/main X-Git-Reftype: branch X-Git-Commit: 2d9c75cb9829fc76ae9f002c363731b733c27e62 Auto-Submitted: auto-generated X-BeenThere: dev-commits-ports-main@freebsd.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Commits to the main branch of the FreeBSD ports repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Sep 2021 00:35:11 -0000 The branch main has been updated by ashish: URL: https://cgit.FreeBSD.org/ports/commit/?id=2d9c75cb9829fc76ae9f002c363731b733c27e62 commit 2d9c75cb9829fc76ae9f002c363731b733c27e62 Author: Gabor Pali AuthorDate: 2021-09-12 15:01:21 +0000 Commit: Ashish SHUKLA CommitDate: 2021-09-13 00:34:32 +0000 sysutils/bhyve+: New Port: bhyve with unofficial extensions A patched version of BHyVe, the BSD Hypervisor from the base system that includes features and fixes that are not yet officially there. WWW: https://github.com/pgj/freebsd-bhyve-plus-port --- sysutils/Makefile | 1 + sysutils/bhyve+/Makefile | 90 +++++ sysutils/bhyve+/distinfo | 3 + sysutils/bhyve+/files/freebsd-11/patch-bhyve-shelp | 79 ++++ sysutils/bhyve+/files/freebsd-11/patch-virtio-9p | 385 +++++++++++++++++++ sysutils/bhyve+/files/freebsd-11/patch-vtd-fix | 211 +++++++++++ sysutils/bhyve+/files/freebsd-12/patch-virtio-9p | 416 +++++++++++++++++++++ sysutils/bhyve+/files/freebsd-13/patch-custom-libs | 21 ++ sysutils/bhyve+/files/freebsd-13/patch-lib9p | 12 + sysutils/bhyve+/files/kernconf/opt_acpi.h | 2 + .../bhyve+/files/kernconf/opt_bhyve_snapshot.h | 0 sysutils/bhyve+/files/kernconf/opt_ddb.h | 1 + sysutils/bhyve+/files/kernconf/opt_global.h | 3 + sysutils/bhyve+/files/patch-lib9p | 24 ++ sysutils/bhyve+/files/patch-libvmmapi | 33 ++ sysutils/bhyve+/files/patch-msi-x-mappings | 132 +++++++ sysutils/bhyve+/pkg-descr | 4 + sysutils/bhyve+/pkg-plist | 9 + 18 files changed, 1426 insertions(+) diff --git a/sysutils/Makefile b/sysutils/Makefile index 66f118d826cf..1fcf8d5a8940 100644 --- a/sysutils/Makefile +++ b/sysutils/Makefile @@ -119,6 +119,7 @@ SUBDIR += bfs SUBDIR += bhyve-firmware SUBDIR += bhyve-rc + SUBDIR += bhyve+ SUBDIR += biosfont SUBDIR += bkpupsd SUBDIR += bksh diff --git a/sysutils/bhyve+/Makefile b/sysutils/bhyve+/Makefile new file mode 100644 index 000000000000..266129c8bf7c --- /dev/null +++ b/sysutils/bhyve+/Makefile @@ -0,0 +1,90 @@ +PORTNAME= bhyve+ +PORTVERSION= 0.1.0 +CATEGORIES= sysutils + +MAINTAINER= pali.gabor@gmail.com +COMMENT= BHyVe with unofficial extensions + +LICENSE= BSD2CLAUSE + +ONLY_FOR_ARCHS= amd64 +USES= kmod uidfix + +.include + +SRCS= ${SRC_BASE}/sys/modules/vmm \ + ${SRC_BASE}/sys/amd64/vmm \ + ${SRC_BASE}/lib/libvmmapi \ + ${SRC_BASE}/usr.sbin/bhyve \ + ${SRC_BASE}/usr.sbin/bhyvectl \ + ${SRC_BASE}/usr.sbin/bhyveload \ + ${SRC_BASE}/share/mk + +.for _src in ${SRCS} +. if !exists(${_src}) && empty(IGNORE) +IGNORE+= requires bhyve and vmm source files in ${_src} +. endif +.endfor + +USE_GITHUB= yes +GH_ACCOUNT= conclusiveeng +GH_PROJECT= lib9p +GH_TAGNAME= 7ef466772108856ee3e093735033232a6f1a3f04 + +USE_LDCONFIG= yes + +.if 1100000 <= ${OSVERSION} && ${OSVERSION} < 1200000 +EXTRA_PATCHES= ${PATCHDIR}/freebsd-11 +.elif 1200000 <= ${OSVERSION} && ${OSVERSION} < 1300000 +EXTRA_PATCHES= ${PATCHDIR}/freebsd-12 +.elif 1300000 <= ${OSVERSION} +EXTRA_PATCHES= ${PATCHDIR}/freebsd-13 +.else +. if empty(IGNORE) +IGNORE+= cannot build: unsupported system +. endif +.endif + +WRKSRC= ${WRKDIR} + +_LINKS= sys/cam/ctl \ + sys/dev/e1000 \ + sys/dev/mii \ + sys/dev/usb/controller \ + sys/amd64/include \ + sys/x86/include \ + stand/userboot + +post-extract: + @${MKDIR} ${WRKSRC}/contrib + @cd ${WRKSRC} && ${LN} -s ../${GH_PROJECT}-${GH_TAGNAME} contrib/lib9p +.for _link in ${_LINKS} + @${MKDIR} $$(dirname ${WRKSRC}/${_link}) + @cd ${WRKSRC} && ${LN} -s ${SRC_BASE}/${_link} ${_link} +.endfor +.for _src in ${SRCS} + @cd ${_src} && ${COPYTREE_SHARE} . ${WRKDIR}/${_src:S/${SRC_BASE}//1} +.endfor + @cd ${FILESDIR} && ${COPYTREE_SHARE} kernconf ${WRKSRC} + +do-build: + @cd ${WRKSRC}/contrib/lib9p && \ + ${MAKE} SRCTOP=${WRKSRC} SYSDIR=${SRC_BASE}/sys LIB9PDIR= +.for _src in ${SRCS} +. if exists(${_src}/Makefile) + @cd ${WRKSRC}/${_src:S/${SRC_BASE}//1} && \ + ${MAKE} SRCTOP=${WRKSRC} SYSDIR=${SRC_BASE}/sys DEBUG_FLAGS=-g \ + MK_CTF=yes KERNBUILDDIR=${WRKSRC}/kernconf +. endif +.endfor + +do-install: + ${INSTALL_LIB} ${WRKSRC}/contrib/lib9p/lib9p.so.1.1 ${STAGEDIR}${PREFIX}/lib + ${INSTALL_LIB} ${WRKSRC}/lib/libvmmapi/libvmmapi.so.5.1 ${STAGEDIR}${PREFIX}/lib +.for _bin in bhyve bhyveload bhyvectl + ${INSTALL_PROGRAM} ${WRKSRC}/usr.sbin/${_bin}/${_bin} ${STAGEDIR}${PREFIX}/sbin + ${INSTALL_MAN} ${WRKSRC}/usr.sbin/${_bin}/${_bin}.8.gz ${STAGEDIR}${PREFIX}/man/man8 +.endfor + ${INSTALL_KLD} ${WRKSRC}/sys/modules/vmm/vmm.ko ${STAGEDIR}${KMODDIR} + +.include diff --git a/sysutils/bhyve+/distinfo b/sysutils/bhyve+/distinfo new file mode 100644 index 000000000000..2c17bd4508cf --- /dev/null +++ b/sysutils/bhyve+/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1630740589 +SHA256 (conclusiveeng-lib9p-0.1.0-7ef466772108856ee3e093735033232a6f1a3f04_GH0.tar.gz) = 309c8dfc8cc6ff0ab72af6fa36fb0b7dd26c90bfeac0e11ef39344bf64cc2147 +SIZE (conclusiveeng-lib9p-0.1.0-7ef466772108856ee3e093735033232a6f1a3f04_GH0.tar.gz) = 145598 diff --git a/sysutils/bhyve+/files/freebsd-11/patch-bhyve-shelp b/sysutils/bhyve+/files/freebsd-11/patch-bhyve-shelp new file mode 100644 index 000000000000..8f2bc12fa573 --- /dev/null +++ b/sysutils/bhyve+/files/freebsd-11/patch-bhyve-shelp @@ -0,0 +1,79 @@ +--- usr.sbin/bhyve/pci_emul.c.orig 2021-08-21 23:52:31 UTC ++++ usr.sbin/bhyve/pci_emul.c +@@ -237,6 +237,17 @@ done: + return (error); + } + ++void ++pci_print_supported_devices() ++{ ++ struct pci_devemu **pdpp, *pdp; ++ ++ SET_FOREACH(pdpp, pci_devemu_set) { ++ pdp = *pdpp; ++ printf("%s\n", pdp->pe_emu); ++ } ++} ++ + static int + pci_valid_pba_offset(struct pci_devinst *pi, uint64_t offset) + { +--- usr.sbin/bhyve/pci_emul.h.orig 2021-08-21 23:54:47 UTC ++++ usr.sbin/bhyve/pci_emul.h +@@ -235,6 +235,7 @@ int pci_msix_table_bar(struct pci_devins + int pci_msix_pba_bar(struct pci_devinst *pi); + int pci_msi_maxmsgnum(struct pci_devinst *pi); + int pci_parse_slot(char *opt); ++void pci_print_supported_devices(); + void pci_populate_msicap(struct msicap *cap, int msgs, int nextptr); + int pci_emul_add_msixcap(struct pci_devinst *pi, int msgnum, int barnum); + int pci_emul_msix_twrite(struct pci_devinst *pi, uint64_t offset, int size, +diff --git a/bhyve.8.orig b/bhyve.8 +index 32392c9..0d4b16f 100644 +--- usr.sbin/bhyve/bhyve.8.orig ++++ usr.sbin/bhyve/bhyve.8 +@@ -47,7 +47,11 @@ + .Op Fl l Ar lpcdev Ns Op , Ns Ar conf + .Op Fl m Ar memsize Ns Op Ar K|k|M|m|G|g|T|t + .Op Fl p Ar vcpu:hostcpu +-.Op Fl s Ar slot,emulation Ns Op , Ns Ar conf ++.Oo Fl s ++.Sm off ++.Cm help | Ar slot,emulation Ns Op , Ns Ar conf ++.Sm on ++.Oc + .Op Fl U Ar uuid + .Ar vmname + .Sh DESCRIPTION +@@ -157,7 +161,7 @@ to + .Em hostcpu . + .It Fl P + Force the guest virtual CPU to exit when a PAUSE instruction is detected. +-.It Fl s Ar slot,emulation Ns Op , Ns Ar conf ++.It Fl s Op Ar help|slot,emulation Ns Op , Ns Ar conf + Configure a virtual PCI slot and function. + .Pp + .Nm +@@ -166,6 +170,8 @@ slots on the bus. + There are 32 available slots, with the option of providing up to 8 functions + per slot. + .Bl -tag -width 10n ++.It Ar help ++print a list of supported PCI devices. + .It Ar slot + .Ar pcislot[:function] + .Ar bus:pcislot:function +--- usr.sbin/bhyve/bhyverun.c.orig 2021-08-21 23:52:19 UTC ++++ usr.sbin/bhyve/bhyverun.c +@@ -1058,7 +1058,10 @@ main(int argc, char *argv[]) + } + break; + case 's': +- if (pci_parse_slot(optarg) != 0) ++ if (strncmp(optarg, "help", strlen(optarg)) == 0) { ++ pci_print_supported_devices(); ++ exit(0); ++ } else if (pci_parse_slot(optarg) != 0) + exit(4); + else + break; diff --git a/sysutils/bhyve+/files/freebsd-11/patch-virtio-9p b/sysutils/bhyve+/files/freebsd-11/patch-virtio-9p new file mode 100644 index 000000000000..1f98ebb69ddf --- /dev/null +++ b/sysutils/bhyve+/files/freebsd-11/patch-virtio-9p @@ -0,0 +1,385 @@ +--- usr.sbin/bhyve/Makefile.orig 2021-08-20 16:08:36 UTC ++++ usr.sbin/bhyve/Makefile +@@ -3,6 +3,7 @@ + # + + .include ++CFLAGS+=-I${SRCTOP}/contrib/lib9p + CFLAGS+=-I${SRCTOP}/sys + + PROG= bhyve +@@ -37,6 +38,7 @@ SRCS= \ + pci_irq.c \ + pci_lpc.c \ + pci_passthru.c \ ++ pci_virtio_9p.c \ + pci_virtio_block.c \ + pci_virtio_console.c \ + pci_virtio_net.c \ +@@ -63,7 +65,8 @@ SRCS= \ + .PATH: ${BHYVE_SYSDIR}/sys/amd64/vmm + SRCS+= vmm_instruction_emul.c + +-LIBADD= vmmapi md pthread z ++LIBADD= md pthread z sbuf casper cap_pwd cap_grp ++LDADD+= ../../contrib/lib9p/lib9p.so.1.1 ../../lib/libvmmapi/libvmmapi.so.5.1 + + .if ${MK_INET_SUPPORT} != "no" + CFLAGS+=-DINET +--- usr.sbin/bhyve/pci_virtio_9p.c.orig 2021-08-20 16:11:13 UTC ++++ usr.sbin/bhyve/pci_virtio_9p.c +@@ -0,0 +1,344 @@ ++/*- ++ * Copyright (c) 2015 iXsystems Inc. ++ * Copyright (c) 2017-2018 Jakub Klama ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer ++ * in this position and unchanged. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++/* ++ * VirtIO filesystem passthrough using 9p protocol. ++ */ ++ ++#include ++__FBSDID("$FreeBSD$"); ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "bhyverun.h" ++#include "pci_emul.h" ++#include "virtio.h" ++ ++#define VT9P_MAX_IOV 128 ++#define VT9P_RINGSZ 256 ++#define VT9P_MAXTAGSZ 256 ++#define VT9P_CONFIGSPACESZ (VT9P_MAXTAGSZ + sizeof(uint16_t)) ++ ++static int pci_vt9p_debug; ++#define DPRINTF(params) if (pci_vt9p_debug) printf params ++#define WPRINTF(params) printf params ++ ++/* ++ * Per-device softc ++ */ ++struct pci_vt9p_softc { ++ struct virtio_softc vsc_vs; ++ struct vqueue_info vsc_vq; ++ pthread_mutex_t vsc_mtx; ++ uint64_t vsc_cfg; ++ uint64_t vsc_features; ++ char * vsc_rootpath; ++ struct pci_vt9p_config * vsc_config; ++ struct l9p_backend * vsc_fs_backend; ++ struct l9p_server * vsc_server; ++ struct l9p_connection * vsc_conn; ++}; ++ ++struct pci_vt9p_request { ++ struct pci_vt9p_softc * vsr_sc; ++ struct iovec * vsr_iov; ++ size_t vsr_niov; ++ size_t vsr_respidx; ++ size_t vsr_iolen; ++ uint16_t vsr_idx; ++}; ++ ++struct pci_vt9p_config { ++ uint16_t tag_len; ++ char tag[0]; ++} __attribute__((packed)); ++ ++static int pci_vt9p_send(struct l9p_request *, const struct iovec *, ++ const size_t, const size_t, void *); ++static void pci_vt9p_drop(struct l9p_request *, const struct iovec *, size_t, ++ void *); ++static void pci_vt9p_reset(void *); ++static void pci_vt9p_notify(void *, struct vqueue_info *); ++static int pci_vt9p_cfgread(void *, int, int, uint32_t *); ++static void pci_vt9p_neg_features(void *, uint64_t); ++ ++static struct virtio_consts vt9p_vi_consts = { ++ "vt9p", /* our name */ ++ 1, /* we support 1 virtqueue */ ++ VT9P_CONFIGSPACESZ, /* config reg size */ ++ pci_vt9p_reset, /* reset */ ++ pci_vt9p_notify, /* device-wide qnotify */ ++ pci_vt9p_cfgread, /* read virtio config */ ++ NULL, /* write virtio config */ ++ pci_vt9p_neg_features, /* apply negotiated features */ ++ (1 << 0), /* our capabilities */ ++}; ++ ++ ++static void ++pci_vt9p_reset(void *vsc) ++{ ++ struct pci_vt9p_softc *sc; ++ ++ sc = vsc; ++ ++ DPRINTF(("vt9p: device reset requested !\n")); ++ vi_reset_dev(&sc->vsc_vs); ++} ++ ++static void ++pci_vt9p_neg_features(void *vsc, uint64_t negotiated_features) ++{ ++ struct pci_vt9p_softc *sc = vsc; ++ ++ sc->vsc_features = negotiated_features; ++} ++ ++static int ++pci_vt9p_cfgread(void *vsc, int offset, int size, uint32_t *retval) ++{ ++ struct pci_vt9p_softc *sc = vsc; ++ void *ptr; ++ ++ ptr = (uint8_t *)sc->vsc_config + offset; ++ memcpy(retval, ptr, size); ++ return (0); ++} ++ ++static int ++pci_vt9p_get_buffer(struct l9p_request *req, struct iovec *iov, size_t *niov, ++ void *arg) ++{ ++ struct pci_vt9p_request *preq = req->lr_aux; ++ size_t n = preq->vsr_niov - preq->vsr_respidx; ++ ++ memcpy(iov, preq->vsr_iov + preq->vsr_respidx, ++ n * sizeof(struct iovec)); ++ *niov = n; ++ return (0); ++} ++ ++static int ++pci_vt9p_send(struct l9p_request *req, const struct iovec *iov, ++ const size_t niov, const size_t iolen, void *arg) ++{ ++ struct pci_vt9p_request *preq = req->lr_aux; ++ struct pci_vt9p_softc *sc = preq->vsr_sc; ++ ++ preq->vsr_iolen = iolen; ++ ++ pthread_mutex_lock(&sc->vsc_mtx); ++ vq_relchain(&sc->vsc_vq, preq->vsr_idx, preq->vsr_iolen); ++ vq_endchains(&sc->vsc_vq, 1); ++ pthread_mutex_unlock(&sc->vsc_mtx); ++ free(preq); ++ return (0); ++} ++ ++static void ++pci_vt9p_drop(struct l9p_request *req, const struct iovec *iov, size_t niov, ++ void *arg) ++{ ++ struct pci_vt9p_request *preq = req->lr_aux; ++ struct pci_vt9p_softc *sc = preq->vsr_sc; ++ ++ pthread_mutex_lock(&sc->vsc_mtx); ++ vq_relchain(&sc->vsc_vq, preq->vsr_idx, 0); ++ vq_endchains(&sc->vsc_vq, 1); ++ pthread_mutex_unlock(&sc->vsc_mtx); ++ free(preq); ++} ++ ++static void ++pci_vt9p_notify(void *vsc, struct vqueue_info *vq) ++{ ++ struct iovec iov[VT9P_MAX_IOV]; ++ struct pci_vt9p_softc *sc; ++ struct pci_vt9p_request *preq; ++ uint16_t idx, n, i; ++ uint16_t flags[VT9P_MAX_IOV]; ++ ++ sc = vsc; ++ ++ while (vq_has_descs(vq)) { ++ n = vq_getchain(vq, &idx, iov, VT9P_MAX_IOV, flags); ++ preq = calloc(1, sizeof(struct pci_vt9p_request)); ++ preq->vsr_sc = sc; ++ preq->vsr_idx = idx; ++ preq->vsr_iov = iov; ++ preq->vsr_niov = n; ++ preq->vsr_respidx = 0; ++ ++ /* Count readable descriptors */ ++ for (i = 0; i < n; i++) { ++ if (flags[i] & VRING_DESC_F_WRITE) ++ break; ++ ++ preq->vsr_respidx++; ++ } ++ ++ for (int i = 0; i < n; i++) { ++ DPRINTF(("vt9p: vt9p_notify(): desc%d base=%p, " ++ "len=%zu, flags=0x%04x\r\n", i, iov[i].iov_base, ++ iov[i].iov_len, flags[i])); ++ } ++ ++ l9p_connection_recv(sc->vsc_conn, iov, preq->vsr_respidx, preq); ++ } ++} ++ ++ ++static int ++pci_vt9p_init(struct vmctx *ctx, struct pci_devinst *pi, char *opts) ++{ ++ struct pci_vt9p_softc *sc; ++ char *opt; ++ char *sharename = NULL; ++ char *rootpath = NULL; ++ int rootfd; ++ bool ro = false; ++ cap_rights_t rootcap; ++ ++ if (opts == NULL) { ++ printf("virtio-9p: share name and path required\n"); ++ return (1); ++ } ++ ++ while ((opt = strsep(&opts, ",")) != NULL) { ++ if (strchr(opt, '=') != NULL) { ++ if (sharename != NULL) { ++ printf("virtio-9p: more than one share name given\n"); ++ return (1); ++ } ++ ++ sharename = strsep(&opt, "="); ++ rootpath = opt; ++ continue; ++ } ++ ++ if (strcmp(opt, "ro") == 0) { ++ DPRINTF(("read-only mount requested\r\n")); ++ ro = true; ++ continue; ++ } ++ ++ printf("virtio-9p: invalid option '%s'\n", opt); ++ return (1); ++ } ++ ++ if (strlen(sharename) > VT9P_MAXTAGSZ) { ++ printf("virtio-9p: share name too long\n"); ++ return (1); ++ } ++ ++ rootfd = open(rootpath, O_DIRECTORY); ++ if (rootfd < 0) ++ return (-1); ++ ++ sc = calloc(1, sizeof(struct pci_vt9p_softc)); ++ sc->vsc_config = calloc(1, sizeof(struct pci_vt9p_config) + ++ VT9P_MAXTAGSZ); ++ ++ pthread_mutex_init(&sc->vsc_mtx, NULL); ++ ++ cap_rights_init(&rootcap, ++ CAP_LOOKUP, CAP_ACL_CHECK, CAP_ACL_DELETE, CAP_ACL_GET, ++ CAP_ACL_SET, CAP_READ, CAP_WRITE, CAP_SEEK, CAP_FSTAT, ++ CAP_CREATE, CAP_FCHMODAT, CAP_FCHOWNAT, CAP_FTRUNCATE, ++ CAP_LINKAT_SOURCE, CAP_LINKAT_TARGET, CAP_MKDIRAT, CAP_MKNODAT, ++ CAP_PREAD, CAP_PWRITE, CAP_RENAMEAT_SOURCE, CAP_RENAMEAT_TARGET, ++ CAP_SEEK, CAP_SYMLINKAT, CAP_UNLINKAT, CAP_EXTATTR_DELETE, ++ CAP_EXTATTR_GET, CAP_EXTATTR_LIST, CAP_EXTATTR_SET, ++ CAP_FUTIMES, CAP_FSTATFS, CAP_FSYNC, CAP_FPATHCONF); ++ ++ if (cap_rights_limit(rootfd, &rootcap) != 0) ++ return (1); ++ ++ sc->vsc_config->tag_len = (uint16_t)strlen(sharename); ++ memcpy(sc->vsc_config->tag, sharename, sc->vsc_config->tag_len); ++ ++ if (l9p_backend_fs_init(&sc->vsc_fs_backend, rootfd, ro) != 0) { ++ errno = ENXIO; ++ return (1); ++ } ++ ++ if (l9p_server_init(&sc->vsc_server, sc->vsc_fs_backend) != 0) { ++ errno = ENXIO; ++ return (1); ++ } ++ ++ if (l9p_connection_init(sc->vsc_server, &sc->vsc_conn) != 0) { ++ errno = EIO; ++ return (1); ++ } ++ ++ sc->vsc_conn->lc_msize = L9P_MAX_IOV * PAGE_SIZE; ++ sc->vsc_conn->lc_lt.lt_get_response_buffer = pci_vt9p_get_buffer; ++ sc->vsc_conn->lc_lt.lt_send_response = pci_vt9p_send; ++ sc->vsc_conn->lc_lt.lt_drop_response = pci_vt9p_drop; ++ ++ vi_softc_linkup(&sc->vsc_vs, &vt9p_vi_consts, sc, pi, &sc->vsc_vq); ++ sc->vsc_vs.vs_mtx = &sc->vsc_mtx; ++ sc->vsc_vq.vq_qsize = VT9P_RINGSZ; ++ ++ /* initialize config space */ ++ pci_set_cfgdata16(pi, PCIR_DEVICE, VIRTIO_DEV_9P); ++ pci_set_cfgdata16(pi, PCIR_VENDOR, VIRTIO_VENDOR); ++ pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_STORAGE); ++ pci_set_cfgdata16(pi, PCIR_SUBDEV_0, VIRTIO_TYPE_9P); ++ pci_set_cfgdata16(pi, PCIR_SUBVEND_0, VIRTIO_VENDOR); ++ ++ if (vi_intr_init(&sc->vsc_vs, 1, fbsdrun_virtio_msix())) ++ return (1); ++ vi_set_io_bar(&sc->vsc_vs, 0); ++ ++ return (0); ++} ++ ++struct pci_devemu pci_de_v9p = { ++ .pe_emu = "virtio-9p", ++ .pe_init = pci_vt9p_init, ++ .pe_barwrite = vi_pci_write, ++ .pe_barread = vi_pci_read ++}; ++PCI_EMUL_SET(pci_de_v9p); +--- usr.sbin/bhyve/virtio.h.orig 2021-08-20 16:20:49 UTC ++++ usr.sbin/bhyve/virtio.h +@@ -215,6 +215,7 @@ struct vring_used { + #define VIRTIO_DEV_BLOCK 0x1001 + #define VIRTIO_DEV_RANDOM 0x1005 + #define VIRTIO_DEV_CONSOLE 0x1003 ++#define VIRTIO_DEV_9P 0x1009 + + /* + * PCI config space constants. diff --git a/sysutils/bhyve+/files/freebsd-11/patch-vtd-fix b/sysutils/bhyve+/files/freebsd-11/patch-vtd-fix new file mode 100644 index 000000000000..a5f2ce648941 --- /dev/null +++ b/sysutils/bhyve+/files/freebsd-11/patch-vtd-fix @@ -0,0 +1,211 @@ +--- sys/amd64/vmm/intel/vtd.c ++++ sys/amd64/vmm/intel/vtd.c +@@ -51,6 +51,8 @@ __FBSDID("$FreeBSD$"); + * Architecture Spec, September 2008. + */ + ++#define VTD_DRHD_INCLUDE_PCI_ALL(Flags) (((Flags) >> 0) & 0x1) ++ + /* Section 10.4 "Register Descriptions" */ + struct vtdmap { + volatile uint32_t version; +@@ -116,10 +118,11 @@ struct domain { + static SLIST_HEAD(, domain) domhead; + + #define DRHD_MAX_UNITS 8 +-static int drhd_num; +-static struct vtdmap *vtdmaps[DRHD_MAX_UNITS]; +-static int max_domains; +-typedef int (*drhd_ident_func_t)(void); ++static ACPI_DMAR_HARDWARE_UNIT *drhds[DRHD_MAX_UNITS]; ++static int drhd_num; ++static struct vtdmap *vtdmaps[DRHD_MAX_UNITS]; ++static int max_domains; ++typedef int (*drhd_ident_func_t)(void); + + static uint64_t root_table[PAGE_SIZE / sizeof(uint64_t)] __aligned(4096); + static uint64_t ctx_tables[256][PAGE_SIZE / sizeof(uint64_t)] __aligned(4096); +@@ -175,6 +178,69 @@ domain_id(void) + return (id); + } + ++static struct vtdmap * ++vtd_device_scope(uint16_t rid) ++{ ++ int i, remaining, pathremaining; ++ char *end, *pathend; ++ struct vtdmap *vtdmap; ++ ACPI_DMAR_HARDWARE_UNIT *drhd; ++ ACPI_DMAR_DEVICE_SCOPE *device_scope; ++ ACPI_DMAR_PCI_PATH *path; ++ ++ for (i = 0; i < drhd_num; i++) { ++ drhd = drhds[i]; ++ ++ if (VTD_DRHD_INCLUDE_PCI_ALL(drhd->Flags)) { ++ /* ++ * From Intel VT-d arch spec, version 3.0: ++ * If a DRHD structure with INCLUDE_PCI_ALL flag Set is reported ++ * for a Segment, it must be enumerated by BIOS after all other ++ * DRHD structures for the same Segment. ++ */ ++ vtdmap = vtdmaps[i]; ++ return(vtdmap); ++ } ++ ++ end = (char *)drhd + drhd->Header.Length; ++ remaining = drhd->Header.Length - sizeof(ACPI_DMAR_HARDWARE_UNIT); ++ while (remaining > sizeof(ACPI_DMAR_DEVICE_SCOPE)) { ++ device_scope = (ACPI_DMAR_DEVICE_SCOPE *)(end - remaining); ++ remaining -= device_scope->Length; ++ ++ switch (device_scope->EntryType){ ++ /* 0x01 and 0x02 are PCI device entries */ ++ case 0x01: ++ case 0x02: ++ break; ++ default: ++ continue; ++ } ++ ++ if (PCI_RID2BUS(rid) != device_scope->Bus) ++ continue; ++ ++ pathend = (char *)device_scope + device_scope->Length; ++ pathremaining = device_scope->Length - sizeof(ACPI_DMAR_DEVICE_SCOPE); ++ while (pathremaining >= sizeof(ACPI_DMAR_PCI_PATH)) { ++ path = (ACPI_DMAR_PCI_PATH *)(pathend - pathremaining); ++ pathremaining -= sizeof(ACPI_DMAR_PCI_PATH); ++ ++ if (PCI_RID2SLOT(rid) != path->Device) ++ continue; ++ if (PCI_RID2FUNC(rid) != path->Function) ++ continue; ++ ++ vtdmap = vtdmaps[i]; ++ return (vtdmap); ++ } ++ } ++ } ++ ++ /* No matching scope */ ++ return (NULL); ++} ++ + static void + vtd_wbflush(struct vtdmap *vtdmap) + { +@@ -240,7 +306,7 @@ vtd_translation_disable(struct vtdmap *vtdmap) + static int + vtd_init(void) + { +- int i, units, remaining; ++ int i, units, remaining, tmp; + struct vtdmap *vtdmap; + vm_paddr_t ctx_paddr; + char *end, envname[32]; +@@ -291,8 +357,9 @@ vtd_init(void) + break; + + drhd = (ACPI_DMAR_HARDWARE_UNIT *)hdr; +- vtdmaps[units++] = (struct vtdmap *)PHYS_TO_DMAP(drhd->Address); +- if (units >= DRHD_MAX_UNITS) ++ drhds[units] = drhd; ++ vtdmaps[units] = (struct vtdmap *)PHYS_TO_DMAP(drhd->Address); ++ if (++units >= DRHD_MAX_UNITS) + break; + remaining -= hdr->Length; + } +@@ -302,12 +369,18 @@ vtd_init(void) + + skip_dmar: + drhd_num = units; +- vtdmap = vtdmaps[0]; + +- if (VTD_CAP_CM(vtdmap->cap) != 0) +- panic("vtd_init: invalid caching mode"); ++ max_domains = 64 * 1024; /* maximum valid value */ ++ for (i = 0; i < drhd_num; i++){ ++ vtdmap = vtdmaps[i]; ++ ++ if (VTD_CAP_CM(vtdmap->cap) != 0) ++ panic("vtd_init: invalid caching mode"); + +- max_domains = vtd_max_domains(vtdmap); ++ /* take most compatible (minimum) value */ ++ if ((tmp = vtd_max_domains(vtdmap)) < max_domains) ++ max_domains = tmp; ++ } + + /* + * Set up the root-table to point to the context-entry tables +@@ -373,7 +446,6 @@ vtd_add_device(void *arg, uint16_t rid) + struct vtdmap *vtdmap; + uint8_t bus; + +- vtdmap = vtdmaps[0]; + bus = PCI_RID2BUS(rid); + ctxp = ctx_tables[bus]; + pt_paddr = vtophys(dom->ptp); +@@ -385,6 +457,10 @@ vtd_add_device(void *arg, uint16_t rid) + (uint16_t)(ctxp[idx + 1] >> 8)); + } + ++ if ((vtdmap = vtd_device_scope(rid)) == NULL) ++ panic("vtd_add_device: device %x is not in scope for " ++ "any DMA remapping unit", rid); ++ + /* + * Order is important. The 'present' bit is set only after all fields + * of the context pointer are initialized. +@@ -568,8 +644,6 @@ vtd_create_domain(vm_paddr_t maxaddr) + if (drhd_num <= 0) + panic("vtd_create_domain: no dma remapping hardware available"); + +- vtdmap = vtdmaps[0]; +- + /* + * Calculate AGAW. + * Section 3.4.2 "Adjusted Guest Address Width", Architecture Spec. +@@ -594,7 +668,14 @@ vtd_create_domain(vm_paddr_t maxaddr) + pt_levels = 2; + sagaw = 30; + addrwidth = 0; +- tmp = VTD_CAP_SAGAW(vtdmap->cap); ++ ++ tmp = ~0; ++ for (i = 0; i < drhd_num; i++) { ++ vtdmap = vtdmaps[i]; ++ /* take most compatible value */ ++ tmp &= VTD_CAP_SAGAW(vtdmap->cap); ++ } ++ + for (i = 0; i < 5; i++) { + if ((tmp & (1 << i)) != 0 && sagaw >= agaw) + break; +@@ -606,8 +687,8 @@ vtd_create_domain(vm_paddr_t maxaddr) + } + + if (i >= 5) { +- panic("vtd_create_domain: SAGAW 0x%lx does not support AGAW %d", +- VTD_CAP_SAGAW(vtdmap->cap), agaw); ++ panic("vtd_create_domain: SAGAW 0x%x does not support AGAW %d", ++ tmp, agaw); + } + + dom = malloc(sizeof(struct domain), M_VTD, M_ZERO | M_WAITOK); +@@ -634,7 +715,12 @@ vtd_create_domain(vm_paddr_t maxaddr) + * There is not any code to deal with the demotion at the moment + * so we disable superpage mappings altogether. + */ +- dom->spsmask = VTD_CAP_SPS(vtdmap->cap); ++ dom->spsmask = ~0; ++ for (i = 0; i < drhd_num; i++) { ++ vtdmap = vtdmaps[i]; ++ /* take most compatible value */ ++ dom->spsmask &= VTD_CAP_SPS(vtdmap->cap); ++ } + #endif + + SLIST_INSERT_HEAD(&domhead, dom, next); + diff --git a/sysutils/bhyve+/files/freebsd-12/patch-virtio-9p b/sysutils/bhyve+/files/freebsd-12/patch-virtio-9p new file mode 100644 index 000000000000..6799fd986342 --- /dev/null +++ b/sysutils/bhyve+/files/freebsd-12/patch-virtio-9p @@ -0,0 +1,416 @@ +--- usr.sbin/bhyve/bhyve.8.orig 2021-08-19 22:38:50 UTC ++++ usr.sbin/bhyve/bhyve.8 +@@ -242,6 +242,8 @@ Virtio network interface. + Virtio block storage interface. + .It Li virtio-scsi + Virtio SCSI interface. ++.It Li virtio-9p ++Virtio 9p (VirtFS) interface. + .It Li virtio-rnd + Virtio RNG interface. + .It Li virtio-console +@@ -327,6 +329,19 @@ are: + .It Li iid= Ns Ar IID + Initiator ID to use when sending requests to specified CTL port. + The default value is 0. ++.El ++.Pp ++9P devices: ++.Bl -tag -width 10n ++.It Pa sharename=/path/to/share[,9p-device-options] ++.El ++.Pp ++The ++.Ar 9p-device-options ++are: ++.Bl -tag -width 10n ++.It Li ro ++Expose the share in read-only mode. + .El + .Pp + TTY devices: +--- usr.sbin/bhyve/Makefile.orig 2021-08-19 23:00:57 UTC ++++ usr.sbin/bhyve/Makefile +@@ -3,6 +3,7 @@ + # + + .include ++CFLAGS+=-I${SRCTOP}/contrib/lib9p + CFLAGS+=-I${SRCTOP}/sys + .PATH: ${SRCTOP}/sys/cam/ctl + +@@ -43,6 +44,7 @@ SRCS= \ + pci_lpc.c \ + pci_nvme.c \ + pci_passthru.c \ ++ pci_virtio_9p.c \ + pci_virtio_block.c \ + pci_virtio_console.c \ + pci_virtio_net.c \ +@@ -71,7 +73,8 @@ SRCS= \ + .PATH: ${BHYVE_SYSDIR}/sys/amd64/vmm + SRCS+= vmm_instruction_emul.c + +-LIBADD= vmmapi md pthread z util sbuf cam ++LIBADD= md pthread z util sbuf cam casper cap_pwd cap_grp ++LDADD= ../../contrib/lib9p/lib9p.so.1.1 ../../lib/libvmmapi/libvmmapi.so.5.1 + + .if ${MK_INET_SUPPORT} != "no" + CFLAGS+=-DINET +--- usr.sbin/bhyve/pci_virtio_9p.c.orig 2021-08-19 22:44:10 UTC ++++ usr.sbin/bhyve/pci_virtio_9p.c +@@ -0,0 +1,344 @@ ++/*- ++ * Copyright (c) 2015 iXsystems Inc. ++ * Copyright (c) 2017-2018 Jakub Klama ++ * All rights reserved. ++ * ++ * Redistribution and use in source and binary forms, with or without ++ * modification, are permitted provided that the following conditions ++ * are met: ++ * 1. Redistributions of source code must retain the above copyright ++ * notice, this list of conditions and the following disclaimer ++ * in this position and unchanged. ++ * 2. Redistributions in binary form must reproduce the above copyright ++ * notice, this list of conditions and the following disclaimer in the ++ * documentation and/or other materials provided with the distribution. ++ * ++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ++ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ++ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ++ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE ++ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL ++ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS ++ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ++ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT ++ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY ++ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ++ * SUCH DAMAGE. ++ */ ++ ++/* ++ * VirtIO filesystem passthrough using 9p protocol. ++ */ ++ ++#include ++__FBSDID("$FreeBSD$"); ++ ++#include ++#include ++#include ++#include ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++#include ++#include ++ ++#include "bhyverun.h" ++#include "pci_emul.h" ++#include "virtio.h" ++ ++#define VT9P_MAX_IOV 128 ++#define VT9P_RINGSZ 256 ++#define VT9P_MAXTAGSZ 256 ++#define VT9P_CONFIGSPACESZ (VT9P_MAXTAGSZ + sizeof(uint16_t)) ++ ++static int pci_vt9p_debug; ++#define DPRINTF(params) if (pci_vt9p_debug) printf params ++#define WPRINTF(params) printf params ++ ++/* ++ * Per-device softc ++ */ ++struct pci_vt9p_softc { ++ struct virtio_softc vsc_vs; ++ struct vqueue_info vsc_vq; ++ pthread_mutex_t vsc_mtx; *** 586 LINES SKIPPED ***