diff --git a/qemu/target/arm/helper.c b/qemu/target/arm/helper.c index 14a65520..e2f2a966 100644 --- a/qemu/target/arm/helper.c +++ b/qemu/target/arm/helper.c @@ -5434,6 +5434,7 @@ static void v7m_exception_taken(ARMCPU *cpu, uint32_t lr) // Unicorn: commented out //armv7m_nvic_acknowledge_irq(env->nvic); switch_v7m_sp(env, 0); + arm_clear_exclusive(env); /* Clear IT bits */ env->condexec_bits = 0; env->regs[14] = lr; @@ -5620,6 +5621,7 @@ static void do_v7m_exception_exit(ARMCPU *cpu) } /* Otherwise, we have a successful exception exit. */ + arm_clear_exclusive(env); qemu_log_mask(CPU_LOG_INT, "...successful exception return\n"); } diff --git a/qemu/target/arm/internals.h b/qemu/target/arm/internals.h index b3a5d012..b086398d 100644 --- a/qemu/target/arm/internals.h +++ b/qemu/target/arm/internals.h @@ -445,6 +445,16 @@ bool arm_is_psci_call(ARMCPU *cpu, int excp_type); void arm_handle_psci_call(ARMCPU *cpu); #endif +/** + * arm_clear_exclusive: clear the exclusive monitor + * @env: CPU env + * Clear the CPU's exclusive monitor, like the guest CLREX instruction. + */ +static inline void arm_clear_exclusive(CPUARMState *env) +{ + env->exclusive_addr = -1; +} + /** * ARMMMUFaultInfo: Information describing an ARM MMU Fault * @s2addr: Address that caused a fault at stage 2 diff --git a/qemu/target/arm/op_helper.c b/qemu/target/arm/op_helper.c index 73603005..7757ecf7 100644 --- a/qemu/target/arm/op_helper.c +++ b/qemu/target/arm/op_helper.c @@ -997,7 +997,7 @@ void HELPER(exception_return)(CPUARMState *env) aarch64_save_sp(env, cur_el); - env->exclusive_addr = -1; + arm_clear_exclusive(env); /* We must squash the PSTATE.SS bit to zero unless both of the * following hold: