qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops
@ 2015-07-24 15:20 Peter Maydell
  2015-07-24 15:20 ` [Qemu-devel] [PATCH 1/5] target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations Peter Maydell
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Peter Maydell @ 2015-07-24 15:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, patches

This patch series wires up some of the EL2 and EL3 address
translation operations which we were missing:
 * the AArch64 EL2 and EL3 AT ops
 * the AArch32 ATS12NSO ops
 * the AArch32 ATS1H ops

Most of these are still not accessible or not very interesting
because we don't have any CPUs which set ARM_FEATURE_EL2 yet.
Providing ATS12NSO for AArch32-with-EL3 CPUs is a genuine bugfix.

I included a bugfix for the 32-bit EL2 stage 1 translation
regime. I think that the only remaining thing missing for EL2
(based on eyeballing our current code) is implementing stage
2 translations.

NB: this code isn't really tested, but it looks nice when you
read it.

Peter Maydell (5):
  target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations
  target-arm: Wire up AArch64 EL2 and EL3 address translation ops
  target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2,3
  target-arm: Enable the AArch32 ATS12NSO ops
  target-arm: Implement AArch32 ATS1H* operations

 target-arm/cpu.h       |  3 ++
 target-arm/helper.c    | 88 ++++++++++++++++++++++++++++++++++++++++++++++----
 target-arm/op_helper.c |  8 +++++
 3 files changed, 92 insertions(+), 7 deletions(-)

-- 
1.9.1

^ permalink raw reply	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 1/5] target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations
  2015-07-24 15:20 [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
@ 2015-07-24 15:20 ` Peter Maydell
  2015-08-17  1:38   ` Edgar E. Iglesias
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 2/5] target-arm: Wire up AArch64 EL2 and EL3 address translation ops Peter Maydell
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2015-07-24 15:20 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, patches

For EL2 stage 1 translations, there is no TTBR1. We were already
handling this for 64-bit EL2; add the code to take the 'no TTBR1'
code path for 64-bit EL2 as well.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/helper.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/target-arm/helper.c b/target-arm/helper.c
index 01f0d0d..1ac6594 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -5638,6 +5638,11 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
         if (el > 1) {
             ttbr1_valid = false;
         }
+    } else {
+        /* There is no TTBR1 for EL2 */
+        if (el == 2) {
+            ttbr1_valid = false;
+        }
     }
 
     /* Determine whether this address is in the region controlled by
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 2/5] target-arm: Wire up AArch64 EL2 and EL3 address translation ops
  2015-07-24 15:20 [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
  2015-07-24 15:20 ` [Qemu-devel] [PATCH 1/5] target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations Peter Maydell
@ 2015-07-24 15:21 ` Peter Maydell
  2015-08-17  1:51   ` Edgar E. Iglesias
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 3/5] target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2, 3 Peter Maydell
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2015-07-24 15:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, patches

Wire up the AArch64 EL2 and EL3 address translation operations
(AT S12E1*, AT S12E0*, AT S1E2*, AT S1E3*), and correct some
errors in the ats_write64() function in previously unused code
that would have done the wrong kind of lookup for accesses from
EL3 when SCR.NS==0.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/helper.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 43 insertions(+), 2 deletions(-)

diff --git a/target-arm/helper.c b/target-arm/helper.c
index 1ac6594..1974fa6 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -1602,6 +1602,14 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
     A32_BANKED_CURRENT_REG_SET(env, par, par64);
 }
 
