This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch 1/4] hw watchpoints code cleanups


Hi,

this is just some mechanical moving of code around to make the real code
changes later better visible.

This patch should have no functionality change effect.


Thanks,
Jan


gdb/
2010-12-06  Jan Kratochvil  <jan.kratochvil@redhat.com>

	Code cleanup.
	* amd64-linux-nat.c (amd64_linux_dr_get, amd64_linux_dr_set): Use
	parameter TID.
	(amd64_linux_dr_set_control_callback): New, split out from
	amd64_linux_dr_set_control.
	(amd64_linux_dr_set_control): Remove variables lp and ptid.  Replace
	ALL_LWPS by iterate_over_lwps.
	(struct amd64_linux_dr_set_addr_data): New.
	(amd64_linux_dr_set_addr_callback): New, split out from
	amd64_linux_dr_set_addr.
	(amd64_linux_dr_set_addr): Remove variables lp and ptid.  New variable
	data.  Replace ALL_LWPS by iterate_over_lwps.
	(amd64_linux_dr_get_status): New variable tid, use it.
	(amd64_linux_dr_unset_status_callback): New, split out from
	amd64_linux_dr_unset_status.
	(amd64_linux_dr_unset_status): Remove variables lp and ptid.  Replace
	ALL_LWPS by iterate_over_lwps.
	(amd64_linux_new_thread): New variable tid, use it.
	* i386-linux-nat.c (i386_linux_dr_get, i386_linux_dr_set): Use
	parameter TID.
	(i386_linux_dr_set_control_callback): New, split out from
	i386_linux_dr_set_control.
	(i386_linux_dr_set_control): Remove variables lp and ptid.  Replace
	ALL_LWPS by iterate_over_lwps.
	(struct i386_linux_dr_set_addr_data): New.
	(i386_linux_dr_set_addr_callback): New, split out from
	i386_linux_dr_set_addr.
	(i386_linux_dr_set_addr): Remove variables lp and ptid.  New variable
	data.  Replace ALL_LWPS by iterate_over_lwps.
	(i386_linux_dr_get_status): New variable tid, use it.
	(i386_linux_dr_unset_status_callback): New, split out from
	i386_linux_dr_unset_status.
	(i386_linux_dr_unset_status): Remove variables lp and ptid.  Replace
	ALL_LWPS by iterate_over_lwps.
	(i386_linux_new_thread): New variable tid, use it.
	* i386-nat.c: Include inferior.h.
	(struct dr_mirror): New.
	(I386_DR_VACANT): Replace by ...
	(dr_vacant): ... this one.  Update all the callers.
	(I386_DR_LOCAL_ENABLE): Replace by ...
	(dr_local_enable): ... this one.  Update all the callers.
	(I386_DR_GLOBAL_ENABLE): Remove.
	(I386_DR_DISABLE): Replace by ...
	(dr_disable): ... this one.  Update all the callers.
	(I386_DR_SET_RW_LEN): Replace by ...
	(dr_set_rw_len): ... this one.  Update all the callers.
	(I386_DR_GET_RW_LEN): Replace by ...
	(dr_get_rw_len): ... this one.  Update all the callers.
	(I386_DR_WATCH_HIT): Replace by ...
	(dr_watch_hit): ... this one.  Update all the callers.
	(dr_mirror, dr_status_mirror, dr_control_mirror, dr_ref_count):
	Remove, use struct dr_mirror instead in the callers.
	(dr_mirror_get): New function.
	(i386_cleanup_dregs, i386_show_dr, i386_insert_aligned_watchpoint)
	(i386_remove_aligned_watchpoint, i386_stopped_data_address): New
	variable dr_mirror, use it.
	* ppc-linux-nat.c (booke_insert_point_callback): New, split out from
	ppc_linux_insert_hw_breakpoint.
	(ppc_linux_insert_hw_breakpoint): Remove variables ptid and lp.
	Replace ALL_LWPS by iterate_over_lwps.
	(booke_remove_point_callback): New, split out from
	ppc_linux_remove_hw_breakpoint.
	(ppc_linux_remove_hw_breakpoint): Remove variables ptid and lp.
	Replace ALL_LWPS by iterate_over_lwps.
	(set_saved_dabr_value_callback): New, split out from
	ppc_linux_insert_watchpoint.
	(ppc_linux_insert_watchpoint, ppc_linux_remove_watchpoint): Remove
	variables lp and ptid.  Replace ALL_LWPS by iterate_over_lwps.

