blob: a30f94934ac8a61e6e1c02e654aa1fafadf8763f [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#ifndef _ASMX86_DEBUGREG_H_
#define _ASMX86_DEBUGREG_H_
#include <bitops.h>
/*
* DR6_ACTIVE_LOW combines fixed-1 and active-low bits (e.g. RTM), and is also
* the init/reset value for DR6.
*/
#define DR6_ACTIVE_LOW 0xffff0ff0
#define DR6_VOLATILE 0x0001e80f
#define DR6_FIXED_1 (DR6_ACTIVE_LOW & ~DR6_VOLATILE)
#define DR6_TRAP0 BIT(0) /* DR0 matched */
#define DR6_TRAP1 BIT(1) /* DR1 matched */
#define DR6_TRAP2 BIT(2) /* DR2 matched */
#define DR6_TRAP3 BIT(3) /* DR3 matched */
#define DR6_TRAP_BITS (DR6_TRAP0|DR6_TRAP1|DR6_TRAP2|DR6_TRAP3)
#define DR6_BUS_LOCK BIT(11) /* Bus lock 0x800 */
#define DR6_BD BIT(13) /* General Detect 0x2000 */
#define DR6_BS BIT(14) /* Single-Step 0x4000 */
#define DR6_BT BIT(15) /* Task Switch 0x8000 */
#define DR6_RTM BIT(16) /* RTM / TSX 0x10000 */
#define DR7_FIXED_1 0x00000400 /* init/reset value, too */
#define DR7_VOLATILE 0xffff2bff
#define DR7_BP_EN_MASK 0x000000ff
#define DR7_LE BIT(8) /* Local Exact 0x100 */
#define DR7_GE BIT(9) /* Global Exact 0x200 */
#define DR7_RTM BIT(11) /* RTM / TSX 0x800 */
#define DR7_GD BIT(13) /* General Detect 0x2000 */
/*
* Enable bits for DR0-D3. Bits 0, 2, 4, and 6 are local enable bits (cleared
* by the CPU on task switch), bits 1, 3, 5, and 7 are global enable bits
* (never cleared by the CPU).
*/
#define DR7_LOCAL_ENABLE_DRx(x) (BIT(0) << (x))
#define DR7_GLOBAL_ENABLE_DRx(x) (BIT(1) << (x))
#define DR7_ENABLE_DRx(x) \
(DR7_LOCAL_ENABLE_DRx(x) | DR7_GLOBAL_ENABLE_DRx(x))
#define DR7_GLOBAL_ENABLE_DR0 DR7_GLOBAL_ENABLE_DRx(0)
#define DR7_GLOBAL_ENABLE_DR1 DR7_GLOBAL_ENABLE_DRx(1)
#define DR7_GLOBAL_ENABLE_DR2 DR7_GLOBAL_ENABLE_DRx(2)
#define DR7_GLOBAL_ENABLE_DR3 DR7_GLOBAL_ENABLE_DRx(3)
/* Condition/type of the breakpoint for DR0-3. */
#define DR7_RW_TYPE_DRx(x, rw) ((rw) << (((x) * 4) + 16))
#define DR7_EXECUTE_DRx(x) DR7_RW_TYPE_DRx(x, 0)
#define DR7_WRITE_DRx(x) DR7_RW_TYPE_DRx(x, 1)
#define DR7_PORT_IO_DRx(x) DR7_RW_TYPE_DRx(x, 2)
#define DR7_DATA_IO_DRx(x) DR7_RW_TYPE_DRx(x, 3) /* Read or Write */
/* Length of the breakpoint for DR0-3. */
#define DR7_LEN_DRx(x, enc) ((enc) << (((x) * 4) + 18))
#define DR7_LEN_1_DRx(x) DR7_LEN_DRx(x, 0)
#define DR7_LEN_2_DRx(x) DR7_LEN_DRx(x, 1)
#define DR7_LEN_4_DRx(x) DR7_LEN_DRx(x, 3)
#define DR7_LEN_8_DRx(x) DR7_LEN_DRx(x, 2) /* Out of sequence, undefined for 32-bit CPUs. */
#endif /* _ASMX86_DEBUGREG_H_ */