summaryrefslogtreecommitdiffstats
path: root/usr.sbin
diff options
context:
space:
mode:
authormarcel <marcel@FreeBSD.org>2015-10-08 02:28:22 +0000
committermarcel <marcel@FreeBSD.org>2015-10-08 02:28:22 +0000
commita8226abc82f8a674d035c648f0e59efb80c259f4 (patch)
treecc99a3e538993ea68a90ed8393410139031c93a2 /usr.sbin
parent3cab7edfb2189584bee4dcc9949573aaaa5f9861 (diff)
downloadFreeBSD-src-a8226abc82f8a674d035c648f0e59efb80c259f4.zip
FreeBSD-src-a8226abc82f8a674d035c648f0e59efb80c259f4.tar.gz
Add option -l for specifying which OS loader to dlopen(3). By default
this is /boot/userboot.so. This option allows for the development and use of other OS loaders.
Diffstat (limited to 'usr.sbin')
-rw-r--r--usr.sbin/bhyveload/bhyveload.817
-rw-r--r--usr.sbin/bhyveload/bhyveload.c39
2 files changed, 45 insertions, 11 deletions
diff --git a/usr.sbin/bhyveload/bhyveload.8 b/usr.sbin/bhyveload/bhyveload.8
index 6fa1d36..918e1f0 100644
--- a/usr.sbin/bhyveload/bhyveload.8
+++ b/usr.sbin/bhyveload/bhyveload.8
@@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
-.Dd January 7, 2012
+.Dd October 7, 2015
.Dt BHYVELOAD 8
.Os
.Sh NAME
@@ -40,6 +40,7 @@ guest inside a bhyve virtual machine
.Op Fl d Ar disk-path
.Op Fl e Ar name=value
.Op Fl h Ar host-path
+.Op Fl l Ar os-loader
.Op Fl m Ar mem-size
.Ar vmname
.Sh DESCRIPTION
@@ -56,6 +57,7 @@ is based on
and will present an interface identical to the
.Fx
loader on the user's terminal.
+This behavior can be changed by specifying a different OS loader.
.Pp
The virtual machine is identified as
.Ar vmname
@@ -78,7 +80,9 @@ The
.Ar disk-path
is the pathname of the guest's boot disk image.
.It Fl e Ar name=value
-Set the FreeBSD loader environment variable
+Set the
+.Fx
+loader environment variable
.Ar name
to
.Ar value .
@@ -89,6 +93,15 @@ variable.
The
.Ar host-path
is the directory at the top of the guest's boot filesystem.
+.It Fl l Ar os-loader
+Specify a different OS loader.
+By default
+.Nm
+will use
+.Pa /boot/userboot.so ,
+which presents a standard
+.Fx
+loader.
.It Fl m Ar mem-size Xo
.Sm off
.Op Cm K | k | M | m | G | g | T | t
diff --git a/usr.sbin/bhyveload/bhyveload.c b/usr.sbin/bhyveload/bhyveload.c
index 8178bb2..badf5f4 100644
--- a/usr.sbin/bhyveload/bhyveload.c
+++ b/usr.sbin/bhyveload/bhyveload.c
@@ -639,6 +639,7 @@ usage(void)
int
main(int argc, char** argv)
{
+ char *loader;
void *h;
void (*func)(struct loader_callbacks *, void *, int, int);
uint64_t mem_size;
@@ -646,13 +647,15 @@ main(int argc, char** argv)
progname = basename(argv[0]);
+ loader = NULL;
+
memflags = 0;
mem_size = 256 * MB;
consin_fd = STDIN_FILENO;
consout_fd = STDOUT_FILENO;
- while ((opt = getopt(argc, argv, "Sc:d:e:h:m:")) != -1) {
+ while ((opt = getopt(argc, argv, "Sc:d:e:h:l:m:")) != -1) {
switch (opt) {
case 'c':
error = altcons_open(optarg);
@@ -674,6 +677,14 @@ main(int argc, char** argv)
host_base = optarg;
break;
+ case 'l':
+ if (loader != NULL)
+ errx(EX_USAGE, "-l can only be given once");
+ loader = strdup(optarg);
+ if (loader == NULL)
+ err(EX_OSERR, "malloc");
+ break;
+
case 'm':
error = vm_parse_memsize(optarg, &mem_size);
if (error != 0)
@@ -726,26 +737,36 @@ main(int argc, char** argv)
exit(1);
}
- tcgetattr(consout_fd, &term);
- oldterm = term;
- cfmakeraw(&term);
- term.c_cflag |= CLOCAL;
-
- tcsetattr(consout_fd, TCSAFLUSH, &term);
-
- h = dlopen("/boot/userboot.so", RTLD_LOCAL);
+ if (loader == NULL) {
+ loader = strdup("/boot/userboot.so");
+ if (loader == NULL)
+ err(EX_OSERR, "malloc");
+ }
+ h = dlopen(loader, RTLD_LOCAL);
if (!h) {
printf("%s\n", dlerror());
+ free(loader);
return (1);
}
func = dlsym(h, "loader_main");
if (!func) {
printf("%s\n", dlerror());
+ free(loader);
return (1);
}
+ tcgetattr(consout_fd, &term);
+ oldterm = term;
+ cfmakeraw(&term);
+ term.c_cflag |= CLOCAL;
+
+ tcsetattr(consout_fd, TCSAFLUSH, &term);
+
addenv("smbios.bios.vendor=BHYVE");
addenv("boot_serial=1");
func(&cb, NULL, USERBOOT_VERSION_3, ndisks);
+
+ free(loader);
+ return (0);
}
OpenPOWER on IntegriCloud