Skip to content

Commit 7c02bc4

Browse files
committed
tools/nolibc: add support for clock_nanosleep() and nanosleep()
Also add some tests. Signed-off-by: Thomas Weißschuh <[email protected]> Acked-by: Willy Tarreau <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Thomas Weißschuh <[email protected]>
1 parent 1536aa0 commit 7c02bc4

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

tools/include/nolibc/time.h

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ void __nolibc_timespec_kernel_to_user(const struct __kernel_timespec *kts, struc
3636
* int clock_getres(clockid_t clockid, struct timespec *res);
3737
* int clock_gettime(clockid_t clockid, struct timespec *tp);
3838
* int clock_settime(clockid_t clockid, const struct timespec *tp);
39+
* int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
40+
* struct timespec *rmtp)
3941
*/
4042

4143
static __attribute__((unused))
@@ -107,13 +109,45 @@ int clock_settime(clockid_t clockid, struct timespec *tp)
107109
return __sysret(sys_clock_settime(clockid, tp));
108110
}
109111

112+
static __attribute__((unused))
113+
int sys_clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
114+
struct timespec *rmtp)
115+
{
116+
#if defined(__NR_clock_nanosleep)
117+
return my_syscall4(__NR_clock_nanosleep, clockid, flags, rqtp, rmtp);
118+
#elif defined(__NR_clock_nanosleep_time64)
119+
struct __kernel_timespec krqtp, krmtp;
120+
int ret;
121+
122+
__nolibc_timespec_user_to_kernel(rqtp, &krqtp);
123+
ret = my_syscall4(__NR_clock_nanosleep_time64, clockid, flags, &krqtp, &krmtp);
124+
if (rmtp)
125+
__nolibc_timespec_kernel_to_user(&krmtp, rmtp);
126+
return ret;
127+
#else
128+
return __nolibc_enosys(__func__, clockid, flags, rqtp, rmtp);
129+
#endif
130+
}
131+
132+
static __attribute__((unused))
133+
int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp,
134+
struct timespec *rmtp)
135+
{
136+
return __sysret(sys_clock_nanosleep(clockid, flags, rqtp, rmtp));
137+
}
110138

111139
static __inline__
112140
double difftime(time_t time1, time_t time2)
113141
{
114142
return time1 - time2;
115143
}
116144

145+
static __inline__
146+
int nanosleep(const struct timespec *rqtp, struct timespec *rmtp)
147+
{
148+
return clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rmtp);
149+
}
150+
117151

118152
static __attribute__((unused))
119153
time_t time(time_t *tptr)

tools/testing/selftests/nolibc/nolibc-test.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,7 @@ int run_syscall(int min, int max)
13631363
CASE_TEST(mmap_bad); EXPECT_PTRER(1, mmap(NULL, 0, PROT_READ, MAP_PRIVATE, 0, 0), MAP_FAILED, EINVAL); break;
13641364
CASE_TEST(munmap_bad); EXPECT_SYSER(1, munmap(NULL, 0), -1, EINVAL); break;
13651365
CASE_TEST(mmap_munmap_good); EXPECT_SYSZR(1, test_mmap_munmap()); break;
1366+
CASE_TEST(nanosleep); ts.tv_nsec = -1; EXPECT_SYSER(1, nanosleep(&ts, NULL), -1, EINVAL); break;
13661367
CASE_TEST(open_tty); EXPECT_SYSNE(1, tmp = open("/dev/null", O_RDONLY), -1); if (tmp != -1) close(tmp); break;
13671368
CASE_TEST(open_blah); EXPECT_SYSER(1, tmp = open("/proc/self/blah", O_RDONLY), -1, ENOENT); if (tmp != -1) close(tmp); break;
13681369
CASE_TEST(openat_dir); EXPECT_SYSZR(1, test_openat()); break;

0 commit comments

Comments
 (0)