t_ptrace_bytetransfer_wait.h revision 1.1 1 1.1 kamil /* $NetBSD: t_ptrace_bytetransfer_wait.h,v 1.1 2020/05/04 22:05:28 kamil Exp $ */
2 1.1 kamil
3 1.1 kamil /*-
4 1.1 kamil * Copyright (c) 2016, 2017, 2018, 2019, 2020 The NetBSD Foundation, Inc.
5 1.1 kamil * All rights reserved.
6 1.1 kamil *
7 1.1 kamil * Redistribution and use in source and binary forms, with or without
8 1.1 kamil * modification, are permitted provided that the following conditions
9 1.1 kamil * are met:
10 1.1 kamil * 1. Redistributions of source code must retain the above copyright
11 1.1 kamil * notice, this list of conditions and the following disclaimer.
12 1.1 kamil * 2. Redistributions in binary form must reproduce the above copyright
13 1.1 kamil * notice, this list of conditions and the following disclaimer in the
14 1.1 kamil * documentation and/or other materials provided with the distribution.
15 1.1 kamil *
16 1.1 kamil * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
17 1.1 kamil * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
18 1.1 kamil * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 1.1 kamil * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
20 1.1 kamil * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21 1.1 kamil * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22 1.1 kamil * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23 1.1 kamil * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24 1.1 kamil * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25 1.1 kamil * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26 1.1 kamil * POSSIBILITY OF SUCH DAMAGE.
27 1.1 kamil */
28 1.1 kamil
29 1.1 kamil
30 1.1 kamil enum bytes_transfer_type {
31 1.1 kamil BYTES_TRANSFER_DATA,
32 1.1 kamil BYTES_TRANSFER_DATAIO,
33 1.1 kamil BYTES_TRANSFER_TEXT,
34 1.1 kamil BYTES_TRANSFER_TEXTIO,
35 1.1 kamil BYTES_TRANSFER_AUXV
36 1.1 kamil };
37 1.1 kamil
38 1.1 kamil static int __used
39 1.1 kamil bytes_transfer_dummy(int a, int b, int c, int d)
40 1.1 kamil {
41 1.1 kamil int e, f, g, h;
42 1.1 kamil
43 1.1 kamil a *= 4;
44 1.1 kamil b += 3;
45 1.1 kamil c -= 2;
46 1.1 kamil d /= 1;
47 1.1 kamil
48 1.1 kamil e = strtol("10", NULL, 10);
49 1.1 kamil f = strtol("20", NULL, 10);
50 1.1 kamil g = strtol("30", NULL, 10);
51 1.1 kamil h = strtol("40", NULL, 10);
52 1.1 kamil
53 1.1 kamil return (a + b * c - d) + (e * f - g / h);
54 1.1 kamil }
55 1.1 kamil
56 1.1 kamil static void
57 1.1 kamil bytes_transfer(int operation, size_t size, enum bytes_transfer_type type)
58 1.1 kamil {
59 1.1 kamil const int exitval = 5;
60 1.1 kamil const int sigval = SIGSTOP;
61 1.1 kamil pid_t child, wpid;
62 1.1 kamil bool skip = false;
63 1.1 kamil
64 1.1 kamil int lookup_me = 0;
65 1.1 kamil uint8_t lookup_me8 = 0;
66 1.1 kamil uint16_t lookup_me16 = 0;
67 1.1 kamil uint32_t lookup_me32 = 0;
68 1.1 kamil uint64_t lookup_me64 = 0;
69 1.1 kamil
70 1.1 kamil int magic = 0x13579246;
71 1.1 kamil uint8_t magic8 = 0xab;
72 1.1 kamil uint16_t magic16 = 0x1234;
73 1.1 kamil uint32_t magic32 = 0x98765432;
74 1.1 kamil uint64_t magic64 = 0xabcdef0123456789;
75 1.1 kamil
76 1.1 kamil struct ptrace_io_desc io;
77 1.1 kamil #if defined(TWAIT_HAVE_STATUS)
78 1.1 kamil int status;
79 1.1 kamil #endif
80 1.1 kamil /* 513 is just enough, for the purposes of ATF it's good enough */
81 1.1 kamil AuxInfo ai[513], *aip;
82 1.1 kamil
83 1.1 kamil ATF_REQUIRE(size < sizeof(ai));
84 1.1 kamil
85 1.1 kamil /* Prepare variables for .TEXT transfers */
86 1.1 kamil switch (type) {
87 1.1 kamil case BYTES_TRANSFER_TEXT:
88 1.1 kamil memcpy(&magic, bytes_transfer_dummy, sizeof(magic));
89 1.1 kamil break;
90 1.1 kamil case BYTES_TRANSFER_TEXTIO:
91 1.1 kamil switch (size) {
92 1.1 kamil case 8:
93 1.1 kamil memcpy(&magic8, bytes_transfer_dummy, sizeof(magic8));
94 1.1 kamil break;
95 1.1 kamil case 16:
96 1.1 kamil memcpy(&magic16, bytes_transfer_dummy, sizeof(magic16));
97 1.1 kamil break;
98 1.1 kamil case 32:
99 1.1 kamil memcpy(&magic32, bytes_transfer_dummy, sizeof(magic32));
100 1.1 kamil break;
101 1.1 kamil case 64:
102 1.1 kamil memcpy(&magic64, bytes_transfer_dummy, sizeof(magic64));
103 1.1 kamil break;
104 1.1 kamil }
105 1.1 kamil break;
106 1.1 kamil default:
107 1.1 kamil break;
108 1.1 kamil }
109 1.1 kamil
110 1.1 kamil /* Prepare variables for PIOD and AUXV transfers */
111 1.1 kamil switch (type) {
112 1.1 kamil case BYTES_TRANSFER_TEXTIO:
113 1.1 kamil case BYTES_TRANSFER_DATAIO:
114 1.1 kamil io.piod_op = operation;
115 1.1 kamil switch (size) {
116 1.1 kamil case 8:
117 1.1 kamil io.piod_offs = (type == BYTES_TRANSFER_TEXTIO) ?
118 1.1 kamil (void *)bytes_transfer_dummy :
119 1.1 kamil &lookup_me8;
120 1.1 kamil io.piod_addr = &lookup_me8;
121 1.1 kamil io.piod_len = sizeof(lookup_me8);
122 1.1 kamil break;
123 1.1 kamil case 16:
124 1.1 kamil io.piod_offs = (type == BYTES_TRANSFER_TEXTIO) ?
125 1.1 kamil (void *)bytes_transfer_dummy :
126 1.1 kamil &lookup_me16;
127 1.1 kamil io.piod_addr = &lookup_me16;
128 1.1 kamil io.piod_len = sizeof(lookup_me16);
129 1.1 kamil break;
130 1.1 kamil case 32:
131 1.1 kamil io.piod_offs = (type == BYTES_TRANSFER_TEXTIO) ?
132 1.1 kamil (void *)bytes_transfer_dummy :
133 1.1 kamil &lookup_me32;
134 1.1 kamil io.piod_addr = &lookup_me32;
135 1.1 kamil io.piod_len = sizeof(lookup_me32);
136 1.1 kamil break;
137 1.1 kamil case 64:
138 1.1 kamil io.piod_offs = (type == BYTES_TRANSFER_TEXTIO) ?
139 1.1 kamil (void *)bytes_transfer_dummy :
140 1.1 kamil &lookup_me64;
141 1.1 kamil io.piod_addr = &lookup_me64;
142 1.1 kamil io.piod_len = sizeof(lookup_me64);
143 1.1 kamil break;
144 1.1 kamil default:
145 1.1 kamil break;
146 1.1 kamil }
147 1.1 kamil break;
148 1.1 kamil case BYTES_TRANSFER_AUXV:
149 1.1 kamil io.piod_op = operation;
150 1.1 kamil io.piod_offs = 0;
151 1.1 kamil io.piod_addr = ai;
152 1.1 kamil io.piod_len = size;
153 1.1 kamil break;
154 1.1 kamil default:
155 1.1 kamil break;
156 1.1 kamil }
157 1.1 kamil
158 1.1 kamil DPRINTF("Before forking process PID=%d\n", getpid());
159 1.1 kamil SYSCALL_REQUIRE((child = fork()) != -1);
160 1.1 kamil if (child == 0) {
161 1.1 kamil DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
162 1.1 kamil FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
163 1.1 kamil
164 1.1 kamil switch (type) {
165 1.1 kamil case BYTES_TRANSFER_DATA:
166 1.1 kamil switch (operation) {
167 1.1 kamil case PT_READ_D:
168 1.1 kamil case PT_READ_I:
169 1.1 kamil lookup_me = magic;
170 1.1 kamil break;
171 1.1 kamil default:
172 1.1 kamil break;
173 1.1 kamil }
174 1.1 kamil break;
175 1.1 kamil case BYTES_TRANSFER_DATAIO:
176 1.1 kamil switch (operation) {
177 1.1 kamil case PIOD_READ_D:
178 1.1 kamil case PIOD_READ_I:
179 1.1 kamil switch (size) {
180 1.1 kamil case 8:
181 1.1 kamil lookup_me8 = magic8;
182 1.1 kamil break;
183 1.1 kamil case 16:
184 1.1 kamil lookup_me16 = magic16;
185 1.1 kamil break;
186 1.1 kamil case 32:
187 1.1 kamil lookup_me32 = magic32;
188 1.1 kamil break;
189 1.1 kamil case 64:
190 1.1 kamil lookup_me64 = magic64;
191 1.1 kamil break;
192 1.1 kamil default:
193 1.1 kamil break;
194 1.1 kamil }
195 1.1 kamil break;
196 1.1 kamil default:
197 1.1 kamil break;
198 1.1 kamil }
199 1.1 kamil default:
200 1.1 kamil break;
201 1.1 kamil }
202 1.1 kamil
203 1.1 kamil DPRINTF("Before raising %s from child\n", strsignal(sigval));
204 1.1 kamil FORKEE_ASSERT(raise(sigval) == 0);
205 1.1 kamil
206 1.1 kamil /* Handle PIOD and PT separately as operation values overlap */
207 1.1 kamil switch (type) {
208 1.1 kamil case BYTES_TRANSFER_DATA:
209 1.1 kamil switch (operation) {
210 1.1 kamil case PT_WRITE_D:
211 1.1 kamil case PT_WRITE_I:
212 1.1 kamil FORKEE_ASSERT_EQ(lookup_me, magic);
213 1.1 kamil break;
214 1.1 kamil default:
215 1.1 kamil break;
216 1.1 kamil }
217 1.1 kamil break;
218 1.1 kamil case BYTES_TRANSFER_DATAIO:
219 1.1 kamil switch (operation) {
220 1.1 kamil case PIOD_WRITE_D:
221 1.1 kamil case PIOD_WRITE_I:
222 1.1 kamil switch (size) {
223 1.1 kamil case 8:
224 1.1 kamil FORKEE_ASSERT_EQ(lookup_me8, magic8);
225 1.1 kamil break;
226 1.1 kamil case 16:
227 1.1 kamil FORKEE_ASSERT_EQ(lookup_me16, magic16);
228 1.1 kamil break;
229 1.1 kamil case 32:
230 1.1 kamil FORKEE_ASSERT_EQ(lookup_me32, magic32);
231 1.1 kamil break;
232 1.1 kamil case 64:
233 1.1 kamil FORKEE_ASSERT_EQ(lookup_me64, magic64);
234 1.1 kamil break;
235 1.1 kamil default:
236 1.1 kamil break;
237 1.1 kamil }
238 1.1 kamil break;
239 1.1 kamil default:
240 1.1 kamil break;
241 1.1 kamil }
242 1.1 kamil break;
243 1.1 kamil case BYTES_TRANSFER_TEXT:
244 1.1 kamil FORKEE_ASSERT(memcmp(&magic, bytes_transfer_dummy,
245 1.1 kamil sizeof(magic)) == 0);
246 1.1 kamil break;
247 1.1 kamil case BYTES_TRANSFER_TEXTIO:
248 1.1 kamil switch (size) {
249 1.1 kamil case 8:
250 1.1 kamil FORKEE_ASSERT(memcmp(&magic8,
251 1.1 kamil bytes_transfer_dummy,
252 1.1 kamil sizeof(magic8)) == 0);
253 1.1 kamil break;
254 1.1 kamil case 16:
255 1.1 kamil FORKEE_ASSERT(memcmp(&magic16,
256 1.1 kamil bytes_transfer_dummy,
257 1.1 kamil sizeof(magic16)) == 0);
258 1.1 kamil break;
259 1.1 kamil case 32:
260 1.1 kamil FORKEE_ASSERT(memcmp(&magic32,
261 1.1 kamil bytes_transfer_dummy,
262 1.1 kamil sizeof(magic32)) == 0);
263 1.1 kamil break;
264 1.1 kamil case 64:
265 1.1 kamil FORKEE_ASSERT(memcmp(&magic64,
266 1.1 kamil bytes_transfer_dummy,
267 1.1 kamil sizeof(magic64)) == 0);
268 1.1 kamil break;
269 1.1 kamil }
270 1.1 kamil break;
271 1.1 kamil default:
272 1.1 kamil break;
273 1.1 kamil }
274 1.1 kamil
275 1.1 kamil DPRINTF("Before exiting of the child process\n");
276 1.1 kamil _exit(exitval);
277 1.1 kamil }
278 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
279 1.1 kamil
280 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
281 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
282 1.1 kamil
283 1.1 kamil validate_status_stopped(status, sigval);
284 1.1 kamil
285 1.1 kamil /* Check PaX MPROTECT */
286 1.1 kamil if (!can_we_write_to_text(child)) {
287 1.1 kamil switch (type) {
288 1.1 kamil case BYTES_TRANSFER_TEXTIO:
289 1.1 kamil switch (operation) {
290 1.1 kamil case PIOD_WRITE_D:
291 1.1 kamil case PIOD_WRITE_I:
292 1.1 kamil skip = true;
293 1.1 kamil break;
294 1.1 kamil default:
295 1.1 kamil break;
296 1.1 kamil }
297 1.1 kamil break;
298 1.1 kamil case BYTES_TRANSFER_TEXT:
299 1.1 kamil switch (operation) {
300 1.1 kamil case PT_WRITE_D:
301 1.1 kamil case PT_WRITE_I:
302 1.1 kamil skip = true;
303 1.1 kamil break;
304 1.1 kamil default:
305 1.1 kamil break;
306 1.1 kamil }
307 1.1 kamil break;
308 1.1 kamil default:
309 1.1 kamil break;
310 1.1 kamil }
311 1.1 kamil }
312 1.1 kamil
313 1.1 kamil /* Bailout cleanly killing the child process */
314 1.1 kamil if (skip) {
315 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_KILL, child, (void *)1, 0) != -1);
316 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
317 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
318 1.1 kamil child);
319 1.1 kamil
320 1.1 kamil validate_status_signaled(status, SIGKILL, 0);
321 1.1 kamil
322 1.1 kamil atf_tc_skip("PaX MPROTECT setup prevents writes to .text");
323 1.1 kamil }
324 1.1 kamil
325 1.1 kamil DPRINTF("Calling operation to transfer bytes between child=%d and "
326 1.1 kamil "parent=%d\n", child, getpid());
327 1.1 kamil
328 1.1 kamil switch (type) {
329 1.1 kamil case BYTES_TRANSFER_TEXTIO:
330 1.1 kamil case BYTES_TRANSFER_DATAIO:
331 1.1 kamil case BYTES_TRANSFER_AUXV:
332 1.1 kamil switch (operation) {
333 1.1 kamil case PIOD_WRITE_D:
334 1.1 kamil case PIOD_WRITE_I:
335 1.1 kamil switch (size) {
336 1.1 kamil case 8:
337 1.1 kamil lookup_me8 = magic8;
338 1.1 kamil break;
339 1.1 kamil case 16:
340 1.1 kamil lookup_me16 = magic16;
341 1.1 kamil break;
342 1.1 kamil case 32:
343 1.1 kamil lookup_me32 = magic32;
344 1.1 kamil break;
345 1.1 kamil case 64:
346 1.1 kamil lookup_me64 = magic64;
347 1.1 kamil break;
348 1.1 kamil default:
349 1.1 kamil break;
350 1.1 kamil }
351 1.1 kamil break;
352 1.1 kamil default:
353 1.1 kamil break;
354 1.1 kamil }
355 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, 0) != -1);
356 1.1 kamil switch (operation) {
357 1.1 kamil case PIOD_READ_D:
358 1.1 kamil case PIOD_READ_I:
359 1.1 kamil switch (size) {
360 1.1 kamil case 8:
361 1.1 kamil ATF_REQUIRE_EQ(lookup_me8, magic8);
362 1.1 kamil break;
363 1.1 kamil case 16:
364 1.1 kamil ATF_REQUIRE_EQ(lookup_me16, magic16);
365 1.1 kamil break;
366 1.1 kamil case 32:
367 1.1 kamil ATF_REQUIRE_EQ(lookup_me32, magic32);
368 1.1 kamil break;
369 1.1 kamil case 64:
370 1.1 kamil ATF_REQUIRE_EQ(lookup_me64, magic64);
371 1.1 kamil break;
372 1.1 kamil default:
373 1.1 kamil break;
374 1.1 kamil }
375 1.1 kamil break;
376 1.1 kamil case PIOD_READ_AUXV:
377 1.1 kamil DPRINTF("Asserting that AUXV length (%zu) is > 0\n",
378 1.1 kamil io.piod_len);
379 1.1 kamil ATF_REQUIRE(io.piod_len > 0);
380 1.1 kamil for (aip = ai; aip->a_type != AT_NULL; aip++)
381 1.1 kamil DPRINTF("a_type=%#llx a_v=%#llx\n",
382 1.1 kamil (long long int)aip->a_type,
383 1.1 kamil (long long int)aip->a_v);
384 1.1 kamil break;
385 1.1 kamil default:
386 1.1 kamil break;
387 1.1 kamil }
388 1.1 kamil break;
389 1.1 kamil case BYTES_TRANSFER_TEXT:
390 1.1 kamil switch (operation) {
391 1.1 kamil case PT_READ_D:
392 1.1 kamil case PT_READ_I:
393 1.1 kamil errno = 0;
394 1.1 kamil lookup_me = ptrace(operation, child,
395 1.1 kamil bytes_transfer_dummy, 0);
396 1.1 kamil ATF_REQUIRE_EQ(lookup_me, magic);
397 1.1 kamil SYSCALL_REQUIRE_ERRNO(errno, 0);
398 1.1 kamil break;
399 1.1 kamil case PT_WRITE_D:
400 1.1 kamil case PT_WRITE_I:
401 1.1 kamil SYSCALL_REQUIRE(ptrace(operation, child,
402 1.1 kamil bytes_transfer_dummy, magic)
403 1.1 kamil != -1);
404 1.1 kamil break;
405 1.1 kamil default:
406 1.1 kamil break;
407 1.1 kamil }
408 1.1 kamil break;
409 1.1 kamil case BYTES_TRANSFER_DATA:
410 1.1 kamil switch (operation) {
411 1.1 kamil case PT_READ_D:
412 1.1 kamil case PT_READ_I:
413 1.1 kamil errno = 0;
414 1.1 kamil lookup_me = ptrace(operation, child, &lookup_me, 0);
415 1.1 kamil ATF_REQUIRE_EQ(lookup_me, magic);
416 1.1 kamil SYSCALL_REQUIRE_ERRNO(errno, 0);
417 1.1 kamil break;
418 1.1 kamil case PT_WRITE_D:
419 1.1 kamil case PT_WRITE_I:
420 1.1 kamil lookup_me = magic;
421 1.1 kamil SYSCALL_REQUIRE(ptrace(operation, child, &lookup_me,
422 1.1 kamil magic) != -1);
423 1.1 kamil break;
424 1.1 kamil default:
425 1.1 kamil break;
426 1.1 kamil }
427 1.1 kamil break;
428 1.1 kamil default:
429 1.1 kamil break;
430 1.1 kamil }
431 1.1 kamil
432 1.1 kamil DPRINTF("Before resuming the child process where it left off and "
433 1.1 kamil "without signal to be sent\n");
434 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
435 1.1 kamil
436 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
437 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
438 1.1 kamil
439 1.1 kamil validate_status_exited(status, exitval);
440 1.1 kamil
441 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
442 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
443 1.1 kamil }
444 1.1 kamil
445 1.1 kamil #define BYTES_TRANSFER(test, operation, size, type) \
446 1.1 kamil ATF_TC(test); \
447 1.1 kamil ATF_TC_HEAD(test, tc) \
448 1.1 kamil { \
449 1.1 kamil atf_tc_set_md_var(tc, "descr", \
450 1.1 kamil "Verify bytes transfer operation" #operation " and size " #size \
451 1.1 kamil " of type " #type); \
452 1.1 kamil } \
453 1.1 kamil \
454 1.1 kamil ATF_TC_BODY(test, tc) \
455 1.1 kamil { \
456 1.1 kamil \
457 1.1 kamil bytes_transfer(operation, size, BYTES_TRANSFER_##type); \
458 1.1 kamil }
459 1.1 kamil
460 1.1 kamil // DATA
461 1.1 kamil
462 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_8, PIOD_READ_D, 8, DATAIO)
463 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_16, PIOD_READ_D, 16, DATAIO)
464 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_32, PIOD_READ_D, 32, DATAIO)
465 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_64, PIOD_READ_D, 64, DATAIO)
466 1.1 kamil
467 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_8, PIOD_READ_I, 8, DATAIO)
468 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_16, PIOD_READ_I, 16, DATAIO)
469 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_32, PIOD_READ_I, 32, DATAIO)
470 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_64, PIOD_READ_I, 64, DATAIO)
471 1.1 kamil
472 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_8, PIOD_WRITE_D, 8, DATAIO)
473 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_16, PIOD_WRITE_D, 16, DATAIO)
474 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_32, PIOD_WRITE_D, 32, DATAIO)
475 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_64, PIOD_WRITE_D, 64, DATAIO)
476 1.1 kamil
477 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_8, PIOD_WRITE_I, 8, DATAIO)
478 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_16, PIOD_WRITE_I, 16, DATAIO)
479 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_32, PIOD_WRITE_I, 32, DATAIO)
480 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_64, PIOD_WRITE_I, 64, DATAIO)
481 1.1 kamil
482 1.1 kamil BYTES_TRANSFER(bytes_transfer_read_d, PT_READ_D, 32, DATA)
483 1.1 kamil BYTES_TRANSFER(bytes_transfer_read_i, PT_READ_I, 32, DATA)
484 1.1 kamil BYTES_TRANSFER(bytes_transfer_write_d, PT_WRITE_D, 32, DATA)
485 1.1 kamil BYTES_TRANSFER(bytes_transfer_write_i, PT_WRITE_I, 32, DATA)
486 1.1 kamil
487 1.1 kamil // TEXT
488 1.1 kamil
489 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_8_text, PIOD_READ_D, 8, TEXTIO)
490 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_16_text, PIOD_READ_D, 16, TEXTIO)
491 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_32_text, PIOD_READ_D, 32, TEXTIO)
492 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_d_64_text, PIOD_READ_D, 64, TEXTIO)
493 1.1 kamil
494 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_8_text, PIOD_READ_I, 8, TEXTIO)
495 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_16_text, PIOD_READ_I, 16, TEXTIO)
496 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_32_text, PIOD_READ_I, 32, TEXTIO)
497 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_i_64_text, PIOD_READ_I, 64, TEXTIO)
498 1.1 kamil
499 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_8_text, PIOD_WRITE_D, 8, TEXTIO)
500 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_16_text, PIOD_WRITE_D, 16, TEXTIO)
501 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_32_text, PIOD_WRITE_D, 32, TEXTIO)
502 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_d_64_text, PIOD_WRITE_D, 64, TEXTIO)
503 1.1 kamil
504 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_8_text, PIOD_WRITE_I, 8, TEXTIO)
505 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_16_text, PIOD_WRITE_I, 16, TEXTIO)
506 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_32_text, PIOD_WRITE_I, 32, TEXTIO)
507 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_write_i_64_text, PIOD_WRITE_I, 64, TEXTIO)
508 1.1 kamil
509 1.1 kamil BYTES_TRANSFER(bytes_transfer_read_d_text, PT_READ_D, 32, TEXT)
510 1.1 kamil BYTES_TRANSFER(bytes_transfer_read_i_text, PT_READ_I, 32, TEXT)
511 1.1 kamil BYTES_TRANSFER(bytes_transfer_write_d_text, PT_WRITE_D, 32, TEXT)
512 1.1 kamil BYTES_TRANSFER(bytes_transfer_write_i_text, PT_WRITE_I, 32, TEXT)
513 1.1 kamil
514 1.1 kamil // AUXV
515 1.1 kamil
516 1.1 kamil BYTES_TRANSFER(bytes_transfer_piod_read_auxv, PIOD_READ_AUXV, 4096, AUXV)
517 1.1 kamil
518 1.1 kamil /// ----------------------------------------------------------------------------
519 1.1 kamil
520 1.1 kamil static void
521 1.1 kamil bytes_transfer_alignment(const char *operation)
522 1.1 kamil {
523 1.1 kamil const int exitval = 5;
524 1.1 kamil const int sigval = SIGSTOP;
525 1.1 kamil pid_t child, wpid;
526 1.1 kamil #if defined(TWAIT_HAVE_STATUS)
527 1.1 kamil int status;
528 1.1 kamil #endif
529 1.1 kamil char *buffer;
530 1.1 kamil int vector;
531 1.1 kamil size_t len;
532 1.1 kamil size_t i;
533 1.1 kamil int op;
534 1.1 kamil
535 1.1 kamil struct ptrace_io_desc io;
536 1.1 kamil struct ptrace_siginfo info;
537 1.1 kamil
538 1.1 kamil memset(&io, 0, sizeof(io));
539 1.1 kamil memset(&info, 0, sizeof(info));
540 1.1 kamil
541 1.1 kamil /* Testing misaligned byte transfer crossing page boundaries */
542 1.1 kamil len = sysconf(_SC_PAGESIZE) * 2;
543 1.1 kamil buffer = malloc(len);
544 1.1 kamil ATF_REQUIRE(buffer != NULL);
545 1.1 kamil
546 1.1 kamil /* Initialize the buffer with random data */
547 1.1 kamil for (i = 0; i < len; i++)
548 1.1 kamil buffer[i] = i & 0xff;
549 1.1 kamil
550 1.1 kamil DPRINTF("Before forking process PID=%d\n", getpid());
551 1.1 kamil SYSCALL_REQUIRE((child = fork()) != -1);
552 1.1 kamil if (child == 0) {
553 1.1 kamil DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
554 1.1 kamil FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
555 1.1 kamil
556 1.1 kamil DPRINTF("Before raising %s from child\n", strsignal(sigval));
557 1.1 kamil FORKEE_ASSERT(raise(sigval) == 0);
558 1.1 kamil
559 1.1 kamil DPRINTF("Before exiting of the child process\n");
560 1.1 kamil _exit(exitval);
561 1.1 kamil }
562 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
563 1.1 kamil
564 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
565 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
566 1.1 kamil
567 1.1 kamil validate_status_stopped(status, sigval);
568 1.1 kamil
569 1.1 kamil DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
570 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info))
571 1.1 kamil != -1);
572 1.1 kamil
573 1.1 kamil DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid);
574 1.1 kamil DPRINTF("Signal properties: si_signo=%#x si_code=%#x "
575 1.1 kamil "si_errno=%#x\n",
576 1.1 kamil info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
577 1.1 kamil info.psi_siginfo.si_errno);
578 1.1 kamil
579 1.1 kamil ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
580 1.1 kamil ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
581 1.1 kamil
582 1.1 kamil if (strcmp(operation, "PT_READ_I") == 0 ||
583 1.1 kamil strcmp(operation, "PT_READ_D") == 0) {
584 1.1 kamil if (strcmp(operation, "PT_READ_I"))
585 1.1 kamil op = PT_READ_I;
586 1.1 kamil else
587 1.1 kamil op = PT_READ_D;
588 1.1 kamil
589 1.1 kamil for (i = 0; i <= (len - sizeof(int)); i++) {
590 1.1 kamil errno = 0;
591 1.1 kamil vector = ptrace(op, child, buffer + i, 0);
592 1.1 kamil ATF_REQUIRE_EQ(errno, 0);
593 1.1 kamil ATF_REQUIRE(!memcmp(&vector, buffer + i, sizeof(int)));
594 1.1 kamil }
595 1.1 kamil } else if (strcmp(operation, "PT_WRITE_I") == 0 ||
596 1.1 kamil strcmp(operation, "PT_WRITE_D") == 0) {
597 1.1 kamil if (strcmp(operation, "PT_WRITE_I"))
598 1.1 kamil op = PT_WRITE_I;
599 1.1 kamil else
600 1.1 kamil op = PT_WRITE_D;
601 1.1 kamil
602 1.1 kamil for (i = 0; i <= (len - sizeof(int)); i++) {
603 1.1 kamil memcpy(&vector, buffer + i, sizeof(int));
604 1.1 kamil SYSCALL_REQUIRE(ptrace(op, child, buffer + 1, vector)
605 1.1 kamil != -1);
606 1.1 kamil }
607 1.1 kamil } else if (strcmp(operation, "PIOD_READ_I") == 0 ||
608 1.1 kamil strcmp(operation, "PIOD_READ_D") == 0) {
609 1.1 kamil if (strcmp(operation, "PIOD_READ_I"))
610 1.1 kamil op = PIOD_READ_I;
611 1.1 kamil else
612 1.1 kamil op = PIOD_READ_D;
613 1.1 kamil
614 1.1 kamil io.piod_op = op;
615 1.1 kamil io.piod_addr = &vector;
616 1.1 kamil io.piod_len = sizeof(int);
617 1.1 kamil
618 1.1 kamil for (i = 0; i <= (len - sizeof(int)); i++) {
619 1.1 kamil io.piod_offs = buffer + i;
620 1.1 kamil
621 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, sizeof(io))
622 1.1 kamil != -1);
623 1.1 kamil ATF_REQUIRE(!memcmp(&vector, buffer + i, sizeof(int)));
624 1.1 kamil }
625 1.1 kamil } else if (strcmp(operation, "PIOD_WRITE_I") == 0 ||
626 1.1 kamil strcmp(operation, "PIOD_WRITE_D") == 0) {
627 1.1 kamil if (strcmp(operation, "PIOD_WRITE_I"))
628 1.1 kamil op = PIOD_WRITE_I;
629 1.1 kamil else
630 1.1 kamil op = PIOD_WRITE_D;
631 1.1 kamil
632 1.1 kamil io.piod_op = op;
633 1.1 kamil io.piod_addr = &vector;
634 1.1 kamil io.piod_len = sizeof(int);
635 1.1 kamil
636 1.1 kamil for (i = 0; i <= (len - sizeof(int)); i++) {
637 1.1 kamil io.piod_offs = buffer + i;
638 1.1 kamil
639 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, sizeof(io))
640 1.1 kamil != -1);
641 1.1 kamil }
642 1.1 kamil } else if (strcmp(operation, "PIOD_READ_AUXV") == 0) {
643 1.1 kamil io.piod_op = PIOD_READ_AUXV;
644 1.1 kamil io.piod_addr = &vector;
645 1.1 kamil io.piod_len = sizeof(int);
646 1.1 kamil
647 1.1 kamil errno = 0;
648 1.1 kamil i = 0;
649 1.1 kamil /* Read the whole AUXV vector, it has no clear length */
650 1.1 kamil while (io.piod_len > 0) {
651 1.1 kamil io.piod_offs = (void *)(intptr_t)i;
652 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, sizeof(io))
653 1.1 kamil != -1 || (io.piod_len == 0 && i > 0));
654 1.1 kamil ++i;
655 1.1 kamil }
656 1.1 kamil }
657 1.1 kamil
658 1.1 kamil DPRINTF("Before resuming the child process where it left off "
659 1.1 kamil "and without signal to be sent\n");
660 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
661 1.1 kamil
662 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
663 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
664 1.1 kamil child);
665 1.1 kamil
666 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
667 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
668 1.1 kamil }
669 1.1 kamil
670 1.1 kamil #define BYTES_TRANSFER_ALIGNMENT(test, operation) \
671 1.1 kamil ATF_TC(test); \
672 1.1 kamil ATF_TC_HEAD(test, tc) \
673 1.1 kamil { \
674 1.1 kamil atf_tc_set_md_var(tc, "descr", \
675 1.1 kamil "Verify bytes transfer for potentially misaligned " \
676 1.1 kamil "operation " operation); \
677 1.1 kamil } \
678 1.1 kamil \
679 1.1 kamil ATF_TC_BODY(test, tc) \
680 1.1 kamil { \
681 1.1 kamil \
682 1.1 kamil bytes_transfer_alignment(operation); \
683 1.1 kamil }
684 1.1 kamil
685 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_pt_read_i, "PT_READ_I")
686 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_pt_read_d, "PT_READ_D")
687 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_pt_write_i, "PT_WRITE_I")
688 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_pt_write_d, "PT_WRITE_D")
689 1.1 kamil
690 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_piod_read_i, "PIOD_READ_I")
691 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_piod_read_d, "PIOD_READ_D")
692 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_piod_write_i, "PIOD_WRITE_I")
693 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_piod_write_d, "PIOD_WRITE_D")
694 1.1 kamil
695 1.1 kamil BYTES_TRANSFER_ALIGNMENT(bytes_transfer_alignment_piod_read_auxv, "PIOD_READ_AUXV")
696 1.1 kamil
697 1.1 kamil /// ----------------------------------------------------------------------------
698 1.1 kamil
699 1.1 kamil static void
700 1.1 kamil bytes_transfer_eof(const char *operation)
701 1.1 kamil {
702 1.1 kamil const int exitval = 5;
703 1.1 kamil const int sigval = SIGSTOP;
704 1.1 kamil pid_t child, wpid;
705 1.1 kamil #if defined(TWAIT_HAVE_STATUS)
706 1.1 kamil int status;
707 1.1 kamil #endif
708 1.1 kamil FILE *fp;
709 1.1 kamil char *p;
710 1.1 kamil int vector;
711 1.1 kamil int op;
712 1.1 kamil
713 1.1 kamil struct ptrace_io_desc io;
714 1.1 kamil struct ptrace_siginfo info;
715 1.1 kamil
716 1.1 kamil memset(&io, 0, sizeof(io));
717 1.1 kamil memset(&info, 0, sizeof(info));
718 1.1 kamil
719 1.1 kamil vector = 0;
720 1.1 kamil
721 1.1 kamil fp = tmpfile();
722 1.1 kamil ATF_REQUIRE(fp != NULL);
723 1.1 kamil
724 1.1 kamil p = mmap(0, 1, PROT_READ|PROT_WRITE, MAP_PRIVATE, fileno(fp), 0);
725 1.1 kamil ATF_REQUIRE(p != MAP_FAILED);
726 1.1 kamil
727 1.1 kamil DPRINTF("Before forking process PID=%d\n", getpid());
728 1.1 kamil SYSCALL_REQUIRE((child = fork()) != -1);
729 1.1 kamil if (child == 0) {
730 1.1 kamil DPRINTF("Before calling PT_TRACE_ME from child %d\n", getpid());
731 1.1 kamil FORKEE_ASSERT(ptrace(PT_TRACE_ME, 0, NULL, 0) != -1);
732 1.1 kamil
733 1.1 kamil DPRINTF("Before raising %s from child\n", strsignal(sigval));
734 1.1 kamil FORKEE_ASSERT(raise(sigval) == 0);
735 1.1 kamil
736 1.1 kamil DPRINTF("Before exiting of the child process\n");
737 1.1 kamil _exit(exitval);
738 1.1 kamil }
739 1.1 kamil DPRINTF("Parent process PID=%d, child's PID=%d\n", getpid(), child);
740 1.1 kamil
741 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
742 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0), child);
743 1.1 kamil
744 1.1 kamil validate_status_stopped(status, sigval);
745 1.1 kamil
746 1.1 kamil DPRINTF("Before calling ptrace(2) with PT_GET_SIGINFO for child\n");
747 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_GET_SIGINFO, child, &info, sizeof(info))
748 1.1 kamil != -1);
749 1.1 kamil
750 1.1 kamil DPRINTF("Signal traced to lwpid=%d\n", info.psi_lwpid);
751 1.1 kamil DPRINTF("Signal properties: si_signo=%#x si_code=%#x "
752 1.1 kamil "si_errno=%#x\n",
753 1.1 kamil info.psi_siginfo.si_signo, info.psi_siginfo.si_code,
754 1.1 kamil info.psi_siginfo.si_errno);
755 1.1 kamil
756 1.1 kamil ATF_REQUIRE_EQ(info.psi_siginfo.si_signo, sigval);
757 1.1 kamil ATF_REQUIRE_EQ(info.psi_siginfo.si_code, SI_LWP);
758 1.1 kamil
759 1.1 kamil if (strcmp(operation, "PT_READ_I") == 0 ||
760 1.1 kamil strcmp(operation, "PT_READ_D") == 0) {
761 1.1 kamil if (strcmp(operation, "PT_READ_I"))
762 1.1 kamil op = PT_READ_I;
763 1.1 kamil else
764 1.1 kamil op = PT_READ_D;
765 1.1 kamil
766 1.1 kamil errno = 0;
767 1.1 kamil SYSCALL_REQUIRE(ptrace(op, child, p, 0) == -1);
768 1.1 kamil ATF_REQUIRE_EQ(errno, EINVAL);
769 1.1 kamil } else if (strcmp(operation, "PT_WRITE_I") == 0 ||
770 1.1 kamil strcmp(operation, "PT_WRITE_D") == 0) {
771 1.1 kamil if (strcmp(operation, "PT_WRITE_I"))
772 1.1 kamil op = PT_WRITE_I;
773 1.1 kamil else
774 1.1 kamil op = PT_WRITE_D;
775 1.1 kamil
776 1.1 kamil errno = 0;
777 1.1 kamil SYSCALL_REQUIRE(ptrace(op, child, p, vector) == -1);
778 1.1 kamil ATF_REQUIRE_EQ(errno, EINVAL);
779 1.1 kamil } else if (strcmp(operation, "PIOD_READ_I") == 0 ||
780 1.1 kamil strcmp(operation, "PIOD_READ_D") == 0) {
781 1.1 kamil if (strcmp(operation, "PIOD_READ_I"))
782 1.1 kamil op = PIOD_READ_I;
783 1.1 kamil else
784 1.1 kamil op = PIOD_READ_D;
785 1.1 kamil
786 1.1 kamil io.piod_op = op;
787 1.1 kamil io.piod_addr = &vector;
788 1.1 kamil io.piod_len = sizeof(int);
789 1.1 kamil io.piod_offs = p;
790 1.1 kamil
791 1.1 kamil errno = 0;
792 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, sizeof(io)) == -1);
793 1.1 kamil ATF_REQUIRE_EQ(errno, EINVAL);
794 1.1 kamil } else if (strcmp(operation, "PIOD_WRITE_I") == 0 ||
795 1.1 kamil strcmp(operation, "PIOD_WRITE_D") == 0) {
796 1.1 kamil if (strcmp(operation, "PIOD_WRITE_I"))
797 1.1 kamil op = PIOD_WRITE_I;
798 1.1 kamil else
799 1.1 kamil op = PIOD_WRITE_D;
800 1.1 kamil
801 1.1 kamil io.piod_op = op;
802 1.1 kamil io.piod_addr = &vector;
803 1.1 kamil io.piod_len = sizeof(int);
804 1.1 kamil io.piod_offs = p;
805 1.1 kamil
806 1.1 kamil errno = 0;
807 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_IO, child, &io, sizeof(io)) == -1);
808 1.1 kamil ATF_REQUIRE_EQ(errno, EINVAL);
809 1.1 kamil }
810 1.1 kamil
811 1.1 kamil DPRINTF("Before resuming the child process where it left off "
812 1.1 kamil "and without signal to be sent\n");
813 1.1 kamil SYSCALL_REQUIRE(ptrace(PT_CONTINUE, child, (void *)1, 0) != -1);
814 1.1 kamil
815 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
816 1.1 kamil TWAIT_REQUIRE_SUCCESS(wpid = TWAIT_GENERIC(child, &status, 0),
817 1.1 kamil child);
818 1.1 kamil
819 1.1 kamil DPRINTF("Before calling %s() for the child\n", TWAIT_FNAME);
820 1.1 kamil TWAIT_REQUIRE_FAILURE(ECHILD, wpid = TWAIT_GENERIC(child, &status, 0));
821 1.1 kamil }
822 1.1 kamil
823 1.1 kamil #define BYTES_TRANSFER_EOF(test, operation) \
824 1.1 kamil ATF_TC(test); \
825 1.1 kamil ATF_TC_HEAD(test, tc) \
826 1.1 kamil { \
827 1.1 kamil atf_tc_set_md_var(tc, "descr", \
828 1.1 kamil "Verify bytes EOF byte transfer for the " operation \
829 1.1 kamil " operation"); \
830 1.1 kamil } \
831 1.1 kamil \
832 1.1 kamil ATF_TC_BODY(test, tc) \
833 1.1 kamil { \
834 1.1 kamil \
835 1.1 kamil bytes_transfer_eof(operation); \
836 1.1 kamil }
837 1.1 kamil
838 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_pt_read_i, "PT_READ_I")
839 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_pt_read_d, "PT_READ_D")
840 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_pt_write_i, "PT_WRITE_I")
841 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_pt_write_d, "PT_WRITE_D")
842 1.1 kamil
843 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_piod_read_i, "PIOD_READ_I")
844 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_piod_read_d, "PIOD_READ_D")
845 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_piod_write_i, "PIOD_WRITE_I")
846 1.1 kamil BYTES_TRANSFER_EOF(bytes_transfer_eof_piod_write_d, "PIOD_WRITE_D")
847 1.1 kamil
848 1.1 kamil
849 1.1 kamil #define ATF_TP_ADD_TCS_PTRACE_WAIT_BYTETRANSFER() \
850 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_8); \
851 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_16); \
852 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_32); \
853 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_64); \
854 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_8); \
855 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_16); \
856 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_32); \
857 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_64); \
858 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_8); \
859 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_16); \
860 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_32); \
861 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_64); \
862 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_8); \
863 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_16); \
864 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_32); \
865 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_64); \
866 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_read_d); \
867 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_read_i); \
868 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_write_d); \
869 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_write_i); \
870 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_8_text); \
871 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_16_text); \
872 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_32_text); \
873 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_d_64_text); \
874 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_8_text); \
875 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_16_text); \
876 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_32_text); \
877 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_i_64_text); \
878 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_8_text); \
879 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_16_text); \
880 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_32_text); \
881 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_d_64_text); \
882 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_8_text); \
883 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_16_text); \
884 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_32_text); \
885 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_write_i_64_text); \
886 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_read_d_text); \
887 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_read_i_text); \
888 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_write_d_text); \
889 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_write_i_text); \
890 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_piod_read_auxv); \
891 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_pt_read_i); \
892 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_pt_read_d); \
893 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_pt_write_i); \
894 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_pt_write_d); \
895 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_piod_read_i); \
896 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_piod_read_d); \
897 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_piod_write_i); \
898 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_piod_write_d); \
899 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_alignment_piod_read_auxv); \
900 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_pt_read_i); \
901 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_pt_read_d); \
902 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_pt_write_i); \
903 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_pt_write_d); \
904 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_piod_read_i); \
905 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_piod_read_d); \
906 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_piod_write_i); \
907 1.1 kamil ATF_TP_ADD_TC(tp, bytes_transfer_eof_piod_write_d);
908