Print this page
13275 bhyve needs richer INIT/SIPI support
Reviewed by: Robert Mustacchi <rm@fingolfin.org>
Approved by: Gordon Ross <gordon.w.ross@gmail.com>

*** 441,450 **** --- 441,453 ---- case VM_SET_INTINFO: case VM_GET_INTINFO: case VM_RESTART_INSTRUCTION: case VM_SET_KERNEMU_DEV: case VM_GET_KERNEMU_DEV: + case VM_RESET_CPU: + case VM_GET_RUN_STATE: + case VM_SET_RUN_STATE: /* * Copy in the ID of the vCPU chosen for this operation. * Since a nefarious caller could update their struct between * this locking and when the rest of the ioctl data is copied * in, it is _critical_ that this local 'vcpu' variable be used
*** 987,996 **** --- 990,1038 ---- error = vm_set_register(sc->vmm_vm, vcpu, regnums[i], regvals[i]); } break; } + case VM_RESET_CPU: { + struct vm_vcpu_reset vvr; + + if (ddi_copyin(datap, &vvr, sizeof (vvr), md)) { + error = EFAULT; + break; + } + if (vvr.kind != VRK_RESET && vvr.kind != VRK_INIT) { + error = EINVAL; + } + + error = vcpu_arch_reset(sc->vmm_vm, vcpu, vvr.kind == VRK_INIT); + break; + } + case VM_GET_RUN_STATE: { + struct vm_run_state vrs; + + bzero(&vrs, sizeof (vrs)); + error = vm_get_run_state(sc->vmm_vm, vcpu, &vrs.state, + &vrs.sipi_vector); + if (error == 0) { + if (ddi_copyout(&vrs, datap, sizeof (vrs), md)) { + error = EFAULT; + break; + } + } + break; + } + case VM_SET_RUN_STATE: { + struct vm_run_state vrs; + + if (ddi_copyin(datap, &vrs, sizeof (vrs), md)) { + error = EFAULT; + break; + } + error = vm_set_run_state(sc->vmm_vm, vcpu, vrs.state, + vrs.sipi_vector); + break; + } case VM_SET_KERNEMU_DEV: case VM_GET_KERNEMU_DEV: { struct vm_readwrite_kernemu_device kemu; size_t size = 0;