Gitweb:
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=5b88abbf770a0e1975c668743100f42934f385e8
Commit: 5b88abbf770a0e1975c668743100f42934f385e8
Parent: dc802c2d2e66e2d1544e023bfd4be6cdee48d57b
Author: Roland McGrath <[EMAIL PROTECTED]>
AuthorDate: Wed Jan 30 13:30:53 2008 +0100
Committer: Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 13:30:53 2008 +0100
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.
[ [EMAIL PROTECTED]: bugfix ]
Signed-off-by: Roland McGrath <[EMAIL PROTECTED]>
Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
Signed-off-by: Thomas Gleixner <[EMAIL PROTECTED]>
---
include/linux/ptrace.h | 2 +-
kernel/ptrace.c | 15 ++++++++++++++-
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 1febc54..515bff0 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -187,7 +187,7 @@ static inline void user_disable_single_step(struct
task_struct *task)
* supports step-until-branch for user mode. It can be a constant or it
* can test a CPU feature bit.
*/
-#define arch_has_single_step() (0)
+#define arch_has_block_step() (0)
/**
* user_enable_block_step - step until branch in user-mode task
diff --git a/kernel/ptrace.c b/kernel/ptrace.c
index fad5f1e..973d727 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:
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html