Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86/entry/traps: Clear DR6 early in do_debug() and improve the comment

Leaving any bits set in DR6 on return from a debug exception is
asking for trouble. Prevent it by writing zero right away and
clarify the comment.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Andy Lutomirski <luto@amacapital.net>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Link: http://lkml.kernel.org/r/3857676e1be8fb27db4b89bbb1e2052b7f435ff4.1457578375.git.luto@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>

authored by

Andy Lutomirski and committed by
Ingo Molnar
8bb56436 81edd9f6

+12 -3
+12 -3
arch/x86/kernel/traps.c
··· 593 593 ist_enter(regs); 594 594 595 595 get_debugreg(dr6, 6); 596 + /* 597 + * The Intel SDM says: 598 + * 599 + * Certain debug exceptions may clear bits 0-3. The remaining 600 + * contents of the DR6 register are never cleared by the 601 + * processor. To avoid confusion in identifying debug 602 + * exceptions, debug handlers should clear the register before 603 + * returning to the interrupted task. 604 + * 605 + * Keep it simple: clear DR6 immediately. 606 + */ 607 + set_debugreg(0, 6); 596 608 597 609 /* Filter out all the reserved bits which are preset to 1 */ 598 610 dr6 &= ~DR6_RESERVED; ··· 627 615 /* Catch kmemcheck conditions first of all! */ 628 616 if ((dr6 & DR_STEP) && kmemcheck_trap(regs)) 629 617 goto exit; 630 - 631 - /* DR6 may or may not be cleared by the CPU */ 632 - set_debugreg(0, 6); 633 618 634 619 /* Store the virtualized DR6 value */ 635 620 tsk->thread.debugreg6 = dr6;