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