162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Ptrace interface test helper functions 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2015 Anshuman Khandual, IBM Corporation. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define __SANE_USERSPACE_TYPES__ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <inttypes.h> 1162306a36Sopenharmony_ci#include <unistd.h> 1262306a36Sopenharmony_ci#include <stdlib.h> 1362306a36Sopenharmony_ci#include <string.h> 1462306a36Sopenharmony_ci#include <malloc.h> 1562306a36Sopenharmony_ci#include <errno.h> 1662306a36Sopenharmony_ci#include <time.h> 1762306a36Sopenharmony_ci#include <sys/ptrace.h> 1862306a36Sopenharmony_ci#include <sys/ioctl.h> 1962306a36Sopenharmony_ci#include <sys/uio.h> 2062306a36Sopenharmony_ci#include <sys/types.h> 2162306a36Sopenharmony_ci#include <sys/wait.h> 2262306a36Sopenharmony_ci#include <sys/signal.h> 2362306a36Sopenharmony_ci#include <sys/ipc.h> 2462306a36Sopenharmony_ci#include <sys/shm.h> 2562306a36Sopenharmony_ci#include <sys/user.h> 2662306a36Sopenharmony_ci#include <sys/syscall.h> 2762306a36Sopenharmony_ci#include <linux/elf.h> 2862306a36Sopenharmony_ci#include <linux/types.h> 2962306a36Sopenharmony_ci#include <linux/auxvec.h> 3062306a36Sopenharmony_ci#include "reg.h" 3162306a36Sopenharmony_ci#include "utils.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci#define TEST_PASS 0 3462306a36Sopenharmony_ci#define TEST_FAIL 1 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistruct fpr_regs { 3762306a36Sopenharmony_ci __u64 fpr[32]; 3862306a36Sopenharmony_ci __u64 fpscr; 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistruct tm_spr_regs { 4262306a36Sopenharmony_ci unsigned long tm_tfhar; 4362306a36Sopenharmony_ci unsigned long tm_texasr; 4462306a36Sopenharmony_ci unsigned long tm_tfiar; 4562306a36Sopenharmony_ci}; 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ci#ifndef NT_PPC_TAR 4862306a36Sopenharmony_ci#define NT_PPC_TAR 0x103 4962306a36Sopenharmony_ci#define NT_PPC_PPR 0x104 5062306a36Sopenharmony_ci#define NT_PPC_DSCR 0x105 5162306a36Sopenharmony_ci#define NT_PPC_EBB 0x106 5262306a36Sopenharmony_ci#define NT_PPC_PMU 0x107 5362306a36Sopenharmony_ci#define NT_PPC_TM_CGPR 0x108 5462306a36Sopenharmony_ci#define NT_PPC_TM_CFPR 0x109 5562306a36Sopenharmony_ci#define NT_PPC_TM_CVMX 0x10a 5662306a36Sopenharmony_ci#define NT_PPC_TM_CVSX 0x10b 5762306a36Sopenharmony_ci#define NT_PPC_TM_SPR 0x10c 5862306a36Sopenharmony_ci#define NT_PPC_TM_CTAR 0x10d 5962306a36Sopenharmony_ci#define NT_PPC_TM_CPPR 0x10e 6062306a36Sopenharmony_ci#define NT_PPC_TM_CDSCR 0x10f 6162306a36Sopenharmony_ci#endif 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_ci/* Basic ptrace operations */ 6462306a36Sopenharmony_ciint start_trace(pid_t child) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci int ret; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci ret = ptrace(PTRACE_ATTACH, child, NULL, NULL); 6962306a36Sopenharmony_ci if (ret) { 7062306a36Sopenharmony_ci perror("ptrace(PTRACE_ATTACH) failed"); 7162306a36Sopenharmony_ci return TEST_FAIL; 7262306a36Sopenharmony_ci } 7362306a36Sopenharmony_ci ret = waitpid(child, NULL, 0); 7462306a36Sopenharmony_ci if (ret != child) { 7562306a36Sopenharmony_ci perror("waitpid() failed"); 7662306a36Sopenharmony_ci return TEST_FAIL; 7762306a36Sopenharmony_ci } 7862306a36Sopenharmony_ci return TEST_PASS; 7962306a36Sopenharmony_ci} 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ciint stop_trace(pid_t child) 8262306a36Sopenharmony_ci{ 8362306a36Sopenharmony_ci int ret; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci ret = ptrace(PTRACE_DETACH, child, NULL, NULL); 8662306a36Sopenharmony_ci if (ret) { 8762306a36Sopenharmony_ci perror("ptrace(PTRACE_DETACH) failed"); 8862306a36Sopenharmony_ci return TEST_FAIL; 8962306a36Sopenharmony_ci } 9062306a36Sopenharmony_ci return TEST_PASS; 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ciint cont_trace(pid_t child) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci int ret; 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_ci ret = ptrace(PTRACE_CONT, child, NULL, NULL); 9862306a36Sopenharmony_ci if (ret) { 9962306a36Sopenharmony_ci perror("ptrace(PTRACE_CONT) failed"); 10062306a36Sopenharmony_ci return TEST_FAIL; 10162306a36Sopenharmony_ci } 10262306a36Sopenharmony_ci return TEST_PASS; 10362306a36Sopenharmony_ci} 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_ciint ptrace_read_regs(pid_t child, unsigned long type, unsigned long regs[], 10662306a36Sopenharmony_ci int n) 10762306a36Sopenharmony_ci{ 10862306a36Sopenharmony_ci struct iovec iov; 10962306a36Sopenharmony_ci long ret; 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_ci FAIL_IF(start_trace(child)); 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_ci iov.iov_base = regs; 11462306a36Sopenharmony_ci iov.iov_len = n * sizeof(unsigned long); 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, type, &iov); 11762306a36Sopenharmony_ci if (ret) 11862306a36Sopenharmony_ci return ret; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci FAIL_IF(stop_trace(child)); 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci return TEST_PASS; 12362306a36Sopenharmony_ci} 12462306a36Sopenharmony_ci 12562306a36Sopenharmony_cilong ptrace_write_regs(pid_t child, unsigned long type, unsigned long regs[], 12662306a36Sopenharmony_ci int n) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci struct iovec iov; 12962306a36Sopenharmony_ci long ret; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci FAIL_IF(start_trace(child)); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci iov.iov_base = regs; 13462306a36Sopenharmony_ci iov.iov_len = n * sizeof(unsigned long); 13562306a36Sopenharmony_ci 13662306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, type, &iov); 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci FAIL_IF(stop_trace(child)); 13962306a36Sopenharmony_ci 14062306a36Sopenharmony_ci return ret; 14162306a36Sopenharmony_ci} 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci/* TAR, PPR, DSCR */ 14462306a36Sopenharmony_ciint show_tar_registers(pid_t child, unsigned long *out) 14562306a36Sopenharmony_ci{ 14662306a36Sopenharmony_ci struct iovec iov; 14762306a36Sopenharmony_ci unsigned long *reg; 14862306a36Sopenharmony_ci int ret; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci reg = malloc(sizeof(unsigned long)); 15162306a36Sopenharmony_ci if (!reg) { 15262306a36Sopenharmony_ci perror("malloc() failed"); 15362306a36Sopenharmony_ci return TEST_FAIL; 15462306a36Sopenharmony_ci } 15562306a36Sopenharmony_ci iov.iov_base = (u64 *) reg; 15662306a36Sopenharmony_ci iov.iov_len = sizeof(unsigned long); 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TAR, &iov); 15962306a36Sopenharmony_ci if (ret) { 16062306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 16162306a36Sopenharmony_ci goto fail; 16262306a36Sopenharmony_ci } 16362306a36Sopenharmony_ci if (out) 16462306a36Sopenharmony_ci out[0] = *reg; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_PPR, &iov); 16762306a36Sopenharmony_ci if (ret) { 16862306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 16962306a36Sopenharmony_ci goto fail; 17062306a36Sopenharmony_ci } 17162306a36Sopenharmony_ci if (out) 17262306a36Sopenharmony_ci out[1] = *reg; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_DSCR, &iov); 17562306a36Sopenharmony_ci if (ret) { 17662306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 17762306a36Sopenharmony_ci goto fail; 17862306a36Sopenharmony_ci } 17962306a36Sopenharmony_ci if (out) 18062306a36Sopenharmony_ci out[2] = *reg; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci free(reg); 18362306a36Sopenharmony_ci return TEST_PASS; 18462306a36Sopenharmony_cifail: 18562306a36Sopenharmony_ci free(reg); 18662306a36Sopenharmony_ci return TEST_FAIL; 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ciint write_tar_registers(pid_t child, unsigned long tar, 19062306a36Sopenharmony_ci unsigned long ppr, unsigned long dscr) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci struct iovec iov; 19362306a36Sopenharmony_ci unsigned long *reg; 19462306a36Sopenharmony_ci int ret; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci reg = malloc(sizeof(unsigned long)); 19762306a36Sopenharmony_ci if (!reg) { 19862306a36Sopenharmony_ci perror("malloc() failed"); 19962306a36Sopenharmony_ci return TEST_FAIL; 20062306a36Sopenharmony_ci } 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci iov.iov_base = (u64 *) reg; 20362306a36Sopenharmony_ci iov.iov_len = sizeof(unsigned long); 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci *reg = tar; 20662306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TAR, &iov); 20762306a36Sopenharmony_ci if (ret) { 20862306a36Sopenharmony_ci perror("ptrace(PTRACE_SETREGSET) failed"); 20962306a36Sopenharmony_ci goto fail; 21062306a36Sopenharmony_ci } 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci *reg = ppr; 21362306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_PPR, &iov); 21462306a36Sopenharmony_ci if (ret) { 21562306a36Sopenharmony_ci perror("ptrace(PTRACE_SETREGSET) failed"); 21662306a36Sopenharmony_ci goto fail; 21762306a36Sopenharmony_ci } 21862306a36Sopenharmony_ci 21962306a36Sopenharmony_ci *reg = dscr; 22062306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_DSCR, &iov); 22162306a36Sopenharmony_ci if (ret) { 22262306a36Sopenharmony_ci perror("ptrace(PTRACE_SETREGSET) failed"); 22362306a36Sopenharmony_ci goto fail; 22462306a36Sopenharmony_ci } 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci free(reg); 22762306a36Sopenharmony_ci return TEST_PASS; 22862306a36Sopenharmony_cifail: 22962306a36Sopenharmony_ci free(reg); 23062306a36Sopenharmony_ci return TEST_FAIL; 23162306a36Sopenharmony_ci} 23262306a36Sopenharmony_ci 23362306a36Sopenharmony_ciint show_tm_checkpointed_state(pid_t child, unsigned long *out) 23462306a36Sopenharmony_ci{ 23562306a36Sopenharmony_ci struct iovec iov; 23662306a36Sopenharmony_ci unsigned long *reg; 23762306a36Sopenharmony_ci int ret; 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ci reg = malloc(sizeof(unsigned long)); 24062306a36Sopenharmony_ci if (!reg) { 24162306a36Sopenharmony_ci perror("malloc() failed"); 24262306a36Sopenharmony_ci return TEST_FAIL; 24362306a36Sopenharmony_ci } 24462306a36Sopenharmony_ci 24562306a36Sopenharmony_ci iov.iov_base = (u64 *) reg; 24662306a36Sopenharmony_ci iov.iov_len = sizeof(unsigned long); 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CTAR, &iov); 24962306a36Sopenharmony_ci if (ret) { 25062306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 25162306a36Sopenharmony_ci goto fail; 25262306a36Sopenharmony_ci } 25362306a36Sopenharmony_ci if (out) 25462306a36Sopenharmony_ci out[0] = *reg; 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CPPR, &iov); 25762306a36Sopenharmony_ci if (ret) { 25862306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 25962306a36Sopenharmony_ci goto fail; 26062306a36Sopenharmony_ci } 26162306a36Sopenharmony_ci if (out) 26262306a36Sopenharmony_ci out[1] = *reg; 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CDSCR, &iov); 26562306a36Sopenharmony_ci if (ret) { 26662306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 26762306a36Sopenharmony_ci goto fail; 26862306a36Sopenharmony_ci } 26962306a36Sopenharmony_ci if (out) 27062306a36Sopenharmony_ci out[2] = *reg; 27162306a36Sopenharmony_ci 27262306a36Sopenharmony_ci free(reg); 27362306a36Sopenharmony_ci return TEST_PASS; 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_cifail: 27662306a36Sopenharmony_ci free(reg); 27762306a36Sopenharmony_ci return TEST_FAIL; 27862306a36Sopenharmony_ci} 27962306a36Sopenharmony_ci 28062306a36Sopenharmony_ciint write_ckpt_tar_registers(pid_t child, unsigned long tar, 28162306a36Sopenharmony_ci unsigned long ppr, unsigned long dscr) 28262306a36Sopenharmony_ci{ 28362306a36Sopenharmony_ci struct iovec iov; 28462306a36Sopenharmony_ci unsigned long *reg; 28562306a36Sopenharmony_ci int ret; 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci reg = malloc(sizeof(unsigned long)); 28862306a36Sopenharmony_ci if (!reg) { 28962306a36Sopenharmony_ci perror("malloc() failed"); 29062306a36Sopenharmony_ci return TEST_FAIL; 29162306a36Sopenharmony_ci } 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci iov.iov_base = (u64 *) reg; 29462306a36Sopenharmony_ci iov.iov_len = sizeof(unsigned long); 29562306a36Sopenharmony_ci 29662306a36Sopenharmony_ci *reg = tar; 29762306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CTAR, &iov); 29862306a36Sopenharmony_ci if (ret) { 29962306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 30062306a36Sopenharmony_ci goto fail; 30162306a36Sopenharmony_ci } 30262306a36Sopenharmony_ci 30362306a36Sopenharmony_ci *reg = ppr; 30462306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CPPR, &iov); 30562306a36Sopenharmony_ci if (ret) { 30662306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 30762306a36Sopenharmony_ci goto fail; 30862306a36Sopenharmony_ci } 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_ci *reg = dscr; 31162306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CDSCR, &iov); 31262306a36Sopenharmony_ci if (ret) { 31362306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 31462306a36Sopenharmony_ci goto fail; 31562306a36Sopenharmony_ci } 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ci free(reg); 31862306a36Sopenharmony_ci return TEST_PASS; 31962306a36Sopenharmony_cifail: 32062306a36Sopenharmony_ci free(reg); 32162306a36Sopenharmony_ci return TEST_FAIL; 32262306a36Sopenharmony_ci} 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci/* FPR */ 32562306a36Sopenharmony_ciint show_fpr(pid_t child, __u64 *fpr) 32662306a36Sopenharmony_ci{ 32762306a36Sopenharmony_ci struct fpr_regs *regs; 32862306a36Sopenharmony_ci int ret, i; 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 33162306a36Sopenharmony_ci ret = ptrace(PTRACE_GETFPREGS, child, NULL, regs); 33262306a36Sopenharmony_ci if (ret) { 33362306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 33462306a36Sopenharmony_ci return TEST_FAIL; 33562306a36Sopenharmony_ci } 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci if (fpr) { 33862306a36Sopenharmony_ci for (i = 0; i < 32; i++) 33962306a36Sopenharmony_ci fpr[i] = regs->fpr[i]; 34062306a36Sopenharmony_ci } 34162306a36Sopenharmony_ci return TEST_PASS; 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ciint write_fpr(pid_t child, __u64 val) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci struct fpr_regs *regs; 34762306a36Sopenharmony_ci int ret, i; 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 35062306a36Sopenharmony_ci ret = ptrace(PTRACE_GETFPREGS, child, NULL, regs); 35162306a36Sopenharmony_ci if (ret) { 35262306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 35362306a36Sopenharmony_ci return TEST_FAIL; 35462306a36Sopenharmony_ci } 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci for (i = 0; i < 32; i++) 35762306a36Sopenharmony_ci regs->fpr[i] = val; 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci ret = ptrace(PTRACE_SETFPREGS, child, NULL, regs); 36062306a36Sopenharmony_ci if (ret) { 36162306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 36262306a36Sopenharmony_ci return TEST_FAIL; 36362306a36Sopenharmony_ci } 36462306a36Sopenharmony_ci return TEST_PASS; 36562306a36Sopenharmony_ci} 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ciint show_ckpt_fpr(pid_t child, __u64 *fpr) 36862306a36Sopenharmony_ci{ 36962306a36Sopenharmony_ci struct fpr_regs *regs; 37062306a36Sopenharmony_ci struct iovec iov; 37162306a36Sopenharmony_ci int ret, i; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 37462306a36Sopenharmony_ci iov.iov_base = regs; 37562306a36Sopenharmony_ci iov.iov_len = sizeof(struct fpr_regs); 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CFPR, &iov); 37862306a36Sopenharmony_ci if (ret) { 37962306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 38062306a36Sopenharmony_ci return TEST_FAIL; 38162306a36Sopenharmony_ci } 38262306a36Sopenharmony_ci 38362306a36Sopenharmony_ci if (fpr) { 38462306a36Sopenharmony_ci for (i = 0; i < 32; i++) 38562306a36Sopenharmony_ci fpr[i] = regs->fpr[i]; 38662306a36Sopenharmony_ci } 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci return TEST_PASS; 38962306a36Sopenharmony_ci} 39062306a36Sopenharmony_ci 39162306a36Sopenharmony_ciint write_ckpt_fpr(pid_t child, unsigned long val) 39262306a36Sopenharmony_ci{ 39362306a36Sopenharmony_ci struct fpr_regs *regs; 39462306a36Sopenharmony_ci struct iovec iov; 39562306a36Sopenharmony_ci int ret, i; 39662306a36Sopenharmony_ci 39762306a36Sopenharmony_ci regs = (struct fpr_regs *) malloc(sizeof(struct fpr_regs)); 39862306a36Sopenharmony_ci iov.iov_base = regs; 39962306a36Sopenharmony_ci iov.iov_len = sizeof(struct fpr_regs); 40062306a36Sopenharmony_ci 40162306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CFPR, &iov); 40262306a36Sopenharmony_ci if (ret) { 40362306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 40462306a36Sopenharmony_ci return TEST_FAIL; 40562306a36Sopenharmony_ci } 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ci for (i = 0; i < 32; i++) 40862306a36Sopenharmony_ci regs->fpr[i] = val; 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CFPR, &iov); 41162306a36Sopenharmony_ci if (ret) { 41262306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 41362306a36Sopenharmony_ci return TEST_FAIL; 41462306a36Sopenharmony_ci } 41562306a36Sopenharmony_ci return TEST_PASS; 41662306a36Sopenharmony_ci} 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci/* GPR */ 41962306a36Sopenharmony_ciint show_gpr(pid_t child, unsigned long *gpr) 42062306a36Sopenharmony_ci{ 42162306a36Sopenharmony_ci struct pt_regs *regs; 42262306a36Sopenharmony_ci int ret, i; 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 42562306a36Sopenharmony_ci if (!regs) { 42662306a36Sopenharmony_ci perror("malloc() failed"); 42762306a36Sopenharmony_ci return TEST_FAIL; 42862306a36Sopenharmony_ci } 42962306a36Sopenharmony_ci 43062306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGS, child, NULL, regs); 43162306a36Sopenharmony_ci if (ret) { 43262306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 43362306a36Sopenharmony_ci return TEST_FAIL; 43462306a36Sopenharmony_ci } 43562306a36Sopenharmony_ci 43662306a36Sopenharmony_ci if (gpr) { 43762306a36Sopenharmony_ci for (i = 14; i < 32; i++) 43862306a36Sopenharmony_ci gpr[i-14] = regs->gpr[i]; 43962306a36Sopenharmony_ci } 44062306a36Sopenharmony_ci 44162306a36Sopenharmony_ci return TEST_PASS; 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cilong sys_ptrace(enum __ptrace_request request, pid_t pid, unsigned long addr, unsigned long data) 44562306a36Sopenharmony_ci{ 44662306a36Sopenharmony_ci return syscall(__NR_ptrace, request, pid, (void *)addr, data); 44762306a36Sopenharmony_ci} 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci// 33 because of FPSCR 45062306a36Sopenharmony_ci#define PT_NUM_FPRS (33 * (sizeof(__u64) / sizeof(unsigned long))) 45162306a36Sopenharmony_ci 45262306a36Sopenharmony_ci__u64 *peek_fprs(pid_t child) 45362306a36Sopenharmony_ci{ 45462306a36Sopenharmony_ci unsigned long *fprs, *p, addr; 45562306a36Sopenharmony_ci long ret; 45662306a36Sopenharmony_ci int i; 45762306a36Sopenharmony_ci 45862306a36Sopenharmony_ci fprs = malloc(sizeof(unsigned long) * PT_NUM_FPRS); 45962306a36Sopenharmony_ci if (!fprs) { 46062306a36Sopenharmony_ci perror("malloc() failed"); 46162306a36Sopenharmony_ci return NULL; 46262306a36Sopenharmony_ci } 46362306a36Sopenharmony_ci 46462306a36Sopenharmony_ci for (i = 0, p = fprs; i < PT_NUM_FPRS; i++, p++) { 46562306a36Sopenharmony_ci addr = sizeof(unsigned long) * (PT_FPR0 + i); 46662306a36Sopenharmony_ci ret = sys_ptrace(PTRACE_PEEKUSER, child, addr, (unsigned long)p); 46762306a36Sopenharmony_ci if (ret) { 46862306a36Sopenharmony_ci perror("ptrace(PTRACE_PEEKUSR) failed"); 46962306a36Sopenharmony_ci return NULL; 47062306a36Sopenharmony_ci } 47162306a36Sopenharmony_ci } 47262306a36Sopenharmony_ci 47362306a36Sopenharmony_ci addr = sizeof(unsigned long) * (PT_FPR0 + i); 47462306a36Sopenharmony_ci ret = sys_ptrace(PTRACE_PEEKUSER, child, addr, (unsigned long)&addr); 47562306a36Sopenharmony_ci if (!ret) { 47662306a36Sopenharmony_ci printf("ptrace(PTRACE_PEEKUSR) succeeded unexpectedly!\n"); 47762306a36Sopenharmony_ci return NULL; 47862306a36Sopenharmony_ci } 47962306a36Sopenharmony_ci 48062306a36Sopenharmony_ci return (__u64 *)fprs; 48162306a36Sopenharmony_ci} 48262306a36Sopenharmony_ci 48362306a36Sopenharmony_ciint poke_fprs(pid_t child, unsigned long *fprs) 48462306a36Sopenharmony_ci{ 48562306a36Sopenharmony_ci unsigned long *p, addr; 48662306a36Sopenharmony_ci long ret; 48762306a36Sopenharmony_ci int i; 48862306a36Sopenharmony_ci 48962306a36Sopenharmony_ci for (i = 0, p = fprs; i < PT_NUM_FPRS; i++, p++) { 49062306a36Sopenharmony_ci addr = sizeof(unsigned long) * (PT_FPR0 + i); 49162306a36Sopenharmony_ci ret = sys_ptrace(PTRACE_POKEUSER, child, addr, *p); 49262306a36Sopenharmony_ci if (ret) { 49362306a36Sopenharmony_ci perror("ptrace(PTRACE_POKEUSR) failed"); 49462306a36Sopenharmony_ci return -1; 49562306a36Sopenharmony_ci } 49662306a36Sopenharmony_ci } 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_ci addr = sizeof(unsigned long) * (PT_FPR0 + i); 49962306a36Sopenharmony_ci ret = sys_ptrace(PTRACE_POKEUSER, child, addr, addr); 50062306a36Sopenharmony_ci if (!ret) { 50162306a36Sopenharmony_ci printf("ptrace(PTRACE_POKEUSR) succeeded unexpectedly!\n"); 50262306a36Sopenharmony_ci return -1; 50362306a36Sopenharmony_ci } 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci return 0; 50662306a36Sopenharmony_ci} 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ciint write_gpr(pid_t child, unsigned long val) 50962306a36Sopenharmony_ci{ 51062306a36Sopenharmony_ci struct pt_regs *regs; 51162306a36Sopenharmony_ci int i, ret; 51262306a36Sopenharmony_ci 51362306a36Sopenharmony_ci regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 51462306a36Sopenharmony_ci if (!regs) { 51562306a36Sopenharmony_ci perror("malloc() failed"); 51662306a36Sopenharmony_ci return TEST_FAIL; 51762306a36Sopenharmony_ci } 51862306a36Sopenharmony_ci 51962306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGS, child, NULL, regs); 52062306a36Sopenharmony_ci if (ret) { 52162306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 52262306a36Sopenharmony_ci return TEST_FAIL; 52362306a36Sopenharmony_ci } 52462306a36Sopenharmony_ci 52562306a36Sopenharmony_ci for (i = 14; i < 32; i++) 52662306a36Sopenharmony_ci regs->gpr[i] = val; 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGS, child, NULL, regs); 52962306a36Sopenharmony_ci if (ret) { 53062306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 53162306a36Sopenharmony_ci return TEST_FAIL; 53262306a36Sopenharmony_ci } 53362306a36Sopenharmony_ci return TEST_PASS; 53462306a36Sopenharmony_ci} 53562306a36Sopenharmony_ci 53662306a36Sopenharmony_ciint show_ckpt_gpr(pid_t child, unsigned long *gpr) 53762306a36Sopenharmony_ci{ 53862306a36Sopenharmony_ci struct pt_regs *regs; 53962306a36Sopenharmony_ci struct iovec iov; 54062306a36Sopenharmony_ci int ret, i; 54162306a36Sopenharmony_ci 54262306a36Sopenharmony_ci regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 54362306a36Sopenharmony_ci if (!regs) { 54462306a36Sopenharmony_ci perror("malloc() failed"); 54562306a36Sopenharmony_ci return TEST_FAIL; 54662306a36Sopenharmony_ci } 54762306a36Sopenharmony_ci 54862306a36Sopenharmony_ci iov.iov_base = (u64 *) regs; 54962306a36Sopenharmony_ci iov.iov_len = sizeof(struct pt_regs); 55062306a36Sopenharmony_ci 55162306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 55262306a36Sopenharmony_ci if (ret) { 55362306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 55462306a36Sopenharmony_ci return TEST_FAIL; 55562306a36Sopenharmony_ci } 55662306a36Sopenharmony_ci 55762306a36Sopenharmony_ci if (gpr) { 55862306a36Sopenharmony_ci for (i = 14; i < 32; i++) 55962306a36Sopenharmony_ci gpr[i-14] = regs->gpr[i]; 56062306a36Sopenharmony_ci } 56162306a36Sopenharmony_ci 56262306a36Sopenharmony_ci return TEST_PASS; 56362306a36Sopenharmony_ci} 56462306a36Sopenharmony_ci 56562306a36Sopenharmony_ciint write_ckpt_gpr(pid_t child, unsigned long val) 56662306a36Sopenharmony_ci{ 56762306a36Sopenharmony_ci struct pt_regs *regs; 56862306a36Sopenharmony_ci struct iovec iov; 56962306a36Sopenharmony_ci int ret, i; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci regs = (struct pt_regs *) malloc(sizeof(struct pt_regs)); 57262306a36Sopenharmony_ci if (!regs) { 57362306a36Sopenharmony_ci perror("malloc() failed\n"); 57462306a36Sopenharmony_ci return TEST_FAIL; 57562306a36Sopenharmony_ci } 57662306a36Sopenharmony_ci iov.iov_base = (u64 *) regs; 57762306a36Sopenharmony_ci iov.iov_len = sizeof(struct pt_regs); 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CGPR, &iov); 58062306a36Sopenharmony_ci if (ret) { 58162306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 58262306a36Sopenharmony_ci return TEST_FAIL; 58362306a36Sopenharmony_ci } 58462306a36Sopenharmony_ci 58562306a36Sopenharmony_ci for (i = 14; i < 32; i++) 58662306a36Sopenharmony_ci regs->gpr[i] = val; 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CGPR, &iov); 58962306a36Sopenharmony_ci if (ret) { 59062306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 59162306a36Sopenharmony_ci return TEST_FAIL; 59262306a36Sopenharmony_ci } 59362306a36Sopenharmony_ci return TEST_PASS; 59462306a36Sopenharmony_ci} 59562306a36Sopenharmony_ci 59662306a36Sopenharmony_ci/* VMX */ 59762306a36Sopenharmony_ciint show_vmx(pid_t child, unsigned long vmx[][2]) 59862306a36Sopenharmony_ci{ 59962306a36Sopenharmony_ci int ret; 60062306a36Sopenharmony_ci 60162306a36Sopenharmony_ci ret = ptrace(PTRACE_GETVRREGS, child, 0, vmx); 60262306a36Sopenharmony_ci if (ret) { 60362306a36Sopenharmony_ci perror("ptrace(PTRACE_GETVRREGS) failed"); 60462306a36Sopenharmony_ci return TEST_FAIL; 60562306a36Sopenharmony_ci } 60662306a36Sopenharmony_ci return TEST_PASS; 60762306a36Sopenharmony_ci} 60862306a36Sopenharmony_ci 60962306a36Sopenharmony_ciint show_vmx_ckpt(pid_t child, unsigned long vmx[][2]) 61062306a36Sopenharmony_ci{ 61162306a36Sopenharmony_ci unsigned long regs[34][2]; 61262306a36Sopenharmony_ci struct iovec iov; 61362306a36Sopenharmony_ci int ret; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci iov.iov_base = (u64 *) regs; 61662306a36Sopenharmony_ci iov.iov_len = sizeof(regs); 61762306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CVMX, &iov); 61862306a36Sopenharmony_ci if (ret) { 61962306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET, NT_PPC_TM_CVMX) failed"); 62062306a36Sopenharmony_ci return TEST_FAIL; 62162306a36Sopenharmony_ci } 62262306a36Sopenharmony_ci memcpy(vmx, regs, sizeof(regs)); 62362306a36Sopenharmony_ci return TEST_PASS; 62462306a36Sopenharmony_ci} 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ci 62762306a36Sopenharmony_ciint write_vmx(pid_t child, unsigned long vmx[][2]) 62862306a36Sopenharmony_ci{ 62962306a36Sopenharmony_ci int ret; 63062306a36Sopenharmony_ci 63162306a36Sopenharmony_ci ret = ptrace(PTRACE_SETVRREGS, child, 0, vmx); 63262306a36Sopenharmony_ci if (ret) { 63362306a36Sopenharmony_ci perror("ptrace(PTRACE_SETVRREGS) failed"); 63462306a36Sopenharmony_ci return TEST_FAIL; 63562306a36Sopenharmony_ci } 63662306a36Sopenharmony_ci return TEST_PASS; 63762306a36Sopenharmony_ci} 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_ciint write_vmx_ckpt(pid_t child, unsigned long vmx[][2]) 64062306a36Sopenharmony_ci{ 64162306a36Sopenharmony_ci unsigned long regs[34][2]; 64262306a36Sopenharmony_ci struct iovec iov; 64362306a36Sopenharmony_ci int ret; 64462306a36Sopenharmony_ci 64562306a36Sopenharmony_ci memcpy(regs, vmx, sizeof(regs)); 64662306a36Sopenharmony_ci iov.iov_base = (u64 *) regs; 64762306a36Sopenharmony_ci iov.iov_len = sizeof(regs); 64862306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CVMX, &iov); 64962306a36Sopenharmony_ci if (ret) { 65062306a36Sopenharmony_ci perror("ptrace(PTRACE_SETREGSET, NT_PPC_TM_CVMX) failed"); 65162306a36Sopenharmony_ci return TEST_FAIL; 65262306a36Sopenharmony_ci } 65362306a36Sopenharmony_ci return TEST_PASS; 65462306a36Sopenharmony_ci} 65562306a36Sopenharmony_ci 65662306a36Sopenharmony_ci/* VSX */ 65762306a36Sopenharmony_ciint show_vsx(pid_t child, unsigned long *vsx) 65862306a36Sopenharmony_ci{ 65962306a36Sopenharmony_ci int ret; 66062306a36Sopenharmony_ci 66162306a36Sopenharmony_ci ret = ptrace(PTRACE_GETVSRREGS, child, 0, vsx); 66262306a36Sopenharmony_ci if (ret) { 66362306a36Sopenharmony_ci perror("ptrace(PTRACE_GETVSRREGS) failed"); 66462306a36Sopenharmony_ci return TEST_FAIL; 66562306a36Sopenharmony_ci } 66662306a36Sopenharmony_ci return TEST_PASS; 66762306a36Sopenharmony_ci} 66862306a36Sopenharmony_ci 66962306a36Sopenharmony_ciint show_vsx_ckpt(pid_t child, unsigned long *vsx) 67062306a36Sopenharmony_ci{ 67162306a36Sopenharmony_ci unsigned long regs[32]; 67262306a36Sopenharmony_ci struct iovec iov; 67362306a36Sopenharmony_ci int ret; 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ci iov.iov_base = (u64 *) regs; 67662306a36Sopenharmony_ci iov.iov_len = sizeof(regs); 67762306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_CVSX, &iov); 67862306a36Sopenharmony_ci if (ret) { 67962306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET, NT_PPC_TM_CVSX) failed"); 68062306a36Sopenharmony_ci return TEST_FAIL; 68162306a36Sopenharmony_ci } 68262306a36Sopenharmony_ci memcpy(vsx, regs, sizeof(regs)); 68362306a36Sopenharmony_ci return TEST_PASS; 68462306a36Sopenharmony_ci} 68562306a36Sopenharmony_ci 68662306a36Sopenharmony_ciint write_vsx(pid_t child, unsigned long *vsx) 68762306a36Sopenharmony_ci{ 68862306a36Sopenharmony_ci int ret; 68962306a36Sopenharmony_ci 69062306a36Sopenharmony_ci ret = ptrace(PTRACE_SETVSRREGS, child, 0, vsx); 69162306a36Sopenharmony_ci if (ret) { 69262306a36Sopenharmony_ci perror("ptrace(PTRACE_SETVSRREGS) failed"); 69362306a36Sopenharmony_ci return TEST_FAIL; 69462306a36Sopenharmony_ci } 69562306a36Sopenharmony_ci return TEST_PASS; 69662306a36Sopenharmony_ci} 69762306a36Sopenharmony_ci 69862306a36Sopenharmony_ciint write_vsx_ckpt(pid_t child, unsigned long *vsx) 69962306a36Sopenharmony_ci{ 70062306a36Sopenharmony_ci unsigned long regs[32]; 70162306a36Sopenharmony_ci struct iovec iov; 70262306a36Sopenharmony_ci int ret; 70362306a36Sopenharmony_ci 70462306a36Sopenharmony_ci memcpy(regs, vsx, sizeof(regs)); 70562306a36Sopenharmony_ci iov.iov_base = (u64 *) regs; 70662306a36Sopenharmony_ci iov.iov_len = sizeof(regs); 70762306a36Sopenharmony_ci ret = ptrace(PTRACE_SETREGSET, child, NT_PPC_TM_CVSX, &iov); 70862306a36Sopenharmony_ci if (ret) { 70962306a36Sopenharmony_ci perror("ptrace(PTRACE_SETREGSET, NT_PPC_TM_CVSX) failed"); 71062306a36Sopenharmony_ci return TEST_FAIL; 71162306a36Sopenharmony_ci } 71262306a36Sopenharmony_ci return TEST_PASS; 71362306a36Sopenharmony_ci} 71462306a36Sopenharmony_ci 71562306a36Sopenharmony_ci/* TM SPR */ 71662306a36Sopenharmony_ciint show_tm_spr(pid_t child, struct tm_spr_regs *out) 71762306a36Sopenharmony_ci{ 71862306a36Sopenharmony_ci struct tm_spr_regs *regs; 71962306a36Sopenharmony_ci struct iovec iov; 72062306a36Sopenharmony_ci int ret; 72162306a36Sopenharmony_ci 72262306a36Sopenharmony_ci regs = (struct tm_spr_regs *) malloc(sizeof(struct tm_spr_regs)); 72362306a36Sopenharmony_ci if (!regs) { 72462306a36Sopenharmony_ci perror("malloc() failed"); 72562306a36Sopenharmony_ci return TEST_FAIL; 72662306a36Sopenharmony_ci } 72762306a36Sopenharmony_ci 72862306a36Sopenharmony_ci iov.iov_base = (u64 *) regs; 72962306a36Sopenharmony_ci iov.iov_len = sizeof(struct tm_spr_regs); 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci ret = ptrace(PTRACE_GETREGSET, child, NT_PPC_TM_SPR, &iov); 73262306a36Sopenharmony_ci if (ret) { 73362306a36Sopenharmony_ci perror("ptrace(PTRACE_GETREGSET) failed"); 73462306a36Sopenharmony_ci return TEST_FAIL; 73562306a36Sopenharmony_ci } 73662306a36Sopenharmony_ci 73762306a36Sopenharmony_ci if (out) 73862306a36Sopenharmony_ci memcpy(out, regs, sizeof(struct tm_spr_regs)); 73962306a36Sopenharmony_ci 74062306a36Sopenharmony_ci return TEST_PASS; 74162306a36Sopenharmony_ci} 74262306a36Sopenharmony_ci 74362306a36Sopenharmony_ci 74462306a36Sopenharmony_ci 74562306a36Sopenharmony_ci/* Analyse TEXASR after TM failure */ 74662306a36Sopenharmony_ciinline unsigned long get_tfiar(void) 74762306a36Sopenharmony_ci{ 74862306a36Sopenharmony_ci return mfspr(SPRN_TFIAR); 74962306a36Sopenharmony_ci} 75062306a36Sopenharmony_ci 75162306a36Sopenharmony_civoid analyse_texasr(unsigned long texasr) 75262306a36Sopenharmony_ci{ 75362306a36Sopenharmony_ci printf("TEXASR: %16lx\t", texasr); 75462306a36Sopenharmony_ci 75562306a36Sopenharmony_ci if (texasr & TEXASR_FP) 75662306a36Sopenharmony_ci printf("TEXASR_FP "); 75762306a36Sopenharmony_ci 75862306a36Sopenharmony_ci if (texasr & TEXASR_DA) 75962306a36Sopenharmony_ci printf("TEXASR_DA "); 76062306a36Sopenharmony_ci 76162306a36Sopenharmony_ci if (texasr & TEXASR_NO) 76262306a36Sopenharmony_ci printf("TEXASR_NO "); 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_ci if (texasr & TEXASR_FO) 76562306a36Sopenharmony_ci printf("TEXASR_FO "); 76662306a36Sopenharmony_ci 76762306a36Sopenharmony_ci if (texasr & TEXASR_SIC) 76862306a36Sopenharmony_ci printf("TEXASR_SIC "); 76962306a36Sopenharmony_ci 77062306a36Sopenharmony_ci if (texasr & TEXASR_NTC) 77162306a36Sopenharmony_ci printf("TEXASR_NTC "); 77262306a36Sopenharmony_ci 77362306a36Sopenharmony_ci if (texasr & TEXASR_TC) 77462306a36Sopenharmony_ci printf("TEXASR_TC "); 77562306a36Sopenharmony_ci 77662306a36Sopenharmony_ci if (texasr & TEXASR_TIC) 77762306a36Sopenharmony_ci printf("TEXASR_TIC "); 77862306a36Sopenharmony_ci 77962306a36Sopenharmony_ci if (texasr & TEXASR_IC) 78062306a36Sopenharmony_ci printf("TEXASR_IC "); 78162306a36Sopenharmony_ci 78262306a36Sopenharmony_ci if (texasr & TEXASR_IFC) 78362306a36Sopenharmony_ci printf("TEXASR_IFC "); 78462306a36Sopenharmony_ci 78562306a36Sopenharmony_ci if (texasr & TEXASR_ABT) 78662306a36Sopenharmony_ci printf("TEXASR_ABT "); 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_ci if (texasr & TEXASR_SPD) 78962306a36Sopenharmony_ci printf("TEXASR_SPD "); 79062306a36Sopenharmony_ci 79162306a36Sopenharmony_ci if (texasr & TEXASR_HV) 79262306a36Sopenharmony_ci printf("TEXASR_HV "); 79362306a36Sopenharmony_ci 79462306a36Sopenharmony_ci if (texasr & TEXASR_PR) 79562306a36Sopenharmony_ci printf("TEXASR_PR "); 79662306a36Sopenharmony_ci 79762306a36Sopenharmony_ci if (texasr & TEXASR_FS) 79862306a36Sopenharmony_ci printf("TEXASR_FS "); 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_ci if (texasr & TEXASR_TE) 80162306a36Sopenharmony_ci printf("TEXASR_TE "); 80262306a36Sopenharmony_ci 80362306a36Sopenharmony_ci if (texasr & TEXASR_ROT) 80462306a36Sopenharmony_ci printf("TEXASR_ROT "); 80562306a36Sopenharmony_ci 80662306a36Sopenharmony_ci printf("TFIAR :%lx\n", get_tfiar()); 80762306a36Sopenharmony_ci} 80862306a36Sopenharmony_ci 80962306a36Sopenharmony_civoid store_gpr(unsigned long *addr); 810