Messages in this thread | | | Date | Sat, 1 Jan 2005 14:14:32 -0800 (PST) | From | Linus Torvalds <> | Subject | Re: ptrace single-stepping change breaks Wine |
| |
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 - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
| |