1c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef _LINUX_PTRACE_H 2c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define _LINUX_PTRACE_H 3c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* ptrace.h */ 4c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* structs and defines to help the user use the ptrace system call. */ 5c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 6c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* has the defines to get at the registers. */ 7c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 8c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_TRACEME 0 9c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_PEEKTEXT 1 10c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_PEEKDATA 2 11c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_PEEKUSR 3 12c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_POKETEXT 4 13c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_POKEDATA 5 14c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_POKEUSR 6 15c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_CONT 7 16c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_KILL 8 17c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_SINGLESTEP 9 18c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 19c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_ATTACH 0x10 20c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_DETACH 0x11 21c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 22c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_SYSCALL 24 23c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 24c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 0x4200-0x4300 are reserved for architecture-independent additions. */ 25c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_SETOPTIONS 0x4200 26c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_GETEVENTMSG 0x4201 27c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_GETSIGINFO 0x4202 28c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_SETSIGINFO 0x4203 29c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 30c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* options set using PTRACE_SETOPTIONS */ 31c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_TRACESYSGOOD 0x00000001 32c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_TRACEFORK 0x00000002 33c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_TRACEVFORK 0x00000004 34c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_TRACECLONE 0x00000008 35c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_TRACEEXEC 0x00000010 36c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_TRACEVFORKDONE 0x00000020 37c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_TRACEEXIT 0x00000040 38c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 39c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_O_MASK 0x0000007f 40c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 41c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* Wait extended result codes for the above trace options. */ 42c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_EVENT_FORK 1 43c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_EVENT_VFORK 2 44c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_EVENT_CLONE 3 45c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_EVENT_EXEC 4 46c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_EVENT_VFORK_DONE 5 47c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PTRACE_EVENT_EXIT 6 48c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 49c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <asm/ptrace.h> 50c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 51c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifdef __KERNEL__ 52c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 53c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * Ptrace flags 54c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * 55c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * The owner ship rules for task->ptrace which holds the ptrace 56c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * flags is simple. When a task is running it owns it's task->ptrace 57c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * flags. When the a task is stopped the ptracer owns task->ptrace. 58c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 59c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 60c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_PTRACED 0x00000001 61c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */ 62c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACESYSGOOD 0x00000004 63c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_PTRACE_CAP 0x00000008 /* ptracer can follow suid-exec */ 64c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACE_FORK 0x00000010 65c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACE_VFORK 0x00000020 66c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACE_CLONE 0x00000040 67c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACE_EXEC 0x00000080 68c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACE_VFORK_DONE 0x00000100 69c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACE_EXIT 0x00000200 70c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_ATTACHED 0x00000400 /* parent != real_parent */ 71c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 72c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_TRACE_MASK 0x000003f4 73c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 74c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* single stepping state bits (used on ARM and PA-RISC) */ 75c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_SINGLESTEP_BIT 31 76c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_SINGLESTEP (1<<PT_SINGLESTEP_BIT) 77c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_BLOCKSTEP_BIT 30 78c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define PT_BLOCKSTEP (1<<PT_BLOCKSTEP_BIT) 79c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 80c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/compiler.h> /* For unlikely. */ 81c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#include <linux/sched.h> /* For struct task_struct. */ 82c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 83c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 84c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern long arch_ptrace(struct task_struct *child, long request, long addr, long data); 85c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern struct task_struct *ptrace_get_task_struct(pid_t pid); 86c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_traceme(void); 87c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); 88c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); 89c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_attach(struct task_struct *tsk); 90c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_detach(struct task_struct *, unsigned int); 91c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void ptrace_disable(struct task_struct *); 92c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_check_attach(struct task_struct *task, int kill); 93c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_request(struct task_struct *child, long request, long addr, long data); 94c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void ptrace_notify(int exit_code); 95c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __ptrace_link(struct task_struct *child, 96c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct task_struct *new_parent); 97c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void __ptrace_unlink(struct task_struct *child); 98c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern void ptrace_untrace(struct task_struct *child); 99c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queruextern int ptrace_may_attach(struct task_struct *task); 100c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 101c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void ptrace_link(struct task_struct *child, 102c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru struct task_struct *new_parent) 103c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 104c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(child->ptrace)) 105c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ptrace_link(child, new_parent); 106c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 107c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Querustatic inline void ptrace_unlink(struct task_struct *child) 108c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru{ 109c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru if (unlikely(child->ptrace)) 110c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru __ptrace_unlink(child); 111c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru} 112c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 113c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 114c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#ifndef force_successful_syscall_return 115c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru/* 116c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * System call handlers that, upon successful completion, need to return a 117c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * negative value should call force_successful_syscall_return() right before 118c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * returning. On architectures where the syscall convention provides for a 119c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * separate error flag (e.g., alpha, ia64, ppc{,64}, sparc{,64}, possibly 120c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * others), this macro can be used to ensure that the error flag will not get 121c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * set. On architectures which do not support a separate error flag, the macro 122c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * is a no-op and the spurious error condition needs to be filtered out by some 123c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * other means (e.g., in user-level, by passing an extra argument to the 124c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru * syscall handler, or something along those lines). 125c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru */ 126c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#define force_successful_syscall_return() do { } while (0) 127c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 128c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 129c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 130c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru 131c559cd81139f97cecad1ad91a0b2e25a5936d53Jean-Baptiste Queru#endif 132