--- a/gdb/amd64-linux-nat.c
+++ b/gdb/amd64-linux-nat.c
@@ -268,15 +268,10 @@ amd64_linux_store_inferior_registers (struct target_ops *ops,
 static unsigned long amd64_linux_dr[DR_CONTROL + 1];
 
 static unsigned long
-amd64_linux_dr_get (ptid_t ptid, int regnum)
+amd64_linux_dr_get (int tid, int regnum)
 {
-  int tid;
   unsigned long value;
 
-  tid = TIDGET (ptid);
-  if (tid == 0)
-    tid = PIDGET (ptid);
-
   /* FIXME: kettenis/2001-03-27: Calling perror_with_name if the
      ptrace call fails breaks debugging remote targets.  The correct
      way to fix this is to add the hardware breakpoint and watchpoint
@@ -298,14 +293,8 @@ amd64_linux_dr_get (ptid_t ptid, int regnum)
 /* Set debug register REGNUM to VALUE in only the one LWP of PTID.  */
 
 static void
-amd64_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
+amd64_linux_dr_set (int tid, int regnum, unsigned long value)
 {
-  int tid;
-
-  tid = TIDGET (ptid);
-  if (tid == 0)
-    tid = PIDGET (ptid);
-
   errno = 0;
   ptrace (PTRACE_POKEUSER, tid,
 	  offsetof (struct user, u_debugreg[regnum]), value);
@@ -313,35 +302,69 @@ amd64_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
     perror_with_name (_("Couldn't write debug register"));
 }
 
-/* Set DR_CONTROL to ADDR in all LWPs of LWP_LIST.  */
+/* Helper for amd64_linux_dr_set_control.  */
+
+static int
+amd64_linux_dr_set_control_callback (struct lwp_info *lp, void *control_voidp)
+{
+  unsigned long control = (unsigned long) control_voidp;
+
+  amd64_linux_dr_set (GET_LWP (lp->ptid), DR_CONTROL, control);
+
+  /* Continue the traversal.  */
+  return 0;
+}
+
+/* Set DR_CONTROL to ADDR in all LWPs of CURRENT_INFERIOR.  */
 
 static void
 amd64_linux_dr_set_control (unsigned long control)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
-
   amd64_linux_dr[DR_CONTROL] = control;
-  ALL_LWPS (lp, ptid)
-    amd64_linux_dr_set (ptid, DR_CONTROL, control);
+
+  iterate_over_lwps (minus_one_ptid, amd64_linux_dr_set_control_callback,
+		     (void *) control);
+}
+
+/* Helper for amd64_linux_dr_set_addr.  */
+
+struct amd64_linux_dr_set_addr_data
+  {
+    int regnum;
+    CORE_ADDR addr;
+  };
+
+static int
+amd64_linux_dr_set_addr_callback (struct lwp_info *lp, void *datap_voidp)
+{
+  const struct amd64_linux_dr_set_addr_data *datap = datap_voidp;
+
+  amd64_linux_dr_set (GET_LWP (lp->ptid), DR_FIRSTADDR + datap->regnum,
+		      datap->addr);
+
+  /* Continue the traversal.  */
+  return 0;
 }
 
-/* Set address REGNUM (zero based) to ADDR in all LWPs of LWP_LIST.  */
+/* Set address REGNUM (zero based) to ADDR in all LWPs of CURRENT_INFERIOR.
+   */
 
 static void
 amd64_linux_dr_set_addr (int regnum, CORE_ADDR addr)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
+  struct amd64_linux_dr_set_addr_data data;
 
   gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
 
   amd64_linux_dr[DR_FIRSTADDR + regnum] = addr;
-  ALL_LWPS (lp, ptid)
-    amd64_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
+
+  data.regnum = regnum;
+  data.addr = addr;
+  iterate_over_lwps (minus_one_ptid, amd64_linux_dr_set_addr_callback, &data);
 }
 
-/* Set address REGNUM (zero based) to zero in all LWPs of LWP_LIST.  */
+/* Set address REGNUM (zero based) to zero in all LWPs of CURRENT_INFERIOR.
+   */
 
 static void
 amd64_linux_dr_reset_addr (int regnum)
@@ -354,37 +377,54 @@ amd64_linux_dr_reset_addr (int regnum)
 static unsigned long
 amd64_linux_dr_get_status (void)
 {
-  return amd64_linux_dr_get (inferior_ptid, DR_STATUS);
+  int tid;
+
+  tid = TIDGET (inferior_ptid);
+  if (tid == 0)
+    tid = PIDGET (inferior_ptid);
+
+  return amd64_linux_dr_get (tid, DR_STATUS);
 }
 
