qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [RFC PATCH v4 10/25] i386: do not cross the pages bound


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [RFC PATCH v4 10/25] i386: do not cross the pages boundaries in replay mode
Date: Fri, 07 Nov 2014 12:20:56 +0100
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0


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 <address@hidden>
> ---
>  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



reply via email to

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