Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Debugging of signal handlers on m68k targets
@ 2007-04-20 11:04 Mark Shinwell
  2007-04-20 12:19 ` Andreas Schwab
  0 siblings, 1 reply; 3+ messages in thread
From: Mark Shinwell @ 2007-04-20 11:04 UTC (permalink / raw)
  To: gdb-patches

This patch fixes a problem that manifests itself primarily when
debugging m68k uClinux targets.  If debugging a signal handler or
a callee thereof, failure can occur during backtracing since gdb's
description of the sigcontext structure does not match up with that
provided by the kernel.

This also fixes debugging on regular m68k Linux targets; there was
a typo in the sigcontext description there.

OK?

Mark

--


2007-04-19  Mark Shinwell  <shinwell@codesourcery.com>

	gdb/
	* Makefile.in: Adjust dependencies of m68klinux-tdep.c.
	* m68klinux-tdep.c (m68k_uclinux_sigcontext_reg_offset): New.
	(m68k_linux_sigcontext_reg_offset): Fix typo.
	(target_is_uclinux): New.
	(m68k_linux_inferior_created): New.
	(m68k_linux_get_sigtramp_info):  Check for uClinux or
	normal Linux.  Use m68k_uclinux_sigcontext_reg_offset for
   	uClinux.
	(_initialize_m68k_linux_tdep): Register
	m68k_linux_inferior_created.


=== gdb/Makefile.in
==================================================================
--- gdb/Makefile.in     (revision 169301)
+++ gdb/Makefile.in     (local)
@@ -2285,7 +2285,7 @@
         $(floatformat_h) $(frame_h) $(target_h) $(gdb_string_h) \
         $(gdbtypes_h) $(osabi_h) $(regcache_h) $(objfiles_h) $(symtab_h) \
         $(m68k_tdep_h) $(trad_frame_h) $(frame_unwind_h) $(glibc_tdep_h) \
-       $(solib_svr4_h)
+       $(solib_svr4_h) $(observer_h) $(elf_common_h)
  m68k-stub.o: m68k-stub.c
  m68k-tdep.o: m68k-tdep.c $(defs_h) $(dwarf2_frame_h) $(frame_h) \
         $(frame_base_h) $(frame_unwind_h) $(gdbtypes_h) $(symtab_h) \
=== gdb/m68klinux-tdep.c
==================================================================
--- gdb/m68klinux-tdep.c        (revision 169301)
+++ gdb/m68klinux-tdep.c        (local)
@@ -37,6 +37,9 @@
  #include "frame-unwind.h"
  #include "glibc-tdep.h"
  #include "solib-svr4.h"
+#include "auxv.h"
+#include "observer.h"
+#include "elf/common.h"


  /* Offsets (in target ints) into jmp_buf.  */

@@ -112,7 +115,7 @@
    -1,                          /* %a5 */
    -1,                          /* %fp */
    1 * 4,                       /* %sp */
-  5 * 4 + 2,                   /* %sr */
+  6 * 4,                       /* %sr */
    6 * 4 + 2,                   /* %pc */
    8 * 4,                       /* %fp0 */
    11 * 4,                      /* %fp1 */
@@ -127,6 +130,39 @@
    16 * 4                       /* %fpiaddr */
  };

+static int m68k_uclinux_sigcontext_reg_offset[M68K_NUM_REGS] =
+{
+  2 * 4,                       /* %d0 */
+  3 * 4,                       /* %d1 */
+  -1,                          /* %d2 */
+  -1,                          /* %d3 */
+  -1,                          /* %d4 */
+  -1,                          /* %d5 */
+  -1,                          /* %d6 */
+  -1,                          /* %d7 */
+  4 * 4,                       /* %a0 */
+  5 * 4,                       /* %a1 */
+  -1,                          /* %a2 */
+  -1,                          /* %a3 */
+  -1,                          /* %a4 */
+  6 * 4,                       /* %a5 */
+  -1,                          /* %fp */
+  1 * 4,                       /* %sp */
+  7 * 4,                       /* %sr */
+  7 * 4 + 2,                   /* %pc */
+  -1,                          /* %fp0 */
+  -1,                          /* %fp1 */
+  -1,                          /* %fp2 */
+  -1,                          /* %fp3 */
+  -1,                          /* %fp4 */
+  -1,                          /* %fp5 */
+  -1,                          /* %fp6 */
+  -1,                          /* %fp7 */
+  -1,                          /* %fpcr */
+  -1,                          /* %fpsr */
+  -1                           /* %fpiaddr */
+};
+
  /* From <asm/ucontext.h>.  */
  static int m68k_linux_ucontext_reg_offset[M68K_NUM_REGS] =
  {
@@ -173,6 +209,17 @@
    int *sc_reg_offset;
  };

+/* Nonzero if running on uClinux.  */
+static int target_is_uclinux;
+
+static void
+m68k_linux_inferior_created (struct target_ops *objfile, int from_tty)
+{
+  /* Record that we will need to re-evaluate whether we are running on
+     a uClinux or normal Linux target (see m68k_linux_get_sigtramp_info).  */
+  target_is_uclinux = -1;
+}
+
  static struct m68k_linux_sigtramp_info
  m68k_linux_get_sigtramp_info (struct frame_info *next_frame)
  {
@@ -180,6 +227,18 @@
    char buf[4];
    struct m68k_linux_sigtramp_info info;

+  if (target_is_uclinux == -1)
+    {
+      /* Determine whether we are running on a uClinux or normal Linux
+         target so we can use the correct sigcontext layouts.  */
+
+      CORE_ADDR dummy;
+
+      target_is_uclinux
+        = target_auxv_search (&current_target, AT_NULL, &dummy) > 0
+          && target_auxv_search (&current_target, AT_PAGESZ, &dummy) == 0;
+    }
+
    frame_unwind_register (next_frame, M68K_SP_REGNUM, buf);
    sp = extract_unsigned_integer (buf, 4);

@@ -189,7 +248,9 @@
    if (m68k_linux_pc_in_sigtramp (frame_pc_unwind (next_frame), 0) == 2)
      info.sc_reg_offset = m68k_linux_ucontext_reg_offset;
    else
-    info.sc_reg_offset = m68k_linux_sigcontext_reg_offset;
+    info.sc_reg_offset
+      = target_is_uclinux ? m68k_uclinux_sigcontext_reg_offset
+                         : m68k_linux_sigcontext_reg_offset;
    return info;
  }

@@ -319,4 +380,5 @@
  {
    gdbarch_register_osabi (bfd_arch_m68k, 0, GDB_OSABI_LINUX,
                           m68k_linux_init_abi);
+  observer_attach_inferior_created (m68k_linux_inferior_created);
  }


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-04-20 12:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-04-20 11:04 Debugging of signal handlers on m68k targets Mark Shinwell
2007-04-20 12:19 ` Andreas Schwab
2007-04-20 23:33   ` Mark Shinwell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox