1 // SPDX-License-Identifier: GPL-2.0-or-later
2 
3 #include <linux/regset.h>
4 
5 #include <asm/switch_to.h>
6 
7 #include "ptrace-decl.h"
8 
9 /*
10  * Regardless of transactions, 'fp_state' holds the current running
11  * value of all FPR registers and 'ckfp_state' holds the last checkpointed
12  * value of all FPR registers for the current transaction.
13  *
14  * Userspace interface buffer layout:
15  *
16  * struct data {
17  *	u64	fpr[32];
18  *	u64	fpscr;
19  * };
20  */
21 int fpr_get(struct task_struct *target, const struct user_regset *regset,
22 	    struct membuf to)
23 {
24 	BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
25 		     offsetof(struct thread_fp_state, fpr[32]));
26 
27 	flush_fp_to_thread(target);
28 
29 	return membuf_write(&to, &target->thread.fp_state, 33 * sizeof(u64));
30 }
31 
32 /*
33  * Regardless of transactions, 'fp_state' holds the current running
34  * value of all FPR registers and 'ckfp_state' holds the last checkpointed
35  * value of all FPR registers for the current transaction.
36  *
37  * Userspace interface buffer layout:
38  *
39  * struct data {
40  *	u64	fpr[32];
41  *	u64	fpscr;
42  * };
43  *
44  */
45 int fpr_set(struct task_struct *target, const struct user_regset *regset,
46 	    unsigned int pos, unsigned int count,
47 	    const void *kbuf, const void __user *ubuf)
48 {
49 	BUILD_BUG_ON(offsetof(struct thread_fp_state, fpscr) !=
50 		     offsetof(struct thread_fp_state, fpr[32]));
51 
52 	flush_fp_to_thread(target);
53 
54 	return user_regset_copyin(&pos, &count, &kbuf, &ubuf,
55 				  &target->thread.fp_state, 0, -1);
56 }
57