]> granicus.if.org Git - strace/blob - tests/xetitimer.c
80c81a1aee8c9deef215b8d08aa32a5221fb850a
[strace] / tests / xetitimer.c
1 /*
2  * Check decoding of setitimer and getitimer syscalls.
3  *
4  * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org>
5  * All rights reserved.
6  *
7  * SPDX-License-Identifier: GPL-2.0-or-later
8  */
9
10 #include "tests.h"
11 #include <stdio.h>
12 #include <stdint.h>
13 #include <sys/time.h>
14 #include <unistd.h>
15 #include <asm/unistd.h>
16
17 int
18 main(void)
19 {
20         static const struct itimerval new = {
21                 .it_interval = { 0xc0de1, 0xc0de2 },
22                 .it_value = { 0xc0de3, 0xc0de4 }
23         };
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;
28
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);
32         long rc;
33
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}}"
39                ", NULL) = 0\n",
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));
44
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));
55
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));
71
72         rc = getitimer(ITIMER_REAL, efault);
73         printf("getitimer(ITIMER_REAL, %p) = %s\n", efault, sprintrc(rc));
74
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));
84
85         rc = setitimer(ITIMER_REAL, efault, p_old);
86         printf("setitimer(ITIMER_REAL, %p, %p) = %s\n",
87                efault, p_old, sprintrc(rc));
88
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),
104                sprintrc(rc));
105
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),
115                sprintrc(rc));
116
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",
121                (int) bogus_timer,
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));
127
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));
131
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);
135
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,
140                        sprintrc(rc));
141
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));
145         }
146
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;
151
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));
161
162         puts("+++ exited with 0 +++");
163         return 0;
164 }