* mips-tdep.c (mips_software_single_step): New function.

* config/mips/tm-mips.h: Add prototype for
        mips_software_single_step.
This commit is contained in:
Daniel Jacobowitz 2001-07-05 23:30:43 +00:00
parent 2ac44c7030
commit 9022177cbd
3 changed files with 36 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2001-07-05 Daniel Jacobowitz <drow@mvista.com>
* mips-tdep.c (mips_software_single_step): New function.
* config/mips/tm-mips.h: Add prototype for
mips_software_single_step.
2001-07-05 Daniel Jacobowitz <drow@mvista.com>
* ppc-linux-nat.c (supply_gregset): Use elf_greg_t instead

View File

@ -502,3 +502,6 @@ extern void mips_set_processor_type_command (char *, int);
/* MIPS sign extends addresses */
#define POINTER_TO_ADDRESS(TYPE,BUF) (signed_pointer_to_address (TYPE, BUF))
#define ADDRESS_TO_POINTER(TYPE,BUF,ADDR) (address_to_signed_pointer (TYPE, BUF, ADDR))
/* Single step based on where the current instruction will take us. */
extern void mips_software_single_step (enum target_signal, int);

View File

@ -1379,6 +1379,33 @@ mips_addr_bits_remove (CORE_ADDR addr)
return addr;
}
/* mips_software_single_step() is called just before we want to resume
the inferior, if we want to single-step it but there is no hardware
or kernel single-step support (MIPS on Linux for example). We find
the target of the coming instruction and breakpoint it.
single_step is also called just after the inferior stops. If we had
set up a simulated single-step, we undo our damage. */
void
mips_software_single_step (enum target_signal sig, int insert_breakpoints_p)
{
static CORE_ADDR next_pc;
typedef char binsn_quantum[BREAKPOINT_MAX];
static binsn_quantum break_mem;
CORE_ADDR pc;
if (insert_breakpoints_p)
{
pc = read_register (PC_REGNUM);
next_pc = mips_next_pc (pc);
target_insert_breakpoint (next_pc, break_mem);
}
else
target_remove_breakpoint (next_pc, break_mem);
}
static void
mips_init_frame_pc_first (int fromleaf, struct frame_info *prev)
{