+static CPAccessResult at_s1e2_access(CPUARMState *env, const ARMCPRegInfo *ri)
+{
+    if (arm_current_el(env) == 3 && !(env->cp15.scr_el3 & SCR_NS)) {
+        return CP_ACCESS_TRAP;
+    }
+    return CP_ACCESS_OK;
+}
+
 static void ats_write64(CPUARMState *env, const ARMCPRegInfo *ri,
                         uint64_t value)
 {
@@ -1629,10 +1637,10 @@ static void ats_write64(CPUARMState *env, const ARMCPRegInfo *ri,
         mmu_idx = secure ? ARMMMUIdx_S1SE0 : ARMMMUIdx_S1NSE0;
         break;
     case 4: /* AT S12E1R, AT S12E1W */
-        mmu_idx = ARMMMUIdx_S12NSE1;
+        mmu_idx = secure ? ARMMMUIdx_S1SE1 : ARMMMUIdx_S12NSE1;
         break;
     case 6: /* AT S12E0R, AT S12E0W */
-        mmu_idx = ARMMMUIdx_S12NSE0;
+        mmu_idx = secure ? ARMMMUIdx_S1SE0 : ARMMMUIdx_S12NSE0;
         break;
     default:
         g_assert_not_reached();
@@ -2504,6 +2512,25 @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
     { .name = "AT_S1E0W", .state = ARM_CP_STATE_AA64,
       .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 3,
       .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    { .name = "AT_S12E1R", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 4,
+      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    { .name = "AT_S12E1W", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 5,
+      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    { .name = "AT_S12E0R", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 6,
+      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    { .name = "AT_S12E0W", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 7,
+      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    /* AT S1E2* are elsewhere as they UNDEF from EL3 if EL2 is not present */
+    { .name = "AT_S1E3R", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 0,
+      .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    { .name = "AT_S1E3W", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 1,
+      .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
 #endif
     /* TLB invalidate last level of translation table walk */
     { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
@@ -2724,6 +2751,20 @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
       .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
       .type = ARM_CP_NO_RAW, .access = PL2_W,
       .writefn = tlbi_aa64_vaa_write },
+#ifndef CONFIG_USER_ONLY
+    /* Unlike the other EL2-related AT operations, these must
+     * UNDEF from EL3 if EL2 is not implemented, which is why we
+     * define them here rather than with the rest of the AT ops.
+     */
+    { .name = "AT_S1E2R", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
+      .access = PL2_W, .accessfn = at_s1e2_access,
+      .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    { .name = "AT_S1E2W", .state = ARM_CP_STATE_AA64,
+      .opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
+      .access = PL2_W, .accessfn = at_s1e2_access,
+      .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+#endif
     REGINFO_SENTINEL
 };
 
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 3/5] target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2, 3
  2015-07-24 15:20 [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
  2015-07-24 15:20 ` [Qemu-devel] [PATCH 1/5] target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations Peter Maydell
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 2/5] target-arm: Wire up AArch64 EL2 and EL3 address translation ops Peter Maydell
@ 2015-07-24 15:21 ` Peter Maydell
  2015-08-17  1:52   ` Edgar E. Iglesias
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 4/5] target-arm: Enable the AArch32 ATS12NSO ops Peter Maydell
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2015-07-24 15:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, patches

Some coprocessor register access functions need to be able
to report "trap to EL3 with an 'uncategorized' syndrome";
add the necessary CPAccessResult enum and handling for it.

I don't currently know of any registers that need to trap
to EL2 with the 'uncategorized' syndrome, but adding the
_EL2 enum as well is trivial and fills in what would
otherwise be an odd gap in the handling.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/cpu.h       | 3 +++
 target-arm/op_helper.c | 8 ++++++++
 2 files changed, 11 insertions(+)

diff --git a/target-arm/cpu.h b/target-arm/cpu.h
index 7e89152..685474e 100644
--- a/target-arm/cpu.h
+++ b/target-arm/cpu.h
@@ -1280,6 +1280,9 @@ typedef enum CPAccessResult {
     /* As CP_ACCESS_TRAP, but for traps directly to EL2 or EL3 */
     CP_ACCESS_TRAP_EL2 = 3,
     CP_ACCESS_TRAP_EL3 = 4,
+    /* As CP_ACCESS_UNCATEGORIZED, but for traps directly to EL2 or EL3 */
+    CP_ACCESS_TRAP_UNCATEGORIZED_EL2 = 5,
+    CP_ACCESS_TRAP_UNCATEGORIZED_EL3 = 6,
 } CPAccessResult;
 
 /* Access functions for coprocessor registers. These cannot fail and
diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c
index 663c05d..1425a1d 100644
--- a/target-arm/op_helper.c
+++ b/target-arm/op_helper.c
@@ -444,6 +444,14 @@ void HELPER(access_check_cp_reg)(CPUARMState *env, void *rip, uint32_t syndrome)
         target_el = exception_target_el(env);
         syndrome = syn_uncategorized();
         break;
+    case CP_ACCESS_TRAP_UNCATEGORIZED_EL2:
+        target_el = 2;
+        syndrome = syn_uncategorized();
+        break;
+    case CP_ACCESS_TRAP_UNCATEGORIZED_EL3:
+        target_el = 3;
+        syndrome = syn_uncategorized();
+        break;
     default:
         g_assert_not_reached();
     }
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 4/5] target-arm: Enable the AArch32 ATS12NSO ops
  2015-07-24 15:20 [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
                   ` (2 preceding siblings ...)
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 3/5] target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2, 3 Peter Maydell
@ 2015-07-24 15:21 ` Peter Maydell
  2015-08-17 13:31   ` Edgar E. Iglesias
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 5/5] target-arm: Implement AArch32 ATS1H* operations Peter Maydell
  2015-08-14 10:10 ` [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
  5 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2015-07-24 15:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, patches

Apply the correct conditions in the ats_access() function for
the ATS12NSO* address translation operations:
 * succeed at EL2 or EL3
 * normal UNDEF trap from NS EL1
 * trap to EL3 from S EL1 (only possible if EL3 is AArch64)

(This change means they're now available in our EL3-supporting
CPUs when they would previously always UNDEF.)

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/helper.c | 16 +++++++++++-----
 1 file changed, 11 insertions(+), 5 deletions(-)

diff --git a/target-arm/helper.c b/target-arm/helper.c
index 1974fa6..67d108e 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -1477,12 +1477,17 @@ static void par_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
 static CPAccessResult ats_access(CPUARMState *env, const ARMCPRegInfo *ri)
 {
     if (ri->opc2 & 4) {
-        /* Other states are only available with TrustZone; in
-         * a non-TZ implementation these registers don't exist
-         * at all, which is an Uncategorized trap. This underdecoding
-         * is safe because the reginfo is NO_RAW.
+        /* The ATS12NSO* operations must trap to EL3 if executed in
+         * Secure EL1 (which can only happen if EL3 is AArch64).
+         * They are simply UNDEF if executed from NS EL1.
+         * They function normally from EL2 or EL3.
          */
-        return CP_ACCESS_TRAP_UNCATEGORIZED;
+        if (arm_current_el(env) == 1) {
+            if (arm_is_secure_below_el3(env)) {
+                return CP_ACCESS_TRAP_UNCATEGORIZED_EL3;
+            }
+            return CP_ACCESS_TRAP_UNCATEGORIZED;
+        }
     }
     return CP_ACCESS_OK;
 }
@@ -1657,6 +1662,7 @@ static const ARMCPRegInfo vapa_cp_reginfo[] = {
                              offsetoflow32(CPUARMState, cp15.par_ns) },
       .writefn = par_write },
 #ifndef CONFIG_USER_ONLY
+    /* This underdecoding is safe because the reginfo is NO_RAW. */
     { .name = "ATS", .cp = 15, .crn = 7, .crm = 8, .opc1 = 0, .opc2 = CP_ANY,
       .access = PL1_W, .accessfn = ats_access,
       .writefn = ats_write, .type = ARM_CP_NO_RAW },
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* [Qemu-devel] [PATCH 5/5] target-arm: Implement AArch32 ATS1H* operations
  2015-07-24 15:20 [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
                   ` (3 preceding siblings ...)
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 4/5] target-arm: Enable the AArch32 ATS12NSO ops Peter Maydell
@ 2015-07-24 15:21 ` Peter Maydell
  2015-08-17 13:36   ` Edgar E. Iglesias
  2015-08-14 10:10 ` [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
  5 siblings, 1 reply; 12+ messages in thread
From: Peter Maydell @ 2015-07-24 15:21 UTC (permalink / raw)
  To: qemu-devel; +Cc: Edgar E. Iglesias, patches

Implement the AArch32 ATS1H* operations which perform
Hyp mode stage 1 translations.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
---
 target-arm/helper.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

diff --git a/target-arm/helper.c b/target-arm/helper.c
index 67d108e..b9ce965 100644
--- a/target-arm/helper.c
+++ b/target-arm/helper.c
@@ -1607,6 +1607,17 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
     A32_BANKED_CURRENT_REG_SET(env, par, par64);
 }
 
+static void ats1h_write(CPUARMState *env, const ARMCPRegInfo *ri,
+                        uint64_t value)
+{
+    int access_type = ri->opc2 & 1;
+    uint64_t par64;
+
+    par64 = do_ats_write(env, value, access_type, ARMMMUIdx_S2NS);
+
+    A32_BANKED_CURRENT_REG_SET(env, par, par64);
+}
+
 static CPAccessResult at_s1e2_access(CPUARMState *env, const ARMCPRegInfo *ri)
 {
     if (arm_current_el(env) == 3 && !(env->cp15.scr_el3 & SCR_NS)) {
@@ -2770,6 +2781,17 @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
       .opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
       .access = PL2_W, .accessfn = at_s1e2_access,
       .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
+    /* The AArch32 ATS1H* operations are CONSTRAINED UNPREDICTABLE
+     * if EL2 is not implemented; we choose to UNDEF. Behaviour at EL3
+     * with SCR.NS == 0 outside Monitor mode is UNPREDICTABLE; we choose
+     * to behave as if SCR.NS was 1.
+     */
+    { .name = "ATS1HR", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
+      .access = PL2_W,
+      .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
+    { .name = "ATS1HW", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
+      .access = PL2_W,
+      .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
 #endif
     REGINFO_SENTINEL
 };
-- 
1.9.1

^ permalink raw reply related	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops
  2015-07-24 15:20 [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
                   ` (4 preceding siblings ...)
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 5/5] target-arm: Implement AArch32 ATS1H* operations Peter Maydell
@ 2015-08-14 10:10 ` Peter Maydell
  5 siblings, 0 replies; 12+ messages in thread
From: Peter Maydell @ 2015-08-14 10:10 UTC (permalink / raw)
  To: QEMU Developers; +Cc: Edgar E. Iglesias, Patch Tracking

Ping?

thanks
-- PMM

On 24 July 2015 at 16:20, Peter Maydell <peter.maydell@linaro.org> wrote:
> This patch series wires up some of the EL2 and EL3 address
> translation operations which we were missing:
>  * the AArch64 EL2 and EL3 AT ops
>  * the AArch32 ATS12NSO ops
>  * the AArch32 ATS1H ops
>
> Most of these are still not accessible or not very interesting
> because we don't have any CPUs which set ARM_FEATURE_EL2 yet.
> Providing ATS12NSO for AArch32-with-EL3 CPUs is a genuine bugfix.
>
> I included a bugfix for the 32-bit EL2 stage 1 translation
> regime. I think that the only remaining thing missing for EL2
> (based on eyeballing our current code) is implementing stage
> 2 translations.
>
> NB: this code isn't really tested, but it looks nice when you
> read it.
>
> Peter Maydell (5):
>   target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations
>   target-arm: Wire up AArch64 EL2 and EL3 address translation ops
>   target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2,3
>   target-arm: Enable the AArch32 ATS12NSO ops
>   target-arm: Implement AArch32 ATS1H* operations
>
>  target-arm/cpu.h       |  3 ++
>  target-arm/helper.c    | 88 ++++++++++++++++++++++++++++++++++++++++++++++----
>  target-arm/op_helper.c |  8 +++++
>  3 files changed, 92 insertions(+), 7 deletions(-)

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 1/5] target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations
  2015-07-24 15:20 ` [Qemu-devel] [PATCH 1/5] target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations Peter Maydell
@ 2015-08-17  1:38   ` Edgar E. Iglesias
  0 siblings, 0 replies; 12+ messages in thread
From: Edgar E. Iglesias @ 2015-08-17  1:38 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel, patches

On Fri, Jul 24, 2015 at 04:20:59PM +0100, Peter Maydell wrote:
> For EL2 stage 1 translations, there is no TTBR1. We were already
> handling this for 64-bit EL2; add the code to take the 'no TTBR1'
> code path for 64-bit EL2 as well.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>


> ---
>  target-arm/helper.c | 5 +++++
>  1 file changed, 5 insertions(+)
> 
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 01f0d0d..1ac6594 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -5638,6 +5638,11 @@ static bool get_phys_addr_lpae(CPUARMState *env, target_ulong address,
>          if (el > 1) {
>              ttbr1_valid = false;
>          }
> +    } else {
> +        /* There is no TTBR1 for EL2 */
> +        if (el == 2) {
> +            ttbr1_valid = false;
> +        }
>      }
>  
>      /* Determine whether this address is in the region controlled by
> -- 
> 1.9.1
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 2/5] target-arm: Wire up AArch64 EL2 and EL3 address translation ops
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 2/5] target-arm: Wire up AArch64 EL2 and EL3 address translation ops Peter Maydell
@ 2015-08-17  1:51   ` Edgar E. Iglesias
  0 siblings, 0 replies; 12+ messages in thread
From: Edgar E. Iglesias @ 2015-08-17  1:51 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel, patches

On Fri, Jul 24, 2015 at 04:21:00PM +0100, Peter Maydell wrote:
> Wire up the AArch64 EL2 and EL3 address translation operations
> (AT S12E1*, AT S12E0*, AT S1E2*, AT S1E3*), and correct some
> errors in the ats_write64() function in previously unused code
> that would have done the wrong kind of lookup for accesses from
> EL3 when SCR.NS==0.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


THis one didn't apply for me, I guess some context has moved around a little..

The changes look OK to me though:
Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>




> ---
>  target-arm/helper.c | 45 +++++++++++++++++++++++++++++++++++++++++++--
>  1 file changed, 43 insertions(+), 2 deletions(-)
> 
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 1ac6594..1974fa6 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -1602,6 +1602,14 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
>      A32_BANKED_CURRENT_REG_SET(env, par, par64);
>  }
>  
> +static CPAccessResult at_s1e2_access(CPUARMState *env, const ARMCPRegInfo *ri)
> +{
> +    if (arm_current_el(env) == 3 && !(env->cp15.scr_el3 & SCR_NS)) {
> +        return CP_ACCESS_TRAP;
> +    }
> +    return CP_ACCESS_OK;
> +}
> +
>  static void ats_write64(CPUARMState *env, const ARMCPRegInfo *ri,
>                          uint64_t value)
>  {
> @@ -1629,10 +1637,10 @@ static void ats_write64(CPUARMState *env, const ARMCPRegInfo *ri,
>          mmu_idx = secure ? ARMMMUIdx_S1SE0 : ARMMMUIdx_S1NSE0;
>          break;
>      case 4: /* AT S12E1R, AT S12E1W */
> -        mmu_idx = ARMMMUIdx_S12NSE1;
> +        mmu_idx = secure ? ARMMMUIdx_S1SE1 : ARMMMUIdx_S12NSE1;
>          break;
>      case 6: /* AT S12E0R, AT S12E0W */
> -        mmu_idx = ARMMMUIdx_S12NSE0;
> +        mmu_idx = secure ? ARMMMUIdx_S1SE0 : ARMMMUIdx_S12NSE0;
>          break;
>      default:
>          g_assert_not_reached();
> @@ -2504,6 +2512,25 @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
>      { .name = "AT_S1E0W", .state = ARM_CP_STATE_AA64,
>        .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 3,
>        .access = PL1_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    { .name = "AT_S12E1R", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 4,
> +      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    { .name = "AT_S12E1W", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 5,
> +      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    { .name = "AT_S12E0R", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 6,
> +      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    { .name = "AT_S12E0W", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 0, .crn = 7, .crm = 8, .opc2 = 7,
> +      .access = PL2_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    /* AT S1E2* are elsewhere as they UNDEF from EL3 if EL2 is not present */
> +    { .name = "AT_S1E3R", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 0,
> +      .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    { .name = "AT_S1E3W", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 6, .crn = 7, .crm = 8, .opc2 = 1,
> +      .access = PL3_W, .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
>  #endif
>      /* TLB invalidate last level of translation table walk */
>      { .name = "TLBIMVALIS", .cp = 15, .opc1 = 0, .crn = 8, .crm = 3, .opc2 = 5,
> @@ -2724,6 +2751,20 @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
>        .opc0 = 1, .opc1 = 4, .crn = 8, .crm = 3, .opc2 = 1,
>        .type = ARM_CP_NO_RAW, .access = PL2_W,
>        .writefn = tlbi_aa64_vaa_write },
> +#ifndef CONFIG_USER_ONLY
> +    /* Unlike the other EL2-related AT operations, these must
> +     * UNDEF from EL3 if EL2 is not implemented, which is why we
> +     * define them here rather than with the rest of the AT ops.
> +     */
> +    { .name = "AT_S1E2R", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
> +      .access = PL2_W, .accessfn = at_s1e2_access,
> +      .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    { .name = "AT_S1E2W", .state = ARM_CP_STATE_AA64,
> +      .opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
> +      .access = PL2_W, .accessfn = at_s1e2_access,
> +      .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +#endif
>      REGINFO_SENTINEL
>  };
>  
> -- 
> 1.9.1
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 3/5] target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2, 3
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 3/5] target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2, 3 Peter Maydell
@ 2015-08-17  1:52   ` Edgar E. Iglesias
  0 siblings, 0 replies; 12+ messages in thread
From: Edgar E. Iglesias @ 2015-08-17  1:52 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel, patches

On Fri, Jul 24, 2015 at 04:21:01PM +0100, Peter Maydell wrote:
> Some coprocessor register access functions need to be able
> to report "trap to EL3 with an 'uncategorized' syndrome";
> add the necessary CPAccessResult enum and handling for it.
> 
> I don't currently know of any registers that need to trap
> to EL2 with the 'uncategorized' syndrome, but adding the
> _EL2 enum as well is trivial and fills in what would
> otherwise be an odd gap in the handling.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>


> ---
>  target-arm/cpu.h       | 3 +++
>  target-arm/op_helper.c | 8 ++++++++
>  2 files changed, 11 insertions(+)
> 
> diff --git a/target-arm/cpu.h b/target-arm/cpu.h
> index 7e89152..685474e 100644
> --- a/target-arm/cpu.h
> +++ b/target-arm/cpu.h
> @@ -1280,6 +1280,9 @@ typedef enum CPAccessResult {
>      /* As CP_ACCESS_TRAP, but for traps directly to EL2 or EL3 */
>      CP_ACCESS_TRAP_EL2 = 3,
>      CP_ACCESS_TRAP_EL3 = 4,
> +    /* As CP_ACCESS_UNCATEGORIZED, but for traps directly to EL2 or EL3 */
> +    CP_ACCESS_TRAP_UNCATEGORIZED_EL2 = 5,
> +    CP_ACCESS_TRAP_UNCATEGORIZED_EL3 = 6,
>  } CPAccessResult;
>  
>  /* Access functions for coprocessor registers. These cannot fail and
> diff --git a/target-arm/op_helper.c b/target-arm/op_helper.c
> index 663c05d..1425a1d 100644
> --- a/target-arm/op_helper.c
> +++ b/target-arm/op_helper.c
> @@ -444,6 +444,14 @@ void HELPER(access_check_cp_reg)(CPUARMState *env, void *rip, uint32_t syndrome)
>          target_el = exception_target_el(env);
>          syndrome = syn_uncategorized();
>          break;
> +    case CP_ACCESS_TRAP_UNCATEGORIZED_EL2:
> +        target_el = 2;
> +        syndrome = syn_uncategorized();
> +        break;
> +    case CP_ACCESS_TRAP_UNCATEGORIZED_EL3:
> +        target_el = 3;
> +        syndrome = syn_uncategorized();
> +        break;
>      default:
>          g_assert_not_reached();
>      }
> -- 
> 1.9.1
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 4/5] target-arm: Enable the AArch32 ATS12NSO ops
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 4/5] target-arm: Enable the AArch32 ATS12NSO ops Peter Maydell
@ 2015-08-17 13:31   ` Edgar E. Iglesias
  0 siblings, 0 replies; 12+ messages in thread
From: Edgar E. Iglesias @ 2015-08-17 13:31 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel, patches

On Fri, Jul 24, 2015 at 04:21:02PM +0100, Peter Maydell wrote:
> Apply the correct conditions in the ats_access() function for
> the ATS12NSO* address translation operations:
>  * succeed at EL2 or EL3
>  * normal UNDEF trap from NS EL1
>  * trap to EL3 from S EL1 (only possible if EL3 is AArch64)
> 
> (This change means they're now available in our EL3-supporting
> CPUs when they would previously always UNDEF.)
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>


Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>


> ---
>  target-arm/helper.c | 16 +++++++++++-----
>  1 file changed, 11 insertions(+), 5 deletions(-)
> 
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 1974fa6..67d108e 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -1477,12 +1477,17 @@ static void par_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
>  static CPAccessResult ats_access(CPUARMState *env, const ARMCPRegInfo *ri)
>  {
>      if (ri->opc2 & 4) {
> -        /* Other states are only available with TrustZone; in
> -         * a non-TZ implementation these registers don't exist
> -         * at all, which is an Uncategorized trap. This underdecoding
> -         * is safe because the reginfo is NO_RAW.
> +        /* The ATS12NSO* operations must trap to EL3 if executed in
> +         * Secure EL1 (which can only happen if EL3 is AArch64).
> +         * They are simply UNDEF if executed from NS EL1.
> +         * They function normally from EL2 or EL3.
>           */
> -        return CP_ACCESS_TRAP_UNCATEGORIZED;
> +        if (arm_current_el(env) == 1) {
> +            if (arm_is_secure_below_el3(env)) {
> +                return CP_ACCESS_TRAP_UNCATEGORIZED_EL3;
> +            }
> +            return CP_ACCESS_TRAP_UNCATEGORIZED;
> +        }
>      }
>      return CP_ACCESS_OK;
>  }
> @@ -1657,6 +1662,7 @@ static const ARMCPRegInfo vapa_cp_reginfo[] = {
>                               offsetoflow32(CPUARMState, cp15.par_ns) },
>        .writefn = par_write },
>  #ifndef CONFIG_USER_ONLY
> +    /* This underdecoding is safe because the reginfo is NO_RAW. */
>      { .name = "ATS", .cp = 15, .crn = 7, .crm = 8, .opc1 = 0, .opc2 = CP_ANY,
>        .access = PL1_W, .accessfn = ats_access,
>        .writefn = ats_write, .type = ARM_CP_NO_RAW },
> -- 
> 1.9.1
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: [Qemu-devel] [PATCH 5/5] target-arm: Implement AArch32 ATS1H* operations
  2015-07-24 15:21 ` [Qemu-devel] [PATCH 5/5] target-arm: Implement AArch32 ATS1H* operations Peter Maydell
@ 2015-08-17 13:36   ` Edgar E. Iglesias
  0 siblings, 0 replies; 12+ messages in thread
From: Edgar E. Iglesias @ 2015-08-17 13:36 UTC (permalink / raw)
  To: Peter Maydell; +Cc: qemu-devel, patches

On Fri, Jul 24, 2015 at 04:21:03PM +0100, Peter Maydell wrote:
> Implement the AArch32 ATS1H* operations which perform
> Hyp mode stage 1 translations.
> 
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Edgar E. Iglesias <edgar.iglesias@xilinx.com>


> ---
>  target-arm/helper.c | 22 ++++++++++++++++++++++
>  1 file changed, 22 insertions(+)
> 
> diff --git a/target-arm/helper.c b/target-arm/helper.c
> index 67d108e..b9ce965 100644
> --- a/target-arm/helper.c
> +++ b/target-arm/helper.c
> @@ -1607,6 +1607,17 @@ static void ats_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)
>      A32_BANKED_CURRENT_REG_SET(env, par, par64);
>  }
>  
> +static void ats1h_write(CPUARMState *env, const ARMCPRegInfo *ri,
> +                        uint64_t value)
> +{
> +    int access_type = ri->opc2 & 1;
> +    uint64_t par64;
> +
> +    par64 = do_ats_write(env, value, access_type, ARMMMUIdx_S2NS);
> +
> +    A32_BANKED_CURRENT_REG_SET(env, par, par64);
> +}
> +
>  static CPAccessResult at_s1e2_access(CPUARMState *env, const ARMCPRegInfo *ri)
>  {
>      if (arm_current_el(env) == 3 && !(env->cp15.scr_el3 & SCR_NS)) {
> @@ -2770,6 +2781,17 @@ static const ARMCPRegInfo el2_cp_reginfo[] = {
>        .opc0 = 1, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
>        .access = PL2_W, .accessfn = at_s1e2_access,
>        .type = ARM_CP_NO_RAW, .writefn = ats_write64 },
> +    /* The AArch32 ATS1H* operations are CONSTRAINED UNPREDICTABLE
> +     * if EL2 is not implemented; we choose to UNDEF. Behaviour at EL3
> +     * with SCR.NS == 0 outside Monitor mode is UNPREDICTABLE; we choose
> +     * to behave as if SCR.NS was 1.
> +     */
> +    { .name = "ATS1HR", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 0,
> +      .access = PL2_W,
> +      .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
> +    { .name = "ATS1HW", .cp = 15, .opc1 = 4, .crn = 7, .crm = 8, .opc2 = 1,
> +      .access = PL2_W,
> +      .writefn = ats1h_write, .type = ARM_CP_NO_RAW },
>  #endif
>      REGINFO_SENTINEL
>  };
> -- 
> 1.9.1
> 

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2015-08-17 13:36 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-07-24 15:20 [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell
2015-07-24 15:20 ` [Qemu-devel] [PATCH 1/5] target-arm: there is no TTBR1 for 32-bit EL2 stage 1 translations Peter Maydell
2015-08-17  1:38   ` Edgar E. Iglesias
2015-07-24 15:21 ` [Qemu-devel] [PATCH 2/5] target-arm: Wire up AArch64 EL2 and EL3 address translation ops Peter Maydell
2015-08-17  1:51   ` Edgar E. Iglesias
2015-07-24 15:21 ` [Qemu-devel] [PATCH 3/5] target-arm: Add CP_ACCESS_TRAP_UNCATEGORIZED_EL2, 3 Peter Maydell
2015-08-17  1:52   ` Edgar E. Iglesias
2015-07-24 15:21 ` [Qemu-devel] [PATCH 4/5] target-arm: Enable the AArch32 ATS12NSO ops Peter Maydell
2015-08-17 13:31   ` Edgar E. Iglesias
2015-07-24 15:21 ` [Qemu-devel] [PATCH 5/5] target-arm: Implement AArch32 ATS1H* operations Peter Maydell
2015-08-17 13:36   ` Edgar E. Iglesias
2015-08-14 10:10 ` [Qemu-devel] [PATCH 0/5] Wire up various EL2/EL3 address translation ops Peter Maydell

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).