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

* Re: Debugging of signal handlers on m68k targets
  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
  0 siblings, 1 reply; 3+ messages in thread
From: Andreas Schwab @ 2007-04-20 12:19 UTC (permalink / raw)
  To: Mark Shinwell; +Cc: gdb-patches

Mark Shinwell <shinwell@codesourcery.com> writes:

> 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.

Ok.

>
>
> === 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)

You'll also need to add $(auxv_h).

Andreas.

-- 
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux Products GmbH, Maxfeldstraße 5, 90409 Nürnberg, Germany
PGP key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


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

* Re: Debugging of signal handlers on m68k targets
  2007-04-20 12:19 ` Andreas Schwab
@ 2007-04-20 23:33   ` Mark Shinwell
  0 siblings, 0 replies; 3+ messages in thread
From: Mark Shinwell @ 2007-04-20 23:33 UTC (permalink / raw)
  To: Andreas Schwab; +Cc: gdb-patches

Andreas Schwab wrote:
>> === 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)
> 
> You'll also need to add $(auxv_h).

Ah yes.  I've fixed that and committed the patch (I'm afraid I
accidentally applied the ChangeLog entry to src/ChangeLog instead of
src/gdb/ChangeLog, but it is fixed now).

Thanks,
Mark


^ 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