128b1a824SVincenzo Frascino /* SPDX-License-Identifier: GPL-2.0 */
228b1a824SVincenzo Frascino /*
328b1a824SVincenzo Frascino  * Copyright (C) 2018 ARM Limited
428b1a824SVincenzo Frascino  */
528b1a824SVincenzo Frascino #ifndef __ASM_VDSO_GETTIMEOFDAY_H
628b1a824SVincenzo Frascino #define __ASM_VDSO_GETTIMEOFDAY_H
728b1a824SVincenzo Frascino 
828b1a824SVincenzo Frascino #ifndef __ASSEMBLY__
928b1a824SVincenzo Frascino 
1028b1a824SVincenzo Frascino #include <asm/unistd.h>
1128b1a824SVincenzo Frascino #include <uapi/linux/time.h>
1228b1a824SVincenzo Frascino 
1328b1a824SVincenzo Frascino #define VDSO_HAS_CLOCK_GETRES		1
1428b1a824SVincenzo Frascino 
1528b1a824SVincenzo Frascino static __always_inline
1628b1a824SVincenzo Frascino int gettimeofday_fallback(struct __kernel_old_timeval *_tv,
1728b1a824SVincenzo Frascino 			  struct timezone *_tz)
1828b1a824SVincenzo Frascino {
1928b1a824SVincenzo Frascino 	register struct timezone *tz asm("x1") = _tz;
2028b1a824SVincenzo Frascino 	register struct __kernel_old_timeval *tv asm("x0") = _tv;
2128b1a824SVincenzo Frascino 	register long ret asm ("x0");
2228b1a824SVincenzo Frascino 	register long nr asm("x8") = __NR_gettimeofday;
2328b1a824SVincenzo Frascino 
2428b1a824SVincenzo Frascino 	asm volatile(
2528b1a824SVincenzo Frascino 	"       svc #0\n"
2628b1a824SVincenzo Frascino 	: "=r" (ret)
2728b1a824SVincenzo Frascino 	: "r" (tv), "r" (tz), "r" (nr)
2828b1a824SVincenzo Frascino 	: "memory");
2928b1a824SVincenzo Frascino 
3028b1a824SVincenzo Frascino 	return ret;
3128b1a824SVincenzo Frascino }
3228b1a824SVincenzo Frascino 
3328b1a824SVincenzo Frascino static __always_inline
3428b1a824SVincenzo Frascino long clock_gettime_fallback(clockid_t _clkid, struct __kernel_timespec *_ts)
3528b1a824SVincenzo Frascino {
3628b1a824SVincenzo Frascino 	register struct __kernel_timespec *ts asm("x1") = _ts;
3728b1a824SVincenzo Frascino 	register clockid_t clkid asm("x0") = _clkid;
3828b1a824SVincenzo Frascino 	register long ret asm ("x0");
3928b1a824SVincenzo Frascino 	register long nr asm("x8") = __NR_clock_gettime;
4028b1a824SVincenzo Frascino 
4128b1a824SVincenzo Frascino 	asm volatile(
4228b1a824SVincenzo Frascino 	"       svc #0\n"
4328b1a824SVincenzo Frascino 	: "=r" (ret)
4428b1a824SVincenzo Frascino 	: "r" (clkid), "r" (ts), "r" (nr)
4528b1a824SVincenzo Frascino 	: "memory");
4628b1a824SVincenzo Frascino 
4728b1a824SVincenzo Frascino 	return ret;
4828b1a824SVincenzo Frascino }
4928b1a824SVincenzo Frascino 
5028b1a824SVincenzo Frascino static __always_inline
5128b1a824SVincenzo Frascino int clock_getres_fallback(clockid_t _clkid, struct __kernel_timespec *_ts)
5228b1a824SVincenzo Frascino {
5328b1a824SVincenzo Frascino 	register struct __kernel_timespec *ts asm("x1") = _ts;
5428b1a824SVincenzo Frascino 	register clockid_t clkid asm("x0") = _clkid;
5528b1a824SVincenzo Frascino 	register long ret asm ("x0");
5628b1a824SVincenzo Frascino 	register long nr asm("x8") = __NR_clock_getres;
5728b1a824SVincenzo Frascino 
5828b1a824SVincenzo Frascino 	asm volatile(
5928b1a824SVincenzo Frascino 	"       svc #0\n"
6028b1a824SVincenzo Frascino 	: "=r" (ret)
6128b1a824SVincenzo Frascino 	: "r" (clkid), "r" (ts), "r" (nr)
6228b1a824SVincenzo Frascino 	: "memory");
6328b1a824SVincenzo Frascino 
6428b1a824SVincenzo Frascino 	return ret;
6528b1a824SVincenzo Frascino }
6628b1a824SVincenzo Frascino 
6728b1a824SVincenzo Frascino static __always_inline u64 __arch_get_hw_counter(s32 clock_mode)
6828b1a824SVincenzo Frascino {
6928b1a824SVincenzo Frascino 	u64 res;
7028b1a824SVincenzo Frascino 
7128b1a824SVincenzo Frascino 	asm volatile("mrs %0, cntvct_el0" : "=r" (res) :: "memory");
7228b1a824SVincenzo Frascino 
7328b1a824SVincenzo Frascino 	return res;
7428b1a824SVincenzo Frascino }
7528b1a824SVincenzo Frascino 
7628b1a824SVincenzo Frascino static __always_inline
7728b1a824SVincenzo Frascino const struct vdso_data *__arch_get_vdso_data(void)
7828b1a824SVincenzo Frascino {
7928b1a824SVincenzo Frascino 	return _vdso_data;
8028b1a824SVincenzo Frascino }
8128b1a824SVincenzo Frascino 
8228b1a824SVincenzo Frascino #endif /* !__ASSEMBLY__ */
8328b1a824SVincenzo Frascino 
8428b1a824SVincenzo Frascino #endif /* __ASM_VDSO_GETTIMEOFDAY_H */
85