1 // SPDX-License-Identifier: GPL-2.0-or-later
3 #include <linux/regset.h>
5 #include <asm/switch_to.h>
7 #include "ptrace-decl.h"
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.
14 * Userspace interface buffer layout:
21 int fpr_get(struct task_struct
*target
, const struct user_regset
*regset
,
27 flush_fp_to_thread(target
);
29 /* copy to local buffer then write that out */
30 for (i
= 0; i
< 32 ; i
++)
31 buf
[i
] = target
->thread
.TS_FPR(i
);
32 buf
[32] = target
->thread
.fp_state
.fpscr
;
33 return membuf_write(&to
, buf
, 33 * sizeof(u64
));
37 * Regardless of transactions, 'fp_state' holds the current running
38 * value of all FPR registers and 'ckfp_state' holds the last checkpointed
39 * value of all FPR registers for the current transaction.
41 * Userspace interface buffer layout:
49 int fpr_set(struct task_struct
*target
, const struct user_regset
*regset
,
50 unsigned int pos
, unsigned int count
,
51 const void *kbuf
, const void __user
*ubuf
)
56 flush_fp_to_thread(target
);
58 for (i
= 0; i
< 32 ; i
++)
59 buf
[i
] = target
->thread
.TS_FPR(i
);
60 buf
[32] = target
->thread
.fp_state
.fpscr
;
62 /* copy to local buffer then write that out */
63 i
= user_regset_copyin(&pos
, &count
, &kbuf
, &ubuf
, buf
, 0, -1);
67 for (i
= 0; i
< 32 ; i
++)
68 target
->thread
.TS_FPR(i
) = buf
[i
];
69 target
->thread
.fp_state
.fpscr
= buf
[32];
74 * Currently to set and and get all the vsx state, you need to call
75 * the fp and VMX calls as well. This only get/sets the lower 32
76 * 128bit VSX registers.
79 int vsr_active(struct task_struct
*target
, const struct user_regset
*regset
)
81 flush_vsx_to_thread(target
);
82 return target
->thread
.used_vsr
? regset
->n
: 0;
86 * Regardless of transactions, 'fp_state' holds the current running
87 * value of all FPR registers and 'ckfp_state' holds the last
88 * checkpointed value of all FPR registers for the current
91 * Userspace interface buffer layout:
97 int vsr_get(struct task_struct
*target
, const struct user_regset
*regset
,
103 flush_tmregs_to_thread(target
);
104 flush_fp_to_thread(target
);
105 flush_altivec_to_thread(target
);
106 flush_vsx_to_thread(target
);
108 for (i
= 0; i
< 32 ; i
++)
109 buf
[i
] = target
->thread
.fp_state
.fpr
[i
][TS_VSRLOWOFFSET
];
111 return membuf_write(&to
, buf
, 32 * sizeof(double));
115 * Regardless of transactions, 'fp_state' holds the current running
116 * value of all FPR registers and 'ckfp_state' holds the last
117 * checkpointed value of all FPR registers for the current
120 * Userspace interface buffer layout:
126 int vsr_set(struct task_struct
*target
, const struct user_regset
*regset
,
127 unsigned int pos
, unsigned int count
,
128 const void *kbuf
, const void __user
*ubuf
)
133 flush_tmregs_to_thread(target
);
134 flush_fp_to_thread(target
);
135 flush_altivec_to_thread(target
);
136 flush_vsx_to_thread(target
);
138 for (i
= 0; i
< 32 ; i
++)
139 buf
[i
] = target
->thread
.fp_state
.fpr
[i
][TS_VSRLOWOFFSET
];
141 ret
= user_regset_copyin(&pos
, &count
, &kbuf
, &ubuf
,
142 buf
, 0, 32 * sizeof(double));
144 for (i
= 0; i
< 32 ; i
++)
145 target
->thread
.fp_state
.fpr
[i
][TS_VSRLOWOFFSET
] = buf
[i
];