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