1 #ifndef __siginfo_t_defined
2 #define __siginfo_t_defined 1
3 
4 #include <bits/wordsize.h>
5 #include <bits/types.h>
6 #include <bits/types/__sigval_t.h>
7 
8 #define __SI_MAX_SIZE	128
9 #if __WORDSIZE == 64
10 # define __SI_PAD_SIZE	((__SI_MAX_SIZE / sizeof (int)) - 4)
11 #else
12 # define __SI_PAD_SIZE	((__SI_MAX_SIZE / sizeof (int)) - 3)
13 #endif
14 
15 /* Some fields of siginfo_t have architecture-specific variations.  */
16 #include <bits/siginfo-arch.h>
17 #ifndef __SI_ALIGNMENT
18 # define __SI_ALIGNMENT		/* nothing */
19 #endif
20 #ifndef __SI_BAND_TYPE
21 # define __SI_BAND_TYPE		long int
22 #endif
23 #ifndef __SI_CLOCK_T
24 # define __SI_CLOCK_T		__clock_t
25 #endif
26 #ifndef __SI_ERRNO_THEN_CODE
27 # define __SI_ERRNO_THEN_CODE	1
28 #endif
29 #ifndef __SI_HAVE_SIGSYS
30 # define __SI_HAVE_SIGSYS	1
31 #endif
32 #ifndef __SI_SIGFAULT_ADDL
33 # define __SI_SIGFAULT_ADDL	/* nothing */
34 #endif
35 
36 typedef struct
37   {
38     int si_signo;		/* Signal number.  */
39 #if __SI_ERRNO_THEN_CODE
40     int si_errno;		/* If non-zero, an errno value associated with
41 				   this signal, as defined in <errno.h>.  */
42     int si_code;		/* Signal code.  */
43 #else
44     int si_code;
45     int si_errno;
46 #endif
47 #if __WORDSIZE == 64
48     int __pad0;			/* Explicit padding.  */
49 #endif
50 
51     union
52       {
53 	int _pad[__SI_PAD_SIZE];
54 
55 	 /* kill().  */
56 	struct
57 	  {
58 	    __pid_t si_pid;	/* Sending process ID.  */
59 	    __uid_t si_uid;	/* Real user ID of sending process.  */
60 	  } _kill;
61 
62 	/* POSIX.1b timers.  */
63 	struct
64 	  {
65 	    int si_tid;		/* Timer ID.  */
66 	    int si_overrun;	/* Overrun count.  */
67 	    __sigval_t si_sigval;	/* Signal value.  */
68 	  } _timer;
69 
70 	/* POSIX.1b signals.  */
71 	struct
72 	  {
73 	    __pid_t si_pid;	/* Sending process ID.  */
74 	    __uid_t si_uid;	/* Real user ID of sending process.  */
75 	    __sigval_t si_sigval;	/* Signal value.  */
76 	  } _rt;
77 
78 	/* SIGCHLD.  */
79 	struct
80 	  {
81 	    __pid_t si_pid;	/* Which child.	 */
82 	    __uid_t si_uid;	/* Real user ID of sending process.  */
83 	    int si_status;	/* Exit value or signal.  */
84 	    __SI_CLOCK_T si_utime;
85 	    __SI_CLOCK_T si_stime;
86 	  } _sigchld;
87 
88 	/* SIGILL, SIGFPE, SIGSEGV, SIGBUS.  */
89 	struct
90 	  {
91 	    void *si_addr;	    /* Faulting insn/memory ref.  */
92 	    __SI_SIGFAULT_ADDL
93 	    short int si_addr_lsb;  /* Valid LSB of the reported address.  */
94 	    union
95 	      {
96 		/* used when si_code=SEGV_BNDERR */
97 		struct
98 		  {
99 		    void *_lower;
100 		    void *_upper;
101 		  } _addr_bnd;
102 		/* used when si_code=SEGV_PKUERR */
103 		__uint32_t _pkey;
104 	      } _bounds;
105 	  } _sigfault;
106 
107 	/* SIGPOLL.  */
108 	struct
109 	  {
110 	    __SI_BAND_TYPE si_band;	/* Band event for SIGPOLL.  */
111 	    int si_fd;
112 	  } _sigpoll;
113 
114 	/* SIGSYS.  */
115 #if __SI_HAVE_SIGSYS
116 	struct
117 	  {
118 	    void *_call_addr;	/* Calling user insn.  */
119 	    int _syscall;	/* Triggering system call number.  */
120 	    unsigned int _arch; /* AUDIT_ARCH_* of syscall.  */
121 	  } _sigsys;
122 #endif
123       } _sifields;
124   } siginfo_t __SI_ALIGNMENT;
125 
126 
127 /* X/Open requires some more fields with fixed names.  */
128 #define si_pid		_sifields._kill.si_pid
129 #define si_uid		_sifields._kill.si_uid
130 #define si_timerid	_sifields._timer.si_tid
131 #define si_overrun	_sifields._timer.si_overrun
132 #define si_status	_sifields._sigchld.si_status
133 #define si_utime	_sifields._sigchld.si_utime
134 #define si_stime	_sifields._sigchld.si_stime
135 #define si_value	_sifields._rt.si_sigval
136 #define si_int		_sifields._rt.si_sigval.sival_int
137 #define si_ptr		_sifields._rt.si_sigval.sival_ptr
138 #define si_addr		_sifields._sigfault.si_addr
139 #define si_addr_lsb	_sifields._sigfault.si_addr_lsb
140 #define si_lower	_sifields._sigfault._bounds._addr_bnd._lower
141 #define si_upper	_sifields._sigfault._bounds._addr_bnd._upper
142 #define si_pkey		_sifields._sigfault._bounds._pkey
143 #define si_band		_sifields._sigpoll.si_band
144 #define si_fd		_sifields._sigpoll.si_fd
145 #if __SI_HAVE_SIGSYS
146 # define si_call_addr	_sifields._sigsys._call_addr
147 # define si_syscall	_sifields._sigsys._syscall
148 # define si_arch	_sifields._sigsys._arch
149 #endif
150 
151 #endif
152