Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* Re: [ppc-linux-nat]: set access flag for h/w watchpoint even if it  is  only read or write
@ 2006-07-07  4:35 Wu Zhou
  2006-07-07 10:04 ` Eli Zaretskii
  0 siblings, 1 reply; 9+ messages in thread
From: Wu Zhou @ 2006-07-07  4:35 UTC (permalink / raw)
  To: Eli Zaretskii, Daniel Jacobowitz; +Cc: gdb-patches

Eli,

Just as Daniel said, my problem is not the same as yours. given the
following code:

   int var1 = 0, var2;
   var1 = 10;
   var2 = var1;

if we set read watchpoint on var1, it should stop at "var2 = var1", but
gdb are using "watchpoint_check" to see if the watched variable are
changed or not, if it is changed, then it assumes the watched variable is
writed; if not, it assumes the watched variable is read.

Because when execution get to "var1=10", it won't trigger a watchpoint,
the old value stored in var1 is still 0, so watchpoint_check will get a
wrong conclusion that var1 is changed to 10 by this instruction.  So it
won't treat it as a read watchpoint hit.

My solution is to let gdb update the value stored in the watched variable,
so that it always get the fresh value for comparison.

Another solution might be to change the verify logic of read watchpoint
hit in watchpoint_check.  Maybe we can just trust the underlying os will
only trigger in read hit?

Still another is like what Daniel and you said, we can let the target to
tell what kind of hit it is on the watched variable.  As for this, I can
figure out two methods at this time: the kernel should transfer the
watchpoint type information to user space (maybe through siginfo), or
gdb iterate through all the watched variable to determine what kind of
watchpoint this is.  Both of these changes also involve the change in
watchpoint_check routine.

Comparing all these solution, my solution is the most simple one.  I mean,
it makes little change to the current code.  To address the slowdown, we
can still use the original flags for write hit.

What is your idea on this?

On Thu, 6 Jul 2006, Daniel Jacobowitz wrote:

> On Thu, Jul 06, 2006 at 11:58:58PM +0300, Eli Zaretskii wrote:
> > Yes, this problem is known on x86 and elsewhere.  The problem is
> > extremely rare, as reading and writing to the same address in the same
> > instruction is a hard-to-accomplish treat.  Wu, could you show a
> > real-life example of where this matters?
>
> I thought, though I may be misremembering, that it was actually a
> different problem.  Something like this:
>
> - We set a read watchpoint.  It does not trigger on writes.
>
> - An instruction writes to the location.
>
> - GDB stops, sees that it stopped at a watchpoint at the given address,
>   tries to determine what sort of watchpoint it was, determines that
>   the value had changed, and ignores the read watchpoint - the value
>   has changed since we last checked so this "must" have been a write
>   watchpoint.
>
> Is that plausible or nonsensical?
>
> --
> Daniel Jacobowitz
> CodeSourcery
>

Regards
- Wu Zhou


^ permalink raw reply	[flat|nested] 9+ messages in thread
* [ppc-linux-nat]: set access flag for h/w watchpoint even if it is  only read or write
@ 2006-06-09 15:40 Wu Zhou
  2006-07-06 13:20 ` Daniel Jacobowitz
  0 siblings, 1 reply; 9+ messages in thread
From: Wu Zhou @ 2006-06-09 15:40 UTC (permalink / raw)
  To: gdb-patches

Hello all,

I found a bug in the current ppc-linux h/w watchpoint implementation:  
when we set read watchpoint to some expression, if there are any write 
operation to it before a read operation is hit, watchpoint_check will see 
that its value is changed. So user won't see the watchpoint is hit.

I make one change to the SET_DEBUGREG operation: even if it is only 
read or write watchpoint, we still set access flag.  Then, no matter 
what operation is on the watched address, a SIGTRAP will be triggered. 
The gdb code itself can determine if it is a write operation or read 
operation.  If it is write, watchpoint_check routine can update the 
bs->value to the latest.  

Here is the patch.  Thanks for reviewing.

2006-06-09  Wu Zhou  <woodzltc@cn.ibm.com>

	* ppc-linux-nat.c (ppc_linux_insert_watchpoint): Set access flag for
	all hardware watchpoint.

--- ppc-linux-nat.c.orig	2006-06-09 14:53:35.000000000 +0800
+++ ppc-linux-nat.c	2006-06-09 15:04:12.000000000 +0800
@@ -821,22 +821,7 @@ ppc_linux_insert_watchpoint (CORE_ADDR a
   long dabr_value;
   ptid_t ptid = inferior_ptid;
 
-  dabr_value = addr & ~7;
-  switch (rw)
-    {
-    case hw_read:
-      /* Set read and translate bits.  */
-      dabr_value |= 5;
-      break;
-    case hw_write:
-      /* Set write and translate bits.  */
-      dabr_value |= 6;
-      break;
-    case hw_access:
-      /* Set read, write and translate bits.  */
-      dabr_value |= 7;
-      break;
-    }
+  dabr_value = addr | 7;
 
   tid = TIDGET (ptid);
   if (tid == 0)


:ADDPATCH ppc:

Regards
- Wu Zhou


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2006-07-08 19:36 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-07-07  4:35 [ppc-linux-nat]: set access flag for h/w watchpoint even if it is only read or write Wu Zhou
2006-07-07 10:04 ` Eli Zaretskii
2006-07-07 13:18   ` Daniel Jacobowitz
2006-07-07 15:08     ` Eli Zaretskii
2006-07-08 19:36       ` Ulrich Weigand
  -- strict thread matches above, loose matches on Subject: below --
2006-06-09 15:40 Wu Zhou
2006-07-06 13:20 ` Daniel Jacobowitz
2006-07-06 20:59   ` Eli Zaretskii
2006-07-06 21:37     ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox