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);
 }
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to