Some architectures have special purpose registers to query the system timer's frequency. Let's use that when available. Signed-off-by: Nicolas Saenz Julienne <nsaenzju@xxxxxxxxxx> --- src/oslat/oslat.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/src/oslat/oslat.c b/src/oslat/oslat.c index bd155a6..23ca9b6 100644 --- a/src/oslat/oslat.c +++ b/src/oslat/oslat.c @@ -51,6 +51,9 @@ # define atomic_inc(ptr) __sync_add_and_fetch((ptr), 1) # if defined(__x86_64__) # define relax() __asm__ __volatile__("pause" ::: "memory") + +#define measure_timer_mhz generic_measure_timer_mhz + static inline void frc(uint64_t *pval) { uint32_t low, high; @@ -61,12 +64,18 @@ static inline void frc(uint64_t *pval) } # elif defined(__i386__) # define relax() __asm__ __volatile__("pause" ::: "memory") + +#define measure_timer_mhz generic_measure_timer_mhz + static inline void frc(uint64_t *pval) { __asm__ __volatile__("rdtsc" : "=A" (*pval)); } # elif defined(__PPC64__) # define relax() do { } while (0) + +#define measure_timer_mhz generic_measure_timer_mhz + static inline void frc(uint64_t *pval) { __asm__ __volatile__("mfspr %0, 268\n" : "=r" (*pval)); @@ -74,6 +83,15 @@ static inline void frc(uint64_t *pval) # elif defined(__aarch64__) # define relax() __asm__ __volatile("yield" : : : "memory") +static inline unsigned int measure_timer_mhz(void) +{ + unsigned int val; + + __asm__ __volatile__("mrs %0, cntfrq_el0" : "=r" (val)); + + return val / 1e6; +} + static inline void frc(uint64_t *pval) { @@ -257,7 +275,7 @@ static cycles_t __measure_timer_hz(void) return (cycles_t) ((e - s) / sec); } -static unsigned int measure_timer_mhz(void) +static unsigned int __attribute__((unused)) generic_measure_timer_mhz(void) { cycles_t m, mprev, d; -- 2.31.1