sh64: fix tracing of signals.
This follows the parisc change to ensure that tracehook_signal_handler() is aware of when we are single-stepping in order to ptrace_notify() appropriately. While this was implemented for 32-bit SH, sh64 neglected to make use of TIF_SINGLESTEP when it was folded in with the 32-bit code, resulting in ptrace_notify() never being called. As sh64 uses all of the other abstractions already, this simply plugs in the thread flag in the appropriate enable/disable paths and fixes up the tracehook notification accordingly. With this in place, sh64 is brought in line with what 32-bit is already doing. Reported-by: Mike Frysinger <vapier@gentoo.org> Signed-off-by: Paul Mundt <lethal@linux-sh.org>
This commit is contained in:
		
					parent
					
						
							
								724e6d3fe8
							
						
					
				
			
			
				commit
				
					
						4b505db9c4
					
				
			
		
					 2 changed files with 12 additions and 3 deletions
				
			
		| 
						 | 
					@ -133,6 +133,8 @@ void user_enable_single_step(struct task_struct *child)
 | 
				
			||||||
	struct pt_regs *regs = child->thread.uregs;
 | 
						struct pt_regs *regs = child->thread.uregs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	regs->sr |= SR_SSTEP;	/* auto-resetting upon exception */
 | 
						regs->sr |= SR_SSTEP;	/* auto-resetting upon exception */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						set_tsk_thread_flag(child, TIF_SINGLESTEP);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void user_disable_single_step(struct task_struct *child)
 | 
					void user_disable_single_step(struct task_struct *child)
 | 
				
			||||||
| 
						 | 
					@ -140,6 +142,8 @@ void user_disable_single_step(struct task_struct *child)
 | 
				
			||||||
	struct pt_regs *regs = child->thread.uregs;
 | 
						struct pt_regs *regs = child->thread.uregs;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	regs->sr &= ~SR_SSTEP;
 | 
						regs->sr &= ~SR_SSTEP;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						clear_tsk_thread_flag(child, TIF_SINGLESTEP);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int genregs_get(struct task_struct *target,
 | 
					static int genregs_get(struct task_struct *target,
 | 
				
			||||||
| 
						 | 
					@ -454,6 +458,8 @@ asmlinkage long long do_syscall_trace_enter(struct pt_regs *regs)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
 | 
					asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
						int step;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (unlikely(current->audit_context))
 | 
						if (unlikely(current->audit_context))
 | 
				
			||||||
		audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]),
 | 
							audit_syscall_exit(AUDITSC_RESULT(regs->regs[9]),
 | 
				
			||||||
				   regs->regs[9]);
 | 
									   regs->regs[9]);
 | 
				
			||||||
| 
						 | 
					@ -461,8 +467,9 @@ asmlinkage void do_syscall_trace_leave(struct pt_regs *regs)
 | 
				
			||||||
	if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
 | 
						if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
 | 
				
			||||||
		trace_sys_exit(regs, regs->regs[9]);
 | 
							trace_sys_exit(regs, regs->regs[9]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (test_thread_flag(TIF_SYSCALL_TRACE))
 | 
						step = test_thread_flag(TIF_SINGLESTEP);
 | 
				
			||||||
		tracehook_report_syscall_exit(regs, 0);
 | 
						if (step || test_thread_flag(TIF_SYSCALL_TRACE))
 | 
				
			||||||
 | 
							tracehook_report_syscall_exit(regs, step);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Called with interrupts disabled */
 | 
					/* Called with interrupts disabled */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,7 +118,9 @@ static int do_signal(struct pt_regs *regs, sigset_t *oldset)
 | 
				
			||||||
			 * clear the TS_RESTORE_SIGMASK flag.
 | 
								 * clear the TS_RESTORE_SIGMASK flag.
 | 
				
			||||||
			 */
 | 
								 */
 | 
				
			||||||
			current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
 | 
								current_thread_info()->status &= ~TS_RESTORE_SIGMASK;
 | 
				
			||||||
			tracehook_signal_handler(signr, &info, &ka, regs, 0);
 | 
					
 | 
				
			||||||
 | 
								tracehook_signal_handler(signr, &info, &ka, regs,
 | 
				
			||||||
 | 
										test_thread_flag(TIF_SINGLESTEP));
 | 
				
			||||||
			return 1;
 | 
								return 1;
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue