From 6e3f70d70b1c88fb344b31ec6d3021b97d58302e Mon Sep 17 00:00:00 2001 From: Ulrich Weigand Date: Mon, 22 Jun 2009 17:14:43 +0000 Subject: [PATCH] * spu-tdep.c (spu_get_longjmp_target): New function. (spu_gdbarch_init): Install it. --- gdb/ChangeLog | 5 +++++ gdb/spu-tdep.c | 21 +++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 0ef577ec59e..6dbd41dca37 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,8 @@ +2009-06-22 Ulrich Weigand + + * spu-tdep.c (spu_get_longjmp_target): New function. + (spu_gdbarch_init): Install it. + 2009-06-22 H.J. Lu PR server/10306 diff --git a/gdb/spu-tdep.c b/gdb/spu-tdep.c index 949b4fdea41..d7c482bffc5 100644 --- a/gdb/spu-tdep.c +++ b/gdb/spu-tdep.c @@ -1329,6 +1329,26 @@ spu_software_single_step (struct frame_info *frame) return 1; } + +/* Longjmp support. */ + +static int +spu_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc) +{ + gdb_byte buf[4]; + CORE_ADDR jb_addr; + + /* Jump buffer is pointed to by the argument register $r3. */ + get_frame_register_bytes (frame, SPU_ARG1_REGNUM, 0, 4, buf); + jb_addr = extract_unsigned_integer (buf, 4); + if (target_read_memory (jb_addr, buf, 4)) + return 0; + + *pc = extract_unsigned_integer (buf, 4); + return 1; +} + + /* Target overlays for the SPU overlay manager. See the documentation of simple_overlay_update for how the @@ -2148,6 +2168,7 @@ spu_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) set_gdbarch_breakpoint_from_pc (gdbarch, spu_breakpoint_from_pc); set_gdbarch_cannot_step_breakpoint (gdbarch, 1); set_gdbarch_software_single_step (gdbarch, spu_software_single_step); + set_gdbarch_get_longjmp_target (gdbarch, spu_get_longjmp_target); /* Overlays. */ set_gdbarch_overlay_update (gdbarch, spu_overlay_update); -- 2.30.2