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, 2010
4 Free Software Foundation, Inc.
5 Contributed by Cygnus Support.
7 This file is part of GDB.
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.
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.
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/>. */
26 #include "gdb_string.h"
33 #include "gdb_signals.h"
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. */
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)
51 /* This table must match in order and size the signals in enum target_signal. */
58 #define SET(symbol, constant, name, string) ANY (symbol, name, string)
59 #define ANY(symbol, name, string) { name, string },
60 #include "gdb/signals.def"
66 /* Return the string for a signal. */
68 target_signal_to_string (enum target_signal sig
)
70 if ((int) sig
>= TARGET_SIGNAL_FIRST
&& (int) sig
<= TARGET_SIGNAL_LAST
)
71 return signals
[sig
].string
;
73 return signals
[TARGET_SIGNAL_UNKNOWN
].string
;
76 /* Return the name for a signal. */
78 target_signal_to_name (enum target_signal sig
)
80 if ((int) sig
>= TARGET_SIGNAL_FIRST
&& (int) sig
<= TARGET_SIGNAL_LAST
81 && signals
[sig
].name
!= NULL
)
82 return signals
[sig
].name
;
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). */
89 /* Given a name, return its signal. */
91 target_signal_from_name (const char *name
)
93 enum target_signal sig
;
95 /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
96 for TARGET_SIGNAL_SIGCHLD. SIGIOT, on the other hand, is more
97 questionable; seems like by now people should call it SIGABRT
100 /* This ugly cast brought to you by the native VAX compiler. */
101 for (sig
= TARGET_SIGNAL_HUP
;
102 sig
< TARGET_SIGNAL_LAST
;
103 sig
= (enum target_signal
) ((int) sig
+ 1))
104 if (signals
[sig
].name
!= NULL
105 && strcmp (name
, signals
[sig
].name
) == 0)
107 return TARGET_SIGNAL_UNKNOWN
;
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. */
114 /* Convert host signal to our signals. */
116 target_signal_from_host (int hostsig
)
118 /* A switch statement would make sense but would require special kludges
119 to deal with the cases where more than one signal has the same number. */
122 return TARGET_SIGNAL_0
;
125 if (hostsig
== SIGHUP
)
126 return TARGET_SIGNAL_HUP
;
129 if (hostsig
== SIGINT
)
130 return TARGET_SIGNAL_INT
;
132 #if defined (SIGQUIT)
133 if (hostsig
== SIGQUIT
)
134 return TARGET_SIGNAL_QUIT
;
137 if (hostsig
== SIGILL
)
138 return TARGET_SIGNAL_ILL
;
140 #if defined (SIGTRAP)
141 if (hostsig
== SIGTRAP
)
142 return TARGET_SIGNAL_TRAP
;
144 #if defined (SIGABRT)
145 if (hostsig
== SIGABRT
)
146 return TARGET_SIGNAL_ABRT
;
149 if (hostsig
== SIGEMT
)
150 return TARGET_SIGNAL_EMT
;
153 if (hostsig
== SIGFPE
)
154 return TARGET_SIGNAL_FPE
;
156 #if defined (SIGKILL)
157 if (hostsig
== SIGKILL
)
158 return TARGET_SIGNAL_KILL
;
161 if (hostsig
== SIGBUS
)
162 return TARGET_SIGNAL_BUS
;
164 #if defined (SIGSEGV)
165 if (hostsig
== SIGSEGV
)
166 return TARGET_SIGNAL_SEGV
;
169 if (hostsig
== SIGSYS
)
170 return TARGET_SIGNAL_SYS
;
172 #if defined (SIGPIPE)
173 if (hostsig
== SIGPIPE
)
174 return TARGET_SIGNAL_PIPE
;
176 #if defined (SIGALRM)
177 if (hostsig
== SIGALRM
)
178 return TARGET_SIGNAL_ALRM
;
180 #if defined (SIGTERM)
181 if (hostsig
== SIGTERM
)
182 return TARGET_SIGNAL_TERM
;
184 #if defined (SIGUSR1)
185 if (hostsig
== SIGUSR1
)
186 return TARGET_SIGNAL_USR1
;
188 #if defined (SIGUSR2)
189 if (hostsig
== SIGUSR2
)
190 return TARGET_SIGNAL_USR2
;
193 if (hostsig
== SIGCLD
)
194 return TARGET_SIGNAL_CHLD
;
196 #if defined (SIGCHLD)
197 if (hostsig
== SIGCHLD
)
198 return TARGET_SIGNAL_CHLD
;
201 if (hostsig
== SIGPWR
)
202 return TARGET_SIGNAL_PWR
;
204 #if defined (SIGWINCH)
205 if (hostsig
== SIGWINCH
)
206 return TARGET_SIGNAL_WINCH
;
209 if (hostsig
== SIGURG
)
210 return TARGET_SIGNAL_URG
;
213 if (hostsig
== SIGIO
)
214 return TARGET_SIGNAL_IO
;
216 #if defined (SIGPOLL)
217 if (hostsig
== SIGPOLL
)
218 return TARGET_SIGNAL_POLL
;
220 #if defined (SIGSTOP)
221 if (hostsig
== SIGSTOP
)
222 return TARGET_SIGNAL_STOP
;
224 #if defined (SIGTSTP)
225 if (hostsig
== SIGTSTP
)
226 return TARGET_SIGNAL_TSTP
;
228 #if defined (SIGCONT)
229 if (hostsig
== SIGCONT
)
230 return TARGET_SIGNAL_CONT
;
232 #if defined (SIGTTIN)
233 if (hostsig
== SIGTTIN
)
234 return TARGET_SIGNAL_TTIN
;
236 #if defined (SIGTTOU)
237 if (hostsig
== SIGTTOU
)
238 return TARGET_SIGNAL_TTOU
;
240 #if defined (SIGVTALRM)
241 if (hostsig
== SIGVTALRM
)
242 return TARGET_SIGNAL_VTALRM
;
244 #if defined (SIGPROF)
245 if (hostsig
== SIGPROF
)
246 return TARGET_SIGNAL_PROF
;
248 #if defined (SIGXCPU)
249 if (hostsig
== SIGXCPU
)
250 return TARGET_SIGNAL_XCPU
;
252 #if defined (SIGXFSZ)
253 if (hostsig
== SIGXFSZ
)
254 return TARGET_SIGNAL_XFSZ
;
256 #if defined (SIGWIND)
257 if (hostsig
== SIGWIND
)
258 return TARGET_SIGNAL_WIND
;
260 #if defined (SIGPHONE)
261 if (hostsig
== SIGPHONE
)
262 return TARGET_SIGNAL_PHONE
;
264 #if defined (SIGLOST)
265 if (hostsig
== SIGLOST
)
266 return TARGET_SIGNAL_LOST
;
268 #if defined (SIGWAITING)
269 if (hostsig
== SIGWAITING
)
270 return TARGET_SIGNAL_WAITING
;
272 #if defined (SIGCANCEL)
273 if (hostsig
== SIGCANCEL
)
274 return TARGET_SIGNAL_CANCEL
;
277 if (hostsig
== SIGLWP
)
278 return TARGET_SIGNAL_LWP
;
280 #if defined (SIGDANGER)
281 if (hostsig
== SIGDANGER
)
282 return TARGET_SIGNAL_DANGER
;
284 #if defined (SIGGRANT)
285 if (hostsig
== SIGGRANT
)
286 return TARGET_SIGNAL_GRANT
;
288 #if defined (SIGRETRACT)
289 if (hostsig
== SIGRETRACT
)
290 return TARGET_SIGNAL_RETRACT
;
293 if (hostsig
== SIGMSG
)
294 return TARGET_SIGNAL_MSG
;
296 #if defined (SIGSOUND)
297 if (hostsig
== SIGSOUND
)
298 return TARGET_SIGNAL_SOUND
;
301 if (hostsig
== SIGSAK
)
302 return TARGET_SIGNAL_SAK
;
304 #if defined (SIGPRIO)
305 if (hostsig
== SIGPRIO
)
306 return TARGET_SIGNAL_PRIO
;
309 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
310 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
311 if (hostsig
== _NSIG
+ EXC_BAD_ACCESS
)
312 return TARGET_EXC_BAD_ACCESS
;
314 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
315 if (hostsig
== _NSIG
+ EXC_BAD_INSTRUCTION
)
316 return TARGET_EXC_BAD_INSTRUCTION
;
318 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
319 if (hostsig
== _NSIG
+ EXC_ARITHMETIC
)
320 return TARGET_EXC_ARITHMETIC
;
322 #if defined (EXC_EMULATION) && defined (_NSIG)
323 if (hostsig
== _NSIG
+ EXC_EMULATION
)
324 return TARGET_EXC_EMULATION
;
326 #if defined (EXC_SOFTWARE) && defined (_NSIG)
327 if (hostsig
== _NSIG
+ EXC_SOFTWARE
)
328 return TARGET_EXC_SOFTWARE
;
330 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
331 if (hostsig
== _NSIG
+ EXC_BREAKPOINT
)
332 return TARGET_EXC_BREAKPOINT
;
335 #if defined (SIGINFO)
336 if (hostsig
== SIGINFO
)
337 return TARGET_SIGNAL_INFO
;
340 #if defined (REALTIME_LO)
341 if (hostsig
>= REALTIME_LO
&& hostsig
< REALTIME_HI
)
343 /* This block of TARGET_SIGNAL_REALTIME value is in order. */
344 if (33 <= hostsig
&& hostsig
<= 63)
345 return (enum target_signal
)
346 (hostsig
- 33 + (int) TARGET_SIGNAL_REALTIME_33
);
347 else if (hostsig
== 32)
348 return TARGET_SIGNAL_REALTIME_32
;
349 else if (64 <= hostsig
&& hostsig
<= 127)
350 return (enum target_signal
)
351 (hostsig
- 64 + (int) TARGET_SIGNAL_REALTIME_64
);
353 error ("GDB bug: target.c (target_signal_from_host): unrecognized real-time signal");
357 return TARGET_SIGNAL_UNKNOWN
;
360 /* Convert a OURSIG (an enum target_signal) to the form used by the
361 target operating system (refered to as the ``host'') or zero if the
362 equivalent host signal is not available. Set/clear OURSIG_OK
366 do_target_signal_to_host (enum target_signal oursig
,
370 /* Silence the 'not used' warning, for targets that
371 do not support signals. */
377 case TARGET_SIGNAL_0
:
381 case TARGET_SIGNAL_HUP
:
385 case TARGET_SIGNAL_INT
:
388 #if defined (SIGQUIT)
389 case TARGET_SIGNAL_QUIT
:
393 case TARGET_SIGNAL_ILL
:
396 #if defined (SIGTRAP)
397 case TARGET_SIGNAL_TRAP
:
400 #if defined (SIGABRT)
401 case TARGET_SIGNAL_ABRT
:
405 case TARGET_SIGNAL_EMT
:
409 case TARGET_SIGNAL_FPE
:
412 #if defined (SIGKILL)
413 case TARGET_SIGNAL_KILL
:
417 case TARGET_SIGNAL_BUS
:
420 #if defined (SIGSEGV)
421 case TARGET_SIGNAL_SEGV
:
425 case TARGET_SIGNAL_SYS
:
428 #if defined (SIGPIPE)
429 case TARGET_SIGNAL_PIPE
:
432 #if defined (SIGALRM)
433 case TARGET_SIGNAL_ALRM
:
436 #if defined (SIGTERM)
437 case TARGET_SIGNAL_TERM
:
440 #if defined (SIGUSR1)
441 case TARGET_SIGNAL_USR1
:
444 #if defined (SIGUSR2)
445 case TARGET_SIGNAL_USR2
:
448 #if defined (SIGCHLD) || defined (SIGCLD)
449 case TARGET_SIGNAL_CHLD
:
450 #if defined (SIGCHLD)
455 #endif /* SIGCLD or SIGCHLD */
457 case TARGET_SIGNAL_PWR
:
460 #if defined (SIGWINCH)
461 case TARGET_SIGNAL_WINCH
:
465 case TARGET_SIGNAL_URG
:
469 case TARGET_SIGNAL_IO
:
472 #if defined (SIGPOLL)
473 case TARGET_SIGNAL_POLL
:
476 #if defined (SIGSTOP)
477 case TARGET_SIGNAL_STOP
:
480 #if defined (SIGTSTP)
481 case TARGET_SIGNAL_TSTP
:
484 #if defined (SIGCONT)
485 case TARGET_SIGNAL_CONT
:
488 #if defined (SIGTTIN)
489 case TARGET_SIGNAL_TTIN
:
492 #if defined (SIGTTOU)
493 case TARGET_SIGNAL_TTOU
:
496 #if defined (SIGVTALRM)
497 case TARGET_SIGNAL_VTALRM
:
500 #if defined (SIGPROF)
501 case TARGET_SIGNAL_PROF
:
504 #if defined (SIGXCPU)
505 case TARGET_SIGNAL_XCPU
:
508 #if defined (SIGXFSZ)
509 case TARGET_SIGNAL_XFSZ
:
512 #if defined (SIGWIND)
513 case TARGET_SIGNAL_WIND
:
516 #if defined (SIGPHONE)
517 case TARGET_SIGNAL_PHONE
:
520 #if defined (SIGLOST)
521 case TARGET_SIGNAL_LOST
:
524 #if defined (SIGWAITING)
525 case TARGET_SIGNAL_WAITING
:
528 #if defined (SIGCANCEL)
529 case TARGET_SIGNAL_CANCEL
:
533 case TARGET_SIGNAL_LWP
:
536 #if defined (SIGDANGER)
537 case TARGET_SIGNAL_DANGER
:
540 #if defined (SIGGRANT)
541 case TARGET_SIGNAL_GRANT
:
544 #if defined (SIGRETRACT)
545 case TARGET_SIGNAL_RETRACT
:
549 case TARGET_SIGNAL_MSG
:
552 #if defined (SIGSOUND)
553 case TARGET_SIGNAL_SOUND
:
557 case TARGET_SIGNAL_SAK
:
560 #if defined (SIGPRIO)
561 case TARGET_SIGNAL_PRIO
:
565 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
566 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
567 case TARGET_EXC_BAD_ACCESS
:
568 return _NSIG
+ EXC_BAD_ACCESS
;
570 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
571 case TARGET_EXC_BAD_INSTRUCTION
:
572 return _NSIG
+ EXC_BAD_INSTRUCTION
;
574 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
575 case TARGET_EXC_ARITHMETIC
:
576 return _NSIG
+ EXC_ARITHMETIC
;
578 #if defined (EXC_EMULATION) && defined (_NSIG)
579 case TARGET_EXC_EMULATION
:
580 return _NSIG
+ EXC_EMULATION
;
582 #if defined (EXC_SOFTWARE) && defined (_NSIG)
583 case TARGET_EXC_SOFTWARE
:
584 return _NSIG
+ EXC_SOFTWARE
;
586 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
587 case TARGET_EXC_BREAKPOINT
:
588 return _NSIG
+ EXC_BREAKPOINT
;
591 #if defined (SIGINFO)
592 case TARGET_SIGNAL_INFO
:
597 #if defined (REALTIME_LO)
600 if (oursig
>= TARGET_SIGNAL_REALTIME_33
601 && oursig
<= TARGET_SIGNAL_REALTIME_63
)
603 /* This block of signals is continuous, and
604 TARGET_SIGNAL_REALTIME_33 is 33 by definition. */
605 retsig
= (int) oursig
- (int) TARGET_SIGNAL_REALTIME_33
+ 33;
607 else if (oursig
== TARGET_SIGNAL_REALTIME_32
)
609 /* TARGET_SIGNAL_REALTIME_32 isn't contiguous with
610 TARGET_SIGNAL_REALTIME_33. It is 32 by definition. */
613 else if (oursig
>= TARGET_SIGNAL_REALTIME_64
614 && oursig
<= TARGET_SIGNAL_REALTIME_127
)
616 /* This block of signals is continuous, and
617 TARGET_SIGNAL_REALTIME_64 is 64 by definition. */
618 retsig
= (int) oursig
- (int) TARGET_SIGNAL_REALTIME_64
+ 64;
621 if (retsig
>= REALTIME_LO
&& retsig
< REALTIME_HI
)
631 target_signal_to_host_p (enum target_signal oursig
)
634 do_target_signal_to_host (oursig
, &oursig_ok
);
639 target_signal_to_host (enum target_signal oursig
)
642 int targ_signo
= do_target_signal_to_host (oursig
, &oursig_ok
);
645 /* The user might be trying to do "signal SIGSAK" where this system
646 doesn't have SIGSAK. */
647 warning ("Signal %s does not exist on this system.\n",
648 target_signal_to_name (oursig
));
657 /* In some circumstances we allow a command to specify a numeric
658 signal. The idea is to keep these circumstances limited so that
659 users (and scripts) develop portable habits. For comparison,
660 POSIX.2 `kill' requires that 1,2,3,6,9,14, and 15 work (and using a
661 numeric signal at all is obsolescent. We are slightly more
662 lenient and allow 1-15 which should match host signal numbers on
663 most systems. Use of symbolic signal names is strongly encouraged. */
666 target_signal_from_command (int num
)
668 if (num
>= 1 && num
<= 15)
669 return (enum target_signal
) num
;
670 error ("Only signals 1-15 are valid as numeric signals.\n\
671 Use \"info signals\" for a list of symbolic signals.");
674 extern initialize_file_ftype _initialize_signals
; /* -Wmissing-prototype */
677 _initialize_signals (void)
679 if (strcmp (signals
[TARGET_SIGNAL_LAST
].string
, "TARGET_SIGNAL_MAGIC") != 0)
680 internal_error (__FILE__
, __LINE__
, "failed internal consistency check");
684 default_target_signal_to_host (struct gdbarch
*gdbarch
, enum target_signal ts
)
686 return target_signal_to_host (ts
);
690 default_target_signal_from_host (struct gdbarch
*gdbarch
, int signo
)
692 return target_signal_from_host (signo
);
695 #endif /* ! GDBSERVER */