aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
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 /include/linux
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>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/ptrace.h35
1 files changed, 35 insertions, 0 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