-/* Unset MASK bits in DR_STATUS in all LWPs of LWP_LIST.  */
+/* Helper for amd64_linux_dr_unset_status.  */
 
-static void
-amd64_linux_dr_unset_status (unsigned long mask)
+static int
+amd64_linux_dr_unset_status_callback (struct lwp_info *lp, void *mask_voidp)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
-
-  ALL_LWPS (lp, ptid)
-    {
-      unsigned long value;
+  unsigned long mask = (unsigned long) mask_voidp;
+  unsigned long value;
+  int tid = GET_LWP (lp->ptid);
       
-      value = amd64_linux_dr_get (ptid, DR_STATUS);
-      value &= ~mask;
-      amd64_linux_dr_set (ptid, DR_STATUS, value);
-    }
+  value = amd64_linux_dr_get (tid, DR_STATUS);
+  value &= ~mask;
+  amd64_linux_dr_set (tid, DR_STATUS, value);
+
+  /* Continue the traversal.  */
+  return 0;
 }
 
+/* Unset MASK bits in DR_STATUS in all LWPs of CURRENT_INFERIOR.  */
+
+static void
+amd64_linux_dr_unset_status (unsigned long mask)
+{
+  iterate_over_lwps (minus_one_ptid, amd64_linux_dr_unset_status_callback,
+				     (void *) mask);
+}
 
 static void
 amd64_linux_new_thread (ptid_t ptid)
 {
-  int i;
+  int i, tid;
+
+  tid = TIDGET (ptid);
+  if (tid == 0)
+    tid = PIDGET (ptid);
 
   for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
-    amd64_linux_dr_set (ptid, i, amd64_linux_dr[i]);
+    amd64_linux_dr_set (tid, i, amd64_linux_dr[i]);
 
-  amd64_linux_dr_set (ptid, DR_CONTROL, amd64_linux_dr[DR_CONTROL]);
+  amd64_linux_dr_set (tid, DR_CONTROL, amd64_linux_dr[DR_CONTROL]);
 }
 
 
--- a/gdb/i386-linux-nat.c
+++ b/gdb/i386-linux-nat.c
@@ -640,15 +640,10 @@ static unsigned long i386_linux_dr[DR_CONTROL + 1];
 /* Get debug register REGNUM value from only the one LWP of PTID.  */
 
 static unsigned long
-i386_linux_dr_get (ptid_t ptid, int regnum)
+i386_linux_dr_get (int tid, int regnum)
 {
-  int tid;
   unsigned long value;
 
-  tid = TIDGET (ptid);
-  if (tid == 0)
-    tid = PIDGET (ptid);
-
   /* FIXME: kettenis/2001-03-27: Calling perror_with_name if the
      ptrace call fails breaks debugging remote targets.  The correct
      way to fix this is to add the hardware breakpoint and watchpoint
@@ -670,14 +665,8 @@ i386_linux_dr_get (ptid_t ptid, int regnum)
 /* Set debug register REGNUM to VALUE in only the one LWP of PTID.  */
 
 static void
-i386_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
+i386_linux_dr_set (int tid, int regnum, unsigned long value)
 {
-  int tid;
-
-  tid = TIDGET (ptid);
-  if (tid == 0)
-    tid = PIDGET (ptid);
-
   errno = 0;
   ptrace (PTRACE_POKEUSER, tid,
 	  offsetof (struct user, u_debugreg[regnum]), value);
@@ -685,35 +674,69 @@ i386_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
     perror_with_name (_("Couldn't write debug register"));
 }
 
-/* Set DR_CONTROL to ADDR in all LWPs of LWP_LIST.  */
+/* Helper for i386_linux_dr_set_control.  */
+
+static int
+i386_linux_dr_set_control_callback (struct lwp_info *lp, void *control_voidp)
+{
+  unsigned long control = (unsigned long) control_voidp;
+
+  i386_linux_dr_set (GET_LWP (lp->ptid), DR_CONTROL, control);
+
+  /* Continue the traversal.  */
+  return 0;
+}
+
+/* Set DR_CONTROL to ADDR in all LWPs of CURRENT_INFERIOR.  */
 
 static void
 i386_linux_dr_set_control (unsigned long control)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
-
   i386_linux_dr[DR_CONTROL] = control;
-  ALL_LWPS (lp, ptid)
-    i386_linux_dr_set (ptid, DR_CONTROL, control);
+
+  iterate_over_lwps (minus_one_ptid, i386_linux_dr_set_control_callback,
+				     (void *) control);
 }
 
