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>

@@ -54,10 +54,11 @@
 #include <assert.h>
 
 #include "bhyverun.h"
 #include "spinup_ap.h"
 
+#ifdef __FreeBSD__
 static void
 spinup_ap_realmode(struct vmctx *ctx, int newcpu, uint64_t *rip)
 {
         int vector, error;
         uint16_t cs;

@@ -99,28 +100,40 @@
         error = vcpu_reset(ctx, newcpu);
         assert(error == 0);
 
         fbsdrun_set_capabilities(ctx, newcpu);
 
-#ifdef __FreeBSD__
         /*
          * Enable the 'unrestricted guest' mode for 'newcpu'.
          *
          * Set up the processor state in power-on 16-bit mode, with the CS:IP
          * init'd to the specified low-mem 4K page.
          */
         error = vm_set_capability(ctx, newcpu, VM_CAP_UNRESTRICTED_GUEST, 1);
         assert(error == 0);
-#else
-        /* Unrestricted Guest is always enabled on illumos */
-#endif
 
         spinup_ap_realmode(ctx, newcpu, &rip);
 
-#ifdef __FreeBSD__
         fbsdrun_addcpu(ctx, vcpu, newcpu, rip);
-#else
-        fbsdrun_addcpu(ctx, vcpu, newcpu, rip, false);
-#endif
 
         return (newcpu);
 }
+#else /* __FreeBSD__ */
+void
+spinup_halted_ap(struct vmctx *ctx, int newcpu)
+{
+        int error;
+
+        assert(newcpu != 0);
+        assert(newcpu < guest_ncpus);
+
+        error = vcpu_reset(ctx, newcpu);
+        assert(error == 0);
+
+        fbsdrun_set_capabilities(ctx, newcpu);
+
+        error = vm_set_run_state(ctx, newcpu, VRS_HALT, 0);
+        assert(error == 0);
+
+        fbsdrun_addcpu(ctx, newcpu, 0, false);
+}
+#endif /* __FreeBSD__ */