diff options
author | Jamie Iles <jamie@nuviainc.com> | 2021-05-26 13:18:46 +0100 |
---|---|---|
committer | Peter Maydell <peter.maydell@linaro.org> | 2021-06-03 16:43:25 +0100 |
commit | 5bf100c3200bc74b5d7b4e430c3b23e60caf1605 (patch) | |
tree | a478eb7bd410b8fac18a55bfa9111cbf7cea95b6 /target | |
parent | 154acaba0ea9675f175118787b9ca44cbbbc23b7 (diff) | |
download | qemu-5bf100c3200bc74b5d7b4e430c3b23e60caf1605.zip qemu-5bf100c3200bc74b5d7b4e430c3b23e60caf1605.tar.gz qemu-5bf100c3200bc74b5d7b4e430c3b23e60caf1605.tar.bz2 |
target/arm: use raise_exception_ra for MTE check failure
Now that raise_exception_ra restores the state before raising the
exception we can use restore_exception_ra to perform the state restore +
exception raising without clobbering the syndrome.
Cc: Richard Henderson <richard.henderson@linaro.org>
Cc: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Jamie Iles <jamie@nuviainc.com>
[PMM: Keep the one line of the comment that is still relevant]
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
Diffstat (limited to 'target')
-rw-r--r-- | target/arm/mte_helper.c | 12 |
1 files changed, 3 insertions, 9 deletions
diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index a6fccc6..166b9d2 100644 --- a/target/arm/mte_helper.c +++ b/target/arm/mte_helper.c @@ -563,20 +563,14 @@ static void mte_check_fail(CPUARMState *env, uint32_t desc, switch (tcf) { case 1: - /* - * Tag check fail causes a synchronous exception. - * - * In restore_state_to_opc, we set the exception syndrome - * for the load or store operation. Unwind first so we - * may overwrite that with the syndrome for the tag check. - */ - cpu_restore_state(env_cpu(env), ra, true); + /* Tag check fail causes a synchronous exception. */ env->exception.vaddress = dirty_ptr; is_write = FIELD_EX32(desc, MTEDESC, WRITE); syn = syn_data_abort_no_iss(arm_current_el(env) != 0, 0, 0, 0, 0, is_write, 0x11); - raise_exception(env, EXCP_DATA_ABORT, syn, exception_target_el(env)); + raise_exception_ra(env, EXCP_DATA_ABORT, syn, + exception_target_el(env), ra); /* noreturn, but fall through to the assert anyway */ case 0: |