Hi, On 1/19/26 5:59 AM, Philippe Mathieu-Daudé wrote: > Keep CNTV_CTL_EL0 and CNTV_CVAL_EL0 synchronized with the > host hardware accelerator. > > Signed-off-by: Philippe Mathieu-Daudé <[email protected]> > --- > target/arm/hvf/hvf.c | 25 +++++++++++++++++++++++++ > 1 file changed, 25 insertions(+) > > diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c > index fcb7fa3b30c..9ce720793d8 100644 > --- a/target/arm/hvf/hvf.c > +++ b/target/arm/hvf/hvf.c > @@ -200,6 +200,9 @@ void hvf_arm_init_debug(void) > #define SYSREG_PMCEID0_EL0 SYSREG(3, 3, 9, 12, 6) > #define SYSREG_PMCEID1_EL0 SYSREG(3, 3, 9, 12, 7) > #define SYSREG_PMCCNTR_EL0 SYSREG(3, 3, 9, 13, 0) > + > +#define SYSREG_CNTV_CTL_EL0 SYSREG(3, 3, 14, 3, 1) > +#define SYSREG_CNTV_CVAL_EL0 SYSREG(3, 3, 14, 3, 2) > #define SYSREG_PMCCFILTR_EL0 SYSREG(3, 3, 14, 15, 7) > > #define SYSREG_ICC_AP0R0_EL1 SYSREG(3, 0, 12, 8, 4) > @@ -502,6 +505,7 @@ int hvf_arch_get_registers(CPUState *cpu) > uint64_t val; > hv_simd_fp_uchar16_t fpval; > int i, n; > + bool b; > > for (i = 0; i < ARRAY_SIZE(hvf_reg_match); i++) { > ret = hv_vcpu_get_reg(cpu->accel->fd, hvf_reg_match[i].reg, &val); > @@ -631,6 +635,16 @@ int hvf_arch_get_registers(CPUState *cpu) > > aarch64_restore_sp(env, arm_current_el(env)); > > + ret = hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CVAL_EL0, > &val); > + assert_hvf_ok(ret); > + b = hvf_sysreg_write_cp(cpu, "VTimer", SYSREG_CNTV_CVAL_EL0, val); > + assert(b); > + > + ret = hv_vcpu_get_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CTL_EL0, &val); > + assert_hvf_ok(ret); > + b = hvf_sysreg_write_cp(cpu, "VTimer", SYSREG_CNTV_CTL_EL0, val); > + assert(b); > + > return 0; > } > > @@ -642,6 +656,7 @@ int hvf_arch_put_registers(CPUState *cpu) > uint64_t val; > hv_simd_fp_uchar16_t fpval; > int i, n; > + bool b; > > for (i = 0; i < ARRAY_SIZE(hvf_reg_match); i++) { > val = *(uint64_t *)((void *)env + hvf_reg_match[i].offset); > @@ -756,6 +771,16 @@ int hvf_arch_put_registers(CPUState *cpu) > ret = hv_vcpu_set_vtimer_offset(cpu->accel->fd, > hvf_state->vtimer_offset); > assert_hvf_ok(ret); > > + b = hvf_sysreg_read_cp(cpu, "VTimer", SYSREG_CNTV_CVAL_EL0, &val); > + assert(b); > + ret = hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CVAL_EL0, val); > + assert_hvf_ok(ret); > + > + b = hvf_sysreg_read_cp(cpu, "VTimer", SYSREG_CNTV_CTL_EL0, &val); > + assert(b); > + ret = hv_vcpu_set_sys_reg(cpu->accel->fd, HV_SYS_REG_CNTV_CTL_EL0, val); > + assert_hvf_ok(ret); > + > return 0; > }
My Linux guest has been unable to start since this patch. I tested it on M1 (macOS Tahoe 26.2). Not sure if this can be reproduced on your side. Thanks, Zenghui
