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)