-#include <linux/compiler.h> /* For unlikely. */
-#include <linux/sched.h> /* For struct task_struct. */
-#include <linux/vs_cvirt.h>
-#include <linux/vs_context.h>
-
-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);
-extern int ptrace_attach(struct task_struct *tsk);
-extern int ptrace_detach(struct task_struct *, unsigned int);
-extern void ptrace_disable(struct task_struct *);
-extern int ptrace_check_attach(struct task_struct *task, int kill);
-extern int ptrace_request(struct task_struct *child, long request, long addr, long data);
-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);
-
-static inline void ptrace_link(struct task_struct *child,
- struct task_struct *new_parent)
+/*
+ * Convenience function doing access to a single utrace_regset for ptrace.
+ * The offset and size are in bytes, giving the location in the regset data.
+ */
+extern int ptrace_regset_access(struct task_struct *child,
+ struct utrace_attached_engine *engine,
+ const struct utrace_regset_view *view,
+ int setno, unsigned long offset,
+ unsigned int size, void __user *data,
+ int write);
+
+/*
+ * Convenience wrapper for doing access to a whole utrace_regset for ptrace.
+ */
+static inline int ptrace_whole_regset(struct task_struct *child,
+ struct utrace_attached_engine *engine,
+ long data, int setno, int write)
+{
+ return ptrace_regset_access(child, engine, utrace_native_view(current),
+ setno, 0, -1, (void __user *)data, write);
+}
+
+/*
+ * Convenience function doing access to a single slot in a utrace_regset.
+ * The regno value gives a slot number plus regset->bias.
+ * The value accessed is regset->size bytes long.
+ */
+extern int ptrace_onereg_access(struct task_struct *child,
+ struct utrace_attached_engine *engine,
+ const struct utrace_regset_view *view,
+ int setno, unsigned long regno,
+ void __user *data, int write);
+
+
+/*
+ * An array of these describes the layout of the virtual struct user
+ * accessed by PEEKUSR/POKEUSR, or the structure used by GETREGS et al.
+ * The array is terminated by an element with .end of zero.
+ * An element describes the range [.start, .end) of struct user offsets,
+ * measured in bytes; it maps to the regset in the view's regsets array
+ * at the index given by .regset, at .offset bytes into that regset's data.
+ * If .regset is -1, then the [.start, .end) range reads as zero
+ * if .offset is zero, and is skipped on read (user's buffer unchanged)
+ * if .offset is -1.
+ */
+struct ptrace_layout_segment {
+ unsigned int start, end, regset, offset;
+};
+
+/*
+ * Convenience function for doing access to a ptrace compatibility layout.
+ * The offset and size are in bytes.
+ */
+extern int ptrace_layout_access(struct task_struct *child,
+ struct utrace_attached_engine *engine,
+ const struct utrace_regset_view *view,
+ const struct ptrace_layout_segment layout[],
+ unsigned long offset, unsigned int size,
+ void __user *data, void *kdata, int write);
+
+
+/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */
+static inline int ptrace_peekusr(struct task_struct *child,
+ struct utrace_attached_engine *engine,
+ const struct ptrace_layout_segment layout[],
+ unsigned long addr, long data)
+{
+ return ptrace_layout_access(child, engine, utrace_native_view(current),
+ layout, addr, sizeof(long),
+ (unsigned long __user *)data, NULL, 0);
+}
+
+/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */
+static inline int ptrace_pokeusr(struct task_struct *child,
+ struct utrace_attached_engine *engine,
+ const struct ptrace_layout_segment layout[],
+ unsigned long addr, long data)
+{
+ return ptrace_layout_access(child, engine, utrace_native_view(current),
+ layout, addr, sizeof(long),
+ NULL, &data, 1);
+}
+
+#ifdef CONFIG_COMPAT
+/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */
+static inline int ptrace_compat_peekusr(
+ struct task_struct *child, struct utrace_attached_engine *engine,
+ const struct ptrace_layout_segment layout[],
+ compat_ulong_t addr, compat_ulong_t data)
+{
+ compat_ulong_t *udata = (compat_ulong_t __user *) (unsigned long) data;
+ return ptrace_layout_access(child, engine, utrace_native_view(current),
+ layout, addr, sizeof(compat_ulong_t),
+ udata, NULL, 0);
+}
+
+/* Convenience wrapper for the common PTRACE_PEEKUSR implementation. */
+static inline int ptrace_compat_pokeusr(
+ struct task_struct *child, struct utrace_attached_engine *engine,
+ const struct ptrace_layout_segment layout[],
+ compat_ulong_t addr, compat_ulong_t data)
+{
+ return ptrace_layout_access(child, engine, utrace_native_view(current),
+ layout, addr, sizeof(compat_ulong_t),
+ NULL, &data, 1);
+}
+#endif
+
+
+/*
+ * Called in copy_process.
+ */
+static inline void ptrace_init_task(struct task_struct *tsk)