1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 /*
4  * Set of msr bits that gdb can change on behalf of a process.
5  */
6 #ifdef CONFIG_PPC_ADV_DEBUG_REGS
7 #define MSR_DEBUGCHANGE	0
8 #else
9 #define MSR_DEBUGCHANGE	(MSR_SE | MSR_BE)
10 #endif
11 
12 /*
13  * Max register writeable via put_reg
14  */
15 #ifdef CONFIG_PPC32
16 #define PT_MAX_PUT_REG	PT_MQ
17 #else
18 #define PT_MAX_PUT_REG	PT_CCR
19 #endif
20 
21 #define TVSO(f)	(offsetof(struct thread_vr_state, f))
22 #define TFSO(f)	(offsetof(struct thread_fp_state, f))
23 #define TSO(f)	(offsetof(struct thread_struct, f))
24 
25 /*
26  * These are our native regset flavors.
27  */
28 enum powerpc_regset {
29 	REGSET_GPR,
30 	REGSET_FPR,
31 #ifdef CONFIG_ALTIVEC
32 	REGSET_VMX,
33 #endif
34 #ifdef CONFIG_VSX
35 	REGSET_VSX,
36 #endif
37 #ifdef CONFIG_SPE
38 	REGSET_SPE,
39 #endif
40 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
41 	REGSET_TM_CGPR,		/* TM checkpointed GPR registers */
42 	REGSET_TM_CFPR,		/* TM checkpointed FPR registers */
43 	REGSET_TM_CVMX,		/* TM checkpointed VMX registers */
44 	REGSET_TM_CVSX,		/* TM checkpointed VSX registers */
45 	REGSET_TM_SPR,		/* TM specific SPR registers */
46 	REGSET_TM_CTAR,		/* TM checkpointed TAR register */
47 	REGSET_TM_CPPR,		/* TM checkpointed PPR register */
48 	REGSET_TM_CDSCR,	/* TM checkpointed DSCR register */
49 #endif
50 #ifdef CONFIG_PPC64
51 	REGSET_PPR,		/* PPR register */
52 	REGSET_DSCR,		/* DSCR register */
53 #endif
54 #ifdef CONFIG_PPC_BOOK3S_64
55 	REGSET_TAR,		/* TAR register */
56 	REGSET_EBB,		/* EBB registers */
57 	REGSET_PMR,		/* Performance Monitor Registers */
58 #endif
59 #ifdef CONFIG_PPC_MEM_KEYS
60 	REGSET_PKEY,		/* AMR register */
61 #endif
62 };
63 
64 /* ptrace-(no)vsx */
65 
66 int fpr_get(struct task_struct *target, const struct user_regset *regset,
67 	    unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
68 int fpr_set(struct task_struct *target, const struct user_regset *regset,
69 	    unsigned int pos, unsigned int count,
70 	    const void *kbuf, const void __user *ubuf);
71 
72 /* ptrace-vsx */
73 
74 int vsr_active(struct task_struct *target, const struct user_regset *regset);
75 int vsr_get(struct task_struct *target, const struct user_regset *regset,
76 	    unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
77 int vsr_set(struct task_struct *target, const struct user_regset *regset,
78 	    unsigned int pos, unsigned int count,
79 	    const void *kbuf, const void __user *ubuf);
80 
81 /* ptrace-altivec */
82 
83 int vr_active(struct task_struct *target, const struct user_regset *regset);
84 int vr_get(struct task_struct *target, const struct user_regset *regset,
85 	   unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
86 int vr_set(struct task_struct *target, const struct user_regset *regset,
87 	   unsigned int pos, unsigned int count,
88 	   const void *kbuf, const void __user *ubuf);
89 
90 /* ptrace-spe */
91 
92 int evr_active(struct task_struct *target, const struct user_regset *regset);
93 int evr_get(struct task_struct *target, const struct user_regset *regset,
94 	    unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
95 int evr_set(struct task_struct *target, const struct user_regset *regset,
96 	    unsigned int pos, unsigned int count,
97 	    const void *kbuf, const void __user *ubuf);
98 
99 /* ptrace */
100 
101 int gpr32_get_common(struct task_struct *target,
102 		     const struct user_regset *regset,
103 		     unsigned int pos, unsigned int count,
104 			    void *kbuf, void __user *ubuf,
105 			    unsigned long *regs);
106 int gpr32_set_common(struct task_struct *target,
107 		     const struct user_regset *regset,
108 		     unsigned int pos, unsigned int count,
109 		     const void *kbuf, const void __user *ubuf,
110 		     unsigned long *regs);
111 
112 /* ptrace-tm */
113 
114 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
115 void flush_tmregs_to_thread(struct task_struct *tsk);
116 #else
117 static inline void flush_tmregs_to_thread(struct task_struct *tsk) { }
118 #endif
119 
120 int tm_cgpr_active(struct task_struct *target, const struct user_regset *regset);
121 int tm_cgpr_get(struct task_struct *target, const struct user_regset *regset,
122 		unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
123 int tm_cgpr_set(struct task_struct *target, const struct user_regset *regset,
124 		unsigned int pos, unsigned int count,
125 		const void *kbuf, const void __user *ubuf);
126 int tm_cfpr_active(struct task_struct *target, const struct user_regset *regset);
127 int tm_cfpr_get(struct task_struct *target, const struct user_regset *regset,
128 		unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
129 int tm_cfpr_set(struct task_struct *target, const struct user_regset *regset,
130 		unsigned int pos, unsigned int count,
131 		const void *kbuf, const void __user *ubuf);
132 int tm_cvmx_active(struct task_struct *target, const struct user_regset *regset);
133 int tm_cvmx_get(struct task_struct *target, const struct user_regset *regset,
134 		unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
135 int tm_cvmx_set(struct task_struct *target, const struct user_regset *regset,
136 		unsigned int pos, unsigned int count,
137 		const void *kbuf, const void __user *ubuf);
138 int tm_cvsx_active(struct task_struct *target, const struct user_regset *regset);
139 int tm_cvsx_get(struct task_struct *target, const struct user_regset *regset,
140 		unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
141 int tm_cvsx_set(struct task_struct *target, const struct user_regset *regset,
142 		unsigned int pos, unsigned int count,
143 		const void *kbuf, const void __user *ubuf);
144 int tm_spr_active(struct task_struct *target, const struct user_regset *regset);
145 int tm_spr_get(struct task_struct *target, const struct user_regset *regset,
146 	       unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
147 int tm_spr_set(struct task_struct *target, const struct user_regset *regset,
148 	       unsigned int pos, unsigned int count,
149 	       const void *kbuf, const void __user *ubuf);
150 int tm_tar_active(struct task_struct *target, const struct user_regset *regset);
151 int tm_tar_get(struct task_struct *target, const struct user_regset *regset,
152 	       unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
153 int tm_tar_set(struct task_struct *target, const struct user_regset *regset,
154 	       unsigned int pos, unsigned int count,
155 	       const void *kbuf, const void __user *ubuf);
156 int tm_ppr_active(struct task_struct *target, const struct user_regset *regset);
157 int tm_ppr_get(struct task_struct *target, const struct user_regset *regset,
158 	       unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
159 int tm_ppr_set(struct task_struct *target, const struct user_regset *regset,
160 	       unsigned int pos, unsigned int count,
161 	       const void *kbuf, const void __user *ubuf);
162 int tm_dscr_active(struct task_struct *target, const struct user_regset *regset);
163 int tm_dscr_get(struct task_struct *target, const struct user_regset *regset,
164 		unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
165 int tm_dscr_set(struct task_struct *target, const struct user_regset *regset,
166 		unsigned int pos, unsigned int count,
167 		const void *kbuf, const void __user *ubuf);
168 int tm_cgpr32_get(struct task_struct *target, const struct user_regset *regset,
169 		  unsigned int pos, unsigned int count, void *kbuf, void __user *ubuf);
170 int tm_cgpr32_set(struct task_struct *target, const struct user_regset *regset,
171 		  unsigned int pos, unsigned int count,
172 		  const void *kbuf, const void __user *ubuf);
173 
174 /* ptrace-view */
175 
176 extern const struct user_regset_view user_ppc_native_view;
177 
178 /* ptrace-(no)adv */
179 void ppc_gethwdinfo(struct ppc_debug_info *dbginfo);
180 int ptrace_get_debugreg(struct task_struct *child, unsigned long addr,
181 			unsigned long __user *datalp);
182 int ptrace_set_debugreg(struct task_struct *task, unsigned long addr, unsigned long data);
183 long ppc_set_hwdebug(struct task_struct *child, struct ppc_hw_breakpoint *bp_info);
184 long ppc_del_hwdebug(struct task_struct *child, long data);
185