aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-ia64/ptrace.h
diff options
context:
space:
mode:
authorPetr Tesarik <ptesarik@suse.cz>2007-12-12 09:23:34 -0500
committerTony Luck <tony.luck@intel.com>2008-02-08 15:01:18 -0500
commit3b2ce0b17824c42bc2e46f7dd903b4acf5e9fff9 (patch)
treeacf3913f8c0a479615060ffed4cec9283047761c /include/asm-ia64/ptrace.h
parent5aa92ffda1b6244b4a248df0b95c07d183ab96d2 (diff)
[IA64] Synchronize kernel RSE to user-space and back
This is base kernel patch for ptrace RSE bug. It's basically a backport from the utrace RSE patch I sent out several weeks ago. please review. when a thread is stopped (ptraced), debugger might change thread's user stack (change memory directly), and we must avoid the RSE stored in kernel to override user stack (user space's RSE is newer than kernel's in the case). To workaround the issue, we copy kernel RSE to user RSE before the task is stopped, so user RSE has updated data. we then copy user RSE to kernel after the task is resummed from traced stop and kernel will use the newer RSE to return to user. Signed-off-by: Shaohua Li <shaohua.li@intel.com> Signed-off-by: Petr Tesarik <ptesarik@suse.cz> CC: Roland McGrath <roland@redhat.com> Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'include/asm-ia64/ptrace.h')
-rw-r--r--include/asm-ia64/ptrace.h7
1 files changed, 7 insertions, 0 deletions
diff --git a/include/asm-ia64/ptrace.h b/include/asm-ia64/ptrace.h
index f4ef87a36236..13435f778b0c 100644
--- a/include/asm-ia64/ptrace.h
+++ b/include/asm-ia64/ptrace.h
@@ -292,6 +292,7 @@ struct switch_stack {
292 unsigned long, long); 292 unsigned long, long);
293 extern void ia64_flush_fph (struct task_struct *); 293 extern void ia64_flush_fph (struct task_struct *);
294 extern void ia64_sync_fph (struct task_struct *); 294 extern void ia64_sync_fph (struct task_struct *);
295 extern void ia64_sync_krbs(void);
295 extern long ia64_sync_user_rbs (struct task_struct *, struct switch_stack *, 296 extern long ia64_sync_user_rbs (struct task_struct *, struct switch_stack *,
296 unsigned long, unsigned long); 297 unsigned long, unsigned long);
297 298
@@ -303,6 +304,12 @@ struct switch_stack {
303 extern void ia64_increment_ip (struct pt_regs *pt); 304 extern void ia64_increment_ip (struct pt_regs *pt);
304 extern void ia64_decrement_ip (struct pt_regs *pt); 305 extern void ia64_decrement_ip (struct pt_regs *pt);
305 306
307 extern void ia64_ptrace_stop(void);
308 #define arch_ptrace_stop(code, info) \
309 ia64_ptrace_stop()
310 #define arch_ptrace_stop_needed(code, info) \
311 (!test_thread_flag(TIF_RESTORE_RSE))
312
306#endif /* !__KERNEL__ */ 313#endif /* !__KERNEL__ */
307 314
308/* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */ 315/* pt_all_user_regs is used for PTRACE_GETREGS PTRACE_SETREGS */