This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Debugging of signal handlers on m68k targets


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);
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]