Re: ptrace single-stepping change breaks Wine

Linus Torvalds
2005-01-01T22:14:41Z

On Sat, 1 Jan 2005, Davide Libenzi wrote:
>
> I used the test program below on 2.4.27, 2.6.8.1 and latest BK + TF-careful.
> In all cases single stepping over POPF succeeded.

I don't think you realize what the failure case for popf was.

It wasn't that we couldn't single-step it: it was that we corrupted the
resulting elfags value after single-stepping it.

Try to extend your program to print out not only the EIP after the
single-step, but also the value of EFLAGS, and you'll see what I mean.
Earlier kernels are _really_ bad at it: they'll always report that TF is
set. The "TF-careful" patch gets TF right for normal instructions, and the
"TF-popf" patch gets TF right after popf too.

The one remaining case I know of where we still get TF wrong is "pushf",
where single-stepping a pushf will not corrupt TF, but it will save the
wrong value on the stack (which obviously may corrupt TF _later_, when the
paired "popf" happens).

It's sad that x86 put the single-stepping into a user-visible register.
All the other debug state is kernel-only, meaning that we don't have to
play any games with them... It would have been nice if Intel had added a
"single-step" bit to %db7, and then just or'ed in the values of TF and the
new flag when deciding to single-step. That would have allowed the legacy
stuff to work, and given debuggers a much less intrusive way to single-
step.

Linus