1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 #ifndef _SYS_LX_SIGNAL_H
27 #define _SYS_LX_SIGNAL_H
28
29 #pragma ident "%Z%%M% %I% %E% SMI"
30
31 #if !defined(_ASM)
32 #include <sys/lx_types.h>
33 #include <lx_signum.h>
34
35 #endif /* !defined(_ASM) */
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 /*
42 * Linux sigaction flags
43 */
44 #define LX_SA_NOCLDSTOP 0x00000001
45 #define LX_SA_NOCLDWAIT 0x00000002
46 #define LX_SA_SIGINFO 0x00000004
47 #define LX_SA_RESTORER 0x04000000
48 #define LX_SA_ONSTACK 0x08000000
49 #define LX_SA_RESTART 0x10000000
50 #define LX_SA_NODEFER 0x40000000
51 #define LX_SA_RESETHAND 0x80000000
52 #define LX_SA_NOMASK LX_SA_NODEFER
53 #define LX_SA_ONESHOT LX_SA_RESETHAND
54
55 #define LX_SIG_BLOCK 0
56 #define LX_SIG_UNBLOCK 1
57 #define LX_SIG_SETMASK 2
58
59 #define LX_MINSIGSTKSZ 2048
60 #define LX_SS_ONSTACK 1
61 #define LX_SS_DISABLE 2
62
63 #define LX_SIGRT_MAGIC 0xdeadf00d
64
65 #if !defined(_ASM)
66
67 /*
68 * NOTE: Linux uses different definitions for sigset_ts and sigaction_ts
69 * depending on whether the definition is for user space or the kernel.
70 *
71 * The definitions below MUST correspond to the Linux kernel versions,
72 * as glibc will do the necessary translation from the Linux user
73 * versions.
74 */
75 typedef struct {
76 ulong_t __bits[LX_NSIG_WORDS];
77 } lx_sigset_t;
78
79 #define LX_NBITS (sizeof (ulong_t) * NBBY)
80 #define lx_sigmask(n) (1UL << (((n) - 1) % LX_NBITS))
81 #define lx_sigword(n) (((ulong_t)((n) - 1))>>5)
82 #define lx_sigismember(s, n) (lx_sigmask(n) & (s)->__bits[lx_sigword(n)])
83 #define lx_sigaddset(s, n) ((s)->__bits[lx_sigword(n)] |= lx_sigmask(n))
84
85 typedef struct lx_sigaction {
86 void (*lxsa_handler)();
87 int lxsa_flags;
88 void (*lxsa_restorer)(void);
89 lx_sigset_t lxsa_mask;
90 } lx_sigaction_t;
91
92 typedef uint32_t lx_osigset_t;
93
94 #define OSIGSET_NBITS (sizeof (lx_osigset_t) * NBBY)
95 #define OSIGSET_BITSET(sig) (1U << (((sig) - 1) % OSIGSET_NBITS))
96
97 /*
98 * Flag settings to determine whether common routines should operate on
99 * lx_sigset_ts or lx_osigset_ts.
100 */
101 #define USE_OSIGSET 0
102 #define USE_SIGSET 1
103
104 typedef struct lx_osigaction {
105 void (*lxsa_handler)();
106 lx_osigset_t lxsa_mask;
107 int lxsa_flags;
108 void (*lxsa_restorer)(void);
109 } lx_osigaction_t;
110
111 #define LX_SI_MAX_SIZE 128
112 #define LX_SI_PAD_SIZE ((LX_SI_MAX_SIZE/sizeof (int)) - 3)
113
114 typedef struct lx_siginfo {
115 int lsi_signo;
116 int lsi_errno;
117 int lsi_code;
118 union {
119 int _pad[LX_SI_PAD_SIZE];
120
121 struct {
122 pid_t _pid;
123 lx_uid16_t _uid;
124 } _kill;
125
126 struct {
127 uint_t _timer1;
128 uint_t _timer2;
129 } _timer;
130
131 struct {
132 pid_t _pid; /* sender's pid */
133 lx_uid16_t _uid; /* sender's uid */
134 union sigval _sigval;
135 } _rt;
136
137 struct {
138 pid_t _pid; /* which child */
139 lx_uid16_t _uid; /* sender's uid */
140 int _status; /* exit code */
141 clock_t _utime;
142 clock_t _stime;
143 } _sigchld;
144
145 struct {
146 void *_addr; /* faulting insn/memory ref. */
147 } _sigfault;
148
149 struct {
150 int _band; /* POLL_IN,POLL_OUT,POLL_MSG */
151 int _fd;
152 } _sigpoll;
153 } _sifields;
154 } lx_siginfo_t;
155
156 /*
157 * lx_siginfo_t lsi_code values
158 *
159 * LX_SI_ASYNCNL: Sent by asynch name lookup completion
160 * LX_SI_TKILL: Sent by tkill
161 * LX_SI_SIGIO: Sent by queued SIGIO
162 * LX_SI_ASYNCIO: Sent by asynchronous I/O completion
163 * LX_SI_MESGQ: Sent by real time message queue state change
164 * LX_SI_TIMER: Sent by timer expiration
165 * LX_SI_QUEUE: Sent by sigqueue
166 * LX_SI_USER: Sent by kill, sigsend, raise, etc.
167 * LX_SI_KERNEL: Sent by kernel
168 *
169 * At present, LX_SI_ASYNCNL and LX_SI_SIGIO are unused by BrandZ.
170 */
171 #define LX_SI_ASYNCNL (-60)
172 #define LX_SI_TKILL (-6)
173 #define LX_SI_SIGIO (-5)
174 #define LX_SI_ASYNCIO (-4)
175 #define LX_SI_MESGQ (-3)
176 #define LX_SI_TIMER (-2)
177 #define LX_SI_QUEUE (-1)
178 #define LX_SI_USER (0)
179 #define LX_SI_KERNEL (0x80)
180
181 typedef struct lx_sighandlers {
182 struct lx_sigaction lx_sa[LX_NSIG];
183 } lx_sighandlers_t;
184
185 typedef struct lx_sigaltstack {
186 void *ss_sp;
187 int ss_flags;
188 size_t ss_size;
189 } lx_stack_t;
190
191 struct lx_fpreg {
192 ushort_t significand[4];
193 ushort_t exponent;
194 };
195
196 struct lx_fpxreg {
197 ushort_t significand[4];
198 ushort_t exponent;
199 ushort_t padding[3];
200 };
201
202 struct lx_xmmreg {
203 uint32_t element[4];
204 };
205
206 #define LX_X86_FXSR_MAGIC 0x0000
207 #define LX_X86_FXSR_NONE 0xffff
208
209 typedef struct lx_fpstate {
210 /* Regular FPU environment */
211 ulong_t cw;
212 ulong_t sw;
213 ulong_t tag;
214 ulong_t ipoff;
215 ulong_t cssel;
216 ulong_t dataoff;
217 ulong_t datasel;
218 struct lx_fpreg _st[8];
219 ushort_t status;
220 ushort_t magic; /* 0xffff = regular FPU data */
221
222 /* FXSR FPU environment */
223 ulong_t _fxsr_env[6]; /* env is ignored */
224 ulong_t mxcsr;
225 ulong_t reserved;
226 struct lx_fpxreg _fxsr_st[8]; /* reg data is ignored */
227 struct lx_xmmreg _xmm[8];
228 ulong_t padding[56];
229 } lx_fpstate_t;
230
231 typedef struct lx_sigcontext {
232 ulong_t sc_gs;
233 ulong_t sc_fs;
234 ulong_t sc_es;
235 ulong_t sc_ds;
236 ulong_t sc_edi;
237 ulong_t sc_esi;
238 ulong_t sc_ebp;
239 ulong_t sc_esp;
240 ulong_t sc_ebx;
241 ulong_t sc_edx;
242 ulong_t sc_ecx;
243 ulong_t sc_eax;
244 ulong_t sc_trapno;
245 ulong_t sc_err;
246 ulong_t sc_eip;
247 ulong_t sc_cs;
248 ulong_t sc_eflags;
249 ulong_t sc_esp_at_signal;
250 ulong_t sc_ss;
251 lx_fpstate_t *sc_fpstate;
252 ulong_t sc_mask;
253 ulong_t sc_cr2;
254 } lx_sigcontext_t;
255
256 typedef struct lx_ucontext {
257 ulong_t uc_flags;
258 struct lx_ucontext *uc_link;
259 lx_stack_t uc_stack;
260 lx_sigcontext_t uc_sigcontext;
261 lx_sigset_t uc_sigmask;
262 } lx_ucontext_t;
263
264 #define LX_SI_MAX_SIZE 128
265 #define LX_SI_PAD_SIZE ((LX_SI_MAX_SIZE/sizeof (int)) - 3)
266
267 #define lsi_pid _sifields._kill._pid
268 #define lsi_uid _sifields._kill._uid
269 #define lsi_status _sifields._sigchld._status
270 #define lsi_utime _sifields._sigchld._utime
271 #define lsi_stime _sifields._sigchld._stime
272 #define lsi_value _sifields._rt._sigval
273 #define lsi_int _sifields._rt._sigval.sivalx_int
274 #define lsi_ptr _sifields._rt._sigval.sivalx_ptr
275 #define lsi_addr _sifields._sigfault._addr
276 #define lsi_band _sifields._sigpoll._band
277 #define lsi_fd _sifields._sigpoll._fd
278
279 extern const int ltos_signo[];
280 extern const int stol_signo[];
281
282 extern void setsigacthandler(void (*)(int, siginfo_t *, void *),
283 void (**)(int, siginfo_t *, void *));
284
285 extern int lx_siginit(void);
286
287 extern void lx_sigreturn_tolibc(uintptr_t);
288 extern void lx_sigdeliver(int, siginfo_t *, void *, size_t, void (*)(),
289 void (*)(), uintptr_t);
290
291 extern int stol_siginfo(siginfo_t *siginfop, lx_siginfo_t *lx_siginfop);
292
293 #endif /* !defined(_ASM) */
294
295 #ifdef __cplusplus
296 }
297 #endif
298
299 #endif /* _SYS_LX_SIGNAL_H */