x86 ptrace: unify TIF_SINGLESTEP
This unifies the treatment of TIF_SINGLESTEP on i386 and x86_64.
The bit is now excluded from _TIF_WORK_MASK on i386 as it has been
on x86_64. This means the do_notify_resume() path using it is never
used, so TIF_SINGLESTEP is not cleared on returning to user mode.
Both now leave TIF_SINGLESTEP set when returning to user, so that
it's already set on an int $0x80 system call entry. This removes
the need for testing TF on the system_call path. Doing it this way
fixes the regression for PTRACE_SINGLESTEP into a sigreturn syscall,
introduced by commit 1e2e99f0e4
.
The clear_TF_reenable case that sets TIF_SINGLESTEP can only happen
on a non-exception kernel entry, i.e. sysenter/syscall instruction.
That will always get to the syscall exit tracing path.
Signed-off-by: Roland McGrath <roland@redhat.com>
This commit is contained in:
Родитель
6718d0d6da
Коммит
64f0973319
|
@ -383,10 +383,6 @@ syscall_exit:
|
||||||
# setting need_resched or sigpending
|
# setting need_resched or sigpending
|
||||||
# between sampling and the iret
|
# between sampling and the iret
|
||||||
TRACE_IRQS_OFF
|
TRACE_IRQS_OFF
|
||||||
testl $X86_EFLAGS_TF,PT_EFLAGS(%esp) # If tracing set singlestep flag on exit
|
|
||||||
jz no_singlestep
|
|
||||||
orl $_TIF_SINGLESTEP,TI_flags(%ebp)
|
|
||||||
no_singlestep:
|
|
||||||
movl TI_flags(%ebp), %ecx
|
movl TI_flags(%ebp), %ecx
|
||||||
testw $_TIF_ALLWORK_MASK, %cx # current->work
|
testw $_TIF_ALLWORK_MASK, %cx # current->work
|
||||||
jne syscall_exit_work
|
jne syscall_exit_work
|
||||||
|
|
|
@ -657,12 +657,6 @@ static void do_signal(struct pt_regs *regs)
|
||||||
void
|
void
|
||||||
do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
|
do_notify_resume(struct pt_regs *regs, void *unused, __u32 thread_info_flags)
|
||||||
{
|
{
|
||||||
/* Pending single-step? */
|
|
||||||
if (thread_info_flags & _TIF_SINGLESTEP) {
|
|
||||||
regs->flags |= X86_EFLAGS_TF;
|
|
||||||
clear_thread_flag(TIF_SINGLESTEP);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* deal with pending signal delivery */
|
/* deal with pending signal delivery */
|
||||||
if (thread_info_flags & _TIF_SIGPENDING)
|
if (thread_info_flags & _TIF_SIGPENDING)
|
||||||
do_signal(regs);
|
do_signal(regs);
|
||||||
|
|
|
@ -487,12 +487,6 @@ static void do_signal(struct pt_regs *regs)
|
||||||
void do_notify_resume(struct pt_regs *regs, void *unused,
|
void do_notify_resume(struct pt_regs *regs, void *unused,
|
||||||
__u32 thread_info_flags)
|
__u32 thread_info_flags)
|
||||||
{
|
{
|
||||||
/* Pending single-step? */
|
|
||||||
if (thread_info_flags & _TIF_SINGLESTEP) {
|
|
||||||
regs->flags |= X86_EFLAGS_TF;
|
|
||||||
clear_thread_flag(TIF_SINGLESTEP);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_X86_MCE
|
#ifdef CONFIG_X86_MCE
|
||||||
/* notify userspace of pending MCEs */
|
/* notify userspace of pending MCEs */
|
||||||
if (thread_info_flags & _TIF_MCE_NOTIFY)
|
if (thread_info_flags & _TIF_MCE_NOTIFY)
|
||||||
|
|
|
@ -124,7 +124,7 @@ struct thread_info {
|
||||||
/* work to do on interrupt/exception return */
|
/* work to do on interrupt/exception return */
|
||||||
#define _TIF_WORK_MASK \
|
#define _TIF_WORK_MASK \
|
||||||
(0x0000FFFF & \
|
(0x0000FFFF & \
|
||||||
~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP| \
|
~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT| \
|
||||||
_TIF_SECCOMP|_TIF_SYSCALL_EMU))
|
_TIF_SECCOMP|_TIF_SYSCALL_EMU))
|
||||||
|
|
||||||
/* work to do on any return to user space */
|
/* work to do on any return to user space */
|
||||||
|
@ -132,7 +132,7 @@ struct thread_info {
|
||||||
|
|
||||||
/* Only used for 64 bit */
|
/* Only used for 64 bit */
|
||||||
#define _TIF_DO_NOTIFY_MASK \
|
#define _TIF_DO_NOTIFY_MASK \
|
||||||
(_TIF_SIGPENDING|_TIF_SINGLESTEP|_TIF_MCE_NOTIFY|_TIF_HRTICK_RESCHED)
|
(_TIF_SIGPENDING|_TIF_MCE_NOTIFY|_TIF_HRTICK_RESCHED)
|
||||||
|
|
||||||
/* flags to check in __switch_to() */
|
/* flags to check in __switch_to() */
|
||||||
#define _TIF_WORK_CTXSW \
|
#define _TIF_WORK_CTXSW \
|
||||||
|
|
Загрузка…
Ссылка в новой задаче