Rev 3 | Rev 926 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | pj | 1 | /* |
2 | * Project: S.Ha.R.K. |
||
3 | * |
||
4 | * Coordinators: |
||
5 | * Giorgio Buttazzo <giorgio@sssup.it> |
||
6 | * Paolo Gai <pj@gandalf.sssup.it> |
||
7 | * |
||
8 | * Authors : |
||
9 | * Paolo Gai <pj@gandalf.sssup.it> |
||
10 | * Massimiliano Giorgi <massy@gandalf.sssup.it> |
||
11 | * Luca Abeni <luca@gandalf.sssup.it> |
||
12 | * (see the web pages for full authors list) |
||
13 | * |
||
14 | * ReTiS Lab (Scuola Superiore S.Anna - Pisa - Italy) |
||
15 | * |
||
16 | * http://www.sssup.it |
||
17 | * http://retis.sssup.it |
||
18 | * http://shark.sssup.it |
||
19 | */ |
||
20 | |||
21 | /** |
||
22 | ------------ |
||
80 | pj | 23 | CVS : $Id: signal.h,v 1.2 2003-03-13 13:41:04 pj Exp $ |
2 | pj | 24 | |
25 | File: $File$ |
||
80 | pj | 26 | Revision: $Revision: 1.2 $ |
27 | Last update: $Date: 2003-03-13 13:41:04 $ |
||
2 | pj | 28 | ------------ |
29 | |||
30 | This file contains the Signal Handling stuffs... |
||
31 | |||
32 | All the signals have a unique identifier through the system. |
||
33 | |||
34 | The signals numbers are from 0 to 255. All the signals are queued as |
||
35 | they are in Posix Realtime extension. |
||
36 | |||
37 | All the modules, libraries, and task models can define a signal with |
||
38 | a unique signal handler. |
||
39 | |||
40 | It's better if the schedule levels don't define any signal, because |
||
41 | in this case the application will depend to the level. |
||
42 | The signal numbers have instead to be defined in the task modules... |
||
43 | |||
44 | Index of this include file: |
||
45 | |||
46 | - Signal codes |
||
47 | - Signal handlers and data structures |
||
48 | - Signal functions & primitives |
||
49 | |||
50 | **/ |
||
51 | |||
52 | /* |
||
53 | * Copyright (C) 2000 Paolo Gai |
||
54 | * |
||
55 | * This program is free software; you can redistribute it and/or modify |
||
56 | * it under the terms of the GNU General Public License as published by |
||
57 | * the Free Software Foundation; either version 2 of the License, or |
||
58 | * (at your option) any later version. |
||
59 | * |
||
60 | * This program is distributed in the hope that it will be useful, |
||
61 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
62 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
63 | * GNU General Public License for more details. |
||
64 | * |
||
65 | * You should have received a copy of the GNU General Public License |
||
66 | * along with this program; if not, write to the Free Software |
||
67 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
||
68 | * |
||
69 | */ |
||
70 | |||
71 | /* |
||
72 | * some functions are inspired on the implementation of OsKit.. |
||
73 | * |
||
74 | * Copyright (c) 1997, 1998, 1999 University of Utah and the Flux Group. |
||
75 | * All rights reserved. |
||
76 | * |
||
77 | * [...] The OSKit is free software, also known |
||
78 | * as "open source;" you can redistribute it and/or modify it under the terms |
||
79 | * of the GNU General Public License (GPL), version 2, as published by the Free |
||
80 | * Software Foundation (FSF). To explore alternate licensing terms, contact |
||
81 | * the University of Utah at csl-dist@cs.utah.edu or +1-801-585-3271. |
||
82 | * |
||
83 | * The OSKit is distributed in the hope that it will be useful, but WITHOUT ANY |
||
84 | * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS |
||
85 | * FOR A PARTICULAR PURPOSE. See the GPL for more details. You should have |
||
86 | * received a copy of the GPL along with the OSKit; see the file COPYING. If |
||
87 | * not, write to the FSF, 59 Temple Place #330, Boston, MA 02111-1307, USA. |
||
88 | */ |
||
89 | |||
90 | |||
91 | #ifndef __SIGNAL_H__ |
||
92 | #define __SIGNAL_H__ |
||
93 | |||
94 | #include <kernel/const.h> |
||
95 | #include <kernel/types.h> |
||
96 | #include <sys/types.h> |
||
97 | //#include <time.h> |
||
80 | pj | 98 | #include "ll/sys/cdefs.h" |
2 | pj | 99 | |
80 | pj | 100 | __BEGIN_DECLS |
101 | |||
2 | pj | 102 | __DJ_pid_t |
103 | #undef __DJ_pid_t |
||
104 | #define __DJ_pid_t |
||
105 | |||
106 | |||
107 | /*---------------------------------------------------------------------*/ |
||
108 | /* Signal codes */ |
||
109 | /*---------------------------------------------------------------------*/ |
||
110 | |||
111 | /*+ Posix Signal codes: +*/ |
||
112 | #define SIGABRT 0UL /*+ Abnormal termination +*/ |
||
113 | #define SIGALRM 1UL /*+ Alarm timeout +*/ |
||
114 | #define SIGFPE 2UL /*+ Math error +*/ |
||
115 | #define SIGILL 3UL /*+ Illegal opcode +*/ |
||
116 | #define SIGKILL 4UL /*+ Kill!!! +*/ |
||
117 | #define SIGSEGV 5UL /*+ Segmantation Violation +*/ |
||
118 | #define SIGTERM 6UL /*+ Termination signal +*/ |
||
119 | #define SIGUSR1 7UL |
||
120 | #define SIGUSR2 8UL |
||
121 | |||
122 | #define SIGHEXC 9UL /*+ S.Ha.R.K. exception +*/ |
||
123 | #define SIGARPFULL 10UL /*+ ARP table Full, see drivers/net/arp.c +*/ |
||
124 | |||
125 | |||
126 | #define SIGRTMIN 11UL |
||
127 | #define SIGRTMAX 31UL |
||
128 | |||
129 | /*+ Maximum signal number in the system +*/ |
||
130 | #define SIG_MAX 32UL |
||
131 | |||
132 | /*+ codes used in pthread_sigmask (alias task_sigmask) +*/ |
||
133 | #define SIG_BLOCK 1 |
||
134 | #define SIG_UNBLOCK 2 |
||
135 | #define SIG_SETMASK 3 |
||
136 | |||
137 | /*+ codes used in sigaction structure +*/ |
||
138 | #define SIG_DFL (void (*)(int))0 |
||
139 | #define SIG_IGN (void (*)(int))1 |
||
140 | #define SIG_ERR (void (*)(int))-1 |
||
141 | |||
142 | |||
143 | /*+ codes used in sigevent structure +*/ |
||
144 | #define SIGEV_NONE 0 |
||
145 | #define SIGEV_SIGNAL 1 |
||
146 | #define SIGEV_THREAD 2 |
||
147 | |||
148 | |||
149 | /*+ signal used by timers if the sigevent parameter is NULL +*/ |
||
150 | #define DEFAULT_TIMER_SIGNAL 31 |
||
151 | |||
152 | /*---------------------------------------------------------------------*/ |
||
153 | /* Signal handlers and data structures */ |
||
154 | /*---------------------------------------------------------------------*/ |
||
155 | |||
156 | |||
157 | /*+ sigval is the value passed to the exception handler +*/ |
||
158 | union sigval { |
||
159 | int sival_int; |
||
160 | void * sival_ptr; |
||
161 | }; |
||
162 | |||
163 | /*+ siginfo_t contains some information about the signal... +*/ |
||
164 | typedef struct siginfo { |
||
165 | int si_signo; |
||
166 | int si_code; |
||
167 | union sigval si_value; |
||
168 | PID si_task; /* the sending task... */ |
||
169 | } siginfo_t; |
||
170 | |||
171 | /*+ this structure is used in the realtime timers +*/ |
||
172 | struct sigevent { |
||
173 | int sigev_notify; |
||
174 | int sigev_signo; |
||
175 | union sigval sigev_value; |
||
176 | void (*sigev_notify_function)(union sigval); |
||
177 | pthread_attr_t *sigev_notify_attributes; |
||
178 | }; |
||
179 | |||
180 | /*+ si_code values: +*/ |
||
181 | #define SI_USER 0 /*+ signal sent by kill, alarm +*/ |
||
182 | #define SI_QUEUE 1 /*+ signal sent by sigqueue +*/ |
||
183 | #define SI_TIMER 2 /*+ signal generated by the expiration of a timer +*/ |
||
184 | #define SI_ASYNCIO 3 /*+ signal gen. by the completion of an async I/O +*/ |
||
185 | #define SI_MESGQ 4 /*+ a message is arrived on an empty queue +*/ |
||
186 | |||
187 | |||
188 | /*+ signal Handler: there is only this definition. It corresponds to |
||
189 | a Realtime Signal handler. The Posix signals are called with a dirty |
||
190 | call... in effect these signals have only the signo parameter, but when |
||
191 | the system call them he puts all the three parameters, and then |
||
192 | the handler use only the first. It works well because the |
||
193 | activation frame of the two tasks are similar!!! +*/ |
||
194 | typedef void (*SIG_HANDLER)(int signo, siginfo_t *info, void *c); |
||
195 | |||
196 | |||
197 | /*+ a 32 bit signal mask. |
||
198 | If modified, modify also descr.h :-( +*/ |
||
199 | typedef int sigset_t; |
||
200 | |||
201 | /*+ sigaction structure: used with sigaction() to set a signal handler. |
||
202 | Normally, we have to set sa_flags = SA_SIGINFO and sa_sigaction = |
||
203 | the signal handler. |
||
204 | sa_mask, sa_handler are used only with Posix signals!!! |
||
205 | +*/ |
||
206 | struct sigaction { |
||
207 | void (*sa_handler)(int); |
||
208 | sigset_t sa_mask; |
||
209 | int sa_flags; |
||
210 | SIG_HANDLER sa_sigaction; |
||
211 | }; |
||
212 | |||
213 | /*+ bit values for the sa_flags structure +*/ |
||
214 | #define SA_SIGINFO 1 |
||
215 | //#define SA_USEFAST 2 |
||
216 | |||
217 | |||
218 | /*---------------------------------------------------------------------*/ |
||
219 | /* Internal stuffs */ |
||
220 | /*---------------------------------------------------------------------*/ |
||
221 | |||
222 | /* placed here because this data structures and definitions are used |
||
223 | in signals *and* timer handlers |
||
224 | (maybe in the near future they become another include file... |
||
225 | */ |
||
226 | |||
227 | /*+ a signal queue +*/ |
||
228 | typedef int SIGQ; |
||
229 | |||
230 | /*+ the sigqueue structure is allocated to a timer +*/ |
||
231 | #define USED_FOR_TIMER 1 |
||
232 | |||
233 | /*+ the signal is posted via a sigqueue call and still pending... +*/ |
||
234 | #define SIGNAL_POSTED 2 |
||
235 | |||
236 | /*+ These are the items that go on the sigqueue. +*/ |
||
237 | typedef struct { |
||
238 | SIGQ next; |
||
239 | siginfo_t info; |
||
240 | int flags; |
||
241 | } sig_queue_entry; |
||
242 | |||
243 | /*+ We avoid malloc in interrupt handlers by preallocating the queue |
||
244 | entries for sig_queued above. |
||
245 | it is used also in kernel/time.c +*/ |
||
246 | extern SIGQ sigqueue_free; |
||
247 | |||
248 | /*+ this is the signal queue... +*/ |
||
249 | extern sig_queue_entry sig_queue[SIGQUEUE_MAX]; |
||
250 | |||
251 | /* this version of sigqueue accept also the si_code parameter, useful |
||
252 | for timers and message queues */ |
||
253 | int |
||
254 | sigqueue_internal(pid_t pid, int signo, const union sigval value, int si_code); |
||
255 | |||
256 | |||
257 | |||
258 | /*---------------------------------------------------------------------*/ |
||
259 | /* Signal functions & primitives */ |
||
260 | /*---------------------------------------------------------------------*/ |
||
261 | |||
262 | /* |
||
263 | Posix signals primitives: |
||
264 | (they require sys/types.h and signal.h ) |
||
265 | |||
266 | IMP int kill(pid_t pid, int sig); |
||
267 | . pid is a non-sense |
||
268 | |||
269 | IMP int sigemptyset(sigset_t *set); |
||
270 | IMP int sigfillset(sigset_t *set); |
||
271 | IMP int sigaddset(sigset_t *set, int signo); |
||
272 | IMP int sigdelset(sigset_t *set, int signo); |
||
273 | IMP int sigismember(const sigset_t *set, int signo); |
||
274 | |||
275 | IMP int sigaction(int sig, const struct sigaction *act, |
||
276 | struct sigaction *oact); |
||
277 | |||
278 | IMP int pthread_sigmask(int how, const sigset_t *set, sigset_t *oset); |
||
279 | -> also renamed as task_sigmask; |
||
280 | IMP int sigprocmask(int how, const sigset_t *set, sigset_t *oset); |
||
281 | |||
282 | IMP int sigpending(sigset_t *set); |
||
283 | |||
284 | IMP int sigsuspend(const sigset_t *sigmask); |
||
285 | |||
286 | IMP int sigwait(const sigset_t *set, int *sig); |
||
287 | IMP int sigwaitinfo(const sigset_t *set, siginfo_t *info); |
||
288 | IMP int sigtimedwait(const sigset_t *set, siginfo_t *info, |
||
289 | const struct timespec *timeout); |
||
290 | |||
291 | IMP int sigqueue(pid_t pid, int signo, const union sigval value); |
||
292 | |||
293 | IMP int pthread_kill(pthread_t thread, int sig); |
||
294 | -> also renamed as task_signal |
||
295 | |||
296 | IMP unsigned int alarm(unsigned int seconds); |
||
297 | |||
298 | IMP int pause(void); |
||
299 | |||
300 | IMP unsigned int sleep(unsigned int seconds); |
||
301 | |||
302 | IMP int raise(int sig) |
||
303 | |||
304 | IMP void (*signal(int signum, void (*handler)(int)))(int); |
||
305 | |||
306 | +*/ |
||
307 | |||
308 | |||
309 | |||
310 | /*+ this function is called by __kernel_init__ and initialize the signal |
||
311 | subsystem. +*/ |
||
312 | void signals_init(void); |
||
313 | |||
314 | /*+ this function handles the pending signals... |
||
315 | it is called only in kern_context_load... see func.h +*/ |
||
316 | void kern_deliver_pending_signals(); |
||
317 | |||
318 | |||
319 | /*+ Posix sigset_t management functions +*/ |
||
320 | int sigemptyset(sigset_t *set); |
||
321 | int sigfillset(sigset_t *set); |
||
322 | int sigaddset(sigset_t *set, int signo); |
||
323 | int sigdelset(sigset_t *set, int signo); |
||
324 | int sigismember(const sigset_t *set, int signo); |
||
325 | |||
326 | |||
327 | int kill(pid_t pid, int sig); |
||
328 | |||
329 | /*+ This function allow the calling task to examine or specify (or both) |
||
330 | the action to be associated with a specific signal +*/ |
||
331 | int sigaction(int sig, const struct sigaction *act, |
||
332 | struct sigaction *oact); |
||
333 | |||
334 | int task_sigmask(int how, const sigset_t *set, sigset_t *oset); |
||
335 | |||
336 | int sigprocmask(int how, const sigset_t *set, sigset_t *oset); |
||
337 | |||
338 | int sigsuspend(const sigset_t *sigmask); |
||
339 | |||
340 | /* the sigwait & co. functions simply returns ENOSYS */ |
||
341 | int sigwait(const sigset_t *set, int *sig); |
||
342 | int sigwaitinfo(const sigset_t *set, siginfo_t *info); |
||
343 | int sigtimedwait(const sigset_t *set, siginfo_t *info, |
||
344 | const struct timespec *timeout); |
||
345 | |||
346 | /*+ This function causes the signal specified by signo to be sent with the |
||
347 | value specified by value to the task specified by p. it is slightly |
||
348 | different to the Posix implementation +*/ |
||
349 | int sigqueue(pid_t p, int signo, const union sigval value); |
||
350 | |||
351 | int task_signal(PID p, int signo); |
||
352 | |||
353 | /*+ raise is like task_signal on the current task... +*/ |
||
354 | int raise(int sig); |
||
355 | |||
356 | /*+ set a signal handler; it uses internally sigaction +*/ |
||
357 | void (*signal(int signum, void (*handler)(int)))(int); |
||
358 | |||
359 | /*+ store into *set the pending signals either for the process or the |
||
360 | current task +*/ |
||
361 | int sigpending(sigset_t *set); |
||
362 | |||
363 | /*+ stops the task until it will execute a signal handler +*/ |
||
364 | int sigsuspend(const sigset_t *sigmask); |
||
365 | |||
366 | /*+ S.Ha.R.K. exception raise... |
||
367 | This function uses sigqueue to put a signal to the task pointed |
||
368 | by p. |
||
369 | +*/ |
||
370 | void kern_raise(int n, PID p); |
||
371 | |||
372 | |||
373 | |||
374 | /* |
||
375 | * sigqueue. |
||
376 | */ |
||
377 | extern __inline__ int |
||
378 | sigqueue(pid_t pid, int signo, const union sigval value) |
||
379 | { |
||
380 | return sigqueue_internal(pid, signo, value, SI_QUEUE); |
||
381 | } |
||
382 | |||
80 | pj | 383 | __END_DECLS |
2 | pj | 384 | #endif |