/*
 *  Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
 *  Copyright 2003 Andi Kleen, SuSE Labs.
 *
 *  Thanks to hpa@transmeta.com for some useful hint.
 *  Special thanks to Ingo Molnar for his early experience with
 *  a different vsyscall implementation for Linux/IA32 and for the name.
 */

#include <linux/time.h>
#include <linux/timekeeper_internal.h>

#include <asm/vvar.h>

void update_vsyscall_tz(void)
{
	if (unlikely(vvar_data == NULL))
		return;

	vvar_data->tz_minuteswest = sys_tz.tz_minuteswest;
	vvar_data->tz_dsttime = sys_tz.tz_dsttime;
}

void update_vsyscall(struct timekeeper *tk)
{
	struct vvar_data *vdata = vvar_data;

	if (unlikely(vdata == NULL))
		return;

	vvar_write_begin(vdata);
	vdata->vclock_mode = tk->tkr_mono.clock->archdata.vclock_mode;
	vdata->clock.cycle_last = tk->tkr_mono.cycle_last;
	vdata->clock.mask = tk->tkr_mono.mask;
	vdata->clock.mult = tk->tkr_mono.mult;
	vdata->clock.shift = tk->tkr_mono.shift;

	vdata->wall_time_sec = tk->xtime_sec;
	vdata->wall_time_snsec = tk->tkr_mono.xtime_nsec;

	vdata->monotonic_time_sec = tk->xtime_sec +
				    tk->wall_to_monotonic.tv_sec;
	vdata->monotonic_time_snsec = tk->tkr_mono.xtime_nsec +
				      (tk->wall_to_monotonic.tv_nsec <<
				       tk->tkr_mono.shift);

	while (vdata->monotonic_time_snsec >=
	       (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) {
		vdata->monotonic_time_snsec -=
				((u64)NSEC_PER_SEC) << tk->tkr_mono.shift;
		vdata->monotonic_time_sec++;
	}

	vdata->wall_time_coarse_sec = tk->xtime_sec;
	vdata->wall_time_coarse_nsec =
			(long)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift);

	vdata->monotonic_time_coarse_sec =
		vdata->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
	vdata->monotonic_time_coarse_nsec =
		vdata->wall_time_coarse_nsec + tk->wall_to_monotonic.tv_nsec;

	while (vdata->monotonic_time_coarse_nsec >= NSEC_PER_SEC) {
		vdata->monotonic_time_coarse_nsec -= NSEC_PER_SEC;
		vdata->monotonic_time_coarse_sec++;
	}

	vvar_write_end(vdata);
}
