1 /*	$NetBSD: sendsig.c,v 1.1 2011/01/14 13:08:00 pooka Exp $	*/
2 
3 /*-
4  * Copyright (c) 2011 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17  * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20  * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include <sys/cdefs.h>
31 #if !defined(lint)
32 __RCSID("$NetBSD: sendsig.c,v 1.1 2011/01/14 13:08:00 pooka Exp $");
33 #endif /* !lint */
34 
35 #include <sys/param.h>
36 #include <sys/proc.h>
37 
38 #include <rump/rump.h>
39 
40 #include "kernspace.h"
41 
42 /*
43  * loop until a non-system process appears and we can send it a signal
44  */
45 void
46 rumptest_sendsig(char *signo)
47 {
48 	struct proc *p;
49 	bool sent = false;
50 	int sig;
51 
52 	sig = strtoull(signo, NULL, 10);
53 	rump_boot_setsigmodel(RUMP_SIGMODEL_RAISE);
54 
55 	mutex_enter(proc_lock);
56 	while (!sent) {
57 		PROCLIST_FOREACH(p, &allproc) {
58 			if (p->p_pid > 1) {
59 				mutex_enter(p->p_lock);
60 				psignal(p, sig);
61 				mutex_exit(p->p_lock);
62 				sent = true;
63 				break;
64 			}
65 		}
66 		kpause("w8", false, 1, proc_lock);
67 	}
68 	mutex_exit(proc_lock);
69 
70 	/* restore default */
71 	rump_boot_setsigmodel(RUMP_SIGMODEL_PANIC);
72 }
73 
74 void
75 rumptest_localsig(int signo)
76 {
77 	struct proc *p = curproc;
78 
79 	mutex_enter(p->p_lock);
80 	psignal(p, signo);
81 	mutex_exit(p->p_lock);
82 }
83