From nobody Fri Aug 18 07:53:45 2023 X-Original-To: dev-commits-src-branches@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 4RRvJV4D3kz4qrvC; Fri, 18 Aug 2023 07:53:46 +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 4RRvJT68LKz3L5n; Fri, 18 Aug 2023 07:53:45 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692345225; 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=Z0bQxW15LyhH8BatU4BaA3TfQKU5kQilUFdsx79YUBk=; b=WSB5esJOLoFbay6c75NeeS/FbZPQ8Pzk5K+UfWdS1n6A2G5qP+6XIZGmSCPVVPaW7SO+oL zDuAcLybTJnpWTOootKB9T4RAgfRWWPMFsfajRQD+vZNlVPnEuqrnaJUVpe8PAzJnrPzqv aCrokSXkvDFc3XyaZtikl0l4mJLSKCa6z5vzrrjEHL7f+fxXmykcVOWaZI3RiYNJmmGXYT gkwQbF+Seu7atIKljpvBs1m8r965o8SG1rASq7+miPMlhaLo0tVycKJYA0bd2xnKk5PUSL CanX219wNUDu9l1mwBoZ3n1/Wvt16k0N+MCGxC05PloW05bVtCuCGGNU00LCYA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1692345225; 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=Z0bQxW15LyhH8BatU4BaA3TfQKU5kQilUFdsx79YUBk=; b=CHwAXZshSDqowIB4R8hZAYV9vTjy8ZDDsGp764Cc9BwqZ0zCX0ALiafQVuB51jAC0rGu8n 1pwRdjXW2R4X3aCW/6hvlnQPxLd9Piydnq31PwPSocz9s3ClP5HdAlaHR6ee4mrjZsyxtL wBnKEWpBLTkWXQVJA4KFpB+ZqDGoPzrqGIUf31Txlkxx7B0EvU0thIOVJuRVkuWXzqKrPq N2gvGV20U2s85OtlCcIksMh+CYG80DY/FmSeoNURkNEr0AGCPzlZv0rUCcnoEadHkY3TBm uKNJ/pab6HmfcPbbJGQ36PKOy5bAHLtk08ylDLZPA/by7V664bvhTJdRYMg8Fg== ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1692345225; a=rsa-sha256; cv=none; b=ypIo5k+DTLPQAdvMSMMeMcLq+U8PZ3HQIcqEpVz8s8kA7s3xzpT24ScyLuv4hJsB35vTWy WB945uA8y5AOnaDzXWFr47aqRiXNiHRYKfK5W2ASO/rPmX63h3nZehpZDSsCFGH/Fg8AcW Ab7xJBhsIxjUvjF/mFwQ514fvkBymq0yS8dx6yJQ7X2jsnujrcjrWgP+IOXOyhlMhSWrYf 2v+j72PIHoIrJN623N/m6VIP+wd1cL6QaVec/Co8e9b1F9MvVXRcxwHnOESPJVeSrDlR2M AvW22vOCuHnxmbiDdzmtLkCGsuNuEh0Y3mZ1OWg6Lo1J5vg5Q/fw1nx6Q5xAIw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none 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 4RRvJT4w6Xz17Sr; Fri, 18 Aug 2023 07:53:45 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 37I7rjnk083812; Fri, 18 Aug 2023 07:53:45 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 37I7rjaX083809; Fri, 18 Aug 2023 07:53:45 GMT (envelope-from git) Date: Fri, 18 Aug 2023 07:53:45 GMT Message-Id: <202308180753.37I7rjaX083809@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Corvin =?utf-8?Q?K=C3=B6hne?= Subject: git: b02e0f964028 - stable/13 - bhyve: add bootindex option for several devices List-Id: Commits to the stable branches of the FreeBSD src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-branches List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-branches@freebsd.org X-BeenThere: dev-commits-src-branches@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/stable/13 X-Git-Reftype: branch X-Git-Commit: b02e0f96402830405c0812dc26b7492d487f795b Auto-Submitted: auto-generated The branch stable/13 has been updated by corvink: URL: https://cgit.FreeBSD.org/src/commit/?id=b02e0f96402830405c0812dc26b7492d487f795b commit b02e0f96402830405c0812dc26b7492d487f795b Author: Corvin Köhne AuthorDate: 2021-08-16 07:50:15 +0000 Commit: Corvin Köhne CommitDate: 2023-08-18 07:52:10 +0000 bhyve: add bootindex option for several devices The bootindex option creates an entry in the "bootorder" fwcfg file. This file can be picked up by the guest firmware to determine the bootorder. Nevertheless, it's not guaranteed that the guest firmware uses the bootorder. At the moment, our OVMF ignores the bootorder. This will change in the future. If guest firmware supports the "bootorder" fwcfg file and no device uses the bootindex option, the boot order is determined by the firmware itself. If one or more devices specify a bootindex, the first bootable device with the lowest bootindex will be booted. It's not garanteed that devices without a bootindex will be recognized as bootable from the firmware in that case. Reviewed by: jhb MFC after: 1 week Sponsored by: Beckhoff Automation GmbH & Co. KG Differential Revision: https://reviews.freebsd.org/D39285 (cherry picked from commit 480bef9481f0c44b19ac4b2adb09f6c3191acd41) --- usr.sbin/bhyve/bhyve.8 | 18 ++++++++++++++++++ usr.sbin/bhyve/block_if.c | 21 ++++++++++++++++++++- usr.sbin/bhyve/block_if.h | 2 ++ usr.sbin/bhyve/pci_ahci.c | 7 +++++++ usr.sbin/bhyve/pci_nvme.c | 8 ++++++++ usr.sbin/bhyve/pci_virtio_block.c | 5 +++++ usr.sbin/bhyve/pci_virtio_scsi.c | 9 +++++++++ 7 files changed, 69 insertions(+), 1 deletion(-) diff --git a/usr.sbin/bhyve/bhyve.8 b/usr.sbin/bhyve/bhyve.8 index b764807c7980..819d2bb0ef81 100644 --- a/usr.sbin/bhyve/bhyve.8 +++ b/usr.sbin/bhyve/bhyve.8 @@ -482,6 +482,12 @@ if not explicitly specified. Disable emulation of guest trim requests via .Dv DIOCGDELETE requests. +.It Li bootindex= Ns Ar index +Add the device to the bootorder at +.Ar index . +A fwcfg file is used to specify the bootorder. +The guest firmware may ignore or doesn't support this fwcfg file. +In that case, this feature doesn't work as expected. .El .Pp SCSI device backends: @@ -499,6 +505,12 @@ are: .It Cm iid= Ns Ar IID Initiator ID to use when sending requests to specified CTL port. The default value is 0. +.It Li bootindex= Ns Ar index +Add the device to the bootorder at +.Ar index . +A fwcfg file is used to specify the bootorder. +The guest firmware may ignore or doesn't support this fwcfg file. +In that case, this feature doesn't work as expected. .El .Pp 9P device backends: @@ -596,6 +608,12 @@ Add .Ar romfile as option ROM to the PCI device. The ROM will be loaded by firmware and should be capable of initializing the device. +.It Li bootindex= Ns Ar index +Add the device to the bootorder at +.Ar index . +A fwcfg file is used to specify the bootorder. +The guest firmware may ignore or doesn't support this fwcfg file. +In that case, this feature doesn't work as expected. .El .Pp Guest memory must be wired using the diff --git a/usr.sbin/bhyve/block_if.c b/usr.sbin/bhyve/block_if.c index 187a5ac55e09..8846c6032539 100644 --- a/usr.sbin/bhyve/block_if.c +++ b/usr.sbin/bhyve/block_if.c @@ -122,6 +122,7 @@ struct blockif_ctxt { TAILQ_HEAD(, blockif_elem) bc_pendq; TAILQ_HEAD(, blockif_elem) bc_busyq; struct blockif_elem bc_reqs[BLOCKIF_MAXREQ]; + int bc_bootindex; }; static pthread_once_t blockif_once = PTHREAD_ONCE_INIT; @@ -453,12 +454,22 @@ blockif_legacy_config(nvlist_t *nvl, const char *opts) return (pci_parse_legacy_config(nvl, cp + 1)); } +int +blockif_add_boot_device(struct pci_devinst *const pi, + struct blockif_ctxt *const bc) +{ + if (bc->bc_bootindex < 0) + return (0); + + return (pci_emul_add_boot_device(pi, bc->bc_bootindex)); +} + struct blockif_ctxt * blockif_open(nvlist_t *nvl, const char *ident) { char tname[MAXCOMLEN + 1]; char name[MAXPATHLEN]; - const char *path, *pssval, *ssval; + const char *path, *pssval, *ssval, *bootindex_val; char *cp; struct blockif_ctxt *bc; struct stat sbuf; @@ -467,6 +478,7 @@ blockif_open(nvlist_t *nvl, const char *ident) int extra, fd, i, sectsz; int ro, candelete, geom, ssopt, pssopt; int nodelete; + int bootindex; #ifndef WITHOUT_CAPSICUM cap_rights_t rights; @@ -480,6 +492,7 @@ blockif_open(nvlist_t *nvl, const char *ident) ssopt = 0; ro = 0; nodelete = 0; + bootindex = -1; if (get_config_bool_node_default(nvl, "nocache", false)) extra |= O_DIRECT; @@ -512,6 +525,11 @@ blockif_open(nvlist_t *nvl, const char *ident) } } + bootindex_val = get_config_value_node(nvl, "bootindex"); + if (bootindex_val != NULL) { + bootindex = atoi(bootindex_val); + } + path = get_config_value_node(nvl, "path"); if (path == NULL) { EPRINTLN("Missing \"path\" for block device."); @@ -628,6 +646,7 @@ blockif_open(nvlist_t *nvl, const char *ident) TAILQ_INIT(&bc->bc_freeq); TAILQ_INIT(&bc->bc_pendq); TAILQ_INIT(&bc->bc_busyq); + bc->bc_bootindex = bootindex; for (i = 0; i < BLOCKIF_MAXREQ; i++) { bc->bc_reqs[i].be_status = BST_FREE; TAILQ_INSERT_HEAD(&bc->bc_freeq, &bc->bc_reqs[i], be_link); diff --git a/usr.sbin/bhyve/block_if.h b/usr.sbin/bhyve/block_if.h index b36d0c367890..52ebd8634b8e 100644 --- a/usr.sbin/bhyve/block_if.h +++ b/usr.sbin/bhyve/block_if.h @@ -62,11 +62,13 @@ struct blockif_req { struct iovec br_iov[BLOCKIF_IOV_MAX]; }; +struct pci_devinst; struct blockif_ctxt; typedef void blockif_resize_cb(struct blockif_ctxt *, void *, size_t); int blockif_legacy_config(nvlist_t *nvl, const char *opts); +int blockif_add_boot_device(struct pci_devinst *const pi, struct blockif_ctxt *const bc); struct blockif_ctxt *blockif_open(nvlist_t *nvl, const char *ident); int blockif_register_resize_callback(struct blockif_ctxt *bc, blockif_resize_cb *cb, void *cb_arg); diff --git a/usr.sbin/bhyve/pci_ahci.c b/usr.sbin/bhyve/pci_ahci.c index a263eae6ad49..90fcf2449b9d 100644 --- a/usr.sbin/bhyve/pci_ahci.c +++ b/usr.sbin/bhyve/pci_ahci.c @@ -2476,6 +2476,13 @@ pci_ahci_init(struct pci_devinst *pi, nvlist_t *nvl) ret = 1; goto open_fail; } + + ret = blockif_add_boot_device(pi, bctxt); + if (ret) { + sc->ports = p; + goto open_fail; + } + sc->port[p].bctx = bctxt; sc->port[p].pr_sc = sc; sc->port[p].port = p; diff --git a/usr.sbin/bhyve/pci_nvme.c b/usr.sbin/bhyve/pci_nvme.c index 4ff5243262fa..b446bc266716 100644 --- a/usr.sbin/bhyve/pci_nvme.c +++ b/usr.sbin/bhyve/pci_nvme.c @@ -3211,6 +3211,14 @@ pci_nvme_parse_config(struct pci_nvme_softc *sc, nvlist_t *nvl) sc->dataset_management = NVME_DATASET_MANAGEMENT_DISABLE; } + value = get_config_value_node(nvl, "bootindex"); + if (value != NULL) { + if (pci_emul_add_boot_device(sc->nsc_pi, atoi(value))) { + EPRINTLN("Invalid bootindex %d", atoi(value)); + return (-1); + } + } + value = get_config_value_node(nvl, "ram"); if (value != NULL) { uint64_t sz = strtoull(value, NULL, 10); diff --git a/usr.sbin/bhyve/pci_virtio_block.c b/usr.sbin/bhyve/pci_virtio_block.c index 9fd6db41dba8..c8ec62a66793 100644 --- a/usr.sbin/bhyve/pci_virtio_block.c +++ b/usr.sbin/bhyve/pci_virtio_block.c @@ -471,6 +471,11 @@ pci_vtblk_init(struct pci_devinst *pi, nvlist_t *nvl) return (1); } + if (blockif_add_boot_device(pi, bctxt)) { + perror("Invalid boot device"); + return (1); + } + size = blockif_size(bctxt); sectsz = blockif_sectsz(bctxt); blockif_psectsz(bctxt, &sts, &sto); diff --git a/usr.sbin/bhyve/pci_virtio_scsi.c b/usr.sbin/bhyve/pci_virtio_scsi.c index f5728c5c53c2..d9ad1382f0c5 100644 --- a/usr.sbin/bhyve/pci_virtio_scsi.c +++ b/usr.sbin/bhyve/pci_virtio_scsi.c @@ -707,6 +707,15 @@ pci_vtscsi_init(struct pci_devinst *pi, nvlist_t *nvl) if (value != NULL) sc->vss_iid = strtoul(value, NULL, 10); + value = get_config_value_node(nvl, "bootindex"); + if (value != NULL) { + if (pci_emul_add_boot_device(pi, atoi(value))) { + EPRINTLN("Invalid bootindex %d", atoi(value)); + free(sc); + return (-1); + } + } + devname = get_config_value_node(nvl, "dev"); if (devname == NULL) devname = "/dev/cam/ctl";