2 cpucycles/cortex.c version 20101203
12 static int enabled
= 0;
15 static unsigned long long prevcycles
= 0;
17 static long long cyclespersec
= 0;
19 static void readticks(unsigned int *result
)
24 asm volatile("mcr p15, 0, %0, c9, c12, 0" :: "r"(17));
25 asm volatile("mcr p15, 0, %0, c9, c12, 1" :: "r"(0x8000000f));
26 asm volatile("mcr p15, 0, %0, c9, c12, 3" :: "r"(0x8000000f));
29 asm volatile("mrc p15, 0, %0, c9, c13, 0" : "=r"(cc
));
30 gettimeofday(&t
,(struct timezone
*) 0);
32 result
[1] = t
.tv_usec
;
36 long long cpucycles_cortex(void)
38 unsigned long long delta4
;
41 unsigned long long guesscycles
;
44 delta4
= (unsigned int) (now
[0] - prev
[0]); /* unsigned change in number of cycles mod 2^32 */
45 deltan
= now
[1] - prev
[1]; /* signed change in number of nanoseconds mod 10^9 */
46 deltas
= now
[2] - prev
[2]; /* signed change in number of seconds */
47 if ((deltas
== 0 && deltan
< 200000) || (deltas
== 1 && deltan
< -800000))
48 return (prevcycles
+ delta4
) * SCALE
;
54 if ((deltas
== 0 && deltan
< 300000) || (deltas
== 1 && deltan
< -700000)) {
55 // actual number of cycles cannot have increased by 2^32 in <0.3ms
56 cyclespersec
= 1000000 * (unsigned long long) delta4
;
57 cyclespersec
/= deltan
+ 1000000 * (long long) deltas
;
59 guesscycles
= deltas
* cyclespersec
;
60 guesscycles
+= (deltan
* cyclespersec
) / 1000000;
61 while (delta4
+ 2147483648ULL < guesscycles
) delta4
+= 4294967296ULL;
62 /* XXX: could do longer-term extrapolation here */
66 return prevcycles
* SCALE
;
69 long long cpucycles_cortex_persecond(void)
71 while (!cyclespersec
) cpucycles_cortex();
72 return cyclespersec
* SCALE
;