Browse Source

x86/debug: Clear reserved bits of DR6 in do_debug()

Clear the reserved bits from the stored copy of debug status
register (DR6).
This will help easy bitwise operations such as quick testing
of a debug event origin.

Signed-off-by: K.Prasad <prasad@linux.vnet.ibm.com>
Cc: Roland McGrath <roland@redhat.com>
Cc: Jan Kiszka <jan.kiszka@siemens.com>
Cc: Alan Stern <stern@rowland.harvard.edu>
Cc: Ingo Molnar <mingo@elte.hu>
LKML-Reference: <20100128111401.GB13935@in.ibm.com>
Signed-off-by: Frederic Weisbecker <fweisbec@gmail.com>
K.Prasad 15 years ago
parent
commit
40f9249a73
2 changed files with 6 additions and 0 deletions
  1. 3 0
      arch/x86/include/asm/debugreg.h
  2. 3 0
      arch/x86/kernel/traps.c

+ 3 - 0
arch/x86/include/asm/debugreg.h

@@ -14,6 +14,9 @@
    which debugging register was responsible for the trap.  The other bits
    which debugging register was responsible for the trap.  The other bits
    are either reserved or not of interest to us. */
    are either reserved or not of interest to us. */
 
 
+/* Define reserved bits in DR6 which are always set to 1 */
+#define DR6_RESERVED	(0xFFFF0FF0)
+
 #define DR_TRAP0	(0x1)		/* db0 */
 #define DR_TRAP0	(0x1)		/* db0 */
 #define DR_TRAP1	(0x2)		/* db1 */
 #define DR_TRAP1	(0x2)		/* db1 */
 #define DR_TRAP2	(0x4)		/* db2 */
 #define DR_TRAP2	(0x4)		/* db2 */

+ 3 - 0
arch/x86/kernel/traps.c

@@ -534,6 +534,9 @@ dotraplinkage void __kprobes do_debug(struct pt_regs *regs, long error_code)
 
 
 	get_debugreg(dr6, 6);
 	get_debugreg(dr6, 6);
 
 
+	/* Filter out all the reserved bits which are preset to 1 */
+	dr6 &= ~DR6_RESERVED;
+
 	/* Catch kmemcheck conditions first of all! */
 	/* Catch kmemcheck conditions first of all! */
 	if ((dr6 & DR_STEP) && kmemcheck_trap(regs))
 	if ((dr6 & DR_STEP) && kmemcheck_trap(regs))
 		return;
 		return;