diff --git a/src/utils/timeStamp.cpp b/src/utils/timeStamp.cpp index aa7e5c50..8fd11e9f 100644 --- a/src/utils/timeStamp.cpp +++ b/src/utils/timeStamp.cpp @@ -19,12 +19,30 @@ #include #pragma intrinsic(__rdtsc) #else +#if defined(__x86_64_) || defined(__i386__) #include #endif +#endif static uint64_t rdtsc() { +#if defined(__arm64__) || defined(__arm__) + // SPDX-License-Identifier: GPL-2.0 + uint64_t val = 0; + + /* + * According to ARM DDI 0487F.c, from Armv8.0 to Armv8.5 inclusive, the + * system counter is at least 56 bits wide; from Armv8.6, the counter + * must be 64 bits wide. So the system counter could be less than 64 + * bits wide and it is attributed with the flag 'cap_user_time_short' + * is true. + */ + asm volatile("mrs %0, cntvct_el0" : "=r" (val)); + + return val; +#else return __rdtsc(); +#endif } #endif