This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Debugging of signal handlers on m68k targets
- From: Mark Shinwell <shinwell at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Thu, 19 Apr 2007 23:06:45 +0100
- Subject: 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 (¤t_target, AT_NULL, &dummy) > 0
+ && target_auxv_search (¤t_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);
}