int __wrap_clock_gettime(clockid_t clock_id, struct timespec *tp) { int err; #ifdef XNARCH_HAVE_NONPRIV_TSC if (clock_id == CLOCK_MONOTONIC && __pse51_sysinfo.tickval == 1) { unsigned long long ns; unsigned long rem; ns = xnarch_tsc_to_ns(__xn_rdtsc()); tp->tv_sec = xnarch_divrem_billion(ns, &rem); tp->tv_nsec = rem; return 0; } #endif /* XNARCH_HAVE_NONPRIV_TSC */ err = -XENOMAI_SKINCALL2(__pse51_muxid, __pse51_clock_gettime, clock_id, tp); if (!err) return 0; errno = err; return -1; }
int __wrap_clock_gettime(clockid_t clock_id, struct timespec *tp) { int err; #ifdef CONFIG_XENO_HW_DIRECT_TSC if (clock_id == CLOCK_MONOTONIC && sysinfo.tickval == 1) { unsigned long long tsc; unsigned long rem; tsc = __xn_rdtsc(); tp->tv_sec = xnarch_ulldiv(tsc, sysinfo.cpufreq, &rem); /* Next line is 64 bits safe, since rem is less than sysinfo.cpufreq hence fits on 32 bits. */ tp->tv_nsec = xnarch_imuldiv(rem, 1000000000, sysinfo.cpufreq); return 0; } #endif /* CONFIG_XENO_HW_DIRECT_TSC */ err = -XENOMAI_SKINCALL2(__pse51_muxid, __pse51_clock_gettime, clock_id, tp); if (!err) return 0; errno = err; return -1; }
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); }
ticks_t clockobj_get_tsc(void) { /* Guaranteed to be the source of CLOCK_COPPERPLATE. */ return __xn_rdtsc(); }