[3/4] target/arm: Implement UAO semantics

Message ID 20191203234244.9124-4-richard.henderson@linaro.org
State Superseded
Headers show
Series
  • target/arm: Implement ARMv8.2-UAO
Related show

Commit Message

Richard Henderson Dec. 3, 2019, 11:42 p.m.
We need only override the current condition under which
TBFLAG_A64.UNPRIV is set.

Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

---
 target/arm/helper.c | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

-- 
2.17.1

Comments

Peter Maydell Dec. 6, 2019, 6:31 p.m. | #1
On Tue, 3 Dec 2019 at 23:42, Richard Henderson
<richard.henderson@linaro.org> wrote:
>

> We need only override the current condition under which

> TBFLAG_A64.UNPRIV is set.

>

> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

> ---

>  target/arm/helper.c | 41 +++++++++++++++++++++--------------------

>  1 file changed, 21 insertions(+), 20 deletions(-)


Reviewed-by: Peter Maydell <peter.maydell@linaro.org>


thanks
-- PMM

Patch

diff --git a/target/arm/helper.c b/target/arm/helper.c
index 8941a6c10f..6d7a8349b5 100644
--- a/target/arm/helper.c
+++ b/target/arm/helper.c
@@ -12050,28 +12050,29 @@  static uint32_t rebuild_hflags_a64(CPUARMState *env, int el, int fp_el,
     }
 
     /* Compute the condition for using AccType_UNPRIV for LDTR et al. */
-    /* TODO: ARMv8.2-UAO */
-    switch (mmu_idx) {
-    case ARMMMUIdx_EL10_1:
-    case ARMMMUIdx_EL10_1_PAN:
-    case ARMMMUIdx_SE1:
-    case ARMMMUIdx_SE1_PAN:
-        /* TODO: ARMv8.3-NV */
-        flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
-        break;
-    case ARMMMUIdx_EL20_2:
-    case ARMMMUIdx_EL20_2_PAN:
-        /* TODO: ARMv8.4-SecEL2 */
-        /*
-         * Note that EL20_2 is gated by HCR_EL2.E2H == 1, but EL20_0 is
-         * gated by HCR_EL2.<E2H,TGE> == '11', and so is LDTR.
-         */
-        if (env->cp15.hcr_el2 & HCR_TGE) {
+    if (!(env->pstate & PSTATE_UAO)) {
+        switch (mmu_idx) {
+        case ARMMMUIdx_EL10_1:
+        case ARMMMUIdx_EL10_1_PAN:
+        case ARMMMUIdx_SE1:
+        case ARMMMUIdx_SE1_PAN:
+            /* TODO: ARMv8.3-NV */
             flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
+            break;
+        case ARMMMUIdx_EL20_2:
+        case ARMMMUIdx_EL20_2_PAN:
+            /* TODO: ARMv8.4-SecEL2 */
+            /*
+             * Note that EL20_2 is gated by HCR_EL2.E2H == 1, but EL20_0 is
+             * gated by HCR_EL2.<E2H,TGE> == '11', and so is LDTR.
+             */
+            if (env->cp15.hcr_el2 & HCR_TGE) {
+                flags = FIELD_DP32(flags, TBFLAG_A64, UNPRIV, 1);
+            }
+            break;
+        default:
+            break;
         }
-        break;
-    default:
-        break;
     }
 
     return rebuild_hflags_common(env, fp_el, mmu_idx, flags);