arm_commpage_gettimeofday.c   [plain text]


#include <time.h>
#include <tzfile.h>
#include <sys/time.h>
#include <errno.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <mach/clock_types.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <machine/cpu_capabilities.h>

int __commpage_gettimeofday(struct timeval *);

 
#define TIME_ADD(rsecs, secs, rfrac, frac, unit)	\
{							\
	(rfrac) += (frac);				\
	while ((rfrac) >= (unit)) {			\
		(rfrac) -= (unit);			\
		(rsecs) += 1;				\
	}						\
	(rsecs) += (secs);				\
}


int __commpage_gettimeofday(struct timeval  *tp) {
        commpage_timeofday_data_t *commpage_timeofday_datap;
	uint64_t	tbr;
	uint64_t	t64;
	uint64_t	TimeBase;
	uint32_t	TimeStamp_usec;
	uint32_t	TimeStamp_sec;
	uint32_t	TimeBaseTicks_per_sec;
	uint64_t	TimeBase_magic;
	uint32_t	TimeBase_add;
	uint32_t	TimeBase_shift;
	uint32_t	x, q;


        commpage_timeofday_datap =  (commpage_timeofday_data_t *)_COMM_PAGE_TIMEOFDAY_DATA;

	do {
		TimeBase = commpage_timeofday_datap->TimeBase;
		TimeStamp_sec = commpage_timeofday_datap->TimeStamp_sec;
		TimeStamp_usec = commpage_timeofday_datap->TimeStamp_usec;
		TimeBaseTicks_per_sec = commpage_timeofday_datap->TimeBaseTicks_per_sec;
		TimeBase_magic = commpage_timeofday_datap->TimeBase_magic;
		TimeBase_add = commpage_timeofday_datap->TimeBase_add;
		TimeBase_shift = commpage_timeofday_datap->TimeBase_shift;
	} while (TimeBase != commpage_timeofday_datap->TimeBase);

	if (TimeBase == 0)
		return(1);

	tbr = mach_absolute_time();

	t64 = tbr - TimeBase;

	if (t64 >= (uint64_t)TimeBaseTicks_per_sec)
		return(1);

	x = (uint32_t)t64;
	q = ((uint64_t)x * (uint32_t)(TimeBase_magic)) >> 32;
	tp->tv_usec = TimeBase_add ? (((x - q) >> 1) + q) >> (TimeBase_shift - 1) : q >> TimeBase_shift;
	tp->tv_sec = 0;

	TIME_ADD(tp->tv_sec, TimeStamp_sec, tp->tv_usec, TimeStamp_usec, USEC_PER_SEC);

	return(0);
}