]> granicus.if.org Git - strace/blob - tests/sched_xetattr.c
Remove XLAT_END
[strace] / tests / sched_xetattr.c
1 /*
2  * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org>
3  * Copyright (c) 2015-2019 The strace developers.
4  * All rights reserved.
5  *
6  * SPDX-License-Identifier: GPL-2.0-or-later
7  */
8
9 #include "tests.h"
10 #include "scno.h"
11
12 #if defined __NR_sched_getattr && defined __NR_sched_setattr
13
14 # include <inttypes.h>
15 # include <stdio.h>
16 # include <sched.h>
17 # include <unistd.h>
18 # include "sched_attr.h"
19 # include "xlat.h"
20 # include "xlat/schedulers.h"
21
22 static const char *errstr;
23
24 static long
25 sys_sched_getattr(kernel_ulong_t pid, kernel_ulong_t attr,
26                   kernel_ulong_t size, kernel_ulong_t flags)
27 {
28         long rc = syscall(__NR_sched_getattr, pid, attr, size, flags);
29         errstr = sprintrc(rc);
30         return rc;
31 }
32
33 static long
34 sys_sched_setattr(kernel_ulong_t pid, kernel_ulong_t attr, kernel_ulong_t flags)
35 {
36         long rc = syscall(__NR_sched_setattr, pid, attr, flags);
37         errstr = sprintrc(rc);
38         return rc;
39 }
40
41 int
42 main(void)
43 {
44         static const kernel_ulong_t bogus_pid =
45                 (kernel_ulong_t) 0xdefacedfacefeedULL;
46         static const kernel_ulong_t bogus_size =
47                 (kernel_ulong_t) 0xdefacedcafef00dULL;
48         static const kernel_ulong_t bogus_flags =
49                 (kernel_ulong_t) 0xdefaceddeadc0deULL;
50
51         TAIL_ALLOC_OBJECT_CONST_PTR(struct sched_attr, attr);
52         TAIL_ALLOC_OBJECT_CONST_PTR(unsigned int, psize);
53         void *const efault = attr + 1;
54
55         sys_sched_getattr(0, 0, 0, 0);
56         printf("sched_getattr(0, NULL, 0, 0) = %s\n", errstr);
57
58         sys_sched_getattr(0, (unsigned long) attr, 0, 0);
59         printf("sched_getattr(0, %p, 0, 0) = %s\n", attr, errstr);
60
61         sys_sched_getattr(bogus_pid, 0, 0, 0);
62         printf("sched_getattr(%d, NULL, 0, 0) = %s\n", (int) bogus_pid, errstr);
63
64         sys_sched_getattr(-1U, (unsigned long) attr, bogus_size, bogus_flags);
65         printf("sched_getattr(-1, %p, %s%u, %u) = %s\n",
66                attr,
67 # if defined __arm64__ || defined __aarch64__
68                "0xdefaced<<32|",
69 # else
70                "",
71 # endif
72                (unsigned) bogus_size, (unsigned) bogus_flags, errstr);
73
74         sys_sched_getattr(0, (unsigned long) efault, sizeof(*attr), 0);
75         printf("sched_getattr(0, %p, %u, 0) = %s\n",
76                efault, (unsigned) sizeof(*attr), errstr);
77
78         if (sys_sched_getattr(0, (unsigned long) attr, sizeof(*attr), 0))
79                 perror_msg_and_skip("sched_getattr");
80         printf("sched_getattr(0, {size=%u, sched_policy=", attr->size);
81         printxval(schedulers, attr->sched_policy, NULL);
82         printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
83                ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
84                ", sched_period=%" PRIu64 "}, %u, 0) = 0\n",
85                attr->sched_flags ? "SCHED_FLAG_RESET_ON_FORK" : "0",
86                attr->sched_nice,
87                attr->sched_priority,
88                attr->sched_runtime,
89                attr->sched_deadline,
90                attr->sched_period,
91                (unsigned) sizeof(*attr));
92
93 # if defined __arm64__ || defined __aarch64__
94         long rc =
95 # endif
96         sys_sched_getattr(F8ILL_KULONG_MASK, (unsigned long) attr,
97                           F8ILL_KULONG_MASK | sizeof(*attr), F8ILL_KULONG_MASK);
98 # if defined __arm64__ || defined __aarch64__
99         if (rc) {
100                 printf("sched_getattr(0, %p, 0xffffffff<<32|%u, 0) = %s\n",
101                        attr, (unsigned) sizeof(*attr), errstr);
102         } else
103 # endif
104         {
105                 printf("sched_getattr(0, {size=%u, sched_policy=", attr->size);
106                 printxval(schedulers, attr->sched_policy, NULL);
107                 printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
108                        ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
109                        ", sched_period=%" PRIu64 "}, %u, 0) = 0\n",
110                        attr->sched_flags ? "SCHED_FLAG_RESET_ON_FORK" : "0",
111                        attr->sched_nice,
112                        attr->sched_priority,
113                        attr->sched_runtime,
114                        attr->sched_deadline,
115                        attr->sched_period,
116                        (unsigned) sizeof(*attr));
117         }
118
119         sys_sched_setattr(bogus_pid, 0, 0);
120         printf("sched_setattr(%d, NULL, 0) = %s\n", (int) bogus_pid, errstr);
121
122         attr->sched_flags |= 1;
123
124         if (sys_sched_setattr(0, (unsigned long) attr, 0))
125                 perror_msg_and_skip("sched_setattr");
126         printf("sched_setattr(0, {size=%u, sched_policy=", attr->size);
127         printxval(schedulers, attr->sched_policy, NULL);
128         printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
129                ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
130                ", sched_period=%" PRIu64 "}, 0) = 0\n",
131                "SCHED_FLAG_RESET_ON_FORK",
132                attr->sched_nice,
133                attr->sched_priority,
134                attr->sched_runtime,
135                attr->sched_deadline,
136                attr->sched_period);
137
138         sys_sched_setattr(F8ILL_KULONG_MASK, (unsigned long) attr,
139                           F8ILL_KULONG_MASK);
140         printf("sched_setattr(0, {size=%u, sched_policy=", attr->size);
141         printxval(schedulers, attr->sched_policy, NULL);
142         printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
143                ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
144                ", sched_period=%" PRIu64 "}, 0) = 0\n",
145                "SCHED_FLAG_RESET_ON_FORK",
146                attr->sched_nice,
147                attr->sched_priority,
148                attr->sched_runtime,
149                attr->sched_deadline,
150                attr->sched_period);
151
152         *psize = attr->size;
153
154         sys_sched_setattr(0, (unsigned long) psize, 0);
155         printf("sched_setattr(0, %p, 0) = %s\n", psize, errstr);
156
157         attr->size = 0;
158
159         sys_sched_setattr(0, (unsigned long) attr, 0);
160         printf("sched_setattr(0, {size=%u, sched_policy=", attr->size);
161         printxval(schedulers, attr->sched_policy, NULL);
162         printf(", sched_flags=%s, sched_nice=%d, sched_priority=%u"
163                ", sched_runtime=%" PRIu64 ", sched_deadline=%" PRIu64
164                ", sched_period=%" PRIu64 "}, 0) = 0\n",
165                "SCHED_FLAG_RESET_ON_FORK",
166                attr->sched_nice,
167                attr->sched_priority,
168                attr->sched_runtime,
169                attr->sched_deadline,
170                attr->sched_period);
171
172         attr->size = 1;
173
174         sys_sched_setattr(0, (unsigned long) attr, 0);
175         printf("sched_setattr(0, {size=%u} => {size=%u}, 0) = %s\n",
176                1, attr->size, errstr);
177
178         attr->size = SCHED_ATTR_MIN_SIZE - 1;
179
180         sys_sched_setattr(0, (unsigned long) attr, 0);
181         printf("sched_setattr(0, {size=%u} => {size=%u}, 0) = %s\n",
182                SCHED_ATTR_MIN_SIZE - 1, attr->size, errstr);
183
184         attr->size = 0x90807060;
185         attr->sched_policy = 0xca7faced;
186         attr->sched_flags = 0xbadc0ded1057da78ULL;
187         attr->sched_nice = 0xafbfcfdf;
188         attr->sched_priority = 0xb8c8d8e8;
189         attr->sched_runtime = 0xbadcaffedeadf157ULL;
190         attr->sched_deadline = 0xc0de70a57badac75ULL;
191         attr->sched_period = 0xded1ca7edda7aca7ULL;
192
193         sys_sched_setattr(bogus_pid, (unsigned long) attr, bogus_flags);
194         printf("sched_setattr(%d, {size=%u, sched_policy=%#x /* SCHED_??? */, "
195                "sched_flags=%#" PRIx64 " /* SCHED_FLAG_??? */, "
196                "sched_nice=%d, sched_priority=%u, sched_runtime=%" PRIu64 ", "
197                "sched_deadline=%" PRIu64 ", sched_period=%" PRIu64 ", ...}, %u)"
198                " = %s\n",
199                (int) bogus_pid,
200                attr->size,
201                attr->sched_policy,
202                attr->sched_flags,
203                attr->sched_nice,
204                attr->sched_priority,
205                attr->sched_runtime,
206                attr->sched_deadline,
207                attr->sched_period,
208                (unsigned) bogus_flags, errstr);
209
210         if (F8ILL_KULONG_SUPPORTED) {
211                 const kernel_ulong_t ill = f8ill_ptr_to_kulong(attr);
212
213                 sys_sched_getattr(0, ill, sizeof(*attr), 0);
214                 printf("sched_getattr(0, %#llx, %u, 0) = %s\n",
215                        (unsigned long long) ill, (unsigned) sizeof(*attr),
216                        errstr);
217
218                 sys_sched_setattr(0, ill, 0);
219                 printf("sched_setattr(0, %#llx, 0) = %s\n",
220                        (unsigned long long) ill, errstr);
221         }
222
223
224         attr->size = 0x90807060;
225         attr->sched_policy = 0xca7faced;
226         attr->sched_flags = 0xfULL;
227         attr->sched_nice = 0xafbfcfdf;
228         attr->sched_priority = 0xb8c8d8e8;
229         attr->sched_runtime = 0xbadcaffedeadf157ULL;
230         attr->sched_deadline = 0xc0de70a57badac75ULL;
231         attr->sched_period = 0xded1ca7edda7aca7ULL;
232
233         sys_sched_setattr(bogus_pid, (unsigned long) attr, bogus_flags);
234         printf("sched_setattr(%d, {size=%u, sched_policy=%#x /* SCHED_??? */, "
235                "sched_flags=SCHED_FLAG_RESET_ON_FORK|SCHED_FLAG_RECLAIM|"
236                "SCHED_FLAG_DL_OVERRUN|0x8, "
237                "sched_nice=%d, sched_priority=%u, sched_runtime=%" PRIu64 ", "
238                "sched_deadline=%" PRIu64 ", sched_period=%" PRIu64 ", ...}, %u)"
239                " = %s\n",
240                (int) bogus_pid,
241                attr->size,
242                attr->sched_policy,
243                attr->sched_nice,
244                attr->sched_priority,
245                attr->sched_runtime,
246                attr->sched_deadline,
247                attr->sched_period,
248                (unsigned) bogus_flags, errstr);
249
250         if (F8ILL_KULONG_SUPPORTED) {
251                 const kernel_ulong_t ill = f8ill_ptr_to_kulong(attr);
252
253                 sys_sched_getattr(0, ill, sizeof(*attr), 0);
254                 printf("sched_getattr(0, %#llx, %u, 0) = %s\n",
255                        (unsigned long long) ill, (unsigned) sizeof(*attr),
256                        errstr);
257
258                 sys_sched_setattr(0, ill, 0);
259                 printf("sched_setattr(0, %#llx, 0) = %s\n",
260                        (unsigned long long) ill, errstr);
261         }
262
263         puts("+++ exited with 0 +++");
264         return 0;
265 }
266
267 #else
268
269 SKIP_MAIN_UNDEFINED("__NR_sched_getattr && __NR_sched_setattr")
270
271 #endif