Defined useful macroses for breakpoints. Signed-off-by: Mihail Abakumov <mikhail.abaku...@ispras.ru> Signed-off-by: Pavel Dovgalyuk <dovga...@ispras.ru> Signed-off-by: Dmitriy Koltunov <koltu...@ispras.ru> --- windbgstub-utils.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-)
diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 238db03714..58c4c98f04 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -11,6 +11,21 @@ #include "exec/windbgstub-utils.h" +#define IS_LOCAL_BP_ENABLED(dr7, index) (((dr7) >> ((index) * 2)) & 1) + +#define IS_GLOBAL_BP_ENABLED(dr7, index) (((dr7) >> ((index) * 2)) & 2) + +#define IS_BP_ENABLED(dr7, index) \ + (IS_LOCAL_BP_ENABLED(dr7, index) | IS_GLOBAL_BP_ENABLED(dr7, index)) + +#define BP_TYPE(dr7, index) \ + ((int) ((dr7) >> (DR7_TYPE_SHIFT + ((index) * 4))) & 3) + +#define BP_LEN(dr7, index) ({ \ + int _len = (((dr7) >> (DR7_LEN_SHIFT + ((index) * 4))) & 3); \ + (_len == 2) ? 8 : _len + 1; \ +}) + #ifdef TARGET_X86_64 # define OFFSET_SELF_PCR 0x18 # define OFFSET_VERS 0x108 @@ -277,9 +292,42 @@ typedef struct KDData { static KDData *kd; -static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) +static int windbg_hw_breakpoint_insert(CPUState *cpu, int index) +{ + return 0; +} + +static int windbg_hw_breakpoint_remove(CPUState *cpu, int index) +{ + return 0; +} + +static void windbg_set_dr7(CPUState *cpu, target_ulong new_dr7) {} +static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) +{ + CPUArchState *env = cpu->env_ptr; + + switch (index) { + case 0 ... 3: + if (IS_BP_ENABLED(env->dr[7], index) && env->dr[index] != value) { + windbg_hw_breakpoint_remove(cpu, index); + env->dr[index] = value; + windbg_hw_breakpoint_insert(cpu, index); + } else { + env->dr[index] = value; + } + return; + case 6: + env->dr[6] = value | DR6_FIXED_1; + return; + case 7: + windbg_set_dr7(cpu, value); + return; + } +} + static void windbg_set_sr(CPUState *cpu, int sr, uint16_t selector) { CPUArchState *env = cpu->env_ptr;