1f666ad41SAnshuman Khandual /* 2f666ad41SAnshuman Khandual * Ptrace interface test helper functions 3f666ad41SAnshuman Khandual * 4f666ad41SAnshuman Khandual * Copyright (C) 2015 Anshuman Khandual, IBM Corporation. 5f666ad41SAnshuman Khandual * 6f666ad41SAnshuman Khandual * This program is free software; you can redistribute it and/or 7f666ad41SAnshuman Khandual * modify it under the terms of the GNU General Public License 8f666ad41SAnshuman Khandual * as published by the Free Software Foundation; either version 9f666ad41SAnshuman Khandual * 2 of the License, or (at your option) any later version. 10f666ad41SAnshuman Khandual */ 11f666ad41SAnshuman Khandual #include <inttypes.h> 12f666ad41SAnshuman Khandual #include <unistd.h> 13f666ad41SAnshuman Khandual #include <stdlib.h> 14f666ad41SAnshuman Khandual #include <string.h> 15f666ad41SAnshuman Khandual #include <malloc.h> 16f666ad41SAnshuman Khandual #include <errno.h> 17f666ad41SAnshuman Khandual #include <time.h> 18f666ad41SAnshuman Khandual #include <sys/ptrace.h> 19f666ad41SAnshuman Khandual #include <sys/ioctl.h> 20f666ad41SAnshuman Khandual #include <sys/uio.h> 21f666ad41SAnshuman Khandual #include <sys/types.h> 22f666ad41SAnshuman Khandual #include <sys/wait.h> 23f666ad41SAnshuman Khandual #include <sys/signal.h> 24f666ad41SAnshuman Khandual #include <sys/ipc.h> 25f666ad41SAnshuman Khandual #include <sys/shm.h> 26f666ad41SAnshuman Khandual #include <sys/user.h> 27f666ad41SAnshuman Khandual #include <linux/elf.h> 28f666ad41SAnshuman Khandual #include <linux/types.h> 29f666ad41SAnshuman Khandual #include <linux/auxvec.h> 30f666ad41SAnshuman Khandual #include "reg.h" 31f666ad41SAnshuman Khandual #include "utils.h" 32f666ad41SAnshuman Khandual 33f666ad41SAnshuman Khandual #define TEST_PASS 0 34f666ad41SAnshuman Khandual #define TEST_FAIL 1 35f666ad41SAnshuman Khandual 36f666ad41SAnshuman Khandual struct fpr_regs { 37f666ad41SAnshuman Khandual unsigned long fpr[32]; 38f666ad41SAnshuman Khandual unsigned long fpscr; 39f666ad41SAnshuman Khandual }; 40f666ad41SAnshuman Khandual 415bdac52fSAnshuman Khandual struct tm_spr_regs { 425bdac52fSAnshuman Khandual unsigned long tm_tfhar; 435bdac52fSAnshuman Khandual unsigned long tm_texasr; 445bdac52fSAnshuman Khandual unsigned long tm_tfiar; 455bdac52fSAnshuman Khandual }; 46f666ad41SAnshuman Khandual 47f666ad41SAnshuman Khandual #ifndef NT_PPC_TAR 48f666ad41SAnshuman Khandual #define NT_PPC_TAR 0x103 49f666ad41SAnshuman Khandual #define NT_PPC_PPR 0x104 50f666ad41SAnshuman Khandual #define NT_PPC_DSCR 0x105 51f666ad41SAnshuman Khandual #define NT_PPC_EBB 0x106 52f666ad41SAnshuman Khandual #define NT_PPC_PMU 0x107 53f666ad41SAnshuman Khandual #define NT_PPC_TM_CGPR 0x108 54f666ad41SAnshuman Khandual #define NT_PPC_TM_CFPR 0x109 55f666ad41SAnshuman Khandual #define NT_PPC_TM_CVMX 0x10a 56f666ad41SAnshuman Khandual #define NT_PPC_TM_CVSX 0x10b 57f666ad41SAnshuman Khandual #define NT_PPC_TM_SPR 0x10c 58f666ad41SAnshuman Khandual #define NT_PPC_TM_CTAR 0x10d 59f666ad41SAnshuman Khandual #define NT_PPC_TM_CPPR 0x10e 60f666ad41SAnshuman Khandual #define NT_PPC_TM_CDSCR 0x10f 61f666ad41SAnshuman Khandual #endif 62f666ad41SAnshuman Khandual 63f666ad41SAnshuman Khandual /* Basic ptrace operations */ 64f666ad41SAnshuman Khandual int start_trace(pid_t child) 65f666ad41SAnshuman Khandual { 66f666ad41SAnshuman Khandual int ret; 67f666ad41SAnshuman Khandual 68f666ad41SAnshuman Khandual ret = ptrace(PTRACE_ATTACH, child, NULL, NULL); 69f666ad41SAnshuman Khandual if (ret) { 70f666ad41SAnshuman Khandual perror("ptrace(PTRACE_ATTACH) failed"); 71f666ad41SAnshuman Khandual return TEST_FAIL; 72f666ad41SAnshuman Khandual } 73f666ad41SAnshuman Khandual ret = waitpid(child, NULL, 0); 74f666ad41SAnshuman Khandual if (ret != child) { 75f666ad41SAnshuman Khandual perror("waitpid() failed"); 76f666ad41SAnshuman Khandual return TEST_FAIL; 77f666ad41SAnshuman Khandual } 78f666ad41SAnshuman Khandual return TEST_PASS; 79f666ad41SAnshuman Khandual } 80f666ad41SAnshuman Khandual 81f666ad41SAnshuman Khandual int stop_trace(pid_t child) 82f666ad41SAnshuman Khandual { 83f666ad41SAnshuman Khandual int ret; 84f666ad41SAnshuman Khandual 85f666ad41SAnshuman Khandual ret = ptrace(PTRACE_DETACH, child, NULL, NULL); 86f666ad41SAnshuman Khandual if (ret) { 87f666ad41SAnshuman Khandual perror("ptrace(PTRACE_DETACH) failed"); 88f666ad41SAnshuman Khandual return TEST_FAIL; 89f666ad41SAnshuman Khandual } 90f666ad41SAnshuman Khandual return TEST_PASS; 91f666ad41SAnshuman Khandual } 92f666ad41SAnshuman Khandual 93f666ad41SAnshuman Khandual int cont_trace(pid_t child) 94f666ad41SAnshuman Khandual { 95f666ad41SAnshuman Khandual int ret; 96f666ad41SAnshuman Khandual 97f666ad41SAnshuman Khandual ret = ptrace(PTRACE_CONT, child, NULL, NULL); 98f666ad41SAnshuman Khandual if (ret) { 99f666ad41SAnshuman Khandual perror("ptrace(PTRACE_CONT) failed"); 100f666ad41SAnshuman Khandual return TEST_FAIL; 101f666ad41SAnshuman Khandual } 102f666ad41SAnshuman Khandual return TEST_PASS; 103f666ad41SAnshuman Khandual } 104f666ad41SAnshuman Khandual 1051f7256e7SThiago Jung Bauermann int ptrace_read_regs(pid_t child, unsigned long type, unsigned long regs[], 1061f7256e7SThiago Jung Bauermann int n) 1071f7256e7SThiago Jung Bauermann { 1081f7256e7SThiago Jung Bauermann struct iovec iov; 1091f7256e7SThiago Jung Bauermann long ret; 1101f7256e7SThiago Jung Bauermann 1111f7256e7SThiago Jung Bauermann FAIL_IF(start_trace(child)); 1121f7256e7SThiago Jung Bauermann 1131f7256e7SThiago Jung Bauermann iov.iov_base = regs; 1141f7256e7SThiago Jung Bauermann iov.iov_len = n * sizeof(unsigned long); 1151f7256e7SThiago Jung Bauermann 1161f7256e7SThiago Jung Bauermann ret = ptrace(PTRACE_GETREGSET, child, type, &iov); 1171f7256e7SThiago Jung Bauermann if (ret) 1181f7256e7SThiago Jung Bauermann return ret; 1191f7256e7SThiago Jung Bauermann 1201f7256e7SThiago Jung Bauermann FAIL_IF(stop_trace(child)); 1211f7256e7SThiago Jung Bauermann 1221f7256e7SThiago Jung Bauermann return TEST_PASS; 1231f7256e7SThiago Jung Bauermann } 1241f7256e7SThiago Jung Bauermann 1251f7256e7SThiago Jung Bauermann long ptrace_write_regs(pid_t child, unsigned long type, unsigned long regs[], 1261f7256e7SThiago Jung Bauermann int n) 1271f7256e7SThiago Jung Bauermann { 1281f7256e7SThiago Jung Bauermann struct iovec iov; 1291f7256e7SThiago Jung Bauermann long ret; 1301f7256e7SThiago Jung Bauermann 1311f7256e7SThiago Jung Bauermann FAIL_IF(start_trace(child)); 1321f7256e7SThiago Jung Bauermann 1331f7256e7SThiago Jung Bauermann iov.iov_base = regs; 1341f7256e7SThiago Jung Bauermann iov.iov_len = n * sizeof(unsigned long); 1351f7256e7SThiago Jung Bauermann 1361f7256e7SThiago Jung Bauermann ret = ptrace(PTRACE_SETREGSET, child, type, &iov); 1371f7256e7SThiago Jung Bauermann 1381f7256e7SThiago Jung Bauermann FAIL_IF(stop_trace(child)); 1391f7256e7SThiago Jung Bauermann 1401f7256e7SThiago Jung Bauermann return ret; 1411f7256e7SThiago Jung Bauermann } 1421f7256e7SThiago Jung Bauermann 143254dae59SAnshuman Khandual /* TAR, PPR, DSCR */ 144254dae59SAnshuman Khandual int show_tar_registers(pid_t child, unsigned long *out) 145254dae59SAnshuman Khandual { 146254dae59SAnshuman Khandual struct iovec iov; 147254dae59SAnshuman Khandual unsigned long *reg; 148254dae59SAnshuman Khandual int ret; 149254dae59SAnshuman Khandual 150254dae59SAnshuman Khandual reg = malloc(sizeof(unsigned long)); 151254dae59SAnshuman Khandual if (!reg) { 152254dae59SAnshuman Khandual perror("malloc() failed"); 153254dae59SAnshuman Khandual return TEST_FAIL; 154254dae59SAnshuman Khandual } 155254dae59SAnshuman Khandual iov.iov_base = (u64 *) reg; 156254dae59SAnshuman Khandual iov.iov_len = sizeof(unsigned long); 157254dae59SAnshuman Khandual 158254dae59SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TAR, &iov); 159254dae59SAnshuman Khandual if (ret) { 160254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 161254dae59SAnshuman Khandual goto fail; 162254dae59SAnshuman Khandual } 163254dae59SAnshuman Khandual if (out) 164254dae59SAnshuman Khandual out[0] = *reg; 165254dae59SAnshuman Khandual 166254dae59SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_PPR, &iov); 167254dae59SAnshuman Khandual if (ret) { 168254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 169254dae59SAnshuman Khandual goto fail; 170254dae59SAnshuman Khandual } 171254dae59SAnshuman Khandual if (out) 172254dae59SAnshuman Khandual out[1] = *reg; 173254dae59SAnshuman Khandual 174254dae59SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_DSCR, &iov); 175254dae59SAnshuman Khandual if (ret) { 176254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 177254dae59SAnshuman Khandual goto fail; 178254dae59SAnshuman Khandual } 179254dae59SAnshuman Khandual if (out) 180254dae59SAnshuman Khandual out[2] = *reg; 181254dae59SAnshuman Khandual 182254dae59SAnshuman Khandual free(reg); 183254dae59SAnshuman Khandual return TEST_PASS; 184254dae59SAnshuman Khandual fail: 185254dae59SAnshuman Khandual free(reg); 186254dae59SAnshuman Khandual return TEST_FAIL; 187254dae59SAnshuman Khandual } 188254dae59SAnshuman Khandual 189254dae59SAnshuman Khandual int write_tar_registers(pid_t child, unsigned long tar, 190254dae59SAnshuman Khandual unsigned long ppr, unsigned long dscr) 191254dae59SAnshuman Khandual { 192254dae59SAnshuman Khandual struct iovec iov; 193254dae59SAnshuman Khandual unsigned long *reg; 194254dae59SAnshuman Khandual int ret; 195254dae59SAnshuman Khandual 196254dae59SAnshuman Khandual reg = malloc(sizeof(unsigned long)); 197254dae59SAnshuman Khandual if (!reg) { 198254dae59SAnshuman Khandual perror("malloc() failed"); 199254dae59SAnshuman Khandual return TEST_FAIL; 200254dae59SAnshuman Khandual } 201254dae59SAnshuman Khandual 202254dae59SAnshuman Khandual iov.iov_base = (u64 *) reg; 203254dae59SAnshuman Khandual iov.iov_len = sizeof(unsigned long); 204254dae59SAnshuman Khandual 205254dae59SAnshuman Khandual *reg = tar; 206254dae59SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TAR, &iov); 207254dae59SAnshuman Khandual if (ret) { 208254dae59SAnshuman Khandual perror("ptrace(PTRACE_SETREGSET) failed"); 209254dae59SAnshuman Khandual goto fail; 210254dae59SAnshuman Khandual } 211254dae59SAnshuman Khandual 212254dae59SAnshuman Khandual *reg = ppr; 213254dae59SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_PPR, &iov); 214254dae59SAnshuman Khandual if (ret) { 215254dae59SAnshuman Khandual perror("ptrace(PTRACE_SETREGSET) failed"); 216254dae59SAnshuman Khandual goto fail; 217254dae59SAnshuman Khandual } 218254dae59SAnshuman Khandual 219254dae59SAnshuman Khandual *reg = dscr; 220254dae59SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_DSCR, &iov); 221254dae59SAnshuman Khandual if (ret) { 222254dae59SAnshuman Khandual perror("ptrace(PTRACE_SETREGSET) failed"); 223254dae59SAnshuman Khandual goto fail; 224254dae59SAnshuman Khandual } 225254dae59SAnshuman Khandual 226254dae59SAnshuman Khandual free(reg); 227254dae59SAnshuman Khandual return TEST_PASS; 228254dae59SAnshuman Khandual fail: 229254dae59SAnshuman Khandual free(reg); 230254dae59SAnshuman Khandual return TEST_FAIL; 231254dae59SAnshuman Khandual } 232254dae59SAnshuman Khandual 233254dae59SAnshuman Khandual int show_tm_checkpointed_state(pid_t child, unsigned long *out) 234254dae59SAnshuman Khandual { 235254dae59SAnshuman Khandual struct iovec iov; 236254dae59SAnshuman Khandual unsigned long *reg; 237254dae59SAnshuman Khandual int ret; 238254dae59SAnshuman Khandual 239254dae59SAnshuman Khandual reg = malloc(sizeof(unsigned long)); 240254dae59SAnshuman Khandual if (!reg) { 241254dae59SAnshuman Khandual perror("malloc() failed"); 242254dae59SAnshuman Khandual return TEST_FAIL; 243254dae59SAnshuman Khandual } 244254dae59SAnshuman Khandual 245254dae59SAnshuman Khandual iov.iov_base = (u64 *) reg; 246254dae59SAnshuman Khandual iov.iov_len = sizeof(unsigned long); 247254dae59SAnshuman Khandual 248254dae59SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CTAR, &iov); 249254dae59SAnshuman Khandual if (ret) { 250254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 251254dae59SAnshuman Khandual goto fail; 252254dae59SAnshuman Khandual } 253254dae59SAnshuman Khandual if (out) 254254dae59SAnshuman Khandual out[0] = *reg; 255254dae59SAnshuman Khandual 256254dae59SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CPPR, &iov); 257254dae59SAnshuman Khandual if (ret) { 258254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 259254dae59SAnshuman Khandual goto fail; 260254dae59SAnshuman Khandual } 261254dae59SAnshuman Khandual if (out) 262254dae59SAnshuman Khandual out[1] = *reg; 263254dae59SAnshuman Khandual 264254dae59SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CDSCR, &iov); 265254dae59SAnshuman Khandual if (ret) { 266254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 267254dae59SAnshuman Khandual goto fail; 268254dae59SAnshuman Khandual } 269254dae59SAnshuman Khandual if (out) 270254dae59SAnshuman Khandual out[2] = *reg; 271254dae59SAnshuman Khandual 272254dae59SAnshuman Khandual free(reg); 273254dae59SAnshuman Khandual return TEST_PASS; 274254dae59SAnshuman Khandual 275254dae59SAnshuman Khandual fail: 276254dae59SAnshuman Khandual free(reg); 277254dae59SAnshuman Khandual return TEST_FAIL; 278254dae59SAnshuman Khandual } 279254dae59SAnshuman Khandual 280254dae59SAnshuman Khandual int write_ckpt_tar_registers(pid_t child, unsigned long tar, 281254dae59SAnshuman Khandual unsigned long ppr, unsigned long dscr) 282254dae59SAnshuman Khandual { 283254dae59SAnshuman Khandual struct iovec iov; 284254dae59SAnshuman Khandual unsigned long *reg; 285254dae59SAnshuman Khandual int ret; 286254dae59SAnshuman Khandual 287254dae59SAnshuman Khandual reg = malloc(sizeof(unsigned long)); 288254dae59SAnshuman Khandual if (!reg) { 289254dae59SAnshuman Khandual perror("malloc() failed"); 290254dae59SAnshuman Khandual return TEST_FAIL; 291254dae59SAnshuman Khandual } 292254dae59SAnshuman Khandual 293254dae59SAnshuman Khandual iov.iov_base = (u64 *) reg; 294254dae59SAnshuman Khandual iov.iov_len = sizeof(unsigned long); 295254dae59SAnshuman Khandual 296254dae59SAnshuman Khandual *reg = tar; 297254dae59SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CTAR, &iov); 298254dae59SAnshuman Khandual if (ret) { 299254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 300254dae59SAnshuman Khandual goto fail; 301254dae59SAnshuman Khandual } 302254dae59SAnshuman Khandual 303254dae59SAnshuman Khandual *reg = ppr; 304254dae59SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CPPR, &iov); 305254dae59SAnshuman Khandual if (ret) { 306254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 307254dae59SAnshuman Khandual goto fail; 308254dae59SAnshuman Khandual } 309254dae59SAnshuman Khandual 310254dae59SAnshuman Khandual *reg = dscr; 311254dae59SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CDSCR, &iov); 312254dae59SAnshuman Khandual if (ret) { 313254dae59SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 314254dae59SAnshuman Khandual goto fail; 315254dae59SAnshuman Khandual } 316254dae59SAnshuman Khandual 317254dae59SAnshuman Khandual free(reg); 318254dae59SAnshuman Khandual return TEST_PASS; 319254dae59SAnshuman Khandual fail: 320254dae59SAnshuman Khandual free(reg); 321254dae59SAnshuman Khandual return TEST_FAIL; 322254dae59SAnshuman Khandual } 323254dae59SAnshuman Khandual 324f666ad41SAnshuman Khandual /* FPR */ 325f666ad41SAnshuman Khandual int show_fpr(pid_t child, unsigned long *fpr) 326f666ad41SAnshuman Khandual { 327f666ad41SAnshuman Khandual struct fpr_regs *regs; 328f666ad41SAnshuman Khandual int ret, i; 329f666ad41SAnshuman Khandual 330f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 331f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETFPREGS, child, NULL, regs); 332f666ad41SAnshuman Khandual if (ret) { 333f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 334f666ad41SAnshuman Khandual return TEST_FAIL; 335f666ad41SAnshuman Khandual } 336f666ad41SAnshuman Khandual 337f666ad41SAnshuman Khandual if (fpr) { 338f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 339f666ad41SAnshuman Khandual fpr[i] = regs->fpr[i]; 340f666ad41SAnshuman Khandual } 341f666ad41SAnshuman Khandual return TEST_PASS; 342f666ad41SAnshuman Khandual } 343f666ad41SAnshuman Khandual 344f666ad41SAnshuman Khandual int write_fpr(pid_t child, unsigned long val) 345f666ad41SAnshuman Khandual { 346f666ad41SAnshuman Khandual struct fpr_regs *regs; 347f666ad41SAnshuman Khandual int ret, i; 348f666ad41SAnshuman Khandual 349f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 350f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETFPREGS, child, NULL, regs); 351f666ad41SAnshuman Khandual if (ret) { 352f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 353f666ad41SAnshuman Khandual return TEST_FAIL; 354f666ad41SAnshuman Khandual } 355f666ad41SAnshuman Khandual 356f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 357f666ad41SAnshuman Khandual regs->fpr[i] = val; 358f666ad41SAnshuman Khandual 359f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETFPREGS, child, NULL, regs); 360f666ad41SAnshuman Khandual if (ret) { 361f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 362f666ad41SAnshuman Khandual return TEST_FAIL; 363f666ad41SAnshuman Khandual } 364f666ad41SAnshuman Khandual return TEST_PASS; 365f666ad41SAnshuman Khandual } 366f666ad41SAnshuman Khandual 367f666ad41SAnshuman Khandual int show_ckpt_fpr(pid_t child, unsigned long *fpr) 368f666ad41SAnshuman Khandual { 369f666ad41SAnshuman Khandual struct fpr_regs *regs; 370f666ad41SAnshuman Khandual struct iovec iov; 371f666ad41SAnshuman Khandual int ret, i; 372f666ad41SAnshuman Khandual 373f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 374f666ad41SAnshuman Khandual iov.iov_base = regs; 375f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct fpr_regs); 376f666ad41SAnshuman Khandual 377f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CFPR, &iov); 378f666ad41SAnshuman Khandual if (ret) { 379f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 380f666ad41SAnshuman Khandual return TEST_FAIL; 381f666ad41SAnshuman Khandual } 382f666ad41SAnshuman Khandual 383f666ad41SAnshuman Khandual if (fpr) { 384f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 385f666ad41SAnshuman Khandual fpr[i] = regs->fpr[i]; 386f666ad41SAnshuman Khandual } 387f666ad41SAnshuman Khandual 388f666ad41SAnshuman Khandual return TEST_PASS; 389f666ad41SAnshuman Khandual } 390f666ad41SAnshuman Khandual 391f666ad41SAnshuman Khandual int write_ckpt_fpr(pid_t child, unsigned long val) 392f666ad41SAnshuman Khandual { 393f666ad41SAnshuman Khandual struct fpr_regs *regs; 394f666ad41SAnshuman Khandual struct iovec iov; 395f666ad41SAnshuman Khandual int ret, i; 396f666ad41SAnshuman Khandual 397f666ad41SAnshuman Khandual regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 398f666ad41SAnshuman Khandual iov.iov_base = regs; 399f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct fpr_regs); 400f666ad41SAnshuman Khandual 401f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CFPR, &iov); 402f666ad41SAnshuman Khandual if (ret) { 403f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 404f666ad41SAnshuman Khandual return TEST_FAIL; 405f666ad41SAnshuman Khandual } 406f666ad41SAnshuman Khandual 407f666ad41SAnshuman Khandual for (i = 0; i < 32; i++) 408f666ad41SAnshuman Khandual regs->fpr[i] = val; 409f666ad41SAnshuman Khandual 410f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CFPR, &iov); 411f666ad41SAnshuman Khandual if (ret) { 412f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 413f666ad41SAnshuman Khandual return TEST_FAIL; 414f666ad41SAnshuman Khandual } 415f666ad41SAnshuman Khandual return TEST_PASS; 416f666ad41SAnshuman Khandual } 417f666ad41SAnshuman Khandual 418f666ad41SAnshuman Khandual /* GPR */ 419f666ad41SAnshuman Khandual int show_gpr(pid_t child, unsigned long *gpr) 420f666ad41SAnshuman Khandual { 421f666ad41SAnshuman Khandual struct pt_regs *regs; 422f666ad41SAnshuman Khandual int ret, i; 423f666ad41SAnshuman Khandual 424f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 425f666ad41SAnshuman Khandual if (!regs) { 426f666ad41SAnshuman Khandual perror("malloc() failed"); 427f666ad41SAnshuman Khandual return TEST_FAIL; 428f666ad41SAnshuman Khandual } 429f666ad41SAnshuman Khandual 430f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGS, child, NULL, regs); 431f666ad41SAnshuman Khandual if (ret) { 432f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 433f666ad41SAnshuman Khandual return TEST_FAIL; 434f666ad41SAnshuman Khandual } 435f666ad41SAnshuman Khandual 436f666ad41SAnshuman Khandual if (gpr) { 437f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 438f666ad41SAnshuman Khandual gpr[i-14] = regs->gpr[i]; 439f666ad41SAnshuman Khandual } 440f666ad41SAnshuman Khandual 441f666ad41SAnshuman Khandual return TEST_PASS; 442f666ad41SAnshuman Khandual } 443f666ad41SAnshuman Khandual 444f666ad41SAnshuman Khandual int write_gpr(pid_t child, unsigned long val) 445f666ad41SAnshuman Khandual { 446f666ad41SAnshuman Khandual struct pt_regs *regs; 447f666ad41SAnshuman Khandual int i, ret; 448f666ad41SAnshuman Khandual 449f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 450f666ad41SAnshuman Khandual if (!regs) { 451f666ad41SAnshuman Khandual perror("malloc() failed"); 452f666ad41SAnshuman Khandual return TEST_FAIL; 453f666ad41SAnshuman Khandual } 454f666ad41SAnshuman Khandual 455f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGS, child, NULL, regs); 456f666ad41SAnshuman Khandual if (ret) { 457f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 458f666ad41SAnshuman Khandual return TEST_FAIL; 459f666ad41SAnshuman Khandual } 460f666ad41SAnshuman Khandual 461f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 462f666ad41SAnshuman Khandual regs->gpr[i] = val; 463f666ad41SAnshuman Khandual 464f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGS, child, NULL, regs); 465f666ad41SAnshuman Khandual if (ret) { 466f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 467f666ad41SAnshuman Khandual return TEST_FAIL; 468f666ad41SAnshuman Khandual } 469f666ad41SAnshuman Khandual return TEST_PASS; 470f666ad41SAnshuman Khandual } 471f666ad41SAnshuman Khandual 472f666ad41SAnshuman Khandual int show_ckpt_gpr(pid_t child, unsigned long *gpr) 473f666ad41SAnshuman Khandual { 474f666ad41SAnshuman Khandual struct pt_regs *regs; 475f666ad41SAnshuman Khandual struct iovec iov; 476f666ad41SAnshuman Khandual int ret, i; 477f666ad41SAnshuman Khandual 478f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 479f666ad41SAnshuman Khandual if (!regs) { 480f666ad41SAnshuman Khandual perror("malloc() failed"); 481f666ad41SAnshuman Khandual return TEST_FAIL; 482f666ad41SAnshuman Khandual } 483f666ad41SAnshuman Khandual 484f666ad41SAnshuman Khandual iov.iov_base = (u64 *) regs; 485f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct pt_regs); 486f666ad41SAnshuman Khandual 487f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 488f666ad41SAnshuman Khandual if (ret) { 489f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 490f666ad41SAnshuman Khandual return TEST_FAIL; 491f666ad41SAnshuman Khandual } 492f666ad41SAnshuman Khandual 493f666ad41SAnshuman Khandual if (gpr) { 494f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 495f666ad41SAnshuman Khandual gpr[i-14] = regs->gpr[i]; 496f666ad41SAnshuman Khandual } 497f666ad41SAnshuman Khandual 498f666ad41SAnshuman Khandual return TEST_PASS; 499f666ad41SAnshuman Khandual } 500f666ad41SAnshuman Khandual 501f666ad41SAnshuman Khandual int write_ckpt_gpr(pid_t child, unsigned long val) 502f666ad41SAnshuman Khandual { 503f666ad41SAnshuman Khandual struct pt_regs *regs; 504f666ad41SAnshuman Khandual struct iovec iov; 505f666ad41SAnshuman Khandual int ret, i; 506f666ad41SAnshuman Khandual 507f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 508f666ad41SAnshuman Khandual if (!regs) { 509f666ad41SAnshuman Khandual perror("malloc() failed\n"); 510f666ad41SAnshuman Khandual return TEST_FAIL; 511f666ad41SAnshuman Khandual } 512f666ad41SAnshuman Khandual iov.iov_base = (u64 *) regs; 513f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct pt_regs); 514f666ad41SAnshuman Khandual 515f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 516f666ad41SAnshuman Khandual if (ret) { 517f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 518f666ad41SAnshuman Khandual return TEST_FAIL; 519f666ad41SAnshuman Khandual } 520f666ad41SAnshuman Khandual 521f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 522f666ad41SAnshuman Khandual regs->gpr[i] = val; 523f666ad41SAnshuman Khandual 524f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CGPR, &iov); 525f666ad41SAnshuman Khandual if (ret) { 526f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 527f666ad41SAnshuman Khandual return TEST_FAIL; 528f666ad41SAnshuman Khandual } 529f666ad41SAnshuman Khandual return TEST_PASS; 530f666ad41SAnshuman Khandual } 531f666ad41SAnshuman Khandual 5320da535c0SAnshuman Khandual /* VMX */ 5330da535c0SAnshuman Khandual int show_vmx(pid_t child, unsigned long vmx[][2]) 5340da535c0SAnshuman Khandual { 5350da535c0SAnshuman Khandual int ret; 5360da535c0SAnshuman Khandual 5370da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETVRREGS, child, 0, vmx); 5380da535c0SAnshuman Khandual if (ret) { 5390da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETVRREGS) failed"); 5400da535c0SAnshuman Khandual return TEST_FAIL; 5410da535c0SAnshuman Khandual } 5420da535c0SAnshuman Khandual return TEST_PASS; 5430da535c0SAnshuman Khandual } 5440da535c0SAnshuman Khandual 5450da535c0SAnshuman Khandual int show_vmx_ckpt(pid_t child, unsigned long vmx[][2]) 5460da535c0SAnshuman Khandual { 5470da535c0SAnshuman Khandual unsigned long regs[34][2]; 5480da535c0SAnshuman Khandual struct iovec iov; 5490da535c0SAnshuman Khandual int ret; 5500da535c0SAnshuman Khandual 5510da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 5520da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 5530da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CVMX, &iov); 5540da535c0SAnshuman Khandual if (ret) { 5550da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET, NT_PPC_TM_CVMX) failed"); 5560da535c0SAnshuman Khandual return TEST_FAIL; 5570da535c0SAnshuman Khandual } 5580da535c0SAnshuman Khandual memcpy(vmx, regs, sizeof(regs)); 5590da535c0SAnshuman Khandual return TEST_PASS; 5600da535c0SAnshuman Khandual } 5610da535c0SAnshuman Khandual 5620da535c0SAnshuman Khandual 5630da535c0SAnshuman Khandual int write_vmx(pid_t child, unsigned long vmx[][2]) 5640da535c0SAnshuman Khandual { 5650da535c0SAnshuman Khandual int ret; 5660da535c0SAnshuman Khandual 5670da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETVRREGS, child, 0, vmx); 5680da535c0SAnshuman Khandual if (ret) { 5690da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETVRREGS) failed"); 5700da535c0SAnshuman Khandual return TEST_FAIL; 5710da535c0SAnshuman Khandual } 5720da535c0SAnshuman Khandual return TEST_PASS; 5730da535c0SAnshuman Khandual } 5740da535c0SAnshuman Khandual 5750da535c0SAnshuman Khandual int write_vmx_ckpt(pid_t child, unsigned long vmx[][2]) 5760da535c0SAnshuman Khandual { 5770da535c0SAnshuman Khandual unsigned long regs[34][2]; 5780da535c0SAnshuman Khandual struct iovec iov; 5790da535c0SAnshuman Khandual int ret; 5800da535c0SAnshuman Khandual 5810da535c0SAnshuman Khandual memcpy(regs, vmx, sizeof(regs)); 5820da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 5830da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 5840da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CVMX, &iov); 5850da535c0SAnshuman Khandual if (ret) { 5860da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETREGSET, NT_PPC_TM_CVMX) failed"); 5870da535c0SAnshuman Khandual return TEST_FAIL; 5880da535c0SAnshuman Khandual } 5890da535c0SAnshuman Khandual return TEST_PASS; 5900da535c0SAnshuman Khandual } 5910da535c0SAnshuman Khandual 5920da535c0SAnshuman Khandual /* VSX */ 5930da535c0SAnshuman Khandual int show_vsx(pid_t child, unsigned long *vsx) 5940da535c0SAnshuman Khandual { 5950da535c0SAnshuman Khandual int ret; 5960da535c0SAnshuman Khandual 5970da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETVSRREGS, child, 0, vsx); 5980da535c0SAnshuman Khandual if (ret) { 5990da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETVSRREGS) failed"); 6000da535c0SAnshuman Khandual return TEST_FAIL; 6010da535c0SAnshuman Khandual } 6020da535c0SAnshuman Khandual return TEST_PASS; 6030da535c0SAnshuman Khandual } 6040da535c0SAnshuman Khandual 6050da535c0SAnshuman Khandual int show_vsx_ckpt(pid_t child, unsigned long *vsx) 6060da535c0SAnshuman Khandual { 6070da535c0SAnshuman Khandual unsigned long regs[32]; 6080da535c0SAnshuman Khandual struct iovec iov; 6090da535c0SAnshuman Khandual int ret; 6100da535c0SAnshuman Khandual 6110da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 6120da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 6130da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CVSX, &iov); 6140da535c0SAnshuman Khandual if (ret) { 6150da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET, NT_PPC_TM_CVSX) failed"); 6160da535c0SAnshuman Khandual return TEST_FAIL; 6170da535c0SAnshuman Khandual } 6180da535c0SAnshuman Khandual memcpy(vsx, regs, sizeof(regs)); 6190da535c0SAnshuman Khandual return TEST_PASS; 6200da535c0SAnshuman Khandual } 6210da535c0SAnshuman Khandual 6220da535c0SAnshuman Khandual int write_vsx(pid_t child, unsigned long *vsx) 6230da535c0SAnshuman Khandual { 6240da535c0SAnshuman Khandual int ret; 6250da535c0SAnshuman Khandual 6260da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETVSRREGS, child, 0, vsx); 6270da535c0SAnshuman Khandual if (ret) { 6280da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETVSRREGS) failed"); 6290da535c0SAnshuman Khandual return TEST_FAIL; 6300da535c0SAnshuman Khandual } 6310da535c0SAnshuman Khandual return TEST_PASS; 6320da535c0SAnshuman Khandual } 6330da535c0SAnshuman Khandual 6340da535c0SAnshuman Khandual int write_vsx_ckpt(pid_t child, unsigned long *vsx) 6350da535c0SAnshuman Khandual { 6360da535c0SAnshuman Khandual unsigned long regs[32]; 6370da535c0SAnshuman Khandual struct iovec iov; 6380da535c0SAnshuman Khandual int ret; 6390da535c0SAnshuman Khandual 6400da535c0SAnshuman Khandual memcpy(regs, vsx, sizeof(regs)); 6410da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 6420da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 6430da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CVSX, &iov); 6440da535c0SAnshuman Khandual if (ret) { 6450da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETREGSET, NT_PPC_TM_CVSX) failed"); 6460da535c0SAnshuman Khandual return TEST_FAIL; 6470da535c0SAnshuman Khandual } 6480da535c0SAnshuman Khandual return TEST_PASS; 6490da535c0SAnshuman Khandual } 6500da535c0SAnshuman Khandual 6515bdac52fSAnshuman Khandual /* TM SPR */ 6525bdac52fSAnshuman Khandual int show_tm_spr(pid_t child, struct tm_spr_regs *out) 6535bdac52fSAnshuman Khandual { 6545bdac52fSAnshuman Khandual struct tm_spr_regs *regs; 6555bdac52fSAnshuman Khandual struct iovec iov; 6565bdac52fSAnshuman Khandual int ret; 6575bdac52fSAnshuman Khandual 6585bdac52fSAnshuman Khandual regs = (struct tm_spr_regs *) malloc(sizeof(struct tm_spr_regs)); 6595bdac52fSAnshuman Khandual if (!regs) { 6605bdac52fSAnshuman Khandual perror("malloc() failed"); 6615bdac52fSAnshuman Khandual return TEST_FAIL; 6625bdac52fSAnshuman Khandual } 6635bdac52fSAnshuman Khandual 6645bdac52fSAnshuman Khandual iov.iov_base = (u64 *) regs; 6655bdac52fSAnshuman Khandual iov.iov_len = sizeof(struct tm_spr_regs); 6665bdac52fSAnshuman Khandual 6675bdac52fSAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_SPR, &iov); 6685bdac52fSAnshuman Khandual if (ret) { 6695bdac52fSAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 6705bdac52fSAnshuman Khandual return TEST_FAIL; 6715bdac52fSAnshuman Khandual } 6725bdac52fSAnshuman Khandual 6735bdac52fSAnshuman Khandual if (out) 6745bdac52fSAnshuman Khandual memcpy(out, regs, sizeof(struct tm_spr_regs)); 6755bdac52fSAnshuman Khandual 6765bdac52fSAnshuman Khandual return TEST_PASS; 6775bdac52fSAnshuman Khandual } 6785bdac52fSAnshuman Khandual 6795bdac52fSAnshuman Khandual 6805bdac52fSAnshuman Khandual 681f666ad41SAnshuman Khandual /* Analyse TEXASR after TM failure */ 682f666ad41SAnshuman Khandual inline unsigned long get_tfiar(void) 683f666ad41SAnshuman Khandual { 684f666ad41SAnshuman Khandual unsigned long ret; 685f666ad41SAnshuman Khandual 686f666ad41SAnshuman Khandual asm volatile("mfspr %0,%1" : "=r" (ret) : "i" (SPRN_TFIAR)); 687f666ad41SAnshuman Khandual return ret; 688f666ad41SAnshuman Khandual } 689f666ad41SAnshuman Khandual 690f666ad41SAnshuman Khandual void analyse_texasr(unsigned long texasr) 691f666ad41SAnshuman Khandual { 692f666ad41SAnshuman Khandual printf("TEXASR: %16lx\t", texasr); 693f666ad41SAnshuman Khandual 694f666ad41SAnshuman Khandual if (texasr & TEXASR_FP) 695f666ad41SAnshuman Khandual printf("TEXASR_FP "); 696f666ad41SAnshuman Khandual 697f666ad41SAnshuman Khandual if (texasr & TEXASR_DA) 698f666ad41SAnshuman Khandual printf("TEXASR_DA "); 699f666ad41SAnshuman Khandual 700f666ad41SAnshuman Khandual if (texasr & TEXASR_NO) 701f666ad41SAnshuman Khandual printf("TEXASR_NO "); 702f666ad41SAnshuman Khandual 703f666ad41SAnshuman Khandual if (texasr & TEXASR_FO) 704f666ad41SAnshuman Khandual printf("TEXASR_FO "); 705f666ad41SAnshuman Khandual 706f666ad41SAnshuman Khandual if (texasr & TEXASR_SIC) 707f666ad41SAnshuman Khandual printf("TEXASR_SIC "); 708f666ad41SAnshuman Khandual 709f666ad41SAnshuman Khandual if (texasr & TEXASR_NTC) 710f666ad41SAnshuman Khandual printf("TEXASR_NTC "); 711f666ad41SAnshuman Khandual 712f666ad41SAnshuman Khandual if (texasr & TEXASR_TC) 713f666ad41SAnshuman Khandual printf("TEXASR_TC "); 714f666ad41SAnshuman Khandual 715f666ad41SAnshuman Khandual if (texasr & TEXASR_TIC) 716f666ad41SAnshuman Khandual printf("TEXASR_TIC "); 717f666ad41SAnshuman Khandual 718f666ad41SAnshuman Khandual if (texasr & TEXASR_IC) 719f666ad41SAnshuman Khandual printf("TEXASR_IC "); 720f666ad41SAnshuman Khandual 721f666ad41SAnshuman Khandual if (texasr & TEXASR_IFC) 722f666ad41SAnshuman Khandual printf("TEXASR_IFC "); 723f666ad41SAnshuman Khandual 724f666ad41SAnshuman Khandual if (texasr & TEXASR_ABT) 725f666ad41SAnshuman Khandual printf("TEXASR_ABT "); 726f666ad41SAnshuman Khandual 727f666ad41SAnshuman Khandual if (texasr & TEXASR_SPD) 728f666ad41SAnshuman Khandual printf("TEXASR_SPD "); 729f666ad41SAnshuman Khandual 730f666ad41SAnshuman Khandual if (texasr & TEXASR_HV) 731f666ad41SAnshuman Khandual printf("TEXASR_HV "); 732f666ad41SAnshuman Khandual 733f666ad41SAnshuman Khandual if (texasr & TEXASR_PR) 734f666ad41SAnshuman Khandual printf("TEXASR_PR "); 735f666ad41SAnshuman Khandual 736f666ad41SAnshuman Khandual if (texasr & TEXASR_FS) 737f666ad41SAnshuman Khandual printf("TEXASR_FS "); 738f666ad41SAnshuman Khandual 739f666ad41SAnshuman Khandual if (texasr & TEXASR_TE) 740f666ad41SAnshuman Khandual printf("TEXASR_TE "); 741f666ad41SAnshuman Khandual 742f666ad41SAnshuman Khandual if (texasr & TEXASR_ROT) 743f666ad41SAnshuman Khandual printf("TEXASR_ROT "); 744f666ad41SAnshuman Khandual 745f666ad41SAnshuman Khandual printf("TFIAR :%lx\n", get_tfiar()); 746f666ad41SAnshuman Khandual } 747f666ad41SAnshuman Khandual 748f666ad41SAnshuman Khandual void store_gpr(unsigned long *addr); 749f666ad41SAnshuman Khandual void store_fpr(float *addr); 750