svn commit: r291407 - head/sys/ddb

Zbigniew Bodek zbb at FreeBSD.org
Fri Nov 27 19:04:01 UTC 2015


Author: zbb
Date: Fri Nov 27 19:03:59 2015
New Revision: 291407
URL: https://svnweb.freebsd.org/changeset/base/291407

Log:
  Add helper to catch single step debug event and distinguish it from bkpt
  
  Some architectures (including ARMv6/v7) do not have separate single step
  events and cannot see difference between breakpoint and single step.
  Add db_pc_is_singlestep() to avoid skipping instruction we stepped on
  to trigger debug event.
  This commit does not change the existing functionality but adds possibility
  to implement custom db_pc_is_singlestep().
  
  Reviewed by:   imp
  Submitted by:  Zbigniew Bodek <zbb at semihalf.com>
  Obtained from: Semihalf
  Sponsored by:  Juniper Networks Inc.
  Differential Revision: https://reviews.freebsd.org/D4036

Modified:
  head/sys/ddb/db_run.c

Modified: head/sys/ddb/db_run.c
==============================================================================
--- head/sys/ddb/db_run.c	Fri Nov 27 18:58:26 2015	(r291406)
+++ head/sys/ddb/db_run.c	Fri Nov 27 19:03:59 2015	(r291407)
@@ -65,16 +65,28 @@ int		db_inst_count;
 int		db_load_count;
 int		db_store_count;
 
+#ifdef SOFTWARE_SSTEP
+db_breakpoint_t	db_not_taken_bkpt = 0;
+db_breakpoint_t	db_taken_bkpt = 0;
+#endif
+
 #ifndef db_set_single_step
 void db_set_single_step(void);
 #endif
 #ifndef db_clear_single_step
 void db_clear_single_step(void);
 #endif
-
+#ifndef db_pc_is_singlestep
+static bool
+db_pc_is_singlestep(db_addr_t pc)
+{
 #ifdef SOFTWARE_SSTEP
-db_breakpoint_t	db_not_taken_bkpt = 0;
-db_breakpoint_t	db_taken_bkpt = 0;
+	if ((db_not_taken_bkpt != 0 && pc == db_not_taken_bkpt->address)
+	    || (db_taken_bkpt != 0 && pc == db_taken_bkpt->address))
+		return (true);
+#endif
+	return (false);
+}
 #endif
 
 bool
@@ -84,11 +96,9 @@ db_stop_at_pc(bool *is_breakpoint)
 	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))
+
+	if (db_pc_is_singlestep(pc))
 		*is_breakpoint = false;
-#endif
 
 	db_clear_single_step();
 	db_clear_breakpoints();


More information about the svn-src-all mailing list