signals.cc revision 1.1.1.2 1 /* Target signal translation functions for GDB.
2 Copyright (C) 1990-2023 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
28 struct 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
47 static 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
58 const char *
59 gdb_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. */
67 const char *
68 gdb_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. */
77 const char *
78 gdb_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. */
90 enum gdb_signal
91 gdb_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
110 /* The following functions are to help certain targets deal
112 with the signal/waitstatus stuff. They could just as well be in
113 a file called native-utils.c or unixwaitstatus-utils.c or whatever. */
114
115 /* Convert host signal to our signals. */
116 enum gdb_signal
117 gdb_signal_from_host (int hostsig)
118 {
119 /* A switch statement would make sense but would require special
120 kludges to deal with the cases where more than one signal has the
121 same number. Signals are ordered ANSI-standard signals first,
122 other signals second, with signals in each block ordered by their
123 numerical values on a typical POSIX platform. */
124
125 if (hostsig == 0)
126 return GDB_SIGNAL_0;
127
128 /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
129 are ANSI-standard signals and are always available. */
130 if (hostsig == SIGINT)
131 return GDB_SIGNAL_INT;
132 if (hostsig == SIGILL)
133 return GDB_SIGNAL_ILL;
134 if (hostsig == SIGABRT)
135 return GDB_SIGNAL_ABRT;
136 if (hostsig == SIGFPE)
137 return GDB_SIGNAL_FPE;
138 if (hostsig == SIGSEGV)
139 return GDB_SIGNAL_SEGV;
140 if (hostsig == SIGTERM)
141 return GDB_SIGNAL_TERM;
142
143 /* All other signals need preprocessor conditionals. */
144 #if defined (SIGHUP)
145 if (hostsig == SIGHUP)
146 return GDB_SIGNAL_HUP;
147 #endif
148 #if defined (SIGQUIT)
149 if (hostsig == SIGQUIT)
150 return GDB_SIGNAL_QUIT;
151 #endif
152 #if defined (SIGTRAP)
153 if (hostsig == SIGTRAP)
154 return GDB_SIGNAL_TRAP;
155 #endif
156 #if defined (SIGEMT)
157 if (hostsig == SIGEMT)
158 return GDB_SIGNAL_EMT;
159 #endif
160 #if defined (SIGKILL)
161 if (hostsig == SIGKILL)
162 return GDB_SIGNAL_KILL;
163 #endif
164 #if defined (SIGBUS)
165 if (hostsig == SIGBUS)
166 return GDB_SIGNAL_BUS;
167 #endif
168 #if defined (SIGSYS)
169 if (hostsig == SIGSYS)
170 return GDB_SIGNAL_SYS;
171 #endif
172 #if defined (SIGPIPE)
173 if (hostsig == SIGPIPE)
174 return GDB_SIGNAL_PIPE;
175 #endif
176 #if defined (SIGALRM)
177 if (hostsig == SIGALRM)
178 return GDB_SIGNAL_ALRM;
179 #endif
180 #if defined (SIGUSR1)
181 if (hostsig == SIGUSR1)
182 return GDB_SIGNAL_USR1;
183 #endif
184 #if defined (SIGUSR2)
185 if (hostsig == SIGUSR2)
186 return GDB_SIGNAL_USR2;
187 #endif
188 #if defined (SIGCLD)
189 if (hostsig == SIGCLD)
190 return GDB_SIGNAL_CHLD;
191 #endif
192 #if defined (SIGCHLD)
193 if (hostsig == SIGCHLD)
194 return GDB_SIGNAL_CHLD;
195 #endif
196 #if defined (SIGPWR)
197 if (hostsig == SIGPWR)
198 return GDB_SIGNAL_PWR;
199 #endif
200 #if defined (SIGWINCH)
201 if (hostsig == SIGWINCH)
202 return GDB_SIGNAL_WINCH;
203 #endif
204 #if defined (SIGURG)
205 if (hostsig == SIGURG)
206 return GDB_SIGNAL_URG;
207 #endif
208 #if defined (SIGIO)
209 if (hostsig == SIGIO)
210 return GDB_SIGNAL_IO;
211 #endif
212 #if defined (SIGPOLL)
213 if (hostsig == SIGPOLL)
214 return GDB_SIGNAL_POLL;
215 #endif
216 #if defined (SIGSTOP)
217 if (hostsig == SIGSTOP)
218 return GDB_SIGNAL_STOP;
219 #endif
220 #if defined (SIGTSTP)
221 if (hostsig == SIGTSTP)
222 return GDB_SIGNAL_TSTP;
223 #endif
224 #if defined (SIGCONT)
225 if (hostsig == SIGCONT)
226 return GDB_SIGNAL_CONT;
227 #endif
228 #if defined (SIGTTIN)
229 if (hostsig == SIGTTIN)
230 return GDB_SIGNAL_TTIN;
231 #endif
232 #if defined (SIGTTOU)
233 if (hostsig == SIGTTOU)
234 return GDB_SIGNAL_TTOU;
235 #endif
236 #if defined (SIGVTALRM)
237 if (hostsig == SIGVTALRM)
238 return GDB_SIGNAL_VTALRM;
239 #endif
240 #if defined (SIGPROF)
241 if (hostsig == SIGPROF)
242 return GDB_SIGNAL_PROF;
243 #endif
244 #if defined (SIGXCPU)
245 if (hostsig == SIGXCPU)
246 return GDB_SIGNAL_XCPU;
247 #endif
248 #if defined (SIGXFSZ)
249 if (hostsig == SIGXFSZ)
250 return GDB_SIGNAL_XFSZ;
251 #endif
252 #if defined (SIGWIND)
253 if (hostsig == SIGWIND)
254 return GDB_SIGNAL_WIND;
255 #endif
256 #if defined (SIGPHONE)
257 if (hostsig == SIGPHONE)
258 return GDB_SIGNAL_PHONE;
259 #endif
260 #if defined (SIGLOST)
261 if (hostsig == SIGLOST)
262 return GDB_SIGNAL_LOST;
263 #endif
264 #if defined (SIGWAITING)
265 if (hostsig == SIGWAITING)
266 return GDB_SIGNAL_WAITING;
267 #endif
268 #if defined (SIGCANCEL)
269 if (hostsig == SIGCANCEL)
270 return GDB_SIGNAL_CANCEL;
271 #endif
272 #if defined (SIGLWP)
273 if (hostsig == SIGLWP)
274 return GDB_SIGNAL_LWP;
275 #endif
276 #if defined (SIGDANGER)
277 if (hostsig == SIGDANGER)
278 return GDB_SIGNAL_DANGER;
279 #endif
280 #if defined (SIGGRANT)
281 if (hostsig == SIGGRANT)
282 return GDB_SIGNAL_GRANT;
283 #endif
284 #if defined (SIGRETRACT)
285 if (hostsig == SIGRETRACT)
286 return GDB_SIGNAL_RETRACT;
287 #endif
288 #if defined (SIGMSG)
289 if (hostsig == SIGMSG)
290 return GDB_SIGNAL_MSG;
291 #endif
292 #if defined (SIGSOUND)
293 if (hostsig == SIGSOUND)
294 return GDB_SIGNAL_SOUND;
295 #endif
296 #if defined (SIGSAK)
297 if (hostsig == SIGSAK)
298 return GDB_SIGNAL_SAK;
299 #endif
300 #if defined (SIGPRIO)
301 if (hostsig == SIGPRIO)
302 return GDB_SIGNAL_PRIO;
303 #endif
304
305 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
306 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
307 if (hostsig == _NSIG + EXC_BAD_ACCESS)
308 return GDB_EXC_BAD_ACCESS;
309 #endif
310 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
311 if (hostsig == _NSIG + EXC_BAD_INSTRUCTION)
312 return GDB_EXC_BAD_INSTRUCTION;
313 #endif
314 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
315 if (hostsig == _NSIG + EXC_ARITHMETIC)
316 return GDB_EXC_ARITHMETIC;
317 #endif
318 #if defined (EXC_EMULATION) && defined (_NSIG)
319 if (hostsig == _NSIG + EXC_EMULATION)
320 return GDB_EXC_EMULATION;
321 #endif
322 #if defined (EXC_SOFTWARE) && defined (_NSIG)
323 if (hostsig == _NSIG + EXC_SOFTWARE)
324 return GDB_EXC_SOFTWARE;
325 #endif
326 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
327 if (hostsig == _NSIG + EXC_BREAKPOINT)
328 return GDB_EXC_BREAKPOINT;
329 #endif
330
331 #if defined (SIGINFO)
332 if (hostsig == SIGINFO)
333 return GDB_SIGNAL_INFO;
334 #endif
335 #if defined (SIGLIBRT)
336 if (hostsig == SIGLIBRT)
337 return GDB_SIGNAL_LIBRT;
338 #endif
339
340 #if defined (REALTIME_LO)
341 if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
342 {
343 /* This block of GDB_SIGNAL_REALTIME value is in order. */
344 if (33 <= hostsig && hostsig <= 63)
345 return (enum gdb_signal)
346 (hostsig - 33 + (int) GDB_SIGNAL_REALTIME_33);
347 else if (hostsig == 32)
348 return GDB_SIGNAL_REALTIME_32;
349 else if (64 <= hostsig && hostsig <= 127)
350 return (enum gdb_signal)
351 (hostsig - 64 + (int) GDB_SIGNAL_REALTIME_64);
352 else
353 error (_("GDB bug: target.c (gdb_signal_from_host): "
354 "unrecognized real-time signal"));
355 }
356 #endif
357
358 return GDB_SIGNAL_UNKNOWN;
359 }
360
361 /* Convert a OURSIG (an enum gdb_signal) to the form used by the
362 target operating system (refered to as the ``host'') or zero if the
363 equivalent host signal is not available. Set/clear OURSIG_OK
364 accordingly. */
365
366 static int
367 do_gdb_signal_to_host (enum gdb_signal oursig,
368 int *oursig_ok)
369 {
370 int retsig;
371 /* Silence the 'not used' warning, for targets that
372 do not support signals. */
373 (void) retsig;
374
375 /* Signals are ordered ANSI-standard signals first, other signals
376 second, with signals in each block ordered by their numerical
377 values on a typical POSIX platform. */
378
379 *oursig_ok = 1;
380 switch (oursig)
381 {
382 case GDB_SIGNAL_0:
383 return 0;
384
385 /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
386 are ANSI-standard signals and are always available. */
387 case GDB_SIGNAL_INT:
388 return SIGINT;
389 case GDB_SIGNAL_ILL:
390 return SIGILL;
391 case GDB_SIGNAL_ABRT:
392 return SIGABRT;
393 case GDB_SIGNAL_FPE:
394 return SIGFPE;
395 case GDB_SIGNAL_SEGV:
396 return SIGSEGV;
397 case GDB_SIGNAL_TERM:
398 return SIGTERM;
399
400 /* All other signals need preprocessor conditionals. */
401 #if defined (SIGHUP)
402 case GDB_SIGNAL_HUP:
403 return SIGHUP;
404 #endif
405 #if defined (SIGQUIT)
406 case GDB_SIGNAL_QUIT:
407 return SIGQUIT;
408 #endif
409 #if defined (SIGTRAP)
410 case GDB_SIGNAL_TRAP:
411 return SIGTRAP;
412 #endif
413 #if defined (SIGEMT)
414 case GDB_SIGNAL_EMT:
415 return SIGEMT;
416 #endif
417 #if defined (SIGKILL)
418 case GDB_SIGNAL_KILL:
419 return SIGKILL;
420 #endif
421 #if defined (SIGBUS)
422 case GDB_SIGNAL_BUS:
423 return SIGBUS;
424 #endif
425 #if defined (SIGSYS)
426 case GDB_SIGNAL_SYS:
427 return SIGSYS;
428 #endif
429 #if defined (SIGPIPE)
430 case GDB_SIGNAL_PIPE:
431 return SIGPIPE;
432 #endif
433 #if defined (SIGALRM)
434 case GDB_SIGNAL_ALRM:
435 return SIGALRM;
436 #endif
437 #if defined (SIGUSR1)
438 case GDB_SIGNAL_USR1:
439 return SIGUSR1;
440 #endif
441 #if defined (SIGUSR2)
442 case GDB_SIGNAL_USR2:
443 return SIGUSR2;
444 #endif
445 #if defined (SIGCHLD) || defined (SIGCLD)
446 case GDB_SIGNAL_CHLD:
447 #if defined (SIGCHLD)
448 return SIGCHLD;
449 #else
450 return SIGCLD;
451 #endif
452 #endif /* SIGCLD or SIGCHLD */
453 #if defined (SIGPWR)
454 case GDB_SIGNAL_PWR:
455 return SIGPWR;
456 #endif
457 #if defined (SIGWINCH)
458 case GDB_SIGNAL_WINCH:
459 return SIGWINCH;
460 #endif
461 #if defined (SIGURG)
462 case GDB_SIGNAL_URG:
463 return SIGURG;
464 #endif
465 #if defined (SIGIO)
466 case GDB_SIGNAL_IO:
467 return SIGIO;
468 #endif
469 #if defined (SIGPOLL)
470 case GDB_SIGNAL_POLL:
471 return SIGPOLL;
472 #endif
473 #if defined (SIGSTOP)
474 case GDB_SIGNAL_STOP:
475 return SIGSTOP;
476 #endif
477 #if defined (SIGTSTP)
478 case GDB_SIGNAL_TSTP:
479 return SIGTSTP;
480 #endif
481 #if defined (SIGCONT)
482 case GDB_SIGNAL_CONT:
483 return SIGCONT;
484 #endif
485 #if defined (SIGTTIN)
486 case GDB_SIGNAL_TTIN:
487 return SIGTTIN;
488 #endif
489 #if defined (SIGTTOU)
490 case GDB_SIGNAL_TTOU:
491 return SIGTTOU;
492 #endif
493 #if defined (SIGVTALRM)
494 case GDB_SIGNAL_VTALRM:
495 return SIGVTALRM;
496 #endif
497 #if defined (SIGPROF)
498 case GDB_SIGNAL_PROF:
499 return SIGPROF;
500 #endif
501 #if defined (SIGXCPU)
502 case GDB_SIGNAL_XCPU:
503 return SIGXCPU;
504 #endif
505 #if defined (SIGXFSZ)
506 case GDB_SIGNAL_XFSZ:
507 return SIGXFSZ;
508 #endif
509 #if defined (SIGWIND)
510 case GDB_SIGNAL_WIND:
511 return SIGWIND;
512 #endif
513 #if defined (SIGPHONE)
514 case GDB_SIGNAL_PHONE:
515 return SIGPHONE;
516 #endif
517 #if defined (SIGLOST)
518 case GDB_SIGNAL_LOST:
519 return SIGLOST;
520 #endif
521 #if defined (SIGWAITING)
522 case GDB_SIGNAL_WAITING:
523 return SIGWAITING;
524 #endif
525 #if defined (SIGCANCEL)
526 case GDB_SIGNAL_CANCEL:
527 return SIGCANCEL;
528 #endif
529 #if defined (SIGLWP)
530 case GDB_SIGNAL_LWP:
531 return SIGLWP;
532 #endif
533 #if defined (SIGDANGER)
534 case GDB_SIGNAL_DANGER:
535 return SIGDANGER;
536 #endif
537 #if defined (SIGGRANT)
538 case GDB_SIGNAL_GRANT:
539 return SIGGRANT;
540 #endif
541 #if defined (SIGRETRACT)
542 case GDB_SIGNAL_RETRACT:
543 return SIGRETRACT;
544 #endif
545 #if defined (SIGMSG)
546 case GDB_SIGNAL_MSG:
547 return SIGMSG;
548 #endif
549 #if defined (SIGSOUND)
550 case GDB_SIGNAL_SOUND:
551 return SIGSOUND;
552 #endif
553 #if defined (SIGSAK)
554 case GDB_SIGNAL_SAK:
555 return SIGSAK;
556 #endif
557 #if defined (SIGPRIO)
558 case GDB_SIGNAL_PRIO:
559 return SIGPRIO;
560 #endif
561
562 /* Mach exceptions. Assumes that the values for EXC_ are positive! */
563 #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
564 case GDB_EXC_BAD_ACCESS:
565 return _NSIG + EXC_BAD_ACCESS;
566 #endif
567 #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
568 case GDB_EXC_BAD_INSTRUCTION:
569 return _NSIG + EXC_BAD_INSTRUCTION;
570 #endif
571 #if defined (EXC_ARITHMETIC) && defined (_NSIG)
572 case GDB_EXC_ARITHMETIC:
573 return _NSIG + EXC_ARITHMETIC;
574 #endif
575 #if defined (EXC_EMULATION) && defined (_NSIG)
576 case GDB_EXC_EMULATION:
577 return _NSIG + EXC_EMULATION;
578 #endif
579 #if defined (EXC_SOFTWARE) && defined (_NSIG)
580 case GDB_EXC_SOFTWARE:
581 return _NSIG + EXC_SOFTWARE;
582 #endif
583 #if defined (EXC_BREAKPOINT) && defined (_NSIG)
584 case GDB_EXC_BREAKPOINT:
585 return _NSIG + EXC_BREAKPOINT;
586 #endif
587
588 #if defined (SIGINFO)
589 case GDB_SIGNAL_INFO:
590 return SIGINFO;
591 #endif
592 #if defined (SIGLIBRT)
593 case GDB_SIGNAL_LIBRT:
594 return SIGLIBRT;
595 #endif
596
597 default:
598 #if defined (REALTIME_LO)
599 retsig = 0;
600
601 if (oursig >= GDB_SIGNAL_REALTIME_33
602 && oursig <= GDB_SIGNAL_REALTIME_63)
603 {
604 /* This block of signals is continuous, and
605 GDB_SIGNAL_REALTIME_33 is 33 by definition. */
606 retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_33 + 33;
607 }
608 else if (oursig == GDB_SIGNAL_REALTIME_32)
609 {
610 /* GDB_SIGNAL_REALTIME_32 isn't contiguous with
611 GDB_SIGNAL_REALTIME_33. It is 32 by definition. */
612 retsig = 32;
613 }
614 else if (oursig >= GDB_SIGNAL_REALTIME_64
615 && oursig <= GDB_SIGNAL_REALTIME_127)
616 {
617 /* This block of signals is continuous, and
618 GDB_SIGNAL_REALTIME_64 is 64 by definition. */
619 retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_64 + 64;
620 }
621
622 if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
623 return retsig;
624 #endif
625
626 *oursig_ok = 0;
627 return 0;
628 }
629 }
630
631 int
632 gdb_signal_to_host_p (enum gdb_signal oursig)
633 {
634 int oursig_ok;
635 do_gdb_signal_to_host (oursig, &oursig_ok);
636 return oursig_ok;
637 }
638
639 int
640 gdb_signal_to_host (enum gdb_signal oursig)
641 {
642 int oursig_ok;
643 int targ_signo = do_gdb_signal_to_host (oursig, &oursig_ok);
644 if (!oursig_ok)
645 {
646 /* The user might be trying to do "signal SIGSAK" where this system
647 doesn't have SIGSAK. */
648 warning (_("Signal %s does not exist on this system."),
649 gdb_signal_to_name (oursig));
650 return 0;
651 }
652 else
653 return targ_signo;
654 }
655