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; }