-/* Set address REGNUM (zero based) to ADDR in all LWPs of LWP_LIST.  */
+/* Helper for i386_linux_dr_set_addr.  */
+
+struct i386_linux_dr_set_addr_data
+  {
+    int regnum;
+    CORE_ADDR addr;
+  };
+
+static int
+i386_linux_dr_set_addr_callback (struct lwp_info *lp, void *datap_voidp)
+{
+  const struct i386_linux_dr_set_addr_data *datap = datap_voidp;
+
+  i386_linux_dr_set (GET_LWP (lp->ptid), DR_FIRSTADDR + datap->regnum,
+		     datap->addr);
+
+  /* Continue the traversal.  */
+  return 0;
+}
+
+/* Set address REGNUM (zero based) to ADDR in all LWPs of CURRENT_INFERIOR.
+   */
 
 static void
 i386_linux_dr_set_addr (int regnum, CORE_ADDR addr)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
+  struct i386_linux_dr_set_addr_data data;
 
   gdb_assert (regnum >= 0 && regnum <= DR_LASTADDR - DR_FIRSTADDR);
 
   i386_linux_dr[DR_FIRSTADDR + regnum] = addr;
-  ALL_LWPS (lp, ptid)
-    i386_linux_dr_set (ptid, DR_FIRSTADDR + regnum, addr);
+
+  data.regnum = regnum;
+  data.addr = addr;
+  iterate_over_lwps (minus_one_ptid, i386_linux_dr_set_addr_callback, &data);
 }
 
-/* Set address REGNUM (zero based) to zero in all LWPs of LWP_LIST.  */
+/* Set address REGNUM (zero based) to zero in all LWPs of CURRENT_INFERIOR.
+   */
 
 static void
 i386_linux_dr_reset_addr (int regnum)
@@ -726,36 +749,54 @@ i386_linux_dr_reset_addr (int regnum)
 static unsigned long
 i386_linux_dr_get_status (void)
 {
-  return i386_linux_dr_get (inferior_ptid, DR_STATUS);
+  int tid;
+
+  tid = TIDGET (inferior_ptid);
+  if (tid == 0)
+    tid = PIDGET (inferior_ptid);
+
+  return i386_linux_dr_get (tid, DR_STATUS);
 }
 
-/* Unset MASK bits in DR_STATUS in all LWPs of LWP_LIST.  */
+/* Helper for i386_linux_dr_unset_status.  */
+
+static int
+i386_linux_dr_unset_status_callback (struct lwp_info *lp, void *mask_voidp)
+{
+  unsigned long mask = (unsigned long) mask_voidp;
+  unsigned long value;
+  int tid = GET_LWP (lp->ptid);
+      
+  value = i386_linux_dr_get (tid, DR_STATUS);
+  value &= ~mask;
+  i386_linux_dr_set (tid, DR_STATUS, value);
+
+  /* Continue the traversal.  */
+  return 0;
+}
+
+/* Unset MASK bits in DR_STATUS in all LWPs of CURRENT_INFERIOR.  */
 
 static void
 i386_linux_dr_unset_status (unsigned long mask)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
-
-  ALL_LWPS (lp, ptid)
-    {
-      unsigned long value;
-      
-      value = i386_linux_dr_get (ptid, DR_STATUS);
-      value &= ~mask;
-      i386_linux_dr_set (ptid, DR_STATUS, value);
-    }
+  iterate_over_lwps (minus_one_ptid, i386_linux_dr_unset_status_callback,
+				     (void *) mask);
 }
 
 static void
 i386_linux_new_thread (ptid_t ptid)
 {
-  int i;
+  int i, tid;
+
+  tid = TIDGET (ptid);
+  if (tid == 0)
+    tid = PIDGET (ptid);
 
   for (i = DR_FIRSTADDR; i <= DR_LASTADDR; i++)
-    i386_linux_dr_set (ptid, i, i386_linux_dr[i]);
+    i386_linux_dr_set (tid, i, i386_linux_dr[i]);
 
-  i386_linux_dr_set (ptid, DR_CONTROL, i386_linux_dr[DR_CONTROL]);
+  i386_linux_dr_set (tid, DR_CONTROL, i386_linux_dr[DR_CONTROL]);
 }
 
 
--- a/gdb/i386-nat.c
+++ b/gdb/i386-nat.c
@@ -25,6 +25,7 @@
 #include "gdbcmd.h"
 #include "target.h"
 #include "gdb_assert.h"
