Received: from eggs.gnu.org ([2001:4830:134:3::10]:35992) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xmhss-0005LG-5c for qemu-devel@nongnu.org; Fri, 07 Nov 2014 06:39:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xmhsi-0007G0-FC for qemu-devel@nongnu.org; Fri, 07 Nov 2014 06:39:18 -0500 Received: from mail.ispras.ru ([83.149.199.45]:50621) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xmhsi-0007Fu-7i for qemu-devel@nongnu.org; Fri, 07 Nov 2014 06:39:08 -0500 From: "Pavel Dovgaluk" References: <20141107103123.6136.18545.stgit@PASHA-ISP> <20141107103223.6136.57870.stgit@PASHA-ISP> <545CAB18.3020503@redhat.com> In-Reply-To: <545CAB18.3020503@redhat.com> Date: Fri, 7 Nov 2014 14:39:12 +0300 Message-ID: <003c01cffa7f$73af90b0$5b0eb210$@Dovgaluk@ispras.ru> MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-Language: ru 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: 'Paolo Bonzini' , 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 > From: Paolo Bonzini [mailto:pbonzini@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 > > --- > > 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) > > + !=3D ((pc_ptr + TARGET_MAX_INSN_SIZE - 1) & = TARGET_PAGE_MASK) > > + || (pc_ptr & ~TARGET_PAGE_MASK) =3D=3D 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 >=3D gen_opc_end || > > (pc_ptr - pc_start) >=3D (TARGET_PAGE_SIZE - 32) || > > >=20 > 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