From 9022177cbdaf59a083c1fb3a6d5152fe308fd199 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Thu, 5 Jul 2001 23:30:43 +0000 Subject: [PATCH] * mips-tdep.c (mips_software_single_step): New function. * config/mips/tm-mips.h: Add prototype for mips_software_single_step. --- gdb/ChangeLog | 6 ++++++ gdb/config/mips/tm-mips.h | 3 +++ gdb/mips-tdep.c | 27 +++++++++++++++++++++++++++ 3 files changed, 36 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e1e5cb8c0f5..88fe9755336 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2001-07-05 Daniel Jacobowitz + + * 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 * ppc-linux-nat.c (supply_gregset): Use elf_greg_t instead diff --git a/gdb/config/mips/tm-mips.h b/gdb/config/mips/tm-mips.h index a2079509e44..a865e96223d 100644 --- a/gdb/config/mips/tm-mips.h +++ b/gdb/config/mips/tm-mips.h @@ -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); diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index c56d97e474a..d83c4d1c039 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -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) { -- 2.30.2