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>
15 extern void ptrace_bts_take_timestamp(struct task_struct *, enum bts_qualifier);
17 #endif /* __KERNEL__ */
21 /* this struct defines the way the registers are stored on the
22 stack during a system call. */
46 #else /* __KERNEL__ */
69 #include <asm/segment.h>
72 extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, int error_code);
75 * user_mode_vm(regs) determines whether a register set came from user mode.
76 * This is true if V8086 mode was enabled OR if the register set was from
77 * protected mode with RPL-3 CS value. This tricky test checks that with
78 * one comparison. Many places in the kernel can bypass this full check
79 * if they have already ruled out V8086 mode, so user_mode(regs) can be used.
81 static inline int user_mode(struct pt_regs *regs)
83 return (regs->cs & SEGMENT_RPL_MASK) == USER_RPL;
85 static inline int user_mode_vm(struct pt_regs *regs)
87 return ((regs->cs & SEGMENT_RPL_MASK) |
88 (regs->flags & VM_MASK)) >= USER_RPL;
90 static inline int v8086_mode(struct pt_regs *regs)
92 return (regs->flags & VM_MASK);
95 #define instruction_pointer(regs) ((regs)->ip)
96 #define frame_pointer(regs) ((regs)->bp)
97 #define stack_pointer(regs) ((unsigned long)(regs))
98 #define regs_return_value(regs) ((regs)->ax)
100 extern unsigned long profile_pc(struct pt_regs *regs);
101 #endif /* __KERNEL__ */
114 /* arguments: non interrupts/non tracing syscalls only save upto here*/
124 unsigned long orig_rax;
125 /* end of arguments */
126 /* cpu exception frame or undefined */
129 unsigned long eflags;
132 /* top of stack page */
135 #else /* __KERNEL__ */
144 /* arguments: non interrupts/non tracing syscalls only save upto here*/
154 unsigned long orig_ax;
155 /* end of arguments */
156 /* cpu exception frame or undefined */
162 /* top of stack page */
165 #define user_mode(regs) (!!((regs)->cs & 3))
166 #define user_mode_vm(regs) user_mode(regs)
167 #define v8086_mode(regs) 0 /* No V86 mode support in long mode */
168 #define instruction_pointer(regs) ((regs)->ip)
169 #define frame_pointer(regs) ((regs)->bp)
170 #define stack_pointer(regs) ((regs)->sp)
171 #define regs_return_value(regs) ((regs)->ax)
173 extern unsigned long profile_pc(struct pt_regs *regs);
174 void signal_fault(struct pt_regs *regs, void __user *frame, char *where);
179 convert_rip_to_linear(struct task_struct *child, struct pt_regs *regs);
181 #endif /* __KERNEL__ */
182 #endif /* !__i386__ */
187 * These are defined as per linux/ptrace.h, which see.
189 #define arch_has_single_step() (1)
190 extern void user_enable_single_step(struct task_struct *);
191 extern void user_disable_single_step(struct task_struct *);
193 extern void user_enable_block_step(struct task_struct *);
194 #ifdef CONFIG_X86_DEBUGCTLMSR
195 #define arch_has_block_step() (1)
197 #define arch_has_block_step() (boot_cpu_data.x86 >= 6)
201 extern int do_get_thread_area(struct task_struct *p, int idx,
202 struct user_desc __user *info);
203 extern int do_set_thread_area(struct task_struct *p, int idx,
204 struct user_desc __user *info, int can_allocate);
206 #endif /* __KERNEL__ */
208 #endif /* !__ASSEMBLY__ */