On Apr 17 16:38, Aaron Lindsay wrote: > diff --git a/target/arm/helper.c b/target/arm/helper.c > index 046e37c..2efdc63 100644 > --- a/target/arm/helper.c > +++ b/target/arm/helper.c > @@ -973,6 +986,11 @@ static uint64_t cycles_get_count(CPUARMState *env) > } > > #ifndef CONFIG_USER_ONLY > +static int64_t cycles_ns_per(uint64_t cycles) > +{ > + return ARM_CPU_FREQ / NANOSECONDS_PER_SECOND; > +}
This should be: return (ARM_CPU_FREQ / NANOSECONDS_PER_SECOND) * cycles; This took me a while to catch because it doesn't actually affect functional correctness, but means QEMU slows down because the timer callback is called every ns... > @@ -1215,13 +1259,24 @@ void pmccntr_op_start(CPUARMState *env) > void pmccntr_op_finish(CPUARMState *env) > { > if (pmu_counter_enabled(env, 31)) { > - uint64_t prev_cycles = env->cp15.c15_ccnt_delta; > +#ifndef CONFIG_USER_ONLY > + uint64_t delta = ((env->cp15.c9_pmcr & PMCRLC) ? > + UINT64_MAX : UINT32_MAX) - (uint32_t)env->cp15.c15_ccnt + 1; I also shouldn't be casting to a uint32_t if PMCR.LC is set. I've fixed these locally for the next round. -Aaron -- Qualcomm Datacenter Technologies as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.