2 * Check decoding of move_pages syscall.
4 * Copyright (c) 2016 Dmitry V. Levin <ldv@altlinux.org>
5 * Copyright (c) 2016-2018 The strace developers.
8 * SPDX-License-Identifier: GPL-2.0-or-later
12 #include <asm/unistd.h>
14 #ifdef __NR_move_pages
23 print_page_array(const void **const pages,
24 const unsigned long count,
25 const unsigned int offset)
28 printf("%s", pages ? "[]" : "NULL");
31 if (count <= offset) {
37 for (i = 0; i < count; ++i) {
40 if (i + offset < count) {
41 if (i >= MAX_STRLEN) {
46 printf("... /* %p */", pages + i);
49 const void *const addr = pages[i];
59 print_node_array(const int *const nodes,
60 const unsigned long count,
61 const unsigned int offset)
64 printf("%s", nodes ? "[]" : "NULL");
67 if (count <= offset) {
73 for (i = 0; i < count; ++i) {
76 if (i + offset < count) {
77 if (i >= MAX_STRLEN) {
82 printf("... /* %p */", nodes + i);
85 printf("%d", nodes[i]);
91 print_status_array(const int *const status, const unsigned long count)
94 printf("%s", status ? "[]" : "NULL");
99 for (i = 0; i < count; ++i) {
102 if (i >= MAX_STRLEN) {
106 if (status[i] >= 0) {
107 printf("%d", status[i]);
110 printf("-%s", errno2name());
117 print_stat_pages(const unsigned long pid, const unsigned long count,
118 const void **const pages, int *const status)
120 const unsigned long flags = (unsigned long) 0xfacefeed00000002ULL;
122 long rc = syscall(__NR_move_pages,
123 pid, count, pages, NULL, status, flags);
124 const char *errstr = sprintrc(rc);
125 printf("move_pages(%d, %lu, ", (int) pid, count);
126 print_page_array(pages, count, 0);
130 printf("%p", status);
134 print_status_array(status, count);
136 printf(", MPOL_MF_MOVE) = %s\n", errstr);
140 print_move_pages(const unsigned long pid,
142 const unsigned int offset,
143 const void **const pages,
147 const unsigned long flags = (unsigned long) 0xfacefeed00000004ULL;
150 long rc = syscall(__NR_move_pages,
151 pid, count, pages, nodes, status, flags);
152 const char *errstr = sprintrc(rc);
153 printf("move_pages(%d, %lu, ", (int) pid, count);
154 print_page_array(pages, count, offset);
156 print_node_array(nodes, count, offset);
159 printf("%p", status);
162 printf(", MPOL_MF_MOVE_ALL) = %s\n", errstr);
168 const unsigned long pid =
169 (unsigned long) 0xfacefeed00000000ULL | getpid();
170 unsigned long count = 1;
171 const unsigned page_size = get_page_size();
172 const void *const page = tail_alloc(page_size);
173 const void *const efault = page + page_size;
174 TAIL_ALLOC_OBJECT_VAR_PTR(const void *, pages);
175 TAIL_ALLOC_OBJECT_VAR_PTR(int, nodes);
176 TAIL_ALLOC_OBJECT_VAR_PTR(int, status);
178 print_stat_pages(pid, 0, pages, status);
179 print_move_pages(pid, 0, 0, pages, nodes, status);
180 print_move_pages(pid, 0, 1, pages + 1, nodes + 1, status + 1);
183 print_stat_pages(pid, count, pages, status);
185 print_move_pages(pid, count, 0, pages, nodes, status);
186 print_move_pages(pid, count, 1, pages, nodes, status);
191 print_stat_pages(pid, count, pages, status);
192 *(--nodes) = 0xdeadbee2;
193 print_move_pages(pid, count, 0, pages, nodes, status);
194 print_move_pages(pid, count, 1, pages, nodes, status);
199 print_stat_pages(pid, count, pages, status);
200 *(--nodes) = 0xdeadbee3;
201 print_move_pages(pid, count, 0, pages, nodes, status);
202 print_move_pages(pid, count, 1, pages, nodes, status);
207 print_stat_pages(pid, count, pages, status);
208 *(--nodes) = 0xdeadbee4;
209 print_move_pages(pid, count, 0, pages, nodes, status);
210 print_move_pages(pid, count, 1, pages, nodes, status);
212 puts("+++ exited with 0 +++");
218 SKIP_MAIN_UNDEFINED("__NR_move_pages")