+#include "inferior.h"
 
 /* Support for hardware watchpoints and breakpoints using the i386
    debug registers.
@@ -104,6 +105,19 @@ struct i386_dr_low_type i386_dr_low;
    FIXME: My Intel manual says we should use 0xF800, not 0xFC00.  */
 #define DR_CONTROL_RESERVED	(0xFC00)
 
+/* Copy of hardware debug registers for performance reasons.  */
+
+struct dr_mirror
+  {
+    /* Mirror the inferior's DRi registers.  We keep the status and
+       control registers separated because they don't hold addresses.  */
+    CORE_ADDR addr[DR_NADDR];
+    unsigned long status, control;
+
+    /* Reference counts for each debug register.  */
+    int ref_count[DR_NADDR];
+  };
+
 /* Auxiliary helper macros.  */
 
 /* A value that masks all fields in DR7 that are reserved by Intel.  */
@@ -111,49 +125,60 @@ struct i386_dr_low_type i386_dr_low;
 
 /* The I'th debug register is vacant if its Local and Global Enable
    bits are reset in the Debug Control register.  */
-#define I386_DR_VACANT(i) \
-  ((dr_control_mirror & (3 << (DR_ENABLE_SIZE * (i)))) == 0)
+
+static inline int
+dr_vacant (struct dr_mirror *dr_mirror, int i)
+{
+  return (dr_mirror->control & (3 << (DR_ENABLE_SIZE * i))) == 0;
+}
 
 /* Locally enable the break/watchpoint in the I'th debug register.  */
-#define I386_DR_LOCAL_ENABLE(i) \
-  dr_control_mirror |= (1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (i)))
 
-/* Globally enable the break/watchpoint in the I'th debug register.  */
-#define I386_DR_GLOBAL_ENABLE(i) \
-  dr_control_mirror |= (1 << (DR_GLOBAL_ENABLE_SHIFT + DR_ENABLE_SIZE * (i)))
+static inline void
+dr_local_enable (struct dr_mirror *dr_mirror, int i)
+{
+  dr_mirror->control |= 1 << (DR_LOCAL_ENABLE_SHIFT + DR_ENABLE_SIZE * i);
+}
 
 /* Disable the break/watchpoint in the I'th debug register.  */
-#define I386_DR_DISABLE(i) \
-  dr_control_mirror &= ~(3 << (DR_ENABLE_SIZE * (i)))
+
+static inline void
+dr_disable (struct dr_mirror *dr_mirror, int i)
+{
+  dr_mirror->control &= ~(3 << (DR_ENABLE_SIZE * i));
+}
 
 /* Set in DR7 the RW and LEN fields for the I'th debug register.  */
-#define I386_DR_SET_RW_LEN(i,rwlen) \
-  do { \
-    dr_control_mirror &= ~(0x0f << (DR_CONTROL_SHIFT+DR_CONTROL_SIZE*(i)));   \
-    dr_control_mirror |= ((rwlen) << (DR_CONTROL_SHIFT+DR_CONTROL_SIZE*(i))); \
-  } while (0)
+
+static inline void
+dr_set_rw_len (struct dr_mirror *dr_mirror, int i, unsigned rwlen)
+{
+  dr_mirror->control &= ~(0x0f << (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * i));
+  dr_mirror->control |= rwlen << (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * i);
+}
 
 /* Get from DR7 the RW and LEN fields for the I'th debug register.  */
-#define I386_DR_GET_RW_LEN(i) \
-  ((dr_control_mirror >> (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * (i))) & 0x0f)
+
+static inline unsigned
+dr_get_rw_len (struct dr_mirror *dr_mirror, int i)
+{
+  return ((dr_mirror->control >> (DR_CONTROL_SHIFT + DR_CONTROL_SIZE * i))
+	  & 0x0f);
+}
 
 /* Mask that this I'th watchpoint has triggered.  */
 #define I386_DR_WATCH_MASK(i)	(1 << (i))
 
 /* Did the watchpoint whose address is in the I'th register break?  */
-#define I386_DR_WATCH_HIT(i)	(dr_status_mirror & I386_DR_WATCH_MASK (i))
+static inline int
+dr_watch_hit (struct dr_mirror *dr_mirror, int i)
+{
+  return (dr_mirror->status & I386_DR_WATCH_MASK (i)) != 0;
+}
 
 /* A macro to loop over all debug registers.  */
 #define ALL_DEBUG_REGISTERS(i)	for (i = 0; i < DR_NADDR; i++)
 
