2014-06-18 Gary Benson <gbenson@redhat.com>
+ * i386-nat.c (i386_dr_low_can_set_addr): New macro.
+ (i386_dr_low_can_set_control): Likewise.
+ (i386_dr_low_set_addr): Likewise.
+ (i386_dr_low_set_control): Likewise.
+ (i386_dr_low_get_addr): Likewise.
+ (i386_dr_low_get_status): Likewise.
+ (i386_dr_low_get_control): Likewise.
+ (i386_insert_aligned_watchpoint): Use new macros.
+ (i386_update_inferior_debug_regs): Likewise.
+ (i386_stopped_data_address): Likewise.
+
+2014-06-18 Gary Benson <gbenson@redhat.com>
+
* i386-nat.c (i386_update_inferior_debug_regs) <state>:
New parameter. All uses updated.
The functions below implement debug registers sharing by reference
counts, and allow to watch regions up to 16 bytes long. */
+#define i386_dr_low_can_set_addr() 1
+#define i386_dr_low_can_set_control() 1
+
/* Debug register size, in bytes. */
/* NOTE: sizeof (long) == 4 on win64. */
#define i386_get_debug_register_length() (sizeof (void *))
{
int i;
+ if (!i386_dr_low_can_set_addr () || !i386_dr_low_can_set_control ())
+ return -1;
+
/* First, look for an occupied debug register with the same address
and the same RW and LEN definitions. If we find one, we can
reuse it for this watchpoint as well (and save a register). */
/* Low-level function vector. */
struct i386_dr_low_type i386_dr_low;
+#define i386_dr_low_can_set_addr() (i386_dr_low.set_addr != NULL)
+#define i386_dr_low_can_set_control() (i386_dr_low.set_control != NULL)
+
+#define i386_dr_low_set_addr(new_state, i) \
+ (i386_dr_low.set_addr ((i), (new_state)->dr_mirror[(i)]))
+
+#define i386_dr_low_set_control(new_state) \
+ (i386_dr_low.set_control ((new_state)->dr_control_mirror))
+
+#define i386_dr_low_get_addr(i) (i386_dr_low.get_addr ((i)))
+#define i386_dr_low_get_status() (i386_dr_low.get_status ())
+#define i386_dr_low_get_control() (i386_dr_low.get_control ())
+
/* Debug register size, in bytes. */
#define i386_get_debug_register_length() \
(i386_dr_low.debug_register_length)
{
int i;
- if (!i386_dr_low.set_addr || !i386_dr_low.set_control)
+ if (!i386_dr_low_can_set_addr () || !i386_dr_low_can_set_control ())
return -1;
/* First, look for an occupied debug register with the same address
ALL_DEBUG_REGISTERS (i)
{
if (I386_DR_VACANT (new_state, i) != I386_DR_VACANT (state, i))
- i386_dr_low.set_addr (i, new_state->dr_mirror[i]);
+ i386_dr_low_set_addr (new_state, i);
else
gdb_assert (new_state->dr_mirror[i] == state->dr_mirror[i]);
}
if (new_state->dr_control_mirror != state->dr_control_mirror)
- i386_dr_low.set_control (new_state->dr_control_mirror);
+ i386_dr_low_set_control (new_state);
*state = *new_state;
}
was running when we last changed watchpoints, the mirror no
longer represents what was set in this thread's debug
registers. */
- status = i386_dr_low.get_status ();
+ status = i386_dr_low_get_status ();
ALL_DEBUG_REGISTERS (i)
{
if (!control_p)
{
- control = i386_dr_low.get_control ();
+ control = i386_dr_low_get_control ();
control_p = 1;
}
paranoiac. */
if (I386_DR_GET_RW_LEN (control, i) != 0)
{
- addr = i386_dr_low.get_addr (i);
+ addr = i386_dr_low_get_addr (i);
rc = 1;
if (debug_hw_points)
i386_show_dr (state, "watchpoint_hit", addr, -1, hw_write);