Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


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