From e38d4e1aae6fb86cfae320ae6ae9b2b48cd1ddb7 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Sun, 27 Jul 2008 20:52:42 +0000 Subject: * 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. --- gdb/mips-linux-tdep.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'gdb/mips-linux-tdep.c') 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; -- cgit v1.1