Home | History | Annotate | Line # | Download | only in sys
      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