xref: /linux/arch/powerpc/kernel/ptrace/ptrace-tm.c (revision ff2632d7d08edc11e8bd0629e9fcfebab25c78b4)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #include <linux/regset.h>
4 
5 #include <asm/switch_to.h>
6 #include <asm/tm.h>
7 #include <asm/asm-prototypes.h>
8 
9 #include "ptrace-decl.h"
10 
flush_tmregs_to_thread(struct task_struct * tsk)11 void flush_tmregs_to_thread(struct task_struct *tsk)
12 {
13 	/*
14 	 * If task is not current, it will have been flushed already to
15 	 * its thread_struct during __switch_to().
16 	 *
17 	 * A reclaim flushes ALL the state or if not in TM save TM SPRs
18 	 * in the appropriate thread structures from live.
19 	 */
20 
21 	if (!cpu_has_feature(CPU_FTR_TM) || tsk != current)
22 		return;
23 
24 	if (MSR_TM_SUSPENDED(mfmsr())) {
25 		tm_reclaim_current(TM_CAUSE_SIGNAL);
26 	} else {
27 		tm_enable();
28 		tm_save_sprs(&tsk->thread);
29 	}
30 }
31 
get_user_ckpt_msr(struct task_struct * task)32 static unsigned long get_user_ckpt_msr(struct task_struct *task)
33 {
34 	return task->thread.ckpt_regs.msr | task->thread.fpexc_mode;
35 }
36 
set_user_ckpt_msr(struct task_struct * task,unsigned long msr)37 static int set_user_ckpt_msr(struct task_struct *task, unsigned long msr)
38 {
39 	task->thread.ckpt_regs.msr &= ~MSR_DEBUGCHANGE;
40 	task->thread.ckpt_regs.msr |= msr & MSR_DEBUGCHANGE;
41 	return 0;
42 }
43 
set_user_ckpt_trap(struct task_struct * task,unsigned long trap)44 static int set_user_ckpt_trap(struct task_struct *task, unsigned long trap)
45 {
46 	set_trap(&task->thread.ckpt_regs, trap);
47 	return 0;
48 }
49 
50 /**
51  * tm_cgpr_active - get active number of registers in CGPR
52  * @target:	The target task.
53  * @regset:	The user regset structure.
54  *
55  * This function checks for the active number of available
56  * regisers in transaction checkpointed GPR category.
57  */
tm_cgpr_active(struct task_struct * target,const struct user_regset * regset)58 int tm_cgpr_active(struct task_struct *target, const struct user_regset *regset)
59 {
60 	if (!cpu_has_feature(CPU_FTR_TM))
61 		return -ENODEV;
62 
63 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
64 		return 0;
65 
66 	return regset->n;
67 }
68 
69 /**
70  * tm_cgpr_get - get CGPR registers
71  * @target:	The target task.
72  * @regset:	The user regset structure.
73  * @to:		Destination of copy.
74  *
75  * This function gets transaction checkpointed GPR registers.
76  *
77  * When the transaction is active, 'ckpt_regs' holds all the checkpointed
78  * GPR register values for the current transaction to fall back on if it
79  * aborts in between. This function gets those checkpointed GPR registers.
80  * The userspace interface buffer layout is as follows.
81  *
82  * struct data {
83  *	struct pt_regs ckpt_regs;
84  * };
85  */
tm_cgpr_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)86 int tm_cgpr_get(struct task_struct *target, const struct user_regset *regset,
87 		struct membuf to)
88 {
89 	struct membuf to_msr = membuf_at(&to, offsetof(struct pt_regs, msr));
90 #ifdef CONFIG_PPC64
91 	struct membuf to_softe = membuf_at(&to, offsetof(struct pt_regs, softe));
92 #endif
93 
94 	if (!cpu_has_feature(CPU_FTR_TM))
95 		return -ENODEV;
96 
97 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
98 		return -ENODATA;
99 
100 	flush_tmregs_to_thread(target);
101 	flush_fp_to_thread(target);
102 	flush_altivec_to_thread(target);
103 
104 	membuf_write(&to, &target->thread.ckpt_regs, sizeof(struct user_pt_regs));
105 
106 	membuf_store(&to_msr, get_user_ckpt_msr(target));
107 #ifdef CONFIG_PPC64
108 	membuf_store(&to_softe, 0x1ul);
109 #endif
110 	return membuf_zero(&to, ELF_NGREG * sizeof(unsigned long) -
111 			sizeof(struct user_pt_regs));
112 }
113 
114 /*
115  * tm_cgpr_set - set the CGPR registers
116  * @target:	The target task.
117  * @regset:	The user regset structure.
118  * @pos:	The buffer position.
119  * @count:	Number of bytes to copy.
120  * @kbuf:	Kernel buffer to copy into.
121  * @ubuf:	User buffer to copy from.
122  *
123  * This function sets in transaction checkpointed GPR registers.
124  *
125  * When the transaction is active, 'ckpt_regs' holds the checkpointed
126  * GPR register values for the current transaction to fall back on if it
127  * aborts in between. This function sets those checkpointed GPR registers.
128  * The userspace interface buffer layout is as follows.
129  *
130  * struct data {
131  *	struct pt_regs ckpt_regs;
132  * };
133  */
tm_cgpr_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)134 int tm_cgpr_set(struct task_struct *target, const struct user_regset *regset,
135 		unsigned int pos, unsigned int count,
136 		const void *kbuf, const void __user *ubuf)
137 {
138 	unsigned long reg;
139 	int ret;
140 
141 	if (!cpu_has_feature(CPU_FTR_TM))
142 		return -ENODEV;
143 
144 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
145 		return -ENODATA;
146 
147 	flush_tmregs_to_thread(target);
148 	flush_fp_to_thread(target);
149 	flush_altivec_to_thread(target);
150 
151 	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
152 				 &target->thread.ckpt_regs,
153 				 0, PT_MSR * sizeof(reg));
154 
155 	if (!ret && count > 0) {
156 		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg,
157 					 PT_MSR * sizeof(reg),
158 					 (PT_MSR + 1) * sizeof(reg));
159 		if (!ret)
160 			ret = set_user_ckpt_msr(target, reg);
161 	}
162 
163 	BUILD_BUG_ON(offsetof(struct pt_regs, orig_gpr3) !=
164 		     offsetof(struct pt_regs, msr) + sizeof(long));
165 
166 	if (!ret)
167 		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
168 					 &target->thread.ckpt_regs.orig_gpr3,
169 					 PT_ORIG_R3 * sizeof(reg),
170 					 (PT_MAX_PUT_REG + 1) * sizeof(reg));
171 
172 	if (PT_MAX_PUT_REG + 1 < PT_TRAP && !ret)
173 		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
174 					  (PT_MAX_PUT_REG + 1) * sizeof(reg),
175 					  PT_TRAP * sizeof(reg));
176 
177 	if (!ret && count > 0) {
178 		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &reg,
179 					 PT_TRAP * sizeof(reg),
180 					 (PT_TRAP + 1) * sizeof(reg));
181 		if (!ret)
182 			ret = set_user_ckpt_trap(target, reg);
183 	}
184 
185 	if (!ret)
186 		user_regset_copyin_ignore(&pos, &count, &kbuf, &ubuf,
187 					  (PT_TRAP + 1) * sizeof(reg), -1);
188 
189 	return ret;
190 }
191 
192 /**
193  * tm_cfpr_active - get active number of registers in CFPR
194  * @target:	The target task.
195  * @regset:	The user regset structure.
196  *
197  * This function checks for the active number of available
198  * regisers in transaction checkpointed FPR category.
199  */
tm_cfpr_active(struct task_struct * target,const struct user_regset * regset)200 int tm_cfpr_active(struct task_struct *target, const struct user_regset *regset)
201 {
202 	if (!cpu_has_feature(CPU_FTR_TM))
203 		return -ENODEV;
204 
205 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
206 		return 0;
207 
208 	return regset->n;
209 }
210 
211 /**
212  * tm_cfpr_get - get CFPR registers
213  * @target:	The target task.
214  * @regset:	The user regset structure.
215  * @to:		Destination of copy.
216  *
217  * This function gets in transaction checkpointed FPR registers.
218  *
219  * When the transaction is active 'ckfp_state' holds the checkpointed
220  * values for the current transaction to fall back on if it aborts
221  * in between. This function gets those checkpointed FPR registers.
222  * The userspace interface buffer layout is as follows.
223  *
224  * struct data {
225  *	u64	fpr[32];
226  *	u64	fpscr;
227  *};
228  */
tm_cfpr_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)229 int tm_cfpr_get(struct task_struct *target, const struct user_regset *regset,
230 		struct membuf to)
231 {
232 	u64 buf[33];
233 	int i;
234 
235 	if (!cpu_has_feature(CPU_FTR_TM))
236 		return -ENODEV;
237 
238 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
239 		return -ENODATA;
240 
241 	flush_tmregs_to_thread(target);
242 	flush_fp_to_thread(target);
243 	flush_altivec_to_thread(target);
244 
245 	/* copy to local buffer then write that out */
246 	for (i = 0; i < 32 ; i++)
247 		buf[i] = target->thread.TS_CKFPR(i);
248 	buf[32] = target->thread.ckfp_state.fpscr;
249 	return membuf_write(&to, buf, sizeof(buf));
250 }
251 
252 /**
253  * tm_cfpr_set - set CFPR registers
254  * @target:	The target task.
255  * @regset:	The user regset structure.
256  * @pos:	The buffer position.
257  * @count:	Number of bytes to copy.
258  * @kbuf:	Kernel buffer to copy into.
259  * @ubuf:	User buffer to copy from.
260  *
261  * This function sets in transaction checkpointed FPR registers.
262  *
263  * When the transaction is active 'ckfp_state' holds the checkpointed
264  * FPR register values for the current transaction to fall back on
265  * if it aborts in between. This function sets these checkpointed
266  * FPR registers. The userspace interface buffer layout is as follows.
267  *
268  * struct data {
269  *	u64	fpr[32];
270  *	u64	fpscr;
271  *};
272  */
tm_cfpr_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)273 int tm_cfpr_set(struct task_struct *target, const struct user_regset *regset,
274 		unsigned int pos, unsigned int count,
275 		const void *kbuf, const void __user *ubuf)
276 {
277 	u64 buf[33];
278 	int i;
279 
280 	if (!cpu_has_feature(CPU_FTR_TM))
281 		return -ENODEV;
282 
283 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
284 		return -ENODATA;
285 
286 	flush_tmregs_to_thread(target);
287 	flush_fp_to_thread(target);
288 	flush_altivec_to_thread(target);
289 
290 	for (i = 0; i < 32; i++)
291 		buf[i] = target->thread.TS_CKFPR(i);
292 	buf[32] = target->thread.ckfp_state.fpscr;
293 
294 	/* copy to local buffer then write that out */
295 	i = user_regset_copyin(&pos, &count, &kbuf, &ubuf, buf, 0, -1);
296 	if (i)
297 		return i;
298 	for (i = 0; i < 32 ; i++)
299 		target->thread.TS_CKFPR(i) = buf[i];
300 	target->thread.ckfp_state.fpscr = buf[32];
301 	return 0;
302 }
303 
304 /**
305  * tm_cvmx_active - get active number of registers in CVMX
306  * @target:	The target task.
307  * @regset:	The user regset structure.
308  *
309  * This function checks for the active number of available
310  * regisers in checkpointed VMX category.
311  */
tm_cvmx_active(struct task_struct * target,const struct user_regset * regset)312 int tm_cvmx_active(struct task_struct *target, const struct user_regset *regset)
313 {
314 	if (!cpu_has_feature(CPU_FTR_TM))
315 		return -ENODEV;
316 
317 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
318 		return 0;
319 
320 	return regset->n;
321 }
322 
323 /**
324  * tm_cvmx_get - get CMVX registers
325  * @target:	The target task.
326  * @regset:	The user regset structure.
327  * @to:		Destination of copy.
328  *
329  * This function gets in transaction checkpointed VMX registers.
330  *
331  * When the transaction is active 'ckvr_state' and 'ckvrsave' hold
332  * the checkpointed values for the current transaction to fall
333  * back on if it aborts in between. The userspace interface buffer
334  * layout is as follows.
335  *
336  * struct data {
337  *	vector128	vr[32];
338  *	vector128	vscr;
339  *	vector128	vrsave;
340  *};
341  */
tm_cvmx_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)342 int tm_cvmx_get(struct task_struct *target, const struct user_regset *regset,
343 		struct membuf to)
344 {
345 	union {
346 		elf_vrreg_t reg;
347 		u32 word;
348 	} vrsave;
349 	BUILD_BUG_ON(TVSO(vscr) != TVSO(vr[32]));
350 
351 	if (!cpu_has_feature(CPU_FTR_TM))
352 		return -ENODEV;
353 
354 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
355 		return -ENODATA;
356 
357 	/* Flush the state */
358 	flush_tmregs_to_thread(target);
359 	flush_fp_to_thread(target);
360 	flush_altivec_to_thread(target);
361 
362 	membuf_write(&to, &target->thread.ckvr_state, 33 * sizeof(vector128));
363 	/*
364 	 * Copy out only the low-order word of vrsave.
365 	 */
366 	memset(&vrsave, 0, sizeof(vrsave));
367 	vrsave.word = target->thread.ckvrsave;
368 	return membuf_write(&to, &vrsave, sizeof(vrsave));
369 }
370 
371 /**
372  * tm_cvmx_set - set CMVX registers
373  * @target:	The target task.
374  * @regset:	The user regset structure.
375  * @pos:	The buffer position.
376  * @count:	Number of bytes to copy.
377  * @kbuf:	Kernel buffer to copy into.
378  * @ubuf:	User buffer to copy from.
379  *
380  * This function sets in transaction checkpointed VMX registers.
381  *
382  * When the transaction is active 'ckvr_state' and 'ckvrsave' hold
383  * the checkpointed values for the current transaction to fall
384  * back on if it aborts in between. The userspace interface buffer
385  * layout is as follows.
386  *
387  * struct data {
388  *	vector128	vr[32];
389  *	vector128	vscr;
390  *	vector128	vrsave;
391  *};
392  */
tm_cvmx_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)393 int tm_cvmx_set(struct task_struct *target, const struct user_regset *regset,
394 		unsigned int pos, unsigned int count,
395 		const void *kbuf, const void __user *ubuf)
396 {
397 	int ret;
398 
399 	BUILD_BUG_ON(TVSO(vscr) != TVSO(vr[32]));
400 
401 	if (!cpu_has_feature(CPU_FTR_TM))
402 		return -ENODEV;
403 
404 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
405 		return -ENODATA;
406 
407 	flush_tmregs_to_thread(target);
408 	flush_fp_to_thread(target);
409 	flush_altivec_to_thread(target);
410 
411 	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &target->thread.ckvr_state,
412 				 0, 33 * sizeof(vector128));
413 	if (!ret && count > 0) {
414 		/*
415 		 * We use only the low-order word of vrsave.
416 		 */
417 		union {
418 			elf_vrreg_t reg;
419 			u32 word;
420 		} vrsave;
421 		memset(&vrsave, 0, sizeof(vrsave));
422 		vrsave.word = target->thread.ckvrsave;
423 		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &vrsave,
424 					 33 * sizeof(vector128), -1);
425 		if (!ret)
426 			target->thread.ckvrsave = vrsave.word;
427 	}
428 
429 	return ret;
430 }
431 
432 /**
433  * tm_cvsx_active - get active number of registers in CVSX
434  * @target:	The target task.
435  * @regset:	The user regset structure.
436  *
437  * This function checks for the active number of available
438  * regisers in transaction checkpointed VSX category.
439  */
tm_cvsx_active(struct task_struct * target,const struct user_regset * regset)440 int tm_cvsx_active(struct task_struct *target, const struct user_regset *regset)
441 {
442 	if (!cpu_has_feature(CPU_FTR_TM))
443 		return -ENODEV;
444 
445 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
446 		return 0;
447 
448 	flush_vsx_to_thread(target);
449 	return target->thread.used_vsr ? regset->n : 0;
450 }
451 
452 /**
453  * tm_cvsx_get - get CVSX registers
454  * @target:	The target task.
455  * @regset:	The user regset structure.
456  * @to:		Destination of copy.
457  *
458  * This function gets in transaction checkpointed VSX registers.
459  *
460  * When the transaction is active 'ckfp_state' holds the checkpointed
461  * values for the current transaction to fall back on if it aborts
462  * in between. This function gets those checkpointed VSX registers.
463  * The userspace interface buffer layout is as follows.
464  *
465  * struct data {
466  *	u64	vsx[32];
467  *};
468  */
tm_cvsx_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)469 int tm_cvsx_get(struct task_struct *target, const struct user_regset *regset,
470 		struct membuf to)
471 {
472 	u64 buf[32];
473 	int i;
474 
475 	if (!cpu_has_feature(CPU_FTR_TM))
476 		return -ENODEV;
477 
478 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
479 		return -ENODATA;
480 
481 	/* Flush the state */
482 	flush_tmregs_to_thread(target);
483 	flush_fp_to_thread(target);
484 	flush_altivec_to_thread(target);
485 	flush_vsx_to_thread(target);
486 
487 	for (i = 0; i < 32 ; i++)
488 		buf[i] = target->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET];
489 	return membuf_write(&to, buf, 32 * sizeof(double));
490 }
491 
492 /**
493  * tm_cvsx_set - set CFPR registers
494  * @target:	The target task.
495  * @regset:	The user regset structure.
496  * @pos:	The buffer position.
497  * @count:	Number of bytes to copy.
498  * @kbuf:	Kernel buffer to copy into.
499  * @ubuf:	User buffer to copy from.
500  *
501  * This function sets in transaction checkpointed VSX registers.
502  *
503  * When the transaction is active 'ckfp_state' holds the checkpointed
504  * VSX register values for the current transaction to fall back on
505  * if it aborts in between. This function sets these checkpointed
506  * FPR registers. The userspace interface buffer layout is as follows.
507  *
508  * struct data {
509  *	u64	vsx[32];
510  *};
511  */
tm_cvsx_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)512 int tm_cvsx_set(struct task_struct *target, const struct user_regset *regset,
513 		unsigned int pos, unsigned int count,
514 		const void *kbuf, const void __user *ubuf)
515 {
516 	u64 buf[32];
517 	int ret, i;
518 
519 	if (!cpu_has_feature(CPU_FTR_TM))
520 		return -ENODEV;
521 
522 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
523 		return -ENODATA;
524 
525 	/* Flush the state */
526 	flush_tmregs_to_thread(target);
527 	flush_fp_to_thread(target);
528 	flush_altivec_to_thread(target);
529 	flush_vsx_to_thread(target);
530 
531 	for (i = 0; i < 32 ; i++)
532 		buf[i] = target->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET];
533 
534 	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
535 				 buf, 0, 32 * sizeof(double));
536 	if (!ret)
537 		for (i = 0; i < 32 ; i++)
538 			target->thread.ckfp_state.fpr[i][TS_VSRLOWOFFSET] = buf[i];
539 
540 	return ret;
541 }
542 
543 /**
544  * tm_spr_active - get active number of registers in TM SPR
545  * @target:	The target task.
546  * @regset:	The user regset structure.
547  *
548  * This function checks the active number of available
549  * regisers in the transactional memory SPR category.
550  */
tm_spr_active(struct task_struct * target,const struct user_regset * regset)551 int tm_spr_active(struct task_struct *target, const struct user_regset *regset)
552 {
553 	if (!cpu_has_feature(CPU_FTR_TM))
554 		return -ENODEV;
555 
556 	return regset->n;
557 }
558 
559 /**
560  * tm_spr_get - get the TM related SPR registers
561  * @target:	The target task.
562  * @regset:	The user regset structure.
563  * @to:		Destination of copy.
564  *
565  * This function gets transactional memory related SPR registers.
566  * The userspace interface buffer layout is as follows.
567  *
568  * struct {
569  *	u64		tm_tfhar;
570  *	u64		tm_texasr;
571  *	u64		tm_tfiar;
572  * };
573  */
tm_spr_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)574 int tm_spr_get(struct task_struct *target, const struct user_regset *regset,
575 	       struct membuf to)
576 {
577 	/* Build tests */
578 	BUILD_BUG_ON(TSO(tm_tfhar) + sizeof(u64) != TSO(tm_texasr));
579 	BUILD_BUG_ON(TSO(tm_texasr) + sizeof(u64) != TSO(tm_tfiar));
580 	BUILD_BUG_ON(TSO(tm_tfiar) + sizeof(u64) != TSO(ckpt_regs));
581 
582 	if (!cpu_has_feature(CPU_FTR_TM))
583 		return -ENODEV;
584 
585 	/* Flush the states */
586 	flush_tmregs_to_thread(target);
587 	flush_fp_to_thread(target);
588 	flush_altivec_to_thread(target);
589 
590 	/* TFHAR register */
591 	membuf_write(&to, &target->thread.tm_tfhar, sizeof(u64));
592 	/* TEXASR register */
593 	membuf_write(&to, &target->thread.tm_texasr, sizeof(u64));
594 	/* TFIAR register */
595 	return membuf_write(&to, &target->thread.tm_tfiar, sizeof(u64));
596 }
597 
598 /**
599  * tm_spr_set - set the TM related SPR registers
600  * @target:	The target task.
601  * @regset:	The user regset structure.
602  * @pos:	The buffer position.
603  * @count:	Number of bytes to copy.
604  * @kbuf:	Kernel buffer to copy into.
605  * @ubuf:	User buffer to copy from.
606  *
607  * This function sets transactional memory related SPR registers.
608  * The userspace interface buffer layout is as follows.
609  *
610  * struct {
611  *	u64		tm_tfhar;
612  *	u64		tm_texasr;
613  *	u64		tm_tfiar;
614  * };
615  */
tm_spr_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)616 int tm_spr_set(struct task_struct *target, const struct user_regset *regset,
617 	       unsigned int pos, unsigned int count,
618 	       const void *kbuf, const void __user *ubuf)
619 {
620 	int ret;
621 
622 	/* Build tests */
623 	BUILD_BUG_ON(TSO(tm_tfhar) + sizeof(u64) != TSO(tm_texasr));
624 	BUILD_BUG_ON(TSO(tm_texasr) + sizeof(u64) != TSO(tm_tfiar));
625 	BUILD_BUG_ON(TSO(tm_tfiar) + sizeof(u64) != TSO(ckpt_regs));
626 
627 	if (!cpu_has_feature(CPU_FTR_TM))
628 		return -ENODEV;
629 
630 	/* Flush the states */
631 	flush_tmregs_to_thread(target);
632 	flush_fp_to_thread(target);
633 	flush_altivec_to_thread(target);
634 
635 	/* TFHAR register */
636 	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
637 				 &target->thread.tm_tfhar, 0, sizeof(u64));
638 
639 	/* TEXASR register */
640 	if (!ret)
641 		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
642 					 &target->thread.tm_texasr, sizeof(u64),
643 					 2 * sizeof(u64));
644 
645 	/* TFIAR register */
646 	if (!ret)
647 		ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
648 					 &target->thread.tm_tfiar,
649 					 2 * sizeof(u64), 3 * sizeof(u64));
650 	return ret;
651 }
652 
tm_tar_active(struct task_struct * target,const struct user_regset * regset)653 int tm_tar_active(struct task_struct *target, const struct user_regset *regset)
654 {
655 	if (!cpu_has_feature(CPU_FTR_TM))
656 		return -ENODEV;
657 
658 	if (MSR_TM_ACTIVE(target->thread.regs->msr))
659 		return regset->n;
660 
661 	return 0;
662 }
663 
tm_tar_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)664 int tm_tar_get(struct task_struct *target, const struct user_regset *regset,
665 	       struct membuf to)
666 {
667 	if (!cpu_has_feature(CPU_FTR_TM))
668 		return -ENODEV;
669 
670 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
671 		return -ENODATA;
672 
673 	return membuf_write(&to, &target->thread.tm_tar, sizeof(u64));
674 }
675 
tm_tar_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)676 int tm_tar_set(struct task_struct *target, const struct user_regset *regset,
677 	       unsigned int pos, unsigned int count,
678 	       const void *kbuf, const void __user *ubuf)
679 {
680 	int ret;
681 
682 	if (!cpu_has_feature(CPU_FTR_TM))
683 		return -ENODEV;
684 
685 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
686 		return -ENODATA;
687 
688 	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
689 				 &target->thread.tm_tar, 0, sizeof(u64));
690 	return ret;
691 }
692 
tm_ppr_active(struct task_struct * target,const struct user_regset * regset)693 int tm_ppr_active(struct task_struct *target, const struct user_regset *regset)
694 {
695 	if (!cpu_has_feature(CPU_FTR_TM))
696 		return -ENODEV;
697 
698 	if (MSR_TM_ACTIVE(target->thread.regs->msr))
699 		return regset->n;
700 
701 	return 0;
702 }
703 
704 
tm_ppr_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)705 int tm_ppr_get(struct task_struct *target, const struct user_regset *regset,
706 	       struct membuf to)
707 {
708 	if (!cpu_has_feature(CPU_FTR_TM))
709 		return -ENODEV;
710 
711 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
712 		return -ENODATA;
713 
714 	return membuf_write(&to, &target->thread.tm_ppr, sizeof(u64));
715 }
716 
tm_ppr_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)717 int tm_ppr_set(struct task_struct *target, const struct user_regset *regset,
718 	       unsigned int pos, unsigned int count,
719 	       const void *kbuf, const void __user *ubuf)
720 {
721 	int ret;
722 
723 	if (!cpu_has_feature(CPU_FTR_TM))
724 		return -ENODEV;
725 
726 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
727 		return -ENODATA;
728 
729 	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
730 				 &target->thread.tm_ppr, 0, sizeof(u64));
731 	return ret;
732 }
733 
tm_dscr_active(struct task_struct * target,const struct user_regset * regset)734 int tm_dscr_active(struct task_struct *target, const struct user_regset *regset)
735 {
736 	if (!cpu_has_feature(CPU_FTR_TM))
737 		return -ENODEV;
738 
739 	if (MSR_TM_ACTIVE(target->thread.regs->msr))
740 		return regset->n;
741 
742 	return 0;
743 }
744 
tm_dscr_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)745 int tm_dscr_get(struct task_struct *target, const struct user_regset *regset,
746 		struct membuf to)
747 {
748 	if (!cpu_has_feature(CPU_FTR_TM))
749 		return -ENODEV;
750 
751 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
752 		return -ENODATA;
753 
754 	return membuf_write(&to, &target->thread.tm_dscr, sizeof(u64));
755 }
756 
tm_dscr_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)757 int tm_dscr_set(struct task_struct *target, const struct user_regset *regset,
758 		unsigned int pos, unsigned int count,
759 		const void *kbuf, const void __user *ubuf)
760 {
761 	int ret;
762 
763 	if (!cpu_has_feature(CPU_FTR_TM))
764 		return -ENODEV;
765 
766 	if (!MSR_TM_ACTIVE(target->thread.regs->msr))
767 		return -ENODATA;
768 
769 	ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
770 				 &target->thread.tm_dscr, 0, sizeof(u64));
771 	return ret;
772 }
773 
tm_cgpr32_get(struct task_struct * target,const struct user_regset * regset,struct membuf to)774 int tm_cgpr32_get(struct task_struct *target, const struct user_regset *regset,
775 		  struct membuf to)
776 {
777 	gpr32_get_common(target, regset, to,
778 				&target->thread.ckpt_regs.gpr[0]);
779 	return membuf_zero(&to, ELF_NGREG * sizeof(u32));
780 }
781 
tm_cgpr32_set(struct task_struct * target,const struct user_regset * regset,unsigned int pos,unsigned int count,const void * kbuf,const void __user * ubuf)782 int tm_cgpr32_set(struct task_struct *target, const struct user_regset *regset,
783 		  unsigned int pos, unsigned int count,
784 		  const void *kbuf, const void __user *ubuf)
785 {
786 	return gpr32_set_common(target, regset, pos, count, kbuf, ubuf,
787 				&target->thread.ckpt_regs.gpr[0]);
788 }
789