diff options
author | Roland McGrath <roland@redhat.com> | 2008-03-14 20:46:38 -0400 |
---|---|---|
committer | Roland McGrath <roland@redhat.com> | 2008-07-26 17:37:59 -0400 |
commit | 36a033082b5243d45d508c5ccd47a754edbc6821 (patch) | |
tree | 5713fa16a1681092936409e3a372c27421778555 /arch/x86/kernel/signal_64.c | |
parent | a048d3aff8b828b6c0fa7ddd90a531248ab4e0f9 (diff) |
x86: tracehook_signal_handler
This makes the x86 signal handling code use tracehook_signal_handler() in
place of calling into ptrace guts. The call is moved after the sa_mask
processing, but there is no other change. This cleanup doesn't matter to
existing debuggers, but is the sensible thing: have all facets of the
handler setup complete before the debugger inspects the task again.
Signed-off-by: Roland McGrath <roland@redhat.com>
Diffstat (limited to 'arch/x86/kernel/signal_64.c')
-rw-r--r-- | arch/x86/kernel/signal_64.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/arch/x86/kernel/signal_64.c b/arch/x86/kernel/signal_64.c index b45ef8ddd651..3beb2db88c5a 100644 --- a/arch/x86/kernel/signal_64.c +++ b/arch/x86/kernel/signal_64.c | |||
@@ -15,6 +15,7 @@ | |||
15 | #include <linux/errno.h> | 15 | #include <linux/errno.h> |
16 | #include <linux/wait.h> | 16 | #include <linux/wait.h> |
17 | #include <linux/ptrace.h> | 17 | #include <linux/ptrace.h> |
18 | #include <linux/tracehook.h> | ||
18 | #include <linux/unistd.h> | 19 | #include <linux/unistd.h> |
19 | #include <linux/stddef.h> | 20 | #include <linux/stddef.h> |
20 | #include <linux/personality.h> | 21 | #include <linux/personality.h> |
@@ -444,8 +445,6 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
444 | * handler too. | 445 | * handler too. |
445 | */ | 446 | */ |
446 | regs->flags &= ~X86_EFLAGS_TF; | 447 | regs->flags &= ~X86_EFLAGS_TF; |
447 | if (test_thread_flag(TIF_SINGLESTEP)) | ||
448 | ptrace_notify(SIGTRAP); | ||
449 | 448 | ||
450 | spin_lock_irq(¤t->sighand->siglock); | 449 | spin_lock_irq(¤t->sighand->siglock); |
451 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); | 450 | sigorsets(¤t->blocked,¤t->blocked,&ka->sa.sa_mask); |
@@ -453,6 +452,9 @@ handle_signal(unsigned long sig, siginfo_t *info, struct k_sigaction *ka, | |||
453 | sigaddset(¤t->blocked,sig); | 452 | sigaddset(¤t->blocked,sig); |
454 | recalc_sigpending(); | 453 | recalc_sigpending(); |
455 | spin_unlock_irq(¤t->sighand->siglock); | 454 | spin_unlock_irq(¤t->sighand->siglock); |
455 | |||
456 | tracehook_signal_handler(sig, info, ka, regs, | ||
457 | test_thread_flag(TIF_SINGLESTEP)); | ||
456 | } | 458 | } |
457 | 459 | ||
458 | return ret; | 460 | return ret; |