* Re: [patch] i386: fix singlestepping though a syscall
@ 2006-02-17 8:16 Chuck Ebbert
2006-02-17 15:19 ` Paulo Marques
0 siblings, 1 reply; 4+ messages in thread
From: Chuck Ebbert @ 2006-02-17 8:16 UTC (permalink / raw)
To: Linus Torvalds; +Cc: linux-kernel, Andrew Morton, Paulo Marques
On Thu, 16 Feb 2006 at 17:06:22 -0800, Linus Torvalds wrote:
> On Thu, 16 Feb 2006, Chuck Ebbert wrote:
> >
> > Singlestep through a syscall using vsyscall-sysenter had two bugs:
> >
> > 1. Setting TIF_SINGLESTEP is not enough to force
> > do_notify_resume() to be run on return to user;
> > TIF_IRET must also be set.
>
> Interesting, but I think you pinpointed the _real_ bug.
> ...
> Oh, actually, I think you should just remove the clearing of
> _TIF_SINGLESTEP from _TIF_WORK_MASK. Does that fix the bug.
Yes, that works. I was afraid to try it because of unknown side-effects
but one of those may be that it fixes Paolo's debugger problem. The C
program I was testing with is enclosed and I can even (with care) debug
it with gdb passing through SIGTRAP and step through the signal handler.
Paolo, can you try this patch for your debugger problem?
Do not mask TIF_SINGLESTEP bit in _TIF_WORK_MASK. Masking this stopped
do_notify_resume() from being called when it should have been.
Signed-off-by: Chuck Ebbert <76306.1226@compuserve.com>
--- 2.6.16-rc3-nb.orig/include/asm-i386/thread_info.h
+++ 2.6.16-rc3-nb/include/asm-i386/thread_info.h
@@ -158,8 +158,8 @@ register unsigned long current_stack_poi
/* work to do on interrupt/exception return */
#define _TIF_WORK_MASK \
- (0x0000FFFF & ~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP|\
- _TIF_SECCOMP|_TIF_SYSCALL_EMU))
+ (0x0000FFFF & ~(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT | \
+ _TIF_SECCOMP | _TIF_SYSCALL_EMU))
/* work to do on any return to u-space */
#define _TIF_ALLWORK_MASK (0x0000FFFF & ~_TIF_SECCOMP)
_
#define _GNU_SOURCE
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>
#include <errno.h>
#define TRAP_FLAG 0x100
#ifdef INT80
# define ENTER_KERNEL "int $0x80\n\t"
#else
# define ENTER_KERNEL "call *vsyscall\n\t"
#endif
static struct sigaction sa;
static void * const vsyscall = (void *)0xffffe400;
static void handler(int nr, siginfo_t *si, void *vuc)
{
struct ucontext *uc = (struct ucontext *)vuc;
struct sigcontext *sc = (struct sigcontext *)&uc->uc_mcontext;
printf("handler: signo = %d, errno = %d, code = %d\n",
si->si_signo, si->si_errno, si->si_code);
printf("handler: addr = 0x%08x, inst = 0x%02x, flags=0x%08x\n\n",
si->si_addr, *(unsigned char *)si->si_addr, sc->eflags);
}
int main(int argc, char * const argv[])
{
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
sigaction(SIGTRAP, &sa, NULL);
asm volatile ("pushf ; orl %0,(%%esp) ; popf" : : "i" (TRAP_FLAG));
asm volatile (ENTER_KERNEL : : "a" (20) /* getpid() */);
asm volatile ("pushf ; andl %0,(%%esp) ; popf" : : "i" (~TRAP_FLAG));
asm volatile (ENTER_KERNEL : : "a" (20) /* getpid() */);
return 0;
}
--
Chuck
"Equations are the Devil's sentences." --Stephen Colbert
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [patch] i386: fix singlestepping though a syscall
2006-02-17 8:16 [patch] i386: fix singlestepping though a syscall Chuck Ebbert
@ 2006-02-17 15:19 ` Paulo Marques
0 siblings, 0 replies; 4+ messages in thread
From: Paulo Marques @ 2006-02-17 15:19 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: Linus Torvalds, linux-kernel, Andrew Morton
Chuck Ebbert wrote:
>[...]
> Yes, that works. I was afraid to try it because of unknown side-effects
> but one of those may be that it fixes Paolo's debugger problem. The C
> program I was testing with is enclosed and I can even (with care) debug
> it with gdb passing through SIGTRAP and step through the signal handler.
>
> Paolo, can you try this patch for your debugger problem?
^
Paulo, please ;)
Humm.... I've already found a way to make the debugger work (see th
other thread) and at a first glance it seems unrelated to this. So I
suspect I wouldn't gain much by testing it.
If you think it is worth doing it anyway, it won't be that much trouble
to test yet another kernel, so I can certainly do it tonight...
--
Paulo Marques - www.grupopie.com
Pointy-Haired Boss: I don't see anything that could stand in our way.
Dilbert: Sanity? Reality? The laws of physics?
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [patch] i386: fix singlestepping though a syscall
2006-02-17 0:11 Chuck Ebbert
@ 2006-02-17 1:06 ` Linus Torvalds
0 siblings, 0 replies; 4+ messages in thread
From: Linus Torvalds @ 2006-02-17 1:06 UTC (permalink / raw)
To: Chuck Ebbert; +Cc: Andrew Morton, linux-kernel
On Thu, 16 Feb 2006, Chuck Ebbert wrote:
>
> Singlestep through a syscall using vsyscall-sysenter had two bugs:
>
> 1. Setting TIF_SINGLESTEP is not enough to force
> do_notify_resume() to be run on return to user;
> TIF_IRET must also be set.
Interesting, but I think you pinpointed the _real_ bug.
TIF_SINGLESTEP very much should be enough to force do_notify_resume() to
be run on return to user space.
Sounds like somebody is testing _TIF_WORK_MASK rather than
_TIF_ALLWORK_MASK.
I'd suspect the "work_pending" case. Looks like we miss testing the TIF
flags there.
Oh, actually, I think you should just remove the clearing of
_TIF_SINGLESTEP from _TIF_WORK_MASK. Does that fix the bug.
Linus
^ permalink raw reply [flat|nested] 4+ messages in thread
* [patch] i386: fix singlestepping though a syscall
@ 2006-02-17 0:11 Chuck Ebbert
2006-02-17 1:06 ` Linus Torvalds
0 siblings, 1 reply; 4+ messages in thread
From: Chuck Ebbert @ 2006-02-17 0:11 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Andrew Morton, linux-kernel
Singlestep through a syscall using vsyscall-sysenter had two bugs:
1. Setting TIF_SINGLESTEP is not enough to force
do_notify_resume() to be run on return to user;
TIF_IRET must also be set.
2. do_notify_resume() was being passed masked copies
of task_thread_flags, so TIF_SINGLESTEP was never
seen as set when it was called. This was changed
to use the 'test' instruction instead of 'and';
a duplicated piece of code was removed instead
of fixing that part too.
Also changed some misleading 'jne' to 'jnz' to make it
clearer what is happening.
Signed-off-by: Chuck Ebbert <76306.1226@compuserve.com>
---
arch/i386/kernel/entry.S | 17 +++++------------
arch/i386/kernel/traps.c | 1 +
2 files changed, 6 insertions(+), 12 deletions(-)
--- 2.6.16-rc3-nb.orig/arch/i386/kernel/entry.S
+++ 2.6.16-rc3-nb/arch/i386/kernel/entry.S
@@ -152,9 +152,9 @@ ENTRY(resume_userspace)
# setting need_resched or sigpending
# between sampling and the iret
movl TI_flags(%ebp), %ecx
- andl $_TIF_WORK_MASK, %ecx # is there any work to be done on
+ testl $_TIF_WORK_MASK, %ecx # is there any work to be done on
# int/exception return?
- jne work_pending
+ jnz work_pending
jmp restore_all
#ifdef CONFIG_PREEMPT
@@ -301,21 +301,14 @@ work_pending:
jz work_notifysig
work_resched:
call schedule
- cli # make sure we don't miss an interrupt
- # setting need_resched or sigpending
- # between sampling and the iret
- movl TI_flags(%ebp), %ecx
- andl $_TIF_WORK_MASK, %ecx # is there any work to be done other
- # than syscall tracing?
- jz restore_all
- testb $_TIF_NEED_RESCHED, %cl
- jnz work_resched
+ jmp resume_userspace
+ ALIGN
work_notifysig: # deal with pending signals and
# notify-resume requests
testl $VM_MASK, EFLAGS(%esp)
movl %esp, %eax
- jne work_notifysig_v86 # returning to kernel-space or
+ jnz work_notifysig_v86 # returning to kernel-space or
# vm86-space
xorl %edx, %edx
call do_notify_resume
--- 2.6.16-rc3-nb.orig/arch/i386/kernel/traps.c
+++ 2.6.16-rc3-nb/arch/i386/kernel/traps.c
@@ -795,6 +795,7 @@ debug_vm86:
clear_TF_reenable:
set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
+ set_tsk_thread_flag(tsk, TIF_IRET);
regs->eflags &= ~TF_MASK;
return;
}
--
Chuck
"Equations are the Devil's sentences." --Stephen Colbert
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2006-02-17 15:19 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2006-02-17 8:16 [patch] i386: fix singlestepping though a syscall Chuck Ebbert
2006-02-17 15:19 ` Paulo Marques
-- strict thread matches above, loose matches on Subject: below --
2006-02-17 0:11 Chuck Ebbert
2006-02-17 1:06 ` Linus Torvalds
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Powered by JetHome