1 /* Target signal translation functions for GDB.
2 Copyright (C) 1990-2013 Free Software Foundation, Inc.
3 Contributed by Cygnus Support.
5 This file is part of GDB.
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.
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.
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/>. */
24 #include "gdb_string.h"
31 #include "gdb_signals.h"
35 /* Always use __SIGRTMIN if it's available. SIGRTMIN is the lowest
36 _available_ realtime signal, not the lowest supported; glibc takes
37 several for its own use. */
40 # if defined(__SIGRTMIN)
41 # define REALTIME_LO __SIGRTMIN
42 # define REALTIME_HI (__SIGRTMAX + 1)
43 # elif defined(SIGRTMIN)
44 # define REALTIME_LO SIGRTMIN
45 # define REALTIME_HI (SIGRTMAX + 1)
49 /* This table must match in order and size the signals in enum
57 #define SET(symbol, constant, name, string) { name, string },
58 #include "gdb/signals.def"
63 /* Return the string for a signal. */
65 gdb_signal_to_string (enum gdb_signal sig
)
67 if ((int) sig
>= GDB_SIGNAL_FIRST
&& (int) sig
<= GDB_SIGNAL_LAST
)
68 return signals
[sig
].string
;
70 return signals
[GDB_SIGNAL_UNKNOWN
].string
;
73 /* Return the name for a signal. */
75 gdb_signal_to_name (enum gdb_signal sig
)
77 if ((int) sig
>= GDB_SIGNAL_FIRST
&& (int) sig
<= GDB_SIGNAL_LAST
78 && signals
[sig
].name
!= NULL
)
79 return signals
[sig
].name
;
81 /* I think the code which prints this will always print it along
82 with the string, so no need to be verbose (very old comment). */
86 /* Given a name, return its signal. */
88 gdb_signal_from_name (const char *name
)
92 /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
93 for GDB_SIGNAL_SIGCHLD. SIGIOT, on the other hand, is more
94 questionable; seems like by now people should call it SIGABRT
97 /* This ugly cast brought to you by the native VAX compiler. */
98 for (sig
= GDB_SIGNAL_HUP
;
99 sig
< GDB_SIGNAL_LAST
;
100 sig
= (enum gdb_signal
) ((int) sig
+ 1))
101 if (signals
[sig
].name
!= NULL
102 && strcmp (name
, signals
[sig
].name
) == 0)
104 return GDB_SIGNAL_UNKNOWN
;
107 /* The following functions are to help certain targets deal
108 with the signal/waitstatus stuff. They could just as well be in
109 a file called native-utils.c or unixwaitstatus-utils.c or whatever. */
111 /* Convert host signal to our signals. */
113 gdb_signal_from_host (int hostsig
)
115 /* A switch statement would make sense but would require special kludges
116 to deal with the cases where more than one signal has the same number. */
122 if (hostsig
== SIGHUP
)
123 return GDB_SIGNAL_HUP
;
126 if (hostsig
== SIGINT
)
127 return GDB_SIGNAL_INT
;
129 #if defined (SIGQUIT)
130 if (hostsig
== SIGQUIT
)
131 return GDB_SIGNAL_QUIT
;
134 if (hostsig
== SIGILL
)
135 return GDB_SIGNAL_ILL
;
137 #if defined (SIGTRAP)
138 if (hostsig
== SIGTRAP
)
139 return GDB_SIGNAL_TRAP
;
141 #if defined (SIGABRT)
142 if (hostsig
== SIGABRT
)
143 return GDB_SIGNAL_ABRT
;
146 if (hostsig
== SIGEMT
)
147 return GDB_SIGNAL_EMT
;
150 if (hostsig
== SIGFPE
)
151 return GDB_SIGNAL_FPE
;
153 #if defined (SIGKILL)
154 if (hostsig
== SIGKILL
)
155 return GDB_SIGNAL_KILL
;
158 if (hostsig
== SIGBUS
)
159 return GDB_SIGNAL_BUS
;
161 #if defined (SIGSEGV)
162 if (hostsig
== SIGSEGV
)
163 return GDB_SIGNAL_SEGV
;
166 if (hostsig
== SIGSYS
)
167 return GDB_SIGNAL_SYS
;
169 #if defined (SIGPIPE)
170 if (hostsig
== SIGPIPE
)
171 return GDB_SIGNAL_PIPE
;
173 #if defined (SIGALRM)
174 if (hostsig
== SIGALRM
)
175 return GDB_SIGNAL_ALRM
;
177 #if defined (SIGTERM)
178 if (hostsig
== SIGTERM
)
179 return GDB_SIGNAL_TERM
;
181 #if defined (SIGUSR1)
182 if (hostsig
== SIGUSR1
)
183 return GDB_SIGNAL_USR1
;
185 #if defined (SIGUSR2)
186 if (hostsig
== SIGUSR2
)
187 return GDB_SIGNAL_USR2
;
190 if (hostsig
== SIGCLD
)
191 return GDB_SIGNAL_CHLD
;
193 #if defined (SIGCHLD)
194 if (hostsig
== SIGCHLD
)
195 return GDB_SIGNAL_CHLD
;
198 if (hostsig
== SIGPWR
)
199 return GDB_SIGNAL_PWR
;
201 #if defined (SIGWINCH)
202 if (hostsig
== SIGWINCH
)
203 return GDB_SIGNAL_WINCH
;
206 if (hostsig
== SIGURG
)
207 return GDB_SIGNAL_URG
;
210 if (hostsig
== SIGIO
)
211 return GDB_SIGNAL_IO
;
213 #if defined (SIGPOLL)
214 if (hostsig
== SIGPOLL
)
215 return GDB_SIGNAL_POLL
;
217 #if defined (SIGSTOP)
218 if (hostsig
== SIGSTOP
)
219 return GDB_SIGNAL_STOP
;
221 #if defined (SIGTSTP)
222 if (hostsig
== SIGTSTP
)
223 return GDB_SIGNAL_TSTP
;
225 #if defined (SIGCONT)
226 if (hostsig
== SIGCONT
)
227 return GDB_SIGNAL_CONT
;
229 #if defined (SIGTTIN)
230 if (hostsig
== SIGTTIN
)
231 return GDB_SIGNAL_TTIN
;
233 #if defined (SIGTTOU)
234 if (hostsig
== SIGTTOU
)
235 return GDB_SIGNAL_TTOU
;
237 #if defined (SIGVTALRM)
238 if (hostsig
== SIGVTALRM
)
239 return GDB_SIGNAL_VTALRM
;
241 #if defined (SIGPROF)
242 if (hostsig
== SIGPROF
)
243 return GDB_SIGNAL_PROF
;
245 #if defined (SIGXCPU)
246 if (hostsig
== SIGXCPU
)
247 return GDB_SIGNAL_XCPU
;
249 #if defined (SIGXFSZ)
250 if (hostsig
== SIGXFSZ
)
251 return GDB_SIGNAL_XFSZ
;
253 #if defined (SIGWIND)
254 if (hostsig
== SIGWIND
)
255 return GDB_SIGNAL_WIND
;
257 #if defined (SIGPHONE)
258 if (hostsig
== SIGPHONE
)
259 return GDB_SIGNAL_PHONE
;
261 #if defined (SIGLOST)
262 if (hostsig
== SIGLOST
)
263 return GDB_SIGNAL_LOST
;
265 #if defined (SIGWAITING)
266 if (hostsig
== SIGWAITING
)
267 return GDB_SIGNAL_WAITING
;
269 #if defined (SIGCANCEL)
270 if (hostsig
== SIGCANCEL
)
271 return GDB_SIGNAL_CANCEL
;
274 if (hostsig
== SIGLWP
)
275 return GDB_SIGNAL_LWP
;
277 #if defined (SIGDANGER)
278 if (hostsig
== SIGDANGER
)
279 return GDB_SIGNAL_DANGER
;
281 #if defined (SIGGRANT)
282 if (hostsig
== SIGGRANT
)
283 return GDB_SIGNAL_GRANT
;
285 #if defined (SIGRETRACT)
286 if (hostsig
== SIGRETRACT
)
287 return GDB_SIGNAL_RETRACT
;
290 if (hostsig
== SIGMSG
)
291 return GDB_SIGNAL_MSG
;
293 #if defined (SIGSOUND)
294 if (hostsig
== SIGSOUND
)
295 return GDB_SIGNAL_SOUND
;
298 if (hostsig
== SIGSAK
)
299 return GDB_SIGNAL_SAK
;
301 #if defined (SIGPRIO)
302 if (hostsig
== SIGPRIO
)
303 return GDB_SIGNAL_PRIO
;
306 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
307 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
308 if (hostsig
== _NSIG
+ EXC_BAD_ACCESS
)
309 return TARGET_EXC_BAD_ACCESS
;
311 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
312 if (hostsig
== _NSIG
+ EXC_BAD_INSTRUCTION
)
313 return TARGET_EXC_BAD_INSTRUCTION
;
315 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
316 if (hostsig
== _NSIG
+ EXC_ARITHMETIC
)
317 return TARGET_EXC_ARITHMETIC
;
319 #if defined (EXC_EMULATION) && defined (_NSIG)
320 if (hostsig
== _NSIG
+ EXC_EMULATION
)
321 return TARGET_EXC_EMULATION
;
323 #if defined (EXC_SOFTWARE) && defined (_NSIG)
324 if (hostsig
== _NSIG
+ EXC_SOFTWARE
)
325 return TARGET_EXC_SOFTWARE
;
327 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
328 if (hostsig
== _NSIG
+ EXC_BREAKPOINT
)
329 return TARGET_EXC_BREAKPOINT
;
332 #if defined (SIGINFO)
333 if (hostsig
== SIGINFO
)
334 return GDB_SIGNAL_INFO
;
337 #if defined (REALTIME_LO)
338 if (hostsig
>= REALTIME_LO
&& hostsig
< REALTIME_HI
)
340 /* This block of GDB_SIGNAL_REALTIME value is in order. */
341 if (33 <= hostsig
&& hostsig
<= 63)
342 return (enum gdb_signal
)
343 (hostsig
- 33 + (int) GDB_SIGNAL_REALTIME_33
);
344 else if (hostsig
== 32)
345 return GDB_SIGNAL_REALTIME_32
;
346 else if (64 <= hostsig
&& hostsig
<= 127)
347 return (enum gdb_signal
)
348 (hostsig
- 64 + (int) GDB_SIGNAL_REALTIME_64
);
350 error (_("GDB bug: target.c (gdb_signal_from_host): "
351 "unrecognized real-time signal"));
355 return GDB_SIGNAL_UNKNOWN
;
358 /* Convert a OURSIG (an enum gdb_signal) to the form used by the
359 target operating system (refered to as the ``host'') or zero if the
360 equivalent host signal is not available. Set/clear OURSIG_OK
364 do_gdb_signal_to_host (enum gdb_signal oursig
,
368 /* Silence the 'not used' warning, for targets that
369 do not support signals. */
386 #if defined (SIGQUIT)
387 case GDB_SIGNAL_QUIT
:
394 #if defined (SIGTRAP)
395 case GDB_SIGNAL_TRAP
:
398 #if defined (SIGABRT)
399 case GDB_SIGNAL_ABRT
:
410 #if defined (SIGKILL)
411 case GDB_SIGNAL_KILL
:
418 #if defined (SIGSEGV)
419 case GDB_SIGNAL_SEGV
:
426 #if defined (SIGPIPE)
427 case GDB_SIGNAL_PIPE
:
430 #if defined (SIGALRM)
431 case GDB_SIGNAL_ALRM
:
434 #if defined (SIGTERM)
435 case GDB_SIGNAL_TERM
:
438 #if defined (SIGUSR1)
439 case GDB_SIGNAL_USR1
:
442 #if defined (SIGUSR2)
443 case GDB_SIGNAL_USR2
:
446 #if defined (SIGCHLD) || defined (SIGCLD)
447 case GDB_SIGNAL_CHLD
:
448 #if defined (SIGCHLD)
453 #endif /* SIGCLD or SIGCHLD */
458 #if defined (SIGWINCH)
459 case GDB_SIGNAL_WINCH
:
470 #if defined (SIGPOLL)
471 case GDB_SIGNAL_POLL
:
474 #if defined (SIGSTOP)
475 case GDB_SIGNAL_STOP
:
478 #if defined (SIGTSTP)
479 case GDB_SIGNAL_TSTP
:
482 #if defined (SIGCONT)
483 case GDB_SIGNAL_CONT
:
486 #if defined (SIGTTIN)
487 case GDB_SIGNAL_TTIN
:
490 #if defined (SIGTTOU)
491 case GDB_SIGNAL_TTOU
:
494 #if defined (SIGVTALRM)
495 case GDB_SIGNAL_VTALRM
:
498 #if defined (SIGPROF)
499 case GDB_SIGNAL_PROF
:
502 #if defined (SIGXCPU)
503 case GDB_SIGNAL_XCPU
:
506 #if defined (SIGXFSZ)
507 case GDB_SIGNAL_XFSZ
:
510 #if defined (SIGWIND)
511 case GDB_SIGNAL_WIND
:
514 #if defined (SIGPHONE)
515 case GDB_SIGNAL_PHONE
:
518 #if defined (SIGLOST)
519 case GDB_SIGNAL_LOST
:
522 #if defined (SIGWAITING)
523 case GDB_SIGNAL_WAITING
:
526 #if defined (SIGCANCEL)
527 case GDB_SIGNAL_CANCEL
:
534 #if defined (SIGDANGER)
535 case GDB_SIGNAL_DANGER
:
538 #if defined (SIGGRANT)
539 case GDB_SIGNAL_GRANT
:
542 #if defined (SIGRETRACT)
543 case GDB_SIGNAL_RETRACT
:
550 #if defined (SIGSOUND)
551 case GDB_SIGNAL_SOUND
:
558 #if defined (SIGPRIO)
559 case GDB_SIGNAL_PRIO
:
563 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
564 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
565 case TARGET_EXC_BAD_ACCESS
:
566 return _NSIG
+ EXC_BAD_ACCESS
;
568 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
569 case TARGET_EXC_BAD_INSTRUCTION
:
570 return _NSIG
+ EXC_BAD_INSTRUCTION
;
572 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
573 case TARGET_EXC_ARITHMETIC
:
574 return _NSIG
+ EXC_ARITHMETIC
;
576 #if defined (EXC_EMULATION) && defined (_NSIG)
577 case TARGET_EXC_EMULATION
:
578 return _NSIG
+ EXC_EMULATION
;
580 #if defined (EXC_SOFTWARE) && defined (_NSIG)
581 case TARGET_EXC_SOFTWARE
:
582 return _NSIG
+ EXC_SOFTWARE
;
584 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
585 case TARGET_EXC_BREAKPOINT
:
586 return _NSIG
+ EXC_BREAKPOINT
;
589 #if defined (SIGINFO)
590 case GDB_SIGNAL_INFO
:
595 #if defined (REALTIME_LO)
598 if (oursig
>= GDB_SIGNAL_REALTIME_33
599 && oursig
<= GDB_SIGNAL_REALTIME_63
)
601 /* This block of signals is continuous, and
602 GDB_SIGNAL_REALTIME_33 is 33 by definition. */
603 retsig
= (int) oursig
- (int) GDB_SIGNAL_REALTIME_33
+ 33;
605 else if (oursig
== GDB_SIGNAL_REALTIME_32
)
607 /* GDB_SIGNAL_REALTIME_32 isn't contiguous with
608 GDB_SIGNAL_REALTIME_33. It is 32 by definition. */
611 else if (oursig
>= GDB_SIGNAL_REALTIME_64
612 && oursig
<= GDB_SIGNAL_REALTIME_127
)
614 /* This block of signals is continuous, and
615 GDB_SIGNAL_REALTIME_64 is 64 by definition. */
616 retsig
= (int) oursig
- (int) GDB_SIGNAL_REALTIME_64
+ 64;
619 if (retsig
>= REALTIME_LO
&& retsig
< REALTIME_HI
)
629 gdb_signal_to_host_p (enum gdb_signal oursig
)
632 do_gdb_signal_to_host (oursig
, &oursig_ok
);
637 gdb_signal_to_host (enum gdb_signal oursig
)
640 int targ_signo
= do_gdb_signal_to_host (oursig
, &oursig_ok
);
643 /* The user might be trying to do "signal SIGSAK" where this system
644 doesn't have SIGSAK. */
645 warning (_("Signal %s does not exist on this system."),
646 gdb_signal_to_name (oursig
));