summaryrefslogtreecommitdiff
path: root/ddb/db_watch.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2013-02-04 11:43:17 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2013-02-04 11:44:41 +0100
commit39376ba840a8682082eee9175b6951d4a7ae41f2 (patch)
tree09d99578313db44ba159bf14d33a38b577231711 /ddb/db_watch.c
parent43042e6f6cc483b22694619861eab183364f08f5 (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/db_watch.c')
-rw-r--r--ddb/db_watch.c13
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;
}