-/* Mirror the inferior's DRi registers.  We keep the status and
-   control registers separated because they don't hold addresses.  */
-static CORE_ADDR dr_mirror[DR_NADDR];
-static unsigned long dr_status_mirror, dr_control_mirror;
-
-/* Reference counts for each debug register.  */
-static int dr_ref_count[DR_NADDR];
-
 /* Whether or not to print the mirrored debug registers.  */
 static int maint_show_dr;
 
@@ -198,18 +223,28 @@ static int i386_handle_nonaligned_watchpoint (i386_wp_op_t what,
 /* Clear the reference counts and forget everything we knew about the
    debug registers.  */
 
+static struct dr_mirror *
+dr_mirror_get (void)
+{
+  /* Intermediate patch stub.  */
+  static struct dr_mirror dr_mirror;
+
+  return &dr_mirror;
+}
+
 void
 i386_cleanup_dregs (void)
 {
+  struct dr_mirror *dr_mirror = dr_mirror_get ();
   int i;
 
   ALL_DEBUG_REGISTERS(i)
     {
-      dr_mirror[i] = 0;
-      dr_ref_count[i] = 0;
+      dr_mirror->addr[i] = 0;
+      dr_mirror->ref_count[i] = 0;
     }
-  dr_control_mirror = 0;
-  dr_status_mirror  = 0;
+  dr_mirror->control = 0;
+  dr_mirror->status = 0;
 }
 
 /* Print the values of the mirrored debug registers.  This is called
@@ -220,6 +255,7 @@ static void
 i386_show_dr (const char *func, CORE_ADDR addr,
 	      int len, enum target_hw_bp_type type)
 {
+  struct dr_mirror *dr_mirror = dr_mirror_get ();
   int addr_size = gdbarch_addr_bit (target_gdbarch) / 8;
   int i;
 
@@ -239,13 +275,16 @@ i386_show_dr (const char *func, CORE_ADDR addr,
 				: "??unknown??"))));
   puts_unfiltered (":\n");
   printf_unfiltered ("\tCONTROL (DR7): %s          STATUS (DR6): %s\n",
-		     phex (dr_control_mirror, 8), phex (dr_status_mirror, 8));
+		     phex (dr_mirror->control, 8),
+		     phex (dr_mirror->status, 8));
   ALL_DEBUG_REGISTERS(i)
     {
       printf_unfiltered ("\
 \tDR%d: addr=0x%s, ref.count=%d  DR%d: addr=0x%s, ref.count=%d\n",
-		 i, phex (dr_mirror[i], addr_size), dr_ref_count[i],
-		 i+1, phex (dr_mirror[i+1], addr_size), dr_ref_count[i+1]);
+			 i, phex (dr_mirror->addr[i], addr_size),
+			 dr_mirror->ref_count[i], i + 1,
+			 phex (dr_mirror->addr[i + 1], addr_size),
+			 dr_mirror->ref_count[i + 1]);
       i++;
     }
 }
@@ -311,6 +350,7 @@ Invalid hardware breakpoint length %d in i386_length_and_rw_bits.\n"), len);
 static int
 i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits)
 {
+  struct dr_mirror *dr_mirror = dr_mirror_get ();
   int i;
 
   if (!i386_dr_low.set_addr || !i386_dr_low.set_control)
@@ -321,11 +361,10 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits)
      reuse it for this watchpoint as well (and save a register).  */
   ALL_DEBUG_REGISTERS(i)
     {
-      if (!I386_DR_VACANT (i)
-	  && dr_mirror[i] == addr
-	  && I386_DR_GET_RW_LEN (i) == len_rw_bits)
+      if (!dr_vacant (dr_mirror, i) && dr_mirror->addr[i] == addr
+	  && dr_get_rw_len (dr_mirror, i) == len_rw_bits)
 	{
-	  dr_ref_count[i]++;
+	  dr_mirror->ref_count[i]++;
 	  return 0;
 	}
     }
@@ -333,7 +372,7 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits)
   /* Next, look for a vacant debug register.  */
   ALL_DEBUG_REGISTERS(i)
     {
-      if (I386_DR_VACANT (i))
+      if (dr_vacant (dr_mirror, i))
 	break;
     }
 
@@ -344,9 +383,9 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits)
   /* Now set up the register I to watch our region.  */
 
   /* Record the info in our local mirrored array.  */
