Home | History | Annotate | Line # | Download | only in gdbsupport
      1      1.1  christos /* Target signal translation functions for GDB.
      2  1.1.1.3  christos    Copyright (C) 1990-2024 Free Software Foundation, Inc.
      3      1.1  christos    Contributed by Cygnus Support.
      4      1.1  christos 
      5      1.1  christos    This file is part of GDB.
      6      1.1  christos 
      7      1.1  christos    This program is free software; you can redistribute it and/or modify
      8      1.1  christos    it under the terms of the GNU General Public License as published by
      9      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     10      1.1  christos    (at your option) any later version.
     11      1.1  christos 
     12      1.1  christos    This program is distributed in the hope that it will be useful,
     13      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15      1.1  christos    GNU General Public License for more details.
     16      1.1  christos 
     17      1.1  christos    You should have received a copy of the GNU General Public License
     18      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     19      1.1  christos 
     20      1.1  christos 
     21      1.1  christos #ifdef HAVE_SIGNAL_H
     22      1.1  christos #include <signal.h>
     23      1.1  christos #endif
     24      1.1  christos 
     25      1.1  christos #include "gdb_signals.h"
     26      1.1  christos 
     27      1.1  christos struct gdbarch;
     28      1.1  christos 
     29      1.1  christos /* Always use __SIGRTMIN if it's available.  SIGRTMIN is the lowest
     30      1.1  christos    _available_ realtime signal, not the lowest supported; glibc takes
     31      1.1  christos    several for its own use.  */
     32      1.1  christos 
     33  1.1.1.4  christos #if defined(__SIGRTMIN)
     34  1.1.1.4  christos # define REALTIME_LO __SIGRTMIN
     35  1.1.1.4  christos # define REALTIME_HI (__SIGRTMAX + 1)
     36  1.1.1.4  christos #elif defined(SIGRTMIN)
     37  1.1.1.4  christos # define REALTIME_LO SIGRTMIN
     38  1.1.1.4  christos # define REALTIME_HI (SIGRTMAX + 1)
     39      1.1  christos #endif
     40      1.1  christos 
     41      1.1  christos /* This table must match in order and size the signals in enum
     42      1.1  christos    gdb_signal.  */
     43      1.1  christos 
     44      1.1  christos static const struct {
     45      1.1  christos   const char *symbol;
     46      1.1  christos   const char *name;
     47      1.1  christos   const char *string;
     48      1.1  christos   } signals [] =
     49      1.1  christos {
     50      1.1  christos #define SET(symbol, constant, name, string) { #symbol, name, string },
     51      1.1  christos #include "gdb/signals.def"
     52      1.1  christos #undef SET
     53      1.1  christos };
     54      1.1  christos 
     55      1.1  christos const char *
     56      1.1  christos gdb_signal_to_symbol_string (enum gdb_signal sig)
     57      1.1  christos {
     58      1.1  christos   gdb_assert ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST);
     59      1.1  christos 
     60      1.1  christos   return signals[sig].symbol;
     61      1.1  christos }
     62      1.1  christos 
     63      1.1  christos /* Return the string for a signal.  */
     64      1.1  christos const char *
     65      1.1  christos gdb_signal_to_string (enum gdb_signal sig)
     66      1.1  christos {
     67      1.1  christos   if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST)
     68      1.1  christos     return signals[sig].string;
     69      1.1  christos   else
     70      1.1  christos     return signals[GDB_SIGNAL_UNKNOWN].string;
     71      1.1  christos }
     72      1.1  christos 
     73      1.1  christos /* Return the name for a signal.  */
     74      1.1  christos const char *
     75      1.1  christos gdb_signal_to_name (enum gdb_signal sig)
     76      1.1  christos {
     77      1.1  christos   if ((int) sig >= GDB_SIGNAL_FIRST && (int) sig <= GDB_SIGNAL_LAST
     78      1.1  christos       && signals[sig].name != NULL)
     79      1.1  christos     return signals[sig].name;
     80      1.1  christos   else
     81      1.1  christos     /* I think the code which prints this will always print it along
     82      1.1  christos        with the string, so no need to be verbose (very old comment).  */
     83      1.1  christos     return "?";
     84      1.1  christos }
     85      1.1  christos 
     86      1.1  christos /* Given a name, return its signal.  */
     87      1.1  christos enum gdb_signal
     88      1.1  christos gdb_signal_from_name (const char *name)
     89      1.1  christos {
     90      1.1  christos   enum gdb_signal sig;
     91      1.1  christos 
     92      1.1  christos   /* It's possible we also should allow "SIGCLD" as well as "SIGCHLD"
     93      1.1  christos      for GDB_SIGNAL_SIGCHLD.  SIGIOT, on the other hand, is more
     94      1.1  christos      questionable; seems like by now people should call it SIGABRT
     95      1.1  christos      instead.  */
     96      1.1  christos 
     97      1.1  christos   /* This ugly cast brought to you by the native VAX compiler.  */
     98      1.1  christos   for (sig = GDB_SIGNAL_HUP;
     99      1.1  christos        sig < GDB_SIGNAL_LAST;
    100      1.1  christos        sig = (enum gdb_signal) ((int) sig + 1))
    101      1.1  christos     if (signals[sig].name != NULL
    102      1.1  christos 	&& strcmp (name, signals[sig].name) == 0)
    103      1.1  christos       return sig;
    104      1.1  christos   return GDB_SIGNAL_UNKNOWN;
    105      1.1  christos }
    106      1.1  christos 
    107      1.1  christos /* The following functions are to help certain targets deal
    109      1.1  christos    with the signal/waitstatus stuff.  They could just as well be in
    110      1.1  christos    a file called native-utils.c or unixwaitstatus-utils.c or whatever.  */
    111      1.1  christos 
    112      1.1  christos /* Convert host signal to our signals.  */
    113      1.1  christos enum gdb_signal
    114      1.1  christos gdb_signal_from_host (int hostsig)
    115      1.1  christos {
    116      1.1  christos   /* A switch statement would make sense but would require special
    117      1.1  christos      kludges to deal with the cases where more than one signal has the
    118      1.1  christos      same number.  Signals are ordered ANSI-standard signals first,
    119      1.1  christos      other signals second, with signals in each block ordered by their
    120      1.1  christos      numerical values on a typical POSIX platform.  */
    121      1.1  christos 
    122      1.1  christos   if (hostsig == 0)
    123      1.1  christos     return GDB_SIGNAL_0;
    124      1.1  christos 
    125      1.1  christos   /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
    126      1.1  christos      are ANSI-standard signals and are always available.  */
    127      1.1  christos   if (hostsig == SIGINT)
    128      1.1  christos     return GDB_SIGNAL_INT;
    129      1.1  christos   if (hostsig == SIGILL)
    130      1.1  christos     return GDB_SIGNAL_ILL;
    131      1.1  christos   if (hostsig == SIGABRT)
    132      1.1  christos     return GDB_SIGNAL_ABRT;
    133      1.1  christos   if (hostsig == SIGFPE)
    134      1.1  christos     return GDB_SIGNAL_FPE;
    135      1.1  christos   if (hostsig == SIGSEGV)
    136      1.1  christos     return GDB_SIGNAL_SEGV;
    137      1.1  christos   if (hostsig == SIGTERM)
    138      1.1  christos     return GDB_SIGNAL_TERM;
    139      1.1  christos 
    140      1.1  christos   /* All other signals need preprocessor conditionals.  */
    141      1.1  christos #if defined (SIGHUP)
    142      1.1  christos   if (hostsig == SIGHUP)
    143      1.1  christos     return GDB_SIGNAL_HUP;
    144      1.1  christos #endif
    145      1.1  christos #if defined (SIGQUIT)
    146      1.1  christos   if (hostsig == SIGQUIT)
    147      1.1  christos     return GDB_SIGNAL_QUIT;
    148      1.1  christos #endif
    149      1.1  christos #if defined (SIGTRAP)
    150      1.1  christos   if (hostsig == SIGTRAP)
    151      1.1  christos     return GDB_SIGNAL_TRAP;
    152      1.1  christos #endif
    153      1.1  christos #if defined (SIGEMT)
    154      1.1  christos   if (hostsig == SIGEMT)
    155      1.1  christos     return GDB_SIGNAL_EMT;
    156      1.1  christos #endif
    157      1.1  christos #if defined (SIGKILL)
    158      1.1  christos   if (hostsig == SIGKILL)
    159      1.1  christos     return GDB_SIGNAL_KILL;
    160      1.1  christos #endif
    161      1.1  christos #if defined (SIGBUS)
    162      1.1  christos   if (hostsig == SIGBUS)
    163      1.1  christos     return GDB_SIGNAL_BUS;
    164      1.1  christos #endif
    165      1.1  christos #if defined (SIGSYS)
    166      1.1  christos   if (hostsig == SIGSYS)
    167      1.1  christos     return GDB_SIGNAL_SYS;
    168      1.1  christos #endif
    169      1.1  christos #if defined (SIGPIPE)
    170      1.1  christos   if (hostsig == SIGPIPE)
    171      1.1  christos     return GDB_SIGNAL_PIPE;
    172      1.1  christos #endif
    173      1.1  christos #if defined (SIGALRM)
    174      1.1  christos   if (hostsig == SIGALRM)
    175      1.1  christos     return GDB_SIGNAL_ALRM;
    176      1.1  christos #endif
    177      1.1  christos #if defined (SIGUSR1)
    178      1.1  christos   if (hostsig == SIGUSR1)
    179      1.1  christos     return GDB_SIGNAL_USR1;
    180      1.1  christos #endif
    181      1.1  christos #if defined (SIGUSR2)
    182      1.1  christos   if (hostsig == SIGUSR2)
    183      1.1  christos     return GDB_SIGNAL_USR2;
    184      1.1  christos #endif
    185      1.1  christos #if defined (SIGCLD)
    186      1.1  christos   if (hostsig == SIGCLD)
    187      1.1  christos     return GDB_SIGNAL_CHLD;
    188      1.1  christos #endif
    189      1.1  christos #if defined (SIGCHLD)
    190      1.1  christos   if (hostsig == SIGCHLD)
    191      1.1  christos     return GDB_SIGNAL_CHLD;
    192      1.1  christos #endif
    193      1.1  christos #if defined (SIGPWR)
    194      1.1  christos   if (hostsig == SIGPWR)
    195      1.1  christos     return GDB_SIGNAL_PWR;
    196      1.1  christos #endif
    197      1.1  christos #if defined (SIGWINCH)
    198      1.1  christos   if (hostsig == SIGWINCH)
    199      1.1  christos     return GDB_SIGNAL_WINCH;
    200      1.1  christos #endif
    201      1.1  christos #if defined (SIGURG)
    202      1.1  christos   if (hostsig == SIGURG)
    203      1.1  christos     return GDB_SIGNAL_URG;
    204      1.1  christos #endif
    205      1.1  christos #if defined (SIGIO)
    206      1.1  christos   if (hostsig == SIGIO)
    207      1.1  christos     return GDB_SIGNAL_IO;
    208      1.1  christos #endif
    209      1.1  christos #if defined (SIGPOLL)
    210      1.1  christos   if (hostsig == SIGPOLL)
    211      1.1  christos     return GDB_SIGNAL_POLL;
    212      1.1  christos #endif
    213      1.1  christos #if defined (SIGSTOP)
    214      1.1  christos   if (hostsig == SIGSTOP)
    215      1.1  christos     return GDB_SIGNAL_STOP;
    216      1.1  christos #endif
    217      1.1  christos #if defined (SIGTSTP)
    218      1.1  christos   if (hostsig == SIGTSTP)
    219      1.1  christos     return GDB_SIGNAL_TSTP;
    220      1.1  christos #endif
    221      1.1  christos #if defined (SIGCONT)
    222      1.1  christos   if (hostsig == SIGCONT)
    223      1.1  christos     return GDB_SIGNAL_CONT;
    224      1.1  christos #endif
    225      1.1  christos #if defined (SIGTTIN)
    226      1.1  christos   if (hostsig == SIGTTIN)
    227      1.1  christos     return GDB_SIGNAL_TTIN;
    228      1.1  christos #endif
    229      1.1  christos #if defined (SIGTTOU)
    230      1.1  christos   if (hostsig == SIGTTOU)
    231      1.1  christos     return GDB_SIGNAL_TTOU;
    232      1.1  christos #endif
    233      1.1  christos #if defined (SIGVTALRM)
    234      1.1  christos   if (hostsig == SIGVTALRM)
    235      1.1  christos     return GDB_SIGNAL_VTALRM;
    236      1.1  christos #endif
    237      1.1  christos #if defined (SIGPROF)
    238      1.1  christos   if (hostsig == SIGPROF)
    239      1.1  christos     return GDB_SIGNAL_PROF;
    240      1.1  christos #endif
    241      1.1  christos #if defined (SIGXCPU)
    242      1.1  christos   if (hostsig == SIGXCPU)
    243      1.1  christos     return GDB_SIGNAL_XCPU;
    244      1.1  christos #endif
    245      1.1  christos #if defined (SIGXFSZ)
    246      1.1  christos   if (hostsig == SIGXFSZ)
    247      1.1  christos     return GDB_SIGNAL_XFSZ;
    248      1.1  christos #endif
    249      1.1  christos #if defined (SIGWIND)
    250      1.1  christos   if (hostsig == SIGWIND)
    251      1.1  christos     return GDB_SIGNAL_WIND;
    252      1.1  christos #endif
    253      1.1  christos #if defined (SIGPHONE)
    254      1.1  christos   if (hostsig == SIGPHONE)
    255      1.1  christos     return GDB_SIGNAL_PHONE;
    256      1.1  christos #endif
    257      1.1  christos #if defined (SIGLOST)
    258      1.1  christos   if (hostsig == SIGLOST)
    259      1.1  christos     return GDB_SIGNAL_LOST;
    260      1.1  christos #endif
    261      1.1  christos #if defined (SIGWAITING)
    262      1.1  christos   if (hostsig == SIGWAITING)
    263      1.1  christos     return GDB_SIGNAL_WAITING;
    264      1.1  christos #endif
    265      1.1  christos #if defined (SIGCANCEL)
    266      1.1  christos   if (hostsig == SIGCANCEL)
    267      1.1  christos     return GDB_SIGNAL_CANCEL;
    268      1.1  christos #endif
    269      1.1  christos #if defined (SIGLWP)
    270      1.1  christos   if (hostsig == SIGLWP)
    271      1.1  christos     return GDB_SIGNAL_LWP;
    272      1.1  christos #endif
    273      1.1  christos #if defined (SIGDANGER)
    274      1.1  christos   if (hostsig == SIGDANGER)
    275      1.1  christos     return GDB_SIGNAL_DANGER;
    276      1.1  christos #endif
    277      1.1  christos #if defined (SIGGRANT)
    278      1.1  christos   if (hostsig == SIGGRANT)
    279      1.1  christos     return GDB_SIGNAL_GRANT;
    280      1.1  christos #endif
    281      1.1  christos #if defined (SIGRETRACT)
    282      1.1  christos   if (hostsig == SIGRETRACT)
    283      1.1  christos     return GDB_SIGNAL_RETRACT;
    284      1.1  christos #endif
    285      1.1  christos #if defined (SIGMSG)
    286      1.1  christos   if (hostsig == SIGMSG)
    287      1.1  christos     return GDB_SIGNAL_MSG;
    288      1.1  christos #endif
    289      1.1  christos #if defined (SIGSOUND)
    290      1.1  christos   if (hostsig == SIGSOUND)
    291      1.1  christos     return GDB_SIGNAL_SOUND;
    292      1.1  christos #endif
    293      1.1  christos #if defined (SIGSAK)
    294      1.1  christos   if (hostsig == SIGSAK)
    295      1.1  christos     return GDB_SIGNAL_SAK;
    296      1.1  christos #endif
    297      1.1  christos #if defined (SIGPRIO)
    298      1.1  christos   if (hostsig == SIGPRIO)
    299      1.1  christos     return GDB_SIGNAL_PRIO;
    300      1.1  christos #endif
    301      1.1  christos 
    302      1.1  christos   /* Mach exceptions.  Assumes that the values for EXC_ are positive! */
    303      1.1  christos #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
    304      1.1  christos   if (hostsig == _NSIG + EXC_BAD_ACCESS)
    305      1.1  christos     return GDB_EXC_BAD_ACCESS;
    306      1.1  christos #endif
    307      1.1  christos #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
    308      1.1  christos   if (hostsig == _NSIG + EXC_BAD_INSTRUCTION)
    309      1.1  christos     return GDB_EXC_BAD_INSTRUCTION;
    310      1.1  christos #endif
    311      1.1  christos #if defined (EXC_ARITHMETIC) && defined (_NSIG)
    312      1.1  christos   if (hostsig == _NSIG + EXC_ARITHMETIC)
    313      1.1  christos     return GDB_EXC_ARITHMETIC;
    314      1.1  christos #endif
    315      1.1  christos #if defined (EXC_EMULATION) && defined (_NSIG)
    316      1.1  christos   if (hostsig == _NSIG + EXC_EMULATION)
    317      1.1  christos     return GDB_EXC_EMULATION;
    318      1.1  christos #endif
    319      1.1  christos #if defined (EXC_SOFTWARE) && defined (_NSIG)
    320      1.1  christos   if (hostsig == _NSIG + EXC_SOFTWARE)
    321      1.1  christos     return GDB_EXC_SOFTWARE;
    322      1.1  christos #endif
    323      1.1  christos #if defined (EXC_BREAKPOINT) && defined (_NSIG)
    324      1.1  christos   if (hostsig == _NSIG + EXC_BREAKPOINT)
    325      1.1  christos     return GDB_EXC_BREAKPOINT;
    326      1.1  christos #endif
    327      1.1  christos 
    328      1.1  christos #if defined (SIGINFO)
    329      1.1  christos   if (hostsig == SIGINFO)
    330      1.1  christos     return GDB_SIGNAL_INFO;
    331      1.1  christos #endif
    332      1.1  christos #if defined (SIGLIBRT)
    333      1.1  christos   if (hostsig == SIGLIBRT)
    334      1.1  christos     return GDB_SIGNAL_LIBRT;
    335      1.1  christos #endif
    336      1.1  christos 
    337      1.1  christos #if defined (REALTIME_LO)
    338      1.1  christos   if (hostsig >= REALTIME_LO && hostsig < REALTIME_HI)
    339      1.1  christos     {
    340      1.1  christos       /* This block of GDB_SIGNAL_REALTIME value is in order.  */
    341      1.1  christos       if (33 <= hostsig && hostsig <= 63)
    342      1.1  christos 	return (enum gdb_signal)
    343      1.1  christos 	  (hostsig - 33 + (int) GDB_SIGNAL_REALTIME_33);
    344      1.1  christos       else if (hostsig == 32)
    345      1.1  christos 	return GDB_SIGNAL_REALTIME_32;
    346      1.1  christos       else if (64 <= hostsig && hostsig <= 127)
    347      1.1  christos 	return (enum gdb_signal)
    348      1.1  christos 	  (hostsig - 64 + (int) GDB_SIGNAL_REALTIME_64);
    349      1.1  christos       else
    350      1.1  christos 	error (_("GDB bug: target.c (gdb_signal_from_host): "
    351      1.1  christos 	       "unrecognized real-time signal"));
    352      1.1  christos     }
    353      1.1  christos #endif
    354      1.1  christos 
    355      1.1  christos   return GDB_SIGNAL_UNKNOWN;
    356      1.1  christos }
    357      1.1  christos 
    358  1.1.1.3  christos /* Convert a OURSIG (an enum gdb_signal) to the form used by the
    359      1.1  christos    target operating system (referred to as the ``host'') or zero if the
    360      1.1  christos    equivalent host signal is not available.  Set/clear OURSIG_OK
    361      1.1  christos    accordingly. */
    362      1.1  christos 
    363      1.1  christos static int
    364      1.1  christos do_gdb_signal_to_host (enum gdb_signal oursig,
    365      1.1  christos 			  int *oursig_ok)
    366      1.1  christos {
    367      1.1  christos   int retsig;
    368      1.1  christos   /* Silence the 'not used' warning, for targets that
    369      1.1  christos      do not support signals.  */
    370      1.1  christos   (void) retsig;
    371      1.1  christos 
    372      1.1  christos   /* Signals are ordered ANSI-standard signals first, other signals
    373      1.1  christos      second, with signals in each block ordered by their numerical
    374      1.1  christos      values on a typical POSIX platform.  */
    375      1.1  christos 
    376      1.1  christos   *oursig_ok = 1;
    377      1.1  christos   switch (oursig)
    378      1.1  christos     {
    379      1.1  christos     case GDB_SIGNAL_0:
    380      1.1  christos       return 0;
    381      1.1  christos 
    382      1.1  christos       /* SIGINT, SIGILL, SIGABRT, SIGFPE, SIGSEGV and SIGTERM
    383      1.1  christos 	 are ANSI-standard signals and are always available.  */
    384      1.1  christos     case GDB_SIGNAL_INT:
    385      1.1  christos       return SIGINT;
    386      1.1  christos     case GDB_SIGNAL_ILL:
    387      1.1  christos       return SIGILL;
    388      1.1  christos     case GDB_SIGNAL_ABRT:
    389      1.1  christos       return SIGABRT;
    390      1.1  christos     case GDB_SIGNAL_FPE:
    391      1.1  christos       return SIGFPE;
    392      1.1  christos     case GDB_SIGNAL_SEGV:
    393      1.1  christos       return SIGSEGV;
    394      1.1  christos     case GDB_SIGNAL_TERM:
    395      1.1  christos       return SIGTERM;
    396      1.1  christos 
    397      1.1  christos       /* All other signals need preprocessor conditionals.  */
    398      1.1  christos #if defined (SIGHUP)
    399      1.1  christos     case GDB_SIGNAL_HUP:
    400      1.1  christos       return SIGHUP;
    401      1.1  christos #endif
    402      1.1  christos #if defined (SIGQUIT)
    403      1.1  christos     case GDB_SIGNAL_QUIT:
    404      1.1  christos       return SIGQUIT;
    405      1.1  christos #endif
    406      1.1  christos #if defined (SIGTRAP)
    407      1.1  christos     case GDB_SIGNAL_TRAP:
    408      1.1  christos       return SIGTRAP;
    409      1.1  christos #endif
    410      1.1  christos #if defined (SIGEMT)
    411      1.1  christos     case GDB_SIGNAL_EMT:
    412      1.1  christos       return SIGEMT;
    413      1.1  christos #endif
    414      1.1  christos #if defined (SIGKILL)
    415      1.1  christos     case GDB_SIGNAL_KILL:
    416      1.1  christos       return SIGKILL;
    417      1.1  christos #endif
    418      1.1  christos #if defined (SIGBUS)
    419      1.1  christos     case GDB_SIGNAL_BUS:
    420      1.1  christos       return SIGBUS;
    421      1.1  christos #endif
    422      1.1  christos #if defined (SIGSYS)
    423      1.1  christos     case GDB_SIGNAL_SYS:
    424      1.1  christos       return SIGSYS;
    425      1.1  christos #endif
    426      1.1  christos #if defined (SIGPIPE)
    427      1.1  christos     case GDB_SIGNAL_PIPE:
    428      1.1  christos       return SIGPIPE;
    429      1.1  christos #endif
    430      1.1  christos #if defined (SIGALRM)
    431      1.1  christos     case GDB_SIGNAL_ALRM:
    432      1.1  christos       return SIGALRM;
    433      1.1  christos #endif
    434      1.1  christos #if defined (SIGUSR1)
    435      1.1  christos     case GDB_SIGNAL_USR1:
    436      1.1  christos       return SIGUSR1;
    437      1.1  christos #endif
    438      1.1  christos #if defined (SIGUSR2)
    439      1.1  christos     case GDB_SIGNAL_USR2:
    440      1.1  christos       return SIGUSR2;
    441      1.1  christos #endif
    442      1.1  christos #if defined (SIGCHLD) || defined (SIGCLD)
    443      1.1  christos     case GDB_SIGNAL_CHLD:
    444      1.1  christos #if defined (SIGCHLD)
    445      1.1  christos       return SIGCHLD;
    446      1.1  christos #else
    447      1.1  christos       return SIGCLD;
    448      1.1  christos #endif
    449      1.1  christos #endif /* SIGCLD or SIGCHLD */
    450      1.1  christos #if defined (SIGPWR)
    451      1.1  christos     case GDB_SIGNAL_PWR:
    452      1.1  christos       return SIGPWR;
    453      1.1  christos #endif
    454      1.1  christos #if defined (SIGWINCH)
    455      1.1  christos     case GDB_SIGNAL_WINCH:
    456      1.1  christos       return SIGWINCH;
    457      1.1  christos #endif
    458      1.1  christos #if defined (SIGURG)
    459      1.1  christos     case GDB_SIGNAL_URG:
    460      1.1  christos       return SIGURG;
    461      1.1  christos #endif
    462      1.1  christos #if defined (SIGIO)
    463      1.1  christos     case GDB_SIGNAL_IO:
    464      1.1  christos       return SIGIO;
    465      1.1  christos #endif
    466      1.1  christos #if defined (SIGPOLL)
    467      1.1  christos     case GDB_SIGNAL_POLL:
    468      1.1  christos       return SIGPOLL;
    469      1.1  christos #endif
    470      1.1  christos #if defined (SIGSTOP)
    471      1.1  christos     case GDB_SIGNAL_STOP:
    472      1.1  christos       return SIGSTOP;
    473      1.1  christos #endif
    474      1.1  christos #if defined (SIGTSTP)
    475      1.1  christos     case GDB_SIGNAL_TSTP:
    476      1.1  christos       return SIGTSTP;
    477      1.1  christos #endif
    478      1.1  christos #if defined (SIGCONT)
    479      1.1  christos     case GDB_SIGNAL_CONT:
    480      1.1  christos       return SIGCONT;
    481      1.1  christos #endif
    482      1.1  christos #if defined (SIGTTIN)
    483      1.1  christos     case GDB_SIGNAL_TTIN:
    484      1.1  christos       return SIGTTIN;
    485      1.1  christos #endif
    486      1.1  christos #if defined (SIGTTOU)
    487      1.1  christos     case GDB_SIGNAL_TTOU:
    488      1.1  christos       return SIGTTOU;
    489      1.1  christos #endif
    490      1.1  christos #if defined (SIGVTALRM)
    491      1.1  christos     case GDB_SIGNAL_VTALRM:
    492      1.1  christos       return SIGVTALRM;
    493      1.1  christos #endif
    494      1.1  christos #if defined (SIGPROF)
    495      1.1  christos     case GDB_SIGNAL_PROF:
    496      1.1  christos       return SIGPROF;
    497      1.1  christos #endif
    498      1.1  christos #if defined (SIGXCPU)
    499      1.1  christos     case GDB_SIGNAL_XCPU:
    500      1.1  christos       return SIGXCPU;
    501      1.1  christos #endif
    502      1.1  christos #if defined (SIGXFSZ)
    503      1.1  christos     case GDB_SIGNAL_XFSZ:
    504      1.1  christos       return SIGXFSZ;
    505      1.1  christos #endif
    506      1.1  christos #if defined (SIGWIND)
    507      1.1  christos     case GDB_SIGNAL_WIND:
    508      1.1  christos       return SIGWIND;
    509      1.1  christos #endif
    510      1.1  christos #if defined (SIGPHONE)
    511      1.1  christos     case GDB_SIGNAL_PHONE:
    512      1.1  christos       return SIGPHONE;
    513      1.1  christos #endif
    514      1.1  christos #if defined (SIGLOST)
    515      1.1  christos     case GDB_SIGNAL_LOST:
    516      1.1  christos       return SIGLOST;
    517      1.1  christos #endif
    518      1.1  christos #if defined (SIGWAITING)
    519      1.1  christos     case GDB_SIGNAL_WAITING:
    520      1.1  christos       return SIGWAITING;
    521      1.1  christos #endif
    522      1.1  christos #if defined (SIGCANCEL)
    523      1.1  christos     case GDB_SIGNAL_CANCEL:
    524      1.1  christos       return SIGCANCEL;
    525      1.1  christos #endif
    526      1.1  christos #if defined (SIGLWP)
    527      1.1  christos     case GDB_SIGNAL_LWP:
    528      1.1  christos       return SIGLWP;
    529      1.1  christos #endif
    530      1.1  christos #if defined (SIGDANGER)
    531      1.1  christos     case GDB_SIGNAL_DANGER:
    532      1.1  christos       return SIGDANGER;
    533      1.1  christos #endif
    534      1.1  christos #if defined (SIGGRANT)
    535      1.1  christos     case GDB_SIGNAL_GRANT:
    536      1.1  christos       return SIGGRANT;
    537      1.1  christos #endif
    538      1.1  christos #if defined (SIGRETRACT)
    539      1.1  christos     case GDB_SIGNAL_RETRACT:
    540      1.1  christos       return SIGRETRACT;
    541      1.1  christos #endif
    542      1.1  christos #if defined (SIGMSG)
    543      1.1  christos     case GDB_SIGNAL_MSG:
    544      1.1  christos       return SIGMSG;
    545      1.1  christos #endif
    546      1.1  christos #if defined (SIGSOUND)
    547      1.1  christos     case GDB_SIGNAL_SOUND:
    548      1.1  christos       return SIGSOUND;
    549      1.1  christos #endif
    550      1.1  christos #if defined (SIGSAK)
    551      1.1  christos     case GDB_SIGNAL_SAK:
    552      1.1  christos       return SIGSAK;
    553      1.1  christos #endif
    554      1.1  christos #if defined (SIGPRIO)
    555      1.1  christos     case GDB_SIGNAL_PRIO:
    556      1.1  christos       return SIGPRIO;
    557      1.1  christos #endif
    558      1.1  christos 
    559      1.1  christos       /* Mach exceptions.  Assumes that the values for EXC_ are positive! */
    560      1.1  christos #if defined (EXC_BAD_ACCESS) && defined (_NSIG)
    561      1.1  christos     case GDB_EXC_BAD_ACCESS:
    562      1.1  christos       return _NSIG + EXC_BAD_ACCESS;
    563      1.1  christos #endif
    564      1.1  christos #if defined (EXC_BAD_INSTRUCTION) && defined (_NSIG)
    565      1.1  christos     case GDB_EXC_BAD_INSTRUCTION:
    566      1.1  christos       return _NSIG + EXC_BAD_INSTRUCTION;
    567      1.1  christos #endif
    568      1.1  christos #if defined (EXC_ARITHMETIC) && defined (_NSIG)
    569      1.1  christos     case GDB_EXC_ARITHMETIC:
    570      1.1  christos       return _NSIG + EXC_ARITHMETIC;
    571      1.1  christos #endif
    572      1.1  christos #if defined (EXC_EMULATION) && defined (_NSIG)
    573      1.1  christos     case GDB_EXC_EMULATION:
    574      1.1  christos       return _NSIG + EXC_EMULATION;
    575      1.1  christos #endif
    576      1.1  christos #if defined (EXC_SOFTWARE) && defined (_NSIG)
    577      1.1  christos     case GDB_EXC_SOFTWARE:
    578      1.1  christos       return _NSIG + EXC_SOFTWARE;
    579      1.1  christos #endif
    580      1.1  christos #if defined (EXC_BREAKPOINT) && defined (_NSIG)
    581      1.1  christos     case GDB_EXC_BREAKPOINT:
    582      1.1  christos       return _NSIG + EXC_BREAKPOINT;
    583      1.1  christos #endif
    584      1.1  christos 
    585      1.1  christos #if defined (SIGINFO)
    586      1.1  christos     case GDB_SIGNAL_INFO:
    587      1.1  christos       return SIGINFO;
    588      1.1  christos #endif
    589      1.1  christos #if defined (SIGLIBRT)
    590      1.1  christos     case GDB_SIGNAL_LIBRT:
    591      1.1  christos       return SIGLIBRT;
    592      1.1  christos #endif
    593      1.1  christos 
    594      1.1  christos     default:
    595      1.1  christos #if defined (REALTIME_LO)
    596      1.1  christos       retsig = 0;
    597      1.1  christos 
    598      1.1  christos       if (oursig >= GDB_SIGNAL_REALTIME_33
    599      1.1  christos 	  && oursig <= GDB_SIGNAL_REALTIME_63)
    600      1.1  christos 	{
    601  1.1.1.2  christos 	  /* This block of signals is continuous, and
    602      1.1  christos 	     GDB_SIGNAL_REALTIME_33 is 33 by definition.  */
    603      1.1  christos 	  retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_33 + 33;
    604      1.1  christos 	}
    605      1.1  christos       else if (oursig == GDB_SIGNAL_REALTIME_32)
    606      1.1  christos 	{
    607  1.1.1.2  christos 	  /* GDB_SIGNAL_REALTIME_32 isn't contiguous with
    608      1.1  christos 	     GDB_SIGNAL_REALTIME_33.  It is 32 by definition.  */
    609      1.1  christos 	  retsig = 32;
    610      1.1  christos 	}
    611      1.1  christos       else if (oursig >= GDB_SIGNAL_REALTIME_64
    612      1.1  christos 	  && oursig <= GDB_SIGNAL_REALTIME_127)
    613      1.1  christos 	{
    614  1.1.1.2  christos 	  /* This block of signals is continuous, and
    615      1.1  christos 	     GDB_SIGNAL_REALTIME_64 is 64 by definition.  */
    616      1.1  christos 	  retsig = (int) oursig - (int) GDB_SIGNAL_REALTIME_64 + 64;
    617      1.1  christos 	}
    618      1.1  christos 
    619      1.1  christos       if (retsig >= REALTIME_LO && retsig < REALTIME_HI)
    620      1.1  christos 	return retsig;
    621      1.1  christos #endif
    622      1.1  christos 
    623      1.1  christos       *oursig_ok = 0;
    624      1.1  christos       return 0;
    625      1.1  christos     }
    626      1.1  christos }
    627      1.1  christos 
    628      1.1  christos int
    629      1.1  christos gdb_signal_to_host_p (enum gdb_signal oursig)
    630      1.1  christos {
    631      1.1  christos   int oursig_ok;
    632      1.1  christos   do_gdb_signal_to_host (oursig, &oursig_ok);
    633      1.1  christos   return oursig_ok;
    634      1.1  christos }
    635      1.1  christos 
    636      1.1  christos int
    637      1.1  christos gdb_signal_to_host (enum gdb_signal oursig)
    638      1.1  christos {
    639      1.1  christos   int oursig_ok;
    640      1.1  christos   int targ_signo = do_gdb_signal_to_host (oursig, &oursig_ok);
    641      1.1  christos   if (!oursig_ok)
    642      1.1  christos     {
    643  1.1.1.2  christos       /* The user might be trying to do "signal SIGSAK" where this system
    644      1.1  christos 	 doesn't have SIGSAK.  */
    645      1.1  christos       warning (_("Signal %s does not exist on this system."),
    646      1.1  christos 	       gdb_signal_to_name (oursig));
    647      1.1  christos       return 0;
    648      1.1  christos     }
    649      1.1  christos   else
    650      1.1  christos     return targ_signo;
    651                    }
    652