x86: rename the struct pt_regs members for 32/64-bit consistency
[pandora-kernel.git] / include / asm-x86 / ptrace.h
1 #ifndef _ASM_X86_PTRACE_H
2 #define _ASM_X86_PTRACE_H
3
4 #include <linux/compiler.h>     /* For __user */
5 #include <asm/ptrace-abi.h>
6
7 #ifndef __ASSEMBLY__
8
9 #ifdef __i386__
10 /* this struct defines the way the registers are stored on the
11    stack during a system call. */
12
13 #ifndef __KERNEL__
14
15 struct pt_regs {
16         long ebx;
17         long ecx;
18         long edx;
19         long esi;
20         long edi;
21         long ebp;
22         long eax;
23         int  xds;
24         int  xes;
25         int  xfs;
26         /* int  gs; */
27         long orig_eax;
28         long eip;
29         int  xcs;
30         long eflags;
31         long esp;
32         int  xss;
33 };
34
35 #else /* __KERNEL__ */
36
37 struct pt_regs {
38         long bx;
39         long cx;
40         long dx;
41         long si;
42         long di;
43         long bp;
44         long ax;
45         int  ds;
46         int  es;
47         int  fs;
48         /* int  gs; */
49         long orig_ax;
50         long ip;
51         int  cs;
52         long flags;
53         long sp;
54         int  ss;
55 };
56
57 #include <asm/vm86.h>
58 #include <asm/segment.h>
59
60 struct task_struct;
61 extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code);
62
63 /*
64  * user_mode_vm(regs) determines whether a register set came from user mode.
65  * This is true if V8086 mode was enabled OR if the register set was from
66  * protected mode with RPL-3 CS value.  This tricky test checks that with
67  * one comparison.  Many places in the kernel can bypass this full check
68  * if they have already ruled out V8086 mode, so user_mode(regs) can be used.
69  */
70 static inline int user_mode(struct pt_regs *regs)
71 {
72         return (regs->cs & SEGMENT_RPL_MASK) == USER_RPL;
73 }
74 static inline int user_mode_vm(struct pt_regs *regs)
75 {
76         return ((regs->cs & SEGMENT_RPL_MASK) |
77                 (regs->flags & VM_MASK)) >= USER_RPL;
78 }
79 static inline int v8086_mode(struct pt_regs *regs)
80 {
81         return (regs->flags & VM_MASK);
82 }
83
84 #define instruction_pointer(regs) ((regs)->ip)
85 #define frame_pointer(regs) ((regs)->bp)
86 #define stack_pointer(regs) ((unsigned long)(regs))
87 #define regs_return_value(regs) ((regs)->ax)
88
89 extern unsigned long profile_pc(struct pt_regs *regs);
90 #endif /* __KERNEL__ */
91
92 #else /* __i386__ */
93
94 #ifndef __KERNEL__
95
96 struct pt_regs {
97         unsigned long r15;
98         unsigned long r14;
99         unsigned long r13;
100         unsigned long r12;
101         unsigned long rbp;
102         unsigned long rbx;
103 /* arguments: non interrupts/non tracing syscalls only save upto here*/
104         unsigned long r11;
105         unsigned long r10;
106         unsigned long r9;
107         unsigned long r8;
108         unsigned long rax;
109         unsigned long rcx;
110         unsigned long rdx;
111         unsigned long rsi;
112         unsigned long rdi;
113         unsigned long orig_rax;
114 /* end of arguments */
115 /* cpu exception frame or undefined */
116         unsigned long rip;
117         unsigned long cs;
118         unsigned long eflags;
119         unsigned long rsp;
120         unsigned long ss;
121 /* top of stack page */
122 };
123
124 #else /* __KERNEL__ */
125
126 struct pt_regs {
127         unsigned long r15;
128         unsigned long r14;
129         unsigned long r13;
130         unsigned long r12;
131         unsigned long bp;
132         unsigned long bx;
133 /* arguments: non interrupts/non tracing syscalls only save upto here*/
134         unsigned long r11;
135         unsigned long r10;
136         unsigned long r9;
137         unsigned long r8;
138         unsigned long ax;
139         unsigned long cx;
140         unsigned long dx;
141         unsigned long si;
142         unsigned long di;
143         unsigned long orig_ax;
144 /* end of arguments */
145 /* cpu exception frame or undefined */
146         unsigned long ip;
147         unsigned long cs;
148         unsigned long flags;
149         unsigned long sp;
150         unsigned long ss;
151 /* top of stack page */
152 };
153
154 #define user_mode(regs) (!!((regs)->cs & 3))
155 #define user_mode_vm(regs) user_mode(regs)
156 #define v8086_mode(regs) 0      /* No V86 mode support in long mode */
157 #define instruction_pointer(regs) ((regs)->ip)
158 #define frame_pointer(regs) ((regs)->bp)
159 #define stack_pointer(regs) ((regs)->sp)
160 #define regs_return_value(regs) ((regs)->ax)
161
162 extern unsigned long profile_pc(struct pt_regs *regs);
163 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
164
165 struct task_struct;
166
167 extern unsigned long ptrace_get_debugreg(struct task_struct *child, int n);
168 extern int ptrace_set_debugreg(struct task_struct *child, int n, unsigned long);
169
170 extern unsigned long
171 convert_rip_to_linear(struct task_struct *child, struct pt_regs *regs);
172
173 enum {
174         EF_CF   = 0x00000001,
175         EF_PF   = 0x00000004,
176         EF_AF   = 0x00000010,
177         EF_ZF   = 0x00000040,
178         EF_SF   = 0x00000080,
179         EF_TF   = 0x00000100,
180         EF_IE   = 0x00000200,
181         EF_DF   = 0x00000400,
182         EF_OF   = 0x00000800,
183         EF_IOPL = 0x00003000,
184         EF_IOPL_RING0 = 0x00000000,
185         EF_IOPL_RING1 = 0x00001000,
186         EF_IOPL_RING2 = 0x00002000,
187         EF_NT   = 0x00004000,   /* nested task */
188         EF_RF   = 0x00010000,   /* resume */
189         EF_VM   = 0x00020000,   /* virtual mode */
190         EF_AC   = 0x00040000,   /* alignment */
191         EF_VIF  = 0x00080000,   /* virtual interrupt */
192         EF_VIP  = 0x00100000,   /* virtual interrupt pending */
193         EF_ID   = 0x00200000,   /* id */
194 };
195 #endif /* __KERNEL__ */
196 #endif /* !__i386__ */
197
198 #ifdef __KERNEL__
199
200 /*
201  * These are defined as per linux/ptrace.h, which see.
202  */
203 #define arch_has_single_step()  (1)
204 extern void user_enable_single_step(struct task_struct *);
205 extern void user_disable_single_step(struct task_struct *);
206
207 extern void user_enable_block_step(struct task_struct *);
208 #ifdef CONFIG_X86_DEBUGCTLMSR
209 #define arch_has_block_step()   (1)
210 #else
211 #define arch_has_block_step()   (boot_cpu_data.x86 >= 6)
212 #endif
213
214 struct user_desc;
215 extern int do_get_thread_area(struct task_struct *p, int idx,
216                               struct user_desc __user *info);
217 extern int do_set_thread_area(struct task_struct *p, int idx,
218                               struct user_desc __user *info, int can_allocate);
219
220 #endif /* __KERNEL__ */
221
222 #endif /* !__ASSEMBLY__ */
223
224 #endif