]> git.ipfire.org Git - thirdparty/qemu.git/commitdiff
target/arm: Forbid return to AArch32 when CPU is AArch64-only
authorPeter Maydell <peter.maydell@linaro.org>
Wed, 12 Mar 2025 13:25:08 +0000 (13:25 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Fri, 14 Mar 2025 12:54:33 +0000 (12:54 +0000)
In the Arm ARM, rule R_TYTWB states that returning to AArch32
is an illegal exception return if:
 * AArch32 is not supported at any exception level
 * the target EL is configured for AArch64 via SCR_EL3.RW
   or HCR_EL2.RW or via CPU state at reset

We check the second of these, but not the first (which can only be
relevant for the case of a return to EL0, because if AArch32 is not
supported at one of the higher ELs then the RW bits will have an
effective value of 1 and the the "configured for AArch64" condition
will hold also).

Add the missing condition. Although this is technically a bug
(because we have one AArch64-only CPU: a64fx) it isn't worth
backporting to stable because no sensible guest code will
deliberately try to return to a nonexistent execution state
to check that it gets an illegal exception return.

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
target/arm/tcg/helper-a64.c

index e2bdf07833d7db5e4f3f4f67af2ddd3e10619751..9244848efed052578e38f1b737ca2b6c8694e8d5 100644 (file)
@@ -678,6 +678,11 @@ void HELPER(exception_return)(CPUARMState *env, uint64_t new_pc)
         goto illegal_return;
     }
 
+    if (!return_to_aa64 && !cpu_isar_feature(aa64_aa32, cpu)) {
+        /* Return to AArch32 when CPU is AArch64-only */
+        goto illegal_return;
+    }
+
     if (new_el == 1 && (arm_hcr_el2_eff(env) & HCR_TGE)) {
         goto illegal_return;
     }