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>
266c9c7d8fSMichael 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 */
start_trace(pid_t child)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 
stop_trace(pid_t child)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 
cont_trace(pid_t child)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 
ptrace_read_regs(pid_t child,unsigned long type,unsigned long regs[],int n)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 
ptrace_write_regs(pid_t child,unsigned long type,unsigned long regs[],int n)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 */
show_tar_registers(pid_t child,unsigned long * out)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 
write_tar_registers(pid_t child,unsigned long tar,unsigned long ppr,unsigned long dscr)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 
show_tm_checkpointed_state(pid_t child,unsigned long * out)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 
write_ckpt_tar_registers(pid_t child,unsigned long tar,unsigned long ppr,unsigned long dscr)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 */
show_fpr(pid_t child,__u64 * 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 
write_fpr(pid_t child,__u64 val)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 
show_ckpt_fpr(pid_t child,__u64 * fpr)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 
write_ckpt_fpr(pid_t child,unsigned long val)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 */
show_gpr(pid_t child,unsigned long * 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 
sys_ptrace(enum __ptrace_request request,pid_t pid,unsigned long addr,unsigned long data)4446c9c7d8fSMichael Ellerman long sys_ptrace(enum __ptrace_request request, pid_t pid, unsigned long addr, unsigned long data)
4456c9c7d8fSMichael Ellerman {
4466c9c7d8fSMichael Ellerman 	return syscall(__NR_ptrace, request, pid, (void *)addr, data);
4476c9c7d8fSMichael Ellerman }
4486c9c7d8fSMichael Ellerman 
4496c9c7d8fSMichael Ellerman // 33 because of FPSCR
4506c9c7d8fSMichael Ellerman #define PT_NUM_FPRS	(33 * (sizeof(__u64) / sizeof(unsigned long)))
4516c9c7d8fSMichael Ellerman 
peek_fprs(pid_t child)4526c9c7d8fSMichael Ellerman __u64 *peek_fprs(pid_t child)
4536c9c7d8fSMichael Ellerman {
4546c9c7d8fSMichael Ellerman 	unsigned long *fprs, *p, addr;
4556c9c7d8fSMichael Ellerman 	long ret;
4566c9c7d8fSMichael Ellerman 	int i;
4576c9c7d8fSMichael Ellerman 
4586c9c7d8fSMichael Ellerman 	fprs = malloc(sizeof(unsigned long) * PT_NUM_FPRS);
4596c9c7d8fSMichael Ellerman 	if (!fprs) {
4606c9c7d8fSMichael Ellerman 		perror("malloc() failed");
4616c9c7d8fSMichael Ellerman 		return NULL;
4626c9c7d8fSMichael Ellerman 	}
4636c9c7d8fSMichael Ellerman 
4646c9c7d8fSMichael Ellerman 	for (i = 0, p = fprs; i < PT_NUM_FPRS; i++, p++) {
4656c9c7d8fSMichael Ellerman 		addr = sizeof(unsigned long) * (PT_FPR0 + i);
4666c9c7d8fSMichael Ellerman 		ret = sys_ptrace(PTRACE_PEEKUSER, child, addr, (unsigned long)p);
4676c9c7d8fSMichael Ellerman 		if (ret) {
4686c9c7d8fSMichael Ellerman 			perror("ptrace(PTRACE_PEEKUSR) failed");
4696c9c7d8fSMichael Ellerman 			return NULL;
4706c9c7d8fSMichael Ellerman 		}
4716c9c7d8fSMichael Ellerman 	}
4726c9c7d8fSMichael Ellerman 
4736c9c7d8fSMichael Ellerman 	addr = sizeof(unsigned long) * (PT_FPR0 + i);
4746c9c7d8fSMichael Ellerman 	ret = sys_ptrace(PTRACE_PEEKUSER, child, addr, (unsigned long)&addr);
4756c9c7d8fSMichael Ellerman 	if (!ret) {
4766c9c7d8fSMichael Ellerman 		printf("ptrace(PTRACE_PEEKUSR) succeeded unexpectedly!\n");
4776c9c7d8fSMichael Ellerman 		return NULL;
4786c9c7d8fSMichael Ellerman 	}
4796c9c7d8fSMichael Ellerman 
4806c9c7d8fSMichael Ellerman 	return (__u64 *)fprs;
4816c9c7d8fSMichael Ellerman }
4826c9c7d8fSMichael Ellerman 
poke_fprs(pid_t child,unsigned long * fprs)4836c9c7d8fSMichael Ellerman int poke_fprs(pid_t child, unsigned long *fprs)
4846c9c7d8fSMichael Ellerman {
4856c9c7d8fSMichael Ellerman 	unsigned long *p, addr;
4866c9c7d8fSMichael Ellerman 	long ret;
4876c9c7d8fSMichael Ellerman 	int i;
4886c9c7d8fSMichael Ellerman 
4896c9c7d8fSMichael Ellerman 	for (i = 0, p = fprs; i < PT_NUM_FPRS; i++, p++) {
4906c9c7d8fSMichael Ellerman 		addr = sizeof(unsigned long) * (PT_FPR0 + i);
4916c9c7d8fSMichael Ellerman 		ret = sys_ptrace(PTRACE_POKEUSER, child, addr, *p);
4926c9c7d8fSMichael Ellerman 		if (ret) {
4936c9c7d8fSMichael Ellerman 			perror("ptrace(PTRACE_POKEUSR) failed");
4946c9c7d8fSMichael Ellerman 			return -1;
4956c9c7d8fSMichael Ellerman 		}
4966c9c7d8fSMichael Ellerman 	}
4976c9c7d8fSMichael Ellerman 
4986c9c7d8fSMichael Ellerman 	addr = sizeof(unsigned long) * (PT_FPR0 + i);
4996c9c7d8fSMichael Ellerman 	ret = sys_ptrace(PTRACE_POKEUSER, child, addr, addr);
5006c9c7d8fSMichael Ellerman 	if (!ret) {
5016c9c7d8fSMichael Ellerman 		printf("ptrace(PTRACE_POKEUSR) succeeded unexpectedly!\n");
5026c9c7d8fSMichael Ellerman 		return -1;
5036c9c7d8fSMichael Ellerman 	}
5046c9c7d8fSMichael Ellerman 
5056c9c7d8fSMichael Ellerman 	return 0;
5066c9c7d8fSMichael Ellerman }
5076c9c7d8fSMichael Ellerman 
write_gpr(pid_t child,unsigned long val)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 
show_ckpt_gpr(pid_t child,unsigned long * gpr)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 
write_ckpt_gpr(pid_t child,unsigned long val)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 */
show_vmx(pid_t child,unsigned long vmx[][2])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 
show_vmx_ckpt(pid_t child,unsigned long vmx[][2])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 
write_vmx(pid_t child,unsigned long vmx[][2])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 
write_vmx_ckpt(pid_t child,unsigned long vmx[][2])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 */
show_vsx(pid_t child,unsigned long * 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 
show_vsx_ckpt(pid_t child,unsigned long * vsx)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 
write_vsx(pid_t child,unsigned long * vsx)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 
write_vsx_ckpt(pid_t child,unsigned long * vsx)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 */
show_tm_spr(pid_t child,struct tm_spr_regs * out)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 */
get_tfiar(void)746f666ad41SAnshuman Khandual inline unsigned long get_tfiar(void)
747f666ad41SAnshuman Khandual {
748*aecfd680SBenjamin Gray 	return mfspr(SPRN_TFIAR);
749f666ad41SAnshuman Khandual }
750f666ad41SAnshuman Khandual 
analyse_texasr(unsigned long texasr)751f666ad41SAnshuman Khandual void analyse_texasr(unsigned long texasr)
752f666ad41SAnshuman Khandual {
753f666ad41SAnshuman Khandual 	printf("TEXASR: %16lx\t", texasr);
754f666ad41SAnshuman Khandual 
755f666ad41SAnshuman Khandual 	if (texasr & TEXASR_FP)
756f666ad41SAnshuman Khandual 		printf("TEXASR_FP  ");
757f666ad41SAnshuman Khandual 
758f666ad41SAnshuman Khandual 	if (texasr & TEXASR_DA)
759f666ad41SAnshuman Khandual 		printf("TEXASR_DA  ");
760f666ad41SAnshuman Khandual 
761f666ad41SAnshuman Khandual 	if (texasr & TEXASR_NO)
762f666ad41SAnshuman Khandual 		printf("TEXASR_NO  ");
763f666ad41SAnshuman Khandual 
764f666ad41SAnshuman Khandual 	if (texasr & TEXASR_FO)
765f666ad41SAnshuman Khandual 		printf("TEXASR_FO  ");
766f666ad41SAnshuman Khandual 
767f666ad41SAnshuman Khandual 	if (texasr & TEXASR_SIC)
768f666ad41SAnshuman Khandual 		printf("TEXASR_SIC  ");
769f666ad41SAnshuman Khandual 
770f666ad41SAnshuman Khandual 	if (texasr & TEXASR_NTC)
771f666ad41SAnshuman Khandual 		printf("TEXASR_NTC  ");
772f666ad41SAnshuman Khandual 
773f666ad41SAnshuman Khandual 	if (texasr & TEXASR_TC)
774f666ad41SAnshuman Khandual 		printf("TEXASR_TC  ");
775f666ad41SAnshuman Khandual 
776f666ad41SAnshuman Khandual 	if (texasr & TEXASR_TIC)
777f666ad41SAnshuman Khandual 		printf("TEXASR_TIC  ");
778f666ad41SAnshuman Khandual 
779f666ad41SAnshuman Khandual 	if (texasr & TEXASR_IC)
780f666ad41SAnshuman Khandual 		printf("TEXASR_IC  ");
781f666ad41SAnshuman Khandual 
782f666ad41SAnshuman Khandual 	if (texasr & TEXASR_IFC)
783f666ad41SAnshuman Khandual 		printf("TEXASR_IFC  ");
784f666ad41SAnshuman Khandual 
785f666ad41SAnshuman Khandual 	if (texasr & TEXASR_ABT)
786f666ad41SAnshuman Khandual 		printf("TEXASR_ABT  ");
787f666ad41SAnshuman Khandual 
788f666ad41SAnshuman Khandual 	if (texasr & TEXASR_SPD)
789f666ad41SAnshuman Khandual 		printf("TEXASR_SPD  ");
790f666ad41SAnshuman Khandual 
791f666ad41SAnshuman Khandual 	if (texasr & TEXASR_HV)
792f666ad41SAnshuman Khandual 		printf("TEXASR_HV  ");
793f666ad41SAnshuman Khandual 
794f666ad41SAnshuman Khandual 	if (texasr & TEXASR_PR)
795f666ad41SAnshuman Khandual 		printf("TEXASR_PR  ");
796f666ad41SAnshuman Khandual 
797f666ad41SAnshuman Khandual 	if (texasr & TEXASR_FS)
798f666ad41SAnshuman Khandual 		printf("TEXASR_FS  ");
799f666ad41SAnshuman Khandual 
800f666ad41SAnshuman Khandual 	if (texasr & TEXASR_TE)
801f666ad41SAnshuman Khandual 		printf("TEXASR_TE  ");
802f666ad41SAnshuman Khandual 
803f666ad41SAnshuman Khandual 	if (texasr & TEXASR_ROT)
804f666ad41SAnshuman Khandual 		printf("TEXASR_ROT  ");
805f666ad41SAnshuman Khandual 
806f666ad41SAnshuman Khandual 	printf("TFIAR :%lx\n", get_tfiar());
807f666ad41SAnshuman Khandual }
808f666ad41SAnshuman Khandual 
809f666ad41SAnshuman Khandual void store_gpr(unsigned long *addr);
810