* tramp-frame.h (struct tramp_frame): Allow for 16 instructions
authorMark Kettenis <kettenis@gnu.org>
Mon, 8 Aug 2005 20:59:19 +0000 (20:59 +0000)
committerMark Kettenis <kettenis@gnu.org>
Mon, 8 Aug 2005 20:59:19 +0000 (20:59 +0000)
instead of 8.
* m68kbsd-tdep.c: Include "frame.h", "trad-frame.h" and
"tramp-frame.h".
(m68kobsd_sigtramp_cache_init): New function.
(m68kbsd_aout_init_abi): Prepend m68kobsd_sigtramp unwinder.

gdb/ChangeLog
gdb/Makefile.in
gdb/m68kbsd-tdep.c

index 4331a31cc8604f488ca8d3758a8a91d6c099309f..019b4fbcb1614cb72b3a5ee43a4edbf076485556 100644 (file)
@@ -1,3 +1,12 @@
+2005-08-08  Mark Kettenis  <kettenis@gnu.org>
+
+       * tramp-frame.h (struct tramp_frame): Allow for 16 instructions
+       instead of 8.
+       * m68kbsd-tdep.c: Include "frame.h", "trad-frame.h" and
+       "tramp-frame.h".
+       (m68kobsd_sigtramp_cache_init): New function.
+       (m68kbsd_aout_init_abi): Prepend m68kobsd_sigtramp unwinder.
+
 2005-08-02  Fred Fish  <fnf@specifix.com>
 
        * defs.h (parse_frame_specification): Remove prototype.
index 112e2f505f53ea322d28cb01df6e425264b588a9..a8222ef5f1735887ae44e7e4c132ede05445964f 100644 (file)
@@ -2218,9 +2218,10 @@ m68hc11-tdep.o: m68hc11-tdep.c $(defs_h) $(frame_h) $(frame_unwind_h) \
 m68kbsd-nat.o: m68kbsd-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) \
        $(regcache_h) $(gdb_assert_h) $(m68k_tdep_h) $(inf_ptrace_h) \
        $(bsd_kvm_h)
-m68kbsd-tdep.o: m68kbsd-tdep.c $(defs_h) $(arch_utils_h) $(osabi_h) \
-       $(regcache_h) $(regset_h) $(gdb_assert_h) $(gdb_string_h) \
-       $(m68k_tdep_h) $(solib_svr4_h)
+m68kbsd-tdep.o: m68kbsd-tdep.c $(defs_h) $(arch_utils_h) $(frame_h) \
+       $(osabi_h) $(regcache_h) $(regset_h) $(trad_frame_h) \
+       $(tramp_frame_h)$(gdb_assert_h) $(gdb_string_h) $(m68k_tdep_h) \
+       $(solib_svr4_h)
 m68klinux-nat.o: m68klinux-nat.c $(defs_h) $(frame_h) $(inferior_h) \
        $(language_h) $(gdbcore_h) $(gdb_string_h) $(regcache_h) \
        $(m68k_tdep_h) $(gdb_stat_h) $(floatformat_h) $(target_h) \
index 73d968c8c594b5181a911190225271c4612545e9..2b2c8c45bd98eb3778a47df586e5f83fd2f82fa7 100644 (file)
 
 #include "defs.h"
 #include "arch-utils.h"
+#include "frame.h"
 #include "osabi.h"
 #include "regcache.h"
 #include "regset.h"
+#include "trad-frame.h"
+#include "tramp-frame.h"
 
 #include "gdb_assert.h"
 #include "gdb_string.h"
@@ -126,6 +129,61 @@ m68kbsd_regset_from_core_section (struct gdbarch *gdbarch,
 
   return NULL;
 }
+\f
+
+/* Signal trampolines.  */
+
+static void
+m68kobsd_sigtramp_cache_init (const struct tramp_frame *self,
+                             struct frame_info *next_frame,
+                             struct trad_frame_cache *this_cache,
+                             CORE_ADDR func)
+{
+  CORE_ADDR addr, base, pc;
+  int regnum;
+
+  base = frame_unwind_register_unsigned (next_frame, M68K_SP_REGNUM);
+
+  /* The 'addql #4,%sp' instruction at offset 8 adjusts the stack
+     pointer.  Adjust the frame base accordingly.  */
+  pc = frame_unwind_register_unsigned (next_frame, M68K_PC_REGNUM);
+  if ((pc - func) > 8)
+    base -= 4;
+
+  /* Get frame pointer, stack pointer, program counter and processor
+     state from `struct sigcontext'.  */
+  addr = get_frame_memory_unsigned (next_frame, base + 8, 4);
+  trad_frame_set_reg_addr (this_cache, M68K_FP_REGNUM, addr + 8);
+  trad_frame_set_reg_addr (this_cache, M68K_SP_REGNUM, addr + 12);
+  trad_frame_set_reg_addr (this_cache, M68K_PC_REGNUM, addr + 20);
+  trad_frame_set_reg_addr (this_cache, M68K_PS_REGNUM, addr + 24);
+
+  /* The sc_ap member of `struct sigcontext' points to additional
+     hardware state.  Here we find the missing registers.  */
+  addr = get_frame_memory_unsigned (next_frame, addr + 16, 4) + 4;
+  for (regnum = M68K_D0_REGNUM; regnum < M68K_FP_REGNUM; regnum++, addr += 4)
+    trad_frame_set_reg_addr (this_cache, regnum, addr);
+
+  /* Construct the frame ID using the function start.  */
+  trad_frame_set_id (this_cache, frame_id_build (base, func));
+}
+
+static const struct tramp_frame m68kobsd_sigtramp = {
+  SIGTRAMP_FRAME,
+  2,
+  {
+    { 0x206f, -1 }, { 0x000c, -1},     /* moveal %sp@(12),%a0 */
+    { 0x4e90, -1 },                    /* jsr %a0@ */
+    { 0x588f, -1 },                    /* addql #4,%sp */
+    { 0x4e41, -1 },                    /* trap #1 */
+    { 0x2f40, -1 }, { 0x0004, -1 },    /* moveal %d0,%sp@(4) */
+    { 0x7001, -1 },                    /* moveq #SYS_exit,%d0 */
+    { 0x4e40, -1 },                    /* trap #0 */
+    { TRAMP_SENTINEL_INSN, -1 }
+  },
+  m68kobsd_sigtramp_cache_init
+};
+\f
 
 static void
 m68kbsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
@@ -149,6 +207,8 @@ m68kbsd_aout_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
   m68kbsd_init_abi (info, gdbarch);
 
   tdep->struct_return = reg_struct_return;
+
+  tramp_frame_prepend_unwinder (gdbarch, &m68kobsd_sigtramp);
 }
 
 /* NetBSD ELF.  */