diff --git a/sys/ddb/db_break.c b/sys/ddb/db_break.c --- a/sys/ddb/db_break.c +++ b/sys/ddb/db_break.c @@ -39,6 +39,8 @@ #include #include +#include + #include #include #include @@ -245,11 +247,45 @@ db_set_breakpoint(db_map_addr(addr), (db_addr_t)addr, count); } +#ifdef HAS_HW_BREAKPOINT +/* Delete hardware breakpoint */ +void +db_deletehbreak_cmd(db_expr_t addr, bool have_addr, db_expr_t count, + char *modif) +{ + int rc; + + if (count == -1) + count = 1; + + rc = kdb_cpu_clr_breakpoint(addr, count); + if (rc < 0) + db_printf("hardware breakpoint could not be delete\n"); +} + +/* Set hardware breakpoint */ +void +db_hbreakpoint_cmd(db_expr_t addr, bool have_addr, db_expr_t count, char *modif) +{ + int rc; + + if (count == -1) + count = 1; + + rc = kdb_cpu_set_breakpoint(addr, count); + if (rc < 0) + db_printf("hardware breakpoint could not be set\n"); +} +#endif + /* list breakpoints */ void db_listbreak_cmd(db_expr_t dummy1, bool dummy2, db_expr_t dummy3, char *dummy4) { db_list_breakpoints(); +#ifdef HAS_HW_BREAKPOINT + db_md_list_breakpoints(); +#endif } /* diff --git a/sys/ddb/db_command.c b/sys/ddb/db_command.c --- a/sys/ddb/db_command.c +++ b/sys/ddb/db_command.c @@ -126,6 +126,10 @@ DB_CMD("delete", db_delete_cmd, 0), DB_CMD("d", db_delete_cmd, 0), DB_CMD("dump", db_dump, DB_CMD_MEMSAFE), +#ifdef HAS_HW_BREAKPOINT + DB_CMD("dhbreak", db_deletehbreak_cmd, 0), + DB_CMD("hbreak", db_hbreakpoint_cmd, 0), +#endif DB_CMD("break", db_breakpoint_cmd, 0), DB_CMD("b", db_breakpoint_cmd, 0), DB_CMD("dwatch", db_deletewatch_cmd, 0), diff --git a/sys/ddb/ddb.h b/sys/ddb/ddb.h --- a/sys/ddb/ddb.h +++ b/sys/ddb/ddb.h @@ -298,6 +298,13 @@ db_cmdfcn_t db_watchpoint_cmd; db_cmdfcn_t db_write_cmd; +#ifdef HAS_HW_BREAKPOINT +void db_md_list_breakpoints(void); + +db_cmdfcn_t db_deletehbreak_cmd; +db_cmdfcn_t db_hbreakpoint_cmd; +#endif + /* * Interface between DDB and the DDB output capture facility. */