summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorcognet <cognet@FreeBSD.org>2004-11-21 18:11:02 +0000
committercognet <cognet@FreeBSD.org>2004-11-21 18:11:02 +0000
commit774795721abcc723b01400a6ab6a346139fcd6b8 (patch)
treed9de533f140cedbf16c08586e01e4b9fec24a3ce
parent362677f869c625a0d2f034ec6c0fd1d8ae2a9e7a (diff)
downloadFreeBSD-src-774795721abcc723b01400a6ab6a346139fcd6b8.zip
FreeBSD-src-774795721abcc723b01400a6ab6a346139fcd6b8.tar.gz
Do not attempt to skip a breakpoint that is a result of a software single step,
or bad things happen.
-rw-r--r--sys/ddb/db_run.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/sys/ddb/db_run.c b/sys/ddb/db_run.c
index ab589d3..6f09593 100644
--- a/sys/ddb/db_run.c
+++ b/sys/ddb/db_run.c
@@ -71,6 +71,11 @@ void db_set_single_step(void);
void db_clear_single_step(void);
#endif
+#ifdef SOFTWARE_SSTEP
+db_breakpoint_t db_not_taken_bkpt = 0;
+db_breakpoint_t db_taken_bkpt = 0;
+#endif
+
boolean_t
db_stop_at_pc(is_breakpoint)
boolean_t *is_breakpoint;
@@ -78,10 +83,16 @@ db_stop_at_pc(is_breakpoint)
register db_addr_t pc;
register db_breakpoint_t bkpt;
+ pc = PC_REGS();
+#ifdef SOFTWARE_SSTEP
+ if ((db_not_taken_bkpt != 0 && pc == db_not_taken_bkpt->address)
+ || (db_taken_bkpt != 0 && pc == db_taken_bkpt->address))
+ *is_breakpoint = FALSE;
+#endif
+
db_clear_single_step();
db_clear_breakpoints();
db_clear_watchpoints();
- pc = PC_REGS();
#ifdef FIXUP_PC_AFTER_BREAK
if (*is_breakpoint) {
@@ -245,8 +256,6 @@ db_restart_at_pc(watchpt)
* we allocate a breakpoint and save it here.
* These breakpoints are deleted on return.
*/
-db_breakpoint_t db_not_taken_bkpt = 0;
-db_breakpoint_t db_taken_bkpt = 0;
void
db_set_single_step(void)
OpenPOWER on IntegriCloud