xref: /netbsd-src/external/gpl3/gdb/dist/gdbsupport/signals.cc (revision 5ba1f45f2a09259cc846f20c7c5501604d633c90)
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