1 #ifndef _ASM_X86_PTRACE_H
2 #define _ASM_X86_PTRACE_H
4 #include <linux/compiler.h> /* For __user */
5 #include <asm/ptrace-abi.h>
12 /* the DS BTS struct is used for ptrace as well */
16 extern void ptrace_bts_take_timestamp(struct task_struct *, enum bts_qualifier);
18 #endif /* __KERNEL__ */
22 /* this struct defines the way the registers are stored on the
23 stack during a system call. */
47 #else /* __KERNEL__ */
70 #include <asm/segment.h>
75 convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);
77 extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code);
79 #define regs_return_value(regs) ((regs)->ax)
81 extern unsigned long profile_pc(struct pt_regs *regs);
82 #endif /* __KERNEL__ */
95 /* arguments: non interrupts/non tracing syscalls only save upto here*/
105 unsigned long orig_rax;
106 /* end of arguments */
107 /* cpu exception frame or undefined */
110 unsigned long eflags;
113 /* top of stack page */
116 #else /* __KERNEL__ */
125 /* arguments: non interrupts/non tracing syscalls only save upto here*/
135 unsigned long orig_ax;
136 /* end of arguments */
137 /* cpu exception frame or undefined */
143 /* top of stack page */
146 #define regs_return_value(regs) ((regs)->ax)
148 extern unsigned long profile_pc(struct pt_regs *regs);
149 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
154 convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);
156 #endif /* __KERNEL__ */
157 #endif /* !__i386__ */
162 * user_mode_vm(regs) determines whether a register set came from user mode.
163 * This is true if V8086 mode was enabled OR if the register set was from
164 * protected mode with RPL-3 CS value. This tricky test checks that with
165 * one comparison. Many places in the kernel can bypass this full check
166 * if they have already ruled out V8086 mode, so user_mode(regs) can be used.
168 static inline int user_mode(struct pt_regs *regs)
171 return (regs->cs & SEGMENT_RPL_MASK) == USER_RPL;
173 return !!(regs->cs & 3);
177 static inline int user_mode_vm(struct pt_regs *regs)
180 return ((regs->cs & SEGMENT_RPL_MASK) |
181 (regs->flags & VM_MASK)) >= USER_RPL;
183 return user_mode(regs);
187 static inline int v8086_mode(struct pt_regs *regs)
190 return (regs->flags & VM_MASK);
192 return 0; /* No V86 mode support in long mode */
196 static inline unsigned long stack_pointer(struct pt_regs *regs)
199 return (unsigned long)regs;
205 static inline unsigned long instruction_pointer(struct pt_regs *regs)
210 static inline unsigned long frame_pointer(struct pt_regs *regs)
216 * These are defined as per linux/ptrace.h, which see.
218 #define arch_has_single_step() (1)
219 extern void user_enable_single_step(struct task_struct *);
220 extern void user_disable_single_step(struct task_struct *);
222 extern void user_enable_block_step(struct task_struct *);
223 #ifdef CONFIG_X86_DEBUGCTLMSR
224 #define arch_has_block_step() (1)
226 #define arch_has_block_step() (boot_cpu_data.x86 >= 6)
230 extern int do_get_thread_area(struct task_struct *p, int idx,
231 struct user_desc __user *info);
232 extern int do_set_thread_area(struct task_struct *p, int idx,
233 struct user_desc __user *info, int can_allocate);
235 #endif /* __KERNEL__ */
237 #endif /* !__ASSEMBLY__ */