[PATCH v2 4/6] target/arm: Implement SCR_EL3.TID3
Richard Henderson <[email protected]>
| Newsgroups | gmane.comp.emulators.qemu |
|---|---|
| Message-ID | <[email protected]> |
Signed-off-by: Richard Henderson <[email protected]> --- target/arm/helper.c | 17 +++++++++++++++-- target/arm/tcg/op_helper.c | 4 +++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/target/arm/helper.c b/target/arm/helper.c index 8ab0075628..854c8902b8 100644 --- a/target/arm/helper.c +++ b/target/arm/helper.c @@ -5894,8 +5894,21 @@ static CPAccessResult access_v7a_tid3(CPUARMState *env, const ARMCPRegInfo *ri, * Any other registers in the TID3 trap space should use access_tid3(), * so that they trap on v8 and above, but not on v7. */ - if ((arm_current_el(env) < 2) && (arm_hcr_el2_eff(env) & HCR_TID3)) { - return CP_ACCESS_TRAP_EL2; + switch (arm_current_el(env)) { + case 1: + if (arm_hcr_el2_eff(env) & HCR_TID3) { + return CP_ACCESS_TRAP_EL2; + } + /* fall through */ + case 2: + if (env->cp15.scr_el3 & SCR_TID3) { + return CP_ACCESS_TRAP_EL3; + } + break; + case 3: + break; + default: + g_assert_not_reached(); } return CP_ACCESS_OK; diff --git a/target/arm/tcg/op_helper.c b/target/arm/tcg/op_helper.c index 6d1feb5b33..a3486e87d5 100644 --- a/target/arm/tcg/op_helper.c +++ b/target/arm/tcg/op_helper.c @@ -1201,7 +1201,9 @@ void HELPER(tid3_udef_el1)(CPUARMState *env, uint32_t syndrome) target_el = 2; excp = EXCP_HYP_TRAP; } else if (is_a64(env)) { - if (!cpu_isar_feature(aa64_idst, env_archcpu(env))) { + if (env->cp15.scr_el3 & SCR_TID3) { + target_el = 3; + } else if (!cpu_isar_feature(aa64_idst, env_archcpu(env))) { syndrome = syn_uncategorized(); } } else { -- 2.43.0