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