Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107112991
D39285.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
5 KB
Referenced Files
None
Subscribers
None
D39285.diff
View Options
diff --git a/usr.sbin/bhyve/bhyve.8 b/usr.sbin/bhyve/bhyve.8
--- a/usr.sbin/bhyve/bhyve.8
+++ b/usr.sbin/bhyve/bhyve.8
@@ -494,6 +494,12 @@
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:
@@ -511,6 +517,12 @@
.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:
@@ -608,6 +620,12 @@
.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.h b/usr.sbin/bhyve/block_if.h
--- a/usr.sbin/bhyve/block_if.h
+++ b/usr.sbin/bhyve/block_if.h
@@ -62,11 +62,13 @@
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/block_if.c b/usr.sbin/bhyve/block_if.c
--- a/usr.sbin/bhyve/block_if.c
+++ b/usr.sbin/bhyve/block_if.c
@@ -122,6 +122,7 @@
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;
@@ -466,12 +467,22 @@
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;
@@ -480,6 +491,7 @@
int extra, fd, i, sectsz;
int ro, candelete, geom, ssopt, pssopt;
int nodelete;
+ int bootindex;
#ifndef WITHOUT_CAPSICUM
cap_rights_t rights;
@@ -493,6 +505,7 @@
ssopt = 0;
ro = 0;
nodelete = 0;
+ bootindex = -1;
if (get_config_bool_node_default(nvl, "nocache", false))
extra |= O_DIRECT;
@@ -525,6 +538,11 @@
}
}
+ 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.");
@@ -644,6 +662,7 @@
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/pci_ahci.c b/usr.sbin/bhyve/pci_ahci.c
--- a/usr.sbin/bhyve/pci_ahci.c
+++ b/usr.sbin/bhyve/pci_ahci.c
@@ -2477,6 +2477,13 @@
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
--- a/usr.sbin/bhyve/pci_nvme.c
+++ b/usr.sbin/bhyve/pci_nvme.c
@@ -3159,6 +3159,14 @@
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
--- a/usr.sbin/bhyve/pci_virtio_block.c
+++ b/usr.sbin/bhyve/pci_virtio_block.c
@@ -471,6 +471,11 @@
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
--- a/usr.sbin/bhyve/pci_virtio_scsi.c
+++ b/usr.sbin/bhyve/pci_virtio_scsi.c
@@ -709,6 +709,15 @@
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";
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Sat, Jan 11, 7:41 AM (18 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15751846
Default Alt Text
D39285.diff (5 KB)
Attached To
Mode
D39285: bhyve: add bootindex option for several devices
Attached
Detach File
Event Timeline
Log In to Comment