summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-01-30 13:30:53 +0100
committerIngo Molnar <mingo@elte.hu>2008-01-30 13:30:53 +0100
commit5b88abbf770a0e1975c668743100f42934f385e8 (patch)
treeae6af4df76e71682efb4d90620182bfaf541e9c8 /kernel
parentdc802c2d2e66e2d1544e023bfd4be6cdee48d57b (diff)
downloadlwn-5b88abbf770a0e1975c668743100f42934f385e8.tar.gz
lwn-5b88abbf770a0e1975c668743100f42934f385e8.zip
ptrace: generic PTRACE_SINGLEBLOCK
This makes ptrace_request handle PTRACE_SINGLEBLOCK along with PTRACE_CONT et al. The new generic code makes use of the arch_has_block_step macro and generic entry points on machines that define them. [ mingo@elte.hu: bugfix ] Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'kernel')
-rw-r--r--kernel/ptrace.c15
1 files changed, 14 insertions, 1 deletions
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index fad5f1e8511f..973d727f5e84 100644
--- a/kernel/ptrace.c
+++ b/kernel/ptrace.c
@@ -373,6 +373,12 @@ static int ptrace_setsiginfo(struct task_struct *child, siginfo_t __user * data)
#define is_singlestep(request) 0
#endif
+#ifdef PTRACE_SINGLEBLOCK
+#define is_singleblock(request) ((request) == PTRACE_SINGLEBLOCK)
+#else
+#define is_singleblock(request) 0
+#endif
+
#ifdef PTRACE_SYSEMU
#define is_sysemu_singlestep(request) ((request) == PTRACE_SYSEMU_SINGLESTEP)
#else
@@ -396,7 +402,11 @@ static int ptrace_resume(struct task_struct *child, long request, long data)
clear_tsk_thread_flag(child, TIF_SYSCALL_EMU);
#endif
- if (is_singlestep(request) || is_sysemu_singlestep(request)) {
+ if (is_singleblock(request)) {
+ if (unlikely(!arch_has_block_step()))
+ return -EIO;
+ user_enable_block_step(child);
+ } else if (is_singlestep(request) || is_sysemu_singlestep(request)) {
if (unlikely(!arch_has_single_step()))
return -EIO;
user_enable_single_step(child);
@@ -438,6 +448,9 @@ int ptrace_request(struct task_struct *child, long request,
#ifdef PTRACE_SINGLESTEP
case PTRACE_SINGLESTEP:
#endif
+#ifdef PTRACE_SINGLEBLOCK
+ case PTRACE_SINGLEBLOCK:
+#endif
#ifdef PTRACE_SYSEMU
case PTRACE_SYSEMU:
case PTRACE_SYSEMU_SINGLESTEP: