[FFmpeg-devel] [PATCH v2] aarch64: Use cntvct_el0 as timer register on Android and macOS
Martin Storsjö
martin at martin.st
Fri Jun 14 14:09:12 EEST 2024
The default timer register pmccntr_el0 usually requires enabling
access with e.g. a kernel module.
On macOS, using cntvct_el0 gives measurements with the same
magnitude as mach_absolute_time (which is used currently), but
possibly with a little less overhead/noise.
---
cntvct_el0 should have less noise than mach_absolute_time or
clock_gettime.
In one tested case, the cntvct_el0 timer has a frequency of 25 MHz
(readable via the register cntfrq_el0).
---
libavutil/aarch64/timer.h | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/libavutil/aarch64/timer.h b/libavutil/aarch64/timer.h
index fadc9568f8..922b0c5598 100644
--- a/libavutil/aarch64/timer.h
+++ b/libavutil/aarch64/timer.h
@@ -24,7 +24,7 @@
#include <stdint.h>
#include "config.h"
-#if HAVE_INLINE_ASM && !defined(__APPLE__)
+#if HAVE_INLINE_ASM
#define AV_READ_TIME read_time
@@ -33,7 +33,16 @@ static inline uint64_t read_time(void)
uint64_t cycle_counter;
__asm__ volatile(
"isb \t\n"
+#if defined(__ANDROID__) || defined(__APPLE__)
+ // cntvct_el0 has lower resolution than pmccntr_el0, but is usually
+ // accessible from user space by default.
+ "mrs %0, cntvct_el0 "
+#else
+ // pmccntr_el0 has higher resolution, but is usually not accessible
+ // from user space by default (but access can be enabled with a custom
+ // kernel module).
"mrs %0, pmccntr_el0 "
+#endif
: "=r"(cycle_counter) :: "memory" );
return cycle_counter;
--
2.39.3 (Apple Git-146)
More information about the ffmpeg-devel
mailing list