diff options
author | bibo,mao <bibo.mao@intel.com> | 2007-01-31 04:50:31 -0500 |
---|---|---|
committer | Tony Luck <tony.luck@intel.com> | 2007-02-05 16:49:29 -0500 |
commit | 90f9d70a582c02f50b4dd847166cd5b037219891 (patch) | |
tree | ffe6b5246f9e2334b474ca0913776668803d1ea0 /include/asm-ia64 | |
parent | c237508afa5d47282d3047784864013eebdc68ab (diff) |
[IA64] enable singlestep on system call
As is pointed out in
http://www.gelato.org/community/view_linear.php?id=1_1036&from=authors&value=Ian%20Wienand#1_1039,
if single step on break instruction, the break fault has higher
priority than the single-step trap. When the break fault handler
is entered, it advances the IP by 1 instruction so break instruction
single-stepping is skipped, actually it is next instruction which
is single stepped.
This patch modifies this, it adds TIF_SINGLESTEP bit for thread
flags, and generate a fake sigtrap when single stepping break
instruction. Test case in attachment can verify this. Any comments
is welcome.
Signed-off-by: bibo, mao <bibo.mao@intel.com>
Signed-off-by: Tony Luck <tony.luck@intel.com>
Diffstat (limited to 'include/asm-ia64')
-rw-r--r-- | include/asm-ia64/thread_info.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/include/asm-ia64/thread_info.h b/include/asm-ia64/thread_info.h index 9b505b25544f..91698599f918 100644 --- a/include/asm-ia64/thread_info.h +++ b/include/asm-ia64/thread_info.h | |||
@@ -84,6 +84,7 @@ struct thread_info { | |||
84 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ | 84 | #define TIF_NEED_RESCHED 2 /* rescheduling necessary */ |
85 | #define TIF_SYSCALL_TRACE 3 /* syscall trace active */ | 85 | #define TIF_SYSCALL_TRACE 3 /* syscall trace active */ |
86 | #define TIF_SYSCALL_AUDIT 4 /* syscall auditing active */ | 86 | #define TIF_SYSCALL_AUDIT 4 /* syscall auditing active */ |
87 | #define TIF_SINGLESTEP 5 /* restore singlestep on return to user mode */ | ||
87 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ | 88 | #define TIF_POLLING_NRFLAG 16 /* true if poll_idle() is polling TIF_NEED_RESCHED */ |
88 | #define TIF_MEMDIE 17 | 89 | #define TIF_MEMDIE 17 |
89 | #define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */ | 90 | #define TIF_MCA_INIT 18 /* this task is processing MCA or INIT */ |
@@ -92,7 +93,8 @@ struct thread_info { | |||
92 | 93 | ||
93 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) | 94 | #define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE) |
94 | #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) | 95 | #define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) |
95 | #define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT) | 96 | #define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) |
97 | #define _TIF_SYSCALL_TRACEAUDIT (_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP) | ||
96 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) | 98 | #define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME) |
97 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) | 99 | #define _TIF_SIGPENDING (1 << TIF_SIGPENDING) |
98 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) | 100 | #define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED) |