diff options
| -rw-r--r-- | stand/userboot/userboot.h | 12 | ||||
| -rw-r--r-- | stand/userboot/userboot/main.c | 2 | ||||
| -rw-r--r-- | usr.sbin/bhyveload/bhyveload.c | 23 |
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); |
