aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-02-06 04:37:37 -0500
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2008-02-06 13:41:07 -0500
commit1a669c2f16d478cb7f4452e5fb8d09320831f4a1 (patch)
treeb13f0aa0aebc51d1795203658053484b7c97b8cb
parent941d2380e979dfefb6c824452e9f42be3ef948ee (diff)
Add arch_ptrace_stop
This adds support to allow asm/ptrace.h to define two new macros, arch_ptrace_stop_needed and arch_ptrace_stop. These control special machine-specific actions to be done before a ptrace stop. The new code compiles away to nothing when the new macros are not defined. This is the case on all machines to begin with. On ia64, these macros will be defined to solve the long-standing issue of ptrace vs register backing store. Signed-off-by: Roland McGrath <roland@redhat.com> Cc: Petr Tesarik <ptesarik@suse.cz> Cc: Tony Luck <tony.luck@intel.com> Cc: Matthew Wilcox <willy@debian.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--include/linux/ptrace.h35
-rw-r--r--kernel/signal.c33
2 files changed, 67 insertions, 1 deletions
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 515bff053de8..6ab80714a916 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -204,6 +204,41 @@ static inline void user_enable_block_step(struct task_struct *task)
204} 204}
205#endif /* arch_has_block_step */ 205#endif /* arch_has_block_step */
206 206
207#ifndef arch_ptrace_stop_needed
208/**
209 * arch_ptrace_stop_needed - Decide whether arch_ptrace_stop() should be called
210 * @code: current->exit_code value ptrace will stop with
211 * @info: siginfo_t pointer (or %NULL) for signal ptrace will stop with
212 *
213 * This is called with the siglock held, to decide whether or not it's
214 * necessary to release the siglock and call arch_ptrace_stop() with the
215 * same @code and @info arguments. It can be defined to a constant if
216 * arch_ptrace_stop() is never required, or always is. On machines where
217 * this makes sense, it should be defined to a quick test to optimize out
218 * calling arch_ptrace_stop() when it would be superfluous. For example,
219 * if the thread has not been back to user mode since the last stop, the
220 * thread state might indicate that nothing needs to be done.
221 */
222#define arch_ptrace_stop_needed(code, info) (0)
223#endif
224
225#ifndef arch_ptrace_stop
226/**
227 * arch_ptrace_stop - Do machine-specific work before stopping for ptrace
228 * @code: current->exit_code value ptrace will stop with
229 * @info: siginfo_t pointer (or %NULL) for signal ptrace will stop with
230 *
231 * This is called with no locks held when arch_ptrace_stop_needed() has
232 * just returned nonzero. It is allowed to block, e.g. for user memory
233 * access. The arch can have machine-specific work to be done before
234 * ptrace stops. On ia64, register backing store gets written back to user
235 * memory here. Since this can be costly (requires dropping the siglock),
236 * we only do it when the arch requires it for this particular stop, as
237 * indicated by arch_ptrace_stop_needed().
238 */
239#define arch_ptrace_stop(code, info) do { } while (0)
240#endif
241
207#endif 242#endif
208 243
209#endif 244#endif
diff --git a/kernel/signal.c b/kernel/signal.c
index e46971560fcb..5d30ff561847 100644
--- a/kernel/signal.c
+++ b/kernel/signal.c
@@ -1578,6 +1578,17 @@ static inline int may_ptrace_stop(void)
1578} 1578}
1579 1579
1580/* 1580/*
1581 * Return nonzero if there is a SIGKILL that should be waking us up.
1582 * Called with the siglock held.
1583 */
1584static int sigkill_pending(struct task_struct *tsk)
1585{
1586 return ((sigismember(&tsk->pending.signal, SIGKILL) ||
1587 sigismember(&tsk->signal->shared_pending.signal, SIGKILL)) &&
1588 !unlikely(sigismember(&tsk->blocked, SIGKILL)));
1589}
1590
1591/*
1581 * This must be called with current->sighand->siglock held. 1592 * This must be called with current->sighand->siglock held.
1582 * 1593 *
1583 * This should be the path for all ptrace stops. 1594 * This should be the path for all ptrace stops.
@@ -1590,6 +1601,26 @@ static inline int may_ptrace_stop(void)
1590 */ 1601 */
1591static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info) 1602static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info)
1592{ 1603{
1604 int killed = 0;
1605
1606 if (arch_ptrace_stop_needed(exit_code, info)) {
1607 /*
1608 * The arch code has something special to do before a
1609 * ptrace stop. This is allowed to block, e.g. for faults
1610 * on user stack pages. We can't keep the siglock while
1611 * calling arch_ptrace_stop, so we must release it now.
1612 * To preserve proper semantics, we must do this before
1613 * any signal bookkeeping like checking group_stop_count.
1614 * Meanwhile, a SIGKILL could come in before we retake the
1615 * siglock. That must prevent us from sleeping in TASK_TRACED.
1616 * So after regaining the lock, we must check for SIGKILL.
1617 */
1618 spin_unlock_irq(&current->sighand->siglock);
1619 arch_ptrace_stop(exit_code, info);
1620 spin_lock_irq(&current->sighand->siglock);
1621 killed = sigkill_pending(current);
1622 }
1623
1593 /* 1624 /*
1594 * If there is a group stop in progress, 1625 * If there is a group stop in progress,
1595 * we must participate in the bookkeeping. 1626 * we must participate in the bookkeeping.
@@ -1605,7 +1636,7 @@ static void ptrace_stop(int exit_code, int nostop_code, siginfo_t *info)
1605 spin_unlock_irq(&current->sighand->siglock); 1636 spin_unlock_irq(&current->sighand->siglock);
1606 try_to_freeze(); 1637 try_to_freeze();
1607 read_lock(&tasklist_lock); 1638 read_lock(&tasklist_lock);
1608 if (may_ptrace_stop()) { 1639 if (!unlikely(killed) && may_ptrace_stop()) {
1609 do_notify_parent_cldstop(current, CLD_TRAPPED); 1640 do_notify_parent_cldstop(current, CLD_TRAPPED);
1610 read_unlock(&tasklist_lock); 1641 read_unlock(&tasklist_lock);
1611 schedule(); 1642 schedule();