| 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 */
|
|
|