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> --- target/i386/windbgstub.c | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-)
diff --git a/target/i386/windbgstub.c b/target/i386/windbgstub.c index cae827df50..6e167a7473 100755 --- a/target/i386/windbgstub.c +++ b/target/i386/windbgstub.c @@ -299,7 +299,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) {