@samitouri / QOSamiQemu / commits / 71e947b7f4

target/arm: trigger timer recalc on HCR:(E2H|TGE) changes

Toggling the HCR state affects the offset calculated in gt_phys_raw_cnt_offset so we should trigger a re-calculation on its change. Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-id: 20260624124527.1018912-6-alex.bennee@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Alex Bennée committed Jun 24, 2026 at 13:45 UTC 71e947b7f4e39a66bdd20827b85d32db3b6a34ac
1 file changed +10
target/arm/helper.c
+10
@@ -3716,6 +3716,7 @@ static const ARMCPRegInfo v8_aa32_el1_reginfo[] = {
3716 static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
3717 {
3718 ARMCPU *cpu = env_archcpu(env);
3719 + bool hcr_change_timer;
3720
3721 if (arm_feature(env, ARM_FEATURE_V8)) {
3722 valid_mask |= MAKE_64BIT_MASK(0, 34); /* ARMv8.0 */
@@ -3807,6 +3808,10 @@ static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
3808 (HCR_VM | HCR_PTW | HCR_DC | HCR_DCT | HCR_FWB | HCR_NV | HCR_NV1)) {
3809 tlb_flush(CPU(cpu));
3810 }
3811 + hcr_change_timer = (env->cp15.hcr_el2 ^ value) &
3812 + (HCR_E2H | HCR_TGE);
3813 +
3814 + /* update */
3815 env->cp15.hcr_el2 = value;
3816
3817 /*
@@ -3828,6 +3833,11 @@ static void do_hcr_write(CPUARMState *env, uint64_t value, uint64_t valid_mask)
3833 arm_cpu_update_vinmi(cpu);
3834 arm_cpu_update_vfnmi(cpu);
3835 }
3836 + if (hcr_change_timer) {
3837 +#ifndef CONFIG_USER_ONLY
3838 + gt_recalc_timer(cpu, GTIMER_PHYS);
3839 +#endif
3840 + }
3841 }
3842
3843 static void hcr_write(CPUARMState *env, const ARMCPRegInfo *ri, uint64_t value)