]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - gdb/common/signals.c
* Makefile.in (GDB_CFLAGS): Add -I$(srcdir)/common.
[thirdparty/binutils-gdb.git] / gdb / common / signals.c
1 /* Target signal translation functions for GDB.
2 Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2006, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5 Contributed by Cygnus Support.
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
21
22 #ifdef GDBSERVER
23 #include "server.h"
24 #else
25 #include "defs.h"
26 #include "gdb_string.h"
27 #endif
28
29 #ifdef HAVE_SIGNAL_H
30 #include <signal.h>
31 #endif
32
33 #include "gdb_signals.h"
34
35 struct gdbarch;
36
37 /* Always use __SIGRTMIN if it's available. SIGRTMIN is the lowest
38 _available_ realtime signal, not the lowest supported; glibc takes
39 several for its own use. */
40
41 #ifndef REALTIME_LO
42 # if defined(__SIGRTMIN)
43 # define REALTIME_LO __SIGRTMIN
44 # define REALTIME_HI (__SIGRTMAX + 1)
45 # elif defined(SIGRTMIN)
46 # define REALTIME_LO SIGRTMIN
47 # define REALTIME_HI (SIGRTMAX + 1)
48 # endif
49 #endif
50
51 /* This table must match in order and size the signals in enum target_signal
52 in src/include/gdb/signals.h. */
53 /* *INDENT-OFF* */
54 static const struct {
55 const char *name;
56 const char *string;
57 } signals [] =
58 {
59 {"0", "Signal 0"},
60 {"SIGHUP", "Hangup"},
61 {"SIGINT", "Interrupt"},
62 {"SIGQUIT", "Quit"},
63 {"SIGILL", "Illegal instruction"},
64 {"SIGTRAP", "Trace/breakpoint trap"},
65 {"SIGABRT", "Aborted"},
66 {"SIGEMT", "Emulation trap"},
67 {"SIGFPE", "Arithmetic exception"},
68 {"SIGKILL", "Killed"},
69 {"SIGBUS", "Bus error"},
70 {"SIGSEGV", "Segmentation fault"},
71 {"SIGSYS", "Bad system call"},
72 {"SIGPIPE", "Broken pipe"},
73 {"SIGALRM", "Alarm clock"},
74 {"SIGTERM", "Terminated"},
75 {"SIGURG", "Urgent I/O condition"},
76 {"SIGSTOP", "Stopped (signal)"},
77 {"SIGTSTP", "Stopped (user)"},
78 {"SIGCONT", "Continued"},
79 {"SIGCHLD", "Child status changed"},
80 {"SIGTTIN", "Stopped (tty input)"},
81 {"SIGTTOU", "Stopped (tty output)"},
82 {"SIGIO", "I/O possible"},
83 {"SIGXCPU", "CPU time limit exceeded"},
84 {"SIGXFSZ", "File size limit exceeded"},
85 {"SIGVTALRM", "Virtual timer expired"},
86 {"SIGPROF", "Profiling timer expired"},
87 {"SIGWINCH", "Window size changed"},
88 {"SIGLOST", "Resource lost"},
89 {"SIGUSR1", "User defined signal 1"},
90 {"SIGUSR2", "User defined signal 2"},
91 {"SIGPWR", "Power fail/restart"},
92 {"SIGPOLL", "Pollable event occurred"},
93 {"SIGWIND", "SIGWIND"},
94 {"SIGPHONE", "SIGPHONE"},
95 {"SIGWAITING", "Process's LWPs are blocked"},
96 {"SIGLWP", "Signal LWP"},
97 {"SIGDANGER", "Swap space dangerously low"},
98 {"SIGGRANT", "Monitor mode granted"},
99 {"SIGRETRACT", "Need to relinquish monitor mode"},
100 {"SIGMSG", "Monitor mode data available"},
101 {"SIGSOUND", "Sound completed"},
102 {"SIGSAK", "Secure attention"},
103 {"SIGPRIO", "SIGPRIO"},
104 {"SIG33", "Real-time event 33"},
105 {"SIG34", "Real-time event 34"},
106 {"SIG35", "Real-time event 35"},
107 {"SIG36", "Real-time event 36"},
108 {"SIG37", "Real-time event 37"},
109 {"SIG38", "Real-time event 38"},
110 {"SIG39", "Real-time event 39"},
111 {"SIG40", "Real-time event 40"},
112 {"SIG41", "Real-time event 41"},
113 {"SIG42", "Real-time event 42"},
114 {"SIG43", "Real-time event 43"},
115 {"SIG44", "Real-time event 44"},
116 {"SIG45", "Real-time event 45"},
117 {"SIG46", "Real-time event 46"},
118 {"SIG47", "Real-time event 47"},
119 {"SIG48", "Real-time event 48"},
120 {"SIG49", "Real-time event 49"},
121 {"SIG50", "Real-time event 50"},
122 {"SIG51", "Real-time event 51"},
123 {"SIG52", "Real-time event 52"},
124 {"SIG53", "Real-time event 53"},
125 {"SIG54", "Real-time event 54"},
126 {"SIG55", "Real-time event 55"},
127 {"SIG56", "Real-time event 56"},
128 {"SIG57", "Real-time event 57"},
129 {"SIG58", "Real-time event 58"},
130 {"SIG59", "Real-time event 59"},
131 {"SIG60", "Real-time event 60"},
132 {"SIG61", "Real-time event 61"},
133 {"SIG62", "Real-time event 62"},
134 {"SIG63", "Real-time event 63"},
135 {"SIGCANCEL", "LWP internal signal"},
136 {"SIG32", "Real-time event 32"},
137 {"SIG64", "Real-time event 64"},
138 {"SIG65", "Real-time event 65"},
139 {"SIG66", "Real-time event 66"},
140 {"SIG67", "Real-time event 67"},
141 {"SIG68", "Real-time event 68"},
142 {"SIG69", "Real-time event 69"},
143 {"SIG70", "Real-time event 70"},
144 {"SIG71", "Real-time event 71"},
145 {"SIG72", "Real-time event 72"},
146 {"SIG73", "Real-time event 73"},
147 {"SIG74", "Real-time event 74"},
148 {"SIG75", "Real-time event 75"},
149 {"SIG76", "Real-time event 76"},
150 {"SIG77", "Real-time event 77"},
151 {"SIG78", "Real-time event 78"},
152 {"SIG79", "Real-time event 79"},
153 {"SIG80", "Real-time event 80"},
154 {"SIG81", "Real-time event 81"},
155 {"SIG82", "Real-time event 82"},
156 {"SIG83", "Real-time event 83"},
157 {"SIG84", "Real-time event 84"},
158 {"SIG85", "Real-time event 85"},
159 {"SIG86", "Real-time event 86"},
160 {"SIG87", "Real-time event 87"},
161 {"SIG88", "Real-time event 88"},
162 {"SIG89", "Real-time event 89"},
163 {"SIG90", "Real-time event 90"},
164 {"SIG91", "Real-time event 91"},
165 {"SIG92", "Real-time event 92"},
166 {"SIG93", "Real-time event 93"},
167 {"SIG94", "Real-time event 94"},
168 {"SIG95", "Real-time event 95"},
169 {"SIG96", "Real-time event 96"},
170 {"SIG97", "Real-time event 97"},
171 {"SIG98", "Real-time event 98"},
172 {"SIG99", "Real-time event 99"},
173 {"SIG100", "Real-time event 100"},
174 {"SIG101", "Real-time event 101"},
175 {"SIG102", "Real-time event 102"},
176 {"SIG103", "Real-time event 103"},
177 {"SIG104", "Real-time event 104"},
178 {"SIG105", "Real-time event 105"},
179 {"SIG106", "Real-time event 106"},
180 {"SIG107", "Real-time event 107"},
181 {"SIG108", "Real-time event 108"},
182 {"SIG109", "Real-time event 109"},
183 {"SIG110", "Real-time event 110"},
184 {"SIG111", "Real-time event 111"},
185 {"SIG112", "Real-time event 112"},
186 {"SIG113", "Real-time event 113"},
187 {"SIG114", "Real-time event 114"},
188 {"SIG115", "Real-time event 115"},
189 {"SIG116", "Real-time event 116"},
190 {"SIG117", "Real-time event 117"},
191 {"SIG118", "Real-time event 118"},
192 {"SIG119", "Real-time event 119"},
193 {"SIG120", "Real-time event 120"},
194 {"SIG121", "Real-time event 121"},
195 {"SIG122", "Real-time event 122"},
196 {"SIG123", "Real-time event 123"},
197 {"SIG124", "Real-time event 124"},
198 {"SIG125", "Real-time event 125"},
199 {"SIG126", "Real-time event 126"},
200 {"SIG127", "Real-time event 127"},
201
202 {"SIGINFO", "Information request"},
203
204 {NULL, "Unknown signal"},
205 {NULL, "Internal error: printing TARGET_SIGNAL_DEFAULT"},
206
207 /* Mach exceptions */
208 {"EXC_BAD_ACCESS", "Could not access memory"},
209 {"EXC_BAD_INSTRUCTION", "Illegal instruction/operand"},
210 {"EXC_ARITHMETIC", "Arithmetic exception"},
211 {"EXC_EMULATION", "Emulation instruction"},
212 {"EXC_SOFTWARE", "Software generated exception"},
213 {"EXC_BREAKPOINT", "Breakpoint"},
214
215 /* Last entry, used to check whether the table is the right size. */
216 {NULL, "TARGET_SIGNAL_MAGIC"}
217 };
218 /* *INDENT-ON* */
219
220
221
222 /* Return the string for a signal. */
223 const char *
224 target_signal_to_string (enum target_signal sig)
225 {
226 if ((int) sig >= TARGET_SIGNAL_FIRST && (int) sig <= TARGET_SIGNAL_LAST)
227 return signals[sig].string;
228 else
229 return signals[TARGET_SIGNAL_UNKNOWN].string;
230 }
231
232 /* Return the name for a signal. */
233 const char *
234 target_signal_to_name (enum target_signal sig)
235 {
236 if ((int) sig >= TARGET_SIGNAL_FIRST && (int) sig <= TARGET_SIGNAL_LAST
237 && signals[sig].name != NULL)
238 return signals[sig].name;
239 else
240 /* I think the code which prints this will always print it along
241 with the string, so no need to be verbose (very old comment). */
242 return "?";
243 }
244
245 /* Given a name, return its signal. */
246 enum target_signal
247 target_signal_from_name (const char *name)
248 {
249 enum target_signal sig;
250
251 /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
252 for TARGET_SIGNAL_SIGCHLD. SIGIOT, on the other hand, is more
253 questionable; seems like by now people should call it SIGABRT
254 instead. */
255
256 /* This ugly cast brought to you by the native VAX compiler. */
257 for (sig = TARGET_SIGNAL_HUP;
258 sig < TARGET_SIGNAL_LAST;
259 sig = (enum target_signal) ((int) sig + 1))
260 if (signals[sig].name != NULL
261 && strcmp (name, signals[sig].name) == 0)
262 return sig;
263 return TARGET_SIGNAL_UNKNOWN;
264 }
265 \f
266 /* The following functions are to help certain targets deal
267 with the signal/waitstatus stuff. They could just as well be in
268 a file called native-utils.c or unixwaitstatus-utils.c or whatever. */
269
270 /* Convert host signal to our signals. */
271 enum target_signal
272 target_signal_from_host (int hostsig)
273 {
274 /* A switch statement would make sense but would require special kludges
275 to deal with the cases where more than one signal has the same number. */
276
277 if (hostsig == 0)
278 return TARGET_SIGNAL_0;
279
280 #if defined (SIGHUP)
281 if (hostsig == SIGHUP)
282 return TARGET_SIGNAL_HUP;
283 #endif
284 #if defined (SIGINT)
285 if (hostsig == SIGINT)
286 return TARGET_SIGNAL_INT;
287 #endif
288 #if defined (SIGQUIT)
289 if (hostsig == SIGQUIT)
290 return TARGET_SIGNAL_QUIT;
291 #endif
292 #if defined (SIGILL)
293 if (hostsig == SIGILL)
294 return TARGET_SIGNAL_ILL;
295 #endif
296 #if defined (SIGTRAP)
297 if (hostsig == SIGTRAP)
298 return TARGET_SIGNAL_TRAP;
299 #endif
300 #if defined (SIGABRT)
301 if (hostsig == SIGABRT)
302 return TARGET_SIGNAL_ABRT;
303 #endif
304 #if defined (SIGEMT)
305 if (hostsig == SIGEMT)
306 return TARGET_SIGNAL_EMT;
307 #endif
308 #if defined (SIGFPE)
309 if (hostsig == SIGFPE)
310 return TARGET_SIGNAL_FPE;
311 #endif
312 #if defined (SIGKILL)
313 if (hostsig == SIGKILL)
314 return TARGET_SIGNAL_KILL;
315 #endif
316 #if defined (SIGBUS)
317 if (hostsig == SIGBUS)
318 return TARGET_SIGNAL_BUS;
319 #endif
320 #if defined (SIGSEGV)
321 if (hostsig == SIGSEGV)
322 return TARGET_SIGNAL_SEGV;
323 #endif
324 #if defined (SIGSYS)
325 if (hostsig == SIGSYS)
326 return TARGET_SIGNAL_SYS;
327 #endif
328 #if defined (SIGPIPE)
329 if (hostsig == SIGPIPE)
330 return TARGET_SIGNAL_PIPE;
331 #endif
332 #if defined (SIGALRM)
333 if (hostsig == SIGALRM)
334 return TARGET_SIGNAL_ALRM;
335 #endif
336 #if defined (SIGTERM)
337 if (hostsig == SIGTERM)
338 return TARGET_SIGNAL_TERM;
339 #endif
340 #if defined (SIGUSR1)
341 if (hostsig == SIGUSR1)
342 return TARGET_SIGNAL_USR1;
343 #endif
344 #if defined (SIGUSR2)
345 if (hostsig == SIGUSR2)
346 return TARGET_SIGNAL_USR2;
347 #endif
348 #if defined (SIGCLD)
349 if (hostsig == SIGCLD)
350 return TARGET_SIGNAL_CHLD;
351 #endif
352 #if defined (SIGCHLD)
353 if (hostsig == SIGCHLD)
354 return TARGET_SIGNAL_CHLD;
355 #endif
356 #if defined (SIGPWR)
357 if (hostsig == SIGPWR)
358 return TARGET_SIGNAL_PWR;
359 #endif
360 #if defined (SIGWINCH)
361 if (hostsig == SIGWINCH)
362 return TARGET_SIGNAL_WINCH;
363 #endif
364 #if defined (SIGURG)
365 if (hostsig == SIGURG)
366 return TARGET_SIGNAL_URG;
367 #endif
368 #if defined (SIGIO)
369 if (hostsig == SIGIO)
370 return TARGET_SIGNAL_IO;
371 #endif
372 #if defined (SIGPOLL)
373 if (hostsig == SIGPOLL)
374 return TARGET_SIGNAL_POLL;
375 #endif
376 #if defined (SIGSTOP)
377 if (hostsig == SIGSTOP)
378 return TARGET_SIGNAL_STOP;
379 #endif
380 #if defined (SIGTSTP)
381 if (hostsig == SIGTSTP)
382 return TARGET_SIGNAL_TSTP;
383 #endif
384 #if defined (SIGCONT)
385 if (hostsig == SIGCONT)
386 return TARGET_SIGNAL_CONT;
387 #endif
388 #if defined (SIGTTIN)
389 if (hostsig == SIGTTIN)
390 return TARGET_SIGNAL_TTIN;
391 #endif
392 #if defined (SIGTTOU)
393 if (hostsig == SIGTTOU)
394 return TARGET_SIGNAL_TTOU;
395 #endif
396 #if defined (SIGVTALRM)
397 if (hostsig == SIGVTALRM)
398 return TARGET_SIGNAL_VTALRM;
399 #endif
400 #if defined (SIGPROF)
401 if (hostsig == SIGPROF)
402 return TARGET_SIGNAL_PROF;
403 #endif
404 #if defined (SIGXCPU)
405 if (hostsig == SIGXCPU)
406 return TARGET_SIGNAL_XCPU;
407 #endif
408 #if defined (SIGXFSZ)
409 if (hostsig == SIGXFSZ)
410 return TARGET_SIGNAL_XFSZ;
411 #endif
412 #if defined (SIGWIND)
413 if (hostsig == SIGWIND)
414 return TARGET_SIGNAL_WIND;
415 #endif
416 #if defined (SIGPHONE)
417 if (hostsig == SIGPHONE)
418 return TARGET_SIGNAL_PHONE;
419 #endif
420 #if defined (SIGLOST)
421 if (hostsig == SIGLOST)
422 return TARGET_SIGNAL_LOST;
423 #endif
424 #if defined (SIGWAITING)
425 if (hostsig == SIGWAITING)
426 return TARGET_SIGNAL_WAITING;
427 #endif
428 #if defined (SIGCANCEL)
429 if (hostsig == SIGCANCEL)
430 return TARGET_SIGNAL_CANCEL;
431 #endif
432 #if defined (SIGLWP)
433 if (hostsig == SIGLWP)
434 return TARGET_SIGNAL_LWP;
435 #endif
436 #if defined (SIGDANGER)
437 if (hostsig == SIGDANGER)
438 return TARGET_SIGNAL_DANGER;
439 #endif
440 #if defined (SIGGRANT)
441 if (hostsig == SIGGRANT)
442 return TARGET_SIGNAL_GRANT;
443 #endif
444 #if defined (SIGRETRACT)
445 if (hostsig == SIGRETRACT)
446 return TARGET_SIGNAL_RETRACT;
447 #endif
448 #if defined (SIGMSG)
449 if (hostsig == SIGMSG)
450 return TARGET_SIGNAL_MSG;
451 #endif
452 #if defined (SIGSOUND)
453 if (hostsig == SIGSOUND)
454 return TARGET_SIGNAL_SOUND;
455 #endif
456 #if defined (SIGSAK)
457 if (hostsig == SIGSAK)
458 return TARGET_SIGNAL_SAK;
459 #endif
460 #if defined (SIGPRIO)
461 if (hostsig == SIGPRIO)
462 return TARGET_SIGNAL_PRIO;
463 #endif
464
465 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
466 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
467 if (hostsig == _NSIG + EXC_BAD_ACCESS)
468 return TARGET_EXC_BAD_ACCESS;
469 #endif
470 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
471 if (hostsig == _NSIG + EXC_BAD_INSTRUCTION)
472 return TARGET_EXC_BAD_INSTRUCTION;
473 #endif
474 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
475 if (hostsig == _NSIG + EXC_ARITHMETIC)
476 return TARGET_EXC_ARITHMETIC;
477 #endif
478 #if defined (EXC_EMULATION) && defined (_NSIG)
479 if (hostsig == _NSIG + EXC_EMULATION)
480 return TARGET_EXC_EMULATION;
481 #endif
482 #if defined (EXC_SOFTWARE) && defined (_NSIG)
483 if (hostsig == _NSIG + EXC_SOFTWARE)
484 return TARGET_EXC_SOFTWARE;
485 #endif
486 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
487 if (hostsig == _NSIG + EXC_BREAKPOINT)
488 return TARGET_EXC_BREAKPOINT;
489 #endif
490
491 #if defined (SIGINFO)
492 if (hostsig == SIGINFO)
493 return TARGET_SIGNAL_INFO;
494 #endif
495
496 #if defined (REALTIME_LO)
497 if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
498 {
499 /* This block of TARGET_SIGNAL_REALTIME value is in order. */
500 if (33 <= hostsig && hostsig <= 63)
501 return (enum target_signal)
502 (hostsig - 33 + (int) TARGET_SIGNAL_REALTIME_33);
503 else if (hostsig == 32)
504 return TARGET_SIGNAL_REALTIME_32;
505 else if (64 <= hostsig && hostsig <= 127)
506 return (enum target_signal)
507 (hostsig - 64 + (int) TARGET_SIGNAL_REALTIME_64);
508 else
509 error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
510 }
511 #endif
512
513 return TARGET_SIGNAL_UNKNOWN;
514 }
515
516 /* Convert a OURSIG (an enum target_signal) to the form used by the
517 target operating system (refered to as the ``host'') or zero if the
518 equivalent host signal is not available. Set/clear OURSIG_OK
519 accordingly. */
520
521 static int
522 do_target_signal_to_host (enum target_signal oursig,
523 int *oursig_ok)
524 {
525 int retsig;
526 /* Silence the 'not used' warning, for targets that
527 do not support signals. */
528 (void) retsig;
529
530 *oursig_ok = 1;
531 switch (oursig)
532 {
533 case TARGET_SIGNAL_0:
534 return 0;
535
536 #if defined (SIGHUP)
537 case TARGET_SIGNAL_HUP:
538 return SIGHUP;
539 #endif
540 #if defined (SIGINT)
541 case TARGET_SIGNAL_INT:
542 return SIGINT;
543 #endif
544 #if defined (SIGQUIT)
545 case TARGET_SIGNAL_QUIT:
546 return SIGQUIT;
547 #endif
548 #if defined (SIGILL)
549 case TARGET_SIGNAL_ILL:
550 return SIGILL;
551 #endif
552 #if defined (SIGTRAP)
553 case TARGET_SIGNAL_TRAP:
554 return SIGTRAP;
555 #endif
556 #if defined (SIGABRT)
557 case TARGET_SIGNAL_ABRT:
558 return SIGABRT;
559 #endif
560 #if defined (SIGEMT)
561 case TARGET_SIGNAL_EMT:
562 return SIGEMT;
563 #endif
564 #if defined (SIGFPE)
565 case TARGET_SIGNAL_FPE:
566 return SIGFPE;
567 #endif
568 #if defined (SIGKILL)
569 case TARGET_SIGNAL_KILL:
570 return SIGKILL;
571 #endif
572 #if defined (SIGBUS)
573 case TARGET_SIGNAL_BUS:
574 return SIGBUS;
575 #endif
576 #if defined (SIGSEGV)
577 case TARGET_SIGNAL_SEGV:
578 return SIGSEGV;
579 #endif
580 #if defined (SIGSYS)
581 case TARGET_SIGNAL_SYS:
582 return SIGSYS;
583 #endif
584 #if defined (SIGPIPE)
585 case TARGET_SIGNAL_PIPE:
586 return SIGPIPE;
587 #endif
588 #if defined (SIGALRM)
589 case TARGET_SIGNAL_ALRM:
590 return SIGALRM;
591 #endif
592 #if defined (SIGTERM)
593 case TARGET_SIGNAL_TERM:
594 return SIGTERM;
595 #endif
596 #if defined (SIGUSR1)
597 case TARGET_SIGNAL_USR1:
598 return SIGUSR1;
599 #endif
600 #if defined (SIGUSR2)
601 case TARGET_SIGNAL_USR2:
602 return SIGUSR2;
603 #endif
604 #if defined (SIGCHLD) || defined (SIGCLD)
605 case TARGET_SIGNAL_CHLD:
606 #if defined (SIGCHLD)
607 return SIGCHLD;
608 #else
609 return SIGCLD;
610 #endif
611 #endif /* SIGCLD or SIGCHLD */
612 #if defined (SIGPWR)
613 case TARGET_SIGNAL_PWR:
614 return SIGPWR;
615 #endif
616 #if defined (SIGWINCH)
617 case TARGET_SIGNAL_WINCH:
618 return SIGWINCH;
619 #endif
620 #if defined (SIGURG)
621 case TARGET_SIGNAL_URG:
622 return SIGURG;
623 #endif
624 #if defined (SIGIO)
625 case TARGET_SIGNAL_IO:
626 return SIGIO;
627 #endif
628 #if defined (SIGPOLL)
629 case TARGET_SIGNAL_POLL:
630 return SIGPOLL;
631 #endif
632 #if defined (SIGSTOP)
633 case TARGET_SIGNAL_STOP:
634 return SIGSTOP;
635 #endif
636 #if defined (SIGTSTP)
637 case TARGET_SIGNAL_TSTP:
638 return SIGTSTP;
639 #endif
640 #if defined (SIGCONT)
641 case TARGET_SIGNAL_CONT:
642 return SIGCONT;
643 #endif
644 #if defined (SIGTTIN)
645 case TARGET_SIGNAL_TTIN:
646 return SIGTTIN;
647 #endif
648 #if defined (SIGTTOU)
649 case TARGET_SIGNAL_TTOU:
650 return SIGTTOU;
651 #endif
652 #if defined (SIGVTALRM)
653 case TARGET_SIGNAL_VTALRM:
654 return SIGVTALRM;
655 #endif
656 #if defined (SIGPROF)
657 case TARGET_SIGNAL_PROF:
658 return SIGPROF;
659 #endif
660 #if defined (SIGXCPU)
661 case TARGET_SIGNAL_XCPU:
662 return SIGXCPU;
663 #endif
664 #if defined (SIGXFSZ)
665 case TARGET_SIGNAL_XFSZ:
666 return SIGXFSZ;
667 #endif
668 #if defined (SIGWIND)
669 case TARGET_SIGNAL_WIND:
670 return SIGWIND;
671 #endif
672 #if defined (SIGPHONE)
673 case TARGET_SIGNAL_PHONE:
674 return SIGPHONE;
675 #endif
676 #if defined (SIGLOST)
677 case TARGET_SIGNAL_LOST:
678 return SIGLOST;
679 #endif
680 #if defined (SIGWAITING)
681 case TARGET_SIGNAL_WAITING:
682 return SIGWAITING;
683 #endif
684 #if defined (SIGCANCEL)
685 case TARGET_SIGNAL_CANCEL:
686 return SIGCANCEL;
687 #endif
688 #if defined (SIGLWP)
689 case TARGET_SIGNAL_LWP:
690 return SIGLWP;
691 #endif
692 #if defined (SIGDANGER)
693 case TARGET_SIGNAL_DANGER:
694 return SIGDANGER;
695 #endif
696 #if defined (SIGGRANT)
697 case TARGET_SIGNAL_GRANT:
698 return SIGGRANT;
699 #endif
700 #if defined (SIGRETRACT)
701 case TARGET_SIGNAL_RETRACT:
702 return SIGRETRACT;
703 #endif
704 #if defined (SIGMSG)
705 case TARGET_SIGNAL_MSG:
706 return SIGMSG;
707 #endif
708 #if defined (SIGSOUND)
709 case TARGET_SIGNAL_SOUND:
710 return SIGSOUND;
711 #endif
712 #if defined (SIGSAK)
713 case TARGET_SIGNAL_SAK:
714 return SIGSAK;
715 #endif
716 #if defined (SIGPRIO)
717 case TARGET_SIGNAL_PRIO:
718 return SIGPRIO;
719 #endif
720
721 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
722 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
723 case TARGET_EXC_BAD_ACCESS:
724 return _NSIG + EXC_BAD_ACCESS;
725 #endif
726 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
727 case TARGET_EXC_BAD_INSTRUCTION:
728 return _NSIG + EXC_BAD_INSTRUCTION;
729 #endif
730 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
731 case TARGET_EXC_ARITHMETIC:
732 return _NSIG + EXC_ARITHMETIC;
733 #endif
734 #if defined (EXC_EMULATION) && defined (_NSIG)
735 case TARGET_EXC_EMULATION:
736 return _NSIG + EXC_EMULATION;
737 #endif
738 #if defined (EXC_SOFTWARE) && defined (_NSIG)
739 case TARGET_EXC_SOFTWARE:
740 return _NSIG + EXC_SOFTWARE;
741 #endif
742 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
743 case TARGET_EXC_BREAKPOINT:
744 return _NSIG + EXC_BREAKPOINT;
745 #endif
746
747 #if defined (SIGINFO)
748 case TARGET_SIGNAL_INFO:
749 return SIGINFO;
750 #endif
751
752 default:
753 #if defined (REALTIME_LO)
754 retsig = 0;
755
756 if (oursig >= TARGET_SIGNAL_REALTIME_33
757 && oursig <= TARGET_SIGNAL_REALTIME_63)
758 {
759 /* This block of signals is continuous, and
760 TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
761 retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_33 + 33;
762 }
763 else if (oursig == TARGET_SIGNAL_REALTIME_32)
764 {
765 /* TARGET_SIGNAL_REALTIME_32 isn't contiguous with
766 TARGET_SIGNAL_REALTIME_33. It is 32 by definition. */
767 retsig = 32;
768 }
769 else if (oursig >= TARGET_SIGNAL_REALTIME_64
770 && oursig <= TARGET_SIGNAL_REALTIME_127)
771 {
772 /* This block of signals is continuous, and
773 TARGET_SIGNAL_REALTIME_64 is 64 by definition. */
774 retsig = (int) oursig - (int) TARGET_SIGNAL_REALTIME_64 + 64;
775 }
776
777 if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
778 return retsig;
779 #endif
780
781 *oursig_ok = 0;
782 return 0;
783 }
784 }
785
786 int
787 target_signal_to_host_p (enum target_signal oursig)
788 {
789 int oursig_ok;
790 do_target_signal_to_host (oursig, &oursig_ok);
791 return oursig_ok;
792 }
793
794 int
795 target_signal_to_host (enum target_signal oursig)
796 {
797 int oursig_ok;
798 int targ_signo = do_target_signal_to_host (oursig, &oursig_ok);
799 if (!oursig_ok)
800 {
801 /* The user might be trying to do "signal SIGSAK" where this system
802 doesn't have SIGSAK. */
803 warning ("Signal %s does not exist on this system.\n",
804 target_signal_to_name (oursig));
805 return 0;
806 }
807 else
808 return targ_signo;
809 }
810
811 #ifndef GDBSERVER
812
813 /* In some circumstances we allow a command to specify a numeric
814 signal. The idea is to keep these circumstances limited so that
815 users (and scripts) develop portable habits. For comparison,
816 POSIX.2 `kill' requires that 1,2,3,6,9,14, and 15 work (and using a
817 numeric signal at all is obsolescent. We are slightly more
818 lenient and allow 1-15 which should match host signal numbers on
819 most systems. Use of symbolic signal names is strongly encouraged. */
820
821 enum target_signal
822 target_signal_from_command (int num)
823 {
824 if (num >= 1 && num <= 15)
825 return (enum target_signal) num;
826 error ("Only signals 1-15 are valid as numeric signals.\n\
827 Use \"info signals\" for a list of symbolic signals.");
828 }
829
830 extern initialize_file_ftype _initialize_signals; /* -Wmissing-prototype */
831
832 void
833 _initialize_signals (void)
834 {
835 if (strcmp (signals[TARGET_SIGNAL_LAST].string, "TARGET_SIGNAL_MAGIC") != 0)
836 internal_error (__FILE__, __LINE__, "failed internal consistency check");
837 }
838
839 int
840 default_target_signal_to_host (struct gdbarch *gdbarch, enum target_signal ts)
841 {
842 return target_signal_to_host (ts);
843 }
844
845 enum target_signal
846 default_target_signal_from_host (struct gdbarch *gdbarch, int signo)
847 {
848 return target_signal_from_host (signo);
849 }
850
851 #endif /* ! GDBSERVER */