xref: /openbmc/linux/arch/sh/include/asm/ptrace.h (revision 9ac8d3fb)
1 #ifndef __ASM_SH_PTRACE_H
2 #define __ASM_SH_PTRACE_H
3 
4 /*
5  * Copyright (C) 1999, 2000  Niibe Yutaka
6  *
7  */
8 #if defined(__SH5__)
9 struct pt_regs {
10 	unsigned long long pc;
11 	unsigned long long sr;
12 	unsigned long long syscall_nr;
13 	unsigned long long regs[63];
14 	unsigned long long tregs[8];
15 	unsigned long long pad[2];
16 };
17 #else
18 /*
19  * GCC defines register number like this:
20  * -----------------------------
21  *	 0 - 15 are integer registers
22  *	17 - 22 are control/special registers
23  *	24 - 39 fp registers
24  *	40 - 47 xd registers
25  *	48 -    fpscr register
26  * -----------------------------
27  *
28  * We follows above, except:
29  *	16 --- program counter (PC)
30  *	22 --- syscall #
31  *	23 --- floating point communication register
32  */
33 #define REG_REG0	 0
34 #define REG_REG15	15
35 
36 #define REG_PC		16
37 
38 #define REG_PR		17
39 #define REG_SR		18
40 #define REG_GBR		19
41 #define REG_MACH	20
42 #define REG_MACL	21
43 
44 #define REG_SYSCALL	22
45 
46 #define REG_FPREG0	23
47 #define REG_FPREG15	38
48 #define REG_XFREG0	39
49 #define REG_XFREG15	54
50 
51 #define REG_FPSCR	55
52 #define REG_FPUL	56
53 
54 /*
55  * This struct defines the way the registers are stored on the
56  * kernel stack during a system call or other kernel entry.
57  */
58 struct pt_regs {
59 	unsigned long regs[16];
60 	unsigned long pc;
61 	unsigned long pr;
62 	unsigned long sr;
63 	unsigned long gbr;
64 	unsigned long mach;
65 	unsigned long macl;
66 	long tra;
67 };
68 
69 /*
70  * This struct defines the way the DSP registers are stored on the
71  * kernel stack during a system call or other kernel entry.
72  */
73 struct pt_dspregs {
74 	unsigned long	a1;
75 	unsigned long	a0g;
76 	unsigned long	a1g;
77 	unsigned long	m0;
78 	unsigned long	m1;
79 	unsigned long	a0;
80 	unsigned long	x0;
81 	unsigned long	x1;
82 	unsigned long	y0;
83 	unsigned long	y1;
84 	unsigned long	dsr;
85 	unsigned long	rs;
86 	unsigned long	re;
87 	unsigned long	mod;
88 };
89 
90 #define PTRACE_GETREGS		12	/* General registers */
91 #define PTRACE_SETREGS		13
92 
93 #define PTRACE_GETFPREGS	14	/* FPU registers */
94 #define PTRACE_SETFPREGS	15
95 
96 #define PTRACE_GETFDPIC		31	/* get the ELF fdpic loadmap address */
97 
98 #define PTRACE_GETFDPIC_EXEC	0	/* [addr] request the executable loadmap */
99 #define PTRACE_GETFDPIC_INTERP	1	/* [addr] request the interpreter loadmap */
100 
101 #define	PTRACE_GETDSPREGS	55	/* DSP registers */
102 #define	PTRACE_SETDSPREGS	56
103 #endif
104 
105 #ifdef __KERNEL__
106 #include <asm/addrspace.h>
107 
108 #define user_mode(regs)			(((regs)->sr & 0x40000000)==0)
109 #define instruction_pointer(regs)	((unsigned long)(regs)->pc)
110 
111 extern void show_regs(struct pt_regs *);
112 
113 /*
114  * These are defined as per linux/ptrace.h.
115  */
116 struct task_struct;
117 
118 #define arch_has_single_step()	(1)
119 extern void user_enable_single_step(struct task_struct *);
120 extern void user_disable_single_step(struct task_struct *);
121 
122 #ifdef CONFIG_SH_DSP
123 #define task_pt_regs(task) \
124 	((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
125 		 - sizeof(struct pt_dspregs) - sizeof(unsigned long)) - 1)
126 #define task_pt_dspregs(task) \
127 	((struct pt_dspregs *) (task_stack_page(task) + THREAD_SIZE \
128 		 - sizeof(unsigned long)) - 1)
129 #else
130 #define task_pt_regs(task) \
131 	((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
132 		 - sizeof(unsigned long)) - 1)
133 #endif
134 
135 static inline unsigned long profile_pc(struct pt_regs *regs)
136 {
137 	unsigned long pc = instruction_pointer(regs);
138 
139 #ifdef P2SEG
140 	if (pc >= P2SEG && pc < P3SEG)
141 		pc -= 0x20000000;
142 #endif
143 
144 	return pc;
145 }
146 #endif /* __KERNEL__ */
147 
148 #endif /* __ASM_SH_PTRACE_H */
149