Re: [PATCH 2/2] ptrace: fix set_task_blockstep()->update_debugctlmsr()logic

From: Sebastian Andrzej Siewior
Date: Tue Aug 07 2012 - 11:30:51 EST


On 08/07/2012 05:15 PM, Oleg Nesterov wrote:
It turns out, original code is even more buggy than I thought.

Ironically, "task != current" case is more difficult and so far
I do not see how we can handle this case correctly. I'll return
to this a bit later, currently I am working on other patches.

maybe you could remove the autodectect mode and add helper for uprobe
which disables it.

For uprobes we never set the bit, we only need it cleared.

Yes, at least at first step, and probably we will never need more.

We get here
via int 3 and do_debug() already clears TIF_BLOCKSTEP

No, we get here via do_int3(), TIF_BLOCKSTEP is not cleared,

Yes, Sorry. my fault.

because the
CPU clears the bit in CPU.

I am not sure. The manual says:

If the BTF flag is set when the processor generates a debug
exception, the processor clears the BTF flag along with the
TF flag.

but I am not sure "debug exception" also means "breakpoint exception".



do_debug() does clear TIF_BLOCKSTEP, and "The processor cleared BTF"
is true in this case. But it is called after single-step.

I was wrong here in regard to do_debug() since do_int3() is correct.
Anyway, I checked it on real hardware and I saw the CPU in do_int3()
with BTF set after executing int3 with TF flag set and the BTF bit.


Oleg.

Sebastian
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/