On Thu, 3 Nov 2016 23:14:05 +0000 Peter Maydell <peter.mayd...@linaro.org> wrote:
> On 3 November 2016 at 17:30, Julian Brown <jul...@codesourcery.com> > wrote: > > In BE32 mode, sub-word size watchpoints can fail to trigger because > > the address of the access is adjusted in the opcode helpers before > > being compared with the watchpoint registers. This patch reversed > > the address adjustment before performing the comparison. > > > > Signed-off-by: Julian Brown <jul...@codesourcery.com> > > --- > > exec.c | 13 +++++++++++++ > > 1 file changed, 13 insertions(+) > > > > diff --git a/exec.c b/exec.c > > index 4c84389..eadab54 100644 > > --- a/exec.c > > +++ b/exec.c > > @@ -2047,6 +2047,19 @@ static void check_watchpoint(int offset, int > > len, MemTxAttrs attrs, int flags) return; > > } > > vaddr = (cpu->mem_io_vaddr & TARGET_PAGE_MASK) + offset; > > +#if defined(TARGET_ARM) && !defined(CONFIG_USER_ONLY) > > + /* In BE32 system mode, target memory is stored byteswapped > > (FIXME: > > + relative to a little-endian host system), and by the time > > we reach here > > + (via an opcode helper) the addresses of subword accesses > > have been > > + adjusted to account for that, which means that watchpoints > > will not > > + match. Undo the adjustment here. */ > > + if (arm_sctlr_b(env)) { > > + if (len == 1) > > + vaddr ^= 3; > > + else if (len == 2) > > + vaddr ^= 2; > > + } > > +#endif > > No target-CPU specific code in exec.c, please... Yeah, I'd imagine not. I struggled with this one. Any suggestions for a better way to do this? Thanks, Julian