summaryrefslogtreecommitdiffstats
path: root/sys/ddb
diff options
context:
space:
mode:
authordfr <dfr@FreeBSD.org>2001-09-15 11:06:07 +0000
committerdfr <dfr@FreeBSD.org>2001-09-15 11:06:07 +0000
commit01ee11f4089db73bd35056711623d696d285dc94 (patch)
tree436c5cb5980e2a98d7b1f21477fbda20cf5f27ed /sys/ddb
parent5330a2f5be549ed9795bcd65dfa6b7a02d8e59ee (diff)
downloadFreeBSD-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')
-rw-r--r--sys/ddb/db_break.c51
-rw-r--r--sys/ddb/db_break.h6
-rw-r--r--sys/ddb/db_run.c4
3 files changed, 36 insertions, 25 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 */
diff --git a/sys/ddb/db_break.h b/sys/ddb/db_break.h
index 008acab..88520da 100644
--- a/sys/ddb/db_break.h
+++ b/sys/ddb/db_break.h
@@ -37,6 +37,10 @@
* Breakpoint.
*/
+#ifndef BKPT_INST_TYPE
+#define BKPT_INST_TYPE int
+#endif
+
struct db_breakpoint {
vm_map_t map; /* in this map */
db_addr_t address; /* set here */
@@ -45,7 +49,7 @@ struct db_breakpoint {
int flags; /* flags: */
#define BKPT_SINGLE_STEP 0x2 /* to simulate single step */
#define BKPT_TEMP 0x4 /* temporary */
- int bkpt_inst; /* saved instruction at bkpt */
+ BKPT_INST_TYPE bkpt_inst; /* saved instruction at bkpt */
struct db_breakpoint *link; /* link in in-use or free chain */
};
typedef struct db_breakpoint *db_breakpoint_t;
diff --git a/sys/ddb/db_run.c b/sys/ddb/db_run.c
index 2459eed..c17d0a4 100644
--- a/sys/ddb/db_run.c
+++ b/sys/ddb/db_run.c
@@ -104,8 +104,8 @@ db_stop_at_pc(is_breakpoint)
return (TRUE); /* stop here */
}
} else if (*is_breakpoint) {
-#ifdef __i386__ /* XXx */
- ddb_regs.tf_eip += 1;
+#ifdef BKPT_SKIP
+ BKPT_SKIP;
#endif
}
OpenPOWER on IntegriCloud