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