linux/include/asm-generic/siginfo.h
<<
>>
Prefs
   1#ifndef _ASM_GENERIC_SIGINFO_H
   2#define _ASM_GENERIC_SIGINFO_H
   3
   4#include <linux/compiler.h>
   5#include <linux/types.h>
   6
   7typedef union sigval {
   8        int sival_int;
   9        void __user *sival_ptr;
  10} sigval_t;
  11
  12/*
  13 * This is the size (including padding) of the part of the
  14 * struct siginfo that is before the union.
  15 */
  16#ifndef __ARCH_SI_PREAMBLE_SIZE
  17#define __ARCH_SI_PREAMBLE_SIZE (3 * sizeof(int))
  18#endif
  19
  20#define SI_MAX_SIZE     128
  21#ifndef SI_PAD_SIZE
  22#define SI_PAD_SIZE     ((SI_MAX_SIZE - __ARCH_SI_PREAMBLE_SIZE) / sizeof(int))
  23#endif
  24
  25#ifndef __ARCH_SI_UID_T
  26#define __ARCH_SI_UID_T uid_t
  27#endif
  28
  29/*
  30 * The default "si_band" type is "long", as specified by POSIX.
  31 * However, some architectures want to override this to "int"
  32 * for historical compatibility reasons, so we allow that.
  33 */
  34#ifndef __ARCH_SI_BAND_T
  35#define __ARCH_SI_BAND_T long
  36#endif
  37
  38#ifndef HAVE_ARCH_SIGINFO_T
  39
  40typedef struct siginfo {
  41        int si_signo;
  42        int si_errno;
  43        int si_code;
  44
  45        union {
  46                int _pad[SI_PAD_SIZE];
  47
  48                /* kill() */
  49                struct {
  50                        pid_t _pid;             /* sender's pid */
  51                        __ARCH_SI_UID_T _uid;   /* sender's uid */
  52                } _kill;
  53
  54                /* POSIX.1b timers */
  55                struct {
  56                        timer_t _tid;           /* timer id */
  57                        int _overrun;           /* overrun count */
  58                        char _pad[sizeof( __ARCH_SI_UID_T) - sizeof(int)];
  59                        sigval_t _sigval;       /* same as below */
  60                        int _sys_private;       /* not to be passed to user */
  61                } _timer;
  62
  63                /* POSIX.1b signals */
  64                struct {
  65                        pid_t _pid;             /* sender's pid */
  66                        __ARCH_SI_UID_T _uid;   /* sender's uid */
  67                        sigval_t _sigval;
  68                } _rt;
  69
  70                /* SIGCHLD */
  71                struct {
  72                        pid_t _pid;             /* which child */
  73                        __ARCH_SI_UID_T _uid;   /* sender's uid */
  74                        int _status;            /* exit code */
  75                        clock_t _utime;
  76                        clock_t _stime;
  77                } _sigchld;
  78
  79                /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
  80                struct {
  81                        void __user *_addr; /* faulting insn/memory ref. */
  82#ifdef __ARCH_SI_TRAPNO
  83                        int _trapno;    /* TRAP # which caused the signal */
  84#endif
  85                } _sigfault;
  86
  87                /* SIGPOLL */
  88                struct {
  89                        __ARCH_SI_BAND_T _band; /* POLL_IN, POLL_OUT, POLL_MSG */
  90                        int _fd;
  91                } _sigpoll;
  92        } _sifields;
  93} siginfo_t;
  94
  95#endif
  96
  97/*
  98 * How these fields are to be accessed.
  99 */
 100#define si_pid          _sifields._kill._pid
 101#define si_uid          _sifields._kill._uid
 102#define si_tid          _sifields._timer._tid
 103#define si_overrun      _sifields._timer._overrun
 104#define si_sys_private  _sifields._timer._sys_private
 105#define si_status       _sifields._sigchld._status
 106#define si_utime        _sifields._sigchld._utime
 107#define si_stime        _sifields._sigchld._stime
 108#define si_value        _sifields._rt._sigval
 109#define si_int          _sifields._rt._sigval.sival_int
 110#define si_ptr          _sifields._rt._sigval.sival_ptr
 111#define si_addr         _sifields._sigfault._addr
 112#ifdef __ARCH_SI_TRAPNO
 113#define si_trapno       _sifields._sigfault._trapno
 114#endif
 115#define si_band         _sifields._sigpoll._band
 116#define si_fd           _sifields._sigpoll._fd
 117
 118#ifdef __KERNEL__
 119#define __SI_MASK       0xffff0000u
 120#define __SI_KILL       (0 << 16)
 121#define __SI_TIMER      (1 << 16)
 122#define __SI_POLL       (2 << 16)
 123#define __SI_FAULT      (3 << 16)
 124#define __SI_CHLD       (4 << 16)
 125#define __SI_RT         (5 << 16)
 126#define __SI_MESGQ      (6 << 16)
 127#define __SI_CODE(T,N)  ((T) | ((N) & 0xffff))
 128#else
 129#define __SI_KILL       0
 130#define __SI_TIMER      0
 131#define __SI_POLL       0
 132#define __SI_FAULT      0
 133#define __SI_CHLD       0
 134#define __SI_RT         0
 135#define __SI_MESGQ      0
 136#define __SI_CODE(T,N)  (N)
 137#endif
 138
 139/*
 140 * si_code values
 141 * Digital reserves positive values for kernel-generated signals.
 142 */
 143#define SI_USER         0               /* sent by kill, sigsend, raise */
 144#define SI_KERNEL       0x80            /* sent by the kernel from somewhere */
 145#define SI_QUEUE        -1              /* sent by sigqueue */
 146#define SI_TIMER __SI_CODE(__SI_TIMER,-2) /* sent by timer expiration */
 147#define SI_MESGQ __SI_CODE(__SI_MESGQ,-3) /* sent by real time mesq state change */
 148#define SI_ASYNCIO      -4              /* sent by AIO completion */
 149#define SI_SIGIO        -5              /* sent by queued SIGIO */
 150#define SI_TKILL        -6              /* sent by tkill system call */
 151#define SI_DETHREAD     -7              /* sent by execve() killing subsidiary threads */
 152
 153#define SI_FROMUSER(siptr)      ((siptr)->si_code <= 0)
 154#define SI_FROMKERNEL(siptr)    ((siptr)->si_code > 0)
 155
 156/*
 157 * SIGILL si_codes
 158 */
 159#define ILL_ILLOPC      (__SI_FAULT|1)  /* illegal opcode */
 160#define ILL_ILLOPN      (__SI_FAULT|2)  /* illegal operand */
 161#define ILL_ILLADR      (__SI_FAULT|3)  /* illegal addressing mode */
 162#define ILL_ILLTRP      (__SI_FAULT|4)  /* illegal trap */
 163#define ILL_PRVOPC      (__SI_FAULT|5)  /* privileged opcode */
 164#define ILL_PRVREG      (__SI_FAULT|6)  /* privileged register */
 165#define ILL_COPROC      (__SI_FAULT|7)  /* coprocessor error */
 166#define ILL_BADSTK      (__SI_FAULT|8)  /* internal stack error */
 167#define NSIGILL         8
 168
 169/*
 170 * SIGFPE si_codes
 171 */
 172#define FPE_INTDIV      (__SI_FAULT|1)  /* integer divide by zero */
 173#define FPE_INTOVF      (__SI_FAULT|2)  /* integer overflow */
 174#define FPE_FLTDIV      (__SI_FAULT|3)  /* floating point divide by zero */
 175#define FPE_FLTOVF      (__SI_FAULT|4)  /* floating point overflow */
 176#define FPE_FLTUND      (__SI_FAULT|5)  /* floating point underflow */
 177#define FPE_FLTRES      (__SI_FAULT|6)  /* floating point inexact result */
 178#define FPE_FLTINV      (__SI_FAULT|7)  /* floating point invalid operation */
 179#define FPE_FLTSUB      (__SI_FAULT|8)  /* subscript out of range */
 180#define NSIGFPE         8
 181
 182/*
 183 * SIGSEGV si_codes
 184 */
 185#define SEGV_MAPERR     (__SI_FAULT|1)  /* address not mapped to object */
 186#define SEGV_ACCERR     (__SI_FAULT|2)  /* invalid permissions for mapped object */
 187#define NSIGSEGV        2
 188
 189/*
 190 * SIGBUS si_codes
 191 */
 192#define BUS_ADRALN      (__SI_FAULT|1)  /* invalid address alignment */
 193#define BUS_ADRERR      (__SI_FAULT|2)  /* non-existant physical address */
 194#define BUS_OBJERR      (__SI_FAULT|3)  /* object specific hardware error */
 195#define NSIGBUS         3
 196
 197/*
 198 * SIGTRAP si_codes
 199 */
 200#define TRAP_BRKPT      (__SI_FAULT|1)  /* process breakpoint */
 201#define TRAP_TRACE      (__SI_FAULT|2)  /* process trace trap */
 202#define NSIGTRAP        2
 203
 204/*
 205 * SIGCHLD si_codes
 206 */
 207#define CLD_EXITED      (__SI_CHLD|1)   /* child has exited */
 208#define CLD_KILLED      (__SI_CHLD|2)   /* child was killed */
 209#define CLD_DUMPED      (__SI_CHLD|3)   /* child terminated abnormally */
 210#define CLD_TRAPPED     (__SI_CHLD|4)   /* traced child has trapped */
 211#define CLD_STOPPED     (__SI_CHLD|5)   /* child has stopped */
 212#define CLD_CONTINUED   (__SI_CHLD|6)   /* stopped child has continued */
 213#define NSIGCHLD        6
 214
 215/*
 216 * SIGPOLL si_codes
 217 */
 218#define POLL_IN         (__SI_POLL|1)   /* data input available */
 219#define POLL_OUT        (__SI_POLL|2)   /* output buffers available */
 220#define POLL_MSG        (__SI_POLL|3)   /* input message available */
 221#define POLL_ERR        (__SI_POLL|4)   /* i/o error */
 222#define POLL_PRI        (__SI_POLL|5)   /* high priority input available */
 223#define POLL_HUP        (__SI_POLL|6)   /* device disconnected */
 224#define NSIGPOLL        6
 225
 226/*
 227 * sigevent definitions
 228 * 
 229 * It seems likely that SIGEV_THREAD will have to be handled from 
 230 * userspace, libpthread transmuting it to SIGEV_SIGNAL, which the
 231 * thread manager then catches and does the appropriate nonsense.
 232 * However, everything is written out here so as to not get lost.
 233 */
 234#define SIGEV_SIGNAL    0       /* notify via signal */
 235#define SIGEV_NONE      1       /* other notification: meaningless */
 236#define SIGEV_THREAD    2       /* deliver via thread creation */
 237#define SIGEV_THREAD_ID 4       /* deliver to thread */
 238
 239/*
 240 * This works because the alignment is ok on all current architectures
 241 * but we leave open this being overridden in the future
 242 */
 243#ifndef __ARCH_SIGEV_PREAMBLE_SIZE
 244#define __ARCH_SIGEV_PREAMBLE_SIZE      (sizeof(int) * 2 + sizeof(sigval_t))
 245#endif
 246
 247#define SIGEV_MAX_SIZE  64
 248#define SIGEV_PAD_SIZE  ((SIGEV_MAX_SIZE - __ARCH_SIGEV_PREAMBLE_SIZE) \
 249                / sizeof(int))
 250
 251typedef struct sigevent {
 252        sigval_t sigev_value;
 253        int sigev_signo;
 254        int sigev_notify;
 255        union {
 256                int _pad[SIGEV_PAD_SIZE];
 257                 int _tid;
 258
 259                struct {
 260                        void (*_function)(sigval_t);
 261                        void *_attribute;       /* really pthread_attr_t */
 262                } _sigev_thread;
 263        } _sigev_un;
 264} sigevent_t;
 265
 266#define sigev_notify_function   _sigev_un._sigev_thread._function
 267#define sigev_notify_attributes _sigev_un._sigev_thread._attribute
 268#define sigev_notify_thread_id   _sigev_un._tid
 269
 270#ifdef __KERNEL__
 271
 272struct siginfo;
 273void do_schedule_next_timer(struct siginfo *info);
 274
 275#ifndef HAVE_ARCH_COPY_SIGINFO
 276
 277#include <linux/string.h>
 278
 279static inline void copy_siginfo(struct siginfo *to, struct siginfo *from)
 280{
 281        if (from->si_code < 0)
 282                memcpy(to, from, sizeof(*to));
 283        else
 284                /* _sigchld is currently the largest know union member */
 285                memcpy(to, from, __ARCH_SI_PREAMBLE_SIZE + sizeof(from->_sifields._sigchld));
 286}
 287
 288#endif
 289
 290extern int copy_siginfo_to_user(struct siginfo __user *to, struct siginfo *from);
 291
 292#endif /* __KERNEL__ */
 293
 294#endif
 295