Change ptrace_report_syscall_entry() to use ptrace_event.

I am worried about PTRACE_SYSEMU, I continue to ignore this magic
which I don't understand yet... Hopefully I will be able to add the
necessary changes later.

---

 kernel/ptrace.c |   57 ++++++++++++++++++--------------------------------------
 1 file changed, 19 insertions(+), 38 deletions(-)

--- PU/kernel/ptrace.c~35_SYSCALL_ENTRY 2009-09-15 14:49:47.000000000 +0200
+++ PU/kernel/ptrace.c  2009-09-15 15:45:47.000000000 +0200
@@ -141,12 +141,6 @@ static enum utrace_resume_action ptrace_
        return UTRACE_RESUME - ((task->ptrace >> 16) & UTRACE_RESUME_MASK);
 }
 
-static enum utrace_syscall_action ptrace_syscall_action(
-       struct task_struct *task)
-{
-       return (task->ptrace >> 16) & UTRACE_SYSCALL_MASK;
-}
-
 /*
  * Remember which event stop this was.  We have to keep a record that
  * won't be wiped by ptrace_do_wait() when @task->exit_code is cleared.
@@ -314,31 +308,6 @@ static u32 ptrace_report_clone(enum utra
        return ret;
 }
 
-static u32 ptrace_report_syscall(u32 action, struct utrace_engine *engine,
-                                       struct task_struct *task)
-{
-       struct ptrace_context *context = ptrace_context(engine);
-       int code = SIGTRAP;
-       if (context->options & PTRACE_O_TRACESYSGOOD)
-               code |= 0x80;
-       return utrace_ptrace_report(action, task, PTRACE_EVENT_SYSCALL, code);
-}
-
-static u32 ptrace_report_syscall_entry(u32 action,
-                                      struct utrace_engine *engine,
-                                      struct task_struct *task,
-                                      struct pt_regs *regs)
-{
-       /*
-        * If we're doing PTRACE_SYSEMU, just punt here and report
-        * at the exit stop instead.
-        */
-       if (ptrace_syscall_action(task))
-               return UTRACE_SYSCALL_ABORT | UTRACE_RESUME;
-
-       return ptrace_report_syscall(UTRACE_SYSCALL_RUN, engine, task);
-}
-
 static void ptrace_resume_syscall(struct utrace_engine *engine,
                                struct task_struct *tracee, long data)
 {
@@ -351,18 +320,30 @@ static void ptrace_resume_syscall(struct
        }
 }
 
-static u32 ptrace_report_syscall_exit(enum utrace_resume_action action,
-                                     struct utrace_engine *engine,
-                                     struct task_struct *task,
-                                     struct pt_regs *regs)
+static void push_syscall_event(struct ptrace_context *context)
 {
-       struct ptrace_context *context = ptrace_context(engine);
-       struct ptrace_event *ev;
+       struct ptrace_event *ev = ev_push(context);
 
-       ev = ev_push(context);
        ev->ev_resume = ptrace_resume_syscall;
        ev->ev_code = (context->options & PTRACE_O_TRACESYSGOOD) ?
                        (SIGTRAP | 0x80) : SIGTRAP;
+}
+
+static u32 ptrace_report_syscall_entry(u32 action,
+                                      struct utrace_engine *engine,
+                                      struct task_struct *task,
+                                      struct pt_regs *regs)
+{
+       push_syscall_event(ptrace_context(engine));
+       return UTRACE_SYSCALL_RUN | UTRACE_STOP;
+}
+
+static u32 ptrace_report_syscall_exit(enum utrace_resume_action action,
+                                     struct utrace_engine *engine,
+                                     struct task_struct *task,
+                                     struct pt_regs *regs)
+{
+       push_syscall_event(ptrace_context(engine));
        return UTRACE_STOP;
 }
 

Reply via email to