12874c5fdSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */ 2f666ad41SAnshuman Khandual /* 3f666ad41SAnshuman Khandual * Ptrace interface test helper functions 4f666ad41SAnshuman Khandual * 5f666ad41SAnshuman Khandual * Copyright (C) 2015 Anshuman Khandual, IBM Corporation. 6f666ad41SAnshuman Khandual */ 753fa86e7SMichael Ellerman 853fa86e7SMichael Ellerman #define __SANE_USERSPACE_TYPES__ 953fa86e7SMichael Ellerman 10f666ad41SAnshuman Khandual #include <inttypes.h> 11f666ad41SAnshuman Khandual #include <unistd.h> 12f666ad41SAnshuman Khandual #include <stdlib.h> 13f666ad41SAnshuman Khandual #include <string.h> 14f666ad41SAnshuman Khandual #include <malloc.h> 15f666ad41SAnshuman Khandual #include <errno.h> 16f666ad41SAnshuman Khandual #include <time.h> 17f666ad41SAnshuman Khandual #include <sys/ptrace.h> 18f666ad41SAnshuman Khandual #include <sys/ioctl.h> 19f666ad41SAnshuman Khandual #include <sys/uio.h> 20f666ad41SAnshuman Khandual #include <sys/types.h> 21f666ad41SAnshuman Khandual #include <sys/wait.h> 22f666ad41SAnshuman Khandual #include <sys/signal.h> 23f666ad41SAnshuman Khandual #include <sys/ipc.h> 24f666ad41SAnshuman Khandual #include <sys/shm.h> 25f666ad41SAnshuman Khandual #include <sys/user.h> 26*6c9c7d8fSMichael Ellerman #include <sys/syscall.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 { 3753fa86e7SMichael Ellerman __u64 fpr[32]; 3853fa86e7SMichael Ellerman __u64 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 */ 32553fa86e7SMichael Ellerman int show_fpr(pid_t child, __u64 *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 34453fa86e7SMichael Ellerman int write_fpr(pid_t child, __u64 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 36753fa86e7SMichael Ellerman int show_ckpt_fpr(pid_t child, __u64 *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 444*6c9c7d8fSMichael Ellerman long sys_ptrace(enum __ptrace_request request, pid_t pid, unsigned long addr, unsigned long data) 445*6c9c7d8fSMichael Ellerman { 446*6c9c7d8fSMichael Ellerman return syscall(__NR_ptrace, request, pid, (void *)addr, data); 447*6c9c7d8fSMichael Ellerman } 448*6c9c7d8fSMichael Ellerman 449*6c9c7d8fSMichael Ellerman // 33 because of FPSCR 450*6c9c7d8fSMichael Ellerman #define PT_NUM_FPRS (33 * (sizeof(__u64) / sizeof(unsigned long))) 451*6c9c7d8fSMichael Ellerman 452*6c9c7d8fSMichael Ellerman __u64 *peek_fprs(pid_t child) 453*6c9c7d8fSMichael Ellerman { 454*6c9c7d8fSMichael Ellerman unsigned long *fprs, *p, addr; 455*6c9c7d8fSMichael Ellerman long ret; 456*6c9c7d8fSMichael Ellerman int i; 457*6c9c7d8fSMichael Ellerman 458*6c9c7d8fSMichael Ellerman fprs = malloc(sizeof(unsigned long) * PT_NUM_FPRS); 459*6c9c7d8fSMichael Ellerman if (!fprs) { 460*6c9c7d8fSMichael Ellerman perror("malloc() failed"); 461*6c9c7d8fSMichael Ellerman return NULL; 462*6c9c7d8fSMichael Ellerman } 463*6c9c7d8fSMichael Ellerman 464*6c9c7d8fSMichael Ellerman for (i = 0, p = fprs; i < PT_NUM_FPRS; i++, p++) { 465*6c9c7d8fSMichael Ellerman addr = sizeof(unsigned long) * (PT_FPR0 + i); 466*6c9c7d8fSMichael Ellerman ret = sys_ptrace(PTRACE_PEEKUSER, child, addr, (unsigned long)p); 467*6c9c7d8fSMichael Ellerman if (ret) { 468*6c9c7d8fSMichael Ellerman perror("ptrace(PTRACE_PEEKUSR) failed"); 469*6c9c7d8fSMichael Ellerman return NULL; 470*6c9c7d8fSMichael Ellerman } 471*6c9c7d8fSMichael Ellerman } 472*6c9c7d8fSMichael Ellerman 473*6c9c7d8fSMichael Ellerman addr = sizeof(unsigned long) * (PT_FPR0 + i); 474*6c9c7d8fSMichael Ellerman ret = sys_ptrace(PTRACE_PEEKUSER, child, addr, (unsigned long)&addr); 475*6c9c7d8fSMichael Ellerman if (!ret) { 476*6c9c7d8fSMichael Ellerman printf("ptrace(PTRACE_PEEKUSR) succeeded unexpectedly!\n"); 477*6c9c7d8fSMichael Ellerman return NULL; 478*6c9c7d8fSMichael Ellerman } 479*6c9c7d8fSMichael Ellerman 480*6c9c7d8fSMichael Ellerman return (__u64 *)fprs; 481*6c9c7d8fSMichael Ellerman } 482*6c9c7d8fSMichael Ellerman 483*6c9c7d8fSMichael Ellerman int poke_fprs(pid_t child, unsigned long *fprs) 484*6c9c7d8fSMichael Ellerman { 485*6c9c7d8fSMichael Ellerman unsigned long *p, addr; 486*6c9c7d8fSMichael Ellerman long ret; 487*6c9c7d8fSMichael Ellerman int i; 488*6c9c7d8fSMichael Ellerman 489*6c9c7d8fSMichael Ellerman for (i = 0, p = fprs; i < PT_NUM_FPRS; i++, p++) { 490*6c9c7d8fSMichael Ellerman addr = sizeof(unsigned long) * (PT_FPR0 + i); 491*6c9c7d8fSMichael Ellerman ret = sys_ptrace(PTRACE_POKEUSER, child, addr, *p); 492*6c9c7d8fSMichael Ellerman if (ret) { 493*6c9c7d8fSMichael Ellerman perror("ptrace(PTRACE_POKEUSR) failed"); 494*6c9c7d8fSMichael Ellerman return -1; 495*6c9c7d8fSMichael Ellerman } 496*6c9c7d8fSMichael Ellerman } 497*6c9c7d8fSMichael Ellerman 498*6c9c7d8fSMichael Ellerman addr = sizeof(unsigned long) * (PT_FPR0 + i); 499*6c9c7d8fSMichael Ellerman ret = sys_ptrace(PTRACE_POKEUSER, child, addr, addr); 500*6c9c7d8fSMichael Ellerman if (!ret) { 501*6c9c7d8fSMichael Ellerman printf("ptrace(PTRACE_POKEUSR) succeeded unexpectedly!\n"); 502*6c9c7d8fSMichael Ellerman return -1; 503*6c9c7d8fSMichael Ellerman } 504*6c9c7d8fSMichael Ellerman 505*6c9c7d8fSMichael Ellerman return 0; 506*6c9c7d8fSMichael Ellerman } 507*6c9c7d8fSMichael Ellerman 508f666ad41SAnshuman Khandual int write_gpr(pid_t child, unsigned long val) 509f666ad41SAnshuman Khandual { 510f666ad41SAnshuman Khandual struct pt_regs *regs; 511f666ad41SAnshuman Khandual int i, ret; 512f666ad41SAnshuman Khandual 513f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 514f666ad41SAnshuman Khandual if (!regs) { 515f666ad41SAnshuman Khandual perror("malloc() failed"); 516f666ad41SAnshuman Khandual return TEST_FAIL; 517f666ad41SAnshuman Khandual } 518f666ad41SAnshuman Khandual 519f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGS, child, NULL, regs); 520f666ad41SAnshuman Khandual if (ret) { 521f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 522f666ad41SAnshuman Khandual return TEST_FAIL; 523f666ad41SAnshuman Khandual } 524f666ad41SAnshuman Khandual 525f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 526f666ad41SAnshuman Khandual regs->gpr[i] = val; 527f666ad41SAnshuman Khandual 528f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGS, child, NULL, regs); 529f666ad41SAnshuman Khandual if (ret) { 530f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 531f666ad41SAnshuman Khandual return TEST_FAIL; 532f666ad41SAnshuman Khandual } 533f666ad41SAnshuman Khandual return TEST_PASS; 534f666ad41SAnshuman Khandual } 535f666ad41SAnshuman Khandual 536f666ad41SAnshuman Khandual int show_ckpt_gpr(pid_t child, unsigned long *gpr) 537f666ad41SAnshuman Khandual { 538f666ad41SAnshuman Khandual struct pt_regs *regs; 539f666ad41SAnshuman Khandual struct iovec iov; 540f666ad41SAnshuman Khandual int ret, i; 541f666ad41SAnshuman Khandual 542f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 543f666ad41SAnshuman Khandual if (!regs) { 544f666ad41SAnshuman Khandual perror("malloc() failed"); 545f666ad41SAnshuman Khandual return TEST_FAIL; 546f666ad41SAnshuman Khandual } 547f666ad41SAnshuman Khandual 548f666ad41SAnshuman Khandual iov.iov_base = (u64 *) regs; 549f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct pt_regs); 550f666ad41SAnshuman Khandual 551f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 552f666ad41SAnshuman Khandual if (ret) { 553f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 554f666ad41SAnshuman Khandual return TEST_FAIL; 555f666ad41SAnshuman Khandual } 556f666ad41SAnshuman Khandual 557f666ad41SAnshuman Khandual if (gpr) { 558f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 559f666ad41SAnshuman Khandual gpr[i-14] = regs->gpr[i]; 560f666ad41SAnshuman Khandual } 561f666ad41SAnshuman Khandual 562f666ad41SAnshuman Khandual return TEST_PASS; 563f666ad41SAnshuman Khandual } 564f666ad41SAnshuman Khandual 565f666ad41SAnshuman Khandual int write_ckpt_gpr(pid_t child, unsigned long val) 566f666ad41SAnshuman Khandual { 567f666ad41SAnshuman Khandual struct pt_regs *regs; 568f666ad41SAnshuman Khandual struct iovec iov; 569f666ad41SAnshuman Khandual int ret, i; 570f666ad41SAnshuman Khandual 571f666ad41SAnshuman Khandual regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 572f666ad41SAnshuman Khandual if (!regs) { 573f666ad41SAnshuman Khandual perror("malloc() failed\n"); 574f666ad41SAnshuman Khandual return TEST_FAIL; 575f666ad41SAnshuman Khandual } 576f666ad41SAnshuman Khandual iov.iov_base = (u64 *) regs; 577f666ad41SAnshuman Khandual iov.iov_len = sizeof(struct pt_regs); 578f666ad41SAnshuman Khandual 579f666ad41SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 580f666ad41SAnshuman Khandual if (ret) { 581f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 582f666ad41SAnshuman Khandual return TEST_FAIL; 583f666ad41SAnshuman Khandual } 584f666ad41SAnshuman Khandual 585f666ad41SAnshuman Khandual for (i = 14; i < 32; i++) 586f666ad41SAnshuman Khandual regs->gpr[i] = val; 587f666ad41SAnshuman Khandual 588f666ad41SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CGPR, &iov); 589f666ad41SAnshuman Khandual if (ret) { 590f666ad41SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 591f666ad41SAnshuman Khandual return TEST_FAIL; 592f666ad41SAnshuman Khandual } 593f666ad41SAnshuman Khandual return TEST_PASS; 594f666ad41SAnshuman Khandual } 595f666ad41SAnshuman Khandual 5960da535c0SAnshuman Khandual /* VMX */ 5970da535c0SAnshuman Khandual int show_vmx(pid_t child, unsigned long vmx[][2]) 5980da535c0SAnshuman Khandual { 5990da535c0SAnshuman Khandual int ret; 6000da535c0SAnshuman Khandual 6010da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETVRREGS, child, 0, vmx); 6020da535c0SAnshuman Khandual if (ret) { 6030da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETVRREGS) failed"); 6040da535c0SAnshuman Khandual return TEST_FAIL; 6050da535c0SAnshuman Khandual } 6060da535c0SAnshuman Khandual return TEST_PASS; 6070da535c0SAnshuman Khandual } 6080da535c0SAnshuman Khandual 6090da535c0SAnshuman Khandual int show_vmx_ckpt(pid_t child, unsigned long vmx[][2]) 6100da535c0SAnshuman Khandual { 6110da535c0SAnshuman Khandual unsigned long regs[34][2]; 6120da535c0SAnshuman Khandual struct iovec iov; 6130da535c0SAnshuman Khandual int ret; 6140da535c0SAnshuman Khandual 6150da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 6160da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 6170da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CVMX, &iov); 6180da535c0SAnshuman Khandual if (ret) { 6190da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET, NT_PPC_TM_CVMX) failed"); 6200da535c0SAnshuman Khandual return TEST_FAIL; 6210da535c0SAnshuman Khandual } 6220da535c0SAnshuman Khandual memcpy(vmx, regs, sizeof(regs)); 6230da535c0SAnshuman Khandual return TEST_PASS; 6240da535c0SAnshuman Khandual } 6250da535c0SAnshuman Khandual 6260da535c0SAnshuman Khandual 6270da535c0SAnshuman Khandual int write_vmx(pid_t child, unsigned long vmx[][2]) 6280da535c0SAnshuman Khandual { 6290da535c0SAnshuman Khandual int ret; 6300da535c0SAnshuman Khandual 6310da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETVRREGS, child, 0, vmx); 6320da535c0SAnshuman Khandual if (ret) { 6330da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETVRREGS) failed"); 6340da535c0SAnshuman Khandual return TEST_FAIL; 6350da535c0SAnshuman Khandual } 6360da535c0SAnshuman Khandual return TEST_PASS; 6370da535c0SAnshuman Khandual } 6380da535c0SAnshuman Khandual 6390da535c0SAnshuman Khandual int write_vmx_ckpt(pid_t child, unsigned long vmx[][2]) 6400da535c0SAnshuman Khandual { 6410da535c0SAnshuman Khandual unsigned long regs[34][2]; 6420da535c0SAnshuman Khandual struct iovec iov; 6430da535c0SAnshuman Khandual int ret; 6440da535c0SAnshuman Khandual 6450da535c0SAnshuman Khandual memcpy(regs, vmx, sizeof(regs)); 6460da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 6470da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 6480da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CVMX, &iov); 6490da535c0SAnshuman Khandual if (ret) { 6500da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETREGSET, NT_PPC_TM_CVMX) failed"); 6510da535c0SAnshuman Khandual return TEST_FAIL; 6520da535c0SAnshuman Khandual } 6530da535c0SAnshuman Khandual return TEST_PASS; 6540da535c0SAnshuman Khandual } 6550da535c0SAnshuman Khandual 6560da535c0SAnshuman Khandual /* VSX */ 6570da535c0SAnshuman Khandual int show_vsx(pid_t child, unsigned long *vsx) 6580da535c0SAnshuman Khandual { 6590da535c0SAnshuman Khandual int ret; 6600da535c0SAnshuman Khandual 6610da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETVSRREGS, child, 0, vsx); 6620da535c0SAnshuman Khandual if (ret) { 6630da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETVSRREGS) failed"); 6640da535c0SAnshuman Khandual return TEST_FAIL; 6650da535c0SAnshuman Khandual } 6660da535c0SAnshuman Khandual return TEST_PASS; 6670da535c0SAnshuman Khandual } 6680da535c0SAnshuman Khandual 6690da535c0SAnshuman Khandual int show_vsx_ckpt(pid_t child, unsigned long *vsx) 6700da535c0SAnshuman Khandual { 6710da535c0SAnshuman Khandual unsigned long regs[32]; 6720da535c0SAnshuman Khandual struct iovec iov; 6730da535c0SAnshuman Khandual int ret; 6740da535c0SAnshuman Khandual 6750da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 6760da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 6770da535c0SAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CVSX, &iov); 6780da535c0SAnshuman Khandual if (ret) { 6790da535c0SAnshuman Khandual perror("ptrace(PTRACE_GETREGSET, NT_PPC_TM_CVSX) failed"); 6800da535c0SAnshuman Khandual return TEST_FAIL; 6810da535c0SAnshuman Khandual } 6820da535c0SAnshuman Khandual memcpy(vsx, regs, sizeof(regs)); 6830da535c0SAnshuman Khandual return TEST_PASS; 6840da535c0SAnshuman Khandual } 6850da535c0SAnshuman Khandual 6860da535c0SAnshuman Khandual int write_vsx(pid_t child, unsigned long *vsx) 6870da535c0SAnshuman Khandual { 6880da535c0SAnshuman Khandual int ret; 6890da535c0SAnshuman Khandual 6900da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETVSRREGS, child, 0, vsx); 6910da535c0SAnshuman Khandual if (ret) { 6920da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETVSRREGS) failed"); 6930da535c0SAnshuman Khandual return TEST_FAIL; 6940da535c0SAnshuman Khandual } 6950da535c0SAnshuman Khandual return TEST_PASS; 6960da535c0SAnshuman Khandual } 6970da535c0SAnshuman Khandual 6980da535c0SAnshuman Khandual int write_vsx_ckpt(pid_t child, unsigned long *vsx) 6990da535c0SAnshuman Khandual { 7000da535c0SAnshuman Khandual unsigned long regs[32]; 7010da535c0SAnshuman Khandual struct iovec iov; 7020da535c0SAnshuman Khandual int ret; 7030da535c0SAnshuman Khandual 7040da535c0SAnshuman Khandual memcpy(regs, vsx, sizeof(regs)); 7050da535c0SAnshuman Khandual iov.iov_base = (u64 *) regs; 7060da535c0SAnshuman Khandual iov.iov_len = sizeof(regs); 7070da535c0SAnshuman Khandual ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CVSX, &iov); 7080da535c0SAnshuman Khandual if (ret) { 7090da535c0SAnshuman Khandual perror("ptrace(PTRACE_SETREGSET, NT_PPC_TM_CVSX) failed"); 7100da535c0SAnshuman Khandual return TEST_FAIL; 7110da535c0SAnshuman Khandual } 7120da535c0SAnshuman Khandual return TEST_PASS; 7130da535c0SAnshuman Khandual } 7140da535c0SAnshuman Khandual 7155bdac52fSAnshuman Khandual /* TM SPR */ 7165bdac52fSAnshuman Khandual int show_tm_spr(pid_t child, struct tm_spr_regs *out) 7175bdac52fSAnshuman Khandual { 7185bdac52fSAnshuman Khandual struct tm_spr_regs *regs; 7195bdac52fSAnshuman Khandual struct iovec iov; 7205bdac52fSAnshuman Khandual int ret; 7215bdac52fSAnshuman Khandual 7225bdac52fSAnshuman Khandual regs = (struct tm_spr_regs *) malloc(sizeof(struct tm_spr_regs)); 7235bdac52fSAnshuman Khandual if (!regs) { 7245bdac52fSAnshuman Khandual perror("malloc() failed"); 7255bdac52fSAnshuman Khandual return TEST_FAIL; 7265bdac52fSAnshuman Khandual } 7275bdac52fSAnshuman Khandual 7285bdac52fSAnshuman Khandual iov.iov_base = (u64 *) regs; 7295bdac52fSAnshuman Khandual iov.iov_len = sizeof(struct tm_spr_regs); 7305bdac52fSAnshuman Khandual 7315bdac52fSAnshuman Khandual ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_SPR, &iov); 7325bdac52fSAnshuman Khandual if (ret) { 7335bdac52fSAnshuman Khandual perror("ptrace(PTRACE_GETREGSET) failed"); 7345bdac52fSAnshuman Khandual return TEST_FAIL; 7355bdac52fSAnshuman Khandual } 7365bdac52fSAnshuman Khandual 7375bdac52fSAnshuman Khandual if (out) 7385bdac52fSAnshuman Khandual memcpy(out, regs, sizeof(struct tm_spr_regs)); 7395bdac52fSAnshuman Khandual 7405bdac52fSAnshuman Khandual return TEST_PASS; 7415bdac52fSAnshuman Khandual } 7425bdac52fSAnshuman Khandual 7435bdac52fSAnshuman Khandual 7445bdac52fSAnshuman Khandual 745f666ad41SAnshuman Khandual /* Analyse TEXASR after TM failure */ 746f666ad41SAnshuman Khandual inline unsigned long get_tfiar(void) 747f666ad41SAnshuman Khandual { 748f666ad41SAnshuman Khandual unsigned long ret; 749f666ad41SAnshuman Khandual 750f666ad41SAnshuman Khandual asm volatile("mfspr %0,%1" : "=r" (ret) : "i" (SPRN_TFIAR)); 751f666ad41SAnshuman Khandual return ret; 752f666ad41SAnshuman Khandual } 753f666ad41SAnshuman Khandual 754f666ad41SAnshuman Khandual void analyse_texasr(unsigned long texasr) 755f666ad41SAnshuman Khandual { 756f666ad41SAnshuman Khandual printf("TEXASR: %16lx\t", texasr); 757f666ad41SAnshuman Khandual 758f666ad41SAnshuman Khandual if (texasr & TEXASR_FP) 759f666ad41SAnshuman Khandual printf("TEXASR_FP "); 760f666ad41SAnshuman Khandual 761f666ad41SAnshuman Khandual if (texasr & TEXASR_DA) 762f666ad41SAnshuman Khandual printf("TEXASR_DA "); 763f666ad41SAnshuman Khandual 764f666ad41SAnshuman Khandual if (texasr & TEXASR_NO) 765f666ad41SAnshuman Khandual printf("TEXASR_NO "); 766f666ad41SAnshuman Khandual 767f666ad41SAnshuman Khandual if (texasr & TEXASR_FO) 768f666ad41SAnshuman Khandual printf("TEXASR_FO "); 769f666ad41SAnshuman Khandual 770f666ad41SAnshuman Khandual if (texasr & TEXASR_SIC) 771f666ad41SAnshuman Khandual printf("TEXASR_SIC "); 772f666ad41SAnshuman Khandual 773f666ad41SAnshuman Khandual if (texasr & TEXASR_NTC) 774f666ad41SAnshuman Khandual printf("TEXASR_NTC "); 775f666ad41SAnshuman Khandual 776f666ad41SAnshuman Khandual if (texasr & TEXASR_TC) 777f666ad41SAnshuman Khandual printf("TEXASR_TC "); 778f666ad41SAnshuman Khandual 779f666ad41SAnshuman Khandual if (texasr & TEXASR_TIC) 780f666ad41SAnshuman Khandual printf("TEXASR_TIC "); 781f666ad41SAnshuman Khandual 782f666ad41SAnshuman Khandual if (texasr & TEXASR_IC) 783f666ad41SAnshuman Khandual printf("TEXASR_IC "); 784f666ad41SAnshuman Khandual 785f666ad41SAnshuman Khandual if (texasr & TEXASR_IFC) 786f666ad41SAnshuman Khandual printf("TEXASR_IFC "); 787f666ad41SAnshuman Khandual 788f666ad41SAnshuman Khandual if (texasr & TEXASR_ABT) 789f666ad41SAnshuman Khandual printf("TEXASR_ABT "); 790f666ad41SAnshuman Khandual 791f666ad41SAnshuman Khandual if (texasr & TEXASR_SPD) 792f666ad41SAnshuman Khandual printf("TEXASR_SPD "); 793f666ad41SAnshuman Khandual 794f666ad41SAnshuman Khandual if (texasr & TEXASR_HV) 795f666ad41SAnshuman Khandual printf("TEXASR_HV "); 796f666ad41SAnshuman Khandual 797f666ad41SAnshuman Khandual if (texasr & TEXASR_PR) 798f666ad41SAnshuman Khandual printf("TEXASR_PR "); 799f666ad41SAnshuman Khandual 800f666ad41SAnshuman Khandual if (texasr & TEXASR_FS) 801f666ad41SAnshuman Khandual printf("TEXASR_FS "); 802f666ad41SAnshuman Khandual 803f666ad41SAnshuman Khandual if (texasr & TEXASR_TE) 804f666ad41SAnshuman Khandual printf("TEXASR_TE "); 805f666ad41SAnshuman Khandual 806f666ad41SAnshuman Khandual if (texasr & TEXASR_ROT) 807f666ad41SAnshuman Khandual printf("TEXASR_ROT "); 808f666ad41SAnshuman Khandual 809f666ad41SAnshuman Khandual printf("TFIAR :%lx\n", get_tfiar()); 810f666ad41SAnshuman Khandual } 811f666ad41SAnshuman Khandual 812f666ad41SAnshuman Khandual void store_gpr(unsigned long *addr); 813