diff options
Diffstat (limited to 'gdb/i386-nat.h')
-rw-r--r-- | gdb/i386-nat.h | 42 |
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 */ |