12 for (
int i = 0; i < 4; ++i) {
18static inline void write_dr_idx(
int idx, uint64_t value) {
21static inline uint64_t read_dr7(
void) {
return __read_dr(7); }
22static inline void write_dr7(uint64_t v) {
__write_dr(7, v); }
23static inline void write_dr6(uint64_t v) {
__write_dr(6, v); }
37 uint64_t addr = (uint64_t)BreakpointAddress;
40 write_dr_idx(idx, addr);
46 uint64_t dr7 = read_dr7();
49 dr7 |= (1ULL << (idx * 2));
52 uint64_t group_val = ((((uint64_t)
Length) & 0x3ULL) << 2) | (((uint64_t)AccessMode) & 0x3ULL);
55 uint64_t mask = 0xFULL << (16 + 4 * idx);
57 dr7 |= (group_val << (16 + 4 * idx));
84 write_dr_idx(index, 0);
87 uint64_t dr7 = read_dr7();
89 dr7 &= ~(1ULL << (index * 2));
91 uint64_t mask = 0xFULL << (16 + 4 * index);
112 for (
int i = 0; i < 4; ++i) {
int find_available_debug_reg(void)
MTSTATUS MdClearHardwareBreakpointByIndex(int index)
MTSTATUS MdClearHardwareBreakpointByAddress(void *BreakpointAddress)
MTSTATUS MdSetHardwareBreakpoint(DebugCallback CallbackFunction, void *BreakpointAddress, DEBUG_ACCESS_MODE AccessMode, DEBUG_LENGTH Length)
FORCEINLINE uint64_t __read_dr(int reg)
FORCEINLINE void __write_dr(int reg, uint64_t val)
enum _DEBUG_ACCESS_MODE DEBUG_ACCESS_MODE
void(* DebugCallback)(void *)
enum _DEBUG_LENGTH DEBUG_LENGTH
FORCEINLINE PPROCESSOR MeGetCurrentProcessor(void)
@ CPU_ACTION_WRITE_DEBUG_REGS
@ CPU_ACTION_CLEAR_DEBUG_REGS
struct _IPI_PARAMS IPI_PARAMS
FORCEINLINE void * kmemset(void *dest, int64_t val, uint64_t len)
#define MT_NOT_IMPLEMENTED
void MhSendActionToCpusAndWait(CPU_ACTION action, IPI_PARAMS parameter)
struct _DEBUG_REGISTERS debugRegs
struct _DEBUG_ENTRY DebugEntry[4]