| 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_ */ |