2 * Copyright (c) 2004 Ulrich Drepper <drepper@redhat.com>
3 * Copyright (c) 2005 Roland McGrath <roland@redhat.com>
4 * Copyright (c) 2012-2015 Dmitry V. Levin <ldv@altlinux.org>
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 #include "sched_attr.h"
35 #include "xlat/schedulers.h"
36 #include "xlat/sched_flags.h"
38 SYS_FUNC(sched_getscheduler)
41 tprintf("%d", (int) tcp->u_arg[0]);
42 } else if (!syserror(tcp)) {
43 tcp->auxstr = xlookup(schedulers, (kernel_ulong_t) tcp->u_rval);
44 if (tcp->auxstr != NULL)
50 SYS_FUNC(sched_setscheduler)
52 tprintf("%d, ", (int) tcp->u_arg[0]);
53 printxval(schedulers, tcp->u_arg[1], "SCHED_???");
55 printnum_int(tcp, tcp->u_arg[2], "%d");
60 SYS_FUNC(sched_getparam)
63 tprintf("%d, ", (int) tcp->u_arg[0]);
65 printnum_int(tcp, tcp->u_arg[1], "%d");
69 SYS_FUNC(sched_setparam)
71 tprintf("%d, ", (int) tcp->u_arg[0]);
72 printnum_int(tcp, tcp->u_arg[1], "%d");
77 SYS_FUNC(sched_get_priority_min)
79 printxval(schedulers, tcp->u_arg[0], "SCHED_???");
84 SYS_FUNC(sched_rr_get_interval)
87 tprintf("%d, ", (int) tcp->u_arg[0]);
90 printaddr(tcp->u_arg[1]);
92 print_timespec(tcp, tcp->u_arg[1]);
98 print_sched_attr(struct tcb *const tcp, const kernel_ulong_t addr,
101 struct sched_attr attr = {};
105 /* called from sched_getattr */
106 size = usize <= sizeof(attr) ? usize : (unsigned) sizeof(attr);
107 if (umoven_or_printaddr(tcp, addr, size, &attr))
109 /* the number of bytes written by the kernel */
112 /* called from sched_setattr */
113 if (umove_or_printaddr(tcp, addr, &attr.size))
117 usize = SCHED_ATTR_MIN_SIZE;
118 size = usize <= sizeof(attr) ? usize : (unsigned) sizeof(attr);
119 if (size >= SCHED_ATTR_MIN_SIZE) {
120 if (umoven_or_printaddr(tcp, addr, size, &attr))
125 tprintf("{size=%u", attr.size);
127 if (size >= SCHED_ATTR_MIN_SIZE) {
128 tprints(", sched_policy=");
129 printxval(schedulers, attr.sched_policy, "SCHED_???");
130 tprints(", sched_flags=");
131 printflags64(sched_flags, attr.sched_flags, "SCHED_FLAG_???");
133 #define PRINT_SCHED_FIELD(field, fmt) \
134 tprintf(", " #field "=%" fmt, attr.field)
136 PRINT_SCHED_FIELD(sched_nice, "d");
137 PRINT_SCHED_FIELD(sched_priority, "u");
138 PRINT_SCHED_FIELD(sched_runtime, PRIu64);
139 PRINT_SCHED_FIELD(sched_deadline, PRIu64);
140 PRINT_SCHED_FIELD(sched_period, PRIu64);
149 SYS_FUNC(sched_setattr)
152 tprintf("%d, ", (int) tcp->u_arg[0]);
153 print_sched_attr(tcp, tcp->u_arg[1], 0);
155 struct sched_attr attr;
157 if (verbose(tcp) && tcp->u_error == E2BIG
158 && umove(tcp, tcp->u_arg[1], &attr.size) == 0) {
159 tprintf(" => {size=%u}", attr.size);
162 tprintf(", %u", (unsigned int) tcp->u_arg[2]);
168 SYS_FUNC(sched_getattr)
171 tprintf("%d, ", (int) tcp->u_arg[0]);
173 const unsigned int size = tcp->u_arg[2];
176 print_sched_attr(tcp, tcp->u_arg[1], size);
178 printaddr(tcp->u_arg[1]);
182 * Due to a subtle gcc bug that leads to miscompiled aarch64
183 * kernels, the 3rd argument of sched_getattr is not quite 32-bit
184 * as on other architectures. For more details see
185 * https://sourceforge.net/p/strace/mailman/message/35721703/
188 print_abnormal_hi(tcp->u_arg[2]);
191 tprintf(", %u", (unsigned int) tcp->u_arg[3]);