This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[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