Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Oct 2013 00:28:35 +0000 (UTC)
From:      Neel Natu <neel@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r256657 - in head: share/examples/bhyve usr.sbin/bhyveload
Message-ID:  <201310170028.r9H0SZot084541@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: neel
Date: Thu Oct 17 00:28:35 2013
New Revision: 256657
URL: http://svnweb.freebsd.org/changeset/base/256657

Log:
  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

Modified:
  head/share/examples/bhyve/vmrun.sh
  head/usr.sbin/bhyveload/bhyveload.8
  head/usr.sbin/bhyveload/bhyveload.c

Modified: head/share/examples/bhyve/vmrun.sh
==============================================================================
--- head/share/examples/bhyve/vmrun.sh	Thu Oct 17 00:07:21 2013	(r256656)
+++ head/share/examples/bhyve/vmrun.sh	Thu Oct 17 00:28:35 2013	(r256657)
@@ -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

Modified: head/usr.sbin/bhyveload/bhyveload.8
==============================================================================
--- head/usr.sbin/bhyveload/bhyveload.8	Thu Oct 17 00:07:21 2013	(r256656)
+++ head/usr.sbin/bhyveload/bhyveload.8	Thu Oct 17 00:28:35 2013	(r256657)
@@ -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
 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

Modified: head/usr.sbin/bhyveload/bhyveload.c
==============================================================================
--- head/usr.sbin/bhyveload/bhyveload.c	Thu Oct 17 00:07:21 2013	(r256656)
+++ head/usr.sbin/bhyveload/bhyveload.c	Thu Oct 17 00:28:35 2013	(r256657)
@@ -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_lowme
 	vm_get_memory_seg(ctx, 4 * GB, ret_highmem, NULL);
 }
 
+struct env {
+	const char *str;	/* name=value */
+	SLIST_ENTRY(env) next;
+};
+
+static SLIST_HEAD(envhead, env) envhead;
+
+static void
+addenv(const char *str)
+{
+	struct env *env;
+
+	env = malloc(sizeof(struct env));
+	env->str = str;
+	SLIST_INSERT_HEAD(&envhead, env, next);
+}
+
 static const char *
 cb_getenv(void *arg, int num)
 {
-	int max;
+	int i;
+	struct env *env;
 
-	static const char * var[] = {
-		"smbios.bios.vendor=BHYVE",
-		"boot_serial=1",
-		NULL
-	};
-
-	max = sizeof(var) / sizeof(var[0]);
+	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);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310170028.r9H0SZot084541>