mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
69 lines
1.9 KiB
69 lines
1.9 KiB
/* |
|
* Copyright (C) 2001 Andrea Arcangeli <[email protected]> SuSE |
|
* Copyright 2003 Andi Kleen, SuSE Labs. |
|
* |
|
* Thanks to [email protected] 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); |
|
}
|
|
|