#include #include #define armv6_read_ccr( val ) \ asm volatile("mrc p15, 0, %0, c15, c12, 1" : "=r"(val)) #define armv6_read_cr0( val ) \ asm volatile("mrc p15, 0, %0, c15, c12, 2" : "=r"(val)) #define armv6_read_cr1( val ) \ asm volatile("mrc p15, 0, %0, c15, c12, 3" : "=r"(val)) #define armv6_read_pmcr( val ) \ asm volatile("mrc p15, 0, %0, c15, c12, 0" : "=r"(val)) #define armv6_write_pmcr( val ) \ asm volatile("mcr p15, 0, %0, c15, c12, 0" : : "r"(val)) int main( int argc, char** argv, char** envp ) { uint32_t cr1; uint32_t before_ccr, after_ccr; uint32_t before_cr0, after_cr0; uint32_t before_cr1, after_cr1; unsigned int i; armv6_read_cr1( cr1 ); printf("PMCR=%x\n", cr1 ); armv6_write_pmcr( 0x00705707 ); armv6_read_cr1( before_cr1 ); armv6_read_ccr( before_ccr ); armv6_read_cr0( before_cr0 ); // Beginn auszumessende Codesequenz for (i=0; i<10; i++ ) ; // Ende auszumessende Codesequenz armv6_read_cr0( after_cr0 ); armv6_read_ccr( after_ccr ); armv6_read_cr1( after_cr1 ); printf("ccr: %d (before: %d after: %d) CYCLES\n", after_ccr-before_ccr, before_ccr, after_ccr); printf("cr0: %d (before: %d after: %d) INSTRUCTIONS\n", after_cr0-before_cr0, before_cr0, after_cr0); printf("cr1: %d (before: %d after: %d) BRANCHES\n", after_cr1-before_cr1, before_cr1, after_cr1); armv6_read_cr1( cr1 ); printf("PMCR=%x\n", cr1 ); return 0; }