}
#elif defined (__arm__)
-
+#if defined(__ARM_ARCH_7A__)
+always_inline u64 clib_cpu_time_now (void)
+{
+ u64 tsc;
+ asm volatile("mrrc p15, 0, %Q0, %R0, c9" : "=r" (tsc));
+ return tsc;
+}
+#else
always_inline u64 clib_cpu_time_now (void)
{
u32 lo;
: [lo] "=r" (lo));
return (u64) lo;
}
+#endif
#elif defined (__xtensa__)
return ((u64)h << 32) | l;
}
-#else
+#elif defined (__aarch64__)
+always_inline u64 clib_cpu_time_now (void)
+{
+ u64 tsc;
+
+ /* Works on Cavium ThunderX. Other platforms: YMMV */
+ asm volatile("mrs %0, cntvct_el0" : "=r" (tsc));
+ return tsc;
+}
+
+#else
#error "don't know how to read CPU time stamp"
#endif