Index: gdb/i386-nat.h |
diff --git a/gdb/i386-nat.h b/gdb/i386-nat.h |
index 383dff43bb84f009717b2866abed33ef2da93af6..c06993c910dd3340b92c9ce5849c2096ea40c161 100644 |
--- a/gdb/i386-nat.h |
+++ b/gdb/i386-nat.h |
@@ -53,31 +53,54 @@ extern void i386_use_watchpoints (struct target_ops *); |
set_addr -- put an address into one debug |
register for all LWPs |
- reset_addr -- reset the address stored in |
- one debug register for all LWPs |
+ get_addr -- return the address in a given debug |
+ register of the current LWP |
get_status -- return the value of the debug |
status (DR6) register for current LWP |
- unset_status -- unset the specified bits of the debug |
- status (DR6) register for all LWPs |
+ get_control -- return the value of the debug |
+ control (DR7) register for current LWP |
Additionally, the native file should set the debug_register_length |
field to 4 or 8 depending on the number of bytes used for |
deubg registers. */ |
-struct i386_dr_low_type |
+struct i386_dr_low_type |
{ |
void (*set_control) (unsigned long); |
void (*set_addr) (int, CORE_ADDR); |
- void (*reset_addr) (int); |
+ CORE_ADDR (*get_addr) (int); |
unsigned long (*get_status) (void); |
- void (*unset_status) (unsigned long); |
+ unsigned long (*get_control) (void); |
int debug_register_length; |
}; |
extern struct i386_dr_low_type i386_dr_low; |
+/* Debug registers' indices. */ |
+#define DR_FIRSTADDR 0 |
+#define DR_LASTADDR 3 |
+#define DR_NADDR 4 /* The number of debug address registers. */ |
+#define DR_STATUS 6 /* Index of debug status register (DR6). */ |
+#define DR_CONTROL 7 /* Index of debug control register (DR7). */ |
+ |
+/* Global state needed to track h/w watchpoints. */ |
+ |
+struct i386_debug_reg_state |
+{ |
+ /* Mirror the inferior's DRi registers. We keep the status and |
+ control registers separated because they don't hold addresses. |
+ Note that since we can change these mirrors while threads are |
+ running, we never trust them to explain a cause of a trap. |
+ For that, we need to peek directly in the inferior registers. */ |
+ CORE_ADDR dr_mirror[DR_NADDR]; |
+ unsigned dr_status_mirror, dr_control_mirror; |
+ |
+ /* Reference counts for each debug register. */ |
+ int dr_ref_count[DR_NADDR]; |
+}; |
+ |
/* Use this function to set i386_dr_low debug_register_length field |
rather than setting it directly to check that the length is only |
set once. It also enables the 'maint set/show show-debug-regs' |
@@ -89,4 +112,9 @@ extern void i386_set_debug_register_length (int len); |
extern void i386_cleanup_dregs (void); |
+/* Return a pointer to the the local mirror of the inferior's debug |
+ registers. */ |
+ |
+extern struct i386_debug_reg_state *i386_debug_reg_state (void); |
+ |
#endif /* I386_NAT_H */ |