aboutsummaryrefslogtreecommitdiff
path: root/gdb/mips-linux-tdep.c
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2008-07-27 20:52:42 +0000
committerDaniel Jacobowitz <drow@false.org>2008-07-27 20:52:42 +0000
commite38d4e1aae6fb86cfae320ae6ae9b2b48cd1ddb7 (patch)
treeac0abdedb377ac367e1d8496a86382aaf9bbeeba /gdb/mips-linux-tdep.c
parent0d600a79d88b480541093f06639eff6ea1c33ed6 (diff)
downloadgdb-e38d4e1aae6fb86cfae320ae6ae9b2b48cd1ddb7.zip
gdb-e38d4e1aae6fb86cfae320ae6ae9b2b48cd1ddb7.tar.gz
gdb-e38d4e1aae6fb86cfae320ae6ae9b2b48cd1ddb7.tar.bz2
* mips-linux-tdep.c (mips_linux_syscall_next_pc): New function.
(mips_linux_init_abi): Set tdep->syscall_next_pc. * mips-tdep.c (enum mips_fpu_type, struct gdbarch_tdep): Move to mips-tdep.h. (mips32_next_pc): Handle the syscall instruction. * mips-tdep.h (enum mips_fpu_type, struct gdbarch_tdep): New, from mips-tdep.c. Add syscall_next_pc to gdbarch_tdep.
Diffstat (limited to 'gdb/mips-linux-tdep.c')
-rw-r--r--gdb/mips-linux-tdep.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/gdb/mips-linux-tdep.c b/gdb/mips-linux-tdep.c
index d631a7b..8f30aef 100644
--- a/gdb/mips-linux-tdep.c
+++ b/gdb/mips-linux-tdep.c
@@ -1101,6 +1101,26 @@ mips_linux_restart_reg_p (struct gdbarch *gdbarch)
return register_size (gdbarch, MIPS_RESTART_REGNUM) > 0;
}
+/* When FRAME is at a syscall instruction, return the PC of the next
+ instruction to be executed. */
+
+CORE_ADDR
+mips_linux_syscall_next_pc (struct frame_info *frame)
+{
+ CORE_ADDR pc = get_frame_pc (frame);
+ ULONGEST v0 = get_frame_register_unsigned (frame, MIPS_V0_REGNUM);
+
+ /* If we are about to make a sigreturn syscall, use the unwinder to
+ decode the signal frame. */
+ if (v0 == MIPS_NR_sigreturn
+ || v0 == MIPS_NR_rt_sigreturn
+ || v0 == MIPS_NR_N64_rt_sigreturn
+ || v0 == MIPS_NR_N32_rt_sigreturn)
+ return frame_pc_unwind (get_current_frame ());
+
+ return pc + 4;
+}
+
/* Initialize one of the GNU/Linux OS ABIs. */
static void
@@ -1175,6 +1195,8 @@ mips_linux_init_abi (struct gdbarch_info info,
set_gdbarch_core_read_description (gdbarch,
mips_linux_core_read_description);
+ tdep->syscall_next_pc = mips_linux_syscall_next_pc;
+
if (tdesc_data)
{
const struct tdesc_feature *feature;