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 */ 54 typedef TAILQ_HEAD(ksiginfoq, ksiginfo) ksiginfoq_t; 55 56 /* 57 * Process signal actions, possibly shared between processes. 58 */ 59 struct 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 */ 73 typedef struct sigpend { 74 ksiginfoq_t sp_info; 75 sigset_t sp_set; 76 } sigpend_t; 77 78 /* 79 * Process signal state. 80 */ 81 struct 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 */ 103 static __inline void 104 sigaction_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 132 extern sigset_t contsigmask, stopsigmask, sigcantmask; 133 134 struct vnode; 135 struct coredump_iostate; 136 137 /* 138 * Machine-independent functions: 139 */ 140 int coredump_netbsd(struct lwp *, struct coredump_iostate *); 141 int coredump_netbsd32(struct lwp *, struct coredump_iostate *); 142 int real_coredump_netbsd(struct lwp *, struct coredump_iostate *); 143 void execsigs(struct proc *); 144 int issignal(struct lwp *); 145 void pgsignal(struct pgrp *, int, int); 146 void kpgsignal(struct pgrp *, struct ksiginfo *, void *, int); 147 void postsig(int); 148 void psignal(struct proc *, int); 149 void kpsignal(struct proc *, struct ksiginfo *, void *); 150 void child_psignal(struct proc *, int); 151 void siginit(struct proc *); 152 void trapsignal(struct lwp *, struct ksiginfo *); 153 void sigexit(struct lwp *, int) __dead; 154 void killproc(struct proc *, const char *); 155 void setsigvec(struct proc *, int, struct sigaction *); 156 int killpg1(struct lwp *, struct ksiginfo *, int, int); 157 void proc_unstop(struct proc *p); 158 void eventswitch(int, int, int); 159 void eventswitchchild(struct proc *, int, int); 160 161 int sigaction1(struct lwp *, int, const struct sigaction *, 162 struct sigaction *, const void *, int); 163 int sigprocmask1(struct lwp *, int, const sigset_t *, sigset_t *); 164 void sigpending1(struct lwp *, sigset_t *); 165 void sigsuspendsetup(struct lwp *, const sigset_t *); 166 void sigsuspendteardown(struct lwp *); 167 int sigsuspend1(struct lwp *, const sigset_t *); 168 int sigaltstack1(struct lwp *, const stack_t *, stack_t *); 169 int sigismasked(struct lwp *, int); 170 171 int sigget(sigpend_t *, ksiginfo_t *, int, const sigset_t *); 172 void sigclear(sigpend_t *, const sigset_t *, ksiginfoq_t *); 173 void sigclearall(struct proc *, const sigset_t *, ksiginfoq_t *); 174 175 int kpsignal2(struct proc *, ksiginfo_t *); 176 177 void signal_init(void); 178 179 struct sigacts *sigactsinit(struct proc *, int); 180 void sigactsunshare(struct proc *); 181 void sigactsfree(struct sigacts *); 182 183 void kpsendsig(struct lwp *, const struct ksiginfo *, const sigset_t *); 184 void sendsig_reset(struct lwp *, int); 185 void sendsig(const struct ksiginfo *, const sigset_t *); 186 187 ksiginfo_t *ksiginfo_alloc(struct proc *, ksiginfo_t *, int); 188 void ksiginfo_free(ksiginfo_t *); 189 void ksiginfo_queue_drain0(ksiginfoq_t *); 190 191 struct sys_____sigtimedwait50_args; 192 int sigtimedwait1(struct lwp *, const struct sys_____sigtimedwait50_args *, 193 register_t *, copyin_t, copyout_t, copyin_t, copyout_t); 194 195 void signotify(struct lwp *); 196 int sigispending(struct lwp *, int); 197 198 /* 199 * Machine-dependent functions: 200 */ 201 void sendsig_sigcontext(const struct ksiginfo *, const sigset_t *); 202 void sendsig_siginfo(const struct ksiginfo *, const sigset_t *); 203 204 extern struct pool ksiginfo_pool; 205 206 /* 207 * firstsig: 208 * 209 * Return the first signal in a signal set. 210 */ 211 static __inline int 212 firstsig(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 237 static __inline void 238 ksiginfo_queue_init(ksiginfoq_t *kq) 239 { 240 TAILQ_INIT(kq); 241 } 242 243 static __inline void 244 ksiginfo_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 254 const 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 322 extern const int sigprop[NSIG]; 323 #endif /* SIGPROP */ 324 #endif /* _KERNEL */ 325 #endif /* !_SYS_SIGNALVAR_H_ */ 326