diff options
Diffstat (limited to 'arch/ia64/kernel/ptrace.c')
-rw-r--r-- | arch/ia64/kernel/ptrace.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/arch/ia64/kernel/ptrace.c b/arch/ia64/kernel/ptrace.c index aa705e46b974..3f8918782e0c 100644 --- a/arch/ia64/kernel/ptrace.c +++ b/arch/ia64/kernel/ptrace.c | |||
@@ -607,7 +607,7 @@ find_thread_for_addr (struct task_struct *child, unsigned long addr) | |||
607 | */ | 607 | */ |
608 | list_for_each_safe(this, next, ¤t->children) { | 608 | list_for_each_safe(this, next, ¤t->children) { |
609 | p = list_entry(this, struct task_struct, sibling); | 609 | p = list_entry(this, struct task_struct, sibling); |
610 | if (p->mm != mm) | 610 | if (p->tgid != child->tgid) |
611 | continue; | 611 | continue; |
612 | if (thread_matches(p, addr)) { | 612 | if (thread_matches(p, addr)) { |
613 | child = p; | 613 | child = p; |
@@ -1405,6 +1405,7 @@ ptrace_disable (struct task_struct *child) | |||
1405 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); | 1405 | struct ia64_psr *child_psr = ia64_psr(task_pt_regs(child)); |
1406 | 1406 | ||
1407 | /* make sure the single step/taken-branch trap bits are not set: */ | 1407 | /* make sure the single step/taken-branch trap bits are not set: */ |
1408 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1408 | child_psr->ss = 0; | 1409 | child_psr->ss = 0; |
1409 | child_psr->tb = 0; | 1410 | child_psr->tb = 0; |
1410 | } | 1411 | } |
@@ -1525,6 +1526,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data) | |||
1525 | * Make sure the single step/taken-branch trap bits | 1526 | * Make sure the single step/taken-branch trap bits |
1526 | * are not set: | 1527 | * are not set: |
1527 | */ | 1528 | */ |
1529 | clear_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1528 | ia64_psr(pt)->ss = 0; | 1530 | ia64_psr(pt)->ss = 0; |
1529 | ia64_psr(pt)->tb = 0; | 1531 | ia64_psr(pt)->tb = 0; |
1530 | 1532 | ||
@@ -1556,6 +1558,7 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data) | |||
1556 | goto out_tsk; | 1558 | goto out_tsk; |
1557 | 1559 | ||
1558 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); | 1560 | clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); |
1561 | set_tsk_thread_flag(child, TIF_SINGLESTEP); | ||
1559 | if (request == PTRACE_SINGLESTEP) { | 1562 | if (request == PTRACE_SINGLESTEP) { |
1560 | ia64_psr(pt)->ss = 1; | 1563 | ia64_psr(pt)->ss = 1; |
1561 | } else { | 1564 | } else { |
@@ -1595,13 +1598,9 @@ sys_ptrace (long request, pid_t pid, unsigned long addr, unsigned long data) | |||
1595 | } | 1598 | } |
1596 | 1599 | ||
1597 | 1600 | ||
1598 | void | 1601 | static void |
1599 | syscall_trace (void) | 1602 | syscall_trace (void) |
1600 | { | 1603 | { |
1601 | if (!test_thread_flag(TIF_SYSCALL_TRACE)) | ||
1602 | return; | ||
1603 | if (!(current->ptrace & PT_PTRACED)) | ||
1604 | return; | ||
1605 | /* | 1604 | /* |
1606 | * The 0x80 provides a way for the tracing parent to | 1605 | * The 0x80 provides a way for the tracing parent to |
1607 | * distinguish between a syscall stop and SIGTRAP delivery. | 1606 | * distinguish between a syscall stop and SIGTRAP delivery. |
@@ -1664,7 +1663,8 @@ syscall_trace_leave (long arg0, long arg1, long arg2, long arg3, | |||
1664 | audit_syscall_exit(success, result); | 1663 | audit_syscall_exit(success, result); |
1665 | } | 1664 | } |
1666 | 1665 | ||
1667 | if (test_thread_flag(TIF_SYSCALL_TRACE) | 1666 | if ((test_thread_flag(TIF_SYSCALL_TRACE) |
1667 | || test_thread_flag(TIF_SINGLESTEP)) | ||
1668 | && (current->ptrace & PT_PTRACED)) | 1668 | && (current->ptrace & PT_PTRACED)) |
1669 | syscall_trace(); | 1669 | syscall_trace(); |
1670 | } | 1670 | } |