From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:47758) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1c2RJY-0003rL-M3 for qemu-devel@nongnu.org; Thu, 03 Nov 2016 19:20:57 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1c2RJV-00016J-DB for qemu-devel@nongnu.org; Thu, 03 Nov 2016 19:20:56 -0400 Received: from relay1.mentorg.com ([192.94.38.131]:48725) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1c2RJV-000162-06 for qemu-devel@nongnu.org; Thu, 03 Nov 2016 19:20:53 -0400 Date: Thu, 3 Nov 2016 23:20:39 +0000 From: Julian Brown Message-ID: <20161103232039.42e2ea11@squid.athome> In-Reply-To: References: <1478194258-75276-1-git-send-email-julian@codesourcery.com> <1478194258-75276-5-git-send-email-julian@codesourcery.com> MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [PATCH 4/5] ARM BE32 watchpoint fix. List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: QEMU Developers On Thu, 3 Nov 2016 23:14:05 +0000 Peter Maydell wrote: > On 3 November 2016 at 17:30, Julian Brown > 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 > > --- > > 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