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 | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/windbgstub-utils.c b/windbgstub-utils.c index 58c4c98f04..e33789725e 100755 --- a/windbgstub-utils.c +++ b/windbgstub-utils.c @@ -303,7 +303,32 @@ static int windbg_hw_breakpoint_remove(CPUState *cpu, int index) } static void windbg_set_dr7(CPUState *cpu, target_ulong new_dr7) -{} +{ + CPUArchState *env = cpu->env_ptr; + target_ulong old_dr7 = env->dr[7]; + int iobpt = 0; + int i; + + new_dr7 |= DR7_FIXED_1; + if (new_dr7 == old_dr7) { + return; + } + + for (i = 0; i < DR7_MAX_BP; i++) { + if (IS_BP_ENABLED(old_dr7, i) && !IS_BP_ENABLED(new_dr7, i)) { + windbg_hw_breakpoint_remove(cpu, i); + } + } + + env->dr[7] = new_dr7; + for (i = 0; i < DR7_MAX_BP; i++) { + if (IS_BP_ENABLED(env->dr[7], i)) { + iobpt |= windbg_hw_breakpoint_insert(cpu, i); + } + } + + env->hflags = (env->hflags & ~HF_IOBPT_MASK) | iobpt; +} static void windbg_set_dr(CPUState *cpu, int index, target_ulong value) {