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