From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:59937) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XmhbP-0008Qm-4h for qemu-devel@nongnu.org; Fri, 07 Nov 2014 06:21:20 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XmhbK-00010d-7M for qemu-devel@nongnu.org; Fri, 07 Nov 2014 06:21:15 -0500 Received: from mx1.redhat.com ([209.132.183.28]:50752) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XmhbJ-00010W-Ud for qemu-devel@nongnu.org; Fri, 07 Nov 2014 06:21:10 -0500 Message-ID: <545CAB18.3020503@redhat.com> Date: Fri, 07 Nov 2014 12:20:56 +0100 From: Paolo Bonzini MIME-Version: 1.0 References: <20141107103123.6136.18545.stgit@PASHA-ISP> <20141107103223.6136.57870.stgit@PASHA-ISP> In-Reply-To: <20141107103223.6136.57870.stgit@PASHA-ISP> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Subject: Re: [Qemu-devel] [RFC PATCH v4 10/25] i386: do not cross the pages boundaries in replay mode List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Pavel Dovgalyuk , qemu-devel@nongnu.org Cc: peter.maydell@linaro.org, peter.crosthwaite@xilinx.com, alex.bennee@linaro.org, mark.burton@greensocs.com, real@ispras.ru, batuzovk@ispras.ru, maria.klimushenkova@ispras.ru, afaerber@suse.de, fred.konrad@greensocs.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 > --- > 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? Paolo