xref: /OK3568_Linux_fs/kernel/arch/sparc/include/uapi/asm/ptrace.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
2*4882a593Smuzhiyun #ifndef _UAPI__SPARC_PTRACE_H
3*4882a593Smuzhiyun #define _UAPI__SPARC_PTRACE_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #if defined(__sparc__) && defined(__arch64__)
6*4882a593Smuzhiyun /* 64 bit sparc */
7*4882a593Smuzhiyun #include <asm/pstate.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun /* This struct defines the way the registers are stored on the
10*4882a593Smuzhiyun  * stack during a system call and basically all traps.
11*4882a593Smuzhiyun  */
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun /* This magic value must have the low 9 bits clear,
14*4882a593Smuzhiyun  * as that is where we encode the %tt value, see below.
15*4882a593Smuzhiyun  */
16*4882a593Smuzhiyun #define PT_REGS_MAGIC 0x57ac6c00
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun #ifndef __ASSEMBLY__
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #include <linux/types.h>
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun struct pt_regs {
23*4882a593Smuzhiyun 	unsigned long u_regs[16]; /* globals and ins */
24*4882a593Smuzhiyun 	unsigned long tstate;
25*4882a593Smuzhiyun 	unsigned long tpc;
26*4882a593Smuzhiyun 	unsigned long tnpc;
27*4882a593Smuzhiyun 	unsigned int y;
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	/* We encode a magic number, PT_REGS_MAGIC, along
30*4882a593Smuzhiyun 	 * with the %tt (trap type) register value at trap
31*4882a593Smuzhiyun 	 * entry time.  The magic number allows us to identify
32*4882a593Smuzhiyun 	 * accurately a trap stack frame in the stack
33*4882a593Smuzhiyun 	 * unwinder, and the %tt value allows us to test
34*4882a593Smuzhiyun 	 * things like "in a system call" etc. for an arbitray
35*4882a593Smuzhiyun 	 * process.
36*4882a593Smuzhiyun 	 *
37*4882a593Smuzhiyun 	 * The PT_REGS_MAGIC is chosen such that it can be
38*4882a593Smuzhiyun 	 * loaded completely using just a sethi instruction.
39*4882a593Smuzhiyun 	 */
40*4882a593Smuzhiyun 	unsigned int magic;
41*4882a593Smuzhiyun };
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun struct pt_regs32 {
44*4882a593Smuzhiyun 	unsigned int psr;
45*4882a593Smuzhiyun 	unsigned int pc;
46*4882a593Smuzhiyun 	unsigned int npc;
47*4882a593Smuzhiyun 	unsigned int y;
48*4882a593Smuzhiyun 	unsigned int u_regs[16]; /* globals and ins */
49*4882a593Smuzhiyun };
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun /* A V9 register window */
52*4882a593Smuzhiyun struct reg_window {
53*4882a593Smuzhiyun 	unsigned long locals[8];
54*4882a593Smuzhiyun 	unsigned long ins[8];
55*4882a593Smuzhiyun };
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun /* A 32-bit register window. */
58*4882a593Smuzhiyun struct reg_window32 {
59*4882a593Smuzhiyun 	unsigned int locals[8];
60*4882a593Smuzhiyun 	unsigned int ins[8];
61*4882a593Smuzhiyun };
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun /* A V9 Sparc stack frame */
64*4882a593Smuzhiyun struct sparc_stackf {
65*4882a593Smuzhiyun 	unsigned long locals[8];
66*4882a593Smuzhiyun         unsigned long ins[6];
67*4882a593Smuzhiyun 	struct sparc_stackf *fp;
68*4882a593Smuzhiyun 	unsigned long callers_pc;
69*4882a593Smuzhiyun 	char *structptr;
70*4882a593Smuzhiyun 	unsigned long xargs[6];
71*4882a593Smuzhiyun 	unsigned long xxargs[1];
72*4882a593Smuzhiyun };
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun /* A 32-bit Sparc stack frame */
75*4882a593Smuzhiyun struct sparc_stackf32 {
76*4882a593Smuzhiyun 	unsigned int locals[8];
77*4882a593Smuzhiyun         unsigned int ins[6];
78*4882a593Smuzhiyun 	unsigned int fp;
79*4882a593Smuzhiyun 	unsigned int callers_pc;
80*4882a593Smuzhiyun 	unsigned int structptr;
81*4882a593Smuzhiyun 	unsigned int xargs[6];
82*4882a593Smuzhiyun 	unsigned int xxargs[1];
83*4882a593Smuzhiyun };
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun struct sparc_trapf {
86*4882a593Smuzhiyun 	unsigned long locals[8];
87*4882a593Smuzhiyun 	unsigned long ins[8];
88*4882a593Smuzhiyun 	unsigned long _unused;
89*4882a593Smuzhiyun 	struct pt_regs *regs;
90*4882a593Smuzhiyun };
91*4882a593Smuzhiyun #endif /* (!__ASSEMBLY__) */
92*4882a593Smuzhiyun #else
93*4882a593Smuzhiyun /* 32 bit sparc */
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #include <asm/psr.h>
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun /* This struct defines the way the registers are stored on the
98*4882a593Smuzhiyun  * stack during a system call and basically all traps.
99*4882a593Smuzhiyun  */
100*4882a593Smuzhiyun #ifndef __ASSEMBLY__
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun #include <linux/types.h>
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun struct pt_regs {
105*4882a593Smuzhiyun 	unsigned long psr;
106*4882a593Smuzhiyun 	unsigned long pc;
107*4882a593Smuzhiyun 	unsigned long npc;
108*4882a593Smuzhiyun 	unsigned long y;
109*4882a593Smuzhiyun 	unsigned long u_regs[16]; /* globals and ins */
110*4882a593Smuzhiyun };
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun /* A 32-bit register window. */
113*4882a593Smuzhiyun struct reg_window32 {
114*4882a593Smuzhiyun 	unsigned long locals[8];
115*4882a593Smuzhiyun 	unsigned long ins[8];
116*4882a593Smuzhiyun };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun /* A Sparc stack frame */
119*4882a593Smuzhiyun struct sparc_stackf {
120*4882a593Smuzhiyun 	unsigned long locals[8];
121*4882a593Smuzhiyun         unsigned long ins[6];
122*4882a593Smuzhiyun 	struct sparc_stackf *fp;
123*4882a593Smuzhiyun 	unsigned long callers_pc;
124*4882a593Smuzhiyun 	char *structptr;
125*4882a593Smuzhiyun 	unsigned long xargs[6];
126*4882a593Smuzhiyun 	unsigned long xxargs[1];
127*4882a593Smuzhiyun };
128*4882a593Smuzhiyun #endif /* (!__ASSEMBLY__) */
129*4882a593Smuzhiyun 
130*4882a593Smuzhiyun #endif /* (defined(__sparc__) && defined(__arch64__))*/
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun #ifndef __ASSEMBLY__
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun #define TRACEREG_SZ	sizeof(struct pt_regs)
135*4882a593Smuzhiyun #define STACKFRAME_SZ	sizeof(struct sparc_stackf)
136*4882a593Smuzhiyun 
137*4882a593Smuzhiyun #define TRACEREG32_SZ	sizeof(struct pt_regs32)
138*4882a593Smuzhiyun #define STACKFRAME32_SZ	sizeof(struct sparc_stackf32)
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun #endif /* (!__ASSEMBLY__) */
141*4882a593Smuzhiyun 
142*4882a593Smuzhiyun #define UREG_G0        0
143*4882a593Smuzhiyun #define UREG_G1        1
144*4882a593Smuzhiyun #define UREG_G2        2
145*4882a593Smuzhiyun #define UREG_G3        3
146*4882a593Smuzhiyun #define UREG_G4        4
147*4882a593Smuzhiyun #define UREG_G5        5
148*4882a593Smuzhiyun #define UREG_G6        6
149*4882a593Smuzhiyun #define UREG_G7        7
150*4882a593Smuzhiyun #define UREG_I0        8
151*4882a593Smuzhiyun #define UREG_I1        9
152*4882a593Smuzhiyun #define UREG_I2        10
153*4882a593Smuzhiyun #define UREG_I3        11
154*4882a593Smuzhiyun #define UREG_I4        12
155*4882a593Smuzhiyun #define UREG_I5        13
156*4882a593Smuzhiyun #define UREG_I6        14
157*4882a593Smuzhiyun #define UREG_I7        15
158*4882a593Smuzhiyun #define UREG_FP        UREG_I6
159*4882a593Smuzhiyun #define UREG_RETPC     UREG_I7
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun #if defined(__sparc__) && defined(__arch64__)
162*4882a593Smuzhiyun /* 64 bit sparc */
163*4882a593Smuzhiyun 
164*4882a593Smuzhiyun #ifndef __ASSEMBLY__
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 
167*4882a593Smuzhiyun #else /* __ASSEMBLY__ */
168*4882a593Smuzhiyun /* For assembly code. */
169*4882a593Smuzhiyun #define TRACEREG_SZ		0xa0
170*4882a593Smuzhiyun #define STACKFRAME_SZ		0xc0
171*4882a593Smuzhiyun 
172*4882a593Smuzhiyun #define TRACEREG32_SZ		0x50
173*4882a593Smuzhiyun #define STACKFRAME32_SZ		0x60
174*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun #else /* (defined(__sparc__) && defined(__arch64__)) */
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun /* 32 bit sparc */
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun #ifndef __ASSEMBLY__
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun #else /* (!__ASSEMBLY__) */
184*4882a593Smuzhiyun /* For assembly code. */
185*4882a593Smuzhiyun #define TRACEREG_SZ       0x50
186*4882a593Smuzhiyun #define STACKFRAME_SZ     0x60
187*4882a593Smuzhiyun #endif /* (!__ASSEMBLY__) */
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun #endif /* (defined(__sparc__) && defined(__arch64__)) */
190*4882a593Smuzhiyun 
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun /* These are for pt_regs. */
193*4882a593Smuzhiyun #define PT_V9_G0     0x00
194*4882a593Smuzhiyun #define PT_V9_G1     0x08
195*4882a593Smuzhiyun #define PT_V9_G2     0x10
196*4882a593Smuzhiyun #define PT_V9_G3     0x18
197*4882a593Smuzhiyun #define PT_V9_G4     0x20
198*4882a593Smuzhiyun #define PT_V9_G5     0x28
199*4882a593Smuzhiyun #define PT_V9_G6     0x30
200*4882a593Smuzhiyun #define PT_V9_G7     0x38
201*4882a593Smuzhiyun #define PT_V9_I0     0x40
202*4882a593Smuzhiyun #define PT_V9_I1     0x48
203*4882a593Smuzhiyun #define PT_V9_I2     0x50
204*4882a593Smuzhiyun #define PT_V9_I3     0x58
205*4882a593Smuzhiyun #define PT_V9_I4     0x60
206*4882a593Smuzhiyun #define PT_V9_I5     0x68
207*4882a593Smuzhiyun #define PT_V9_I6     0x70
208*4882a593Smuzhiyun #define PT_V9_FP     PT_V9_I6
209*4882a593Smuzhiyun #define PT_V9_I7     0x78
210*4882a593Smuzhiyun #define PT_V9_TSTATE 0x80
211*4882a593Smuzhiyun #define PT_V9_TPC    0x88
212*4882a593Smuzhiyun #define PT_V9_TNPC   0x90
213*4882a593Smuzhiyun #define PT_V9_Y      0x98
214*4882a593Smuzhiyun #define PT_V9_MAGIC  0x9c
215*4882a593Smuzhiyun #define PT_TSTATE	PT_V9_TSTATE
216*4882a593Smuzhiyun #define PT_TPC		PT_V9_TPC
217*4882a593Smuzhiyun #define PT_TNPC		PT_V9_TNPC
218*4882a593Smuzhiyun 
219*4882a593Smuzhiyun /* These for pt_regs32. */
220*4882a593Smuzhiyun #define PT_PSR    0x0
221*4882a593Smuzhiyun #define PT_PC     0x4
222*4882a593Smuzhiyun #define PT_NPC    0x8
223*4882a593Smuzhiyun #define PT_Y      0xc
224*4882a593Smuzhiyun #define PT_G0     0x10
225*4882a593Smuzhiyun #define PT_WIM    PT_G0
226*4882a593Smuzhiyun #define PT_G1     0x14
227*4882a593Smuzhiyun #define PT_G2     0x18
228*4882a593Smuzhiyun #define PT_G3     0x1c
229*4882a593Smuzhiyun #define PT_G4     0x20
230*4882a593Smuzhiyun #define PT_G5     0x24
231*4882a593Smuzhiyun #define PT_G6     0x28
232*4882a593Smuzhiyun #define PT_G7     0x2c
233*4882a593Smuzhiyun #define PT_I0     0x30
234*4882a593Smuzhiyun #define PT_I1     0x34
235*4882a593Smuzhiyun #define PT_I2     0x38
236*4882a593Smuzhiyun #define PT_I3     0x3c
237*4882a593Smuzhiyun #define PT_I4     0x40
238*4882a593Smuzhiyun #define PT_I5     0x44
239*4882a593Smuzhiyun #define PT_I6     0x48
240*4882a593Smuzhiyun #define PT_FP     PT_I6
241*4882a593Smuzhiyun #define PT_I7     0x4c
242*4882a593Smuzhiyun 
243*4882a593Smuzhiyun /* Reg_window offsets */
244*4882a593Smuzhiyun #define RW_V9_L0     0x00
245*4882a593Smuzhiyun #define RW_V9_L1     0x08
246*4882a593Smuzhiyun #define RW_V9_L2     0x10
247*4882a593Smuzhiyun #define RW_V9_L3     0x18
248*4882a593Smuzhiyun #define RW_V9_L4     0x20
249*4882a593Smuzhiyun #define RW_V9_L5     0x28
250*4882a593Smuzhiyun #define RW_V9_L6     0x30
251*4882a593Smuzhiyun #define RW_V9_L7     0x38
252*4882a593Smuzhiyun #define RW_V9_I0     0x40
253*4882a593Smuzhiyun #define RW_V9_I1     0x48
254*4882a593Smuzhiyun #define RW_V9_I2     0x50
255*4882a593Smuzhiyun #define RW_V9_I3     0x58
256*4882a593Smuzhiyun #define RW_V9_I4     0x60
257*4882a593Smuzhiyun #define RW_V9_I5     0x68
258*4882a593Smuzhiyun #define RW_V9_I6     0x70
259*4882a593Smuzhiyun #define RW_V9_I7     0x78
260*4882a593Smuzhiyun 
261*4882a593Smuzhiyun #define RW_L0     0x00
262*4882a593Smuzhiyun #define RW_L1     0x04
263*4882a593Smuzhiyun #define RW_L2     0x08
264*4882a593Smuzhiyun #define RW_L3     0x0c
265*4882a593Smuzhiyun #define RW_L4     0x10
266*4882a593Smuzhiyun #define RW_L5     0x14
267*4882a593Smuzhiyun #define RW_L6     0x18
268*4882a593Smuzhiyun #define RW_L7     0x1c
269*4882a593Smuzhiyun #define RW_I0     0x20
270*4882a593Smuzhiyun #define RW_I1     0x24
271*4882a593Smuzhiyun #define RW_I2     0x28
272*4882a593Smuzhiyun #define RW_I3     0x2c
273*4882a593Smuzhiyun #define RW_I4     0x30
274*4882a593Smuzhiyun #define RW_I5     0x34
275*4882a593Smuzhiyun #define RW_I6     0x38
276*4882a593Smuzhiyun #define RW_I7     0x3c
277*4882a593Smuzhiyun 
278*4882a593Smuzhiyun /* Stack_frame offsets */
279*4882a593Smuzhiyun #define SF_V9_L0     0x00
280*4882a593Smuzhiyun #define SF_V9_L1     0x08
281*4882a593Smuzhiyun #define SF_V9_L2     0x10
282*4882a593Smuzhiyun #define SF_V9_L3     0x18
283*4882a593Smuzhiyun #define SF_V9_L4     0x20
284*4882a593Smuzhiyun #define SF_V9_L5     0x28
285*4882a593Smuzhiyun #define SF_V9_L6     0x30
286*4882a593Smuzhiyun #define SF_V9_L7     0x38
287*4882a593Smuzhiyun #define SF_V9_I0     0x40
288*4882a593Smuzhiyun #define SF_V9_I1     0x48
289*4882a593Smuzhiyun #define SF_V9_I2     0x50
290*4882a593Smuzhiyun #define SF_V9_I3     0x58
291*4882a593Smuzhiyun #define SF_V9_I4     0x60
292*4882a593Smuzhiyun #define SF_V9_I5     0x68
293*4882a593Smuzhiyun #define SF_V9_FP     0x70
294*4882a593Smuzhiyun #define SF_V9_PC     0x78
295*4882a593Smuzhiyun #define SF_V9_RETP   0x80
296*4882a593Smuzhiyun #define SF_V9_XARG0  0x88
297*4882a593Smuzhiyun #define SF_V9_XARG1  0x90
298*4882a593Smuzhiyun #define SF_V9_XARG2  0x98
299*4882a593Smuzhiyun #define SF_V9_XARG3  0xa0
300*4882a593Smuzhiyun #define SF_V9_XARG4  0xa8
301*4882a593Smuzhiyun #define SF_V9_XARG5  0xb0
302*4882a593Smuzhiyun #define SF_V9_XXARG  0xb8
303*4882a593Smuzhiyun 
304*4882a593Smuzhiyun #define SF_L0     0x00
305*4882a593Smuzhiyun #define SF_L1     0x04
306*4882a593Smuzhiyun #define SF_L2     0x08
307*4882a593Smuzhiyun #define SF_L3     0x0c
308*4882a593Smuzhiyun #define SF_L4     0x10
309*4882a593Smuzhiyun #define SF_L5     0x14
310*4882a593Smuzhiyun #define SF_L6     0x18
311*4882a593Smuzhiyun #define SF_L7     0x1c
312*4882a593Smuzhiyun #define SF_I0     0x20
313*4882a593Smuzhiyun #define SF_I1     0x24
314*4882a593Smuzhiyun #define SF_I2     0x28
315*4882a593Smuzhiyun #define SF_I3     0x2c
316*4882a593Smuzhiyun #define SF_I4     0x30
317*4882a593Smuzhiyun #define SF_I5     0x34
318*4882a593Smuzhiyun #define SF_FP     0x38
319*4882a593Smuzhiyun #define SF_PC     0x3c
320*4882a593Smuzhiyun #define SF_RETP   0x40
321*4882a593Smuzhiyun #define SF_XARG0  0x44
322*4882a593Smuzhiyun #define SF_XARG1  0x48
323*4882a593Smuzhiyun #define SF_XARG2  0x4c
324*4882a593Smuzhiyun #define SF_XARG3  0x50
325*4882a593Smuzhiyun #define SF_XARG4  0x54
326*4882a593Smuzhiyun #define SF_XARG5  0x58
327*4882a593Smuzhiyun #define SF_XXARG  0x5c
328*4882a593Smuzhiyun 
329*4882a593Smuzhiyun 
330*4882a593Smuzhiyun /* Stuff for the ptrace system call */
331*4882a593Smuzhiyun #define PTRACE_SPARC_DETACH       11
332*4882a593Smuzhiyun #define PTRACE_GETREGS            12
333*4882a593Smuzhiyun #define PTRACE_SETREGS            13
334*4882a593Smuzhiyun #define PTRACE_GETFPREGS          14
335*4882a593Smuzhiyun #define PTRACE_SETFPREGS          15
336*4882a593Smuzhiyun #define PTRACE_READDATA           16
337*4882a593Smuzhiyun #define PTRACE_WRITEDATA          17
338*4882a593Smuzhiyun #define PTRACE_READTEXT           18
339*4882a593Smuzhiyun #define PTRACE_WRITETEXT          19
340*4882a593Smuzhiyun #define PTRACE_GETFPAREGS         20
341*4882a593Smuzhiyun #define PTRACE_SETFPAREGS         21
342*4882a593Smuzhiyun 
343*4882a593Smuzhiyun /* There are for debugging 64-bit processes, either from a 32 or 64 bit
344*4882a593Smuzhiyun  * parent.  Thus their complements are for debugging 32-bit processes only.
345*4882a593Smuzhiyun  */
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun #define PTRACE_GETREGS64	  22
348*4882a593Smuzhiyun #define PTRACE_SETREGS64	  23
349*4882a593Smuzhiyun /* PTRACE_SYSCALL is 24 */
350*4882a593Smuzhiyun #define PTRACE_GETFPREGS64	  25
351*4882a593Smuzhiyun #define PTRACE_SETFPREGS64	  26
352*4882a593Smuzhiyun 
353*4882a593Smuzhiyun #endif /* _UAPI__SPARC_PTRACE_H */
354