[32] | 1 | #ifndef _I386_SIGINFO_H
|
---|
| 2 | #define _I386_SIGINFO_H
|
---|
| 3 |
|
---|
| 4 | #include <linux/types.h>
|
---|
| 5 |
|
---|
| 6 | /* XXX: This structure was copied from the Alpha; is there an iBCS version? */
|
---|
| 7 |
|
---|
| 8 | typedef union sigval {
|
---|
| 9 | int sival_int;
|
---|
| 10 | void *sival_ptr;
|
---|
| 11 | } sigval_t;
|
---|
| 12 |
|
---|
| 13 | #define SI_MAX_SIZE 128
|
---|
| 14 | #define SI_PAD_SIZE ((SI_MAX_SIZE/sizeof(int)) - 3)
|
---|
| 15 |
|
---|
| 16 | typedef struct siginfo {
|
---|
| 17 | int si_signo;
|
---|
| 18 | int si_errno;
|
---|
| 19 | int si_code;
|
---|
| 20 |
|
---|
| 21 | union {
|
---|
| 22 | int _pad[SI_PAD_SIZE];
|
---|
| 23 |
|
---|
| 24 | /* kill() */
|
---|
| 25 | struct {
|
---|
| 26 | pid_t _pid; /* sender's pid */
|
---|
| 27 | uid_t _uid; /* sender's uid */
|
---|
| 28 | } _kill;
|
---|
| 29 |
|
---|
| 30 | /* POSIX.1b timers */
|
---|
| 31 | struct {
|
---|
| 32 | unsigned int _timer1;
|
---|
| 33 | unsigned int _timer2;
|
---|
| 34 | } _timer;
|
---|
| 35 |
|
---|
| 36 | /* POSIX.1b signals */
|
---|
| 37 | struct {
|
---|
| 38 | pid_t _pid; /* sender's pid */
|
---|
| 39 | uid_t _uid; /* sender's uid */
|
---|
| 40 | sigval_t _sigval;
|
---|
| 41 | } _rt;
|
---|
| 42 |
|
---|
| 43 | /* SIGCHLD */
|
---|
| 44 | struct {
|
---|
| 45 | pid_t _pid; /* which child */
|
---|
| 46 | uid_t _uid; /* sender's uid */
|
---|
| 47 | int _status; /* exit code */
|
---|
| 48 | clock_t _utime;
|
---|
| 49 | clock_t _stime;
|
---|
| 50 | } _sigchld;
|
---|
| 51 |
|
---|
| 52 | /* SIGILL, SIGFPE, SIGSEGV, SIGBUS */
|
---|
| 53 | struct {
|
---|
| 54 | void *_addr; /* faulting insn/memory ref. */
|
---|
| 55 | } _sigfault;
|
---|
| 56 |
|
---|
| 57 | /* SIGPOLL */
|
---|
| 58 | struct {
|
---|
| 59 | int _band; /* POLL_IN, POLL_OUT, POLL_MSG */
|
---|
| 60 | int _fd;
|
---|
| 61 | } _sigpoll;
|
---|
| 62 | } _sifields;
|
---|
| 63 | } siginfo_t;
|
---|
| 64 |
|
---|
| 65 | /*
|
---|
| 66 | * How these fields are to be accessed.
|
---|
| 67 | */
|
---|
| 68 | #define si_pid _sifields._kill._pid
|
---|
| 69 | #define si_uid _sifields._kill._uid
|
---|
| 70 | #define si_status _sifields._sigchld._status
|
---|
| 71 | #define si_utime _sifields._sigchld._utime
|
---|
| 72 | #define si_stime _sifields._sigchld._stime
|
---|
| 73 | #define si_value _sifields._rt._sigval
|
---|
| 74 | #define si_int _sifields._rt._sigval.sival_int
|
---|
| 75 | #define si_ptr _sifields._rt._sigval.sival_ptr
|
---|
| 76 | #define si_addr _sifields._sigfault._addr
|
---|
| 77 | #define si_band _sifields._sigpoll._band
|
---|
| 78 | #define si_fd _sifields._sigpoll._fd
|
---|
| 79 |
|
---|
| 80 | /*
|
---|
| 81 | * si_code values
|
---|
| 82 | * Digital reserves positive values for kernel-generated signals.
|
---|
| 83 | */
|
---|
| 84 | #define SI_USER 0 /* sent by kill, sigsend, raise */
|
---|
| 85 | #define SI_KERNEL 0x80 /* sent by the kernel from somewhere */
|
---|
| 86 | #define SI_QUEUE -1 /* sent by sigqueue */
|
---|
| 87 | #define SI_TIMER -2 /* sent by timer expiration */
|
---|
| 88 | #define SI_MESGQ -3 /* sent by real time mesq state change */
|
---|
| 89 | #define SI_ASYNCIO -4 /* sent by AIO completion */
|
---|
| 90 | #define SI_SIGIO -5 /* sent by queued SIGIO */
|
---|
| 91 |
|
---|
| 92 | #define SI_FROMUSER(siptr) ((siptr)->si_code <= 0)
|
---|
| 93 | #define SI_FROMKERNEL(siptr) ((siptr)->si_code > 0)
|
---|
| 94 |
|
---|
| 95 | /*
|
---|
| 96 | * SIGILL si_codes
|
---|
| 97 | */
|
---|
| 98 | #define ILL_ILLOPC 1 /* illegal opcode */
|
---|
| 99 | #define ILL_ILLOPN 2 /* illegal operand */
|
---|
| 100 | #define ILL_ILLADR 3 /* illegal addressing mode */
|
---|
| 101 | #define ILL_ILLTRP 4 /* illegal trap */
|
---|
| 102 | #define ILL_PRVOPC 5 /* privileged opcode */
|
---|
| 103 | #define ILL_PRVREG 6 /* privileged register */
|
---|
| 104 | #define ILL_COPROC 7 /* coprocessor error */
|
---|
| 105 | #define ILL_BADSTK 8 /* internal stack error */
|
---|
| 106 | #define NSIGILL 8
|
---|
| 107 |
|
---|
| 108 | /*
|
---|
| 109 | * SIGFPE si_codes
|
---|
| 110 | */
|
---|
| 111 | #define FPE_INTDIV 1 /* integer divide by zero */
|
---|
| 112 | #define FPE_INTOVF 2 /* integer overflow */
|
---|
| 113 | #define FPE_FLTDIV 3 /* floating point divide by zero */
|
---|
| 114 | #define FPE_FLTOVF 4 /* floating point overflow */
|
---|
| 115 | #define FPE_FLTUND 5 /* floating point underflow */
|
---|
| 116 | #define FPE_FLTRES 6 /* floating point inexact result */
|
---|
| 117 | #define FPE_FLTINV 7 /* floating point invalid operation */
|
---|
| 118 | #define FPE_FLTSUB 8 /* subscript out of range */
|
---|
| 119 | #define NSIGFPE 8
|
---|
| 120 |
|
---|
| 121 | /*
|
---|
| 122 | * SIGSEGV si_codes
|
---|
| 123 | */
|
---|
| 124 | #define SEGV_MAPERR 1 /* address not mapped to object */
|
---|
| 125 | #define SEGV_ACCERR 2 /* invalid permissions for mapped object */
|
---|
| 126 | #define NSIGSEGV 2
|
---|
| 127 |
|
---|
| 128 | /*
|
---|
| 129 | * SIGBUS si_codes
|
---|
| 130 | */
|
---|
| 131 | #define BUS_ADRALN 1 /* invalid address alignment */
|
---|
| 132 | #define BUS_ADRERR 2 /* non-existant physical address */
|
---|
| 133 | #define BUS_OBJERR 3 /* object specific hardware error */
|
---|
| 134 | #define NSIGBUS 3
|
---|
| 135 |
|
---|
| 136 | /*
|
---|
| 137 | * SIGTRAP si_codes
|
---|
| 138 | */
|
---|
| 139 | #define TRAP_BRKPT 1 /* process breakpoint */
|
---|
| 140 | #define TRAP_TRACE 2 /* process trace trap */
|
---|
| 141 | #define NSIGTRAP 2
|
---|
| 142 |
|
---|
| 143 | /*
|
---|
| 144 | * SIGCHLD si_codes
|
---|
| 145 | */
|
---|
| 146 | #define CLD_EXITED 1 /* child has exited */
|
---|
| 147 | #define CLD_KILLED 2 /* child was killed */
|
---|
| 148 | #define CLD_DUMPED 3 /* child terminated abnormally */
|
---|
| 149 | #define CLD_TRAPPED 4 /* traced child has trapped */
|
---|
| 150 | #define CLD_STOPPED 5 /* child has stopped */
|
---|
| 151 | #define CLD_CONTINUED 6 /* stopped child has continued */
|
---|
| 152 | #define NSIGCHLD
|
---|
| 153 |
|
---|
| 154 | /*
|
---|
| 155 | * SIGPOLL si_codes
|
---|
| 156 | */
|
---|
| 157 | #define POLL_IN 1 /* data input available */
|
---|
| 158 | #define POLL_OUT 2 /* output buffers available */
|
---|
| 159 | #define POLL_MSG 3 /* input message available */
|
---|
| 160 | #define POLL_ERR 4 /* i/o error */
|
---|
| 161 | #define POLL_PRI 5 /* high priority input available */
|
---|
| 162 | #define POLL_HUP 6 /* device disconnected */
|
---|
| 163 | #define NSIGPOLL 6
|
---|
| 164 |
|
---|
| 165 | /*
|
---|
| 166 | * sigevent definitions
|
---|
| 167 | *
|
---|
| 168 | * It seems likely that SIGEV_THREAD will have to be handled from
|
---|
| 169 | * userspace, libpthread transmuting it to SIGEV_SIGNAL, which the
|
---|
| 170 | * thread manager then catches and does the appropriate nonsense.
|
---|
| 171 | * However, everything is written out here so as to not get lost.
|
---|
| 172 | */
|
---|
| 173 | #define SIGEV_SIGNAL 0 /* notify via signal */
|
---|
| 174 | #define SIGEV_NONE 1 /* other notification: meaningless */
|
---|
| 175 | #define SIGEV_THREAD 2 /* deliver via thread creation */
|
---|
| 176 |
|
---|
| 177 | #define SIGEV_MAX_SIZE 64
|
---|
| 178 | #define SIGEV_PAD_SIZE ((SIGEV_MAX_SIZE/sizeof(int)) - 3)
|
---|
| 179 |
|
---|
| 180 | typedef struct sigevent {
|
---|
| 181 | sigval_t sigev_value;
|
---|
| 182 | int sigev_signo;
|
---|
| 183 | int sigev_notify;
|
---|
| 184 | union {
|
---|
| 185 | int _pad[SIGEV_PAD_SIZE];
|
---|
| 186 |
|
---|
| 187 | struct {
|
---|
| 188 | void (*_function)(sigval_t);
|
---|
| 189 | void *_attribute; /* really pthread_attr_t */
|
---|
| 190 | } _sigev_thread;
|
---|
| 191 | } _sigev_un;
|
---|
| 192 | } sigevent_t;
|
---|
| 193 |
|
---|
| 194 | #define sigev_notify_function _sigev_un._sigev_thread._function
|
---|
| 195 | #define sigev_notify_attributes _sigev_un._sigev_thread._attribute
|
---|
| 196 |
|
---|
| 197 | #endif
|
---|