mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-08-02 19:46:09 +08:00
* 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:
@ -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;
|
||||
|
Reference in New Issue
Block a user