void pvclock_read_wallclock(struct pvclock_wall_clock *wall_clock, struct pvclock_vcpu_time_info *vcpu_time, struct timespec *ts) { u32 version; u64 delta; struct timespec now; /* get wallclock at system boot */ do { version = wall_clock->version; rmb(); /* fetch version before time */ now.tv_sec = wall_clock->sec; now.tv_nsec = wall_clock->nsec; rmb(); /* fetch time before checking version */ } while ((wall_clock->version & 1) || (version != wall_clock->version)); delta = pvclock_clocksource_read(vcpu_time); /* time since system boot */ delta += now.tv_sec * (u64)NSEC_PER_SEC + now.tv_nsec; now.tv_nsec = do_div(delta, NSEC_PER_SEC); now.tv_sec = delta; set_normalized_timespec(ts, now.tv_sec, now.tv_nsec); }
cycle_t xen_clocksource_read(void) { struct pvclock_vcpu_time_info *src; cycle_t ret; src = &get_cpu_var(xen_vcpu)->time; ret = pvclock_clocksource_read(src); put_cpu_var(xen_vcpu); return ret; }
u64 xen_clocksource_read(void) { struct pvclock_vcpu_time_info *src; u64 ret; preempt_disable_notrace(); src = &__this_cpu_read(xen_vcpu)->time; ret = pvclock_clocksource_read(src); preempt_enable_notrace(); return ret; }
cycle_t xen_clocksource_read(void) { struct pvclock_vcpu_time_info *src; cycle_t ret; preempt_disable_notrace(); src = &__get_cpu_var(xen_vcpu)->time; ret = pvclock_clocksource_read(src); preempt_enable_notrace(); return ret; }