* 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.
This commit is contained in:
Daniel Jacobowitz
2008-07-27 20:52:42 +00:00
parent 0d600a79d8
commit e38d4e1aae
4 changed files with 88 additions and 41 deletions

View File

@ -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;