From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:45141) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YkUcC-0001YW-Ht for qemu-devel@nongnu.org; Tue, 21 Apr 2015 05:37:13 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YkUc9-0004yG-7n for qemu-devel@nongnu.org; Tue, 21 Apr 2015 05:37:12 -0400 Received: from static.88-198-71-155.clients.your-server.de ([88.198.71.155]:45855 helo=socrates.bennee.com) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YkUc9-0004y0-2v for qemu-devel@nongnu.org; Tue, 21 Apr 2015 05:37:09 -0400 References: <1428931324-4973-1-git-send-email-peter.maydell@linaro.org> <1428931324-4973-14-git-send-email-peter.maydell@linaro.org> From: Alex =?utf-8?Q?Benn=C3=A9e?= In-reply-to: <1428931324-4973-14-git-send-email-peter.maydell@linaro.org> Date: Tue, 21 Apr 2015 10:37:30 +0100 Message-ID: <87wq15vn39.fsf@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Subject: Re: [Qemu-devel] [PATCH v2 13/14] target-arm: Use attribute info to handle user-only watchpoints List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Peter Maydell Cc: Peter Crosthwaite , patches@linaro.org, "Edgar E. Iglesias" , qemu-devel@nongnu.org, Greg Bellows , Paolo Bonzini , Richard Henderson Peter Maydell writes: > Now that we have memory access attribute information in the watchpoint > checking code, we can correctly implement handling of watchpoints > which should match only on userspace accesses, where LDRT/STRT/LDT/STT > from EL1 are treated as userspace accesses. > > Signed-off-by: Peter Maydell > Reviewed-by: Edgar E. Iglesias Reviewed-by: Alex Bennée > --- > target-arm/op_helper.c | 23 ++++++++++++----------- > 1 file changed, 12 insertions(+), 11 deletions(-) > > diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c > index 7713022..4a8c4e0 100644 > --- a/target-arm/op_helper.c > +++ b/target-arm/op_helper.c > @@ -602,13 +602,22 @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp) > int pac, hmc, ssc, wt, lbn; > /* TODO: check against CPU security state when we implement TrustZone */ > bool is_secure = false; > + int access_el = arm_current_el(env); > > if (is_wp) { > - if (!env->cpu_watchpoint[n] > - || !(env->cpu_watchpoint[n]->flags & BP_WATCHPOINT_HIT)) { > + CPUWatchpoint *wp = env->cpu_watchpoint[n]; > + > + if (!wp || !(wp->flags & BP_WATCHPOINT_HIT)) { > return false; > } > cr = env->cp15.dbgwcr[n]; > + if (wp->hitattrs.user) { > + /* The LDRT/STRT/LDT/STT "unprivileged access" instructions should > + * match watchpoints as if they were accesses done at EL0, even if > + * the CPU is at EL1 or higher. > + */ > + access_el = 0; > + } > } else { > uint64_t pc = is_a64(env) ? env->pc : env->regs[15]; > > @@ -649,15 +658,7 @@ static bool bp_wp_matches(ARMCPU *cpu, int n, bool is_wp) > break; > } > > - /* TODO: this is not strictly correct because the LDRT/STRT/LDT/STT > - * "unprivileged access" instructions should match watchpoints as if > - * they were accesses done at EL0, even if the CPU is at EL1 or higher. > - * Implementing this would require reworking the core watchpoint code > - * to plumb the mmu_idx through to this point. Luckily Linux does not > - * rely on this behaviour currently. > - * For breakpoints we do want to use the current CPU state. > - */ > - switch (arm_current_el(env)) { > + switch (access_el) { > case 3: > case 2: > if (!hmc) { -- Alex Bennée