xref: /freebsd/sys/compat/linux/linux_siginfo.h (revision edf8578117e8844e02c0121147f45e4609b30680)
1 /*-
2  * SPDX-License-Identifier: BSD-3-Clause
3  *
4  * Copyright (c) 2004 Tim J. Robbins
5  * Copyright (c) 2001 Doug Rabson
6  * Copyright (c) 1994-1996 Søren Schmidt
7  * All rights reserved.
8  * Copyright (c) 2022 Dmitry Chagin <dchagin@FreeBSD.org>
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  *    in this position and unchanged.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
27  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
28  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
29  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
30  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
31  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32  */
33 
34 #ifndef _LINUX_SIGINFO_H_
35 #define _LINUX_SIGINFO_H_
36 
37 /*
38  * si_code values
39  */
40 #define	LINUX_SI_USER		0	/* sent by kill, sigsend, raise */
41 #define	LINUX_SI_KERNEL		0x80	/* sent by the kernel from somewhere */
42 #define	LINUX_SI_QUEUE		-1	/* sent by sigqueue */
43 #define	LINUX_SI_TIMER		-2	/* sent by timer expiration */
44 #define	LINUX_SI_MESGQ		-3	/* sent by real time mesq state change */
45 #define	LINUX_SI_ASYNCIO	-4	/* sent by AIO completion */
46 #define	LINUX_SI_SIGIO		-5	/* sent by queued SIGIO */
47 #define	LINUX_SI_TKILL		-6	/* sent by tkill system call */
48 
49 /*
50  * SIGILL si_codes
51  */
52 #define	LINUX_ILL_ILLOPC	1	/* illegal opcode */
53 #define	LINUX_ILL_ILLOPN	2	/* illegal operand */
54 #define	LINUX_ILL_ILLADR	3	/* illegal addressing mode */
55 #define	LINUX_ILL_ILLTRP	4	/* illegal trap */
56 #define	LINUX_ILL_PRVOPC	5	/* privileged opcode */
57 #define	LINUX_ILL_PRVREG	6	/* privileged register */
58 #define	LINUX_ILL_COPROC	7	/* coprocessor error */
59 #define	LINUX_ILL_BADSTK	8	/* internal stack error */
60 #define	LINUX_ILL_BADIADDR	9	/* unimplemented instruction address */
61 #define	LINUX___ILL_BREAK	10	/* (ia64) illegal break */
62 #define	LINUX___ILL_BNDMOD	11	/* (ia64) bundle-update (modification)
63 					 * in progress
64 					 */
65 
66 /*
67  * SIGFPE si_codes
68  */
69 #define	LINUX_FPE_INTDIV	1	/* integer divide by zero */
70 #define	LINUX_FPE_INTOVF	2	/* integer overflow */
71 #define	LINUX_FPE_FLTDIV	3	/* floating point divide by zero */
72 #define	LINUX_FPE_FLTOVF	4	/* floating point overflow */
73 #define	LINUX_FPE_FLTUND	5	/* floating point underflow */
74 #define	LINUX_FPE_FLTRES	6	/* floating point inexact result */
75 #define	LINUX_FPE_FLTINV	7	/* floating point invalid operation */
76 #define	LINUX_FPE_FLTSUB	8	/* (ia64) subscript out of range */
77 #define	LINUX___FPE_DECOVF	9	/* (ia64) decimal overflow */
78 #define	LINUX___FPE_DECDIV	10	/* (ia64) decimal division by zero */
79 #define	LINUX___FPE_DECERR	11	/* (ia64) packed decimal error */
80 #define	LINUX___FPE_INVASC	12	/* (ia64) invalid ASCII digit */
81 #define	LINUX___FPE_INVDEC	13	/* (ia64) invalid decimal digit */
82 #define	LINUX_FPE_FLTUNK	14	/* undiagnosed floating-point exception */
83 #define	LINUX_FPE_CONDTRAP	15	/* trap on condition */
84 
85 /*
86  * SIGSEGV si_codes
87  */
88 #define	LINUX_SEGV_MAPERR	1	/* address not mapped to object */
89 #define	LINUX_SEGV_ACCERR	2	/* invalid permissions for mapped object */
90 #define	LINUX_SEGV_BNDERR	3	/* failed address bound checks */
91 #ifdef __ia64__
92 #define	LINUX___SEGV_PSTKOVF	4	/* paragraph stack overflow */
93 #else
94 #define	LINUX_SEGV_PKUERR	4	/* failed protection key checks */
95 #endif
96 #define	LINUX_SEGV_ACCADI	5	/* ADI not enabled for mapped object */
97 #define	LINUX_SEGV_ADIDERR	6	/* Disrupting MCD error */
98 #define	LINUX_SEGV_ADIPERR	7	/* Precise MCD exception */
99 #define	LINUX_SEGV_MTEAERR	8	/* Asynchronous ARM MTE error */
100 #define	LINUX_SEGV_MTESERR	9	/* Synchronous ARM MTE exception */
101 
102 /*
103  * SIGBUS si_codes
104  */
105 #define	LINUX_BUS_ADRALN	1	/* invalid address alignment */
106 #define	LINUX_BUS_ADRERR	2	/* non-existent physical address */
107 #define	LINUX_BUS_OBJERR	3	/* object specific hardware error */
108 
109 #define	LINUX_BUS_MCEERR_AR	4	/* hardware memory error consumed
110 					 * on a machine check:
111 					 * action required
112 					 */
113 #define	LINUX_BUS_MCEERR_AO	5	/* hardware memory error detected
114 					 * in process but not consumed:
115 					 * action optional
116 					 */
117 
118 /*
119  * SIGTRAP si_codes
120  */
121 #define	LINUX_TRAP_BRKPT	1	/* process breakpoint */
122 #define	LINUX_TRAP_TRACE	2	/* process trace trap */
123 #define	LINUX_TRAP_BRANCH	3	/* process taken branch trap */
124 #define	LINUX_TRAP_HWBKPT	4	/* hardware breakpoint/watchpoint */
125 #define	LINUX_TRAP_UNK		5	/* undiagnosed trap */
126 #define	LINUX_TRAP_PERF		6	/* perf event with sigtrap=1 */
127 
128 /*
129  * SIGCHLD si_codes
130  */
131 #define	LINUX_CLD_EXITED	1	/* child has exited */
132 #define	LINUX_CLD_KILLED	2	/* child was killed */
133 #define	LINUX_CLD_DUMPED	3	/* child terminated abnormally */
134 #define	LINUX_CLD_TRAPPED	4	/* traced child has trapped */
135 #define	LINUX_CLD_STOPPED	5	/* child has stopped */
136 #define	LINUX_CLD_CONTINUED	6	/* stopped child has continued */
137 
138 /*
139  * SIGPOLL (or any other signal without signal specific si_codes) si_codes
140  */
141 #define	LINUX_POLL_IN		1	/* data input available */
142 #define	LINUX_POLL_OUT		2	/* output buffers available */
143 #define	LINUX_POLL_MSG		3	/* input message available */
144 #define	LINUX_POLL_ERR		4	/* i/o error */
145 #define	LINUX_POLL_PRI		5	/* high priority input available */
146 #define	LINUX_POLL_HUP		6	/* device disconnected */
147 
148 /*
149  * SIGSYS si_codes
150  */
151 #define	LINUX_SYS_SECCOMP	1	/* seccomp triggered */
152 #define	LINUX_SYS_USER_DISPATCH	2	/* syscall user dispatch triggered */
153 
154 /*
155  * SIGEMT si_codes
156  */
157 #define	LINUX_EMT_TAGOVF	1	/* tag overflow */
158 
159 typedef union l_sigval {
160 	l_int		sival_int;
161 	l_uintptr_t	sival_ptr;
162 } l_sigval_t;
163 
164 #define	LINUX_SI_MAX_SIZE		128
165 
166 union __sifields {
167 	struct {
168 		l_pid_t		_pid;
169 		l_uid_t		_uid;
170 	} _kill;
171 
172 	struct {
173 		l_timer_t	_tid;
174 		l_int		_overrun;
175 		char		_pad[sizeof(l_uid_t) - sizeof(int)];
176 		union l_sigval	_sigval;
177 		l_uint		_sys_private;
178 	} _timer;
179 
180 	struct {
181 		l_pid_t		_pid;		/* sender's pid */
182 		l_uid_t		_uid;		/* sender's uid */
183 		union l_sigval	_sigval;
184 	} _rt;
185 
186 	struct {
187 		l_pid_t		_pid;		/* which child */
188 		l_uid_t		_uid;		/* sender's uid */
189 		l_int		_status;	/* exit code */
190 		l_clock_t	_utime;
191 		l_clock_t	_stime;
192 	} _sigchld;
193 
194 	struct {
195 		l_uintptr_t	_addr;	/* Faulting insn/memory ref. */
196 	} _sigfault;
197 
198 	struct {
199 		l_long		_band;	/* POLL_IN,POLL_OUT,POLL_MSG */
200 		l_int		_fd;
201 	} _sigpoll;
202 };
203 
204 typedef struct l_siginfo {
205 	union {
206 		struct {
207 			l_int		lsi_signo;
208 			l_int		lsi_errno;
209 			l_int		lsi_code;
210 			union __sifields _sifields;
211 		};
212 		l_int	_pad[LINUX_SI_MAX_SIZE/sizeof(l_int)];
213 	};
214 } l_siginfo_t;
215 
216 _Static_assert(sizeof(l_siginfo_t) == LINUX_SI_MAX_SIZE, "l_siginfo_t size");
217 
218 #define	lsi_pid		_sifields._kill._pid
219 #define	lsi_uid		_sifields._kill._uid
220 #define	lsi_tid		_sifields._timer._tid
221 #define	lsi_overrun	_sifields._timer._overrun
222 #define	lsi_sys_private	_sifields._timer._sys_private
223 #define	lsi_status	_sifields._sigchld._status
224 #define	lsi_utime	_sifields._sigchld._utime
225 #define	lsi_stime	_sifields._sigchld._stime
226 #define	lsi_value	_sifields._rt._sigval
227 #define	lsi_int		_sifields._rt._sigval.sival_int
228 #define	lsi_ptr		_sifields._rt._sigval.sival_ptr
229 #define	lsi_addr	_sifields._sigfault._addr
230 #define	lsi_band	_sifields._sigpoll._band
231 #define	lsi_fd		_sifields._sigpoll._fd
232 
233 #endif /* _LINUX_SIGINFO_H_ */
234 
235