Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

tools/nolibc: add support for clock_nanosleep() and nanosleep()

Also add some tests.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250704-nolibc-nanosleep-v1-1-d79c19701952@linutronix.de
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

authored by

Thomas Weißschuh and committed by
Thomas Weißschuh
7c02bc40 1536aa0f

+35
+34
tools/include/nolibc/time.h
··· 36 36 * int clock_getres(clockid_t clockid, struct timespec *res); 37 37 * int clock_gettime(clockid_t clockid, struct timespec *tp); 38 38 * 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) 39 41 */ 40 42 41 43 static __attribute__((unused)) ··· 109 107 return __sysret(sys_clock_settime(clockid, tp)); 110 108 } 111 109 110 + static __attribute__((unused)) 111 + int sys_clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp, 112 + struct timespec *rmtp) 113 + { 114 + #if defined(__NR_clock_nanosleep) 115 + return my_syscall4(__NR_clock_nanosleep, clockid, flags, rqtp, rmtp); 116 + #elif defined(__NR_clock_nanosleep_time64) 117 + struct __kernel_timespec krqtp, krmtp; 118 + int ret; 119 + 120 + __nolibc_timespec_user_to_kernel(rqtp, &krqtp); 121 + ret = my_syscall4(__NR_clock_nanosleep_time64, clockid, flags, &krqtp, &krmtp); 122 + if (rmtp) 123 + __nolibc_timespec_kernel_to_user(&krmtp, rmtp); 124 + return ret; 125 + #else 126 + return __nolibc_enosys(__func__, clockid, flags, rqtp, rmtp); 127 + #endif 128 + } 129 + 130 + static __attribute__((unused)) 131 + int clock_nanosleep(clockid_t clockid, int flags, const struct timespec *rqtp, 132 + struct timespec *rmtp) 133 + { 134 + return __sysret(sys_clock_nanosleep(clockid, flags, rqtp, rmtp)); 135 + } 112 136 113 137 static __inline__ 114 138 double difftime(time_t time1, time_t time2) 115 139 { 116 140 return time1 - time2; 141 + } 142 + 143 + static __inline__ 144 + int nanosleep(const struct timespec *rqtp, struct timespec *rmtp) 145 + { 146 + return clock_nanosleep(CLOCK_REALTIME, 0, rqtp, rmtp); 117 147 } 118 148 119 149
+1
tools/testing/selftests/nolibc/nolibc-test.c
··· 1363 1363 CASE_TEST(mmap_bad); EXPECT_PTRER(1, mmap(NULL, 0, PROT_READ, MAP_PRIVATE, 0, 0), MAP_FAILED, EINVAL); break; 1364 1364 CASE_TEST(munmap_bad); EXPECT_SYSER(1, munmap(NULL, 0), -1, EINVAL); break; 1365 1365 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; 1366 1367 CASE_TEST(open_tty); EXPECT_SYSNE(1, tmp = open("/dev/null", O_RDONLY), -1); if (tmp != -1) close(tmp); break; 1367 1368 CASE_TEST(open_blah); EXPECT_SYSER(1, tmp = open("/proc/self/blah", O_RDONLY), -1, ENOENT); if (tmp != -1) close(tmp); break; 1368 1369 CASE_TEST(openat_dir); EXPECT_SYSZR(1, test_openat()); break;