target/arm: Fix Secure PL1 tests in fp_exception_el
We were using arm_is_secure and is_a64, which are tests against the current EL, as opposed to arm_el_is_aa64 and arm_is_secure_below_el3, which can be applied to a different EL than current. Consolidate the two tests. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20220609202901.1177572-24-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
38e8a13c11
commit
02e1de14bc
@ -10879,27 +10879,22 @@ int fp_exception_el(CPUARMState *env, int cur_el)
|
|||||||
int fpen = FIELD_EX64(env->cp15.cpacr_el1, CPACR_EL1, FPEN);
|
int fpen = FIELD_EX64(env->cp15.cpacr_el1, CPACR_EL1, FPEN);
|
||||||
|
|
||||||
switch (fpen) {
|
switch (fpen) {
|
||||||
|
case 1:
|
||||||
|
if (cur_el != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* fall through */
|
||||||
case 0:
|
case 0:
|
||||||
case 2:
|
case 2:
|
||||||
if (cur_el == 0 || cur_el == 1) {
|
/* Trap from Secure PL0 or PL1 to Secure PL1. */
|
||||||
/* Trap to PL1, which might be EL1 or EL3 */
|
if (!arm_el_is_aa64(env, 3)
|
||||||
if (arm_is_secure(env) && !arm_el_is_aa64(env, 3)) {
|
&& (cur_el == 3 || arm_is_secure_below_el3(env))) {
|
||||||
return 3;
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (cur_el == 3 && !is_a64(env)) {
|
|
||||||
/* Secure PL1 running at EL3 */
|
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
break;
|
if (cur_el <= 1) {
|
||||||
case 1:
|
|
||||||
if (cur_el == 0) {
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user