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>
@@ -1300,10 +1300,22 @@
error = ioctl(ctx->fd, VM_SET_X2APIC_STATE, &x2apic);
return (error);
}
+#ifndef __FreeBSD__
+int
+vcpu_reset(struct vmctx *vmctx, int vcpu)
+{
+ struct vm_vcpu_reset vvr;
+
+ vvr.vcpuid = vcpu;
+ vvr.kind = VRK_RESET;
+
+ return (ioctl(vmctx->fd, VM_RESET_CPU, &vvr));
+}
+#else /* __FreeBSD__ */
/*
* From Intel Vol 3a:
* Table 9-1. IA-32 Processor States Following Power-up, Reset or INIT
*/
int
@@ -1456,10 +1468,11 @@
error = 0;
done:
return (error);
}
+#endif /* __FreeBSD__ */
int
vm_get_gpa_pmap(struct vmctx *ctx, uint64_t gpa, uint64_t *pte, int *num)
{
int error, i;
@@ -1837,10 +1850,43 @@
if (ioctl(ctx->fd, VM_WRLOCK_CYCLE, 0) != 0) {
return (errno);
}
return (0);
}
+
+int
+vm_get_run_state(struct vmctx *ctx, int vcpu, enum vcpu_run_state *state,
+ uint8_t *sipi_vector)
+{
+ struct vm_run_state data;
+
+ data.vcpuid = vcpu;
+ if (ioctl(ctx->fd, VM_GET_RUN_STATE, &data) != 0) {
+ return (errno);
+ }
+
+ *state = data.state;
+ *sipi_vector = data.sipi_vector;
+ return (0);
+}
+
+int
+vm_set_run_state(struct vmctx *ctx, int vcpu, enum vcpu_run_state state,
+ uint8_t sipi_vector)
+{
+ struct vm_run_state data;
+
+ data.vcpuid = vcpu;
+ data.state = state;
+ data.sipi_vector = sipi_vector;
+ if (ioctl(ctx->fd, VM_SET_RUN_STATE, &data) != 0) {
+ return (errno);
+ }
+
+ return (0);
+}
+
#endif /* __FreeBSD__ */
#ifdef __FreeBSD__
const cap_ioctl_t *
vm_get_ioctls(size_t *len)