Subjective of course, but imho makes the code more readable.

No functional changes (I hope), PTRACE_SYSEMU/PTRACE_SYSEMU_SINGLESTEP
logic still waits for implementation.

Rewrite the code to use switch(request) instead of multiple "if" checks.
This also consolidates some ifdef's and kills is_xxx(request).

Also, factor our utrace_set_events() calls.

        static int ptrace_resume(struct utrace_engine *engine,
                                struct task_struct *tracee, long request, long 
data)
        {
                enum utrace_resume_action action;
                enum utrace_syscall_action syscall;
                unsigned long events;

                if (!valid_signal(data))
                        return -EIO;

                syscall = UTRACE_SYSCALL_RUN;
                events  = engine->flags & ~UTRACE_EVENT_SYSCALL;
                action  = UTRACE_RESUME;

                switch (request) {
        #ifdef PTRACE_SINGLEBLOCK
                case PTRACE_SINGLEBLOCK:
                        if (unlikely(!arch_has_block_step()))
                                return -EIO;
                        action = UTRACE_BLOCKSTEP;
                        break;
        #endif

        #ifdef PTRACE_SINGLESTEP
                case PTRACE_SINGLESTEP:
                        if (unlikely(!arch_has_single_step()))
                                return -EIO;
                        action = UTRACE_SINGLESTEP;
                        break;
        #endif

        #ifdef PTRACE_SYSEMU
                case PTRACE_SYSEMU_SINGLESTEP:
                        if (unlikely(!arch_has_single_step()))
                                return -EIO;
                        action = UTRACE_SINGLESTEP;
                case PTRACE_SYSEMU:
                        syscall = UTRACE_SYSCALL_ABORT;
                        /* fallthrough */
        #endif

                case PTRACE_SYSCALL:
                        events |= UTRACE_EVENT_SYSCALL;
                        break;
                }

                if (events != engine->flags &&
                                utrace_set_events(tracee, engine, events))
                        return -ESRCH;

                do_ptrace_resume(engine, tracee, action, request, data);
                return 0;
        }

---

 kernel/ptrace.c |   78 +++++++++++++++++++++++++-------------------------------
 1 file changed, 35 insertions(+), 43 deletions(-)

--- PU/kernel/ptrace.c~102_RESUME_CLEANUP_REQUEST_PROCESSING    2009-10-18 
18:34:55.000000000 +0200
+++ PU/kernel/ptrace.c  2009-10-18 18:35:30.000000000 +0200
@@ -882,24 +882,6 @@ static int ptrace_rw_siginfo(struct task
        }
 }
 
-#ifdef PTRACE_SINGLESTEP
-#define is_singlestep(request)         ((request) == PTRACE_SINGLESTEP)
-#else
-#define is_singlestep(request)         0
-#endif
-
-#ifdef PTRACE_SINGLEBLOCK
-#define is_singleblock(request)                ((request) == 
PTRACE_SINGLEBLOCK)
-#else
-#define is_singleblock(request)                0
-#endif
-
-#ifdef PTRACE_SYSEMU
-#define is_sysemu_singlestep(request)  ((request) == PTRACE_SYSEMU_SINGLESTEP)
-#else
-#define is_sysemu_singlestep(request)  0
-#endif
-
 static void do_ptrace_notify_stop(struct ptrace_context *context,
                                        struct task_struct *tracee)
 {
@@ -1022,47 +1004,57 @@ static void do_ptrace_resume(struct utra
 }
 
 static int ptrace_resume(struct utrace_engine *engine,
-                       struct task_struct *child, long request, long data)
+                       struct task_struct *tracee, long request, long data)
 {
        enum utrace_resume_action action;
        enum utrace_syscall_action syscall;
-       int ret = 0;
+       unsigned long events;
 
        if (!valid_signal(data))
                return -EIO;
 
        syscall = UTRACE_SYSCALL_RUN;
-#ifdef PTRACE_SYSEMU
-       if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP)
-               syscall = UTRACE_SYSCALL_ABORT;
-#endif
-
-       if (syscall != UTRACE_SYSCALL_RUN || request == PTRACE_SYSCALL) {
-               if (!(engine->flags & UTRACE_EVENT_SYSCALL) &&
-                   utrace_set_events(child, engine,
-                                     engine->flags | UTRACE_EVENT_SYSCALL))
-                       ret = -ESRCH;
-       } else if (engine->flags & UTRACE_EVENT(SYSCALL_ENTRY)) {
-               if (utrace_set_events(child, engine,
-                                     engine->flags & ~UTRACE_EVENT_SYSCALL))
-                       ret = -ESRCH;
-       }
+       events  = engine->flags & ~UTRACE_EVENT_SYSCALL;
+       action  = UTRACE_RESUME;
 
-       action = UTRACE_RESUME;
-       if (is_singleblock(request)) {
+       switch (request) {
+#ifdef PTRACE_SINGLEBLOCK
+       case PTRACE_SINGLEBLOCK:
                if (unlikely(!arch_has_block_step()))
-                       ret = -EIO;
+                       return -EIO;
                action = UTRACE_BLOCKSTEP;
-       } else if (is_singlestep(request) || is_sysemu_singlestep(request)) {
+               break;
+#endif
+
+#ifdef PTRACE_SINGLESTEP
+       case PTRACE_SINGLESTEP:
                if (unlikely(!arch_has_single_step()))
-                       ret = -EIO;
+                       return -EIO;
                action = UTRACE_SINGLESTEP;
+               break;
+#endif
+
+#ifdef PTRACE_SYSEMU
+       case PTRACE_SYSEMU_SINGLESTEP:
+               if (unlikely(!arch_has_single_step()))
+                       return -EIO;
+               action = UTRACE_SINGLESTEP;
+       case PTRACE_SYSEMU:
+               syscall = UTRACE_SYSCALL_ABORT;
+               /* fallthrough */
+#endif
+
+       case PTRACE_SYSCALL:
+               events |= UTRACE_EVENT_SYSCALL;
+               break;
        }
 
-       if (!ret)
-               do_ptrace_resume(engine, child, action, request, data);
+       if (events != engine->flags &&
+                       utrace_set_events(tracee, engine, events))
+               return -ESRCH;
 
-       return ret;
+       do_ptrace_resume(engine, tracee, action, request, data);
+       return 0;
 }
 
 int ptrace_request(struct task_struct *child, long request,

Reply via email to