[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