90cb4acdc5c7a144a9c13c017534eccf0c624f51
[mes.git] / include / signal.h
1 /* -*-comment-start: "//";comment-end:""-*-
2  * Mes --- Maxwell Equations of Software
3  * Copyright © 2017 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
4  *
5  * This file is part of Mes.
6  *
7  * Mes is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or (at
10  * your option) any later version.
11  *
12  * Mes is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Mes.  If not, see <http://www.gnu.org/licenses/>.
19  */
20 #ifndef __MES_SIGNAL_H
21 #define __MES_SIGNAL_H 1
22
23 #if WITH_GLIBC
24 #undef __MES_SIGNAL_H
25 #include_next <signal.h>
26 #else //! WITH_GLIBC
27 typedef int sigset_t;
28
29 typedef int stack_t;
30
31 #ifndef __MES_PID_T
32 #define __MES_PID_T
33 typedef int pid_t;
34 #endif
35
36 #ifndef __MES_UID_T
37 #define __MES_UID_T
38 typedef int uid_t;
39 #endif
40
41 #ifndef __MES_CLOCK_T
42 #define __MES_CLOCK_T
43 #undef clock_t
44 typedef long clock_t;
45 #endif
46
47 #ifndef __MES_SIGVAL_T
48 #define __MES_SIGVAL_T
49 #undef clock_t
50 typedef int sigval_t;
51 #endif
52
53 #define NSIG 30
54 #define SIGHUP     1
55 #define SIGINT     2
56 #define SIGQUIT    3
57 #define SIGILL     4
58 #define SIGTRAP    5
59 #define SIGABRT    6
60 #define SIGIOT     6
61 #define SIGBUS     7
62 #define SIGFPE     8
63 #define SIGKILL    9
64 #define SIGUSR1   10
65 #define SIGSEGV   11
66 #define SIGUSR2   12
67 #define SIGPIPE   13
68 #define SIGALRM   14
69 #define SIGTERM   15
70 #define SIGSTKFLT 16
71 #define SIGCHLD   17
72 #define SIGCONT   18
73 #define SIGSTOP   19
74 #define SIGTSTP   20
75 #define SIGTTIN   21
76 #define SIGTTOU   22
77 #define SIGURG    23
78 #define SIGXCPU   24
79 #define SIGXFSZ   25
80 #define SIGVTALRM 26
81 #define SIGPROF   27
82 #define SIGWINCH  28
83 #define SIGIO     29
84 #define SIGPOLL   SIGIO
85
86 #define FPE_INTDIV 1
87 #define FPE_INTOVF 2
88 #define FPE_FLTDIV 3
89 #define FPE_FLTOVF 4
90 #define FPE_FLTUND 5
91 #define FPE_FLTRES 6
92 #define FPE_FLTINV 7
93 #define FPE_FLTSUB 8
94
95 #define SA_NOCLDSTOP 0x00000001
96 #define SA_NOCLDWAIT 0x00000002
97 #define SA_SIGINFO   0x00000004
98 #define SA_ONSTACK   0x08000000
99 #define SA_RESTART   0x10000000
100 #define SA_NODEFER   0x40000000
101 #define SA_RESETHAND 0x80000000
102
103 #define SA_NOMASK  SA_NODEFER
104 #define SA_ONESHOT SA_RESETHAND
105
106
107 typedef struct siginfo_t {
108   int si_signo;
109   int si_errno;
110   int si_code;
111   int si_trapno;
112   pid_t si_pid;
113   uid_t si_uid;
114   int si_status;
115   clock_t si_utime;
116   clock_t si_stime;
117   sigval_t si_value;
118   int si_int;
119   void *si_ptr;
120   int si_overrun;
121   int si_timerid;
122   void *si_addr;
123   long si_band;
124   int si_fd;
125   short si_addr_lsb;
126   void *si_lower;
127   void *si_upper;
128   int si_pkey;
129   void *si_call_addr;
130   int si_syscall;
131   unsigned int si_arch;
132 } siginfo_t;
133
134
135 typedef void (*sighandler_t)(int);
136
137 struct sigaction {
138   union {
139     void (*sa_sigaction) (int signum, siginfo_t *, void *);
140 #if __MESC__
141     void (*sa_handler) (int);
142 #else
143   sighandler_t sa_handler;
144 #endif
145   };
146   unsigned long sa_flags;
147   sigset_t sa_mask;
148 };
149
150
151 #define SIG_DFL ((sighandler_t)0)
152 #define SIG_IGN ((sighandler_t)1)
153 #define SIG_ERR ((sighandler_t)-1)
154
155 #ifdef __i386__
156
157 #define EBX 0
158 #define ECX 1
159 #define EDX 2
160 #define ESI 3
161 #define EDI 4
162 #define EBP 5
163 #define EAX 6
164 #define DS 7
165 #define ES 8
166 #define FS 9
167 #define GS 10
168 #define ORIG_EAX 11
169 #define EIP 12
170 #define CS  13
171 #define EFL 14
172 #define UESP 15
173 #define SS   16
174 #define FRAME_SIZE 17
175
176 /* Type for general register.  */
177 typedef int greg_t;
178
179 /* Number of general registers.  */
180 #define NGREG        19
181
182 /* Container for all general registers.  */
183 typedef greg_t gregset_t[NGREG];
184
185 /* Definitions taken from the kernel headers.  */
186 struct _libc_fpreg
187 {
188   unsigned short int significand[4];
189   unsigned short int exponent;
190 };
191
192 struct _libc_fpstate
193 {
194   unsigned long int cw;
195   unsigned long int sw;
196   unsigned long int tag;
197   unsigned long int ipoff;
198   unsigned long int cssel;
199   unsigned long int dataoff;
200   unsigned long int datasel;
201   struct _libc_fpreg _st[8];
202   unsigned long int status;
203 };
204
205 /* Structure to describe FPU registers.  */
206 typedef struct _libc_fpstate *fpregset_t;
207
208 typedef struct
209   {
210     gregset_t gregs;
211     /* Due to Linux's history we have to use a pointer here.  The SysV/i386
212        ABI requires a struct with the values.  */
213     fpregset_t fpregs;
214     unsigned long int oldmask;
215     unsigned long int cr2;
216   } mcontext_t;
217
218 /* Userlevel context.  */
219 typedef struct ucontext
220   {
221     unsigned long int uc_flags;
222     struct ucontext *uc_link;
223     stack_t uc_stack;
224     mcontext_t uc_mcontext;
225     sigset_t uc_sigmask;
226     struct _libc_fpstate __fpregs_mem;
227   } ucontext_t;
228 #endif // !__i386__
229
230 int kill (pid_t pid, int signum);
231 int sigaction (int signum, struct sigaction const *act, struct sigaction *oldact);
232 #if __MESC__
233 void* signal (int signum, void * action);
234 #else
235 sighandler_t signal (int signum, sighandler_t action);
236 #endif
237 int sigemptyset (sigset_t *set);
238
239 #endif //! WITH_GLIBC
240
241 #endif // __MES_SIGNAL_H