qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH] target/i386: fix translation for icount mode


From: Pavel Dovgalyuk
Subject: Re: [Qemu-devel] [PATCH] target/i386: fix translation for icount mode
Date: Fri, 21 Sep 2018 08:19:48 +0300

> From: Paolo Bonzini [mailto:address@hidden
> On 20/09/2018 09:17, Pavel Dovgalyuk wrote:
> > This patch fixes the checking of boundary crossing instructions.
> > In icount mode only first instruction of the block may cross
> > the page boundary to keep the translation deterministic.
> > These conditions already existed, but compared the wrong variable.
> >
> > Signed-off-by: Pavel Dovgalyuk <address@hidden>
> > ---
> >  target/i386/translate.c |    6 +++---
> >  1 file changed, 3 insertions(+), 3 deletions(-)
> >
> > diff --git a/target/i386/translate.c b/target/i386/translate.c
> > index 1f9d1d9..c946bc4 100644
> > --- a/target/i386/translate.c
> > +++ b/target/i386/translate.c
> > @@ -8510,10 +8510,10 @@ static void i386_tr_translate_insn(DisasContextBase 
> > *dcbase,
> CPUState *cpu)
> >             chance to happen */
> >          dc->base.is_jmp = DISAS_TOO_MANY;
> >      } else if ((tb_cflags(dc->base.tb) & CF_USE_ICOUNT)
> > -               && ((dc->base.pc_next & TARGET_PAGE_MASK)
> > -                   != ((dc->base.pc_next + TARGET_MAX_INSN_SIZE - 1)
> > +               && ((pc_next & TARGET_PAGE_MASK)
> > +                   != ((pc_next + TARGET_MAX_INSN_SIZE - 1)
> >                         & TARGET_PAGE_MASK)
> > -                   || (dc->base.pc_next & ~TARGET_PAGE_MASK) == 0)) {
> > +                   || (pc_next & ~TARGET_PAGE_MASK) == 0)) {
> >          /* Do not cross the boundary of the pages in icount mode,
> >             it can cause an exception. Do it only when boundary is
> >             crossed by the first instruction in the block.
> >
> 
> Queued, but perhaps this check should be applied to the generic code?...

It maybe target-specific. Here is the ARM code:

    if (dc->base.is_jmp == DISAS_NEXT
        && (dc->pc - dc->page_start >= TARGET_PAGE_SIZE
            || (dc->pc - dc->page_start >= TARGET_PAGE_SIZE - 3
                && insn_crosses_page(env, dc)))) {
        dc->base.is_jmp = DISAS_TOO_MANY;
    }

Pavel Dovgalyuk




reply via email to

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