Abstract i386_dr_low access

This commit adds macros to abstract access to the i386_dr_low
function vector used by i386-nat.c.  The macros are named so
as to match the names of the functions that do the same work
in gdbserver.

gdb/
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.

gdb/gdbserver/
2014-06-18  Gary Benson  <gbenson@redhat.com>

	* i386-low.c (i386_dr_low_can_set_addr): New macro.
	(i386_dr_low_can_set_control): Likewise.
	(i386_insert_aligned_watchpoint): New check.
This commit is contained in:
Gary Benson 2014-06-16 15:06:09 +01:00
parent d9305f7fef
commit 131aa0d4fe
4 changed files with 44 additions and 6 deletions

View File

@ -1,3 +1,16 @@
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>:

View File

@ -1,3 +1,9 @@
2014-06-18 Gary Benson <gbenson@redhat.com>
* i386-low.c (i386_dr_low_can_set_addr): New macro.
(i386_dr_low_can_set_control): Likewise.
(i386_insert_aligned_watchpoint): New check.
2014-06-18 Gary Benson <gbenson@redhat.com>
* i386-low.c (i386_update_inferior_debug_regs) <inf_state>:

View File

@ -32,6 +32,9 @@
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 *))
@ -273,6 +276,9 @@ i386_insert_aligned_watchpoint (struct i386_debug_reg_state *state,
{
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). */

View File

@ -47,6 +47,19 @@ static int debug_hw_points;
/* 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)
@ -379,7 +392,7 @@ i386_insert_aligned_watchpoint (struct i386_debug_reg_state *state,
{
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
@ -538,13 +551,13 @@ i386_update_inferior_debug_regs (struct i386_debug_reg_state *state,
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;
}
@ -698,7 +711,7 @@ i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
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)
{
@ -707,7 +720,7 @@ i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
if (!control_p)
{
control = i386_dr_low.get_control ();
control = i386_dr_low_get_control ();
control_p = 1;
}
@ -718,7 +731,7 @@ i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
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);