summaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorMark Kettenis <kettenis@gnu.org>2006-07-18 21:10:28 +0000
committerMark Kettenis <kettenis@gnu.org>2006-07-18 21:10:28 +0000
commitabfeb2a7dbbb274422397efacd13ed169f06505c (patch)
tree98747c4937476a49359e587ccdbbc687d8c00aeb /gdb
parent8b1adf1a5953308705b513eddc76960975a5a9ea (diff)
downloadgdb-abfeb2a7dbbb274422397efacd13ed169f06505c.tar.gz
* armobsd-tdep.c: Include "trad-frame.h" and "tramp-frame.h".
(armobsd_sigframe_init): New function. (armobsd_sigframe): New variable. (armobsd_init_abi): Prepend armobsd_sigframe unwinder. * Makefile.in (armobsd-tdep.o): Update dependencies.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/Makefile.in4
-rw-r--r--gdb/armobsd-tdep.c46
3 files changed, 56 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index fb1f2434a3f..f1b80c59910 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,11 @@
+2006-07-18 Mark Kettenis <kettenis@gnu.org>
+
+ * armobsd-tdep.c: Include "trad-frame.h" and "tramp-frame.h".
+ (armobsd_sigframe_init): New function.
+ (armobsd_sigframe): New variable.
+ (armobsd_init_abi): Prepend armobsd_sigframe unwinder.
+ * Makefile.in (armobsd-tdep.o): Update dependencies.
+
2006-07-18 Denis PILAT <denis.pilat@st.com>
* monitor.c: Remove unused prototypes.
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index d0d1ab1f397..93a9fd864b7 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -1783,8 +1783,8 @@ armnbsd-nat.o: armnbsd-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) \
$(regcache_h) $(target_h) $(gdb_string_h) $(arm_tdep_h) $(inf_ptrace_h)
armnbsd-tdep.o: armnbsd-tdep.c $(defs_h) $(osabi_h) $(gdb_string_h) \
$(arm_tdep_h) $(solib_svr4_h)
-armobsd-tdep.o: armobsd-tdep.c $(defs_h) $(osabi_h) \
- $(obsd_tdep_h) $(arm_tdep_h) $(solib_svr4_h)
+armobsd-tdep.o: armobsd-tdep.c $(defs_h) $(osabi_h) $(trad_frame_h) \
+ $(tramp_frame_h) $(obsd_tdep_h) $(arm_tdep_h) $(solib_svr4_h)
arm-tdep.o: arm-tdep.c $(defs_h) $(frame_h) $(inferior_h) $(gdbcmd_h) \
$(gdbcore_h) $(gdb_string_h) $(dis_asm_h) $(regcache_h) \
$(doublest_h) $(value_h) $(arch_utils_h) $(osabi_h) \
diff --git a/gdb/armobsd-tdep.c b/gdb/armobsd-tdep.c
index 64c83384e93..0f5e7a4007d 100644
--- a/gdb/armobsd-tdep.c
+++ b/gdb/armobsd-tdep.c
@@ -21,11 +21,55 @@
#include "defs.h"
#include "osabi.h"
+#include "trad-frame.h"
+#include "tramp-frame.h"
#include "obsd-tdep.h"
#include "arm-tdep.h"
#include "solib-svr4.h"
+/* Signal trampolines. */
+
+static void
+armobsd_sigframe_init (const struct tramp_frame *self,
+ struct frame_info *next_frame,
+ struct trad_frame_cache *cache,
+ CORE_ADDR func)
+{
+ CORE_ADDR sp, sigcontext_addr, addr;
+ int regnum;
+
+ /* We find the appropriate instance of `struct sigcontext' at a
+ fixed offset in the signal frame. */
+ sp = frame_unwind_register_signed (next_frame, ARM_SP_REGNUM);
+ sigcontext_addr = sp + 16;
+
+ /* PC. */
+ trad_frame_set_reg_addr (cache, ARM_PC_REGNUM, sigcontext_addr + 76);
+
+ /* GPRs. */
+ for (regnum = ARM_A1_REGNUM, addr = sigcontext_addr + 12;
+ regnum <= ARM_LR_REGNUM; regnum++, addr += 4)
+ trad_frame_set_reg_addr (cache, regnum, addr);
+
+ trad_frame_set_id (cache, frame_id_build (sp, func));
+}
+
+static const struct tramp_frame armobsd_sigframe =
+{
+ SIGTRAMP_FRAME,
+ 4,
+ {
+ { 0xe28d0010, -1 }, /* add r0, sp, #16 */
+ { 0xef000067, -1 }, /* swi SYS_sigreturn */
+ { 0xef000001, -1 }, /* swi SYS_exit */
+ { 0xeafffffc, -1 }, /* b . - 8 */
+ { TRAMP_SENTINEL_INSN, -1 }
+ },
+ armobsd_sigframe_init
+};
+
+
static void
armobsd_init_abi (struct gdbarch_info info,
struct gdbarch *gdbarch)
@@ -35,6 +79,8 @@ armobsd_init_abi (struct gdbarch_info info,
if (tdep->fp_model == ARM_FLOAT_AUTO)
tdep->fp_model = ARM_FLOAT_SOFT_VFP;
+ tramp_frame_prepend_unwinder (gdbarch, &armobsd_sigframe);
+
/* OpenBSD/arm uses SVR4-style shared libraries. */
set_solib_svr4_fetch_link_map_offsets
(gdbarch, svr4_ilp32_fetch_link_map_offsets);