diff options
| -rw-r--r-- | arch/x86/include/asm/ptrace.h | 16 | ||||
| -rw-r--r-- | include/linux/ptrace.h | 3 |
2 files changed, 19 insertions, 0 deletions
diff --git a/arch/x86/include/asm/ptrace.h b/arch/x86/include/asm/ptrace.h index 14fd6fd75a19..6205f0c434db 100644 --- a/arch/x86/include/asm/ptrace.h +++ b/arch/x86/include/asm/ptrace.h | |||
| @@ -231,6 +231,22 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs, | |||
| 231 | 231 | ||
| 232 | #define ARCH_HAS_USER_SINGLE_STEP_INFO | 232 | #define ARCH_HAS_USER_SINGLE_STEP_INFO |
| 233 | 233 | ||
| 234 | /* | ||
| 235 | * When hitting ptrace_stop(), we cannot return using SYSRET because | ||
| 236 | * that does not restore the full CPU state, only a minimal set. The | ||
| 237 | * ptracer can change arbitrary register values, which is usually okay | ||
| 238 | * because the usual ptrace stops run off the signal delivery path which | ||
| 239 | * forces IRET; however, ptrace_event() stops happen in arbitrary places | ||
| 240 | * in the kernel and don't force IRET path. | ||
| 241 | * | ||
| 242 | * So force IRET path after a ptrace stop. | ||
| 243 | */ | ||
| 244 | #define arch_ptrace_stop_needed(code, info) \ | ||
| 245 | ({ \ | ||
| 246 | set_thread_flag(TIF_NOTIFY_RESUME); \ | ||
| 247 | false; \ | ||
| 248 | }) | ||
| 249 | |||
| 234 | struct user_desc; | 250 | struct user_desc; |
| 235 | extern int do_get_thread_area(struct task_struct *p, int idx, | 251 | extern int do_get_thread_area(struct task_struct *p, int idx, |
| 236 | struct user_desc __user *info); | 252 | struct user_desc __user *info); |
diff --git a/include/linux/ptrace.h b/include/linux/ptrace.h index 077904c8b70d..cc79eff4a1ad 100644 --- a/include/linux/ptrace.h +++ b/include/linux/ptrace.h | |||
| @@ -334,6 +334,9 @@ static inline void user_single_step_siginfo(struct task_struct *tsk, | |||
| 334 | * calling arch_ptrace_stop() when it would be superfluous. For example, | 334 | * calling arch_ptrace_stop() when it would be superfluous. For example, |
| 335 | * if the thread has not been back to user mode since the last stop, the | 335 | * if the thread has not been back to user mode since the last stop, the |
| 336 | * thread state might indicate that nothing needs to be done. | 336 | * thread state might indicate that nothing needs to be done. |
| 337 | * | ||
| 338 | * This is guaranteed to be invoked once before a task stops for ptrace and | ||
| 339 | * may include arch-specific operations necessary prior to a ptrace stop. | ||
| 337 | */ | 340 | */ |
| 338 | #define arch_ptrace_stop_needed(code, info) (0) | 341 | #define arch_ptrace_stop_needed(code, info) (0) |
| 339 | #endif | 342 | #endif |
