1 /* $NetBSD: signalvar.h,v 1.86 2014/05/15 07:11:30 uebayasi Exp $ */
2
3 /*
4 * Copyright (c) 1991, 1993
5 * The Regents of the University of California. 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 * 3. Neither the name of the University nor the names of its contributors
16 * may be used to endorse or promote products derived from this software
17 * without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29 * SUCH DAMAGE.
30 *
31 * @(#)signalvar.h 8.6 (Berkeley) 2/19/95
32 */
33
34 #ifndef _SYS_SIGNALVAR_H_
35 #define _SYS_SIGNALVAR_H_
36
37 #include <sys/siginfo.h>
38 #include <sys/queue.h>
39 #include <sys/mutex.h>
40
41 /*
42 * Kernel signal definitions and data structures,
43 * not exported to user programs.
44 */
45
46 /*
47 * Queue of signals.
48 */
49 typedef TAILQ_HEAD(ksiginfoq, ksiginfo) ksiginfoq_t;
50
51 /*
52 * Process signal actions, possibly shared between processes.
53 */
54 struct sigacts {
55 struct sigact_sigdesc {
56 struct sigaction sd_sigact;
57 const void *sd_tramp;
58 int sd_vers;
59 } sa_sigdesc[NSIG]; /* disposition of signals */
60
61 int sa_refcnt; /* reference count */
62 kmutex_t sa_mutex; /* lock on sa_refcnt */
63 };
64
65 /*
66 * Pending signals, per LWP and per process.
67 */
68 typedef struct sigpend {
69 ksiginfoq_t sp_info;
70 sigset_t sp_set;
71 } sigpend_t;
72
73 /*
74 * Process signal state.
75 */
76 struct sigctx {
77 int ps_signo; /* for core dump/debugger XXX */
78 int ps_code; /* for core dump/debugger XXX */
79 int ps_lwp; /* for core dump/debugger XXX */
80 void *ps_sigcode; /* address of signal trampoline */
81 sigset_t ps_sigignore; /* Signals being ignored. */
82 sigset_t ps_sigcatch; /* Signals being caught by user. */
83 };
84
85 /* additional signal action values, used only temporarily/internally */
86 #define SIG_CATCH (void (*)(int))2
87
88 /*
89 * get signal action for process and signal; currently only for current process
90 */
91 #define SIGACTION(p, sig) (p->p_sigacts->sa_sigdesc[(sig)].sd_sigact)
92 #define SIGACTION_PS(ps, sig) (ps->sa_sigdesc[(sig)].sd_sigact)
93
94 /*
95 * Signal properties and actions.
96 * The array below categorizes the signals and their default actions
97 * according to the following properties:
98 */
99 #define SA_KILL 0x0001 /* terminates process by default */
100 #define SA_CORE 0x0002 /* ditto and coredumps */
101 #define SA_STOP 0x0004 /* suspend process */
102 #define SA_TTYSTOP 0x0008 /* ditto, from tty */
103 #define SA_IGNORE 0x0010 /* ignore by default */
104 #define SA_CONT 0x0020 /* continue if suspended */
105 #define SA_CANTMASK 0x0040 /* non-maskable, catchable */
106 #define SA_NORESET 0x0080 /* not reset when caught */
107 #define SA_TOLWP 0x0100 /* to LWP that generated, if local */
108 #define SA_TOALL 0x0200 /* always to all LWPs */
109
110 #ifdef _KERNEL
111
112 #include <sys/systm.h> /* for copyin_t/copyout_t */
113
114 extern sigset_t contsigmask, sigcantmask;
115
116 struct vnode;
117 struct coredump_iostate;
118
119 /*
120 * Machine-independent functions:
121 */
122 int coredump_netbsd(struct lwp *, struct coredump_iostate *);
123 void execsigs(struct proc *);
124 int issignal(struct lwp *);
125 void pgsignal(struct pgrp *, int, int);
126 void kpgsignal(struct pgrp *, struct ksiginfo *, void *, int);
127 void postsig(int);
128 void psignal(struct proc *, int);
129 void kpsignal(struct proc *, struct ksiginfo *, void *);
130 void child_psignal(struct proc *, int);
131 void siginit(struct proc *);
132 void trapsignal(struct lwp *, struct ksiginfo *);
133 void sigexit(struct lwp *, int) __dead;
134 void killproc(struct proc *, const char *);
135 void setsigvec(struct proc *, int, struct sigaction *);
136 int killpg1(struct lwp *, struct ksiginfo *, int, int);
137 void proc_unstop(struct proc *p);
138
139 int sigaction1(struct lwp *, int, const struct sigaction *,
140 struct sigaction *, const void *, int);
141 int sigprocmask1(struct lwp *, int, const sigset_t *, sigset_t *);
142 void sigpending1(struct lwp *, sigset_t *);
143 void sigsuspendsetup(struct lwp *, const sigset_t *);
144 void sigsuspendteardown(struct lwp *);
145 int sigsuspend1(struct lwp *, const sigset_t *);
146 int sigaltstack1(struct lwp *, const struct sigaltstack *,
147 struct sigaltstack *);
148 int sigismasked(struct lwp *, int);
149
150 int sigget(sigpend_t *, ksiginfo_t *, int, const sigset_t *);
151 void sigclear(sigpend_t *, const sigset_t *, ksiginfoq_t *);
152 void sigclearall(struct proc *, const sigset_t *, ksiginfoq_t *);
153
154 void kpsignal2(struct proc *, ksiginfo_t *);
155
156 void signal_init(void);
157
158 struct sigacts *sigactsinit(struct proc *, int);
159 void sigactsunshare(struct proc *);
160 void sigactsfree(struct sigacts *);
161
162 void kpsendsig(struct lwp *, const struct ksiginfo *, const sigset_t *);
163 void sendsig_reset(struct lwp *, int);
164 void sendsig(const struct ksiginfo *, const sigset_t *);
165
166 ksiginfo_t *ksiginfo_alloc(struct proc *, ksiginfo_t *, int);
167 void ksiginfo_free(ksiginfo_t *);
168 void ksiginfo_queue_drain0(ksiginfoq_t *);
169
170 struct sys_____sigtimedwait50_args;
171 int sigtimedwait1(struct lwp *, const struct sys_____sigtimedwait50_args *,
172 register_t *, copyin_t, copyout_t, copyin_t, copyout_t);
173
174 void signotify(struct lwp *);
175 int sigispending(struct lwp *, int);
176
177 /*
178 * Machine-dependent functions:
179 */
180 void sendsig_sigcontext(const struct ksiginfo *, const sigset_t *);
181 void sendsig_siginfo(const struct ksiginfo *, const sigset_t *);
182
183 extern struct pool ksiginfo_pool;
184
185 /*
186 * Modularity / compatibility.
187 */
188 extern void (*sendsig_sigcontext_vec)(const struct ksiginfo *,
189 const sigset_t *);
190 extern int (*coredump_vec)(struct lwp *, const char *);
191
192 /*
193 * firstsig:
194 *
195 * Return the first signal in a signal set.
196 */
197 static inline int
firstsig(const sigset_t * ss)198 firstsig(const sigset_t *ss)
199 {
200 int sig;
201
202 sig = ffs(ss->__bits[0]);
203 if (sig != 0)
204 return (sig);
205 #if NSIG > 33
206 sig = ffs(ss->__bits[1]);
207 if (sig != 0)
208 return (sig + 32);
209 #endif
210 #if NSIG > 65
211 sig = ffs(ss->__bits[2]);
212 if (sig != 0)
213 return (sig + 64);
214 #endif
215 #if NSIG > 97
216 sig = ffs(ss->__bits[3]);
217 if (sig != 0)
218 return (sig + 96);
219 #endif
220 return (0);
221 }
222
223 static inline void
ksiginfo_queue_init(ksiginfoq_t * kq)224 ksiginfo_queue_init(ksiginfoq_t *kq)
225 {
226 TAILQ_INIT(kq);
227 }
228
229 static inline void
ksiginfo_queue_drain(ksiginfoq_t * kq)230 ksiginfo_queue_drain(ksiginfoq_t *kq)
231 {
232 if (!TAILQ_EMPTY(kq))
233 ksiginfo_queue_drain0(kq);
234 }
235
236 #endif /* _KERNEL */
237
238 #ifdef _KERNEL
239 #ifdef SIGPROP
240 const int sigprop[NSIG] = {
241 0, /* 0 unused */
242 SA_KILL, /* 1 SIGHUP */
243 SA_KILL, /* 2 SIGINT */
244 SA_KILL|SA_CORE, /* 3 SIGQUIT */
245 SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP, /* 4 SIGILL */
246 SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP, /* 5 SIGTRAP */
247 SA_KILL|SA_CORE, /* 6 SIGABRT */
248 SA_KILL|SA_CORE|SA_TOLWP, /* 7 SIGEMT */
249 SA_KILL|SA_CORE|SA_TOLWP, /* 8 SIGFPE */
250 SA_KILL|SA_CANTMASK|SA_TOALL, /* 9 SIGKILL */
251 SA_KILL|SA_CORE|SA_TOLWP, /* 10 SIGBUS */
252 SA_KILL|SA_CORE|SA_TOLWP, /* 11 SIGSEGV */
253 SA_KILL|SA_CORE|SA_TOLWP, /* 12 SIGSYS */
254 SA_KILL, /* 13 SIGPIPE */
255 SA_KILL, /* 14 SIGALRM */
256 SA_KILL, /* 15 SIGTERM */
257 SA_IGNORE, /* 16 SIGURG */
258 SA_STOP|SA_CANTMASK|SA_TOALL, /* 17 SIGSTOP */
259 SA_STOP|SA_TTYSTOP|SA_TOALL, /* 18 SIGTSTP */
260 SA_IGNORE|SA_CONT|SA_TOALL, /* 19 SIGCONT */
261 SA_IGNORE, /* 20 SIGCHLD */
262 SA_STOP|SA_TTYSTOP|SA_TOALL, /* 21 SIGTTIN */
263 SA_STOP|SA_TTYSTOP|SA_TOALL, /* 22 SIGTTOU */
264 SA_IGNORE, /* 23 SIGIO */
265 SA_KILL, /* 24 SIGXCPU */
266 SA_KILL, /* 25 SIGXFSZ */
267 SA_KILL, /* 26 SIGVTALRM */
268 SA_KILL, /* 27 SIGPROF */
269 SA_IGNORE, /* 28 SIGWINCH */
270 SA_IGNORE, /* 29 SIGINFO */
271 SA_KILL, /* 30 SIGUSR1 */
272 SA_KILL, /* 31 SIGUSR2 */
273 SA_IGNORE|SA_NORESET, /* 32 SIGPWR */
274 SA_KILL, /* 33 SIGRTMIN + 0 */
275 SA_KILL, /* 34 SIGRTMIN + 1 */
276 SA_KILL, /* 35 SIGRTMIN + 2 */
277 SA_KILL, /* 36 SIGRTMIN + 3 */
278 SA_KILL, /* 37 SIGRTMIN + 4 */
279 SA_KILL, /* 38 SIGRTMIN + 5 */
280 SA_KILL, /* 39 SIGRTMIN + 6 */
281 SA_KILL, /* 40 SIGRTMIN + 7 */
282 SA_KILL, /* 41 SIGRTMIN + 8 */
283 SA_KILL, /* 42 SIGRTMIN + 9 */
284 SA_KILL, /* 43 SIGRTMIN + 10 */
285 SA_KILL, /* 44 SIGRTMIN + 11 */
286 SA_KILL, /* 45 SIGRTMIN + 12 */
287 SA_KILL, /* 46 SIGRTMIN + 13 */
288 SA_KILL, /* 47 SIGRTMIN + 14 */
289 SA_KILL, /* 48 SIGRTMIN + 15 */
290 SA_KILL, /* 49 SIGRTMIN + 16 */
291 SA_KILL, /* 50 SIGRTMIN + 17 */
292 SA_KILL, /* 51 SIGRTMIN + 18 */
293 SA_KILL, /* 52 SIGRTMIN + 19 */
294 SA_KILL, /* 53 SIGRTMIN + 20 */
295 SA_KILL, /* 54 SIGRTMIN + 21 */
296 SA_KILL, /* 55 SIGRTMIN + 22 */
297 SA_KILL, /* 56 SIGRTMIN + 23 */
298 SA_KILL, /* 57 SIGRTMIN + 24 */
299 SA_KILL, /* 58 SIGRTMIN + 25 */
300 SA_KILL, /* 59 SIGRTMIN + 26 */
301 SA_KILL, /* 60 SIGRTMIN + 27 */
302 SA_KILL, /* 61 SIGRTMIN + 28 */
303 SA_KILL, /* 62 SIGRTMIN + 29 */
304 SA_KILL, /* 63 SIGRTMIN + 30 */
305 };
306 #undef SIGPROP
307 #else
308 extern const int sigprop[NSIG];
309 #endif /* SIGPROP */
310 #endif /* _KERNEL */
311 #endif /* !_SYS_SIGNALVAR_H_ */
312