xscale: check that wp length does not exceed address
commitebfb2f4f3715f264ae4474c1b2e78812d1625cdc
authorMike Dunn <mikedunn@newsguy.com>
Sun, 19 Sep 2010 21:48:51 +0000 (19 14:48 -0700)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Mon, 20 Sep 2010 07:21:12 +0000 (20 09:21 +0200)
tree8b0039ebc6504c0d6d44a7d805bddeaa33846b8f
parent7e888741d13e66b6b343b8f0839621107c5a2962
xscale: check that wp length does not exceed address

Hi everyone,

A while back I sent in a patch that adds support for watchpoint lengths greater
than four on xscale.  It's been working well, until the other day, when it
caused an unexpected debug exception.  Looking into this I realized there is a
case where it breaks: when the length arg is greater than the base address.
This is a consequence of the way the hardware works.  Don't see a work-around,
so I added code to xscale_add_watchpoint() to check for and disallow this
combination.

Some more detail... xscale watchpoint hardware does not support a length
directly.  Instead, a mask value can be specified (not to be confused with the
optional mask arg to the wp command, which xscale does not support).  Any bits
set in the mask are ignored when the watchpoint hardware compares the access
address to the watchpoint address.  So as long as the length is a power of two,
setting the mask to length-1 effectively specifies the length.  Or so I thought,
until I realized that if the length exceeds the base address, *all* bits of the
base address are ignored by the comaparator, and the watchpoint range
effectively becomes 0 .. length.

Questions, comments, criticisms gratefully received.

Thanks,
Mike

Signed-off-by: Mike Dunn <mikedunn@newsguy.com>
src/target/xscale.c