-  dr_mirror[i] = addr;
-  dr_ref_count[i] = 1;
-  I386_DR_SET_RW_LEN (i, len_rw_bits);
+  dr_mirror->addr[i] = addr;
+  dr_mirror->ref_count[i] = 1;
+  dr_set_rw_len (dr_mirror, i, len_rw_bits);
   /* Note: we only enable the watchpoint locally, i.e. in the current
      task.  Currently, no i386 target allows or supports global
      watchpoints; however, if any target would want that in the
@@ -354,13 +393,13 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits)
      to enable watchpoints globally or locally, and the code below
      should use global or local enable and slow-down flags as
      appropriate.  */
-  I386_DR_LOCAL_ENABLE (i);
-  dr_control_mirror |= DR_LOCAL_SLOWDOWN;
-  dr_control_mirror &= I386_DR_CONTROL_MASK;
+  dr_local_enable (dr_mirror, i);
+  dr_mirror->control |= DR_LOCAL_SLOWDOWN;
+  dr_mirror->control &= I386_DR_CONTROL_MASK;
 
   /* Finally, actually pass the info to the inferior.  */
   i386_dr_low.set_addr (i, addr);
-  i386_dr_low.set_control (dr_control_mirror);
+  i386_dr_low.set_control (dr_mirror->control);
 
   /* Only a sanity check for leftover bits (set possibly only by inferior).  */
   if (i386_dr_low.unset_status)
