17e300dabSThomas Gleixner // SPDX-License-Identifier: GPL-2.0-only
2d603c8e1SIngo Molnar /*
3d603c8e1SIngo Molnar  * Fast user context implementation of clock_gettime, gettimeofday, and time.
4d603c8e1SIngo Molnar  *
57ac87074SVincenzo Frascino  * Copyright 2006 Andi Kleen, SUSE Labs.
67ac87074SVincenzo Frascino  * Copyright 2019 ARM Limited
77ac87074SVincenzo Frascino  *
8d603c8e1SIngo Molnar  * 32 Bit compat layer by Stefani Seibold <stefani@seibold.net>
9d603c8e1SIngo Molnar  *  sponsored by Rohde & Schwarz GmbH & Co. KG Munich/Germany
10d603c8e1SIngo Molnar  */
11d603c8e1SIngo Molnar #include <linux/time.h>
1276480a6aSAndy Lutomirski #include <linux/kernel.h>
137ac87074SVincenzo Frascino #include <linux/types.h>
14d603c8e1SIngo Molnar 
157ac87074SVincenzo Frascino #include "../../../../lib/vdso/gettimeofday.c"
16d603c8e1SIngo Molnar 
177ac87074SVincenzo Frascino extern int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz);
1821346564SArnd Bergmann extern __kernel_old_time_t __vdso_time(__kernel_old_time_t *t);
19d603c8e1SIngo Molnar 
__vdso_gettimeofday(struct __kernel_old_timeval * tv,struct timezone * tz)207ac87074SVincenzo Frascino int __vdso_gettimeofday(struct __kernel_old_timeval *tv, struct timezone *tz)
21d603c8e1SIngo Molnar {
227ac87074SVincenzo Frascino 	return __cvdso_gettimeofday(tv, tz);
23d603c8e1SIngo Molnar }
24d603c8e1SIngo Molnar 
257ac87074SVincenzo Frascino int gettimeofday(struct __kernel_old_timeval *, struct timezone *)
26d603c8e1SIngo Molnar 	__attribute__((weak, alias("__vdso_gettimeofday")));
27d603c8e1SIngo Molnar 
__vdso_time(__kernel_old_time_t * t)2821346564SArnd Bergmann __kernel_old_time_t __vdso_time(__kernel_old_time_t *t)
29d603c8e1SIngo Molnar {
307ac87074SVincenzo Frascino 	return __cvdso_time(t);
31d603c8e1SIngo Molnar }
327ac87074SVincenzo Frascino 
3321346564SArnd Bergmann __kernel_old_time_t time(__kernel_old_time_t *t)	__attribute__((weak, alias("__vdso_time")));
347ac87074SVincenzo Frascino 
357ac87074SVincenzo Frascino 
367ac87074SVincenzo Frascino #if defined(CONFIG_X86_64) && !defined(BUILD_VDSO32_64)
377ac87074SVincenzo Frascino /* both 64-bit and x32 use these */
387ac87074SVincenzo Frascino extern int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts);
39f66501dcSVincenzo Frascino extern int __vdso_clock_getres(clockid_t clock, struct __kernel_timespec *res);
407ac87074SVincenzo Frascino 
__vdso_clock_gettime(clockid_t clock,struct __kernel_timespec * ts)417ac87074SVincenzo Frascino int __vdso_clock_gettime(clockid_t clock, struct __kernel_timespec *ts)
427ac87074SVincenzo Frascino {
437ac87074SVincenzo Frascino 	return __cvdso_clock_gettime(clock, ts);
447ac87074SVincenzo Frascino }
457ac87074SVincenzo Frascino 
467ac87074SVincenzo Frascino int clock_gettime(clockid_t, struct __kernel_timespec *)
477ac87074SVincenzo Frascino 	__attribute__((weak, alias("__vdso_clock_gettime")));
487ac87074SVincenzo Frascino 
__vdso_clock_getres(clockid_t clock,struct __kernel_timespec * res)49f66501dcSVincenzo Frascino int __vdso_clock_getres(clockid_t clock,
50f66501dcSVincenzo Frascino 			struct __kernel_timespec *res)
51f66501dcSVincenzo Frascino {
52f66501dcSVincenzo Frascino 	return __cvdso_clock_getres(clock, res);
53f66501dcSVincenzo Frascino }
54f66501dcSVincenzo Frascino int clock_getres(clockid_t, struct __kernel_timespec *)
55f66501dcSVincenzo Frascino 	__attribute__((weak, alias("__vdso_clock_getres")));
56f66501dcSVincenzo Frascino 
577ac87074SVincenzo Frascino #else
587ac87074SVincenzo Frascino /* i386 only */
597ac87074SVincenzo Frascino extern int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts);
60f66501dcSVincenzo Frascino extern int __vdso_clock_getres(clockid_t clock, struct old_timespec32 *res);
617ac87074SVincenzo Frascino 
__vdso_clock_gettime(clockid_t clock,struct old_timespec32 * ts)627ac87074SVincenzo Frascino int __vdso_clock_gettime(clockid_t clock, struct old_timespec32 *ts)
637ac87074SVincenzo Frascino {
647ac87074SVincenzo Frascino 	return __cvdso_clock_gettime32(clock, ts);
657ac87074SVincenzo Frascino }
667ac87074SVincenzo Frascino 
677ac87074SVincenzo Frascino int clock_gettime(clockid_t, struct old_timespec32 *)
687ac87074SVincenzo Frascino 	__attribute__((weak, alias("__vdso_clock_gettime")));
697ac87074SVincenzo Frascino 
__vdso_clock_gettime64(clockid_t clock,struct __kernel_timespec * ts)7022ca9622SVincenzo Frascino int __vdso_clock_gettime64(clockid_t clock, struct __kernel_timespec *ts)
7122ca9622SVincenzo Frascino {
7222ca9622SVincenzo Frascino 	return __cvdso_clock_gettime(clock, ts);
7322ca9622SVincenzo Frascino }
7422ca9622SVincenzo Frascino 
7522ca9622SVincenzo Frascino int clock_gettime64(clockid_t, struct __kernel_timespec *)
7622ca9622SVincenzo Frascino 	__attribute__((weak, alias("__vdso_clock_gettime64")));
7722ca9622SVincenzo Frascino 
__vdso_clock_getres(clockid_t clock,struct old_timespec32 * res)78f66501dcSVincenzo Frascino int __vdso_clock_getres(clockid_t clock, struct old_timespec32 *res)
79f66501dcSVincenzo Frascino {
80f66501dcSVincenzo Frascino 	return __cvdso_clock_getres_time32(clock, res);
81f66501dcSVincenzo Frascino }
82f66501dcSVincenzo Frascino 
83f66501dcSVincenzo Frascino int clock_getres(clockid_t, struct old_timespec32 *)
84f66501dcSVincenzo Frascino 	__attribute__((weak, alias("__vdso_clock_getres")));
857ac87074SVincenzo Frascino #endif
86