diff options
author | dfr <dfr@FreeBSD.org> | 2001-09-15 11:06:07 +0000 |
---|---|---|
committer | dfr <dfr@FreeBSD.org> | 2001-09-15 11:06:07 +0000 |
commit | 01ee11f4089db73bd35056711623d696d285dc94 (patch) | |
tree | 436c5cb5980e2a98d7b1f21477fbda20cf5f27ed /sys/ddb/db_break.c | |
parent | 5330a2f5be549ed9795bcd65dfa6b7a02d8e59ee (diff) | |
download | FreeBSD-src-01ee11f4089db73bd35056711623d696d285dc94.zip FreeBSD-src-01ee11f4089db73bd35056711623d696d285dc94.tar.gz |
Fill out some gaps in ia64 DDB support. This involves generalising DDB's
breakpoint handling slightly to cope with the fact that ia64 instructions
are not located on byte boundaries.
Diffstat (limited to 'sys/ddb/db_break.c')
-rw-r--r-- | sys/ddb/db_break.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/sys/ddb/db_break.c b/sys/ddb/db_break.c index 9ac0001..d62d8c3 100644 --- a/sys/ddb/db_break.c +++ b/sys/ddb/db_break.c @@ -165,6 +165,19 @@ db_find_breakpoint_here(addr) static boolean_t db_breakpoints_inserted = TRUE; +#ifndef BKPT_WRITE +#define BKPT_WRITE(addr, storage) \ +do { \ + *storage = db_get_value(addr, BKPT_SIZE, FALSE); \ + db_put_value(addr, BKPT_SIZE, BKPT_SET(*storage)); \ +} while (0) +#endif + +#ifndef BKPT_CLEAR +#define BKPT_CLEAR(addr, storage) \ + db_put_value(addr, BKPT_SIZE, *storage) +#endif + void db_set_breakpoints() { @@ -172,18 +185,13 @@ db_set_breakpoints() if (!db_breakpoints_inserted) { - for (bkpt = db_breakpoint_list; - bkpt != 0; - bkpt = bkpt->link) - if (db_map_current(bkpt->map)) { - bkpt->bkpt_inst = db_get_value(bkpt->address, - BKPT_SIZE, - FALSE); - db_put_value(bkpt->address, - BKPT_SIZE, - BKPT_SET(bkpt->bkpt_inst)); - } - db_breakpoints_inserted = TRUE; + for (bkpt = db_breakpoint_list; + bkpt != 0; + bkpt = bkpt->link) + if (db_map_current(bkpt->map)) { + BKPT_WRITE(bkpt->address, &bkpt->bkpt_inst); + } + db_breakpoints_inserted = TRUE; } } @@ -194,13 +202,13 @@ db_clear_breakpoints() if (db_breakpoints_inserted) { - for (bkpt = db_breakpoint_list; - bkpt != 0; - bkpt = bkpt->link) - if (db_map_current(bkpt->map)) { - db_put_value(bkpt->address, BKPT_SIZE, bkpt->bkpt_inst); - } - db_breakpoints_inserted = FALSE; + for (bkpt = db_breakpoint_list; + bkpt != 0; + bkpt = bkpt->link) + if (db_map_current(bkpt->map)) { + BKPT_CLEAR(bkpt->address, &bkpt->bkpt_inst); + } + db_breakpoints_inserted = FALSE; } } @@ -228,8 +236,7 @@ db_set_temp_breakpoint(addr) bkpt->init_count = 1; bkpt->count = 1; - bkpt->bkpt_inst = db_get_value(bkpt->address, BKPT_SIZE, FALSE); - db_put_value(bkpt->address, BKPT_SIZE, BKPT_SET(bkpt->bkpt_inst)); + BKPT_WRITE(bkpt->address, &bkpt->bkpt_inst); return bkpt; } @@ -237,7 +244,7 @@ void db_delete_temp_breakpoint(bkpt) db_breakpoint_t bkpt; { - db_put_value(bkpt->address, BKPT_SIZE, bkpt->bkpt_inst); + BKPT_CLEAR(bkpt->address, &bkpt->bkpt_inst); db_breakpoint_free(bkpt); } #endif /* SOFTWARE_SSTEP */ |