signals.c revision 1.2.2.3 1 1.2.2.2 uebayasi /* $NetBSD: signals.c,v 1.2.2.3 2010/08/17 06:48:02 uebayasi Exp $ */
2 1.2.2.2 uebayasi
3 1.2.2.2 uebayasi /*
4 1.2.2.2 uebayasi * Copyright (c) 2010 Antti Kantee. All Rights Reserved.
5 1.2.2.2 uebayasi *
6 1.2.2.2 uebayasi * Redistribution and use in source and binary forms, with or without
7 1.2.2.2 uebayasi * modification, are permitted provided that the following conditions
8 1.2.2.2 uebayasi * are met:
9 1.2.2.2 uebayasi * 1. Redistributions of source code must retain the above copyright
10 1.2.2.2 uebayasi * notice, this list of conditions and the following disclaimer.
11 1.2.2.2 uebayasi * 2. Redistributions in binary form must reproduce the above copyright
12 1.2.2.2 uebayasi * notice, this list of conditions and the following disclaimer in the
13 1.2.2.2 uebayasi * documentation and/or other materials provided with the distribution.
14 1.2.2.2 uebayasi *
15 1.2.2.2 uebayasi * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS
16 1.2.2.2 uebayasi * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
17 1.2.2.2 uebayasi * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
18 1.2.2.2 uebayasi * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19 1.2.2.2 uebayasi * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 1.2.2.2 uebayasi * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21 1.2.2.2 uebayasi * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 1.2.2.2 uebayasi * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 1.2.2.2 uebayasi * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.2.2.2 uebayasi * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.2.2.2 uebayasi * SUCH DAMAGE.
26 1.2.2.2 uebayasi */
27 1.2.2.2 uebayasi
28 1.2.2.2 uebayasi #include <sys/cdefs.h>
29 1.2.2.2 uebayasi __KERNEL_RCSID(0, "$NetBSD: signals.c,v 1.2.2.3 2010/08/17 06:48:02 uebayasi Exp $");
30 1.2.2.2 uebayasi
31 1.2.2.2 uebayasi #include <sys/param.h>
32 1.2.2.2 uebayasi #include <sys/atomic.h>
33 1.2.2.2 uebayasi #include <sys/event.h>
34 1.2.2.2 uebayasi #include <sys/proc.h>
35 1.2.2.2 uebayasi #include <sys/signal.h>
36 1.2.2.2 uebayasi
37 1.2.2.2 uebayasi #include <rump/rump.h>
38 1.2.2.2 uebayasi #include <rump/rumpuser.h>
39 1.2.2.2 uebayasi
40 1.2.2.2 uebayasi #include "rumpkern_if_priv.h"
41 1.2.2.2 uebayasi
42 1.2.2.2 uebayasi const struct filterops sig_filtops;
43 1.2.2.2 uebayasi sigset_t sigcantmask;
44 1.2.2.2 uebayasi
45 1.2.2.2 uebayasi /* RUMP_SIGMODEL_PANIC */
46 1.2.2.2 uebayasi
47 1.2.2.2 uebayasi static void
48 1.2.2.2 uebayasi rumpsig_panic(pid_t target, int signo)
49 1.2.2.2 uebayasi {
50 1.2.2.2 uebayasi
51 1.2.2.2 uebayasi switch (signo) {
52 1.2.2.2 uebayasi case SIGSYS:
53 1.2.2.2 uebayasi break;
54 1.2.2.2 uebayasi default:
55 1.2.2.2 uebayasi panic("unhandled signal %d", signo);
56 1.2.2.2 uebayasi }
57 1.2.2.2 uebayasi }
58 1.2.2.2 uebayasi
59 1.2.2.2 uebayasi /* RUMP_SIGMODEL_IGNORE */
60 1.2.2.2 uebayasi
61 1.2.2.2 uebayasi static void
62 1.2.2.2 uebayasi rumpsig_ignore(pid_t target, int signo)
63 1.2.2.2 uebayasi {
64 1.2.2.2 uebayasi
65 1.2.2.2 uebayasi return;
66 1.2.2.2 uebayasi }
67 1.2.2.2 uebayasi
68 1.2.2.2 uebayasi /* RUMP_SIGMODEL_HOST */
69 1.2.2.2 uebayasi
70 1.2.2.2 uebayasi static void
71 1.2.2.2 uebayasi rumpsig_host(pid_t target, int signo)
72 1.2.2.2 uebayasi {
73 1.2.2.2 uebayasi int error;
74 1.2.2.2 uebayasi
75 1.2.2.2 uebayasi rumpuser_kill(target, signo, &error);
76 1.2.2.2 uebayasi }
77 1.2.2.2 uebayasi
78 1.2.2.2 uebayasi /* RUMP_SIGMODEL_RAISE */
79 1.2.2.2 uebayasi
80 1.2.2.2 uebayasi static void
81 1.2.2.2 uebayasi rumpsig_raise(pid_t target, int signo)
82 1.2.2.2 uebayasi {
83 1.2.2.2 uebayasi int error;
84 1.2.2.2 uebayasi
85 1.2.2.2 uebayasi rumpuser_kill(RUMPUSER_PID_SELF, signo, &error);
86 1.2.2.2 uebayasi }
87 1.2.2.2 uebayasi
88 1.2.2.2 uebayasi typedef void (*rumpsig_fn)(pid_t pid, int sig);
89 1.2.2.2 uebayasi
90 1.2.2.2 uebayasi rumpsig_fn rumpsig = rumpsig_panic;
91 1.2.2.2 uebayasi
92 1.2.2.2 uebayasi /*
93 1.2.2.2 uebayasi * Set signal delivery model. It would be nice if we could
94 1.2.2.2 uebayasi * take a functional argument. But then we'd need some
95 1.2.2.2 uebayasi * OS independent way to represent a signal number and also
96 1.2.2.2 uebayasi * a method for easy processing (parsing is boring).
97 1.2.2.2 uebayasi *
98 1.2.2.2 uebayasi * Plus, upcalls from the rump kernel into process space except
99 1.2.2.2 uebayasi * via rumpuser is a somewhat gray area now.
100 1.2.2.2 uebayasi */
101 1.2.2.2 uebayasi void
102 1.2.2.2 uebayasi rump_boot_setsigmodel(enum rump_sigmodel model)
103 1.2.2.2 uebayasi {
104 1.2.2.2 uebayasi
105 1.2.2.2 uebayasi switch (model) {
106 1.2.2.2 uebayasi case RUMP_SIGMODEL_PANIC:
107 1.2.2.2 uebayasi atomic_swap_ptr(&rumpsig, rumpsig_panic);
108 1.2.2.2 uebayasi break;
109 1.2.2.2 uebayasi case RUMP_SIGMODEL_IGNORE:
110 1.2.2.2 uebayasi atomic_swap_ptr(&rumpsig, rumpsig_ignore);
111 1.2.2.2 uebayasi break;
112 1.2.2.2 uebayasi case RUMP_SIGMODEL_HOST:
113 1.2.2.2 uebayasi atomic_swap_ptr(&rumpsig, rumpsig_host);
114 1.2.2.2 uebayasi break;
115 1.2.2.2 uebayasi case RUMP_SIGMODEL_RAISE:
116 1.2.2.2 uebayasi atomic_swap_ptr(&rumpsig, rumpsig_raise);
117 1.2.2.2 uebayasi break;
118 1.2.2.2 uebayasi }
119 1.2.2.2 uebayasi }
120 1.2.2.2 uebayasi
121 1.2.2.2 uebayasi void
122 1.2.2.2 uebayasi psignal(struct proc *p, int sig)
123 1.2.2.2 uebayasi {
124 1.2.2.2 uebayasi
125 1.2.2.2 uebayasi rumpsig(p->p_pid, sig);
126 1.2.2.2 uebayasi }
127 1.2.2.2 uebayasi
128 1.2.2.2 uebayasi void
129 1.2.2.2 uebayasi pgsignal(struct pgrp *pgrp, int sig, int checktty)
130 1.2.2.2 uebayasi {
131 1.2.2.2 uebayasi
132 1.2.2.2 uebayasi rumpsig(-pgrp->pg_id, sig);
133 1.2.2.2 uebayasi }
134 1.2.2.2 uebayasi
135 1.2.2.2 uebayasi void
136 1.2.2.2 uebayasi kpsignal(struct proc *p, ksiginfo_t *ksi, void *data)
137 1.2.2.2 uebayasi {
138 1.2.2.2 uebayasi
139 1.2.2.2 uebayasi rumpsig(p->p_pid, ksi->ksi_signo);
140 1.2.2.2 uebayasi }
141 1.2.2.2 uebayasi
142 1.2.2.2 uebayasi void
143 1.2.2.2 uebayasi kpgsignal(struct pgrp *pgrp, ksiginfo_t *ksi, void *data, int checkctty)
144 1.2.2.2 uebayasi {
145 1.2.2.2 uebayasi
146 1.2.2.2 uebayasi rumpsig(-pgrp->pg_id, ksi->ksi_signo);
147 1.2.2.2 uebayasi }
148 1.2.2.2 uebayasi
149 1.2.2.2 uebayasi int
150 1.2.2.2 uebayasi sigispending(struct lwp *l, int signo)
151 1.2.2.2 uebayasi {
152 1.2.2.2 uebayasi
153 1.2.2.2 uebayasi return 0;
154 1.2.2.2 uebayasi }
155 1.2.2.2 uebayasi
156 1.2.2.2 uebayasi void
157 1.2.2.2 uebayasi sigpending1(struct lwp *l, sigset_t *ss)
158 1.2.2.2 uebayasi {
159 1.2.2.2 uebayasi
160 1.2.2.2 uebayasi sigemptyset(ss);
161 1.2.2.2 uebayasi }
162 1.2.2.2 uebayasi
163 1.2.2.2 uebayasi int
164 1.2.2.2 uebayasi sigismasked(struct lwp *l, int sig)
165 1.2.2.2 uebayasi {
166 1.2.2.2 uebayasi
167 1.2.2.2 uebayasi return 0;
168 1.2.2.2 uebayasi }
169 1.2.2.2 uebayasi
170 1.2.2.2 uebayasi void
171 1.2.2.2 uebayasi sigclearall(struct proc *p, const sigset_t *mask, ksiginfoq_t *kq)
172 1.2.2.2 uebayasi {
173 1.2.2.2 uebayasi
174 1.2.2.2 uebayasi /* nada */
175 1.2.2.2 uebayasi }
176 1.2.2.2 uebayasi
177 1.2.2.2 uebayasi void
178 1.2.2.2 uebayasi ksiginfo_queue_drain0(ksiginfoq_t *kq)
179 1.2.2.2 uebayasi {
180 1.2.2.2 uebayasi
181 1.2.2.2 uebayasi if (!(CIRCLEQ_EMPTY(kq)))
182 1.2.2.2 uebayasi panic("how did that get there?");
183 1.2.2.2 uebayasi }
184 1.2.2.3 uebayasi
185 1.2.2.3 uebayasi void
186 1.2.2.3 uebayasi siginit(struct proc *p)
187 1.2.2.3 uebayasi {
188 1.2.2.3 uebayasi
189 1.2.2.3 uebayasi /* nada (?) */
190 1.2.2.3 uebayasi }
191