Index: sys/platform/vkernel/i386/exception.c =================================================================== RCS file: /home/dcvs/src/sys/platform/vkernel/i386/exception.c,v retrieving revision 1.8 diff -u -r1.8 exception.c --- sys/platform/vkernel/i386/exception.c 1 Jul 2007 03:04:14 -0000 1.8 +++ sys/platform/vkernel/i386/exception.c 12 Jul 2007 15:24:31 -0000 @@ -85,6 +85,15 @@ --mycpu->gd_intr_nesting_level; } +static +void +halt_vcpu(int nada, siginfo_t *info, void *ctxp) +{ + int ret = 0; + + pthread_exit(&ret); +} + #endif void @@ -106,6 +115,8 @@ #ifdef SMP sa.sa_sigaction = ipisig; sigaction(SIGUSR1, &sa, NULL); + sa.sa_sigaction = halt_vcpu; + sigaction(SIGUSR2, &sa, NULL); #endif } Index: sys/platform/vkernel/i386/mp.c =================================================================== RCS file: /home/dcvs/src/sys/platform/vkernel/i386/mp.c,v retrieving revision 1.6 diff -u -r1.6 mp.c --- sys/platform/vkernel/i386/mp.c 10 Jul 2007 18:35:38 -0000 1.6 +++ sys/platform/vkernel/i386/mp.c 12 Jul 2007 15:24:48 -0000 @@ -455,3 +455,17 @@ return(ncpus - 1); } + +#ifdef SMP + +void +kill_cpus(void) +{ + int i; + + for (i = 1; i < MAXCPU; i++) + if (ap_tids[i] != NULL) + pthread_kill(ap_tids[i], SIGUSR2); +} + +#endif Index: sys/platform/vkernel/include/smp.h =================================================================== RCS file: /home/dcvs/src/sys/platform/vkernel/include/smp.h,v retrieving revision 1.3 diff -u -r1.3 smp.h --- sys/platform/vkernel/include/smp.h 2 Jul 2007 02:37:04 -0000 1.3 +++ sys/platform/vkernel/include/smp.h 12 Jul 2007 15:37:35 -0000 @@ -123,6 +123,7 @@ int stop_cpus (u_int); void ap_init (void); int restart_cpus (u_int); +void kill_cpus (void); #if 0 void forward_signal (struct proc *); Index: sys/platform/vkernel/platform/init.c =================================================================== RCS file: /home/dcvs/src/sys/platform/vkernel/platform/init.c,v retrieving revision 1.44 diff -u -r1.44 init.c --- sys/platform/vkernel/platform/init.c 10 Jul 2007 18:35:38 -0000 1.44 +++ sys/platform/vkernel/platform/init.c 12 Jul 2007 15:37:08 -0000 @@ -54,6 +54,7 @@ #include #include +#include #include #include #include @@ -1148,6 +1149,9 @@ kprintf("cpu reset, rebooting vkernel\n"); closefrom(3); cleanpid(); +#ifdef SMP + kill_cpus(); +#endif execv(save_av[0], save_av); }