@@ -378,21 +417,21 @@ i386_insert_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits)
 static int
 i386_remove_aligned_watchpoint (CORE_ADDR addr, unsigned len_rw_bits)
 {
+  struct dr_mirror *dr_mirror = dr_mirror_get ();
   int i, retval = -1;
 
   ALL_DEBUG_REGISTERS(i)
     {
-      if (!I386_DR_VACANT (i)
-	  && dr_mirror[i] == addr
-	  && I386_DR_GET_RW_LEN (i) == len_rw_bits)
+      if (!dr_vacant (dr_mirror, i) && dr_mirror->addr[i] == addr
+	  && dr_get_rw_len (dr_mirror, i) == len_rw_bits)
 	{
-	  if (--dr_ref_count[i] == 0) /* no longer in use? */
+	  if (--dr_mirror->ref_count[i] == 0) /* no longer in use? */
 	    {
 	      /* Reset our mirror.  */
-	      dr_mirror[i] = 0;
-	      I386_DR_DISABLE (i);
+	      dr_mirror->addr[i] = 0;
+	      dr_disable (dr_mirror, i);
 	      /* Reset it in the inferior.  */
-	      i386_dr_low.set_control (dr_control_mirror);
+	      i386_dr_low.set_control (dr_mirror->control);
 	      if (i386_dr_low.reset_addr)
 		i386_dr_low.reset_addr (i);
 	    }
@@ -554,26 +593,27 @@ i386_region_ok_for_watchpoint (CORE_ADDR addr, int len)
 static int
 i386_stopped_data_address (struct target_ops *ops, CORE_ADDR *addr_p)
 {
+  struct dr_mirror *dr_mirror = dr_mirror_get ();
   CORE_ADDR addr = 0;
   int i;
   int rc = 0;
 
-  dr_status_mirror = i386_dr_low.get_status ();
+  dr_mirror->status = i386_dr_low.get_status ();
 
   ALL_DEBUG_REGISTERS(i)
     {
-      if (I386_DR_WATCH_HIT (i)
+      if (dr_watch_hit (dr_mirror, i)
 	  /* This second condition makes sure DRi is set up for a data
 	     watchpoint, not a hardware breakpoint.  The reason is
 	     that GDB doesn't call the target_stopped_data_address
 	     method except for data watchpoints.  In other words, I'm
 	     being paranoiac.  */
-	  && I386_DR_GET_RW_LEN (i) != 0
+	  && dr_get_rw_len (dr_mirror, i) != 0
 	  /* This third condition makes sure DRi is not vacant, this
 	     avoids false positives in windows-nat.c.  */
-	  && !I386_DR_VACANT (i))
+	  && !dr_vacant (dr_mirror, i))
 	{
-	  addr = dr_mirror[i];
+	  addr = dr_mirror->addr[i];
 	  rc = 1;
 	  if (maint_show_dr)
 	    i386_show_dr ("watchpoint_hit", addr, -1, hw_write);
--- a/gdb/ppc-linux-nat.c
+++ b/gdb/ppc-linux-nat.c
@@ -1621,11 +1621,20 @@ booke_remove_point (struct ppc_hw_breakpoint *b, int tid)
 }
 
 static int
+booke_insert_point_callback (struct lwp_info *lp, void *pp_voidp)
+{
+  struct ppc_hw_breakpoint *pp = pp_voidp;
+
+  booke_insert_point (pp, GET_LWP (lp->ptid));
+
+  /* Continue the traversal.  */
+  return 0;
+}
+
+static int
 ppc_linux_insert_hw_breakpoint (struct gdbarch *gdbarch,
 				  struct bp_target_info *bp_tgt)
 {
-  ptid_t ptid;
-  struct lwp_info *lp;
   struct ppc_hw_breakpoint p;
 
   if (!have_ptrace_booke_interface ())
@@ -1639,9 +1648,19 @@ ppc_linux_insert_hw_breakpoint (struct gdbarch *gdbarch,
   p.addr2           = 0;
   p.condition_value = 0;
 
-  ALL_LWPS (lp, ptid)
-    booke_insert_point (&p, TIDGET (ptid));
+  iterate_over_lwps (minus_one_ptid, booke_insert_point_callback, &p);
+
+  return 0;
+}
+
+static int
+booke_remove_point_callback (struct lwp_info *lp, void *pp_voidp)
+{
+  struct ppc_hw_breakpoint *pp = pp_voidp;
+
+  booke_remove_point (pp, GET_LWP (lp->ptid));
 
+  /* Continue the traversal.  */
   return 0;
 }
 
@@ -1649,8 +1668,6 @@ static int
 ppc_linux_remove_hw_breakpoint (struct gdbarch *gdbarch,
 				  struct bp_target_info *bp_tgt)
 {
-  ptid_t ptid;
-  struct lwp_info *lp;
   struct ppc_hw_breakpoint p;
 
   if (!have_ptrace_booke_interface ())
@@ -1664,8 +1681,7 @@ ppc_linux_remove_hw_breakpoint (struct gdbarch *gdbarch,
   p.addr2           = 0;
   p.condition_value = 0;
 
-  ALL_LWPS (lp, ptid)
-    booke_remove_point (&p, TIDGET (ptid));
+  iterate_over_lwps (minus_one_ptid, booke_remove_point_callback, &p);
 
   return 0;
 }
@@ -1879,11 +1895,22 @@ ppc_linux_can_accel_watchpoint_condition (CORE_ADDR addr, int len, int rw,
 }
 
 static int
+set_saved_dabr_value_callback (struct lwp_info *lp, void *retp_voidp)
+{
+  int *retp = retp_voidp;
+
+  if (ptrace (PTRACE_SET_DEBUGREG, GET_LWP (lp->ptid), 0, saved_dabr_value)
+      < 0)
+    *retp = -1;
+
+  /* Continue the traversal.  */
+  return 0;
+}
+
+static int
 ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw,
 			     struct expression *cond)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
   int ret = -1;
 
   if (have_ptrace_booke_interface ())
@@ -1907,8 +1934,7 @@ ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw,
       p.addr            = (uint64_t) addr;
       p.addr2           = 0;
 
-      ALL_LWPS (lp, ptid)
-	booke_insert_point (&p, TIDGET (ptid));
+      iterate_over_lwps (minus_one_ptid, booke_insert_point_callback, &p);
 
       ret = 0;
     }
@@ -1951,12 +1977,8 @@ ppc_linux_insert_watchpoint (CORE_ADDR addr, int len, int rw,
 
       saved_dabr_value = dabr_value;
 
-      ALL_LWPS (lp, ptid)
-	if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0,
-		    saved_dabr_value) < 0)
-	  return -1;
-
       ret = 0;
+      iterate_over_lwps (minus_one_ptid, set_saved_dabr_value_callback, &ret);
     }
 
   return ret;
@@ -1966,8 +1988,6 @@ static int
 ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw,
 			     struct expression *cond)
 {
-  struct lwp_info *lp;
-  ptid_t ptid;
   int ret = -1;
 
   if (have_ptrace_booke_interface ())
@@ -1991,20 +2011,16 @@ ppc_linux_remove_watchpoint (CORE_ADDR addr, int len, int rw,
       p.addr            = (uint64_t) addr;
       p.addr2           = 0;
 
-      ALL_LWPS (lp, ptid)
-	booke_remove_point (&p, TIDGET (ptid));
+      iterate_over_lwps (minus_one_ptid, booke_remove_point_callback, &p);
 
       ret = 0;
     }
   else
     {
       saved_dabr_value = 0;
-      ALL_LWPS (lp, ptid)
-	if (ptrace (PTRACE_SET_DEBUGREG, TIDGET (ptid), 0,
-		    saved_dabr_value) < 0)
-	  return -1;
 
       ret = 0;
+      iterate_over_lwps (minus_one_ptid, set_saved_dabr_value_callback, &ret);
     }
 
   return ret;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]