*** empty log message ***
authorMichael Eager <eager@eagercon.com>
Mon, 11 Jun 2012 16:08:21 +0000 (16:08 +0000)
committerMichael Eager <eager@eagercon.com>
Mon, 11 Jun 2012 16:08:21 +0000 (16:08 +0000)
gdb/ChangeLog
gdb/mips-linux-tdep.c
gdb/mips-linux-tdep.h

index 4690790ae168498ad9e286107c6d6b80cb81f15a..b902a419a8fdafcbca3312650a6af582e2157afc 100644 (file)
@@ -1,3 +1,8 @@
+2012-06-11  Michael Eager  <eager@eagercon.com>
+
+       * mips-linux-tdep.c (mips_gdb_signal_from_target): New
+       * mips-linux-tdep.h (mips_signals): New
+
 2012-06-11  Tom Tromey  <tromey@redhat.com>
 
        * infrun.c (handle_inferior_event)
index c6512af7b1bdc163070e1595328dabe843ae7ec4..272e8d99acad5a27b5eab298cf6625ab10e112e2 100644 (file)
@@ -40,6 +40,7 @@
 #include "glibc-tdep.h"
 #include "linux-tdep.h"
 #include "xml-syscall.h"
+#include "gdb_signals.h"
 
 static struct target_so_ops mips_svr4_so_ops;
 
@@ -1330,6 +1331,96 @@ mips_linux_get_syscall_number (struct gdbarch *gdbarch,
   return ret;
 }
 
+/* Translate signals based on MIPS signal values.  
+   Adapted from gdb/common/signals.c.  */
+
+static enum gdb_signal
+mips_gdb_signal_from_target (struct gdbarch *gdbarch, int signo)
+{
+  switch (signo) 
+    {
+    case 0:
+      return GDB_SIGNAL_0;
+    case MIPS_SIGHUP:
+      return GDB_SIGNAL_HUP;
+    case MIPS_SIGINT:
+      return GDB_SIGNAL_INT;
+    case MIPS_SIGQUIT:
+      return GDB_SIGNAL_QUIT;
+    case MIPS_SIGILL:
+      return GDB_SIGNAL_ILL;
+    case MIPS_SIGTRAP:
+      return GDB_SIGNAL_TRAP;
+    case MIPS_SIGABRT:
+      return GDB_SIGNAL_ABRT;
+    case MIPS_SIGEMT:
+      return GDB_SIGNAL_EMT;
+    case MIPS_SIGFPE:
+      return GDB_SIGNAL_FPE;
+    case MIPS_SIGKILL:
+      return GDB_SIGNAL_KILL;
+    case MIPS_SIGBUS:
+      return GDB_SIGNAL_BUS;
+    case MIPS_SIGSEGV:
+      return GDB_SIGNAL_SEGV;
+    case MIPS_SIGSYS:
+      return GDB_SIGNAL_SYS;
+    case MIPS_SIGPIPE:
+      return GDB_SIGNAL_PIPE;
+    case MIPS_SIGALRM:
+      return GDB_SIGNAL_ALRM;
+    case MIPS_SIGTERM:
+      return GDB_SIGNAL_TERM;
+    case MIPS_SIGUSR1:
+      return GDB_SIGNAL_USR1;
+    case MIPS_SIGUSR2:
+      return GDB_SIGNAL_USR2;
+    case MIPS_SIGCHLD:
+      return GDB_SIGNAL_CHLD;
+    case MIPS_SIGPWR:
+      return GDB_SIGNAL_PWR;
+    case MIPS_SIGWINCH:
+      return GDB_SIGNAL_WINCH;
+    case MIPS_SIGURG:
+      return GDB_SIGNAL_URG;
+    case MIPS_SIGPOLL:
+      return GDB_SIGNAL_POLL;
+    case MIPS_SIGSTOP:
+      return GDB_SIGNAL_STOP;
+    case MIPS_SIGTSTP:
+      return GDB_SIGNAL_TSTP;
+    case MIPS_SIGCONT:
+      return GDB_SIGNAL_CONT;
+    case MIPS_SIGTTIN:
+      return GDB_SIGNAL_TTIN;
+    case MIPS_SIGTTOU:
+      return GDB_SIGNAL_TTOU;
+    case MIPS_SIGVTALRM:
+      return GDB_SIGNAL_VTALRM;
+    case MIPS_SIGPROF:
+      return GDB_SIGNAL_PROF;
+    case MIPS_SIGXCPU:
+      return GDB_SIGNAL_XCPU;
+    case MIPS_SIGXFSZ:
+      return GDB_SIGNAL_XFSZ;
+  }
+
+  if (signo >= MIPS_SIGRTMIN && signo <= MIPS_SIGRTMAX)
+    {
+      /* GDB_SIGNAL_REALTIME values are not contiguous, map parts of
+         the MIPS block to the respective GDB_SIGNAL_REALTIME blocks.  */
+      signo -= MIPS_SIGRTMIN;
+      if (signo == 0)
+       return GDB_SIGNAL_REALTIME_32;
+      else if (signo < 32)
+       return ((enum gdb_signal) (signo - 1 + (int) GDB_SIGNAL_REALTIME_33));
+      else
+       return ((enum gdb_signal) (signo - 32 + (int) GDB_SIGNAL_REALTIME_64));
+    }
+
+  return GDB_SIGNAL_UNKNOWN;
+}
+
 /* Initialize one of the GNU/Linux OS ABIs.  */
 
 static void
