aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/powerpc/include/asm/ptrace.h2
-rw-r--r--arch/powerpc/kernel/traps.c7
-rw-r--r--arch/x86/include/asm/ptrace.h2
-rw-r--r--arch/x86/kernel/ptrace.c11
-rw-r--r--include/linux/ptrace.h17
-rw-r--r--include/linux/tracehook.h13
6 files changed, 24 insertions, 28 deletions
diff --git a/arch/powerpc/include/asm/ptrace.h b/arch/powerpc/include/asm/ptrace.h
index 447cbd1bee99..5b480e1d5909 100644
--- a/arch/powerpc/include/asm/ptrace.h
+++ b/arch/powerpc/include/asm/ptrace.h
@@ -149,7 +149,7 @@ do { \
149 149
150#define arch_has_single_step() (1) 150#define arch_has_single_step() (1)
151#define arch_has_block_step() (!cpu_has_feature(CPU_FTR_601)) 151#define arch_has_block_step() (!cpu_has_feature(CPU_FTR_601))
152#define ARCH_HAS_USER_SINGLE_STEP_INFO 152#define ARCH_HAS_USER_SINGLE_STEP_REPORT
153 153
154/* 154/*
155 * kprobe-based event tracer support 155 * kprobe-based event tracer support
diff --git a/arch/powerpc/kernel/traps.c b/arch/powerpc/kernel/traps.c
index c85adb858271..f651fa91cdc9 100644
--- a/arch/powerpc/kernel/traps.c
+++ b/arch/powerpc/kernel/traps.c
@@ -307,12 +307,9 @@ void die(const char *str, struct pt_regs *regs, long err)
307} 307}
308NOKPROBE_SYMBOL(die); 308NOKPROBE_SYMBOL(die);
309 309
310void user_single_step_siginfo(struct task_struct *tsk, 310void user_single_step_report(struct pt_regs *regs)
311 struct pt_regs *regs, siginfo_t *info)
312{ 311{
313 info->si_signo = SIGTRAP; 312 force_sig_fault(SIGTRAP, TRAP_TRACE, (void __user *)regs->nip, current);
314 info->si_code = TRAP_TRACE;
315 info->si_addr = (void __user *)regs->nip;
316} 313}
317 314
318static void show_signal_msg(int signr, struct pt_regs *regs, int code, 315static void show_signal_msg(int signr, struct pt_regs *regs, int code,
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h
index 6de1fd3d0097..e353f08b7fe2 100644
--- a/arch/x86/include/asm/ptrace.h
+++ b/arch/x86/include/asm/ptrace.h
@@ -263,7 +263,7 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
263#define arch_has_block_step() (boot_cpu_data.x86 >= 6) 263#define arch_has_block_step() (boot_cpu_data.x86 >= 6)
264#endif 264#endif
265 265
266#define ARCH_HAS_USER_SINGLE_STEP_INFO 266#define ARCH_HAS_USER_SINGLE_STEP_REPORT
267 267
268/* 268/*
269 * When hitting ptrace_stop(), we cannot return using SYSRET because 269 * When hitting ptrace_stop(), we cannot return using SYSRET because
diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
index e2ee403865eb..94bd6e89129a 100644
--- a/arch/x86/kernel/ptrace.c
+++ b/arch/x86/kernel/ptrace.c
@@ -1382,12 +1382,6 @@ static void fill_sigtrap_info(struct task_struct *tsk,
1382 info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL; 1382 info->si_addr = user_mode(regs) ? (void __user *)regs->ip : NULL;
1383} 1383}
1384 1384
1385void user_single_step_siginfo(struct task_struct *tsk,
1386 struct pt_regs *regs,
1387 struct siginfo *info)
1388{
1389 fill_sigtrap_info(tsk, regs, 0, TRAP_BRKPT, info);
1390}
1391 1385
1392void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs, 1386void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
1393 int error_code, int si_code) 1387 int error_code, int si_code)
@@ -1399,3 +1393,8 @@ void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
1399 /* Send us the fake SIGTRAP */ 1393 /* Send us the fake SIGTRAP */
1400 force_sig_info(SIGTRAP, &info, tsk); 1394 force_sig_info(SIGTRAP, &info, tsk);
1401} 1395}
1396
1397void user_single_step_report(struct pt_regs *regs)
1398{
1399 send_sigtrap(current, regs, 0, TRAP_BRKPT);
1400}
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h
index 4f36431c380b..1de2235511c8 100644
--- a/include/linux/ptrace.h
+++ b/include/linux/ptrace.h
@@ -336,14 +336,19 @@ static inline void user_enable_block_step(struct task_struct *task)
336extern void user_enable_block_step(struct task_struct *); 336extern void user_enable_block_step(struct task_struct *);
337#endif /* arch_has_block_step */ 337#endif /* arch_has_block_step */
338 338
339#ifdef ARCH_HAS_USER_SINGLE_STEP_INFO 339#ifdef ARCH_HAS_USER_SINGLE_STEP_REPORT
340extern void user_single_step_siginfo(struct task_struct *tsk, 340extern void user_single_step_report(struct pt_regs *regs);
341 struct pt_regs *regs, siginfo_t *info);
342#else 341#else
343static inline void user_single_step_siginfo(struct task_struct *tsk, 342static inline void user_single_step_report(struct pt_regs *regs)
344 struct pt_regs *regs, siginfo_t *info)
345{ 343{
346 info->si_signo = SIGTRAP; 344 siginfo_t info;
345 clear_siginfo(&info);
346 info.si_signo = SIGTRAP;
347 info.si_errno = 0;
348 info.si_code = SI_USER;
349 info.si_pid = 0;
350 info.si_uid = 0;
351 force_sig_info(info.si_signo, &info, current);
347} 352}
348#endif 353#endif
349 354
diff --git a/include/linux/tracehook.h b/include/linux/tracehook.h
index 05589a3e37f4..40b0b4c1bf7b 100644
--- a/include/linux/tracehook.h
+++ b/include/linux/tracehook.h
@@ -123,15 +123,10 @@ static inline __must_check int tracehook_report_syscall_entry(
123 */ 123 */
124static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step) 124static inline void tracehook_report_syscall_exit(struct pt_regs *regs, int step)
125{ 125{
126 if (step) { 126 if (step)
127 siginfo_t info; 127 user_single_step_report(regs);
128 clear_siginfo(&info); 128 else
129 user_single_step_siginfo(current, regs, &info); 129 ptrace_report_syscall(regs);
130 force_sig_info(SIGTRAP, &info, current);
131 return;
132 }
133
134 ptrace_report_syscall(regs);
135} 130}
136 131
137/** 132/**