Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/dtor/input
[linux-2.6] / arch / sh / include / asm / ptrace.h
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 #endif
90
91 #define PTRACE_GETREGS          12      /* General registers */
92 #define PTRACE_SETREGS          13
93
94 #define PTRACE_GETFPREGS        14      /* FPU registers */
95 #define PTRACE_SETFPREGS        15
96
97 #define PTRACE_GETFDPIC         31      /* get the ELF fdpic loadmap address */
98
99 #define PTRACE_GETFDPIC_EXEC    0       /* [addr] request the executable loadmap */
100 #define PTRACE_GETFDPIC_INTERP  1       /* [addr] request the interpreter loadmap */
101
102 #define PTRACE_GETDSPREGS       55      /* DSP registers */
103 #define PTRACE_SETDSPREGS       56
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 */