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