1 /*
2  *  FreeBSD siginfo related definitions
3  *
4  *  Copyright (c) 2013 Stacey D. Son
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, see <http://www.gnu.org/licenses/>.
18  */
19 #ifndef _TARGET_OS_SIGINFO_H_
20 #define _TARGET_OS_SIGINFO_H_
21 
22 #define TARGET_NSIG         128
23 #define TARGET_NSIG_BPW     (sizeof(uint32_t) * 8)
24 #define TARGET_NSIG_WORDS   (TARGET_NSIG / TARGET_NSIG_BPW)
25 
26 /* this struct defines a stack used during syscall handling */
27 typedef struct target_sigaltstack {
28     abi_long    ss_sp;
29     abi_ulong   ss_size;
30     abi_long    ss_flags;
31 } target_stack_t;
32 
33 typedef struct {
34     uint32_t __bits[TARGET_NSIG_WORDS];
35 } target_sigset_t;
36 
37 struct target_sigaction {
38     abi_ulong   _sa_handler;
39     int32_t     sa_flags;
40     target_sigset_t sa_mask;
41 };
42 
43 typedef union target_sigval {
44     int32_t sival_int;
45     abi_ulong sival_ptr;
46     int32_t sigval_int;
47     abi_ulong sigval_ptr;
48 } target_sigval_t;
49 
50 typedef struct target_siginfo {
51     int32_t si_signo;   /* signal number */
52     int32_t si_errno;   /* errno association */
53     int32_t si_code;    /* signal code */
54     int32_t si_pid;     /* sending process */
55     int32_t si_uid;     /* sender's ruid */
56     int32_t si_status;  /* exit value */
57     abi_ulong si_addr;  /* faulting instruction */
58     union target_sigval si_value;   /* signal value */
59     union {
60         struct {
61             int32_t _trapno;    /* machine specific trap code */
62         } _fault;
63 
64         /* POSIX.1b timers */
65         struct {
66             int32_t _timerid;
67             int32_t _overrun;
68         } _timer;
69 
70         struct {
71             int32_t _mqd;
72         } _mesgp;
73 
74         /* SIGPOLL -- Not really genreated in FreeBSD ??? */
75         struct {
76             int _band;  /* POLL_IN, POLL_OUT, POLL_MSG */
77         } _poll;
78 
79         struct {
80             int _mqd;
81         } _mesgq;
82 
83         struct {
84             /*
85              * Syscall number for signals delivered as a result of system calls
86              * denied by Capsicum.
87              */
88             int _syscall;
89         } _capsicum;
90 
91         /* Spare for future growth */
92         struct {
93             abi_long __spare1__;
94             int32_t  __spare2_[7];
95         } __spare__;
96     } _reason;
97 } target_siginfo_t;
98 
99 struct target_sigevent {
100     abi_int sigev_notify;
101     abi_int sigev_signo;
102     target_sigval_t sigev_value;
103     union {
104         abi_int _threadid;
105 
106         /*
107          * The kernel (and thus QEMU) never looks at these;
108          * they're only used as part of the ABI between a
109          * userspace program and libc.
110          */
111         struct {
112             abi_ulong _function;
113             abi_ulong _attribute;
114         } _sigev_thread;
115         abi_ushort _kevent_flags;
116         abi_long _pad[8];
117     } _sigev_un;
118 };
119 
120 #define target_si_signo     si_signo
121 #define target_si_code      si_code
122 #define target_si_errno     si_errno
123 #define target_si_addr      si_addr
124 
125 /* SIGILL si_codes */
126 #define TARGET_ILL_ILLOPC   (1) /* Illegal opcode. */
127 #define TARGET_ILL_ILLOPN   (2) /* Illegal operand. */
128 #define TARGET_ILL_ILLADR   (3) /* Illegal addressing mode. */
129 #define TARGET_ILL_ILLTRP   (4) /* Illegal trap. */
130 #define TARGET_ILL_PRVOPC   (5) /* Privileged opcode. */
131 #define TARGET_ILL_PRVREG   (6) /* Privileged register. */
132 #define TARGET_ILL_COPROC   (7) /* Coprocessor error. */
133 #define TARGET_ILL_BADSTK   (8) /* Internal stack error. */
134 
135 /* SIGSEGV si_codes */
136 #define TARGET_SEGV_MAPERR  (1) /* address not mapped to object */
137 #define TARGET_SEGV_ACCERR  (2) /* invalid permissions for mapped object */
138 
139 /* SIGTRAP si_codes */
140 #define TARGET_TRAP_BRKPT   (1) /* process beakpoint */
141 #define TARGET_TRAP_TRACE   (2) /* process trace trap */
142 
143 /* SIGBUS si_codes */
144 #define TARGET_BUS_ADRALN   (1)
145 #define TARGET_BUS_ADRERR   (2)
146 #define TARGET_BUS_OBJERR   (3)
147 
148 /* SIGFPE codes */
149 #define TARGET_FPE_INTOVF   (1) /* Integer overflow. */
150 #define TARGET_FPE_INTDIV   (2) /* Integer divide by zero. */
151 #define TARGET_FPE_FLTDIV   (3) /* Floating point divide by zero. */
152 #define TARGET_FPE_FLTOVF   (4) /* Floating point overflow. */
153 #define TARGET_FPE_FLTUND   (5) /* Floating point underflow. */
154 #define TARGET_FPE_FLTRES   (6) /* Floating point inexact result. */
155 #define TARGET_FPE_FLTINV   (7) /* Invalid floating point operation. */
156 #define TARGET_FPE_FLTSUB   (8) /* Subscript out of range. */
157 
158 #endif /* !_TARGET_OS_SIGINFO_H_ */
159