> From: Paolo Bonzini [mailto:pbonz...@redhat.com] > On 07/11/2014 11:32, Pavel Dovgalyuk wrote: > > This patch denies crossing the boundary of the pages in the replay mode, > > because it can cause an exception. Do it only when boundary is > > crossed by the first instruction in the block. > > If current instruction already crossed the bound - it's ok, > > because an exception hasn't stopped this code. > > > > Signed-off-by: Pavel Dovgalyuk <pavel.dovga...@ispras.ru> > > --- > > target-i386/cpu.h | 7 +++++++ > > target-i386/translate.c | 14 ++++++++++++++ > > 2 files changed, 21 insertions(+), 0 deletions(-) > > > > diff --git a/target-i386/cpu.h b/target-i386/cpu.h > > index 2968749..bc3f9f5 100644 > > --- a/target-i386/cpu.h > > +++ b/target-i386/cpu.h > > @@ -28,6 +28,13 @@ > > #define TARGET_LONG_BITS 32 > > #endif > > > > +/* Maximum instruction code size */ > > +#ifdef TARGET_X86_64 > > +#define TARGET_MAX_INSN_SIZE 16 > > +#else > > +#define TARGET_MAX_INSN_SIZE 16 > > +#endif > > + > > /* target supports implicit self modifying code */ > > #define TARGET_HAS_SMC > > /* support for self modifying code even if the modified instruction is > > diff --git a/target-i386/translate.c b/target-i386/translate.c > > index 4d5dfb3..a264908 100644 > > --- a/target-i386/translate.c > > +++ b/target-i386/translate.c > > @@ -8035,6 +8035,20 @@ static inline void > > gen_intermediate_code_internal(X86CPU *cpu, > > gen_eob(dc); > > break; > > } > > + /* 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. > > + If current instruction already crossed the bound - it's ok, > > + because an exception hasn't stopped this code. > > + */ > > + if (use_icount > > + && ((pc_ptr & TARGET_PAGE_MASK) > > + != ((pc_ptr + TARGET_MAX_INSN_SIZE - 1) & TARGET_PAGE_MASK) > > + || (pc_ptr & ~TARGET_PAGE_MASK) == 0)) { > > + gen_jmp_im(pc_ptr - dc->cs_base); > > + gen_eob(dc); > > + break; > > + } > > /* if too long translation, stop generation too */ > > if (tcg_ctx.gen_opc_ptr >= gen_opc_end || > > (pc_ptr - pc_start) >= (TARGET_PAGE_SIZE - 32) || > > > > Why only in icount mode? Does it have a sensible performance problem?
Maybe. This is the same problem, which was discussed here for ARM: http://lists.gnu.org/archive/html/qemu-devel/2014-10/msg02232.html But I haven't figured out what I have to do with it. Pavel Dovgalyuk