diff --git a/cpu-all.h b/cpu-all.h index ebe8bfbadb..e21437499e 100644 --- a/cpu-all.h +++ b/cpu-all.h @@ -1017,24 +1017,33 @@ static inline int64_t cpu_get_real_ticks (void) #endif } -#elif defined(__mips__) +#elif (defined(__mips_isa_rev) && __mips_isa_rev >= 2) || defined(__linux__) +/* + * binutils wants to use rdhwr only on mips32r2 + * but as linux kernel emulate it, it's fine + * to use it. + * + */ +#define MIPS_RDHWR(rd, value) { \ + __asm__ __volatile__ ( \ + ".set push\n\t" \ + ".set mips32r2\n\t" \ + "rdhwr %0, "rd"\n\t" \ + ".set pop" \ + : "=r" (value)); \ +} static inline int64_t cpu_get_real_ticks(void) { -#if defined(__mips_isa_rev) && __mips_isa_rev >= 2 +/* On kernels >= 2.6.25 rdhwr , $2 and $3 are emulated */ uint32_t count; static uint32_t cyc_per_count = 0; if (!cyc_per_count) - __asm__ __volatile__("rdhwr %0, $3" : "=r" (cyc_per_count)); + MIPS_RDHWR("$3", cyc_per_count); - __asm__ __volatile__("rdhwr %1, $2" : "=r" (count)); + MIPS_RDHWR("$2", count); return (int64_t)(count * cyc_per_count); -#else - /* FIXME */ - static int64_t ticks = 0; - return ticks++; -#endif } #else