mescc: Support binutils-2.20.1a: header tweaks.
[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
28
29 typedef int sigset_t;
30 typedef int stack_t;
31
32 #include <sys/types.h>
33
34 #define NSIG 30
35 #define SIGHUP     1
36 #define SIGINT     2
37 #define SIGQUIT    3
38 #define SIGILL     4
39 #define SIGTRAP    5
40 #define SIGABRT    6
41 #define SIGIOT     6
42 #define SIGBUS     7
43 #define SIGFPE     8
44 #define SIGKILL    9
45 #define SIGUSR1   10
46 #define SIGSEGV   11
47 #define SIGUSR2   12
48 #define SIGPIPE   13
49 #define SIGALRM   14
50 #define SIGTERM   15
51 #define SIGSTKFLT 16
52 #define SIGCHLD   17
53 #define SIGCONT   18
54 #define SIGSTOP   19
55 #define SIGTSTP   20
56 #define SIGTTIN   21
57 #define SIGTTOU   22
58 #define SIGURG    23
59 #define SIGXCPU   24
60 #define SIGXFSZ   25
61 #define SIGVTALRM 26
62 #define SIGPROF   27
63 #define SIGWINCH  28
64 #define SIGIO     29
65 #define SIGPOLL   SIGIO
66
67 #define FPE_INTDIV 1
68 #define FPE_INTOVF 2
69 #define FPE_FLTDIV 3
70 #define FPE_FLTOVF 4
71 #define FPE_FLTUND 5
72 #define FPE_FLTRES 6
73 #define FPE_FLTINV 7
74 #define FPE_FLTSUB 8
75
76 #define SA_NOCLDSTOP 0x00000001
77 #define SA_NOCLDWAIT 0x00000002
78 #define SA_SIGINFO   0x00000004
79 #define SA_ONSTACK   0x08000000
80 #define SA_RESTART   0x10000000
81 #define SA_NODEFER   0x40000000
82 #define SA_RESETHAND 0x80000000
83
84 #define SA_NOMASK  SA_NODEFER
85 #define SA_ONESHOT SA_RESETHAND
86
87
88 typedef struct siginfo_t {
89   int si_signo;
90   int si_errno;
91   int si_code;
92   int si_trapno;
93   pid_t si_pid;
94   uid_t si_uid;
95   int si_status;
96   clock_t si_utime;
97   clock_t si_stime;
98   sigval_t si_value;
99   int si_int;
100   void *si_ptr;
101   int si_overrun;
102   int si_timerid;
103   void *si_addr;
104   long si_band;
105   int si_fd;
106   short si_addr_lsb;
107   void *si_lower;
108   void *si_upper;
109   int si_pkey;
110   void *si_call_addr;
111   int si_syscall;
112   unsigned int si_arch;
113 } siginfo_t;
114
115
116 typedef void (*sighandler_t)(int);
117
118 struct sigaction {
119   union {
120     void (*sa_sigaction) (int signum, siginfo_t *, void *);
121 #if __MESC__
122     void (*sa_handler) (int);
123 #else
124   sighandler_t sa_handler;
125 #endif
126   };
127   unsigned long sa_flags;
128   sigset_t sa_mask;
129 };
130
131
132 #define SIG_DFL ((sighandler_t)0)
133 #define SIG_IGN ((sighandler_t)1)
134 #define SIG_ERR ((sighandler_t)-1)
135
136 #ifdef __i386__
137
138 #define EBX 0
139 #define ECX 1
140 #define EDX 2
141 #define ESI 3
142 #define EDI 4
143 #define EBP 5
144 #define EAX 6
145 #define DS 7
146 #define ES 8
147 #define FS 9
148 #define GS 10
149 #define ORIG_EAX 11
150 #define EIP 12
151 #define CS  13
152 #define EFL 14
153 #define UESP 15
154 #define SS   16
155 #define FRAME_SIZE 17
156
157 /* Type for general register.  */
158 typedef int greg_t;
159
160 /* Number of general registers.  */
161 #define NGREG        19
162
163 /* Container for all general registers.  */
164 typedef greg_t gregset_t[NGREG];
165
166 /* Definitions taken from the kernel headers.  */
167 struct _libc_fpreg
168 {
169   unsigned short int significand[4];
170   unsigned short int exponent;
171 };
172
173 struct _libc_fpstate
174 {
175   unsigned long int cw;
176   unsigned long int sw;
177   unsigned long int tag;
178   unsigned long int ipoff;
179   unsigned long int cssel;
180   unsigned long int dataoff;
181   unsigned long int datasel;
182   struct _libc_fpreg _st[8];
183   unsigned long int status;
184 };
185
186 /* Structure to describe FPU registers.  */
187 typedef struct _libc_fpstate *fpregset_t;
188
189 typedef struct
190   {
191     gregset_t gregs;
192     /* Due to Linux's history we have to use a pointer here.  The SysV/i386
193        ABI requires a struct with the values.  */
194     fpregset_t fpregs;
195     unsigned long int oldmask;
196     unsigned long int cr2;
197   } mcontext_t;
198
199 /* Userlevel context.  */
200 typedef struct ucontext
201   {
202     unsigned long int uc_flags;
203     struct ucontext *uc_link;
204     stack_t uc_stack;
205     mcontext_t uc_mcontext;
206     sigset_t uc_sigmask;
207     struct _libc_fpstate __fpregs_mem;
208   } ucontext_t;
209 #endif // !__i386__
210
211 int kill (pid_t pid, int signum);
212 int sigaction (int signum, struct sigaction const *act, struct sigaction *oldact);
213 #if __MESC__
214 void* signal (int signum, void * action);
215 #else
216 sighandler_t signal (int signum, sighandler_t action);
217 #endif
218 int sigemptyset (sigset_t *set);
219
220 #endif //! WITH_GLIBC
221
222 #endif // __MES_SIGNAL_H