1 /* SPDX-License-Identifier: GPL-2.0 */
2 #ifndef ASM_VDSO_GETTIMEOFDAY_H
3 #define ASM_VDSO_GETTIMEOFDAY_H
4 
5 #define VDSO_HAS_TIME 1
6 
7 #define VDSO_HAS_CLOCK_GETRES 1
8 
9 #define VDSO_DELTA_NOMASK 1
10 
11 #include <asm/syscall.h>
12 #include <asm/timex.h>
13 #include <asm/unistd.h>
14 #include <linux/compiler.h>
15 
16 
__arch_get_vdso_data(void)17 static __always_inline const struct vdso_data *__arch_get_vdso_data(void)
18 {
19 	return _vdso_data;
20 }
21 
__arch_get_hw_counter(s32 clock_mode,const struct vdso_data * vd)22 static inline u64 __arch_get_hw_counter(s32 clock_mode, const struct vdso_data *vd)
23 {
24 	u64 adj, now;
25 
26 	now = get_tod_clock();
27 	adj = vd->arch_data.tod_steering_end - now;
28 	if (unlikely((s64) adj > 0))
29 		now += (vd->arch_data.tod_steering_delta < 0) ? (adj >> 15) : -(adj >> 15);
30 	return now;
31 }
32 
33 static __always_inline
clock_gettime_fallback(clockid_t clkid,struct __kernel_timespec * ts)34 long clock_gettime_fallback(clockid_t clkid, struct __kernel_timespec *ts)
35 {
36 	return syscall2(__NR_clock_gettime, (long)clkid, (long)ts);
37 }
38 
39 static __always_inline
gettimeofday_fallback(register struct __kernel_old_timeval * tv,register struct timezone * tz)40 long gettimeofday_fallback(register struct __kernel_old_timeval *tv,
41 			   register struct timezone *tz)
42 {
43 	return syscall2(__NR_gettimeofday, (long)tv, (long)tz);
44 }
45 
46 static __always_inline
clock_getres_fallback(clockid_t clkid,struct __kernel_timespec * ts)47 long clock_getres_fallback(clockid_t clkid, struct __kernel_timespec *ts)
48 {
49 	return syscall2(__NR_clock_getres, (long)clkid, (long)ts);
50 }
51 
52 #ifdef CONFIG_TIME_NS
53 static __always_inline
__arch_get_timens_vdso_data(const struct vdso_data * vd)54 const struct vdso_data *__arch_get_timens_vdso_data(const struct vdso_data *vd)
55 {
56 	return _timens_data;
57 }
58 #endif
59 
60 #endif
61