* Copyright 2005-2011, Ingo Weinhold, ingo_weinhold@gmx.de.
* Distributed under the terms of the MIT License.
*/
#ifndef _KERNEL_ARCH_X86_USER_DEBUGGER_H
#define _KERNEL_ARCH_X86_USER_DEBUGGER_H
#define ARCH_INIT_USER_DEBUG x86_init_user_debug
#define X86_BREAKPOINT_COUNT 4
enum {
X86_DR6_B0 = 0,
X86_DR6_B1 = 1,
X86_DR6_B2 = 2,
X86_DR6_B3 = 3,
X86_DR6_BD = 13,
X86_DR6_BS = 14,
X86_DR6_BT = 15,
X86_DR6_BREAKPOINT_MASK = (1 << X86_DR6_B0) | (1 << X86_DR6_B1)
| (1 << X86_DR6_B2) | (1 << X86_DR6_B3),
};
enum {
X86_DR7_L0 = 0,
X86_DR7_G0 = 1,
X86_DR7_L1 = 2,
X86_DR7_G1 = 3,
X86_DR7_L2 = 4,
X86_DR7_G2 = 5,
X86_DR7_L3 = 6,
X86_DR7_G3 = 7,
X86_DR7_LE = 8,
X86_DR7_GE = 9,
X86_DR7_GD = 13,
X86_DR7_RW0_LSB = 16,
X86_DR7_LEN0_LSB = 18,
X86_DR7_RW1_LSB = 20,
X86_DR7_LEN1_LSB = 22,
X86_DR7_RW2_LSB = 24,
X86_DR7_LEN2_LSB = 26,
X86_DR7_RW3_LSB = 28,
X86_DR7_LEN3_LSB = 30,
X86_BREAKPOINTS_DISABLED_DR7
= (1 << 10) | (1 << X86_DR7_GE) | (1 << X86_DR7_LE),
};
enum {
X86_EFLAGS_CF = 0,
X86_EFLAGS_PF = 2,
X86_EFLAGS_AF = 4,
X86_EFLAGS_ZF = 6,
X86_EFLAGS_SF = 7,
X86_EFLAGS_TF = 8,
X86_EFLAGS_DF = 10,
X86_EFLAGS_OF = 11,
X86_EFLAGS_RF = 16,
X86_EFLAGS_USER_SETTABLE_FLAGS
= (1 << X86_EFLAGS_CF) | (1 << X86_EFLAGS_PF) | (1 << X86_EFLAGS_AF)
| (1 << X86_EFLAGS_ZF) | (1 << X86_EFLAGS_SF) | (1 << X86_EFLAGS_DF)
| (1 << X86_EFLAGS_OF),
};
enum {
X86_INSTRUCTION_BREAKPOINT = 0x0,
X86_DATA_WRITE_BREAKPOINT = 0x1,
X86_IO_READ_WRITE_BREAKPOINT = 0x2,
X86_DATA_READ_WRITE_BREAKPOINT = 0x3,
};
enum {
X86_BREAKPOINT_LENGTH_1 = 0x0,
X86_BREAKPOINT_LENGTH_2 = 0x1,
X86_BREAKPOINT_LENGTH_4 = 0x3,
};
struct arch_breakpoint {
void *address;
size_t type;
size_t length;
};
struct arch_team_debug_info {
struct arch_breakpoint breakpoints[X86_BREAKPOINT_COUNT];
size_t dr7;
};
struct arch_thread_debug_info {
uint32 flags;
};
extern const uint8 kX86SoftwareBreakpoint[1];
#ifdef __cplusplus
extern "C" {
#endif
struct iframe;
extern void x86_init_user_debug_at_kernel_exit(struct iframe *frame);
extern void x86_exit_user_debug_at_kernel_entry();
extern void x86_handle_debug_exception(struct iframe *frame);
extern void x86_handle_breakpoint_exception(struct iframe *frame);
extern void x86_init_user_debug();
#ifdef __cplusplus
}
#endif
#define DEBUG_MAX_BREAKPOINTS X86_BREAKPOINT_COUNT
#define DEBUG_MAX_WATCHPOINTS X86_BREAKPOINT_COUNT
#define DEBUG_SOFTWARE_BREAKPOINT kX86SoftwareBreakpoint
#define DEBUG_SOFTWARE_BREAKPOINT_SIZE 1
#define DEBUG_SHARED_BREAK_AND_WATCHPOINTS 1
#endif