* ppcobsd-tdep.c: Update copyright year. Include "trad-frame.h"
authorMark Kettenis <kettenis@gnu.org>
Sat, 9 Apr 2005 11:39:38 +0000 (11:39 +0000)
committerMark Kettenis <kettenis@gnu.org>
Sat, 9 Apr 2005 11:39:38 +0000 (11:39 +0000)
and "tramp-frame.h".
(ppcobsd_sigtramp_cache_init): New function.
(ppcobsd_sigtramp): New variable.
(ppcobsd_init_abi): Prepend signal trampoline unwinder.
* Makefile.in (ppcobsd-tdep.o): Update dependencies.

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

index e28c37d2206509912069058086447c089eec50b6..aca860a26a0298837544ad539dcef728366c143c 100644 (file)
@@ -1,3 +1,12 @@
+2005-04-09  Mark Kettenis  <kettenis@gnu.org>
+
+       * ppcobsd-tdep.c: Update copyright year.  Include "trad-frame.h"
+       and "tramp-frame.h".
+       (ppcobsd_sigtramp_cache_init): New function.
+       (ppcobsd_sigtramp): New variable.
+       (ppcobsd_init_abi): Prepend signal trampoline unwinder.
+       * Makefile.in (ppcobsd-tdep.o): Update dependencies.
+
 2005-04-08  Andrew Cagney  <cagney@gnu.org>
 
        * MAINTAINERS (GDB/MI): Andrew Cagney, Elena Zannoni, and Fernando
index 2d390af16a348f70c3313a9f324079b53eece167..55341be69ba4d7246e64df025fee510374bb32a0 100644 (file)
@@ -2373,8 +2373,9 @@ ppcnbsd-tdep.o: ppcnbsd-tdep.c $(defs_h) $(gdbcore_h) $(regcache_h) \
 ppcobsd-nat.o: ppcobsd-nat.c $(defs_h) $(inferior_h) $(regcache_h) \
        $(ppc_tdep_h) $(ppcobsd_tdep_h)
 ppcobsd-tdep.o: ppcobsd-tdep.c $(defs_h) $(arch_utils_h) $(osabi_h) \
-       $(regcache_h) $(regset_h) $(gdb_assert_h) $(gdb_string_h) \
-       $(ppc_tdep_h) $(ppcobsd_tdep_h) $(solib_svr4_h)
+       $(regcache_h) $(regset_h) $(trad_frame_h_ $(tramp_frame_h) \
+       $(gdb_assert_h) $(gdb_string_h) $(ppc_tdep_h) $(ppcobsd_tdep_h) \
+       $(solib_svr4_h)
 ppc-sysv-tdep.o: ppc-sysv-tdep.c $(defs_h) $(gdbcore_h) $(inferior_h) \
        $(regcache_h) $(value_h) $(gdb_string_h) $(gdb_assert_h) \
        $(ppc_tdep_h) $(target_h) $(objfiles_h) $(infcall_h)
index 4266bf15904cf053319648efde62a1b6f8d112a0..82e23e66e0fb9c9a6a2986ad9089e7d4251b3df4 100644 (file)
@@ -1,6 +1,6 @@
 /* Target-dependent code for OpenBSD/powerpc.
 
-   Copyright 2004 Free Software Foundation, Inc.
+   Copyright 2004, 2005 Free Software Foundation, Inc.
 
    This file is part of GDB.
 
 #include "osabi.h"
 #include "regcache.h"
 #include "regset.h"
-#include "gdb_assert.h"
+#include "trad-frame.h"
+#include "tramp-frame.h"
 
+#include "gdb_assert.h"
 #include "gdb_string.h"
 
 #include "ppc-tdep.h"
@@ -111,6 +113,59 @@ ppcobsd_regset_from_core_section (struct gdbarch *gdbarch,
 }
 \f
 
+/* Signal trampolines.  */
+
+static void
+ppcobsd_sigtramp_cache_init (const struct tramp_frame *self,
+                            struct frame_info *next_frame,
+                            struct trad_frame_cache *this_cache,
+                            CORE_ADDR func)
+{
+  struct gdbarch *gdbarch = get_frame_arch (next_frame);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  CORE_ADDR addr, base;
+  int i;
+
+  base = frame_unwind_register_unsigned (next_frame, SP_REGNUM);
+  addr = base + 0x18 + 2 * tdep->wordsize;
+  for (i = 0; i < ppc_num_gprs; i++, addr += tdep->wordsize)
+    {
+      int regnum = i + tdep->ppc_gp0_regnum;
+      trad_frame_set_reg_addr (this_cache, regnum, addr);
+    }
+  trad_frame_set_reg_addr (this_cache, tdep->ppc_lr_regnum, addr);
+  addr += tdep->wordsize;
+  trad_frame_set_reg_addr (this_cache, tdep->ppc_cr_regnum, addr);
+  addr += tdep->wordsize;
+  trad_frame_set_reg_addr (this_cache, tdep->ppc_xer_regnum, addr);
+  addr += tdep->wordsize;
+  trad_frame_set_reg_addr (this_cache, tdep->ppc_ctr_regnum, addr);
+  addr += tdep->wordsize;
+  trad_frame_set_reg_addr (this_cache, PC_REGNUM, addr); /* SRR0? */
+  addr += tdep->wordsize;
+
+  /* Construct the frame ID using the function start.  */
+  trad_frame_set_id (this_cache, frame_id_build (base, func));
+}
+
+static const struct tramp_frame ppcobsd_sigtramp =
+{
+  SIGTRAMP_FRAME,
+  4,
+  {
+    { 0x3821fff0, -1 },                /* add r1,r1,-16 */
+    { 0x4e800021, -1 },                /* blrl */
+    { 0x38610018, -1 },                /* addi r3,r1,24 */
+    { 0x38000067, -1 },                /* li r0,103 */
+    { 0x44000002, -1 },                /* sc */
+    { 0x38000001, -1 },                /* li r0,1 */
+    { 0x44000002, -1 },                /* sc */
+    { TRAMP_SENTINEL_INSN, -1 }
+  },
+  ppcobsd_sigtramp_cache_init
+};
+
+\f
 static void
 ppcobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 {
@@ -120,6 +175,8 @@ ppcobsd_init_abi (struct gdbarch_info info, struct gdbarch *gdbarch)
 
   set_gdbarch_regset_from_core_section
     (gdbarch, ppcobsd_regset_from_core_section);
+
+  tramp_frame_prepend_unwinder (gdbarch, &ppcobsd_sigtramp);
 }
 \f