linux/arch/x86/include/asm/ptrace.h
<<
>>
Prefs
   1#ifndef _ASM_X86_PTRACE_H
   2#define _ASM_X86_PTRACE_H
   3
   4#include <asm/segment.h>
   5#include <asm/page_types.h>
   6#include <uapi/asm/ptrace.h>
   7
   8#ifndef __ASSEMBLY__
   9#ifdef __i386__
  10
  11struct pt_regs {
  12        unsigned long bx;
  13        unsigned long cx;
  14        unsigned long dx;
  15        unsigned long si;
  16        unsigned long di;
  17        unsigned long bp;
  18        unsigned long ax;
  19        unsigned long ds;
  20        unsigned long es;
  21        unsigned long fs;
  22        unsigned long gs;
  23        unsigned long orig_ax;
  24        unsigned long ip;
  25        unsigned long cs;
  26        unsigned long flags;
  27        unsigned long sp;
  28        unsigned long ss;
  29};
  30
  31#else /* __i386__ */
  32
  33struct pt_regs {
  34/*
  35 * C ABI says these regs are callee-preserved. They aren't saved on kernel entry
  36 * unless syscall needs a complete, fully filled "struct pt_regs".
  37 */
  38        unsigned long r15;
  39        unsigned long r14;
  40        unsigned long r13;
  41        unsigned long r12;
  42        unsigned long bp;
  43        unsigned long bx;
  44/* These regs are callee-clobbered. Always saved on kernel entry. */
  45        unsigned long r11;
  46        unsigned long r10;
  47        unsigned long r9;
  48        unsigned long r8;
  49        unsigned long ax;
  50        unsigned long cx;
  51        unsigned long dx;
  52        unsigned long si;
  53        unsigned long di;
  54/*
  55 * On syscall entry, this is syscall#. On CPU exception, this is error code.
  56 * On hw interrupt, it's IRQ number:
  57 */
  58        unsigned long orig_ax;
  59/* Return frame for iretq */
  60        unsigned long ip;
  61        unsigned long cs;
  62        unsigned long flags;
  63        unsigned long sp;
  64        unsigned long ss;
  65/* top of stack page */
  66};
  67
  68#endif /* !__i386__ */
  69
  70#ifdef CONFIG_PARAVIRT
  71#include <asm/paravirt_types.h>
  72#endif
  73
  74struct cpuinfo_x86;
  75struct task_struct;
  76
  77extern unsigned long profile_pc(struct pt_regs *regs);
  78#define profile_pc profile_pc
  79
  80extern unsigned long
  81convert_ip_to_linear(struct task_struct *child, struct pt_regs *regs);
  82extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
  83                         int error_code, int si_code);
  84
  85
  86extern unsigned long syscall_trace_enter_phase1(struct pt_regs *, u32 arch);
  87extern long syscall_trace_enter_phase2(struct pt_regs *, u32 arch,
  88                                       unsigned long phase1_result);
  89
  90extern long syscall_trace_enter(struct pt_regs *);
  91extern void syscall_trace_leave(struct pt_regs *);
  92
  93static inline unsigned long regs_return_value(struct pt_regs *regs)
  94{
  95        return regs->ax;
  96}
  97
  98/*
  99 * user_mode(regs) determines whether a register set came from user
 100 * mode.  On x86_32, this is true if V8086 mode was enabled OR if the
 101 * register set was from protected mode with RPL-3 CS value.  This
 102 * tricky test checks that with one comparison.
 103 *
 104 * On x86_64, vm86 mode is mercifully nonexistent, and we don't need
 105 * the extra check.
 106 */
 107static inline int user_mode(struct pt_regs *regs)
 108{
 109#ifdef CONFIG_X86_32
 110        return ((regs->cs & SEGMENT_RPL_MASK) | (regs->flags & X86_VM_MASK)) >= USER_RPL;
 111#else
 112        return !!(regs->cs & 3);
 113#endif
 114}
 115
 116static inline int v8086_mode(struct pt_regs *regs)
 117{
 118#ifdef CONFIG_X86_32
 119        return (regs->flags & X86_VM_MASK);
 120#else
 121        return 0;       /* No V86 mode support in long mode */
 122#endif
 123}
 124
 125#ifdef CONFIG_X86_64
 126static inline bool user_64bit_mode(struct pt_regs *regs)
 127{
 128#ifndef CONFIG_PARAVIRT
 129        /*
 130         * On non-paravirt systems, this is the only long mode CPL 3
 131         * selector.  We do not allow long mode selectors in the LDT.
 132         */
 133        return regs->cs == __USER_CS;
 134#else
 135        /* Headers are too twisted for this to go in paravirt.h. */
 136        return regs->cs == __USER_CS || regs->cs == pv_info.extra_user_64bit_cs;
 137#endif
 138}
 139
 140#define current_user_stack_pointer()    current_pt_regs()->sp
 141#define compat_user_stack_pointer()     current_pt_regs()->sp
 142#endif
 143
 144#ifdef CONFIG_X86_32
 145extern unsigned long kernel_stack_pointer(struct pt_regs *regs);
 146#else
 147static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
 148{
 149        return regs->sp;
 150}
 151#endif
 152
 153#define GET_IP(regs) ((regs)->ip)
 154#define GET_FP(regs) ((regs)->bp)
 155#define GET_USP(regs) ((regs)->sp)
 156
 157#include <asm-generic/ptrace.h>
 158
 159/* Query offset/name of register from its name/offset */
 160extern int regs_query_register_offset(const char *name);
 161extern const char *regs_query_register_name(unsigned int offset);
 162#define MAX_REG_OFFSET (offsetof(struct pt_regs, ss))
 163
 164/**
 165 * regs_get_register() - get register value from its offset
 166 * @regs:       pt_regs from which register value is gotten.
 167 * @offset:     offset number of the register.
 168 *
 169 * regs_get_register returns the value of a register. The @offset is the
 170 * offset of the register in struct pt_regs address which specified by @regs.
 171 * If @offset is bigger than MAX_REG_OFFSET, this returns 0.
 172 */
 173static inline unsigned long regs_get_register(struct pt_regs *regs,
 174                                              unsigned int offset)
 175{
 176        if (unlikely(offset > MAX_REG_OFFSET))
 177                return 0;
 178#ifdef CONFIG_X86_32
 179        /*
 180         * Traps from the kernel do not save sp and ss.
 181         * Use the helper function to retrieve sp.
 182         */
 183        if (offset == offsetof(struct pt_regs, sp) &&
 184            regs->cs == __KERNEL_CS)
 185                return kernel_stack_pointer(regs);
 186#endif
 187        return *(unsigned long *)((unsigned long)regs + offset);
 188}
 189
 190/**
 191 * regs_within_kernel_stack() - check the address in the stack
 192 * @regs:       pt_regs which contains kernel stack pointer.
 193 * @addr:       address which is checked.
 194 *
 195 * regs_within_kernel_stack() checks @addr is within the kernel stack page(s).
 196 * If @addr is within the kernel stack, it returns true. If not, returns false.
 197 */
 198static inline int regs_within_kernel_stack(struct pt_regs *regs,
 199                                           unsigned long addr)
 200{
 201        return ((addr & ~(THREAD_SIZE - 1))  ==
 202                (kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1)));
 203}
 204
 205/**
 206 * regs_get_kernel_stack_nth() - get Nth entry of the stack
 207 * @regs:       pt_regs which contains kernel stack pointer.
 208 * @n:          stack entry number.
 209 *
 210 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
 211 * is specified by @regs. If the @n th entry is NOT in the kernel stack,
 212 * this returns 0.
 213 */
 214static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
 215                                                      unsigned int n)
 216{
 217        unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs);
 218        addr += n;
 219        if (regs_within_kernel_stack(regs, (unsigned long)addr))
 220                return *addr;
 221        else
 222                return 0;
 223}
 224
 225#define arch_has_single_step()  (1)
 226#ifdef CONFIG_X86_DEBUGCTLMSR
 227#define arch_has_block_step()   (1)
 228#else
 229#define arch_has_block_step()   (boot_cpu_data.x86 >= 6)
 230#endif
 231
 232#define ARCH_HAS_USER_SINGLE_STEP_INFO
 233
 234/*
 235 * When hitting ptrace_stop(), we cannot return using SYSRET because
 236 * that does not restore the full CPU state, only a minimal set.  The
 237 * ptracer can change arbitrary register values, which is usually okay
 238 * because the usual ptrace stops run off the signal delivery path which
 239 * forces IRET; however, ptrace_event() stops happen in arbitrary places
 240 * in the kernel and don't force IRET path.
 241 *
 242 * So force IRET path after a ptrace stop.
 243 */
 244#define arch_ptrace_stop_needed(code, info)                             \
 245({                                                                      \
 246        force_iret();                                                   \
 247        false;                                                          \
 248})
 249
 250struct user_desc;
 251extern int do_get_thread_area(struct task_struct *p, int idx,
 252                              struct user_desc __user *info);
 253extern int do_set_thread_area(struct task_struct *p, int idx,
 254                              struct user_desc __user *info, int can_allocate);
 255
 256#endif /* !__ASSEMBLY__ */
 257#endif /* _ASM_X86_PTRACE_H */
 258