Index: sys/arch/amd64/amd64/machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/amd64/amd64/machdep.c,v retrieving revision 1.163 diff -p -u -r1.163 machdep.c --- sys/arch/amd64/amd64/machdep.c 10 Aug 2011 11:39:45 -0000 1.163 +++ sys/arch/amd64/amd64/machdep.c 11 Aug 2011 10:18:04 -0000 @@ -719,11 +719,7 @@ haltsys: #endif /* XEN */ } -#ifdef XEN - xen_broadcast_ipi(XEN_IPI_HALT); -#else /* XEN */ - x86_broadcast_ipi(X86_IPI_HALT); -#endif + cpu_broadcast_halt(); if (howto & RB_HALT) { #if NACPICA > 0 Index: sys/arch/i386/i386/machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/i386/i386/machdep.c,v retrieving revision 1.707 diff -p -u -r1.707 machdep.c --- sys/arch/i386/i386/machdep.c 10 Aug 2011 06:38:02 -0000 1.707 +++ sys/arch/i386/i386/machdep.c 11 Aug 2011 10:18:10 -0000 @@ -955,11 +955,7 @@ haltsys: } #ifdef MULTIPROCESSOR -#ifdef XEN - xen_broadcast_ipi(XEN_IPI_HALT); -#else /* XEN */ - x86_broadcast_ipi(X86_IPI_HALT); -#endif /* XEN */ + cpu_broadcast_halt(); #endif /* MULTIPROCESSOR */ if (howto & RB_HALT) { Index: sys/arch/x86/include/cpu.h =================================================================== RCS file: /cvsroot/src/sys/arch/x86/include/cpu.h,v retrieving revision 1.36 diff -p -u -r1.36 cpu.h --- sys/arch/x86/include/cpu.h 10 Aug 2011 06:40:35 -0000 1.36 +++ sys/arch/x86/include/cpu.h 11 Aug 2011 10:18:14 -0000 @@ -314,6 +314,8 @@ void cpu_boot_secondary_processors(void) void cpu_init_idle_lwps(void); void cpu_init_msrs(struct cpu_info *, bool); void cpu_load_pmap(struct pmap *); +void cpu_broadcast_halt(void); +void cpu_kick(struct cpu_info *); extern uint32_t cpus_attached; Index: sys/arch/x86/x86/cpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/x86/x86/cpu.c,v retrieving revision 1.90 diff -p -u -r1.90 cpu.c --- sys/arch/x86/x86/cpu.c 29 Jul 2011 21:21:43 -0000 1.90 +++ sys/arch/x86/x86/cpu.c 11 Aug 2011 10:18:15 -0000 @@ -1210,3 +1210,23 @@ cpu_load_pmap(struct pmap *pmap) lcr3(pmap_pdirpa(pmap, 0)); #endif /* PAE */ } + +/* + * Notify all other cpus to halt. + */ + +void +cpu_broadcast_halt(struct cpu_info *ci) +{ + x86_broadcast_ipi(X86_IPI_HALT); +} + +/* + * Send a dummy ipi to a cpu to force it to run splraise()/spllower() + */ + +void +cpu_kick(struct cpu_info *ci) +{ + x86_send_ipi(ci, 0); +} Index: sys/arch/x86/x86/x86_machdep.c =================================================================== RCS file: /cvsroot/src/sys/arch/x86/x86/x86_machdep.c,v retrieving revision 1.54 diff -p -u -r1.54 x86_machdep.c --- sys/arch/x86/x86/x86_machdep.c 10 Aug 2011 11:39:45 -0000 1.54 +++ sys/arch/x86/x86/x86_machdep.c 11 Aug 2011 10:18:18 -0000 @@ -205,11 +205,7 @@ cpu_need_resched(struct cpu_info *ci, in if (ci == cur) return; if (x86_cpu_idle_ipi != false) { -#ifdef XEN - xen_send_ipi(ci, XEN_IPI_KICK); -#else /* XEN */ - x86_send_ipi(ci, 0); -#endif /* XEN */ + cpu_kick(ci); } return; } @@ -231,11 +227,7 @@ cpu_need_resched(struct cpu_info *ci, in return; } if ((flags & RESCHED_IMMED) != 0) { -#ifdef XEN - xen_send_ipi(ci, XEN_IPI_KICK); -#else /* XEN */ - x86_send_ipi(ci, 0); -#endif /* XEN */ + cpu_kick(ci); } } @@ -246,11 +238,7 @@ cpu_signotify(struct lwp *l) KASSERT(kpreempt_disabled()); aston(l, X86_AST_GENERIC); if (l->l_cpu != curcpu()) -#ifdef XEN - xen_send_ipi(l->l_cpu, XEN_IPI_KICK); -#else /* XEN */ - x86_send_ipi(l->l_cpu, 0); -#endif /* XEN */ + cpu_kick(l->l_cpu); } void Index: sys/arch/xen/x86/cpu.c =================================================================== RCS file: /cvsroot/src/sys/arch/xen/x86/cpu.c,v retrieving revision 1.60 diff -p -u -r1.60 cpu.c --- sys/arch/xen/x86/cpu.c 16 Jul 2011 14:46:18 -0000 1.60 +++ sys/arch/xen/x86/cpu.c 11 Aug 2011 10:18:19 -0000 @@ -1177,3 +1177,23 @@ cpu_load_pmap(struct pmap *pmap) } #endif /* __x86_64__ */ } + +/* + * Notify all other cpus to halt. + */ + +void +cpu_broadcast_halt(void) +{ + xen_broadcast_ipi(XEN_IPI_HALT); +} + +/* + * Send a dummy ipi to a cpu. + */ + +void +cpu_kick(struct cpu_info *ci) +{ + xen_send_ipi(ci, XEN_IPI_KICK); +}