summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorneel <neel@FreeBSD.org>2013-10-17 00:28:35 +0000
committerneel <neel@FreeBSD.org>2013-10-17 00:28:35 +0000
commit24a03e33cfed07a0a177ec644b81666406a76ce3 (patch)
tree58758e4bee94ba049066782ce69d754fa2cf137d
parentc39edfbbf86784a5c5ddca4f4b1599f8e39313f0 (diff)
downloadFreeBSD-src-24a03e33cfed07a0a177ec644b81666406a76ce3.zip
FreeBSD-src-24a03e33cfed07a0a177ec644b81666406a76ce3.tar.gz
Add an option to bhyveload(8) that allows setting a loader environment variable
from the command line. The option syntax is "-e <name=value>". It may be used multiple times to set multiple environment variables. Reviewed by: grehan Requested by: alfred
-rwxr-xr-xshare/examples/bhyve/vmrun.sh11
-rw-r--r--usr.sbin/bhyveload/bhyveload.89
-rw-r--r--usr.sbin/bhyveload/bhyveload.c55
3 files changed, 56 insertions, 19 deletions
diff --git a/share/examples/bhyve/vmrun.sh b/share/examples/bhyve/vmrun.sh
index 2e1bb38..edb6048 100755
--- a/share/examples/bhyve/vmrun.sh
+++ b/share/examples/bhyve/vmrun.sh
@@ -39,11 +39,12 @@ DEFAULT_VIRTIO_DISK="./diskdev"
DEFAULT_ISOFILE="./release.iso"
usage() {
- echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-I <location of installation iso>][-t <tapdev>] <vmname>"
+ echo "Usage: vmrun.sh [-hai][-g <gdbport>][-m <memsize>][-d <disk file>][-e <name=value>][-I <location of installation iso>][-t <tapdev>] <vmname>"
echo " -h: display this help message"
echo " -a: force memory mapped local apic access"
echo " -c: number of virtual cpus (default is ${DEFAULT_CPUS})"
echo " -d: virtio diskdev file (default is ${DEFAULT_VIRTIO_DISK})"
+ echo " -e: set FreeBSD loader environment variable"
echo " -g: listen for connection from kgdb at <gdbport>"
echo " -i: force boot of the Installation CDROM image"
echo " -I: Installation CDROM image location (default is ${DEFAULT_ISOFILE})"
@@ -73,8 +74,9 @@ virtio_diskdev=${DEFAULT_VIRTIO_DISK}
tapdev=${DEFAULT_TAPDEV}
apic_opt=""
gdbport=0
+env_opt=""
-while getopts haic:g:I:m:d:t: c ; do
+while getopts haic:e:g:I:m:d:t: c ; do
case $c in
h)
usage
@@ -85,6 +87,9 @@ while getopts haic:g:I:m:d:t: c ; do
d)
virtio_diskdev=${OPTARG}
;;
+ e)
+ env_opt="${env_opt} -e ${OPTARG}"
+ ;;
g) gdbport=${OPTARG}
;;
i)
@@ -163,7 +168,7 @@ while [ 1 ]; do
installer_opt=""
fi
- ${LOADER} -m ${memsize} -d ${BOOTDISK} ${vmname}
+ ${LOADER} -m ${memsize} -d ${BOOTDISK} ${env_opt} ${vmname}
if [ $? -ne 0 ]; then
break
fi
diff --git a/usr.sbin/bhyveload/bhyveload.8 b/usr.sbin/bhyveload/bhyveload.8
index 2efcad0..00ce362 100644
--- a/usr.sbin/bhyveload/bhyveload.8
+++ b/usr.sbin/bhyveload/bhyveload.8
@@ -38,6 +38,7 @@ guest inside a bhyve virtual machine
.Op Fl m Ar mem-size
.Op Fl d Ar disk-path
.Op Fl h Ar host-path
+.Op Fl e Ar name=value
.Ar vmname
.Sh DESCRIPTION
.Nm
@@ -91,6 +92,14 @@ is the pathname of the guest's boot disk image.
The
.Ar host-path
is the directory at the top of the guest's boot filesystem.
+.It Fl e Ar name=value
+Set the FreeBSD loader environment variable
+.Ar name
+to
+.Ar value .
+.Pp
+The option may be used more than once to set more than one environment
+variable.
.El
.Sh EXAMPLES
To create a virtual machine named
diff --git a/usr.sbin/bhyveload/bhyveload.c b/usr.sbin/bhyveload/bhyveload.c
index 6e541e8..4ce3df4 100644
--- a/usr.sbin/bhyveload/bhyveload.c
+++ b/usr.sbin/bhyveload/bhyveload.c
@@ -60,6 +60,7 @@ __FBSDID("$FreeBSD$");
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/disk.h>
+#include <sys/queue.h>
#include <machine/specialreg.h>
#include <machine/vmm.h>
@@ -498,23 +499,37 @@ cb_getmem(void *arg, uint64_t *ret_lowmem, uint64_t *ret_highmem)
vm_get_memory_seg(ctx, 4 * GB, ret_highmem, NULL);
}
-static const char *
-cb_getenv(void *arg, int num)
+struct env {
+ const char *str; /* name=value */
+ SLIST_ENTRY(env) next;
+};
+
+static SLIST_HEAD(envhead, env) envhead;
+
+static void
+addenv(const char *str)
{
- int max;
+ struct env *env;
- static const char * var[] = {
- "smbios.bios.vendor=BHYVE",
- "boot_serial=1",
- NULL
- };
+ env = malloc(sizeof(struct env));
+ env->str = str;
+ SLIST_INSERT_HEAD(&envhead, env, next);
+}
- max = sizeof(var) / sizeof(var[0]);
+static const char *
+cb_getenv(void *arg, int num)
+{
+ int i;
+ struct env *env;
+
+ i = 0;
+ SLIST_FOREACH(env, &envhead, next) {
+ if (i == num)
+ return (env->str);
+ i++;
+ }
- if (num < max)
- return (var[num]);
- else
- return (NULL);
+ return (NULL);
}
static struct loader_callbacks cb = {
@@ -553,8 +568,8 @@ usage(void)
{
fprintf(stderr,
- "usage: %s [-m mem-size][-d <disk-path>] [-h <host-path>] "
- "<vmname>\n", progname);
+ "usage: %s [-m mem-size][-d <disk-path>] [-h <host-path>] "
+ "[-e <name=value>] <vmname>\n", progname);
exit(1);
}
@@ -572,12 +587,16 @@ main(int argc, char** argv)
mem_size = 256 * MB;
disk_image = NULL;
- while ((opt = getopt(argc, argv, "d:h:m:")) != -1) {
+ while ((opt = getopt(argc, argv, "d:e:h:m:")) != -1) {
switch (opt) {
case 'd':
disk_image = optarg;
break;
+ case 'e':
+ addenv(optarg);
+ break;
+
case 'h':
host_base = optarg;
break;
@@ -638,5 +657,9 @@ main(int argc, char** argv)
if (disk_image) {
disk_fd = open(disk_image, O_RDONLY);
}
+
+ addenv("smbios.bios.vendor=BHYVE");
+ addenv("boot_serial=1");
+
func(&cb, NULL, USERBOOT_VERSION_3, disk_fd >= 0);
}
OpenPOWER on IntegriCloud