aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnaud Patard <arnaud.patard@rtp-net.org>2009-04-11 16:02:46 +0200
committerAurelien Jarno <aurelien@aurel32.net>2009-11-24 19:51:13 +0100
commitfea0ac23c739721264d5bcb0f87718041960a6aa (patch)
tree6cb29419caed5db763b6ed544006fae26c880ce7
parent3ca055883b2a4b0099f1fcb34c5e72fc8e1fa05d (diff)
cpu-all.h: fix cpu_get_real_ticks on mips host
Fix cpu_get_real_ticks: - check should be done on __mips and not __mips_isa_rev - linux kernels >= 2.6.25 are emulating the 2 needed rdhwr functions so it's safe to use rdhwr. This is better than what's currently in but it doesn't mean it works nicely Some tests needs to be done imho Signed-off-by: Arnaud Patard <arnaud.patard@rtp-net.org> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
-rw-r--r--cpu-all.h27
1 files changed, 18 insertions, 9 deletions
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 <reg>, $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