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)