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 *);
  91
  92static inline unsigned long regs_return_value(struct pt_regs *regs)
  93{
  94        return regs->ax;
  95}
  96
  97/*
  98 * user_mode(regs) determines whether a register set came from user
  99 * mode.  On x86_32, this is true if V8086 mode was enabled OR if the
 100 * register set was from protected mode with RPL-3 CS value.  This
 101 * tricky test checks that with one comparison.
 102 *
 103 * On x86_64, vm86 mode is mercifully nonexistent, and we don't need
 104 * the extra check.
 105 */
 106static inline int user_mode(struct pt_regs *regs)
 107{
 108#ifdef CONFIG_X86_32
 109        return ((regs->cs & SEGMENT_RPL_MASK) | (regs->flags & X86_VM_MASK)) >= USER_RPL;
 110#else
 111        return !!(regs->cs & 3);
 112#endif
 113}
 114
 115static inline int v8086_mode(struct pt_regs *regs)
 116{
 117#ifdef CONFIG_X86_32
 118        return (regs->flags & X86_VM_MASK);
 119#else
 120        return 0;       /* No V86 mode support in long mode */
 121#endif
 122}
 123
 124#ifdef CONFIG_X86_64
 125static inline bool user_64bit_mode(struct pt_regs *regs)
 126{
 127#ifndef CONFIG_PARAVIRT
 128        /*
 129         * On non-paravirt systems, this is the only long mode CPL 3
 130         * selector.  We do not allow long mode selectors in the LDT.
 131         */
 132        return regs->cs == __USER_CS;
 133#else
 134        /* Headers are too twisted for this to go in paravirt.h. */
 135        return regs->cs == __USER_CS || regs->cs == pv_info.extra_user_64bit_cs;
 136#endif
 137}
 138
 139#define current_user_stack_pointer()    current_pt_regs()->sp
 140#define compat_user_stack_pointer()     current_pt_regs()->sp
 141#endif
 142
 143#ifdef CONFIG_X86_32
 144extern unsigned long kernel_stack_pointer(struct pt_regs *regs);
 145#else
 146static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)
 147{
 148        return regs->sp;
 149}
 150#endif
 151
 152#define GET_IP(regs) ((regs)->ip)
 153#define GET_FP(regs) ((regs)->bp)
 154#define GET_USP(regs) ((regs)->sp)
 155
 156#include <asm-generic/ptrace.h>
 157
 158/* Query offset/name of register from its name/offset */
 159extern int regs_query_register_offset(const char *name);
 160extern const char *regs_query_register_name(unsigned int offset);
 161#define MAX_REG_OFFSET (offsetof(struct pt_regs, ss))
 162
 163/**
 164 * regs_get_register() - get register value from its offset
 165 * @regs:       pt_regs from which register value is gotten.
 166 * @offset:     offset number of the register.
 167 *
 168 * regs_get_register returns the value of a register. The @offset is the
 169 * offset of the register in struct pt_regs address which specified by @regs.
 170 * If @offset is bigger than MAX_REG_OFFSET, this returns 0.
 171 */
 172static inline unsigned long regs_get_register(struct pt_regs *regs,
 173                                              unsigned int offset)
 174{
 175        if (unlikely(offset > MAX_REG_OFFSET))
 176                return 0;
 177#ifdef CONFIG_X86_32
 178        /*
 179         * Traps from the kernel do not save sp and ss.
 180         * Use the helper function to retrieve sp.
 181         */
 182        if (offset == offsetof(struct pt_regs, sp) &&
 183            regs->cs == __KERNEL_CS)
 184                return kernel_stack_pointer(regs);
 185#endif
 186        return *(unsigned long *)((unsigned long)regs + offset);
 187}
 188
 189/**
 190 * regs_within_kernel_stack() - check the address in the stack
 191 * @regs:       pt_regs which contains kernel stack pointer.
 192 * @addr:       address which is checked.
 193 *
 194 * regs_within_kernel_stack() checks @addr is within the kernel stack page(s).
 195 * If @addr is within the kernel stack, it returns true. If not, returns false.
 196 */
 197static inline int regs_within_kernel_stack(struct pt_regs *regs,
 198                                           unsigned long addr)
 199{
 200        return ((addr & ~(THREAD_SIZE - 1))  ==
 201                (kernel_stack_pointer(regs) & ~(THREAD_SIZE - 1)));
 202}
 203
 204/**
 205 * regs_get_kernel_stack_nth() - get Nth entry of the stack
 206 * @regs:       pt_regs which contains kernel stack pointer.
 207 * @n:          stack entry number.
 208 *
 209 * regs_get_kernel_stack_nth() returns @n th entry of the kernel stack which
 210 * is specified by @regs. If the @n th entry is NOT in the kernel stack,
 211 * this returns 0.
 212 */
 213static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
 214                                                      unsigned int n)
 215{
 216        unsigned long *addr = (unsigned long *)kernel_stack_pointer(regs);
 217        addr += n;
 218        if (regs_within_kernel_stack(regs, (unsigned long)addr))
 219                return *addr;
 220        else
 221                return 0;
 222}
 223
 224#define arch_has_single_step()  (1)
 225#ifdef CONFIG_X86_DEBUGCTLMSR
 226#define arch_has_block_step()   (1)
 227#else
 228#define arch_has_block_step()   (boot_cpu_data.x86 >= 6)
 229#endif
 230
 231#define ARCH_HAS_USER_SINGLE_STEP_INFO
 232
 233/*
 234 * When hitting ptrace_stop(), we cannot return using SYSRET because
 235 * that does not restore the full CPU state, only a minimal set.  The
 236 * ptracer can change arbitrary register values, which is usually okay
 237 * because the usual ptrace stops run off the signal delivery path which
 238 * forces IRET; however, ptrace_event() stops happen in arbitrary places
 239 * in the kernel and don't force IRET path.
 240 *
 241 * So force IRET path after a ptrace stop.
 242 */
 243#define arch_ptrace_stop_needed(code, info)                             \
 244({                                                                      \
 245        force_iret();                                                   \
 246        false;                                                          \
 247})
 248
 249struct user_desc;
 250extern int do_get_thread_area(struct task_struct *p, int idx,
 251                              struct user_desc __user *info);
 252extern int do_set_thread_area(struct task_struct *p, int idx,
 253                              struct user_desc __user *info, int can_allocate);
 254
 255#endif /* !__ASSEMBLY__ */
 256#endif /* _ASM_X86_PTRACE_H */
 257