xref: /linux/tools/include/nolibc/time.h (revision 6c9be90527207f9beca78e698dd45969813f4c0e)
1 /* SPDX-License-Identifier: LGPL-2.1 OR MIT */
2 /*
3  * time function definitions for NOLIBC
4  * Copyright (C) 2017-2022 Willy Tarreau <w@1wt.eu>
5  */
6 
7 /* make sure to include all global symbols */
8 #include "nolibc.h"
9 
10 #ifndef _NOLIBC_TIME_H
11 #define _NOLIBC_TIME_H
12 
13 #include "std.h"
14 #include "arch.h"
15 #include "types.h"
16 #include "sys.h"
17 
18 #include <linux/signal.h>
19 #include <linux/time.h>
20 
21 /*
22  * int clock_getres(clockid_t clockid, struct timespec *res);
23  * int clock_gettime(clockid_t clockid, struct timespec *tp);
24  * int clock_settime(clockid_t clockid, const struct timespec *tp);
25  * int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
26  *                     struct timespec *rmtp)
27  */
28 
29 static __attribute__((unused))
30 int sys_clock_getres(clockid_t clockid, struct timespec *res)
31 {
32 #if defined(__NR_clock_getres_time64)
33 	return my_syscall2(__NR_clock_getres_time64, clockid, res);
34 #else
35 	return my_syscall2(__NR_clock_getres, clockid, res);
36 #endif
37 }
38 
39 static __attribute__((unused))
40 int clock_getres(clockid_t clockid, struct timespec *res)
41 {
42 	return __sysret(sys_clock_getres(clockid, res));
43 }
44 
45 static __attribute__((unused))
46 int sys_clock_gettime(clockid_t clockid, struct timespec *tp)
47 {
48 #if defined(__NR_clock_gettime64)
49 	return my_syscall2(__NR_clock_gettime64, clockid, tp);
50 #else
51 	return my_syscall2(__NR_clock_gettime, clockid, tp);
52 #endif
53 }
54 
55 static __attribute__((unused))
56 int clock_gettime(clockid_t clockid, struct timespec *tp)
57 {
58 	return __sysret(sys_clock_gettime(clockid, tp));
59 }
60 
61 static __attribute__((unused))
62 int sys_clock_settime(clockid_t clockid, struct timespec *tp)
63 {
64 #if defined(__NR_clock_settime64)
65 	return my_syscall2(__NR_clock_settime64, clockid, tp);
66 #else
67 	return my_syscall2(__NR_clock_settime, clockid, tp);
68 #endif
69 }
70 
71 static __attribute__((unused))
72 int clock_settime(clockid_t clockid, struct timespec *tp)
73 {
74 	return __sysret(sys_clock_settime(clockid, tp));
75 }
76 
77 static __attribute__((unused))
78 int sys_clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
79 			struct timespec *rmtp)
80 {
81 #if defined(__NR_clock_nanosleep_time64)
82 	return my_syscall4(__NR_clock_nanosleep_time64, clockid, flags, rqtp, rmtp);
83 #else
84 	return my_syscall4(__NR_clock_nanosleep, clockid, flags, rqtp, rmtp);
85 #endif
86 }
87 
88 static __attribute__((unused))
89 int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
90 		    struct timespec *rmtp)
91 {
92 	/* Directly return a positive error number */
93 	return -sys_clock_nanosleep(clockid, flags, rqtp, rmtp);
94 }
95 
96 static __inline__
97 double difftime(time_t time1, time_t time2)
98 {
99 	return time1 - time2;
100 }
101 
102 static __inline__
103 int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
104 {
105 	return __sysret(sys_clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rmtp));
106 }
107 
108 
109 static __attribute__((unused))
110 time_t time(time_t *tptr)
111 {
112 	struct timeval tv;
113 
114 	/* note, cannot fail here */
115 	sys_gettimeofday(&tv, NULL);
116 
117 	if (tptr)
118 		*tptr = tv.tv_sec;
119 	return tv.tv_sec;
120 }
121 
122 
123 /*
124  * int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid);
125  * int timer_gettime(timer_t timerid, struct itimerspec *curr_value);
126  * int timer_settime(timer_t timerid, int flags, const struct itimerspec *new_value, struct itimerspec *old_value);
127  */
128 
129 static __attribute__((unused))
130 int sys_timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid)
131 {
132 	return my_syscall3(__NR_timer_create, clockid, evp, timerid);
133 }
134 
135 static __attribute__((unused))
136 int timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid)
137 {
138 	return __sysret(sys_timer_create(clockid, evp, timerid));
139 }
140 
141 static __attribute__((unused))
142 int sys_timer_delete(timer_t timerid)
143 {
144 	return my_syscall1(__NR_timer_delete, timerid);
145 }
146 
147 static __attribute__((unused))
148 int timer_delete(timer_t timerid)
149 {
150 	return __sysret(sys_timer_delete(timerid));
151 }
152 
153 static __attribute__((unused))
154 int sys_timer_gettime(timer_t timerid, struct itimerspec *curr_value)
155 {
156 #if defined(__NR_timer_gettime64)
157 	return my_syscall2(__NR_timer_gettime64, timerid, curr_value);
158 #else
159 	return my_syscall2(__NR_timer_gettime, timerid, curr_value);
160 #endif
161 }
162 
163 static __attribute__((unused))
164 int timer_gettime(timer_t timerid, struct itimerspec *curr_value)
165 {
166 	return __sysret(sys_timer_gettime(timerid, curr_value));
167 }
168 
169 static __attribute__((unused))
170 int sys_timer_settime(timer_t timerid, int flags,
171 		      const struct itimerspec *new_value, struct itimerspec *old_value)
172 {
173 #if defined(__NR_timer_settime64)
174 	return my_syscall4(__NR_timer_settime64, timerid, flags, new_value, old_value);
175 #else
176 	return my_syscall4(__NR_timer_settime, timerid, flags, new_value, old_value);
177 #endif
178 }
179 
180 static __attribute__((unused))
181 int timer_settime(timer_t timerid, int flags,
182 		  const struct itimerspec *new_value, struct itimerspec *old_value)
183 {
184 	return __sysret(sys_timer_settime(timerid, flags, new_value, old_value));
185 }
186 
187 #endif /* _NOLIBC_TIME_H */
188