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_ */