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__ */