xref: /openbmc/linux/arch/sh/include/asm/ptrace.h (revision 384740dc)
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_GETFDPIC		31	/* get the ELF fdpic loadmap address */
91 
92 #define PTRACE_GETFDPIC_EXEC	0	/* [addr] request the executable loadmap */
93 #define PTRACE_GETFDPIC_INTERP	1	/* [addr] request the interpreter loadmap */
94 
95 #define	PTRACE_GETDSPREGS	55
96 #define	PTRACE_SETDSPREGS	56
97 #endif
98 
99 #ifdef __KERNEL__
100 #include <asm/addrspace.h>
101 
102 #define user_mode(regs)			(((regs)->sr & 0x40000000)==0)
103 #define instruction_pointer(regs)	((unsigned long)(regs)->pc)
104 
105 extern void show_regs(struct pt_regs *);
106 
107 /*
108  * These are defined as per linux/ptrace.h.
109  */
110 struct task_struct;
111 
112 #define arch_has_single_step()	(1)
113 extern void user_enable_single_step(struct task_struct *);
114 extern void user_disable_single_step(struct task_struct *);
115 
116 #ifdef CONFIG_SH_DSP
117 #define task_pt_regs(task) \
118 	((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
119 		 - sizeof(struct pt_dspregs) - sizeof(unsigned long)) - 1)
120 #else
121 #define task_pt_regs(task) \
122 	((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE \
123 		 - sizeof(unsigned long)) - 1)
124 #endif
125 
126 static inline unsigned long profile_pc(struct pt_regs *regs)
127 {
128 	unsigned long pc = instruction_pointer(regs);
129 
130 #ifdef P2SEG
131 	if (pc >= P2SEG && pc < P3SEG)
132 		pc -= 0x20000000;
133 #endif
134 
135 	return pc;
136 }
137 #endif /* __KERNEL__ */
138 
139 #endif /* __ASM_SH_PTRACE_H */
140