- X86 debug register
Debug register is a register used by a processor for program
debugging . On thex86 architecture , these are named DR0...DR7. The debug registers allow programmers to selectively enable various debug conditions associated with the four debug addresses.Six of these registers are used to control debug features. These registers are accessed by variants of the MOV instruction. A debug register may be either the source operand or destination operand. The debug registers are privileged resources; the MOV instructions that access them can only beexecuted atprivilege level zero. An attempt to read or write the debug registers when executing at any other privilege level causes ageneral protection fault .DR0 to DR3
Each of these
register s contains the linear address associated with one of four breakpoint conditions. Eachbreakpoint condition is further defined by bits in DR7.The debug address registers are effective whether or not
paging is enabled. The addresses in these registers are linear addresses. If paging is enabled, the linear addresses are translated intophysical address es by the processor's paging mechanism. If paging is not enabled, these linear addresses are the same as physical addresses.Note that when paging is enabled, different tasks may have different linear-to-physical address mappings. When this is the case, an address in a debug address register may be relevant to one task but not to another. For this reason the x86 has both global and local enable bits in DR7. These bits indicate whether a given debug address has a global (all tasks) or local (current task only) relevance.
DR7 - Debug control
The low-order eight bits of DR7 (0,2,4,6 and 1,3,5,7) selectively enable the four address breakpoint conditions. There are two levels of enabling: the local (0,2,4,6) and global (1,3,5,7) levels. The local enable bits are automatically reset by the processor at every task switch to avoid unwanted breakpoint conditions in the new task. The global enable bits are not reset by a task switch; therefore, they can be used for conditions that are global to all tasks.
Bits 16-17 (DR0), 20-21 (DR1), 24-25 (DR2), 28-29 (DR3), define when breakpoints trigger. Each breakpoint has a two-bit entry that specifies whether they break on execution (00b), data write (01b), data read or write (11b). 10b is defined to mean break on IO read or write but no hardware supports it. Bits 18-19 (DR0), 22-23 (DR1), 26-27 (DR2), 30-31 (DR3), define how large area of memory is watched by breakpoints. Again each breakpoint has a two-bit entry that specifies whether they watch one (00b), two (01b), eight (10b) or four (11b) bytes. [GNU GDB 6.5 gdb/i386-nat.c]
DR6 - Debug status
The debug status register permits the debugger to determine which debug conditions have occurred.When the processor detects an enabled debug exception, it sets the low-order bits of this register (0,1,2,3) before entering the
debug exception handler .Note that the bits of DR6 are never cleared by the processor. To avoid any confusion in identifying the next debug exception, the debug handler should move zeros to DR6 immediately before returning.
ee also
*
Control register
*Test register
* http://www.codeproject.com/KB/debug/hardwarebreakpoint.aspx Using the debug registers in Windows.References
*Intel 80386 Programmer's Reference
Wikimedia Foundation. 2010.