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]

[RFA-v2] Fix a windows bug if two watchpoints are used


  Considering the objections to my first patch, I
here submit another patch that
make i386_stopped_data_address
return as soon as one hit is found.

  The change in I386_DR_DISABLE is still 
useful for the second test inside the i386_stopped_data_address
function.

  This patch does fix my windows specific problem.

  Is this OK?

Pierre



2009-06-04  Pierre Muller  <muller@ics.u-strasbg.fr>

	* i386-nat.c (I386_DR_DISABLE): Also reset the
	RW_LEN part of the control register.
	(i386_stopped_data_address): Return at the first hit.

Index: i386-nat.c
===================================================================
RCS file: /cvs/src/src/gdb/i386-nat.c,v
retrieving revision 1.22
diff -u -p -r1.22 i386-nat.c
--- i386-nat.c	14 May 2009 09:37:00 -0000	1.22
+++ i386-nat.c	4 Jun 2009 06:25:20 -0000
@@ -124,8 +124,9 @@ struct i386_dr_low_type i386_dr_low;
 
 /* Disable the break/watchpoint in the I'th debug register.  */
 #define I386_DR_DISABLE(i) \
-  dr_control_mirror &= ~(3 << (DR_ENABLE_SIZE * (i)))
-
+  dr_control_mirror &= ~(3 << (DR_ENABLE_SIZE * (i)) | \
+		         0xf << (DR_CONTROL_SHIFT+DR_CONTROL_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 { \
@@ -542,7 +543,6 @@ i386_stopped_data_address (struct target
 {
   CORE_ADDR addr = 0;
   int i;
-  int rc = 0;
 
   dr_status_mirror = i386_dr_low.get_status ();
 
@@ -557,17 +557,16 @@ i386_stopped_data_address (struct target
 	  && I386_DR_GET_RW_LEN (i) != 0)
 	{
 	  addr = dr_mirror[i];
-	  rc = 1;
+	  *addr_p = addr;
 	  if (maint_show_dr)
 	    i386_show_dr ("watchpoint_hit", addr, -1, hw_write);
+	  return 1;
 	}
     }
-  if (maint_show_dr && addr == 0)
+  if (maint_show_dr)
     i386_show_dr ("stopped_data_addr", 0, 0, hw_write);
 
-  if (rc)
-    *addr_p = addr;
-  return rc;
+  return 0;
 }
 
 static int


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