Bug #647 » vkhalt-HEAD.patch
| share/man/man7/vkernel.7 17 Jun 2007 04:05:58 -0000 | ||
|---|---|---|
| 
     .Xr tap 4 
   | 
||
| 
     device. 
   | 
||
| 
     .Sh SIGNALS 
   | 
||
| 
     The virtual kernel enables all terminal signals while in 
   | 
||
| 
     .Xr ddb 4 
   | 
||
| 
     mode but only enables 
   | 
||
| 
     The virtual kernel only enables  
   | 
||
| 
     .Dv SIGQUIT 
   | 
||
| 
     and  
   | 
||
| 
     .Dv SIGTERM  
   | 
||
| 
     while operating in regular console mode.  
   | 
||
| 
     Sending  
   | 
||
| 
     .Ql \&^\e 
   | 
||
| 
     .Pq Dv SIGQUIT 
   | 
||
| 
     while operating as a console which causes the virtual kernel to enter its 
   | 
||
| 
     internal 
   | 
||
| 
     to the virtual kernel causes the virtual kernel to enter its internal 
   | 
||
| 
     .Xr ddb 4 
   | 
||
| 
     debugger. 
   | 
||
| 
     debugger and re-enable all other terminal signals.  
   | 
||
| 
     Sending 
   | 
||
| 
     .Dv SIGTERM  
   | 
||
| 
     to the virtual kernel triggers a clean shutdown by passing a  
   | 
||
| 
     .Dv SIGUSR2  
   | 
||
| 
     to the virtual kernel's  
   | 
||
| 
     .Xr init 8 
   | 
||
| 
     process. 
   | 
||
| 
     .Sh DEBUGGING 
   | 
||
| 
     It is possible to directly gdb the virtual kernel's process. 
   | 
||
| 
     It is recommended that you do a 
   | 
||
| sys/platform/vkernel/i386/exception.c 16 Jun 2007 23:08:05 -0000 | ||
|---|---|---|
| 
     #include <sys/types.h> 
   | 
||
| 
     #include <sys/systm.h> 
   | 
||
| 
     #include <sys/kernel.h> 
   | 
||
| 
     #include <sys/kthread.h> 
   | 
||
| 
     #include <sys/reboot.h> 
   | 
||
| 
     #include <ddb/ddb.h> 
   | 
||
| 
     #include <sys/thread2.h> 
   | 
||
| ... | ... | |
| 
     static void exc_debugger(int signo, siginfo_t *info, void *ctx); 
   | 
||
| 
     #endif 
   | 
||
| 
     /* signal shutdown thread misc. */ 
   | 
||
| 
     static void sigshutdown_daemon( void ); 
   | 
||
| 
     static struct thread *sigshutdown_thread; 
   | 
||
| 
     static struct kproc_desc sigshut_kp = { 
   | 
||
| 
     	"sigshutdown", sigshutdown_daemon, &sigshutdown_thread 
   | 
||
| 
     }; 
   | 
||
| 
     void 
   | 
||
| 
     init_exceptions(void) 
   | 
||
| 
     { 
   | 
||
| ... | ... | |
| 
     	sigemptyset(&sa.sa_mask); 
   | 
||
| 
     	sigaction(SIGSEGV, &sa, NULL); 
   | 
||
| 
     	sigaction(SIGTRAP, &sa, NULL); 
   | 
||
| 
     #ifdef DDB 
   | 
||
| 
     	sa.sa_sigaction = exc_debugger; 
   | 
||
| 
     	sigaction(SIGQUIT, &sa, NULL); 
   | 
||
| 
     #endif 
   | 
||
| 
     	bzero(&sa, sizeof(sa)); 
   | 
||
| 
     	sigemptyset(&sa.sa_mask); 
   | 
||
| 
     	sa.sa_flags |= SA_MAILBOX | SA_NODEFER; 
   | 
||
| 
     	sa.sa_mailbox = &mdcpu->gd_shutdown; 
   | 
||
| 
     	sigaction(SIGTERM, &sa, NULL); 
   | 
||
| 
     } 
   | 
||
| 
     /* 
   | 
||
| ... | ... | |
| 
     	splz(); 
   | 
||
| 
     } 
   | 
||
| 
     /* 
   | 
||
| 
      * This function runs in a thread dedicated to external shutdown signals. 
   | 
||
| 
      * 
   | 
||
| 
      * Currently, when a vkernel recieves a SIGTERM, either the VKERNEL init(8)  
   | 
||
| 
      * is signaled with SIGUSR2, or the VKERNEL simply shuts down, preventing 
   | 
||
| 
      * fsck's when the VKERNEL is restarted. 
   | 
||
| 
      */  
   | 
||
| 
     static void 
   | 
||
| 
     sigshutdown_daemon( void ) 
   | 
||
| 
     { 
   | 
||
| 
     	while (mdcpu->gd_shutdown == 0) { 
   | 
||
| 
     		tsleep(&mdcpu->gd_shutdown, 0, "sswait", 0); 
   | 
||
| 
     	} 
   | 
||
| 
     	mdcpu->gd_shutdown = 0; 
   | 
||
| 
     	kprintf("Caught SIGTERM from host system. Shutting down...\n"); 
   | 
||
| 
     	if (initproc != NULL) { 
   | 
||
| 
     		ksignal(initproc, SIGUSR2); 
   | 
||
| 
     	} 
   | 
||
| 
     	else { 
   | 
||
| 
     		reboot(RB_POWEROFF); 
   | 
||
| 
     	}	 
   | 
||
| 
     } 
   | 
||
| 
     SYSINIT(sigshutdown, SI_BOOT2_PROC0, SI_ORDER_ANY,  
   | 
||
| 
     	kproc_start, &sigshut_kp);  
   | 
||
| 
     #ifdef DDB 
   | 
||
| 
     static void 
   | 
||
| sys/platform/vkernel/include/globaldata.h 10 Jun 2007 21:10:26 -0000 | ||
|---|---|---|
| 
     	int		gd_spending;	/* software interrupt pending */ 
   | 
||
| 
     	int		gd_sdelayed;	/* delayed software ints */ 
   | 
||
| 
     	int		gd_currentldt; 
   | 
||
| 
     	int		gd_mailbox;	/* signal delivery mailbox */ 
   | 
||
| 
     	int		gd_mailbox;	/* I/O signal delivery mailbox */ 
   | 
||
| 
     	int		gd_shutdown;    /* Shutdown signal delivery mailbox */ 
   | 
||
| 
     	u_int		unused001; 
   | 
||
| 
     	u_int		gd_other_cpus; 
   | 
||
| 
     	u_int		gd_ss_eflags; 
   | 
||
| sys/platform/vkernel/platform/kqueue.c 17 Jun 2007 16:19:18 -0000 | ||
|---|---|---|
| 
     	int n; 
   | 
||
| 
     	int i; 
   | 
||
| 
     	/* 
   | 
||
| 
     	 * we only need to wake up our shutdown thread once.   
   | 
||
| 
     	 * Keep it non-zero so the shutdown thread can detect it. 
   | 
||
| 
     	 */ 
   | 
||
| 
     	if (mdcpu->gd_shutdown > 0) { 
   | 
||
| 
     		mdcpu->gd_shutdown = -1; 
   | 
||
| 
     		wakeup(&mdcpu->gd_shutdown); 
   | 
||
| 
     	} 
   | 
||
| 
     	if (gd->gd_mailbox == 0) 
   | 
||
| 
     		return; 
   | 
||
| 
     	gd->gd_mailbox = 0; 
   | 
||
- « Previous
 - 1
 - 2
 - 3
 - 4
 - Next »