Index: amd64/vmm.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/vmm.c,v retrieving revision 1.103 diff -u -p -r1.103 vmm.c --- amd64/vmm.c 10 Jan 2017 09:02:29 -0000 1.103 +++ amd64/vmm.c 19 Jan 2017 06:21:33 -0000 @@ -705,25 +705,23 @@ vm_find(uint32_t id, struct vm **res) int vmm_start(void) { - struct cpu_info *self = curcpu(); + struct cpu_info *ci = curcpu(); int ret = 0; #ifdef MULTIPROCESSOR - struct cpu_info *ci; + struct task xc; CPU_INFO_ITERATOR cii; int i; #endif /* VMM is already running */ - if (self->ci_flags & CPUF_VMM) + if (ci->ci_flags & CPUF_VMM) return (0); #ifdef MULTIPROCESSOR - /* Broadcast start VMM IPI */ - x86_broadcast_ipi(X86_IPI_START_VMM); - CPU_INFO_FOREACH(cii, ci) { - if (ci == self) - continue; + task_set(&xc, start_vmm_on_cpu, ci); + cpu_xcall(ci, &xc); + for (i = 100000; (!(ci->ci_flags & CPUF_VMM)) && i>0;i--) delay(10); if (!(ci->ci_flags & CPUF_VMM)) { @@ -732,15 +730,16 @@ vmm_start(void) ret = EIO; } } -#endif /* MULTIPROCESSOR */ - +#else /* MULTIPROCESSOR */ /* Start VMM on this CPU */ - start_vmm_on_cpu(self); - if (!(self->ci_flags & CPUF_VMM)) { + ci = curcpu(); + start_vmm_on_cpu(ci); + if (!(ci->ci_flags & CPUF_VMM)) { printf("%s: failed to enter VMM mode\n", - self->ci_dev->dv_xname); + ci->ci_dev->dv_xname); ret = EIO; } +#endif /* MULTIPROCESSOR */ return (ret); } @@ -753,25 +752,23 @@ vmm_start(void) int vmm_stop(void) { - struct cpu_info *self = curcpu(); int ret = 0; -#ifdef MULTIPROCESSOR struct cpu_info *ci; +#ifdef MULTIPROCESSOR + struct task xc; CPU_INFO_ITERATOR cii; int i; #endif /* VMM is not running */ - if (!(self->ci_flags & CPUF_VMM)) + if (!(ci->ci_flags & CPUF_VMM)) return (0); #ifdef MULTIPROCESSOR - /* Stop VMM on other CPUs */ - x86_broadcast_ipi(X86_IPI_STOP_VMM); - CPU_INFO_FOREACH(cii, ci) { - if (ci == self) - continue; + task_set(&xc, stop_vmm_on_cpu, ci); + cpu_xcall(ci, &xc); + for (i = 100000; (ci->ci_flags & CPUF_VMM) && i>0 ;i--) delay(10); if (ci->ci_flags & CPUF_VMM) { @@ -780,15 +777,16 @@ vmm_stop(void) ret = EIO; } } -#endif /* MULTIPROCESSOR */ - +#else /* MULTIPROCESSOR */ /* Stop VMM on this CPU */ - stop_vmm_on_cpu(self); - if (self->ci_flags & CPUF_VMM) { + ci = curcpu(); + stop_vmm_on_cpu(ci); + if (ci->ci_flags & CPUF_VMM) { printf("%s: failed to exit VMM mode\n", - self->ci_dev->dv_xname); + ci->ci_dev->dv_xname); ret = EIO; } +#endif /* MULTIPROCESSOR */ return (ret); } @@ -800,8 +798,9 @@ vmm_stop(void) * sequence to enter VMM mode (eg, VMXON) */ void -start_vmm_on_cpu(struct cpu_info *ci) +start_vmm_on_cpu(void *self) { + struct cpu_info *ci = self; uint64_t msr; uint32_t cr4; @@ -862,8 +861,9 @@ start_vmm_on_cpu(struct cpu_info *ci) * sequence to exit VMM mode (eg, VMXOFF) */ void -stop_vmm_on_cpu(struct cpu_info *ci) +stop_vmm_on_cpu(void *self) { + struct cpu_info *ci = self; uint64_t msr; uint32_t cr4; Index: include/vmmvar.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/vmmvar.h,v retrieving revision 1.24 diff -u -p -r1.24 vmmvar.h --- include/vmmvar.h 11 Jan 2017 09:15:18 -0000 1.24 +++ include/vmmvar.h 19 Jan 2017 06:21:33 -0000 @@ -601,8 +601,8 @@ int vmread(uint64_t, uint64_t *); void invvpid(uint64_t, struct vmx_invvpid_descriptor *); void invept(uint64_t, struct vmx_invept_descriptor *); int vmx_enter_guest(uint64_t *, struct vmx_gueststate *, int); -void start_vmm_on_cpu(struct cpu_info *); -void stop_vmm_on_cpu(struct cpu_info *); +void start_vmm_on_cpu(void *); +void stop_vmm_on_cpu(void *); #endif /* _KERNEL */