Abstract i386_dr_low access
authorGary Benson <gbenson@redhat.com>
Mon, 16 Jun 2014 14:06:09 +0000 (15:06 +0100)
committerGary Benson <gbenson@redhat.com>
Wed, 18 Jun 2014 09:15:25 +0000 (10:15 +0100)
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.

gdb/ChangeLog
gdb/gdbserver/ChangeLog
gdb/gdbserver/i386-low.c
gdb/i386-nat.c

index 70b68abf987e8ab30399524c82e1feb963596e83..a012f95f91d0cbcfa334d463f896121d2a219f9c 100644 (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>:
index 7c72043089fd8e80f6ac9983d139c501ab68cd0f..8fb0e076fd7dbce2c7c109a898fec3d0dae94a4f 100644 (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>:
index 8c5083828f24358076977775be3c3c711d7026df..8d6f26ca0211907cb97e4489b2337dd02ca0d03b 100644 (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).  */
index a64cdab90ce2e87c6c448dc744c467a40c18dfa4..4282535b445dc4d921db839fe5df44ee25dc8447 100644 (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);