diff options
Diffstat (limited to 'arch/x86/entry/vsyscall/vsyscall_gtod.c')
| -rw-r--r-- | arch/x86/entry/vsyscall/vsyscall_gtod.c | 51 | 
1 files changed, 28 insertions, 23 deletions
| diff --git a/arch/x86/entry/vsyscall/vsyscall_gtod.c b/arch/x86/entry/vsyscall/vsyscall_gtod.c index e1216dd95c04..cfcdba082feb 100644 --- a/arch/x86/entry/vsyscall/vsyscall_gtod.c +++ b/arch/x86/entry/vsyscall/vsyscall_gtod.c @@ -31,6 +31,8 @@ void update_vsyscall(struct timekeeper *tk)  {  	int vclock_mode = tk->tkr_mono.clock->archdata.vclock_mode;  	struct vsyscall_gtod_data *vdata = &vsyscall_gtod_data; +	struct vgtod_ts *base; +	u64 nsec;  	/* Mark the new vclock used. */  	BUILD_BUG_ON(VCLOCK_MAX >= 32); @@ -45,34 +47,37 @@ void update_vsyscall(struct timekeeper *tk)  	vdata->mult		= tk->tkr_mono.mult;  	vdata->shift		= tk->tkr_mono.shift; -	vdata->wall_time_sec		= tk->xtime_sec; -	vdata->wall_time_snsec		= tk->tkr_mono.xtime_nsec; +	base = &vdata->basetime[CLOCK_REALTIME]; +	base->sec = tk->xtime_sec; +	base->nsec = 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 -					+ ((u64)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++; -	} +	base = &vdata->basetime[CLOCK_TAI]; +	base->sec = tk->xtime_sec + (s64)tk->tai_offset; +	base->nsec = tk->tkr_mono.xtime_nsec; -	vdata->wall_time_coarse_sec	= tk->xtime_sec; -	vdata->wall_time_coarse_nsec	= (long)(tk->tkr_mono.xtime_nsec >> -						 tk->tkr_mono.shift); +	base = &vdata->basetime[CLOCK_MONOTONIC]; +	base->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec; +	nsec = tk->tkr_mono.xtime_nsec; +	nsec +=	((u64)tk->wall_to_monotonic.tv_nsec << tk->tkr_mono.shift); +	while (nsec >= (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) { +		nsec -= ((u64)NSEC_PER_SEC) << tk->tkr_mono.shift; +		base->sec++; +	} +	base->nsec = nsec; -	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; +	base = &vdata->basetime[CLOCK_REALTIME_COARSE]; +	base->sec = tk->xtime_sec; +	base->nsec = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift; -	while (vdata->monotonic_time_coarse_nsec >= NSEC_PER_SEC) { -		vdata->monotonic_time_coarse_nsec -= NSEC_PER_SEC; -		vdata->monotonic_time_coarse_sec++; +	base = &vdata->basetime[CLOCK_MONOTONIC_COARSE]; +	base->sec = tk->xtime_sec + tk->wall_to_monotonic.tv_sec; +	nsec = tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift; +	nsec += tk->wall_to_monotonic.tv_nsec; +	while (nsec >= NSEC_PER_SEC) { +		nsec -= NSEC_PER_SEC; +		base->sec++;  	} +	base->nsec = nsec;  	gtod_write_end(vdata);  } |