2 * Check decoding of clock_nanosleep and clock_gettime syscalls.
4 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org>
5 * Copyright (c) 2015-2017 The strace developers.
8 * SPDX-License-Identifier: GPL-2.0-or-later
19 #include <asm/unistd.h>
33 .ts.tv_nsec = 0xc0de1,
34 .pad = { 0xdeadbeef, 0xbadc0ded }
36 .ts = { .tv_sec = 0xc0de2, .tv_nsec = 0xc0de3 },
37 .pad = { 0xdeadbeef, 0xbadc0ded }
39 const sigset_t set = {};
40 const struct sigaction act = { .sa_handler = handler };
41 const struct itimerval itv = {
42 .it_interval.tv_usec = 222222,
43 .it_value.tv_usec = 111111
46 if (syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0, &req.ts, NULL))
47 perror_msg_and_skip("clock_nanosleep CLOCK_REALTIME");
48 printf("clock_nanosleep(CLOCK_REALTIME, 0"
49 ", {tv_sec=%lld, tv_nsec=%llu}, NULL) = 0\n",
50 (long long) req.ts.tv_sec,
51 zero_extend_signed_to_ull(req.ts.tv_nsec));
53 assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
54 NULL, &rem.ts) == -1);
55 printf("clock_nanosleep(CLOCK_REALTIME, 0, NULL, %p)"
56 " = -1 EFAULT (%m)\n", &rem.ts);
58 assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
59 &req.ts, &rem.ts) == 0);
60 printf("clock_nanosleep(CLOCK_REALTIME, 0"
61 ", {tv_sec=%lld, tv_nsec=%llu}, %p) = 0\n",
62 (long long) req.ts.tv_sec,
63 zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
65 req.ts.tv_nsec = 999999999 + 1;
66 assert(syscall(__NR_clock_nanosleep, CLOCK_MONOTONIC, 0,
67 &req.ts, &rem.ts) == -1);
68 printf("clock_nanosleep(CLOCK_MONOTONIC, 0"
69 ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
70 (long long) req.ts.tv_sec,
71 zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
73 req.ts.tv_sec = 0xdeadbeefU;
74 req.ts.tv_nsec = 0xfacefeedU;
75 assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
76 &req.ts, &rem.ts) == -1);
77 printf("clock_nanosleep(CLOCK_REALTIME, 0"
78 ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
79 (long long) req.ts.tv_sec,
80 zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
82 req.ts.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
83 req.ts.tv_nsec = (long) 0xbadc0dedfacefeedLL;
84 assert(syscall(__NR_clock_nanosleep, CLOCK_MONOTONIC, 0,
85 &req.ts, &rem.ts) == -1);
86 printf("clock_nanosleep(CLOCK_MONOTONIC, 0"
87 ", {tv_sec=%lld, tv_nsec=%llu}, %p) = -1 EINVAL (%m)\n",
88 (long long) req.ts.tv_sec,
89 zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
91 assert(sigaction(SIGALRM, &act, NULL) == 0);
92 assert(sigprocmask(SIG_SETMASK, &set, NULL) == 0);
94 if (setitimer(ITIMER_REAL, &itv, NULL))
95 perror_msg_and_skip("setitimer");
98 req.ts.tv_nsec = 999999999;
99 assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, 0,
100 &req.ts, &rem.ts) == -1);
101 printf("clock_nanosleep(CLOCK_REALTIME, 0"
102 ", {tv_sec=%lld, tv_nsec=%llu}, {tv_sec=%lld, tv_nsec=%llu})"
103 " = ? ERESTART_RESTARTBLOCK (Interrupted by signal)\n",
104 (long long) req.ts.tv_sec,
105 zero_extend_signed_to_ull(req.ts.tv_nsec),
106 (long long) rem.ts.tv_sec,
107 zero_extend_signed_to_ull(rem.ts.tv_nsec));
108 puts("--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---");
110 assert(syscall(__NR_clock_gettime, CLOCK_REALTIME, &req.ts) == 0);
111 printf("clock_gettime(CLOCK_REALTIME, {tv_sec=%lld, tv_nsec=%llu}) = 0\n",
112 (long long) req.ts.tv_sec,
113 zero_extend_signed_to_ull(req.ts.tv_nsec));
116 rem.ts.tv_sec = 0xc0de4;
117 rem.ts.tv_nsec = 0xc0de5;
118 assert(syscall(__NR_clock_nanosleep, CLOCK_REALTIME, TIMER_ABSTIME,
119 &req.ts, &rem.ts) == -1);
120 printf("clock_nanosleep(CLOCK_REALTIME, TIMER_ABSTIME"
121 ", {tv_sec=%lld, tv_nsec=%llu}, %p)"
122 " = ? ERESTARTNOHAND (To be restarted if no handler)\n",
123 (long long) req.ts.tv_sec,
124 zero_extend_signed_to_ull(req.ts.tv_nsec), &rem.ts);
125 puts("--- SIGALRM {si_signo=SIGALRM, si_code=SI_KERNEL} ---");
127 puts("+++ exited with 0 +++");