2 * Copyright (c) 2003-2007 Ulrich Drepper <drepper@redhat.com>
3 * Copyright (c) 2005-2016 Dmitry V. Levin <ldv@altlinux.org>
4 * Copyright (c) 2016-2019 The strace developers.
7 * SPDX-License-Identifier: LGPL-2.1-or-later
13 print_node(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
15 if (elem_size < sizeof(kernel_ulong_t)) {
16 tprintf("%#0*x", (int) elem_size * 2 + 2,
17 *(unsigned int *) elem_buf);
19 tprintf("%#0*" PRI_klx, (int) elem_size * 2 + 2,
20 *(kernel_ulong_t *) elem_buf);
27 print_nodemask(struct tcb *const tcp, const kernel_ulong_t addr,
28 const kernel_ulong_t maxnodes)
30 const unsigned int bits_per_long = 8 * current_wordsize;
31 const kernel_ulong_t nmemb =
32 (maxnodes + bits_per_long - 2) / bits_per_long;
34 if (nmemb < maxnodes / bits_per_long ||
35 (maxnodes && !nmemb)) {
41 print_array(tcp, addr, nmemb, &buf, current_wordsize,
42 tfetch_mem, print_node, 0);
45 SYS_FUNC(migrate_pages)
47 tprintf("%d, %" PRI_klu ", ", (int) tcp->u_arg[0], tcp->u_arg[1]);
48 print_nodemask(tcp, tcp->u_arg[2], tcp->u_arg[1]);
50 print_nodemask(tcp, tcp->u_arg[3], tcp->u_arg[1]);
55 #include "xlat/mpol_modes.h"
56 #include "xlat/mpol_mode_flags.h"
57 #include "xlat/mbind_flags.h"
60 print_mode(struct tcb *const tcp, const kernel_ulong_t mode_arg)
62 const kernel_ulong_t flags_mask =
63 MPOL_F_STATIC_NODES | MPOL_F_RELATIVE_NODES;
64 const kernel_ulong_t mode = mode_arg & ~flags_mask;
65 const unsigned int flags = mode_arg & flags_mask;
68 printxval64(mpol_modes, mode, "MPOL_???");
72 const char *mode_str = xlookup(mpol_modes, mode);
74 printflags64(mpol_mode_flags, mode_arg, "MPOL_???");
78 if (xlat_verbose(xlat_verbosity) != XLAT_STYLE_ABBREV)
79 tprintf("%#" PRI_klx, mode_arg);
81 if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_RAW)
84 if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
89 printflags_ex(flags, NULL, XLAT_STYLE_ABBREV, mpol_mode_flags, NULL);
91 if (xlat_verbose(xlat_verbosity) == XLAT_STYLE_VERBOSE)
97 printaddr(tcp->u_arg[0]);
98 tprintf(", %" PRI_klu ", ", tcp->u_arg[1]);
99 print_mode(tcp, tcp->u_arg[2]);
101 print_nodemask(tcp, tcp->u_arg[3], tcp->u_arg[4]);
102 tprintf(", %" PRI_klu ", ", tcp->u_arg[4]);
103 printflags(mbind_flags, tcp->u_arg[5], "MPOL_???");
108 SYS_FUNC(set_mempolicy)
110 print_mode(tcp, (unsigned int) tcp->u_arg[0]);
112 print_nodemask(tcp, tcp->u_arg[1], tcp->u_arg[2]);
113 tprintf(", %" PRI_klu, tcp->u_arg[2]);
118 #include "xlat/get_mempolicy_flags.h"
120 SYS_FUNC(get_mempolicy)
124 if (!umove_or_printaddr(tcp, tcp->u_arg[0], &pol)) {
126 printxval(mpol_modes, pol, "MPOL_???");
130 print_nodemask(tcp, tcp->u_arg[1], tcp->u_arg[2]);
131 tprintf(", %" PRI_klu ", ", tcp->u_arg[2]);
132 printaddr(tcp->u_arg[3]);
134 printflags64(get_mempolicy_flags, tcp->u_arg[4], "MPOL_???");
139 #include "xlat/move_pages_flags.h"
142 print_addr(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
146 if (elem_size < sizeof(addr)) {
147 addr = *(unsigned int *) elem_buf;
149 addr = *(kernel_ulong_t *) elem_buf;
158 print_status(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
160 const int status = *(int *) elem_buf;
162 print_err(status, true);
169 const kernel_ulong_t npages = tcp->u_arg[1];
173 tprintf("%d, %" PRI_klu ", ", (int) tcp->u_arg[0], npages);
174 print_array(tcp, tcp->u_arg[2], npages, &buf, current_wordsize,
175 tfetch_mem, print_addr, 0);
177 print_array(tcp, tcp->u_arg[3], npages, &buf, sizeof(int),
178 tfetch_mem, print_int32_array_member, 0);
181 print_array(tcp, tcp->u_arg[4], npages, &buf, sizeof(int),
182 tfetch_mem, print_status, 0);
184 printflags(move_pages_flags, tcp->u_arg[5], "MPOL_???");