qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH] i386: fix breakpoints handling in icount mode


From: Frederic Konrad
Subject: Re: [Qemu-devel] [PATCH] i386: fix breakpoints handling in icount mode
Date: Thu, 23 Oct 2014 10:47:45 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:24.0) Gecko/20100101 Thunderbird/24.5.0

On 23/10/2014 09:52, Pavel Dovgaluk wrote:
From: Frederic Konrad [mailto:address@hidden
On 23/10/2014 07:57, Pavel Dovgaluk wrote:
From: Frederic Konrad [mailto:address@hidden
On 22/10/2014 13:38, Pavel Dovgalyuk wrote:

Hi Pavel,
This patch fixes instructions counting when execution is stopped on
breakpoint (e.g. set from gdb). Without a patch extra instruction is translated
and icount is incremented by invalid value (which equals to number of
executed instructions + 1).

Signed-off-by: Pavel Dovgalyuk <address@hidden>
---
    target-i386/translate.c |    3 ++-
    1 files changed, 2 insertions(+), 1 deletions(-)

diff --git a/target-i386/translate.c b/target-i386/translate.c
index 1284173..193cf9f 100644
--- a/target-i386/translate.c
+++ b/target-i386/translate.c
@@ -8000,7 +8000,7 @@ static inline void gen_intermediate_code_internal(X86CPU 
*cpu,
                    if (bp->pc == pc_ptr &&
                        !((bp->flags & BP_CPU) && (tb->flags & HF_RF_MASK))) {
                        gen_debug(dc, pc_ptr - dc->cs_base);
-                    break;
+                    goto done_generating;
This makes sense to me.
But I don't see why you don't just "break" like the other instruction in
this loop?
Single break will just exit the breakpoints iteration loop. I'll need an 
additional flag
to break the translation loop. ARM does the same thing, anyway :)
Yes that's what I mentioned.
                    }
                }
            }
@@ -8049,6 +8049,7 @@ static inline void gen_intermediate_code_internal(X86CPU 
*cpu,
                break;
            }
        }
+done_generating:
        if (tb->cflags & CF_LAST_IO)
            gen_io_end();
Is there any reason why you don't jump over this two lines in case of a
breakpoint?
Shouldn't we switch off can_do_io flag if it was switched on?
Yes but can we switch on can_do_io if we have a breakpoint?

The code is not shown in this patch but there is:

          if (num_insns + 1 == max_insns && (tb->cflags & CF_LAST_IO))
              gen_io_start();

I think you can't reach this code if you exit the translation loop?
This is not the only gen_io_start call. It is called from some of the 
instructions'
translation functions, that could precede the breakpoint.

Pavel Dovgalyuk


True, there are 8 others place where gen_io_start is called in this file, but they
seems to be each time followed by a gen_io_end?

eg:

static inline void gen_ins(DisasContext *s, TCGMemOp ot)
{
    if (use_icount)
        gen_io_start();
    gen_string_movl_A0_EDI(s);
    /* Note: we must do this dummy write first to be restartable in
       case of page fault. */
    tcg_gen_movi_tl(cpu_T[0], 0);
    gen_op_st_v(s, ot, cpu_T[0], cpu_A0);
    tcg_gen_trunc_tl_i32(cpu_tmp2_i32, cpu_regs[R_EDX]);
    tcg_gen_andi_i32(cpu_tmp2_i32, cpu_tmp2_i32, 0xffff);
    gen_helper_in_func(ot, cpu_T[0], cpu_tmp2_i32);
    gen_op_st_v(s, ot, cpu_T[0], cpu_A0);
    gen_op_movl_T0_Dshift(ot);
    gen_op_add_reg_T0(s->aflag, R_EDI);
    if (use_icount)
        gen_io_end();
}



reply via email to

[Prev in Thread] Current Thread [Next in Thread]