The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/sys/signalvar.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: 06d9ac901fe2c11574bbc38f070310db


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.