Blame view
include/linux/ptrace.h
14.3 KB
1da177e4c Linux-2.6.12-rc2 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#ifndef _LINUX_PTRACE_H #define _LINUX_PTRACE_H /* ptrace.h */ /* structs and defines to help the user use the ptrace system call. */ /* has the defines to get at the registers. */ #define PTRACE_TRACEME 0 #define PTRACE_PEEKTEXT 1 #define PTRACE_PEEKDATA 2 #define PTRACE_PEEKUSR 3 #define PTRACE_POKETEXT 4 #define PTRACE_POKEDATA 5 #define PTRACE_POKEUSR 6 #define PTRACE_CONT 7 #define PTRACE_KILL 8 #define PTRACE_SINGLESTEP 9 |
416bc5129 [PATCH] Use decim... |
18 19 |
#define PTRACE_ATTACH 16 #define PTRACE_DETACH 17 |
1da177e4c Linux-2.6.12-rc2 |
20 21 22 23 24 25 26 27 |
#define PTRACE_SYSCALL 24 /* 0x4200-0x4300 are reserved for architecture-independent additions. */ #define PTRACE_SETOPTIONS 0x4200 #define PTRACE_GETEVENTMSG 0x4201 #define PTRACE_GETSIGINFO 0x4202 #define PTRACE_SETSIGINFO 0x4203 |
2225a122a ptrace: Add suppo... |
28 29 30 |
/* * Generic ptrace interface that exports the architecture specific regsets * using the corresponding NT_* types (which are also used in the core dump). |
c6a0dd7ec ptrace: Fix ptrac... |
31 32 33 34 35 |
* Please note that the NT_PRSTATUS note type in a core dump contains a full * 'struct elf_prstatus'. But the user_regset for NT_PRSTATUS contains just the * elf_gregset_t that is the pr_reg field of 'struct elf_prstatus'. For all the * other user_regset flavors, the user_regset layout and the ELF core dump note * payload are exactly the same layout. |
2225a122a ptrace: Add suppo... |
36 37 38 39 40 41 42 43 44 45 46 |
* * This interface usage is as follows: * struct iovec iov = { buf, len}; * * ret = ptrace(PTRACE_GETREGSET/PTRACE_SETREGSET, pid, NT_XXX_TYPE, &iov); * * On the successful completion, iov.len will be updated by the kernel, * specifying how much the kernel has written/read to/from the user's iov.buf. */ #define PTRACE_GETREGSET 0x4204 #define PTRACE_SETREGSET 0x4205 |
3544d72a0 ptrace: implement... |
47 |
#define PTRACE_SEIZE 0x4206 |
fca26f260 ptrace: implement... |
48 |
#define PTRACE_INTERRUPT 0x4207 |
544b2c91a ptrace: implement... |
49 |
#define PTRACE_LISTEN 0x4208 |
3544d72a0 ptrace: implement... |
50 51 52 |
/* flags in @data for PTRACE_SEIZE */ #define PTRACE_SEIZE_DEVEL 0x80000000 /* temp flag for development */ |
1da177e4c Linux-2.6.12-rc2 |
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
/* options set using PTRACE_SETOPTIONS */ #define PTRACE_O_TRACESYSGOOD 0x00000001 #define PTRACE_O_TRACEFORK 0x00000002 #define PTRACE_O_TRACEVFORK 0x00000004 #define PTRACE_O_TRACECLONE 0x00000008 #define PTRACE_O_TRACEEXEC 0x00000010 #define PTRACE_O_TRACEVFORKDONE 0x00000020 #define PTRACE_O_TRACEEXIT 0x00000040 #define PTRACE_O_MASK 0x0000007f /* Wait extended result codes for the above trace options. */ #define PTRACE_EVENT_FORK 1 #define PTRACE_EVENT_VFORK 2 #define PTRACE_EVENT_CLONE 3 #define PTRACE_EVENT_EXEC 4 #define PTRACE_EVENT_VFORK_DONE 5 #define PTRACE_EVENT_EXIT 6 |
3544d72a0 ptrace: implement... |
71 |
#define PTRACE_EVENT_STOP 7 |
1da177e4c Linux-2.6.12-rc2 |
72 73 74 75 76 77 |
#include <asm/ptrace.h> #ifdef __KERNEL__ /* * Ptrace flags |
260ea1013 [PATCH] ptrace: d... |
78 79 80 81 |
* * The owner ship rules for task->ptrace which holds the ptrace * flags is simple. When a task is running it owns it's task->ptrace * flags. When the a task is stopped the ptracer owns task->ptrace. |
1da177e4c Linux-2.6.12-rc2 |
82 |
*/ |
3544d72a0 ptrace: implement... |
83 |
#define PT_SEIZED 0x00010000 /* SEIZE used, enable new behavior */ |
1da177e4c Linux-2.6.12-rc2 |
84 85 86 87 |
#define PT_PTRACED 0x00000001 #define PT_DTRACE 0x00000002 /* delayed trace (used on m68k, i386) */ #define PT_TRACESYSGOOD 0x00000004 #define PT_PTRACE_CAP 0x00000008 /* ptracer can follow suid-exec */ |
643ad8388 ptrace: introduce... |
88 89 90 91 92 93 94 95 96 97 98 |
/* PT_TRACE_* event enable flags */ #define PT_EVENT_FLAG_SHIFT 4 #define PT_EVENT_FLAG(event) (1 << (PT_EVENT_FLAG_SHIFT + (event) - 1)) #define PT_TRACE_FORK PT_EVENT_FLAG(PTRACE_EVENT_FORK) #define PT_TRACE_VFORK PT_EVENT_FLAG(PTRACE_EVENT_VFORK) #define PT_TRACE_CLONE PT_EVENT_FLAG(PTRACE_EVENT_CLONE) #define PT_TRACE_EXEC PT_EVENT_FLAG(PTRACE_EVENT_EXEC) #define PT_TRACE_VFORK_DONE PT_EVENT_FLAG(PTRACE_EVENT_VFORK_DONE) #define PT_TRACE_EXIT PT_EVENT_FLAG(PTRACE_EVENT_EXIT) |
1da177e4c Linux-2.6.12-rc2 |
99 100 101 102 103 104 105 106 107 108 109 |
#define PT_TRACE_MASK 0x000003f4 /* single stepping state bits (used on ARM and PA-RISC) */ #define PT_SINGLESTEP_BIT 31 #define PT_SINGLESTEP (1<<PT_SINGLESTEP_BIT) #define PT_BLOCKSTEP_BIT 30 #define PT_BLOCKSTEP (1<<PT_BLOCKSTEP_BIT) #include <linux/compiler.h> /* For unlikely. */ #include <linux/sched.h> /* For struct task_struct. */ |
481bed454 [PATCH] consolida... |
110 |
|
9b05a69e0 ptrace: change si... |
111 112 |
extern long arch_ptrace(struct task_struct *child, long request, unsigned long addr, unsigned long data); |
1da177e4c Linux-2.6.12-rc2 |
113 114 |
extern int ptrace_readdata(struct task_struct *tsk, unsigned long src, char __user *dst, int len); extern int ptrace_writedata(struct task_struct *tsk, char __user *src, unsigned long dst, int len); |
1da177e4c Linux-2.6.12-rc2 |
115 |
extern void ptrace_disable(struct task_struct *); |
755e276b3 ptrace: ptrace_ch... |
116 |
extern int ptrace_check_attach(struct task_struct *task, bool ignore_state); |
4abf98696 ptrace: change si... |
117 118 |
extern int ptrace_request(struct task_struct *child, long request, unsigned long addr, unsigned long data); |
1da177e4c Linux-2.6.12-rc2 |
119 120 121 122 |
extern void ptrace_notify(int exit_code); extern void __ptrace_link(struct task_struct *child, struct task_struct *new_parent); extern void __ptrace_unlink(struct task_struct *child); |
39c626ae4 forget_original_p... |
123 |
extern void exit_ptrace(struct task_struct *tracer); |
69f594a38 ptrace: do not au... |
124 125 126 |
#define PTRACE_MODE_READ 0x01 #define PTRACE_MODE_ATTACH 0x02 #define PTRACE_MODE_NOAUDIT 0x04 |
006ebb40d Security: split p... |
127 128 129 130 |
/* Returns 0 on success, -errno on denial. */ extern int __ptrace_may_access(struct task_struct *task, unsigned int mode); /* Returns true on success, false on denial. */ extern bool ptrace_may_access(struct task_struct *task, unsigned int mode); |
1da177e4c Linux-2.6.12-rc2 |
131 |
|
53b6f9fbd ptrace: introduce... |
132 133 |
static inline int ptrace_reparented(struct task_struct *child) { |
0347e1773 ptrace: ptrace_re... |
134 |
return !same_thread_group(child->real_parent, child->parent); |
53b6f9fbd ptrace: introduce... |
135 |
} |
c6a47cc2c ptrace: cleanup p... |
136 |
|
1da177e4c Linux-2.6.12-rc2 |
137 138 139 140 141 |
static inline void ptrace_unlink(struct task_struct *child) { if (unlikely(child->ptrace)) __ptrace_unlink(child); } |
4abf98696 ptrace: change si... |
142 143 144 145 |
int generic_ptrace_peekdata(struct task_struct *tsk, unsigned long addr, unsigned long data); int generic_ptrace_pokedata(struct task_struct *tsk, unsigned long addr, unsigned long data); |
1da177e4c Linux-2.6.12-rc2 |
146 |
|
88ac2921a tracehook: add li... |
147 |
/** |
06d984737 ptrace: s/traceho... |
148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 |
* ptrace_parent - return the task that is tracing the given task * @task: task to consider * * Returns %NULL if no one is tracing @task, or the &struct task_struct * pointer to its tracer. * * Must called under rcu_read_lock(). The pointer returned might be kept * live only by RCU. During exec, this may be called with task_lock() held * on @task, still held from when check_unsafe_exec() was called. */ static inline struct task_struct *ptrace_parent(struct task_struct *task) { if (unlikely(task->ptrace)) return rcu_dereference(task->parent); return NULL; } /** |
643ad8388 ptrace: introduce... |
166 167 168 169 170 171 172 173 174 175 176 177 178 179 |
* ptrace_event_enabled - test whether a ptrace event is enabled * @task: ptracee of interest * @event: %PTRACE_EVENT_* to test * * Test whether @event is enabled for ptracee @task. * * Returns %true if @event is enabled, %false otherwise. */ static inline bool ptrace_event_enabled(struct task_struct *task, int event) { return task->ptrace & PT_EVENT_FLAG(event); } /** |
88ac2921a tracehook: add li... |
180 |
* ptrace_event - possibly stop for a ptrace event notification |
643ad8388 ptrace: introduce... |
181 |
* @event: %PTRACE_EVENT_* value to report |
88ac2921a tracehook: add li... |
182 183 |
* @message: value for %PTRACE_GETEVENTMSG to return * |
643ad8388 ptrace: introduce... |
184 185 |
* Check whether @event is enabled and, if so, report @event and @message * to the ptrace parent. |
88ac2921a tracehook: add li... |
186 |
* |
88ac2921a tracehook: add li... |
187 188 |
* Called without locks. */ |
f3c04b934 ptrace: move SIGT... |
189 |
static inline void ptrace_event(int event, unsigned long message) |
88ac2921a tracehook: add li... |
190 |
{ |
f3c04b934 ptrace: move SIGT... |
191 192 193 194 195 196 197 |
if (unlikely(ptrace_event_enabled(current, event))) { current->ptrace_message = message; ptrace_notify((event << 8) | SIGTRAP); } else if (event == PTRACE_EVENT_EXEC && unlikely(current->ptrace)) { /* legacy EXEC report via SIGTRAP */ send_sig(SIGTRAP, current, 0); } |
88ac2921a tracehook: add li... |
198 |
} |
09a05394f tracehook: clone |
199 200 201 202 203 204 205 206 207 208 209 210 211 212 |
/** * ptrace_init_task - initialize ptrace state for a new child * @child: new child task * @ptrace: true if child should be ptrace'd by parent's tracer * * This is called immediately after adding @child to its parent's children * list. @ptrace is false in the normal case, and true to ptrace @child. * * Called with current's siglock and write_lock_irq(&tasklist_lock) held. */ static inline void ptrace_init_task(struct task_struct *child, bool ptrace) { INIT_LIST_HEAD(&child->ptrace_entry); INIT_LIST_HEAD(&child->ptraced); |
6634ae103 ptrace_init_task:... |
213 214 215 216 |
#ifdef CONFIG_HAVE_HW_BREAKPOINT atomic_set(&child->ptrace_bp_refcnt, 1); #endif child->jobctl = 0; |
09a05394f tracehook: clone |
217 |
child->ptrace = 0; |
6634ae103 ptrace_init_task:... |
218 219 220 |
child->parent = child->real_parent; if (unlikely(ptrace) && current->ptrace) { |
09a05394f tracehook: clone |
221 |
child->ptrace = current->ptrace; |
c6a47cc2c ptrace: cleanup p... |
222 |
__ptrace_link(child, current->parent); |
dcace06cc ptrace: mv send-S... |
223 |
|
d184d6eb1 ptrace: dont send... |
224 225 226 227 |
if (child->ptrace & PT_SEIZED) task_set_jobctl_pending(child, JOBCTL_TRAP_STOP); else sigaddset(&child->pending.signal, SIGSTOP); |
dcace06cc ptrace: mv send-S... |
228 |
set_tsk_thread_flag(child, TIF_SIGPENDING); |
09a05394f tracehook: clone |
229 230 |
} } |
dae33574d tracehook: releas... |
231 232 233 234 235 236 237 238 239 240 241 242 |
/** * ptrace_release_task - final ptrace-related cleanup of a zombie being reaped * @task: task in %EXIT_DEAD state * * Called with write_lock(&tasklist_lock) held. */ static inline void ptrace_release_task(struct task_struct *task) { BUG_ON(!list_empty(&task->ptraced)); ptrace_unlink(task); BUG_ON(!list_empty(&task->ptrace_entry)); } |
1da177e4c Linux-2.6.12-rc2 |
243 244 245 246 247 248 249 250 251 252 253 254 255 256 |
#ifndef force_successful_syscall_return /* * System call handlers that, upon successful completion, need to return a * negative value should call force_successful_syscall_return() right before * returning. On architectures where the syscall convention provides for a * separate error flag (e.g., alpha, ia64, ppc{,64}, sparc{,64}, possibly * others), this macro can be used to ensure that the error flag will not get * set. On architectures which do not support a separate error flag, the macro * is a no-op and the spurious error condition needs to be filtered out by some * other means (e.g., in user-level, by passing an extra argument to the * syscall handler, or something along those lines). */ #define force_successful_syscall_return() do { } while (0) #endif |
fb7fa8f17 ptrace: arch_has_... |
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 |
/* * <asm/ptrace.h> should define the following things inside #ifdef __KERNEL__. * * These do-nothing inlines are used when the arch does not * implement single-step. The kerneldoc comments are here * to document the interface for all arch definitions. */ #ifndef arch_has_single_step /** * arch_has_single_step - does this CPU support user-mode single-step? * * If this is defined, then there must be function declarations or * inlines for user_enable_single_step() and user_disable_single_step(). * arch_has_single_step() should evaluate to nonzero iff the machine * supports instruction single-step for user mode. * It can be a constant or it can test a CPU feature bit. */ #define arch_has_single_step() (0) /** * user_enable_single_step - single-step in user-mode task * @task: either current or a task stopped in %TASK_TRACED * * This can only be called when arch_has_single_step() has returned nonzero. * Set @task so that when it returns to user mode, it will trap after the |
dc802c2d2 ptrace: arch_has_... |
283 284 |
* next single instruction executes. If arch_has_block_step() is defined, * this must clear the effects of user_enable_block_step() too. |
fb7fa8f17 ptrace: arch_has_... |
285 286 287 288 289 290 291 292 293 294 |
*/ static inline void user_enable_single_step(struct task_struct *task) { BUG(); /* This can never be called. */ } /** * user_disable_single_step - cancel user-mode single-step * @task: either current or a task stopped in %TASK_TRACED * |
dc802c2d2 ptrace: arch_has_... |
295 296 297 298 |
* Clear @task of the effects of user_enable_single_step() and * user_enable_block_step(). This can be called whether or not either * of those was ever called on @task, and even if arch_has_single_step() * returned zero. |
fb7fa8f17 ptrace: arch_has_... |
299 300 301 302 |
*/ static inline void user_disable_single_step(struct task_struct *task) { } |
dacbe41f7 ptrace: move user... |
303 304 305 |
#else extern void user_enable_single_step(struct task_struct *); extern void user_disable_single_step(struct task_struct *); |
fb7fa8f17 ptrace: arch_has_... |
306 |
#endif /* arch_has_single_step */ |
dc802c2d2 ptrace: arch_has_... |
307 308 309 310 311 312 313 314 315 316 |
#ifndef arch_has_block_step /** * arch_has_block_step - does this CPU support user-mode block-step? * * If this is defined, then there must be a function declaration or inline * for user_enable_block_step(), and arch_has_single_step() must be defined * too. arch_has_block_step() should evaluate to nonzero iff the machine * supports step-until-branch for user mode. It can be a constant or it * can test a CPU feature bit. */ |
5b88abbf7 ptrace: generic P... |
317 |
#define arch_has_block_step() (0) |
dc802c2d2 ptrace: arch_has_... |
318 319 320 321 322 323 324 325 326 327 328 329 330 331 |
/** * user_enable_block_step - step until branch in user-mode task * @task: either current or a task stopped in %TASK_TRACED * * This can only be called when arch_has_block_step() has returned nonzero, * and will never be called when single-instruction stepping is being used. * Set @task so that when it returns to user mode, it will trap after the * next branch or trap taken. */ static inline void user_enable_block_step(struct task_struct *task) { BUG(); /* This can never be called. */ } |
dacbe41f7 ptrace: move user... |
332 333 |
#else extern void user_enable_block_step(struct task_struct *); |
dc802c2d2 ptrace: arch_has_... |
334 |
#endif /* arch_has_block_step */ |
85ec7fd9f ptrace: introduce... |
335 336 337 338 339 340 341 342 343 344 345 |
#ifdef ARCH_HAS_USER_SINGLE_STEP_INFO extern void user_single_step_siginfo(struct task_struct *tsk, struct pt_regs *regs, siginfo_t *info); #else static inline void user_single_step_siginfo(struct task_struct *tsk, struct pt_regs *regs, siginfo_t *info) { memset(info, 0, sizeof(*info)); info->si_signo = SIGTRAP; } #endif |
1a669c2f1 Add arch_ptrace_stop |
346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 |
#ifndef arch_ptrace_stop_needed /** * arch_ptrace_stop_needed - Decide whether arch_ptrace_stop() should be called * @code: current->exit_code value ptrace will stop with * @info: siginfo_t pointer (or %NULL) for signal ptrace will stop with * * This is called with the siglock held, to decide whether or not it's * necessary to release the siglock and call arch_ptrace_stop() with the * same @code and @info arguments. It can be defined to a constant if * arch_ptrace_stop() is never required, or always is. On machines where * this makes sense, it should be defined to a quick test to optimize out * calling arch_ptrace_stop() when it would be superfluous. For example, * if the thread has not been back to user mode since the last stop, the * thread state might indicate that nothing needs to be done. */ #define arch_ptrace_stop_needed(code, info) (0) #endif #ifndef arch_ptrace_stop /** * arch_ptrace_stop - Do machine-specific work before stopping for ptrace * @code: current->exit_code value ptrace will stop with * @info: siginfo_t pointer (or %NULL) for signal ptrace will stop with * * This is called with no locks held when arch_ptrace_stop_needed() has * just returned nonzero. It is allowed to block, e.g. for user memory * access. The arch can have machine-specific work to be done before * ptrace stops. On ia64, register backing store gets written back to user * memory here. Since this can be costly (requires dropping the siglock), * we only do it when the arch requires it for this particular stop, as * indicated by arch_ptrace_stop_needed(). */ #define arch_ptrace_stop(code, info) do { } while (0) #endif |
bbc698636 task_current_syscall |
380 381 382 |
extern int task_current_syscall(struct task_struct *target, long *callno, unsigned long args[6], unsigned int maxargs, unsigned long *sp, unsigned long *pc); |
bf26c0184 ptrace: Prepare t... |
383 384 385 386 387 388 389 390 |
#ifdef CONFIG_HAVE_HW_BREAKPOINT extern int ptrace_get_breakpoints(struct task_struct *tsk); extern void ptrace_put_breakpoints(struct task_struct *tsk); #else static inline void ptrace_put_breakpoints(struct task_struct *tsk) { } #endif /* CONFIG_HAVE_HW_BREAKPOINT */ #endif /* __KERNEL */ |
1da177e4c Linux-2.6.12-rc2 |
391 392 |
#endif |