1 /* siginfo_t, sigevent and constants. Linux/MIPS version. 2 Copyright (C) 1997, 1998, 2000, 2001, 2002, 2003, 2004, 2005 3 Free Software Foundation, Inc. 4 This file is part of the GNU C Library. 5 6 The GNU C Library is free software; you can redistribute it and/or 7 modify it under the terms of the GNU Lesser General Public 8 License as published by the Free Software Foundation; either 9 version 2.1 of the License, or (at your option) any later version. 10 11 The GNU C Library is distributed in the hope that it will be useful, 12 but WITHOUT ANY WARRANTY; without even the implied warranty of 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 Lesser General Public License for more details. 15 16 You should have received a copy of the GNU Lesser General Public 17 License along with the GNU C Library; if not, see 18 <http://www.gnu.org/licenses/>. */ 19 20 #if !defined _SIGNAL_H && !defined __need_siginfo_t \ 21 && !defined __need_sigevent_t 22 # error "Never include this file directly. Use <signal.h> instead" 23 #endif 24 25 #include <bits/wordsize.h> 26 27 #if (!defined __have_sigval_t \ 28 && (defined _SIGNAL_H || defined __need_siginfo_t \ 29 || defined __need_sigevent_t)) 30 # define __have_sigval_t 1 31 32 /* Type for data associated with a signal. */ 33 typedef union sigval 34 { 35 int sival_int; 36 void *sival_ptr; 37 } sigval_t; 38 #endif 39 40 #if (!defined __have_siginfo_t \ 41 && (defined _SIGNAL_H || defined __need_siginfo_t)) 42 # define __have_siginfo_t 1 43 44 # define __SI_MAX_SIZE 128 45 # if __WORDSIZE == 64 46 # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4) 47 # else 48 # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 3) 49 # endif 50 51 52 typedef struct siginfo 53 { 54 int si_signo; /* Signal number. */ 55 int si_code; /* Signal code. */ 56 int si_errno; /* If non-zero, an errno value associated with 57 this signal, as defined in <errno.h>. */ 58 int __pad0[__SI_MAX_SIZE / sizeof (int) - __SI_PAD_SIZE - 3]; 59 /* Explicit padding. */ 60 61 union 62 { 63 int _pad[__SI_PAD_SIZE]; 64 65 /* kill(). */ 66 struct 67 { 68 __pid_t si_pid; /* Sending process ID. */ 69 __uid_t si_uid; /* Real user ID of sending process. */ 70 } _kill; 71 72 /* POSIX.1b timers. */ 73 struct 74 { 75 int si_tid; /* Timer ID. */ 76 int si_overrun; /* Overrun count. */ 77 sigval_t si_sigval; /* Signal value. */ 78 } _timer; 79 80 /* POSIX.1b signals. */ 81 struct 82 { 83 __pid_t si_pid; /* Sending process ID. */ 84 __uid_t si_uid; /* Real user ID of sending process. */ 85 sigval_t si_sigval; /* Signal value. */ 86 } _rt; 87 88 /* SIGCHLD. */ 89 struct 90 { 91 __pid_t si_pid; /* Which child. */ 92 __uid_t si_uid; /* Real user ID of sending process. */ 93 int si_status; /* Exit value or signal. */ 94 __clock_t si_utime; 95 __clock_t si_stime; 96 } _sigchld; 97 98 /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */ 99 struct 100 { 101 void *si_addr; /* Faulting insn/memory ref. */ 102 short int si_addr_lsb; /* Valid LSB of the reported address. */ 103 } _sigfault; 104 105 /* SIGPOLL. */ 106 struct 107 { 108 long int si_band; /* Band event for SIGPOLL. */ 109 int si_fd; 110 } _sigpoll; 111 112 /* SIGSYS. */ 113 struct 114 { 115 void *_call_addr; /* Calling user insn. */ 116 int _syscall; /* Triggering system call number. */ 117 unsigned int _arch; /* AUDIT_ARCH_* of syscall. */ 118 } _sigsys; 119 } _sifields; 120 } siginfo_t; 121 122 123 /* X/Open requires some more fields with fixed names. */ 124 # define si_pid _sifields._kill.si_pid 125 # define si_uid _sifields._kill.si_uid 126 # define si_timerid _sifields._timer.si_tid 127 # define si_overrun _sifields._timer.si_overrun 128 # define si_status _sifields._sigchld.si_status 129 # define si_utime _sifields._sigchld.si_utime 130 # define si_stime _sifields._sigchld.si_stime 131 # define si_value _sifields._rt.si_sigval 132 # define si_int _sifields._rt.si_sigval.sival_int 133 # define si_ptr _sifields._rt.si_sigval.sival_ptr 134 # define si_addr _sifields._sigfault.si_addr 135 # define si_addr_lsb _sifields._sigfault.si_addr_lsb 136 # define si_band _sifields._sigpoll.si_band 137 # define si_fd _sifields._sigpoll.si_fd 138 # define si_call_addr _sifields._sigsys._call_addr 139 # define si_syscall _sifields._sigsys._syscall 140 # define si_arch _sifields._sigsys._arch 141 142 143 /* Values for `si_code'. Positive values are reserved for kernel-generated 144 signals. */ 145 enum 146 { 147 SI_ASYNCNL = -60, /* Sent by asynch name lookup completion. */ 148 # define SI_ASYNCNL SI_ASYNCNL 149 SI_TKILL = -6, /* Sent by tkill. */ 150 # define SI_TKILL SI_TKILL 151 SI_SIGIO, /* Sent by queued SIGIO. */ 152 # define SI_SIGIO SI_SIGIO 153 SI_MESGQ, /* Sent by real time mesq state change. */ 154 # define SI_MESGQ SI_MESGQ 155 SI_TIMER, /* Sent by real time mesq state change. */ 156 # define SI_TIMER SI_TIMER 157 SI_ASYNCIO, /* Sent by AIO completion. */ 158 # define SI_ASYNCIO SI_ASYNCIO 159 SI_QUEUE, /* Sent by sigqueue. */ 160 # define SI_QUEUE SI_QUEUE 161 SI_USER, /* Sent by kill, sigsend. */ 162 # define SI_USER SI_USER 163 SI_KERNEL = 0x80 /* Send by kernel. */ 164 #define SI_KERNEL SI_KERNEL 165 }; 166 167 168 # if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 169 /* `si_code' values for SIGILL signal. */ 170 enum 171 { 172 ILL_ILLOPC = 1, /* Illegal opcode. */ 173 # define ILL_ILLOPC ILL_ILLOPC 174 ILL_ILLOPN, /* Illegal operand. */ 175 # define ILL_ILLOPN ILL_ILLOPN 176 ILL_ILLADR, /* Illegal addressing mode. */ 177 # define ILL_ILLADR ILL_ILLADR 178 ILL_ILLTRP, /* Illegal trap. */ 179 # define ILL_ILLTRP ILL_ILLTRP 180 ILL_PRVOPC, /* Privileged opcode. */ 181 # define ILL_PRVOPC ILL_PRVOPC 182 ILL_PRVREG, /* Privileged register. */ 183 # define ILL_PRVREG ILL_PRVREG 184 ILL_COPROC, /* Coprocessor error. */ 185 # define ILL_COPROC ILL_COPROC 186 ILL_BADSTK /* Internal stack error. */ 187 # define ILL_BADSTK ILL_BADSTK 188 }; 189 190 /* `si_code' values for SIGFPE signal. */ 191 enum 192 { 193 FPE_INTDIV = 1, /* Integer divide by zero. */ 194 # define FPE_INTDIV FPE_INTDIV 195 FPE_INTOVF, /* Integer overflow. */ 196 # define FPE_INTOVF FPE_INTOVF 197 FPE_FLTDIV, /* Floating point divide by zero. */ 198 # define FPE_FLTDIV FPE_FLTDIV 199 FPE_FLTOVF, /* Floating point overflow. */ 200 # define FPE_FLTOVF FPE_FLTOVF 201 FPE_FLTUND, /* Floating point underflow. */ 202 # define FPE_FLTUND FPE_FLTUND 203 FPE_FLTRES, /* Floating point inexact result. */ 204 # define FPE_FLTRES FPE_FLTRES 205 FPE_FLTINV, /* Floating point invalid operation. */ 206 # define FPE_FLTINV FPE_FLTINV 207 FPE_FLTSUB /* Subscript out of range. */ 208 # define FPE_FLTSUB FPE_FLTSUB 209 }; 210 211 /* `si_code' values for SIGSEGV signal. */ 212 enum 213 { 214 SEGV_MAPERR = 1, /* Address not mapped to object. */ 215 # define SEGV_MAPERR SEGV_MAPERR 216 SEGV_ACCERR /* Invalid permissions for mapped object. */ 217 # define SEGV_ACCERR SEGV_ACCERR 218 }; 219 220 /* `si_code' values for SIGBUS signal. */ 221 enum 222 { 223 BUS_ADRALN = 1, /* Invalid address alignment. */ 224 # define BUS_ADRALN BUS_ADRALN 225 BUS_ADRERR, /* Non-existant physical address. */ 226 # define BUS_ADRERR BUS_ADRERR 227 BUS_OBJERR, /* Object specific hardware error. */ 228 # define BUS_OBJERR BUS_OBJERR 229 BUS_MCEERR_AR, /* Hardware memory error: action required. */ 230 # define BUS_MCEERR_AR BUS_MCEERR_AR 231 BUS_MCEERR_AO /* Hardware memory error: action optional. */ 232 # define BUS_MCEERR_AO BUS_MCEERR_AO 233 }; 234 # endif 235 236 # ifdef __USE_XOPEN_EXTENDED 237 /* `si_code' values for SIGTRAP signal. */ 238 enum 239 { 240 TRAP_BRKPT = 1, /* Process breakpoint. */ 241 # define TRAP_BRKPT TRAP_BRKPT 242 TRAP_TRACE /* Process trace trap. */ 243 # define TRAP_TRACE TRAP_TRACE 244 }; 245 # endif 246 247 # if defined __USE_XOPEN_EXTENDED || defined __USE_XOPEN2K8 248 /* `si_code' values for SIGCHLD signal. */ 249 enum 250 { 251 CLD_EXITED = 1, /* Child has exited. */ 252 # define CLD_EXITED CLD_EXITED 253 CLD_KILLED, /* Child was killed. */ 254 # define CLD_KILLED CLD_KILLED 255 CLD_DUMPED, /* Child terminated abnormally. */ 256 # define CLD_DUMPED CLD_DUMPED 257 CLD_TRAPPED, /* Traced child has trapped. */ 258 # define CLD_TRAPPED CLD_TRAPPED 259 CLD_STOPPED, /* Child has stopped. */ 260 # define CLD_STOPPED CLD_STOPPED 261 CLD_CONTINUED /* Stopped child has continued. */ 262 # define CLD_CONTINUED CLD_CONTINUED 263 }; 264 265 /* `si_code' values for SIGPOLL signal. */ 266 enum 267 { 268 POLL_IN = 1, /* Data input available. */ 269 # define POLL_IN POLL_IN 270 POLL_OUT, /* Output buffers available. */ 271 # define POLL_OUT POLL_OUT 272 POLL_MSG, /* Input message available. */ 273 # define POLL_MSG POLL_MSG 274 POLL_ERR, /* I/O error. */ 275 # define POLL_ERR POLL_ERR 276 POLL_PRI, /* High priority input available. */ 277 # define POLL_PRI POLL_PRI 278 POLL_HUP /* Device disconnected. */ 279 # define POLL_HUP POLL_HUP 280 }; 281 # endif 282 283 # undef __need_siginfo_t 284 #endif /* !have siginfo_t && (have _SIGNAL_H || need siginfo_t). */ 285 286 287 #if (defined _SIGNAL_H || defined __need_sigevent_t) \ 288 && !defined __have_sigevent_t 289 # define __have_sigevent_t 1 290 291 /* Structure to transport application-defined values with signals. */ 292 # define __SIGEV_MAX_SIZE 64 293 # if __WORDSIZE == 64 294 # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 4) 295 # else 296 # define __SIGEV_PAD_SIZE ((__SIGEV_MAX_SIZE / sizeof (int)) - 3) 297 # endif 298 299 /* Forward declaration of the `pthread_attr_t' type. */ 300 struct __pthread_attr_s; 301 302 /* XXX This one might need to change!!! */ 303 typedef struct sigevent 304 { 305 sigval_t sigev_value; 306 int sigev_signo; 307 int sigev_notify; 308 309 union 310 { 311 int _pad[__SIGEV_PAD_SIZE]; 312 313 /* When SIGEV_SIGNAL and SIGEV_THREAD_ID set, LWP ID of the 314 thread to receive the signal. */ 315 __pid_t _tid; 316 317 struct 318 { 319 void (*_function) (sigval_t); /* Function to start. */ 320 void *_attribute; /* Really pthread_attr_t. */ 321 } _sigev_thread; 322 } _sigev_un; 323 } sigevent_t; 324 325 /* POSIX names to access some of the members. */ 326 # define sigev_notify_function _sigev_un._sigev_thread._function 327 # define sigev_notify_attributes _sigev_un._sigev_thread._attribute 328 329 /* `sigev_notify' values. */ 330 enum 331 { 332 SIGEV_SIGNAL = 0, /* Notify via signal. */ 333 # define SIGEV_SIGNAL SIGEV_SIGNAL 334 SIGEV_NONE, /* Other notification: meaningless. */ 335 # define SIGEV_NONE SIGEV_NONE 336 SIGEV_THREAD, /* Deliver via thread creation. */ 337 # define SIGEV_THREAD SIGEV_THREAD 338 339 SIGEV_THREAD_ID = 4 /* Send signal to specific thread. */ 340 #define SIGEV_THREAD_ID SIGEV_THREAD_ID 341 }; 342 343 #endif /* have _SIGNAL_H. */ 344