diff options
-rw-r--r-- | perf_rc_mmap.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/perf_rc_mmap.c b/perf_rc_mmap.c index b87c627..b61fa99 100644 --- a/perf_rc_mmap.c +++ b/perf_rc_mmap.c @@ -25,8 +25,15 @@ #include <signal.h> #include <fcntl.h> +#if defined(__i386__) || defined(__x86_64__) +#define barrier() __asm__ volatile("" ::: "memory") +#elif defined(__aarch64__) #define barrier() asm volatile("dmb ish" : : : "memory") #define isb() asm volatile("isb" : : : "memory") +#else +#define barrier() +#endif + #define ARMV8_PMCNTENSET_EL0_ENABLE (1<<31) /**< Enable Perf count reg */ static int fddev = -1; static unsigned long page_size; @@ -79,6 +86,12 @@ static int counter_init(unsigned int counter,long unsigned int sample) static unsigned long rdpmc(unsigned int counter) { unsigned long int ret; +#if defined(__i386__) || defined(__x86_64__) + unsigned int low, high; + + __asm__ volatile("rdpmc" : "=a" (low), "=d" (high) : "c" (counter)); + ret = (unsigned long)low | ((unsigned long)high) << 32; +#elif defined(__aarch64__) if (counter == PERF_COUNT_HW_CPU_CYCLES) asm volatile("mrs %0, pmccntr_el0" : "=r" (ret)); else { @@ -87,6 +100,9 @@ static unsigned long rdpmc(unsigned int counter) } isb(); +#else + #error "Perf_rc_mmap: rdpmc Unsupported" +#endif return ret; } |