1 /*        $NetBSD: siginfo.h,v 1.35 2024/05/12 10:34:56 rillig Exp $   */
2 
3 /*-
4  * Copyright (c) 2002 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Christos Zoulas.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 #ifndef   _SYS_SIGINFO_H_
33 #define   _SYS_SIGINFO_H_
34 
35 #include <machine/signal.h>
36 #include <sys/featuretest.h>
37 #ifdef _KERNEL
38 #include <sys/queue.h>
39 #endif
40 
41 typedef union sigval {
42           int       sival_int;
43           void      *sival_ptr;
44 } sigval_t;
45 
46 struct _ksiginfo {
47           int       _signo;
48           int       _code;
49           int       _errno;
50 #ifdef _LP64
51           /* In _LP64 the union starts on an 8-byte boundary. */
52           int       _pad;
53 #endif
54           union {
55                     struct {
56                               pid_t     _pid;
57                               uid_t     _uid;
58                               sigval_t  _value;
59                     } _rt;
60 
61                     struct {
62                               pid_t     _pid;
63                               uid_t     _uid;
64                               int       _status;
65                               clock_t   _utime;
66                               clock_t   _stime;
67                     } _child;
68 
69                     struct {
70                               void   *_addr;
71                               int       _trap;
72                               int       _trap2;
73                               int       _trap3;
74                     } _fault;
75 
76                     struct {
77                               long      _band;
78                               int       _fd;
79                     } _poll;
80 
81                     struct {
82                               int       _sysnum;
83                               int       _retval[2];
84                               int       _error;
85                               uint64_t _args[8]; /* SYS_MAXSYSARGS */
86                     } _syscall;
87 
88                     struct {
89                               int       _pe_report_event;
90                               union {
91                                         pid_t _pe_other_pid;
92                                         lwpid_t _pe_lwp;
93                               } _option;
94                     } _ptrace_state;
95           } _reason;
96 };
97 
98 #ifdef _KERNEL
99 typedef struct ksiginfo {
100           u_long                        ksi_flags;          /* 4 or 8 bytes (LP64) */
101           TAILQ_ENTRY(ksiginfo)         ksi_list;
102           struct _ksiginfo    ksi_info;
103           lwpid_t                       ksi_lid;  /* 0, or directed to LWP */
104 } ksiginfo_t;
105 
106 #define   KSI_TRAP  0x01      /* signal caused by trap */
107 #define   KSI_EMPTY 0x02      /* no additional information */
108 #define   KSI_QUEUED          0x04      /* on a sigpend_t queue */
109 #define   KSI_FROMPOOL        0x08      /* allocated from the ksiginfo pool */
110 
111 /* Macros to initialize a ksiginfo_t. */
112 #define   KSI_INIT(ksi)                                                                   \
113 do {                                                                                      \
114           memset((ksi), 0, sizeof(*(ksi)));                                     \
115 } while (0)
116 
117 #define   KSI_INIT_EMPTY(ksi)                                                   \
118 do {                                                                                      \
119           KSI_INIT((ksi));                                                      \
120           (ksi)->ksi_flags = KSI_EMPTY;                                         \
121 } while (0)
122 
123 #define   KSI_INIT_TRAP(ksi)                                                    \
124 do {                                                                                      \
125           KSI_INIT((ksi));                                                      \
126           (ksi)->ksi_flags = KSI_TRAP;                                          \
127 } while (0)
128 
129 /* Copy the part of ksiginfo_t without the queue pointers */
130 #define   KSI_COPY(fksi, tksi)                                                            \
131 do {                                                                                      \
132           (tksi)->ksi_info = (fksi)->ksi_info;                                  \
133           (tksi)->ksi_flags = (fksi)->ksi_flags;                                \
134 } while (0)
135 
136 
137 /* Predicate macros to test how a ksiginfo_t was generated. */
138 #define   KSI_TRAP_P(ksi)               (((ksi)->ksi_flags & KSI_TRAP) != 0)
139 #define   KSI_EMPTY_P(ksi)    (((ksi)->ksi_flags & KSI_EMPTY) != 0)
140 
141 /*
142  * Old-style signal handler "code" arguments were only non-zero for
143  * signals caused by traps.
144  */
145 #define   KSI_TRAPCODE(ksi)   (KSI_TRAP_P(ksi) ? (ksi)->ksi_trap : 0)
146 #endif /* _KERNEL */
147 
148 typedef union siginfo {
149           char      si_pad[128];        /* Total size; for future expansion */
150           struct _ksiginfo _info;
151 } siginfo_t;
152 
153 /** Field access macros */
154 #define   si_signo  _info._signo
155 #define   si_code             _info._code
156 #define   si_errno  _info._errno
157 
158 #define   si_value  _info._reason._rt._value
159 #define   si_pid              _info._reason._child._pid
160 #define   si_uid              _info._reason._child._uid
161 #define   si_status _info._reason._child._status
162 #define   si_utime  _info._reason._child._utime
163 #define   si_stime  _info._reason._child._stime
164 
165 #define   si_addr             _info._reason._fault._addr
166 #define   si_trap             _info._reason._fault._trap
167 #define   si_trap2  _info._reason._fault._trap2
168 #define   si_trap3  _info._reason._fault._trap3
169 
170 #define   si_band             _info._reason._poll._band
171 #define   si_fd               _info._reason._poll._fd
172 
173 #define   si_sysnum _info._reason._syscall._sysnum
174 #define si_retval   _info._reason._syscall._retval
175 #define si_error    _info._reason._syscall._error
176 #define si_args               _info._reason._syscall._args
177 
178 #define si_pe_report_event    _info._reason._ptrace_state._pe_report_event
179 #define si_pe_other_pid       _info._reason._ptrace_state._option._pe_other_pid
180 #define si_pe_lwp   _info._reason._ptrace_state._option._pe_lwp
181 
182 #ifdef _KERNEL
183 /** Field access macros */
184 #define   ksi_signo ksi_info._signo
185 #define   ksi_code  ksi_info._code
186 #define   ksi_errno ksi_info._errno
187 
188 #define   ksi_value ksi_info._reason._rt._value
189 #define   ksi_pid             ksi_info._reason._child._pid
190 #define   ksi_uid             ksi_info._reason._child._uid
191 #define   ksi_status          ksi_info._reason._child._status
192 #define   ksi_utime ksi_info._reason._child._utime
193 #define   ksi_stime ksi_info._reason._child._stime
194 
195 #define   ksi_addr  ksi_info._reason._fault._addr
196 #define   ksi_trap  ksi_info._reason._fault._trap
197 #define   ksi_trap2 ksi_info._reason._fault._trap2
198 #define   ksi_trap3 ksi_info._reason._fault._trap3
199 
200 #define   ksi_band  ksi_info._reason._poll._band
201 #define   ksi_fd              ksi_info._reason._poll._fd
202 
203 #define   ksi_sysnum          ksi_info._reason._syscall._sysnum
204 #define ksi_retval  ksi_info._reason._syscall._retval
205 #define ksi_error   ksi_info._reason._syscall._error
206 #define ksi_args    ksi_info._reason._syscall._args
207 
208 #define ksi_pe_report_event   ksi_info._reason._ptrace_state._pe_report_event
209 #define ksi_pe_other_pid      ksi_info._reason._ptrace_state._option._pe_other_pid
210 #define ksi_pe_lwp            ksi_info._reason._ptrace_state._option._pe_lwp
211 #endif /* _KERNEL */
212 
213 /** si_code */
214 /* SIGILL */
215 #define   ILL_ILLOPC          1         /* Illegal opcode                       */
216 #define   ILL_ILLOPN          2         /* Illegal operand                      */
217 #define   ILL_ILLADR          3         /* Illegal addressing mode              */
218 #define   ILL_ILLTRP          4         /* Illegal trap                                   */
219 #define   ILL_PRVOPC          5         /* Privileged opcode                              */
220 #define   ILL_PRVREG          6         /* Privileged register                            */
221 #define   ILL_COPROC          7         /* Coprocessor error                              */
222 #define   ILL_BADSTK          8         /* Internal stack error                           */
223 
224 /* SIGFPE */
225 #define   FPE_INTDIV          1         /* Integer divide by zero               */
226 #define   FPE_INTOVF          2         /* Integer overflow                     */
227 #define   FPE_FLTDIV          3         /* Floating point divide by zero        */
228 #define   FPE_FLTOVF          4         /* Floating point overflow              */
229 #define   FPE_FLTUND          5         /* Floating point underflow             */
230 #define   FPE_FLTRES          6         /* Floating point inexact result        */
231 #define   FPE_FLTINV          7         /* Invalid Floating point operation     */
232 #define   FPE_FLTSUB          8         /* Subscript out of range               */
233 
234 /* SIGSEGV */
235 #define   SEGV_MAPERR         1         /* Address not mapped to object                   */
236 #define   SEGV_ACCERR         2         /* Invalid permissions for mapped object*/
237 
238 /* SIGBUS */
239 #define   BUS_ADRALN          1         /* Invalid address alignment            */
240 #define   BUS_ADRERR          2         /* Non-existent physical address        */
241 #define   BUS_OBJERR          3         /* Object specific hardware error       */
242 
243 /* SIGTRAP */
244 #define   TRAP_BRKPT          1         /* Process breakpoint                             */
245 #define   TRAP_TRACE          2         /* Process trace trap                             */
246 #define   TRAP_EXEC 3         /* Process exec trap                              */
247 #define   TRAP_CHLD 4         /* Process child trap                             */
248 #define   TRAP_LWP  5         /* Process lwp trap                     */
249 #define   TRAP_DBREG          6         /* Process hardware debug register trap */
250 #define   TRAP_SCE  7         /* Process syscall entry trap           */
251 #define   TRAP_SCX  8         /* Process syscall exit trap            */
252 
253 /* SIGCHLD */
254 #define   CLD_EXITED          1         /* Child has exited                     */
255 #define   CLD_KILLED          2         /* Child has terminated abnormally but  */
256                                         /* did not create a core file           */
257 #define   CLD_DUMPED          3         /* Child has terminated abnormally and  */
258                                         /* created a core file                            */
259 #define   CLD_TRAPPED         4         /* Traced child has trapped             */
260 #define   CLD_STOPPED         5         /* Child has stopped                              */
261 #define   CLD_CONTINUED       6         /* Stopped child has continued                    */
262 
263 /* SIGIO */
264 #define   POLL_IN             1         /* Data input available                           */
265 #define   POLL_OUT  2         /* Output buffers available             */
266 #define   POLL_MSG  3         /* Input message available              */
267 #define   POLL_ERR  4         /* I/O Error                                      */
268 #define   POLL_PRI  5         /* High priority input available        */
269 #define   POLL_HUP  6         /* Device disconnected                            */
270 
271 
272 /** si_code */
273 #define   SI_USER             0         /* Sent by kill(2)                      */
274 #define   SI_QUEUE  -1        /* Sent by the sigqueue(2)              */
275 #define   SI_TIMER  -2        /* Generated by expiration of a timer   */
276                                         /* set by timer_settime(2)              */
277 #define   SI_ASYNCIO          -3        /* Generated by completion of an        */
278                                         /* asynchronous I/O signal              */
279 #define   SI_MESGQ  -4        /* Generated by arrival of a message on */
280                                         /* an empty message queue               */
281 #if defined(_KERNEL) || defined(_NETBSD_SOURCE)
282 #define   SI_LWP              -5        /* Generated by _lwp_kill(2)            */
283 #define   SI_NOINFO 32767     /* No signal specific info available    */
284 #endif
285 
286 #endif /* !_SYS_SIGINFO_H_ */
287