2168fde25611787e48401f8cd3769518b7b7f3b5
[linux-3.10.git] / 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         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 #define PT_TEXT_END_ADDR        240
106 #define PT_TEXT_ADDR            244     /* &(struct user)->start_code */
107 #define PT_DATA_ADDR            248     /* &(struct user)->start_data */
108 #define PT_TEXT_LEN             252
109
110 #ifdef __KERNEL__
111 #include <asm/addrspace.h>
112 #include <asm/page.h>
113 #include <asm/system.h>
114
115 #define user_mode(regs)                 (((regs)->sr & 0x40000000)==0)
116 #define instruction_pointer(regs)       ((unsigned long)(regs)->pc)
117
118 extern void show_regs(struct pt_regs *);
119
120 /*
121  * These are defined as per linux/ptrace.h.
122  */
123 struct task_struct;
124
125 #define arch_has_single_step()  (1)
126
127 struct perf_event;
128 struct perf_sample_data;
129
130 extern void ptrace_triggered(struct perf_event *bp, int nmi,
131                       struct perf_sample_data *data, struct pt_regs *regs);
132
133 #define task_pt_regs(task) \
134         ((struct pt_regs *) (task_stack_page(task) + THREAD_SIZE) - 1)
135
136 static inline unsigned long profile_pc(struct pt_regs *regs)
137 {
138         unsigned long pc = instruction_pointer(regs);
139
140         if (virt_addr_uncached(pc))
141                 return CAC_ADDR(pc);
142
143         return pc;
144 }
145 #endif /* __KERNEL__ */
146
147 #endif /* __ASM_SH_PTRACE_H */