qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH 2/5] target-arm: enable get_rw_prot to take simple A


From: Andrew Jones
Subject: [Qemu-devel] [PATCH 2/5] target-arm: enable get_rw_prot to take simple AP
Date: Thu, 12 Feb 2015 16:05:04 +0100

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 <address@hidden>
---
 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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]