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