Index: stand/userboot/userboot.h =================================================================== --- stand/userboot/userboot.h +++ stand/userboot/userboot.h @@ -41,6 +41,14 @@ */ #define USERBOOT_VERSION_4 4 +/* + * Version 5 adds callbacks to set up long mode and set + * unrestricted guest capabilities. The callback structure + * backward compatible (new callbacks have been added at + * the tail end). + */ +#define USERBOOT_VERSION_5 5 + /* * Exit codes from the loader */ @@ -210,4 +218,17 @@ int (*vm_set_register)(void *arg, int vcpu, int reg, uint64_t val); int (*vm_set_desc)(void *arg, int vcpu, int reg, uint64_t base, u_int limit, u_int access); + + /* + * Version 5 additions. + * + * vm_get_unrestricted_guest checks support for the UNRESTRICTED_GUEST + * capability and if supported, sets 'retval'. If unsupported, an error + * code is returned. + * + * vm_set_unrestricted_guest sets the UNRESTRICTED_GUEST capability if + * supported, and returns an error code otherwise. + */ + int (*vm_get_unrestricted_guest)(void* arg, int vcpu, int *retval); + int (*vm_set_unrestricted_guest)(void* arg, int vcpu, int val); }; Index: usr.sbin/bhyveload/bhyveload.c =================================================================== --- usr.sbin/bhyveload/bhyveload.c +++ usr.sbin/bhyveload/bhyveload.c @@ -560,6 +560,24 @@ return (vm_set_desc(ctx, vcpu, reg, base, limit, access)); } +static int +cb_vm_get_unrestricted_guest(void* arg, int vcpu, int *retval) +{ + return (vm_get_capability(ctx, vcpu, + VM_CAP_UNRESTRICTED_GUEST, retval)); +} + +static int +cb_vm_set_unrestricted_guest(void* arg, int vcpu, int val) +{ + int error, tmp; + if ((error = cb_vm_get_unrestricted_guest(arg, vcpu, &tmp))) + return error; + + return (vm_set_capability(ctx, vcpu, + VM_CAP_UNRESTRICTED_GUEST, val)); +} + static struct loader_callbacks cb = { .getc = cb_getc, .putc = cb_putc, @@ -593,6 +611,10 @@ /* Version 4 additions */ .vm_set_register = cb_vm_set_register, .vm_set_desc = cb_vm_set_desc, + + /* Version 5 additions */ + .vm_set_unrestricted_guest = cb_vm_set_unrestricted_guest, + .vm_get_unrestricted_guest = cb_vm_get_unrestricted_guest, }; static int