By the previous discussion, revert 603e19c41ba5c97e48a25543c63c081c5fe64137
for now.

But keep WARN_ON(resume != XXX_STEP), it may help.

---

 kernel/ptrace.c |   14 ++++++--------
 1 file changed, 6 insertions(+), 8 deletions(-)

--- PU/kernel/ptrace.c~130_REVERT_KILL_PTRACE_EVENT_SIGTRAP     2009-11-02 
06:54:49.000000000 +0100
+++ PU/kernel/ptrace.c  2009-11-13 22:34:23.000000000 +0100
@@ -73,7 +73,8 @@ struct ptrace_context {
 
 #define PTRACE_EVENT_SYSCALL_ENTRY     (1 << 16)
 #define PTRACE_EVENT_SYSCALL_EXIT      (2 << 16)
-#define PTRACE_EVENT_SIGNAL            (3 << 16)
+#define PTRACE_EVENT_SIGTRAP           (3 << 16)
+#define PTRACE_EVENT_SIGNAL            (4 << 16)
 /* events visible to user-space */
 #define PTRACE_EVENT_MASK              0xFFFF
 
@@ -526,10 +527,10 @@ static u32 ptrace_report_signal(u32 acti
                if (resume != UTRACE_RESUME) {
                        WARN_ON(resume != UTRACE_BLOCKSTEP &&
                                resume != UTRACE_SINGLESTEP);
-                       WARN_ON(ctx->signr);
-                       ctx->signr = SIGTRAP;
+
+                       set_stop_code(ctx, PTRACE_EVENT_SIGTRAP);
+                       return UTRACE_STOP | UTRACE_SIGNAL_IGN;
                }
-               /* fallthrough */
 
        case UTRACE_SIGNAL_REPORT:
                if (!ctx->siginfo) {
@@ -537,10 +538,7 @@ static u32 ptrace_report_signal(u32 acti
                                return resume | UTRACE_SIGNAL_IGN;
 
                        WARN_ON(ctx->signr != SIGTRAP);
-                       /*
-                        * set by ptrace_resume(PTRACE_EVENT_SYSCALL_EXIT) or
-                        * by UTRACE_SIGNAL_HANDLER above.
-                        */
+                       /* set by ptrace_resume(PTRACE_EVENT_SYSCALL_EXIT) */
                        fill_sigtrap_info(task, info);
                        break;
                }

Reply via email to