Preparation, no changes in compiled code. Currently tracehook_report_syscall_exit() ignores "int step" argument. Each architecture has to implement the stepping itself in the low-level code, and the behaviour is not consistent across different machines.
Change tracehook_report_syscall_exit() to handle "step == T" case but hide the code under #ifdef, then we can change each arch separately. --- include/linux/tracehook.h | 8 ++++++++ 1 file changed, 8 insertions(+) --- TH/include/linux/tracehook.h~1_SYSCALL_EXIT 2009-10-30 00:44:25.000000000 +0100 +++ TH/include/linux/tracehook.h 2009-11-08 20:05:20.000000000 +0100 @@ -134,6 +134,14 @@ static inline __must_check int tracehook */ static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step) { +#ifdef arch_has_fill_sigtrap_info + if (step) { + siginfo_t info; + arch_fill_sigtrap_info(current, regs, &info); + force_sig_info(SIGTRAP, &info, current); + return; + } +#endif ptrace_report_syscall(regs); }