10 static unsigned long long prevcycles
= 0;
12 static long long cyclespersec
= 0;
14 static void readdev(unsigned int *result
)
16 if (read(fddev
,result
,12) == 12) return;
17 result
[0] = result
[1] = result
[2] = 0;
20 long long cpucycles_dev4ns(void)
22 unsigned long long delta4
;
25 unsigned long long guesscycles
;
28 fddev
= open("/dev/cpucycles4ns",O_RDONLY
);
33 delta4
= (unsigned int) (now
[0] - prev
[0]); /* unsigned change in number of cycles mod 2^32 */
34 deltan
= now
[1] - prev
[1]; /* signed change in number of nanoseconds mod 10^9 */
35 deltas
= now
[2] - prev
[2]; /* signed change in number of seconds */
36 if ((deltas
== 0 && deltan
< 200000000) || (deltas
== 1 && deltan
< -800000000))
37 return prevcycles
+ delta4
;
43 if ((deltas
== 0 && deltan
< 300000000) || (deltas
== 1 && deltan
< -700000000)) {
44 // actual number of cycles cannot have increased by 2^32 in <0.3ms
45 cyclespersec
= 1000000000 * (unsigned long long) delta4
;
46 cyclespersec
/= deltan
+ 1000000000 * (long long) deltas
;
48 guesscycles
= deltas
* cyclespersec
;
49 guesscycles
+= (deltan
* cyclespersec
) / 1000000000;
50 while (delta4
+ 2147483648ULL < guesscycles
) delta4
+= 4294967296ULL;
51 /* XXX: could do longer-term extrapolation here */
58 long long cpucycles_dev4ns_persecond(void)
60 while (!cyclespersec
) cpucycles_dev4ns();