diff options
author | cognet <cognet@FreeBSD.org> | 2004-11-21 18:11:02 +0000 |
---|---|---|
committer | cognet <cognet@FreeBSD.org> | 2004-11-21 18:11:02 +0000 |
commit | 774795721abcc723b01400a6ab6a346139fcd6b8 (patch) | |
tree | d9de533f140cedbf16c08586e01e4b9fec24a3ce /sys/ddb/db_run.c | |
parent | 362677f869c625a0d2f034ec6c0fd1d8ae2a9e7a (diff) | |
download | FreeBSD-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.
Diffstat (limited to 'sys/ddb/db_run.c')
-rw-r--r-- | sys/ddb/db_run.c | 15 |
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) |