From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 15410 invoked by alias); 19 Apr 2007 22:06:58 -0000 Received: (qmail 15395 invoked by uid 22791); 19 Apr 2007 22:06:56 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Thu, 19 Apr 2007 23:06:54 +0100 Received: (qmail 13788 invoked from network); 19 Apr 2007 22:06:52 -0000 Received: from unknown (HELO ?10.0.0.2?) (shinwell@127.0.0.2) by mail.codesourcery.com with ESMTPA; 19 Apr 2007 22:06:52 -0000 Message-ID: <4627E7F5.2020706@codesourcery.com> Date: Fri, 20 Apr 2007 11:04:00 -0000 From: Mark Shinwell User-Agent: Thunderbird 2.0.0.0 (Macintosh/20070326) MIME-Version: 1.0 To: gdb-patches@sourceware.org Subject: Debugging of signal handlers on m68k targets Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit X-IsSubscribed: yes Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2007-04/txt/msg00298.txt.bz2 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 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 . */ 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); }