2 * Check decoding of setitimer and getitimer syscalls.
4 * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org>
7 * SPDX-License-Identifier: GPL-2.0-or-later
15 #include <asm/unistd.h>
20 static const struct itimerval new = {
21 .it_interval = { 0xc0de1, 0xc0de2 },
22 .it_value = { 0xc0de3, 0xc0de4 }
24 static const kernel_ulong_t long_timer =
25 F8ILL_KULONG_MASK | ITIMER_REAL;
26 static const kernel_ulong_t bogus_timer =
27 (kernel_ulong_t) 0xfacefeeddeadbeefULL;
29 TAIL_ALLOC_OBJECT_CONST_PTR(struct itimerval, p_old);
30 struct itimerval *const p_new = tail_memdup(&new, sizeof(new));
31 void *const efault = tail_alloc(sizeof(new) - 8);
34 if (setitimer(ITIMER_REAL, p_new, NULL))
35 perror_msg_and_skip("setitimer");
36 printf("setitimer(ITIMER_REAL"
37 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
38 ", it_value={tv_sec=%lld, tv_usec=%llu}}"
40 (long long) new.it_interval.tv_sec,
41 zero_extend_signed_to_ull(new.it_interval.tv_usec),
42 (long long) new.it_value.tv_sec,
43 zero_extend_signed_to_ull(new.it_value.tv_usec));
45 fill_memory(p_old, sizeof(*p_old));
46 if (getitimer(ITIMER_REAL, p_old))
47 perror_msg_and_skip("getitimer");
48 printf("getitimer(ITIMER_REAL"
49 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
50 ", it_value={tv_sec=%lld, tv_usec=%llu}}) = 0\n",
51 (long long) p_old->it_interval.tv_sec,
52 zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
53 (long long) p_old->it_value.tv_sec,
54 zero_extend_signed_to_ull(p_old->it_value.tv_usec));
56 fill_memory(p_old, sizeof(*p_old));
57 setitimer(ITIMER_REAL, p_new, p_old);
58 printf("setitimer(ITIMER_REAL"
59 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
60 ", it_value={tv_sec=%lld, tv_usec=%llu}}"
61 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
62 ", it_value={tv_sec=%lld, tv_usec=%llu}}) = 0\n",
63 (long long) new.it_interval.tv_sec,
64 zero_extend_signed_to_ull(new.it_interval.tv_usec),
65 (long long) new.it_value.tv_sec,
66 zero_extend_signed_to_ull(new.it_value.tv_usec),
67 (long long) p_old->it_interval.tv_sec,
68 zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
69 (long long) p_old->it_value.tv_sec,
70 zero_extend_signed_to_ull(p_old->it_value.tv_usec));
72 rc = getitimer(ITIMER_REAL, efault);
73 printf("getitimer(ITIMER_REAL, %p) = %s\n", efault, sprintrc(rc));
75 rc = setitimer(ITIMER_REAL, p_new, efault);
76 printf("setitimer(ITIMER_REAL"
77 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
78 ", it_value={tv_sec=%lld, tv_usec=%llu}}, %p) = %s\n",
79 (long long) new.it_interval.tv_sec,
80 zero_extend_signed_to_ull(new.it_interval.tv_usec),
81 (long long) new.it_value.tv_sec,
82 zero_extend_signed_to_ull(new.it_value.tv_usec),
83 efault, sprintrc(rc));
85 rc = setitimer(ITIMER_REAL, efault, p_old);
86 printf("setitimer(ITIMER_REAL, %p, %p) = %s\n",
87 efault, p_old, sprintrc(rc));
89 fill_memory(p_old, sizeof(*p_old));
90 rc = syscall(__NR_setitimer, long_timer, p_new, p_old);
91 printf("setitimer(ITIMER_REAL"
92 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
93 ", it_value={tv_sec=%lld, tv_usec=%llu}}"
94 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
95 ", it_value={tv_sec=%lld, tv_usec=%llu}}) = %s\n",
96 (long long) new.it_interval.tv_sec,
97 zero_extend_signed_to_ull(new.it_interval.tv_usec),
98 (long long) new.it_value.tv_sec,
99 zero_extend_signed_to_ull(new.it_value.tv_usec),
100 (long long) p_old->it_interval.tv_sec,
101 zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
102 (long long) p_old->it_value.tv_sec,
103 zero_extend_signed_to_ull(p_old->it_value.tv_usec),
106 fill_memory(p_old, sizeof(*p_old));
107 rc = syscall(__NR_getitimer, long_timer, p_old);
108 printf("getitimer(ITIMER_REAL"
109 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
110 ", it_value={tv_sec=%lld, tv_usec=%llu}}) = %s\n",
111 (long long) p_old->it_interval.tv_sec,
112 zero_extend_signed_to_ull(p_old->it_interval.tv_usec),
113 (long long) p_old->it_value.tv_sec,
114 zero_extend_signed_to_ull(p_old->it_value.tv_usec),
117 rc = syscall(__NR_setitimer, bogus_timer, p_new, p_old);
118 printf("setitimer(%#x /* ITIMER_??? */"
119 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
120 ", it_value={tv_sec=%lld, tv_usec=%llu}}, %p) = %s\n",
122 (long long) new.it_interval.tv_sec,
123 zero_extend_signed_to_ull(new.it_interval.tv_usec),
124 (long long) new.it_value.tv_sec,
125 zero_extend_signed_to_ull(new.it_value.tv_usec),
126 p_old, sprintrc(rc));
128 rc = syscall(__NR_getitimer, bogus_timer, p_old);
129 printf("getitimer(%#x /* ITIMER_??? */, %p) = %s\n",
130 (int) bogus_timer, p_old, sprintrc(rc));
132 if (F8ILL_KULONG_SUPPORTED) {
133 const kernel_ulong_t ill_new = f8ill_ptr_to_kulong(p_new);
134 const kernel_ulong_t ill_old = f8ill_ptr_to_kulong(p_old);
136 rc = syscall(__NR_setitimer, long_timer, ill_new, ill_old);
137 printf("setitimer(ITIMER_REAL, %#llx, %#llx) = %s\n",
138 (unsigned long long) ill_new,
139 (unsigned long long) ill_old,
142 rc = syscall(__NR_getitimer, long_timer, ill_old);
143 printf("getitimer(ITIMER_REAL, %#llx) = %s\n",
144 (unsigned long long) ill_old, sprintrc(rc));
147 p_new->it_interval.tv_sec = 0xdeadbeefU;
148 p_new->it_interval.tv_usec = 0xfacefeedU;
149 p_new->it_value.tv_sec = (time_t) 0xcafef00ddeadbeefLL;
150 p_new->it_value.tv_usec = (suseconds_t) 0xbadc0dedfacefeedLL;
152 rc = setitimer(ITIMER_REAL, p_new, p_old);
153 printf("setitimer(ITIMER_REAL"
154 ", {it_interval={tv_sec=%lld, tv_usec=%llu}"
155 ", it_value={tv_sec=%lld, tv_usec=%llu}}, %p) = %s\n",
156 (long long) p_new->it_interval.tv_sec,
157 zero_extend_signed_to_ull(p_new->it_interval.tv_usec),
158 (long long) p_new->it_value.tv_sec,
159 zero_extend_signed_to_ull(p_new->it_value.tv_usec),
160 p_old, sprintrc(rc));
162 puts("+++ exited with 0 +++");