aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--stand/userboot/userboot.h12
-rw-r--r--stand/userboot/userboot/main.c2
-rw-r--r--usr.sbin/bhyveload/bhyveload.c23
3 files changed, 32 insertions, 5 deletions
diff --git a/stand/userboot/userboot.h b/stand/userboot/userboot.h
index 34e8cb1d4bb2..1204f5e87f6f 100644
--- a/stand/userboot/userboot.h
+++ b/stand/userboot/userboot.h
@@ -47,6 +47,13 @@
#define USERBOOT_VERSION_5 5
/*
+ * Version 6 added a callback for indicating that the guest
+ * is OK with the existing interpreter, so the host can close associated
+ * resources. The callback structure is still backward compatible.
+ */
+#define USERBOOT_VERSION_6 6
+
+/*
* Exit codes from the loader
*/
#define USERBOOT_EXIT_QUIT 1
@@ -225,4 +232,9 @@ struct loader_callbacks {
* Version 5 addition.
*/
void (*swap_interpreter)(void *arg, const char *interp);
+
+ /*
+ * Version 6 addition.
+ */
+ void (*accept_interpreter)(void *arg);
};
diff --git a/stand/userboot/userboot/main.c b/stand/userboot/userboot/main.c
index b518e18020f8..985933bf51e9 100644
--- a/stand/userboot/userboot/main.c
+++ b/stand/userboot/userboot/main.c
@@ -217,6 +217,8 @@ loader_main(struct loader_callbacks *cb, void *arg, int version, int ndisks)
*/
if (version >= USERBOOT_VERSION_5)
check_interpreter();
+ if (version >= USERBOOT_VERSION_6)
+ CALLBACK(accept_interpreter);
if (setjmp(jb))
return;
diff --git a/usr.sbin/bhyveload/bhyveload.c b/usr.sbin/bhyveload/bhyveload.c
index 3f29d642461d..ebc6f9618691 100644
--- a/usr.sbin/bhyveload/bhyveload.c
+++ b/usr.sbin/bhyveload/bhyveload.c
@@ -102,6 +102,7 @@ enum {
static struct termios term, oldterm;
static int disk_fd[NDISKS];
static int ndisks;
+static int bootfd = -1;
static int consin_fd, consout_fd;
static int hostbase_fd = -1;
@@ -652,6 +653,16 @@ cb_swap_interpreter(void *arg __unused, const char *interp_req)
longjmp(jb, JMP_SWAPLOADER);
}
+static void
+cb_accept_interpreter(void *arg __unused)
+{
+ if (bootfd == -1)
+ return;
+
+ close(bootfd);
+ bootfd = -1;
+}
+
static struct loader_callbacks cb = {
.getc = cb_getc,
.putc = cb_putc,
@@ -689,6 +700,9 @@ static struct loader_callbacks cb = {
/* Version 5 additions */
.swap_interpreter = cb_swap_interpreter,
+
+ /* Version 6 additions */
+ .accept_interpreter = cb_accept_interpreter,
};
static int
@@ -790,7 +804,7 @@ hostbase_open(const char *base)
}
static void
-loader_open(int bootfd)
+loader_open(void)
{
int fd;
@@ -820,9 +834,8 @@ main(int argc, char** argv)
{
void (*func)(struct loader_callbacks *, void *, int, int);
uint64_t mem_size;
- int bootfd, opt, error, memflags, need_reinit;
+ int opt, error, memflags, need_reinit;
- bootfd = -1;
progname = basename(argv[0]);
memflags = 0;
@@ -950,7 +963,7 @@ main(int argc, char** argv)
if (error)
err(1, "vm_setup_memory");
- loader_open(bootfd);
+ loader_open();
func = dlsym(loader_hdl, "loader_main");
if (!func)
errx(1, "dlsym: %s", dlerror());
@@ -965,7 +978,7 @@ main(int argc, char** argv)
addenv("smbios.bios.vendor=BHYVE");
addenv("boot_serial=1");
- func(&cb, NULL, USERBOOT_VERSION_5, ndisks);
+ func(&cb, NULL, USERBOOT_VERSION_6, ndisks);
free(loader);
return (0);