From: Jamie Iles Date: Wed, 26 May 2021 12:18:46 +0000 (+0100) Subject: target/arm: use raise_exception_ra for MTE check failure X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=5bf100c3200bc74b5d7b4e430c3b23e60caf1605;p=qmiga%2Fqemu.git 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 Cc: Peter Maydell Signed-off-by: Jamie Iles [PMM: Keep the one line of the comment that is still relevant] Reviewed-by: Peter Maydell Signed-off-by: Peter Maydell --- diff --git a/target/arm/mte_helper.c b/target/arm/mte_helper.c index a6fccc6e69..166b9d260f 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: