Blame view

arch/x86/include/asm/debugreg.h 4.34 KB
1965aae3c   H. Peter Anvin   x86: Fix ASM_X86_...
1
2
  #ifndef _ASM_X86_DEBUGREG_H
  #define _ASM_X86_DEBUGREG_H
21ebddd3e   Thomas Gleixner   x86: unify includ...
3
4
5
6
7
8
9
10
11
12
13
14
15
  
  
  /* Indicate the register numbers for a number of the specific
     debug registers.  Registers 0-3 contain the addresses we wish to trap on */
  #define DR_FIRSTADDR 0        /* u_debugreg[DR_FIRSTADDR] */
  #define DR_LASTADDR 3         /* u_debugreg[DR_LASTADDR]  */
  
  #define DR_STATUS 6           /* u_debugreg[DR_STATUS]     */
  #define DR_CONTROL 7          /* u_debugreg[DR_CONTROL] */
  
  /* Define a few things for the status register.  We can use this to determine
     which debugging register was responsible for the trap.  The other bits
     are either reserved or not of interest to us. */
40f9249a7   K.Prasad   x86/debug: Clear ...
16
17
  /* Define reserved bits in DR6 which are always set to 1 */
  #define DR6_RESERVED	(0xFFFF0FF0)
21ebddd3e   Thomas Gleixner   x86: unify includ...
18
19
20
21
  #define DR_TRAP0	(0x1)		/* db0 */
  #define DR_TRAP1	(0x2)		/* db1 */
  #define DR_TRAP2	(0x4)		/* db2 */
  #define DR_TRAP3	(0x8)		/* db3 */
b332828c3   K.Prasad   hw-breakpoints: p...
22
  #define DR_TRAP_BITS	(DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)
21ebddd3e   Thomas Gleixner   x86: unify includ...
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
  
  #define DR_STEP		(0x4000)	/* single-step */
  #define DR_SWITCH	(0x8000)	/* task switch */
  
  /* Now define a bunch of things for manipulating the control register.
     The top two bytes of the control register consist of 4 fields of 4
     bits - each field corresponds to one of the four debug registers,
     and indicates what types of access we trap on, and how large the data
     field is that we are looking at */
  
  #define DR_CONTROL_SHIFT 16 /* Skip this many bits in ctl register */
  #define DR_CONTROL_SIZE 4   /* 4 control bits per register */
  
  #define DR_RW_EXECUTE (0x0)   /* Settings for the access types to trap on */
  #define DR_RW_WRITE (0x1)
  #define DR_RW_READ (0x3)
  
  #define DR_LEN_1 (0x0) /* Settings for data length to trap on */
  #define DR_LEN_2 (0x4)
  #define DR_LEN_4 (0xC)
  #define DR_LEN_8 (0x8)
  
  /* The low byte to the control register determine which registers are
     enabled.  There are 4 fields of two bits.  One bit is "local", meaning
     that the processor will reset the bit after a task switch and the other
     is global meaning that we have to explicitly reset the bit.  With linux,
     you can use either one, since we explicitly zero the register when we enter
     kernel mode. */
  
  #define DR_LOCAL_ENABLE_SHIFT 0    /* Extra shift to the local enable bit */
  #define DR_GLOBAL_ENABLE_SHIFT 1   /* Extra shift to the global enable bit */
b332828c3   K.Prasad   hw-breakpoints: p...
54
55
  #define DR_LOCAL_ENABLE (0x1)      /* Local enable for reg 0 */
  #define DR_GLOBAL_ENABLE (0x2)     /* Global enable for reg 0 */
21ebddd3e   Thomas Gleixner   x86: unify includ...
56
57
58
59
60
61
62
63
64
65
66
  #define DR_ENABLE_SIZE 2           /* 2 enable bits per register */
  
  #define DR_LOCAL_ENABLE_MASK (0x55)  /* Set  local bits for all 4 regs */
  #define DR_GLOBAL_ENABLE_MASK (0xAA) /* Set global bits for all 4 regs */
  
  /* The second byte to the control register has a few special things.
     We can slow the instruction pipeline for instructions coming via the
     gdt or the ldt if we want to.  I am not sure why this is an advantage */
  
  #ifdef __i386__
  #define DR_CONTROL_RESERVED (0xFC00) /* Reserved by Intel */
96a388de5   Thomas Gleixner   i386/x86_64: move...
67
  #else
21ebddd3e   Thomas Gleixner   x86: unify includ...
68
69
70
71
72
  #define DR_CONTROL_RESERVED (0xFFFFFFFF0000FC00UL) /* Reserved */
  #endif
  
  #define DR_LOCAL_SLOWDOWN (0x100)   /* Local slow the pipeline */
  #define DR_GLOBAL_SLOWDOWN (0x200)  /* Global slow the pipeline */
b332828c3   K.Prasad   hw-breakpoints: p...
73
74
75
76
  /*
   * HW breakpoint additions
   */
  #ifdef __KERNEL__
28b4e0d86   Tejun Heo   x86: Rename globa...
77
  DECLARE_PER_CPU(unsigned long, cpu_dr7);
b332828c3   K.Prasad   hw-breakpoints: p...
78

b332828c3   K.Prasad   hw-breakpoints: p...
79
80
81
82
83
84
85
86
87
88
89
  static inline void hw_breakpoint_disable(void)
  {
  	/* Zero the control register for HW Breakpoint */
  	set_debugreg(0UL, 7);
  
  	/* Zero-out the individual HW breakpoint address registers */
  	set_debugreg(0UL, 0);
  	set_debugreg(0UL, 1);
  	set_debugreg(0UL, 2);
  	set_debugreg(0UL, 3);
  }
59d8eb53e   Frederic Weisbecker   hw-breakpoints: W...
90
91
  static inline int hw_breakpoint_active(void)
  {
0a3aee0da   Tejun Heo   x86: Use this_cpu...
92
  	return __this_cpu_read(cpu_dr7) & DR_GLOBAL_ENABLE_MASK;
59d8eb53e   Frederic Weisbecker   hw-breakpoints: W...
93
  }
9f6b3c2c3   Frederic Weisbecker   hw-breakpoints: F...
94
  extern void aout_dump_debugregs(struct user *dump);
24f1e32c6   Frederic Weisbecker   hw-breakpoints: R...
95
  extern void hw_breakpoint_restore(void);
24f1e32c6   Frederic Weisbecker   hw-breakpoints: R...
96

42181186a   Steven Rostedt   x86: Add counter ...
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  #ifdef CONFIG_X86_64
  DECLARE_PER_CPU(int, debug_stack_usage);
  static inline void debug_stack_usage_inc(void)
  {
  	__get_cpu_var(debug_stack_usage)++;
  }
  static inline void debug_stack_usage_dec(void)
  {
  	__get_cpu_var(debug_stack_usage)--;
  }
  int is_debug_stack(unsigned long addr);
  void debug_stack_set_zero(void);
  void debug_stack_reset(void);
  #else /* !X86_64 */
  static inline int is_debug_stack(unsigned long addr) { return 0; }
  static inline void debug_stack_set_zero(void) { }
  static inline void debug_stack_reset(void) { }
  static inline void debug_stack_usage_inc(void) { }
  static inline void debug_stack_usage_dec(void) { }
  #endif /* X86_64 */
b332828c3   K.Prasad   hw-breakpoints: p...
117
  #endif	/* __KERNEL__ */
1965aae3c   H. Peter Anvin   x86: Fix ASM_X86_...
118
  #endif /* _ASM_X86_DEBUGREG_H */