18dffb485Schristos /* Target signal translation functions for GDB. 2*5ba1f45fSchristos Copyright (C) 1990-2024 Free Software Foundation, Inc. 38dffb485Schristos Contributed by Cygnus Support. 48dffb485Schristos 58dffb485Schristos This file is part of GDB. 68dffb485Schristos 78dffb485Schristos This program is free software; you can redistribute it and/or modify 88dffb485Schristos it under the terms of the GNU General Public License as published by 98dffb485Schristos the Free Software Foundation; either version 3 of the License, or 108dffb485Schristos (at your option) any later version. 118dffb485Schristos 128dffb485Schristos This program is distributed in the hope that it will be useful, 138dffb485Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of 148dffb485Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 158dffb485Schristos GNU General Public License for more details. 168dffb485Schristos 178dffb485Schristos You should have received a copy of the GNU General Public License 188dffb485Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */ 198dffb485Schristos 208dffb485Schristos 218dffb485Schristos #ifdef HAVE_SIGNAL_H 228dffb485Schristos #include <signal.h> 238dffb485Schristos #endif 248dffb485Schristos 258dffb485Schristos #include "gdb_signals.h" 268dffb485Schristos 278dffb485Schristos struct gdbarch; 288dffb485Schristos 298dffb485Schristos /* Always use __SIGRTMIN if it's available. SIGRTMIN is the lowest 308dffb485Schristos _available_ realtime signal, not the lowest supported; glibc takes 318dffb485Schristos several for its own use. */ 328dffb485Schristos 338dffb485Schristos #ifndef REALTIME_LO 348dffb485Schristos # if defined(__SIGRTMIN) 358dffb485Schristos # define REALTIME_LO __SIGRTMIN 368dffb485Schristos # define REALTIME_HI (__SIGRTMAX + 1) 378dffb485Schristos # elif defined(SIGRTMIN) 388dffb485Schristos # define REALTIME_LO SIGRTMIN 398dffb485Schristos # define REALTIME_HI (SIGRTMAX + 1) 408dffb485Schristos # endif 418dffb485Schristos #endif 428dffb485Schristos 438dffb485Schristos /* This table must match in order and size the signals in enum 448dffb485Schristos gdb_signal. */ 458dffb485Schristos 468dffb485Schristos static const struct { 478dffb485Schristos const char *symbol; 488dffb485Schristos const char *name; 498dffb485Schristos const char *string; 508dffb485Schristos } signals [] = 518dffb485Schristos { 528dffb485Schristos #define SET(symbol, constant, name, string) { #symbol, name, string }, 538dffb485Schristos #include "gdb/signals.def" 548dffb485Schristos #undef SET 558dffb485Schristos }; 568dffb485Schristos 578dffb485Schristos const char * 588dffb485Schristos gdb_signal_to_symbol_string (enum gdb_signal sig) 598dffb485Schristos { 608dffb485Schristos gdb_assert ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST); 618dffb485Schristos 628dffb485Schristos return signals[sig].symbol; 638dffb485Schristos } 648dffb485Schristos 658dffb485Schristos /* Return the string for a signal. */ 668dffb485Schristos const char * 678dffb485Schristos gdb_signal_to_string (enum gdb_signal sig) 688dffb485Schristos { 698dffb485Schristos if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST) 708dffb485Schristos return signals[sig].string; 718dffb485Schristos else 728dffb485Schristos return signals[GDB_SIGNAL_UNKNOWN].string; 738dffb485Schristos } 748dffb485Schristos 758dffb485Schristos /* Return the name for a signal. */ 768dffb485Schristos const char * 778dffb485Schristos gdb_signal_to_name (enum gdb_signal sig) 788dffb485Schristos { 798dffb485Schristos if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST 808dffb485Schristos && signals[sig].name != NULL) 818dffb485Schristos return signals[sig].name; 828dffb485Schristos else 838dffb485Schristos /* I think the code which prints this will always print it along 848dffb485Schristos with the string, so no need to be verbose (very old comment). */ 858dffb485Schristos return "?"; 868dffb485Schristos } 878dffb485Schristos 888dffb485Schristos /* Given a name, return its signal. */ 898dffb485Schristos enum gdb_signal 908dffb485Schristos gdb_signal_from_name (const char *name) 918dffb485Schristos { 928dffb485Schristos enum gdb_signal sig; 938dffb485Schristos 948dffb485Schristos /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD" 958dffb485Schristos for GDB_SIGNAL_SIGCHLD. SIGIOT, on the other hand, is more 968dffb485Schristos questionable; seems like by now people should call it SIGABRT 978dffb485Schristos instead. */ 988dffb485Schristos 998dffb485Schristos /* This ugly cast brought to you by the native VAX compiler. */ 1008dffb485Schristos for (sig = GDB_SIGNAL_HUP; 1018dffb485Schristos sig < GDB_SIGNAL_LAST; 1028dffb485Schristos sig = (enum gdb_signal) ((int) sig + 1)) 1038dffb485Schristos if (signals[sig].name != NULL 1048dffb485Schristos && strcmp (name, signals[sig].name) == 0) 1058dffb485Schristos return sig; 1068dffb485Schristos return GDB_SIGNAL_UNKNOWN; 1078dffb485Schristos } 1088dffb485Schristos 1098dffb485Schristos /* The following functions are to help certain targets deal 1108dffb485Schristos with the signal/waitstatus stuff. They could just as well be in 1118dffb485Schristos a file called native-utils.c or unixwaitstatus-utils.c or whatever. */ 1128dffb485Schristos 1138dffb485Schristos /* Convert host signal to our signals. */ 1148dffb485Schristos enum gdb_signal 1158dffb485Schristos gdb_signal_from_host (int hostsig) 1168dffb485Schristos { 1178dffb485Schristos /* A switch statement would make sense but would require special 1188dffb485Schristos kludges to deal with the cases where more than one signal has the 1198dffb485Schristos same number. Signals are ordered ANSI-standard signals first, 1208dffb485Schristos other signals second, with signals in each block ordered by their 1218dffb485Schristos numerical values on a typical POSIX platform. */ 1228dffb485Schristos 1238dffb485Schristos if (hostsig == 0) 1248dffb485Schristos return GDB_SIGNAL_0; 1258dffb485Schristos 1268dffb485Schristos /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM 1278dffb485Schristos are ANSI-standard signals and are always available. */ 1288dffb485Schristos if (hostsig == SIGINT) 1298dffb485Schristos return GDB_SIGNAL_INT; 1308dffb485Schristos if (hostsig == SIGILL) 1318dffb485Schristos return GDB_SIGNAL_ILL; 1328dffb485Schristos if (hostsig == SIGABRT) 1338dffb485Schristos return GDB_SIGNAL_ABRT; 1348dffb485Schristos if (hostsig == SIGFPE) 1358dffb485Schristos return GDB_SIGNAL_FPE; 1368dffb485Schristos if (hostsig == SIGSEGV) 1378dffb485Schristos return GDB_SIGNAL_SEGV; 1388dffb485Schristos if (hostsig == SIGTERM) 1398dffb485Schristos return GDB_SIGNAL_TERM; 1408dffb485Schristos 1418dffb485Schristos /* All other signals need preprocessor conditionals. */ 1428dffb485Schristos #if defined (SIGHUP) 1438dffb485Schristos if (hostsig == SIGHUP) 1448dffb485Schristos return GDB_SIGNAL_HUP; 1458dffb485Schristos #endif 1468dffb485Schristos #if defined (SIGQUIT) 1478dffb485Schristos if (hostsig == SIGQUIT) 1488dffb485Schristos return GDB_SIGNAL_QUIT; 1498dffb485Schristos #endif 1508dffb485Schristos #if defined (SIGTRAP) 1518dffb485Schristos if (hostsig == SIGTRAP) 1528dffb485Schristos return GDB_SIGNAL_TRAP; 1538dffb485Schristos #endif 1548dffb485Schristos #if defined (SIGEMT) 1558dffb485Schristos if (hostsig == SIGEMT) 1568dffb485Schristos return GDB_SIGNAL_EMT; 1578dffb485Schristos #endif 1588dffb485Schristos #if defined (SIGKILL) 1598dffb485Schristos if (hostsig == SIGKILL) 1608dffb485Schristos return GDB_SIGNAL_KILL; 1618dffb485Schristos #endif 1628dffb485Schristos #if defined (SIGBUS) 1638dffb485Schristos if (hostsig == SIGBUS) 1648dffb485Schristos return GDB_SIGNAL_BUS; 1658dffb485Schristos #endif 1668dffb485Schristos #if defined (SIGSYS) 1678dffb485Schristos if (hostsig == SIGSYS) 1688dffb485Schristos return GDB_SIGNAL_SYS; 1698dffb485Schristos #endif 1708dffb485Schristos #if defined (SIGPIPE) 1718dffb485Schristos if (hostsig == SIGPIPE) 1728dffb485Schristos return GDB_SIGNAL_PIPE; 1738dffb485Schristos #endif 1748dffb485Schristos #if defined (SIGALRM) 1758dffb485Schristos if (hostsig == SIGALRM) 1768dffb485Schristos return GDB_SIGNAL_ALRM; 1778dffb485Schristos #endif 1788dffb485Schristos #if defined (SIGUSR1) 1798dffb485Schristos if (hostsig == SIGUSR1) 1808dffb485Schristos return GDB_SIGNAL_USR1; 1818dffb485Schristos #endif 1828dffb485Schristos #if defined (SIGUSR2) 1838dffb485Schristos if (hostsig == SIGUSR2) 1848dffb485Schristos return GDB_SIGNAL_USR2; 1858dffb485Schristos #endif 1868dffb485Schristos #if defined (SIGCLD) 1878dffb485Schristos if (hostsig == SIGCLD) 1888dffb485Schristos return GDB_SIGNAL_CHLD; 1898dffb485Schristos #endif 1908dffb485Schristos #if defined (SIGCHLD) 1918dffb485Schristos if (hostsig == SIGCHLD) 1928dffb485Schristos return GDB_SIGNAL_CHLD; 1938dffb485Schristos #endif 1948dffb485Schristos #if defined (SIGPWR) 1958dffb485Schristos if (hostsig == SIGPWR) 1968dffb485Schristos return GDB_SIGNAL_PWR; 1978dffb485Schristos #endif 1988dffb485Schristos #if defined (SIGWINCH) 1998dffb485Schristos if (hostsig == SIGWINCH) 2008dffb485Schristos return GDB_SIGNAL_WINCH; 2018dffb485Schristos #endif 2028dffb485Schristos #if defined (SIGURG) 2038dffb485Schristos if (hostsig == SIGURG) 2048dffb485Schristos return GDB_SIGNAL_URG; 2058dffb485Schristos #endif 2068dffb485Schristos #if defined (SIGIO) 2078dffb485Schristos if (hostsig == SIGIO) 2088dffb485Schristos return GDB_SIGNAL_IO; 2098dffb485Schristos #endif 2108dffb485Schristos #if defined (SIGPOLL) 2118dffb485Schristos if (hostsig == SIGPOLL) 2128dffb485Schristos return GDB_SIGNAL_POLL; 2138dffb485Schristos #endif 2148dffb485Schristos #if defined (SIGSTOP) 2158dffb485Schristos if (hostsig == SIGSTOP) 2168dffb485Schristos return GDB_SIGNAL_STOP; 2178dffb485Schristos #endif 2188dffb485Schristos #if defined (SIGTSTP) 2198dffb485Schristos if (hostsig == SIGTSTP) 2208dffb485Schristos return GDB_SIGNAL_TSTP; 2218dffb485Schristos #endif 2228dffb485Schristos #if defined (SIGCONT) 2238dffb485Schristos if (hostsig == SIGCONT) 2248dffb485Schristos return GDB_SIGNAL_CONT; 2258dffb485Schristos #endif 2268dffb485Schristos #if defined (SIGTTIN) 2278dffb485Schristos if (hostsig == SIGTTIN) 2288dffb485Schristos return GDB_SIGNAL_TTIN; 2298dffb485Schristos #endif 2308dffb485Schristos #if defined (SIGTTOU) 2318dffb485Schristos if (hostsig == SIGTTOU) 2328dffb485Schristos return GDB_SIGNAL_TTOU; 2338dffb485Schristos #endif 2348dffb485Schristos #if defined (SIGVTALRM) 2358dffb485Schristos if (hostsig == SIGVTALRM) 2368dffb485Schristos return GDB_SIGNAL_VTALRM; 2378dffb485Schristos #endif 2388dffb485Schristos #if defined (SIGPROF) 2398dffb485Schristos if (hostsig == SIGPROF) 2408dffb485Schristos return GDB_SIGNAL_PROF; 2418dffb485Schristos #endif 2428dffb485Schristos #if defined (SIGXCPU) 2438dffb485Schristos if (hostsig == SIGXCPU) 2448dffb485Schristos return GDB_SIGNAL_XCPU; 2458dffb485Schristos #endif 2468dffb485Schristos #if defined (SIGXFSZ) 2478dffb485Schristos if (hostsig == SIGXFSZ) 2488dffb485Schristos return GDB_SIGNAL_XFSZ; 2498dffb485Schristos #endif 2508dffb485Schristos #if defined (SIGWIND) 2518dffb485Schristos if (hostsig == SIGWIND) 2528dffb485Schristos return GDB_SIGNAL_WIND; 2538dffb485Schristos #endif 2548dffb485Schristos #if defined (SIGPHONE) 2558dffb485Schristos if (hostsig == SIGPHONE) 2568dffb485Schristos return GDB_SIGNAL_PHONE; 2578dffb485Schristos #endif 2588dffb485Schristos #if defined (SIGLOST) 2598dffb485Schristos if (hostsig == SIGLOST) 2608dffb485Schristos return GDB_SIGNAL_LOST; 2618dffb485Schristos #endif 2628dffb485Schristos #if defined (SIGWAITING) 2638dffb485Schristos if (hostsig == SIGWAITING) 2648dffb485Schristos return GDB_SIGNAL_WAITING; 2658dffb485Schristos #endif 2668dffb485Schristos #if defined (SIGCANCEL) 2678dffb485Schristos if (hostsig == SIGCANCEL) 2688dffb485Schristos return GDB_SIGNAL_CANCEL; 2698dffb485Schristos #endif 2708dffb485Schristos #if defined (SIGLWP) 2718dffb485Schristos if (hostsig == SIGLWP) 2728dffb485Schristos return GDB_SIGNAL_LWP; 2738dffb485Schristos #endif 2748dffb485Schristos #if defined (SIGDANGER) 2758dffb485Schristos if (hostsig == SIGDANGER) 2768dffb485Schristos return GDB_SIGNAL_DANGER; 2778dffb485Schristos #endif 2788dffb485Schristos #if defined (SIGGRANT) 2798dffb485Schristos if (hostsig == SIGGRANT) 2808dffb485Schristos return GDB_SIGNAL_GRANT; 2818dffb485Schristos #endif 2828dffb485Schristos #if defined (SIGRETRACT) 2838dffb485Schristos if (hostsig == SIGRETRACT) 2848dffb485Schristos return GDB_SIGNAL_RETRACT; 2858dffb485Schristos #endif 2868dffb485Schristos #if defined (SIGMSG) 2878dffb485Schristos if (hostsig == SIGMSG) 2888dffb485Schristos return GDB_SIGNAL_MSG; 2898dffb485Schristos #endif 2908dffb485Schristos #if defined (SIGSOUND) 2918dffb485Schristos if (hostsig == SIGSOUND) 2928dffb485Schristos return GDB_SIGNAL_SOUND; 2938dffb485Schristos #endif 2948dffb485Schristos #if defined (SIGSAK) 2958dffb485Schristos if (hostsig == SIGSAK) 2968dffb485Schristos return GDB_SIGNAL_SAK; 2978dffb485Schristos #endif 2988dffb485Schristos #if defined (SIGPRIO) 2998dffb485Schristos if (hostsig == SIGPRIO) 3008dffb485Schristos return GDB_SIGNAL_PRIO; 3018dffb485Schristos #endif 3028dffb485Schristos 3038dffb485Schristos /* Mach exceptions. Assumes that the values for EXC_ are positive! */ 3048dffb485Schristos #if defined (EXC_BAD_ACCESS) && defined (_NSIG) 3058dffb485Schristos if (hostsig == _NSIG + EXC_BAD_ACCESS) 3068dffb485Schristos return GDB_EXC_BAD_ACCESS; 3078dffb485Schristos #endif 3088dffb485Schristos #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG) 3098dffb485Schristos if (hostsig == _NSIG + EXC_BAD_INSTRUCTION) 3108dffb485Schristos return GDB_EXC_BAD_INSTRUCTION; 3118dffb485Schristos #endif 3128dffb485Schristos #if defined (EXC_ARITHMETIC) && defined (_NSIG) 3138dffb485Schristos if (hostsig == _NSIG + EXC_ARITHMETIC) 3148dffb485Schristos return GDB_EXC_ARITHMETIC; 3158dffb485Schristos #endif 3168dffb485Schristos #if defined (EXC_EMULATION) && defined (_NSIG) 3178dffb485Schristos if (hostsig == _NSIG + EXC_EMULATION) 3188dffb485Schristos return GDB_EXC_EMULATION; 3198dffb485Schristos #endif 3208dffb485Schristos #if defined (EXC_SOFTWARE) && defined (_NSIG) 3218dffb485Schristos if (hostsig == _NSIG + EXC_SOFTWARE) 3228dffb485Schristos return GDB_EXC_SOFTWARE; 3238dffb485Schristos #endif 3248dffb485Schristos #if defined (EXC_BREAKPOINT) && defined (_NSIG) 3258dffb485Schristos if (hostsig == _NSIG + EXC_BREAKPOINT) 3268dffb485Schristos return GDB_EXC_BREAKPOINT; 3278dffb485Schristos #endif 3288dffb485Schristos 3298dffb485Schristos #if defined (SIGINFO) 3308dffb485Schristos if (hostsig == SIGINFO) 3318dffb485Schristos return GDB_SIGNAL_INFO; 3328dffb485Schristos #endif 3338dffb485Schristos #if defined (SIGLIBRT) 3348dffb485Schristos if (hostsig == SIGLIBRT) 3358dffb485Schristos return GDB_SIGNAL_LIBRT; 3368dffb485Schristos #endif 3378dffb485Schristos 3388dffb485Schristos #if defined (REALTIME_LO) 3398dffb485Schristos if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI) 3408dffb485Schristos { 3418dffb485Schristos /* This block of GDB_SIGNAL_REALTIME value is in order. */ 3428dffb485Schristos if (33 <= hostsig && hostsig <= 63) 3438dffb485Schristos return (enum gdb_signal) 3448dffb485Schristos (hostsig - 33 + (int) GDB_SIGNAL_REALTIME_33); 3458dffb485Schristos else if (hostsig == 32) 3468dffb485Schristos return GDB_SIGNAL_REALTIME_32; 3478dffb485Schristos else if (64 <= hostsig && hostsig <= 127) 3488dffb485Schristos return (enum gdb_signal) 3498dffb485Schristos (hostsig - 64 + (int) GDB_SIGNAL_REALTIME_64); 3508dffb485Schristos else 3518dffb485Schristos error (_("GDB bug: target.c (gdb_signal_from_host): " 3528dffb485Schristos "unrecognized real-time signal")); 3538dffb485Schristos } 3548dffb485Schristos #endif 3558dffb485Schristos 3568dffb485Schristos return GDB_SIGNAL_UNKNOWN; 3578dffb485Schristos } 3588dffb485Schristos 3598dffb485Schristos /* Convert a OURSIG (an enum gdb_signal) to the form used by the 360*5ba1f45fSchristos target operating system (referred to as the ``host'') or zero if the 3618dffb485Schristos equivalent host signal is not available. Set/clear OURSIG_OK 3628dffb485Schristos accordingly. */ 3638dffb485Schristos 3648dffb485Schristos static int 3658dffb485Schristos do_gdb_signal_to_host (enum gdb_signal oursig, 3668dffb485Schristos int *oursig_ok) 3678dffb485Schristos { 3688dffb485Schristos int retsig; 3698dffb485Schristos /* Silence the 'not used' warning, for targets that 3708dffb485Schristos do not support signals. */ 3718dffb485Schristos (void) retsig; 3728dffb485Schristos 3738dffb485Schristos /* Signals are ordered ANSI-standard signals first, other signals 3748dffb485Schristos second, with signals in each block ordered by their numerical 3758dffb485Schristos values on a typical POSIX platform. */ 3768dffb485Schristos 3778dffb485Schristos *oursig_ok = 1; 3788dffb485Schristos switch (oursig) 3798dffb485Schristos { 3808dffb485Schristos case GDB_SIGNAL_0: 3818dffb485Schristos return 0; 3828dffb485Schristos 3838dffb485Schristos /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM 3848dffb485Schristos are ANSI-standard signals and are always available. */ 3858dffb485Schristos case GDB_SIGNAL_INT: 3868dffb485Schristos return SIGINT; 3878dffb485Schristos case GDB_SIGNAL_ILL: 3888dffb485Schristos return SIGILL; 3898dffb485Schristos case GDB_SIGNAL_ABRT: 3908dffb485Schristos return SIGABRT; 3918dffb485Schristos case GDB_SIGNAL_FPE: 3928dffb485Schristos return SIGFPE; 3938dffb485Schristos case GDB_SIGNAL_SEGV: 3948dffb485Schristos return SIGSEGV; 3958dffb485Schristos case GDB_SIGNAL_TERM: 3968dffb485Schristos return SIGTERM; 3978dffb485Schristos 3988dffb485Schristos /* All other signals need preprocessor conditionals. */ 3998dffb485Schristos #if defined (SIGHUP) 4008dffb485Schristos case GDB_SIGNAL_HUP: 4018dffb485Schristos return SIGHUP; 4028dffb485Schristos #endif 4038dffb485Schristos #if defined (SIGQUIT) 4048dffb485Schristos case GDB_SIGNAL_QUIT: 4058dffb485Schristos return SIGQUIT; 4068dffb485Schristos #endif 4078dffb485Schristos #if defined (SIGTRAP) 4088dffb485Schristos case GDB_SIGNAL_TRAP: 4098dffb485Schristos return SIGTRAP; 4108dffb485Schristos #endif 4118dffb485Schristos #if defined (SIGEMT) 4128dffb485Schristos case GDB_SIGNAL_EMT: 4138dffb485Schristos return SIGEMT; 4148dffb485Schristos #endif 4158dffb485Schristos #if defined (SIGKILL) 4168dffb485Schristos case GDB_SIGNAL_KILL: 4178dffb485Schristos return SIGKILL; 4188dffb485Schristos #endif 4198dffb485Schristos #if defined (SIGBUS) 4208dffb485Schristos case GDB_SIGNAL_BUS: 4218dffb485Schristos return SIGBUS; 4228dffb485Schristos #endif 4238dffb485Schristos #if defined (SIGSYS) 4248dffb485Schristos case GDB_SIGNAL_SYS: 4258dffb485Schristos return SIGSYS; 4268dffb485Schristos #endif 4278dffb485Schristos #if defined (SIGPIPE) 4288dffb485Schristos case GDB_SIGNAL_PIPE: 4298dffb485Schristos return SIGPIPE; 4308dffb485Schristos #endif 4318dffb485Schristos #if defined (SIGALRM) 4328dffb485Schristos case GDB_SIGNAL_ALRM: 4338dffb485Schristos return SIGALRM; 4348dffb485Schristos #endif 4358dffb485Schristos #if defined (SIGUSR1) 4368dffb485Schristos case GDB_SIGNAL_USR1: 4378dffb485Schristos return SIGUSR1; 4388dffb485Schristos #endif 4398dffb485Schristos #if defined (SIGUSR2) 4408dffb485Schristos case GDB_SIGNAL_USR2: 4418dffb485Schristos return SIGUSR2; 4428dffb485Schristos #endif 4438dffb485Schristos #if defined (SIGCHLD) || defined (SIGCLD) 4448dffb485Schristos case GDB_SIGNAL_CHLD: 4458dffb485Schristos #if defined (SIGCHLD) 4468dffb485Schristos return SIGCHLD; 4478dffb485Schristos #else 4488dffb485Schristos return SIGCLD; 4498dffb485Schristos #endif 4508dffb485Schristos #endif /* SIGCLD or SIGCHLD */ 4518dffb485Schristos #if defined (SIGPWR) 4528dffb485Schristos case GDB_SIGNAL_PWR: 4538dffb485Schristos return SIGPWR; 4548dffb485Schristos #endif 4558dffb485Schristos #if defined (SIGWINCH) 4568dffb485Schristos case GDB_SIGNAL_WINCH: 4578dffb485Schristos return SIGWINCH; 4588dffb485Schristos #endif 4598dffb485Schristos #if defined (SIGURG) 4608dffb485Schristos case GDB_SIGNAL_URG: 4618dffb485Schristos return SIGURG; 4628dffb485Schristos #endif 4638dffb485Schristos #if defined (SIGIO) 4648dffb485Schristos case GDB_SIGNAL_IO: 4658dffb485Schristos return SIGIO; 4668dffb485Schristos #endif 4678dffb485Schristos #if defined (SIGPOLL) 4688dffb485Schristos case GDB_SIGNAL_POLL: 4698dffb485Schristos return SIGPOLL; 4708dffb485Schristos #endif 4718dffb485Schristos #if defined (SIGSTOP) 4728dffb485Schristos case GDB_SIGNAL_STOP: 4738dffb485Schristos return SIGSTOP; 4748dffb485Schristos #endif 4758dffb485Schristos #if defined (SIGTSTP) 4768dffb485Schristos case GDB_SIGNAL_TSTP: 4778dffb485Schristos return SIGTSTP; 4788dffb485Schristos #endif 4798dffb485Schristos #if defined (SIGCONT) 4808dffb485Schristos case GDB_SIGNAL_CONT: 4818dffb485Schristos return SIGCONT; 4828dffb485Schristos #endif 4838dffb485Schristos #if defined (SIGTTIN) 4848dffb485Schristos case GDB_SIGNAL_TTIN: 4858dffb485Schristos return SIGTTIN; 4868dffb485Schristos #endif 4878dffb485Schristos #if defined (SIGTTOU) 4888dffb485Schristos case GDB_SIGNAL_TTOU: 4898dffb485Schristos return SIGTTOU; 4908dffb485Schristos #endif 4918dffb485Schristos #if defined (SIGVTALRM) 4928dffb485Schristos case GDB_SIGNAL_VTALRM: 4938dffb485Schristos return SIGVTALRM; 4948dffb485Schristos #endif 4958dffb485Schristos #if defined (SIGPROF) 4968dffb485Schristos case GDB_SIGNAL_PROF: 4978dffb485Schristos return SIGPROF; 4988dffb485Schristos #endif 4998dffb485Schristos #if defined (SIGXCPU) 5008dffb485Schristos case GDB_SIGNAL_XCPU: 5018dffb485Schristos return SIGXCPU; 5028dffb485Schristos #endif 5038dffb485Schristos #if defined (SIGXFSZ) 5048dffb485Schristos case GDB_SIGNAL_XFSZ: 5058dffb485Schristos return SIGXFSZ; 5068dffb485Schristos #endif 5078dffb485Schristos #if defined (SIGWIND) 5088dffb485Schristos case GDB_SIGNAL_WIND: 5098dffb485Schristos return SIGWIND; 5108dffb485Schristos #endif 5118dffb485Schristos #if defined (SIGPHONE) 5128dffb485Schristos case GDB_SIGNAL_PHONE: 5138dffb485Schristos return SIGPHONE; 5148dffb485Schristos #endif 5158dffb485Schristos #if defined (SIGLOST) 5168dffb485Schristos case GDB_SIGNAL_LOST: 5178dffb485Schristos return SIGLOST; 5188dffb485Schristos #endif 5198dffb485Schristos #if defined (SIGWAITING) 5208dffb485Schristos case GDB_SIGNAL_WAITING: 5218dffb485Schristos return SIGWAITING; 5228dffb485Schristos #endif 5238dffb485Schristos #if defined (SIGCANCEL) 5248dffb485Schristos case GDB_SIGNAL_CANCEL: 5258dffb485Schristos return SIGCANCEL; 5268dffb485Schristos #endif 5278dffb485Schristos #if defined (SIGLWP) 5288dffb485Schristos case GDB_SIGNAL_LWP: 5298dffb485Schristos return SIGLWP; 5308dffb485Schristos #endif 5318dffb485Schristos #if defined (SIGDANGER) 5328dffb485Schristos case GDB_SIGNAL_DANGER: 5338dffb485Schristos return SIGDANGER; 5348dffb485Schristos #endif 5358dffb485Schristos #if defined (SIGGRANT) 5368dffb485Schristos case GDB_SIGNAL_GRANT: 5378dffb485Schristos return SIGGRANT; 5388dffb485Schristos #endif 5398dffb485Schristos #if defined (SIGRETRACT) 5408dffb485Schristos case GDB_SIGNAL_RETRACT: 5418dffb485Schristos return SIGRETRACT; 5428dffb485Schristos #endif 5438dffb485Schristos #if defined (SIGMSG) 5448dffb485Schristos case GDB_SIGNAL_MSG: 5458dffb485Schristos return SIGMSG; 5468dffb485Schristos #endif 5478dffb485Schristos #if defined (SIGSOUND) 5488dffb485Schristos case GDB_SIGNAL_SOUND: 5498dffb485Schristos return SIGSOUND; 5508dffb485Schristos #endif 5518dffb485Schristos #if defined (SIGSAK) 5528dffb485Schristos case GDB_SIGNAL_SAK: 5538dffb485Schristos return SIGSAK; 5548dffb485Schristos #endif 5558dffb485Schristos #if defined (SIGPRIO) 5568dffb485Schristos case GDB_SIGNAL_PRIO: 5578dffb485Schristos return SIGPRIO; 5588dffb485Schristos #endif 5598dffb485Schristos 5608dffb485Schristos /* Mach exceptions. Assumes that the values for EXC_ are positive! */ 5618dffb485Schristos #if defined (EXC_BAD_ACCESS) && defined (_NSIG) 5628dffb485Schristos case GDB_EXC_BAD_ACCESS: 5638dffb485Schristos return _NSIG + EXC_BAD_ACCESS; 5648dffb485Schristos #endif 5658dffb485Schristos #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG) 5668dffb485Schristos case GDB_EXC_BAD_INSTRUCTION: 5678dffb485Schristos return _NSIG + EXC_BAD_INSTRUCTION; 5688dffb485Schristos #endif 5698dffb485Schristos #if defined (EXC_ARITHMETIC) && defined (_NSIG) 5708dffb485Schristos case GDB_EXC_ARITHMETIC: 5718dffb485Schristos return _NSIG + EXC_ARITHMETIC; 5728dffb485Schristos #endif 5738dffb485Schristos #if defined (EXC_EMULATION) && defined (_NSIG) 5748dffb485Schristos case GDB_EXC_EMULATION: 5758dffb485Schristos return _NSIG + EXC_EMULATION; 5768dffb485Schristos #endif 5778dffb485Schristos #if defined (EXC_SOFTWARE) && defined (_NSIG) 5788dffb485Schristos case GDB_EXC_SOFTWARE: 5798dffb485Schristos return _NSIG + EXC_SOFTWARE; 5808dffb485Schristos #endif 5818dffb485Schristos #if defined (EXC_BREAKPOINT) && defined (_NSIG) 5828dffb485Schristos case GDB_EXC_BREAKPOINT: 5838dffb485Schristos return _NSIG + EXC_BREAKPOINT; 5848dffb485Schristos #endif 5858dffb485Schristos 5868dffb485Schristos #if defined (SIGINFO) 5878dffb485Schristos case GDB_SIGNAL_INFO: 5888dffb485Schristos return SIGINFO; 5898dffb485Schristos #endif 5908dffb485Schristos #if defined (SIGLIBRT) 5918dffb485Schristos case GDB_SIGNAL_LIBRT: 5928dffb485Schristos return SIGLIBRT; 5938dffb485Schristos #endif 5948dffb485Schristos 5958dffb485Schristos default: 5968dffb485Schristos #if defined (REALTIME_LO) 5978dffb485Schristos retsig = 0; 5988dffb485Schristos 5998dffb485Schristos if (oursig >= GDB_SIGNAL_REALTIME_33 6008dffb485Schristos && oursig <= GDB_SIGNAL_REALTIME_63) 6018dffb485Schristos { 6028dffb485Schristos /* This block of signals is continuous, and 6038dffb485Schristos GDB_SIGNAL_REALTIME_33 is 33 by definition. */ 6048dffb485Schristos retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_33 + 33; 6058dffb485Schristos } 6068dffb485Schristos else if (oursig == GDB_SIGNAL_REALTIME_32) 6078dffb485Schristos { 6088dffb485Schristos /* GDB_SIGNAL_REALTIME_32 isn't contiguous with 6098dffb485Schristos GDB_SIGNAL_REALTIME_33. It is 32 by definition. */ 6108dffb485Schristos retsig = 32; 6118dffb485Schristos } 6128dffb485Schristos else if (oursig >= GDB_SIGNAL_REALTIME_64 6138dffb485Schristos && oursig <= GDB_SIGNAL_REALTIME_127) 6148dffb485Schristos { 6158dffb485Schristos /* This block of signals is continuous, and 6168dffb485Schristos GDB_SIGNAL_REALTIME_64 is 64 by definition. */ 6178dffb485Schristos retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_64 + 64; 6188dffb485Schristos } 6198dffb485Schristos 6208dffb485Schristos if (retsig >= REALTIME_LO && retsig < REALTIME_HI) 6218dffb485Schristos return retsig; 6228dffb485Schristos #endif 6238dffb485Schristos 6248dffb485Schristos *oursig_ok = 0; 6258dffb485Schristos return 0; 6268dffb485Schristos } 6278dffb485Schristos } 6288dffb485Schristos 6298dffb485Schristos int 6308dffb485Schristos gdb_signal_to_host_p (enum gdb_signal oursig) 6318dffb485Schristos { 6328dffb485Schristos int oursig_ok; 6338dffb485Schristos do_gdb_signal_to_host (oursig, &oursig_ok); 6348dffb485Schristos return oursig_ok; 6358dffb485Schristos } 6368dffb485Schristos 6378dffb485Schristos int 6388dffb485Schristos gdb_signal_to_host (enum gdb_signal oursig) 6398dffb485Schristos { 6408dffb485Schristos int oursig_ok; 6418dffb485Schristos int targ_signo = do_gdb_signal_to_host (oursig, &oursig_ok); 6428dffb485Schristos if (!oursig_ok) 6438dffb485Schristos { 6448dffb485Schristos /* The user might be trying to do "signal SIGSAK" where this system 6458dffb485Schristos doesn't have SIGSAK. */ 6468dffb485Schristos warning (_("Signal %s does not exist on this system."), 6478dffb485Schristos gdb_signal_to_name (oursig)); 6488dffb485Schristos return 0; 6498dffb485Schristos } 6508dffb485Schristos else 6518dffb485Schristos return targ_signo; 6528dffb485Schristos } 653