x86: x86 ptrace merge complete
[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
168 convert_rip_to_linear(struct task_struct *child, struct pt_regs *regs);
169
170 #endif /* __KERNEL__ */
171 #endif /* !__i386__ */
172
173 #ifdef __KERNEL__
174
175 /*
176  * These are defined as per linux/ptrace.h, which see.
177  */
178 #define arch_has_single_step()  (1)
179 extern void user_enable_single_step(struct task_struct *);
180 extern void user_disable_single_step(struct task_struct *);
181
182 extern void user_enable_block_step(struct task_struct *);
183 #ifdef CONFIG_X86_DEBUGCTLMSR
184 #define arch_has_block_step()   (1)
185 #else
186 #define arch_has_block_step()   (boot_cpu_data.x86 >= 6)
187 #endif
188
189 struct user_desc;
190 extern int do_get_thread_area(struct task_struct *p, int idx,
191                               struct user_desc __user *info);
192 extern int do_set_thread_area(struct task_struct *p, int idx,
193                               struct user_desc __user *info, int can_allocate);
194
195 #endif /* __KERNEL__ */
196
197 #endif /* !__ASSEMBLY__ */
198
199 #endif