Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ptrace.h
Go to the documentation of this file.
1 #ifndef _LINUX_PTRACE_H
2 #define _LINUX_PTRACE_H
3 
4 #include <linux/compiler.h> /* For unlikely. */
5 #include <linux/sched.h> /* For struct task_struct. */
6 #include <linux/err.h> /* for IS_ERR_VALUE */
7 #include <linux/bug.h> /* For BUG_ON. */
8 #include <uapi/linux/ptrace.h>
9 
10 /*
11  * Ptrace flags
12  *
13  * The owner ship rules for task->ptrace which holds the ptrace
14  * flags is simple. When a task is running it owns it's task->ptrace
15  * flags. When the a task is stopped the ptracer owns task->ptrace.
16  */
17 
18 #define PT_SEIZED 0x00010000 /* SEIZE used, enable new behavior */
19 #define PT_PTRACED 0x00000001
20 #define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */
21 #define PT_PTRACE_CAP 0x00000004 /* ptracer can follow suid-exec */
22 
23 #define PT_OPT_FLAG_SHIFT 3
24 /* PT_TRACE_* event enable flags */
25 #define PT_EVENT_FLAG(event) (1 << (PT_OPT_FLAG_SHIFT + (event)))
26 #define PT_TRACESYSGOOD PT_EVENT_FLAG(0)
27 #define PT_TRACE_FORK PT_EVENT_FLAG(PTRACE_EVENT_FORK)
28 #define PT_TRACE_VFORK PT_EVENT_FLAG(PTRACE_EVENT_VFORK)
29 #define PT_TRACE_CLONE PT_EVENT_FLAG(PTRACE_EVENT_CLONE)
30 #define PT_TRACE_EXEC PT_EVENT_FLAG(PTRACE_EVENT_EXEC)
31 #define PT_TRACE_VFORK_DONE PT_EVENT_FLAG(PTRACE_EVENT_VFORK_DONE)
32 #define PT_TRACE_EXIT PT_EVENT_FLAG(PTRACE_EVENT_EXIT)
33 #define PT_TRACE_SECCOMP PT_EVENT_FLAG(PTRACE_EVENT_SECCOMP)
34 
35 /* single stepping state bits (used on ARM and PA-RISC) */
36 #define PT_SINGLESTEP_BIT 31
37 #define PT_SINGLESTEP (1<<PT_SINGLESTEP_BIT)
38 #define PT_BLOCKSTEP_BIT 30
39 #define PT_BLOCKSTEP (1<<PT_BLOCKSTEP_BIT)
40 
41 extern long arch_ptrace(struct task_struct *child, long request,
42  unsigned long addr, unsigned long data);
43 extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len);
44 extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len);
45 extern void ptrace_disable(struct task_struct *);
46 extern int ptrace_check_attach(struct task_struct *task, bool ignore_state);
47 extern int ptrace_request(struct task_struct *child, long request,
48  unsigned long addr, unsigned long data);
49 extern void ptrace_notify(int exit_code);
50 extern void __ptrace_link(struct task_struct *child,
51  struct task_struct *new_parent);
52 extern void __ptrace_unlink(struct task_struct *child);
53 extern void exit_ptrace(struct task_struct *tracer);
54 #define PTRACE_MODE_READ 0x01
55 #define PTRACE_MODE_ATTACH 0x02
56 #define PTRACE_MODE_NOAUDIT 0x04
57 /* Returns true on success, false on denial. */
58 extern bool ptrace_may_access(struct task_struct *task, unsigned int mode);
59 
60 static inline int ptrace_reparented(struct task_struct *child)
61 {
62  return !same_thread_group(child->real_parent, child->parent);
63 }
64 
65 static inline void ptrace_unlink(struct task_struct *child)
66 {
67  if (unlikely(child->ptrace))
68  __ptrace_unlink(child);
69 }
70 
71 int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr,
72  unsigned long data);
73 int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr,
74  unsigned long data);
75 
87 static inline struct task_struct *ptrace_parent(struct task_struct *task)
88 {
89  if (unlikely(task->ptrace))
90  return rcu_dereference(task->parent);
91  return NULL;
92 }
93 
103 static inline bool ptrace_event_enabled(struct task_struct *task, int event)
104 {
105  return task->ptrace & PT_EVENT_FLAG(event);
106 }
107 
118 static inline void ptrace_event(int event, unsigned long message)
119 {
120  if (unlikely(ptrace_event_enabled(current, event))) {
121  current->ptrace_message = message;
122  ptrace_notify((event << 8) | SIGTRAP);
123  } else if (event == PTRACE_EVENT_EXEC) {
124  /* legacy EXEC report via SIGTRAP */
125  if ((current->ptrace & (PT_PTRACED|PT_SEIZED)) == PT_PTRACED)
126  send_sig(SIGTRAP, current, 0);
127  }
128 }
129 
140 static inline void ptrace_init_task(struct task_struct *child, bool ptrace)
141 {
142  INIT_LIST_HEAD(&child->ptrace_entry);
143  INIT_LIST_HEAD(&child->ptraced);
144 #ifdef CONFIG_HAVE_HW_BREAKPOINT
145  atomic_set(&child->ptrace_bp_refcnt, 1);
146 #endif
147  child->jobctl = 0;
148  child->ptrace = 0;
149  child->parent = child->real_parent;
150 
151  if (unlikely(ptrace) && current->ptrace) {
152  child->ptrace = current->ptrace;
153  __ptrace_link(child, current->parent);
154 
155  if (child->ptrace & PT_SEIZED)
157  else
158  sigaddset(&child->pending.signal, SIGSTOP);
159 
160  set_tsk_thread_flag(child, TIF_SIGPENDING);
161  }
162 }
163 
170 static inline void ptrace_release_task(struct task_struct *task)
171 {
172  BUG_ON(!list_empty(&task->ptraced));
173  ptrace_unlink(task);
174  BUG_ON(!list_empty(&task->ptrace_entry));
175 }
176 
177 #ifndef force_successful_syscall_return
178 /*
179  * System call handlers that, upon successful completion, need to return a
180  * negative value should call force_successful_syscall_return() right before
181  * returning. On architectures where the syscall convention provides for a
182  * separate error flag (e.g., alpha, ia64, ppc{,64}, sparc{,64}, possibly
183  * others), this macro can be used to ensure that the error flag will not get
184  * set. On architectures which do not support a separate error flag, the macro
185  * is a no-op and the spurious error condition needs to be filtered out by some
186  * other means (e.g., in user-level, by passing an extra argument to the
187  * syscall handler, or something along those lines).
188  */
189 #define force_successful_syscall_return() do { } while (0)
190 #endif
191 
192 #ifndef is_syscall_success
193 /*
194  * On most systems we can tell if a syscall is a success based on if the retval
195  * is an error value. On some systems like ia64 and powerpc they have different
196  * indicators of success/failure and must define their own.
197  */
198 #define is_syscall_success(regs) (!IS_ERR_VALUE((unsigned long)(regs_return_value(regs))))
199 #endif
200 
201 /*
202  * <asm/ptrace.h> should define the following things inside #ifdef __KERNEL__.
203  *
204  * These do-nothing inlines are used when the arch does not
205  * implement single-step. The kerneldoc comments are here
206  * to document the interface for all arch definitions.
207  */
208 
209 #ifndef arch_has_single_step
210 
219 #define arch_has_single_step() (0)
220 
230 static inline void user_enable_single_step(struct task_struct *task)
231 {
232  BUG(); /* This can never be called. */
233 }
234 
244 static inline void user_disable_single_step(struct task_struct *task)
245 {
246 }
247 #else
248 extern void user_enable_single_step(struct task_struct *);
249 extern void user_disable_single_step(struct task_struct *);
250 #endif /* arch_has_single_step */
251 
252 #ifndef arch_has_block_step
253 
262 #define arch_has_block_step() (0)
263 
273 static inline void user_enable_block_step(struct task_struct *task)
274 {
275  BUG(); /* This can never be called. */
276 }
277 #else
278 extern void user_enable_block_step(struct task_struct *);
279 #endif /* arch_has_block_step */
280 
281 #ifdef ARCH_HAS_USER_SINGLE_STEP_INFO
282 extern void user_single_step_siginfo(struct task_struct *tsk,
283  struct pt_regs *regs, siginfo_t *info);
284 #else
285 static inline void user_single_step_siginfo(struct task_struct *tsk,
286  struct pt_regs *regs, siginfo_t *info)
287 {
288  memset(info, 0, sizeof(*info));
289  info->si_signo = SIGTRAP;
290 }
291 #endif
292 
293 #ifndef arch_ptrace_stop_needed
294 
308 #define arch_ptrace_stop_needed(code, info) (0)
309 #endif
310 
311 #ifndef arch_ptrace_stop
312 
325 #define arch_ptrace_stop(code, info) do { } while (0)
326 #endif
327 
328 #ifndef current_pt_regs
329 #define current_pt_regs() task_pt_regs(current)
330 #endif
331 
332 extern int task_current_syscall(struct task_struct *target, long *callno,
333  unsigned long args[6], unsigned int maxargs,
334  unsigned long *sp, unsigned long *pc);
335 
336 #ifdef CONFIG_HAVE_HW_BREAKPOINT
337 extern int ptrace_get_breakpoints(struct task_struct *tsk);
338 extern void ptrace_put_breakpoints(struct task_struct *tsk);
339 #else
340 static inline void ptrace_put_breakpoints(struct task_struct *tsk) { }
341 #endif /* CONFIG_HAVE_HW_BREAKPOINT */
342 
343 #endif