5 #include <sys/syscall.h>
7 #include <mach/clock_types.h>
9 #include <mach/mach_time.h>
10 #include <machine/cpu_capabilities.h>
12 int __commpage_gettimeofday(struct timeval
*);
15 #define TIME_ADD(rsecs, secs, rfrac, frac, unit) \
18 while ((rfrac) >= (unit)) { \
26 int __commpage_gettimeofday(struct timeval
*tp
) {
27 commpage_timeofday_data_t
*commpage_timeofday_datap
;
31 uint32_t TimeStamp_usec
;
32 uint32_t TimeStamp_sec
;
33 uint32_t TimeBaseTicks_per_sec
;
34 uint64_t TimeBase_magic
;
35 uint32_t TimeBase_add
;
36 uint32_t TimeBase_shift
;
40 commpage_timeofday_datap
= (commpage_timeofday_data_t
*)_COMM_PAGE_TIMEOFDAY_DATA
;
43 TimeBase
= commpage_timeofday_datap
->TimeBase
;
44 TimeStamp_sec
= commpage_timeofday_datap
->TimeStamp_sec
;
45 TimeStamp_usec
= commpage_timeofday_datap
->TimeStamp_usec
;
46 TimeBaseTicks_per_sec
= commpage_timeofday_datap
->TimeBaseTicks_per_sec
;
47 TimeBase_magic
= commpage_timeofday_datap
->TimeBase_magic
;
48 TimeBase_add
= commpage_timeofday_datap
->TimeBase_add
;
49 TimeBase_shift
= commpage_timeofday_datap
->TimeBase_shift
;
50 } while (TimeBase
!= commpage_timeofday_datap
->TimeBase
);
55 tbr
= mach_absolute_time();
59 if (t64
>= (uint64_t)TimeBaseTicks_per_sec
)
63 q
= ((uint64_t)x
* (uint32_t)(TimeBase_magic
)) >> 32;
64 tp
->tv_usec
= TimeBase_add
? (((x
- q
) >> 1) + q
) >> (TimeBase_shift
- 1) : q
>> TimeBase_shift
;
67 TIME_ADD(tp
->tv_sec
, TimeStamp_sec
, tp
->tv_usec
, TimeStamp_usec
, USEC_PER_SEC
);