aboutsummaryrefslogtreecommitdiff
path: root/gdb/i386-nat.h
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/i386-nat.h')
-rw-r--r--gdb/i386-nat.h42
1 files changed, 35 insertions, 7 deletions
diff --git a/gdb/i386-nat.h b/gdb/i386-nat.h
index 819c6b8..1a75daa 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 */