root / lab4 / .minix-src / include / sys / signalvar.h @ 13
History | View | Annotate | Download (9.55 KB)
1 | 13 | up20180614 | /* $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 | #if !defined(__minix)
|
||
86 | /* additional signal action values, used only temporarily/internally */
|
||
87 | #define SIG_CATCH (void (*)(int))2 |
||
88 | #endif /* !defined(__minix) */ |
||
89 | |||
90 | /*
|
||
91 | * get signal action for process and signal; currently only for current process
|
||
92 | */
|
||
93 | #define SIGACTION(p, sig) (p->p_sigacts->sa_sigdesc[(sig)].sd_sigact)
|
||
94 | #define SIGACTION_PS(ps, sig) (ps->sa_sigdesc[(sig)].sd_sigact)
|
||
95 | |||
96 | /*
|
||
97 | * Signal properties and actions.
|
||
98 | * The array below categorizes the signals and their default actions
|
||
99 | * according to the following properties:
|
||
100 | */
|
||
101 | #define SA_KILL 0x0001 /* terminates process by default */ |
||
102 | #define SA_CORE 0x0002 /* ditto and coredumps */ |
||
103 | #define SA_STOP 0x0004 /* suspend process */ |
||
104 | #define SA_TTYSTOP 0x0008 /* ditto, from tty */ |
||
105 | #define SA_IGNORE 0x0010 /* ignore by default */ |
||
106 | #define SA_CONT 0x0020 /* continue if suspended */ |
||
107 | #define SA_CANTMASK 0x0040 /* non-maskable, catchable */ |
||
108 | #define SA_NORESET 0x0080 /* not reset when caught */ |
||
109 | #define SA_TOLWP 0x0100 /* to LWP that generated, if local */ |
||
110 | #define SA_TOALL 0x0200 /* always to all LWPs */ |
||
111 | |||
112 | #ifdef _KERNEL
|
||
113 | |||
114 | #include <sys/systm.h> /* for copyin_t/copyout_t */ |
||
115 | |||
116 | extern sigset_t contsigmask, sigcantmask;
|
||
117 | |||
118 | struct vnode;
|
||
119 | struct coredump_iostate;
|
||
120 | |||
121 | /*
|
||
122 | * Machine-independent functions:
|
||
123 | */
|
||
124 | int coredump_netbsd(struct lwp *, struct coredump_iostate *); |
||
125 | void execsigs(struct proc *); |
||
126 | int issignal(struct lwp *); |
||
127 | void pgsignal(struct pgrp *, int, int); |
||
128 | void kpgsignal(struct pgrp *, struct ksiginfo *, void *, int); |
||
129 | void postsig(int); |
||
130 | void psignal(struct proc *, int); |
||
131 | void kpsignal(struct proc *, struct ksiginfo *, void *); |
||
132 | void child_psignal(struct proc *, int); |
||
133 | void siginit(struct proc *); |
||
134 | void trapsignal(struct lwp *, struct ksiginfo *); |
||
135 | void sigexit(struct lwp *, int) __dead; |
||
136 | void killproc(struct proc *, const char *); |
||
137 | void setsigvec(struct proc *, int, struct sigaction *); |
||
138 | int killpg1(struct lwp *, struct ksiginfo *, int, int); |
||
139 | void proc_unstop(struct proc *p); |
||
140 | |||
141 | int sigaction1(struct lwp *, int, const struct sigaction *, |
||
142 | struct sigaction *, const void *, int); |
||
143 | int sigprocmask1(struct lwp *, int, const sigset_t *, sigset_t *); |
||
144 | void sigpending1(struct lwp *, sigset_t *); |
||
145 | void sigsuspendsetup(struct lwp *, const sigset_t *); |
||
146 | void sigsuspendteardown(struct lwp *); |
||
147 | int sigsuspend1(struct lwp *, const sigset_t *); |
||
148 | int sigaltstack1(struct lwp *, const struct sigaltstack *, |
||
149 | struct sigaltstack *);
|
||
150 | int sigismasked(struct lwp *, int); |
||
151 | |||
152 | int sigget(sigpend_t *, ksiginfo_t *, int, const sigset_t *); |
||
153 | void sigclear(sigpend_t *, const sigset_t *, ksiginfoq_t *); |
||
154 | void sigclearall(struct proc *, const sigset_t *, ksiginfoq_t *); |
||
155 | |||
156 | void kpsignal2(struct proc *, ksiginfo_t *); |
||
157 | |||
158 | void signal_init(void); |
||
159 | |||
160 | struct sigacts *sigactsinit(struct proc *, int); |
||
161 | void sigactsunshare(struct proc *); |
||
162 | void sigactsfree(struct sigacts *); |
||
163 | |||
164 | void kpsendsig(struct lwp *, const struct ksiginfo *, const sigset_t *); |
||
165 | void sendsig_reset(struct lwp *, int); |
||
166 | void sendsig(const struct ksiginfo *, const sigset_t *); |
||
167 | |||
168 | ksiginfo_t *ksiginfo_alloc(struct proc *, ksiginfo_t *, int); |
||
169 | void ksiginfo_free(ksiginfo_t *);
|
||
170 | void ksiginfo_queue_drain0(ksiginfoq_t *);
|
||
171 | |||
172 | struct sys_____sigtimedwait50_args;
|
||
173 | int sigtimedwait1(struct lwp *, const struct sys_____sigtimedwait50_args *, |
||
174 | register_t *, copyin_t, copyout_t, copyin_t, copyout_t); |
||
175 | |||
176 | void signotify(struct lwp *); |
||
177 | int sigispending(struct lwp *, int); |
||
178 | |||
179 | /*
|
||
180 | * Machine-dependent functions:
|
||
181 | */
|
||
182 | void sendsig_sigcontext(const struct ksiginfo *, const sigset_t *); |
||
183 | void sendsig_siginfo(const struct ksiginfo *, const sigset_t *); |
||
184 | |||
185 | extern struct pool ksiginfo_pool; |
||
186 | |||
187 | /*
|
||
188 | * Modularity / compatibility.
|
||
189 | */
|
||
190 | extern void (*sendsig_sigcontext_vec)(const struct ksiginfo *, |
||
191 | const sigset_t *);
|
||
192 | extern int (*coredump_vec)(struct lwp *, const char *); |
||
193 | |||
194 | /*
|
||
195 | * firstsig:
|
||
196 | *
|
||
197 | * Return the first signal in a signal set.
|
||
198 | */
|
||
199 | static inline int |
||
200 | firstsig(const sigset_t *ss)
|
||
201 | { |
||
202 | int sig;
|
||
203 | |||
204 | sig = ffs(ss->__bits[0]);
|
||
205 | if (sig != 0) |
||
206 | return (sig);
|
||
207 | #if NSIG > 33 |
||
208 | sig = ffs(ss->__bits[1]);
|
||
209 | if (sig != 0) |
||
210 | return (sig + 32); |
||
211 | #endif
|
||
212 | #if NSIG > 65 |
||
213 | sig = ffs(ss->__bits[2]);
|
||
214 | if (sig != 0) |
||
215 | return (sig + 64); |
||
216 | #endif
|
||
217 | #if NSIG > 97 |
||
218 | sig = ffs(ss->__bits[3]);
|
||
219 | if (sig != 0) |
||
220 | return (sig + 96); |
||
221 | #endif
|
||
222 | return (0); |
||
223 | } |
||
224 | |||
225 | static inline void |
||
226 | ksiginfo_queue_init(ksiginfoq_t *kq) |
||
227 | { |
||
228 | TAILQ_INIT(kq); |
||
229 | } |
||
230 | |||
231 | static inline void |
||
232 | ksiginfo_queue_drain(ksiginfoq_t *kq) |
||
233 | { |
||
234 | if (!TAILQ_EMPTY(kq))
|
||
235 | ksiginfo_queue_drain0(kq); |
||
236 | } |
||
237 | |||
238 | #endif /* _KERNEL */ |
||
239 | |||
240 | #ifdef _KERNEL
|
||
241 | #ifdef SIGPROP
|
||
242 | const int sigprop[NSIG] = { |
||
243 | 0, /* 0 unused */ |
||
244 | SA_KILL, /* 1 SIGHUP */
|
||
245 | SA_KILL, /* 2 SIGINT */
|
||
246 | SA_KILL|SA_CORE, /* 3 SIGQUIT */
|
||
247 | SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP, /* 4 SIGILL */
|
||
248 | SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP, /* 5 SIGTRAP */
|
||
249 | SA_KILL|SA_CORE, /* 6 SIGABRT */
|
||
250 | SA_KILL|SA_CORE|SA_TOLWP, /* 7 SIGEMT */
|
||
251 | SA_KILL|SA_CORE|SA_TOLWP, /* 8 SIGFPE */
|
||
252 | SA_KILL|SA_CANTMASK|SA_TOALL, /* 9 SIGKILL */
|
||
253 | SA_KILL|SA_CORE|SA_TOLWP, /* 10 SIGBUS */
|
||
254 | SA_KILL|SA_CORE|SA_TOLWP, /* 11 SIGSEGV */
|
||
255 | SA_KILL|SA_CORE|SA_TOLWP, /* 12 SIGSYS */
|
||
256 | SA_KILL, /* 13 SIGPIPE */
|
||
257 | SA_KILL, /* 14 SIGALRM */
|
||
258 | SA_KILL, /* 15 SIGTERM */
|
||
259 | SA_IGNORE, /* 16 SIGURG */
|
||
260 | SA_STOP|SA_CANTMASK|SA_TOALL, /* 17 SIGSTOP */
|
||
261 | SA_STOP|SA_TTYSTOP|SA_TOALL, /* 18 SIGTSTP */
|
||
262 | SA_IGNORE|SA_CONT|SA_TOALL, /* 19 SIGCONT */
|
||
263 | SA_IGNORE, /* 20 SIGCHLD */
|
||
264 | SA_STOP|SA_TTYSTOP|SA_TOALL, /* 21 SIGTTIN */
|
||
265 | SA_STOP|SA_TTYSTOP|SA_TOALL, /* 22 SIGTTOU */
|
||
266 | SA_IGNORE, /* 23 SIGIO */
|
||
267 | SA_KILL, /* 24 SIGXCPU */
|
||
268 | SA_KILL, /* 25 SIGXFSZ */
|
||
269 | SA_KILL, /* 26 SIGVTALRM */
|
||
270 | SA_KILL, /* 27 SIGPROF */
|
||
271 | SA_IGNORE, /* 28 SIGWINCH */
|
||
272 | SA_IGNORE, /* 29 SIGINFO */
|
||
273 | SA_KILL, /* 30 SIGUSR1 */
|
||
274 | SA_KILL, /* 31 SIGUSR2 */
|
||
275 | SA_IGNORE|SA_NORESET, /* 32 SIGPWR */
|
||
276 | SA_KILL, /* 33 SIGRTMIN + 0 */
|
||
277 | SA_KILL, /* 34 SIGRTMIN + 1 */
|
||
278 | SA_KILL, /* 35 SIGRTMIN + 2 */
|
||
279 | SA_KILL, /* 36 SIGRTMIN + 3 */
|
||
280 | SA_KILL, /* 37 SIGRTMIN + 4 */
|
||
281 | SA_KILL, /* 38 SIGRTMIN + 5 */
|
||
282 | SA_KILL, /* 39 SIGRTMIN + 6 */
|
||
283 | SA_KILL, /* 40 SIGRTMIN + 7 */
|
||
284 | SA_KILL, /* 41 SIGRTMIN + 8 */
|
||
285 | SA_KILL, /* 42 SIGRTMIN + 9 */
|
||
286 | SA_KILL, /* 43 SIGRTMIN + 10 */
|
||
287 | SA_KILL, /* 44 SIGRTMIN + 11 */
|
||
288 | SA_KILL, /* 45 SIGRTMIN + 12 */
|
||
289 | SA_KILL, /* 46 SIGRTMIN + 13 */
|
||
290 | SA_KILL, /* 47 SIGRTMIN + 14 */
|
||
291 | SA_KILL, /* 48 SIGRTMIN + 15 */
|
||
292 | SA_KILL, /* 49 SIGRTMIN + 16 */
|
||
293 | SA_KILL, /* 50 SIGRTMIN + 17 */
|
||
294 | SA_KILL, /* 51 SIGRTMIN + 18 */
|
||
295 | SA_KILL, /* 52 SIGRTMIN + 19 */
|
||
296 | SA_KILL, /* 53 SIGRTMIN + 20 */
|
||
297 | SA_KILL, /* 54 SIGRTMIN + 21 */
|
||
298 | SA_KILL, /* 55 SIGRTMIN + 22 */
|
||
299 | SA_KILL, /* 56 SIGRTMIN + 23 */
|
||
300 | SA_KILL, /* 57 SIGRTMIN + 24 */
|
||
301 | SA_KILL, /* 58 SIGRTMIN + 25 */
|
||
302 | SA_KILL, /* 59 SIGRTMIN + 26 */
|
||
303 | SA_KILL, /* 60 SIGRTMIN + 27 */
|
||
304 | SA_KILL, /* 61 SIGRTMIN + 28 */
|
||
305 | SA_KILL, /* 62 SIGRTMIN + 29 */
|
||
306 | SA_KILL, /* 63 SIGRTMIN + 30 */
|
||
307 | }; |
||
308 | #undef SIGPROP
|
||
309 | #else
|
||
310 | extern const int sigprop[NSIG]; |
||
311 | #endif /* SIGPROP */ |
||
312 | #endif /* _KERNEL */ |
||
313 | #endif /* !_SYS_SIGNALVAR_H_ */ |