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