From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:43807) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YLvKU-0002fp-D0 for qemu-devel@nongnu.org; Thu, 12 Feb 2015 10:05:26 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1YLvKT-0006be-5B for qemu-devel@nongnu.org; Thu, 12 Feb 2015 10:05:22 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50415) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1YLvKS-0006bW-Tu for qemu-devel@nongnu.org; Thu, 12 Feb 2015 10:05:21 -0500 From: Andrew Jones Date: Thu, 12 Feb 2015 16:05:04 +0100 Message-Id: <1423753507-30542-3-git-send-email-drjones@redhat.com> In-Reply-To: <1423753507-30542-1-git-send-email-drjones@redhat.com> References: <1423753507-30542-1-git-send-email-drjones@redhat.com> Subject: [Qemu-devel] [PATCH 2/5] target-arm: enable get_rw_prot to take simple AP List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: peter.maydell@linaro.org Teach get_rw_prot about the simple AP format AP[2:1]. An additional switch was added, as opposed to converting ap := AP[2:1] to AP[2:0] with a simple shift - and then modifying cases 0,2,4,6, because the resulting code is easier to read with the switch. Signed-off-by: Andrew Jones --- target-arm/helper.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/target-arm/helper.c b/target-arm/helper.c index 610f305c4d661..b63ec7b7979f9 100644 --- a/target-arm/helper.c +++ b/target-arm/helper.c @@ -4698,12 +4698,32 @@ static inline bool regime_is_user(CPUARMState *env, ARMMMUIdx mmu_idx) static inline int get_rw_prot(CPUARMState *env, ARMMMUIdx mmu_idx, int ap, int domain_prot) { + bool simple_ap = regime_using_lpae_format(env, mmu_idx) + || (regime_sctlr(env, mmu_idx) & SCTLR_AFE); + bool domain_prot_valid = !regime_using_lpae_format(env, mmu_idx); bool is_user = regime_is_user(env, mmu_idx); - if (domain_prot == 3) { + if (domain_prot_valid && domain_prot == 3) { return PAGE_READ | PAGE_WRITE; } + /* ap is AP[2:1] */ + if (simple_ap) { + switch (ap) { + case 0: + return is_user ? 0 : PAGE_READ | PAGE_WRITE; + case 1: + return PAGE_READ | PAGE_WRITE; + case 2: + return is_user ? 0 : PAGE_READ; + case 3: + return PAGE_READ; + default: + g_assert_not_reached(); + } + } + + /* ap is AP[2:0] */ switch (ap) { case 0: if (arm_feature(env, ARM_FEATURE_V7)) { -- 1.9.3