1 /*	$NetBSD: siginfo.h,v 1.25 2013/11/22 21:04:11 christos 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 	} _reason;
81 };
82 
83 #ifdef _KERNEL
84 typedef struct ksiginfo {
85 	u_long			ksi_flags;	/* 4 or 8 bytes (LP64) */
86 	TAILQ_ENTRY(ksiginfo)	ksi_list;
87 	struct _ksiginfo	ksi_info;
88 	lwpid_t			ksi_lid;	/* 0, or directed to LWP */
89 } ksiginfo_t;
90 
91 #define	KSI_TRAP	0x01	/* signal caused by trap */
92 #define	KSI_EMPTY	0x02	/* no additional information */
93 #define	KSI_QUEUED	0x04	/* on a sigpend_t queue */
94 #define	KSI_FROMPOOL	0x08	/* allocated from the ksiginfo pool */
95 
96 /* Macros to initialize a ksiginfo_t. */
97 #define	KSI_INIT(ksi)							\
98 do {									\
99 	memset((ksi), 0, sizeof(*(ksi)));				\
100 } while (/*CONSTCOND*/0)
101 
102 #define	KSI_INIT_EMPTY(ksi)						\
103 do {									\
104 	KSI_INIT((ksi));						\
105 	(ksi)->ksi_flags = KSI_EMPTY;					\
106 } while (/*CONSTCOND*/0)
107 
108 #define	KSI_INIT_TRAP(ksi)						\
109 do {									\
110 	KSI_INIT((ksi));						\
111 	(ksi)->ksi_flags = KSI_TRAP;					\
112 } while (/*CONSTCOND*/0)
113 
114 /* Copy the part of ksiginfo_t without the queue pointers */
115 #define	KSI_COPY(fksi, tksi)						\
116 do {									\
117 	(tksi)->ksi_info = (fksi)->ksi_info;				\
118 	(tksi)->ksi_flags = (fksi)->ksi_flags;				\
119 } while (/*CONSTCOND*/0)
120 
121 
122 /* Predicate macros to test how a ksiginfo_t was generated. */
123 #define	KSI_TRAP_P(ksi)		(((ksi)->ksi_flags & KSI_TRAP) != 0)
124 #define	KSI_EMPTY_P(ksi)	(((ksi)->ksi_flags & KSI_EMPTY) != 0)
125 
126 /*
127  * Old-style signal handler "code" arguments were only non-zero for
128  * signals caused by traps.
129  */
130 #define	KSI_TRAPCODE(ksi)	(KSI_TRAP_P(ksi) ? (ksi)->ksi_trap : 0)
131 #endif /* _KERNEL */
132 
133 typedef union siginfo {
134 	char	si_pad[128];	/* Total size; for future expansion */
135 	struct _ksiginfo _info;
136 } siginfo_t;
137 
138 /** Field access macros */
139 #define	si_signo	_info._signo
140 #define	si_code		_info._code
141 #define	si_errno	_info._errno
142 
143 #define	si_value	_info._reason._rt._value
144 #define	si_pid		_info._reason._child._pid
145 #define	si_uid		_info._reason._child._uid
146 #define	si_status	_info._reason._child._status
147 #define	si_utime	_info._reason._child._utime
148 #define	si_stime	_info._reason._child._stime
149 
150 #define	si_addr		_info._reason._fault._addr
151 #define	si_trap		_info._reason._fault._trap
152 #define	si_trap2	_info._reason._fault._trap2
153 #define	si_trap3	_info._reason._fault._trap3
154 
155 #define	si_band		_info._reason._poll._band
156 #define	si_fd		_info._reason._poll._fd
157 
158 #ifdef _KERNEL
159 /** Field access macros */
160 #define	ksi_signo	ksi_info._signo
161 #define	ksi_code	ksi_info._code
162 #define	ksi_errno	ksi_info._errno
163 
164 #define	ksi_value	ksi_info._reason._rt._value
165 #define	ksi_pid		ksi_info._reason._child._pid
166 #define	ksi_uid		ksi_info._reason._child._uid
167 #define	ksi_status	ksi_info._reason._child._status
168 #define	ksi_utime	ksi_info._reason._child._utime
169 #define	ksi_stime	ksi_info._reason._child._stime
170 
171 #define	ksi_addr	ksi_info._reason._fault._addr
172 #define	ksi_trap	ksi_info._reason._fault._trap
173 #define	ksi_trap2	ksi_info._reason._fault._trap2
174 #define	ksi_trap3	ksi_info._reason._fault._trap3
175 
176 #define	ksi_band	ksi_info._reason._poll._band
177 #define	ksi_fd		ksi_info._reason._poll._fd
178 #endif /* _KERNEL */
179 
180 /** si_code */
181 /* SIGILL */
182 #define	ILL_ILLOPC	1	/* Illegal opcode			*/
183 #define	ILL_ILLOPN	2	/* Illegal operand			*/
184 #define	ILL_ILLADR	3	/* Illegal addressing mode		*/
185 #define	ILL_ILLTRP	4	/* Illegal trap				*/
186 #define	ILL_PRVOPC	5	/* Privileged opcode			*/
187 #define	ILL_PRVREG	6	/* Privileged register			*/
188 #define	ILL_COPROC	7	/* Coprocessor error			*/
189 #define	ILL_BADSTK	8	/* Internal stack error			*/
190 
191 /* SIGFPE */
192 #define	FPE_INTDIV	1	/* Integer divide by zero		*/
193 #define	FPE_INTOVF	2	/* Integer overflow			*/
194 #define	FPE_FLTDIV	3	/* Floating point divide by zero	*/
195 #define	FPE_FLTOVF	4	/* Floating point overflow		*/
196 #define	FPE_FLTUND	5	/* Floating point underflow		*/
197 #define	FPE_FLTRES	6	/* Floating point inexact result	*/
198 #define	FPE_FLTINV	7	/* Invalid Floating point operation	*/
199 #define	FPE_FLTSUB	8	/* Subscript out of range		*/
200 
201 /* SIGSEGV */
202 #define	SEGV_MAPERR	1	/* Address not mapped to object		*/
203 #define	SEGV_ACCERR	2	/* Invalid permissions for mapped object*/
204 
205 /* SIGBUS */
206 #define	BUS_ADRALN	1	/* Invalid address alignment		*/
207 #define	BUS_ADRERR	2	/* Non-existent physical address	*/
208 #define	BUS_OBJERR	3	/* Object specific hardware error	*/
209 
210 /* SIGTRAP */
211 #define	TRAP_BRKPT	1	/* Process breakpoint			*/
212 #define	TRAP_TRACE	2	/* Process trace trap			*/
213 
214 /* SIGCHLD */
215 #define	CLD_EXITED	1	/* Child has exited			*/
216 #define	CLD_KILLED	2	/* Child has terminated abnormally but	*/
217 				/* did not create a core file		*/
218 #define	CLD_DUMPED	3	/* Child has terminated abnormally and	*/
219 				/* created a core file			*/
220 #define	CLD_TRAPPED	4	/* Traced child has trapped		*/
221 #define	CLD_STOPPED	5	/* Child has stopped			*/
222 #define	CLD_CONTINUED	6	/* Stopped child has continued		*/
223 
224 /* SIGPOLL */
225 #define	POLL_IN		1	/* Data input available			*/
226 #define	POLL_OUT	2	/* Output buffers available		*/
227 #define	POLL_MSG	3	/* Input message available		*/
228 #define	POLL_ERR	4	/* I/O Error				*/
229 #define	POLL_PRI	5	/* High priority input available	*/
230 #define	POLL_HUP	6	/* Device disconnected			*/
231 
232 
233 /** si_code */
234 #define	SI_USER		0	/* Sent by kill(2)			*/
235 #define	SI_QUEUE	-1	/* Sent by the sigqueue(2)		*/
236 #define	SI_TIMER	-2	/* Generated by expiration of a timer	*/
237 				/* set by timer_settime(2)		*/
238 #define	SI_ASYNCIO	-3	/* Generated by completion of an	*/
239 				/* asynchronous I/O signal		*/
240 #define	SI_MESGQ	-4	/* Generated by arrival of a message on	*/
241 				/* an empty message queue		*/
242 #if defined(_KERNEL) || defined(_NETBSD_SOURCE)
243 #define	SI_LWP		-5	/* Generated by _lwp_kill(2)		*/
244 #define	SI_NOINFO	32767	/* No signal specific info available	*/
245 #endif
246 
247 #endif /* !_SYS_SIGINFO_H_ */
248