lkml.org 
[lkml]   [2020]   [Aug]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2.1 8/8] x86/debug: Remove the historical junk
    On Fri, Aug 21, 2020 at 11:39:20AM +0200, Peter Zijlstra wrote:
    > Remove the historical junk and replace it with a WARN and a comment.
    >
    > The problem is that even though the kernel only uses TF single-step in
    > kprobes and KGDB, both of which consume the event before this,
    > QEMU/KVM has bugs in this area that can trigger this state so we have
    > to deal with it.
    >
    > Suggested-by: Brian Gerst <brgerst@gmail.com>
    > Suggested-by: Andy Lutomirski <luto@amacapital.net>
    > Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>

    Damn, I lost a refresh.

    ---
    arch/x86/kernel/traps.c | 23 ++++++++++++-----------
    1 file changed, 12 insertions(+), 11 deletions(-)

    --- a/arch/x86/kernel/traps.c
    +++ b/arch/x86/kernel/traps.c
    @@ -843,18 +843,19 @@ static __always_inline void exc_debug_ke
    if (notify_debug(regs, &dr6))
    goto out;

    - if (WARN_ON_ONCE(dr6 & DR_STEP)) {
    - /*
    - * Historical junk that used to handle SYSENTER single-stepping.
    - * This should be unreachable now. If we survive for a while
    - * without anyone hitting this warning, we'll turn this into
    - * an oops.
    - */
    - dr6 &= ~DR_STEP;
    - set_thread_flag(TIF_SINGLESTEP);
    + /*
    + * The kernel doesn't use TF single-step outside of:
    + *
    + * - Kprobes, consumed through kprobe_debug_handler()
    + * - KGDB, consumed through notify_debug()
    + *
    + * So if we get here with DR_STEP set, something is wonky.
    + *
    + * A known way to trigger this is through QEMU's GDB stub,
    + * which leaks #DB into the guest and causes IST recursion.
    + */
    + if (WARN_ON_ONCE(current->thread.debugreg6 & DR_STEP))
    regs->flags &= ~X86_EFLAGS_TF;
    - }
    -
    out:
    instrumentation_end();
    idtentry_exit_nmi(regs, irq_state);
    \
     
     \ /
      Last update: 2020-08-21 14:25    [W:4.442 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site