diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2013-02-04 11:43:17 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2013-02-04 11:44:41 +0100 |
commit | 39376ba840a8682082eee9175b6951d4a7ae41f2 (patch) | |
tree | 09d99578313db44ba159bf14d33a38b577231711 /ddb | |
parent | 43042e6f6cc483b22694619861eab183364f08f5 (diff) |
Plug hw debug register support into kdb
Make the `watch' command use hw debug registers whenever possible.
* ddb/db_watch.c (db_set_hw_watchpoint, db_clear_hw_watchpoint): Add
functions prototypes.
(db_set_watchpoints): Try to call db_set_hw_watchpoint.
(db_clear_watchpoints): Call db_clear_hw_watchpoint.
* i386/i386/db_interface.c: Include <ddb/db_watch.h>
(db_set_hw_watchpoint): Take a db_watchpoint_t WATCH parameter instead of
its content. Remove support for clearing a debug register.
(db_clear_hw_watchpoint): Add function.
* i386/i386/db_interface.h: Include <ddb/db_watch.h>.
(db_set_hw_watchpoint): Fix function prototype.
(db_clear_hw_watchpoint): Add function prototype.
* i386/i386/db_machdep.h: Do not include <machine/db_interface.h>
Diffstat (limited to 'ddb')
-rw-r--r-- | ddb/db_watch.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/ddb/db_watch.c b/ddb/db_watch.c index 072f474..7eb9995 100644 --- a/ddb/db_watch.c +++ b/ddb/db_watch.c @@ -55,6 +55,9 @@ boolean_t db_watchpoints_inserted = TRUE; +extern boolean_t db_set_hw_watchpoint(db_watchpoint_t watch, unsigned hw_idx); +extern boolean_t db_clear_hw_watchpoint(unsigned hw_idx); + #define NWATCHPOINTS 100 struct db_watchpoint db_watch_table[NWATCHPOINTS]; db_watchpoint_t db_next_free_watchpoint = &db_watch_table[0]; @@ -264,9 +267,14 @@ db_set_watchpoints(void) { register db_watchpoint_t watch; vm_map_t map; + unsigned hw_idx = 0; if (!db_watchpoints_inserted) { for (watch = db_watchpoint_list; watch != 0; watch = watch->link) { + if (db_set_hw_watchpoint(watch, hw_idx)) { + hw_idx++; + continue; + } map = (watch->task)? watch->task->map: kernel_map; pmap_protect(map->pmap, trunc_page(watch->loaddr), @@ -280,6 +288,11 @@ db_set_watchpoints(void) void db_clear_watchpoints(void) { + unsigned hw_idx = 0; + + while (db_clear_hw_watchpoint(hw_idx)) + hw_idx++; + db_watchpoints_inserted = FALSE; } |