^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright 2003 Andi Kleen, SuSE Labs.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Thanks to hpa@transmeta.com for some useful hint.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Special thanks to Ingo Molnar for his early experience with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * a different vsyscall implementation for Linux/IA32 and for the name.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/time.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/timekeeper_internal.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <asm/vvar.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) void update_vsyscall_tz(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) if (unlikely(vvar_data == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) vvar_data->tz_minuteswest = sys_tz.tz_minuteswest;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) vvar_data->tz_dsttime = sys_tz.tz_dsttime;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) void update_vsyscall(struct timekeeper *tk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) struct vvar_data *vdata = vvar_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) if (unlikely(vdata == NULL))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) vvar_write_begin(vdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) vdata->vclock_mode = tk->tkr_mono.clock->archdata.vclock_mode;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) vdata->clock.cycle_last = tk->tkr_mono.cycle_last;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) vdata->clock.mask = tk->tkr_mono.mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) vdata->clock.mult = tk->tkr_mono.mult;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) vdata->clock.shift = tk->tkr_mono.shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) vdata->wall_time_sec = tk->xtime_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) vdata->wall_time_snsec = tk->tkr_mono.xtime_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) vdata->monotonic_time_sec = tk->xtime_sec +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) tk->wall_to_monotonic.tv_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) vdata->monotonic_time_snsec = tk->tkr_mono.xtime_nsec +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) (tk->wall_to_monotonic.tv_nsec <<
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) tk->tkr_mono.shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) while (vdata->monotonic_time_snsec >=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) (((u64)NSEC_PER_SEC) << tk->tkr_mono.shift)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) vdata->monotonic_time_snsec -=
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) ((u64)NSEC_PER_SEC) << tk->tkr_mono.shift;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) vdata->monotonic_time_sec++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) vdata->wall_time_coarse_sec = tk->xtime_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) vdata->wall_time_coarse_nsec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) (long)(tk->tkr_mono.xtime_nsec >> tk->tkr_mono.shift);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) vdata->monotonic_time_coarse_sec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) vdata->wall_time_coarse_sec + tk->wall_to_monotonic.tv_sec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) vdata->monotonic_time_coarse_nsec =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) vdata->wall_time_coarse_nsec + tk->wall_to_monotonic.tv_nsec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) while (vdata->monotonic_time_coarse_nsec >= NSEC_PER_SEC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) vdata->monotonic_time_coarse_nsec -= NSEC_PER_SEC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) vdata->monotonic_time_coarse_sec++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) vvar_write_end(vdata);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }