Subject: Re: single stepping a setcontext
To: None <tech-kern@netbsd.org>
From: Christos Zoulas <christos@astron.com>
List: tech-kern
Date: 11/21/2006 18:32:21
In article <200611202254.25421.nick.hudson@dsl.pipex.com>,
Nick Hudson <nick.hudson@dsl.pipex.com> wrote:
>-=-=-=-=-=-
>
>Hi,
>
>While looking through the results of a gdb testsuite output on i386 I noticed
>that the single stepping through the return from a signal handler (via
>__sigtramp_siginfo_2) doesn't work. Everything works until the setcontext
>call where the PSL_T bit is restored from the original context and the trap
>never occurs. There are two solutions I can see
>
> 1) use the PSL_T bit from the trapframe when doing a setcontext instead of
> from the mcontext.
> 2) preserve the PSL_T bit for all syscalls
>
>I've attached patches for both options.
>
>Does anyone see any problems with either? Which is more preferable?
>
>Thanks,
>Nick
FreeBSD does the following for traced syscalls:
/*
* Traced syscall.
*/
if ((orig_tf_eflags & PSL_T) && !(orig_tf_eflags & PSL_VM)) {
frame.tf_eflags &= ~PSL_T;
ksiginfo_init_trap(&ksi);
ksi.ksi_signo = SIGTRAP;
ksi.ksi_code = TRAP_TRACE;
ksi.ksi_addr = (void *)frame.tf_eip;
trapsignal(td, &ksi);
}
It also treats PSL_RF specially upon return from signal which we don't.
I am not sure if we should be playing with PSL_T in the setcontext code,
and I don't see other archs that support traps play with the trap bit in
syscall, but then I did not look hard enough.
christos