Fix elf64-ppc.c electric fence warning
[deliverable/binutils-gdb.git] / gdb / common / signals.c
... / ...
CommitLineData
1/* Target signal translation functions for GDB.
2 Copyright (C) 1990-2015 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
4
5 This file is part of GDB.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 3 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but 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 this program. If not, see <http://www.gnu.org/licenses/>. */
19
20#include "common-defs.h"
21
22#ifdef HAVE_SIGNAL_H
23#include <signal.h>
24#endif
25
26#include "gdb_signals.h"
27
28struct gdbarch;
29
30/* Always use __SIGRTMIN if it's available. SIGRTMIN is the lowest
31 _available_ realtime signal, not the lowest supported; glibc takes
32 several for its own use. */
33
34#ifndef REALTIME_LO
35# if defined(__SIGRTMIN)
36# define REALTIME_LO __SIGRTMIN
37# define REALTIME_HI (__SIGRTMAX + 1)
38# elif defined(SIGRTMIN)
39# define REALTIME_LO SIGRTMIN
40# define REALTIME_HI (SIGRTMAX + 1)
41# endif
42#endif
43
44/* This table must match in order and size the signals in enum
45 gdb_signal. */
46
47static const struct {
48 const char *symbol;
49 const char *name;
50 const char *string;
51 } signals [] =
52{
53#define SET(symbol, constant, name, string) { #symbol, name, string },
54#include "gdb/signals.def"
55#undef SET
56};
57
58const char *
59gdb_signal_to_symbol_string (enum gdb_signal sig)
60{
61 gdb_assert ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST);
62
63 return signals[sig].symbol;
64}
65
66/* Return the string for a signal. */
67const char *
68gdb_signal_to_string (enum gdb_signal sig)
69{
70 if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST)
71 return signals[sig].string;
72 else
73 return signals[GDB_SIGNAL_UNKNOWN].string;
74}
75
76/* Return the name for a signal. */
77const char *
78gdb_signal_to_name (enum gdb_signal sig)
79{
80 if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST
81 && signals[sig].name != NULL)
82 return signals[sig].name;
83 else
84 /* I think the code which prints this will always print it along
85 with the string, so no need to be verbose (very old comment). */
86 return "?";
87}
88
89/* Given a name, return its signal. */
90enum gdb_signal
91gdb_signal_from_name (const char *name)
92{
93 enum gdb_signal sig;
94
95 /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
96 for GDB_SIGNAL_SIGCHLD. SIGIOT, on the other hand, is more
97 questionable; seems like by now people should call it SIGABRT
98 instead. */
99
100 /* This ugly cast brought to you by the native VAX compiler. */
101 for (sig = GDB_SIGNAL_HUP;
102 sig < GDB_SIGNAL_LAST;
103 sig = (enum gdb_signal) ((int) sig + 1))
104 if (signals[sig].name != NULL
105 && strcmp (name, signals[sig].name) == 0)
106 return sig;
107 return GDB_SIGNAL_UNKNOWN;
108}
109\f
110/* The following functions are to help certain targets deal
111 with the signal/waitstatus stuff. They could just as well be in
112 a file called native-utils.c or unixwaitstatus-utils.c or whatever. */
113
114/* Convert host signal to our signals. */
115enum gdb_signal
116gdb_signal_from_host (int hostsig)
117{
118 /* A switch statement would make sense but would require special
119 kludges to deal with the cases where more than one signal has the
120 same number. Signals are ordered ANSI-standard signals first,
121 other signals second, with signals in each block ordered by their
122 numerical values on a typical POSIX platform. */
123
124 if (hostsig == 0)
125 return GDB_SIGNAL_0;
126
127 /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
128 are ANSI-standard signals and are always available. */
129 if (hostsig == SIGINT)
130 return GDB_SIGNAL_INT;
131 if (hostsig == SIGILL)
132 return GDB_SIGNAL_ILL;
133 if (hostsig == SIGABRT)
134 return GDB_SIGNAL_ABRT;
135 if (hostsig == SIGFPE)
136 return GDB_SIGNAL_FPE;
137 if (hostsig == SIGSEGV)
138 return GDB_SIGNAL_SEGV;
139 if (hostsig == SIGTERM)
140 return GDB_SIGNAL_TERM;
141
142 /* All other signals need preprocessor conditionals. */
143#if defined (SIGHUP)
144 if (hostsig == SIGHUP)
145 return GDB_SIGNAL_HUP;
146#endif
147#if defined (SIGQUIT)
148 if (hostsig == SIGQUIT)
149 return GDB_SIGNAL_QUIT;
150#endif
151#if defined (SIGTRAP)
152 if (hostsig == SIGTRAP)
153 return GDB_SIGNAL_TRAP;
154#endif
155#if defined (SIGEMT)
156 if (hostsig == SIGEMT)
157 return GDB_SIGNAL_EMT;
158#endif
159#if defined (SIGKILL)
160 if (hostsig == SIGKILL)
161 return GDB_SIGNAL_KILL;
162#endif
163#if defined (SIGBUS)
164 if (hostsig == SIGBUS)
165 return GDB_SIGNAL_BUS;
166#endif
167#if defined (SIGSYS)
168 if (hostsig == SIGSYS)
169 return GDB_SIGNAL_SYS;
170#endif
171#if defined (SIGPIPE)
172 if (hostsig == SIGPIPE)
173 return GDB_SIGNAL_PIPE;
174#endif
175#if defined (SIGALRM)
176 if (hostsig == SIGALRM)
177 return GDB_SIGNAL_ALRM;
178#endif
179#if defined (SIGUSR1)
180 if (hostsig == SIGUSR1)
181 return GDB_SIGNAL_USR1;
182#endif
183#if defined (SIGUSR2)
184 if (hostsig == SIGUSR2)
185 return GDB_SIGNAL_USR2;
186#endif
187#if defined (SIGCLD)
188 if (hostsig == SIGCLD)
189 return GDB_SIGNAL_CHLD;
190#endif
191#if defined (SIGCHLD)
192 if (hostsig == SIGCHLD)
193 return GDB_SIGNAL_CHLD;
194#endif
195#if defined (SIGPWR)
196 if (hostsig == SIGPWR)
197 return GDB_SIGNAL_PWR;
198#endif
199#if defined (SIGWINCH)
200 if (hostsig == SIGWINCH)
201 return GDB_SIGNAL_WINCH;
202#endif
203#if defined (SIGURG)
204 if (hostsig == SIGURG)
205 return GDB_SIGNAL_URG;
206#endif
207#if defined (SIGIO)
208 if (hostsig == SIGIO)
209 return GDB_SIGNAL_IO;
210#endif
211#if defined (SIGPOLL)
212 if (hostsig == SIGPOLL)
213 return GDB_SIGNAL_POLL;
214#endif
215#if defined (SIGSTOP)
216 if (hostsig == SIGSTOP)
217 return GDB_SIGNAL_STOP;
218#endif
219#if defined (SIGTSTP)
220 if (hostsig == SIGTSTP)
221 return GDB_SIGNAL_TSTP;
222#endif
223#if defined (SIGCONT)
224 if (hostsig == SIGCONT)
225 return GDB_SIGNAL_CONT;
226#endif
227#if defined (SIGTTIN)
228 if (hostsig == SIGTTIN)
229 return GDB_SIGNAL_TTIN;
230#endif
231#if defined (SIGTTOU)
232 if (hostsig == SIGTTOU)
233 return GDB_SIGNAL_TTOU;
234#endif
235#if defined (SIGVTALRM)
236 if (hostsig == SIGVTALRM)
237 return GDB_SIGNAL_VTALRM;
238#endif
239#if defined (SIGPROF)
240 if (hostsig == SIGPROF)
241 return GDB_SIGNAL_PROF;
242#endif
243#if defined (SIGXCPU)
244 if (hostsig == SIGXCPU)
245 return GDB_SIGNAL_XCPU;
246#endif
247#if defined (SIGXFSZ)
248 if (hostsig == SIGXFSZ)
249 return GDB_SIGNAL_XFSZ;
250#endif
251#if defined (SIGWIND)
252 if (hostsig == SIGWIND)
253 return GDB_SIGNAL_WIND;
254#endif
255#if defined (SIGPHONE)
256 if (hostsig == SIGPHONE)
257 return GDB_SIGNAL_PHONE;
258#endif
259#if defined (SIGLOST)
260 if (hostsig == SIGLOST)
261 return GDB_SIGNAL_LOST;
262#endif
263#if defined (SIGWAITING)
264 if (hostsig == SIGWAITING)
265 return GDB_SIGNAL_WAITING;
266#endif
267#if defined (SIGCANCEL)
268 if (hostsig == SIGCANCEL)
269 return GDB_SIGNAL_CANCEL;
270#endif
271#if defined (SIGLWP)
272 if (hostsig == SIGLWP)
273 return GDB_SIGNAL_LWP;
274#endif
275#if defined (SIGDANGER)
276 if (hostsig == SIGDANGER)
277 return GDB_SIGNAL_DANGER;
278#endif
279#if defined (SIGGRANT)
280 if (hostsig == SIGGRANT)
281 return GDB_SIGNAL_GRANT;
282#endif
283#if defined (SIGRETRACT)
284 if (hostsig == SIGRETRACT)
285 return GDB_SIGNAL_RETRACT;
286#endif
287#if defined (SIGMSG)
288 if (hostsig == SIGMSG)
289 return GDB_SIGNAL_MSG;
290#endif
291#if defined (SIGSOUND)
292 if (hostsig == SIGSOUND)
293 return GDB_SIGNAL_SOUND;
294#endif
295#if defined (SIGSAK)
296 if (hostsig == SIGSAK)
297 return GDB_SIGNAL_SAK;
298#endif
299#if defined (SIGPRIO)
300 if (hostsig == SIGPRIO)
301 return GDB_SIGNAL_PRIO;
302#endif
303
304 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
305#if defined (EXC_BAD_ACCESS) && defined (_NSIG)
306 if (hostsig == _NSIG + EXC_BAD_ACCESS)
307 return GDB_EXC_BAD_ACCESS;
308#endif
309#if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
310 if (hostsig == _NSIG + EXC_BAD_INSTRUCTION)
311 return GDB_EXC_BAD_INSTRUCTION;
312#endif
313#if defined (EXC_ARITHMETIC) && defined (_NSIG)
314 if (hostsig == _NSIG + EXC_ARITHMETIC)
315 return GDB_EXC_ARITHMETIC;
316#endif
317#if defined (EXC_EMULATION) && defined (_NSIG)
318 if (hostsig == _NSIG + EXC_EMULATION)
319 return GDB_EXC_EMULATION;
320#endif
321#if defined (EXC_SOFTWARE) && defined (_NSIG)
322 if (hostsig == _NSIG + EXC_SOFTWARE)
323 return GDB_EXC_SOFTWARE;
324#endif
325#if defined (EXC_BREAKPOINT) && defined (_NSIG)
326 if (hostsig == _NSIG + EXC_BREAKPOINT)
327 return GDB_EXC_BREAKPOINT;
328#endif
329
330#if defined (SIGINFO)
331 if (hostsig == SIGINFO)
332 return GDB_SIGNAL_INFO;
333#endif
334
335#if defined (REALTIME_LO)
336 if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
337 {
338 /* This block of GDB_SIGNAL_REALTIME value is in order. */
339 if (33 <= hostsig && hostsig <= 63)
340 return (enum gdb_signal)
341 (hostsig - 33 + (int) GDB_SIGNAL_REALTIME_33);
342 else if (hostsig == 32)
343 return GDB_SIGNAL_REALTIME_32;
344 else if (64 <= hostsig && hostsig <= 127)
345 return (enum gdb_signal)
346 (hostsig - 64 + (int) GDB_SIGNAL_REALTIME_64);
347 else
348 error (_("GDB bug: target.c (gdb_signal_from_host): "
349 "unrecognized real-time signal"));
350 }
351#endif
352
353 return GDB_SIGNAL_UNKNOWN;
354}
355
356/* Convert a OURSIG (an enum gdb_signal) to the form used by the
357 target operating system (refered to as the ``host'') or zero if the
358 equivalent host signal is not available. Set/clear OURSIG_OK
359 accordingly. */
360
361static int
362do_gdb_signal_to_host (enum gdb_signal oursig,
363 int *oursig_ok)
364{
365 int retsig;
366 /* Silence the 'not used' warning, for targets that
367 do not support signals. */
368 (void) retsig;
369
370 /* Signals are ordered ANSI-standard signals first, other signals
371 second, with signals in each block ordered by their numerical
372 values on a typical POSIX platform. */
373
374 *oursig_ok = 1;
375 switch (oursig)
376 {
377 case GDB_SIGNAL_0:
378 return 0;
379
380 /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
381 are ANSI-standard signals and are always available. */
382 case GDB_SIGNAL_INT:
383 return SIGINT;
384 case GDB_SIGNAL_ILL:
385 return SIGILL;
386 case GDB_SIGNAL_ABRT:
387 return SIGABRT;
388 case GDB_SIGNAL_FPE:
389 return SIGFPE;
390 case GDB_SIGNAL_SEGV:
391 return SIGSEGV;
392 case GDB_SIGNAL_TERM:
393 return SIGTERM;
394
395 /* All other signals need preprocessor conditionals. */
396#if defined (SIGHUP)
397 case GDB_SIGNAL_HUP:
398 return SIGHUP;
399#endif
400#if defined (SIGQUIT)
401 case GDB_SIGNAL_QUIT:
402 return SIGQUIT;
403#endif
404#if defined (SIGTRAP)
405 case GDB_SIGNAL_TRAP:
406 return SIGTRAP;
407#endif
408#if defined (SIGEMT)
409 case GDB_SIGNAL_EMT:
410 return SIGEMT;
411#endif
412#if defined (SIGKILL)
413 case GDB_SIGNAL_KILL:
414 return SIGKILL;
415#endif
416#if defined (SIGBUS)
417 case GDB_SIGNAL_BUS:
418 return SIGBUS;
419#endif
420#if defined (SIGSYS)
421 case GDB_SIGNAL_SYS:
422 return SIGSYS;
423#endif
424#if defined (SIGPIPE)
425 case GDB_SIGNAL_PIPE:
426 return SIGPIPE;
427#endif
428#if defined (SIGALRM)
429 case GDB_SIGNAL_ALRM:
430 return SIGALRM;
431#endif
432#if defined (SIGUSR1)
433 case GDB_SIGNAL_USR1:
434 return SIGUSR1;
435#endif
436#if defined (SIGUSR2)
437 case GDB_SIGNAL_USR2:
438 return SIGUSR2;
439#endif
440#if defined (SIGCHLD) || defined (SIGCLD)
441 case GDB_SIGNAL_CHLD:
442#if defined (SIGCHLD)
443 return SIGCHLD;
444#else
445 return SIGCLD;
446#endif
447#endif /* SIGCLD or SIGCHLD */
448#if defined (SIGPWR)
449 case GDB_SIGNAL_PWR:
450 return SIGPWR;
451#endif
452#if defined (SIGWINCH)
453 case GDB_SIGNAL_WINCH:
454 return SIGWINCH;
455#endif
456#if defined (SIGURG)
457 case GDB_SIGNAL_URG:
458 return SIGURG;
459#endif
460#if defined (SIGIO)
461 case GDB_SIGNAL_IO:
462 return SIGIO;
463#endif
464#if defined (SIGPOLL)
465 case GDB_SIGNAL_POLL:
466 return SIGPOLL;
467#endif
468#if defined (SIGSTOP)
469 case GDB_SIGNAL_STOP:
470 return SIGSTOP;
471#endif
472#if defined (SIGTSTP)
473 case GDB_SIGNAL_TSTP:
474 return SIGTSTP;
475#endif
476#if defined (SIGCONT)
477 case GDB_SIGNAL_CONT:
478 return SIGCONT;
479#endif
480#if defined (SIGTTIN)
481 case GDB_SIGNAL_TTIN:
482 return SIGTTIN;
483#endif
484#if defined (SIGTTOU)
485 case GDB_SIGNAL_TTOU:
486 return SIGTTOU;
487#endif
488#if defined (SIGVTALRM)
489 case GDB_SIGNAL_VTALRM:
490 return SIGVTALRM;
491#endif
492#if defined (SIGPROF)
493 case GDB_SIGNAL_PROF:
494 return SIGPROF;
495#endif
496#if defined (SIGXCPU)
497 case GDB_SIGNAL_XCPU:
498 return SIGXCPU;
499#endif
500#if defined (SIGXFSZ)
501 case GDB_SIGNAL_XFSZ:
502 return SIGXFSZ;
503#endif
504#if defined (SIGWIND)
505 case GDB_SIGNAL_WIND:
506 return SIGWIND;
507#endif
508#if defined (SIGPHONE)
509 case GDB_SIGNAL_PHONE:
510 return SIGPHONE;
511#endif
512#if defined (SIGLOST)
513 case GDB_SIGNAL_LOST:
514 return SIGLOST;
515#endif
516#if defined (SIGWAITING)
517 case GDB_SIGNAL_WAITING:
518 return SIGWAITING;
519#endif
520#if defined (SIGCANCEL)
521 case GDB_SIGNAL_CANCEL:
522 return SIGCANCEL;
523#endif
524#if defined (SIGLWP)
525 case GDB_SIGNAL_LWP:
526 return SIGLWP;
527#endif
528#if defined (SIGDANGER)
529 case GDB_SIGNAL_DANGER:
530 return SIGDANGER;
531#endif
532#if defined (SIGGRANT)
533 case GDB_SIGNAL_GRANT:
534 return SIGGRANT;
535#endif
536#if defined (SIGRETRACT)
537 case GDB_SIGNAL_RETRACT:
538 return SIGRETRACT;
539#endif
540#if defined (SIGMSG)
541 case GDB_SIGNAL_MSG:
542 return SIGMSG;
543#endif
544#if defined (SIGSOUND)
545 case GDB_SIGNAL_SOUND:
546 return SIGSOUND;
547#endif
548#if defined (SIGSAK)
549 case GDB_SIGNAL_SAK:
550 return SIGSAK;
551#endif
552#if defined (SIGPRIO)
553 case GDB_SIGNAL_PRIO:
554 return SIGPRIO;
555#endif
556
557 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
558#if defined (EXC_BAD_ACCESS) && defined (_NSIG)
559 case GDB_EXC_BAD_ACCESS:
560 return _NSIG + EXC_BAD_ACCESS;
561#endif
562#if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
563 case GDB_EXC_BAD_INSTRUCTION:
564 return _NSIG + EXC_BAD_INSTRUCTION;
565#endif
566#if defined (EXC_ARITHMETIC) && defined (_NSIG)
567 case GDB_EXC_ARITHMETIC:
568 return _NSIG + EXC_ARITHMETIC;
569#endif
570#if defined (EXC_EMULATION) && defined (_NSIG)
571 case GDB_EXC_EMULATION:
572 return _NSIG + EXC_EMULATION;
573#endif
574#if defined (EXC_SOFTWARE) && defined (_NSIG)
575 case GDB_EXC_SOFTWARE:
576 return _NSIG + EXC_SOFTWARE;
577#endif
578#if defined (EXC_BREAKPOINT) && defined (_NSIG)
579 case GDB_EXC_BREAKPOINT:
580 return _NSIG + EXC_BREAKPOINT;
581#endif
582
583#if defined (SIGINFO)
584 case GDB_SIGNAL_INFO:
585 return SIGINFO;
586#endif
587
588 default:
589#if defined (REALTIME_LO)
590 retsig = 0;
591
592 if (oursig >= GDB_SIGNAL_REALTIME_33
593 && oursig <= GDB_SIGNAL_REALTIME_63)
594 {
595 /* This block of signals is continuous, and
596 GDB_SIGNAL_REALTIME_33 is 33 by definition. */
597 retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_33 + 33;
598 }
599 else if (oursig == GDB_SIGNAL_REALTIME_32)
600 {
601 /* GDB_SIGNAL_REALTIME_32 isn't contiguous with
602 GDB_SIGNAL_REALTIME_33. It is 32 by definition. */
603 retsig = 32;
604 }
605 else if (oursig >= GDB_SIGNAL_REALTIME_64
606 && oursig <= GDB_SIGNAL_REALTIME_127)
607 {
608 /* This block of signals is continuous, and
609 GDB_SIGNAL_REALTIME_64 is 64 by definition. */
610 retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_64 + 64;
611 }
612
613 if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
614 return retsig;
615#endif
616
617 *oursig_ok = 0;
618 return 0;
619 }
620}
621
622int
623gdb_signal_to_host_p (enum gdb_signal oursig)
624{
625 int oursig_ok;
626 do_gdb_signal_to_host (oursig, &oursig_ok);
627 return oursig_ok;
628}
629
630int
631gdb_signal_to_host (enum gdb_signal oursig)
632{
633 int oursig_ok;
634 int targ_signo = do_gdb_signal_to_host (oursig, &oursig_ok);
635 if (!oursig_ok)
636 {
637 /* The user might be trying to do "signal SIGSAK" where this system
638 doesn't have SIGSAK. */
639 warning (_("Signal %s does not exist on this system."),
640 gdb_signal_to_name (oursig));
641 return 0;
642 }
643 else
644 return targ_signo;
645}
This page took 0.024972 seconds and 4 git commands to generate.