3 #include <sys/sysctl.h>
4 #include <mach/mach_time.h>
6 #define timebase mach_absolute_time
8 static int cpumib
[2] = { CTL_HW
, HW_CPU_FREQ
} ;
9 static int tbmib
[2] = { CTL_HW
, HW_TB_FREQ
} ;
11 static long myround(double u
)
14 while (result
+ 0.5 < u
) result
+= 1;
15 while (result
- 0.5 > u
) result
-= 1;
19 static long tbcycles
= 0;
21 static void init(void)
23 unsigned int cpufrequency
= 0; size_t cpufrequencylen
= sizeof(unsigned int);
24 unsigned int tbfrequency
= 0; size_t tbfrequencylen
= sizeof(unsigned int);
25 sysctl(cpumib
,2,&cpufrequency
,&cpufrequencylen
,0,0);
26 sysctl(tbmib
,2,&tbfrequency
,&tbfrequencylen
,0,0);
28 tbcycles
= myround((double) (unsigned long long) cpufrequency
29 / (double) (unsigned long long) tbfrequency
);
32 long long cpucycles_powerpcmacos(void)
34 if (!tbcycles
) init();
35 return timebase() * tbcycles
;
38 long long cpucycles_powerpcmacos_persecond(void)
40 unsigned int result
= 0; size_t resultlen
= sizeof(unsigned int);
41 sysctl(cpumib
,2,&result
,&resultlen
,0,0);
42 return (unsigned long long) result
;