1 // SPDX-License-Identifier: GPL-2.0-or-later 1 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' hold 11 * value of all FPR registers and 'ckfp_state' 12 * value of all FPR registers for the current 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 22 struct membuf to) 23 { 24 u64 buf[33]; 25 int i; 26 27 flush_fp_to_thread(target); 28 29 /* copy to local buffer then write tha 30 for (i = 0; i < 32 ; i++) 31 buf[i] = target->thread.TS_FPR 32 buf[32] = target->thread.fp_state.fpsc 33 return membuf_write(&to, buf, 33 * siz 34 } 35 36 /* 37 * Regardless of transactions, 'fp_state' hold 38 * value of all FPR registers and 'ckfp_state' 39 * value of all FPR registers for the current 40 * 41 * Userspace interface buffer layout: 42 * 43 * struct data { 44 * u64 fpr[32]; 45 * u64 fpscr; 46 * }; 47 * 48 */ 49 int fpr_set(struct task_struct *target, const 50 unsigned int pos, unsigned int cou 51 const void *kbuf, const void __use 52 { 53 u64 buf[33]; 54 int i; 55 56 flush_fp_to_thread(target); 57 58 for (i = 0; i < 32 ; i++) 59 buf[i] = target->thread.TS_FPR 60 buf[32] = target->thread.fp_state.fpsc 61 62 /* copy to local buffer then write tha 63 i = user_regset_copyin(&pos, &count, & 64 if (i) 65 return i; 66 67 for (i = 0; i < 32 ; i++) 68 target->thread.TS_FPR(i) = buf 69 target->thread.fp_state.fpscr = buf[32 70 return 0; 71 } 72 73 /* 74 * Currently to set and get all the vsx state, 75 * the fp and VMX calls as well. This only ge 76 * 128bit VSX registers. 77 */ 78 79 int vsr_active(struct task_struct *target, con 80 { 81 flush_vsx_to_thread(target); 82 return target->thread.used_vsr ? regse 83 } 84 85 /* 86 * Regardless of transactions, 'fp_state' hold 87 * value of all FPR registers and 'ckfp_state' 88 * checkpointed value of all FPR registers for 89 * transaction. 90 * 91 * Userspace interface buffer layout: 92 * 93 * struct data { 94 * u64 vsx[32]; 95 * }; 96 */ 97 int vsr_get(struct task_struct *target, const 98 struct membuf to) 99 { 100 u64 buf[32]; 101 int i; 102 103 flush_tmregs_to_thread(target); 104 flush_fp_to_thread(target); 105 flush_altivec_to_thread(target); 106 flush_vsx_to_thread(target); 107 108 for (i = 0; i < 32 ; i++) 109 buf[i] = target->thread.fp_sta 110 111 return membuf_write(&to, buf, 32 * siz 112 } 113 114 /* 115 * Regardless of transactions, 'fp_state' hold 116 * value of all FPR registers and 'ckfp_state' 117 * checkpointed value of all FPR registers for 118 * transaction. 119 * 120 * Userspace interface buffer layout: 121 * 122 * struct data { 123 * u64 vsx[32]; 124 * }; 125 */ 126 int vsr_set(struct task_struct *target, const 127 unsigned int pos, unsigned int cou 128 const void *kbuf, const void __use 129 { 130 u64 buf[32]; 131 int ret, i; 132 133 flush_tmregs_to_thread(target); 134 flush_fp_to_thread(target); 135 flush_altivec_to_thread(target); 136 flush_vsx_to_thread(target); 137 138 for (i = 0; i < 32 ; i++) 139 buf[i] = target->thread.fp_sta 140 141 ret = user_regset_copyin(&pos, &count, 142 buf, 0, 32 * 143 if (!ret) 144 for (i = 0; i < 32 ; i++) 145 target->thread.fp_stat 146 147 return ret; 148 } 149
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.