From 9c7288e86e0eb6070f9d08b43820658d00f03fe4 Mon Sep 17 00:00:00 2001 From: Dmitrii Golovanov Date: Wed, 15 Jan 2025 19:15:26 +0100 Subject: [PATCH] arch: common: timing: Fix timing cycles 32bit rollover Fix `arch_timing_cycles_get()` to prevent overflow on 32bit cycles rollover. Also make `arch_timing_counter_get()` to work 64bit when `CONFIG_TIMER_HAS_64BIT_CYCLE_COUNTER` is set. The issue was observable, for example when `tests/benchmarks/wait_queues` or `tests/benchmarks/sched_queues` were executed on qemu for `mps2/an385` and the benchmark has its iterations large enough as the default BENCHMARK_NUM_ITERATIONS=1000. Signed-off-by: Dmitrii Golovanov --- arch/common/timing.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/arch/common/timing.c b/arch/common/timing.c index 8a4f65caa33..642ba79659f 100644 --- a/arch/common/timing.c +++ b/arch/common/timing.c @@ -22,13 +22,21 @@ void arch_timing_stop(void) timing_t arch_timing_counter_get(void) { +#if CONFIG_TIMER_HAS_64BIT_CYCLE_COUNTER + return k_cycle_get_64(); +#else return k_cycle_get_32(); +#endif } uint64_t arch_timing_cycles_get(volatile timing_t *const start, volatile timing_t *const end) { +#if CONFIG_TIMER_HAS_64BIT_CYCLE_COUNTER return (*end - *start); +#else + return ((uint32_t)*end - (uint32_t)*start); +#endif }