2 * Copyright (c) 2015-2017 Dmitry V. Levin <ldv@altlinux.org>
3 * Copyright (c) 2015-2019 The strace developers.
6 * SPDX-License-Identifier: GPL-2.0-or-later
12 #if defined __NR_sched_getattr && defined __NR_sched_setattr
14 # include <inttypes.h>
18 # include "sched_attr.h"
20 # include "xlat/schedulers.h"
22 static const char *errstr;
25 sys_sched_getattr(kernel_ulong_t pid, kernel_ulong_t attr,
26 kernel_ulong_t size, kernel_ulong_t flags)
28 long rc = syscall(__NR_sched_getattr, pid, attr, size, flags);
29 errstr = sprintrc(rc);
34 sys_sched_setattr(kernel_ulong_t pid, kernel_ulong_t attr, kernel_ulong_t flags)
36 long rc = syscall(__NR_sched_setattr, pid, attr, flags);
37 errstr = sprintrc(rc);
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;
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;
55 sys_sched_getattr(0, 0, 0, 0);
56 printf("sched_getattr(0, NULL, 0, 0) = %s\n", errstr);
58 sys_sched_getattr(0, (unsigned long) attr, 0, 0);
59 printf("sched_getattr(0, %p, 0, 0) = %s\n", attr, errstr);
61 sys_sched_getattr(bogus_pid, 0, 0, 0);
62 printf("sched_getattr(%d, NULL, 0, 0) = %s\n", (int) bogus_pid, errstr);
64 sys_sched_getattr(-1U, (unsigned long) attr, bogus_size, bogus_flags);
65 printf("sched_getattr(-1, %p, %s%u, %u) = %s\n",
67 # if defined __arm64__ || defined __aarch64__
72 (unsigned) bogus_size, (unsigned) bogus_flags, errstr);
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);
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",
91 (unsigned) sizeof(*attr));
93 # if defined __arm64__ || defined __aarch64__
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__
100 printf("sched_getattr(0, %p, 0xffffffff<<32|%u, 0) = %s\n",
101 attr, (unsigned) sizeof(*attr), errstr);
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",
112 attr->sched_priority,
114 attr->sched_deadline,
116 (unsigned) sizeof(*attr));
119 sys_sched_setattr(bogus_pid, 0, 0);
120 printf("sched_setattr(%d, NULL, 0) = %s\n", (int) bogus_pid, errstr);
122 attr->sched_flags |= 1;
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",
133 attr->sched_priority,
135 attr->sched_deadline,
138 sys_sched_setattr(F8ILL_KULONG_MASK, (unsigned long) attr,
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",
147 attr->sched_priority,
149 attr->sched_deadline,
154 sys_sched_setattr(0, (unsigned long) psize, 0);
155 printf("sched_setattr(0, %p, 0) = %s\n", psize, errstr);
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",
167 attr->sched_priority,
169 attr->sched_deadline,
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);
178 attr->size = SCHED_ATTR_MIN_SIZE - 1;
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);
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;
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)"
204 attr->sched_priority,
206 attr->sched_deadline,
208 (unsigned) bogus_flags, errstr);
210 if (F8ILL_KULONG_SUPPORTED) {
211 const kernel_ulong_t ill = f8ill_ptr_to_kulong(attr);
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),
218 sys_sched_setattr(0, ill, 0);
219 printf("sched_setattr(0, %#llx, 0) = %s\n",
220 (unsigned long long) ill, errstr);
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;
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)"
244 attr->sched_priority,
246 attr->sched_deadline,
248 (unsigned) bogus_flags, errstr);
250 if (F8ILL_KULONG_SUPPORTED) {
251 const kernel_ulong_t ill = f8ill_ptr_to_kulong(attr);
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),
258 sys_sched_setattr(0, ill, 0);
259 printf("sched_setattr(0, %#llx, 0) = %s\n",
260 (unsigned long long) ill, errstr);
263 puts("+++ exited with 0 +++");
269 SKIP_MAIN_UNDEFINED("__NR_sched_getattr && __NR_sched_setattr")