diff options
author | Christoph Hellwig <hch@lst.de> | 2010-02-03 04:15:57 -0500 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2010-03-09 00:30:51 -0500 |
commit | f5b99627a3065858ad5c678703ed7af5363dca39 (patch) | |
tree | 289120c142bb8aa561fa760a22053038b759bb34 | |
parent | ad6720c0b52ae1cde0bc567e57a71acde1a292aa (diff) |
Blackfin: use generic ptrace_resume code
Use the generic ptrace_resume code for PTRACE_SYSCALL, PTRACE_CONT,
PTRACE_KILL and PTRACE_SINGLESTEP. This implies defining
arch_has_single_step in <asm/ptrace.h> and implementing the
user_enable_single_step and user_disable_single_step functions, which
also causes the breakpoint information to be cleared on fork, which
could be considered a bug fix.
Also the TIF_SYSCALL_TRACE thread flag is now cleared on PTRACE_KILL
which it previously wasn't which is consistent with all architectures
using the modern ptrace code.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
-rw-r--r-- | arch/blackfin/kernel/ptrace.c | 44 |
1 files changed, 0 insertions, 44 deletions
diff --git a/arch/blackfin/kernel/ptrace.c b/arch/blackfin/kernel/ptrace.c index 65567dc4b9f5..895302df21c1 100644 --- a/arch/blackfin/kernel/ptrace.c +++ b/arch/blackfin/kernel/ptrace.c | |||
@@ -354,50 +354,6 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data) | |||
354 | ret = put_reg(child, addr, data); | 354 | ret = put_reg(child, addr, data); |
355 | break; | 355 | break; |
356 | 356 | ||
357 | case PTRACE_SYSCALL: /* continue and stop at next (return from) syscall */ | ||
358 | case PTRACE_CONT: /* restart after signal. */ | ||
359 | pr_debug("ptrace: syscall/cont\n"); | ||
360 | |||
361 | ret = -EIO; | ||
362 | if (!valid_signal(data)) | ||
363 | break; | ||
364 | if (request == PTRACE_SYSCALL) | ||
365 | set_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
366 | else | ||
367 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
368 | child->exit_code = data; | ||
369 | ptrace_disable(child); | ||
370 | pr_debug("ptrace: before wake_up_process\n"); | ||
371 | wake_up_process(child); | ||
372 | ret = 0; | ||
373 | break; | ||
374 | |||
375 | /* | ||
376 | * make the child exit. Best I can do is send it a sigkill. | ||
377 | * perhaps it should be put in the status that it wants to | ||
378 | * exit. | ||
379 | */ | ||
380 | case PTRACE_KILL: | ||
381 | ret = 0; | ||
382 | if (child->exit_state == EXIT_ZOMBIE) /* already dead */ | ||
383 | break; | ||
384 | child->exit_code = SIGKILL; | ||
385 | ptrace_disable(child); | ||
386 | wake_up_process(child); | ||
387 | break; | ||
388 | |||
389 | case PTRACE_SINGLESTEP: /* set the trap flag. */ | ||
390 | pr_debug("ptrace: single step\n"); | ||
391 | ret = -EIO; | ||
392 | if (!valid_signal(data)) | ||
393 | break; | ||
394 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | ||
395 | ptrace_enable(child); | ||
396 | child->exit_code = data; | ||
397 | wake_up_process(child); | ||
398 | ret = 0; | ||
399 | break; | ||
400 | |||
401 | case PTRACE_GETREGS: | 357 | case PTRACE_GETREGS: |
402 | /* Get all gp regs from the child. */ | 358 | /* Get all gp regs from the child. */ |
403 | ret = ptrace_getregs(child, datap); | 359 | ret = ptrace_getregs(child, datap); |