master
1/* $NetBSD: signalvar.h,v 1.104 2021/11/01 05:07:17 thorpej 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#include <sys/stdbool.h>
41
42#ifndef _KERNEL
43#include <string.h> /* Required for memset(3) and memcpy(3) prototypes */
44#endif /* _KERNEL */
45
46/*
47 * Kernel signal definitions and data structures,
48 * not exported to user programs.
49 */
50
51/*
52 * Queue of signals.
53 */
54typedef TAILQ_HEAD(ksiginfoq, ksiginfo) ksiginfoq_t;
55
56/*
57 * Process signal actions, possibly shared between processes.
58 */
59struct sigacts {
60 struct sigact_sigdesc {
61 struct sigaction sd_sigact;
62 const void *sd_tramp;
63 int sd_vers;
64 } sa_sigdesc[NSIG]; /* disposition of signals */
65
66 int sa_refcnt; /* reference count */
67 kmutex_t sa_mutex; /* lock on sa_refcnt */
68};
69
70/*
71 * Pending signals, per LWP and per process.
72 */
73typedef struct sigpend {
74 ksiginfoq_t sp_info;
75 sigset_t sp_set;
76} sigpend_t;
77
78/*
79 * Process signal state.
80 */
81struct sigctx {
82 struct _ksiginfo ps_info; /* for core dump/debugger XXX */
83 int ps_lwp; /* for core dump/debugger XXX */
84 bool ps_faked; /* for core dump/debugger XXX */
85 void *ps_sigcode; /* address of signal trampoline */
86 sigset_t ps_sigignore; /* Signals being ignored. */
87 sigset_t ps_sigcatch; /* Signals being caught by user. */
88 sigset_t ps_sigpass; /* Signals evading the debugger. */
89};
90
91/* additional signal action values, used only temporarily/internally */
92#define SIG_CATCH (void (*)(int))2
93
94/*
95 * get signal action for process and signal; currently only for current process
96 */
97#define SIGACTION(p, sig) (p->p_sigacts->sa_sigdesc[(sig)].sd_sigact)
98#define SIGACTION_PS(ps, sig) (ps->sa_sigdesc[(sig)].sd_sigact)
99
100/*
101 * Copy a sigaction structure without padding.
102 */
103static __inline void
104sigaction_copy(struct sigaction *dst, const struct sigaction *src)
105{
106 memset(dst, 0, sizeof(*dst));
107 dst->_sa_u._sa_handler = src->_sa_u._sa_handler;
108 memcpy(&dst->sa_mask, &src->sa_mask, sizeof(dst->sa_mask));
109 dst->sa_flags = src->sa_flags;
110}
111
112/*
113 * Signal properties and actions.
114 * The array below categorizes the signals and their default actions
115 * according to the following properties:
116 */
117#define SA_KILL 0x0001 /* terminates process by default */
118#define SA_CORE 0x0002 /* ditto and coredumps */
119#define SA_STOP 0x0004 /* suspend process */
120#define SA_TTYSTOP 0x0008 /* ditto, from tty */
121#define SA_IGNORE 0x0010 /* ignore by default */
122#define SA_CONT 0x0020 /* continue if suspended */
123#define SA_CANTMASK 0x0040 /* non-maskable, catchable */
124#define SA_NORESET 0x0080 /* not reset when caught */
125#define SA_TOLWP 0x0100 /* to LWP that generated, if local */
126#define SA_TOALL 0x0200 /* always to all LWPs */
127
128#ifdef _KERNEL
129
130#include <sys/systm.h> /* for copyin_t/copyout_t */
131
132extern sigset_t contsigmask, stopsigmask, sigcantmask;
133
134struct vnode;
135struct coredump_iostate;
136
137/*
138 * Machine-independent functions:
139 */
140int coredump_netbsd(struct lwp *, struct coredump_iostate *);
141int coredump_netbsd32(struct lwp *, struct coredump_iostate *);
142int real_coredump_netbsd(struct lwp *, struct coredump_iostate *);
143void execsigs(struct proc *);
144int issignal(struct lwp *);
145void pgsignal(struct pgrp *, int, int);
146void kpgsignal(struct pgrp *, struct ksiginfo *, void *, int);
147void postsig(int);
148void psignal(struct proc *, int);
149void kpsignal(struct proc *, struct ksiginfo *, void *);
150void child_psignal(struct proc *, int);
151void siginit(struct proc *);
152void trapsignal(struct lwp *, struct ksiginfo *);
153void sigexit(struct lwp *, int) __dead;
154void killproc(struct proc *, const char *);
155void setsigvec(struct proc *, int, struct sigaction *);
156int killpg1(struct lwp *, struct ksiginfo *, int, int);
157void proc_unstop(struct proc *p);
158void eventswitch(int, int, int);
159void eventswitchchild(struct proc *, int, int);
160
161int sigaction1(struct lwp *, int, const struct sigaction *,
162 struct sigaction *, const void *, int);
163int sigprocmask1(struct lwp *, int, const sigset_t *, sigset_t *);
164void sigpending1(struct lwp *, sigset_t *);
165void sigsuspendsetup(struct lwp *, const sigset_t *);
166void sigsuspendteardown(struct lwp *);
167int sigsuspend1(struct lwp *, const sigset_t *);
168int sigaltstack1(struct lwp *, const stack_t *, stack_t *);
169int sigismasked(struct lwp *, int);
170
171int sigget(sigpend_t *, ksiginfo_t *, int, const sigset_t *);
172void sigclear(sigpend_t *, const sigset_t *, ksiginfoq_t *);
173void sigclearall(struct proc *, const sigset_t *, ksiginfoq_t *);
174
175int kpsignal2(struct proc *, ksiginfo_t *);
176
177void signal_init(void);
178
179struct sigacts *sigactsinit(struct proc *, int);
180void sigactsunshare(struct proc *);
181void sigactsfree(struct sigacts *);
182
183void kpsendsig(struct lwp *, const struct ksiginfo *, const sigset_t *);
184void sendsig_reset(struct lwp *, int);
185void sendsig(const struct ksiginfo *, const sigset_t *);
186
187ksiginfo_t *ksiginfo_alloc(struct proc *, ksiginfo_t *, int);
188void ksiginfo_free(ksiginfo_t *);
189void ksiginfo_queue_drain0(ksiginfoq_t *);
190
191struct sys_____sigtimedwait50_args;
192int sigtimedwait1(struct lwp *, const struct sys_____sigtimedwait50_args *,
193 register_t *, copyin_t, copyout_t, copyin_t, copyout_t);
194
195void signotify(struct lwp *);
196int sigispending(struct lwp *, int);
197
198/*
199 * Machine-dependent functions:
200 */
201void sendsig_sigcontext(const struct ksiginfo *, const sigset_t *);
202void sendsig_siginfo(const struct ksiginfo *, const sigset_t *);
203
204extern struct pool ksiginfo_pool;
205
206/*
207 * firstsig:
208 *
209 * Return the first signal in a signal set.
210 */
211static __inline int
212firstsig(const sigset_t *ss)
213{
214 int sig;
215
216 sig = ffs(ss->__bits[0]);
217 if (sig != 0)
218 return (sig);
219#if NSIG > 33
220 sig = ffs(ss->__bits[1]);
221 if (sig != 0)
222 return (sig + 32);
223#endif
224#if NSIG > 65
225 sig = ffs(ss->__bits[2]);
226 if (sig != 0)
227 return (sig + 64);
228#endif
229#if NSIG > 97
230 sig = ffs(ss->__bits[3]);
231 if (sig != 0)
232 return (sig + 96);
233#endif
234 return (0);
235}
236
237static __inline void
238ksiginfo_queue_init(ksiginfoq_t *kq)
239{
240 TAILQ_INIT(kq);
241}
242
243static __inline void
244ksiginfo_queue_drain(ksiginfoq_t *kq)
245{
246 if (!TAILQ_EMPTY(kq))
247 ksiginfo_queue_drain0(kq);
248}
249
250#endif /* _KERNEL */
251
252#ifdef _KERNEL
253#ifdef SIGPROP
254const int sigprop[NSIG] = {
255 0, /* 0 unused */
256 SA_KILL, /* 1 SIGHUP */
257 SA_KILL, /* 2 SIGINT */
258 SA_KILL|SA_CORE, /* 3 SIGQUIT */
259 SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP, /* 4 SIGILL */
260 SA_KILL|SA_CORE|SA_NORESET|SA_TOLWP, /* 5 SIGTRAP */
261 SA_KILL|SA_CORE, /* 6 SIGABRT */
262 SA_KILL|SA_CORE|SA_TOLWP, /* 7 SIGEMT */
263 SA_KILL|SA_CORE|SA_TOLWP, /* 8 SIGFPE */
264 SA_KILL|SA_CANTMASK|SA_TOALL, /* 9 SIGKILL */
265 SA_KILL|SA_CORE|SA_TOLWP, /* 10 SIGBUS */
266 SA_KILL|SA_CORE|SA_TOLWP, /* 11 SIGSEGV */
267 SA_KILL|SA_CORE|SA_TOLWP, /* 12 SIGSYS */
268 SA_KILL, /* 13 SIGPIPE */
269 SA_KILL, /* 14 SIGALRM */
270 SA_KILL, /* 15 SIGTERM */
271 SA_IGNORE, /* 16 SIGURG */
272 SA_STOP|SA_CANTMASK|SA_TOALL, /* 17 SIGSTOP */
273 SA_STOP|SA_TTYSTOP|SA_TOALL, /* 18 SIGTSTP */
274 SA_IGNORE|SA_CONT|SA_TOALL, /* 19 SIGCONT */
275 SA_IGNORE, /* 20 SIGCHLD */
276 SA_STOP|SA_TTYSTOP|SA_TOALL, /* 21 SIGTTIN */
277 SA_STOP|SA_TTYSTOP|SA_TOALL, /* 22 SIGTTOU */
278 SA_IGNORE, /* 23 SIGIO */
279 SA_KILL, /* 24 SIGXCPU */
280 SA_KILL, /* 25 SIGXFSZ */
281 SA_KILL, /* 26 SIGVTALRM */
282 SA_KILL, /* 27 SIGPROF */
283 SA_IGNORE, /* 28 SIGWINCH */
284 SA_IGNORE, /* 29 SIGINFO */
285 SA_KILL, /* 30 SIGUSR1 */
286 SA_KILL, /* 31 SIGUSR2 */
287 SA_IGNORE|SA_NORESET, /* 32 SIGPWR */
288 SA_KILL, /* 33 SIGRTMIN + 0 */
289 SA_KILL, /* 34 SIGRTMIN + 1 */
290 SA_KILL, /* 35 SIGRTMIN + 2 */
291 SA_KILL, /* 36 SIGRTMIN + 3 */
292 SA_KILL, /* 37 SIGRTMIN + 4 */
293 SA_KILL, /* 38 SIGRTMIN + 5 */
294 SA_KILL, /* 39 SIGRTMIN + 6 */
295 SA_KILL, /* 40 SIGRTMIN + 7 */
296 SA_KILL, /* 41 SIGRTMIN + 8 */
297 SA_KILL, /* 42 SIGRTMIN + 9 */
298 SA_KILL, /* 43 SIGRTMIN + 10 */
299 SA_KILL, /* 44 SIGRTMIN + 11 */
300 SA_KILL, /* 45 SIGRTMIN + 12 */
301 SA_KILL, /* 46 SIGRTMIN + 13 */
302 SA_KILL, /* 47 SIGRTMIN + 14 */
303 SA_KILL, /* 48 SIGRTMIN + 15 */
304 SA_KILL, /* 49 SIGRTMIN + 16 */
305 SA_KILL, /* 50 SIGRTMIN + 17 */
306 SA_KILL, /* 51 SIGRTMIN + 18 */
307 SA_KILL, /* 52 SIGRTMIN + 19 */
308 SA_KILL, /* 53 SIGRTMIN + 20 */
309 SA_KILL, /* 54 SIGRTMIN + 21 */
310 SA_KILL, /* 55 SIGRTMIN + 22 */
311 SA_KILL, /* 56 SIGRTMIN + 23 */
312 SA_KILL, /* 57 SIGRTMIN + 24 */
313 SA_KILL, /* 58 SIGRTMIN + 25 */
314 SA_KILL, /* 59 SIGRTMIN + 26 */
315 SA_KILL, /* 60 SIGRTMIN + 27 */
316 SA_KILL, /* 61 SIGRTMIN + 28 */
317 SA_KILL, /* 62 SIGRTMIN + 29 */
318 SA_KILL, /* 63 SIGRTMIN + 30 */
319};
320#undef SIGPROP
321#else
322extern const int sigprop[NSIG];
323#endif /* SIGPROP */
324#endif /* _KERNEL */
325#endif /* !_SYS_SIGNALVAR_H_ */