@@ -1414,6 +1505,9 @@ mips_linux_init_abi (struct gdbarch_info info,
   set_gdbarch_regset_from_core_section (gdbarch,
                                        mips_linux_regset_from_core_section);
 
+  set_gdbarch_gdb_signal_from_target (gdbarch,
+                                     mips_gdb_signal_from_target);
+
   tdep->syscall_next_pc = mips_linux_syscall_next_pc;
 
   if (tdesc_data)
index d9ee88286f86536ff8e03f195a1889429c8a3915..0a1a161da26a17d2e1b7a976964220b3eb229e99 100644 (file)
@@ -105,3 +105,45 @@ enum {
 /* Return 1 if MIPS_RESTART_REGNUM is usable.  */
 
 int mips_linux_restart_reg_p (struct gdbarch *gdbarch);
+
+/* MIPS Signals -- adapted from linux/arch/mips/include/asm/signal.h.  */
+
+enum mips_signals 
+  {
+    MIPS_SIGHUP    =  1,       /* Hangup (POSIX).  */
+    MIPS_SIGINT    =  2,       /* Interrupt (ANSI).  */
+    MIPS_SIGQUIT   =  3,       /* Quit (POSIX).  */
+    MIPS_SIGILL    =  4,       /* Illegal instruction (ANSI).  */
+    MIPS_SIGTRAP   =  5,       /* Trace trap (POSIX).  */
+    MIPS_SIGIOT    =  6,       /* IOT trap (4.2 BSD).  */
+    MIPS_SIGABRT   =  MIPS_SIGIOT, /* Abort (ANSI).  */
+    MIPS_SIGEMT    =  7,
+    MIPS_SIGFPE    =  8,       /* Floating-point exception (ANSI).  */
+    MIPS_SIGKILL   =  9,       /* Kill, unblockable (POSIX).  */
+    MIPS_SIGBUS    = 10,       /* BUS error (4.2 BSD).  */
+    MIPS_SIGSEGV   = 11,       /* Segmentation violation (ANSI).  */
+    MIPS_SIGSYS    = 12,
+    MIPS_SIGPIPE   = 13,       /* Broken pipe (POSIX).  */
+    MIPS_SIGALRM   = 14,       /* Alarm clock (POSIX).  */
+    MIPS_SIGTERM   = 15,       /* Termination (ANSI).  */
+    MIPS_SIGUSR1   = 16,       /* User-defined signal 1 (POSIX).  */
+    MIPS_SIGUSR2   = 17,       /* User-defined signal 2 (POSIX).  */
+    MIPS_SIGCHLD   = 18,       /* Child status has changed (POSIX).  */
+    MIPS_SIGCLD    = MIPS_SIGCHLD, /* Same as SIGCHLD (System V).  */
+    MIPS_SIGPWR    = 19,       /* Power failure restart (System V).  */
+    MIPS_SIGWINCH  = 20,       /* Window size change (4.3 BSD, Sun).  */
+    MIPS_SIGURG    = 21,       /* Urgent condition on socket (4.2 BSD).  */
+    MIPS_SIGIO     = 22,       /* I/O now possible (4.2 BSD).  */
+    MIPS_SIGPOLL   = MIPS_SIGIO, /* Pollable event occurred (System V).  */
+    MIPS_SIGSTOP   = 23,       /* Stop, unblockable (POSIX).  */
+    MIPS_SIGTSTP   = 24,       /* Keyboard stop (POSIX).  */
+    MIPS_SIGCONT   = 25,       /* Continue (POSIX).  */
+    MIPS_SIGTTIN   = 26,       /* Background read from tty (POSIX).  */
+    MIPS_SIGTTOU   = 27,       /* Background write to tty (POSIX).  */
+    MIPS_SIGVTALRM = 28,       /* Virtual alarm clock (4.2 BSD).  */
+    MIPS_SIGPROF   = 29,       /* Profiling alarm clock (4.2 BSD).  */
+    MIPS_SIGXCPU   = 30,       /* CPU limit exceeded (4.2 BSD).  */
+    MIPS_SIGXFSZ   = 31,       /* File size limit exceeded (4.2 BSD).  */
+    MIPS_SIGRTMIN  = 32,       /* Minimum RT signal.  */
+    MIPS_SIGRTMAX  = 128 - 1   /* Maximum RT signal.  */
+  };