ticks_t clockobj_get_time(struct clockobj *clkobj) { ticks_t ns = clockobj_get_tsc(); if (clockobj_get_resolution(clkobj) > 1) return ns / clockobj_get_resolution(clkobj); return ns; }
void __clockobj_ticks_to_timespec(struct clockobj *clkobj, ticks_t ticks, struct timespec *ts) { unsigned int freq; if (clockobj_get_resolution(clkobj) > 1) { freq = clockobj_get_frequency(clkobj); ts->tv_sec = ticks / freq; ts->tv_nsec = ticks - (ts->tv_sec * freq); ts->tv_nsec *= clockobj_get_resolution(clkobj); } else clockobj_ns_to_timespec(ticks, ts); }
void clockobj_get_time(struct clockobj *clkobj, ticks_t *pticks, ticks_t *ptsc) { unsigned long long ns, tsc; tsc = __xn_rdtsc(); ns = cobalt_ticks_to_ns(tsc); if (clockobj_get_resolution(clkobj) > 1) ns /= clockobj_get_resolution(clkobj); *pticks = ns; if (ptsc) *ptsc = tsc; }
void clockobj_get_date(struct clockobj *clkobj, ticks_t *pticks) { unsigned long long ns; read_lock_nocancel(&clkobj->lock); ns = cobalt_ticks_to_ns(__xn_rdtsc()); /* Add offset to epoch. */ ns += (unsigned long long)clkobj->offset.tv_sec * 1000000000ULL; ns += clkobj->offset.tv_nsec; if (clockobj_get_resolution(clkobj) > 1) ns /= clockobj_get_resolution(clkobj); *pticks = ns; read_unlock(&clkobj->lock); }
int sysClkRateGet(void) { unsigned int resolution; struct service svc; COPPERPLATE_PROTECT(svc); resolution = clockobj_get_resolution(&wind_clock); COPPERPLATE_UNPROTECT(svc); return 1000000000 / resolution; }
void clockobj_get_time(struct clockobj *clkobj, ticks_t *pticks, ticks_t *ptsc) { struct timespec now; __RT(clock_gettime(CLOCK_COPPERPLATE, &now)); /* Convert the time value to ticks, with no offset. */ if (clockobj_get_resolution(clkobj) > 1) *pticks = (ticks_t)now.tv_sec * clockobj_get_frequency(clkobj) + (ticks_t)now.tv_nsec / clockobj_get_resolution(clkobj); else *pticks = timespec_scalar(&now); /* * Mercury has a single time source, with TSC == monotonic * time. */ if (ptsc) *ptsc = *pticks; }
void clockobj_get_date(struct clockobj *clkobj, ticks_t *pticks) { struct timespec now, date; read_lock_nocancel(&clkobj->lock); __RT(clock_gettime(CLOCK_COPPERPLATE, &now)); /* Add offset from epoch to current system time. */ timespec_add(&date, &clkobj->offset, &now); /* Convert the time value to ticks,. */ *pticks = (ticks_t)date.tv_sec * clockobj_get_frequency(clkobj) + (ticks_t)date.tv_nsec / clockobj_get_resolution(clkobj); read_unlock(&clkobj->lock); }