#include static void prep_cc(void) { asm volatile( " msr pmovsclr_el0, %0\n" " msr pmccfiltr_el0, %1\n" " msr pmcntenset_el0, %2\n" " msr pmcr_el0, %3\n" " isb\n" : : "r" (1 << 31), "r" (1 << 27), "r" (1 << 31), "r" (1 << 6 | 1 << 2 | 1 << 0)); } int main(void) { unsigned long start, end; unsigned int sctlr; int i, zeros = 0; asm volatile("mrs %0, sctlr_el1" : "=&r" (sctlr)); prep_cc(); for (i = 0; i < 100000; ++i) { asm volatile( " mrs %0, pmccntr_el0\n" " msr sctlr_el1, %2\n" " mrs %1, pmccntr_el0\n" " isb\n" : "=&r" (start), "=&r" (end) : "r" (sctlr)); if ((i % 10) == 0) printf("\n"); printf(" %d", end - start); if ((end - start) == 0) { ++zeros; prep_cc(); } } printf("\nnum zero counts = %d\n", zeros); return 0; }