1 | #ifndef __siginfo_t_defined |
2 | #define __siginfo_t_defined 1 |
3 | |
4 | #include <bits/wordsize.h> |
5 | #include <bits/types.h> |
6 | #include <bits/types/__sigval_t.h> |
7 | |
8 | #define __SI_MAX_SIZE 128 |
9 | #if __WORDSIZE == 64 |
10 | # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 4) |
11 | #else |
12 | # define __SI_PAD_SIZE ((__SI_MAX_SIZE / sizeof (int)) - 3) |
13 | #endif |
14 | |
15 | /* Some fields of siginfo_t have architecture-specific variations. */ |
16 | #include <bits/siginfo-arch.h> |
17 | #ifndef __SI_ALIGNMENT |
18 | # define __SI_ALIGNMENT /* nothing */ |
19 | #endif |
20 | #ifndef __SI_BAND_TYPE |
21 | # define __SI_BAND_TYPE long int |
22 | #endif |
23 | #ifndef __SI_CLOCK_T |
24 | # define __SI_CLOCK_T __clock_t |
25 | #endif |
26 | #ifndef __SI_ERRNO_THEN_CODE |
27 | # define __SI_ERRNO_THEN_CODE 1 |
28 | #endif |
29 | #ifndef __SI_HAVE_SIGSYS |
30 | # define __SI_HAVE_SIGSYS 1 |
31 | #endif |
32 | #ifndef __SI_SIGFAULT_ADDL |
33 | # define __SI_SIGFAULT_ADDL /* nothing */ |
34 | #endif |
35 | |
36 | typedef struct |
37 | { |
38 | int si_signo; /* Signal number. */ |
39 | #if __SI_ERRNO_THEN_CODE |
40 | int si_errno; /* If non-zero, an errno value associated with |
41 | this signal, as defined in <errno.h>. */ |
42 | int si_code; /* Signal code. */ |
43 | #else |
44 | int si_code; |
45 | int si_errno; |
46 | #endif |
47 | #if __WORDSIZE == 64 |
48 | int __pad0; /* Explicit padding. */ |
49 | #endif |
50 | |
51 | union |
52 | { |
53 | int _pad[__SI_PAD_SIZE]; |
54 | |
55 | /* kill(). */ |
56 | struct |
57 | { |
58 | __pid_t si_pid; /* Sending process ID. */ |
59 | __uid_t si_uid; /* Real user ID of sending process. */ |
60 | } _kill; |
61 | |
62 | /* POSIX.1b timers. */ |
63 | struct |
64 | { |
65 | int si_tid; /* Timer ID. */ |
66 | int si_overrun; /* Overrun count. */ |
67 | __sigval_t si_sigval; /* Signal value. */ |
68 | } _timer; |
69 | |
70 | /* POSIX.1b signals. */ |
71 | struct |
72 | { |
73 | __pid_t si_pid; /* Sending process ID. */ |
74 | __uid_t si_uid; /* Real user ID of sending process. */ |
75 | __sigval_t si_sigval; /* Signal value. */ |
76 | } _rt; |
77 | |
78 | /* SIGCHLD. */ |
79 | struct |
80 | { |
81 | __pid_t si_pid; /* Which child. */ |
82 | __uid_t si_uid; /* Real user ID of sending process. */ |
83 | int si_status; /* Exit value or signal. */ |
84 | __SI_CLOCK_T si_utime; |
85 | __SI_CLOCK_T si_stime; |
86 | } _sigchld; |
87 | |
88 | /* SIGILL, SIGFPE, SIGSEGV, SIGBUS. */ |
89 | struct |
90 | { |
91 | void *si_addr; /* Faulting insn/memory ref. */ |
92 | __SI_SIGFAULT_ADDL |
93 | short int si_addr_lsb; /* Valid LSB of the reported address. */ |
94 | union |
95 | { |
96 | /* used when si_code=SEGV_BNDERR */ |
97 | struct |
98 | { |
99 | void *_lower; |
100 | void *_upper; |
101 | } _addr_bnd; |
102 | /* used when si_code=SEGV_PKUERR */ |
103 | __uint32_t _pkey; |
104 | } _bounds; |
105 | } _sigfault; |
106 | |
107 | /* SIGPOLL. */ |
108 | struct |
109 | { |
110 | __SI_BAND_TYPE si_band; /* Band event for SIGPOLL. */ |
111 | int si_fd; |
112 | } _sigpoll; |
113 | |
114 | /* SIGSYS. */ |
115 | #if __SI_HAVE_SIGSYS |
116 | struct |
117 | { |
118 | void *_call_addr; /* Calling user insn. */ |
119 | int _syscall; /* Triggering system call number. */ |
120 | unsigned int _arch; /* AUDIT_ARCH_* of syscall. */ |
121 | } _sigsys; |
122 | #endif |
123 | } _sifields; |
124 | } siginfo_t __SI_ALIGNMENT; |
125 | |
126 | |
127 | /* X/Open requires some more fields with fixed names. */ |
128 | #define si_pid _sifields._kill.si_pid |
129 | #define si_uid _sifields._kill.si_uid |
130 | #define si_timerid _sifields._timer.si_tid |
131 | #define si_overrun _sifields._timer.si_overrun |
132 | #define si_status _sifields._sigchld.si_status |
133 | #define si_utime _sifields._sigchld.si_utime |
134 | #define si_stime _sifields._sigchld.si_stime |
135 | #define si_value _sifields._rt.si_sigval |
136 | #define si_int _sifields._rt.si_sigval.sival_int |
137 | #define si_ptr _sifields._rt.si_sigval.sival_ptr |
138 | #define si_addr _sifields._sigfault.si_addr |
139 | #define si_addr_lsb _sifields._sigfault.si_addr_lsb |
140 | #define si_lower _sifields._sigfault._bounds._addr_bnd._lower |
141 | #define si_upper _sifields._sigfault._bounds._addr_bnd._upper |
142 | #define si_pkey _sifields._sigfault._bounds._pkey |
143 | #define si_band _sifields._sigpoll.si_band |
144 | #define si_fd _sifields._sigpoll.si_fd |
145 | #if __SI_HAVE_SIGSYS |
146 | # define si_call_addr _sifields._sigsys._call_addr |
147 | # define si_syscall _sifields._sigsys._syscall |
148 | # define si_arch _sifields._sigsys._arch |
149 | #endif |
150 | |
151 | #endif |
152 | |