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